schrodinger.application.pathfinder.reaction module

Classes to represent and apply chemical reactions.

Examples:

# run one reaction
rxn_smarts = "[C:8][N:7][C:2]([C:1])=[O:4]>>[C:1][C:2](O)=[O:4].[N:7][C:8]"
rxn = Reaction("Amide coupling", rxn_smarts)
amide = Chem.MolFromSmiles('CC(=O)NC')
for acid, amine in rxn.apply((amide,)):
    print(Chem.MolToSmiles(acid))
    print(Chem.MolToSmiles(amine))
reverse_rxn = rxn.inverse()

# read reactions from file:
reactions = read_reactions_file('reactions.json')
class schrodinger.application.pathfinder.reaction.Reaction(name, retro_smarts=None, lhs_classes=None, rhs_classes=None, syn_smarts=None, tags=None, tier=None, allow_multiple_products=False, rxnfile=None, inverse_rxnfile=None, description=None, reagents_dict=None, long_name=None, ld_data=None, require_mapping=True, **kw)

Bases: object

A Reaction object represents a generic reaction, such as “amide coupling”. An actual instance of a reaction between specific reagents is a ReactionInstance (see below).

A Reaction may optionally be associated with “reagent classes” for the molecules on the left-hand-side and right-hand-side of the reaction. We avoid the terms “reactants” and “products” because they depend on the context; Reaction objects may be used for actual reactions, but also for retrosynthetic transforms (where “target” and “precursors” would be more appropriate), or for even for alchemical transformations.

A reagent class is just a name representing the type of compound involved in the reaction; the naming scheme is up to the caller. For example, for amide coupling, the reagent classes on one side might be “amine” and “acid”, and on the other “amide”.

__init__(name, retro_smarts=None, lhs_classes=None, rhs_classes=None, syn_smarts=None, tags=None, tier=None, allow_multiple_products=False, rxnfile=None, inverse_rxnfile=None, description=None, reagents_dict=None, long_name=None, ld_data=None, require_mapping=True, **kw)
Parameters
  • name (str) – Reaction name.

  • retro_smarts (str or NoneType) – Reaction SMARTS (RDKit dialect).

  • lhs_classes (list of str or NoneType) – Reagent classes for the left-hand-side of the reaction.

  • rhs_classes (list of str or NoneType) – Reagent classes for the right-hand-side of the reaction.

  • syn_smarts – Reaction SMARTS for the reverse reaction. If not specified, it is constructed automatically from ‘retro_smarts’ by swapping around the “>>”.

  • tags (iterable of str or NoneType) – Optional list of tags associated with the reaction.

  • tier (int) – an integer describing how “good” the reaction is (lower is better)

  • allow_multiple_products – ignored for backward compatibility

  • rxnfile (str) – Path to MDL Rxnfile. May be used instead of ‘retro_smarts’.

  • inverse_rxnfile (str) – Path to MDL Rxnfile for the reverse reaction. May be used instead of ‘syn_smarts’.

  • description (str) – Reaction description.

  • ld_data (object) – arbitrary object reserved for the use of LiveDesign.

  • require_mapping (bool) – if True, raise a ValueError for reactions without any atom mappings

asDict()

Return a dict representation of the reaction suitable for JSON serialization.

Returns

dict

Return type

dict

apply(reactants)

Apply the reaction to the given reactants, returning a list of lists of products. The products are already sanitized.

Return type

list of list of Mol

inverse()

Return a new Reaction object for the inverse of the current reaction.

suggestReagentClasses(r_classes, libpath=None, max_search=10)

Search through r_classes for reagent classes matching each of the reactants in the reaction.

Parameters
  • r_classes (dict of ReagentClass) – dictionary of reagent classes by name

  • libpath (list of str) – list of directories to prepend to the standard reagent library search path

  • max_search (int) – maximum number of structures to search from each reagent file before deciding the file doesn’t match.

Returns

list of lists of reagent classes. Each item in the outer list corresponds to one of the molecules on the right-hand side of the reaction. Items in the inner list (which may be empty) are the suggested classes for that molecule.

Return type

list of list of ReagentClass

getDisplaySmarts()

Return the display SMARTS for the reaction. This is a simplified SMARTS meant for depiction purposes only. If the reaction doesn’t have a display SMARTS, the syn_smarts is returned.

Returns

display SMARTS

Return type

str

debugReactants(reactants)

Print each reactant SMILES and reactant template SMARTS and whether they match. This helps debugging a reaction SMARTS by making it easier to see which component to focus on.

Parameters

reactants ([Chem.Mol]) – list of reactants

class schrodinger.application.pathfinder.reaction.ReactionDict(reactions, reagent_classes, inverse_tags)

Bases: dict

Reaction dictionary with additional properties for reagent classes and inverse tags.

Variables
  • reagent_classes – reagent classes

  • inverse_tags – inverse tags

__init__(reactions, reagent_classes, inverse_tags)
Parameters
  • reactions ({str: ReagentClass}) – dict of reactions by name

  • reagent_classes ({str: ReagentClass}) – dict of reagent classes by name

  • inverse_tags – dict of inverse tags for each tag

  • inverse_tags – {str: set(str)}

__contains__(key, /)

True if the dictionary has the specified key, else False.

__len__()

Return len(self).

clear() None.  Remove all items from D.
copy() a shallow copy of D
fromkeys(value=None, /)

Create a new dictionary with keys from iterable and values set to value.

get(key, default=None, /)

Return the value for key if key is in the dictionary, else default.

items() a set-like object providing a view on D’s items
keys() a set-like object providing a view on D’s keys
pop(k[, d]) v, remove specified key and return the corresponding value.

If key is not found, d is returned if given, otherwise KeyError is raised

popitem()

Remove and return a (key, value) pair as a 2-tuple.

Pairs are returned in LIFO (last-in, first-out) order. Raises KeyError if the dict is empty.

setdefault(key, default=None, /)

Insert key with a value of default if key is not in the dictionary.

Return the value for key if key is in the dictionary, else default.

update([E, ]**F) None.  Update D from dict/iterable E and F.

If E is present and has a .keys() method, then does: for k in E: D[k] = E[k] If E is present and lacks a .keys() method, then does: for k, v in E: D[k] = v In either case, this is followed by: for k in F: D[k] = F[k]

values() an object providing a view on D’s values
class schrodinger.application.pathfinder.reaction.ReagentClass(name, reactive=False, description=None, smarts=None)

Bases: object

Struct-like class to hold metadata for a reagent class. Fields include name, description, and ‘reactive’. A reactive reagent is one which shouldn’t be analyzed retrosynthetically. For example, acyl chlorides.

__init__(name, reactive=False, description=None, smarts=None)
asDict()

Return a dict representation of the reaction suitable for JSON serialization.

Returns

dict

Return type

dict

findReagentFile(libpath=None)

Look for <reagent_class>.* (where the extension corresponds to a recognized structure file format) in each of the directories in the library search path. Return the first match, but if multiple matches are found in the same directory, raise an exception.

Parameters

libpath (list of str) – list of directories to prepend to the default reagent library search path

Returns

path to reagent file, or None if not found

Return type

str

Raises

ValueError if multiple matches are found in the CWD.

size(libpath=None)

Return the number of structures in the reagent file for this class.

Parameters

libpath (list of str) – list of directories to prepend to the standard reagent library search path

Returns

number of structures, or zero when no file is found.

Return type

int

copyReagentFile(dest_file, libpath=None)

Exports reagents into a given .csv file.

Parameters
  • dest_file (str) – output .csv file

  • libpath (list of str) – list of directories to prepend to the standard reagent library search path

Returns

False if reagent file was not found and True otherwise

Return type

bool

schrodinger.application.pathfinder.reaction.read_reactions_file(filename=None, reagents_dict=None, merge_with_defaults=False)

Read a reactions file in JSON format and return a dictionary of reactions by name. If filename is None, read the standard reactions file from the mmshare data directory and add the ‘default’ tag to each reaction.

Parameters
  • filename (str) – file to read

  • reagents_dict (dict {str: ReagentClass}) – dictionary of reagent classes (normally from read_reagent_classes_file).

  • merge_with_defaults (bool) – if True, read both the default file and the specified file and merge them.

Returns

dictionary of reactions by name

Return type

dict {str: Reaction}

schrodinger.application.pathfinder.reaction.read_rxn_file(filename)

Read reaction from .rxn file and return dictionary of reactions.

Parameters

filename (str) – file to read

Returns

dictionary of reactions by name

Return type

dict {str: Reaction}

schrodinger.application.pathfinder.reaction.read_reagent_classes_file(filename=None, merge_with_defaults=False)

Read a reagent classes file in JSON format and return a dictionary of reagent classes by name. If filename is None, read the standard reagent classes file from the mmshare data directory.

Parameters
  • filename (str) – file to read

  • merge_with_defaults (bool) – if True, read both the default file and the specified file and merge them.

Returns

dictionary of reagent classes by name

Return type

dict {str: ReagentClass}

schrodinger.application.pathfinder.reaction.get_custom_reagent_classes(filename)

Reads a reagent classes file in JSON format and returns a dictionary of reagent classes by name. If custom reagent classes file is not found it will be created.

Parameters

filename – file to read

Returns

dictionary of reagent classes

Return type

dict {str: ReagentClass}

schrodinger.application.pathfinder.reaction.get_default_reactions_filename()

Return the path to the default reactions file.

Returns

path

Return type

str

schrodinger.application.pathfinder.reaction.get_default_reagent_classes_filename()

Return the path to the default reagent classes file.

Returns

path

Return type

str

schrodinger.application.pathfinder.reaction.parse_inverse_tags(tag_tups)

Turn the list-based representation of inverse tags into a dictionary for ease of look up. For example, given

[
    [['a', 'b'], ['c', 'd']],
    [['e'], ['f']]
]

return

{
    'a': {'c', 'd'},
    'b': {'c', 'd'},
    'c': {'a', 'b'},
    'd': {'a', 'b'},
    'e': {'f'},
    'f': {'e'}
}
Parameters

tag_tups (list(list(list(str)))) – a list of incompatible tag sets. In the example above, reactions tagged “a” or “b” are considered inverse of reactions tagged “c” or “d”.

Returns

dictionary where each key is a tag an each value is a set of tags considered “inverse” of the key. This is actually a defaultdict, where the default value is an empty set.

Return type

defaultdict(set(str))

schrodinger.application.pathfinder.reaction.parse_pathfinder_data(raw_dict)

Convert a “raw dict” (usually from a pathfinder.json) into a ReactionDict.

Return type

ReactionDict

schrodinger.application.pathfinder.reaction.parse_reaction_data(raw_dict, reagents_dict=None)

Convert a “raw dict” (usually from a JSON file) into a dictionary of Reaction objects by name.

Return type

dict {str: Reaction}

schrodinger.application.pathfinder.reaction.parse_reagent_classes_data(raw_dict)

Convert a “raw dict” (usually from a JSON file) into a dictionary of ReagentClass objects by name.

Return type

dict {str: Reaction}

schrodinger.application.pathfinder.reaction.write_reactions_file(reactions, filename)

Write a reactions file. :reactions: list or dict of reactions :type reactions: list or dict of Reaction

schrodinger.application.pathfinder.reaction.write_reagent_classes_file(reagent_classes, filename)

Write a reagent classes file.

Parameters
  • reagent_classes – dict of reagent classes by name

  • filename (str) – file to write

schrodinger.application.pathfinder.reaction.invert_reaction_smarts(smarts)

Given a reaction SMARTS, return the reaction SMARTS for the reverse reaction.

Return type

str

schrodinger.application.pathfinder.reaction.get_mmshare_reagent_data_dir()

Return the path to the reagent directory installed with mmshare. :rtype: str

schrodinger.application.pathfinder.reaction.get_libpath()

Return the reagent library search path. It consists of the directories listed in the SCHRODINGER_REAGENT_LIB environment variable, if it exists, followed by ~/.schrodinger/reagents or its Windows equivalent, followed by the mmshare data/reagents directory.

Return type

list of str

schrodinger.application.pathfinder.reaction.debug_mols(message, mols, separator=' + ')

Print a debug message (if the logger level indicates it), appending a list of SMILES representation of the molecules.

schrodinger.application.pathfinder.reaction.is_reagent_file(filename)

Check whether a given file is usable as a reagent file. A reagent file must be a structure file and the structures need to have a title. In the case of a csv file, we look for columns named ‘s_m_title’ or ‘NAME’.

Parameters

filename (str) – filename

Returns

True if the file is a reagent file

Return type

bool

schrodinger.application.pathfinder.reaction.is_reagent_filename(filename)

Check whether a filename has the extension for a possible reagent file format. Unlike is_reagent_file, it does not open the file to try to confirm whether there are valid structures in it.

Parameters

filename (str) – filename

Returns

True if the filename may be a reagent file

Return type

bool

schrodinger.application.pathfinder.reaction.get_title(mol, prop='s_m_title')

Return the title of a molecule. Looks for the property with the name specified by ‘prop’ but falls back to known aliases such as “NAME”.

Parameters
  • mol (Chem.Mol) – input molecule

  • prop (str) – title property name

Returns

molecule title, or None if unspecified

Return type

str or NoneType

schrodinger.application.pathfinder.reaction.get_reactions(filename=None, reagent_classes_file=None, max_tier=None)

Convenience function to read the reactions and the reagent classes file with a single call, and optionally filtering the reactions by tier.

Parameters
  • filename (str) – reactions file (JSON formatted). If None, read the standard file.

  • filename – reagent classes file (JSON formatted). If None, read the standard file.

  • max_tier (int or NoneType) – maximum reaction tier (None means all reactions)

Returns

dictionary of reactions

Return type

{str: Reaction}