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.

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