Noel - Thanks for all the feedback/info. I have to head home and the next
two days are going to be crazy with some personal business I have to attend
to, but I'll try to get the info you requested. The real key here that I
can't figure out is why B, Al, and Si behave differently from the other
elements. I just couldn't find anything that distinguished certain
elements.
Craig
On Tue, Mar 19, 2013 at 3:26 PM, Noel O'Boyle <baoille...@gmail.com> wrote:
> 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