(ccing to list)

Great. Regarding why Al is different is that the atomtyper uses the
information from atomtyp.txt. For aluminium, the implicit valence is
set to 3:
"IMPVAL  [#13]                     3 # generic Al"

No value is set for Cd.

- Noel

On 21 March 2013 22:39, Craig James <cja...@emolecules.com> wrote:
> Thanks, Noel!  This is what I needed.
>
> I still don't understand why (for example) Aluminum is different from
> Cadmium.  If you run my test program on Cadmium, it works correctly without
> SetImplicitValence().  Still, it's good to have a fix.
>
> Craig
>
>
> On Wed, Mar 20, 2013 at 12:54 PM, Noel O'Boyle <baoille...@gmail.com> wrote:
>>
>> So the desired output is 1,2,3,4,5 instead of 3,3,3,4,5?
>>
>> If so, isn't SetImplicitValence what you are looking for?
>>
>> >>> mol = pybel.readstring("smi", "[AlH3]").OBMol
>> >>> mol.DeleteHydrogens()
>> True
>> >>> print pybel.Molecule(mol).write("smi")
>> [AlH3]
>>
>> >>> print mol.GetAtom(1).GetImplicitValence() # 3
>> 3
>> >>> mol.GetAtom(1).SetImplicitValence(2)
>> >>> print pybel.Molecule(mol).write("smi")
>> [AlH2]
>>
>> In your example, you were using Begin/EndModify. Unfortunately,
>> EndModify() unsets ImplicitValencePerceived so that the atom typer is
>> called again next time a "valence" is requested:
>> >>> mol.BeginModify()
>> >>> mol.EndModify()
>> >>> print pybel.Molecule(mol).write("smi")
>> [AlH3]
>>
>> ...but never fear, we can override this by adding a
>> mol.SetImplicitValencePerceived() immediately after the EndModify().
>> The [AlH2] is then retained.
>>
>> - Noel
>>
>> On 20 March 2013 18:20, Craig James <cja...@emolecules.com> wrote:
>> > 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