00001
00002
00003
00004
00005
00006
00007 #ifndef BALL_QSAR_RINGPERCEPTIONPROCESSOR_H
00008 #define BALL_QSAR_RINGPERCEPTIONPROCESSOR_H
00009
00010 #ifndef BALL_KERNEL_ATOMCONTAINER_H
00011 #include <BALL/KERNEL/atomContainer.h>
00012 #endif
00013
00014 #ifndef BALL_STRUCTURE_MOLECULARGRAPH_H
00015 #include <BALL/STRUCTURE/molecularGraph.h>
00016 #endif
00017
00018 #ifndef BALL_DATATYPE_OPTIONS_H
00019 #include <BALL/DATATYPE/options.h>
00020 #endif
00021
00022 #include <stack>
00023 #include <vector>
00024
00025 namespace BALL
00026 {
00037 class BALL_EXPORT RingPerceptionProcessor
00038 : public UnaryProcessor<AtomContainer>
00039 {
00040 public:
00041
00045
00046 struct Option
00047 {
00055 static const char* ALGORITHM_NAME;
00056 };
00057
00059 struct Default
00060 {
00065 static const char* ALGORITHM_NAME;
00066 };
00067
00068
00069 BALL_CREATE(RingPerceptionProcessor)
00070
00071
00076 RingPerceptionProcessor();
00077
00080 RingPerceptionProcessor(const RingPerceptionProcessor& rp);
00081
00084 virtual ~RingPerceptionProcessor();
00085
00087
00090
00093 RingPerceptionProcessor& operator = (const RingPerceptionProcessor& rp);
00094
00096
00099
00104 Size calculateSSSR(vector<vector<Atom*> >& sssr, AtomContainer& ac);
00106
00110 const vector<vector<Atom*> >& getAllSmallRings() const;
00111
00115 Processor::Result operator () (AtomContainer& ac);
00117
00122 Size findAllBCC(std::vector<MolecularGraph*>& bcc, MolecularGraph& graph);
00123
00124
00125
00126 Options options;
00127
00130 void setDefaultOptions();
00131
00132 protected:
00133
00134
00135
00137
00138
00139
00140
00141 Size FiguerasAlgorithm_(vector<vector<Atom*> >& sssr, AtomContainer& ac);
00142
00143
00144
00145
00146
00147 Size getRing_(Atom* n, HashSet<Atom*>& ring_set);
00148
00149
00150
00151
00152
00153
00154 void checkEdges_(HashSet<Atom*>& ring_set, AtomContainer& ac);
00155
00156
00157
00158
00159 Size findAllBCC_(std::vector<MolecularGraph*>& bcc, MolecularGraph& graph);
00160
00161
00162
00163 void DFSBCC_( std::vector<MolecularGraph*>& bccs, Size dfbi,
00164 HashMap<NodeItem<Index, Index>*, Size> DFBIndex,
00165 NodeItem<Index, Index>* v);
00166
00167 HashSet<NodeItem<Index, Index>* > visited_;
00168 HashSet<EdgeItem<Index, Index>* > visited_bonds_;
00169 HashMap<NodeItem<Index, Index>* , Size> P_;
00170 HashMap<NodeItem<Index, Index>*, NodeItem<Index, Index>* > parents_;
00171 std::stack<EdgeItem<Index, Index>* > BCC_;
00172
00173
00174
00175 struct PathMessage_;
00176
00177
00178
00179 struct TNode_
00180 {
00182 void recieve();
00183
00185 void send();
00186
00188 std::vector<PathMessage_> recieve_buffer;
00189
00191 std::vector<PathMessage_> send_buffer;
00192 };
00193
00194
00195
00196 struct PathMessage_
00197 {
00198 void push(EdgeItem<Index, Index>* bond, TNode_* node);
00199
00200
00201 BitVector beep;
00202
00204 TNode_* nfirst;
00205
00206
00207 TNode_* nlast;
00208
00210 EdgeItem<Index, Index>* efirst;
00211 };
00212
00214 static HashMap<TNode_*, NodeItem<Index, Index>* > tnode_to_atom_;
00215 static HashMap<NodeItem<Index, Index>* , TNode_*> atom_to_tnode_;
00216
00218 static HashMap<EdgeItem<Index, Index>*, Size> bond_to_index_;
00219 static HashMap<Size, EdgeItem<Index, Index>*> index_to_bond_;
00220
00222 static std::vector<BitVector> rings_;
00223
00225 static std::vector<BitVector> matrix_;
00226
00228 static std::vector<BitVector> forwarded_rings_;
00229
00231 static std::vector<BitVector> tested_beers_;
00232
00234 static std::vector<std::vector<Atom*> > all_small_rings_;
00235
00237 static std::vector<BitVector> all_small_beers_;
00238
00239
00240
00241
00242 static void BalducciPearlmanRingSelector_(BitVector bit_vector);
00243
00244
00245
00246 Size BalducciPearlmanAlgorithm_(std::vector<std::vector<Atom*> >& sssr, MolecularGraph& graph);
00247 };
00248 }
00249
00250 #endif // BALL_QSAR_RINGPERCEPTIONPROCESSOR_H