/* * Project: MoleCuilder * Description: creates and alters molecular systems * Copyright (C) 2012 University of Bonn. All rights reserved. * * * This file is part of MoleCuilder. * * MoleCuilder is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * MoleCuilder is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with MoleCuilder. If not, see . */ /* * TremoloParser_ElementKeys.cpp * * Created on: Mar 12, 2012 * Author: heber */ // include config.h #ifdef HAVE_CONFIG_H #include #endif #include "CodePatterns/MemDebug.hpp" #include "TremoloParser_ElementKeys.hpp" #include #include #include "CodePatterns/Log.hpp" #include "Element/element.hpp" #include "Element/periodentafel.hpp" #include "Parser/Exceptions.hpp" #include "World.hpp" /** Parses a .potentials file and creates from it the knownTypes file. * * @param file input stream of .potentials file */ void ElementKeys::parseKnownTypes(std::istream &file) { const periodentafel *periode = World::getInstance().getPeriode(); // remove old mapping clear(); // LOG(3, "INFO: additionalAtomData contains: " << additionalAtomData); // parse in file typedef boost::tokenizer > tokenizer; boost::char_separator tokensep(":\t ,;"); boost::char_separator equalitysep("\t ="); std::string line; while (file.good()) { std::getline( file, line ); LOG(4, "INFO: full line of parameters is '" << line << "'"); if (line.find("particle:") != string::npos) { LOG(3, "INFO: found line '" << line << "' containing keyword 'particle:'."); tokenizer tokens(line, tokensep); ASSERT(tokens.begin() != tokens.end(), "FormatParser< tremolo >::parseKnownTypes() - line with 'particle:' but no particles separated by comma."); // look for particle_type std::string particle_type("NULL"); std::string element_type("NULL"); for (tokenizer::iterator tok_iter = tokens.begin(); tok_iter != tokens.end(); ++tok_iter) { if ((*tok_iter).find("particle_type") != string::npos) { LOG(3, "INFO: found token '" << *tok_iter << "' containing keyword 'particle_type'."); tokenizer token((*tok_iter), equalitysep); ASSERT(token.begin() != token.end(), "FormatParser< tremolo >::parseKnownTypes() - could not split particle_type by equality sign"); tokenizer::iterator particle_iter = token.begin(); particle_iter++; particle_type = *particle_iter; } if ((*tok_iter).find("element_name") != string::npos) { LOG(3, "INFO: found token '" << *tok_iter << "' containing keyword 'element_name'."); tokenizer token((*tok_iter), equalitysep); ASSERT(token.begin() != token.end(), "FormatParser< tremolo >::parseKnownTypes() - could not split particle_type by equality sign"); tokenizer::iterator element_iter = token.begin(); element_iter++; element_type = *element_iter; } } if ((particle_type != "NULL") && (element_type != "NULL")) { if (periode->FindElement(element_type) != NULL) { LOG(1, "INFO: Added Type " << particle_type << " as reference to element " << element_type << "."); setType(particle_type, element_type); } else { ELOG(1, "INFO: Either Type " << particle_type << " or " << element_type << " could not be recognized." ); } } else { ELOG(3, "Line does not contain both 'particle_type' and 'element_name' as keys." ); } } } } /** Creates knownTypes as the identity, e.g. H -> H, He -> He, ... . * */ void ElementKeys::createKnownTypesByIdentity() { // remove old mapping clear(); // make knownTypes the identity mapping const periodentafel *periode = World::getInstance().getPeriode(); for (periodentafel::const_iterator iter = periode->begin(); iter != periode->end(); ++iter) { setType( iter->second->getSymbol(), iter->second->getSymbol()); } } /** Getter for value indexed by \a type. * * @param type key for map * @return value stored under \a type */ const std::string &ElementKeys::getType(const std::string &type) const throw (IllegalParserKeyException) { const_iterator iter = find(type); if (iter == end()) { throw IllegalParserKeyException() << ParserMapLookup(type); } else return iter->second; } /** Getter for value indexed by \a type. * * @param type key for map * @return value stored under \a type */ void ElementKeys::setType(const std::string &type, const std::string &value) throw (IllegalParserKeyException) { const_iterator iter = find(type); if (iter != end()) { throw IllegalParserKeyException() << ParserMapLookup(type); } else { insert( make_pair(type,value) ); LOG(3, "DEBUG: Key " << type << " refers to element " << at(type) << "."); } }