00001
00002
00003
00004 #include "fragmentClass.h"
00005
00006
00007 #include <iostream>
00008 #include <iomanip>
00009 #include <sstream>
00010 #include <algorithm>
00011
00012 #include "newTools.h"
00013
00014 FragmentElement::FragmentElement() : _numberOfElectrons(0),_numberOfOA(0),_name("DefaultGroup"),_atoms(),_index(NULL)
00015 {
00016 _centre[0] = _centre[1] = _centre[2] = 0.0 ;
00017 _coinMin[0] = _coinMin[1] = _coinMin[2] = 0.0 ;
00018 _coinMax[0] = _coinMax[1] = _coinMax[2] = 0.0 ;
00019 }
00020 FragmentElement::~FragmentElement()
00021 {}
00022 void FragmentElement::setLoad(){
00023 _numberOfOA = 0 ;
00024 for ( int i = 0 ; i< _atoms.getNumberOfAtoms() ; ++i){
00025 _numberOfOA += giveNumberOfOA( _atoms.getName(i)) ;
00026 }
00027 }
00028
00029 void FragmentElement::writeQCIFile(std::ofstream & out){
00030
00031 out <<" "<<this->_name
00032 << std::setw(15) << this->_centre[0]
00033 << std::setw(15) << this->_centre[1]
00034 << std::setw(15) << this->_centre[2]
00035 << " "<< this->numberOfAtoms() << " ";
00036 int val = 0 ;
00037 for (int i = 0 ; i <this->numberOfAtoms() ; ++i){
00038 val += giveNumberOfOA(_atoms.getName(i) ) ;
00039
00040 }
00041 out<< val << std::endl;
00042
00043 }
00044 void FragmentElement:: setAtoms(const int beginAtom, const int EndAtom, const setOfAtoms &atoms)
00045 {
00046 _atoms.copyFrom(beginAtom,EndAtom,atoms) ;
00047 }
00048
00049
00050
00051
00052 setOfFragments::setOfFragments() : _numberOfFragments(0), _fragments(NULL)
00053 {}
00054 setOfFragments::setOfFragments(const int size) : _numberOfFragments(size),
00055 _fragments(new FragmentElement[size])
00056 {}
00057
00058 setOfFragments::~setOfFragments()
00059 {
00060 if(_fragments != NULL)
00061 {delete [] _fragments ; _fragments = NULL ;}
00062 _numberOfFragments = 0 ;
00063
00064 }
00065 bool setOfFragments::buildFromAtoms(setOfAtoms &atoms)
00066 {
00067
00068 this->_numberOfFragments = atoms.getNumberOfFragments();
00069 std ::cout << "_numberOfFragments " << _numberOfFragments << std::endl;
00070 this->_fragments = new FragmentElement[this->_numberOfFragments] ;
00071
00072
00073
00074 int numberOfAtoms = atoms.getNumberOfAtoms() ;
00075 atomElement currentAtoms ;
00076 std::string frag ;
00077 int beginAtom, EndAtom ;
00078
00079 beginAtom = 0 ;
00080 for ( int i = 0 ; i < this->_numberOfFragments ; ++i){
00081
00082 EndAtom = beginAtom;
00083 frag = atoms.getElement(beginAtom).getFragmentName();
00084 while( EndAtom < numberOfAtoms && atoms.getElement(EndAtom).getFragmentName() == frag )
00085 {
00086 EndAtom++ ;
00087 }
00088 this->_fragments[i]._name.assign(frag) ;
00089 this->_fragments[i]._atoms.setNumberOfAtoms(EndAtom-beginAtom);
00090
00091 this->_fragments[i].setAtoms( beginAtom, EndAtom,atoms);
00092 this->_fragments[i]._atoms.buildGravityCenter(this->_fragments[i]._centre );
00093 this->_fragments[i]._atoms.findMinMax(this->_fragments[i]._coinMin,
00094 this->_fragments[i]._coinMax );
00095 int size = EndAtom - beginAtom ;
00096 this->_fragments[i]._index = new int [ size ] ;
00097 for ( int j = 0 ; j < size ; ++j){
00098 (this->_fragments[i])._index[j] = beginAtom + j ;
00099 }
00100 beginAtom = EndAtom ;
00101 }
00102
00103 int num = 0 ;
00104 for ( int i = 0 ; i < this->_numberOfFragments ; ++i){
00105 num += this->_fragments[i].numberOfAtoms() ;
00106 this->_fragments[i].setLoad() ;
00107 }
00108
00109 _numberOfAtomsInAllFragments = num ;
00110 return true;
00111 }
00112 void setOfFragments::writeQCIFile(std::ofstream & out){
00113
00114
00115
00116 out << this->_numberOfFragments <<std::endl
00117 << "Generated by setOfFragments::writeQCIFile " <<std::endl;
00118
00119 for( int i = 0 ; i < this->_numberOfFragments ; ++i){
00120 this->_fragments[i].writeQCIFile(out) ;
00121 }
00122 }
00123 void setOfFragments::writeToFile(std::ofstream & out){
00124
00125
00126
00127 out << this->_numberOfFragments <<std::endl
00128 << "Generated by setOfFragments::writeToFile " <<std::endl;
00129
00130 int nbAtoms ;
00131 for( int i = 0 ; i < this->_numberOfFragments ; ++i){
00132 FragmentElement & f = this->_fragments[i] ;
00133 nbAtoms = f.numberOfAtoms() ;
00134 out << f._name << " " << nbAtoms <<" " << f.load() << std::endl ;
00135 out << " " << std::setw(12) << f._centre[0] << std::setw(12) << f._centre[1] << std::setw(12) << f._centre[2] <<std::endl
00136 << " " << std::setw(12) << f._coinMin[0] << std::setw(12)<< f._coinMin[1] << std::setw(12) << f._coinMin[2] <<std::endl
00137 << " " << std::setw(12) << f._coinMax[0] << std::setw(12)<< f._coinMax[1] << std::setw(12) << f._coinMax[2] <<std::endl
00138 << " " ;
00139 for(int j = 0; j < nbAtoms ; ++j){
00140 out << f._atoms.getName(j) << " ";
00141 }
00142 out <<std::endl;
00143 out << " " ;
00144 for(int j = 0; j < nbAtoms ; ++j){
00145 out << f._index[j] << " " ;
00146 }
00147 out <<std::endl;
00148 }
00149 }
00150
00151 void setOfFragments::writeUCDFile(std::ofstream & out){
00152
00153
00154
00155 out << "#"<<std::endl
00156 << "# Fragment representation "<< std::endl
00157 << "#" << std::endl << "1" <<std::endl<< "geom" <<std::endl <<"step1" << std::endl
00158 << this->_numberOfFragments << " " << this->_numberOfFragments -1<< std::endl ;
00159
00160
00161
00162 for( int i = 0 ; i < this->_numberOfFragments ; ++i){
00163 FragmentElement & f = this->_fragments[i] ;
00164 out << " "<< i+ 1 << std::setw(12) << f._centre[0] << std::setw(12) << f._centre[1] << std::setw(12) << f._centre[2] <<std::endl ;
00165 }
00166
00167
00168
00169 for( int i = 1 ; i <= this->_numberOfFragments -1; ++i){
00170 out << " "<< i << " 1 line " << i << " "<< std::min(i+1,this->_numberOfFragments) << std::endl ;
00171 }
00172
00173
00174
00175 out << " 1 0 " <<std::endl
00176 << " 1 1 " << std::endl
00177 << "Charge, nbAtoms" << std::endl;
00178 for(int i = 0; i < this->_numberOfFragments ; ++i){
00179 out << " " <<i+1 << " " <<this->_fragments[i].numberOfAtoms() << std::endl ;
00180 }
00181 }
00182