Changeset 339910
- Timestamp:
- Dec 3, 2012, 9:49:30 AM (12 years ago)
- Branches:
- Action_Thermostats, Add_AtomRandomPerturbation, Add_FitFragmentPartialChargesAction, Add_RotateAroundBondAction, Add_SelectAtomByNameAction, Added_ParseSaveFragmentResults, AddingActions_SaveParseParticleParameters, Adding_Graph_to_ChangeBondActions, Adding_MD_integration_tests, Adding_ParticleName_to_Atom, Adding_StructOpt_integration_tests, AtomFragments, Automaking_mpqc_open, AutomationFragmentation_failures, Candidate_v1.5.4, Candidate_v1.6.0, Candidate_v1.6.1, ChangeBugEmailaddress, ChangingTestPorts, ChemicalSpaceEvaluator, CombiningParticlePotentialParsing, Combining_Subpackages, Debian_Package_split, Debian_package_split_molecuildergui_only, Disabling_MemDebug, Docu_Python_wait, EmpiricalPotential_contain_HomologyGraph, EmpiricalPotential_contain_HomologyGraph_documentation, Enable_parallel_make_install, Enhance_userguide, Enhanced_StructuralOptimization, Enhanced_StructuralOptimization_continued, Example_ManyWaysToTranslateAtom, Exclude_Hydrogens_annealWithBondGraph, FitPartialCharges_GlobalError, Fix_BoundInBox_CenterInBox_MoleculeActions, Fix_ChargeSampling_PBC, Fix_ChronosMutex, Fix_FitPartialCharges, Fix_FitPotential_needs_atomicnumbers, Fix_ForceAnnealing, Fix_IndependentFragmentGrids, Fix_ParseParticles, Fix_ParseParticles_split_forward_backward_Actions, Fix_PopActions, Fix_QtFragmentList_sorted_selection, Fix_Restrictedkeyset_FragmentMolecule, Fix_StatusMsg, Fix_StepWorldTime_single_argument, Fix_Verbose_Codepatterns, Fix_fitting_potentials, Fixes, ForceAnnealing_goodresults, ForceAnnealing_oldresults, ForceAnnealing_tocheck, ForceAnnealing_with_BondGraph, ForceAnnealing_with_BondGraph_continued, ForceAnnealing_with_BondGraph_continued_betteresults, ForceAnnealing_with_BondGraph_contraction-expansion, FragmentAction_writes_AtomFragments, FragmentMolecule_checks_bonddegrees, GeometryObjects, Gui_Fixes, Gui_displays_atomic_force_velocity, ImplicitCharges, IndependentFragmentGrids, IndependentFragmentGrids_IndividualZeroInstances, IndependentFragmentGrids_IntegrationTest, IndependentFragmentGrids_Sole_NN_Calculation, JobMarket_RobustOnKillsSegFaults, JobMarket_StableWorkerPool, JobMarket_unresolvable_hostname_fix, MoreRobust_FragmentAutomation, ODR_violation_mpqc_open, PartialCharges_OrthogonalSummation, PdbParser_setsAtomName, PythonUI_with_named_parameters, QtGui_reactivate_TimeChanged_changes, Recreated_GuiChecks, Rewrite_FitPartialCharges, RotateToPrincipalAxisSystem_UndoRedo, SaturateAtoms_findBestMatching, SaturateAtoms_singleDegree, StoppableMakroAction, Subpackage_CodePatterns, Subpackage_JobMarket, Subpackage_LinearAlgebra, Subpackage_levmar, Subpackage_mpqc_open, Subpackage_vmg, Switchable_LogView, ThirdParty_MPQC_rebuilt_buildsystem, TrajectoryDependenant_MaxOrder, TremoloParser_IncreasedPrecision, TremoloParser_MultipleTimesteps, TremoloParser_setsAtomName, Ubuntu_1604_changes, stable
- Children:
- de0af2
- Parents:
- b9401e
- git-author:
- Frederik Heber <heber@…> (09/19/12 14:32:32)
- git-committer:
- Frederik Heber <heber@…> (12/03/12 09:49:30)
- Location:
- src
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
src/Fragmentation/Fragmentation.cpp
rb9401e r339910 103 103 { 104 104 MoleculeListClass *BondFragments = NULL; 105 int FragmentCounter; 106 MoleculeLeafClass *MolecularWalker = NULL; 107 MoleculeLeafClass *Subgraphs = NULL; // list of subgraphs from DFS analysis 108 fstream File; 105 std::fstream File; 109 106 bool FragmentationToDo = true; 110 107 bool CheckOrder = false; 111 Graph **FragmentList = NULL;112 108 Graph TotalGraph; // graph with all keysets however local numbers 113 109 int TotalNumberOfKeySets = 0; 114 110 AtomMask_t AtomMask(atomids); 115 111 116 LOG(0, endl);112 LOG(0, std::endl); 117 113 switch (saturation) { 118 114 case DoSaturate: … … 137 133 } 138 134 139 // ===== 2. perform a DFS analysis to gather info on cyclic structure and a list of disconnected subgraphs =====140 // NOTE: We assume here that DFS has been performed and molecule structure is current.141 Subgraphs = DFS.getMoleculeStructure();142 143 135 // ===== 3. if structure still valid, parse key set file and others ===== 144 136 Graph ParsedFragmentList; … … 150 142 // =================================== Begin of FRAGMENTATION =============================== 151 143 // ===== 6a. assign each keyset to its respective subgraph ===== 152 const int MolCount = World::getInstance().numMolecules(); 153 FragmentCounter = 0; 154 { 155 ListOfLocalAtoms_t *ListOfLocalAtoms = new ListOfLocalAtoms_t[MolCount]; 156 Subgraphs->next->AssignKeySetsToFragment(mol, &ParsedFragmentList, ListOfLocalAtoms, FragmentList, FragmentCounter, true); 157 delete[] ListOfLocalAtoms; 158 } 144 ListOfLocalAtoms_t ListOfLocalAtoms; 145 Graph FragmentList; 146 AssignKeySetsToFragment(ParsedFragmentList, ListOfLocalAtoms, FragmentList, true); 159 147 160 148 // ===== 6b. prepare and go into the adaptive (Order<0), single-step (Order==0) or incremental (Order>0) cycle 161 KeyStack *RootStack = new KeyStack[Subgraphs->next->Count()];149 KeyStack RootStack; 162 150 FragmentationToDo = false; // if CheckOrderAtSite just ones recommends fragmentation, we will save fragments afterwards 163 151 bool LoopDoneAlready = false; 164 while ((CheckOrder = CheckOrderAtSite(AtomMask, &ParsedFragmentList, Order, prefix, LoopDoneAlready))) {152 while ((CheckOrder = CheckOrderAtSite(AtomMask, ParsedFragmentList, Order, prefix, LoopDoneAlready))) { 165 153 FragmentationToDo = FragmentationToDo || CheckOrder; 166 154 LoopDoneAlready = true; // last plus one entry is used as marker that we have been through this loop once already in CheckOrderAtSite() 167 155 // ===== 6b. fill RootStack for each subgraph (second adaptivity check) ===== 168 Subgraphs->next->FillRootStackForSubgraphs(RootStack, AtomMask, (FragmentCounter = 0), saturation); 169 170 // ===== 7. fill the bond fragment list ===== 171 FragmentCounter = 0; 172 MolecularWalker = Subgraphs; 173 while (MolecularWalker->next != NULL) { 174 MolecularWalker = MolecularWalker->next; 175 LOG(1, "Fragmenting subgraph " << MolecularWalker << "."); 176 if (MolecularWalker->Leaf->hasBondStructure()) { 177 // call BOSSANOVA method 178 LOG(0, endl << " ========== BOND ENERGY of subgraph " << FragmentCounter << " ========================= "); 179 FragmentBOSSANOVA(MolecularWalker->Leaf, FragmentList[FragmentCounter], RootStack[FragmentCounter]); 180 } else { 181 ELOG(1, "Subgraph " << MolecularWalker << " has no atoms!"); 182 } 183 FragmentCounter++; // next fragment list 184 } 156 FillRootStackForSubgraphs(RootStack, AtomMask); 157 158 // call BOSSANOVA method 159 FragmentBOSSANOVA(mol, FragmentList, RootStack); 185 160 } 186 161 LOG(2, "CheckOrder is " << CheckOrder << "."); 187 delete[](RootStack);188 162 189 163 // ==================================== End of FRAGMENTATION ============================================ 190 164 191 165 // ===== 8a. translate list into global numbers (i.e. ones that are valid in "this" molecule, not in MolecularWalker->Leaf) 192 Subgraphs->next->TranslateIndicesToGlobalIDs(FragmentList, (FragmentCounter = 0), TotalNumberOfKeySets, TotalGraph); 193 194 // free subgraph memory again 195 FragmentCounter = 0; 196 while (Subgraphs != NULL) { 197 // remove entry in fragment list 198 // remove subgraph fragment 199 MolecularWalker = Subgraphs->next; 200 Subgraphs->Leaf = NULL; 201 delete(Subgraphs); 202 Subgraphs = MolecularWalker; 203 } 204 // free fragment list 205 for (int i=0; i< FragmentCounter; ++i ) 206 delete(FragmentList[i]); 207 delete[](FragmentList); 208 209 LOG(0, FragmentCounter << " subgraph fragments have been removed."); 166 TranslateIndicesToGlobalIDs(FragmentList, TotalNumberOfKeySets, TotalGraph); 210 167 211 168 // ===== 8b. gather keyset lists (graphs) from all subgraphs and transform into MoleculeListClass ===== … … 300 257 * \return pointer to Graph list 301 258 */ 302 void Fragmentation::FragmentBOSSANOVA(molecule *mol, Graph *&FragmentList, KeyStack &RootStack) 303 { 259 void Fragmentation::FragmentBOSSANOVA(molecule *mol, Graph &FragmentList, KeyStack &RootStack) 260 { 261 Info FunctionInfo(__func__); 304 262 Graph ***FragmentLowerOrdersList = NULL; 305 263 int NumLevels = 0; … … 313 271 int RootNr = 0; 314 272 UniqueFragments FragmentSearch; 315 316 LOG(0, "Begin of FragmentBOSSANOVA.");317 273 318 274 // FragmentLowerOrdersList is a 2D-array of pointer to MoleculeListClass objects, one dimension represents the ANOVA expansion of a single order (i.e. 5) … … 403 359 FreeAllOrdersList(FragmentLowerOrdersList, RootStack, mol); 404 360 delete[](NumMoleculesOfOrder); 405 406 LOG(0, "End of FragmentBOSSANOVA.");407 361 }; 408 362 … … 465 419 * \return true - needs further fragmentation, false - does not need fragmentation 466 420 */ 467 bool Fragmentation::CheckOrderAtSite(AtomMask_t &AtomMask, Graph *GlobalKeySetList, int Order, std::string path, bool LoopDoneAlready)421 bool Fragmentation::CheckOrderAtSite(AtomMask_t &AtomMask, const Graph &GlobalKeySetList, int Order, std::string path, bool LoopDoneAlready) 468 422 { 469 423 bool status = false; … … 477 431 478 432 // transmorph graph keyset list into indexed KeySetList 479 if (GlobalKeySetList == NULL) { 480 ELOG(1, "Given global key set list (graph) is NULL!"); 481 return false; 482 } 483 AdaptivityMap * IndexKeySetList = GlobalKeySetList->GraphToAdaptivityMap(); 433 AdaptivityMap * IndexKeySetList = GlobalKeySetList.GraphToAdaptivityMap(); 484 434 485 435 // parse the EnergyPerFragment file … … 562 512 bool Fragmentation::ParseOrderAtSiteFromFile(const std::vector<atomId_t> &atomids, std::string &path) 563 513 { 514 Info FunctionInfo(__func__); 564 515 typedef unsigned char order_t; 565 516 typedef std::map<atomId_t, order_t> OrderArray_t; … … 571 522 ifstream file; 572 523 573 LOG(1, "Begin of ParseOrderAtSiteFromFile");574 524 line = path + ORDERATSITEFILE; 575 525 file.open(line.c_str()); … … 603 553 } 604 554 605 LOG(1, "End of ParseOrderAtSiteFromFile");606 555 return status; 607 556 }; … … 729 678 typelist = types; 730 679 } 680 681 /** Fills the root stack for sites to be used as root in fragmentation depending on order or adaptivity criteria 682 * Again, as in \sa FillBondStructureFromReference steps recursively through each Leaf in this chain list of molecule's. 683 * \param &RootStack stack to be filled 684 * \param AtomMask defines true/false per global Atom::Nr to mask in/out each nuclear site 685 * \return true - stack is non-empty, fragmentation necessary, false - stack is empty, no more sites to update 686 */ 687 void Fragmentation::FillRootStackForSubgraphs(KeyStack &RootStack, const AtomMask_t &AtomMask) 688 { 689 for(molecule::const_iterator iter = mol->begin(); iter != mol->end(); ++iter) { 690 const atom * const Father = (*iter)->GetTrueFather(); 691 if (AtomMask.isTrue(Father->getNr())) // apply mask 692 if ((saturation == DontSaturate) || ((*iter)->getType()->getAtomicNumber() != 1)) // skip hydrogen 693 RootStack.push_front((*iter)->getNr()); 694 } 695 } 696 697 /** The indices per keyset are compared to the respective father's Atom::Nr in each subgraph and thus put into \a **&FragmentList. 698 * \param *KeySetList list with all keysets 699 * \param ListOfLocalAtoms Lookup table for each subgraph and index of each atom in global molecule, may be NULL on start, then it is filled 700 * \param **&FragmentList list to be allocated and returned 701 * \param FreeList true - ***ListOfLocalAtoms is free'd before return, false - it is not 702 * \retuen true - success, false - failure 703 */ 704 bool Fragmentation::AssignKeySetsToFragment(Graph &KeySetList, ListOfLocalAtoms_t &ListOfLocalAtoms, Graph &FragmentList, bool FreeList) 705 { 706 Info FunctionInfo(__func__); 707 bool status = true; 708 size_t KeySetCounter = 0; 709 710 // fill ListOfLocalAtoms if NULL was given 711 if (!mol->FillListOfLocalAtoms(ListOfLocalAtoms, mol->getAtomCount())) { 712 LOG(1, "Filling of ListOfLocalAtoms failed."); 713 return false; 714 } 715 716 if (KeySetList.size() != 0) { // if there are some scanned keysets at all 717 // assign scanned keysets 718 KeySet TempSet; 719 for (Graph::iterator runner = KeySetList.begin(); runner != KeySetList.end(); runner++) { // key sets contain global numbers! 720 if (ListOfLocalAtoms[mol->FindAtom(*((*runner).first.begin()))->getNr()] != NULL) {// as we may assume that that bond structure is unchanged, we only test the first key in each set 721 // translate keyset to local numbers 722 for (KeySet::iterator sprinter = (*runner).first.begin(); sprinter != (*runner).first.end(); sprinter++) 723 TempSet.insert(ListOfLocalAtoms[mol->FindAtom(*sprinter)->getNr()]->getNr()); 724 // insert into FragmentList 725 FragmentList.insert(GraphPair(TempSet, pair<int, double> (KeySetCounter++, (*runner).second.second))); 726 } 727 TempSet.clear(); 728 } 729 } else 730 LOG(1, "KeySetList is NULL or empty."); 731 732 if (FreeList) { 733 // free the index lookup list 734 ListOfLocalAtoms.clear(); 735 } 736 return status; 737 } 738 739 /** Translate list into global numbers (i.e. ones that are valid in "this" molecule, not in MolecularWalker->Leaf) 740 * \param &FragmentList Graph with local numbers per fragment 741 * \param &TotalNumberOfKeySets global key set counter 742 * \param &TotalGraph Graph to be filled with global numbers 743 */ 744 void Fragmentation::TranslateIndicesToGlobalIDs(Graph &FragmentList, int &TotalNumberOfKeySets, Graph &TotalGraph) 745 { 746 Info FunctionInfo(__func__); 747 for (Graph::iterator runner = FragmentList.begin(); runner != FragmentList.end(); runner++) { 748 KeySet TempSet; 749 for (KeySet::iterator sprinter = (*runner).first.begin(); sprinter != (*runner).first.end(); sprinter++) 750 TempSet.insert((mol->FindAtom(*sprinter))->GetTrueFather()->getNr()); 751 TotalGraph.insert(GraphPair(TempSet, pair<int, double> (TotalNumberOfKeySets++, (*runner).second.second))); 752 } 753 } 754 -
src/Fragmentation/Fragmentation.hpp
rb9401e r339910 43 43 private: 44 44 45 void FragmentBOSSANOVA(molecule *mol, Graph *&FragmentList, KeyStack &RootStack);45 void FragmentBOSSANOVA(molecule *mol, Graph &FragmentList, KeyStack &RootStack); 46 46 int GuesstimateFragmentCount(int order); 47 47 … … 49 49 50 50 // order at site 51 bool CheckOrderAtSite(AtomMask_t &AtomMask, Graph *GlobalKeySetList, int Order, std::string path, bool LoopDoneAlready);51 bool CheckOrderAtSite(AtomMask_t &AtomMask, const Graph &GlobalKeySetList, int Order, std::string path, bool LoopDoneAlready); 52 52 bool StoreOrderAtSiteFile(std::string &path); 53 53 bool ParseOrderAtSiteFromFile(const std::vector<atomId_t> &atomids, std::string &path); … … 57 57 int StoreFragmentFromKeySet_Init(molecule *mol, molecule *Leaf, KeySet &Leaflet, ListOfLocalAtoms_t &SonList); 58 58 void CreateInducedSubgraphOfFragment(molecule *mol, molecule *Leaf, ListOfLocalAtoms_t &SonList, bool IsAngstroem); 59 void FillRootStackForSubgraphs(KeyStack &RootStack, const AtomMask_t &AtomMask); 60 bool AssignKeySetsToFragment(Graph &KeySetList, ListOfLocalAtoms_t &ListOfLocalAtoms, Graph &FragmentList, bool FreeList = false); 61 void TranslateIndicesToGlobalIDs(Graph &FragmentList, int &TotalNumberOfKeySets, Graph &TotalGraph); 59 62 60 63 private: -
src/Fragmentation/fragmentation_helpers.cpp
rb9401e r339910 77 77 78 78 /** Combines all KeySets from all orders into single ones (with just unique entries). 79 * \param *out output stream for debugging 80 * \param *&FragmentList list to fill 79 * \param &FragmentList list to fill 81 80 * \param ***FragmentLowerOrdersList 82 81 * \param &RootStack stack with all root candidates (unequal to each atom in complete molecule if adaptive scheme is applied) 83 82 * \param *mol molecule with atoms and bonds 84 83 */ 85 int CombineAllOrderListIntoOne(Graph *&FragmentList, Graph ***FragmentLowerOrdersList, KeyStack &RootStack, molecule *mol)84 int CombineAllOrderListIntoOne(Graph &FragmentList, Graph ***FragmentLowerOrdersList, KeyStack &RootStack, molecule *mol) 86 85 { 87 86 int RootNr = 0; … … 93 92 94 93 LOG(0, "Combining the lists of all orders per order and finally into a single one."); 95 if (FragmentList == NULL) { 96 FragmentList = new Graph; 97 counter = 0; 98 } else { 99 counter = FragmentList->size(); 100 } 94 counter = FragmentList.size(); 101 95 102 96 StartNr = RootStack.back(); … … 108 102 for(int i=0;i<NumLevels;i++) { 109 103 if (FragmentLowerOrdersList[RootNr][i] != NULL) { 110 (*FragmentList).InsertGraph((*FragmentLowerOrdersList[RootNr][i]), &counter);104 FragmentList.InsertGraph((*FragmentLowerOrdersList[RootNr][i]), &counter); 111 105 } 112 106 } -
src/Fragmentation/fragmentation_helpers.hpp
rb9401e r339910 31 31 void PrintAtomMask(const AtomMask_t &AtomMask, int AtomCount); 32 32 33 int CombineAllOrderListIntoOne(Graph *&FragmentList, Graph ***FragmentLowerOrdersList, KeyStack &RootStack, molecule *mol);33 int CombineAllOrderListIntoOne(Graph &FragmentList, Graph ***FragmentLowerOrdersList, KeyStack &RootStack, molecule *mol); 34 34 void FreeAllOrdersList(Graph ***FragmentLowerOrdersList, KeyStack &RootStack, molecule *mol); 35 35 -
src/MoleculeLeafClass.cpp
rb9401e r339910 116 116 }; 117 117 118 /** Fills the root stack for sites to be used as root in fragmentation depending on order or adaptivity criteria119 * Again, as in \sa FillBondStructureFromReference steps recursively through each Leaf in this chain list of molecule's.120 * \param *out output stream for debugging121 * \param *&RootStack stack to be filled122 * \param AtomMask defines true/false per global Atom::Nr to mask in/out each nuclear site123 * \param &FragmentCounter counts through the fragments in this MoleculeLeafClass124 * \param saturation whether to treat hydrogen special or not125 * \return true - stack is non-empty, fragmentation necessary, false - stack is empty, no more sites to update126 */127 bool MoleculeLeafClass::FillRootStackForSubgraphs(KeyStack *&RootStack, const AtomMask_t &AtomMask, int &FragmentCounter, const enum HydrogenSaturation saturation)128 {129 if (RootStack != NULL) {130 // find first root candidates131 if (&(RootStack[FragmentCounter]) != NULL) {132 RootStack[FragmentCounter].clear();133 for(molecule::const_iterator iter = Leaf->begin(); iter != Leaf->end(); ++iter) {134 const atom * const Father = (*iter)->GetTrueFather();135 if (AtomMask.isTrue(Father->getNr())) // apply mask136 if ((saturation == DontSaturate) || ((*iter)->getType()->getAtomicNumber() != 1)) // skip hydrogen137 RootStack[FragmentCounter].push_front((*iter)->getNr());138 }139 if (next != NULL)140 next->FillRootStackForSubgraphs(RootStack, AtomMask, ++FragmentCounter, saturation);141 } else {142 LOG(1, "Rootstack[" << FragmentCounter << "] is NULL.");143 return false;144 }145 FragmentCounter--;146 return true;147 } else {148 LOG(1, "Rootstack is NULL.");149 return false;150 }151 };152 118 153 /** The indices per keyset are compared to the respective father's Atom::Nr in each subgraph and thus put into \a **&FragmentList.154 * \param *out output stream fro debugging155 * \param *reference reference molecule with the bond structure to be copied156 * \param *KeySetList list with all keysets157 * \param *ListOfLocalAtoms Lookup table for each subgraph and index of each atom in global molecule, may be NULL on start, then it is filled158 * \param **&FragmentList list to be allocated and returned159 * \param &FragmentCounter counts the fragments as we move along the list160 * \param FreeList true - ***ListOfLocalAtoms is free'd before return, false - it is not161 * \retuen true - success, false - failure162 */163 bool MoleculeLeafClass::AssignKeySetsToFragment(molecule *reference, Graph *KeySetList, ListOfLocalAtoms_t *&ListOfLocalAtoms, Graph **&FragmentList, int &FragmentCounter, bool FreeList)164 {165 bool status = true;166 int KeySetCounter = 0;167 168 LOG(1, "Begin of AssignKeySetsToFragment.");169 // fill ListOfLocalAtoms if NULL was given170 if (!Leaf->FillListOfLocalAtoms(ListOfLocalAtoms[FragmentCounter], reference->getAtomCount())) {171 LOG(1, "Filling of ListOfLocalAtoms failed.");172 return false;173 }174 175 // allocate fragment list176 if (FragmentList == NULL) {177 KeySetCounter = Count();178 FragmentList = new Graph*[KeySetCounter];179 for (int i=0;i<KeySetCounter;i++)180 FragmentList[i] = NULL;181 KeySetCounter = 0;182 }183 184 if ((KeySetList != NULL) && (KeySetList->size() != 0)) { // if there are some scanned keysets at all185 // assign scanned keysets186 if (FragmentList[FragmentCounter] == NULL)187 FragmentList[FragmentCounter] = new Graph;188 KeySet *TempSet = new KeySet;189 for (Graph::iterator runner = KeySetList->begin(); runner != KeySetList->end(); runner++) { // key sets contain global numbers!190 if (ListOfLocalAtoms[FragmentCounter][reference->FindAtom(*((*runner).first.begin()))->getNr()] != NULL) {// as we may assume that that bond structure is unchanged, we only test the first key in each set191 // translate keyset to local numbers192 for (KeySet::iterator sprinter = (*runner).first.begin(); sprinter != (*runner).first.end(); sprinter++)193 TempSet->insert(ListOfLocalAtoms[FragmentCounter][reference->FindAtom(*sprinter)->getNr()]->getNr());194 // insert into FragmentList195 FragmentList[FragmentCounter]->insert(GraphPair(*TempSet, pair<int, double> (KeySetCounter++, (*runner).second.second)));196 }197 TempSet->clear();198 }199 delete (TempSet);200 if (KeySetCounter == 0) {// if there are no keysets, delete the list201 LOG(1, "KeySetCounter is zero, deleting FragmentList.");202 delete (FragmentList[FragmentCounter]);203 } else204 LOG(1, KeySetCounter << " keysets were assigned to subgraph " << FragmentCounter << ".");205 FragmentCounter++;206 if (next != NULL)207 next->AssignKeySetsToFragment(reference, KeySetList, ListOfLocalAtoms, FragmentList, FragmentCounter, FreeList);208 FragmentCounter--;209 } else210 LOG(1, "KeySetList is NULL or empty.");211 212 if ((FreeList) && (ListOfLocalAtoms != NULL)) {213 // free the index lookup list214 (ListOfLocalAtoms[FragmentCounter]).clear();215 }216 LOG(1, "End of AssignKeySetsToFragment.");217 return status;218 };219 220 /** Translate list into global numbers (i.e. ones that are valid in "this" molecule, not in MolecularWalker->Leaf)221 * \param *out output stream for debugging222 * \param **FragmentList Graph with local numbers per fragment223 * \param &FragmentCounter counts the fragments as we move along the list224 * \param &TotalNumberOfKeySets global key set counter225 * \param &TotalGraph Graph to be filled with global numbers226 */227 void MoleculeLeafClass::TranslateIndicesToGlobalIDs(Graph **FragmentList, int &FragmentCounter, int &TotalNumberOfKeySets, Graph &TotalGraph)228 {229 LOG(1, "Begin of TranslateIndicesToGlobalIDs.");230 KeySet *TempSet = new KeySet;231 if (FragmentList[FragmentCounter] != NULL) {232 for (Graph::iterator runner = FragmentList[FragmentCounter]->begin(); runner != FragmentList[FragmentCounter]->end(); runner++) {233 for (KeySet::iterator sprinter = (*runner).first.begin(); sprinter != (*runner).first.end(); sprinter++)234 TempSet->insert((Leaf->FindAtom(*sprinter))->GetTrueFather()->getNr());235 TotalGraph.insert(GraphPair(*TempSet, pair<int, double> (TotalNumberOfKeySets++, (*runner).second.second)));236 TempSet->clear();237 }238 delete (TempSet);239 } else {240 LOG(1, "FragmentList is NULL.");241 }242 if (next != NULL)243 next->TranslateIndicesToGlobalIDs(FragmentList, ++FragmentCounter, TotalNumberOfKeySets, TotalGraph);244 FragmentCounter--;245 LOG(1, "End of TranslateIndicesToGlobalIDs.");246 };247 119 248 120 /** Simply counts the number of items in the list, from given MoleculeLeafClass. -
src/MoleculeLeafClass.hpp
rb9401e r339910 40 40 41 41 bool AddLeaf(molecule *ptr, MoleculeLeafClass *Previous); 42 bool FillRootStackForSubgraphs(KeyStack *&RootStack, const AtomMask_t &AtomMask, int &FragmentCounter, const enum HydrogenSaturation saturation);43 bool AssignKeySetsToFragment(molecule *reference, Graph *KeySetList, ListOfLocalAtoms_t *&ListOfLocalAtoms, Graph **&FragmentList, int &FragmentCounter, bool FreeList = false);44 void TranslateIndicesToGlobalIDs(Graph **FragmentList, int &FragmentCounter, int &TotalNumberOfKeySets, Graph &TotalGraph);45 42 int Count() const; 46 43 };
Note:
See TracChangeset
for help on using the changeset viewer.