Changeset 0180d6


Ignore:
Timestamp:
Mar 1, 2011, 10:16:37 AM (14 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:
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)
Message:

Enhanced XyzParser to load and save multiple time steps.

Files:
2 added
4 edited

Legend:

Unmodified
Added
Removed
  • src/Parser/XyzParser.cpp

    rc6aeb1 r0180d6  
    4949 * \param XYZ file
    5050 */
    51 void XyzParser::load(istream* file) {
     51void XyzParser::load(istream* file)
     52{
    5253  atom* newAtom = NULL;
    5354  molecule* newmol = NULL;
    5455  int numberOfAtoms;
    5556  char commentBuffer[512], type[3];
    56   double tmp;
     57  string number;
     58  std::list<atom *> AddedAtoms;
    5759
    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
    6361  newmol = World::getInstance().createMolecule();
    6462  newmol->ActiveFlag = true;
    6563  // TODO: Remove the insertion into molecule when saving does not depend on them anymore. Also, remove molecule.hpp include
    6664  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);
    73104    }
    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) << ".");
    77120}
    78121
     
    85128void XyzParser::save(ostream* file, const std::vector<atom *> &atoms) {
    86129  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 newline
    91     std::string time(ctime(&now));
    92     size_t pos = time.find('\n');
    93     if (pos != 0)
    94       comment += time.substr(0,pos);
    95     else
    96       comment += time;
    97   //}
    98   *file << atoms.size() << endl << "\t" << comment << endl;
    99130
    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    }
    102171  }
    103172}
  • src/Parser/unittests/ParserXyzUnitTest.cpp

    rc6aeb1 r0180d6  
    4040CPPUNIT_TEST_SUITE_REGISTRATION( ParserXyzUnitTest );
    4141
    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";
     42static string waterXyz = "\
     433\n\
     44\tH2O: water molecule\n\
     45O\t0\t0\t0\n\
     46H\t0.758602\t0\t0.504284\n\
     47H\t0.758602\t0\t-0.504284\n";
     48static string waterMultiXyz = "\
     493\n\
     50\tH2O: water molecule, time step 0\n\
     51O\t0\t0\t0\n\
     52H\t0.758602\t0\t0.504284\n\
     53H\t0.758602\t0\t-0.504284\n\
     543\n\
     55\tH2O: water molecule, time step 1\n\
     56O\t0\t0\t0\n\
     57H\t0.76\t0\t0.504284\n\
     58H\t0.756\t0\t-0.504284\n";
    4359
    4460void ParserXyzUnitTest::setUp() {
     
    95111  }
    96112}
     113
     114void 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
     130void 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  
    2121  CPPUNIT_TEST_SUITE( ParserXyzUnitTest ) ;
    2222  CPPUNIT_TEST ( rewriteAnXyzTest );
     23  CPPUNIT_TEST ( readMultiXyzTest );
     24  CPPUNIT_TEST ( writeMultiXyzTest );
    2325  CPPUNIT_TEST_SUITE_END();
    2426
     
    2830
    2931  void rewriteAnXyzTest();
     32  void readMultiXyzTest();
     33  void writeMultiXyzTest();
    3034};
    3135
  • tests/regression/Parser/Xyz/testsuite-parser-xyz.at

    rc6aeb1 r0180d6  
    55AT_CHECK([../../molecuilder -i test.xyz -o xyz -l ${abs_top_srcdir}/${AUTOTEST_PATH}/Parser/Xyz/pre/test.xyz], 0, [ignore], [ignore])
    66AT_CHECK([file=test.xyz; diff -I '.*Created by molecuilder.*' $file ${abs_top_srcdir}/${AUTOTEST_PATH}/Parser/Xyz/post/$file], 0, [ignore], [ignore])
     7AT_CHECK([../../molecuilder -i testmulti.xyz -o xyz -l ${abs_top_srcdir}/${AUTOTEST_PATH}/Parser/Xyz/pre/testmulti.xyz], 0, [ignore], [ignore])
     8AT_CHECK([file=testmulti.xyz; diff -I '.*Created by molecuilder.*' $file ${abs_top_srcdir}/${AUTOTEST_PATH}/Parser/Xyz/post/$file], 0, [ignore], [ignore])
    79AT_CLEANUP
    810
Note: See TracChangeset for help on using the changeset viewer.