docs: def assembly_plus_protons(input_file, path=True, pdb_name=None,
                            save_output=False, force_save=False):
      """Returns an Assembly with protons added by Reduce.
  
      Notes
      -----
      Looks for a pre-existing Reduce output in the standard location before
      running Reduce. If the protein contains oligosaccharides or glycans,
      use reduce_correct_carbohydrates.
  
      Parameters
      ----------
      input_file : str or pathlib.Path
          Location of file to be converted to Assembly or PDB file as string.
      path : bool
          Whether we are looking at a file or a pdb string. Defaults to file.
      pdb_name : str
          PDB ID of protein. Required if providing string not path.
      save_output : bool
          If True will save the generated assembly.
      force_save : bool
          If True will overwrite existing reduced assembly.
  
      Returns
      -------
      reduced_assembly : AMPAL Assembly
          Assembly of protein with protons added by Reduce.
      """
      from ampal.pdb_parser import convert_pdb_to_ampal
  
      if path:
          input_path = Path(input_file)
          if not pdb_name:
              pdb_name = input_path.stem[:4]
          reduced_path = reduce_output_path(path=input_path)
          if reduced_path.exists() and not save_output and not force_save:
              reduced_assembly = convert_pdb_to_ampal(
                  str(reduced_path), pdb_id=pdb_name)
              return reduced_assembly
      if save_output:
          reduced_path = output_reduce(
              input_file, path=path, pdb_name=pdb_name, force=force_save)
          reduced_assembly = convert_pdb_to_ampal(str(reduced_path), path=True)
      else:
          reduce_mmol, reduce_message = run_reduce(input_file, path=path)
          if not reduce_mmol:
              return None
          reduced_assembly = convert_pdb_to_ampal(
              reduce_mmol, path=False, pdb_id=pdb_name)
      return reduced_assembly