Changeset 0180d6
- Timestamp:
- Mar 1, 2011, 10:16:37 AM (14 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:
- 637358
- Parents:
- c6aeb1
- git-author:
- Frederik Heber <heber@…> (02/18/11 18:50:08)
- git-committer:
- Frederik Heber <heber@…> (03/01/11 10:16:37)
- Files:
-
- 2 added
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
src/Parser/XyzParser.cpp
rc6aeb1 r0180d6 49 49 * \param XYZ file 50 50 */ 51 void XyzParser::load(istream* file) { 51 void XyzParser::load(istream* file) 52 { 52 53 atom* newAtom = NULL; 53 54 molecule* newmol = NULL; 54 55 int numberOfAtoms; 55 56 char commentBuffer[512], type[3]; 56 double tmp; 57 string number; 58 std::list<atom *> AddedAtoms; 57 59 58 // the first line tells number of atoms, the second line is always a comment 59 *file >> numberOfAtoms >> ws; 60 file->getline(commentBuffer, 512); 61 comment = commentBuffer; 62 60 // create the molecule 63 61 newmol = World::getInstance().createMolecule(); 64 62 newmol->ActiveFlag = true; 65 63 // TODO: Remove the insertion into molecule when saving does not depend on them anymore. Also, remove molecule.hpp include 66 64 World::getInstance().getMolecules()->insert(newmol); 67 for (int i = 0; i < numberOfAtoms; i++) { 68 newAtom = World::getInstance().createAtom(); 69 *file >> type; 70 for (int j=0;j<NDIM;j++) { 71 *file >> tmp; 72 newAtom->set(j, tmp); 65 66 // the first line tells number of atoms, 67 // where we need this construct due to skipping of empty lines below 68 *file >> number >> ws; 69 unsigned int step = 0; 70 std::list<atom *>::iterator CurrentAtom; 71 do { 72 CurrentAtom = AddedAtoms.begin(); 73 std::stringstream numberstream(number); 74 numberstream >> numberOfAtoms; 75 // the second line is always a comment 76 file->getline(commentBuffer, 512); 77 comment = commentBuffer; 78 79 for (int i = 0; i < numberOfAtoms; i++) { 80 // parse type and position 81 *file >> type; 82 Vector tempVector; 83 for (int j=0;j<NDIM;j++) { 84 *file >> tempVector[j]; 85 } 86 LOG(4, "INFO: Parsed type as " << type << " and position at " 87 << tempVector << " for time step " << step); 88 89 if (step == 0) { 90 newAtom = World::getInstance().createAtom(); 91 newAtom->setType(World::getInstance().getPeriode()->FindElement(type)); 92 newmol->AddAtom(newAtom); 93 AddedAtoms.push_back(newAtom); 94 LOG(5, "INFO: Created new atom."); 95 } else { 96 ASSERT(CurrentAtom != AddedAtoms.end(), 97 "XyzParser::load() - not enough added atoms."); 98 newAtom = *CurrentAtom++; 99 ASSERT(newAtom->getType() == World::getInstance().getPeriode()->FindElement(type), 100 "XyzParser::load() - atom has different type, mixed up order?"); 101 LOG(5, "INFO: Using present atom " << *newAtom << "."); 102 } 103 newAtom->setPositionAtStep(step, tempVector); 73 104 } 74 newAtom->setType(World::getInstance().getPeriode()->FindElement(type)); 75 newmol->AddAtom(newAtom); 76 } 105 getline (*file, number); // eat away rest of last line 106 // skip empty lines 107 unsigned int counter = 0; 108 while (file->good()) { 109 getline (*file, number); 110 LOG(4, "INFO: Skipped line is '" << number << "'"); 111 counter++; 112 if (!number.empty()) 113 break; 114 } 115 LOG(3, "INFO: I skipped "+toString(counter)+" empty lines."); 116 ++step; 117 } while (file->good()); 118 BOOST_FOREACH(atom *_atom, World::getInstance().getAllAtoms()) 119 LOG(3, "INFO: Atom " << _atom->getName() << " " << *dynamic_cast<AtomInfo *>(_atom) << "."); 77 120 } 78 121 … … 85 128 void XyzParser::save(ostream* file, const std::vector<atom *> &atoms) { 86 129 DoLog(0) && (Log() << Verbose(0) << "Saving changes to xyz." << std::endl); 87 //if (comment == "") {88 time_t now = time((time_t *)NULL); // Get the system time and put it into 'now' as 'calender time'89 comment = "Created by molecuilder on ";90 // ctime ends in \n\0, we have to cut away the newline91 std::string time(ctime(&now));92 size_t pos = time.find('\n');93 if (pos != 0)94 comment += time.substr(0,pos);95 else96 comment += time;97 //}98 *file << atoms.size() << endl << "\t" << comment << endl;99 130 100 for(vector<atom*>::const_iterator it = atoms.begin(); it != atoms.end(); it++) { 101 *file << noshowpoint << (*it)->getType()->getSymbol() << "\t" << (*it)->at(0) << "\t" << (*it)->at(1) << "\t" << (*it)->at(2) << endl; 131 // get max and min trajectories 132 unsigned int min_trajectories = 1; 133 unsigned int max_trajectories = 1; 134 for (std::vector<atom *>::const_iterator iter = atoms.begin(); 135 iter != atoms.end(); 136 ++iter) { 137 if (max_trajectories < (*iter)->getTrajectorySize()) 138 max_trajectories = (*iter)->getTrajectorySize(); 139 if ((min_trajectories > (*iter)->getTrajectorySize()) 140 && (max_trajectories > (*iter)->getTrajectorySize())) 141 min_trajectories = (*iter)->getTrajectorySize(); 142 } 143 ASSERT((min_trajectories == max_trajectories) || (min_trajectories == 1), 144 "XyzParser::save() - not all atoms have same number of trajectories."); 145 LOG(2, "INFO: There are " << max_trajectories << " to save."); 146 147 for (unsigned int step = 0; step < max_trajectories; ++step) { 148 if (step != 0) 149 *file << "\n"; 150 //if (comment == "") { 151 time_t now = time((time_t *)NULL); // Get the system time and put it into 'now' as 'calender time' 152 comment = "Created by molecuilder on "; 153 // ctime ends in \n\0, we have to cut away the newline 154 std::string time(ctime(&now)); 155 size_t pos = time.find('\n'); 156 if (pos != 0) 157 comment += time.substr(0,pos); 158 else 159 comment += time; 160 comment += ", time step "+toString(step); 161 //} 162 *file << atoms.size() << endl << "\t" << comment << endl; 163 164 for(vector<atom*>::const_iterator it = atoms.begin(); it != atoms.end(); it++) { 165 *file << noshowpoint << (*it)->getType()->getSymbol(); 166 *file << "\t" << (*it)->atStep(0, step); 167 *file << "\t" << (*it)->atStep(1, step); 168 *file << "\t" << (*it)->atStep(2, step); 169 *file << endl; 170 } 102 171 } 103 172 } -
src/Parser/unittests/ParserXyzUnitTest.cpp
rc6aeb1 r0180d6 40 40 CPPUNIT_TEST_SUITE_REGISTRATION( ParserXyzUnitTest ); 41 41 42 static string waterXyz = "3\n\tH2O: water molecule\nO\t0\t0\t0\nH\t0.758602\t0\t0.504284\nH\t0.758602\t0\t-0.504284\n"; 42 static string waterXyz = "\ 43 3\n\ 44 \tH2O: water molecule\n\ 45 O\t0\t0\t0\n\ 46 H\t0.758602\t0\t0.504284\n\ 47 H\t0.758602\t0\t-0.504284\n"; 48 static string waterMultiXyz = "\ 49 3\n\ 50 \tH2O: water molecule, time step 0\n\ 51 O\t0\t0\t0\n\ 52 H\t0.758602\t0\t0.504284\n\ 53 H\t0.758602\t0\t-0.504284\n\ 54 3\n\ 55 \tH2O: water molecule, time step 1\n\ 56 O\t0\t0\t0\n\ 57 H\t0.76\t0\t0.504284\n\ 58 H\t0.756\t0\t-0.504284\n"; 43 59 44 60 void ParserXyzUnitTest::setUp() { … … 95 111 } 96 112 } 113 114 void ParserXyzUnitTest::readMultiXyzTest() { 115 cout << "Testing the multi time step XYZ parser." << endl; 116 XyzParser* testParser = new XyzParser(); 117 stringstream input; 118 input << waterMultiXyz; 119 testParser->load(&input); 120 input.clear(); 121 122 // 3 not 6 atoms! 123 CPPUNIT_ASSERT_EQUAL(3, World::getInstance().numAtoms()); 124 125 // check for trajectory size 126 BOOST_FOREACH (atom *_atom, World::getInstance().getAllAtoms()) 127 CPPUNIT_ASSERT_EQUAL((size_t) 2, _atom->getTrajectorySize()); 128 } 129 130 void ParserXyzUnitTest::writeMultiXyzTest() { 131 XyzParser* testParser = new XyzParser(); 132 stringstream input; 133 input << waterMultiXyz; 134 testParser->load(&input); 135 input.clear(); 136 137 // 3 not 6 atoms! 138 CPPUNIT_ASSERT_EQUAL(3, World::getInstance().numAtoms()); 139 140 // store and parse in again 141 { 142 stringstream output; 143 std::vector<atom *> atoms = World::getInstance().getAllAtoms(); 144 testParser->save(&output, atoms); 145 input << output.str(); 146 testParser->load(&input); 147 } 148 149 // now twice as many 150 CPPUNIT_ASSERT_EQUAL(6, World::getInstance().numAtoms()); 151 152 // check for trajectory size of all 6! atoms 153 BOOST_FOREACH (atom *_atom, World::getInstance().getAllAtoms()) 154 CPPUNIT_ASSERT_EQUAL((size_t) 2, _atom->getTrajectorySize()); 155 156 // check every atom 157 std::vector<atom *> atoms = World::getInstance().getAllAtoms(); 158 std::vector<atom *>::const_iterator firstiter = atoms.begin(); 159 std::vector<atom *>::const_iterator seconditer = atoms.begin(); 160 for (size_t i=0;i<3;i++) 161 ++seconditer; 162 for (; 163 seconditer != atoms.end(); 164 ++firstiter,++seconditer) { 165 CPPUNIT_ASSERT_EQUAL((*firstiter)->getType(),(*seconditer)->getType()); 166 for (unsigned int step = 0; step < 2; ++step) { 167 // check position and type (only stuff xyz stores) 168 CPPUNIT_ASSERT_EQUAL( 169 (*firstiter)->getPositionAtStep(step), 170 (*seconditer)->getPositionAtStep(step)); 171 } 172 } 173 } -
src/Parser/unittests/ParserXyzUnitTest.hpp
rc6aeb1 r0180d6 21 21 CPPUNIT_TEST_SUITE( ParserXyzUnitTest ) ; 22 22 CPPUNIT_TEST ( rewriteAnXyzTest ); 23 CPPUNIT_TEST ( readMultiXyzTest ); 24 CPPUNIT_TEST ( writeMultiXyzTest ); 23 25 CPPUNIT_TEST_SUITE_END(); 24 26 … … 28 30 29 31 void rewriteAnXyzTest(); 32 void readMultiXyzTest(); 33 void writeMultiXyzTest(); 30 34 }; 31 35 -
tests/regression/Parser/Xyz/testsuite-parser-xyz.at
rc6aeb1 r0180d6 5 5 AT_CHECK([../../molecuilder -i test.xyz -o xyz -l ${abs_top_srcdir}/${AUTOTEST_PATH}/Parser/Xyz/pre/test.xyz], 0, [ignore], [ignore]) 6 6 AT_CHECK([file=test.xyz; diff -I '.*Created by molecuilder.*' $file ${abs_top_srcdir}/${AUTOTEST_PATH}/Parser/Xyz/post/$file], 0, [ignore], [ignore]) 7 AT_CHECK([../../molecuilder -i testmulti.xyz -o xyz -l ${abs_top_srcdir}/${AUTOTEST_PATH}/Parser/Xyz/pre/testmulti.xyz], 0, [ignore], [ignore]) 8 AT_CHECK([file=testmulti.xyz; diff -I '.*Created by molecuilder.*' $file ${abs_top_srcdir}/${AUTOTEST_PATH}/Parser/Xyz/post/$file], 0, [ignore], [ignore]) 7 9 AT_CLEANUP 8 10
Note:
See TracChangeset
for help on using the changeset viewer.