Hi,

I 'm beginning with OpenBabel C++ API, and I encounter a problem when I want to 
save an ObMol object in PDB format. The PDB files obtained are a mess with 
atoms belonging to one residu written at the end of the file, as an example:

ATOM     71  N   ALA A  12      97.135  16.357  -7.674  1.00  0.00           N  
ATOM     72  CA  ALA A  12      98.513  16.161  -8.005  1.00  0.00           C  
ATOM     73  C   ALA A  12      99.328  17.016  -7.096  1.00  0.00           C  
ATOM     74  O   ALA A  12      98.808  17.889  -6.403  1.00  0.00           O  
ATOM     75  N   HIS A  13     100.643  16.746  -7.045  1.00  0.00           N  
ATOM     76  CA  HIS A  13     101.502  17.528  -6.211  1.00  0.00           C  
ATOM     77  CB  HIS A  13     102.674  16.724  -5.618  1.00  0.00           C  
ATOM     78  CG  HIS A  13     103.569  17.549  -4.741  1.00  0.00           C  
ATOM     79  CD2 HIS A  13     104.800  18.075  -4.990  1.00  0.00           C  
ATOM     80  NE2 HIS A  13     105.262  18.775  -3.889  1.00  0.00           N  
ATOM     81  CE1 HIS A  13     104.299  18.659  -2.994  1.00  0.00           C  
ATOM     82  ND1 HIS A  13     103.253  17.929  -3.456  1.00  0.00           N  
ATOM     83  C   HIS A  13     102.079  18.641  -7.078  1.00  0.00           C  
ATOM     84  OXT HIS A  13     102.768  19.536  -6.520  1.00  0.00           O  
ATOM     85  O   HIS A  13     101.834  18.613  -8.313  1.00  0.00           O  
ATOM     86  CB  ALA A  12      98.864  16.545  -9.453  1.00  0.00           C  
ATOM     87  O   SER A  10      94.342  13.798  -7.803  1.00  0.00           O  
ATOM     88  CB  LEU A   9      90.275  11.881  -8.911  1.00  0.00           C  
ATOM     89  CG  LEU A   9      91.390  12.366  -9.849  1.00  0.00           C  
ATOM     90  CD2 LEU A   9      92.037  13.642  -9.305  1.00  0.00           C  
ATOM     91  CD1 LEU A   9      92.427  11.268 -10.108  1.00  0.00           C  
ATOM     92  O   GLU A   7      86.905   8.351  -7.293  1.00  0.00           O  
ATOM     93  CB  GLU A   7      87.821   5.413  -6.992  1.00  0.00           C  
ATOM     94  CG  GLU A   7      87.929   3.960  -6.543  1.00  0.00           C  
ATOM     95  CD  GLU A   7      88.926   3.975  -5.392  1.00  0.00           C  
ATOM     96  OE2 GLU A   7      88.628   4.626  -4.356  1.00  0.00           O  
ATOM     97  OE1 GLU A   7      90.008   3.348  -5.538  1.00  0.00           O  
ATOM     98  CB  VAL A   6      82.905   7.871  -7.098  1.00  0.00           C  
ATOM     99  CG2 VAL A   6      81.508   8.144  -7.646  1.00  0.00           C  
ATOM    100  CG1 VAL A   6      84.059   8.342  -8.000  1.00  0.00           C  
ATOM    101  O   GLU A   5      81.994   3.833  -6.874  1.00  0.00           O  
ATOM    102  CB  SER A   4      77.745   2.632  -8.286  1.00  0.00           C  
ATOM    103  OG  SER A   4      77.103   1.579  -8.989  1.00  0.00           O  
ATOM    104  O   ASN A   2      72.284   0.936  -6.052  1.00  0.00           O  
ATOM    105  CB  ASN A   2      73.189  -2.065  -5.246  1.00  0.00           C  
ATOM    106  CG  ASN A   2      72.821  -3.377  -4.565  1.00  0.00           C  
ATOM    107  OD1 ASN A   2      72.515  -3.406  -3.374  1.00  0.00           O  
ATOM    108  ND2 ASN A   2      72.849  -4.494  -5.340  1.00  0.00           N  


This is what I have done:

#include <iostream>
#include <openbabel/obconversion.h>
#include <openbabel/mol.h>
using namespace std;
using namespace OpenBabel;

int main(void)
{
  OBConversion obconversion;
  obconversion.SetInFormat("pdb");
  OBMol mol,ligand,receptor;
  OBResidue *residue=NULL;
  vector<OBAtom*> atoms;
  vector<OBMol> mchains;
  OBAtom *atom=NULL;
  int i,j;
  ofstream out;
  string file;
  bool notatend = obconversion.ReadFile(&mol,"complex2.pdb");
  if (notatend)
  {
    mchains=mol.Separate();
    ligand=mchains.back();
    mchains.pop_back();
    receptor=mchains.front();
    if(mchains.size()==2)
        receptor+=mchains.back();
/*    i=ligand.NumResidues();
    for(i=0;i<(int)ligand.NumResidues();i++)
    {
        residue=ligand.GetResidue(i);
        atoms=residue->GetAtoms();
        cout<<atoms.size();
        for(j=0;j<(int)atoms.size();j++)
        {
            atom=atoms[j];
            cout<<residue->GetName()<<"\t"<<atom->GetType()<<endl;
        }
    }
*/
    obconversion.SetOutFormat("pdb");
//    file="ligand2.pdb";
    out.open("ligand2.pdb");
    obconversion.Write(&ligand,&out);
    out.close();
    out.open("receptor2.pdb");
    obconversion.Write(&receptor, &out);
    out.close();
    receptor.Clear();
    ligand.Clear();
    mol.Clear();
    mchains.clear();
  }
  return(0);
}

What is wrong? Is there action to do before writting the molecule? When I make 
the job with the babel binary, it seems to work well?
Another thing I don't understand, is that  the instruction 
i=ligand.NumResidues(); returns 0!
I'm somewhat desesperated to fail for this very simple task.
Thanks for your valuable help.

François


------------------------------------------------------------------------------
EditLive Enterprise is the world's most technically advanced content
authoring tool. Experience the power of Track Changes, Inline Image
Editing and ensure content is compliant with Accessibility Checking.
http://p.sf.net/sfu/ephox-dev2dev
_______________________________________________
OpenBabel-Devel mailing list
OpenBabel-Devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/openbabel-devel

Reply via email to