Skip to content
Snippets Groups Projects
Commit 60681801 authored by Bienchen's avatar Bienchen
Browse files

Updated documentation

parent af547e54
No related branches found
No related tags found
No related merge requests found
......@@ -59,6 +59,41 @@
<span class="kn">import</span> <span class="nn">argparse</span>
<span class="kn">import</span> <span class="nn">sys</span>
<span class="kn">import</span> <span class="nn">os</span>
<span class="kn">import</span> <span class="nn">gzip</span>
<span class="kn">import</span> <span class="nn">tempfile</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">io</span><span class="p">,</span> <span class="n">seq</span>
<span class="kn">from</span> <span class="nn">promod3.core</span> <span class="kn">import</span> <span class="n">helper</span>
<span class="k">def</span> <span class="nf">_AssembleTrgTplAln</span><span class="p">(</span><span class="n">target</span><span class="p">,</span> <span class="n">template</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Internal function: Assemble a target-template alignment without leading/</span>
<span class="sd"> final gaps in the target sequence. Set the offset for the template sequence.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="c"># count leading gaps to get the start position</span>
<span class="n">start</span> <span class="o">=</span> <span class="mi">0</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">target</span><span class="o">.</span><span class="n">length</span><span class="p">):</span>
<span class="k">if</span> <span class="n">target</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">!=</span> <span class="s">&#39;-&#39;</span><span class="p">:</span>
<span class="n">start</span> <span class="o">=</span> <span class="n">i</span>
<span class="k">break</span>
<span class="c"># get rid of closing gaps at the end</span>
<span class="n">end</span> <span class="o">=</span> <span class="n">target</span><span class="o">.</span><span class="n">length</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">target</span><span class="o">.</span><span class="n">length</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">):</span>
<span class="k">if</span> <span class="n">target</span><span class="p">[</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">!=</span> <span class="s">&#39;-&#39;</span><span class="p">:</span>
<span class="n">end</span> <span class="o">=</span> <span class="n">i</span>
<span class="k">break</span>
<span class="c"># assemble template sequence</span>
<span class="n">tpl_str</span> <span class="o">=</span> <span class="s">&#39;&#39;</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">start</span><span class="p">,</span> <span class="n">end</span><span class="p">):</span>
<span class="n">tpl_str</span> <span class="o">+=</span> <span class="n">template</span><span class="p">[</span><span class="n">i</span><span class="p">]</span>
<span class="n">new_aln</span> <span class="o">=</span> <span class="n">seq</span><span class="o">.</span><span class="n">CreateAlignment</span><span class="p">(</span><span class="n">seq</span><span class="o">.</span><span class="n">CreateSequence</span><span class="p">(</span><span class="n">target</span><span class="o">.</span><span class="n">name</span><span class="o">.</span><span class="n">strip</span><span class="p">(),</span>
<span class="nb">str</span><span class="p">(</span><span class="n">target</span><span class="p">)[</span><span class="n">start</span><span class="p">:</span><span class="n">end</span><span class="p">]),</span>
<span class="n">seq</span><span class="o">.</span><span class="n">CreateSequence</span><span class="p">(</span><span class="n">template</span><span class="o">.</span><span class="n">name</span><span class="o">.</span><span class="n">strip</span><span class="p">(),</span>
<span class="n">tpl_str</span><span class="p">))</span>
<span class="n">new_aln</span><span class="o">.</span><span class="n">SetSequenceOffset</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">start</span><span class="p">)</span>
<span class="k">return</span> <span class="n">new_aln</span>
<div class="viewcode-block" id="PM3ArgumentParser"><a class="viewcode-back" href="../../../core/pm3argparse.html#promod3.core.pm3argparse.PM3ArgumentParser">[docs]</a><span class="k">class</span> <span class="nc">PM3ArgumentParser</span><span class="p">(</span><span class="n">argparse</span><span class="o">.</span><span class="n">ArgumentParser</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
......@@ -66,7 +101,7 @@
<span class="sd"> set of standard arguments which can be activated, rather than added via the</span>
<span class="sd"> traditional way. This helps keeping up a common naming scheme throughout</span>
<span class="sd"> all |project| actions. As a real extension, this subclass provides checking</span>
<span class="sd"> of input parameters on :meth:`~pm3argparse.PM3ArgumentParser.Parse`. Beside</span>
<span class="sd"> of input parameters on :meth:`Parse`. Beside</span>
<span class="sd"> this, everything you can do with a &#39;real&#39; :class:`~argparse.ArgumentParser`</span>
<span class="sd"> instance is possible here.</span>
......@@ -108,27 +143,210 @@
<span class="n">formatter_class</span><span class="o">=</span>\
<span class="n">argparse</span><span class="o">.</span><span class="n">ArgumentDefaultsHelpFormatter</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">action</span> <span class="o">=</span> <span class="n">action</span>
<span class="bp">self</span><span class="o">.</span><span class="n">activate</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">()</span>
</div>
<div class="viewcode-block" id="PM3ArgumentParser.Parse"><a class="viewcode-back" href="../../../core/pm3argparse.html#promod3.core.pm3argparse.PM3ArgumentParser.Parse">[docs]</a> <span class="k">def</span> <span class="nf">Parse</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">args</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">namespace</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
<span class="k">def</span> <span class="nf">_print_message</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">message</span><span class="p">,</span> <span class="nb">file</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
<span class="c">#pylint: disable=redefined-builtin</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> This is like a welcome message to the &quot;country of bad style&quot;... we are</span>
<span class="sd"> overwriting a &quot;_&quot; function from the parent-class. Those guys should not</span>
<span class="sd"> be used outside of the housing module, never... but here it is a single</span>
<span class="sd"> function to bend :mod:`argparse` to use :class:`ost.Logger`.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">message</span><span class="p">:</span>
<span class="k">if</span> <span class="nb">file</span> <span class="ow">is</span> <span class="bp">None</span> <span class="ow">or</span> <span class="nb">file</span> <span class="ow">is</span> <span class="n">sys</span><span class="o">.</span><span class="n">stderr</span><span class="p">:</span>
<span class="n">ost</span><span class="o">.</span><span class="n">LogError</span><span class="p">(</span><span class="n">message</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">ost</span><span class="o">.</span><span class="n">LogScript</span><span class="p">(</span><span class="n">message</span><span class="p">)</span>
<div class="viewcode-block" id="PM3ArgumentParser.Parse"><a class="viewcode-back" href="../../../core/pm3argparse.html#promod3.core.pm3argparse.PM3ArgumentParser.Parse">[docs]</a> <span class="k">def</span> <span class="nf">Parse</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">args</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Parse an argument string.</span>
<span class="sd"> :param args: The argument string. As default |sysargv|_ is used.</span>
<span class="sd"> :type args: :class:`list`</span>
<span class="sd"> :param namespace: The same as for</span>
<span class="sd"> :meth:`argparse.ArgumentParser.parse_args`.</span>
<span class="sd"> :returns: If :attr:`namespace` is not given,</span>
<span class="sd"> :class:`argparse.Namespace`.</span>
<span class="sd"> :returns: :class:`promod3.cor.pm3argparse.PM3OptionsNamespace`.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">opts</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">parse_args</span><span class="p">(</span><span class="n">args</span><span class="o">=</span><span class="n">args</span><span class="p">,</span> <span class="n">namespace</span><span class="o">=</span><span class="n">namespace</span><span class="p">)</span>
<span class="n">opts</span> <span class="o">=</span> <span class="n">PM3OptionsNamespace</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">parse_args</span><span class="p">(</span><span class="n">args</span><span class="o">=</span><span class="n">args</span><span class="p">,</span> <span class="n">namespace</span><span class="o">=</span><span class="n">opts</span><span class="p">)</span>
<span class="n">opts</span><span class="o">.</span><span class="n">PostProcess</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">activate</span><span class="o">.</span><span class="n">keys</span><span class="p">())</span>
<span class="k">return</span> <span class="n">opts</span>
</div>
<div class="viewcode-block" id="PM3ArgumentParser.AssembleParser"><a class="viewcode-back" href="../../../core/pm3argparse.html#promod3.core.pm3argparse.PM3ArgumentParser.AssembleParser">[docs]</a> <span class="k">def</span> <span class="nf">AssembleParser</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> When adding options via the :meth:`Add*` methods, call this after you</span>
<span class="sd"> are done. Everything before just tells the parser that it should</span>
<span class="sd"> contain those option sets but does not actually add anything.</span>
<span class="sd"> :meth:`AssembleParser` will put everything in place, in the right order</span>
<span class="sd"> and with the right constraints.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="s">&#39;ALIGNMENT&#39;</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">activate</span><span class="o">.</span><span class="n">keys</span><span class="p">():</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_AssembleAlignment</span><span class="p">()</span>
</div>
<div class="viewcode-block" id="PM3ArgumentParser.AddAlignment"><a class="viewcode-back" href="../../../core/pm3argparse.html#promod3.core.pm3argparse.PM3ArgumentParser.AddAlignment">[docs]</a> <span class="k">def</span> <span class="nf">AddAlignment</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Add everything needed to load alignments to the argument parser. Creates</span>
<span class="sd"> several options/ arguments and adds some checks for post processing.</span>
<span class="sd"> This method only adds a flag to the parser to add alignment options on</span>
<span class="sd"> :meth:`AssembleParser`. Depending on which options you activate, things</span>
<span class="sd"> need to be added in a different order or have other constraints.</span>
<span class="sd"> Options/ arguments added:</span>
<span class="sd"> * ``--fasta trg:&lt;NAME&gt; &lt;FILE&gt;`` - describing a target-template alignment</span>
<span class="sd"> with ``trg:`` marking the target sequence inside :file:`&lt;FILE&gt;`</span>
<span class="sd"> Exit codes related to alignment input:</span>
<span class="sd"> * 11 - no prefix ``trg:`` found for an argument to &#39;--fasta&#39;</span>
<span class="sd"> * 12 - a given alignment file does not exist</span>
<span class="sd"> * 13 - never raised (parameter for checking gzip files)</span>
<span class="sd"> * 14 - empty target name found (``trg:``)</span>
<span class="sd"> * 15 - found an empty alignment file</span>
<span class="sd"> * 16 - alignment with more than 2 sequences found</span>
<span class="sd"> * 17 - target sequence name not found in alignment</span>
<span class="sd"> * 18 - sequences in the alignment have different length</span>
<span class="sd"> Attributes added to the namespace returned by</span>
<span class="sd"> :meth:`Parse`:</span>
<span class="sd"> * :attr:`fasta` - filled with the input of the &#39;--fasta&#39; argument, a</span>
<span class="sd"> :class:`list` with multiple :class:`list` objects</span>
<span class="sd"> * :attr:`alignments` - :class:`ost.AlignmentList`, same order as</span>
<span class="sd"> :attr:`fasta`</span>
<span class="sd"> * :attr:`aln_sources` - the original source of the alignment, may be</span>
<span class="sd"> filename(s) or a string in JSON format,</span>
<span class="sd"> :class:`list` of all sources</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">activate</span><span class="p">[</span><span class="s">&#39;ALIGNMENT&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="mi">1</span>
</div>
<span class="k">def</span> <span class="nf">_AssembleAlignment</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Actually add alignment arguments/ options</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="c"># FastA input: - always pairwise alignments</span>
<span class="c"># - callable multiple times</span>
<span class="c"># - goes by &#39;trg:&lt;SEQNAME&gt; &lt;FILE&gt;&#39;</span>
<span class="c"># - excludes JSON file/ object</span>
<span class="c"># - leading whitespaces will be deleted</span>
<span class="bp">self</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s">&#39;-f&#39;</span><span class="p">,</span> <span class="s">&#39;--fasta&#39;</span><span class="p">,</span> <span class="n">nargs</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s">&#39;append&#39;</span><span class="p">,</span>
<span class="n">metavar</span><span class="o">=</span><span class="p">(</span><span class="s">&#39;trg:&lt;NAME&gt;&#39;</span><span class="p">,</span> <span class="s">&#39;&lt;FILE&gt;&#39;</span><span class="p">),</span>
<span class="n">help</span><span class="o">=</span><span class="s">&#39;Pairwise alignment in FastA format, needs to &#39;</span><span class="o">+</span>
<span class="s">&#39;declare what is the target sequence.&#39;</span><span class="p">)</span>
<span class="c"># input: FastA/ JSON</span>
<span class="c"># determined by extension: if we are wrong, the whole loading fails</span>
<span class="c"># possibility to add JSON: mention limitation!</span>
</div>
<span class="k">class</span> <span class="nc">PM3OptionsNamespace</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> This one is mainly for internal use. You can use it like everything that</span>
<span class="sd"> comes out of :meth:`argparse.ArgumentParser.parse_args`. Attributes are</span>
<span class="sd"> added regarding how you assembled your argument parser.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">pass</span>
<span class="k">def</span> <span class="nf">PostProcess</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">activated</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Post processing of activated option packs.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="s">&#39;ALIGNMENT&#39;</span> <span class="ow">in</span> <span class="n">activated</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_PostProcessAlignment</span><span class="p">()</span>
<span class="k">def</span> <span class="nf">_PostProcessAlignment</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="c">#pylint: disable=no-member</span>
<span class="c">#pylint: disable=attribute-defined-outside-init</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Doing some extra work after parsing.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">aln_sources</span> <span class="o">=</span> <span class="nb">list</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">alignments</span> <span class="o">=</span> <span class="n">seq</span><span class="o">.</span><span class="n">AlignmentList</span><span class="p">()</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">fasta</span><span class="p">:</span>
<span class="k">for</span> <span class="n">src</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">fasta</span><span class="p">:</span>
<span class="k">if</span> <span class="n">src</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s">&#39;trg:&#39;</span><span class="p">):</span>
<span class="n">trgname</span> <span class="o">=</span> <span class="n">src</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="mi">4</span><span class="p">:]</span>
<span class="n">seqfile</span> <span class="o">=</span> <span class="n">src</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
<span class="k">elif</span> <span class="n">src</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s">&#39;trg:&#39;</span><span class="p">):</span>
<span class="n">trgname</span> <span class="o">=</span> <span class="n">src</span><span class="p">[</span><span class="mi">1</span><span class="p">][</span><span class="mi">4</span><span class="p">:]</span>
<span class="n">seqfile</span> <span class="o">=</span> <span class="n">src</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">helper</span><span class="o">.</span><span class="n">MsgErrorAndExit</span><span class="p">(</span><span class="s">&quot;&#39;--fasta&#39; requires one argument &quot;</span><span class="o">+</span>
<span class="s">&quot;prefixed with &#39;trg:&#39; marking the &quot;</span><span class="o">+</span>
<span class="s">&quot;target sequence name&quot;</span><span class="p">,</span> <span class="mi">11</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="nb">len</span><span class="p">(</span><span class="n">trgname</span><span class="p">):</span>
<span class="n">helper</span><span class="o">.</span><span class="n">MsgErrorAndExit</span><span class="p">(</span><span class="s">&quot;&#39;--fasta&#39; requires argument &quot;</span><span class="o">+</span>
<span class="s">&quot;&#39;trg:&#39; defining the &quot;</span><span class="o">+</span>
<span class="s">&quot;target sequence name, empty one &quot;</span><span class="o">+</span>
<span class="s">&quot;found: &#39;</span><span class="si">%s</span><span class="s">&#39;&quot;</span> <span class="o">%</span> <span class="s">&#39; &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">src</span><span class="p">),</span> <span class="mi">14</span><span class="p">)</span>
<span class="n">helper</span><span class="o">.</span><span class="n">FileExists</span><span class="p">(</span><span class="s">&quot;Alignment&quot;</span><span class="p">,</span> <span class="mi">12</span><span class="p">,</span> <span class="n">seqfile</span><span class="p">)</span>
<span class="n">is_gz</span> <span class="o">=</span> <span class="n">helper</span><span class="o">.</span><span class="n">FileGzip</span><span class="p">(</span><span class="s">&quot;Alignment&quot;</span><span class="p">,</span> <span class="mi">13</span><span class="p">,</span> <span class="n">seqfile</span><span class="p">)</span>
<span class="n">readfile</span> <span class="o">=</span> <span class="n">seqfile</span>
<span class="k">if</span> <span class="n">is_gz</span><span class="p">:</span>
<span class="n">zip_fh</span> <span class="o">=</span> <span class="n">gzip</span><span class="o">.</span><span class="n">open</span><span class="p">(</span><span class="n">seqfile</span><span class="p">)</span>
<span class="n">unzip_str</span> <span class="o">=</span> <span class="n">zip_fh</span><span class="o">.</span><span class="n">read</span><span class="p">()</span>
<span class="n">zip_fh</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
<span class="n">unzip_file</span> <span class="o">=</span> <span class="n">tempfile</span><span class="o">.</span><span class="n">NamedTemporaryFile</span><span class="p">(</span><span class="n">mode</span><span class="o">=</span><span class="s">&#39;w&#39;</span><span class="p">,</span>
<span class="n">suffix</span><span class="o">=</span><span class="s">&#39;.fas&#39;</span><span class="p">)</span>
<span class="n">unzip_file</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">unzip_str</span><span class="p">)</span>
<span class="n">unzip_file</span><span class="o">.</span><span class="n">flush</span><span class="p">()</span>
<span class="n">readfile</span> <span class="o">=</span> <span class="n">unzip_file</span><span class="o">.</span><span class="n">name</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">aln</span> <span class="o">=</span> <span class="n">io</span><span class="o">.</span><span class="n">LoadAlignment</span><span class="p">(</span><span class="n">readfile</span><span class="p">,</span> <span class="n">format</span><span class="o">=</span><span class="s">&quot;fasta&quot;</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">Exception</span><span class="p">,</span> <span class="n">exc</span><span class="p">:</span> <span class="c">#pylint: disable=broad-except</span>
<span class="k">if</span> <span class="n">exc</span><span class="o">.</span><span class="n">message</span> <span class="o">==</span> <span class="s">&#39;Bad FASTA file: File is empty&#39;</span><span class="p">:</span>
<span class="n">helper</span><span class="o">.</span><span class="n">MsgErrorAndExit</span><span class="p">(</span><span class="s">&quot;&#39;--fasta&#39; refers to an empty &quot;</span><span class="o">+</span>\
<span class="s">&quot;file or its in the wrong &quot;</span><span class="o">+</span>
<span class="s">&quot;format: </span><span class="si">%s</span><span class="s">&quot;</span> <span class="o">%</span> <span class="n">seqfile</span><span class="p">,</span> <span class="mi">15</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">exc</span><span class="o">.</span><span class="n">message</span> <span class="o">==</span> <span class="s">&#39;sequences have different lengths&#39;</span><span class="p">:</span>
<span class="n">helper</span><span class="o">.</span><span class="n">MsgErrorAndExit</span><span class="p">(</span><span class="s">&quot;&#39;--fasta </span><span class="si">%s</span><span class="s">&#39;: &quot;</span> <span class="o">%</span> <span class="s">&#39; &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">src</span><span class="p">)</span><span class="o">+</span>
<span class="s">&quot;sequences in the alignment &quot;</span><span class="o">+</span>
<span class="s">&quot;have different length.&quot;</span><span class="p">,</span> <span class="mi">18</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">raise</span>
<span class="k">finally</span><span class="p">:</span>
<span class="k">if</span> <span class="n">is_gz</span><span class="p">:</span>
<span class="n">unzip_file</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
<span class="c"># check alignment</span>
<span class="n">nos</span> <span class="o">=</span> <span class="n">aln</span><span class="o">.</span><span class="n">GetCount</span><span class="p">()</span>
<span class="k">if</span> <span class="n">nos</span> <span class="o">&gt;</span> <span class="mi">2</span><span class="p">:</span>
<span class="n">helper</span><span class="o">.</span><span class="n">MsgErrorAndExit</span><span class="p">(</span><span class="s">&quot;&#39;--fasta </span><span class="si">%s</span><span class="s">&#39; &quot;</span> <span class="o">%</span> <span class="s">&#39; &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">src</span><span class="p">)</span><span class="o">+</span>
<span class="s">&quot;points to an alignment with &quot;</span><span class="o">+</span>
<span class="s">&quot;more than 2 sequences.&quot;</span><span class="p">,</span> <span class="mi">16</span><span class="p">)</span>
<span class="n">fst_seq</span> <span class="o">=</span> <span class="n">aln</span><span class="o">.</span><span class="n">GetSequence</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
<span class="n">snd_seq</span> <span class="o">=</span> <span class="n">aln</span><span class="o">.</span><span class="n">GetSequence</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
<span class="k">if</span> <span class="n">fst_seq</span><span class="o">.</span><span class="n">name</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span> <span class="o">==</span> <span class="n">trgname</span><span class="p">:</span>
<span class="n">new_aln</span> <span class="o">=</span> <span class="n">_AssembleTrgTplAln</span><span class="p">(</span><span class="n">fst_seq</span><span class="p">,</span> <span class="n">snd_seq</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">snd_seq</span><span class="o">.</span><span class="n">name</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span> <span class="o">==</span> <span class="n">trgname</span><span class="p">:</span>
<span class="n">new_aln</span> <span class="o">=</span> <span class="n">_AssembleTrgTplAln</span><span class="p">(</span><span class="n">snd_seq</span><span class="p">,</span> <span class="n">fst_seq</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">helper</span><span class="o">.</span><span class="n">MsgErrorAndExit</span><span class="p">(</span><span class="s">&quot;&#39;--fasta </span><span class="si">%s</span><span class="s">&#39; &quot;</span> <span class="o">%</span> <span class="s">&#39; &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">src</span><span class="p">)</span><span class="o">+</span>
<span class="s">&quot;does not define a target name &quot;</span><span class="o">+</span>
<span class="s">&quot;found in the alignment.&quot;</span><span class="p">,</span> <span class="mi">17</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">alignments</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">new_aln</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">aln_sources</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">seqfile</span><span class="p">)</span>
<span class="c"># LocalWords: param attr prog argparse ArgumentParser bool sys os init str</span>
<span class="c"># LocalWords: progattr descattr argpinit argv formatter meth args namespace</span>
<span class="c"># LocalWords: ArgumentDefaultsHelpFormatter sysargv</span></div></div>
<span class="c"># LocalWords: ArgumentDefaultsHelpFormatter sysargv AssembleParser fasta io</span>
<span class="c"># LocalWords: metavar trg tpl FastA gzip tempfile ost promod aln stderr src</span>
<span class="c"># LocalWords: AssembleTrgTplAln CreateSequence SetSequenceOffset LogError</span>
<span class="c"># LocalWords: LogScript OptionsNamespace PostProcess AssembleAlignment JSON</span>
<span class="c"># LocalWords: AddAlignment AlignmentList SEQNAME whitespaces nargs trgname</span>
<span class="c"># LocalWords: PostProcessAlignment startswith seqfile elif MsgErrorAndExit</span>
<span class="c"># LocalWords: len FileExists gz FileGzip readfile fh NamedTemporaryFile fas</span>
<span class="c"># LocalWords: LoadAlignment exc GetCount fst GetSequence snd</span>
</pre></div>
</div>
......
......@@ -13,9 +13,10 @@ arguments in common. For example we need an input alignment quite often and
usually for an alignment we need information on what is the target sequence,
what identifies a template sequence and eventually a hint on the format. That
means we need the same functionality on the command line in several actions.
There :class:`pm3argparse.PM3ArgumentParser` serves as a simplification. It
provides a set of standard arguments you just need to activate for your action
plus it comes with some verification functionality for input.
There :class:`~promod3.core.pm3argparse.PM3ArgumentParser` serves as a
simplification. It provides a set of standard arguments you just need to
activate for your action plus it comes with some verification functionality for
input.
.. synopsis/ example
......
......@@ -68,9 +68,10 @@ arguments in common. For example we need an input alignment quite often and
usually for an alignment we need information on what is the target sequence,
what identifies a template sequence and eventually a hint on the format. That
means we need the same functionality on the command line in several actions.
There <code class="xref py py-class docutils literal"><span class="pre">pm3argparse.PM3ArgumentParser</span></code> serves as a simplification. It
provides a set of standard arguments you just need to activate for your action
plus it comes with some verification functionality for input.</p>
There <a class="reference internal" href="#promod3.core.pm3argparse.PM3ArgumentParser" title="promod3.core.pm3argparse.PM3ArgumentParser"><code class="xref py py-class docutils literal"><span class="pre">PM3ArgumentParser</span></code></a> serves as a
simplification. It provides a set of standard arguments you just need to
activate for your action plus it comes with some verification functionality for
input.</p>
</div>
<div class="section" id="argument-parser">
<h2>Argument Parser<a class="headerlink" href="#argument-parser" title="Permalink to this headline"></a></h2>
......@@ -81,7 +82,7 @@ plus it comes with some verification functionality for input.</p>
set of standard arguments which can be activated, rather than added via the
traditional way. This helps keeping up a common naming scheme throughout
all ProMod3 actions. As a real extension, this subclass provides checking
of input parameters on <code class="xref py py-meth docutils literal"><span class="pre">Parse()</span></code>. Beside
of input parameters on <a class="reference internal" href="#promod3.core.pm3argparse.PM3ArgumentParser.Parse" title="promod3.core.pm3argparse.PM3ArgumentParser.Parse"><code class="xref py py-meth docutils literal"><span class="pre">Parse()</span></code></a>. Beside
this, everything you can do with a &#8216;real&#8217; <a class="reference external" href="https://docs.python.org/2.7/library/argparse.html#argparse.ArgumentParser" title="(in Python v2.7)"><code class="xref py py-class docutils literal"><span class="pre">ArgumentParser</span></code></a>
instance is possible here.</p>
<p>A note on exit codes: if <code class="xref py py-meth docutils literal"><span class="pre">Parse()</span></code> is
......@@ -129,24 +130,76 @@ first 3 characters of the file name of the script. If
</table>
</dd></dl>
<dl class="method">
<dt id="promod3.core.pm3argparse.PM3ArgumentParser.AddAlignment">
<code class="descname">AddAlignment</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="../_modules/promod3/core/pm3argparse.html#PM3ArgumentParser.AddAlignment"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#promod3.core.pm3argparse.PM3ArgumentParser.AddAlignment" title="Permalink to this definition"></a></dt>
<dd><p>Add everything needed to load alignments to the argument parser. Creates
several options/ arguments and adds some checks for post processing.
This method only adds a flag to the parser to add alignment options on
<a class="reference internal" href="#promod3.core.pm3argparse.PM3ArgumentParser.AssembleParser" title="promod3.core.pm3argparse.PM3ArgumentParser.AssembleParser"><code class="xref py py-meth docutils literal"><span class="pre">AssembleParser()</span></code></a>. Depending on which options you activate, things
need to be added in a different order or have other constraints.</p>
<p>Options/ arguments added:</p>
<ul class="simple">
<li><code class="docutils literal"><span class="pre">--fasta</span> <span class="pre">trg:&lt;NAME&gt;</span> <span class="pre">&lt;FILE&gt;</span></code> - describing a target-template alignment
with <code class="docutils literal"><span class="pre">trg:</span></code> marking the target sequence inside <code class="file docutils literal"><span class="pre">&lt;FILE&gt;</span></code></li>
</ul>
<p>Exit codes related to alignment input:</p>
<ul class="simple">
<li>11 - no prefix <code class="docutils literal"><span class="pre">trg:</span></code> found for an argument to &#8216;&#8211;fasta&#8217;</li>
<li>12 - a given alignment file does not exist</li>
<li>13 - never raised (parameter for checking gzip files)</li>
<li>14 - empty target name found (<code class="docutils literal"><span class="pre">trg:</span></code>)</li>
<li>15 - found an empty alignment file</li>
<li>16 - alignment with more than 2 sequences found</li>
<li>17 - target sequence name not found in alignment</li>
<li>18 - sequences in the alignment have different length</li>
</ul>
<p>Attributes added to the namespace returned by
<a class="reference internal" href="#promod3.core.pm3argparse.PM3ArgumentParser.Parse" title="promod3.core.pm3argparse.PM3ArgumentParser.Parse"><code class="xref py py-meth docutils literal"><span class="pre">Parse()</span></code></a>:</p>
<ul>
<li><dl class="first docutils">
<dt><code class="xref py py-attr docutils literal"><span class="pre">fasta</span></code> - filled with the input of the &#8216;&#8211;fasta&#8217; argument, a</dt>
<dd><p class="first last"><a class="reference external" href="https://docs.python.org/2.7/library/functions.html#list" title="(in Python v2.7)"><code class="xref py py-class docutils literal"><span class="pre">list</span></code></a> with multiple <a class="reference external" href="https://docs.python.org/2.7/library/functions.html#list" title="(in Python v2.7)"><code class="xref py py-class docutils literal"><span class="pre">list</span></code></a> objects</p>
</dd>
</dl>
</li>
<li><dl class="first docutils">
<dt><code class="xref py py-attr docutils literal"><span class="pre">alignments</span></code> - <code class="xref py py-class docutils literal"><span class="pre">ost.AlignmentList</span></code>, same order as</dt>
<dd><p class="first last"><code class="xref py py-attr docutils literal"><span class="pre">fasta</span></code></p>
</dd>
</dl>
</li>
<li><dl class="first docutils">
<dt><code class="xref py py-attr docutils literal"><span class="pre">aln_sources</span></code> - the original source of the alignment, may be</dt>
<dd><p class="first last">filename(s) or a string in JSON format,
<a class="reference external" href="https://docs.python.org/2.7/library/functions.html#list" title="(in Python v2.7)"><code class="xref py py-class docutils literal"><span class="pre">list</span></code></a> of all sources</p>
</dd>
</dl>
</li>
</ul>
</dd></dl>
<dl class="method">
<dt id="promod3.core.pm3argparse.PM3ArgumentParser.AssembleParser">
<code class="descname">AssembleParser</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="../_modules/promod3/core/pm3argparse.html#PM3ArgumentParser.AssembleParser"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#promod3.core.pm3argparse.PM3ArgumentParser.AssembleParser" title="Permalink to this definition"></a></dt>
<dd><p>When adding options via the <code class="xref py py-meth docutils literal"><span class="pre">Add*()</span></code> methods, call this after you
are done. Everything before just tells the parser that it should
contain those option sets but does not actually add anything.
<a class="reference internal" href="#promod3.core.pm3argparse.PM3ArgumentParser.AssembleParser" title="promod3.core.pm3argparse.PM3ArgumentParser.AssembleParser"><code class="xref py py-meth docutils literal"><span class="pre">AssembleParser()</span></code></a> will put everything in place, in the right order
and with the right constraints.</p>
</dd></dl>
<dl class="method">
<dt id="promod3.core.pm3argparse.PM3ArgumentParser.Parse">
<code class="descname">Parse</code><span class="sig-paren">(</span><em>args=None</em>, <em>namespace=None</em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/promod3/core/pm3argparse.html#PM3ArgumentParser.Parse"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#promod3.core.pm3argparse.PM3ArgumentParser.Parse" title="Permalink to this definition"></a></dt>
<code class="descname">Parse</code><span class="sig-paren">(</span><em>args=None</em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/promod3/core/pm3argparse.html#PM3ArgumentParser.Parse"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#promod3.core.pm3argparse.PM3ArgumentParser.Parse" title="Permalink to this definition"></a></dt>
<dd><p>Parse an argument string.</p>
<table class="docutils field-list" frame="void" rules="none">
<col class="field-name" />
<col class="field-body" />
<tbody valign="top">
<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first simple">
<li><strong>args</strong> (<a class="reference external" href="https://docs.python.org/2.7/library/functions.html#list" title="(in Python v2.7)"><code class="xref py py-class docutils literal"><span class="pre">list</span></code></a>) &#8211; The argument string. As default <a class="reference external" href="https://docs.python.org/2.7/library/sys.html#sys.argv"><code class="xref py py-attr docutils literal"><span class="pre">sys.argv</span></code></a> is used.</li>
<li><strong>namespace</strong> &#8211; The same as for
<a class="reference external" href="https://docs.python.org/2.7/library/argparse.html#argparse.ArgumentParser.parse_args" title="(in Python v2.7)"><code class="xref py py-meth docutils literal"><span class="pre">argparse.ArgumentParser.parse_args()</span></code></a>.</li>
</ul>
</td>
<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>args</strong> (<a class="reference external" href="https://docs.python.org/2.7/library/functions.html#list" title="(in Python v2.7)"><code class="xref py py-class docutils literal"><span class="pre">list</span></code></a>) &#8211; The argument string. As default <a class="reference external" href="https://docs.python.org/2.7/library/sys.html#sys.argv"><code class="xref py py-attr docutils literal"><span class="pre">sys.argv</span></code></a> is used.</td>
</tr>
<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><p class="first last">If <code class="xref py py-attr docutils literal"><span class="pre">namespace</span></code> is not given,
<a class="reference external" href="https://docs.python.org/2.7/library/argparse.html#argparse.Namespace" title="(in Python v2.7)"><code class="xref py py-class docutils literal"><span class="pre">argparse.Namespace</span></code></a>.</p>
</td>
<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><code class="xref py py-class docutils literal"><span class="pre">promod3.cor.pm3argparse.PM3OptionsNamespace</span></code>.</td>
</tr>
</tbody>
</table>
......
......@@ -87,8 +87,6 @@
<dt><a href="actions/index_dev.html#test_actions.ActionTestCase">ActionTestCase (class in test_actions)</a>
</dt>
</dl></td>
<td style="width: 33%" valign="top"><dl>
<dt>
add_doc_dependency
......@@ -100,6 +98,8 @@
</dt>
</dl></dd>
</dl></td>
<td style="width: 33%" valign="top"><dl>
<dt>
add_doc_source
......@@ -111,6 +111,14 @@
</dt>
</dl></dd>
<dt><a href="core/pm3argparse.html#promod3.core.pm3argparse.PM3ArgumentParser.AddAlignment">AddAlignment() (promod3.core.pm3argparse.PM3ArgumentParser method)</a>
</dt>
<dt><a href="core/pm3argparse.html#promod3.core.pm3argparse.PM3ArgumentParser.AssembleParser">AssembleParser() (promod3.core.pm3argparse.PM3ArgumentParser method)</a>
</dt>
</dl></td>
</tr></table>
......
No preview for this file type
This diff is collapsed.
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment