/*
* Project: MoleCuilder
* Description: creates and alters molecular systems
* Copyright (C) 2010-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 .
*/
/*
* KeySetsContainer.cpp
*
* Created on: Sep 15, 2011
* Author: heber
*/
// include config.h
#ifdef HAVE_CONFIG_H
#include
#endif
#include "CodePatterns/MemDebug.hpp"
#include
#include
#include
#include
#include "CodePatterns/Log.hpp"
#include "Fragmentation/defs.hpp"
#include "Fragmentation/helpers.hpp"
#include "Helpers/defs.hpp"
#include "KeySetsContainer.hpp"
/** Constructor of KeySetsContainer class.
*/
KeySetsContainer::KeySetsContainer() :
FragmentCounter(0),
Order(0),
FragmentsPerOrder(0)
{};
/** Destructor of KeySetsContainer class.
*/
KeySetsContainer::~KeySetsContainer() {
// for(int i=FragmentCounter;i--;)
// delete[](KeySets[i]);
// for(int i=Order;i--;)
// delete[](OrderSet[i]);
// delete[](KeySets);
// delete[](OrderSet);
// delete[](AtomCounter);
// delete[](FragmentsPerOrder);
};
/** Parsing KeySets into array.
* \param *name directory with keyset file
* \param *ACounter number of atoms per fragment
* \param FCounter number of fragments
* \return parsing succesful
*/
bool KeySetsContainer::ParseKeySets(const std::string path, const std::string name, const int FCounter) {
ifstream input;
//char *FragmentNumber = NULL;
stringstream file;
char filename[1023];
FragmentCounter = FCounter;
KeySets.resize(FragmentCounter);
AtomCounter.resize(FragmentCounter);
// open file
file << path << "/" << name;
input.open(file.str().c_str(), ios::in);
if (input.fail()) {
LOG(0, endl << "KeySetsContainer::ParseKeySets: Unable to open " << file.str() << ", is the directory correct?");
return false;
}
// parse each line, i.e. get the index set per fragment
LOG(0, "Parsing key sets.");
for(int i=0;(i > tokenizer;
boost::char_separator sep(" \t");
tokenizer tok(line, sep);
for(tokenizer::iterator beg=tok.begin();
beg != tok.end();++beg){
const int tempvalue = boost::lexical_cast(*beg);
KeySets[i].push_back(tempvalue);
// set_output << " " << KeySets[i].back();
}
// LOG(2, "DEBUG: Scanned keys are '" << set_output.str() << "'.");
AtomCounter[i] = KeySets[i].size();
// {
// std::stringstream output;
// FragmentNumber = FixedDigitNumber(FragmentCounter, i);
// output << FRAGMENTPREFIX << FragmentNumber << "[" << AtomCounter[i] << "]:" << set_output.str();
// delete[](FragmentNumber);
// LOG(0, output.str());
// }
}
input.close();
return true;
};
/** Parse many body terms, associating each fragment to a certain bond order.
* \return parsing succesful
*/
bool KeySetsContainer::ParseManyBodyTerms()
{
int Counter;
LOG(0, "Creating Fragment terms.");
// scan through all to determine maximum order
Order=0;
for(int i=FragmentCounter;i--;) {
Counter=0;
for(int j=AtomCounter[i];j--;)
if (KeySets[i][j] != -1)
Counter++;
if (Counter > Order)
Order = Counter;
}
LOG(0, "Found Order is " << Order << ".");
// scan through all to determine fragments per order
FragmentsPerOrder.resize(Order);
// for(int i=Order;i--;)
// FragmentsPerOrder[i] = 0;
for(int i=FragmentCounter;i--;) {
Counter=0;
for(int j=AtomCounter[i];j--;)
if (KeySets[i][j] != -1)
Counter++;
FragmentsPerOrder[Counter-1]++;
}
for(int i=0;i FragmentCounter) || (SmallerSet > FragmentCounter)) // index out of bounds
return false;
for(int i=AtomCounter[SmallerSet];i--;) {
intermediate = false;
for (int j=AtomCounter[GreaterSet];j--;)
intermediate = (intermediate || ((KeySets[SmallerSet][i] == KeySets[GreaterSet][j]) || (KeySets[SmallerSet][i] == -1)));
result = result && intermediate;
}
return result;
};
/** Comparison operator for class KeySetsContainer.
*
* @param other instance to compare to
* @return true - both instances are the same in each member variable.
*/
bool KeySetsContainer::operator==(const KeySetsContainer &other) const
{
// compare KeySets
if (KeySets != other.KeySets)
return false;
// compare OrderSet
if (OrderSet != other.OrderSet)
return false;
// compare AtomCounter
if (AtomCounter != other.AtomCounter)
return false;
// compare FragmentCounter
if (FragmentCounter != other.FragmentCounter)
return false;
// compare Order
if (Order != other.Order)
return false;
// compare FragmentsPerOrder
if (FragmentsPerOrder != other.FragmentsPerOrder)
return false;
return true;
}