Ignore:
Timestamp:
Dec 3, 2012, 9:49:59 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:
dcbb5d
Parents:
de0af2
git-author:
Frederik Heber <heber@…> (09/20/12 12:37:12)
git-committer:
Frederik Heber <heber@…> (12/03/12 09:49:59)
Message:

ExportGraph_ToFiles performs now the storing of the generated Graph to files.

  • FragmentMolecule now fills an internal graph.
  • ExportGraph_ToFiles gets graph in cstor and writes the contained KeySets to file on call of operator().
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/Fragmentation/Exporters/ExportGraph_ToFiles.cpp

    rde0af2 rca8bea  
    3737#include "ExportGraph_ToFiles.hpp"
    3838
     39#include "CodePatterns/Info.hpp"
    3940#include "CodePatterns/Log.hpp"
     41
     42#include "Bond/bond.hpp"
     43#include "Element/element.hpp"
    4044#include "Fragmentation/Graph.hpp"
    4145#include "Fragmentation/KeySet.hpp"
     46#include "Graph/ListOfLocalAtoms.hpp"
     47#include "molecule.hpp"
    4248#include "MoleculeListClass.hpp"
     49#include "Parser/FormatParserStorage.hpp"
    4350#include "World.hpp"
    4451
     
    4653 *
    4754 * @param _graph instance of Graph containing keyset of each fragment
    48  */
    49 ExportGraph_ToFiles::ExportGraph_ToFiles(const Graph &_graph) :
    50                 ExportGraph(_graph)
     55 * @param _mol molecule as reference
     56 */
     57ExportGraph_ToFiles::ExportGraph_ToFiles(const Graph &_graph, molecule *&_mol, const enum HydrogenSaturation _saturation) :
     58                ExportGraph(_graph),
     59                mol(_mol),
     60                BondFragments(World::getPointer()),
     61                saturation(_saturation)
    5162{}
    5263
     64/** Destructor of class ExportGraph_ToFiles.
     65 *
     66 * We free all created molecules again and also removed their copied atoms.
     67 */
     68ExportGraph_ToFiles::~ExportGraph_ToFiles()
     69{
     70  // remove all create molecules again from the World including their atoms
     71  for (MoleculeList::iterator iter = BondFragments.ListOfMolecules.begin();
     72      !BondFragments.ListOfMolecules.empty();
     73      iter = BondFragments.ListOfMolecules.begin()) {
     74    // remove copied atoms and molecule again
     75    molecule *mol = *iter;
     76    mol->removeAtomsinMolecule();
     77    World::getInstance().destroyMolecule(mol);
     78    BondFragments.ListOfMolecules.erase(iter);
     79  }
     80}
     81
    5382/** Actual implementation of the export to files function.
    54  *
    55  */
    56 void ExportGraph_ToFiles::operator ()()
    57 {
     83 */
     84void ExportGraph_ToFiles::operator()()
     85{
     86  if (BondFragments.ListOfMolecules.size() == 0)
     87    prepareMolecule();
     88
     89  // ===== 9. Save fragments' configuration and keyset files et al to disk ===
     90  // create the SortIndex from BFS labels to order in the config file
     91  std::map<atomId_t, int> SortIndex;
     92  CreateMappingLabelsToConfigSequence(SortIndex);
     93
     94  LOG(1, "Writing " << BondFragments.ListOfMolecules.size() << " possible bond fragmentation configs");
     95  bool write_status = true;
     96  for (std::vector<std::string>::const_iterator iter = typelist.begin();
     97      iter != typelist.end();
     98      ++iter) {
     99    LOG(2, "INFO: Writing bond fragments for type " << (*iter) << ".");
     100    write_status = write_status
     101    && BondFragments.OutputConfigForListOfFragments(
     102        prefix,
     103        FormatParserStorage::getInstance().getTypeFromName(*iter));
     104  }
     105  if (write_status)
     106    LOG(1, "All configs written.");
     107  else
     108    LOG(1, "Some config writing failed.");
     109
     110  // store force index reference file
     111  BondFragments.StoreForcesFile(prefix, SortIndex);
     112
     113  // store keysets file
     114  TotalGraph.StoreKeySetFile(prefix);
     115
     116  {
     117    // store Adjacency file
     118    std::string filename = prefix + ADJACENCYFILE;
     119    mol->StoreAdjacencyToFile(filename);
     120  }
     121
     122  // store Hydrogen saturation correction file
     123  BondFragments.AddHydrogenCorrection(prefix);
     124
     125  // restore orbital and Stop values
     126  //CalculateOrbitals(*configuration);
    58127}
    59128
     
    63132void ExportGraph_ToFiles::prepareMolecule()
    64133{
    65   // allocate memory for the pointer array and transmorph graphs into full molecular fragments
    66   MoleculeListClass *BondFragments = new MoleculeListClass(World::getPointer());
    67134  size_t count = 0;
    68   for(Graph::iterator runner = TotalGraph.begin(); runner != TotalGraph.end(); runner++) {
     135  for(Graph::const_iterator runner = TotalGraph.begin(); runner != TotalGraph.end(); runner++) {
    69136    KeySet test = (*runner).first;
    70137    LOG(2, "DEBUG: Fragment No." << (*runner).second.first << " with TEFactor "
    71138                << (*runner).second.second << ".");
    72     BondFragments->insert(StoreFragmentFromKeySet(test, World::getInstance().getConfig()));
     139    BondFragments.insert(StoreFragmentFromKeySet(mol, test, World::getInstance().getConfig()));
    73140    ++count;
    74141  }
    75   LOG(1, "INFO: " << count << "/" << BondFragments->ListOfMolecules.size()
     142  LOG(1, "INFO: " << count << "/" << BondFragments.ListOfMolecules.size()
    76143                << " fragments generated from the keysets.");
    77144}
     145
     146/** Stores a fragment from \a KeySet into \a molecule.
     147 * First creates the minimal set of atoms from the KeySet, then creates the bond structure from the complete
     148 * molecule and adds missing hydrogen where bonds were cut.
     149 * \param *mol reference molecule
     150 * \param &Leaflet pointer to KeySet structure
     151 * \param IsAngstroem whether we have Ansgtroem or bohrradius
     152 * \return pointer to constructed molecule
     153 */
     154molecule * ExportGraph_ToFiles::StoreFragmentFromKeySet(molecule *mol, KeySet &Leaflet, bool IsAngstroem)
     155{
     156  Info info(__func__);
     157  ListOfLocalAtoms_t SonList;
     158  molecule *Leaf = World::getInstance().createMolecule();
     159
     160  StoreFragmentFromKeySet_Init(mol, Leaf, Leaflet, SonList);
     161  // create the bonds between all: Make it an induced subgraph and add hydrogen
     162//  LOG(2, "Creating bonds from father graph (i.e. induced subgraph creation).");
     163  CreateInducedSubgraphOfFragment(mol, Leaf, SonList, IsAngstroem);
     164
     165  //Leaflet->Leaf->ScanForPeriodicCorrection(out);
     166  return Leaf;
     167}
     168
     169/** Initializes some value for putting fragment of \a *mol into \a *Leaf.
     170 * \param *mol total molecule
     171 * \param *Leaf fragment molecule
     172 * \param &Leaflet pointer to KeySet structure
     173 * \param SonList calloc'd list which atom of \a *Leaf is a son of which atom in \a *mol
     174 * \return number of atoms in fragment
     175 */
     176int ExportGraph_ToFiles::StoreFragmentFromKeySet_Init(molecule *mol, molecule *Leaf, KeySet &Leaflet, ListOfLocalAtoms_t &SonList)
     177{
     178  atom *FatherOfRunner = NULL;
     179
     180  // first create the minimal set of atoms from the KeySet
     181  int size = 0;
     182  for(KeySet::const_iterator runner = Leaflet.begin(); runner != Leaflet.end(); runner++) {
     183    FatherOfRunner = mol->FindAtom((*runner));  // find the id
     184    SonList.insert( std::make_pair(FatherOfRunner->getNr(), Leaf->AddCopyAtom(FatherOfRunner) ) );
     185    size++;
     186  }
     187  return size;
     188}
     189
     190/** Creates an induced subgraph out of a fragmental key set, adding bonds and hydrogens (if treated specially).
     191 * \param *out output stream for debugging messages
     192 * \param *mol total molecule
     193 * \param *Leaf fragment molecule
     194 * \param IsAngstroem whether we have Ansgtroem or bohrradius
     195 * \param SonList list which atom of \a *Leaf is a son of which atom in \a *mol
     196 */
     197void ExportGraph_ToFiles::CreateInducedSubgraphOfFragment(molecule *mol, molecule *Leaf, ListOfLocalAtoms_t &SonList, bool IsAngstroem)
     198{
     199  bool LonelyFlag = false;
     200  atom *OtherFather = NULL;
     201  atom *FatherOfRunner = NULL;
     202
     203  // we increment the iter just before skipping the hydrogen
     204  // as we use AddBond, we cannot have a const_iterator here
     205  for (molecule::iterator iter = Leaf->begin(); iter != Leaf->end();) {
     206    LonelyFlag = true;
     207    FatherOfRunner = (*iter)->father;
     208    ASSERT(FatherOfRunner,"Atom without father found");
     209    if (SonList.find(FatherOfRunner->getNr()) != SonList.end())  {  // check if this, our father, is present in list
     210      // create all bonds
     211      const BondList& ListOfBonds = FatherOfRunner->getListOfBonds();
     212      for (BondList::const_iterator BondRunner = ListOfBonds.begin();
     213          BondRunner != ListOfBonds.end();
     214          ++BondRunner) {
     215        OtherFather = (*BondRunner)->GetOtherAtom(FatherOfRunner);
     216        if (SonList.find(OtherFather->getNr()) != SonList.end()) {
     217//          LOG(2, "INFO: Father " << *FatherOfRunner << " of son " << *SonList[FatherOfRunner->getNr()]
     218//              << " is bound to " << *OtherFather << ", whose son is "
     219//              << *SonList[OtherFather->getNr()] << ".");
     220          if (OtherFather->getNr() > FatherOfRunner->getNr()) { // add bond (Nr check is for adding only one of both variants: ab, ba)
     221            std::stringstream output;
     222//            output << "ACCEPT: Adding Bond: "
     223            output << Leaf->AddBond((*iter), SonList[OtherFather->getNr()], (*BondRunner)->BondDegree);
     224//            LOG(3, output.str());
     225            //NumBonds[(*iter)->getNr()]++;
     226          } else {
     227//            LOG(3, "REJECY: Not adding bond, labels in wrong order.");
     228          }
     229          LonelyFlag = false;
     230        } else {
     231//          LOG(2, "INFO: Father " << *FatherOfRunner << " of son " << *SonList[FatherOfRunner->getNr()]
     232//              << " is bound to " << *OtherFather << ", who has no son in this fragment molecule.");
     233          if (saturation == DoSaturate) {
     234//          LOG(3, "ACCEPT: Adding Hydrogen to " << (*iter)->Name << " and a bond in between.");
     235            if (!Leaf->AddHydrogenReplacementAtom((*BondRunner), (*iter), FatherOfRunner, OtherFather, IsAngstroem))
     236              exit(1);
     237          }
     238          //NumBonds[(*iter)->getNr()] += Binder->BondDegree;
     239        }
     240      }
     241    } else {
     242    ELOG(1, "Son " << (*iter)->getName() << " has father " << FatherOfRunner->getName() << " but its entry in SonList is " << SonList[FatherOfRunner->getNr()] << "!");
     243    }
     244    if ((LonelyFlag) && (Leaf->getAtomCount() > 1)) {
     245      LOG(0, **iter << "has got bonds only to hydrogens!");
     246    }
     247    ++iter;
     248    if (saturation == DoSaturate) {
     249      while ((iter != Leaf->end()) && ((*iter)->getType()->getAtomicNumber() == 1)){ // skip added hydrogen
     250        iter++;
     251      }
     252    }
     253  }
     254}
     255
     256/** Create a SortIndex to map from atomic labels to the sequence in which the atoms are given in the config file.
     257 * \param &SortIndex Mapping array of size molecule::AtomCount
     258 * \return true - success, false - failure of SortIndex alloc
     259 */
     260bool ExportGraph_ToFiles::CreateMappingLabelsToConfigSequence(std::map<atomId_t, int> &SortIndex)
     261{
     262  if (!SortIndex.empty()) {
     263    LOG(1, "SortIndex has " << SortIndex.size() << " entries and is not empty as expected.");
     264    return false;
     265  }
     266
     267  int AtomNo = 0;
     268  for(molecule::const_iterator iter=mol->begin();iter!=mol->end();++iter){
     269    const int id = (*iter)->getNr();
     270#ifndef NDEBUG
     271      std::pair<std::map<atomId_t, int>::const_iterator, bool> inserter =
     272#endif
     273    SortIndex.insert( std::make_pair(id, AtomNo++) );
     274    ASSERT( inserter.second ,
     275        "ExportGraph_ToFiles::CreateMappingLabelsToConfigSequence() - same SortIndex set twice.");
     276  }
     277
     278  return true;
     279}
     280
Note: See TracChangeset for help on using the changeset viewer.