本文整理汇总了C++中Molecule::getRSiteBits方法的典型用法代码示例。如果您正苦于以下问题:C++ Molecule::getRSiteBits方法的具体用法?C++ Molecule::getRSiteBits怎么用?C++ Molecule::getRSiteBits使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类Molecule
的用法示例。
在下文中一共展示了Molecule::getRSiteBits方法的2个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: _encodeAtom
void CmfSaver::_encodeAtom (Molecule &mol, int idx, const int *mapping)
{
int number = 0;
if (mol.isPseudoAtom(idx))
{
const char *str = mol.getPseudoAtom(idx);
size_t len = strlen(str);
if (len < 1)
throw Error("empty pseudo-atom");
if (len > 255)
throw Error("pseudo-atom labels %d characters long are not supported (255 is the limit)", len);
_encode(CMF_PSEUDOATOM);
_encode((byte)len);
do
{
_encode(*str);
} while (*(++str) != 0);
}
else if (mol.isRSite(idx))
{
int bits = mol.getRSiteBits(idx);
if (bits > 255)
{
_encode(CMF_RSITE_EXT);
_output->writePackedUInt((unsigned int)bits);
}
else
{
_encode(CMF_RSITE);
_encode(bits);
}
}
else
{
number = mol.getAtomNumber(idx);
if (number <= 0 || number >= ELEM_MAX)
throw Error("unexpected atom label");
_encode(number);
}
int charge = mol.getAtomCharge(idx);
if (charge != 0)
{
int charge2 = charge - CMF_MIN_CHARGE;
if (charge2 < 0 || charge2 >= CMF_NUM_OF_CHARGES)
{
_encode(CMF_CHARGE_EXT);
int charge3 = charge + 128;
if (charge3 < 0 || charge >= 256)
throw Error("unexpected atom charge: %d", charge);
_encode(charge3);
}
else
_encode(charge2 + CMF_CHARGES);
}
int isotope = mol.getAtomIsotope(idx);
if (isotope > 0)
{
int deviation = isotope - Element::getDefaultIsotope(number);
if (deviation == 0)
_encode(CMF_ISOTOPE_ZERO);
else if (deviation == 1)
_encode(CMF_ISOTOPE_PLUS1);
else if (deviation == 2)
_encode(CMF_ISOTOPE_PLUS2);
else if (deviation == -1)
_encode(CMF_ISOTOPE_MINUS1);
else if (deviation == -2)
_encode(CMF_ISOTOPE_MINUS2);
else
{
deviation += 100;
if (deviation < 0 || deviation > 255)
throw Error("unexpected %s isotope: %d", Element::toString(number), isotope);
_encode(CMF_ISOTOPE_OTHER);
_encode(deviation);
}
}
int radical = 0;
if (!mol.isPseudoAtom(idx) && !mol.isRSite(idx))
{
try
{
radical = mol.getAtomRadical(idx);
}
catch (Element::Error)
{
//.........这里部分代码省略.........
示例2: tryExpandToken
bool AbbreviationExpander::tryExpandToken (TokenChain &tokens, size_t &offset, Molecule &m, AttPoint &attach_to)
{
Token &cur = tokens[offset];
if (cur.multiplier != 1)
return false;
Array<int> connection_points;
if (cur.type == Token::Element)
{
if (cur.index == ELEM_H)
{
offset++;
attach_to = AttPoint(-1, 0);
return true;
}
int added = m.addAtom(cur.index);
// Get the number of bonds to connect
int valence, hyd;
int conn = attach_to.order;
if (offset + 1 < tokens.size())
{
Token &next = tokens[offset + 1];
conn += next.multiplier;
}
if (!Element::calcValence(cur.index, 0, 0, conn, valence, hyd, false))
{
// Ignore next atom
// Appear in the OH3C case when H3 is belong to C
conn = attach_to.order;
if (!Element::calcValence(cur.index, 0, 0, conn, valence, hyd, false))
return false;
}
for (int i = 0; i < hyd + conn; i++)
connection_points.push(added);
}
else if (cur.type == Token::Pattern)
{
// Add pattern
BufferScanner scanner(abbreviations[cur.index]->expansion.c_str());
SmilesLoader loader(scanner);
Molecule abbr;
loader.loadMolecule(abbr);
Array<int> mapping;
Array<int> rsites;
m.mergeWithMolecule(abbr, &mapping);
for (int v = abbr.vertexBegin(); v != abbr.vertexEnd(); v = abbr.vertexNext(v))
{
int mapped = mapping[v];
if (m.isRSite(mapped))
{
dword bits = m.getRSiteBits(mapped);
int id1 = bitGetOneHOIndex(bits);
int id2 = bitGetOneHOIndex(bits);
if (id1 != id2)
throw Exception("Invalid abbreviations specification: %s",
abbreviations[cur.index]->expansion.c_str());
if (id1 != 0)
id1--; // R == R1
const Vertex &vertex = m.getVertex(mapped);
int nei = vertex.neiBegin();
connection_points.expandFill(id1 + 1, -1);
connection_points[id1] = vertex.neiVertex(nei); // Point connected to the RSite
rsites.push(mapped);
}
}
m.removeAtoms(rsites);
}
else
return false;
bool rollback = false;
int atom_bound = m.vertexCount();
size_t offset2 = offset + 1;
attachBond(m, attach_to, connection_points[0]);
int i = attach_to.order;
while (i < connection_points.size() - 1 && !rollback)
{
if (offset2 >= tokens.size())
{
// If we are at the end then there can be an implicit double bond
// Example: -CH2CH=
// When we read C H there are no more tokens
break;
}
Token &next = tokens[offset2];
for (int j = 0; j < next.multiplier; j++)
{
if (i >= connection_points.size())
{
//.........这里部分代码省略.........