Sorry - irrespective of the issue here, I should add that I have some
code that fixes the overall handling of implicit valence for SMILES
reading and writing. I'll check it into a git branch (but it's not
ready for production as it requires a rejigging of the kekulization
code). In short, we shouldn't be calling Open Babel's own typer to
calculate implicit valence; the SMILES format explicitly defines the
valence and we can set it at the point of reading (in
smilesformat.cpp) so that there is no ambiguity on the number of
hydrogens (Roger has beat me over the head with this information until
it sank in). Similarly, this information is used at the point of
writing.

- Noel

On 19 March 2013 22:16, 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()?
>
> - Noel
>
> On 19 March 2013 22:12, Noel O'Boyle <baoille...@gmail.com> wrote:
>> I haven't looked into the details of your code (but I will if no-one
>> else does), but regarding the relationship between different things,
>> you may find the following notes I have made useful:
>>
>> In the Open Babel world, the "valence" methods of an atom refer to the
>> number of bonds, rather than the sum of BOs (which is actual valence).
>> In other words, they (a) are misnamed, and (b) our _impval should not
>> be the underlying key data structure.
>>
>> GetValence() -> Num explicit bonds
>> GetImplicitValence() -> Num explicit bonds plus num implicit bonds
>> (i.e. total number of bonds) (_impval property on OBAtom)
>> GetHvyAtomValence() -> Num explicit bonds to non-H atoms
>>
>> To find the number of implicit Hs, GetImplicitValence() - GetValence()
>>
>> BOSum() -> The sum of the BOs of explicit bonds (otherwise known as
>> ExplicitValence)
>>
>> To find the actual valence: BOSum() + GetImplicitHydrogenCount()
>>
>> - Noel
>>
>> On 19 March 2013 19:08, Craig James <cja...@emolecules.com> wrote:
>>> Below is a test program, highly stripped down, that illustrates a problem I
>>> can't figure out.  The idea is to find ions that are neutral and show them
>>> with a charge (don't worry about the chemistry behind this; this is highly
>>> stripped down from the real code and just illustrates the inconsistency).
>>> When I run it, I get this:
>>>
>>> [BH3+3]
>>> [Li+]
>>> [Na+]
>>> [K+]
>>> [Be+2]
>>> [Mg+2]
>>> [Ca+2]
>>> [AlH3+3]
>>> [SiH4+4]
>>> [Fe+2]
>>>
>>> Note that B, Si, and Fe don't lose their hydrogens, whereas all the others
>>> do ... in spite of the fact that the program explicitely removes all H atoms
>>> and resets the "valence perceived" flag.
>>>
>>> Digging through smilesformat.cpp, atom.cpp, the typer and so forth, I'm
>>> completely baffled as to what's going on.  (If anyone ever had time to
>>> document the relationship and "synonym-ness" between bond order, number of
>>> bonds, valence, implicit valence, charge, hydrogen count, and spin
>>> multiplicity, that would sure be helpful!)
>>>
>>> I compiled this on Linux using:
>>>
>>> g++ -g -I/usr/local/openbabel/include/openbabel-2.0 -D_GNU_SOURCE \
>>>    -L/usr/local/openbabel/lib -lopenbabel -ldl -o foo foo.cpp
>>>
>>> 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_smiles[] = {"[BH3]", "[LiH]", "[NaH]", "[KH]", "[BeH]",
>>> "[MgH2]", "[CaH2]", "[AlH3]", "[SiH4]", "[FeH2]"};
>>> #define NSMILES (sizeof(test_smiles) / sizeof(string))
>>>
>>> static void remove_explicit_hydrogen(OBMol *pmol)
>>> {
>>>   OBAtom *atom;
>>>   vector<OBNodeBase*> delete_h;
>>>   vector<OBNodeBase*>::iterator ai;
>>>
>>>   for (atom = pmol->BeginAtom(ai); atom; atom = pmol->NextAtom(ai)) {
>>>     if (atom->GetAtomicNum() == 1)
>>>       delete_h.push_back(atom);
>>>   }
>>>   for (ai = delete_h.begin(); ai != delete_h.end(); ai++)
>>>     pmol->DeleteHydrogen((OBAtom*)*ai);
>>> }
>>>
>>> int main(int argc,char **argv)
>>> {
>>>   OBMol *pmol = new OBMol;
>>>   OBConversion conv(&cin, &cout);
>>>   conv.SetInAndOutFormats("smi", "smi");
>>>
>>>   for (int i = 0; i < NSMILES; i++) {
>>>     pmol->Clear();
>>>     pmol->SetTitle("");
>>>     conv.ReadString(pmol, test_smiles[i]);
>>>
>>>     if (pmol->Empty()) {
>>>       cerr << "Couldn't read SMILES: '" << test_smiles[i] << "'\n";
>>>       continue;
>>>     }
>>>     pmol->BeginModify();
>>>     remove_explicit_hydrogen(pmol);
>>>     OBAtom *a = pmol->GetAtom(1);
>>>
>>>     int anum = a->GetAtomicNum();
>>>     int pos_charge = 0;
>>>     switch (anum) {
>>>     case 3: case 11: case 19: pos_charge = 1; break;    // +1 - Li, Na, K
>>>     case 4: case 12: case 20: pos_charge = 2; break;    // +2 - Be, Mg, Ca
>>>     case 26:                  pos_charge = 2; break;    // +2 - Fe
>>>     case 5: case 13:          pos_charge = 3; break;    // +3 - B, Al
>>>     case 14:                  pos_charge = 4; break;    // +4 - Si
>>>     }
>>>     a->SetFormalCharge(pos_charge);
>>>     pmol->UnsetImplicitValencePerceived();
>>>     atomtyper.AssignImplicitValence(*pmol);
>>>     pmol->EndModify();
>>>
>>>     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
>>>

------------------------------------------------------------------------------
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