<!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 &mdash; 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">&#39;&#39;&#39;Helper functions to deal with ring punchings.&#39;&#39;&#39;</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">&#39;&#39;&#39;Try to add ring for given atoms in residue res to rings.&#39;&#39;&#39;</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">&gt;=</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 -&gt; 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">&#39;P&#39;</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  -&gt; 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">&#39;Ring&#39;</span><span class="p">,</span> <span class="s">&#39;center plane radius residue&#39;</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">&#39;&#39;&#39;Return true if atom is part of ring-residue.&#39;&#39;&#39;</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">&#39;&#39;&#39;Check all bonds of atom for punches through ring.</span>
<span class="sd">    Atom is ignored if it&#39;s in ring-residue or direct neighbors.</span>
<span class="sd">    Return true if punch found.&#39;&#39;&#39;</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">&lt;</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">&lt;</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">&#39;&#39;&#39;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">    &#39;&#39;&#39;</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">&#39;YF&#39;</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">&quot;CG&quot;</span><span class="p">,</span> <span class="s">&quot;CD1&quot;</span><span class="p">,</span> <span class="s">&quot;CD2&quot;</span><span class="p">,</span> <span class="s">&quot;CE1&quot;</span><span class="p">,</span> <span class="s">&quot;CE2&quot;</span><span class="p">,</span> <span class="s">&quot;CZ&quot;</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">&#39;W&#39;</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">&quot;CG&quot;</span><span class="p">,</span> <span class="s">&quot;CD1&quot;</span><span class="p">,</span> <span class="s">&quot;NE1&quot;</span><span class="p">,</span> <span class="s">&quot;CD2&quot;</span><span class="p">,</span> <span class="s">&quot;CE2&quot;</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">&quot;CD2&quot;</span><span class="p">,</span> <span class="s">&quot;CE2&quot;</span><span class="p">,</span> <span class="s">&quot;CE3&quot;</span><span class="p">,</span> <span class="s">&quot;CZ2&quot;</span><span class="p">,</span> <span class="s">&quot;CZ3&quot;</span><span class="p">,</span> <span class="s">&quot;CH2&quot;</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">&#39;H&#39;</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">&quot;CG&quot;</span><span class="p">,</span> <span class="s">&quot;CD2&quot;</span><span class="p">,</span> <span class="s">&quot;ND1&quot;</span><span class="p">,</span> <span class="s">&quot;CE1&quot;</span><span class="p">,</span> <span class="s">&quot;NE2&quot;</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">&#39;P&#39;</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">&quot;N&quot;</span><span class="p">,</span> <span class="s">&quot;CA&quot;</span><span class="p">,</span> <span class="s">&quot;CB&quot;</span><span class="p">,</span> <span class="s">&quot;CD&quot;</span><span class="p">,</span> <span class="s">&quot;CG&quot;</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">&#39;&#39;&#39;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">    &#39;&#39;&#39;</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&#39;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">&#39;&#39;&#39;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">    &#39;&#39;&#39;</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">&#39;&#39;&#39;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">    &#39;&#39;&#39;</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">&quot;cname=&quot;</span> <span class="o">+</span> <span class="n">chain_name</span> <span class="o">+</span> <span class="s">&quot; and rnum=&quot;</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">&quot;:&quot;</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">&quot;cname!=&quot;</span> <span class="o">+</span> <span class="n">chain_name</span> <span class="o">+</span> <span class="s">&quot; or rnum&lt;&quot;</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">&quot; or rnum&gt;&quot;</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">&lt;</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">&#39;&#39;&#39;Remove loop candidates if they (with sidechain) cause ring punches.</span>
<span class="sd">    See :func:`FilterCandidates`.</span>
<span class="sd">    &#39;&#39;&#39;</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">&quot;cname=&quot;</span> <span class="o">+</span> <span class="n">chain_name</span> <span class="o">+</span> <span class="s">&quot; and rnum=&quot;</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">&quot;:&quot;</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">&quot;cname!=&quot;</span> <span class="o">+</span> <span class="n">chain_name</span> <span class="o">+</span> <span class="s">&quot; or rnum&lt;&quot;</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">&quot; or rnum&gt;&quot;</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">&lt;</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">&#39;GetRings&#39;</span><span class="p">,</span> <span class="s">&#39;GetRingPunches&#39;</span><span class="p">,</span> <span class="s">&#39;HasRingPunches&#39;</span><span class="p">,</span> <span class="s">&#39;FilterCandidates&#39;</span><span class="p">,</span>
           <span class="s">&#39;FilterCandidatesWithSC&#39;</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">
      &copy;2016, Bienchen.
      
      |
      Powered by <a href="http://sphinx-doc.org/">Sphinx 1.3.1</a>
      &amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.6</a>
      
    </div>

    

    
  </body>
</html>