BALL  1.4.1
smilesParser.h
Go to the documentation of this file.
00001 // -*- Mode: C++; tab-width: 2; -*-
00002 // vi: set ts=2:
00003 //
00004 
00005 #ifndef BALL_STRUCTURE_SMILES_PARSER_H
00006 #define BALL_STRUCTURE_SMILES_PARSER_H
00007 
00008 #ifndef BALL_COMMON_H
00009 # include <BALL/common.h>
00010 #endif
00011 
00012 #ifndef BALL_KERNEL_ATOM_H
00013 # include <BALL/KERNEL/atom.h>
00014 #endif
00015 
00016 #ifndef BALL_KERNEL_BOND_H
00017 # include <BALL/KERNEL/bond.h>
00018 #endif
00019 
00020 #ifndef BALL_KERNEL_SYSTEM_H
00021 # include <BALL/KERNEL/system.h>
00022 #endif
00023 
00024 namespace BALL 
00025 {
00026 
00036   class BALL_EXPORT SmilesParser
00037   {
00038     public:
00039     enum ZEIsomerType
00040     {
00041       NONE,
00042       Z,
00043       E
00044     };
00045 
00046     enum ChiralClass
00047     {
00048       NONCHIRAL,
00049       TH,
00050       AL,
00051       SP,
00052       TB,
00053       OH
00054     };
00055 
00056     enum
00057     {
00058       MAX_CONNECTIONS = 100
00059     };
00060 
00061     typedef std::pair<ChiralClass, Position> ChiralDef;
00062 
00063     class SPAtom;
00064     class SPBond 
00065       : public Bond
00066     {
00067       public:
00068       virtual ~SPBond() ;
00069 
00070       SPBond(SPAtom* first, SPAtom* second, Index order = 1);
00071 
00072       ZEIsomerType getZEType() const;
00073       void setZEType(ZEIsomerType type);
00074 
00075       protected:
00076       ZEIsomerType  ze_type_;
00077     };
00078     
00079     BALL_EXPORT class SPAtom
00080       : public Atom
00081     {
00082       public:
00083         
00084       SPAtom(const String& symbol, bool in_brackets);
00085       virtual ~SPAtom() ;
00086 
00087       Size getDefaultValence() const;
00088       Size countRealValences() const;
00089 
00090       Size getIsotope() const { return isotope_; }
00091       void setIsotope(Size isotope) { isotope_ = isotope; };
00092 
00093       Index getFormalCharge() const { return formal_charge_; }
00094       void setFormalCharge(Index charge) { formal_charge_ = charge; }
00095       
00096       const ChiralDef& getChirality() const { return chirality_; }
00097       void setChirality(const ChiralDef& chirality) { chirality_ = chirality; }
00098       
00099       bool isAromatic() const { return is_aromatic_; }
00100       void setAromatic(bool is_aromatic) { is_aromatic_ = is_aromatic; };
00101       bool isInBrackets() const { return in_brackets_; }
00102       void setInBrackets(bool in_brackets) { in_brackets_ = in_brackets; };
00103 
00104       protected:
00105       Size        isotope_;
00106       Index       formal_charge_;
00107       ChiralDef   chirality_;
00108       bool        is_aromatic_;
00109       bool        in_brackets_;
00110     };
00111     
00112     typedef std::list<Position> ConnectionList;
00113 
00117 
00119     SmilesParser();
00120       
00122     SmilesParser(const SmilesParser& parser);
00123 
00125     virtual ~SmilesParser();
00127     
00133     void parse(const String& s)
00134       throw(Exception::ParseError);
00135 
00138     const System& getSystem() const;
00140     
00144 
00145     SPAtom* createAtom(const String& symbol, bool in_bracket = false);
00146 
00148     void createBonds(SPAtom* atom, const ConnectionList* list);   
00149 
00151     void createBond(SPAtom* left, SPAtom* right, Index order);
00152 
00154     void addMissingHydrogens();
00156     
00157 
00158     struct State
00159     {
00160       Size          char_count;
00161       SmilesParser* current_parser;
00162       const char*   buffer;
00163     };
00164     
00165     static State state;
00166 
00167     protected:
00168     System                system_;
00169     std::vector<SPAtom*>  connections_;
00170     std::vector<SPAtom*>  all_atoms_;
00171     static SmilesParser*  current_parser_;
00172   };
00173   
00174 } // namespace BALL
00175 
00176 #endif // BALL_STRUCTURE_SMILES_PARSER_H
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Defines