Hi Greg,

Thanks for the explanation.

I added this to rdkit_io.c in mol_from_ctab():

+  bool keepConformer = PG_GETARG_BOOL(1);
-  mol = parseMolCTAB(data,false,true);
+  mol = parseMolCTAB(data,keepConformer,true);

and then I can get the expected behavior and have my tests complete successfully. Yes :-).

I will go ahead and create a pull request for mol_to_ctab(). The tests for mol_to_ctab() will assume that mol_from_ctab() uses the optional parameter to keep the conformer.

Cheers
-- Jan

On 2014-03-05 13:25, Greg Landrum wrote:
Hi Jan,

The below behavior is the result of a bug (https://github.com/rdkit/rdkit/issues/229). mol_from_ctab() takes an (undocumented) optional argument that is supposed to determine whether or not the molecule's conformation is stored in the database. The default is to not store the conformation; this reduces the size of the database and the speed at which molecules are depickled. The bug is that even if you try to keep the conformation the argument is ignored and the conformation is discarded.

I'll get this fixed tomorrow morning. Alternatively, if you want to fix it now, the change just needs to be made in the definition of mol_from_ctab() in rdkit_io.c

-greg




On Wed, Mar 5, 2014 at 10:27 AM, Jan Holst Jensen <[email protected] <mailto:[email protected]>> wrote:

    Hi,

    About ready to push a changeset for implementing mol_to_ctab(),
    but I would like it to play nice and preserve input depictions.

    Ideally I would like the following

        select mol_to_ctab(mol_from_ctab(<input-molfile>));

    to output a molfile where the coordinates of "input-molfile" are
    preserved.

    If I do that in Python it works:

        >>> from rdkit import Chem
        >>> m = Chem.MolFromMolBlock("""chiral1.mol
        ...   ChemDraw04200416412D
        ...
        ...   5  4  0  0  0  0  0  0  0  0999 V2000
... -0.0141 0.0553 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 ... 0.8109 0.0553 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 ... -0.4266 0.7697 0.0000 Br 0 0 0 0 0 0 0 0 0 0 0 0 ... -0.0141 -0.7697 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 ... -0.8109 -0.1583 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0
        ...   1  2  1  0
        ...   1  3  1  0
        ...   1  4  1  1
        ...   1  5  1  0
        ... M  END""")
        >>> m
        <rdkit.Chem.rdchem.Mol object at 0x1240980>
        *>>> m.GetNumConformers()**
        **1*
        >>> Chem.MolToMolBlock(m)
'chiral1.mol\n RDKit 2D\n\n 5 4 0 0 0 0 0 0 0 0999 V2000\n -0.0141 0.0553 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n 0.8109 0.0553 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0\n -0.4266 0.7697 0.0000
        Br  0  0 0  0  0  0  0  0  0  0  0  0\n   -0.0141   -0.7697
0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0\n -0.8109 -0.1583 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n 1 2 1 6\n 1 3 1 0\n 1 4 1 0\n 1 5 1 0\nM END\n'
        >>> quit()


    In the PG cartridge I lose the conformer of the input. My
    implementation looks like this:

    rdkit_io.c:

        PG_FUNCTION_INFO_V1(mol_to_ctab);
        Datum           mol_to_ctab(PG_FUNCTION_ARGS);
        Datum
        mol_to_ctab(PG_FUNCTION_ARGS) {
          CROMol  mol;
          char    *str;
          int     len;

          fcinfo->flinfo->fn_extra = SearchMolCache(
        fcinfo->flinfo->fn_extra,
        fcinfo->flinfo->fn_mcxt,
        PG_GETARG_DATUM(0),
                                                    NULL, &mol, NULL);

          bool createDepictionIfMissing = PG_GETARG_BOOL(1);
          str = makeCtabText(mol, &len, createDepictionIfMissing);

          PG_RETURN_CSTRING( pnstrdup(str, len) );
        }


    adapter.cpp:

        extern "C" char *
        makeCtabText(CROMol data, int *len, bool
        createDepictionIfMissing) {
          ROMol *mol = (ROMol*)data;

          try {
            ereport(NOTICE,
                    (errcode(ERRCODE_SUCCESSFUL_COMPLETION),
                     errmsg("mol conformer count = %d",
        mol->getNumConformers())));

            if (createDepictionIfMissing && mol->getNumConformers() ==
        0) {
              RDDepict::compute2DCoords(*mol);
            }
            StringData = MolToMolBlock(*mol);
          } catch (...) {
            ereport(WARNING,
                    (errcode(ERRCODE_WARNING),
                     errmsg("makeCtabText: problems converting
        molecule to CTAB")));
            StringData="";
          }

          *len = StringData.size();
          return (char*)StringData.c_str();
        }


    If I run the Python example equivalent from psql:

        postgres=# select mol_to_ctab(mol_from_ctab('chiral1.mol
          ChemDraw04200416412D

          5  4  0  0  0  0  0  0  0  0999 V2000
-0.0141 0.0553 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 0.8109 0.0553 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 -0.4266 0.7697 0.0000 Br 0 0 0 0 0 0 0 0 0 0 0 0 -0.0141 -0.7697 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 -0.8109 -0.1583 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0
          1  2  1  0
          1  3  1  0
          1  4  1  1
          1  5  1  0
        M  END', false));
        *NOTICE:  mol conformer count = 0*
        mol_to_ctab
        -----------------------------------------------------------------------
        +
              RDKit 2D                                               +
        +
           5  4  0  0  0  0  0  0  0  0999
        V2000                              +
0.0000 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0+ -1.5000 0.0000 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0+ -0.0000 -1.5000 0.0000 Br 0 0 0 0 0 0 0 0 0 0 0 0+ 0.0000 1.5000 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0+ 1.5000 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0+
           1  2  1 6 +
           1  3  1 0 +
           1  4  1 0 +
           1  5  1 0 +
         M END +

        (1 row)

        postgres=#

    Something I missed about querying a mol for conformers ? As of now
    I lose the input conformer and the code will always output a
    calculated-from-scratch depiction.

    Cheers
    -- Jan


    
------------------------------------------------------------------------------
    Subversion Kills Productivity. Get off Subversion & Make the Move
    to Perforce.
    With Perforce, you get hassle-free workflows. Merge that actually
    works.
    Faster operations. Version large binaries.  Built-in WAN
    optimization and the
    freedom to use Git, Perforce or both. Make the move to Perforce.
    http://pubads.g.doubleclick.net/gampad/clk?id=122218951&iu=/4140/ostg.clktrk
    _______________________________________________
    Rdkit-discuss mailing list
    [email protected]
    <mailto:[email protected]>
    https://lists.sourceforge.net/lists/listinfo/rdkit-discuss



------------------------------------------------------------------------------
Subversion Kills Productivity. Get off Subversion & Make the Move to Perforce.
With Perforce, you get hassle-free workflows. Merge that actually works. 
Faster operations. Version large binaries.  Built-in WAN optimization and the
freedom to use Git, Perforce or both. Make the move to Perforce.
http://pubads.g.doubleclick.net/gampad/clk?id=122218951&iu=/4140/ostg.clktrk
_______________________________________________
Rdkit-discuss mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/rdkit-discuss

Reply via email to