Changeset 339910


Ignore:
Timestamp:
Dec 3, 2012, 9:49:30 AM (12 years ago)
Author:
Frederik Heber <heber@…>
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)
Message:

Fragmentation now operates on a single molecule.

Location:
src
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • src/Fragmentation/Fragmentation.cpp

    rb9401e r339910  
    103103{
    104104  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;
    109106  bool FragmentationToDo = true;
    110107  bool CheckOrder = false;
    111   Graph **FragmentList = NULL;
    112108  Graph TotalGraph;     // graph with all keysets however local numbers
    113109  int TotalNumberOfKeySets = 0;
    114110  AtomMask_t AtomMask(atomids);
    115111
    116   LOG(0, endl);
     112  LOG(0, std::endl);
    117113  switch (saturation) {
    118114    case DoSaturate:
     
    137133  }
    138134
    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 
    143135  // ===== 3. if structure still valid, parse key set file and others =====
    144136  Graph ParsedFragmentList;
     
    150142  // =================================== Begin of FRAGMENTATION ===============================
    151143  // ===== 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);
    159147
    160148  // ===== 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;
    162150  FragmentationToDo = false;  // if CheckOrderAtSite just ones recommends fragmentation, we will save fragments afterwards
    163151  bool LoopDoneAlready = false;
    164   while ((CheckOrder = CheckOrderAtSite(AtomMask, &ParsedFragmentList, Order, prefix, LoopDoneAlready))) {
     152  while ((CheckOrder = CheckOrderAtSite(AtomMask, ParsedFragmentList, Order, prefix, LoopDoneAlready))) {
    165153    FragmentationToDo = FragmentationToDo || CheckOrder;
    166154    LoopDoneAlready = true;   // last plus one entry is used as marker that we have been through this loop once already in CheckOrderAtSite()
    167155    // ===== 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);
    185160  }
    186161  LOG(2, "CheckOrder is " << CheckOrder << ".");
    187   delete[](RootStack);
    188162
    189163  // ==================================== End of FRAGMENTATION ============================================
    190164
    191165  // ===== 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);
    210167
    211168  // ===== 8b. gather keyset lists (graphs) from all subgraphs and transform into MoleculeListClass =====
     
    300257 * \return pointer to Graph list
    301258 */
    302 void Fragmentation::FragmentBOSSANOVA(molecule *mol, Graph *&FragmentList, KeyStack &RootStack)
    303 {
     259void Fragmentation::FragmentBOSSANOVA(molecule *mol, Graph &FragmentList, KeyStack &RootStack)
     260{
     261  Info FunctionInfo(__func__);
    304262  Graph ***FragmentLowerOrdersList = NULL;
    305263  int NumLevels = 0;
     
    313271  int RootNr = 0;
    314272  UniqueFragments FragmentSearch;
    315 
    316   LOG(0, "Begin of FragmentBOSSANOVA.");
    317273
    318274  // FragmentLowerOrdersList is a 2D-array of pointer to MoleculeListClass objects, one dimension represents the ANOVA expansion of a single order (i.e. 5)
     
    403359  FreeAllOrdersList(FragmentLowerOrdersList, RootStack, mol);
    404360  delete[](NumMoleculesOfOrder);
    405 
    406   LOG(0, "End of FragmentBOSSANOVA.");
    407361};
    408362
     
    465419 * \return true - needs further fragmentation, false - does not need fragmentation
    466420 */
    467 bool Fragmentation::CheckOrderAtSite(AtomMask_t &AtomMask, Graph *GlobalKeySetList, int Order, std::string path, bool LoopDoneAlready)
     421bool Fragmentation::CheckOrderAtSite(AtomMask_t &AtomMask, const Graph &GlobalKeySetList, int Order, std::string path, bool LoopDoneAlready)
    468422{
    469423  bool status = false;
     
    477431
    478432    // 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();
    484434
    485435    // parse the EnergyPerFragment file
     
    562512bool Fragmentation::ParseOrderAtSiteFromFile(const std::vector<atomId_t> &atomids, std::string &path)
    563513{
     514  Info FunctionInfo(__func__);
    564515  typedef unsigned char order_t;
    565516  typedef std::map<atomId_t, order_t> OrderArray_t;
     
    571522  ifstream file;
    572523
    573   LOG(1, "Begin of ParseOrderAtSiteFromFile");
    574524  line = path + ORDERATSITEFILE;
    575525  file.open(line.c_str());
     
    603553  }
    604554
    605   LOG(1, "End of ParseOrderAtSiteFromFile");
    606555  return status;
    607556};
     
    729678  typelist = types;
    730679}
     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 */
     687void 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 */
     704bool 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 */
     744void 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  
    4343private:
    4444
    45   void FragmentBOSSANOVA(molecule *mol, Graph *&FragmentList, KeyStack &RootStack);
     45  void FragmentBOSSANOVA(molecule *mol, Graph &FragmentList, KeyStack &RootStack);
    4646  int GuesstimateFragmentCount(int order);
    4747
     
    4949
    5050  // 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);
    5252  bool StoreOrderAtSiteFile(std::string &path);
    5353  bool ParseOrderAtSiteFromFile(const std::vector<atomId_t> &atomids, std::string &path);
     
    5757  int StoreFragmentFromKeySet_Init(molecule *mol, molecule *Leaf, KeySet &Leaflet, ListOfLocalAtoms_t &SonList);
    5858  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);
    5962
    6063private:
  • src/Fragmentation/fragmentation_helpers.cpp

    rb9401e r339910  
    7777
    7878/** 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
    8180 * \param ***FragmentLowerOrdersList
    8281 * \param &RootStack stack with all root candidates (unequal to each atom in complete molecule if adaptive scheme is applied)
    8382 * \param *mol molecule with atoms and bonds
    8483 */
    85 int CombineAllOrderListIntoOne(Graph *&FragmentList, Graph ***FragmentLowerOrdersList, KeyStack &RootStack, molecule *mol)
     84int CombineAllOrderListIntoOne(Graph &FragmentList, Graph ***FragmentLowerOrdersList, KeyStack &RootStack, molecule *mol)
    8685{
    8786  int RootNr = 0;
     
    9392
    9493  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();
    10195
    10296  StartNr = RootStack.back();
     
    108102    for(int i=0;i<NumLevels;i++) {
    109103      if (FragmentLowerOrdersList[RootNr][i] != NULL) {
    110         (*FragmentList).InsertGraph((*FragmentLowerOrdersList[RootNr][i]), &counter);
     104        FragmentList.InsertGraph((*FragmentLowerOrdersList[RootNr][i]), &counter);
    111105      }
    112106    }
  • src/Fragmentation/fragmentation_helpers.hpp

    rb9401e r339910  
    3131void PrintAtomMask(const AtomMask_t &AtomMask, int AtomCount);
    3232
    33 int CombineAllOrderListIntoOne(Graph *&FragmentList, Graph ***FragmentLowerOrdersList, KeyStack &RootStack, molecule *mol);
     33int CombineAllOrderListIntoOne(Graph &FragmentList, Graph ***FragmentLowerOrdersList, KeyStack &RootStack, molecule *mol);
    3434void FreeAllOrdersList(Graph ***FragmentLowerOrdersList, KeyStack &RootStack, molecule *mol);
    3535
  • src/MoleculeLeafClass.cpp

    rb9401e r339910  
    116116};
    117117
    118 /** Fills the root stack for sites to be used as root in fragmentation depending on order or adaptivity criteria
    119  * Again, as in \sa FillBondStructureFromReference steps recursively through each Leaf in this chain list of molecule's.
    120  * \param *out output stream for debugging
    121  * \param *&RootStack stack to be filled
    122  * \param AtomMask defines true/false per global Atom::Nr to mask in/out each nuclear site
    123  * \param &FragmentCounter counts through the fragments in this MoleculeLeafClass
    124  * \param saturation whether to treat hydrogen special or not
    125  * \return true - stack is non-empty, fragmentation necessary, false - stack is empty, no more sites to update
    126  */
    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 candidates
    131     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 mask
    136           if ((saturation == DontSaturate) || ((*iter)->getType()->getAtomicNumber() != 1)) // skip hydrogen
    137             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 };
    152118
    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 debugging
    155  * \param *reference reference molecule with the bond structure to be copied
    156  * \param *KeySetList list with all keysets
    157  * \param *ListOfLocalAtoms Lookup table for each subgraph and index of each atom in global molecule, may be NULL on start, then it is filled
    158  * \param **&FragmentList list to be allocated and returned
    159  * \param &FragmentCounter counts the fragments as we move along the list
    160  * \param FreeList true - ***ListOfLocalAtoms is free'd before return, false - it is not
    161  * \retuen true - success, false - failure
    162  */
    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 given
    170   if (!Leaf->FillListOfLocalAtoms(ListOfLocalAtoms[FragmentCounter], reference->getAtomCount())) {
    171     LOG(1, "Filling of ListOfLocalAtoms failed.");
    172     return false;
    173   }
    174 
    175   // allocate fragment list
    176   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 all
    185     // assign scanned keysets
    186     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 set
    191         // translate keyset to local numbers
    192         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 FragmentList
    195         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 list
    201       LOG(1, "KeySetCounter is zero, deleting FragmentList.");
    202       delete (FragmentList[FragmentCounter]);
    203     } else
    204       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   } else
    210     LOG(1, "KeySetList is NULL or empty.");
    211 
    212   if ((FreeList) && (ListOfLocalAtoms != NULL)) {
    213     // free the index lookup list
    214     (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 debugging
    222  * \param **FragmentList Graph with local numbers per fragment
    223  * \param &FragmentCounter counts the fragments as we move along the list
    224  * \param &TotalNumberOfKeySets global key set counter
    225  * \param &TotalGraph Graph to be filled with global numbers
    226  */
    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 };
    247119
    248120/** Simply counts the number of items in the list, from given MoleculeLeafClass.
  • src/MoleculeLeafClass.hpp

    rb9401e r339910  
    4040
    4141  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);
    4542  int Count() const;
    4643};
Note: See TracChangeset for help on using the changeset viewer.