Package rdkit :: Package Chem :: Package AtomPairs :: Module Pairs

[hide private]
[frames] | no frames]

# Source Code for Module rdkit.Chem.AtomPairs.Pairs

      1  # $Id$
      2  #
      3  #  Copyright (C) 2004-2007 Greg Landrum and Rational Discovery LLC
      4  #
      5  #   @@ All Rights Reserved @@
      6  #  This file is part of the RDKit.
      7  #  The contents are covered by the terms of the BSD license
      8  #  which is included in the file license.txt, found at the root
      9  #  of the RDKit source tree.
     10  #
     11  """ Contains an implementation of Atom-pair fingerprints, as
     12  described in:
     13
     14  R.E. Carhart, D.H. Smith, R. Venkataraghavan;
     15  "Atom Pairs as Molecular Features in Structure-Activity Studies:
     16  Definition and Applications" JCICS 25, 64-73 (1985).
     17
     18  """
     19  from rdkit.DataStructs import IntSparseIntVect
     20  from rdkit import Chem
     21  from rdkit.Chem import rdMolDescriptors
     22  from rdkit.Chem.AtomPairs import Utils
     23  from rdkit import DataStructs
     24
     25  from rdkit.Chem.rdMolDescriptors import GetAtomPairFingerprint,GetHashedAtomPairFingerprint
     26  GetAtomPairFingerprintAsIntVect=rdMolDescriptors.GetAtomPairFingerprint
     27
     28  numPathBits=rdMolDescriptors.AtomPairsParameters.numPathBits
     29  _maxPathLen=(1<<numPathBits)-1
     30  numFpBits=numPathBits+2*rdMolDescriptors.AtomPairsParameters.codeSize
     31  fpLen=1<<numFpBits
     32
     33 -def pyScorePair(at1,at2,dist,atomCodes=None):
     34    """ Returns a score for an individual atom pair.
     35
     36    >>> m = Chem.MolFromSmiles('CCCCC')
     37    >>> c1 = Utils.GetAtomCode(m.GetAtomWithIdx(0))
     38    >>> c2 = Utils.GetAtomCode(m.GetAtomWithIdx(1))
     39    >>> c3 = Utils.GetAtomCode(m.GetAtomWithIdx(2))
     40    >>> t = 1 | min(c1,c2)<<numPathBits | max(c1,c2)<<(rdMolDescriptors.AtomPairsParameters.codeSize+numPathBits)
     41    >>> pyScorePair(m.GetAtomWithIdx(0),m.GetAtomWithIdx(1),1)==t
     42    1
     43    >>> pyScorePair(m.GetAtomWithIdx(1),m.GetAtomWithIdx(0),1)==t
     44    1
     45    >>> t = 2 | min(c1,c3)<<numPathBits | max(c1,c3)<<(rdMolDescriptors.AtomPairsParameters.codeSize+numPathBits)
     46    >>> pyScorePair(m.GetAtomWithIdx(0),m.GetAtomWithIdx(2),2)==t
     47    1
     48    >>> pyScorePair(m.GetAtomWithIdx(0),m.GetAtomWithIdx(2),2,
     49    ...  atomCodes=(Utils.GetAtomCode(m.GetAtomWithIdx(0)),Utils.GetAtomCode(m.GetAtomWithIdx(2))))==t
     50    1
     51
     52    """
     53    if not atomCodes:
     54      code1 = Utils.GetAtomCode(at1)
     55      code2 = Utils.GetAtomCode(at2)
     56    else:
     57      code1,code2=atomCodes
     58    accum = int(dist) % _maxPathLen
     59    accum |= min(code1,code2) << numPathBits
     60    accum |= max(code1,code2) << (rdMolDescriptors.AtomPairsParameters.codeSize+numPathBits)
     61    return accum
     62
     63 -def ExplainPairScore(score):
     64    """
     65    >>> m = Chem.MolFromSmiles('C=CC')
     66    >>> score = pyScorePair(m.GetAtomWithIdx(0),m.GetAtomWithIdx(1),1)
     67    >>> ExplainPairScore(score)
     68    (('C', 1, 1), 1, ('C', 2, 1))
     69    >>> score = pyScorePair(m.GetAtomWithIdx(0),m.GetAtomWithIdx(2),2)
     70    >>> ExplainPairScore(score)
     71    (('C', 1, 0), 2, ('C', 1, 1))
     72    >>> score = pyScorePair(m.GetAtomWithIdx(1),m.GetAtomWithIdx(2),1)
     73    >>> ExplainPairScore(score)
     74    (('C', 1, 0), 1, ('C', 2, 1))
     75    >>> score = pyScorePair(m.GetAtomWithIdx(2),m.GetAtomWithIdx(1),1)
     76    >>> ExplainPairScore(score)
     77    (('C', 1, 0), 1, ('C', 2, 1))
     78
     79    """
     80    codeMask = (1<<rdMolDescriptors.AtomPairsParameters.codeSize)-1
     81    pathMask = (1<<numPathBits)-1
     82    dist = score&pathMask
     83
     84    score = score>>numPathBits
     85    code1 = score&codeMask
     86    score = score>>rdMolDescriptors.AtomPairsParameters.codeSize
     87    code2 = score&codeMask
     88
     89    res = Utils.ExplainAtomCode(code1),dist,Utils.ExplainAtomCode(code2)
     90    return res
     91
     92 -def GetAtomPairFingerprintAsBitVect(mol):
     93    """ Returns the Atom-pair fingerprint for a molecule as
     94    a SparseBitVect. Note that this doesn't match the standard
     95    definition of atom pairs, which uses counts of the
     96    pairs, not just their presence.
     97
     98    **Arguments**:
     99
    100      - mol: a molecule
    101
    102    **Returns**: a SparseBitVect
    103
    104    >>> m = Chem.MolFromSmiles('CCC')
    105    >>> v = [ pyScorePair(m.GetAtomWithIdx(0),m.GetAtomWithIdx(1),1),
    106    ...       pyScorePair(m.GetAtomWithIdx(0),m.GetAtomWithIdx(2),2),
    107    ...     ]
    108    >>> v.sort()
    109    >>> fp = GetAtomPairFingerprintAsBitVect(m)
    110    >>> list(fp.GetOnBits())==v
    111    True
    112
    113    """
    114    res = DataStructs.SparseBitVect(fpLen)
    115    fp = rdMolDescriptors.GetAtomPairFingerprint(mol)
    116    for val in fp.GetNonzeroElements().keys():
    117      res.SetBit(val)
    118    return res
    119
    120  #------------------------------------
    121  #
    122  #  doctest boilerplate
    123  #
    124 -def _test():
    125    import doctest,sys
    126    return doctest.testmod(sys.modules["__main__"])
    127
    128
    129  if __name__ == '__main__':
    130    import sys
    131    failed,tried = _test()
    132    sys.exit(failed)
    133