That's fantastic. But can we move this to the development list, to
continue the discussion...

On 11 November 2010 11:28, Andrew Dalke <da...@dalkescientific.com> wrote:
> On 09/11/2010 13:53, Andrew Dalke wrote:
>> I am also willing to write tests which cover these.
>
> On Nov 10, 2010, at 11:22 AM, Chris Morley wrote:
>> Even better!
>
> I spent a lot of time on trains yesterday, and test cases were
> the right mental level for me.
>
> Here's what I developed:
>
>   http://dalkescientific.com/test_python.py
>
> They are meant so that people have a way to figure out how
> to call different functions, and they are meant to be fast,
> so they can be used as real unit tests. (The 66 test cases /
> ~400 tests) run in about 1.5 seconds on my laptop.)
>
>
> I don't know how you all want that hooked into the existing test
> framework, but I figured it was best to start with test cases.
>
> It also looks like I should get commit privs to OpenBabel.
>
>
> I noticed a number of minor problems when developing the tests.
> These are all marked with an "XXX" in the above code, although
> there are a few places marked with XXX which are either TODOs
> or places where I didn't understand the result when I wrote it
> but I believe I do now.
>
> 1) If I do something like
>
>            mol = parse_smiles("CCO")
>            mol.SetTitle("#1")
>            conv.WriteFile(mol, tempdir("blah.sdf"))
>
> I get the message
>
>    Warning in WriteMolecule No 2D or 3D coordinates exist.
>    Any stereochemical information will be lost. To generate
>    2D or 3D coordinates use --gen2D or --gen3d.
>
> Since I'm not (directly) calling WriteMolecule and since my
> test cases don't support the --gen2D or --gen3d flags, this
> warning isn't that helpful in a library function.
>
> 2) ob.OBFingerprint.List("fingerprints")
>
> This writes to an output stream, and I can't figure out
> how to generate a string-based output stream in Python.
> However, this is not that important because there are
> other ways to access the same data. It does suggest that
> List() is not a useful library function.
>
> 3) Why does the fingerprint GetBit require a fingerprinter instance?
> That is, I have to go through a bound method
>
>        x = ob.OBFingerprint.FindFingerprint("FP2")
>        self.assertEquals(x.GetBit(v, 0), True)
>
> instead of using a static/global function
>
>        self.assertEquals(ob.OBFingerprint.GetBit(v, 0), True)
>
> 4) Here's a test case I didn't expect. It seems that GetUMapList
> interacts with the results of GetMapList.
>
>    def test_basic_match_behavior_which_I_did_not_expect(self):
>        mol = parse_smiles("c1ccccc1O")
>        pat = parse_smarts("c1ccccc1")
>        pat.Match(mol)
>        self.assertEquals(pat.NumMatches(), 12)
>        results = pat.GetUMapList()
>        self.assertEquals(pat.NumMatches(), 1)
>        results = pat.GetMapList()
>        # I really expected these to be 12.
>        # It appears the UMapList does an in-place trim.
>        # XXX Is that the right/expected behavior?
>        self.assertEquals(pat.NumMatches(), 1)
>        self.assertEquals(len(results), 1)
>
>        pat.Match(mol)
>        # Here they are 12
>        results = pat.GetMapList()
>        self.assertEquals(pat.NumMatches(), 12)
>        results = pat.GetUMapList()
>        self.assertEquals(pat.NumMatches(), 1)
>        self.assertEquals(len(results), 1)
>
>
> 5) The BeginMList/EndMList seems broken in Python. That is,
> I couldn't figure how how to use them.
>
> 6) I included tests for iterating over atoms and bonds in
> a molecule, and for atoms and bonds connected to an atom. I
> expected I could also iterate over the atoms in a bond, but
> there is no OBBondAtomIter . While not important, it appeals
> to my sense of symmetry and it's very simple to write.
>
> 7) Why can't I do mol.AddBond(C, N, 3) where C and N are atoms?
> Instead, I need to do mol.AddBond(C.GetIdx(), N.GetIdx(), 3)
>
> 8) Why are there two ways to add an atom? These are:
>  atom = mol.NewAtom()
>    -and-
>  atom = OBAtom()
>  mol.AddAtom(atom)
>
> Is one of these forms preferred?
>
> 9) How does OpenBabel define "implicit hydrogen"? It's different
> than my definition, which in
>
>  [NH3].C
>
> is the explicitly stated implicit h-count in [NH3] and the
> inferred H-count in C (which is 4). OpenBabel treats the H3
> as explicit.
>
> It appears that OpenBabel doesn't have an implicit h-count
> field and instead tracks the valence, then calculates the
> h-count based on the valence.
>
> 10) Shouldn't the molecular formula for "[NH4+]" include
> the total formal charge?
>
> 11) The formal results for c1ccccc1O.[NH4+] are very strange
>
> Take a look at this test
>
>        self.assertEquals(mol.GetSpacedFormula(),  "C 6 H 10 N  1 O  1 ")
>        self.assertEquals(mol.GetSpacedFormula(1), "C 6 H 10 N O ")
>
> Why is there a double space in "N  1" and "O  1"? Why is there a
> space after the last "1"? And just how useful is the "include
> implicit hydrogens" flag to generate
>
>        self.assertEquals(mol.GetSpacedFormula(0, ' ', 0), "C 6 H 4 N  1 O  1 
> ")
>
> ?
>
> 12)  I don't think atom.GetCoordinate() is accessible from Python
> except through ctypes (Python's foreign function interface)
>
> 13) Why does GetAtom() start from 1 while GetBond() start from 0?
> (Perhaps this is in the documentation somewhere, but I was on a
> train without access to the internet and Google)
>
>        mol = parse_smiles("C#N")
>        C = mol.GetAtom(1)
>        N = mol.GetAtom(2)
>        # XXX Why do bonds starts from 0 and not 1
>        self.assertEquals(mol.GetBond(1), None)
>
> 14) The documentation for OBBond.GetNbrAtom needs to warn that if
> the atom isn't one of the bond atoms then the GetBeginAtom() will
> be returned. (This documentation for GetNbrAtomIdx already
> has a warning to that effect.)
>
> 15) In an OBRing, if there are multiple non-C atoms, which one
> is the root? And since ring.GetRootAtom() returns an integer,
> shouldn't it be named GetRootAtomIdx()?
>
> 16) Why does GetAngle() return degrees instead of radians? I see
> the warning to that effect, but it was rather unexpected to see.
>
> 17) If you have something like "CNOS" then C.IsConnected(C) is
> true. I did not expect that. This is because IsConnected checks
> to see if the target is any of the atoms of either side of the
> bonds that are connected to C. And of course, C is always one
> of the atoms connected to a bond of C.
>
> This has a downstream consequence in that
>
>        C.IsOneFour(C) == True
>
> If I read the code right, the C in "CN" will also be in a
> 1-4 relationship with itself.
>
> 18) There are some minor problems with the spectrophoretest.cpp
> test01. (I didn't review all of the tests.)
>
> In
>
>   OB_REQUIRE( (r[13] >  3.470) && (r[13] <  3.472) );
>   OB_REQUIRE( (r[14] >  6.698) && (r[14] <  6.800) );
>   OB_REQUIRE( (r[15] >  9.485) && (r[15] <  9.487) );
>
> the line with r[14] should have 6.700 as the upper bound.
>
> and
>   OB_REQUIRE( (r[18] >  4.899) && (r[18] <  4.902) );
> should be slightly smaller in the upper bound
>   OB_REQUIRE( (r[18] >  4.899) && (r[18] <  4.901) );
>
>
> 19) I see that MMFF94's ValidateGradients() dumps output
> to stdout. The other ValidateGradients I tested (gaff and
> ghemical) do not do that, and the output probably isn't
> appropriate for a library.
>
> Then again, the API docs say that it's meant for debugging.
> Should the debugging API be published for general use?
>
> 20) OBAtom.HtoMethtyl() can also dump code to stderr
>
>  v3: < -0.28, 0, 0 > v4: < -0.28, 0, 0 >
>
> This is quite clearly a bit of debugging code which
> wasn't removed:
>
>    cerr << "v3: " << v3 << " v4: " << v4 << endl;
>
>
> Cheers!
>
>
>                                Andrew
>                                da...@dalkescientific.com
>
>
>
> ------------------------------------------------------------------------------
> Centralized Desktop Delivery: Dell and VMware Reference Architecture
> Simplifying enterprise desktop deployment and management using
> Dell EqualLogic storage and VMware View: A highly scalable, end-to-end
> client virtualization framework. Read more!
> http://p.sf.net/sfu/dell-eql-dev2dev
> _______________________________________________
> OpenBabel-discuss mailing list
> OpenBabel-discuss@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/openbabel-discuss
>

------------------------------------------------------------------------------
Centralized Desktop Delivery: Dell and VMware Reference Architecture
Simplifying enterprise desktop deployment and management using
Dell EqualLogic storage and VMware View: A highly scalable, end-to-end
client virtualization framework. Read more!
http://p.sf.net/sfu/dell-eql-dev2dev
_______________________________________________
OpenBabel-discuss mailing list
OpenBabel-discuss@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/openbabel-discuss

Reply via email to