Exemplo n.º 1
0
// write PDB file to stream
bool PDBFileWriter::write(qlib::OutStream &outs)
{
  m_pMol = getTarget<MolCoord>();

  if (m_pMol==NULL) {
    LOG_DPRINTLN("PDBWriter> MolCoord is not attached !!");
    return false;
  }

  // check extension record handlers
  PDBFileReader::HndlrTab &htab = PDBFileReader::m_htab;
  bool bUseHndlr = htab.size()>0;

  MolCoord *pMol = m_pMol;
  qlib::PrintStream prs(outs);

  //
  //  write header
  //
  //LString sbuf = pqsys->getVersion();
  //prs.formatln("REMARK   PDB File Generated by CueMol (ver %s)", sbuf.c_str());
  prs.formatln("REMARK   PDB File Generated by CueMol2");

  //
  //  write SSBOND record
  //
  writeSSBonds(prs);

  //
  //  write LINK record
  //
  writeLinks(prs);

  writeSecstr(prs);

  //
  //  write extension records (CRYST1)
  //
  if (bUseHndlr) {
    LString sbuf;
    PDBFileReader::HndlrTab::const_iterator iter = htab.begin();
    for (; iter!=htab.end(); ++iter) {
      PDBFileReader::RecordHandler *ph = iter->second;
      if (ph!=NULL && ph->write(sbuf, pMol)) {
        prs.println(sbuf);
      }
    }
  }
  
  //
  //  write body (ATOM/ANISOU records)
  //

  int nserial = 1;

  // Sort chain names by ASCII order
  // take care of '_' (empty) chain
  std::list<LString> chnames;
  {
    MolCoord::ChainIter iter = pMol->begin();
    bool bHasEmptyChain = false;
    for (; iter!=pMol->end(); ++iter) {
      MolChainPtr pChn = iter->second;
      LString chnam = (pChn->getName().c_str()); 
      if (chnam.equals("_")) {
        bHasEmptyChain = true;
        continue;
      }
      chnames.push_back(chnam);
    }
    chnames.sort();
    if (bHasEmptyChain)
      chnames.push_back("_");
  }
  
  std::list<LString>::const_iterator cniter = chnames.begin();
  for (; cniter!=chnames.end(); ++cniter) {
    LString chnam = *cniter;
    MolChainPtr pChn = pMol->getChain(chnam);

    // format chain name
    char cch = convChainName(chnam);

    LString resnam;
    MolChain::ResidCursor2 riter = pChn->begin2();
    // int nlastres = 0;
    for (; riter!=pChn->end2(); ++riter) {
      //MolResiduePtr pRes = *riter;
      MolResiduePtr pRes = riter->second;
      if (pRes.isnull()) continue;
      ResidIndex rindex = pRes->getIndex();
      resnam = pRes->getName();
      
      // format residue name
      // resnam = resnam.toUpperCase();
      resnam = resnam.substr(0,3);

      // sort atom by AID
      std::list<int> atmlist;
      {
        MolResidue::AtomCursor aiter = pRes->atomBegin();
        for (; aiter!=pRes->atomEnd(); ++aiter) {
          atmlist.push_back(aiter->second);
        }
        atmlist.sort();
      }

      std::list<int>::const_iterator iter = atmlist.begin();
      for (; iter!=atmlist.end(); ++iter) {
        int aid = *iter;
        MolAtomPtr pAtm = pMol->getAtom(aid);
        if (pAtm.isnull())
          continue;

        if (!m_pSel.isnull()) {
          if (!m_pSel->isSelected(pAtm))
            continue; // skip nonselected atom
        }

        writeAtomLine(nserial, rindex, resnam,
                      cch, pAtm, prs);
        nserial++;
      }
      // nlastres = rindex.first;
    }

    // print TER record
    /*prs.formatln("TER   "
                 "%5d"
                 "      "
                 "%3s "
                 "%1s"
                 "%4d"
                 "                                                      ",
                 nserial, resnam.c_str(), chnam.c_str(), nlastres);*/
    prs.println("TER");
    nserial ++;
  }  

  //prs.println("END                                                                             ");
  prs.println("END");
  return true;
}
Exemplo n.º 2
0
void PDBFileWriter::writeSecstr(qlib::PrintStream &prs)
{
  MolResiduePtr pRes1;

  int nhx = 1;
  MolCoordPtr pMol(m_pMol);
  ResidIterator riter(pMol); //(MolCoordPtr(m_pMol));

  // Write HELIX records
  for (riter.first(); riter.hasMore(); riter.next()) {
    LString sec;
    LString pfx;
    MolResiduePtr pRes = riter.get();
    pRes->getPropStr("secondary2", sec);

    // MB_DPRINTLN("%s%d => %s", pRes->getChainName().c_str(), pRes->getIndex().first, sec.c_str());

    if (sec.length()>=2)
      pfx= sec.substr(1,1);
    
    if (!(sec.startsWith("H")||sec.startsWith("G")||sec.startsWith("I")))
      continue;

    if (pfx.equals("s"))
      pRes1 = pRes;
    else if (pfx.equals("e")) {
      LString resn1 = pRes1->getName().substr(0,3);
      LString chn1 = pRes1->getChainName().substr(0,1);
      ResidIndex resix1 = pRes1->getIndex();
      char ins1 = resix1.second;
        if (ins1=='\0') ins1 = ' ';
      
      LString resn2 = pRes->getName().substr(0,3);
      LString chn2 = pRes->getChainName().substr(0,1);
      ResidIndex resix2 = pRes->getIndex();
      char ins2 = resix2.second;
      if (ins2=='\0') ins2 = ' ';
      
      prs.print("HELIX ");
      // helix seqno
      prs.format(" %3d", nhx);
        // helix ID
      prs.format(" %3d", nhx);
      
      // start resname
      prs.format(" %3s", resn1.c_str());
      prs.format(" %1s", chn1.c_str());
      prs.format(" %4d", resix1.first);
      prs.format("%c", ins1);
      
      // end resname
      prs.format(" %3s", resn2.c_str());
      prs.format(" %1s", chn2.c_str());
      prs.format(" %4d", resix2.first);
      prs.format("%c", ins2);
      
      // typeof helix
      int ntype = 1;
      if (sec.startsWith("G"))
        ntype = 5;
      else if (sec.startsWith("I"))
        ntype = 3;
      prs.format("%2d", ntype);
      
      prs.println("");
      ++nhx;
    }
  }

  // Write SHEET records
  int nsh = 1;
  for (riter.first(); riter.hasMore(); riter.next()) {
    LString sec;
    LString pfx;
    MolResiduePtr pRes = riter.get();
    pRes->getPropStr("secondary2", sec);

    // MB_DPRINTLN("%s%d => %s", pRes->getChainName().c_str(), pRes->getIndex().first, sec.c_str());

    if (sec.length()>=2)
      pfx= sec.substr(1,1);
    
    if (!(sec.startsWith("E")))
      continue;

    if (pfx.equals("s"))
      pRes1 = pRes;
    else if (pfx.equals("e")) {
      
      LString resn1 = pRes1->getName().substr(0,3);
      LString chn1 = pRes1->getChainName().substr(0,1);
      ResidIndex resix1 = pRes1->getIndex();
      char ins1 = resix1.second;
      if (ins1=='\0') ins1 = ' ';
      
      LString resn2 = pRes->getName().substr(0,3);
      LString chn2 = pRes->getChainName().substr(0,1);
      ResidIndex resix2 = pRes->getIndex();
      char ins2 = resix2.second;
      if (ins2=='\0') ins2 = ' ';
      
      prs.print("SHEET ");
      // helix seqno
      prs.format(" %3d", nsh);
      // helix ID
      prs.format(" %3d", nsh);
      // num of strands
      prs.print(" 1");

      // start resname
      prs.format(" %3s", resn1.c_str());
      prs.format(" %1s", chn1.c_str());
      prs.format("%4d", resix1.first);
      prs.format("%c", ins1);
      
      // end resname
      prs.format(" %3s", resn2.c_str());
      prs.format(" %1s", chn2.c_str());
      prs.format("%4d", resix2.first);
      prs.format("%c", ins2);
      
      // direction
      prs.print(" 0");

      prs.println("");
      ++nsh;
    }
  } // for

}