本文整理汇总了C++中MolAtomPtr::isnull方法的典型用法代码示例。如果您正苦于以下问题:C++ MolAtomPtr::isnull方法的具体用法?C++ MolAtomPtr::isnull怎么用?C++ MolAtomPtr::isnull使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类MolAtomPtr
的用法示例。
在下文中一共展示了MolAtomPtr::isnull方法的14个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: drawSelInterAtomLine
static void drawSelInterAtomLine(MolAtomPtr pAtom1, MolAtomPtr pAtom2,
DisplayContext *pdl)
{
if (pAtom1.isnull() || pAtom2.isnull()) return;
pdl->vertex(pAtom1->getPos());
pdl->vertex(pAtom2->getPos());
}
示例2: init
bool MolSurfBuilder::init(MolCoordPtr pmol)
{
AtomIterator aiter(pmol);
int i, natoms=0;
// count atom number
for (aiter.first(); aiter.hasMore(); aiter.next()) {
MolAtomPtr pAtom = aiter.get();
MB_ASSERT(!pAtom.isnull());
++natoms;
}
// copy to the m_data
m_data.resize(natoms);
m_tree.alloc(natoms);
for (i=0,aiter.first(); aiter.hasMore()&&i<natoms; aiter.next(),++i) {
MolAtomPtr pAtom = aiter.get();
m_data[i].pos = pAtom->getPos();
m_data[i].rad = 1.5;
m_data[i].aid = pAtom->getID();
m_tree.setAt(i, m_data[i].pos, i);
}
// build BSP tree
m_tree.build();
m_rmax = 1.5;
m_rprobe = 1.2;
return true;
}
示例3: drawInterAtomLine
void BallStickRenderer::drawInterAtomLine(MolAtomPtr pAtom1, MolAtomPtr pAtom2,
DisplayContext *pdl)
{
if (pAtom1.isnull() || pAtom2.isnull()) return;
const Vector4D pos1 = pAtom1->getPos();
const Vector4D pos2 = pAtom2->getPos();
ColorPtr pcol1 = ColSchmHolder::getColor(pAtom1);
ColorPtr pcol2 = ColSchmHolder::getColor(pAtom2);
if ( pcol1->equals(*pcol2.get()) ) {
pdl->color(pcol1);
pdl->cylinder(m_bondw, pos1, pos2);
}
else {
const Vector4D mpos = (pos1 + pos2).divide(2.0);
pdl->color(pcol1);
pdl->cylinder(m_bondw, pos1, mpos);
pdl->color(pcol2);
pdl->cylinder(m_bondw, pos2, mpos);
}
}
示例4: toStrAID
/// Convert aid to (persistent) string representation
LString MolCoord::toStrAID(int atomid) const
{
MolAtomPtr pAtom = getAtom(atomid);
if (pAtom.isnull()) return LString();
LString value = LString::format("%s.%s.%s",
pAtom->getChainName().c_str(),
pAtom->getResIndex().toString().c_str(),
pAtom->getName().c_str());
char conf_id = pAtom->getConfID();
if (conf_id)
value += ":" + LString(conf_id);
return value;
}
示例5: beginRend
void TubeRenderer::beginRend(DisplayContext *pdl)
{
if (!m_pts->isValid())
m_pts->setupSectionTable();
super_t::beginRend(pdl);
if (m_nPuttyMode==TBR_PUTTY_OFF) {
return;
}
// calc max bfac/occ in the putty mode
SelectionPtr pSel;
MolCoordPtr pMol = getClientMol();
//MolRenderer *pMolRend = dynamic_cast<MolRenderer *>(pRend);
//if (pMolRend!=NULL && m_nAuto==BFA_REND)
pSel = getSelection();
double dmin = 1.0e100, dmax = -1.0e100, val, dsum = 0.0;
int nadd=0;
ResidIterator iter(pMol, pSel);
for (iter.first(); iter.hasMore(); iter.next()) {
MolResiduePtr pRes = iter.get();
MolAtomPtr pAtom = getPivotAtom(pRes);
if (pAtom.isnull()) continue;
if (m_nPuttyMode==TBR_PUTTY_OCC)
val = pAtom->getOcc();
else
val = pAtom->getBfac();
dsum += val;
dmin = qlib::min(dmin, val);
dmax = qlib::max(dmax, val);
++nadd;
}
m_dParHi = dmax;
m_dParLo = dmin;
m_dParAver = dsum/double(nadd);
MB_DPRINTLN("Tube> init high=%f, low=%f, aver=%f OK.", dmax, dmin, m_dParAver);
}
示例6: removeAtom
bool MolCoord::removeAtom(int atomid)
{
MolAtomPtr pAtom = getAtom(atomid);
if (pAtom.isnull() || pAtom->getParentUID()!=getUID())
return false;
m_atomPool.remove(atomid);
// invalidate ID
pAtom->setID(-1);
const LString &aname = pAtom->getName();
char cConfID = pAtom->getConfID();
ResidIndex nresid = pAtom->getResIndex();
const LString &cname = pAtom->getChainName();
MolChainPtr pCh = getChain(cname);
if (pCh.isnull())
return false;
MolResiduePtr pRes = getResidue(cname, nresid);
if (pRes.isnull())
return false;
// remove atom
if (!pRes->removeAtom(aname, cConfID))
return false;
if (pRes->getAtomSize()>0)
return true;
// purge the empty residue
if (!pCh->removeResidue(nresid))
return false;
// delete pRes;
if (pCh->getSize()>0)
return true;
// purge the empty chain
if (!removeChain(cname))
return false;
// delete pCh;
return true;
}
示例7: fromStrAID
/// Convert from (persistent) string representation to aid
int MolCoord::fromStrAID(const LString &strid) const
{
if (!m_reAid.match(strid)) {
LOG_DPRINTLN("MolCoord> Invalid aid strid=%s (re match failed)", strid.c_str());
return -1;
}
// text type aid
int nsc = m_reAid.getSubstrCount();
if (nsc<4) {
LOG_DPRINTLN("MolCoord> Invalid aid strid=%s", strid.c_str());
return -1;
}
//elem.setAtomID(-1);
LString sChainName = m_reAid.getSubstr(1);
LString sResInd = m_reAid.getSubstr(2);
ResidIndex nResInd;
if (!sResInd.toInt(&nResInd.first)) {
LOG_DPRINTLN("MolCoord> Invalid aid resid value=%s", sResInd.c_str());
return -1;
}
LString sInsCode = m_reAid.getSubstr(3);
if (sInsCode.isEmpty())
nResInd.second = '\0';
else
nResInd.second = sInsCode.getAt(0);
LString sAtomName = m_reAid.getSubstr(4);
char cAltLoc = '\0';
if (nsc>6) {
LString sAltLoc = m_reAid.getSubstr(6);
if (!sAltLoc.isEmpty())
cAltLoc = sAltLoc.getAt(0);
}
MolAtomPtr pAtom = getAtom(sChainName, nResInd, sAtomName, cAltLoc);
if (pAtom.isnull()) {
LOG_DPRINTLN("MolCoord> fromStrAID/ atom <%s %s %s %c> not found in %s",
sChainName.c_str(), nResInd.toString().c_str(), sAtomName.c_str(),
cAltLoc=='\0'?' ':cAltLoc,
getName().c_str());
return -1;
}
return pAtom->getID();
}
示例8: drawInterAtomLine
void SimpleRenderer::drawInterAtomLine(MolAtomPtr pAtom1, MolAtomPtr pAtom2,
MolBond *pMB,
DisplayContext *pdl)
{
if (pAtom1.isnull() || pAtom2.isnull()) return;
const Vector4D pos1 = pAtom1->getPos();
const Vector4D pos2 = pAtom2->getPos();
ColorPtr pcol1 = ColSchmHolder::getColor(pAtom1);
ColorPtr pcol2 = ColSchmHolder::getColor(pAtom2);
int nBondType = pMB->getType();
if (m_bValBond &&
(nBondType==MolBond::DOUBLE ||
nBondType==MolBond::TRIPLE)) {
MolCoordPtr pMol = getClientMol();
Vector4D dvd = pMB->getDblBondDir(pMol);
if (nBondType==MolBond::DOUBLE) {
// double bond
if ( pcol1->equals(*pcol2.get()) ) {
pdl->color(pcol1);
pdl->vertex(pos1 + dvd.scale(m_dCvScl1));
pdl->vertex(pos2 + dvd.scale(m_dCvScl1));
pdl->vertex(pos1 + dvd.scale(m_dCvScl2));
pdl->vertex(pos2 + dvd.scale(m_dCvScl2));
}
else {
const Vector4D minpos = (pos1 + pos2).divide(2.0);
pdl->color(pcol1);
pdl->vertex(pos1 + dvd.scale(m_dCvScl1));
pdl->vertex(minpos + dvd.scale(m_dCvScl1));
pdl->vertex(pos1 + dvd.scale(m_dCvScl2));
pdl->vertex(minpos + dvd.scale(m_dCvScl2));
pdl->color(pcol2);
pdl->vertex(pos2 + dvd.scale(m_dCvScl1));
pdl->vertex(minpos + dvd.scale(m_dCvScl1));
pdl->vertex(pos2 + dvd.scale(m_dCvScl2));
pdl->vertex(minpos + dvd.scale(m_dCvScl2));
}
}
else {
// triple bond
if ( pcol1->equals(*pcol2.get()) ) {
pdl->color(pcol1);
pdl->vertex(pos1);
pdl->vertex(pos2);
pdl->vertex(pos1 + dvd.scale(m_dCvScl1));
pdl->vertex(pos2 + dvd.scale(m_dCvScl1));
pdl->vertex(pos1 + dvd.scale(-m_dCvScl1));
pdl->vertex(pos2 + dvd.scale(-m_dCvScl1));
}
else {
const Vector4D minpos = (pos1 + pos2).divide(2.0);
pdl->color(pcol1);
pdl->vertex(pos1);
pdl->vertex(minpos);
pdl->vertex(pos1 + dvd.scale(m_dCvScl1));
pdl->vertex(minpos + dvd.scale(m_dCvScl1));
pdl->vertex(pos1 + dvd.scale(-m_dCvScl1));
pdl->vertex(minpos + dvd.scale(-m_dCvScl1));
pdl->color(pcol2);
pdl->vertex(pos2);
pdl->vertex(minpos);
pdl->vertex(pos2 + dvd.scale(m_dCvScl1));
pdl->vertex(minpos + dvd.scale(m_dCvScl1));
pdl->vertex(pos2 + dvd.scale(-m_dCvScl1));
pdl->vertex(minpos + dvd.scale(-m_dCvScl1));
}
}
++m_nBondDrawn;
return;
}
if ( pcol1->equals(*pcol2.get()) ) {
pdl->color(pcol1);
pdl->vertex(pos1);
pdl->vertex(pos2);
}
else {
const Vector4D minpos = (pos1 + pos2).divide(2.0);
pdl->color(pcol1);
pdl->vertex(pos1);
pdl->vertex(minpos);
pdl->color(pcol2);
pdl->vertex(pos2);
pdl->vertex(minpos);
}
++m_nBondDrawn;
return;
//.........这里部分代码省略.........
示例9: renderVBO
void SimpleRenderer::renderVBO()
{
quint32 i, j;
quint32 nbons = 0, natoms = 0, nmbons = 0, nva = 0;
MolCoordPtr pMol = getClientMol();
// initialize the coloring scheme
getColSchm()->start(pMol, this);
pMol->getColSchm()->start(pMol, this);
std::deque<int> isolated_atoms;
// IntBondArray sbonds;
// IntMBondArray mbonds;
// IntAtomArray atoms;
{
// build bond data structure/estimate VBO size
std::set<int> bonded_atoms;
BondIterator biter(pMol, getSelection());
for (biter.first(); biter.hasMore(); biter.next()) {
MolBond *pMB = biter.getBond();
int aid1 = pMB->getAtom1();
int aid2 = pMB->getAtom2();
bonded_atoms.insert(aid1);
bonded_atoms.insert(aid2);
MolAtomPtr pA1 = pMol->getAtom(aid1);
MolAtomPtr pA2 = pMol->getAtom(aid2);
if (pA1.isnull() || pA2.isnull())
continue; // skip invalid bonds
int nBondType = pMB->getType();
if (m_bValBond &&
(nBondType==MolBond::DOUBLE ||
nBondType==MolBond::TRIPLE)) {
++nmbons;
}
else {
++nbons;
}
}
m_sbonds.resize(nbons);
m_mbonds.resize(nmbons);
i=0;
j=0;
int iva = 0;
for (biter.first(); biter.hasMore(); biter.next()) {
MolBond *pMB = biter.getBond();
int aid1 = pMB->getAtom1();
int aid2 = pMB->getAtom2();
MolAtomPtr pA1 = pMol->getAtom(aid1);
MolAtomPtr pA2 = pMol->getAtom(aid2);
if (pA1.isnull() || pA2.isnull())
continue; // skip invalid bonds
ColorPtr pcol1 = ColSchmHolder::getColor(pA1);
ColorPtr pcol2 = ColSchmHolder::getColor(pA2);
int nBondType = pMB->getType();
bool bSameCol = (pcol1->equals(*pcol2.get()))?true:false;
if (m_bValBond &&
(nBondType==MolBond::DOUBLE ||
nBondType==MolBond::TRIPLE)) {
Vector4D dvd = pMB->getDblBondDir(pMol);
m_mbonds[j].aid1 = aid1;
m_mbonds[j].aid2 = aid2;
m_mbonds[j].vaind = iva;
m_mbonds[j].nx = (qfloat32) dvd.x();
m_mbonds[j].ny = (qfloat32) dvd.y();
m_mbonds[j].nz = (qfloat32) dvd.z();
if (nBondType==MolBond::DOUBLE) {
// double bond
if ( bSameCol ) {
// same color --> one double bond
iva+=2*2;
m_mbonds[j].itype = IBON_1C_2V;
m_mbonds[j].nelems = 2*2;
}
else {
// different color --> two double bonds
iva+=4*2;
m_mbonds[j].itype = IBON_2C_2V;
m_mbonds[j].nelems = 4*2;
}
}
else {
// triple bond
//.........这里部分代码省略.........
示例10: drawRingImpl
void BallStickRenderer::drawRingImpl(const std::list<int> atoms, DisplayContext *pdl)
{
MolCoordPtr pMol = getClientMol();
double len;
int i, nsize = atoms.size();
Vector4D *pvecs = MB_NEW Vector4D[nsize];
Vector4D cen;
std::list<int>::const_iterator iter = atoms.begin();
std::list<int>::const_iterator eiter = atoms.end();
MolAtomPtr pPivAtom, pAtom;
for (i=0; iter!=eiter; ++iter, i++) {
MolAtomPtr pAtom = pMol->getAtom(*iter);
if (pAtom.isnull()) return;
MolResiduePtr pres = pAtom->getParentResidue();
MolChainPtr pch = pAtom->getParentChain();
MB_DPRINTLN("RING %s %s", pres->toString().c_str(), pAtom->getName().c_str());
pvecs[i] = pAtom->getPos();
cen += pvecs[i];
if (pPivAtom.isnull() && pAtom->getElement()==ElemSym::C)
pPivAtom = pAtom;
}
if (pPivAtom.isnull())
pPivAtom = pAtom; // no carbon atom --> last atom becomes pivot
cen = cen.divide(nsize);
// calculate the normal vector
Vector4D norm;
for (i=0; i<nsize; i++) {
int ni = (i+1)%nsize;
Vector4D v1 = pvecs[ni] - pvecs[i];
Vector4D v2 = cen - pvecs[i];
Vector4D ntmp;
ntmp = v1.cross(v2);
len = ntmp.length();
if (len<=F_EPS8) {
LOG_DPRINTLN("BallStick> *****");
return;
}
//ntmp.scale(1.0/len);
ntmp = ntmp.divide(len);
norm += ntmp;
}
len = norm.length();
norm = norm.divide(len);
Vector4D dv = norm.scale(m_tickness);
ColorPtr col = evalMolColor(m_ringcol, ColSchmHolder::getColor(pPivAtom));
/*
ColorPtr col = m_ringcol;
// check molcol reference
gfx::MolColorRef *pMolCol = dynamic_cast<gfx::MolColorRef *>(col.get());
if (pMolCol!=NULL) {
// molcol ref case --> resolve the pivot's color
col = ColSchmHolder::getColor(pPivAtom);
}
*/
pdl->setPolygonMode(gfx::DisplayContext::POLY_FILL_NOEGLN);
pdl->startTriangleFan();
pdl->normal(norm);
pdl->color(col);
pdl->vertex(cen+dv);
for (i=0; i<=nsize; i++) {
pdl->vertex(pvecs[i%nsize]+dv);
}
pdl->end();
pdl->startTriangleFan();
pdl->normal(-norm);
pdl->color(col);
pdl->vertex(cen-dv);
for (i=nsize; i>=0; i--) {
pdl->vertex(pvecs[i%nsize]-dv);
}
pdl->end();
pdl->setPolygonMode(gfx::DisplayContext::POLY_FILL);
delete [] pvecs;
}
示例11: drawRings
void BallStickRenderer::drawRings(DisplayContext *pdl)
{
int i, j;
MolCoordPtr pMol = getClientMol();
while (m_atoms.size()>0) {
std::set<int>::iterator iter = m_atoms.begin();
int aid = *iter;
m_atoms.erase(iter);
MolAtomPtr pa = pMol->getAtom(aid);
if (pa.isnull()) continue;
MolResiduePtr pres = pa->getParentResidue();
ResiToppar *ptop = pres->getTopologyObj();
if (ptop==NULL)
continue;
// draw rings
int nrings = ptop->getRingCount();
for (i=0; i<nrings; i++) {
const ResiToppar::RingAtomArray *pmembs = ptop->getRing(i);
std::list<int> ring_atoms;
// completeness flag of the ring
bool fcompl = true;
for (j=0; j<pmembs->size(); j++) {
LString nm = pmembs->at(j);
int maid = pres->getAtomID(nm);
if (maid<=0) {
fcompl = false;
break;
}
std::set<int>::const_iterator miter = m_atoms.find(maid);
if (miter==m_atoms.end()) {
if (aid!=maid) {
fcompl = false;
break;
}
else {
ring_atoms.push_back(aid);
continue;
}
}
ring_atoms.push_back(*miter);
}
if (fcompl)
drawRingImpl(ring_atoms, pdl);
}
// remove drawn ring members from m_atoms
for (i=0; i<nrings; i++) {
const ResiToppar::RingAtomArray *pmembs = ptop->getRing(i);
for (j=0; j<pmembs->size(); j++) {
LString nm = pmembs->at(j);
int maid = pres->getAtomID(nm);
if (maid<=0)
continue;
std::set<int>::iterator miter = m_atoms.find(maid);
if (miter==m_atoms.end())
continue;
m_atoms.erase(miter);
}
}
}
}
示例12: write
// 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;
//.........这里部分代码省略.........
示例13: if
//.........这里部分代码省略.........
atommap.insert(std::pair<int,int>(ind, naid));
m_nReadAtoms++;
}
prev_resid = iresid;
}
// Search BOND record
for (;;) {
sline = lin.readLine().chomp();
if (sline.isEmpty() && !lin.ready())
return false; // EOF
if (sline.equals("@<TRIPOS>BOND")) {
break;
}
}
int natm1, natm2;
int natm_id1, natm_id2;
std::map<int,int>::const_iterator iter;
for (i=0; i<nbonds; ++i) {
sline = lin.readLine().chomp();
slist.clear();
split(sline, ' ', std::back_inserter(slist));
if (slist.size()<4) {
MB_THROW(MOL2FormatException, "Invalid bond record");
}
if (!slist[1].toInt(&natm1)) {
MB_THROW(MOL2FormatException, "Invalid bond line (atom1)");
}
if (!slist[2].toInt(&natm2)) {
MB_THROW(MOL2FormatException, "Invalid bond line (atom2)");
}
LString sbont = slist[3];
if (!bskip) {
iter = atommap.find(natm1);
if (iter==atommap.end())
MB_THROW(MOL2FormatException, "Invalid bond line (bond atom1 not found)");
natm_id1 = iter->second;
iter = atommap.find(natm2);
if (iter==atommap.end())
MB_THROW(MOL2FormatException, "Invalid bond line (bond atom2 not found)");
natm_id2 = iter->second;
MolBond *pB = m_pMol->makeBond(natm_id1, natm_id2, true);
if (pB==NULL)
MB_THROW(MOL2FormatException, "makeBond failed");
if (sbont.equals("1"))
pB->setType(MolBond::SINGLE);
else if (sbont.equals("2"))
pB->setType(MolBond::DOUBLE);
else if (sbont.equals("3"))
pB->setType(MolBond::TRIPLE);
else if (sbont.equals("ar")||sbont.equals("am"))
pB->setType(MolBond::DELOC);
m_nReadBonds++;
}
//LOG_DPRINTLN("bond %d<-->%d: %d", natm_id1, natm_id2, nbont);
}
if (bApplyTopo) {
m_pMol->applyTopology();
if (mol_type.equals("PROTEIN"))
m_pMol->calcProt2ndry(-500.0);
if (mol_type.equals("NUCLEIC_ACID"))
m_pMol->calcBasePair(3.7, 30);
}
else {
// Set noautogen prop to this residue,
// to avoid topology autogen, when saved to and loaded from the qdf stream.
if (!bskip) {
iter = atommap.begin();
if (iter!=atommap.end()) {
int aid0 = iter->second;
MolAtomPtr pA = m_pMol->getAtom(aid0);
if (!pA.isnull()) {
MolResiduePtr pRes = pA->getParentResidue();
if (!pRes.isnull()) {
pRes->setPropStr("noautogen", "true");
}
}
}
}
}
/*
*/
return true;
}
示例14: createSESFromMol
void MolSurfObj::createSESFromMol(MolCoordPtr pMol, SelectionPtr pSel, double density, double probe_r)
{
AtomIterator aiter(pMol, pSel);
int i, natoms=0;
// count atom number
for (aiter.first(); aiter.hasMore(); aiter.next()) {
MolAtomPtr pAtom = aiter.get();
if (!chkAltConf(pAtom)) continue;
MB_ASSERT(!pAtom.isnull());
++natoms;
}
std::vector< BALL::TSphere3<double> > spheres(natoms);
TopparManager *pTM = TopparManager::getInstance();
const double vdw_default = 2.0;
// copy to the m_data
Vector4D pos;
for (i=0,aiter.first(); aiter.hasMore()&&i<natoms; aiter.next()) {
MolAtomPtr pAtom = aiter.get();
if (!chkAltConf(pAtom)) continue;
pos = pAtom->getPos();
double vdw = pTM->getVdwRadius(pAtom, false);
if (vdw<0)
vdw = vdw_default;
spheres.at(i) = BALL::TSphere3<double>(BALL::TVector3<double>(pos.x(), pos.y(), pos.z()), vdw);
++i;
}
double diff = probe_r < 1.5 ? 0.01 : -0.01;
bool ok = false;
double rad = probe_r;
BALL::ReducedSurface *pRS = NULL;
BALL::SolventExcludedSurface *pSES = NULL;
for (int i=0; !ok && i<10; ++i) {
pRS = new BALL::ReducedSurface(spheres, rad);
pRS->compute();
pSES = new BALL::SolventExcludedSurface(pRS);
pSES->compute();
if (pSES->check())
break;
// failed --> retry with different probe radius
delete pRS; pRS = NULL;
delete pSES; pSES = NULL;
rad += diff;
LOG_DPRINTLN("MolSurfBuilder> SES check failed --> retry (%d) with different probe r=%f", i, rad);
}
if (pSES==NULL) {
//std::cout << "ses check failed" << std::endl;
LOG_DPRINTLN("MolSurfBuilder> SES generation failed.");
MB_THROW(qlib::RuntimeException, "MolSurfBuilder> SES generation failed.");
return;
}
MB_ASSERT(pSES!=NULL&&pRS!=NULL);
BALL::TriangulatedSES surface(pSES, density);
surface.compute();
int nverts = surface.getNumberOfPoints();
int nfaces = surface.getNumberOfTriangles();
setVertSize(nverts);
setFaceSize(nfaces);
{
BALL::TriangulatedSES::ConstPointIterator iter = surface.beginPoint();
BALL::TriangulatedSES::ConstPointIterator eiter = surface.endPoint();
int i = 0;
for (;iter != eiter; ++iter) {
BALL::TrianglePoint& tri_point = **iter;
Vector4D n(tri_point.normal_.x,tri_point.normal_.y,tri_point.normal_.z);
Vector4D v(tri_point.point_.x,tri_point.point_.y,tri_point.point_.z);
setVertex(i, v, n);
tri_point.setIndex(i);
i++;
}
}
{
BALL::TriangulatedSES::ConstTriangleIterator iter = surface.beginTriangle();
BALL::TriangulatedSES::ConstTriangleIterator eiter = surface.endTriangle();
int i=0;
for (; iter!=eiter; ++iter, ++i) {
//std::cout << (**iter) << std::endl;
int v1 = (*iter)->getVertex(0)->getIndex();
int v2 = (*iter)->getVertex(1)->getIndex();
int v3 = (*iter)->getVertex(2)->getIndex();
//printf("%6d %6d %6d\n", v1, v2, v3);
setFace(i, v1, v2, v3);
//.........这里部分代码省略.........