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 741 by tim, Wed Nov 16 19:42:11 2005 UTC vs.
Revision 1024 by tim, Wed Aug 30 18:42:29 2006 UTC

# Line 13 | Line 13 | GNU General Public License for more details.
13   GNU General Public License for more details.
14   ***********************************************************************/
15  
16 < #include <set>
17 <
18 < #include "mol.hpp"
19 < #include "obconversion.hpp"
20 < #include "obmolecformat.hpp"
21 <
22 < #ifdef HAVE_SSTREAM
23 < #include <sstream>
24 < #else
25 < #include <strstream>
26 < #endif
27 <
28 < using namespace std;
16 > #include "oopseformat.hpp"
17 > #include <fstream>
18   namespace OpenBabel
19   {
20  
32 class OOPSEFormat : public OBMoleculeFormat
33 {
34 public:
35  //Register this format type ID
36  OOPSEFormat()
37  {
38    OBConversion::RegisterFormat("in", this, "chemical/x-in");
39  }
40
41  virtual const char* Description() //required
42  {
43    return
44      "oopse cartesian coordinates format\n";
45  };
46
47  virtual const char* SpecificationURL()
48  { return "";}; //optional
49
50  virtual const char* GetMIMEType()
51  { return "chemical/x-in"; };
52
53   virtual unsigned int Flags() { return WRITEONEONLY;}
54
55  //*** This section identical for most OBMol conversions ***
56  ////////////////////////////////////////////////////
57  /// The "API" interface functions
58  //virtual bool ReadMolecule(OBBase* pOb, OBConversion* pConv);
59  virtual bool WriteMolecule(OBBase* pOb, OBConversion* pConv);
60
61  private:
62      bool AreSameFragments(OBMol& mol, vector<int>& frag1, vector<int>& frag2);
63      void findAngles(OBMol& mol);
64      OBMol* createMolFromFragment(OBMol& mol, vector<int>& fragment);
65      void WriteMDFile(vector<OBMol*> mols, vector<int> numMols);
66      void WriteINFile(OBMol& mol, ostream& ofs, vector<int>& indices);
67 };
68
69
70 //Make an instance of the format class
71 OOPSEFormat theOOPSEFormat;
72
73 ////////////////////////////////////////////////////////////////
74
21   bool OOPSEFormat::WriteMolecule(OBBase* pOb, OBConversion* pConv)
22   {
23      OBMol* pmol = dynamic_cast<OBMol*>(pOb);
# Line 120 | Line 66 | bool OOPSEFormat::WriteMolecule(OBBase* pOb, OBConvers
66          numMols.push_back((*i).size());
67      }
68  
69 <    WriteMDFile(mdMols, numMols);    
69 >    string OutputFileName = pConv->GetInFilename();
70 >    unsigned int pos = OutputFileName.rfind(".");
71 >    if(pos==string::npos)
72 >        OutputFileName += ".md";
73 >    else
74 >        OutputFileName = OutputFileName.substr(0, pos) + ".md";      
75 >    ofstream ofs(OutputFileName.c_str());
76 >    if(!ofs)
77 >    {
78 >         cerr << "Cannot write to " << OutputFileName <<endl;
79 >         return false;
80 >    }
81 >                
82 >    WriteMDFile(mdMols, numMols, ofs, *pmol, indices);
83  
84      for(vector<OBMol*>::iterator  i = mdMols.begin(); i != mdMols.end(); ++i)
85      {
# Line 128 | Line 87 | bool OOPSEFormat::WriteMolecule(OBBase* pOb, OBConvers
87      }
88  
89      //    
131    WriteINFile(*pmol, *pConv->GetOutStream(), indices);
90  
133
134
91      return(true);
92   }
93  
# Line 142 | Line 98 | bool OOPSEFormat::AreSameFragments(OBMol& mol, vector<
98          return false;
99      }
100  
101 <    //exact graph matching is a NP complete problem,
101 >    //exact graph matching is a NP complete problem
102 >    /** @todo using sparse matrix to store the connectivities*/
103      for (unsigned int i =0 ; i < frag1.size(); ++i)
104      {
105 <        if (strcmp(mol.GetAtom(frag1[i])->GetType(), mol.GetAtom(frag2[i])->GetType()) )
105 >        OBAtom* atom1 = mol.GetAtom(frag1[i]);
106 >        OBAtom* atom2 = mol.GetAtom(frag2[i]);
107 >        
108 >        if (atom1->GetAtomicNum() != atom2->GetAtomicNum())
109          {
110              return false;
111          }
# Line 161 | Line 121 | struct SameAngle
121    }
122   };
123  
124 < void OOPSEFormat::findAngles(OBMol& mol)
165 < {
124 >  void OOPSEFormat::findAngles(OBMol& mol) {
125      /*
126      //if already has data return
127      if(mol.HasData(OBGenericDataType::AngleData))
# Line 201 | 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();
213 <        *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)
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 <    ostream& ofs = std::cout;
185 >    unsigned int i;
186      const int BUFFLEN = 1024;
187      char buffer[BUFFLEN];
188      
189 <    for(unsigned int i = 0; i < mols.size(); ++i)
190 <    {
191 <        OBMol* pmol = mols[i];
192 <        map<OBAtom*, int> atomMap;
193 <        ofs << "molecule {\n";
194 <        sprintf(buffer, "%d", i);
195 <        ofs << identLevel1 << "name = " << "\"" << molPrefix << buffer << "\"" << ";\n";
196 <
197 <        
198 <        //atom
199 <        ofs << identLevel1 << "nAtoms = " << pmol->NumAtoms() << ";\n";
200 <        int ai = 0;
201 <        FOR_ATOMS_OF_MOL(atom, *pmol ) {
202 <            ofs << identLevel1 << "atom[" << ai << "] {\n";
203 <            ofs << identLevel2 << "type = " << "\"" << atom->GetType() << "\"" << ";\n";
204 <            ofs << identLevel2 << "position(" << atom->GetX() << ", " << atom->GetY() << ", " << atom->GetZ() << ");\n";
205 <            ofs << identLevel1 << "}\n";
206 <            atomMap[&(*atom)] = ai++;
207 <        }        
208 <
209 <        //bond
210 <        ofs << identLevel1 << "nBonds = " << pmol->NumBonds() << ";\n";
211 <        int bi = 0;
212 <        FOR_BONDS_OF_MOL(bond, *pmol ) {
213 <            ofs << identLevel1 << "bond[" << bi++ << "] {\n";
214 <            ofs << identLevel2 << "member(" << atomMap[bond->GetBeginAtom()] <<  ", " << atomMap[bond->GetEndAtom()] << ");\n";
215 <            ofs << 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 <        ofs << 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 <            ofs << identLevel1 << "bend[" << bendIndex++ << "] {\n";
229 <            ofs << identLevel2 << "member(" << atomMap[bendAtoms.first] <<  ", " << atomMap[bendAtoms.second] << atomMap[bendAtoms.third] <<");\n";
230 <            ofs << identLevel1 << "}\n";            
189 >    
190 >    os << "<OOPSE version=4>" << endl;
191 >    os << "  <MetaData>" << endl << endl;
192 >    
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)
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());            
240 >          vector<quad<OBAtom*,OBAtom*,OBAtom*,OBAtom*> > tmpTorsions = ti->getTorsions();
241 >          torsionArray.insert(torsionArray.end(), tmpTorsions.begin(), tmpTorsions.end());            
242          }
243 <
244 <        ofs << 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)
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 <            ofs << identLevel1 << "torsion[" << torsionIndex++ << "] {\n";
249 <            ofs << identLevel2 << "member(" << atomMap[ti->first] <<  ", " << atomMap[ti->second] <<", " << atomMap[ti->third] <<", " << atomMap[ti->forth] << ");\n";
250 <            ofs << identLevel1 << "}\n";          
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 <        ofs << "}\n";
252 >      */
253 >      os << "}" << endl;
254 >      os << endl;
255 >      
256      }
257 +    
258 +    os << endl;
259  
297    ofs << "nComponents = " << mols.size() << ";\n";
260      
261 <    for(unsigned int i =0; i < mols.size(); ++i)
262 <    {
263 <        ofs << "component{\n";
264 <        sprintf(buffer, "%d", i);
265 <        ofs << "type = " << molPrefix << buffer << ";\n";
266 <        ofs << "nMol = " << numMols[i]<< ";\n";
305 <        ofs << "}\n";
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      }
307 }
308 void OOPSEFormat::WriteINFile(OBMol& mol, ostream& ofs, vector<int>& indices)
309 {
310    unsigned int i;
311    char buffer[BUFF_SIZE];
268      
269 <    sprintf(buffer,"%d", mol.NumAtoms());
270 <    ofs << buffer << endl;
271 <    //sprintf(buffer,"0;%f, 0, 0; 0, %15.7f, 0; 0, 0, %15.7f;", boxx, boxy, boxz);
272 <    sprintf(buffer, "0;%f, 0, 0; 0, %15.7f, 0; 0, 0, %15.7f;", 100.0, 100.0, 100.0);
273 <    ofs << buffer << endl;
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,"%15s%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",
326 <                atom->GetType(),
327 <                atom->GetX(), atom->GetY(), atom->GetZ(),
328 <                0.0, 0.0, 0.0,
329 <                0.0, 0.0, 0.0, 0.0,
330 <                0.0, 0.0, 0.0
331 <                );
332 <        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