extern "C" char * ob_mol_to_canonical_smiles (char *molfile, int omit_iso_and_chiral_markings) { OBMol mol; OBConversion conv; string tmpStr (molfile); string outstring; istringstream molstream (tmpStr); ostringstream smilesstream; char *tmpSmiles; conv.SetInAndOutFormats ("MDL", "CAN"); conv.AddOption ("n", OBConversion::OUTOPTIONS); //conv.AddOption ("c", OBConversion::OUTOPTIONS); if (omit_iso_and_chiral_markings != 0) { conv.AddOption ("i", OBConversion::OUTOPTIONS); } conv.Read (&mol, &molstream); if (mol.Empty ()) return NULL; conv.Write (&mol, &smilesstream); outstring = smilesstream.str (); outstring = outstring.substr (0, outstring.length () - 1); tmpSmiles = strdup (outstring.c_str ()); return (tmpSmiles); }
extern "C" char * ob_V3000_to_mol (char *V3000) { OBMol mol; OBConversion conv; string tmpStr (V3000); string outstring; istringstream V3000stream (tmpStr); ostringstream molstream; char *tmpMolfile; conv.SetInAndOutFormats ("MDL", "MDL"); conv.AddOption ("3", OBConversion::INOPTIONS); conv.AddOption ("2", OBConversion::OUTOPTIONS); conv.Read (&mol, &V3000stream); conv.Write (&mol, &molstream); outstring = molstream.str (); // remove the trailling $$$$\n from the SDFile if (outstring.find ("$$$$\n", 0) != string::npos) { outstring = outstring.substr (0, outstring.length () - 5); } else if (outstring.find ("$$$$\r\n", 0) != string::npos) { outstring = outstring.substr (0, outstring.length () - 6); } tmpMolfile = strdup (outstring.c_str ()); return (tmpMolfile); }
void DoOption(const char* p, OBConversion& Conv, OBConversion::Option_type typ, int& arg, int argc, char *argv[]) { while(p && *p) //can have multiple single char options { char ch[2]="?"; *ch = *p++; const char* txt=NULL; //Get the option text if needed int nParams = Conv.GetOptionParams(ch, typ); if(nParams) { if(*p) { txt = p; //use text immediately following the option letter p=NULL; //no more single char options } else if(arg<argc-1) { txt = argv[++arg]; //use text from next arg if(*txt=='-') { //...unless it is another option cerr << "Option -" << ch << " takes a parameter" << endl; exit(0); } } } Conv.AddOption(ch, typ, txt); } }
void testPdbOccupancies() { // See https://github.com/openbabel/openbabel/pull/1558 OBConversion conv; OBMol mol; conv.SetInFormat("cif"); conv.SetOutFormat("pdb"); conv.ReadFile(&mol, GetFilename("test08.cif")); string pdb = conv.WriteString(&mol); conv.AddOption("o", OBConversion::OUTOPTIONS); pdb = conv.WriteString(&mol); OB_ASSERT(pdb.find("HETATM 1 NA UNL 1 0.325 0.000 4.425 0.36") != string::npos); OB_ASSERT(pdb.find("HETATM 17 O UNL 8 1.954 8.956 3.035 1.00") != string::npos); OBMol mol_pdb; conv.SetInFormat("pdb"); conv.ReadFile(&mol_pdb, GetFilename("test09.pdb")); pdb = conv.WriteString(&mol_pdb); OB_ASSERT(pdb.find("HETATM 1 NA UNL 1 0.325 0.000 4.425 0.36") != string::npos); OB_ASSERT(pdb.find("HETATM 2 NA UNL 1 0.002 8.956 1.393 0.10") != string::npos); OB_ASSERT(pdb.find("HETATM 17 O UNL 8 1.954 8.956 3.035 1.00") != string::npos); }
Molecule * OpenbabelWrapper::openFile(const QString &fileName, const QString &fileType, const QString &fileOptions) { // Check that the file can be read from disk if (!canOpen(fileName, QFile::ReadOnly | QFile::Text)) return 0; // Construct the OpenBabel objects, set the file type OBConversion conv; OBFormat *inFormat; if (!fileType.isEmpty() && !conv.SetInFormat(fileType.toAscii().data())) // Input format not supported return 0; else { inFormat = conv.FormatFromExt(fileName.toAscii().data()); if (!conv.SetInFormat(inFormat)) // Input format not supported return 0; } // set any options if (!fileOptions.isEmpty()) { foreach(const QString &option, fileOptions.split('\n', QString::SkipEmptyParts)) { conv.AddOption(option.toAscii().data(), OBConversion::INOPTIONS); } }
void testPdbRemSpacesHMName() { // See https://github.com/openbabel/openbabel/pull/1558 OBConversion conv; OBMol mol; conv.SetInFormat("cif"); conv.SetOutFormat("pdb"); conv.ReadFile(&mol, GetFilename("test07.cif")); string pdb = conv.WriteString(&mol); conv.AddOption("o", OBConversion::OUTOPTIONS); pdb = conv.WriteString(&mol); OB_ASSERT(pdb.find("I41/amd:2") != string::npos); }
void testPdbOutHexagonalAlternativeOrigin2() { // See https://github.com/openbabel/openbabel/pull/1558 OBConversion conv; OBMol mol; conv.SetInFormat("cif"); conv.SetOutFormat("pdb"); conv.ReadFile(&mol, GetFilename("test06.cif")); string pdb = conv.WriteString(&mol); conv.AddOption("o", OBConversion::OUTOPTIONS); pdb = conv.WriteString(&mol); OB_ASSERT(pdb.find("H -3 m") != string::npos); }
void testPdbOutAlternativeOrigin() { // See https://github.com/openbabel/openbabel/pull/1558 OBConversion conv; OBMol mol; conv.SetInFormat("cif"); conv.SetOutFormat("pdb"); conv.ReadFile(&mol, GetFilename("test04.cif")); string pdb = conv.WriteString(&mol); // ending space is needed to check that there is no origin set OB_ASSERT(pdb.find("P 4/n b m ") != string::npos); conv.AddOption("o", OBConversion::OUTOPTIONS); pdb = conv.WriteString(&mol); OB_ASSERT(pdb.find("P 4/n b m:1") != string::npos); }
bool OpReadConformers::ProcessVec(std::vector<OBBase*>& vec) { // DeferredFormat collects all the molecules, they are processed here, and Deferred Format outputs them OBConversion smconv; smconv.AddOption("n"); if(!smconv.SetOutFormat("smi")) { obErrorLog.ThrowError(__FUNCTION__, "SmilesFormat is not loaded" , obError, onceOnly); return false; } std::string smiles, stored_smiles; OBMol* stored_pmol=NULL; std::vector<OBBase*>::iterator iter; for(iter= vec.begin();iter!=vec.end();++iter) { OBMol* pmol = dynamic_cast<OBMol*>(*iter); if(!pmol) continue; smiles = smconv.WriteString(pmol); Trim(smiles); if(stored_smiles==smiles) { //add the coordinates of the current mol to the stored one as a conformer, and delete current mol double *confCoord = new double [pmol->NumAtoms() * 3]; memcpy((char*)confCoord,(char*)pmol->GetCoordinates(),sizeof(double)*3*pmol->NumAtoms()); stored_pmol->AddConformer(confCoord); delete pmol; *iter = NULL; } else { stored_pmol = pmol; stored_smiles = smiles; } } //erase the NULLS vec.erase(std::remove(vec.begin(),vec.end(), (void*)NULL), vec.end()); return true; }
void DoOption(const char* p, OBConversion& Conv, OBConversion::Option_type typ, int& arg, int argc, char *argv[]) { //Unlike babel, cannot have multiple concatenated single char options //accepts: -sCCC -s CCC -s"CCC" -s CCC red -sCCC red char ch[2]="?"; *ch = *p++; std::string txt; //Get the option text if(*p) txt = p; //use text immediately following the option letter, and keep looking while(arg<argc-1 && *argv[arg+1]!='-') { //use text from subsequent args if(!txt.empty())txt += ' '; //..space separated if more than one txt += argv[++arg]; } Conv.AddOption(ch, typ, txt.c_str()); }
int main(int argc,char *argv[]) { OBConversion Conv(&cin, &cout); //default input and output are console OBFormat* pInFormat = NULL; OBFormat* pOutFormat = NULL; vector<string> FileList, OutputFileList; string OutputFileName; // Parse commandline bool gotInType = false, gotOutType = false; bool SplitOrBatch=false; char *oext = NULL; char *iext = NULL; //Save name of program without its path (and .exe) string pn(argv[0]); string::size_type pos; #ifdef _WIN32 pos = pn.find(".exe"); if(pos!=string::npos) argv[0][pos]='\0'; #endif pos = pn.find_last_of("/\\"); if(pos==string::npos) program_name=argv[0]; else program_name=argv[0]+pos+1; const char* p; int arg; for (arg = 1; arg < argc; ++arg) { if (argv[arg]) { if (argv[arg][0] == '-') { char opchar[2]="?"; opchar[0]=argv[arg][1]; switch (opchar[0]) { case 'V': { cout << "Open Babel " << BABEL_VERSION << " -- " << __DATE__ << " -- " << __TIME__ << endl; exit(0); } case 'i': //Parameter is the input format which overrides any file extensions gotInType = true; iext = argv[arg] + 2; if(!*iext) iext = argv[++arg]; //space left after -i: use next argument if (strncasecmp(iext, "MIME", 4) == 0) { // get the MIME type from the next argument iext = argv[++arg]; pInFormat = Conv.FormatFromMIME(iext); } else pInFormat = Conv.FindFormat(iext); if(pInFormat==NULL) { cerr << program_name << ": cannot read input format!" << endl; usage(); } break; case 'o': //Parameter is the output format which overrides any file extension gotOutType = true; oext = argv[arg] + 2; if(!*oext) oext = argv[++arg]; //space left after -i: use next argument if (strncasecmp(oext, "MIME", 4) == 0) { // get the MIME type from the next argument oext = argv[++arg]; pOutFormat = Conv.FormatFromMIME(oext); } else pOutFormat = Conv.FindFormat(oext); if(pOutFormat==NULL) { cerr << program_name << ": cannot write output format!" << endl; usage(); } break; case 'O': OutputFileName = argv[arg] + 2; if(OutputFileName.size()<3) OutputFileName = argv[++arg]; //space left after -O: use next argument break; case 'L': //display a list of plugin type or classes { const char* param=NULL; if(argc>arg+1) param = argv[arg+2]; // First assume first arg is a plugin type and // param is a subtype, like babel -L ops gen3D // or first arg is a plugin ID, like babel -L cml OBPlugin* plugin; if(OBPlugin::GetPlugin("plugins", argv[arg+1]) && (plugin = OBPlugin::GetPlugin(argv[arg+1], param)) || (plugin = OBPlugin::GetPlugin(NULL, argv[arg+1]))) { //Output details of subtype string txt; plugin->Display(txt, "verbose", argv[arg+1]); cout << "One of the " << plugin->TypeID() << '\n' << txt << endl; return 0; } //...otherwise assume it is a plugin type, like babel -L forcefields //Output list of subtypes OBPlugin::List(argv[arg+1], param); return 0; } case '?': case 'H': if(isalnum(argv[arg][2]) || arg==argc-2) { if(strncasecmp(argv[arg]+2,"all",3)) { OBFormat* pFormat = (arg==argc-2) ? Conv.FindFormat(argv[arg+1]) : Conv.FindFormat(argv[arg]+2); if(pFormat) { cout << argv[arg]+2 << " " << pFormat->Description() << endl; if(pFormat->Flags() & NOTWRITABLE) cout << " This format is Read-only" << endl; if(pFormat->Flags() & NOTREADABLE) cout << " This format is Write-only" << endl; if(strlen(pFormat->SpecificationURL())) cout << "Specification at: " << pFormat->SpecificationURL() << endl; } else cout << "Format type: " << argv[arg]+2 << " was not recognized" <<endl; } else { OBPlugin::List("formats","verbose"); } } else help(); return 0; case '-': //long option --name text { //Option's text is in the next and subsequent args, until one starts with - char* nam = argv[arg]+2; if(!strcasecmp(nam, "help")) //special case handled here { help(); return 0; } if(*nam != '\0') //Do nothing if name is empty { string txt; while(arg<argc-1 && *argv[arg+1]!='-') { //use text from subsequent args if(!txt.empty())txt += ' '; //..space separated if more than one txt += argv[++arg]; } // If a API directive, e.g.---errorlevel // send to the pseudoformat "obapi" (without any leading -) if(*nam=='-') { OBConversion apiConv; OBFormat* pAPI= OBConversion::FindFormat("obapi"); if(pAPI) { apiConv.SetOutFormat(pAPI); apiConv.AddOption(nam+1, OBConversion::GENOPTIONS, txt.c_str()); apiConv.Write(NULL, &std::cout); } } else // Is a normal long option name, e.g --addtotitle Conv.AddOption(nam,OBConversion::GENOPTIONS,txt.c_str()); } } break; case 'm': //multiple output files SplitOrBatch=true; break; case 'a': //single character input option p = argv[arg]+2; DoOption(p,Conv,OBConversion::INOPTIONS,arg,argc,argv); break; case 'x': //single character output option p = argv[arg]+2; DoOption(p,Conv,OBConversion::OUTOPTIONS,arg,argc,argv); break; //Not essential, but allows these options to be before input filenames //since we know they take one parameter, and are the most likely options to be misplaced case 'f': case 'l': p = argv[arg] + 2; if(!*p) p = argv[++arg]; //space left after -f: use next argument Conv.AddOption(opchar, OBConversion::GENOPTIONS, p); break; case ':': //e.g. -:c1ccccc1. SMILES passed as a file name and handled in OBConversion FileList.push_back(argv[arg]); break; default: //single character general option p = argv[arg]+1; DoOption(p,Conv,OBConversion::GENOPTIONS,arg,argc,argv); break; } } else //filenames FileList.push_back(argv[arg]); } } #ifdef _WIN32 //Expand wildcards in input filenames and add to FileList vector<string> tempFileList(FileList); FileList.clear(); vector<string>::iterator itr; for(itr=tempFileList.begin();itr!=tempFileList.end();++itr) { if((*itr)[0]=='-') FileList.push_back(*itr); else DLHandler::findFiles (FileList, *itr); } #endif if (!gotInType) { if(FileList.empty()) { cerr << "No input file or format spec or possibly a misplaced option.\n" "Options, other than -i -o -O -m, must come after the input files.\n" <<endl; usage(); } } if (!gotOutType) { //check there is a valid output format, but the extension will be re-interpreted in OBConversion pOutFormat = Conv.FormatFromExt(OutputFileName.c_str()); if(OutputFileName.empty() || pOutFormat==NULL) { cerr << "Missing or unknown output file or format spec or possibly a misplaced option.\n" "Options, other than -i -o -O -m, must come after the input files.\n" <<endl; usage(); } } if(!Conv.SetInFormat(pInFormat)) { cerr << "Invalid input format" << endl; usage(); } if(!Conv.SetOutFormat(pOutFormat)) { cerr << "Invalid output format" << endl; usage(); } if(SplitOrBatch) { //Put * into output file name before extension (or ext.gz) if(OutputFileName.empty()) { OutputFileName = "*."; OutputFileName += oext; } else { string::size_type pos = OutputFileName.rfind(".gz"); if(pos==string::npos) pos = OutputFileName.rfind('.'); else pos = OutputFileName.rfind('.',pos-1); if(pos==string::npos) OutputFileName += '*'; else OutputFileName.insert(pos,"*"); } } int count = Conv.FullConvert(FileList, OutputFileName, OutputFileList); Conv.ReportNumberConverted(count); if(OutputFileList.size()>1) { clog << OutputFileList.size() << " files output. The first is " << OutputFileList[0] <<endl; } //std::string messageSummary = obErrorLog.GetMessageSummary(); //if (messageSummary.size()) // { // clog << messageSummary << endl; // } #ifdef _DEBUG //CM keep window open cout << "Press any key to finish" <<endl; getch(); #endif return 0; }
bool OpNewS::Do(OBBase* pOb, const char* OptionText, OpMap* pmap, OBConversion* pConv) { OBMol* pmol = dynamic_cast<OBMol*>(pOb); if(!pmol) return false; // The SMARTS and any other parameters are extracted on the first molecule // and stored in the member variables. The parameter is cleared so that // the original -s option in transform.cpp is inactive //string txt(pmap->find(GetID())->second); // ID can be "s" or "v" vector<OBQuery*>::iterator qiter; if(OptionText && *OptionText)//(!pConv || pConv->IsFirstInput()) { //Set up on first call queries.clear(); query=NULL; nPatternAtoms=0; inv=false; tokenize(vec, OptionText); inv = GetID()[0]=='v'; if(vec[0][0]=='~') { inv = true; vec[0].erase(0,1); } //Do not filter out any molecules if there is a parameter "showall"; //allows -s option to be used for highlighting substructures (--highlight also does this) vector<string>::iterator it = std::remove(vec.begin(), vec.end(),"showall"); showAll = it != vec.end(); if(showAll) vec.erase(it); //Store the number of matches required, if as a number in the second parameter, else 0. nmatches = 0; comparechar = '\0'; if(vec.size()>1) { comparechar = vec[1][0]; if(comparechar=='>' || comparechar=='<') vec[1].erase(0,1); else comparechar = '\0'; nmatches = atoi(vec[1].c_str()); if(nmatches) //remove this parameter to still allow coloring vec.erase(vec.begin()+1); } //Interpret as a filename if possible MakeQueriesFromMolInFile(queries, vec[0], &nPatternAtoms, strstr(OptionText,"noH")); vec.erase(remove(vec.begin(),vec.end(),"noH"),vec.end());//to prevent "noH2" being seen as a color if(queries.empty()) { //SMARTS supplied // Explicit H in SMARTS requires explicit H in the molecule. // Calling AddHydrogens() on a copy of the molecule is done in parsmart.cpp // only when SMARTS contains [H]. Doing more has complications with atom typing, // so AddHydrogens here on the molecule (not a copy) when #1 detected. addHydrogens = (vec[0].find("#1]")!=string::npos); // If extra target mols have been supplied, make a composite SMARTS // to test for any of the targets. if(ExtraMols.size()>0) { for(unsigned i=0;i<ExtraMols.size();++i) { OBConversion extraConv; extraConv.AddOption("h"); if(!extraConv.SetOutFormat("smi")) return false; // Add option which avoids implicit H being added to the SMARTS. // The parameter must be present but can be anything. extraConv.AddOption("h",OBConversion::OUTOPTIONS, "X"); xsmarts += ",$(" + extraConv.WriteString(ExtraMols[i], true) + ")"; } } string ysmarts = xsmarts.empty() ? vec[0] : "[$(" + vec[0] + ")" + xsmarts +"]"; xsmarts.clear(); if(!sp.Init(ysmarts)) { string msg = ysmarts + " cannot be interpreted as either valid SMARTS " "or the name of a file with an extension known to OpenBabel " "that contains one or more pattern molecules."; obErrorLog.ThrowError(__FUNCTION__, msg, obError, onceOnly); delete pmol; pmol = NULL; pConv->SetOneObjectOnly(); //stop conversion return false; } } else { // Target is in a file. Add extra targets if any supplied for(unsigned i=0;i<ExtraMols.size();++i) queries.push_back(CompileMoleculeQuery(static_cast<OBMol*>(ExtraMols[i]))); ExtraMols.clear(); } if(vec.size()>1 && vec[1]=="exact") { if(queries.empty()) { //Convert SMARTS to SMILES to count number of atoms OBConversion conv; OBMol patmol; if(!conv.SetInFormat("smi") || !conv.ReadString(&patmol, vec[0])) { obErrorLog.ThrowError(__FUNCTION__, "Cannot read the parameter of -s option, " "which has to be valid SMILES when the exact option is used.", obError, onceOnly); delete pmol; if(pConv) pConv->SetOneObjectOnly(); //stop conversion return false; } nPatternAtoms = patmol.NumHvyAtoms(); } } else nPatternAtoms = 0; //disable old versions if(pConv) pConv->AddOption(GetID(), OBConversion::GENOPTIONS, ""); } bool match = false; //These are a vector of each mapping, each containing atom indxs. vector<vector<int> > vecatomvec; vector<vector<int> >* pMappedAtoms = NULL; if(nPatternAtoms) if(pmol->NumHvyAtoms() != nPatternAtoms) return false; unsigned int imol=0; //index of mol in pattern file if(!queries.empty()) //filename supplied { //match is set true if any of the structures match - OR behaviour for(qiter=queries.begin();qiter!=queries.end();++qiter, ++imol) { OBIsomorphismMapper* mapper = OBIsomorphismMapper::GetInstance(*qiter); OBIsomorphismMapper::Mappings mappings; mapper->MapUnique(pmol, mappings); if( (match = !mappings.empty()) ) // extra parens to indicate truth value { OBIsomorphismMapper::Mappings::iterator ita; OBIsomorphismMapper::Mapping::iterator itb; for(ita=mappings.begin(); ita!=mappings.end();++ita)//each mapping { vector<int> atomvec; for(itb=ita->begin(); itb!=ita->end();++itb)//each atom index atomvec.push_back(itb->second+1); vecatomvec.push_back(atomvec); atomvec.clear(); } pMappedAtoms = &vecatomvec; break; } } } else //SMARTS supplied { if(addHydrogens) pmol->AddHydrogens(false,false); if( (match = sp.Match(*pmol)) ) // extra parens to indicate truth value { pMappedAtoms = &sp.GetMapList(); if(nmatches!=0) { int n = sp.GetUMapList().size(); if(comparechar=='>') match = (n > nmatches); else if(comparechar=='<') match = (n < nmatches); else match = (n == nmatches); } } } if((!showAll && (!match && !inv)) || (match && inv)) { //delete a non-matching mol delete pmol; pmol = NULL; return false; } if(match) //Copy the idxes of the first match to a member variable so that it can be retrieved from outside firstmatch.assign(pMappedAtoms->begin()->begin(), pMappedAtoms->begin()->end()); else firstmatch.clear(); if(match && !inv && vec.size()>=2 && !vec[1].empty() && !nPatternAtoms) { vector<vector<int> >::iterator iter; if (vec[1]=="extract" || (vec.size()>3 && vec[2]=="extract")) { //Delete all unmatched atoms. Use only the first match ExtractSubstruct(pmol, *pMappedAtoms->begin()); return true; } // color the substructure if there is a second parameter which is not "exact" or "extract" or "noH" // with multiple color parameters use the one corresponding to the query molecule, or the last if(imol>vec.size()-2) imol = vec.size()-2; for(iter=pMappedAtoms->begin();iter!=pMappedAtoms->end();++iter)//each match AddDataToSubstruct(pmol, *iter, "color", vec[imol+1]); return true; } if(pConv && pConv->IsLast()) { for(qiter=queries.begin();qiter!=queries.end();++qiter) delete *qiter; queries.clear(); } return true; }
// This function will call the Babel library to add // hydrogens to the residues void PDB::addHydrogensToPair(AminoAcid& a, AminoAcid& b, int cd1, int cd2) { OBMol mol; string addedH; istringstream tempss; bool ligand; if(b.atom[0]->line.find("HETATM") != string::npos) { ligand = true; } else { ligand = false; } // This section is just to suppress all of the // warning message that aren't important to us { OBConversion apiConv; OBFormat* pAPI = OBConversion::FindFormat("obapi"); if(pAPI) { apiConv.SetOutFormat(pAPI); apiConv.AddOption("errorlevel", OBConversion::GENOPTIONS, "0"); apiConv.Write(NULL, &std::cout); } } // Now, let's pack up the information into a string string packedFile=""; for(unsigned int i=0; i < a.altlocs[cd1].size(); i++) { if( !a.altlocs[cd1][i]->skip ) { packedFile += a.altlocs[cd1][i]->line + "\n"; } } int cd2_al = cd2; if(b.residue == "ASP" || b.residue == "GLU") { cd2_al = cd2%(b.altlocs.size()); } for(unsigned int i=0; i < b.altlocs[cd2_al].size(); i++) { if( !b.altlocs[cd2_al][i]->skip ) { packedFile += b.altlocs[cd2_al][i]->line + "\n"; } } packedFile += a.makeConect(cd1); packedFile += b.makeConect(cd2_al); // Now, let's set up some Babel information // First, we get the PDB format to tell // Babel how to read the information and // how to output it OBFormat* pdbformat = this->conv.FindFormat("pdb"); this->conv.SetInFormat(pdbformat); this->conv.SetOutFormat(pdbformat); // Here is where Babel reads everything // and adds hydrogens to the pair // TO ADD: option to set pH this->conv.ReadString(&mol,packedFile); mol.AddHydrogens(false,true,PH_LEVEL); // Let's write the newly written hydrogens to // a string and parse it addedH = this->conv.WriteString(&mol); tempss.str(addedH); // This ensures that the ligand hydrogens are labeled as // HETATM instead of ATOM just for the sake of STAAR. // This may be wrong, but it should be fine since we are // stripping out that information later when we write // the GAMESS inp files if( ligand ) { string line; string f = ""; while( getline(tempss,line) ) { if( line.find(b.residue) != string::npos ) { line.replace(0,6,"HETATM"); } f += line + "\n"; } tempss.seekg(ios_base::beg); tempss.clear(); tempss.str(f); } this->failure = false; this->parsePDB(tempss,99999.99); // This is just to ensure that all of the atoms // are grouped together because Babel just // appends the H to the end of the file if( !ligand ) this->sortAtoms(); // Split the atoms up into amino acids and chains this->populateChains(true); }
int main(int argc,char *argv[]) { OBConversion Conv(&cin, &cout); //default input and output are console OBFormat* pInFormat = NULL; OBFormat* pOutFormat = NULL; bool inGzip = false; bool outGzip = false; vector<string> FileList, OutputFileList; string OutputFileName; // Parse commandline bool gotInType = false, gotOutType = false; bool SplitOrBatch=false; char *oext = NULL; char *iext = NULL; //load plugs to fully initialize option parameters OBPlugin::LoadAllPlugins(); //Save name of program without its path (and .exe) string pn(argv[0]); string::size_type pos; #ifdef _WIN32 pos = pn.find(".exe"); if(pos!=string::npos) argv[0][pos]='\0'; #endif pos = pn.find_last_of("/\\"); if(pos==string::npos) program_name=argv[0]; else program_name=argv[0]+pos+1; const char* p; int arg; for (arg = 1; arg < argc; ++arg) { if (argv[arg]) { if (argv[arg][0] == '-') { switch (argv[arg][1]) { case 'V': { cout << "Open Babel " << BABEL_VERSION << " -- " << __DATE__ << " -- " << __TIME__ << endl; exit(0); } case 'i': gotInType = true; iext = argv[arg] + 2; if(!*iext) iext = argv[++arg]; //space left after -i: use next argument if (strncasecmp(iext, "MIME", 4) == 0) { // get the MIME type from the next argument iext = argv[++arg]; pInFormat = Conv.FormatFromMIME(iext); } else { //The ID provided by the OBFormat class is used as the identifying file extension pInFormat = Conv.FindFormat(iext); } if(pInFormat==NULL) { cerr << program_name << ": cannot read input format!" << endl; usage(); } break; case 'o': gotOutType = true; oext = argv[arg] + 2; if(!*oext) oext = argv[++arg]; //space left after -i: use next argument if (arg >= argc) usage(); // error in parsing command-line if (strncasecmp(oext, "MIME", 4) == 0) { // get the MIME type from the next argument oext = argv[++arg]; pOutFormat = Conv.FormatFromMIME(oext); } else pOutFormat = Conv.FindFormat(oext); if(pOutFormat==NULL) { cerr << program_name << ": cannot write output format!" << endl; usage(); } break; case 'L': //display a list of plugin type or classes { const char* param=NULL; if(argc>arg+1) param = argv[arg+2]; // First assume first arg is a plugin type and // param is a subtype, like babel -L ops gen3D // or first arg is a plugin ID, like babel -L cml OBPlugin* plugin; if ((OBPlugin::GetPlugin("plugins", argv[arg+1]) && (plugin = OBPlugin::GetPlugin(argv[arg+1], param))) || (plugin = OBPlugin::GetPlugin(NULL, argv[arg+1]))) { //Output details of subtype string txt; plugin->Display(txt, "verbose", argv[arg+1]); cout << "One of the " << plugin->TypeID() << '\n' << txt << endl; return 0; } //...otherwise assume it is a plugin type, like babel -L forcefields //Output list of subtypes OBPlugin::List(argv[arg+1], param); return 0; } case '?': case 'H': if(isalnum(argv[arg][2]) || arg==argc-2) { if(strncasecmp(argv[arg]+2,"all",3)) { const char* pID= (arg==argc-2) ? argv[arg+1] : argv[arg]+2; OBFormat* pFormat = Conv.FindFormat(pID); if(pFormat) { cout << pID << " " << pFormat->Description() << endl; if(pFormat->Flags() & NOTWRITABLE) cout << " This format is Read-only" << endl; if(pFormat->Flags() & NOTREADABLE) cout << " This format is Write-only" << endl; if(strlen(pFormat->SpecificationURL())) cout << "Specification at: " << pFormat->SpecificationURL() << endl; } else cout << "Format type: " << pID << " was not recognized" <<endl; } else { OBPlugin::List("formats","verbose"); } } else help(); return 0; case '-': //long option --name text { //Do nothing if name is empty //Option's text is the next arg provided it doesn't start with - char* nam = argv[arg]+2; if(*nam != '\0') { string txt; int i; for(i=0; i<Conv.GetOptionParams(nam, OBConversion::GENOPTIONS) && arg<argc-1 && argv[arg+1];++i) //removed && *argv[arg+1]!='-' { if(!txt.empty()) txt+=' '; txt += argv[++arg]; } if(*nam=='-') { // Is a API directive, e.g.---errorlevel //Send to the pseudoformat "obapi" (without any leading -) OBConversion apiConv; OBFormat* pAPI= OBConversion::FindFormat("obapi"); if(pAPI) { apiConv.SetOutFormat(pAPI); apiConv.AddOption(nam+1, OBConversion::GENOPTIONS, txt.c_str()); apiConv.Write(NULL, &std::cout); } } else // Is a long option name, e.g --addtotitle Conv.AddOption(nam,OBConversion::GENOPTIONS,txt.c_str()); } } break; case 'm': //multiple output files SplitOrBatch=true; break; case 'a': //single character input option p = argv[arg]+2; DoOption(p,Conv,OBConversion::INOPTIONS,arg,argc,argv); break; case 'x': //single character output option p = argv[arg]+2; DoOption(p,Conv,OBConversion::OUTOPTIONS,arg,argc,argv); break; default: //single character general option p = argv[arg]+1; DoOption(p,Conv,OBConversion::GENOPTIONS,arg,argc,argv); break; } } else { //filenames if(!gotOutType) FileList.push_back(argv[arg]); else OutputFileName = argv[arg]; } } } if(!gotOutType) //the last file is the output { if(FileList.empty()) { cerr << "No output file or format spec!" << endl; usage(); } OutputFileName = FileList.back(); FileList.pop_back(); } #if defined(_WIN32) && defined(USING_DYNAMIC_LIBS) //Expand wildcards in input filenames and add to FileList vector<string> tempFileList(FileList); FileList.clear(); vector<string>::iterator itr; for(itr=tempFileList.begin();itr!=tempFileList.end();++itr) DLHandler::findFiles (FileList, *itr); #endif if (!gotInType) { if(FileList.empty()) { cerr << "No input file or format spec!" <<endl; usage(); } } if (!gotOutType) { pOutFormat = Conv.FormatFromExt(OutputFileName.c_str(), outGzip); if(pOutFormat==NULL) { cerr << program_name << ": cannot write output format!" << endl; usage(); } } if(!Conv.SetInFormat(pInFormat)) { cerr << "Invalid input format" << endl; usage(); } if(!Conv.SetOutFormat(pOutFormat, outGzip)) { cerr << "Invalid output format" << endl; usage(); } if(SplitOrBatch) { //Put * into output file name before extension (or ext.gz) if(OutputFileName.empty()) { OutputFileName = "*."; if (oext != NULL) OutputFileName += oext; } else { string::size_type pos = OutputFileName.rfind(".gz"); if(pos==string::npos) pos = OutputFileName.rfind('.'); else pos = OutputFileName.rfind('.',pos-1); if(pos==string::npos) OutputFileName += '*'; else OutputFileName.insert(pos,"*"); } } int count = Conv.FullConvert(FileList, OutputFileName, OutputFileList); Conv.ReportNumberConverted(count); if(OutputFileList.size()>1) { clog << OutputFileList.size() << " files output. The first is " << OutputFileList[0] <<endl; } std::string messageSummary = obErrorLog.GetMessageSummary(); if (messageSummary.size()) { clog << messageSummary << endl; } #ifdef _DEBUG //CM keep window open cout << "Press any key to finish" <<endl; getch(); #endif return 0; }