bool ReportFormat::WriteMolecule(OBBase* pOb, OBConversion* pConv) { OBMol* pmol = dynamic_cast<OBMol*>(pOb); if(pmol==NULL) return false; //Define some references so we can use the old parameter names ostream &ofs = *pConv->GetOutStream(); OBMol &mol = *pmol; char buffer[BUFF_SIZE]; ofs << "FILENAME: " << mol.GetTitle() << "\n"; ofs << "FORMULA: " << mol.GetFormula() << "\n"; ofs << "MASS: "; snprintf(buffer, BUFF_SIZE, "%5.4f\n", mol.GetMolWt()); ofs << buffer; ofs << "EXACT MASS: "; snprintf(buffer, BUFF_SIZE, "%5.7f", mol.GetExactMass()); ofs << buffer << "\n"; if (mol.GetTotalCharge() != 0) { ofs << "TOTAL CHARGE: "; snprintf(buffer, BUFF_SIZE, "%d", mol.GetTotalCharge()); ofs << buffer << "\n"; } if (mol.GetTotalSpinMultiplicity() != 1) { ofs << "TOTAL SPIN: "; snprintf(buffer, BUFF_SIZE, "%d", mol.GetTotalSpinMultiplicity()); ofs << buffer << "\n"; } ofs << "INTERATOMIC DISTANCES" << "\n"; WriteDistanceMatrix(ofs, mol); ofs << "\n" << "\n" << "ATOMIC CHARGES" << "\n"; WriteCharges(ofs, mol); ofs << "\n" << "\n" << "BOND ANGLES" << "\n"; WriteAngles(ofs, mol); ofs << "\n" << "\n" << "TORSION ANGLES" << "\n"; WriteTorsions(ofs, mol); if (OldIsChiral(mol)) // TODO: Replace with this current stereo approach { ofs << "\n" << "\n" << "CHIRAL ATOMS" << "\n"; WriteChiral(ofs, mol); } if (mol.HasData(OBGenericDataType::CommentData)) { ofs << "\n" << "\n" << "COMMENTS" << "\n"; OBCommentData *cd = (OBCommentData*)mol.GetData(OBGenericDataType::CommentData); ofs << cd->GetData() << "\n"; } ofs << "\n" << "\n"; return(true); }
bool WriteReport(ostream &ofs,OBMol &mol) { char buffer[BUFF_SIZE]; ofs << "FILENAME: " << mol.GetTitle() << endl; ofs << "MASS: "; sprintf(buffer, "%5.4f", mol.GetMolWt()); ofs << buffer << endl; ofs << "EXACT MASS: "; sprintf(buffer, "%5.7f", mol.GetExactMass()); ofs << buffer << endl; if (mol.GetTotalCharge() != 0) { ofs << "TOTAL CHARGE: "; sprintf(buffer, "%d", mol.GetTotalCharge()); ofs << buffer << endl; } if (mol.GetTotalSpinMultiplicity() != 1) { ofs << "TOTAL SPIN: "; sprintf(buffer, "%d", mol.GetTotalSpinMultiplicity()); ofs << buffer << endl; } ofs << "INTERATOMIC DISTANCES" << endl; WriteDistanceMatrix(ofs, mol); ofs << endl << endl << "ATOMIC CHARGES" << endl; WriteCharges(ofs, mol); ofs << endl << endl << "BOND ANGLES" << endl; WriteAngles(ofs, mol); ofs << endl << endl << "TORSION ANGLES" << endl; WriteTorsions(ofs, mol); if (mol.IsChiral()) { ofs << endl << endl << "CHIRAL ATOMS" << endl; WriteChiral(ofs, mol); } if (mol.HasData(obCommentData)) { ofs << endl << endl << "COMMENTS" << endl; OBCommentData *cd = (OBCommentData*)mol.GetData(obCommentData); ofs << cd->GetData() << endl; } ofs << endl << endl; return(true); }
bool MOL2Format::WriteMolecule(OBBase* pOb, OBConversion* pConv) { OBMol* pmol = dynamic_cast<OBMol*>(pOb); if(pmol==NULL) return false; //Define some references so we can use the old parameter names ostream &ofs = *pConv->GetOutStream(); OBMol &mol = *pmol; bool ligandsOnly = pConv->IsOption("l", OBConversion::OUTOPTIONS)!=NULL; //The old code follows.... string str,str1; char buffer[BUFF_SIZE],label[BUFF_SIZE]; char rnum[BUFF_SIZE],rlabel[BUFF_SIZE]; ofs << "@<TRIPOS>MOLECULE" << endl; str = mol.GetTitle(); if (str.empty()) ofs << "*****" << endl; else ofs << str << endl; snprintf(buffer, BUFF_SIZE," %d %d 0 0 0", mol.NumAtoms(),mol.NumBonds()); ofs << buffer << endl; ofs << "SMALL" << endl; OBPairData *dp = (OBPairData*)mol.GetData("PartialCharges"); if (dp != NULL) { // Tripos spec says: // NO_CHARGES, DEL_RE, GASTEIGER, GAST_HUCK, HUCKEL, PULLMAN, // GAUSS80_CHARGES, AMPAC_CHARGES, MULLIKEN_CHARGES, DICT_ CHARGES, // MMFF94_CHARGES, USER_CHARGES if (dp->GetValue() == "Mulliken") ofs << "MULLIKEN_CHARGES" << endl; else // should pick from the Tripos types ofs << "GASTEIGER" << endl; } else { // No idea what these charges are... all our code sets "PartialCharges" ofs << "GASTEIGER" << endl; } ofs << "Energy = " << mol.GetEnergy() << endl; if (mol.HasData(OBGenericDataType::CommentData)) { OBCommentData *cd = (OBCommentData*)mol.GetData(OBGenericDataType::CommentData); ofs << cd->GetData(); } ofs << endl; ofs << "@<TRIPOS>ATOM" << endl; OBAtom *atom; OBResidue *res; vector<OBAtom*>::iterator i; vector<int> labelcount; labelcount.resize( etab.GetNumberOfElements() ); ttab.SetFromType("INT"); ttab.SetToType("SYB"); for (atom = mol.BeginAtom(i);atom;atom = mol.NextAtom(i)) { // // Use sequentially numbered atom names if no residues // snprintf(label,BUFF_SIZE, "%s%d", etab.GetSymbol(atom->GetAtomicNum()), ++labelcount[atom->GetAtomicNum()]); strcpy(rlabel,"<1>"); strcpy(rnum,"1"); str = atom->GetType(); ttab.Translate(str1,str); // // Use original atom names if there are residues // if (!ligandsOnly && (res = atom->GetResidue()) ) { // use original atom names defined by residue snprintf(label,BUFF_SIZE,"%s",(char*)res->GetAtomID(atom).c_str()); // make sure that residue name includes its number snprintf(rlabel,BUFF_SIZE,"%s%d",res->GetName().c_str(), res->GetNum()); snprintf(rnum,BUFF_SIZE,"%d",res->GetNum()); } snprintf(buffer,BUFF_SIZE,"%7d%1s%-6s%12.4f%10.4f%10.4f%1s%-5s%4s%1s %-8s%10.4f", atom->GetIdx(),"",label, atom->GetX(),atom->GetY(),atom->GetZ(), "",str1.c_str(), rnum,"",rlabel, atom->GetPartialCharge()); ofs << buffer << endl; } ofs << "@<TRIPOS>BOND" << endl; OBBond *bond; vector<OBBond*>::iterator j; OBSmartsPattern pat; string s1, s2; for (bond = mol.BeginBond(j);bond;bond = mol.NextBond(j)) { s1 = bond->GetBeginAtom()->GetType(); s2 = bond->GetEndAtom()->GetType(); if (bond->IsAromatic() || s1 == "O.co2" || s2 == "O.co2") strcpy(label,"ar"); else if (bond->IsAmide()) strcpy(label,"am"); else snprintf(label,BUFF_SIZE,"%d",bond->GetBO()); snprintf(buffer, BUFF_SIZE,"%6d%6d%6d%3s%2s", bond->GetIdx()+1,bond->GetBeginAtomIdx(),bond->GetEndAtomIdx(), "",label); ofs << buffer << endl; } // NO trailing blank line (PR#1868929). // ofs << endl; return(true); }