Skip to content

tautomerization

Tautomer modification methods.

CRESTTautomerization dataclass

Bases: TautomerMaker, CRESTCalculator, PymatGenMaker[InputType, OutputType]


              flowchart TD
              jfchemistry.modification.tautomerization.CRESTTautomerization[CRESTTautomerization]
              jfchemistry.modification.tautomerization.base.TautomerMaker[TautomerMaker]
              jfchemistry.modification.base.StructureModification[StructureModification]
              jfchemistry.calculators.crest.crest_calculator.CRESTCalculator[CRESTCalculator]
              jfchemistry.calculators.base.Calculator[Calculator]
              jfchemistry.core.makers.pymatgen_maker.PymatGenMaker[PymatGenMaker]
              jfchemistry.core.makers.jfchem_maker.JFChemMaker[JFChemMaker]
              jfchemistry.core.makers.core_maker.CoreMaker[CoreMaker]

                              jfchemistry.modification.tautomerization.base.TautomerMaker --> jfchemistry.modification.tautomerization.CRESTTautomerization
                                jfchemistry.modification.base.StructureModification --> jfchemistry.modification.tautomerization.base.TautomerMaker
                

                jfchemistry.calculators.crest.crest_calculator.CRESTCalculator --> jfchemistry.modification.tautomerization.CRESTTautomerization
                                jfchemistry.calculators.base.Calculator --> jfchemistry.calculators.crest.crest_calculator.CRESTCalculator
                

                jfchemistry.core.makers.pymatgen_maker.PymatGenMaker --> jfchemistry.modification.tautomerization.CRESTTautomerization
                                jfchemistry.core.makers.jfchem_maker.JFChemMaker --> jfchemistry.core.makers.pymatgen_maker.PymatGenMaker
                                jfchemistry.core.makers.core_maker.CoreMaker --> jfchemistry.core.makers.jfchem_maker.JFChemMaker
                




              click jfchemistry.modification.tautomerization.CRESTTautomerization href "" "jfchemistry.modification.tautomerization.CRESTTautomerization"
              click jfchemistry.modification.tautomerization.base.TautomerMaker href "" "jfchemistry.modification.tautomerization.base.TautomerMaker"
              click jfchemistry.modification.base.StructureModification href "" "jfchemistry.modification.base.StructureModification"
              click jfchemistry.calculators.crest.crest_calculator.CRESTCalculator href "" "jfchemistry.calculators.crest.crest_calculator.CRESTCalculator"
              click jfchemistry.calculators.base.Calculator href "" "jfchemistry.calculators.base.Calculator"
              click jfchemistry.core.makers.pymatgen_maker.PymatGenMaker href "" "jfchemistry.core.makers.pymatgen_maker.PymatGenMaker"
              click jfchemistry.core.makers.jfchem_maker.JFChemMaker href "" "jfchemistry.core.makers.jfchem_maker.JFChemMaker"
              click jfchemistry.core.makers.core_maker.CoreMaker href "" "jfchemistry.core.makers.core_maker.CoreMaker"
            

Generate tautomers using CREST.

Uses CREST's automated tautomerization workflow to identify basic sites and generate low-energy tautomers. The method systematically explores different tautomer sites and optimizes the resulting structures.

ATTRIBUTE DESCRIPTION
name

Name of the job (default: "CREST Tautomers").

TYPE: str

runtype

Workflow type (default: "tautomerize").

TYPE: str

ewin

Energy window [kcal/mol] for selecting tautomers (default: None, uses CREST default).

TYPE: str

ffopt

Perform force field pre-optimization (default: True).

TYPE: str

freezeopt

Freeze constraint string for optimization (default: None).

TYPE: str

finalopt

Perform final optimization (default: True).

TYPE: str

threads

Number of parallel threads (default: 1).

TYPE: int

References
  • CREST Documentation: https://crest-lab.github.io/crest-docs/

Examples:

>>> from jfchemistry.modification import CRESTTautomers
>>> from pymatgen.core import Molecule
>>> from ase.build import molecule
>>> molecule = Molecule.from_ase_atoms(molecule("CCH"))
>>> prot = CRESTTautomers(ewin=6.0, threads=4)
>>> job = prot.make(molecule)
>>> protonated_structures = job.output["structure"]
>>> prot_custom = CRESTTautomers(
...     ewin=8.0,
...     ffopt=True,
...     finalopt=True,
...     threads=8
... )
>>> job = prot_custom.make(molecule)
>>> protonated_structures = job.output["structure"]
Source code in jfchemistry/modification/tautomerization/crest_tautomers.py
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
@dataclass
class CRESTTautomerization[InputType: Molecule, OutputType: Molecule](
    TautomerMaker, CRESTCalculator, PymatGenMaker[InputType, OutputType]
):
    """Generate tautomers using CREST.

    Uses CREST's automated tautomerization workflow to identify basic sites
    and generate low-energy tautomers. The method systematically
    explores different tautomer sites and optimizes the resulting structures.

    Attributes:
        name: Name of the job (default: "CREST Tautomers").
        runtype: Workflow type (default: "tautomerize").
        ewin: Energy window [kcal/mol] for selecting tautomers
            (default: None, uses CREST default).
        ffopt: Perform force field pre-optimization (default: True).
        freezeopt: Freeze constraint string for optimization (default: None).
        finalopt: Perform final optimization (default: True).
        threads: Number of parallel threads (default: 1).

    References:
        - CREST Documentation: https://crest-lab.github.io/crest-docs/

    Examples:
        >>> from jfchemistry.modification import CRESTTautomers # doctest: +SKIP
        >>> from pymatgen.core import Molecule # doctest: +SKIP
        >>> from ase.build import molecule # doctest: +SKIP
        >>> molecule = Molecule.from_ase_atoms(molecule("CCH")) # doctest: +SKIP
        >>> prot = CRESTTautomers(ewin=6.0, threads=4) # doctest: +SKIP
        >>> job = prot.make(molecule) # doctest: +SKIP
        >>> protonated_structures = job.output["structure"] # doctest: +SKIP
        >>> prot_custom = CRESTTautomers( # doctest: +SKIP
        ...     ewin=8.0, # doctest: +SKIP
        ...     ffopt=True, # doctest: +SKIP
        ...     finalopt=True, # doctest: +SKIP
        ...     threads=8 # doctest: +SKIP
        ... ) # doctest: +SKIP
        >>> job = prot_custom.make(molecule) # doctest: +SKIP
        >>> protonated_structures = job.output["structure"] # doctest: +SKIP
    """

    name: str = "CREST Tautomers"
    # INTERNAL
    _runtype: Literal["tautomerize"] = "tautomerize"
    _output_filename: str = "tautomers.xyz"

    def _make_commands(self):
        """Make the CLI for the CREST input."""
        super()._make_commands()
        self._commands.append(f"--{self._runtype}")
        self._commands.append("--newversion")

    def _operation(
        self, input: InputType, **kwargs
    ) -> tuple[OutputType | list[OutputType], Properties | list[Properties] | None]:
        """Generate tautomers using CREST.

        Runs CREST's tautomerization workflow to identify tautomeric sites and
        generate optimized tautomer structures.

        Args:
            input: Input molecular structure with 3D coordinates. The
                molecule's charge is used for the CREST calculation.
            **kwargs: Additional kwargs to pass to the operation.

        Returns:
            Tuple containing:
                - List of tautomer structures sorted by energy
                - None (no additional properties)

        Examples:
            >>> from pymatgen.core import Molecule # doctest: +SKIP
            >>> from ase.build import molecule # doctest: +SKIP
            >>> from jfchemistry.modification import CRESTTautomers # doctest: +SKIP
            >>> molecule = Molecule.from_ase_atoms(molecule("C2H6")) # doctest: +SKIP
            >>> prot = CRESTTautomers(ewin=6.0, threads=4) # doctest: +SKIP
            >>> structures, properties = prot.operation(molecule) # doctest: +SKIP
        """
        input.to("input.xyz", fmt="xyz")
        if self.charge is None and input.charge is not None:
            self.charge = input.charge
        super()._make_dict()
        super()._write_toml()
        self._make_commands()
        super()._run()
        if not os.path.exists(self._output_filename):
            raise FileNotFoundError(
                "No tautomers found. Please check your CREST settings and log file."
            ) from None
        try:
            mols = XYZ.from_file(self._output_filename).all_molecules
        except Exception as e:
            raise ValueError(f"Error reading tautomers from {self._output_filename}: {e}") from e
        return cast("list[OutputType]", mols), cast("list[Properties]", Properties())

make

make(input: InputType | list[InputType], **kwargs) -> Response[_output_model]

Create a workflow job for processing structure(s).

Automatically handles job distribution for lists of structures. Each structure in a list is processed as a separate job for parallel execution.

PARAMETER DESCRIPTION
input

Single Pymatgen SiteCollection or list of SiteCollections.

TYPE: InputType | list[InputType]

**kwargs

Additional kwargs to pass to the operation.

DEFAULT: {}

RETURNS DESCRIPTION
Response[_output_model]

Response containing: - structure: Processed structure(s) - files: XYZ format file(s) of the structure(s) - properties: Computed properties from the operation

Examples:

>>> from jfchemistry.conformers import CRESTConformers
>>> from pymatgen.core import Molecule
>>> molecule = Molecule.from_ase_atoms(molecule("C2H6"))
>>> # Generate conformers
>>> conformer_gen = CRESTConformers(ewin=6.0)
>>> job = conformer_gen.make(input)
Source code in jfchemistry/core/makers/jfchem_maker.py
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
@jfchem_job()
def make(
    self,
    input: InputType | list[InputType],
    **kwargs,
) -> Response[_output_model]:
    """Create a workflow job for processing structure(s).

    Automatically handles job distribution for lists of structures. Each
    structure in a list is processed as a separate job for parallel execution.

    Args:
        input: Single Pymatgen SiteCollection or list of SiteCollections.
        **kwargs: Additional kwargs to pass to the operation.

    Returns:
        Response containing:
            - structure: Processed structure(s)
            - files: XYZ format file(s) of the structure(s)
            - properties: Computed properties from the operation

    Examples:
        >>> from jfchemistry.conformers import CRESTConformers # doctest: +SKIP
        >>> from pymatgen.core import Molecule # doctest: +SKIP
        >>> molecule = Molecule.from_ase_atoms(molecule("C2H6")) # doctest: +SKIP
        >>> # Generate conformers
        >>> conformer_gen = CRESTConformers(ewin=6.0) # doctest: +SKIP
        >>> job = conformer_gen.make(input) # doctest: +SKIP
    """
    return self._run_job(input, **kwargs)