/*
* 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 .
*/
/*
* CopyAtoms_withBonds.cpp
*
* Created on: Mar 17, 2012
* Author: heber
*/
// include config.h
#ifdef HAVE_CONFIG_H
#include
#endif
#include "CodePatterns/MemDebug.hpp"
#include "CopyAtoms_withBonds.hpp"
#include "Bond/bond.hpp"
#include "CodePatterns/Assert.hpp"
#include "CodePatterns/Log.hpp"
#include "molecule.hpp"
#include "WorldTime.hpp"
void CopyAtoms_withBonds::operator()(const AtomVector &_atoms)
{
CopyAtoms_Simple::operator()(_atoms);
// create LookupMap
LookupMap_t LookupMap = createLookup(_atoms);
ASSERT( LookupMap.size() == _atoms.size(),
"CopyAtoms_withBonds::operator() - Lookupmap and original AtomVectors differ in size: "
+toString(LookupMap.size())+" != "+toString(_atoms.size())+".");
ASSERT( LookupMap.size() == CopiedAtoms.size(),
"CopyAtoms_withBonds::operator() - Lookupmap and copied AtomVectors differ in size.: "
+toString(LookupMap.size())+" != "+toString(CopiedAtoms.size())+".");
// then go through the bonds of each original atom
for (AtomVector::const_iterator original_iter = _atoms.begin();
original_iter != _atoms.end(); ++original_iter) {
const BondList ListOfBonds = (*original_iter)->getListOfBonds();
for(BondList::const_iterator iter = ListOfBonds.begin(); iter != ListOfBonds.end(); ++iter) {
// check both bond partners have been copied
const bond::ptr Binder = *iter;
if (*original_iter == Binder->leftatom) {
LookupMap_t::const_iterator leftiter = LookupMap.find(Binder->leftatom);
LookupMap_t::const_iterator rightiter = LookupMap.find(Binder->rightatom);
if ((leftiter != LookupMap.end()) && (rightiter != LookupMap.end())) {
// create new bond, copy its properties, and register with both copies
atom * const LeftAtom = leftiter->second;
atom * const RightAtom = rightiter->second;
bond::ptr const NewBond = LeftAtom->addBond(WorldTime::getTime(), RightAtom);
LOG(3, "DEBUG: Creating copy bond between original " << Binder->leftatom->getId()
<< " and " << Binder->rightatom->getId() << ": " << *NewBond << ".");
NewBond->BondDegree = Binder->BondDegree;
NewBond->Cyclic = Binder->Cyclic;
NewBond->Type = Binder->Type;
} else {
LOG(4, "DEBUG: Skipping bond between original atoms " << Binder->leftatom->getId()
<< " and " << Binder->rightatom->getId() << " as one of them is not present in copied atoms.");
}
} else {
LOG(4, "DEBUG: Skipping bond between original atoms " << Binder->leftatom->getId()
<< " and " << Binder->rightatom->getId() << " due to wrong order.");
}
}
}
// associate cloned atoms with molecule from original atom
for (AtomVector::const_iterator original_iter = _atoms.begin();
original_iter != _atoms.end(); ++original_iter) {
const atom * const _atom = *original_iter;
molecule * const mol = _atom->getMolecule();
if (mol != NULL) {
ASSERT( LookupMap.count(_atom),
"CopyAtoms_withBonds::operator() - atom "+toString(_atom)+" not found in LookupMap.");
mol->AddAtom(LookupMap[_atom]);
}
}
// print copied atoms
if (DoLog(3))
for (AtomVector::const_iterator copy_iter = CopiedAtoms.begin();
copy_iter != CopiedAtoms.end(); ++copy_iter) {
const BondList ListOfBonds = (*copy_iter)->getListOfBonds();
LOG(3, "DEBUG: List of bonds for " << **copy_iter << ": " << ListOfBonds << ".");
}
}