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