On 15/04/12 16:36, Paul Emsley wrote:
> On 14/04/12 06:14, Greg Landrum wrote:
>> On Thu, Apr 12, 2012 at 1:05 PM, Paul 
>> Emsley<paul.ems...@bioch.ox.ac.uk>  wrote:
>>>
>>> When creating a 2d depiction, or otherwise, is there a way to turn a
>>> carboxylate (with ONEANDAHALF bonds between the carbon and oxygens) 
>>> into
>>> something with a carbonyl oxygen (DOUBLE) and a hydroxyl oxygen 
>>> (SINGLE)?
>>>
>> There's good news and bad news.
>> The good news: You can easily do this with either a reaction or
>> replaceSubstructs().
>> The bad news: In either case you will need to construct the query
>> molecules in your code manually since there's not currently a way to
>> construct an RDKit molecule containing a ONEANDAHALF bond from a
>> file/string.
>>
>> Here's some (untested) code showing how you might build a reaction
>> that does what you want; I guess C++ is more useful to you than
>> python, right?:
>>    // the reactant:
>>    RWMol *r1;
>>    Atom *at;
>>    at = new Atom(6);
>>    at->setProp("molAtomMapNumber",1);
>>    r1->addAtom(at);
>>    at = new Atom(8);
>>    at->setProp("molAtomMapNumber",2);
>>    r1->addAtom(at);
>>    at = new Atom(8);
>>    at->setProp("molAtomMapNumber",3);
>>    at->setFormalCharge(-1);
>>    r1->addAtom(at);
>>    r1->addBond(0,1,Bond::ONEANDAHALF);
>>    r1->addBond(0,2,Bond::ONEANDAHALF);
>>
>>    // the product:
>>    RWMol *p1;
>>    at = new Atom(6);
>>    at->setProp("molAtomMapNumber",1);
>>    p1->addAtom(at);
>>    at = new Atom(8);
>>    at->setProp("molAtomMapNumber",2);
>>    p1->addAtom(at);
>>    at = new Atom(8);
>>    at->setProp("molAtomMapNumber",3);
>>    at->setFormalCharge(-1);
>>    p1->addAtom(at);
>>    p1->addBond(0,1,Bond::DOUBLE);
>>    p1->addBond(0,2,Bond::SINGLE);
>>
>>    ChemicalReaction rxn2;
>>    ROMOL_SPTR rsptr(static_cast<ROMol *>(r1));
>>    rxn2.addReactantTemplate(rsptr);
>>    ROMOL_SPTR psptr(static_cast<ROMol *>(p1));
>>    rxn2.addProductTemplate(psptr);
>>    rxn2.initReactantMatchers();
>>
>> Some notes:
>> 1) the above snippet can only work as-is with the most recent version
>> of the RDKit or svn versions starting last month (dating back to when
>> I made the changes to the way atom-atom matches are handled)
>> 2) this will only replace one group at a time. You'll need to call it
>> multiple times, taking the first product each time, until
>> isMoleculeReactantOfReaction(rxn2,mol,0) returns false.
>>
>> An easier approach, but one that will not respect isotopic labels in
>> your input molecule (i.e. they will be lost when you do the
>> transformation) uses replaceSubstructs(). Here's a (also untested)
>> snippet for that:
>>
>>    RWMol *r1;
>>    Atom *at;
>>    at = new Atom(6);
>>    r1->addAtom(at);
>>    at = new Atom(8);
>>    r1->addAtom(at);
>>    at = new Atom(8);
>>    at->setFormalCharge(-1);
>>    r1->addAtom(at);
>>    r1->addBond(0,1,Bond::ONEANDAHALF);
>>    r1->addBond(0,2,Bond::ONEANDAHALF);
>>
>>    // the product:
>>    RWMol *p1;
>>    at = new Atom(6);
>>    p1->addAtom(at);
>>    at = new Atom(8);
>>    p1->addAtom(at);
>>    at = new Atom(8);
>>    at->setFormalCharge(-1);
>>    p1->addAtom(at);
>>    p1->addBond(0,1,Bond::DOUBLE);
>>    p1->addBond(0,2,Bond::SINGLE);
>>
>>    std::vector<ROMOL_SPTR>  nms;
>>    nms = replaceSubstructs(*mol1,*r1,*p1,true);
>>
>>
>> Does this help at all?
>>
>
> Hi Greg,
>
> Thanks for that.
>
> C++ or python:  Yes, C++ - for the moment at least :)
>
> Seeing as I am trying to make a picture, I think the 
> replaceSubstructs() is the path of choice.
>
> Cheers,
>
> Paul.
>
>


------------------------------------------------------------------------------
For Developers, A Lot Can Happen In A Second.
Boundary is the first to Know...and Tell You.
Monitor Your Applications in Ultra-Fine Resolution. Try it FREE!
http://p.sf.net/sfu/Boundary-d2dvs2
_______________________________________________
Rdkit-discuss mailing list
Rdkit-discuss@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/rdkit-discuss

Reply via email to