本文整理汇总了C++中Molecule::getAtomXyz方法的典型用法代码示例。如果您正苦于以下问题:C++ Molecule::getAtomXyz方法的具体用法?C++ Molecule::getAtomXyz怎么用?C++ Molecule::getAtomXyz使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类Molecule
的用法示例。
在下文中一共展示了Molecule::getAtomXyz方法的3个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: getParityInChI
int MoleculeInChIUtils::getParityInChI (Molecule &mol, int bond)
{
if (mol.cis_trans.getParity(bond) == 0)
throw Error("Specified bond ins't stereogenic");
const Edge &edge = mol.getEdge(bond);
const int *subst = mol.cis_trans.getSubstituents(bond);
// Find substituents with maximal indices
int max_first = __max(subst[0], subst[1]);
int max_second = __max(subst[2], subst[3]);
int value = MoleculeCisTrans::sameside(
mol.getAtomXyz(edge.beg), mol.getAtomXyz(edge.end),
mol.getAtomXyz(max_first), mol.getAtomXyz(max_second));
if (value > 0)
return -1;
return 1;
}
示例2: expandAtomAbbreviation
bool AbbreviationExpander::expandAtomAbbreviation (Molecule &mol, int v)
{
// Determine bonds configuration: number of bonds on the left and on the right
Vec3f &pos = mol.getAtomXyz(v);
const Vertex &vertex = mol.getVertex(v);
int count_left = 0, count_right = 0, count_middle = 0;
Array<int> left_atoms, right_atoms;
for (int nei = vertex.neiBegin(); nei != vertex.neiEnd(); nei = vertex.neiNext(nei))
{
int nei_atom = vertex.neiVertex(nei);
Vec3f &nei_pos = mol.getAtomXyz(nei_atom);
int order = mol.getBondOrder(vertex.neiEdge(nei));
if (nei_pos.x < pos.x)
{
count_left += order;
left_atoms.push(nei_atom);
}
else
{
count_right += order;
right_atoms.push(nei_atom);
}
Vec3f diff = nei_pos;
diff.sub(pos);
if (fabs(diff.y) > fabs(diff.x))
count_middle += order;
}
int input_order, output_order;
bool on_left = false, on_right = false, is_single = false;
if (vertex.degree() == 1)
{
if (count_middle)
on_left = on_right = true;
if (count_left)
on_right = true;
if (count_right)
on_left = true;
input_order = std::max(count_left, count_right);
output_order = 0;
is_single = true;
}
else
{
on_right = true;
input_order = count_left;
output_order = count_right;
}
// Try to expand according to the directions
Array<Options> options;
if (on_right && !on_left)
{
options.push(Options(RIGHT, RIGHT));
options.push(Options(LEFT, LEFT));
}
else
{
if (on_right)
options.push(Options(RIGHT, RIGHT));
if (on_left)
{
options.push(Options(LEFT, LEFT));
options.push(Options(LEFT, RIGHT));
options.push(Options(RIGHT, RIGHT));
options.push(Options(LEFT, LEFT, 2));
}
}
// Duplicate all the options with ignore case flag
int opt_cnt = options.size();
for (int i = 0; i < opt_cnt; i++)
{
Options opt = options[i];
opt.ignore_case = true;
options.push(opt);
}
bool found = false;
Molecule expanded;
for (int i = 0; i < options.size(); i++)
{
options[i].set(*this);
if (expand(mol.getPseudoAtom(v), input_order, output_order, expanded))
{
found = true;
break;
}
}
if (!found)
return false;
// Merge expanded abbreviation with the source molecule and connect bonds
Array<int> mapping;
mol.mergeWithMolecule(expanded, &mapping);
//.........这里部分代码省略.........
示例3: generateInchiInput
void IndigoInchi::generateInchiInput (Molecule &mol, inchi_Input &input,
Array<inchi_Atom> &atoms, Array<inchi_Stereo0D> &stereo)
{
QS_DEF(Array<int>, mapping);
mapping.clear_resize(mol.vertexEnd());
mapping.fffill();
int index = 0;
for (int v = mol.vertexBegin(); v != mol.vertexEnd(); v = mol.vertexNext(v))
mapping[v] = index++;
atoms.clear_resize(index);
atoms.zerofill();
stereo.clear();
for (int v = mol.vertexBegin(); v != mol.vertexEnd(); v = mol.vertexNext(v))
{
inchi_Atom &atom = atoms[mapping[v]];
int atom_number = mol.getAtomNumber(v);
if (atom_number == ELEM_PSEUDO)
throw IndigoError("Molecule with pseudoatom (%s) cannot be converted into InChI", mol.getPseudoAtom(v));
if (atom_number == ELEM_RSITE)
throw IndigoError("Molecule with RGroups cannot be converted into InChI");
strncpy(atom.elname, Element::toString(atom_number), ATOM_EL_LEN);
Vec3f &c = mol.getAtomXyz(v);
atom.x = c.x;
atom.y = c.y;
atom.z = c.z;
// connectivity
const Vertex &vtx = mol.getVertex(v);
int nei_idx = 0;
for (int nei = vtx.neiBegin(); nei != vtx.neiEnd(); nei = vtx.neiNext(nei))
{
int v_nei = vtx.neiVertex(nei);
atom.neighbor[nei_idx] = mapping[v_nei];
int edge_idx = vtx.neiEdge(nei);
atom.bond_type[nei_idx] = getInchiBondType(mol.getBondOrder(edge_idx));
int bond_stereo = INCHI_BOND_STEREO_NONE;
if (mol.cis_trans.isIgnored(edge_idx))
bond_stereo = INCHI_BOND_STEREO_DOUBLE_EITHER;
else
{
int dir = mol.getBondDirection2(v, v_nei);
if (mol.getBondDirection2(v, v_nei) == BOND_EITHER)
bond_stereo = INCHI_BOND_STEREO_SINGLE_1EITHER;
else if (mol.getBondDirection2(v_nei, v) == BOND_EITHER)
bond_stereo = INCHI_BOND_STEREO_SINGLE_2EITHER;
}
atom.bond_stereo[nei_idx] = bond_stereo;
nei_idx++;
}
atom.num_bonds = vtx.degree();
// Other properties
atom.isotopic_mass = mol.getAtomIsotope(v);
atom.radical = mol.getAtomRadical(v);
atom.charge = mol.getAtomCharge(v);
// Hydrogens
int hcount = -1;
if (Molecule::shouldWriteHCount(mol, v) || mol.isExplicitValenceSet(v) || mol.isImplicitHSet(v))
{
if (mol.getAtomAromaticity(v) == ATOM_AROMATIC &&
atom_number == ELEM_C && atom.charge == 0 && atom.radical == 0)
{
// Do not set number of implicit hydrogens here as InChI throws an exception on
// the molecule B1=CB=c2cc3B=CC=c3cc12
;
}
else
// set -1 to tell InChI add implicit hydrogens automatically
hcount = mol.getImplicitH_NoThrow(v, -1);
}
atom.num_iso_H[0] = hcount;
}
// Process cis-trans bonds
for (int e = mol.edgeBegin(); e != mol.edgeEnd(); e = mol.edgeNext(e))
{
if (mol.cis_trans.getParity(e) == 0)
continue;
int subst[4];
mol.cis_trans.getSubstituents_All(e, subst);
const Edge &edge = mol.getEdge(e);
inchi_Stereo0D &st = stereo.push();
// Write it as
// #0 - #1 = #2 - #3
st.neighbor[0] = mapping[subst[0]];
st.neighbor[1] = mapping[edge.beg];
st.neighbor[2] = mapping[edge.end];
st.neighbor[3] = mapping[subst[2]];
if (mol.cis_trans.getParity(e) == MoleculeCisTrans::CIS)
st.parity = INCHI_PARITY_ODD;
//.........这里部分代码省略.........