<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>promod3.modelling._ring_punches — ProMod3 0 documentation</title> <link rel="stylesheet" href="../../../_static/alabaster.css" type="text/css" /> <link rel="stylesheet" href="../../../_static/pygments.css" type="text/css" /> <script type="text/javascript"> var DOCUMENTATION_OPTIONS = { URL_ROOT: '../../../', VERSION: '0', COLLAPSE_INDEX: false, FILE_SUFFIX: '.html', HAS_SOURCE: true }; </script> <script type="text/javascript" src="../../../_static/jquery.js"></script> <script type="text/javascript" src="../../../_static/underscore.js"></script> <script type="text/javascript" src="../../../_static/doctools.js"></script> <link rel="top" title="ProMod3 0 documentation" href="../../../index.html" /> <link rel="up" title="promod3" href="../../promod3.html" /> <meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9"> </head> <body role="document"> <div class="document"> <div class="documentwrapper"> <div class="bodywrapper"> <div class="body" role="main"> <h1>Source code for promod3.modelling._ring_punches</h1><div class="highlight"><pre> <span class="sd">'''Helper functions to deal with ring punchings.'''</span> <span class="kn">import</span> <span class="nn">ost</span> <span class="kn">from</span> <span class="nn">ost</span> <span class="kn">import</span> <span class="n">geom</span> <span class="kn">from</span> <span class="nn">promod3</span> <span class="kn">import</span> <span class="n">sidechain</span> <span class="kn">from</span> <span class="nn">collections</span> <span class="kn">import</span> <span class="n">namedtuple</span> <span class="k">def</span> <span class="nf">_AddRing</span><span class="p">(</span><span class="n">rings</span><span class="p">,</span> <span class="n">res</span><span class="p">,</span> <span class="n">atom_names</span><span class="p">):</span> <span class="sd">'''Try to add ring for given atoms in residue res to rings.'''</span> <span class="c"># get exisiting atom positions</span> <span class="n">N</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">atom_names</span><span class="p">)</span> <span class="k">assert</span><span class="p">(</span><span class="n">N</span> <span class="o">>=</span> <span class="mi">3</span><span class="p">)</span> <span class="n">pos</span> <span class="o">=</span> <span class="nb">list</span><span class="p">()</span> <span class="n">center</span> <span class="o">=</span> <span class="n">geom</span><span class="o">.</span><span class="n">Vec3</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span> <span class="k">for</span> <span class="n">atom_name</span> <span class="ow">in</span> <span class="n">atom_names</span><span class="p">:</span> <span class="n">a</span> <span class="o">=</span> <span class="n">res</span><span class="o">.</span><span class="n">FindAtom</span><span class="p">(</span><span class="n">atom_name</span><span class="p">)</span> <span class="k">if</span> <span class="n">a</span><span class="o">.</span><span class="n">IsValid</span><span class="p">():</span> <span class="n">pos</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">a</span><span class="o">.</span><span class="n">GetPos</span><span class="p">())</span> <span class="n">center</span> <span class="o">+=</span> <span class="n">a</span><span class="o">.</span><span class="n">GetPos</span><span class="p">()</span> <span class="c"># all good?</span> <span class="n">allgood</span> <span class="o">=</span> <span class="bp">False</span> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">pos</span><span class="p">)</span> <span class="o">==</span> <span class="n">N</span><span class="p">:</span> <span class="c"># all the ring there -> good</span> <span class="n">center</span> <span class="o">=</span> <span class="n">center</span><span class="o">/</span><span class="n">N</span> <span class="n">plane</span> <span class="o">=</span> <span class="n">geom</span><span class="o">.</span><span class="n">Plane</span><span class="p">(</span><span class="n">pos</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">pos</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="n">center</span><span class="p">)</span> <span class="n">allgood</span> <span class="o">=</span> <span class="bp">True</span> <span class="k">elif</span> <span class="n">res</span><span class="o">.</span><span class="n">one_letter_code</span> <span class="o">==</span> <span class="s">'P'</span> <span class="ow">and</span> <span class="nb">len</span><span class="p">(</span><span class="n">pos</span><span class="p">)</span> <span class="o">==</span> <span class="mi">3</span><span class="p">:</span> <span class="c"># incomplete proline: 3 BB-pos there</span> <span class="c"># get ring-plane from 3 pos</span> <span class="n">plane</span> <span class="o">=</span> <span class="n">geom</span><span class="o">.</span><span class="n">Plane</span><span class="p">(</span><span class="n">pos</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">pos</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="n">pos</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span> <span class="c"># fit circle in plane through 3 points:</span> <span class="c"># - build 2 planes normal to ring-plane and vector connecting 2 points</span> <span class="c"># - intersect 2 planes and resulting line with ring-plane -> DONE</span> <span class="n">plane1</span> <span class="o">=</span> <span class="n">geom</span><span class="o">.</span><span class="n">Plane</span><span class="p">((</span><span class="n">pos</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">+</span> <span class="n">pos</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span><span class="o">/</span><span class="mi">2</span><span class="p">,</span> <span class="n">pos</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">-</span> <span class="n">pos</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span> <span class="n">plane2</span> <span class="o">=</span> <span class="n">geom</span><span class="o">.</span><span class="n">Plane</span><span class="p">((</span><span class="n">pos</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">+</span> <span class="n">pos</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="o">/</span><span class="mi">2</span><span class="p">,</span> <span class="n">pos</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">-</span> <span class="n">pos</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span> <span class="n">i_line</span> <span class="o">=</span> <span class="n">geom</span><span class="o">.</span><span class="n">IntersectionLine</span><span class="p">(</span><span class="n">plane1</span><span class="p">,</span> <span class="n">plane2</span><span class="p">)</span> <span class="n">center</span> <span class="o">=</span> <span class="n">geom</span><span class="o">.</span><span class="n">IntersectionPoint</span><span class="p">(</span><span class="n">i_line</span><span class="p">,</span> <span class="n">plane</span><span class="p">)</span> <span class="n">allgood</span> <span class="o">=</span> <span class="bp">True</span> <span class="c"># add ring</span> <span class="k">if</span> <span class="n">allgood</span><span class="p">:</span> <span class="c"># get ring radius</span> <span class="n">radius</span> <span class="o">=</span> <span class="mi">0</span> <span class="k">for</span> <span class="n">p</span> <span class="ow">in</span> <span class="n">pos</span><span class="p">:</span> <span class="n">radius</span> <span class="o">=</span> <span class="nb">max</span><span class="p">(</span><span class="n">radius</span><span class="p">,</span> <span class="n">geom</span><span class="o">.</span><span class="n">Length</span><span class="p">(</span><span class="n">p</span> <span class="o">-</span> <span class="n">center</span><span class="p">))</span> <span class="c"># append to list</span> <span class="n">Ring</span> <span class="o">=</span> <span class="n">namedtuple</span><span class="p">(</span><span class="s">'Ring'</span><span class="p">,</span> <span class="s">'center plane radius residue'</span><span class="p">)</span> <span class="n">rings</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">Ring</span><span class="p">(</span><span class="n">center</span><span class="p">,</span> <span class="n">plane</span><span class="p">,</span> <span class="n">radius</span><span class="p">,</span> <span class="n">res</span><span class="o">.</span><span class="n">handle</span><span class="p">))</span> <span class="k">def</span> <span class="nf">_IgnoreAtom</span><span class="p">(</span><span class="n">ring</span><span class="p">,</span> <span class="n">atom</span><span class="p">):</span> <span class="sd">'''Return true if atom is part of ring-residue.'''</span> <span class="k">return</span> <span class="n">ring</span><span class="o">.</span><span class="n">residue</span> <span class="o">==</span> <span class="n">atom</span><span class="o">.</span><span class="n">residue</span> <span class="k">def</span> <span class="nf">_CheckAtomVsRing</span><span class="p">(</span><span class="n">ring</span><span class="p">,</span> <span class="n">atom</span><span class="p">):</span> <span class="sd">'''Check all bonds of atom for punches through ring.</span> <span class="sd"> Atom is ignored if it's in ring-residue or direct neighbors.</span> <span class="sd"> Return true if punch found.'''</span> <span class="c"># check this atom (can be view or handle!)</span> <span class="n">a1</span> <span class="o">=</span> <span class="n">atom</span><span class="o">.</span><span class="n">handle</span> <span class="k">if</span> <span class="n">_IgnoreAtom</span><span class="p">(</span><span class="n">ring</span><span class="p">,</span> <span class="n">a1</span><span class="p">):</span> <span class="k">return</span> <span class="bp">False</span> <span class="n">p1</span> <span class="o">=</span> <span class="n">a1</span><span class="o">.</span><span class="n">GetPos</span><span class="p">()</span> <span class="n">d1</span> <span class="o">=</span> <span class="n">geom</span><span class="o">.</span><span class="n">Dot</span><span class="p">(</span><span class="n">p1</span> <span class="o">-</span> <span class="n">ring</span><span class="o">.</span><span class="n">center</span><span class="p">,</span> <span class="n">ring</span><span class="o">.</span><span class="n">plane</span><span class="o">.</span><span class="n">normal</span><span class="p">)</span> <span class="c"># check all bonded partners</span> <span class="k">for</span> <span class="n">a_other</span> <span class="ow">in</span> <span class="n">atom</span><span class="o">.</span><span class="n">GetBondPartners</span><span class="p">():</span> <span class="n">a2</span> <span class="o">=</span> <span class="n">a_other</span><span class="o">.</span><span class="n">handle</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">a_other</span><span class="o">.</span><span class="n">IsValid</span><span class="p">()</span> <span class="ow">or</span> <span class="n">_IgnoreAtom</span><span class="p">(</span><span class="n">ring</span><span class="p">,</span> <span class="n">a2</span><span class="p">):</span> <span class="k">continue</span> <span class="c"># two bonded atoms on diff. sides of the plane?</span> <span class="n">p2</span> <span class="o">=</span> <span class="n">a2</span><span class="o">.</span><span class="n">GetPos</span><span class="p">()</span> <span class="n">d2</span> <span class="o">=</span> <span class="n">geom</span><span class="o">.</span><span class="n">Dot</span><span class="p">(</span><span class="n">p2</span> <span class="o">-</span> <span class="n">ring</span><span class="o">.</span><span class="n">center</span><span class="p">,</span> <span class="n">ring</span><span class="o">.</span><span class="n">plane</span><span class="o">.</span><span class="n">normal</span><span class="p">)</span> <span class="k">if</span> <span class="n">d1</span><span class="o">*</span><span class="n">d2</span> <span class="o"><</span> <span class="mi">0</span><span class="p">:</span> <span class="c"># get intersect</span> <span class="n">line</span> <span class="o">=</span> <span class="n">geom</span><span class="o">.</span><span class="n">Line3</span><span class="p">(</span><span class="n">p1</span><span class="p">,</span> <span class="n">p2</span><span class="p">)</span> <span class="n">pi</span> <span class="o">=</span> <span class="n">geom</span><span class="o">.</span><span class="n">IntersectionPoint</span><span class="p">(</span><span class="n">line</span><span class="p">,</span> <span class="n">ring</span><span class="o">.</span><span class="n">plane</span><span class="p">)</span> <span class="k">if</span> <span class="n">geom</span><span class="o">.</span><span class="n">Length</span><span class="p">(</span><span class="n">pi</span> <span class="o">-</span> <span class="n">ring</span><span class="o">.</span><span class="n">center</span><span class="p">)</span> <span class="o"><</span> <span class="n">ring</span><span class="o">.</span><span class="n">radius</span><span class="p">:</span> <span class="k">return</span> <span class="bp">True</span> <span class="k">return</span> <span class="bp">False</span> <div class="viewcode-block" id="GetRings"><a class="viewcode-back" href="../../../modelling/index.html#promod3.modelling.GetRings">[docs]</a><span class="k">def</span> <span class="nf">GetRings</span><span class="p">(</span><span class="n">ent</span><span class="p">):</span> <span class="sd">'''Get rings for a protein structure.</span> <span class="sd"> A ring is only added if all ring-atoms exist or if it is a proline and</span> <span class="sd"> three of the atoms exist (center and radii are estimated then).</span> <span class="sd"> :param ent: Structure for which to detect rings.</span> <span class="sd"> :type ent: :class:`~ost.mol.EntityHandle` or :class:`~ost.mol.EntityView`</span> <span class="sd"> :return: :class:`list` of rings to perform ring checks. Each ring is a named</span> <span class="sd"> tuple with:</span> <span class="sd"> center (:class:`~ost.geom.Vec3`),</span> <span class="sd"> plane (:class:`~ost.geom.Plane`),</span> <span class="sd"> radius (:class:`float`),</span> <span class="sd"> residue (:class:`~ost.mol.ResidueHandle`).</span> <span class="sd"> '''</span> <span class="n">rings</span> <span class="o">=</span> <span class="nb">list</span><span class="p">()</span> <span class="k">for</span> <span class="n">r</span> <span class="ow">in</span> <span class="n">ent</span><span class="o">.</span><span class="n">residues</span><span class="p">:</span> <span class="k">if</span> <span class="n">r</span><span class="o">.</span><span class="n">one_letter_code</span> <span class="ow">in</span> <span class="s">'YF'</span><span class="p">:</span> <span class="n">_AddRing</span><span class="p">(</span><span class="n">rings</span><span class="p">,</span> <span class="n">r</span><span class="p">,</span> <span class="p">[</span><span class="s">"CG"</span><span class="p">,</span> <span class="s">"CD1"</span><span class="p">,</span> <span class="s">"CD2"</span><span class="p">,</span> <span class="s">"CE1"</span><span class="p">,</span> <span class="s">"CE2"</span><span class="p">,</span> <span class="s">"CZ"</span><span class="p">])</span> <span class="k">elif</span> <span class="n">r</span><span class="o">.</span><span class="n">one_letter_code</span> <span class="o">==</span> <span class="s">'W'</span><span class="p">:</span> <span class="n">_AddRing</span><span class="p">(</span><span class="n">rings</span><span class="p">,</span> <span class="n">r</span><span class="p">,</span> <span class="p">[</span><span class="s">"CG"</span><span class="p">,</span> <span class="s">"CD1"</span><span class="p">,</span> <span class="s">"NE1"</span><span class="p">,</span> <span class="s">"CD2"</span><span class="p">,</span> <span class="s">"CE2"</span><span class="p">])</span> <span class="n">_AddRing</span><span class="p">(</span><span class="n">rings</span><span class="p">,</span> <span class="n">r</span><span class="p">,</span> <span class="p">[</span><span class="s">"CD2"</span><span class="p">,</span> <span class="s">"CE2"</span><span class="p">,</span> <span class="s">"CE3"</span><span class="p">,</span> <span class="s">"CZ2"</span><span class="p">,</span> <span class="s">"CZ3"</span><span class="p">,</span> <span class="s">"CH2"</span><span class="p">])</span> <span class="k">elif</span> <span class="n">r</span><span class="o">.</span><span class="n">one_letter_code</span> <span class="o">==</span> <span class="s">'H'</span><span class="p">:</span> <span class="n">_AddRing</span><span class="p">(</span><span class="n">rings</span><span class="p">,</span> <span class="n">r</span><span class="p">,</span> <span class="p">[</span><span class="s">"CG"</span><span class="p">,</span> <span class="s">"CD2"</span><span class="p">,</span> <span class="s">"ND1"</span><span class="p">,</span> <span class="s">"CE1"</span><span class="p">,</span> <span class="s">"NE2"</span><span class="p">])</span> <span class="k">elif</span> <span class="n">r</span><span class="o">.</span><span class="n">one_letter_code</span> <span class="o">==</span> <span class="s">'P'</span><span class="p">:</span> <span class="n">_AddRing</span><span class="p">(</span><span class="n">rings</span><span class="p">,</span> <span class="n">r</span><span class="p">,</span> <span class="p">[</span><span class="s">"N"</span><span class="p">,</span> <span class="s">"CA"</span><span class="p">,</span> <span class="s">"CB"</span><span class="p">,</span> <span class="s">"CD"</span><span class="p">,</span> <span class="s">"CG"</span><span class="p">])</span> <span class="k">return</span> <span class="n">rings</span> </div> <div class="viewcode-block" id="GetRingPunches"><a class="viewcode-back" href="../../../modelling/index.html#promod3.modelling.GetRingPunches">[docs]</a><span class="k">def</span> <span class="nf">GetRingPunches</span><span class="p">(</span><span class="n">rings</span><span class="p">,</span> <span class="n">ent</span><span class="p">):</span> <span class="sd">'''Get list of residues with rings that are punched by the given structure.</span> <span class="sd"> :param rings: List of rings as provided by :func:`GetRings`.</span> <span class="sd"> :param ent: Structure for which to detect punches.</span> <span class="sd"> :type ent: :class:`~ost.mol.EntityHandle` or :class:`~ost.mol.EntityView`</span> <span class="sd"> :return: :class:`list` of residues (:class:`~ost.mol.ResidueHandle`) which</span> <span class="sd"> have a punched ring.</span> <span class="sd"> '''</span> <span class="n">ring_punches</span> <span class="o">=</span> <span class="nb">list</span><span class="p">()</span> <span class="k">for</span> <span class="n">ring</span> <span class="ow">in</span> <span class="n">rings</span><span class="p">:</span> <span class="c"># we don't need to add residues multiple times</span> <span class="k">if</span> <span class="n">ring</span><span class="o">.</span><span class="n">residue</span> <span class="ow">in</span> <span class="n">ring_punches</span><span class="p">:</span> <span class="k">continue</span> <span class="c"># check neighborhood (3A should be enough)</span> <span class="k">for</span> <span class="n">atom</span> <span class="ow">in</span> <span class="n">ent</span><span class="o">.</span><span class="n">FindWithin</span><span class="p">(</span><span class="n">ring</span><span class="o">.</span><span class="n">center</span><span class="p">,</span> <span class="mi">3</span><span class="p">):</span> <span class="k">if</span> <span class="n">_CheckAtomVsRing</span><span class="p">(</span><span class="n">ring</span><span class="p">,</span> <span class="n">atom</span><span class="p">):</span> <span class="n">ring_punches</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">ring</span><span class="o">.</span><span class="n">residue</span><span class="p">)</span> <span class="k">break</span> <span class="k">return</span> <span class="n">ring_punches</span> </div> <div class="viewcode-block" id="HasRingPunches"><a class="viewcode-back" href="../../../modelling/index.html#promod3.modelling.HasRingPunches">[docs]</a><span class="k">def</span> <span class="nf">HasRingPunches</span><span class="p">(</span><span class="n">rings</span><span class="p">,</span> <span class="n">ent</span><span class="p">):</span> <span class="sd">'''Check if any ring is punched by the given structure.</span> <span class="sd"> This check is faster than using :func:`GetRingPunches`.</span> <span class="sd"> :param rings: List of rings as provided by :func:`GetRings`.</span> <span class="sd"> :param ent: Structure for which to detect punches.</span> <span class="sd"> :type ent: :class:`~ost.mol.EntityHandle` or :class:`~ost.mol.EntityView`</span> <span class="sd"> :return: True, iff any ring is punched</span> <span class="sd"> :rtype: :class:`bool`</span> <span class="sd"> '''</span> <span class="k">for</span> <span class="n">ring</span> <span class="ow">in</span> <span class="n">rings</span><span class="p">:</span> <span class="c"># check neighborhood (3A should be enough)</span> <span class="k">for</span> <span class="n">atom</span> <span class="ow">in</span> <span class="n">ent</span><span class="o">.</span><span class="n">FindWithin</span><span class="p">(</span><span class="n">ring</span><span class="o">.</span><span class="n">center</span><span class="p">,</span> <span class="mi">3</span><span class="p">):</span> <span class="k">if</span> <span class="n">_CheckAtomVsRing</span><span class="p">(</span><span class="n">ring</span><span class="p">,</span> <span class="n">atom</span><span class="p">):</span> <span class="k">return</span> <span class="bp">True</span> <span class="k">return</span> <span class="bp">False</span> </div> <div class="viewcode-block" id="FilterCandidates"><a class="viewcode-back" href="../../../modelling/index.html#promod3.modelling.FilterCandidates">[docs]</a><span class="k">def</span> <span class="nf">FilterCandidates</span><span class="p">(</span><span class="n">candidates</span><span class="p">,</span> <span class="n">model</span><span class="p">,</span> <span class="n">gap</span><span class="p">):</span> <span class="sd">'''Remove loop candidates if they cause ring punches.</span> <span class="sd"> :param candidates: Loop candidates meant to fill *gap* within *model*.</span> <span class="sd"> Offending candidates are removed from this list.</span> <span class="sd"> :type candidates: :class:`~promod3.loop.LoopCandidates`</span> <span class="sd"> :param model: Model for which loop is to be filled.</span> <span class="sd"> :type model: :class:`~ost.mol.EntityHandle`</span> <span class="sd"> :param gap: Gap for which loop is to be filled.</span> <span class="sd"> :type gap: :class:`StructuralGap`.</span> <span class="sd"> '''</span> <span class="n">start_resnum</span> <span class="o">=</span> <span class="n">gap</span><span class="o">.</span><span class="n">before</span><span class="o">.</span><span class="n">GetNumber</span><span class="p">()</span> <span class="n">chain_idx</span> <span class="o">=</span> <span class="n">gap</span><span class="o">.</span><span class="n">GetChainIndex</span><span class="p">()</span> <span class="c"># precompute rings and range of rings to replace</span> <span class="n">chain_name</span> <span class="o">=</span> <span class="n">gap</span><span class="o">.</span><span class="n">GetChainName</span><span class="p">()</span> <span class="n">end_resnum</span> <span class="o">=</span> <span class="n">gap</span><span class="o">.</span><span class="n">after</span><span class="o">.</span><span class="n">GetNumber</span><span class="p">()</span> <span class="n">myqueryin</span> <span class="o">=</span> <span class="s">"cname="</span> <span class="o">+</span> <span class="n">chain_name</span> <span class="o">+</span> <span class="s">" and rnum="</span> <span class="o">+</span>\ <span class="nb">str</span><span class="p">(</span><span class="n">start_resnum</span><span class="p">)</span> <span class="o">+</span> <span class="s">":"</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">end_resnum</span><span class="p">)</span> <span class="n">myqueryout</span> <span class="o">=</span> <span class="s">"cname!="</span> <span class="o">+</span> <span class="n">chain_name</span> <span class="o">+</span> <span class="s">" or rnum<"</span> <span class="o">+</span>\ <span class="nb">str</span><span class="p">(</span><span class="n">start_resnum</span><span class="p">)</span> <span class="o">+</span> <span class="s">" or rnum>"</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">end_resnum</span><span class="p">)</span> <span class="n">model_out</span> <span class="o">=</span> <span class="n">model</span><span class="o">.</span><span class="n">Select</span><span class="p">(</span><span class="n">myqueryout</span><span class="p">)</span> <span class="n">rings_out</span> <span class="o">=</span> <span class="n">GetRings</span><span class="p">(</span><span class="n">model_out</span><span class="p">)</span> <span class="c"># filter loop candidates</span> <span class="n">lc_idx</span> <span class="o">=</span> <span class="mi">0</span> <span class="k">while</span> <span class="n">lc_idx</span> <span class="o"><</span> <span class="nb">len</span><span class="p">(</span><span class="n">candidates</span><span class="p">):</span> <span class="c"># get loop-entity for checks</span> <span class="n">new_loop</span> <span class="o">=</span> <span class="n">candidates</span><span class="p">[</span><span class="n">lc_idx</span><span class="p">]</span><span class="o">.</span><span class="n">bb_list</span><span class="o">.</span><span class="n">ToEntity</span><span class="p">()</span> <span class="n">rings_new</span> <span class="o">=</span> <span class="n">GetRings</span><span class="p">(</span><span class="n">new_loop</span><span class="p">)</span> <span class="n">check_punches</span> <span class="o">=</span> <span class="n">HasRingPunches</span><span class="p">(</span><span class="n">rings_out</span><span class="o">+</span><span class="n">rings_new</span><span class="p">,</span> <span class="n">new_loop</span><span class="p">)</span> <span class="ow">or</span>\ <span class="n">HasRingPunches</span><span class="p">(</span><span class="n">rings_new</span><span class="p">,</span> <span class="n">model_out</span><span class="p">)</span> <span class="k">if</span> <span class="n">check_punches</span><span class="p">:</span> <span class="n">candidates</span><span class="o">.</span><span class="n">Remove</span><span class="p">(</span><span class="n">lc_idx</span><span class="p">)</span> <span class="k">else</span><span class="p">:</span> <span class="n">lc_idx</span> <span class="o">+=</span> <span class="mi">1</span> </div> <div class="viewcode-block" id="FilterCandidatesWithSC"><a class="viewcode-back" href="../../../modelling/index.html#promod3.modelling.FilterCandidatesWithSC">[docs]</a><span class="k">def</span> <span class="nf">FilterCandidatesWithSC</span><span class="p">(</span><span class="n">candidates</span><span class="p">,</span> <span class="n">model</span><span class="p">,</span> <span class="n">gap</span><span class="p">):</span> <span class="sd">'''Remove loop candidates if they (with sidechain) cause ring punches.</span> <span class="sd"> See :func:`FilterCandidates`.</span> <span class="sd"> '''</span> <span class="n">start_resnum</span> <span class="o">=</span> <span class="n">gap</span><span class="o">.</span><span class="n">before</span><span class="o">.</span><span class="n">GetNumber</span><span class="p">()</span> <span class="n">chain_idx</span> <span class="o">=</span> <span class="n">gap</span><span class="o">.</span><span class="n">GetChainIndex</span><span class="p">()</span> <span class="n">cur_model</span> <span class="o">=</span> <span class="n">model</span><span class="o">.</span><span class="n">Copy</span><span class="p">()</span> <span class="c"># precompute rings and range of rings to replace</span> <span class="n">chain_name</span> <span class="o">=</span> <span class="n">gap</span><span class="o">.</span><span class="n">GetChainName</span><span class="p">()</span> <span class="n">end_resnum</span> <span class="o">=</span> <span class="n">gap</span><span class="o">.</span><span class="n">after</span><span class="o">.</span><span class="n">GetNumber</span><span class="p">()</span> <span class="n">myqueryin</span> <span class="o">=</span> <span class="s">"cname="</span> <span class="o">+</span> <span class="n">chain_name</span> <span class="o">+</span> <span class="s">" and rnum="</span> <span class="o">+</span>\ <span class="nb">str</span><span class="p">(</span><span class="n">start_resnum</span><span class="p">)</span> <span class="o">+</span> <span class="s">":"</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">end_resnum</span><span class="p">)</span> <span class="n">myqueryout</span> <span class="o">=</span> <span class="s">"cname!="</span> <span class="o">+</span> <span class="n">chain_name</span> <span class="o">+</span> <span class="s">" or rnum<"</span> <span class="o">+</span>\ <span class="nb">str</span><span class="p">(</span><span class="n">start_resnum</span><span class="p">)</span> <span class="o">+</span> <span class="s">" or rnum>"</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">end_resnum</span><span class="p">)</span> <span class="n">rings_out</span> <span class="o">=</span> <span class="n">GetRings</span><span class="p">(</span><span class="n">cur_model</span><span class="o">.</span><span class="n">Select</span><span class="p">(</span><span class="n">myqueryout</span><span class="p">))</span> <span class="c"># filter loop candidates</span> <span class="n">lc_idx</span> <span class="o">=</span> <span class="mi">0</span> <span class="k">while</span> <span class="n">lc_idx</span> <span class="o"><</span> <span class="nb">len</span><span class="p">(</span><span class="n">candidates</span><span class="p">):</span> <span class="c"># insert loop into model-copy</span> <span class="n">bb_list</span> <span class="o">=</span> <span class="n">candidates</span><span class="p">[</span><span class="n">lc_idx</span><span class="p">]</span><span class="o">.</span><span class="n">bb_list</span> <span class="n">bb_list</span><span class="o">.</span><span class="n">InsertInto</span><span class="p">(</span><span class="n">cur_model</span><span class="o">.</span><span class="n">chains</span><span class="p">[</span><span class="n">chain_idx</span><span class="p">],</span> <span class="n">start_resnum</span><span class="p">)</span> <span class="c"># add sidechains and check for clashes</span> <span class="n">sidechain</span><span class="o">.</span><span class="n">Reconstruct</span><span class="p">(</span><span class="n">cur_model</span><span class="p">,</span> <span class="n">keep_sidechains</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span> <span class="n">models_new</span> <span class="o">=</span> <span class="n">cur_model</span><span class="o">.</span><span class="n">Select</span><span class="p">(</span><span class="n">myqueryin</span><span class="p">)</span> <span class="n">rings_new</span> <span class="o">=</span> <span class="n">GetRings</span><span class="p">(</span><span class="n">models_new</span><span class="p">)</span> <span class="n">check_punches</span> <span class="o">=</span> <span class="n">HasRingPunches</span><span class="p">(</span><span class="n">rings_out</span><span class="p">,</span> <span class="n">models_new</span><span class="p">)</span> <span class="ow">or</span>\ <span class="n">HasRingPunches</span><span class="p">(</span><span class="n">rings_new</span><span class="p">,</span> <span class="n">cur_model</span><span class="p">)</span> <span class="k">if</span> <span class="n">check_punches</span><span class="p">:</span> <span class="n">candidates</span><span class="o">.</span><span class="n">Remove</span><span class="p">(</span><span class="n">lc_idx</span><span class="p">)</span> <span class="k">else</span><span class="p">:</span> <span class="n">lc_idx</span> <span class="o">+=</span> <span class="mi">1</span> <span class="c"># these methods will be exported into module</span></div> <span class="n">__all__</span> <span class="o">=</span> <span class="p">(</span><span class="s">'GetRings'</span><span class="p">,</span> <span class="s">'GetRingPunches'</span><span class="p">,</span> <span class="s">'HasRingPunches'</span><span class="p">,</span> <span class="s">'FilterCandidates'</span><span class="p">,</span> <span class="s">'FilterCandidatesWithSC'</span><span class="p">)</span> </pre></div> </div> </div> </div> <div class="sphinxsidebar" role="navigation" aria-label="main navigation"> <div class="sphinxsidebarwrapper"><div class="relations"> <h3>Related Topics</h3> <ul> <li><a href="../../../index.html">Documentation overview</a><ul> <li><a href="../../index.html">Module code</a><ul> <li><a href="../../promod3.html">promod3</a><ul> </ul></li> </ul></li> </ul></li> </ul> </div> <div id="searchbox" style="display: none" role="search"> <h3>Quick search</h3> <form class="search" action="../../../search.html" method="get"> <input type="text" name="q" /> <input type="submit" value="Go" /> <input type="hidden" name="check_keywords" value="yes" /> <input type="hidden" name="area" value="default" /> </form> <p class="searchtip" style="font-size: 90%"> Enter search terms or a module, class or function name. </p> </div> <script type="text/javascript">$('#searchbox').show(0);</script> </div> </div> <div class="clearer"></div> </div> <div class="footer"> ©2016, Bienchen. | Powered by <a href="http://sphinx-doc.org/">Sphinx 1.3.1</a> & <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.6</a> </div> </body> </html>