Changeset ca8bea for src/Fragmentation/Exporters/ExportGraph_ToFiles.cpp
- Timestamp:
- Dec 3, 2012, 9:49:59 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:
- 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)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/Fragmentation/Exporters/ExportGraph_ToFiles.cpp
rde0af2 rca8bea 37 37 #include "ExportGraph_ToFiles.hpp" 38 38 39 #include "CodePatterns/Info.hpp" 39 40 #include "CodePatterns/Log.hpp" 41 42 #include "Bond/bond.hpp" 43 #include "Element/element.hpp" 40 44 #include "Fragmentation/Graph.hpp" 41 45 #include "Fragmentation/KeySet.hpp" 46 #include "Graph/ListOfLocalAtoms.hpp" 47 #include "molecule.hpp" 42 48 #include "MoleculeListClass.hpp" 49 #include "Parser/FormatParserStorage.hpp" 43 50 #include "World.hpp" 44 51 … … 46 53 * 47 54 * @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 */ 57 ExportGraph_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) 51 62 {} 52 63 64 /** Destructor of class ExportGraph_ToFiles. 65 * 66 * We free all created molecules again and also removed their copied atoms. 67 */ 68 ExportGraph_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 53 82 /** Actual implementation of the export to files function. 54 * 55 */ 56 void ExportGraph_ToFiles::operator ()() 57 { 83 */ 84 void 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); 58 127 } 59 128 … … 63 132 void ExportGraph_ToFiles::prepareMolecule() 64 133 { 65 // allocate memory for the pointer array and transmorph graphs into full molecular fragments66 MoleculeListClass *BondFragments = new MoleculeListClass(World::getPointer());67 134 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++) { 69 136 KeySet test = (*runner).first; 70 137 LOG(2, "DEBUG: Fragment No." << (*runner).second.first << " with TEFactor " 71 138 << (*runner).second.second << "."); 72 BondFragments ->insert(StoreFragmentFromKeySet(test, World::getInstance().getConfig()));139 BondFragments.insert(StoreFragmentFromKeySet(mol, test, World::getInstance().getConfig())); 73 140 ++count; 74 141 } 75 LOG(1, "INFO: " << count << "/" << BondFragments ->ListOfMolecules.size()142 LOG(1, "INFO: " << count << "/" << BondFragments.ListOfMolecules.size() 76 143 << " fragments generated from the keysets."); 77 144 } 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 */ 154 molecule * 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 */ 176 int 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 */ 197 void 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 */ 260 bool 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.