Thanks Jan.
The fix and pull request have both been integrated.
-greg
On Wed, Mar 5, 2014 at 7:35 PM, Jan Holst Jensen <[email protected]>wrote:
> 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]>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]
>> 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