Chemical Data Processing Library C++ API - Version 1.4.0
ReactionSubstructureSearch.hpp
Go to the documentation of this file.
1 /*
2  * ReactionSubstructureSearch.hpp
3  *
4  * This file is part of the Chemical Data Processing Toolkit
5  *
6  * Copyright (C) 2003 Thomas Seidel <thomas.seidel@univie.ac.at>
7  *
8  * This library is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Lesser General Public
10  * License as published by the Free Software Foundation; either
11  * version 2 of the License, or (at your option) any later version.
12  *
13  * This library is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16  * Lesser General Public License for more details.
17  *
18  * You should have received a copy of the GNU Lesser General Public License
19  * along with this library; see the file COPYING. If not, write to
20  * the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
21  * Boston, MA 02111-1307, USA.
22  */
23 
29 #ifndef CDPL_CHEM_REACTIONSUBSTRUCTURESEARCH_HPP
30 #define CDPL_CHEM_REACTIONSUBSTRUCTURESEARCH_HPP
31 
32 #include <vector>
33 #include <deque>
34 #include <set>
35 #include <utility>
36 #include <cstddef>
37 
38 #include <boost/iterator/indirect_iterator.hpp>
39 
40 #include "CDPL/Chem/APIPrefix.hpp"
43 #include "CDPL/Util/BitSet.hpp"
45 
46 
47 namespace CDPL
48 {
49 
50  namespace Chem
51  {
52 
53  class Reaction;
54  class MolecularGraph;
55  class Atom;
56  class Bond;
57 
70  {
71 
72  typedef std::vector<AtomBondMapping*> ABMappingList;
73 
74  public:
78  typedef boost::indirect_iterator<ABMappingList::iterator, AtomBondMapping> MappingIterator;
79 
83  typedef boost::indirect_iterator<ABMappingList::const_iterator, const AtomBondMapping> ConstMappingIterator;
84 
89 
95 
97 
104 
106 
111  void setQuery(const Reaction& query);
112 
125  bool mappingExists(const Reaction& target);
126 
141  bool findMappings(const Reaction& target);
142 
147  std::size_t getNumMappings() const;
148 
155  AtomBondMapping& getMapping(std::size_t idx);
156 
163  const AtomBondMapping& getMapping(std::size_t idx) const;
164 
170 
176 
182 
188 
194 
200 
206 
212 
224  void uniqueMappingsOnly(bool unique);
225 
231  bool uniqueMappingsOnly() const;
232 
243  void setMaxNumMappings(std::size_t max_num_mappings);
244 
250  std::size_t getMaxNumMappings() const;
251 
263  void setEnabledReactionRoles(unsigned int roles);
264 
271  unsigned int getEnabledReactionRoles() const;
272 
273  private:
274  typedef std::pair<std::size_t, std::size_t> IndexOffsetPair;
275 
276  bool init(const Reaction&);
277 
278  void initQueryData();
279  void initTargetData();
280 
281  bool findEquivAtoms();
282  bool findEquivBonds();
283 
284  bool mapAtoms();
285 
286  std::size_t nextQueryAtom() const;
287  bool nextTargetAtom(std::size_t, unsigned int, std::size_t&, std::size_t&) const;
288 
289  bool atomMappingAllowed(std::size_t, std::size_t) const;
290 
291  bool mapBonds(const Atom*, const Atom*, const IndexOffsetPair&);
292  bool mapAtoms(std::size_t);
293  bool mapAtoms(std::size_t, std::size_t);
294 
295  bool mappingFound();
296 
297  bool hasPostMappingMatchExprs() const;
298  bool foundMappingMatches(const AtomBondMapping*) const;
299 
300  bool foundMappingUnique();
301 
302  void freeAtomBondMappings();
303  void freeAtomBondMapping();
304 
305  AtomBondMapping* createAtomBondMapping();
306 
307  class ABMappingMask
308  {
309 
310  public:
311  void initAtomMask(std::size_t);
312  void initBondMask(std::size_t);
313 
314  void setAtomBit(std::size_t);
315  void resetAtomBit(std::size_t);
316 
317  bool testAtomBit(std::size_t) const;
318 
319  void setBondBit(std::size_t);
320  void resetBondMask();
321 
322  bool operator<(const ABMappingMask&) const;
323  bool operator>(const ABMappingMask&) const;
324 
325  private:
326  Util::BitSet atomMask;
327  Util::BitSet bondMask;
328  };
329 
330  typedef MatchExpression<Reaction>::SharedPointer ReactionMatchExprPtr;
331 
332  typedef std::vector<Util::BitSet> BitMatrix;
333  typedef std::vector<const Atom*> AtomMappingTable;
334  typedef std::vector<std::size_t> BondMappingTable;
335  typedef std::deque<std::size_t> AtomQueue;
336  typedef std::set<ABMappingMask> UniqueMappingList;
337  typedef std::vector<const Atom*> AtomList;
338  typedef std::vector<const Bond*> BondList;
339  typedef std::vector<std::size_t> IndexList;
340  typedef std::vector<MatchExpression<Atom, MolecularGraph>::SharedPointer> AtomMatchExprTable;
341  typedef std::vector<MatchExpression<Bond, MolecularGraph>::SharedPointer> BondMatchExprTable;
342  typedef std::vector<IndexOffsetPair> IndexOffsetTable;
343  typedef Util::ObjectStack<AtomBondMapping> MappingCache;
344 
345  const Reaction* query;
346  const Reaction* target;
347  AtomList queryAtoms;
348  BondList queryBonds;
349  AtomList targetAtoms;
350  BondList targetBonds;
351  IndexOffsetTable queryABIndexOffsets;
352  IndexOffsetTable targetABIndexOffsets;
353  BitMatrix atomEquivMatrix;
354  BitMatrix bondEquivMatrix;
355  AtomQueue termQueryAtoms;
356  AtomMappingTable queryAtomMapping;
357  BondMappingTable queryBondMapping;
358  Util::BitSet queryMappingMask;
359  ABMappingMask targetMappingMask;
360  ABMappingList foundMappings;
361  UniqueMappingList uniqueMappings;
362  AtomMatchExprTable atomMatchExprTable;
363  BondMatchExprTable bondMatchExprTable;
364  ReactionMatchExprPtr rxnMatchExpression;
365  IndexList postMappingMatchAtoms;
366  IndexList postMappingMatchBonds;
367  MappingCache mappingCache;
368  bool queryChanged;
369  bool initQueryMappingData;
370  bool uniqueMatches;
371  bool saveMappings;
372  unsigned int enabledRxnRoles;
373  std::size_t numQueryAtoms;
374  std::size_t numQueryBonds;
375  std::size_t numTargetAtoms;
376  std::size_t numTargetBonds;
377  std::size_t maxNumMappings;
378  };
379  } // namespace Chem
380 } // namespace CDPL
381 
382 #endif // CDPL_CHEM_REACTIONSUBSTRUCTURESEARCH_HPP
Definition of class CDPL::Chem::AtomBondMapping.
Declaration of type CDPL::Util::BitSet.
Definition of the preprocessor macro CDPL_CHEM_API.
#define CDPL_CHEM_API
Tells the compiler/linker which classes, functions and variables are part of the library API.
Definition of class CDPL::Chem::MatchExpression.
Definition of class CDPL::Util::ObjectStack.
Data structure for the common storage of related atom to atom and bond to bond mappings.
Definition: AtomBondMapping.hpp:55
Abstract base class representing a chemical atom and its bonded neighborhood.
Definition: Atom.hpp:57
Generic boolean expression interface for the implementation of query/target object equivalence tests ...
Definition: MatchExpression.hpp:75
Reaction-level analogue of Chem::SubstructureSearch that locates atom/bond mappings of a query reacti...
Definition: ReactionSubstructureSearch.hpp:70
MappingIterator getMappingsBegin()
Returns a mutable iterator pointing to the beginning of the stored atom/bond mapping objects.
ReactionSubstructureSearch()
Constructs and initializes a ReactionSubstructureSearch instance.
ConstMappingIterator end() const
Returns a constant iterator pointing to the end of the stored atom/bond mapping objects.
std::size_t getNumMappings() const
Returns the number of atom/bond mappings that were recorded in the last call to findMappings().
bool mappingExists(const Reaction &target)
Tells whether the query reaction pattern matches the specified target reaction.
std::size_t getMaxNumMappings() const
Returns the specified limit on the number of stored atom/bond mappings.
void setQuery(const Reaction &query)
Allows to specify a new query reaction pattern.
bool findMappings(const Reaction &target)
Searches for all possible atom/bond between the query reaction pattern and the specified target react...
const AtomBondMapping & getMapping(std::size_t idx) const
Returns a const reference to the stored atom/bond mapping object at index idx.
void setMaxNumMappings(std::size_t max_num_mappings)
Allows to specify a limit on the number of stored atom/bond mappings.
MappingIterator getMappingsEnd()
Returns a mutable iterator pointing to the end of the stored atom/bond mapping objects.
void setEnabledReactionRoles(unsigned int roles)
Allows the reaction role specific exclusion of query and target components from the search for matchi...
boost::indirect_iterator< ABMappingList::const_iterator, const AtomBondMapping > ConstMappingIterator
A constant random access iterator used to iterate over the stored atom/bond mapping objects.
Definition: ReactionSubstructureSearch.hpp:83
ConstMappingIterator begin() const
Returns a constant iterator pointing to the beginning of the stored atom/bond mapping objects.
ReactionSubstructureSearch & operator=(const ReactionSubstructureSearch &)=delete
void uniqueMappingsOnly(bool unique)
Allows to specify whether or not to store only unique atom/bond mappings.
bool uniqueMappingsOnly() const
Tells whether duplicate atom/bond mappings are discarded.
AtomBondMapping & getMapping(std::size_t idx)
Returns a non-const reference to the stored atom/bond mapping object at index idx.
ReactionSubstructureSearch(const Reaction &query)
Constructs and initializes a ReactionSubstructureSearch instance for the specified query reaction pat...
boost::indirect_iterator< ABMappingList::iterator, AtomBondMapping > MappingIterator
A mutable random access iterator used to iterate over the stored atom/bond mapping objects.
Definition: ReactionSubstructureSearch.hpp:78
MappingIterator begin()
Returns a mutable iterator pointing to the beginning of the stored atom/bond mapping objects.
unsigned int getEnabledReactionRoles() const
Tells which reaction component roles are considered in the search for matching reaction substructures...
ReactionSubstructureSearch(const ReactionSubstructureSearch &)=delete
MappingIterator end()
Returns a mutable iterator pointing to the end of the stored atom/bond mapping objects.
ConstMappingIterator getMappingsBegin() const
Returns a constant iterator pointing to the beginning of the stored atom/bond mapping objects.
ConstMappingIterator getMappingsEnd() const
Returns a constant iterator pointing to the end of the stored atom/bond mapping objects.
Abstract base class for chemical reactions composed of role-tagged Chem::Molecule components.
Definition: Reaction.hpp:59
bool operator<(const Array< ValueType > &array1, const Array< ValueType > &array2)
Less than comparison operator.
boost::dynamic_bitset BitSet
Dynamic bitset class.
Definition: BitSet.hpp:46
bool operator>(const Array< ValueType > &array1, const Array< ValueType > &array2)
Greater than comparison operator.
The namespace of the Chemical Data Processing Library.