Package schrodinger :: Package structutils :: Package interactions :: Module pi
[hide private]
[frames] | no frames]

Module pi

A module for detecting pi-pi and pi-cation interactions.

Code example for pi-cation interactions:

   from schrodinger.structutils import interactions
   from schrodinger import structure
   recep = None
   for struct in structure.StructureReader(input_file):
       if not recep:
           recep = struct
           # Precalculate receptor rings and cations to save time
           rings = interactions.gather_rings(recep)
           cations = interactions.get_receptor_positive_centroids(recep)
       else:
           picats = interactions.find_pi_cation_interactions(recep,
                                       rings1=rings, cations1=cations,
                                       struct2=struct)

Code example for pi-pi interactions:

   from schrodinger.structutils import interactions
   from schrodinger import structure
   recep = None
   for struct in structure.StructureReader(input_file):
       if not recep:
           recep = struct
           # Precalculate receptor rings to save time
           rings = interactions.gather_rings(recep)
       else:
           pipi = interactions.find_pi_pi_interactions(recep,
                                       rings1=rings, struct2=struct)
Classes [hide private]
  Centroid
The object that stores data about a centroid
  CationPiInteraction
The object that stores the data for a Cation-Pi interaction
  PiPiInteraction
The object that stores the data for a Pi-Pi interaction
Functions [hide private]
tuple of (dict, list)
protein_dictionary()
Create a receptor dictionary to assign atom flags to receptor atoms, metals, water etc.
tuple
type_receptor_fully(st, receptor_atom_flags, templates, lig_molnum)
*** Note - in order to fully type the receptor, the type_ligand_fully function must be run after this routine (automatically called in this function) ***
tuple
type_ligand_fully(st, lig_molnum)
Type the ligand using a series of SMARTS definitions.
tuple
type_untyped_residues_fully(st, untyped_residues, features_list, r_delocalized_HIP, r_delocalized_ARG, r_acceptor_atoms, r_donor_atoms, r_hydrophobic_atoms, r_positive_atoms, r_negative_atoms, r_metal_atoms, r_hydrophobic_hydrogen_atoms, r_undefined_atoms, orignal_receptor_binding_site_atoms)
Handle those residues that aren't already typed by the explicit typing scheme.
 
find_aromatic_atoms(st)
Creates an ASL expression to find aromatic atoms in a given structure
 
make_nested_list(alist, length)
Turns a linear list into a list of lists
 
type_ligand_cations(st)
Type the ligand and untemplated residues (i.e co-factors) using a series of SMARTS definitions.
(list, list, list)
type_untyped_residue_cations(st, untyped_residues, r_positive_atoms)
Type the untemplated residues (i.e co-factors) using a series of SMARTS definitions.
tuple
type_receptor_cations(st, receptor_atom_flags, templates, missing_res, verbose=False, skip_unknown=True)
Type the receptor structure using the protein atom flag dictionary and create atoms lists for each atom flag.
list of Centroid objects
cation_coordinates(st, positive_atoms, delocalized_ARG, delocalized_HIP, imidazoles, amidines)
For each atom or group, identify whether a positive charge is located on an atom (i.e NH3+) or dispersed over several atoms (i.e ARG).
Centroid
find_centroid(atomlist)
Computes the centroid of a group of atoms
Centroid
ring_centroid(ring)
Compute the centroid of the ring
float
squared_centroid_distance(cent1, cent2)
Compute the squared distance between two centroids.
list
compute_catpi(pos_structure, ring_structure, pos_centroids, ring_centroids)
Compute if there are any cation-pi interactions between the two sets of centroids.
list of Centroid objects
gather_rings(astruct)
Compile a list the aromatic centroids in a structure
list of Centroid objects
get_receptor_positive_centroids(astruct, skip_unknown=True)
Compile a list of positive centroids in a receptor structure.
 
get_broken_residues(struct)
Get a list of the residues with missing information
list
find_pi_cation_interactions(struct1, struct2=None, rings1=None, rings2=None, cations1=None, cations2=None, skip_unknown=True)
Determine if any positive centers are within a specified distance cutoff of any aromatic ring centroids.
list of PiPiInteraction objects
find_pi_pi_interactions(struct1, struct2=None, rings1=None, rings2=None, max_angle=30, max_ftf_dist=4.0, max_etf_dist=5.5)
Find all pi-pi interactions between the rings in struct1 and struct2 (or within struct1 if only 1 structure is given).
tuple
_calc_pi_pi_params(max_angle, max_ftf_dist, max_etf_dist)
Calculate parameters for the pi-pi interaction calculations
Variables [hide private]
  __doc__ = ...
  POSITIVES = '((SMARTS. "[$([N;H3&+1][N,C,S,c;!$(C=*)])]") ...
  NEGATIVES = '((SMARTS. "[C,S](=[O,S,P])-[O;H0&-1]") ...
  HYDROPHOBES = '((SMARTS. "[#6;+0;!$([#6]~[#7,#8,#9])]") ...
  POLAR_CARBONS = '((SMARTS. "[$([#6]~[#7,#8,#9])]") ...
  DONORS = '((SMARTS. "[N&!H0&v3,n&H1&+0]") OR (SMARTS...
  ACCEPTORS = '((SMARTS. "[n;+0;!X3;!$([n;H1](cc)cc)]") ...
  AROMATICS = '((SMARTS. "[a;R]"))'
  HYDROGENS = '(atom.ele H)'
  IMIDAZOLE = '(SMARTS. "[#6X3]1:[#7X3H+]:[#6X3]:[#6X3]:[#7X3H]1")'
  AMIDINE = '(SMARTS. "[NH2][CX3](=[NH2+])")'
  MISC = '((SMARTS. "[Sv6X4&H0&+0]") OR (SMARTS. "[Sv4X3...
  SPECIAL = '(SMARTS. "[$([NH-]-[Sv6X4](=O)=O)]")'
  METALS = '(SMARTS. "[#26,#27]")'
  ALIPHATIC_FLUORINES = '((SMARTS. "CF") AND NOT ...
  AROMATIC_FLUORINES = '((SMARTS. "cF") AND NOT ...
  GEMINAL_FLUORINES = '((SMARTS. "C(F)F") AND NOT ...
  UNKNOWN_RESIDUE_SKIP_LIST = [' CL ', 'GOL ', 'SO4 ']
  features_list = ['((SMARTS. "[$([N;H3&+1][N,C,S,c;!$(C=*)])]")...
  templates = None
hash(x)
  receptor_atom_flags = None
hash(x)
  __package__ = 'schrodinger.structutils.interactions'
Function Details [hide private]

protein_dictionary()

 

Create a receptor dictionary to assign atom flags to receptor atoms, metals, water etc. Does not cover ligands and co-factors.

Returns: tuple of (dict, list)
a dictionary with keys=residue names and values=a dictionary of atom types and classifications, and a list of amino acid names

type_receptor_fully(st, receptor_atom_flags, templates, lig_molnum)

 

*** Note - in order to fully type the receptor, the type_ligand_fully function must be run after this routine (automatically called in this function) ***

Type the receptor structure using the protein atom flag dictionary and create atoms lists for each atom flag.

Parameters:
  • st (schrodinger.structure.Structure object) - receptor structure to type
  • receptor_atom_flags (dict) - dictionary returned by protein_dictionary()
  • templates (list) - list returned by protein_dictionary()
  • lig_molnum (list) - list of ligand molecule numbers
  • missing_res (list) - list returned by get_broken_residues()
Returns: tuple
tuple of
  • all_r_acceptor_atoms - hydrogen bond acceptors
  • all_r_donor_atoms - hydrogen bond donors
  • all_r_hydrophobic_atoms - hydrophobic atoms
  • all_r_positive_atoms - positively charged atoms
  • all_r_negative_atoms - negatively charged atoms
  • all_r_metal_atoms - metal atoms
  • all_r_delocalized_ARG - list of lists of N-C-N atom numbers in ARG residues
  • all_r_delocalized_HIP - list of lists of CG, CD2, ND1, NE2, CE1 atom numbers in HIP residues
  • all_r_aliphatic_fluorine_atoms - aliphatic fluorine atoms
  • all_r_aromatic_fluorine_atoms - aromatic fluorine atoms
  • all_r_geminal_fluorine_atoms - geminal fluorine atoms

type_ligand_fully(st, lig_molnum)

 

Type the ligand using a series of SMARTS definitions.

Parameters:
  • st (schrodinger.structure.Structure object) - receptor structure to type
  • ligand_asl (str) - The asl that defines the ligand
  • ligand_ptype (str) - The three-letter PDB code for the ligand. The ligand_asl parameter takes precedence over this parameter if both are given.
Returns: tuple
tuple of ligand_positive_atoms ligand_negative_atoms ligand_hydrophobic_atoms ligand_donor_atoms ligand_acceptor_atoms ligand_misc_atoms ligand_special_atoms ligand_metal_atoms ligand_aliphatic_fluorine_atoms ligand_aromatic_fluorine_atoms ligand_geminal_fluorine_atoms ligand_imidazole_list ligand_amidine_list typed_ligand_atoms st_ligand lig_atom_map_dict

type_untyped_residues_fully(st, untyped_residues, features_list, r_delocalized_HIP, r_delocalized_ARG, r_acceptor_atoms, r_donor_atoms, r_hydrophobic_atoms, r_positive_atoms, r_negative_atoms, r_metal_atoms, r_hydrophobic_hydrogen_atoms, r_undefined_atoms, orignal_receptor_binding_site_atoms)

 

Handle those residues that aren't already typed by the explicit typing scheme.

Parameters:
  • st (schrodinger.structure.Structure object) - receptor structure to type

    Other calling paramters are those returned by type_receptor_fully with the same name.

  • r_acceptor_atoms (list) - hydrogen bond acceptors
  • r_donor_atoms (list) - hydrogen bond donors
  • r_hydrophobic_atoms (list) - hydrophobic atoms
  • r_positive_atoms (list) - positively charged atoms
  • r_negative_atoms (list) - negatively charged atoms
  • r_metal_atoms (list) - metal atoms
  • untyped_residues (list) - list of pdbres codes found but not typed
Returns: tuple
tuple of lists: all_r_acceptor_atoms all_r_donor_atoms all_r_hydrophobic_atoms all_r_positive_atoms all_r_negative_atoms all_r_metal_atoms all_r_delocalized_ARG all_r_delocalized_HIP all_r_aliphatic_fluorine_atoms all_r_aromatic_fluorine_atoms all_r_geminal_fluorine_atoms typed_receptor_atoms

find_aromatic_atoms(st)

 

Creates an ASL expression to find aromatic atoms in a given structure

Parameters:
  • st (schrodinger.structure.Structure object)
Returns:
list of aromatic atom indicies

make_nested_list(alist, length)

 

Turns a linear list into a list of lists

Parameters:
  • length (int) - the list to be broken into a list of lists
  • length (int) - the length of each sublist

    make_nested_list([1, 2, 3, 4, 5, 6], 2) returns: [[1,2], [3,4], [5,6]]

  • alist (a list)

type_ligand_cations(st)

 

Type the ligand and untemplated residues (i.e co-factors) using a series of SMARTS definitions.

Parameters:
  • st (schrodinger.structure.Structure object) - receptor structure to type

type_untyped_residue_cations(st, untyped_residues, r_positive_atoms)

 

Type the untemplated residues (i.e co-factors) using a series of SMARTS definitions.

Parameters:
  • st (schrodinger.structure.Structure object) - receptor structure to type
  • untyped_residues (list) - list of untyped residue names
  • untyped_residues (list) - list of atom numbers of positively-charged atoms
  • r_positive_atoms (list)
Returns: (list, list, list)
tuple of three lists - all positive atoms (r_positive_atoms + those found here), list of lists of 5 atoms that form the positively-charged center in imidazoles, list of lists of 3 atoms that form the positively-charged center in amidines

type_receptor_cations(st, receptor_atom_flags, templates, missing_res, verbose=False, skip_unknown=True)

 

Type the receptor structure using the protein atom flag dictionary and create atoms lists for each atom flag.

Parameters:
  • st (schrodinger.structure.Structure object) - receptor structure to type
  • receptor_atom_flags (dict) - dict returned by protein_dictionary()
  • templates (list) - list returned by protein_dictionary()
  • missing_res (list) - list returned by get_broken_residues()
  • verbose (bool) - True if warnings should be printed for untyped atoms
  • skip_unknown (bool, str or list) - if False, all unknown residues will be typed (very slow), if True, unknown residues will be skipped if they are in the default list UKNOWN_RESIDUE_SKIP_LIST. If 'all', then all unknown residues will be skipped. If a list is supplied, only residues with names matching those in the supplied list will be skipped.
Returns: tuple
tuple of
  • r_positive_atoms - positively charged atoms
  • rec_delocalized_ARG - list of lists of N-C-N atom numbers in ARG residues
  • rec_delocalized_HIP - list of lists of CG, CD2, ND1, NE2, CE1 atom numbers in HIP residues
  • untyped_residues - list of pdbres codes found but not typed
  • unknown_atom_types - list of atom objectss in typed residues that have unknown atom types.

cation_coordinates(st, positive_atoms, delocalized_ARG, delocalized_HIP, imidazoles, amidines)

 

For each atom or group, identify whether a positive charge is located on an atom (i.e NH3+) or dispersed over several atoms (i.e ARG). If the charged is dispersed, create an atom centroid to represent the location of the positive charge. Identify the atom/centroid coordinates.

Parameters:
  • st (schrodinger.structure.Structure object) - structure to calculate positive centroids for
  • positive_atoms (list) - list of atom numbers of positively charged atoms
  • delocalized_ARG (list of lists) - each item is a list of atom numbers in an ARG
  • delocalized_HIP (list of lists) - each item is a list of atom numbers in an HIP
  • imidazoles (list of lists) - each item is a list of atom numbers in an imidazole
  • amidines (list of lists) - each item is a list of atom numbers in an amidine
Returns: list of Centroid objects
each item of the list is a Centroid object for a positively charged centroid.

find_centroid(atomlist)

 

Computes the centroid of a group of atoms

Parameters:
  • atomlist (list) - list of atom objects
Returns: Centroid
Centroid object for the atoms

ring_centroid(ring)

 

Compute the centroid of the ring

Parameters:
  • ring (schrodinger.structure._Ring object) - the ring to calculate the centroid of
Returns: Centroid
Centroid object for the ring

squared_centroid_distance(cent1, cent2)

 

Compute the squared distance between two centroids. Using the squared distance saves the sqrt compute cycles.

Parameters:
  • cent1 (Centroid object) - first centroid
  • cent2 (Centroid object) - second centroid
Returns: float
the squared distance between the two centroids.

compute_catpi(pos_structure, ring_structure, pos_centroids, ring_centroids)

 

Compute if there are any cation-pi interactions between the two sets of centroids.

Parameters:
  • pos_structure (schrodinger.structure.Structure object) - structure that contains the cations
  • ring_structure (schrodinger.structure.Structure object) - structure that contains the rings
  • pos_centroids (list of Centroid objects) - the positively charged centroids
  • ring_centroids (list of Centroid objects) - the ring centroids
Returns: list
list of CationPiInteraction objects, 1 for each interaction

gather_rings(astruct)

 

Compile a list the aromatic centroids in a structure

Parameters:
  • astruct (schrodinger.structure.Structure object) - structure to calculate aromatic ring centroids for
Returns: list of Centroid objects
list of ring Centroid objects

get_receptor_positive_centroids(astruct, skip_unknown=True)

 

Compile a list of positive centroids in a receptor structure. This function can be very slow if unknown residues are found in the structure. These are often counterions or surfactants. Removing these before doing this calculation can speed things up dramatically - or use skip_unknown=True if the unknown residues are not of interest.

Parameters:
  • astruct (schrodinger.structure.Structure object) - structure to calculate positive centroids for
  • skip_unknown (bool, str or list) - if False, all unknown residues will be typed (very slow), if True, unknown residues will be skipped if they are in the default list UKNOWN_RESIDUE_SKIP_LIST. If 'all', then all unknown residues will be skipped. If a list is supplied, only residues with names matching those in the supplied list will be skipped.
Returns: list of Centroid objects
list of Centroids of positively charged centers. The centroids may be for an atom or a positively charged group.

get_broken_residues(struct)

 

Get a list of the residues with missing information

Parameters:
  • struct (schrodinger.structure.Structure object) - structure to calculate positive centroids for

find_pi_cation_interactions(struct1, struct2=None, rings1=None, rings2=None, cations1=None, cations2=None, skip_unknown=True)

 

Determine if any positive centers are within a specified distance cutoff of any aromatic ring centroids. For those positive center/ring contacts, determine if the positive center is located on the face of the ring rather than the edge.. This function can be very slow if unknown residues are found in the structure. These are often counterions or surfactants. Removing these before doing this calculation can speed things up dramatically - or use skip_unknown='all' if the unknown residues are not of interest.

Code example:

   import interactions
   from schrodinger import structure
   recep = None
   for struct in structure.StructureReader(input_file):
       if not recep:
           recep = struct
           # Precalculate receptor rings and cations to save time
           rings = interactions.gather_rings(recep)
           cations = interactions.get_receptor_positive_centroids(recep)
       else:
           picats = interactions.find_pi_cation_interactions(recep,
                                       rings1=rings, cations1=cations,
                                       struct2=struct)
Parameters:
  • struct1 (schrodinger.structure.Structure object) - Receptor structure if for a ligand-receptor complex, or the first of two structures to compute pi-cations for
  • struct2 (schrodinger.structure.Structure object) - Ligand structure if for a ligand-receptor complex, or the second of two structures, or None if the first structure should be search for intramolecular interactions.
  • rings1 (list of Centroid objects) - Centroid objects for the aromatic rings in struct1. If not passed, will be computed.
  • rings2 (list of Centroid objects) - Centroid objects for the aromatic rings in struct2. If not passed, will be computed.
  • cations1 (list of Centroid objects) - Centroid objects for the cations in struct1. If not passed, will be computed.
  • cations2 (list of Centroid objects) - Centroid objects for the cations in struct2. If not passed, will be computed.
  • skip_unknown (bool, str or list) - if False, all unknown residues will be typed (very slow), if True, unknown residues will be skipped if they are in the default list UKNOWN_RESIDUE_SKIP_LIST. If 'all', then all unknown residues will be skipped. If a list is supplied, only residues with names matching those in the supplied list will be skipped.
Returns: list
list of CationPiInteraction interaction objects:
   # CationPiInteraction properties:
   cation_structure: structure that contains the cation
   pi_structure: structure that contains the pi group
   cation_centroid: Centroid of the positive charge
   pi_centroid: Centroid of the pi group
   distance: distance between the centroids
   angle: angle in degrees between the centroids

find_pi_pi_interactions(struct1, struct2=None, rings1=None, rings2=None, max_angle=30, max_ftf_dist=4.0, max_etf_dist=5.5)

 

Find all pi-pi interactions between the rings in struct1 and struct2 (or within struct1 if only 1 structure is given). Interactions are classified as to whether they are face-to-face or edge-to-face.

Interaction detection is based on parameters from: Marcou & Rognan, J. Chem. Inf. Model, Vol. 47, No. 1, 2007 with slightly increased distance tolerances and decreased angle tolerances

Code example:

   import interactions
   from schrodinger import structure
   recep = None
   for struct in structure.StructureReader(input_file):
       if not recep:
           recep = struct
           # Precalculate receptor rings to save time
           rings = interactions.gather_rings(recep)
       else:
           pipi = interactions.find_pi_pi_interactions(recep,
                                       rings1=rings, struct2=struct)
Parameters:
  • struct1 (schrodinger.structure.Structure object) - first of two structures to compute pi-pi interactions for
  • struct2 (schrodinger.structure.Structure object) - second of two structures to compute pi-pi interactions for. If not given, struct1 will be searched for intramolecular interactions.
  • rings1 (list of Centroid objects) - Centroid objects for the aromatic rings in struct1. If not passed, will be computed.
  • rings2 (list of Centroid objects) - Centroid objects for the aromatic rings in struct2. If not passed, will be computed.
  • max_angle (float) - The maximum angle allowed for a face-to-face interaction. (The minimum angle allowed for edge-to-face interactions will be 90 - max_angle.)
  • max_ftf_dist (float) - The maximum distance allowed between the centroids of face-to-face rings
  • max_ftf_dist (float) - The maximum distance allowed between the centroids of edge-to-face rings
  • max_etf_dist (float)
Returns: list of PiPiInteraction objects
a PiPiInteraction object for each interaction found. Properties of a PiPiInteraction object are:
  • struct1: structure that contains the first ring
  • struct2: structure that contains the second ring
  • ring1: Centroid of the first ring
  • ring2: Centroid of the second ring
  • distance: distance between the centroids
  • angle: angle in degrees between the two ring planes
  • face_to_face: True if the interaction is face to face, False if it is edge to face

_calc_pi_pi_params(max_angle, max_ftf_dist, max_etf_dist)

 

Calculate parameters for the pi-pi interaction calculations

Parameters:
  • max_angle (float) - The maximum angle allowed for a face-to-face interaction. (The minimum angle allowed for edge-to-face interactions will be 90 - max_angle.)
  • max_ftf_dist (float) - The maximum distance allowed between the centroids of face-to-face rings
  • max_ftf_dist (float) - The maximum distance allowed between the centroids of edge-to-face rings
  • max_etf_dist (float)
Returns: tuple
A tuple of (maximum distance squared, maximum face-to-face distance squared, maximum edge-to-face distance squared, maximum face-to-face angle, minimum face-to-face angle)

Variables Details [hide private]

__doc__

Value:
"""
A module for detecting pi-pi and pi-cation interactions.
 
Code example for pi-cation interactions::
    from schrodinger.structutils import interactions
    from schrodinger import structure
    recep = None
    for struct in structure.StructureReader(input_file):
...

POSITIVES

Value:
'((SMARTS. "[$([N;H3&+1][N,C,S,c;!$(C=*)])]")              OR (SMARTS.\
 "[$([N;H2&+1]([C,c;!$(C=*)])([C,c;!$(C=*)]))]")              OR (SMAR\
TS. "[$([N;H1&+1]([C,c;!$(C=*)])([C,c;!$(C=*)])([C,c;!$(C=*)]))]")    \
          OR (SMARTS. "[$([N;H0&+1]([C,c;!$(C=*)])([C,c;!$(C=*)])([C,c\
;!$(C=*)])([C,c;!$(C=*)]))]")              OR (SMARTS. "[Nv4X4&H0&+1;!\
$(N(=O)O)]")              OR (SMARTS. "[Nv4X3&H0&+1;!$(N(=O)O)]")     \
         OR (SMARTS. "[nv4X3;H1;+1;r6,r5]")              OR (SMARTS. "\
*=[Nv4X3H2+]")              OR (SMARTS. "*=[Nv4X3H+]")              OR\
...

NEGATIVES

Value:
'((SMARTS. "[C,S](=[O,S,P])-[O;H0&-1]")              OR (SMARTS. "[PX4\
]-[O;H0&-1]")              OR (SMARTS. "[n;X2;H0&-1]")              OR\
 (SMARTS. "[Nv2X2&H0&-1]")              OR (SMARTS. "([NX3+](=O)[O-])"\
)              OR (SMARTS. "[$([NH-]-[Sv6X4](=O)=O)]")              OR\
 (SMARTS. "[O-]")              OR (SMARTS. "[N-]")              OR (SM\
ARTS. "[$([S;H0-1]-P)]")              OR (SMARTS. "[$([SX1;H0;-1])]"))\
'

HYDROPHOBES

Value:
'((SMARTS. "[#6;+0;!$([#6]~[#7,#8,#9])]")                OR (SMARTS. "\
[s,S;v2X2;H0;+0]")                OR (SMARTS. "[$([SX3v3;H0;+0;!$([SX3\
v3;H0;+0]~[#7,#8,#9])])]")                OR (SMARTS. "[$([SX4v4;H0;+0\
;!$([SX4v4;H0;+0]~[#7,#8,#9])])]")                OR (SMARTS. "[$([Cl,\
Br,I;v1X1;H0;+0]([!Cl&!Br&!I]))]")                OR (SMARTS. "[B]"))'

POLAR_CARBONS

Value:
'((SMARTS. "[$([#6]~[#7,#8,#9])]")                  OR (SMARTS. "[$([S\
X3v3;H0;+0]~[#7,#8,#9])]")                  OR (SMARTS. "[$([SX4v4;H0;\
+0]~[#7,#8,#9])]"))'

DONORS

Value:
'((SMARTS. "[N&!H0&v3,n&H1&+0]")           OR (SMARTS. "[O,S;H1;+0]") \
          OR (SMARTS. "[$([NH-]-[Sv6X4](=O)=O)]"))'

ACCEPTORS

Value:
'((SMARTS. "[n;+0;!X3;!$([n;H1](cc)cc)]")              OR (SMARTS. "[$\
([N;H0]#[C&v4])]")              OR (SMARTS. "[O,S;H1;v2]")            \
  OR (SMARTS. "[O;H0;v2;!$(O=N-*)]")              OR (SMARTS. "[o;+0]"\
)              OR (SMARTS. "[$([S;X1]=[#6])]")              OR (SMARTS\
. "=[Nv3X2]")              OR (SMARTS. "[$([OX1]=[NX2])]")            \
  OR (SMARTS. "[S,s;v2X2;H0;+0]")              OR (SMARTS. "[$([Nv3X3;\
H0,H1;+0]);!$([NX3][CX3](=[OX1]));!$([NX3][SX4](=[OX1])=[OX1])]")     \
         OR (SMARTS. "[Sv2X1;H0;+0]")              OR (SMARTS. "[N;v3;\
...

MISC

Value:
'((SMARTS. "[Sv6X4&H0&+0]")         OR (SMARTS. "[Sv4X3&H0&+0]")      \
   OR (SMARTS. "[Nv3X3&H0&+0]")         OR (SMARTS. "[Pv5X4;H0;+0]")  \
       OR (SMARTS. "[Pv4X4;H0;+0]")         OR (SMARTS. "[$([#9]-[!#6]\
)]")         OR (SMARTS. "[$([Cl,Br,I])&!$([Cl,Br,I;v1X1;H0;+0]([!Cl&!\
Br&!I]))]"))'

ALIPHATIC_FLUORINES

Value:
'((SMARTS. "CF") AND NOT                        (SMARTS. "C(F)F") AND \
NOT                        (SMARTS. "C"))'

AROMATIC_FLUORINES

Value:
'((SMARTS. "cF") AND NOT                       (SMARTS. "c"))'

GEMINAL_FLUORINES

Value:
'((SMARTS. "C(F)F") AND NOT                      (SMARTS. "C"))'

features_list

Value:
['((SMARTS. "[$([N;H3&+1][N,C,S,c;!$(C=*)])]")              OR (SMARTS\
. "[$([N;H2&+1]([C,c;!$(C=*)])([C,c;!$(C=*)]))]")              OR (SMA\
RTS. "[$([N;H1&+1]([C,c;!$(C=*)])([C,c;!$(C=*)])([C,c;!$(C=*)]))]")   \
           OR (SMARTS. "[$([N;H0&+1]([C,c;!$(C=*)])([C,c;!$(C=*)])([C,\
c;!$(C=*)])([C,c;!$(C=*)]))]")              OR (SMARTS. "[Nv4X4&H0&+1;\
!$(N(=O)O)]")              OR (SMARTS. "[Nv4X3&H0&+1;!$(N(=O)O)]")    \
          OR (SMARTS. "[nv4X3;H1;+1;r6,r5]")              OR (SMARTS. \
"*=[Nv4X3H2+]")              OR (SMARTS. "*=[Nv4X3H+]")              O\
...