SmilesTraversal.py :  » Development » Frowns » frowns » build » lib » frowns » Canonicalization » Python Open Source

Home
Python Open Source
1.3.1.2 Python
2.Ajax
3.Aspect Oriented
4.Blog
5.Build
6.Business Application
7.Chart Report
8.Content Management Systems
9.Cryptographic
10.Database
11.Development
12.Editor
13.Email
14.ERP
15.Game 2D 3D
16.GIS
17.GUI
18.IDE
19.Installer
20.IRC
21.Issue Tracker
22.Language Interface
23.Log
24.Math
25.Media Sound Audio
26.Mobile
27.Network
28.Parser
29.PDF
30.Project Management
31.RSS
32.Search
33.Security
34.Template Engines
35.Test
36.UML
37.USB Serial
38.Web Frameworks
39.Web Server
40.Web Services
41.Web Unit
42.Wiki
43.Windows
44.XML
Python Open Source » Development » Frowns 
Frowns » frowns » build » lib » frowns » Canonicalization » SmilesTraversal.py
"""Traversals - a traversal (or path) through a graph

Traversals are stored as a list of tokens representing each object in a graph.
Each token object has __str__ defined so once a list has been formed
it can be turned into a string object by

 "".join(traversal_list)

Tokens are defined by the representation desired.  See SmilesTokens.py for
a list of SmilesTokens.

One thing to remember is that closures are considered atom properties for
the purposes of traversals.  That is the AtomToken is reponsible for storing
information about closures.  This information is built up during the
depth first search of the graph.
"""

import SmilesTokens

class IDGenerator:
    def __init__(self):
        self.index = 0

    def next(self):
        self.index += 1
        return self.index
    
class SmilesTraversal:
    # override the following to create different
    # tokens for traversals
    AtomToken = SmilesTokens.Atom
    BondToken = SmilesTokens.Bond
    BranchToken = SmilesTokens.Branch
    BranchEndToken = SmilesTokens.BranchEnd

    def __init__(self, parent=None):
        if parent is None:
            atomsDone = {}
            idGenerator = IDGenerator()
            closureIdGenerator = IDGenerator()
            closures = {}
        else:
            atomsDone = parent.atomsDone
            idGenerator = parent.idGenerator
            closureIdGenerator = parent.closureIdGenerator
            closures = parent.closures

        self.atoms = []
        self.bonds = []
        self.data = []
        self.atomsDone = atomsDone
        self.idGenerator = idGenerator
        self.closureIdGenerator = closureIdGenerator
        self.closures = closures

    def addAtom(self, atom):
        #print "atom", atom,
        atomToken = self.AtomToken(atom,
                                   self.closures,
                                   self.closureIdGenerator)
        self.atomsDone[atom] = atomToken
        self.data.append(atomToken)
        self.atoms.append(atom)
        #print self.atomsDone

    def addBond(self, bond):
        #print "bond", bond
        self.data.append(self.BondToken(bond))
        # XXX HACK -> give the bond a traversal order
        self.bonds.append(bond)

    def addClosure(self, atom1, atom2, bond):
        #print "closure", atom1, atom2, bond
        atomsDone = self.atomsDone
        closures1 = atomsDone[atom1].closures
        closures2 = atomsDone[atom2].closures
        assert closures1 is not closures2
        id = self.idGenerator.next()
        
        bondToken = self.BondToken(bond)
        # only pass the bond info to the first atom
        # the other gets a None (or don't print bond info)
        closures1.append((id, bondToken))
        closures2.append((id, None))
        self.bonds.append(bond)

    def addBranch(self):
        self.data.append(self.BranchToken())

    def addBranchEnd(self):
        self.data.append(self.BranchEndToken())

    def append(self, traverse):
        """(traverse)->append the traverse to the current traverse"""
        self.data.extend(traverse.data)
        self.atoms.extend(traverse.atoms)
        self.bonds.extend(traverse.bonds)

    def __str__(self):
        # XXX HACK -> find the bond traversal order
        # and make a note of it.  This is pretty ugly
        index = 1
        for x in self.data:
            if x.__class__ == SmilesTokens.Bond:
                x.bond._traverseOrder = index
                index += 1
        return "".join(map(str,self.data))


class SmartsTraversal(SmilesTraversal):
    AtomToken = SmilesTokens.SmartsAtom
    BondToken = SmilesTokens.SmartsBond

class IsomericSmilesTraversal(SmilesTraversal):
    AtomToken = SmilesTokens.IsomericAtom
www.java2java.com | Contact Us
Copyright 2009 - 12 Demo Source and Support. All rights reserved.
All other trademarks are property of their respective owners.