ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/OOPSE-4/src/applications/atom2md/atom2md.cpp
Revision: 2970
Committed: Wed Aug 2 19:40:39 2006 UTC (17 years, 11 months ago) by gezelter
File size: 12921 byte(s)
Log Message:
starting change of file formats

File Contents

# User Rev Content
1 gezelter 2969 /**********************************************************************
2 gezelter 2970 atom2md.cpp - OpenBabel-based conversion program to OOPSE MD file,
3     command-line handling.
4 gezelter 2969
5     Copyright (C) 1998-2001 by OpenEye Scientific Software, Inc.
6     Some portions Copyright (C) 2001-2005 by Geoffrey R. Hutchison
7     Some portions Copyright (C) 2004-2005 by Chris Morley
8    
9 gezelter 2970 This file is part of the OOPSE and Open Babel projects.
10     For more information, see <http://oopse.org> and <http://openbabel.sourceforge.net/>
11 gezelter 2969
12     This program is free software; you can redistribute it and/or modify
13     it under the terms of the GNU General Public License as published by
14     the Free Software Foundation version 2 of the License.
15    
16     This program is distributed in the hope that it will be useful,
17     but WITHOUT ANY WARRANTY; without even the implied warranty of
18     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19     GNU General Public License for more details.
20     ***********************************************************************/
21    
22     #include "config.h"
23     #if HAVE_IOSTREAM
24     #include <iostream>
25     #elif HAVE_IOSTREAM_H
26     #include <iostream.h>
27     #endif
28     #if HAVE_FSTREAM
29     #include <fstream>
30     #elif HAVE_FSTREAM_H
31     #include <fstream.h>
32     #endif
33     #if HAVE_SSTREAM
34     #include <sstream>
35     #elif
36     #include <sstream.h>
37     #endif
38    
39     #include <string>
40     #include <map>
41     #if HAVE_CONIO_H
42     #include <conio.h>
43     #endif
44    
45     #if !HAVE_STRNCASECMP
46     extern "C" int strncasecmp(const char *s1, const char *s2, size_t n);
47     #endif
48    
49     #include "openbabel/obconversion.hpp"
50     #include "brains/Register.hpp"
51    
52     using namespace std;
53     using namespace OpenBabel;
54     using namespace oopse;
55     void DoOption(const char* p, OBConversion& Conv, OBConversion::Option_type typ,
56 gezelter 2970 int& arg, int argc, char *argv[]);
57 gezelter 2969 void usage();
58     void help();
59    
60     // There isn't a great way to do this -- we need to save argv[0] for usage()
61     static char *program_name;
62    
63     int main(int argc,char *argv[])
64     {
65     registerOBFormats();
66     OBConversion Conv(&cin, &cout); //default input and output are console
67 gezelter 2970
68     // string GenOptions;
69 gezelter 2969 OBFormat* pInFormat = NULL;
70     OBFormat* pOutFormat = NULL;
71     vector<string> FileList, OutputFileList;
72     string OutputFileName;
73 gezelter 2970 // obMessageLevel filterLevel = obWarning; // 2 out of 5
74    
75 gezelter 2969 // Parse commandline
76     bool gotInType = false, gotOutType = false;
77     bool UseSavedOptions = false;
78 gezelter 2970
79 gezelter 2969 char *oext;
80     char *iext;
81     string inputExt;
82     string outputExt;
83 gezelter 2970
84 gezelter 2969 //Save name of program without its path (and .exe)
85     string pn(argv[0]);
86     unsigned int pos;
87     #ifdef _WIN32
88     pos = pn.find(".exe");
89     if(pos!=string::npos)
90     argv[0][pos]='\0';
91     #endif
92     pos = pn.find_last_of("/\\");
93     if(pos==string::npos)
94     program_name=argv[0];
95     else
96     program_name=argv[0]+pos+1;
97 gezelter 2970
98     const char* p;
99     int arg;
100     for (arg = 1; arg < argc; arg++)
101     {
102     if (argv[arg])
103     {
104     if (argv[arg][0] == '-')
105     {
106     switch (argv[arg][1])
107     {
108    
109     case 'V':
110     {
111     cout << "atom2md: part of OOPSE " <<
112     OOPSE_VERSION_MAJOR << "." << OOPSE_VERSION_MINOR << "." <<
113     OOPSE_VERSION_TINY << " and Open Babel " << BABEL_VERSION << " -- "
114     << __DATE__ << " -- " << __TIME__ << endl;
115     exit(0);
116     }
117    
118     case 'i':
119     gotInType = true;
120     iext = argv[arg] + 2;
121     if(!*iext)
122     iext = argv[++arg]; //space left after -i: use next argument
123    
124     if (strncasecmp(iext, "MIME", 4) == 0)
125     {
126     // get the MIME type from the next argument
127     iext = argv[++arg];
128     pInFormat = Conv.FormatFromMIME(iext);
129     }
130     else
131     {
132     //The ID provided by the OBFormat class is used as the identifying file extension
133     pInFormat = Conv.FindFormat(iext);
134     }
135     if(pInFormat==NULL)
136     {
137     cerr << program_name << ": cannot read input format!" << endl;
138     usage();
139     }
140     inputExt = iext;
141     break;
142    
143     case 'o':
144     gotOutType = true;
145     oext = argv[arg] + 2;
146     if(!*oext)
147     oext = argv[++arg]; //space left after -i: use next argument
148    
149     if (strncasecmp(oext, "MIME", 4) == 0)
150     {
151     // get the MIME type from the next argument
152     oext = argv[++arg];
153     pOutFormat = Conv.FormatFromMIME(oext);
154     }
155     else
156     pOutFormat = Conv.FindFormat(oext);
157    
158     if(pOutFormat==NULL)
159     {
160     cerr << program_name << ": cannot write output format!" << endl;
161     usage();
162     }
163     outputExt = oext;
164     break;
165    
166     case '?':
167     case 'H':
168     if(isalnum(argv[arg][2]))
169     {
170     if(strncasecmp(argv[arg]+2,"all",3))
171     {
172     OBFormat* pFormat = Conv.FindFormat(argv[arg]+2);
173     if(pFormat)
174     {
175     cout << argv[arg]+2 << " " << pFormat->Description() << endl;
176     if(strlen(pFormat->SpecificationURL()))
177     cout << "Specification at: " << pFormat->SpecificationURL() << endl;
178     }
179     else
180     cout << "Format type: " << argv[arg]+2 << " was not recognized" <<endl;
181     }
182     else
183     {
184     Formatpos pos;
185     OBFormat* pFormat;
186     const char* str=NULL;
187     while(OBConversion::GetNextFormat(pos,str,pFormat))
188     {
189     if((pFormat->Flags() & NOTWRITABLE) && (pFormat->Flags() & NOTREADABLE))
190     continue;
191     cout << str << endl;
192     const char* p = strchr(pFormat->Description(),'\n');
193     cout << p+1; //second line of description
194     if(strlen(pFormat->SpecificationURL()))
195     cout << "Specification at: " << pFormat->SpecificationURL();
196     cout << endl << endl;
197     }
198     }
199     }
200     else
201     help();
202     exit(0);
203    
204    
205     default: //single character general option
206     p = argv[arg]+1;
207     DoOption(p,Conv,OBConversion::GENOPTIONS,arg,argc,argv);
208     break;
209     }
210     }
211     else
212     {
213     //filenames
214     if(!gotOutType)
215     FileList.push_back(argv[arg]);
216     else
217     OutputFileName = argv[arg];
218     }
219     }
220     }
221    
222 gezelter 2969 //user didn't specify input and output format in commandline option
223     //try to parse it from program name (pdb2mdin means input format is pdb, output format is mdin)
224     string formatName(program_name);
225     pos = formatName.find_first_of("2");
226     if(pos!=string::npos) {
227     if (!gotInType)
228 gezelter 2970 {
229 gezelter 2969 string tmpExt = formatName.substr(0, pos);
230     pInFormat = Conv.FindFormat(tmpExt.c_str());
231 gezelter 2970 if(pInFormat==NULL)
232     {
233     cerr << program_name << ": cannot read input format!" << endl;
234     usage();
235     } else
236     {
237 gezelter 2969 gotInType = true;
238     inputExt = tmpExt;
239 gezelter 2970 }
240     }
241    
242 gezelter 2969 if (!gotOutType)
243 gezelter 2970 {
244 gezelter 2969 string tmpExt = formatName.substr(pos+1, string::npos);
245     pOutFormat = Conv.FindFormat(tmpExt.c_str());
246 gezelter 2970 if(pOutFormat==NULL)
247     {
248     cerr << program_name << ": cannot write output format!" << endl;
249     usage();
250     }else {
251     gotOutType = true;
252     outputExt = tmpExt;
253     }
254     }
255 gezelter 2969 }
256 gezelter 2970
257     if(FileList.empty())
258 gezelter 2969 {
259 gezelter 2970 cerr << "No input file or format spec!" <<endl;
260     usage();
261 gezelter 2969 }
262 gezelter 2970
263     if (OutputFileName.empty())
264     {
265     pos = FileList.front().rfind(".");
266     if(pos==string::npos)
267     OutputFileName = FileList.front()+ "." + outputExt;
268     else
269     OutputFileName = FileList.front().substr(0, pos) + "." + outputExt;
270 gezelter 2969 }
271    
272     Conv.SetInAndOutFormats(pInFormat,pOutFormat);
273 gezelter 2970
274    
275 gezelter 2969 // send info message to clog -- don't mess up cerr or cout for user programs
276     int count = Conv.FullConvert(FileList, OutputFileName, OutputFileList);
277     if ( count == 1 )
278     clog << count << " molecule converted" << endl;
279     else
280     clog << count << " molecules converted" << endl;
281    
282     if(OutputFileList.size()>1)
283 gezelter 2970 {
284     clog << OutputFileList.size() << " files output. The first is " << OutputFileList[0] <<endl;
285     }
286    
287 gezelter 2969 #ifdef _DEBUG
288     //CM keep window open
289     cout << "Press any key to finish" <<endl;
290     getch();
291     #endif
292    
293     return 0;
294     }
295    
296     void DoOption(const char* p, OBConversion& Conv, OBConversion::Option_type typ, int& arg, int argc, char *argv[])
297     {
298 gezelter 2970 while(p && *p) //can have multiple single char options
299     {
300     char ch[2]="?";
301     *ch = *p++;
302     const char* txt=NULL;
303     //Get the option text if needed
304     int nParams = Conv.GetOptionParams(ch, typ);
305     if(nParams)
306     {
307     if(*p)
308     {
309     txt = p; //use text immediately following the option letter
310     p=NULL; //no more single char options
311     }
312     else if(arg<argc-1)
313     {
314     txt = argv[++arg]; //use text from next arg
315     if(*txt=='-')
316     {
317     //...unless it is another option
318     cerr << "Option -" << ch << " takes a parameter" << endl;
319     exit(0);
320     }
321     }
322     }
323     Conv.AddOption(ch, typ, txt);
324     }
325 gezelter 2969 }
326    
327     void usage()
328     {
329 gezelter 2970 cout << "atom2md: part of OOPSE " <<
330     OOPSE_VERSION_MAJOR << "." << OOPSE_VERSION_MINOR << "." <<
331     OOPSE_VERSION_TINY << " and Open Babel " << BABEL_VERSION << " -- "
332     << __DATE__ << " -- " << __TIME__ << endl;
333 gezelter 2969 cout << "Usage: " << program_name
334     << " [-i<input-type>] <name> [-o<output-type>] <name>" << endl;
335     cout << "Try -H option for more information." << endl;
336     /*
337     #ifdef _DEBUG
338     //CM keep window open
339     cout << "Press any key to finish" <<endl;
340     getch();
341     #endif
342     */
343     exit (0);
344     }
345    
346     void help()
347     {
348     cout << "Open Babel converts chemical structures from one file format to another"<< endl << endl;
349     cout << "Usage: " << program_name << " <input spec> <output spec> [Options]" << endl << endl;
350     cout << "Each spec can be a file whose extension decides the format." << endl;
351     cout << "Optionally the format can be specified by preceding the file by" << endl;
352     cout << "-i<format-type> e.g. -ipdb, for input and -o<format-type> for output" << endl << endl;
353     cout << "See below for available format-types, which are the same as the " << endl;
354     cout << "file extensions and are case independent." << endl;
355     cout << "If no input or output file is given stdin or stdout are used instead." << endl << endl;
356     cout << "More than one input file can be specified and their names can contain" <<endl;
357     cout << "wildcard chars (* and ?).The molecules are aggregated in the output file.\n" << endl;
358     cout << OBConversion::Description(); // Conversion options
359     cout << " -H Outputs this help text" << endl;
360     cout << " -Hxxx (xxx is file format ID e.g. -Hpdb) gives format info" <<endl;
361     cout << " -Hall Outputs details of all formats" <<endl;
362     cout << " -V Outputs version number" <<endl;
363    
364    
365     OBFormat* pDefault = OBConversion::GetDefaultFormat();
366 gezelter 2970 if(pDefault)
367     cout << pDefault->TargetClassDescription();// some more options probably for OBMol
368 gezelter 2969
369 gezelter 2970 OBFormat* pAPI= OBConversion::FindFormat("obapi");
370     if(pAPI)
371     cout << pAPI->Description();
372    
373     cout << "The following file formats are recognized:" << endl;
374 gezelter 2969 Formatpos pos;
375     OBFormat* pFormat;
376     const char* str=NULL;
377     while(OBConversion::GetNextFormat(pos,str,pFormat))
378 gezelter 2970 {
379     if((pFormat->Flags() & NOTWRITABLE) && (pFormat->Flags() & NOTREADABLE))
380     continue;
381     cout << " " << str << endl;
382     }
383 gezelter 2969 cout << "\nSee further specific info and options using -H<format-type>, e.g. -Hpdb" << endl;
384     }
385    

Properties

Name Value
svn:executable *