<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class="">Hi Thibault,<div class=""><br class=""></div><div class=""> I suggest you make your command syntax like this</div><div class=""><br class=""></div><div class=""><span class="Apple-tab-span" style="white-space:pre"> </span>copyTorsion #1:78 to #2</div><div class=""><br class=""></div><div class="">This will be a more familiar way of specifying command arguments in ChimeraX. Also it is easy to get the torsion angle and set it using the residue "psi" angle. Here is a modified version of your code. It allows specifying multiple residues also ("copytor #1:55-65 to #2").</div><div class=""><br class=""></div><div class=""> Tom</div><div class=""><br class=""></div><div class=""><div class=""><br class=""></div><div class="">def copy_torsion(session, residues, to_structure):</div><div class=""> for residue in residues:</div><div class=""> res_num = residue.number</div><div class=""> cmd = f"torsion {to_structure.atomspec}:{res_num}@n,ca,c:{res_num+1}@n {residue.psi}"</div><div class=""> from chimerax.core.commands import run</div><div class=""> run(session, cmd)</div><div class=""> </div><div class="">def register_command(logger):</div><div class=""> from chimerax.core.commands import CmdDesc, register</div><div class=""> from chimerax.atomic import ResiduesArg, AtomicStructureArg</div><div class=""> desc = CmdDesc(required = [ ('residues', ResiduesArg) ],</div><div class=""> keyword = [ ('to_structure', AtomicStructureArg) ],</div><div class=""> required_arguments = ['to_structure'],</div><div class=""> synopsis='Copy torsion angle')</div><div class=""> register('copytorsion', desc, copy_torsion, logger=logger)</div><div class=""><br class=""></div><div class="">register_command(session.logger)</div></div><div class=""><br class=""></div><div class=""><br class=""><div><br class=""><blockquote type="cite" class=""><div class="">On Oct 31, 2022, at 6:52 AM, Thibault TUBIANA via ChimeraX-users <<a href="mailto:chimerax-users@cgl.ucsf.edu" class="">chimerax-users@cgl.ucsf.edu</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><div class=""><div style="font-family: arial, helvetica, sans-serif; font-size: 12pt;" class=""><div class="">Hi!</div><div class=""><br data-mce-bogus="1" class=""></div><div class="">I would like to create a function to copy the torsion angle from a model to another one.</div><div class="">The function would take in argument the model ID of the reference and target model (<int>) and the residue id (<int>).</div><div class="">I looked a bit at the scripts available in <a href="https://rbvi.github.io/chimerax-recipes/" class="">https://rbvi.github.io/chimerax-recipes/</a> to have an idea of how to add function in ChimeraX, but I'm currently stuck at "how to get the list of atoms from a selection string ?".</div><div class=""><br data-mce-bogus="1" class=""></div><div class="">Here's my current script </div><div class=""><hr class=""></div><div class=""><div class=""><span style="font-family: "courier new", courier, monaco, monospace, sans-serif;" data-mce-style="font-family: 'courier new', courier, monaco, monospace, sans-serif;" class="">from chimerax.core.commands import run</span></div><div class=""><br class=""></div><div class=""><span style="font-family: "courier new", courier, monaco, monospace, sans-serif;" data-mce-style="font-family: 'courier new', courier, monaco, monospace, sans-serif;" class=""> </span></div><div class=""><span style="font-family: "courier new", courier, monaco, monospace, sans-serif;" data-mce-style="font-family: 'courier new', courier, monaco, monospace, sans-serif;" class="">def copy_torsion(session, model1, model2, residue):</span></div><div class=""><span style="font-family: "courier new", courier, monaco, monospace, sans-serif;" data-mce-style="font-family: 'courier new', courier, monaco, monospace, sans-serif;" class=""> selection = f"torsion #{model2}:{residue}@n,ca,c:{residue+1}@n"</span></div><div class=""><span style="font-family: "courier new", courier, monaco, monospace, sans-serif;" data-mce-style="font-family: 'courier new', courier, monaco, monospace, sans-serif;" class=""> from chimerax.atomic import AtomsArg</span></div><div class=""><span style="font-family: "courier new", courier, monaco, monospace, sans-serif;" data-mce-style="font-family: 'courier new', courier, monaco, monospace, sans-serif;" class=""> </span></div><div class=""><span style="font-family: "courier new", courier, monaco, monospace, sans-serif;" data-mce-style="font-family: 'courier new', courier, monaco, monospace, sans-serif;" class=""> atoms = AtomsArg(selection) </span></div><div class=""><span style="font-family: "courier new", courier, monaco, monospace, sans-serif;" data-mce-style="font-family: 'courier new', courier, monaco, monospace, sans-serif;" class=""> </span></div><div class=""><span style="font-family: "courier new", courier, monaco, monospace, sans-serif;" data-mce-style="font-family: 'courier new', courier, monaco, monospace, sans-serif;" class=""> from chimerax.geometry import dihedral </span></div><div class=""><span style="font-family: "courier new", courier, monaco, monospace, sans-serif;" data-mce-style="font-family: 'courier new', courier, monaco, monospace, sans-serif;" class=""> cur_torsion = dihedral([*a.scene_coord for a in atoms])</span></div><div class=""><span style="font-family: "courier new", courier, monaco, monospace, sans-serif;" data-mce-style="font-family: 'courier new', courier, monaco, monospace, sans-serif;" class=""> </span></div><div class=""><span style="font-family: "courier new", courier, monaco, monospace, sans-serif;" data-mce-style="font-family: 'courier new', courier, monaco, monospace, sans-serif;" class=""> torsion=run(session, f"torsion #{model1}:{residue}@n,ca,c:{residue+1}@n {cur_torsion}")</span></div><div class=""><span style="font-family: "courier new", courier, monaco, monospace, sans-serif;" data-mce-style="font-family: 'courier new', courier, monaco, monospace, sans-serif;" class=""> </span></div><div class=""><span style="font-family: "courier new", courier, monaco, monospace, sans-serif;" data-mce-style="font-family: 'courier new', courier, monaco, monospace, sans-serif;" class=""> </span></div><div class=""><span style="font-family: "courier new", courier, monaco, monospace, sans-serif;" data-mce-style="font-family: 'courier new', courier, monaco, monospace, sans-serif;" class="">def register_command(logger):</span></div><div class=""><span style="font-family: "courier new", courier, monaco, monospace, sans-serif;" data-mce-style="font-family: 'courier new', courier, monaco, monospace, sans-serif;" class=""> from chimerax.core.commands import CmdDesc, register, FloatArg, IntArg, BoolArg, Color8Arg, StringArg</span></div><div class=""><span style="font-family: "courier new", courier, monaco, monospace, sans-serif;" data-mce-style="font-family: 'courier new', courier, monaco, monospace, sans-serif;" class=""> from chimerax.atomic import AtomsArg</span></div><div class=""><span style="font-family: "courier new", courier, monaco, monospace, sans-serif;" data-mce-style="font-family: 'courier new', courier, monaco, monospace, sans-serif;" class=""> desc = CmdDesc(required = [</span></div><div class=""><span style="font-family: "courier new", courier, monaco, monospace, sans-serif;" data-mce-style="font-family: 'courier new', courier, monaco, monospace, sans-serif;" class=""> ('model1', IntArg),</span></div><div class=""><span style="font-family: "courier new", courier, monaco, monospace, sans-serif;" data-mce-style="font-family: 'courier new', courier, monaco, monospace, sans-serif;" class=""> ('model2', IntArg),</span></div><div class=""><span style="font-family: "courier new", courier, monaco, monospace, sans-serif;" data-mce-style="font-family: 'courier new', courier, monaco, monospace, sans-serif;" class=""> ('residue', IntArg),</span></div><div class=""><span style="font-family: "courier new", courier, monaco, monospace, sans-serif;" data-mce-style="font-family: 'courier new', courier, monaco, monospace, sans-serif;" class=""> ],</span></div><div class=""><span style="font-family: "courier new", courier, monaco, monospace, sans-serif;" data-mce-style="font-family: 'courier new', courier, monaco, monospace, sans-serif;" class=""> synopsis='Copy torsion angle')</span></div><div class=""><span style="font-family: "courier new", courier, monaco, monospace, sans-serif;" data-mce-style="font-family: 'courier new', courier, monaco, monospace, sans-serif;" class=""> register('copyTorsion', desc, copy_torsion, logger=logger)</span></div><div class=""><span style="font-family: "courier new", courier, monaco, monospace, sans-serif;" data-mce-style="font-family: 'courier new', courier, monaco, monospace, sans-serif;" class=""> <!--StartFragment--></span><div style="font-family: arial, helvetica, sans-serif; font-size: 16px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-thickness: initial;" data-mce-style="color: #000000; font-family: arial, helvetica, sans-serif; font-size: 16px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: #ffffff; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;" class=""><br class=""></div><div style="font-family: arial, helvetica, sans-serif; font-size: 16px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-thickness: initial;" data-mce-style="color: #000000; font-family: arial, helvetica, sans-serif; font-size: 16px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: #ffffff; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;" class=""><span style="font-family: "courier new", courier, monaco, monospace, sans-serif;" data-mce-style="font-family: 'courier new', courier, monaco, monospace, sans-serif;" class="">register_command(session)</span></div><span style="font-family: "courier new", courier, monaco, monospace, sans-serif;" data-mce-style="font-family: 'courier new', courier, monaco, monospace, sans-serif;" class=""><!--EndFragment--> </span></div><div class=""><hr class=""></div><div class="">Thank you for your help :)</div><div class=""><br class="">Best regards,</div><div class="">Thibault.</div></div><div class=""><br class=""></div><div class=""><br data-mce-bogus="1" class=""></div><div data-marker="__SIG_PRE__" class=""><div class="">--<br class="">Thibault Tubiana, PhD</div><div class="">Postdoctoral Fellow @<a href="https://www.i2bc.paris-saclay.fr/equipe-interactions-and-assembly-mechanisms-of-proteins-and-peptides/" target="_blank" class="">IMAPP</a><br class=""></div><div class=""><div class=""><span style="font-size: 12pt;" class="">Institute for integrative biology of the cell (<a href="https://www.i2bc.paris-saclay.fr/" target="_blank" class="">I2BC</a>) - CNRS UMR 9198</span><br class=""></div><div class="">CEA Saclay, 91191 Gif sur Yvette - Bât 532 pce 34</div><div class="">Web Site: <a href="http://www.tubiana.me/" target="_blank" class="">http://www.tubiana.me/</a><br class=""></div></div><div class=""><br class=""></div></div></div></div>_______________________________________________<br class="">ChimeraX-users mailing list<br class=""><a href="mailto:ChimeraX-users@cgl.ucsf.edu" class="">ChimeraX-users@cgl.ucsf.edu</a><br class="">Manage subscription:<br class="">https://www.rbvi.ucsf.edu/mailman/listinfo/chimerax-users<br class=""></div></blockquote></div><br class=""></div></body></html>