Yup, RNAsubopt is in there too!
#Stochastically sample structures
from arnie.sample_structures import sample_structures
seq='GUGGGGUGGUACCGCGAUAAUCAAUCGUCCCCUUGUGUUCACGAGGGGGCGUUUUU'
sample_structures(seq)
output:
['((((.......)))).......((.(((((((((((....))))))))))).))..',
'((((.......))))...........((((((((((....))))))))))......',
'((((.......)))).......((.(((((((((((....))))))))))).))..',
'((((.......)))).......((.(((((((((((....))))))))))).))..',
'((((.......))))..........(((((((((((....))))))))))).....',
'((((.......))))..........(((((((((((....))))))))))).....',
'((((.......))))...((..((.(((((((((((....))))))))))))).))',
'((((.......)))).......((.(((((((((((....))))))))))).))..',
'((((.......))))..........(((((((((((....))))))))))).....',
'((((.......)))).......((.(((((((((((....)))))))))))..)).']
Unfortunately RNAsubopt itself doesn’t accept the Vienna motif
input. But with both Vienna (and EternaFold!), you can do the same stochastic sampling while enforcing a constraint for the motif in a specific position:
seq='GUGGGGUGGUACCGCGAUAAUCAAUCGUCCCCUUGUGUUCACGAGGGGGCGUUUUU'
constraint='..((((xxxxxxx(((((xxxxx)))))))))........................'
sample_structures(seq, constraint=constraint)
Out:
['..((((.......(((((.....)))))))))...(((((......))))).....',
'..((((.......(((((.....))))))))).(((.(((....))).))).....',
'..((((.......(((((.....)))))))))...(((((......))))).....',
'..((((.......(((((.....)))))))))...(((((......))))).....',
'..((((.......(((((.....)))))))))..((.(((....))).))......',
'..((((.......(((((.....))))))))).(((.(((....))).))).....',
'..((((.......(((((.....)))))))))..((.(((....))).))......',
'..((((.......(((((.....))))))))).(((.(((....))).))).....',
'..((((.......(((((.....)))))))))..((((((......))))))....',
'..((((.......(((((.....)))))))))..((.(((....))).))......']
For eternafold:
sample_structures(seq, constraint=constraint, package='eternafold')
Out:
['(.((((.......(((((.....))))))))).)......(((......)))....',
'(.((((.......(((((.....))))))))).)......(((......)))....',
'(.((((.......(((((.....))))))))).).....(.....)..........',
'(.((((.......(((((.....))))))))).........)..............',
'((((((.......(((((.....)))))))))........))..............',
'(.((((.......(((((.....))))))))).)........(..........)..',
'..((((.......(((((.....))))))))).......(.(...)).........',
'..((((.......(((((.....)))))))))............(....)......',
'..((((.......(((((.....)))))))))........(((......)))....',
'..((((.......(((((.....)))))))))..(((((.......).))))....',
'..((((.......(((((.....)))))))))..((((.(......).))))....',
'..((((.......(((((.....)))))))))........................',
...
[I haven’t updated the eternafold hook to not return 100 structures every time, ha.]
I updated the above colab notebook with this too.