BALL  1.4.2
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
smartsMatcher.h
Go to the documentation of this file.
1 // -*- Mode: C++; tab-width: 2; -*-
2 // vi: set ts=2:
3 //
4 
5 #ifndef BALL_STRUCTURE_SMARTSMATCHER_H
6 #define BALL_STRUCTURE_SMARTSMATCHER_H
7 
8 #ifndef BALL_STRUCTURE_SMARTSPARSER_H
10 #endif
11 
12 #include <vector>
13 #include <set>
14 #include <map>
15 
16 #include <boost/shared_ptr.hpp>
17 
18 namespace BALL
19 {
20  // forward declaration
21  class Molecule;
22 
45  {
46  public:
47 
51  typedef std::vector<std::set<const Atom*> > Match;
53 
54 
58 
59  SmartsMatcher();
60 
62  virtual ~SmartsMatcher();
64 
65 
69 
70  void match(Match& matches, Molecule& mol, const String& smarts)
71  throw(Exception::ParseError);
72 
74  void match(Match& matches, Molecule& mol, const String& smarts, const std::set<const Atom*>& start_atoms)
75  throw(Exception::ParseError);
76 
78  void match(std::vector<Match>& matches, Molecule& mol, const std::vector<String>& smarts)
79  throw(Exception::ParseError);
80 
82  void match(std::vector<Match>& matches, Molecule& mol, const std::vector<String>& smarts, const std::set<const Atom*>& start_atoms)
83  throw(Exception::ParseError);
84 
86  void setSSSR(const std::vector<std::vector<Atom*> >& sssr);
87 
89  void unsetSSSR();
91 
92 
93  private:
94 
96  SmartsMatcher(const SmartsMatcher& matcher);
97 
101 
102  SmartsMatcher& operator = (const SmartsMatcher& matcher);
104 
105 
106  protected:
107 
116 
119  {
120  public:
121 
123  RecStructCore_();
124 
127 
129  virtual ~RecStructCore_();
130 
132  RecStructCore_& operator = (const RecStructCore_&);
133 
135  void clear();
136 
138  std::vector<std::set<const Atom*> > matched_atoms;
139 
141  std::vector<std::map<const SPNode*, const Atom*> > mapped_atoms;
142 
144  std::vector<std::set<const Atom*> > visited_atoms;
145 
147  std::vector<std::set<const Bond*> > visited_bonds;
148 
150  std::vector<std::set<const SPEdge*> > visited_edges;
151 
153  std::vector<std::pair<const SPNode*, const Atom*> > first_matches;
154  };
155 
158  {
159  public:
160 
162  RecStructPool_();
163 
165  virtual ~RecStructPool_();
166 
168  RecStructCore_* getNextFree();
169 
171  Position getLastPosition();
172 
174  void destroy(Position pos);
175 
176  private:
177 
179  void resize_();
180 
183 
185  RecStructPool_& operator = (const RecStructPool_&);
186 
188  std::vector<RecStructCore_*> rec_struct_pool_;
189 
191  std::vector<Position> free_list_;
192 
195  };
196 
197 
200  {
201  private:
204 
205  public:
206 
208  RecStruct_();
209 
211  RecStruct_(const RecStruct_& rec_struct);
212 
214  virtual ~RecStruct_();
215 
217  RecStruct_& operator = (const RecStruct_&);
218 
220  std::vector<std::set<const Atom*> >& matched_atoms;
221 
223  std::vector<std::map<const SPNode*, const Atom*> >& mapped_atoms;
224 
226  std::vector<std::set<const Atom*> >& visited_atoms;
227 
229  std::vector<std::set<const Bond*> >& visited_bonds;
230 
232  std::vector<std::set<const SPEdge*> >& visited_edges;
233 
235  std::vector<std::pair<const SPNode*, const Atom*> >& first_matches;
236 
238  void add(const RecStruct_& rec_struct);
239 
241  void add(const RecStruct_& rec_struct, Size i);
242 
244  void clear();
245 
247  void dump(const String& name, Size depth_ = 0);
248 
249  private:
250 
253  };
254 
256  static boost::shared_ptr<RecStructPool_> pool_;
257 
259  bool evaluateRingEdges_(const std::set<const Atom*>& matching, const std::map<const SPNode*, const Atom*>& mapping, const String& smarts);
260 
262  void evaluate_( RecStruct_& rs, SPNode* start_node, const Atom* start_atom);
263 
265  bool evaluate_node_(RecStruct_& rs, SPNode* start_node, const Atom* start_atom);
266 
268  bool evaluate_edge_(RecStruct_& rs, SPEdge* start_node, const Atom* start_atom, const Bond* start_bond);
269 
271  std::map<SPNode*, std::vector<std::set<const Atom*> > > rec_matches_;
272 
275 
277  std::vector<std::vector<Atom*> > sssr_;
278 
279  // debug output depth
281  };
282 
283 } // namespace BALL
284 
285 #endif // BALL_STRUCTURE_SMARTSMATCHER_H
286