Hi Noel,


On Tue, Mar 19, 2013 at 3:16 PM, Noel O'Boyle <baoille...@gmail.com> wrote:

> I believe that the key value is the _impval property on an OBAtom,
> which is assigned by the atomtyper. Can you ask your program to print
> out the values after the EndModify() using atom->GetImplicitValence()?
>

It looks like your analysis is spot on.  Here is output of the program (not
the original one, this is much simpler, see below):

molecule starts with 4 atoms.
delete H, idx = 4
delete H, idx = 3
delete H, idx = 2
molecule now has 1 atoms.
[AlH3]
add H, idx = 2, molecule now has 2 atoms, _impval = 3
[AlH3]
add H, idx = 3, molecule now has 3 atoms, _impval = 3
[AlH3]
add H, idx = 4, molecule now has 4 atoms, _impval = 3
[AlH3]
add H, idx = 5, molecule now has 5 atoms, _impval = 4
[AlH4]
add H, idx = 6, molecule now has 6 atoms, _impval = 5
[AlH5]

What's the solution?  I can't find any method on the atom or bond object
that will force it to reset its _impval.

Thanks,
Craig

#include <sstream>

#include <openbabel/babelconfig.h>
#include <openbabel/mol.h>
#include <openbabel/obconversion.h>

using namespace std;
using namespace OpenBabel;

static string test_mol
(
 "\n"
 " OpenBabel03191316172D\n"
 "\n"
 "  4  3  0  0  0  0  0  0  0  0999 V2000\n"
 "    0.0000    0.0000    0.0000 Al  0  0  0  0  0  0  0  0  0  0  0  0\n"
 "    0.0000    0.0000    0.0000 H   0  0  0  0  0  0  0  0  0  0  0  0\n"
 "    0.0000    0.0000    0.0000 H   0  0  0  0  0  0  0  0  0  0  0  0\n"
 "    0.0000    0.0000    0.0000 H   0  0  0  0  0  0  0  0  0  0  0  0\n"
 "  1  2  1  0  0  0  0\n"
 "  1  3  1  0  0  0  0\n"
 "  1  4  1  0  0  0  0\n"
 "M  END\n"
 "$$$$\n"
 );

int main(int argc,char **argv)
{
  OBAtom *atom;
  vector<OBAtom*> delete_h;
  vector<OBAtom*>::iterator ai;

  OBMol *pmol = new OBMol;
  OBConversion conv(&cin, &cout);
  conv.SetInAndOutFormats("sdf", "smi");

  pmol->Clear();
  conv.ReadString(pmol, test_mol);
  pmol->BeginModify();

  cout << "molecule starts with " << pmol->NumAtoms() << " atoms.\n";
  for (atom = pmol->BeginAtom(ai); atom; atom = pmol->NextAtom(ai)) {
    if (atom->GetAtomicNum() == 1)
      delete_h.push_back(atom);
  }
  for (ai = delete_h.end() - 1; ai >= delete_h.begin(); ai--) {
    atom = *ai;
    cout << "delete H, idx = " << atom->GetIdx() << "\n";
    pmol->DeleteAtom(atom);
  }
  cout << "molecule now has " << pmol->NumAtoms() << " atoms.\n";
  pmol->EndModify();
  conv.Write(pmol);

  for (int i = 2; i <= 6; i++) {
    pmol->BeginModify();
    atom = pmol->NewAtom(i);
    atom->SetAtomicNum(1);
    pmol->AddBond(1, i, 1);
    pmol->EndModify();
    cout << "add H, idx = " << i <<", molecule now has "
      << pmol->NumAtoms() << " atoms, _impval = "
      << pmol->GetAtom(1)->GetImplicitValence() << "\n";
    conv.Write(pmol);
  }
}
------------------------------------------------------------------------------
Everyone hates slow websites. So do we.
Make your web apps faster with AppDynamics
Download AppDynamics Lite for free today:
http://p.sf.net/sfu/appdyn_d2d_mar
_______________________________________________
OpenBabel-Devel mailing list
OpenBabel-Devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/openbabel-devel

Reply via email to