本文整理汇总了C++中OBAtom::GetValence方法的典型用法代码示例。如果您正苦于以下问题:C++ OBAtom::GetValence方法的具体用法?C++ OBAtom::GetValence怎么用?C++ OBAtom::GetValence使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类OBAtom
的用法示例。
在下文中一共展示了OBAtom::GetValence方法的11个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: GetRootAtom
unsigned int OBRing::GetRootAtom()
{
vector<int>::iterator i;
OBMol *mol = (OBMol*)GetParent();
//if (!IsAromatic())
// return 0;
if (Size() == 6)
for (i = _path.begin();i != _path.end();++i)
if (mol->GetAtom(*i)->GetAtomicNum() != OBElements::Carbon)
return (*i);
if (Size() == 5)
for (i = _path.begin();i != _path.end();++i) {
OBAtom *atom = mol->GetAtom(*i);
switch (atom->GetAtomicNum()) {
case OBElements::Sulfur:
if (atom->GetValence() == 2)
return (*i);
break;
case OBElements::Oxygen:
if (atom->GetValence() == 2)
return (*i);
break;
case OBElements::Nitrogen:
if (atom->BOSum() == atom->GetValence())
return (*i);
break;
}
}
return 0;
}
示例2: GetRootAtom
unsigned int OBRing::GetRootAtom()
{
vector<int>::iterator i;
OBMol *mol = (OBMol*)GetParent();
//if (!IsAromatic())
// return 0;
if (Size() == 6)
for (i = _path.begin();i != _path.end();++i)
if (!(mol->GetAtom(*i))->IsCarbon())
return (*i);
if (Size() == 5)
for (i = _path.begin();i != _path.end();++i) {
OBAtom *atom = mol->GetAtom(*i);
if (atom->IsSulfur() && (atom->GetValence() == 2))
return (*i);
if (atom->IsOxygen() && (atom->GetValence() == 2))
return (*i);
if (atom->IsNitrogen() && (atom->BOSum() == atom->GetValence()))
return (*i);
}
return 0;
}
示例3: AssignImplicitValence
void OBAtomTyper::AssignImplicitValence(OBMol &mol)
{
// FF Make sure that valence has not been perceived
if(mol.HasImplicitValencePerceived())
return;
if (!_init)
Init();
mol.SetImplicitValencePerceived();
obErrorLog.ThrowError(__FUNCTION__,
"Ran OpenBabel::AssignImplicitValence", obAuditMsg);
// FF Ensure that the aromatic typer will not be called
int oldflags = mol.GetFlags(); // save the current state flags
mol.SetAromaticPerceived(); // and set the aromatic perceived flag on
OBAtom *atom;
vector<OBAtom*>::iterator k;
for (atom = mol.BeginAtom(k);atom;atom = mol.NextAtom(k))
atom->SetImplicitValence(atom->GetValence());
vector<vector<int> >::iterator j;
vector<pair<OBSmartsPattern*,int> >::iterator i;
for (i = _vimpval.begin();i != _vimpval.end();++i)
if (i->first->Match(mol))
{
_mlist = i->first->GetMapList();
for (j = _mlist.begin();j != _mlist.end();++j)
mol.GetAtom((*j)[0])->SetImplicitValence(i->second);
}
if (!mol.HasAromaticCorrected())
CorrectAromaticNitrogens(mol);
for (atom = mol.BeginAtom(k);atom;atom = mol.NextAtom(k))
{
if (atom->GetImplicitValence() < atom->GetValence())
atom->SetImplicitValence(atom->GetValence());
}
// FF Come back to the initial flags
mol.SetFlags(oldflags);
return;
}
示例4: WriteHIN
bool WriteHIN(ostream &ofs,OBMol &mol)
{
unsigned int i, file_num = 1;
string str,str1;
char buffer[BUFF_SIZE];
OBAtom *atom;
OBBond *bond;
vector<OBEdgeBase*>::iterator j;
char bond_char;
ofs << "mol " << file_num << " " << mol.GetTitle() << endl;;
for(i = 1;i <= mol.NumAtoms(); i++)
{
atom = mol.GetAtom(i);
sprintf(buffer,"atom %d - %-3s ** - %8.5f %8.5f %8.5f %8.5f %d ",
i,
etab.GetSymbol(atom->GetAtomicNum()),
atom->GetPartialCharge(),
atom->GetX(),
atom->GetY(),
atom->GetZ(),
atom->GetValence());
ofs << buffer;
for (bond = atom->BeginBond(j); bond; bond = atom->NextBond(j))
{
switch(bond->GetBO())
{
case 1 : bond_char = 's'; break;
case 2 : bond_char = 'd'; break;
case 3 : bond_char = 't'; break;
case 5 : bond_char = 'a'; break;
default: bond_char = 's'; break;
}
sprintf(buffer,"%d %c ", (bond->GetNbrAtom(atom))->GetIdx(), bond_char);
ofs << buffer;
}
ofs << endl;
}
ofs << "endmol " << file_num << endl;
return(true);
}
示例5: WriteMolecule
//.........这里部分代码省略.........
snprintf(padded_name, sizeof(padded_name), " %-3s", tmp);
strncpy(type_name,padded_name,4);
type_name[4] = '\0';
}
else
{
/*
type_name[4] = type_name[3];
type_name[3] = type_name[2];
type_name[2] = type_name[1];
type_name[1] = type_name[0];
type_name[0] = type_name[4];
*/
type_name[4] = '\0';
}
}
res_num = res->GetNum();
}
else
{
strcpy(the_res,"UNK");
the_res[3] = '\0';
snprintf(padded_name,sizeof(padded_name), "%s",type_name);
strncpy(type_name,padded_name,4);
type_name[4] = '\0';
res_num = 1;
}
element_name = etab.GetSymbol(atom->GetAtomicNum());
int charge = atom->GetFormalCharge();
char scharge[3] = { ' ', ' ', '\0' };
if(0 != charge)
{
snprintf(scharge, 3, "%+d", charge);
char tmp = scharge[1];
scharge[1] = scharge[0];
scharge[0] = tmp;
}
snprintf(buffer, BUFF_SIZE, "%s%5d %-4s %-3s %c%4d %8.3f%8.3f%8.3f 1.00 0.00 %2s%2s\n",
het?"HETATM":"ATOM ",
i,
type_name,
the_res,
the_chain,
res_num,
atom->GetX(),
atom->GetY(),
atom->GetZ(),
element_name,
scharge);
ofs << buffer;
}
OBAtom *nbr;
vector<OBBond*>::iterator k;
for (i = 1; i <= mol.NumAtoms(); i ++)
{
atom = mol.GetAtom(i);
if (atom->GetValence() == 0)
continue; // no need to write a CONECT record -- no bonds
snprintf(buffer, BUFF_SIZE, "CONECT%5d", i);
ofs << buffer;
// Write out up to 4 real bonds per line PR#1711154
int currentValence = 0;
for (nbr = atom->BeginNbrAtom(k);nbr;nbr = atom->NextNbrAtom(k))
{
snprintf(buffer, BUFF_SIZE, "%5d", nbr->GetIdx());
ofs << buffer;
if (++currentValence % 4 == 0) {
// Add the trailing space to finish this record
ofs << " \n";
// write the start of a new CONECT record
snprintf(buffer, BUFF_SIZE, "CONECT%5d", i);
ofs << buffer;
}
}
// Add trailing spaces
int remainingValence = atom->GetValence() % 4;
for (int count = 0; count < (4 - remainingValence); count++) {
snprintf(buffer, BUFF_SIZE, " ");
ofs << buffer;
}
ofs << " \n";
}
snprintf(buffer, BUFF_SIZE, "MASTER 0 0 0 0 0 0 0 0 ");
ofs << buffer;
snprintf(buffer, BUFF_SIZE, "%4d 0 %4d 0\n",mol.NumAtoms(),mol.NumAtoms());
ofs << buffer;
ofs << "END\n";
if (model_num) {
ofs << "ENDMDL" << endl;
}
return(true);
}
示例6: WriteMolecule
bool BGFFormat::WriteMolecule(OBBase* pOb, OBConversion* pConv)
{
OBMol* pmol = dynamic_cast<OBMol*>(pOb);
if(pmol==NULL)
return false;
//Define some references so we can use the old parameter names
ostream &ofs = *pConv->GetOutStream();
OBMol &mol = *pmol;
vector<OBAtom*>::iterator i;
int max_val;
OBAtom *atom;
char buffer[BUFF_SIZE];
char elmnt_typ[8], dreid_typ[8], atm_sym[16], max_val_str[8];
mol.Kekulize();
ofs << "BIOGRF 200\n";
snprintf(buffer, BUFF_SIZE, "DESCRP %s\n",mol.GetTitle());
ofs << buffer;
snprintf(buffer, BUFF_SIZE, "REMARK BGF file created by Open Babel %s\n",BABEL_VERSION);
ofs << "FORCEFIELD DREIDING \n";
// write unit cell if available
if (mol.HasData(OBGenericDataType::UnitCell))
{
OBUnitCell *uc = (OBUnitCell*)mol.GetData(OBGenericDataType::UnitCell);
// e.g. CRYSTX 49.30287 49.23010 25.45631 90.00008 89.99995 57.10041
snprintf(buffer, BUFF_SIZE,
"CRYSTX%12.5f%12.5f%12.5f%12.5f%12.5f%12.5f",
uc->GetA(), uc->GetB(), uc->GetC(),
uc->GetAlpha() , uc->GetBeta(), uc->GetGamma());
ofs << buffer << "\n";
}
ofs << "FORMAT ATOM (a6,1x,i5,1x,a5,1x,a3,1x,a1,1x,a5,3f10.5,1x,a5,i3,i2,1x,f8.5)\n";
ttab.SetFromType("INT");
for (atom = mol.BeginAtom(i);atom;atom = mol.NextAtom(i))
{
strncpy(elmnt_typ,etab.GetSymbol(atom->GetAtomicNum()), 7); // make sure to null-terminate
elmnt_typ[sizeof(elmnt_typ) - 1] = '0';
ToUpper(elmnt_typ);
ttab.SetToType("DRE");
ttab.Translate(dreid_typ,atom->GetType());
ttab.SetToType("HAD");
ttab.Translate(max_val_str,atom->GetType());
max_val = atoi(max_val_str);
if (max_val == 0)
max_val = 1;
snprintf(atm_sym,16,"%s%d",elmnt_typ,atom->GetIdx());
snprintf(buffer,BUFF_SIZE,"%6s %5d %-5s %3s %1s %5s%10.5f%10.5f%10.5f %-5s%3d%2d %8.5f\n",
"HETATM",
atom->GetIdx(),
atm_sym,
"RES",
"A",
"444",
atom->GetX(),
atom->GetY(),
atom->GetZ(),
dreid_typ,
max_val,
0,
atom->GetPartialCharge());
ofs << buffer;
}
ofs<< "FORMAT CONECT (a6,12i6)\n\n";
OBAtom *nbr;
vector<OBBond*>::iterator j;
for (atom = mol.BeginAtom(i);atom;atom = mol.NextAtom(i))
if (atom->GetValence())
{
snprintf(buffer,BUFF_SIZE,"CONECT%6d",atom->GetIdx());
ofs << buffer;
for (nbr = atom->BeginNbrAtom(j);nbr;nbr = atom->NextNbrAtom(j))
{
snprintf(buffer,BUFF_SIZE,"%6d",nbr->GetIdx());
ofs << buffer;
}
ofs << endl;
snprintf(buffer,BUFF_SIZE,"ORDER %6d",atom->GetIdx());
ofs << buffer;
for (nbr = atom->BeginNbrAtom(j);nbr;nbr = atom->NextNbrAtom(j))
{
snprintf(buffer,BUFF_SIZE,"%6d",(*j)->GetBO());
ofs << buffer;
}
ofs << endl;
}
ofs << "END" << endl;
return(true);
}
示例7: 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;
}
示例8: WriteMolecule
bool HINFormat::WriteMolecule(OBBase* pOb, OBConversion* pConv)
{
OBMol* pmol = dynamic_cast<OBMol*>(pOb);
if(pmol==NULL)
return false;
//Define some references so we can use the old parameter names
ostream &ofs = *pConv->GetOutStream();
OBMol &mol = *pmol;
unsigned int i, file_num = 1;
string str,str1;
char buffer[BUFF_SIZE];
OBAtom *atom;
OBBond *bond;
vector<OBBond*>::iterator j;
char bond_char;
// make sure to escape titles in double quotes
// PR#1501694
ofs << "mol " << file_num << " \"" << mol.GetTitle() << "\"\n";
for(i = 1;i <= mol.NumAtoms(); i++)
{
atom = mol.GetAtom(i);
snprintf(buffer, BUFF_SIZE, "atom %d - %-3s ** - %8.5f %8.5f %8.5f %8.5f %d ",
i,
etab.GetSymbol(atom->GetAtomicNum()),
atom->GetPartialCharge(),
atom->GetX(),
atom->GetY(),
atom->GetZ(),
atom->GetValence());
ofs << buffer;
for (bond = atom->BeginBond(j); bond; bond = atom->NextBond(j))
{
switch(bond->GetBO())
{
case 1 :
bond_char = 's';
break;
case 2 :
bond_char = 'd';
break;
case 3 :
bond_char = 't';
break;
case 5 :
bond_char = 'a';
break;
default:
bond_char = 's';
break;
}
if (bond->IsAromatic())
bond_char = 'a';
snprintf(buffer,BUFF_SIZE, "%d %c ", (bond->GetNbrAtom(atom))->GetIdx(), bond_char);
ofs << buffer;
}
ofs << endl;
}
ofs << "endmol " << file_num << endl;
return(true);
}
示例9: IsOnSameAtom
bool OBCisTransStereo::IsOnSameAtom(unsigned long id1, unsigned long id2) const
{
const OBMol *mol = GetMolecule();
if (!mol) {
obErrorLog.ThrowError(__FUNCTION__, "OBCisTransStereo::IsOnSameAtom : No valid molecule set", obError);
return false;
}
OBAtom *begin = mol->GetAtomById(m_cfg.begin);
if (!begin) {
obErrorLog.ThrowError(__FUNCTION__, "OBCisTransStereo::IsOnSameAtom : Begin reference id is not valid.", obError);
return false;
}
OBAtom *end = mol->GetAtomById(m_cfg.end);
if (!end) {
obErrorLog.ThrowError(__FUNCTION__, "OBCisTransStereo::IsOnSameAtom : End reference id is not valid.", obError);
return false;
}
OBAtom *a = mol->GetAtomById(id1);
OBAtom *b = mol->GetAtomById(id2);
if (a && b) {
// both on begin atom?
if (a->IsConnected(begin) && b->IsConnected(begin))
return true;
// both on end atom?
if (a->IsConnected(end) && b->IsConnected(end))
return true;
return false;
} else {
if (a) {
// b atom not found, could be a deleted hydrogen...
if (a->IsConnected(begin)) {
// a is connected to begin. if this is the atom missing a hydrogen, return false
if (begin->GetValence() == 2)
return true;
// check if the end atom really is missing an atom
if (end->GetValence() != 2) {
obErrorLog.ThrowError(__FUNCTION__,
"OBCisTransStereo::IsOnSameAtom : id2 is not valid and is not a missing hydrogen.", obError);
return false;
}
// inform user we are treating id2 as deleted hydrogen
obErrorLog.ThrowError(__FUNCTION__,
"OBCisTransStereo::IsOnSameAtom : Atom with id2 doesn't exist anymore, must be a (deleted) hydrogen.", obInfo);
} else if (a->IsConnected(end)) {
// a is connected to end. again, if this is the atom missing a hydrogen, return false
if (end->GetValence() == 2)
return true;
// check if the begin atom really is missing an atom
if (begin->GetValence() != 2) {
obErrorLog.ThrowError(__FUNCTION__,
"OBCisTransStereo::IsOnSameAtom : id2 is not valid and is not a missing hydrogen.", obError);
return true;
}
// inform user we are treating id2 as deleted hydrogen
obErrorLog.ThrowError(__FUNCTION__,
"OBCisTransStereo::IsOnSameAtom : Atom with id2 doesn't exist, must be a (deleted) hydrogen.", obInfo);
} else {
obErrorLog.ThrowError(__FUNCTION__,
"OBCisTransStereo::IsOnSameAtom : Atom with id1 isn't connected to the begin or end atom.", obError);
return true;
}
} else if (b) {
// a atom not found, could be a deleted hydrogen...
if (b->IsConnected(begin)) {
// b is connected to begin. if this is the atom missing a hydrogen, return false
if (begin->GetValence() == 2)
return true;
// check if the end atom really is missing an atom
if (end->GetValence() != 2) {
obErrorLog.ThrowError(__FUNCTION__,
"OBCisTransStereo::IsOnSameAtom : id1 is not valid and is not a missing hydrogen.", obError);
return true;
}
// inform user we are treating id1 as deleted hydrogen
obErrorLog.ThrowError(__FUNCTION__,
"OBCisTransStereo::IsOnSameAtom : Atom with id1 doesn't exist, must be a (deleted) hydrogen.", obInfo);
} else if (b->IsConnected(end)) {
// a is connected to end. again, if this is the atom missing a hydrogen, return false
if (end->GetValence() == 2)
return true;
// check if the begin atom really is missing an atom
if (begin->GetValence() != 2) {
obErrorLog.ThrowError(__FUNCTION__,
"OBCisTransStereo::IsOnSameAtom : id1 is not valid and is not a missing hydrogen.", obError);
return true;
}
// inform user we are treating id2 as deleted hydrogen
obErrorLog.ThrowError(__FUNCTION__,
"OBCisTransStereo::IsOnSameAtom : Atom with id1 doesn't exist, must be a (deleted) hydrogen.", obInfo);
} else {
obErrorLog.ThrowError(__FUNCTION__,
"OBCisTransStereo::IsOnSameAtom : Atom with id1 isn't connected to the begin or end atom.", obError);
return true;
}
} else {
OBAtom *c = 0, *d = 0;
//.........这里部分代码省略.........
示例10: if
int SetMM3Type(OBAtom *atom)
{
OBAtom *b; // neighbor
OBBondIterator i, j;
int countNeighborO, countNeighborS, countNeighborN, countNeighborC;
countNeighborO = countNeighborS = countNeighborN = countNeighborC = 0;
// The MM2 typing isn't very good, so we do this ourselves for the most common atom types
switch (atom->GetAtomicNum()) {
case 1: // Hydrogen
b = atom->BeginNbrAtom(j);
if (b->IsCarboxylOxygen())
return 24;
if (b->GetAtomicNum() == OBElements::Sulfur)
return 44;
if (b->GetAtomicNum() == OBElements::Nitrogen) {
if (b->IsAmideNitrogen())
return 28;
if (b->GetValence() > 3)
return 48;// ammonium
return 23; // default amine/imine
}
if (b->GetAtomicNum() == OBElements::Carbon && b->GetHyb() == 1)
return 124; // acetylene
if (b->GetAtomicNum() == OBElements::Oxygen) {
if (b->HasAlphaBetaUnsat())
return 73; // includes non-enol/phenol, but has the right spirit
return 21; // default alcohol
}
return 5; // default H
break;
case 2: // Helium
return 51; break;
case 3: // Li
return 163; break;
case 5: // B
if (atom->GetValence() >= 4)
return 27; // tetrahedral
return 26; break;
case 6: // C
if (atom->IsInRingSize(3)) { // cyclopropane / cyclopropene
if (atom->GetHyb() == 3)
return 22;
if (atom->GetHyb() == 2) {
if (atom->CountFreeOxygens() == 1) // propanone
return 67;
return 38; // propane
}
}
if (atom->IsInRingSize(4)) { // cyclobutane or cyclobutene
if (atom->GetHyb() == 3)
return 56;
if (atom->GetHyb() == 2) {
if (atom->CountFreeOxygens() == 1) // butanone
return 58;
return 57; // regular cyclobutane
}
}
if (atom->CountBondsOfOrder(2) == 2) { // allene
if (atom->CountFreeOxygens() == 1) // ketene
return 106;
return 68;
}
if (atom->GetFormalCharge() == +1)
return 30;
if (atom->GetSpinMultiplicity() == 2)
return 29;
if (atom->GetHyb() == 3)
return 1;
else if (atom->GetHyb() == 2) {
if (atom->CountFreeOxygens() >= 1)
return 3;
return 2;
}
else if (atom->GetHyb() == 1)
return 4;
break;
case 7: // N
// TODO
if (atom->IsAmideNitrogen())
return 151;
if (atom->IsAromatic()) {
if (atom->GetFormalCharge() == 1)
return 111;
if (atom->IsInRingSize(5)) // pyrrole
return 40;
if (atom->IsInRingSize(6)) // pyridine
return 37;
}
if (atom->CountFreeOxygens() == 2) // nitro
//.........这里部分代码省略.........
示例11: WriteMolecule
//.........这里部分代码省略.........
type_name[1] = type_name[0];
type_name[0] = type_name[4];
*/
type_name[4] = '\0';
}
}
res_num = res->GetNum();
}
else
{
strcpy(the_res,"UNK");
snprintf(padded_name,sizeof(padded_name), "%s",type_name);
strncpy(type_name,padded_name,4);
type_name[4] = '\0';
res_num = 1;
}
element_name = etab.GetSymbol(atom->GetAtomicNum());
int charge = atom->GetFormalCharge();
char scharge[3] = { ' ', ' ', '\0' };
if(0 != charge)
{
snprintf(scharge, 3, "%+d", charge);
char tmp = scharge[1];
scharge[1] = scharge[0];
scharge[0] = tmp;
}
snprintf(buffer, BUFF_SIZE, "%s%5d %-4s %-3s %c%4d %8.3f%8.3f%8.3f 1.00 0.00 %2s%2s\n",
het?"HETATM":"ATOM ",
i,
type_name,
the_res,
the_chain,
res_num,
atom->GetX(),
atom->GetY(),
atom->GetZ(),
element_name,
scharge);
ofs << buffer;
}
OBAtom *nbr;
vector<OBBond*>::iterator k;
for (i = 1; i <= mol.NumAtoms(); i ++)
{
atom = mol.GetAtom(i);
if (atom->GetValence() == 0)
continue; // no need to write a CONECT record -- no bonds
snprintf(buffer, BUFF_SIZE, "CONECT%5d", i);
ofs << buffer;
// Write out up to 4 real bonds per line PR#1711154
unsigned int currentValence = 0;
for (nbr = atom->BeginNbrAtom(k);nbr;nbr = atom->NextNbrAtom(k))
{
unsigned int order = mol.GetBond(atom, nbr)->GetBondOrder();
unsigned int it_order = 0;
for( it_order = 0; it_order < order; it_order++ )
{
if (0 != currentValence && 0 == currentValence % 4)
{
// Add the trailing space to finish this record
ofs << " \n";
// write the start of a new CONECT record
snprintf(buffer, BUFF_SIZE, "CONECT%5d", i);
ofs << buffer;
}
currentValence++;
snprintf(buffer, BUFF_SIZE, "%5d", nbr->GetIdx());
ofs << buffer;
}
}
// Add trailing spaces
unsigned int remainingValence = currentValence % 4;
if( 0 < remainingValence )
{
for (int count = 0; count < (4 - remainingValence); count++)
{
snprintf(buffer, BUFF_SIZE, " ");
ofs << buffer;
}
}
ofs << " \n";
}
snprintf(buffer, BUFF_SIZE, "MASTER 0 0 0 0 0 0 0 0 ");
ofs << buffer;
snprintf(buffer, BUFF_SIZE, "%4d 0 %4d 0\n",mol.NumAtoms(),mol.NumAtoms());
ofs << buffer;
ofs << "END\n";
if (model_num) {
ofs << "ENDMDL" << endl;
}
return(true);
}