ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/OpenMD/trunk/src/openbabel/oopseformat.cpp
(Generate patch)

Comparing trunk/src/openbabel/oopseformat.cpp (file contents):
Revision 770 by tim, Fri Dec 2 15:38:03 2005 UTC vs.
Revision 1024 by tim, Wed Aug 30 18:42:29 2006 UTC

# Line 79 | Line 79 | bool OOPSEFormat::WriteMolecule(OBBase* pOb, OBConvers
79           return false;
80      }
81                  
82 <    WriteMDFile(mdMols, numMols, ofs);    
82 >    WriteMDFile(mdMols, numMols, ofs, *pmol, indices);
83  
84      for(vector<OBMol*>::iterator  i = mdMols.begin(); i != mdMols.end(); ++i)
85      {
# Line 87 | Line 87 | bool OOPSEFormat::WriteMolecule(OBBase* pOb, OBConvers
87      }
88  
89      //    
90    WriteINFile(*pmol, *pConv->GetOutStream(), indices);
90  
92
93
91      return(true);
92   }
93  
# Line 124 | Line 121 | struct SameAngle
121    }
122   };
123  
124 < void OOPSEFormat::findAngles(OBMol& mol)
128 < {
124 >  void OOPSEFormat::findAngles(OBMol& mol) {
125      /*
126      //if already has data return
127      if(mol.HasData(OBGenericDataType::AngleData))
# Line 164 | Line 160 | void OOPSEFormat::findAngles(OBMol& mol)
160          angles->SetData(angle);
161      }
162      */
163 < }
164 < OBMol* OOPSEFormat::createMolFromFragment(OBMol& mol, vector<int>& fragment)
165 < {
163 >  }
164 >
165 >  OBMol* OOPSEFormat::createMolFromFragment(OBMol& mol, vector<int>& fragment) {
166 >    
167      OBMol* newMol = new OBMol();
168      newMol->ReserveAtoms(fragment.size());
169      newMol->BeginModify();
170 <    for(vector<int>::iterator i = fragment.begin(); i != fragment.end(); ++i)
171 <    {
172 <        OBAtom* newAtom = newMol->NewAtom();
176 <        *newAtom = *mol.GetAtom(*i);
170 >    for(vector<int>::iterator i = fragment.begin(); i != fragment.end(); ++i) {
171 >      OBAtom* newAtom = newMol->NewAtom();
172 >      *newAtom = *mol.GetAtom(*i);
173      }
174      newMol->EndModify();
175      newMol->ConnectTheDots();
176      findAngles(*newMol);
177      newMol->FindTorsions();
178      return newMol;
179 < }
180 < void OOPSEFormat::WriteMDFile(vector<OBMol*> mols, vector<int> numMols, ostream& os)
181 < {
182 <    std::string identLevel1("\t");
183 <    std::string identLevel2("\t\t");
179 >  }
180 >  
181 >  void OOPSEFormat::WriteMDFile(vector<OBMol*> mols, vector<int> numMols, ostream& os, OBMol& mol, vector<int>& indices) {
182 >    std::string indentLevel1("  ");
183 >    std::string indentLevel2("    ");
184      std::string molPrefix("MolName");
185 +    unsigned int i;
186      const int BUFFLEN = 1024;
187      char buffer[BUFFLEN];
188      
192    for(unsigned int i = 0; i < mols.size(); ++i)
193    {
194        OBMol* pmol = mols[i];
195        map<OBAtom*, int> atomMap;
196        os << "molecule {\n";
197        sprintf(buffer, "%d", i);
198        os << identLevel1 << "name = " << "\"" << molPrefix << buffer << "\"" << ";\n";
199
200        
201        //atom
202        int ai = 0;
203        FOR_ATOMS_OF_MOL(atom, *pmol ) {
204            os << identLevel1 << "atom[" << ai << "] {\n";
205            os << identLevel2 << "type = " << "\"" << etab.GetSymbol(atom->GetAtomicNum()) << "\"" << ";\n";
206            os << identLevel1 << "}\n";
207            atomMap[&(*atom)] = ai++;
208        }        
209        os << "\n";
210
211        //bond
212        FOR_BONDS_OF_MOL(bond, *pmol ) {
213            os << identLevel1 << "bond {\n";
214            os << identLevel2 << "members(" << atomMap[bond->GetBeginAtom()] <<  ", " << atomMap[bond->GetEndAtom()] << ");\n";
215            os << identLevel1 << "}\n";
216        }  
217        /*
218        //bend
219        OBGenericData* pGenericData = pmol->GetData(OBGenericDataType::AngleData);
220        OBAngleData* pAngleData = dynamic_cast<OBAngleData*>(pGenericData);
221        vector<OBAngle> angles = pAngleData->GetData();
222
223        os << identLevel1 << "nBends = " << angles.size() << ";\n";        
224        int bendIndex = 0;
225        for (vector<OBAngle>::iterator ti = angles.begin(); ti != angles.end(); ++ti)
226        {
227            triple<OBAtom*, OBAtom*, OBAtom*> bendAtoms = ti->getAtoms();
228            os << identLevel1 << "bend[" << bendIndex++ << "] {\n";
229            os << identLevel2 << "member(" << atomMap[bendAtoms.first] <<  ", " << atomMap[bendAtoms.second] << atomMap[bendAtoms.third] <<");\n";
230            os << identLevel1 << "}\n";            
231        }
232        
233        //torsion
234        pGenericData = pmol->GetData(OBGenericDataType::TorsionData);
235        OBTorsionData* pTorsionData = dynamic_cast<OBTorsionData*>(pGenericData);
236        vector<OBTorsion> torsions = pTorsionData->GetData();
237        vector<quad<OBAtom*,OBAtom*,OBAtom*,OBAtom*> > torsionArray;
238        for (vector<OBTorsion>::iterator ti = torsions.begin(); ti != torsions.end(); ++ti)
239        {
240            vector<quad<OBAtom*,OBAtom*,OBAtom*,OBAtom*> > tmpTorsions = ti->getTorsions();
241            torsionArray.insert(torsionArray.end(), tmpTorsions.begin(), tmpTorsions.end());            
242        }
243
244        os << identLevel1 << "nTorsions = " << torsionArray.size() << ";\n";
245        int torsionIndex = 0;
246        for (vector<quad<OBAtom*,OBAtom*,OBAtom*,OBAtom*> >::iterator ti = torsionArray.begin(); ti != torsionArray.end(); ++ti)
247        {
248            os << identLevel1 << "torsion[" << torsionIndex++ << "] {\n";
249            os << identLevel2 << "member(" << atomMap[ti->first] <<  ", " << atomMap[ti->second] <<", " << atomMap[ti->third] <<", " << atomMap[ti->forth] << ");\n";
250            os << identLevel1 << "}\n";          
251        }
252        */
253        os << "}\n";
254        os << "\n";
255
256    }
257
258    os << "\n";
259    os << "nComponents = " << mols.size() << ";\n";
189      
190 <    for(unsigned int i =0; i < mols.size(); ++i)
191 <    {
263 <        os << "component{\n";
264 <        sprintf(buffer, "%d", i);
265 <        os << "type = " << molPrefix << buffer << ";\n";
266 <        os << "nMol = " << numMols[i]<< ";\n";
267 <        os << "}\n";
268 <    }
269 < }
270 < void OOPSEFormat::WriteINFile(OBMol& mol, ostream& ofs, vector<int>& indices)
271 < {
272 <    unsigned int i;
273 <    char buffer[BUFF_SIZE];
190 >    os << "<OOPSE version=4>" << endl;
191 >    os << "  <MetaData>" << endl << endl;
192      
193 <    sprintf(buffer,"%d", mol.NumAtoms());
194 <    ofs << buffer << endl;
195 <    //sprintf(buffer,"0;%f, 0, 0; 0, %15.7f, 0; 0, 0, %15.7f;", boxx, boxy, boxz);
196 <    sprintf(buffer, "0;%f, 0, 0; 0, %15.7f, 0; 0, 0, %15.7f;", 100.0, 100.0, 100.0);
197 <    ofs << buffer << endl;
193 >    for(i = 0; i < mols.size(); ++i) {
194 >      OBMol* pmol = mols[i];
195 >      map<OBAtom*, int> atomMap;
196 >      os << "molecule {\n";
197 >      sprintf(buffer, "%d", i);
198 >      os << indentLevel1 << "name = " << "\"" << molPrefix << buffer << "\"" << ";\n";
199 >      
200 >      
201 >      //atom
202 >      int ai = 0;
203 >      FOR_ATOMS_OF_MOL(atom, *pmol ) {
204 >        os << indentLevel1 << "atom[" << ai << "] {\n";
205 >        os << indentLevel2 << "type = " << "\"" << etab.GetSymbol(atom->GetAtomicNum()) << "\"" << ";\n";
206 >        os << indentLevel1 << "}\n";
207 >        atomMap[&(*atom)] = ai++;
208 >      }        
209 >      os << "\n";
210 >      
211 >      //bond
212 >      FOR_BONDS_OF_MOL(bond, *pmol ) {
213 >        os << indentLevel1 << "bond {\n";
214 >        os << indentLevel2 << "members(" << atomMap[bond->GetBeginAtom()] <<  ", " << atomMap[bond->GetEndAtom()] << ");\n";
215 >        os << indentLevel1 << "}\n";
216 >      }  
217 >      /*
218 >      //bend
219 >      OBGenericData* pGenericData = pmol->GetData(OBGenericDataType::AngleData);
220 >      OBAngleData* pAngleData = dynamic_cast<OBAngleData*>(pGenericData);
221 >      vector<OBAngle> angles = pAngleData->GetData();
222 >      
223 >      os << indentLevel1 << "nBends = " << angles.size() << ";\n";        
224 >      int bendIndex = 0;
225 >      for (vector<OBAngle>::iterator ti = angles.begin(); ti != angles.end(); ++ti)
226 >        {
227 >          triple<OBAtom*, OBAtom*, OBAtom*> bendAtoms = ti->getAtoms();
228 >          os << indentLevel1 << "bend[" << bendIndex++ << "] {\n";
229 >          os << indentLevel2 << "member(" << atomMap[bendAtoms.first] <<  ", " << atomMap[bendAtoms.second] << atomMap[bendAtoms.third] <<");\n";
230 >          os << indentLevel1 << "}\n";            
231 >        }
232 >      
233 >      //torsion
234 >      pGenericData = pmol->GetData(OBGenericDataType::TorsionData);
235 >      OBTorsionData* pTorsionData = dynamic_cast<OBTorsionData*>(pGenericData);
236 >      vector<OBTorsion> torsions = pTorsionData->GetData();
237 >      vector<quad<OBAtom*,OBAtom*,OBAtom*,OBAtom*> > torsionArray;
238 >      for (vector<OBTorsion>::iterator ti = torsions.begin(); ti != torsions.end(); ++ti)
239 >        {
240 >          vector<quad<OBAtom*,OBAtom*,OBAtom*,OBAtom*> > tmpTorsions = ti->getTorsions();
241 >          torsionArray.insert(torsionArray.end(), tmpTorsions.begin(), tmpTorsions.end());            
242 >        }
243 >      
244 >      os << indentLevel1 << "nTorsions = " << torsionArray.size() << ";\n";
245 >      int torsionIndex = 0;
246 >      for (vector<quad<OBAtom*,OBAtom*,OBAtom*,OBAtom*> >::iterator ti = torsionArray.begin(); ti != torsionArray.end(); ++ti)
247 >        {
248 >          os << indentLevel1 << "torsion[" << torsionIndex++ << "] {\n";
249 >          os << indentLevel2 << "member(" << atomMap[ti->first] <<  ", " << atomMap[ti->second] <<", " << atomMap[ti->third] <<", " << atomMap[ti->forth] << ");\n";
250 >          os << indentLevel1 << "}\n";          
251 >        }
252 >      */
253 >      os << "}" << endl;
254 >      os << endl;
255 >      
256 >    }
257 >    
258 >    os << endl;
259  
260 +    
261 +    for(i=0; i < mols.size(); ++i) {      
262 +      os << "component{" << endl;
263 +      sprintf(buffer, "%d", i);
264 +      os << indentLevel1 << "type = " << molPrefix << buffer << ";" << endl;
265 +      os << indentLevel1 << "nMol = " << numMols[i]<< ";" << endl;
266 +      os << "}" << endl;
267 +    }
268 +    
269 +    os << "  </MetaData>" << endl;
270 +    os << "  <Snapshot>" << endl;
271 +    os << "    <FrameData>" << endl;
272 +    
273 +    sprintf(buffer, "        Time: %.10g", 0.0);
274 +    
275 +    os << buffer << endl;
276 +
277 +    sprintf(buffer, "        Hmat: {{ %.10g, %.10g, %.10g }, { %.10g, %.10g, %.10g }, { %.10g, %.10g, %.10g }}", 100.0, 0.0, 0.0, 0.0, 100.0, 0.0, 0.0, 0.0, 100.0);
278 +
279 +    os << buffer << endl;
280 +    os << "    </FrameData>" << endl;
281 +    os << "    <StuntDoubles>" << endl;
282 +
283      OBAtom *atom;
284      string str,str1;
285      
286 <    for(vector<int>::iterator i = indices.begin();i != indices.end(); ++i)
287 <    {
288 <        atom = mol.GetAtom(*i);
289 <        sprintf(buffer,"%-10s%-15.5f%-15.5f%-15.5f%-15.5f%-15.5f%-15.5f%-15.5f%-15.5f%-15.5f%-15.5f%-15.5f%-15.5f%-15.5f",
288 <                etab.GetSymbol(atom->GetAtomicNum()),
289 <                atom->GetX(), atom->GetY(), atom->GetZ(),
290 <                0.0, 0.0, 0.0,
291 <                0.0, 0.0, 0.0, 0.0,
292 <                0.0, 0.0, 0.0
293 <                );
294 <        ofs << buffer << endl;
286 >    for(vector<int>::iterator i = indices.begin();i != indices.end(); ++i) {    
287 >      atom = mol.GetAtom(*i);
288 >      sprintf(buffer, "%d\tpv\t%18.10g\t%18.10g\t%18.10g\t%14.10g\t%14.10g\t%14.10g", *i - 1, atom->GetX(), atom->GetY(), atom->GetZ(), 0.0, 0.0, 0.0);
289 >      os << buffer << endl;
290      }
291 <    
291 >    os << "    </StuntDoubles>" << endl;
292 >    os << "  </Snapshot>" << endl;
293 >    os << "</OOPSE>" << endl;
294   }
295 <
295 >  
296   } //namespace OpenBabel
297  

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines