Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/Parser/TremoloParser.cpp

    racd638 r72d108  
    2222#include "CodePatterns/Assert.hpp"
    2323#include "CodePatterns/Log.hpp"
    24 #include "CodePatterns/toString.hpp"
    2524#include "CodePatterns/Verbose.hpp"
    2625#include "TremoloParser.hpp"
     
    6766  knownKeys["torsion"] = TremoloKey::torsion;
    6867
    69   createKnownTypesByIdentity();
    70 
    7168  // default behavior: use all possible keys on output
    7269  for (std::map<std::string, TremoloKey::atomDataKey>::iterator iter = knownKeys.begin(); iter != knownKeys.end(); ++iter)
     
    7572  // and noKey afterwards(!) such that it is not used in usedFields
    7673  knownKeys[" "] = TremoloKey::noKey; // with this we can detect invalid keys
    77 
    78   // invert knownKeys for debug output
    79   for (std::map<std::string, TremoloKey::atomDataKey>::iterator iter = knownKeys.begin(); iter != knownKeys.end(); ++iter)
    80     knownKeyNames.insert( make_pair( iter->second, iter->first) );
    81 
    82   additionalAtomData.clear();
    8374}
    8475
     
    140131  vector<string>::iterator it;
    141132
    142   DoLog(3) && (Log() << Verbose(3) << "additionalAtomData contains: " << additionalAtomData << std::endl);
    143 
    144133  *file << "# ATOMDATA";
    145134  for (it=usedFields.begin(); it < usedFields.end(); it++) {
     
    173162  vector<string>::iterator it;
    174163  TremoloKey::atomDataKey currentField;
    175 
    176   DoLog(4) && (Log() << Verbose(4) << "INFO: Saving atom " << *currentAtom << ", its father id is " << currentAtom->GetTrueFather()->getId() << std::endl);
    177164
    178165  for (it = usedFields.begin(); it != usedFields.end(); it++) {
     
    181168      case TremoloKey::x :
    182169        // for the moment, assume there are always three dimensions
    183         DoLog(3) && (Log() << Verbose(3) << "Writing for type " << knownKeyNames[currentField] << ": " << currentAtom->getPosition() << std::endl);
    184170        *file << currentAtom->at(0) << "\t";
    185171        *file << currentAtom->at(1) << "\t";
     
    188174      case TremoloKey::u :
    189175        // for the moment, assume there are always three dimensions
    190         DoLog(3) && (Log() << Verbose(3) << "Writing for type " << knownKeyNames[currentField] << ": " << currentAtom->AtomicVelocity << std::endl);
    191176        *file << currentAtom->AtomicVelocity[0] << "\t";
    192177        *file << currentAtom->AtomicVelocity[1] << "\t";
     
    194179        break;
    195180      case TremoloKey::Type :
    196         if (additionalAtomData.count(currentAtom->getId())) {
    197           if (additionalAtomData[currentAtom->getId()].get(currentField) != "-") {
    198             DoLog(3) && (Log() << Verbose(3) << "Writing for type " << knownKeyNames[currentField] << ": " << additionalAtomData[currentAtom->getId()].get(currentField) << std::endl);
    199             *file << additionalAtomData[currentAtom->getId()].get(currentField) << "\t";
    200           } else {
    201             DoLog(3) && (Log() << Verbose(3) << "Writing for type " << knownKeyNames[currentField] << " default value: " << currentAtom->getType()->getSymbol() << std::endl);
    202             *file << currentAtom->getType()->getSymbol() << "\t";
    203           }
    204         } else if (additionalAtomData.count(currentAtom->GetTrueFather()->getId())) {
    205           if (additionalAtomData[currentAtom->GetTrueFather()->getId()].get(currentField) != "-") {
    206             DoLog(3) && (Log() << Verbose(3) << "Writing for type " << knownKeyNames[currentField] << " stuff from father: " << additionalAtomData[currentAtom->GetTrueFather()->getId()].get(currentField) << std::endl);
    207             *file << additionalAtomData[currentAtom->GetTrueFather()->getId()].get(currentField) << "\t";
    208           } else {
    209             DoLog(3) && (Log() << Verbose(3) << "Writing for type " << knownKeyNames[currentField] << " default value from father: " << currentAtom->GetTrueFather()->getType()->getSymbol() << std::endl);
    210             *file << currentAtom->GetTrueFather()->getType()->getSymbol() << "\t";
    211           }
    212         } else {
    213           DoLog(3) && (Log() << Verbose(3) << "Writing for type " << knownKeyNames[currentField] << " its default value: " << currentAtom->getType()->getSymbol() << std::endl);
    214           *file << currentAtom->getType()->getSymbol() << "\t";
    215         }
     181        *file << currentAtom->getType()->getSymbol() << "\t";
    216182        break;
    217183      case TremoloKey::Id :
    218         DoLog(3) && (Log() << Verbose(3) << "Writing for type " << knownKeyNames[currentField] << ": " << currentAtom->getId()+1 << std::endl);
    219184        *file << currentAtom->getId()+1 << "\t";
    220185        break;
    221186      case TremoloKey::neighbors :
    222         DoLog(3) && (Log() << Verbose(3) << "Writing type " << knownKeyNames[currentField] << std::endl);
    223187        writeNeighbors(file, atoi(it->substr(it->find("=") + 1, 1).c_str()), currentAtom);
    224188        break;
    225189      case TremoloKey::resSeq :
    226         if (additionalAtomData.count(currentAtom->getId())) {
    227           DoLog(3) && (Log() << Verbose(3) << "Writing for type " << knownKeyNames[currentField] << ": " << additionalAtomData[currentAtom->getId()].get(currentField) << std::endl);
     190        if (additionalAtomData.find(currentAtom->getId()) != additionalAtomData.end()) {
    228191          *file << additionalAtomData[currentAtom->getId()].get(currentField);
    229192        } else if (currentAtom->getMolecule() != NULL) {
    230           DoLog(3) && (Log() << Verbose(3) << "Writing for type " << knownKeyNames[currentField] << " its own id: " << currentAtom->getMolecule()->getId()+1 << std::endl);
    231193          *file << setw(4) << currentAtom->getMolecule()->getId()+1;
    232194        } else {
    233           DoLog(3) && (Log() << Verbose(3) << "Writing for type " << knownKeyNames[currentField] << " default value: " << defaultAdditionalData.get(currentField) << std::endl);
    234195          *file << defaultAdditionalData.get(currentField);
    235196        }
    236197        *file << "\t";
    237         break;
     198      break;
    238199      default :
    239         if (additionalAtomData.count(currentAtom->getId())) {
    240           DoLog(3) && (Log() << Verbose(3) << "Writing for type " << knownKeyNames[currentField] << ": " << additionalAtomData[currentAtom->getId()].get(currentField) << std::endl);
     200        if (additionalAtomData.find(currentAtom->getId()) != additionalAtomData.end()) {
    241201          *file << additionalAtomData[currentAtom->getId()].get(currentField);
    242         } else if (additionalAtomData.count(currentAtom->GetTrueFather()->getId())) {
    243           DoLog(3) && (Log() << Verbose(3) << "Writing for type " << knownKeyNames[currentField] << " stuff from father: " << additionalAtomData[currentAtom->GetTrueFather()->getId()].get(currentField) << std::endl);
     202        } else if (additionalAtomData.find(currentAtom->GetTrueFather()->getId()) != additionalAtomData.end()) {
    244203          *file << additionalAtomData[currentAtom->GetTrueFather()->getId()].get(currentField);
    245204        } else {
    246           DoLog(3) && (Log() << Verbose(3) << "Writing for type " << knownKeyNames[currentField] << " the default: " << defaultAdditionalData.get(currentField) << std::endl);
    247205          *file << defaultAdditionalData.get(currentField);
    248206        }
     
    348306        break;
    349307      case TremoloKey::Type :
    350       {
     308        char type[3];
    351309        ASSERT(tok_iter != tokens.end(), "TremoloParser::readAtomDataLine() - no value for "+keyName+"!");
    352         DoLog(1) && (Log() << Verbose(1) << "INFO: Parsing key " << keyName << " with next token " << *tok_iter << std::endl);
    353         std::string element(knownTypes[(*tok_iter)]);
    354         // put type name into container for later use
    355         atomInfo->set(currentField, *tok_iter);
    356         DoLog(1) && (Log() << Verbose(1) << "INFO: Parsing element " << (*tok_iter) << " as " << element << " according to KnownTypes." << std::endl);
     310        //DoLog(1) && (Log() << Verbose(1) << "INFO: Parsing key " << keyName << " with next token " << *tok_iter << std::endl);
     311        strncpy(type, (*tok_iter).c_str(), 3);
    357312        tok_iter++;
    358         newAtom->setType(World::getInstance().getPeriode()->FindElement(element));
     313        //type[1]='\0'; // cutoff after first char, correct for ATOM entries
     314        newAtom->setType(World::getInstance().getPeriode()->FindElement(type));
    359315        ASSERT(newAtom->getType(), "Type was not set for this atom");
    360316        break;
    361       }
    362317      case TremoloKey::Id :
    363318        ASSERT(tok_iter != tokens.end(), "TremoloParser::readAtomDataLine() - no value for "+keyName+"!");
     
    521476}
    522477
    523 /** Creates knownTypes as the identity, e.g. H -> H, He -> He, ... .
    524  *
    525  */
    526 void TremoloParser::createKnownTypesByIdentity()
    527 {
    528   // remove old mapping
    529   knownTypes.clear();
    530   // make knownTypes the identity mapping
    531   const periodentafel *periode = World::getInstance().getPeriode();
    532   for (periodentafel::const_iterator iter = periode->begin();
    533       iter != periode->end();
    534       ++iter) {
    535     knownTypes.insert( make_pair(iter->second->getSymbol(), iter->second->getSymbol()) );
    536   }
    537 }
    538 
    539 /** Parses a .potentials file and creates from it the knownTypes file.
    540  *
    541  * @param file input stream of .potentials file
    542  */
    543 void TremoloParser::parseKnownTypes(std::istream &file)
    544 {
    545   const periodentafel *periode = World::getInstance().getPeriode();
    546   // remove old mapping
    547   knownTypes.clear();
    548 
    549   DoLog(3) && (Log() << Verbose(3) << "additionalAtomData contains: " << additionalAtomData << std::endl);
    550 
    551   // parse in file
    552   typedef boost::tokenizer<boost::char_separator<char> >
    553       tokenizer;
    554   boost::char_separator<char> tokensep(":\t ,;");
    555   boost::char_separator<char> equalitysep("\t =");
    556   std::string line;
    557   while (file.good()) {
    558     std::getline( file, line );
    559     DoLog(4) && (Log() << Verbose(4) << "INFO: full line of parameters is '" << line << "'" << std::endl);
    560     if (line.find("particle:") != string::npos) {
    561       DoLog(3) && (Log() << Verbose(3) << "INFO: found line '" << line << "' containing keyword 'particle:'." << std::endl);
    562       tokenizer tokens(line, tokensep);
    563       ASSERT(tokens.begin() != tokens.end(),
    564           "TremoloParser::parseKnownTypes() - line with 'particle:' but no particles separated by comma.");
    565       // look for particle_type
    566       std::string particle_type("NULL");
    567       std::string element_type("NULL");
    568       for (tokenizer::iterator tok_iter = tokens.begin();
    569           tok_iter != tokens.end();
    570           ++tok_iter) {
    571         if ((*tok_iter).find("particle_type") != string::npos) {
    572           DoLog(3) && (Log() << Verbose(3) << "INFO: found line '" << line << "' containing keyword 'particle_type'." << std::endl);
    573           tokenizer token((*tok_iter), equalitysep);
    574           ASSERT(token.begin() != token.end(),
    575                     "TremoloParser::parseKnownTypes() - could not split particle_type by equality sign");
    576           tokenizer::iterator particle_iter = token.begin();
    577           particle_iter++;
    578           particle_type = *particle_iter;
    579         }
    580         if ((*tok_iter).find("element_name") != string::npos) {
    581           DoLog(3) && (Log() << Verbose(3) << "INFO: found line '" << line << "' containing keyword 'element_name'." << std::endl);
    582           tokenizer token((*tok_iter), equalitysep);
    583           ASSERT(token.begin() != token.end(),
    584                     "TremoloParser::parseKnownTypes() - could not split particle_type by equality sign");
    585           tokenizer::iterator element_iter = token.begin();
    586           element_iter++;
    587           element_type = *element_iter;
    588         }
    589       }
    590       if ((particle_type != "NULL") && (element_type != "NULL")) {
    591         if (periode->FindElement(element_type) != NULL) {
    592           DoLog(1) && (Log() << Verbose(1) << "INFO: Added Type " << particle_type << " as reference to element " << element_type << "." << std::endl);
    593           knownTypes.insert( make_pair (particle_type, element_type) );
    594         } else {
    595           DoeLog(1) && (Log() << Verbose(1) << "INFO: Either Type " << particle_type << " or " << element_type << " could not be recognized." << std::endl);
    596         }
    597       } else {
    598         DoeLog(1) && (Log() << Verbose(1) << "INFO: Desired element " << element_type << " is not known." << std::endl);
    599       }
    600     }
    601   }
    602 
    603 }
Note: See TracChangeset for help on using the changeset viewer.