You have an off-by-one due to a misunderstanding of where the stereo
is stored. For cis-trans stereo, the stereobond is the double bond,
not the up/down single bonds. On top of this, the stereo code uses
atom Ids and not atom indices (I can't remember the rationale for
this). Anyhoo, here is a working piece of code that does what you
want:

import pybel
import openbabel as ob

mol = pybel.readstring('smi','OC\C=C\Cl')
m = mol.OBMol

# Add a chlorine atom to the molecule
a = m.NewAtom()
a.SetAtomicNum(9)

# Get the stereo bond - note! this is the double bond
stereobond = m.GetBond(2) # This is the third bond (when read from the
SMILES above)
assert stereobond.GetBO() == 2

facade = ob.OBStereoFacade(mol.OBMol)
stereo = facade.GetCisTransStereo(stereobond.GetId()) # Note use of
GetId() not GetIdx()
config = stereo.GetConfig()
print config.refs

mol.OBMol.DeleteBond(m.GetBond(1)) # breaking the second bond
mol.OBMol.AddBond(3, a.GetIdx(), 1)

# Note that the refs uses atom Ids (4294967294 is used to mark an
implicit stereo ref)
config.refs = (a.GetId(), 4294967294, 4, 4294967294)
stereo.SetConfig(config)

print mol.write('smi')  # OC.C(=C\Cl)/F


On 27 December 2016 at 03:30, Sam Tonddast-Navaei <s.tondd...@gmail.com> wrote:
> Dear colleagues,
>
>  I just realized that if I add "addh()" before printing the SMILES I would
> get the correct transferred SMILES.
>
> - Any clue why that makes it work?
> - I also realized that in case of cis/trans stereo chemistry only one of the
> carbons returns "True" when calling HasCisTransStereo(atom_index). Could
> anyone elaborate why is this the case?
>
> Thanks,
> Sam
>
> On Mon, Dec 26, 2016 at 5:08 PM, Sam Tonddast-Navaei <s.tondd...@gmail.com>
> wrote:
>>
>> Hi Noel,
>>
>>  I made this script:
>>
>>> #!/usr/bin/python
>>> import pybel
>>> import openbabel as ob
>>>
>>> mol = pybel.readstring('smi','OC\C=C\Cl')
>>> print 'OC\C=C\Cl'
>>> facade = ob.OBStereoFacade(mol.OBMol)
>>> a = mol.OBMol.NewAtom()
>>> a.SetAtomicNum(9)
>>>
>>> bonds = []
>>> for bond in ob.OBMolBondIter(mol.OBMol):
>>>         bonds.append(bond)
>>> a0_index = bonds[1].GetBeginAtomIdx()   # C connected to O
>>> b0_index = bonds[1].GetEndAtomIdx()     # first C in double-bond
>>> b0_stereo = facade.GetCisTransStereo(b0_index-1)
>>> b0_config = b0_stereo.GetConfig()
>>> print b0_config.refs
>>> mol.OBMol.DeleteBond(bonds[1])        # breaking the second bond
>>> mol.OBMol.AddBond(b0_index, a.GetIdx(),0)
>>> b0_config.refs = (5, 4294967294, 4, 4294967294)
>>> b0_stereo.SetConfig(b0_config)
>>> print b0_config.refs
>>> print mol.write('smi')
>>
>>
>> Trying to cut the second bond in the SMILES, and then replacing the ref
>> index of C to F in the Config using SetConfig. However at the end the final
>> SMILES does not have stereo in it
>>
>> output:
>>
>>> OC\C=C\Cl
>>> (1L, 4294967294L, 4L, 4294967294L)
>>> (5L, 4294967294L, 4L, 4294967294L)
>>> OC.C(=CCl)F
>>
>>
>> Could you please let me know if I am missing something and how I can
>> update the SMILES?
>>
>> On Mon, Dec 26, 2016 at 3:41 PM, Sam Tonddast-Navaei
>> <s.tondd...@gmail.com> wrote:
>>>
>>> Hahaha, I actually do suck and still stuck :)
>>> An example script is always helpful and I would really appreciate it if
>>> you get a chance to
>>>
>>> thanks again
>>>
>>> On Mon, Dec 26, 2016 at 3:38 PM, Noel O'Boyle <baoille...@gmail.com>
>>> wrote:
>>>>
>>>> Sorry - I did mean stuck. Maintaining stereo is tricky.
>>>>
>>>> On 26 Dec 2016 8:34 p.m., "Noel O'Boyle" <baoille...@gmail.com> wrote:
>>>>>
>>>>> If you are still suck, let us know and I'll put an example together.
>>>>>
>>>>> On 26 Dec 2016 8:33 p.m., "Noel O'Boyle" <baoille...@gmail.com> wrote:
>>>>>>
>>>>>> Configs are immutable. You need to create a new config, and then use
>>>>>> setconfig or something like this.
>>>>>>
>>>>>> On 26 Dec 2016 8:09 p.m., "Sam Tonddast-Navaei" <s.tondd...@gmail.com>
>>>>>> wrote:
>>>>>>>
>>>>>>> Thanks Noel, I figured it out thanks to your hint. Is there a
>>>>>>> function that allows to change the refs? It seems that in python 
>>>>>>> Config.ref
>>>>>>> returns a tuple. I am trying to change the old ref_id to a new one.
>>>>>>>
>>>>>>> Thanks for your help.
>>>>>>>
>>>>>>> On Sun, Nov 20, 2016 at 5:38 AM, Noel O'Boyle <baoille...@gmail.com>
>>>>>>> wrote:
>>>>>>>>
>>>>>>>> Look at the docs for OBStereoFacade and related classes. Stereo is
>>>>>>>> stored in a Config object with refs to the four IDs of the atoms 
>>>>>>>> connected
>>>>>>>> to the atoms of the double bond.
>>>>>>>>
>>>>>>>>
>>>>>>>> On 19 Nov 2016 11:35 p.m., "Sam Tonddast-Navaei"
>>>>>>>> <s.tondd...@gmail.com> wrote:
>>>>>>>>>
>>>>>>>>> Hello all,
>>>>>>>>>
>>>>>>>>>  I am trying to break a molecule into two fragments using Pybel yet
>>>>>>>>> keeping the cis/trans stereochemisty information at the cleavage 
>>>>>>>>> point when
>>>>>>>>> I substitute it by a dummy atom. Currently I am trying to copy the 
>>>>>>>>> bond
>>>>>>>>> property (IsUp or IsDown) and assign it to the new bonds (bonds 
>>>>>>>>> assign tot
>>>>>>>>> he dummy atoms). However I figured out that both functions are 
>>>>>>>>> returning
>>>>>>>>> False values.
>>>>>>>>>
>>>>>>>>> I did a loop over all bonds and printed the following:
>>>>>>>>>
>>>>>>>>>> for temp_bond in openbabel.OBMolBondIter(mol2.OBMol):
>>>>>>>>>>
>>>>>>>>>>         print temp_bond.GetIdx(), temp_bond.GetBO(),
>>>>>>>>>> temp_bond.IsDown(), temp_bond.IsUp(), temp_bond.IsCisOrTrans()
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>> SMILES: OCCCC#CC#C/C=C/C(=O)OC
>>>>>>>>>> 0 1 False False False
>>>>>>>>>> 1 1 False False False
>>>>>>>>>> 2 1 False False False
>>>>>>>>>> 3 1 False False False
>>>>>>>>>> 4 3 False False False
>>>>>>>>>> 5 1 False False False
>>>>>>>>>> 6 3 False False False
>>>>>>>>>> 7 1 False False False
>>>>>>>>>> 8 2 False False False
>>>>>>>>>> 9 1 False False False
>>>>>>>>>> 10 2 False False False
>>>>>>>>>> 11 1 False False False
>>>>>>>>>> 12 1 False False False
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> Can someone help me what I am missing here and whether there is a
>>>>>>>>> smarter way of doing this?
>>>>>>>>>
>>>>>>>>> Thanks for your time,
>>>>>>>>> Sam
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> ------------------------------------------------------------------------------
>>>>>>>>>
>>>>>>>>> _______________________________________________
>>>>>>>>> OpenBabel-discuss mailing list
>>>>>>>>> OpenBabel-discuss@lists.sourceforge.net
>>>>>>>>> https://lists.sourceforge.net/lists/listinfo/openbabel-discuss
>>>>>>>>>
>>>>>>>
>>>
>>
>
>
> ------------------------------------------------------------------------------
> Check out the vibrant tech community on one of the world's most
> engaging tech sites, SlashDot.org! http://sdm.link/slashdot
> _______________________________________________
> OpenBabel-discuss mailing list
> OpenBabel-discuss@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/openbabel-discuss
>

------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most 
engaging tech sites, SlashDot.org! http://sdm.link/slashdot
_______________________________________________
OpenBabel-discuss mailing list
OpenBabel-discuss@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/openbabel-discuss

Reply via email to