本文整理汇总了C++中OBAtom::IsHydrogen方法的典型用法代码示例。如果您正苦于以下问题:C++ OBAtom::IsHydrogen方法的具体用法?C++ OBAtom::IsHydrogen怎么用?C++ OBAtom::IsHydrogen使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类OBAtom
的用法示例。
在下文中一共展示了OBAtom::IsHydrogen方法的3个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1:
void fingerprint2::getFragments(vector<int> levels, vector<int> curfrag,
int level, OBAtom* patom, OBBond* pbond)
{
//Recursive routine to analyse schemical structure and populate fragset and ringset
//Hydrogens,charges(except dative bonds), spinMultiplicity ignored
const int Max_Fragment_Size = 7;
int bo=0;
if(pbond)
{
bo = pbond->IsAromatic() ? 5 : pbond->GetBO();
// OBAtom* pprevat = pbond->GetNbrAtom(patom);
// if(patom->GetFormalCharge() && (patom->GetFormalCharge() == -pprevat->GetFormalCharge()))
// ++bo; //coordinate (dative) bond eg C[N+]([O-])=O is seen as CN(=O)=O
}
curfrag.push_back(bo);
curfrag.push_back(patom->GetAtomicNum());
levels[patom->GetIdx()-1] = level;
vector<OBEdgeBase*>::iterator itr;
OBBond *pnewbond;
// PrintFpt(curfrag,(int)patom);
for (pnewbond = patom->BeginBond(itr);pnewbond;pnewbond = patom->NextBond(itr))
{
if(pnewbond==pbond) continue; //don't retrace steps
OBAtom* pnxtat = pnewbond->GetNbrAtom(patom);
if(pnxtat->IsHydrogen()) continue;
int atlevel = levels[pnxtat->GetIdx()-1];
if(atlevel) //ring
{
if(atlevel==1)
{
//If complete ring (last bond is back to starting atom) add bond at front
//and save in ringset
curfrag[0] = bo;
ringset.insert(curfrag);
}
}
else //no ring
{
if(level<Max_Fragment_Size)
{
// TRACE("level=%d size=%d %p frag[0]=%p\n",level, curfrag.size(),&curfrag, &(curfrag[0]));
//Do the next atom; levels, curfrag are passed by value and hence copied
getFragments(levels, curfrag, level+1, pnxtat, pnewbond);
}
}
}
//do not save C,N,O single atom fragments
if(curfrag[0]==0 &&
(level>1 || patom->GetAtomicNum()>8 || patom->GetAtomicNum()<6))
{
fragset.insert(curfrag); //curfrag ignored if an identical fragment already present
// PrintFpt(curfrag,level);
}
}
示例2: levels
bool fingerprint2::GetFingerprint(OBBase* pOb, vector<unsigned int>&fp, int nbits)
{
OBMol* pmol = dynamic_cast<OBMol*>(pOb);
if(!pmol) return false;
fp.resize(1024/Getbitsperint());
fragset.clear();//needed because now only one instance of fp class
ringset.clear();
//identify fragments starting at every atom
OBAtom *patom;
vector<OBNodeBase*>::iterator i;
for (patom = pmol->BeginAtom(i);patom;patom = pmol->NextAtom(i))
{
if(patom->IsHydrogen()) continue;
vector<int> curfrag;
vector<int> levels(pmol->NumAtoms());
getFragments(levels, curfrag, 1, patom, NULL);
}
// TRACE("%s %d frags before; ",pmol->GetTitle(),fragset.size());
//Ensure that each chemically identical fragment is present only in a single
DoRings();
DoReverses();
SetItr itr;
_ss.str("");
for(itr=fragset.begin();itr!=fragset.end();++itr)
{
//Use hash of fragment to set a bit in the fingerprint
int hash = CalcHash(*itr);
SetBit(fp,hash);
if(!(Flags() & FPT_NOINFO))
PrintFpt(*itr,hash);
}
if(nbits)
Fold(fp, nbits);
// TRACE("%d after\n",fragset.size());
return true;
}
示例3: DrawMolecule
//.........这里部分代码省略.........
for (atom = mol->BeginAtom(i); atom; atom = mol->NextAtom(i)) {
double x = atom->GetX();
double y = atom->GetY();
int alignment = GetLabelAlignment(atom);
bool rightAligned = false;
switch (alignment) {
case TopRight:
case CenterRight:
case BottomRight:
rightAligned = true;
default:
break;
}
if((d->options & internalColor) && atom->HasData("color"))
d->painter->SetPenColor(OBColor(atom->GetData("color")->GetValue()));
else if(d->options & bwAtoms)
d->painter->SetPenColor(d->bondColor);
else
d->painter->SetPenColor(OBColor(etab.GetRGB(atom->GetAtomicNum())));
//charge and radical
int charge = atom->GetFormalCharge();
int spin = atom->GetSpinMultiplicity();
if(charge || spin) {
OBFontMetrics metrics = d->painter->GetFontMetrics("N");
double yoffset = d->HasLabel(atom) ? 0.4 * metrics.height : 0.0;
switch (GetLabelAlignment(atom)) {
case TopCenter:
case TopRight:
case TopLeft:
case CenterLeft:
case CenterRight:
yoffset = - 1.2 * metrics.height;
}
stringstream ss;
if(charge) {
if(abs(charge)!=1)
ss << abs(charge);
ss << (charge>0 ? "+" : "-") ;
}
if(spin) {
ss << (spin==2 ? "." : "..");
yoffset += 0.5 * metrics.height;
}
if(spin || charge<0)
d->painter->SetFontSize(2 * metrics.fontSize);
d->painter->DrawText(x-0.4*metrics.width, y-yoffset, ss.str());
d->painter->SetFontSize(metrics.fontSize);//restore
}
if (atom->IsCarbon()) {
if(!(d->options & drawAllC))
{
if (atom->GetValence() > 1)
continue;
if ((atom->GetValence() == 1) && !(d->options & drawTermC))//!d->drawTerminalC)
continue;
}
}
stringstream ss;
AliasData* ad = NULL;
if(d->aliasMode && atom->HasData(AliasDataType))
ad = static_cast<AliasData*>(atom->GetData(AliasDataType));
//For unexpanded aliases use appropriate form of alias instead of element symbol, Hs, etc
if(ad && !ad->IsExpanded())
{
ss <<ad->GetAlias(rightAligned);
OBColor aliasColor = !ad->GetColor().empty() ? ad->GetColor() : d->bondColor;
d->painter->SetPenColor(aliasColor);
}
else {
const char* atomSymbol;
if(atom->IsHydrogen() && atom->GetIsotope()>1)
atomSymbol = atom->GetIsotope()==2 ? "D" : "T";
else
atomSymbol = etab.GetSymbol(atom->GetAtomicNum());
unsigned int hCount = atom->ImplicitHydrogenCount();
// rightAligned:
// false CH3
// true H3C
if (hCount && rightAligned)
ss << "H";
if ((hCount > 1) && rightAligned)
ss << hCount;
ss << atomSymbol;
if (hCount && !rightAligned)
ss << "H";
if ((hCount > 1) && !rightAligned)
ss << hCount;
}
d->DrawAtomLabel(ss.str(), alignment, vector3(x, y, 0.0));
}
return true;
}