| [e73ad9a] | 1 | /* | 
|---|
|  | 2 | * CyclicStructureAnalysis.hpp | 
|---|
|  | 3 | * | 
|---|
|  | 4 | *  Created on: Feb 16, 2011 | 
|---|
|  | 5 | *      Author: heber | 
|---|
|  | 6 | */ | 
|---|
|  | 7 |  | 
|---|
|  | 8 | #ifndef CYCLICSTRUCTUREANALYSIS_HPP_ | 
|---|
|  | 9 | #define CYCLICSTRUCTUREANALYSIS_HPP_ | 
|---|
|  | 10 |  | 
|---|
|  | 11 | // include config.h | 
|---|
|  | 12 | #ifdef HAVE_CONFIG_H | 
|---|
|  | 13 | #include <config.h> | 
|---|
|  | 14 | #endif | 
|---|
|  | 15 |  | 
|---|
|  | 16 | #include <deque> | 
|---|
|  | 17 | #include <map> | 
|---|
| [fe0cb8] | 18 | #include <vector> | 
|---|
| [e73ad9a] | 19 |  | 
|---|
| [88c8ec] | 20 | #include "Bond/bond.hpp" | 
|---|
| [e73ad9a] | 21 | #include "Bond/GraphEdge.hpp" | 
|---|
| [fe0cb8] | 22 | #include "Fragmentation/KeySet.hpp" | 
|---|
| [07a47e] | 23 | #include "Fragmentation/HydrogenSaturation_enum.hpp" | 
|---|
| [e73ad9a] | 24 | #include "Helpers/defs.hpp" | 
|---|
|  | 25 | #include "types.hpp" | 
|---|
|  | 26 |  | 
|---|
|  | 27 | class atom; | 
|---|
|  | 28 | class molecule; | 
|---|
|  | 29 |  | 
|---|
|  | 30 | class CyclicStructureAnalysis | 
|---|
|  | 31 | { | 
|---|
|  | 32 | public: | 
|---|
| [fe0cb8] | 33 | //!> typedef for specifying a cycle | 
|---|
|  | 34 | typedef KeySet cycle_t; | 
|---|
|  | 35 | //!> typedef for specifying many cycles | 
|---|
|  | 36 | typedef std::vector< cycle_t > cycles_t; | 
|---|
|  | 37 |  | 
|---|
| [9291d04] | 38 | explicit CyclicStructureAnalysis(const enum HydrogenTreatment _treatment); | 
|---|
| [e73ad9a] | 39 | ~CyclicStructureAnalysis(); | 
|---|
|  | 40 |  | 
|---|
|  | 41 | void Reset(); | 
|---|
| [88c8ec] | 42 | void operator()(std::deque<bond::ptr > * BackEdgeStack); | 
|---|
| [e73ad9a] | 43 |  | 
|---|
|  | 44 | const std::map<atomId_t, int >& getMinimumRingSize() const; | 
|---|
|  | 45 |  | 
|---|
| [fe0cb8] | 46 | /** Getter for all found cycles. | 
|---|
|  | 47 | * | 
|---|
|  | 48 | */ | 
|---|
|  | 49 | cycles_t getAllCycles() const { | 
|---|
|  | 50 | return allcycles; | 
|---|
|  | 51 | } | 
|---|
|  | 52 |  | 
|---|
| [e73ad9a] | 53 | private: | 
|---|
| [fe0cb8] | 54 |  | 
|---|
| [e73ad9a] | 55 | // init or reset | 
|---|
|  | 56 | void InitNode(atomId_t atom_id); | 
|---|
|  | 57 | void CleanAllTouched(); | 
|---|
|  | 58 | void InitializeToRoot(atom *&Walker); | 
|---|
|  | 59 | // performing tasks | 
|---|
| [83cc3e] | 60 | void findAllCyclesforBackEdge(atom *&OtherAtom, bond::ptr &BackEdge, int &MinRingSize); | 
|---|
|  | 61 | int RetrieveCycleMembers(atom *&OtherAtom, bond::ptr &BackEdge, int &MinRingSize); | 
|---|
| [ec7511] | 62 | cycle_t extractCurrentCycle(bond::ptr &BackEdge); | 
|---|
| [8dbcaf] | 63 | void BFSToNextCycle(atom *Walker); | 
|---|
| [83cc3e] | 64 | void AssignRingSizetoNonCycleMembers(const int MinRingSize); | 
|---|
| [e73ad9a] | 65 | // output | 
|---|
|  | 66 | void OutputAlreadyVisited(int *list); | 
|---|
|  | 67 |  | 
|---|
|  | 68 | std::map<atomId_t, atom *> PredecessorList; | 
|---|
|  | 69 | std::map<atomId_t, int > ShortestPathList; | 
|---|
|  | 70 | std::map<atomId_t, enum GraphEdge::Shading> ColorList; | 
|---|
|  | 71 | std::map<atomId_t, int > MinimumRingSize; | 
|---|
|  | 72 | std::deque<atom *> BFSStack; | 
|---|
|  | 73 | std::deque<atom *> TouchedStack; | 
|---|
|  | 74 | int BondOrder; | 
|---|
|  | 75 | atom *Root; | 
|---|
|  | 76 |  | 
|---|
| [fe0cb8] | 77 | //!> container for all found cycles, note that these are global ids | 
|---|
|  | 78 | cycles_t allcycles; | 
|---|
|  | 79 |  | 
|---|
| [07a47e] | 80 | //!> whether to treat hydrogen special or not | 
|---|
| [9291d04] | 81 | const enum HydrogenTreatment treatment; | 
|---|
| [07a47e] | 82 |  | 
|---|
| [e73ad9a] | 83 | bool BackStepping; | 
|---|
|  | 84 | int CurrentGraphNr; | 
|---|
|  | 85 | int ComponentNr; | 
|---|
|  | 86 | }; | 
|---|
|  | 87 |  | 
|---|
|  | 88 | #endif /* CYCLICSTRUCTUREANALYSIS_HPP_ */ | 
|---|