From a875cde93eb007b701915ed4212e190feea1efb3 Mon Sep 17 00:00:00 2001 From: ens-ftricomi Date: Thu, 28 Sep 2023 13:51:05 +0000 Subject: [PATCH] deploy: a76abd98dc83bd528022e5e318925340704b17f7 --- .buildinfo | 4 + .doctrees/cpg.doctree | Bin 0 -> 15475 bytes .doctrees/dust.doctree | Bin 0 -> 10197 bytes .doctrees/environment.pickle | Bin 0 -> 444777 bytes .doctrees/eponine.doctree | Bin 0 -> 13349 bytes .doctrees/genblast.doctree | Bin 0 -> 18828 bytes .doctrees/index.doctree | Bin 0 -> 7476 bytes .doctrees/install.doctree | Bin 0 -> 10317 bytes .doctrees/license.doctree | Bin 0 -> 48845 bytes .doctrees/minimap.doctree | Bin 0 -> 14285 bytes .doctrees/red.doctree | Bin 0 -> 10722 bytes .doctrees/repeatmasker.doctree | Bin 0 -> 13749 bytes .doctrees/scallop.doctree | Bin 0 -> 15038 bytes .doctrees/star.doctree | Bin 0 -> 27974 bytes .doctrees/stringtie.doctree | Bin 0 -> 10092 bytes .doctrees/trf.doctree | Bin 0 -> 17930 bytes .doctrees/trnascan.doctree | Bin 0 -> 11752 bytes .nojekyll | 0 .../anno/protein_annotation/genblast.html | 599 ++++++++++++ .../tools/anno/repeat_annotation/dust.html | 309 ++++++ .../tools/anno/repeat_annotation/red.html | 271 ++++++ .../anno/repeat_annotation/repeatmasker.html | 368 +++++++ .../tools/anno/repeat_annotation/trf.html | 397 ++++++++ .../anno/simple_feature_annotation/cpg.html | 364 +++++++ .../simple_feature_annotation/eponine.html | 344 +++++++ .../anno/snc_rna_annotation/trnascan.html | 398 ++++++++ .../transcriptomic_annotation/minimap.html | 361 +++++++ .../transcriptomic_annotation/scallop.html | 301 ++++++ .../anno/transcriptomic_annotation/star.html | 716 ++++++++++++++ .../transcriptomic_annotation/stringtie.html | 252 +++++ _modules/index.html | 117 +++ _sources/cpg.rst.txt | 8 + _sources/dust.rst.txt | 8 + _sources/eponine.rst.txt | 8 + _sources/genblast.rst.txt | 8 + _sources/index.rst.txt | 58 ++ _sources/install.rst.txt | 54 + _sources/license.rst.txt | 203 ++++ _sources/minimap.rst.txt | 8 + _sources/red.rst.txt | 8 + _sources/repeatmasker.rst.txt | 8 + _sources/scallop.rst.txt | 8 + _sources/star.rst.txt | 8 + _sources/stringtie.rst.txt | 8 + _sources/trf.rst.txt | 8 + _sources/trnascan.rst.txt | 8 + _static/agogo.css | 549 +++++++++++ _static/basic.css | 921 ++++++++++++++++++ _static/bgfooter.png | Bin 0 -> 276 bytes _static/bgtop.png | Bin 0 -> 266 bytes _static/doctools.js | 156 +++ _static/documentation_options.js | 14 + _static/file.png | Bin 0 -> 286 bytes _static/language_data.js | 199 ++++ _static/minus.png | Bin 0 -> 90 bytes _static/plus.png | Bin 0 -> 90 bytes _static/pygments.css | 84 ++ _static/searchtools.js | 566 +++++++++++ _static/sphinx_highlight.js | 144 +++ cpg.html | 150 +++ doctrees/cpg.doctree | Bin 0 -> 15475 bytes doctrees/dust.doctree | Bin 0 -> 10197 bytes doctrees/environment.pickle | Bin 0 -> 444776 bytes doctrees/eponine.doctree | Bin 0 -> 13349 bytes doctrees/genblast.doctree | Bin 0 -> 18828 bytes doctrees/index.doctree | Bin 0 -> 7476 bytes doctrees/install.doctree | Bin 0 -> 10317 bytes doctrees/license.doctree | Bin 0 -> 48845 bytes doctrees/minimap.doctree | Bin 0 -> 14285 bytes doctrees/red.doctree | Bin 0 -> 10722 bytes doctrees/repeatmasker.doctree | Bin 0 -> 13749 bytes doctrees/scallop.doctree | Bin 0 -> 15038 bytes doctrees/star.doctree | Bin 0 -> 27974 bytes doctrees/stringtie.doctree | Bin 0 -> 10092 bytes doctrees/trf.doctree | Bin 0 -> 17930 bytes doctrees/trnascan.doctree | Bin 0 -> 11752 bytes dust.html | 135 +++ eponine.html | 137 +++ genblast.html | 152 +++ genindex.html | 281 ++++++ html/output.json | 9 + html/output.txt | 3 + index.html | 149 +++ install.html | 155 +++ license.html | 301 ++++++ minimap.html | 139 +++ objects.inv | Bin 0 -> 792 bytes py-modindex.html | 185 ++++ red.html | 144 +++ repeatmasker.html | 136 +++ scallop.html | 148 +++ search.html | 139 +++ searchindex.js | 1 + star.html | 162 +++ stringtie.html | 135 +++ trf.html | 141 +++ trnascan.html | 132 +++ 97 files changed, 10779 insertions(+) create mode 100644 .buildinfo create mode 100644 .doctrees/cpg.doctree create mode 100644 .doctrees/dust.doctree create mode 100644 .doctrees/environment.pickle create mode 100644 .doctrees/eponine.doctree create mode 100644 .doctrees/genblast.doctree create mode 100644 .doctrees/index.doctree create mode 100644 .doctrees/install.doctree create mode 100644 .doctrees/license.doctree create mode 100644 .doctrees/minimap.doctree create mode 100644 .doctrees/red.doctree create mode 100644 .doctrees/repeatmasker.doctree create mode 100644 .doctrees/scallop.doctree create mode 100644 .doctrees/star.doctree create mode 100644 .doctrees/stringtie.doctree create mode 100644 .doctrees/trf.doctree create mode 100644 .doctrees/trnascan.doctree create mode 100644 .nojekyll create mode 100644 _modules/ensembl/tools/anno/protein_annotation/genblast.html create mode 100644 _modules/ensembl/tools/anno/repeat_annotation/dust.html create mode 100644 _modules/ensembl/tools/anno/repeat_annotation/red.html create mode 100644 _modules/ensembl/tools/anno/repeat_annotation/repeatmasker.html create mode 100644 _modules/ensembl/tools/anno/repeat_annotation/trf.html create mode 100644 _modules/ensembl/tools/anno/simple_feature_annotation/cpg.html create mode 100644 _modules/ensembl/tools/anno/simple_feature_annotation/eponine.html create mode 100644 _modules/ensembl/tools/anno/snc_rna_annotation/trnascan.html create mode 100644 _modules/ensembl/tools/anno/transcriptomic_annotation/minimap.html create mode 100644 _modules/ensembl/tools/anno/transcriptomic_annotation/scallop.html create mode 100644 _modules/ensembl/tools/anno/transcriptomic_annotation/star.html create mode 100644 _modules/ensembl/tools/anno/transcriptomic_annotation/stringtie.html create mode 100644 _modules/index.html create mode 100644 _sources/cpg.rst.txt create mode 100644 _sources/dust.rst.txt create mode 100644 _sources/eponine.rst.txt create mode 100644 _sources/genblast.rst.txt create mode 100644 _sources/index.rst.txt create mode 100644 _sources/install.rst.txt create mode 100644 _sources/license.rst.txt create mode 100644 _sources/minimap.rst.txt create mode 100644 _sources/red.rst.txt create mode 100644 _sources/repeatmasker.rst.txt create mode 100644 _sources/scallop.rst.txt create mode 100644 _sources/star.rst.txt create mode 100644 _sources/stringtie.rst.txt create mode 100644 _sources/trf.rst.txt create mode 100644 _sources/trnascan.rst.txt create mode 100644 _static/agogo.css create mode 100644 _static/basic.css create mode 100644 _static/bgfooter.png create mode 100644 _static/bgtop.png create mode 100644 _static/doctools.js create mode 100644 _static/documentation_options.js create mode 100644 _static/file.png create mode 100644 _static/language_data.js create mode 100644 _static/minus.png create mode 100644 _static/plus.png create mode 100644 _static/pygments.css create mode 100644 _static/searchtools.js create mode 100644 _static/sphinx_highlight.js create mode 100644 cpg.html create mode 100644 doctrees/cpg.doctree create mode 100644 doctrees/dust.doctree create mode 100644 doctrees/environment.pickle create mode 100644 doctrees/eponine.doctree create mode 100644 doctrees/genblast.doctree create mode 100644 doctrees/index.doctree create mode 100644 doctrees/install.doctree create mode 100644 doctrees/license.doctree create mode 100644 doctrees/minimap.doctree create mode 100644 doctrees/red.doctree create mode 100644 doctrees/repeatmasker.doctree create mode 100644 doctrees/scallop.doctree create mode 100644 doctrees/star.doctree create mode 100644 doctrees/stringtie.doctree create mode 100644 doctrees/trf.doctree create mode 100644 doctrees/trnascan.doctree create mode 100644 dust.html create mode 100644 eponine.html create mode 100644 genblast.html create mode 100644 genindex.html create mode 100644 html/output.json create mode 100644 html/output.txt create mode 100644 index.html create mode 100644 install.html create mode 100644 license.html create mode 100644 minimap.html create mode 100644 objects.inv create mode 100644 py-modindex.html create mode 100644 red.html create mode 100644 repeatmasker.html create mode 100644 scallop.html create mode 100644 search.html create mode 100644 searchindex.js create mode 100644 star.html create mode 100644 stringtie.html create mode 100644 trf.html create mode 100644 trnascan.html diff --git a/.buildinfo b/.buildinfo new file mode 100644 index 0000000..99ec388 --- /dev/null +++ b/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. +config: 6ef85c61a07ec8e9f0ed07676e851c59 +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/.doctrees/cpg.doctree b/.doctrees/cpg.doctree new file mode 100644 index 0000000000000000000000000000000000000000..f709e61897444cfb684811dc14b9492212ae3ce0 GIT binary patch literal 15475 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 A3IG5A literal 0 HcmV?d00001 diff --git a/.doctrees/dust.doctree b/.doctrees/dust.doctree new file mode 100644 index 0000000000000000000000000000000000000000..c2bbc5304aef94069e9293381cd87d184f69a311 GIT binary patch literal 10197 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 ChUnS= literal 0 HcmV?d00001 diff --git a/.doctrees/index.doctree b/.doctrees/index.doctree new file mode 100644 index 0000000000000000000000000000000000000000..3141c25d7f66f2448ace1ac19f098d452e51e817 GIT binary patch literal 7476 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 literal 0 HcmV?d00001 diff --git a/.doctrees/minimap.doctree b/.doctrees/minimap.doctree new file mode 100644 index 0000000000000000000000000000000000000000..0908a6501ff4c5d0f51d40e0fc1c9df8dc0c343e GIT binary patch literal 14285 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 Xp6$jB3ZNE6>U@KcKLts>?W_G40rscn literal 0 HcmV?d00001 diff --git a/.doctrees/red.doctree b/.doctrees/red.doctree new file mode 100644 index 0000000000000000000000000000000000000000..245f8d4f6079bc61e49b2e4f3f44ac1fa63426c8 GIT binary patch literal 10722 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 literal 0 HcmV?d00001 diff --git a/.doctrees/scallop.doctree b/.doctrees/scallop.doctree new file mode 100644 index 0000000000000000000000000000000000000000..a8c6c6d00a5aba66da39c97382a14b7ae0a0b26e GIT binary patch literal 15038 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 literal 0 HcmV?d00001 diff --git a/.doctrees/stringtie.doctree b/.doctrees/stringtie.doctree new file mode 100644 index 0000000000000000000000000000000000000000..a7f8913417ba885c76643630361dbc242bfb4fa4 GIT binary patch literal 10092 zcmeHNOK&Ad6}HFk_jocH5oKnmfReEl`+A)4h)gmeOdHqz zceNi8Nr<9EV^l&yX#_|-wkQigf&~&tJk~5&Kz>1#4PwJC3nac%{k+%q9mhyW0U|kb zySnPssZ-~C=hfdF`!2sSWd73&aVTAXufZM14;&GvdeRB(q$_-tzLhS&mcE=W>8XhC z#z7LG36>x)L!Y! zTPkw>wsHl#890e2*wgv`+)$yFSU7rH>=8$Io&QFf@jM=KaHvwbsHd#*NODAv=O@|J zqn_)FbTeskJT6vi z@6WKDm4*reTq7~mP!acIJ90x6bY0t`F=g(fQF4^(Co%%7r(7?`H&x0L`LJBAiRxD$ zL{xEPuZ8w6c(wp+->CDQF#UM?93Z%lYcx zhlhqTHNOotcVos`i^qy_-(k{iOK+cvR?D?r+!7;wgJOt?*m-vIsnspSq|^xLePc*+f7 z*Kz2%wqQFvazP>;+ry_cFIYO}2`HCQEW;d2NRV(W$xWa3Om!VY{~cw$hBgv@Kq z!%SH#3c5z}F(e-e?!;`9t0WTab1vj=OF!^}_C9;$>iQ>Fm=m}g>sK4=S08f|Nsq?;KYkc-zyD;$3k>N| z1X6a*0Tl7i5TYf#v0{L^0hHPt{c?|#mV!iuiLx9w+F-AQTuIMuHg4hH6~J;HF%e#h{w=ja$Fcr(wUCmNdC>v|h;$SIzkG_ESz z5h+<>2Nu}MgSP(;jl3~zBE~6mt^Id8*Q0aAP4$gd@_%iR{3l8NneZoRv%_+i-;ghp zkYBBYEMFnmGaQ~X98&z$6-q>&i-5PLey#tEL6mloS!&5not3k7R>;uGMMmq$ysdso zPgiRSG1rGG8UN&X8S7y`<#k0SVg3lh{DBeRc_TpDJWPCBC0YJd6XEbiu{C~GJN{zO zj^W`Qe^%~TqM4N$Q++R1?!{_*{bA5vyNCDsUB1_k3vZ}LOMw$ug@^#*@vJ>0V6`jC z)1eFb?CPxV9KU~Eu*i5t%L%&N^;3N&+(!b10kt0jFvbk3q-KiZQCp}KeAECs)iab1 zhQf9c)29bW3idZL*PH53oeo6_r}j6poj2*){{q4M8JTNuT=4dB>LGgP)l$R4D8C1S zZ$Xc~UrKtV^d6a?A;BN(UUCzt?rE-Pb)gJ>qt(UybHK$MeX94t?9WSPkJjzZ3^K0) zlz($bUZmVa`S%s&BQ?2m-(bprIz*XNnJ8Bxs;Tl{i|vln+|I*;_p9A#U3ulZmFCL# zPN%c-Z$~I!=L+~aq5hpnp3e+E-|_Ms(u*bV1)+$z3Zfbm=;0>{<-@O1;W}R)xSt*l z4uMf;iFJ)D8$N6)R~+oP*VSp&Kz1lvYH{T0)(-a)(R*@z zPn?8d5GgC}@<_dyAO()o1AtH`Dg|;Hd^vwqKzayAW@@vF^Y)BYhy3=yL&_szr1LE- zIth~ea4_*Bk)$AgS1@^dF!3X`r66A6$q0h_Ohkv_#JsCS_1nQ4esDA~^anV;qe0}? zM))UjV#R6iD#~{TpKOpQJGZg60OI3tow>bIy1;Ac3$m2!d(#{-~7ZNFnFTA&y)-;0zs<`!10KLfM7>{2Oyj$X|?s%zB4~Yb~mbG@!IBD#-V%J80C)EqZPZafS+2bnj)^4~)IG(mtV3TgDIPE+~Y`*>`*f*nD3cS#hSuZV{>VkthpGkOeTb#mDIG&>7 zf}%8)^lOTnU&m)lMEdELDg00mp{U54CP9pARHjhP9Ikj{dc#-^t5VJl_8i&(REv}hlh>4G2RdPm(F8X|nP%=xK%c}e1M=xkNY zEy>6AA8&|IA z^QH&pnawS9dD>_`Wo_Isg|?-a-Wbx;#T?<_F`@m2^}L-#)FigbmhfyblC_5QWGobQ zvCtP^B-Tx%8~q`&RVUTsU!i!p=4}=>^%S+UvMdA-Fh~(A-VM`DR47dkogCXX9;fri zB=YbyM~FhLWO|G3#9Cg{rAotKl>!ui)r&|dvJLsA|AxPez zjR;Se5o;ICKdWeHW5;|!-r?TVv*_DVobL(r4$~WF^t9y23G&A=y(sov$O^5$B(6rs z9MMeL*lr$(;ZrdNbOrBXWC}vJ1sy8Aqvu_p3fjVlAHpoaWujWEkF6T?zS#TH5>XUH z78-pH8ljLgu?k?<3pu7$RK^UIRA1_Q(?_E7OEQi5jPBvp7kgjyE!Jo03^4?S@_Fc) zy78QcE@Z;n0um>`dIq0E=zFNS7&(?Bs4#_XsO7$?$6;hGI4MZPb)cbee0ykv=y{%~ zz^aDy88}2FV@Wr(O2va<%>aUX5ur^>1Q*PRQE9sVYAB3F;sh4z+n9A$?1e!rtoll$ zB{mX0H+Cse1}*d$VuEiRB^5i{9 zWw%AtaD{4_Jz(~0QguCSHl=tIR^*`Kdt*{xf=+g=(mcxpS^)Z{pD z0PP8E*Ka`w3Sc-#P!T81zIkq!l-CP*W{vbQ%ytT$fm?TA!uw!B3KTaF^u0D_ZCe86 zP|reVh~O31bVo1dpZY*qy;cTm2YN*KJM>YFp3L9`_6t>n2Qra|l?9MSaTdW8R7(L> zp*AQ%5NPXjJ);y&nPE_Cl@Am#(ib|IK0$-o@6G{iyz?gh7wah+CMQUf%!`9qK7h|- z%zL=D$MLnscplAGm6rYx_;C|s_JsXoZVa!N-XT~1KK8=rJs;L@R(cxF&&yV#=j!Tg zyn#{kzS;D=oxKJ>NH2&YtR_I92Rw7M<&%4+j(} z@_6_5)5_n#+XGYWAR)v=HQo+94<>*!z^_hR&&S__V!V+)3w%Jd45Wdc#juEM!xCD1 fhG)uQqtr95Z+nSDM${%CoOTHPbD+$^`^LWjxLoGE literal 0 HcmV?d00001 diff --git a/.doctrees/trf.doctree b/.doctrees/trf.doctree new file mode 100644 index 0000000000000000000000000000000000000000..e6457962c0b8954c6e57d1f59de75c023edbd576 GIT binary patch literal 17930 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 literal 0 HcmV?d00001 diff --git a/.doctrees/trnascan.doctree b/.doctrees/trnascan.doctree new file mode 100644 index 0000000000000000000000000000000000000000..6219808225c39a4df5bb8879db86c80dc957fc36 GIT binary patch literal 11752 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 M?Gs>>A100e0X)(Vwg3PC literal 0 HcmV?d00001 diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 0000000..e69de29 diff --git a/_modules/ensembl/tools/anno/protein_annotation/genblast.html b/_modules/ensembl/tools/anno/protein_annotation/genblast.html new file mode 100644 index 0000000..85ca388 --- /dev/null +++ b/_modules/ensembl/tools/anno/protein_annotation/genblast.html @@ -0,0 +1,599 @@ + + + + + + + ensembl.tools.anno.protein_annotation.genblast — ensembl-anno 0.1 documentation + + + + + + + + + +

+ +
+
+
+ +
+
+
+ +

Source code for ensembl.tools.anno.protein_annotation.genblast

+# See the NOTICE file distributed with this work for additional information
+# regarding copyright ownership.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+"""
+GenBlast identifies homologous gene sequences in genomic databases.
+One of the key features of GenBlast is its flexibility to handle
+comparative genomics tasks and accurately identify homologs even when
+the sequences have undergone significant evolutionary changes.
+This capability makes it a valuable resource for researchers studying gene
+evolution, gene families, and gene function across diverse species.
+
+GenBlast has been widely used in various genomic analyses and is available as
+a standalone command-line tool or as part of different bioinformatics pipelines.
+Researchers in the field of comparative genomics and gene function analysis
+often rely on GenBlast to perform sensitive homology searches and obtain
+valuable insights into the evolutionary relationships and functional conservation
+of genes in different organisms.
+
+
+She, R., Chu, J.S., Uyar, B., Wang, J., Wang, K., and Chen, N. (2011).
+GenBlastA: enabling BLAST to identify homologous gene sequences.
+Genome Res., 21(5): 936-949.
+"""
+__all__ = ["run_genblast"]
+
+import logging
+import logging.config
+import multiprocessing
+import os
+from pathlib import Path
+import random
+import re
+import shutil
+import signal
+import subprocess
+from typing import List
+import argschema
+
+from ensembl.tools.anno.utils._utils import (
+    check_exe,
+    create_dir,
+    check_gtf_content,
+)
+
+logger = logging.getLogger(__name__)
+
+
+
[docs]def run_genblast(#pylint:disable=dangerous-default-value + masked_genome: Path, + output_dir: Path, + protein_dataset: Path, + max_intron_length: int, + genblast_timeout_secs: int = 10800, + genblast_bin: Path = Path("genblast"), + convert2blastmask_bin: Path = Path("convert2blastmask"), + makeblastdb_bin: Path = Path("makeblastdb"), + num_threads: int = 1, + protein_set: str = ["uniprot", "orthodb"], +) -> None: + """ + Executes GenBlast on genomic slices + Args: + masked_genome : Masked genome file path. + output_dir: Working directory path. + protein_dataset: Protein dataset (Uniprot/OrthoDb) path. + genblast_timeout_secs: Time for timeout (sec). + max_intron_length: Maximum intron length. + genblast_bin : Software path. + convert2blastmask_bin: Software path. + makeblastdb_bin : Software path. + genblast_timeout: seconds + num_threads: int, number of threads. + """ + + check_exe(genblast_bin) + check_exe(convert2blastmask_bin) + check_exe(makeblastdb_bin) + if protein_set == "uniprot": + genblast_dir = create_dir(output_dir, "uniprot_output") + elif protein_set == "orthodb": + genblast_dir = create_dir(output_dir, "orthodb_output") + output_file = genblast_dir / "annotation.gtf" + if output_file.exists(): + transcript_count = check_gtf_content(output_file, "transcript") + if transcript_count > 0: + logger.info("Genblast gtf file exists, skipping analysis") + return + logging.info(Path(f"{output_dir}/alignscore.txt")) + if not Path(f"{genblast_dir}/alignscore.txt").exists(): + # Get the repo directory + repo_root_dir = Path(__file__).parents[6] + shutil.copy(Path(f"{repo_root_dir}/data/alignscore.txt"), genblast_dir) + + if not masked_genome.exists(): + raise IOError(f"Masked genome file does not exist: {masked_genome}") + if not protein_dataset.exists(): + raise IOError(f"Protein file does not exist: {protein_dataset}") + asnb_file = Path(f"{masked_genome}.asnb") + if asnb_file.exists(): + logger.info("Found an existing asnb, so will skip convert2blastmask") + else: + _run_convert2blastmask(convert2blastmask_bin, masked_genome, asnb_file) + _run_makeblastdb(makeblastdb_bin, masked_genome, asnb_file) + batched_protein_files = _split_protein_file( + protein_dataset, genblast_dir, num_threads + ) + pool = multiprocessing.Pool(num_threads) # pylint:disable=consider-using-with + for batched_protein_file in batched_protein_files: + pool.apply_async( + _multiprocess_genblast, + args=( + batched_protein_file, + masked_genome, + genblast_bin, + genblast_timeout_secs, + max_intron_length, + ), + ) + pool.close() + pool.join() + _generate_genblast_gtf(genblast_dir) + for i in range(0, 10): + shutil.rmtree(genblast_dir / f"bin_{i}") + logger.info("Completed running GenBlast")
+ + +def _multiprocess_genblast( + protein_file: Path, + masked_genome: Path, + genblast_bin: Path, + genblast_timeout: int, + max_intron_length: int, +): + """ + Executes GenBlast on genomic slice + Args: + protein_file: Path of a single batched file. + masked_genome : Masked genome file path. + genblast_bin : Software path. + genblast_timeout_secs: Time for timeout (sec). + max_intron_length: Maximum intron length. + Command line options: + -P Search program used to produce HSPs, + can be either "blast" or "wublast", default is "blast", + optional + -p specifies the program option of genBlast: genblasta or genblastg + -q List of query sequences to blast, must be in fasta format, + required + -t The target database of genomic sequences in fasta format, + required + -g parameter for blast: Perform gapped alignment (T/F) + [default: F], optional + -d parameter for genBlast: maximum allowed distance between HSPs + within the same gene, a non-negative integer [default: 100000], + optional + -r parameter for genBlast: number of ranks in the output, + a positive integer, optional + -e parameter for blast: The e-value, [default: 1e-2], + optional + -c parameter for genBlast: minimum percentage of query gene + coverage in the output, between 0 and 1 (e.g. for 50% + gene coverage, use "0.5"), optional + -W parameter for blast: Set word size, 0 means using blast default [default: 0], + optional + -scodon The number of base pairs to search for start codon within the region of HSP + group (inside the first HSP). If not specified, default is 15. + -i parameter for genBlastG: minimum intron length, optional. + If not specified, the default value is 15. + -x parameter for genBlastG: minimum internal exon length, optional. + If not specified, default is 20. + -n parameter for genBlastG: maximum number of splice sites per region, optional. + If not specified, default is 20. + -gff output options: turn on GFF output + -o output filename, optional. If not specified, the output + will be the same as the query filename with ".gblast" + extension. + -pid turn on final alignment PID computation (global alignment between predicted + gene and query) in output. + -softmask With this option NCBI blast will create a masking library, + you need to use it when blasting against a whole genome + """ + logger.info("Running GenBlast on : %s", protein_file) + + genblast_cmd = [ + str(genblast_bin), + "-p", + "genblastg", + "-q", + str(protein_file), + "-t", + str(masked_genome), + "-g", + "T", + "-pid", + "-r", + "1", + "-P", + "blast", + "-gff", + "-e", + "1e-1", + "-c", + "0.8", + "-W", + "3", + "-softmask", + "-scodon", + "50", + "-i", + "30", + "-x", + "10", + "-n", + "30", + "-d", + str(max_intron_length), + "-o", + str(protein_file), + ] + + logger.info(" ".join(genblast_cmd)) + # Using the child process termination as described here: + # https://alexandra-zaharia.github.io/posts/kill-subprocess + # -and-its-children-on-timeout-python/ + try: + p = subprocess.Popen(# pylint:disable=consider-using-with + genblast_cmd, start_new_session=True + ) + p.wait(timeout=genblast_timeout) + except subprocess.TimeoutExpired: + logger.error("Timeout reached for file: %s \n", protein_file) + subprocess.run(# pylint:disable=subprocess-run-check + ["touch", (Path(f"{protein_file}.except"))] + ) + os.killpg(os.getpgid(p.pid), signal.SIGTERM) + + +def _generate_genblast_gtf(genblast_dir: Path) -> None: + """ + Collect output from geneblast and create the final gtf file + genblast_dir: Working directory path. + """ + logging.info("AAAAA _generate_genblast_gtf") + output_file = genblast_dir / "annotation.gtf" + with open(output_file, "w+", encoding="utf8") as file_out: + genblast_extension = "_1.1c_2.3_s1_0_16_1" + for path in genblast_dir.rglob("*"): + # for root, dirs, files in os.walk(genblast_dir): + # for genblast_file in files: + # genblast_file = os.path.join(root, genblast_file) + if path.is_file() and path.suffix == ".gff": + gtf_string = _convert_genblast_gff_to_gtf(path) + file_out.write(gtf_string) + elif path.is_file() and path.suffix in ( + ".fa.blast", + ".fa.blast.report", + genblast_extension, + ): + path.unlink() + + +def _split_protein_file( + protein_dataset: Path, output_dir: Path, batch_size: int = 20 +) -> List: + """ + The protein dataset file is splitted by a number of sequence equals to the batch_size + in batch files stored in 10 output directories. + protein_dataset : Path for the protein dataset. + output_dir : Output directory path. + batch_size : Size of the batch, it needs to be equals to the number of threads + to parallelise the sequence processing for each file. + """ + batched_protein_files = [] + + for i in range(0, 10): + create_dir(output_dir, (f"bin_{i}")) + with open(protein_dataset,"r", encoding="utf8") as file_in: + seq_count = 0 + batch_count = 0 + current_record = "" + initial_seq = True + for line in file_in: + match = re.search(r">(.+)$", line) + # match header and is not first sequence, if the number of stored sequences in each file equals + # the number of batch_size, a new file will be created and the current_record reset + if match and not initial_seq and seq_count % batch_size == 0: + bin_num = random.randint(0, 9) + batch_file = output_dir / f"bin_{bin_num}" / f"{batch_count}.fa" + with batch_file.open("w+") as file_out: + file_out.write(current_record) + batch_count += 1 + seq_count += 1 + current_record = line + batched_protein_files.append(batch_file) + # match header and is the first sequence + elif match: + current_record += line + initial_seq = False + seq_count += 1 + # other lines + else: + current_record += line + + if current_record: + bin_num = random.randint(0, 9) + batch_file = output_dir / f"bin_{bin_num}" / f"{batch_count}.fa" + with batch_file.open("w+") as file_out: + file_out.write(current_record) + batched_protein_files.append(batch_file) + return batched_protein_files + + +def _run_convert2blastmask( + convert2blastmask_bin: Path, masked_genome: Path, asnb_file: Path +) -> None: + """ + Convert masking information in lower-case masked FASTA input to file + formats suitable for makeblastdb. + convert2blastmask_bin : Software path. + masked_genome: Path of masked genome file. + asnb_file: Path of assembly file. + """ + logger.info("Running convert2blastmask prior to GenBlast:") + cmd = [ + str(convert2blastmask_bin), + "-in", + str(masked_genome), + "-parse_seqids", + "-masking_algorithm", # mask_program_name + "other", + "-masking_options", # mask_program_options + '"REpeatDetector, default"', + "-outfmt", # output_format + "maskinfo_asn1_bin", + "-out", + str(asnb_file), + ] + logger.info(" ".join(cmd)) + subprocess.run(cmd, check=True) + logger.info("Completed running convert2blastmask") + + +def _run_makeblastdb(makeblastdb_bin: Path, masked_genome: Path, asnb_file: Path) -> None: + """ + Application to create BLAST databases. + makeblastdb_bin : Software path. + masked_genome: Path of masked genome file. + asnb_file: Path of assembly file. + """ + logger.info("Running makeblastdb prior to GenBlast") + subprocess.run( # pylint:disable=subprocess-run-check + [ + str(makeblastdb_bin), + "-in", + str(masked_genome), + "-dbtype", # molecule_type + "nucl", + "-parse_seqids", + "-mask_data", + str(asnb_file), + "-max_file_sz", # number_of_bytes + "10000000000", + ] + ) + logger.info("Completed running makeblastdb") + + +def _convert_genblast_gff_to_gtf(gff_file: Path) -> str: + """ + Convert the content of gtf file in gff format + gff_file: Path for the gff file + """ + gtf_string = "" + with open(gff_file, "r", encoding="utf8") as file_in: + for line in file_in: + results = line.split() + if len(results) == 9: + results[2] = "exon" if results[2] == "coding_exon" else results[2] + attributes = _set_genblast_attributes(str(results[8]), str(results[2])) + results[8] = attributes + converted_line = "\t".join(results) + gtf_string += converted_line + "\n" + return gtf_string + + +def _set_genblast_attributes(attributes: str, feature_type: str) -> str: + """ + Given the list of attributes in the genblast output, + define the new attributes for the gtf file. + attributes: GenBlast attribute list + feature_type: transcript or exon + Example genBlast output #pylint: disable=line-too-long, trailing-whitespace + 1 genBlastG transcript 131128674 131137049 252.729 - . ID=259447-R1-1-A1;Name=259447;PID=84.65;Coverage=94.22;Note=PID:84.65-Cover:94.22 + 1 genBlastG coding_exon 131137031 131137049 . - . ID=259447-R1-1-A1-E1;Parent=259447-R1-1-A1 + 1 genBlastG coding_exon 131136260 131136333 . - . ID=259447-R1-1-A1-E2;Parent=259447-R1-1-A1 + 1 genBlastG coding_exon 131128674 131130245 . - . ID=259447-R1-1-A1-E3;Parent=259447-R1-1-A1 + """ + converted_attributes = "" + split_attributes = attributes.split(";") + if feature_type == "transcript": + match = re.search(r"Name\=(.+)$", split_attributes[1]) + assert match + name = match.group(1) + converted_attributes = f'gene_id "{name}"; transcript_id "{name}";' + elif feature_type == "exon": + match = re.search(r"\-E(\d+);Parent\=(.+)\-R\d+\-\d+\-", attributes) + assert match + exon_rank = match.group(1) + name = match.group(2) + converted_attributes = ( + f'gene_id "{name}"; transcript_id "{name}"; exon_number "{exon_rank}";' + ) + + return converted_attributes + + +class InputSchema(argschema.ArgSchema): + """Input arguments expected to run TRF.""" + + masked_genome_file = argschema.fields.InputFile( + required=True, description="Masked genome file path" + ) + output_dir = argschema.fields.OutputDir( + required=True, description="Output directory path" + ) + protein_file = argschema.fields.String( + required=True, description="Path for the protein dataset" + ) + genblast_timeout_secs = argschema.fields.Integer( + required=False, default=10800, description="Genblast timeout period" + ) + max_intron_length = argschema.fields.Integer( + required=True, description="Maximum intron length" + ) + genblast_bin = argschema.fields.String( + required=False, + default="genblast", + description="Genblast executable path", + ) + convert2blastmask_bin = argschema.fields.String( + required=False, + default="convert2blastmask", + description="convert2blastmask executable path", + ) + makeblastdb_bin = argschema.fields.String( + required=False, default="makeblastdb", description="makeblastdb executable path" + ) + num_threads = argschema.fields.Integer( + required=False, default=1, description="Number of threads" + ) + protein_set = argschema.fields.String( + required=True, + description="Protein set [uniprot,orthodb]", + validate=lambda x: x in ["uniprot", "orthodb"], + ) + + +def main() -> None: + """Genblast's entry-point.""" + mod = argschema.ArgSchemaParser(schema_type=InputSchema) + log_file_path = create_dir(mod.args["output_dir"], "log") / "genblast.log" + loginipath = Path(__file__).parents[6] / "conf" / "logging.conf" + logging.config.fileConfig( + loginipath, + defaults={"logfilename": str(log_file_path)}, + disable_existing_loggers=False, + ) + run_genblast( + Path(mod.args["masked_genome_file"]), + Path(mod.args["output_dir"]), + Path(mod.args["protein_file"]), + mod.args["max_intron_length"], + mod.args["genblast_timeout_secs"], + Path(mod.args["genblast_bin"]), + Path(mod.args["convert2blastmask_bin"]), + Path(mod.args["makeblastdb_bin"]), + mod.args["num_threads"], + mod.args["protein_set"], + ) + + +if __name__ == "__main__": + main() +
+ +
+
+
+
+
+ +
+
+
+ + + + + \ No newline at end of file diff --git a/_modules/ensembl/tools/anno/repeat_annotation/dust.html b/_modules/ensembl/tools/anno/repeat_annotation/dust.html new file mode 100644 index 0000000..e071880 --- /dev/null +++ b/_modules/ensembl/tools/anno/repeat_annotation/dust.html @@ -0,0 +1,309 @@ + + + + + + + ensembl.tools.anno.repeat_annotation.dust — ensembl-anno 0.1 documentation + + + + + + + + + + + +
+
+
+ +
+
+
+ +

Source code for ensembl.tools.anno.repeat_annotation.dust

+# See the NOTICE file distributed with this work for additional information #pylint: disable=missing-module-docstring
+# regarding copyright ownership.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+"""
+DustMasker is a program that identifies and masks out low complexity
+parts of a genome using a new and improved DUST algorithm.
+
+Morgulis A, Gertz EM, Schaffer AA, Agarwala R. A Fast and Symmetric
+DUST Implementation to Mask Low-Complexity DNA Sequences.
+"""
+__all__ = ["run_dust"]
+
+import logging
+import logging.config
+import multiprocessing
+import os
+from os import PathLike
+from pathlib import Path
+import re
+import subprocess
+import tempfile
+from typing import List
+import argschema
+
+
+from ensembl.tools.anno.utils._utils import (
+    check_exe,
+    create_dir,
+    check_gtf_content,
+    get_seq_region_length,
+    get_slice_id,
+    slice_output_to_gtf,
+    get_sequence,
+)
+
+logger = logging.getLogger(__name__)
+
+
+
[docs]def run_dust( + genome_file: PathLike, + output_dir: Path, + dust_bin: Path = Path("dustmasker"), + num_threads: int = 1, +) -> None: + """ + Run Dust on genomic slices with mutiprocessing + Args: + genome_file : Genome file path. + output_dir : Working directory path. + dust_bin : Dust software path. + num_threads: Number of threads. + """ + + check_exe(dust_bin) + dust_dir = create_dir(output_dir, "dust_output") + os.chdir(str(dust_dir)) + output_file = dust_dir / "annotation.gtf" + if output_file.exists(): + transcript_count = check_gtf_content(output_file, "repeat") + if transcript_count > 0: + logger.info("Dust gtf file exists, skipping analysis") + return + logger.info("Creating list of genomic slices") + seq_region_to_length = get_seq_region_length(genome_file, 5000) + slice_ids_per_region = get_slice_id( + seq_region_to_length, slice_size=1000000, overlap=0, min_length=5000 + ) + dust_cmd = [dust_bin, "-in"] + pool = multiprocessing.Pool(num_threads) # pylint: disable=consider-using-with + for slice_id in slice_ids_per_region: + pool.apply_async( + _multiprocess_dust, + args=( + dust_cmd, + slice_id, + dust_dir, + genome_file, + ), + ) + pool.close() + pool.join() + slice_output_to_gtf(dust_dir, "repeat_id", "dust", True, ".dust.gtf") + for gtf_file in dust_dir.glob("*.dust.gtf"): + gtf_file.unlink()
+ + +def _multiprocess_dust( # pylint: disable=too-many-locals + dust_cmd: List[str], + slice_id: List[str], + dust_dir: Path, + genome_file: Path, +) -> None: + """ + Run Dust on multiprocess on genomic slices + Args: + dust_cmd: Dust command to execute. + slice_id: List of slice IDs. + dust_dir : Dust output directory path. + genome_file : Genome file. + """ + region_name, start, end = slice_id + logger.info( + "Processing slice to find low complexity regions with Dust: %s:%s:%s", + region_name, + start, + end, + ) + seq = get_sequence(region_name, int(start), int(end), 1, genome_file, dust_dir) + slice_name = f"{region_name}.rs{start}.re{end}" + with tempfile.TemporaryDirectory(dir=dust_dir) as tmpdirname: + slice_file = dust_dir / tmpdirname / f"{slice_name}.fa" + with open(slice_file, "w+", encoding="utf8") as region_out: + region_out.write(f">{region_name}\n{seq}\n") + region_results = dust_dir / f"{slice_name}.dust.gtf" + output_file = Path(f"{slice_file}.dust") + dust_cmd.append(str(slice_file)) + logger.info("dust_cmd: %s", dust_cmd) + with open(output_file, "w+", encoding="utf8") as dust_out: + subprocess.run(dust_cmd, stdout=dust_out, check=True) + _create_dust_gtf(output_file, region_results, region_name) + slice_file.unlink() + output_file.unlink() + + +def _create_dust_gtf( + output_file: Path, + region_results: Path, + region_name: str, +) -> None: + """ + Read the fasta file and save the content in gtf format + All the genomic slices are collected in a single gtf output + Args: + output_file : GTF file with final results. + region_results : GTF file with the results per region. + region_name :Coordinates of genomic slice. + """ + with open(output_file, "r", encoding="utf8") as dust_in, open( + region_results, "w+", encoding="utf8" + ) as dust_out: + repeat_count = 1 + for line in dust_in: + result_match = re.search(r"(\d+)\ - (\d+)", line) + if result_match: + start = int(result_match.group(1)) + 1 + end = int(result_match.group(2)) + 1 + gtf_line = ( + f"{region_name}\tDust\trepeat\t{start}\t" + f'{end}\t.\t+\t.\trepeat_id "{repeat_count}";\n' + ) + dust_out.write(gtf_line) + repeat_count += 1 + + +class InputSchema(argschema.ArgSchema): + """Input arguments expected to run DustMasker.""" + + genome_file = argschema.fields.InputFile( + required=True, description="Genome file path" + ) + output_dir = argschema.fields.OutputDir( + required=True, description="Output directory path" + ) + dust_bin = argschema.fields.String( + required=False, + default="dustmasker", + description="Dust executable path", + ) + num_threads = argschema.fields.Integer( + required=False, default=1, description="Number of threads" + ) + + +def main() -> None: + """Dust's entry-point.""" + mod = argschema.ArgSchemaParser(schema_type=InputSchema) + log_file_path = create_dir(mod.args["output_dir"], "log") / "dust.log" + loginipath = Path(__file__).parents[6] / "conf" / "logging.conf" + logging.config.fileConfig( + loginipath, + defaults={"logfilename": str(log_file_path)}, + disable_existing_loggers=False, + ) + run_dust( + mod.args["genome_file"], + mod.args["output_dir"], + mod.args["dust_bin"], + mod.args["num_threads"], + ) + + +if __name__ == "__main__": + main() +
+ +
+
+
+
+
+ +
+
+
+ + + + + \ No newline at end of file diff --git a/_modules/ensembl/tools/anno/repeat_annotation/red.html b/_modules/ensembl/tools/anno/repeat_annotation/red.html new file mode 100644 index 0000000..e62f237 --- /dev/null +++ b/_modules/ensembl/tools/anno/repeat_annotation/red.html @@ -0,0 +1,271 @@ + + + + + + + ensembl.tools.anno.repeat_annotation.red — ensembl-anno 0.1 documentation + + + + + + + + + + + +
+
+
+ +
+
+
+ +

Source code for ensembl.tools.anno.repeat_annotation.red

+# See the NOTICE file distributed with this work for additional information
+# regarding copyright ownership.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+"""
+Red is the first repeat-detection tool capable of labeling its training data
+and training itself automatically on an entire genome.
+Girgis, H.Z. Red: an intelligent, rapid, accurate tool for detecting repeats
+de-novo on the genomic scale. BMC Bioinformatics 16, 227 (2015).
+https://doi.org/10.1186/s12859-015-0654-5
+"""
+__all__ = ["run_red"]
+
+import logging
+import logging.config
+from os import PathLike
+from pathlib import Path
+import re
+import subprocess
+import argschema
+
+from ensembl.tools.anno.utils._utils import (
+    check_exe,
+    create_dir,
+)
+
+logger = logging.getLogger(__name__)
+
+
+
[docs]def run_red(genome_file: Path, output_dir: Path, red_bin: Path = Path("Red"),) -> str: + """ + Run Red on genome file + + Args: + genome_file : Genome file path. + output_dir : Working directory path. + red_bin : Red software path. + + Return: + masked genome file + """ + check_exe(red_bin) + red_dir = create_dir(output_dir, "red_output") + red_mask_dir = create_dir(red_dir, "mask_output") + red_repeat_dir = create_dir(red_dir, "repeat_output") + red_genome_dir = create_dir(red_dir, "genome_dir") + + sym_link_genome_cmd = "ln -s " + str(genome_file) + " " + str(red_genome_dir) + genome_file_name = genome_file.name + red_genome_file = red_genome_dir / genome_file_name + genome_file_stem = genome_file.stem + masked_genome_file = red_mask_dir / f"{genome_file_stem}.msk" + repeat_coords_file = red_repeat_dir / f"{genome_file_stem}.rpt" + output_file = red_dir / "annotation.gtf" + + if masked_genome_file.exists(): + logger.warning( + "Masked Genome file already found on the path to the Red mask output dir. \ + Will not create a new file" + ) + # _create_red_gtf(repeat_coords_file, output_file) + return str(masked_genome_file) + if red_genome_file.exists(): + logger.warning( + "Unmasked genome file already found on the path to the Red genome dir, \ + will not create a sym link" + ) + + else: + logger.info( + "Preparing to sym link the genome file to the Red genome dir. Cmd\n %s", + sym_link_genome_cmd, + ) + # subprocess.run(["ln", "-s", genome_file, red_genome_dir]) + red_genome_file.symlink_to(genome_file) + try: + if red_genome_file.exists(): + logger.info("Running Red") + subprocess.run( + [ + red_bin, + "-gnm", + red_genome_dir, + "-msk", + red_mask_dir, + "-rpt", + red_repeat_dir, + ], + check=True, + ) + except: + logger.error( + "Could not find the genome file in the Red genome dir or sym link \ + to the original file. Path expected:\n%s", + genome_file, + ) + _create_red_gtf(repeat_coords_file, output_file) + return str(masked_genome_file)
+ + +def _create_red_gtf(repeat_coords_file: Path, output_file: Path): + """ + Create Red gtf file from masked genome file + + Args: + repeat_coords_file: Coordinates for repeats. + output_file : GTF file with the final results. + """ + with open(repeat_coords_file, "r", encoding="utf8") as red_in, open( + output_file, "w+", encoding="utf8" + ) as red_out: + for repeat_id, line in enumerate(red_in, start=1): + result_match = re.search(r"^\>(.+)\:(\d+)\-(\d+)", line) + if result_match: + region_name = result_match.group(1) + # Note that Red is 0-based, so add 1 + start = int(result_match.group(2)) + 1 + end = int(result_match.group(3)) + 1 + gtf_line = ( + f"{region_name}\tRed\trepeat\t{start}\t" + f'{end}\t.\t+\t.\trepeat_id "{repeat_id}";\n' + ) + red_out.write(gtf_line) + + +class InputSchema(argschema.ArgSchema): + """Input arguments expected to run Red.""" + + genome_file = argschema.fields.InputFile( + required=True, description="Genome file path" + ) + output_dir = argschema.fields.OutputDir( + required=True, description="Output directory path" + ) + red_bin = argschema.fields.String( + required=False, default="Red", description="Red executable path", + ) + + +def main() -> None: + """Red's entry-point.""" + mod = argschema.ArgSchemaParser(schema_type=InputSchema) + log_file_path = create_dir(mod.args["output_dir"], "log") / "red.log" + loginipath = Path(__file__).parents[6] / "conf" / "logging.conf" + logging.config.fileConfig( + loginipath, + defaults={"logfilename": str(log_file_path)}, + disable_existing_loggers=False, + ) + run_red( + Path(mod.args["genome_file"]), mod.args["output_dir"], mod.args["red_bin"], + ) + + +if __name__ == "__main__": + main() +
+ +
+
+
+
+
+ +
+
+
+ + + + + \ No newline at end of file diff --git a/_modules/ensembl/tools/anno/repeat_annotation/repeatmasker.html b/_modules/ensembl/tools/anno/repeat_annotation/repeatmasker.html new file mode 100644 index 0000000..fd90576 --- /dev/null +++ b/_modules/ensembl/tools/anno/repeat_annotation/repeatmasker.html @@ -0,0 +1,368 @@ + + + + + + + ensembl.tools.anno.repeat_annotation.repeatmasker — ensembl-anno 0.1 documentation + + + + + + + + + + + +
+
+
+ +
+
+
+ +

Source code for ensembl.tools.anno.repeat_annotation.repeatmasker

+# See the NOTICE file distributed with this work for additional information #pylint: disable=missing-module-docstring
+# regarding copyright ownership.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+"""
+    RepeatMasker is a program that screens DNA sequences for interspersed
+    repeats and low complexity DNA sequences.
+    Smit, AFA, Hubley, R & Green, P. RepeatMasker Open-4.0
+"""
+
+__all__ = ["run_repeatmasker"]
+
+import json
+import logging
+import logging.config
+import multiprocessing
+import os
+from os import PathLike
+from pathlib import Path
+import re
+import subprocess
+from typing import List
+import argschema
+
+from ensembl.tools.anno.utils._utils import (
+    check_exe,
+    create_dir,
+    check_gtf_content,
+    get_seq_region_length,
+    get_slice_id,
+    slice_output_to_gtf,
+    get_sequence,
+)
+logger = logging.getLogger('__name__')
+
+
+
[docs]def run_repeatmasker( + genome_file: PathLike, + output_dir: Path, + repeatmasker_bin: Path = Path("RepeatMasker"), + library: str = "", + repeatmasker_engine: str = "rmblast", + species: str = "", + num_threads: int = 1, +) -> None: + + """ + Executes RepeatMasker on the genome slices and stores the final annotation.gtf in repeatmasker_output + Args: + genome_file : Genome file path. + repeatmasker_path : RepeatMasker executable path. + library : Custom repeat library. + species :Species name. + output_dir : Output directory path. + num_threads: Number of threads. + + """ + check_exe(repeatmasker_bin) + repeatmasker_dir = create_dir(output_dir, "repeatmasker_output") + + output_file = repeatmasker_dir / "annotation.gtf" + if output_file.exists(): + transcript_count = check_gtf_content(output_file, "repeat") + if transcript_count > 0: + logger.info("Repeatmasker gtf file exists") + return + logger.info("Creating list of genomic slices") + seq_region_to_length = get_seq_region_length(genome_file, 5000) + slice_ids_per_region = get_slice_id( + seq_region_to_length, slice_size=1000000, overlap=0, min_length=5000 + ) + repeatmasker_cmd = [ + str(repeatmasker_bin), + "-nolow",#does not display simple repeats or low_complexity DNA in the annotation + "-engine", + repeatmasker_engine, + "-dir", + str(repeatmasker_dir), + ] + if not library: + if not species: + species = "homo" + repeatmasker_cmd.extend(["-species", species]) + else: + repeatmasker_cmd.extend(["-lib", library]) + logger.info(f"Running RepeatMasker {repeatmasker_cmd}") + pool = multiprocessing.Pool(num_threads) # pylint: disable=consider-using-with + for slice_id in slice_ids_per_region: + pool.apply_async( + _multiprocess_repeatmasker, + args=( + repeatmasker_cmd, + slice_id, + genome_file, + repeatmasker_dir, + ), + ) + pool.close() + pool.join() + slice_output_to_gtf(repeatmasker_dir, "repeat_id", "repeatmask", True, ".rm.gtf") + for gtf_file in repeatmasker_dir.glob("*.rm.gtf"): + gtf_file.unlink()
+ +def _multiprocess_repeatmasker( # pylint: disable=too-many-locals + repeatmasker_cmd: List[str], + slice_id: List[str], + genome_file: Path, + repeatmasker_dir: Path, +) -> None: + """ + Run Repeatmasker on genomic slice + + Args: + repeatmasker_cmd: RepeatMasker command to execute. + slice_id: Slice ID to run RepeatMasker on. + genome_file : Genome file path. + repeatmasker_dir : RepeatMasker output directory path. + """ + + region_name, start, end = slice_id + logger.info( + "Processing slice to find repeats with RepeatMasker: %s:%s:%s", + region_name, + start, + end, + ) + seq = get_sequence( + region_name, int(start), int(end), 1, genome_file, repeatmasker_dir + ) + slice_file_name = f"{region_name}.rs{start}.re{end}" + region_file = repeatmasker_dir / f"{slice_file_name}.fa" + with open(region_file, "w+", encoding="utf8") as region_fasta_out: + region_fasta_out.write(f">{region_name}\n{seq}\n") + region_results_file = Path(f"{region_file}.rm.gtf") + output_file = Path(f"{region_file}.out") + masked_file = Path(f"{region_file}.masked") + tbl_file = Path(f"{region_file}.tbl") + log_file = Path(f"{region_file}.log") + cat_file = Path(f"{region_file}.cat") + repeatmasker_cmd = repeatmasker_cmd.copy() + repeatmasker_cmd.append(str(region_file)) + logger.info(repeatmasker_cmd) + subprocess.run(repeatmasker_cmd, check=True) + _create_repeatmasker_gtf(output_file, region_results_file, region_name) + output_file.unlink() + region_file.unlink() + masked_file.unlink(missing_ok=True) + tbl_file.unlink(missing_ok=True) + log_file.unlink(missing_ok=True) + cat_file.unlink(missing_ok=True) + + +def _create_repeatmasker_gtf( # pylint: disable=too-many-locals + output_file: Path, + region_results_file: Path, + region_name: str, +) -> None: + """ + Read the fasta file and save the content in gtf format + + All the genomic slices are collected in a single gtf output with the following format: + SW perc perc perc query position in query matching repeat position in repeat + score div. del. ins. sequence begin end (left) repeat class/family begin end (left) ID + Args: + output_file : GTF file with final results. + region_results_file_path : GTF file with results per region. + region_name : Coordinates of genomic slice. + """ + with open(output_file, "r", encoding="utf8") as repeatmasker_in, open( + region_results_file, "w+", encoding="utf8" + ) as repeatmasker_out: + repeat_count = 1 + for line in repeatmasker_in: + result_match = re.search(r"^\s*\d+\s+", line) + if result_match: + results = line.split() + if results[-1] == "*": + results.pop() + if len(results) != 15: + continue + score = results[0] + start = results[5] + end = results[6] + strand = results[8] + repeat_name = results[9] + repeat_class = results[10] + if strand == "+": + repeat_start = results[11] + repeat_end = results[12] + else: + repeat_start = results[13] + repeat_end = results[12] + strand = "-" + gtf_line = ( + f"{region_name}\tRepeatMasker\trepeat\t{start}\t{end}\t.\t" + f"{strand}\t.\trepeat_id{repeat_count}; " + f'repeat_name "{repeat_name}"; repeat_class "{repeat_class}"; ' + f'repeat_start "{repeat_start}"; ' + f'repeat_end "{repeat_end}"; score "{score}";\n' + ) + repeatmasker_out.write(gtf_line) + repeat_count += 1 + + +class InputSchema(argschema.ArgSchema): + """Input arguments expected to run RepeatMasker.""" + + genome_file = argschema.fields.InputFile( + required= True, description= "Genome file path" + ) + output_dir = argschema.fields.OutputDir( + required= True, description= "Output directory path" + ) + repeatmasker_bin = argschema.fields.String( + required= False, default= "RepeatMasker", + description = "RepeatMasker executable path", + + ) + library = argschema.fields.String( + required= False, default= "", description= "Custom repeat library" + ) + repeatmasker_engine = argschema.fields.String( + required= False, default= "rmblast", description= "RepeatMasker engine" + ) + species = argschema.fields.String( + required= False, + default="homo", + description="Species name (used if no library is provided)" + ) + num_threads = argschema.fields.Integer( + required= False, default= 1, description= "Number of threads" + ) + + +def main() -> None: + """RepeatMasker's entry-point.""" + mod = argschema.ArgSchemaParser(schema_type=InputSchema) + log_file_path = create_dir(mod.args["output_dir"], "log") /"repeatmasking.log" + loginipath = Path(__file__).parents[6] / "conf" / "logging.conf" + logging.config.fileConfig(loginipath, defaults={"logfilename": str(log_file_path)}, disable_existing_loggers=False,) + run_repeatmasker( + mod.args["genome_file"], + mod.args["output_dir"], + mod.args["repeatmasker_bin"], + mod.args["library"], + mod.args["repeatmasker_engine"], + mod.args["species"], + mod.args["num_threads"], + ) + +if __name__ == "__main__": + main() + +
+ +
+
+
+
+
+ +
+
+
+ + + + + \ No newline at end of file diff --git a/_modules/ensembl/tools/anno/repeat_annotation/trf.html b/_modules/ensembl/tools/anno/repeat_annotation/trf.html new file mode 100644 index 0000000..d28cd84 --- /dev/null +++ b/_modules/ensembl/tools/anno/repeat_annotation/trf.html @@ -0,0 +1,397 @@ + + + + + + + ensembl.tools.anno.repeat_annotation.trf — ensembl-anno 0.1 documentation + + + + + + + + + + + +
+
+
+ +
+
+
+ +

Source code for ensembl.tools.anno.repeat_annotation.trf

+# See the NOTICE file distributed with this work for additional information #pylint: disable=missing-module-docstring
+# regarding copyright ownership.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+"""
+    Tandem Repeats Finder is a program to locate and display tandem repeats in DNA sequences.
+    Benson G. Tandem repeats finder: a program to analyze DNA sequences.
+    Nucleic Acids Res. 1999; 27(2):573–580. doi:10.1093/nar/27.2.573
+"""
+__all__ = ["run_trf"]
+
+import logging
+import logging.config
+import multiprocessing
+import os
+from os import PathLike
+from pathlib import Path
+import re
+import subprocess
+import tempfile
+from typing import List
+import argschema
+
+from ensembl.tools.anno.utils._utils import (
+    check_exe,
+    create_dir,
+    check_gtf_content,
+    get_seq_region_length,
+    get_slice_id,
+    slice_output_to_gtf,
+    get_sequence,
+)
+
+logger = logging.getLogger(__name__)
+
+
+
[docs]def run_trf( + genome_file: PathLike, + output_dir: Path, + num_threads: int = 1, + trf_bin: Path = Path("trf"), + match_score: int = 2, + mismatch_score: int = 5, + delta: int = 7, + pm: int = 80, + pi: int = 10, + minscore: int = 40, + maxperiod: int = 500, +) -> None: + """ + Executes TRF on genomic slices + Args: + genome_file : Genome file path. + output_dir : working directory path. + num_threads: int, number of threads. + trf_bin : TRF software path. + match_score : Matching weight. + mismatch_score : Mismatching penalty. + delta : Indel penalty. + pm : Match probability (whole number). + pi : Indel probability (whole number). + minscore : Minimum alignment score to report. + maxperiod : Maximum period size to report. + """ + check_exe(trf_bin) + trf_dir = create_dir(output_dir, "trf_output") + os.chdir(str(trf_dir)) + output_file = trf_dir / "annotation.gtf" + if output_file.exists(): + transcript_count = check_gtf_content(output_file, "repeat") + if transcript_count > 0: + logger.info("Trf gtf file exists, skipping analysis") + return + logger.info("Creating list of genomic slices") + seq_region_to_length = get_seq_region_length(genome_file, 5000) + slice_ids_per_region = get_slice_id( + seq_region_to_length, slice_size=1000000, overlap=0, min_length=5000 + ) + trf_output_extension = ( + f".{match_score}.{mismatch_score}.{delta}." + f"{pm}.{pi}.{minscore}.{maxperiod}.dat" + ) + trf_cmd = [ + trf_bin, + None, + str(match_score), + str(mismatch_score), + str(delta), + str(pm), + str(pi), + str(minscore), + str(maxperiod), + "-d", + "-h", + ] + logger.info("Running TRF") + pool = multiprocessing.Pool(num_threads)#pylint:disable=consider-using-with + for slice_id in slice_ids_per_region: + pool.apply_async( + _multiprocess_trf, + args=( + trf_cmd, + slice_id, + trf_dir, + trf_output_extension, + genome_file, + ), + ) + pool.close() + pool.join() + slice_output_to_gtf(trf_dir, "repeat_id", "trf", True, ".trf.gtf") + for gtf_file in trf_dir.glob("*.trf.gtf"): + gtf_file.unlink()
+ + +def _multiprocess_trf( + trf_cmd: List[str], + slice_id: List[str], + trf_dir: Path, + trf_output_extension: Path, + genome_file:Path, +) -> None: + """ + Run TRF on multiprocess on genomic slices + Args: + trf_cmd: TRF command to execute. + slice_id: Slice Id to run TRF on. + trf_dir : TRF output dir. + trf_output_extension: TRF file output extension. + genome_file : Genome file. + """ + region_name, start, end = slice_id + logger.info( + "Processing slice to find tandem repeats with TRF:%s:%s:%s", + region_name, + start, + end, + ) + seq = get_sequence(region_name, int(start), int(end), 1, genome_file, trf_dir) + slice_name = f"{region_name}.rs{start}.re{end}" + with tempfile.TemporaryDirectory(dir=trf_dir) as tmpdirname: + slice_file = trf_dir / tmpdirname / f"{slice_name}.fa" + with open(slice_file, "w+", encoding="utf8") as region_out: + region_out.write(f">{region_name}\n{seq}\n") + region_results = trf_dir / f"{slice_name}.trf.gtf" + # TRF writes to the current dir, so swtich to the output dir for it + # os.chdir(str(trf_output_dir)) + output_file = Path(f"{slice_file}{trf_output_extension}") + trf_cmd = trf_cmd.copy() + trf_cmd[1] = str(slice_file) + logger.info("trf_cmd: %s", trf_cmd) + # with open(trf_output_file_path, "w+") as trf_out: + subprocess.run(trf_cmd, cwd=trf_dir / tmpdirname)#pylint:disable=subprocess-run-check + _create_trf_gtf(output_file, region_results, region_name) + slice_file.unlink() + output_file.unlink() + + +def _create_trf_gtf( + output_file: Path, + region_results: Path, + region_name: str, +) -> None: + """ + Read the fasta file and save the content in gtf format + + TRF output format: + cols 1+2: Indices of the repeat relative to the start of the sequence + col 3: Period size of the repeat + col 4: Number of copies aligned with the consensus pattern + col 5: Size of consensus pattern (may differ slightly from the period size) + col 6: Percent of matches between adjacent copies overall + col 7: Percent of indels between adjacent copies overall + col 8: Alignment score + cols 9-12: Percent composition for each of the four nucleotides + col 13: Entropy measure based on percent composition + col 14: Consensus sequence + col 15: Repeat sequence + Args: + output_file : GTF file with final results. + region_results : GTF file with results per region. + region_name : Coordinates of genomic slice. + """ + with open(output_file, "r", encoding="utf8") as trf_in, open( + region_results, "w+", encoding="utf8" + ) as trf_out: + repeat_count = 1 + for line in trf_in: + result_match = re.search(r"^\d+", line) + if result_match: + results = line.split() + if len(results) != 15: + continue + start = results[0] + end = results[1] + period = float(results[2]) + copy_number = float(results[3]) + percent_matches = float(results[5]) + score = float(results[7]) + repeat_consensus = results[13] + if ( # pylint: disable=too-many-boolean-expressions + score < 50 + and percent_matches >= 80 + and copy_number > 2 + and period < 10 + ) or (copy_number >= 2 and percent_matches >= 70 and score >= 50): + gtf_line = ( + f"{region_name}\tTRF\trepeat\t{start}\t{end}\t.\t+\t.\t" + f'repeat_id "{repeat_count}"; score "{score}"; ' + f'repeat_consensus "{repeat_consensus}";\n' + ) + trf_out.write(gtf_line) + repeat_count += 1 + + +class InputSchema(argschema.ArgSchema): + """Input arguments expected to run TRF.""" + + genome_file = argschema.fields.InputFile( + required=True, description="Genome file path" + ) + output_dir = argschema.fields.OutputDir( + required=True, description="Output directory path" + ) + trf_bin = argschema.fields.String( + required=False, + default="trf", + description="TRF executable path", + ) + match_score = argschema.fields.Integer( + required=False, default=2, description="Matching weight" + ) + mismatch_score = argschema.fields.Integer( + required=False, default=5, description="Mismatching penalty" + ) + delta = argschema.fields.Integer( + required=False, default=7, description="Indel penalty" + ) + pm = argschema.fields.Integer( + required=False, default=80, description="Match probability" + ) + pi = argschema.fields.Integer( + required=False, default=10, description="Indel probability" + ) + minscore = argschema.fields.Integer( + required=False, default=40, description="Minimum alignment score to report" + ) + maxperiod = argschema.fields.Integer( + required=False, default=500, description="Maximum period size to report" + ) + num_threads = argschema.fields.Integer( + required=False, default=1, description="Number of threads" + ) + + +def main() -> None: + """TRF's entry-point.""" + mod = argschema.ArgSchemaParser(schema_type=InputSchema) + log_file_path = create_dir(mod.args["output_dir"], "log") / "trf.log" + loginipath = Path(__file__).parents[6] / "conf" / "logging.conf" + logging.config.fileConfig( + loginipath, + defaults={"logfilename": str(log_file_path)}, + disable_existing_loggers=False, + ) + run_trf( + mod.args["genome_file"], + mod.args["output_dir"], + mod.args["num_threads"], + mod.args["trf_bin"], + mod.args["match_score"], + mod.args["mismatch_score"], + mod.args["delta"], + mod.args["pm"], + mod.args["pi"], + mod.args["minscore"], + mod.args["maxperiod"], + ) + + +if __name__ == "__main__": + main() +
+ +
+
+
+
+
+ +
+
+
+ + + + + \ No newline at end of file diff --git a/_modules/ensembl/tools/anno/simple_feature_annotation/cpg.html b/_modules/ensembl/tools/anno/simple_feature_annotation/cpg.html new file mode 100644 index 0000000..5e1855c --- /dev/null +++ b/_modules/ensembl/tools/anno/simple_feature_annotation/cpg.html @@ -0,0 +1,364 @@ + + + + + + + ensembl.tools.anno.simple_feature_annotation.cpg — ensembl-anno 0.1 documentation + + + + + + + + + + + +
+
+
+ +
+
+
+ +

Source code for ensembl.tools.anno.simple_feature_annotation.cpg

+# See the NOTICE file distributed with this work for additional information
+# regarding copyright ownership.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+"""
+Set of discriminant functions that can recognize structural and compositional features
+such as CpG islands, promoter regions and first splice-donor sites.
+Davuluri RV, Grosse I, Zhang MQ: Computational identification of promoters and
+first exons in the human genome. Nat Genet. 2001, 29(4):412-417. [PMID: 11726928]
+"""
+__all__ = ["run_cpg"]
+import logging
+import logging.config
+import multiprocessing
+from os import PathLike
+from pathlib import Path
+import re
+import subprocess
+from tempfile import TemporaryDirectory
+from typing import List,Union
+import argschema
+
+from ensembl.tools.anno.utils._utils import (
+    check_exe,
+    create_dir,
+    check_gtf_content,
+    get_seq_region_length,
+    get_slice_id,
+    slice_output_to_gtf,
+    get_sequence,
+)
+
+logger = logging.getLogger(__name__)
+
+
+
[docs]def run_cpg( + genome_file: PathLike, + output_dir: Path, + cpg_bin: Path = Path("cpg_lh"), + cpg_min_length: int = 400, + cpg_min_gc_content: int = 50, + cpg_min_oe: float = 0.6, + num_threads: int = 1, +) -> None: + """ + Run CpG islands on genomic slices + + :param genome_file : Genome file path. + :type genome_file: PathLike + :param output_dir : Working directory path + :type output_dir : Path + :param cpg_bin : CpG software path. + :param cpg_min_length : Min length of CpG islands + :param cpg_min_gc_content : Min GC frequency percentage + :param cpg_min_oe : Min ratio of the observed to expected number of CpG (CpGo/e) + :param num_threads: int, number of threads. + + :return: None + :rtype: None + """ + + check_exe(cpg_bin) + cpg_dir = create_dir(output_dir, "cpg_output") + output_file = cpg_dir / "annotation.gtf" + if output_file.exists(): + transcript_count = check_gtf_content(output_file, "simple_feature") + if transcript_count > 0: + logger.info("Cpg gtf file exists") + return + logger.info("Creating list of genomic slices") + seq_region_to_length = get_seq_region_length(genome_file, 5000) + slice_ids_per_region = get_slice_id( + seq_region_to_length, slice_size=1000000, overlap=0, min_length=5000 + ) + logger.info("Running CpG") + pool = multiprocessing.Pool(int(num_threads)) # pylint:disable=consider-using-with + for slice_id in slice_ids_per_region: + pool.apply_async( + _multiprocess_cpg, + args=( + cpg_bin, + slice_id, + genome_file, + cpg_dir, + cpg_min_length, + cpg_min_gc_content, + cpg_min_oe, + ), + ) + + pool.close() + pool.join() + slice_output_to_gtf(cpg_dir, "feature_id", "cpg", True, ".cpg.gtf") + for gtf_file in cpg_dir.glob("*.cpg.gtf"): + gtf_file.unlink()
+ + +def _multiprocess_cpg( + cpg_bin: Path, + slice_id: List[str], + genome_file: Path, + cpg_dir: Path, + cpg_min_length: int = 400, + cpg_min_gc_content: int = 50, + cpg_min_oe: float = 0.6, +) -> None: + """ + Annotation of CpG islands on multiprocess on genomic slices + Args: + cpg_bin: CpG software path. + slice_id: Slice id to run CpG on. + genome_file : Genome file. + cpg_dir : Output dir. + cpg_min_length : Min length of CpG islands + cpg_min_gc_content : Min GC frequency percentage + cpg_min_oe : Min ratio of the observed to expected number of CpG (CpGo/e) + """ + region_name, start, end = slice_id + logger.info( + "Processing slice to find CpG islands with cpg_lh: %s:%s:%s", + region_name, + start, + end, + ) + seq = get_sequence(region_name, int(start), int(end), 1, genome_file, cpg_dir) + slice_name = f"{region_name}.rs{start}.re{end}" + #with TemporaryDirectory(dir=cpg_dir) as tmpdirname: + slice_file = cpg_dir / f"{slice_name}.fa" + with open(slice_file, "w+", encoding="utf8") as region_out: + region_out.write(f">{region_name}\n{seq}\n") + region_results = cpg_dir / f"{slice_file}.cpg.gtf" + output_file = Path(f"{slice_file}.cpg") + cpg_cmd = [str(cpg_bin), str(slice_file)] + with open(output_file, "w+", encoding="utf8") as cpg_out: + subprocess.run(cpg_cmd, stdout=cpg_out, check=True) + _create_cpg_gtf( + output_file, + region_results, + region_name, + cpg_min_length, + cpg_min_gc_content, + cpg_min_oe, + ) + slice_file.unlink() + output_file.unlink() + + +def _create_cpg_gtf( + output_file: Path, + region_results: Path, + region_name: str, + cpg_min_length: int = 400, + cpg_min_gc_content: int = 50, + cpg_min_oe: float = 0.6, +) -> None: + """ + Read the fasta file and save the content in gtf format + All the genomic slices are collected in a single gtf output + Args: + output_file : GTF file with final results. + region_results : GTF file with the results per region. + region_name :Coordinates of genomic slice. + cpg_dir : Output dir. + cpg_min_length : Min length of CpG islands + cpg_min_gc_content : Min GC frequency percentage + cpg_min_oe : Min ratio of the observed to expected number of CpG (CpGo/e) + """ + with open(output_file, "r", encoding="utf8") as cpg_in, open(region_results, "w+", encoding="utf8") as cpg_out: + feature_count = 1 + for line in cpg_in: + result_match = re.search(r"^" + region_name, line) + if result_match: + results = line.split() + start = int(results[1]) + end = int(results[2]) + length = end - start + 1 + score = float(results[3]) + gc_content = float(results[6]) + oe_score_str = results[7] + oe_score: Union[float, int] + if oe_score_str in ("-", "inf"): + oe_score=0 + else: + oe_score=float(oe_score_str) + if ( + int(length) >= int(cpg_min_length) + and gc_content >= int(cpg_min_gc_content) + and oe_score >= float(cpg_min_oe) + ): + gtf_line = ( + f"{region_name}\tCpG\tsimple_feature\t{start}\t" + f'{end}\t.\t+\t.\tfeature_id "{feature_count}"; score "{score}";\n' + ) + cpg_out.write(gtf_line) + + +class InputSchema(argschema.ArgSchema): + """Input arguments expected to run CpG software.""" + + genome_file = argschema.fields.InputFile( + required=True, description="Genome file path" + ) + output_dir = argschema.fields.OutputDir( + required=True, description="Output directory path" + ) + cpg_bin = argschema.fields.String( + required=False, + default="cpg_lh", + description="CpG executable path", + ) + cpg_min_length = argschema.fields.Integer( + required=False, + default="400", + description="Min length of CpG islands", + ) + cpg_min_gc_content = argschema.fields.Integer( + required=False, + default="50", + description="Min GC frequency percentage", + ) + cpg_min_oe = argschema.fields.Float( + required=False, + default="0.6", + description="Min ratio of the observed to expected number of CpG (CpGo/e)", + ) + num_threads = argschema.fields.Integer( + required=False, default=1, description="Number of threads" + ) + + +def main() -> None: + """CpG's entry-point.""" + mod = argschema.ArgSchemaParser(schema_type=InputSchema) + log_file_path = create_dir(mod.args["output_dir"], "log") / "cpg.log" + loginipath = Path(__file__).parents[6] / "conf" / "logging.conf" + logging.config.fileConfig( + loginipath, + defaults={"logfilename": str(log_file_path)}, + disable_existing_loggers=False, + ) + run_cpg( + mod.args["genome_file"], + mod.args["output_dir"], + mod.args["cpg_bin"], + mod.args["cpg_min_length"], + mod.args["cpg_min_gc_content"], + mod.args["cpg_min_oe"], + mod.args["num_threads"], + ) +
+ +
+
+
+
+
+ +
+
+
+ + + + + \ No newline at end of file diff --git a/_modules/ensembl/tools/anno/simple_feature_annotation/eponine.html b/_modules/ensembl/tools/anno/simple_feature_annotation/eponine.html new file mode 100644 index 0000000..75e48d5 --- /dev/null +++ b/_modules/ensembl/tools/anno/simple_feature_annotation/eponine.html @@ -0,0 +1,344 @@ + + + + + + + ensembl.tools.anno.simple_feature_annotation.eponine — ensembl-anno 0.1 documentation + + + + + + + + + + + +
+
+
+ +
+
+
+ +

Source code for ensembl.tools.anno.simple_feature_annotation.eponine

+# See the NOTICE file distributed with this work for additional information
+# regarding copyright ownership.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+"""
+Eponine is a probabilistic method for detecting transcription start sites (TSS)
+in mammalian genomic sequence, with good specificity and excellent positional accuracy.
+Down TA, Hubbard TJ. Computational detection and location of transcription start sites
+in mammalian genomic DNA. Genome Res. 2002 Mar;12(3):458-61. doi: 10.1101/gr.216102.
+PMID: 11875034; PMCID: PMC155284.
+"""
+__all__ = ["run_eponine"]
+
+import logging
+import logging.config
+import multiprocessing
+import os
+from os import PathLike
+from pathlib import Path
+import re
+import subprocess
+from tempfile import TemporaryDirectory
+from typing import List
+import argschema
+
+from ensembl.tools.anno.utils._utils import (
+    check_exe,
+    check_file,
+    create_dir,
+    check_gtf_content,
+    get_sequence,
+    get_seq_region_length,
+    get_slice_id,
+    slice_output_to_gtf,
+)
+
+logger = logging.getLogger("__name__")
+
+
+
[docs]def run_eponine( + genome_file: PathLike, + output_dir: Path, + num_threads: int = 1, + java_bin: Path = Path("java"), + eponine_bin: Path = Path( + "/hps/software/users/ensembl/ensw/C8-MAR21-sandybridge/linuxbrew/opt/eponine/libexec/eponine-scan.jar" + ), + eponine_threshold: float = 0.999, +) -> None: + """ + Run Eponine on genomic slices + Args: + genome_file : Genome file path. + output_dir : Working directory path. + java_bin : Java path. + eponine_bin : Eponine software path + num_threads: Number of threads. + """ + check_file(eponine_bin) + check_exe(java_bin) + eponine_dir = create_dir(output_dir, "eponine_output") + # os.chdir(str(eponine_dir)) + output_file = eponine_dir / "annotation.gtf" + if output_file.exists(): + transcript_count = check_gtf_content(output_file, "simple_feature") + if transcript_count > 0: + logger.info("Eponine gtf file exists, skipping analysis") + return + logger.info("Creating list of genomic slices") + seq_region_to_length = get_seq_region_length(genome_file, 5000) + slice_ids_per_region = get_slice_id( + seq_region_to_length, slice_size=1000000, overlap=0, min_length=5000 + ) + + eponine_cmd = [ + str(java_bin), + "-jar", + str(eponine_bin), + "-threshold", + str(eponine_threshold), + "-seq", + ] + logger.info("Running Eponine") + pool = multiprocessing.Pool(int(num_threads)) # pylint:disable=consider-using-with + for slice_id in slice_ids_per_region: + pool.apply_async( + _multiprocess_eponine, + args=( + eponine_cmd, + slice_id, + eponine_dir, + Path(genome_file), + ), + ) + pool.close() + pool.join() + slice_output_to_gtf(eponine_dir, "feature_id", "eponine", True, ".epo.gtf") + for gtf_file in eponine_dir.glob("*.epo.gtf"): + gtf_file.unlink()
+ + +def _multiprocess_eponine( + eponine_cmd: List[str], + slice_id: List[str], + eponine_dir: Path, + genome_file: Path, +) -> None: + """ + Run Eponine on multiprocess on genomic slices + Args: + eponine_cmd: Eponine command to execute. + slice_id: List of slice IDs. + eponine_dir : Eponine output directory path. + genome_file : Genome file. + """ + region_name, start, end = slice_id + logger.info( + "Processing slice to find transcription start sites with Eponine: %s:%s:%s", + region_name, + start, + end, + ) + seq = get_sequence(region_name, int(start), int(end), 1, genome_file, eponine_dir) + slice_name = f"{region_name}.rs{start}.re{end}" + #with tempfile.TemporaryDirectory(dir=eponine_dir) as tmpdirname: + slice_file = eponine_dir / f"{slice_name}.fa" + with open(slice_file, "w+", encoding="utf8") as region_out: + region_out.write(f">{region_name}\n{seq}\n") + region_results = eponine_dir / f"{slice_name}.epo.gtf" + output_file = Path(f"{slice_file}.epo") + eponine_cmd = eponine_cmd.copy() + eponine_cmd.append(str(slice_file)) + logging.info(eponine_cmd) + with open(output_file, "w+", encoding="utf8") as eponine_out: + subprocess.run(eponine_cmd, stdout=eponine_out, check=True) + _create_eponine_gtf(output_file, region_results, region_name) + slice_file.unlink() + output_file.unlink() + + +def _create_eponine_gtf( + output_file: Path, + region_results: Path, + region_name: str, +) -> None: + """ + Read the fasta file and save the content in gtf format + All the genomic slices are collected in a single gtf output + Args: + output_file: GTF file with final results. + region_results: GTF file with the results per region. + region_name: Coordinates of genomic slice. + """ + with open(output_file, "r", encoding="utf8") as eponine_in, open( + region_results, "w+", encoding="utf8" + ) as eponine_out: + feature_count = 1 + for line in eponine_in: + result_match = re.search(r"^" + region_name, line) + if result_match: + results = line.split() + start = int(results[3]) + end = int(results[4]) + score = float(results[5]) + strand = results[6] + logging.info(results) + # There's a one base offset on the reverse strand + if strand == "-": + start -= 1 + end -= 1 + + gtf_line = ( + f"{region_name}\tEponine\tsimple_feature\t" + f"{start}\t{end}\t.\t{strand}\t.\t" + f'feature_id "{feature_count}"; score "{score}";\n' + ) + eponine_out.write(gtf_line) + feature_count += 1 + + +class InputSchema(argschema.ArgSchema): + """Input arguments expected to run Eponine.""" + + genome_file = argschema.fields.InputFile( + required=True, description="Genome file path" + ) + output_dir = argschema.fields.OutputDir( + required=True, description="Output directory path" + ) + num_threads = argschema.fields.Integer( + required=False, default=1, description="Number of threads" + ) + java_bin = argschema.fields.String( + required=False, + default="java", + description="Java executable path", + ) + eponine_bin = argschema.fields.String( + required=False, + default="/hps/software/users/ensembl/ensw/C8-MAR21-sandybridge/linuxbrew/opt/eponine/libexec/eponine-scan.jar", # pylint:disable=line-too-long + description="Java executable path", + ) + eponine_threashold = argschema.fields.Float( + required=False, default=0.999, description="Eponine threashold" + ) + + +def main() -> None: + """Eponine's entry-point.""" + mod = argschema.ArgSchemaParser(schema_type=InputSchema) + log_file_path = create_dir(mod.args["output_dir"], "log") / "eponine.log" + loginipath = Path(__file__).parents[6] / "conf" / "logging.conf" + logging.config.fileConfig( + loginipath, + defaults={"logfilename": str(log_file_path)}, + disable_existing_loggers=False, + ) + run_eponine( + mod.args["genome_file"], + mod.args["output_dir"], + mod.args["num_threads"], + Path(mod.args["java_bin"]), + Path(mod.args["eponine_bin"]), + mod.args["eponine_threashold"], + ) + + +if __name__ == "__main__": + main() +
+ +
+
+
+
+
+ +
+
+
+ + + + + \ No newline at end of file diff --git a/_modules/ensembl/tools/anno/snc_rna_annotation/trnascan.html b/_modules/ensembl/tools/anno/snc_rna_annotation/trnascan.html new file mode 100644 index 0000000..bd2aa96 --- /dev/null +++ b/_modules/ensembl/tools/anno/snc_rna_annotation/trnascan.html @@ -0,0 +1,398 @@ + + + + + + + ensembl.tools.anno.snc_rna_annotation.trnascan — ensembl-anno 0.1 documentation + + + + + + + + + + + +
+
+
+ +
+
+
+ +

Source code for ensembl.tools.anno.snc_rna_annotation.trnascan

+# See the NOTICE file distributed with this work for additional information
+# regarding copyright ownership.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+"""
+tRNAscan-SE identifies 99-100% of transfer RNA genes in DNA sequence while
+giving less than one false positive per 15 gigabases.
+Lowe TM, Eddy SR: tRNAscan-SE: a program for improved detection of transfer
+RNA genes in genomic sequence.
+Nucleic Acids Res. 1997, 25(5):955-64. [PMID: 9023104]
+"""
+__all__ = ["run_trnascan"]
+
+import logging
+import logging.config
+import multiprocessing
+from os import PathLike
+from pathlib import Path
+import re
+import subprocess
+from typing import List
+import argschema
+
+from ensembl.tools.anno.utils._utils import (
+    check_exe,
+    check_file,
+    create_dir,
+    check_gtf_content,
+    get_seq_region_length,
+    get_slice_id,
+    slice_output_to_gtf,
+    get_sequence,
+)
+
+logger = logging.getLogger(__name__)
+
+
+
[docs]def run_trnascan( + genome_file: PathLike, + output_dir: Path, + trnascan_bin: Path = Path("tRNAscan-SE"), + trnascan_filter: Path = Path("EukHighConfidenceFilter"), + num_threads: int = 1, +) -> None: + """ + Executes tRNAscan-SE on genomic slices + Args: + genome_file : Genome file path. + trnascan_bin : tRNAscan-SE software path. + trnascan_filter : tRNAscan-SE filter set path. + output_dir : working directory path. + num_threads: int, number of threads. + """ + check_exe(trnascan_bin) + check_file(trnascan_filter) + trnascan_dir = create_dir(output_dir, "trnascan_output") + output_file = trnascan_dir / "annotation.gtf" + if output_file.exists(): + transcript_count = check_gtf_content(output_file, "transcript") + if transcript_count > 0: + logger.info("Trnascan gtf file exists, skipping analysis") + return + logger.info("Creating list of genomic slices") + seq_region_to_length = get_seq_region_length(genome_file, 5000) + slice_ids_per_region = get_slice_id(seq_region_to_length, 1000000, 0, 5000) + trnascan_cmd = [ + str(trnascan_bin), + None, + "-o", + None, + "-f", + None, + "-H", # show both primary and secondary structure components to covariance model bit scores + "-q", # quiet mode + "--detail", + "-Q", + ] + logger.info("Running tRNAscan-SE") + pool = multiprocessing.Pool(num_threads) # pylint: disable=consider-using-with + for slice_id in slice_ids_per_region: + pool.apply_async( + _multiprocess_trnascan, + args=( + trnascan_cmd, + slice_id, + genome_file, + trnascan_filter, + trnascan_dir, + ), + ) + + pool.close() + pool.join() + slice_output_to_gtf( + output_dir=trnascan_dir, unique_ids=True, file_extension=".trna.gtf" + ) + for gtf_file in trnascan_dir.glob("*.trna.gtf"): + gtf_file.unlink()
+ + +def _multiprocess_trnascan( + trnascan_cmd: List[str], + slice_id: List[str], + genome_file: Path, + trnascan_filter: Path, + trnascan_dir: Path, +) -> None: + """ + Run tRNAscan-SE on multiprocess on genomic slices + Args: + trnascan_cmd: tRNAscan-SE command to execute. + slice_id: Slice Id to run tRNAscan-SE on. + genome_file : Genome file. + trnascan_dir : tRNAscan-SE output dir. + trnascan_filter: tRNAscan-SE filter set. + """ + region_name, start, end = slice_id + logger.info( + "Processing slice to find tRNAs using tRNAscan-SE:%s:%s:%s", + region_name, + start, + end, + ) + seq = get_sequence(region_name, int(start), int(end), 1, genome_file, trnascan_dir) + slice_name = f"{region_name}.rs{start}.re{end}" + slice_file = trnascan_dir / f"{slice_name}.fa" + with open(slice_file, "w+", encoding="utf8") as region_out: + region_out.write(f">{region_name}\n{seq}\n") + # trnscan output + region_results = trnascan_dir / f"{slice_name}.trna.gtf" + output_file = Path(f"{slice_file}.trna") + ss_output_file = Path(f"{output_file}.ss") + # filtering + filter_prefix_file = f"{slice_name}.filt" + filter_output_file = trnascan_dir / f"{filter_prefix_file}.out" + filter_log_file = trnascan_dir / f"{filter_prefix_file}.log" + filter_ss_file = trnascan_dir / f"{filter_prefix_file}.ss" + # trnascan_cmd = generic_trnascan_cmd.copy() + trnascan_cmd[1], trnascan_cmd[3], trnascan_cmd[5] = ( + str(slice_file), + str(output_file), + str(ss_output_file), + ) + logger.info("tRNAscan-SE command: %s", " ".join(trnascan_cmd)) + subprocess.run(trnascan_cmd, check=True) + # If the trnascan output is empty there is no need to go on with filtering + if output_file.stat().st_size == 0: + output_file.unlink() + slice_file.unlink() + ss_output_file.unlink(missing_ok=True) + return + + filter_cmd = [ + str(trnascan_filter), + "--result", # tRNAscan-SE output file used as input + str(output_file), + "--ss", # tRNAscan-SE secondary structure file used as input + str(ss_output_file), + "--output", + str(trnascan_dir), + "--prefix", + str(filter_prefix_file), + ] + logger.info( + "tRNAscan-SE filter command: %s", " ".join(str(item) for item in filter_cmd) + ) + subprocess.run(filter_cmd)#pylint:disable=subprocess-run-check + _create_trnascan_gtf(region_results, filter_output_file, region_name) + output_file.unlink(missing_ok=True) + slice_file.unlink(missing_ok=True) + ss_output_file.unlink(missing_ok=True) + Path(filter_prefix_file).unlink(missing_ok=True) + filter_log_file.unlink(missing_ok=True) + filter_ss_file.unlink(missing_ok=True) + filter_output_file.unlink(missing_ok=True) + + +def _create_trnascan_gtf( + region_results: Path, filter_output_file: Path, region_name: str +) -> None: + """ + Read the fasta file and save the content in gtf format + All the genomic slices are collected in a single gtf output + Args: + region_results : GTF file with the results per region. + filter_file : GTF file with the filtered results per region. + region_name :Coordinates of genomic slice. + + tRNAscan-SE output format: + col0: GtRNAdb Gene Symbol - gene ID in corresponding genome + col1: tRNAscan-SE ID - tRNA ID in tRNAscan-SE prediction results + col2-3: Locus - Genomic coordinates of predicted gene + col4: Isotype (from Anticodon) - tRNA isotype determined by anticodon + col5: Anticodon - anticodon of predicted tRNA gene + col6-7: Intron boundaries + col8: General tRNA Model Score - covariance model bit score from tRNAscan-SE results + col9: Best Isotype Model - best matching (highest scoring) isotype determined + by isotype-specific covariance model classification + col10-11-12: Anticodon and Isotype Model Agreement - consistency between anticodon + from predicted gene sequence and best isotype model + col13: Features - special gene features that may include gene set categorization, + number of introns, possible pseudogenes, possible truncation, or base-pair mismatches + """ + with open(filter_output_file, "r", encoding="utf8") as trna_in, open( + region_results, "w+", encoding="utf8" + ) as trna_out: + gene_counter = 1 + for line in trna_in: + result_match = re.search(r"^" + region_name, line) + if result_match: + results = line.split() + start = int(results[2]) + end = int(results[3]) + strand = "+" + if start > end: + strand = "-" + start, end = end, start + biotype = ( + "tRNA" + if re.search(r"high confidence set", line) + else "tRNA_pseudogene" + ) + transcript_string = ( + f"{region_name}\ttRNAscan\ttranscript\t{start}\t{end}\t.\t" + f'{strand}\t.\tgene_id "{gene_counter}"; transcript_id ' + f'"{gene_counter}"; biotype "{biotype}";\n' + ) + exon_string = ( + f"{region_name}\ttRNAscan\texon\t{start}\t{end}\t.\t" + f'{strand}\t.\tgene_id "{gene_counter}"; transcript_id ' + f'"{gene_counter}"; exon_number "1"; biotype "{biotype}";\n' + ) + trna_out.write(transcript_string) + trna_out.write(exon_string) + trna_out.flush() + gene_counter += 1 + + +class InputSchema(argschema.ArgSchema): + """Input arguments expected to run tRNAscan-SE.""" + + genome_file = argschema.fields.InputFile( + required=True, description="Genome file path" + ) + trnascan_bin = argschema.fields.String( + required=False, + default="tRNAscan-SE", + description="tRNAscan-SE executable path", + ) + trnascan_filter = argschema.fields.String( + required=False, + default="/hps/software/users/ensembl/ensw/C8-MAR21-sandybridge/linuxbrew/bin/EukHighConfidenceFilter", + description="tRNAscan-SE filter path", + ) + output_dir = argschema.fields.OutputDir( + required=True, description="Output directory path" + ) + num_threads = argschema.fields.Integer( + required=False, default=1, description="Number of threads" + ) + + +def main() -> None: + """tRNAscan-SE's entry-point.""" + mod = argschema.ArgSchemaParser(schema_type=InputSchema) + log_file_path = create_dir(mod.args["output_dir"], "log") / "trnascan.log" + loginipath = Path(__file__).parents[6] / "conf" / "logging.conf" + logging.config.fileConfig( + loginipath, + defaults={"logfilename": str(log_file_path)}, + disable_existing_loggers=False, + ) + run_trnascan( + mod.args["genome_file"], + mod.args["output_dir"], + mod.args["trnascan_bin"], + Path(mod.args["trnascan_filter"]), + mod.args["num_threads"], + ) + + +if __name__ == "__main__": + main() +
+ +
+
+
+
+
+ +
+
+
+ + + + + \ No newline at end of file diff --git a/_modules/ensembl/tools/anno/transcriptomic_annotation/minimap.html b/_modules/ensembl/tools/anno/transcriptomic_annotation/minimap.html new file mode 100644 index 0000000..3cecdfe --- /dev/null +++ b/_modules/ensembl/tools/anno/transcriptomic_annotation/minimap.html @@ -0,0 +1,361 @@ + + + + + + + ensembl.tools.anno.transcriptomic_annotation.minimap — ensembl-anno 0.1 documentation + + + + + + + + + + + +
+
+
+ +
+
+
+ +

Source code for ensembl.tools.anno.transcriptomic_annotation.minimap

+# See the NOTICE file distributed with this work for additional information
+# regarding copyright ownership.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""
+Minimap2 is a pairwise sequence alignment algorithm designed for efficiently comparing nucleotide sequences.
+The algorithm uses a versatile indexing strategy to quickly find approximate matches between sequences, 
+allowing it to efficiently align long sequences against reference genomes or other sequences.
+
+Li, H. (2018). Minimap2: pairwise alignment for nucleotide sequences. Bioinformatics, 34(18), 3094-3100.
+"""
+
+__all__ = ["run_minimap2"]
+import logging
+import logging.config
+from pathlib import Path
+import subprocess
+from typing import List
+import argschema
+
+
+from ensembl.tools.anno.utils._utils import (
+    check_exe,
+    create_dir,
+    check_gtf_content,
+)
+
+
+
[docs]def run_minimap2( + output_dir: Path, + long_read_fastq_dir: Path, + genome_file: Path, + minimap2_bin: Path = Path("minimap2"), + paftools_bin: Path = Path("paftools.js"), + max_intron_length: int = 100000, + num_threads: int = 1, +) -> None: + """ + Run Minimap2 to align long read data against genome file. + Default Minimap set for PacBio data. + Args: + output_dir : Working directory path. + long_read_fastq_dir : Long read directory path. + genome_file : Genome file path. + minimap2_bin : Software path. + paftools_bin : Software path. + max_intron_length : The maximum intron size for alignments. Defaults to 100000. + num_threads : Number of available threads. + """ + check_exe(minimap2_bin) + check_exe(paftools_bin) + minimap2_dir = create_dir(output_dir, "minimap2_output") + + logging.info("Skip analysis if the gtf file already exists") + output_file = minimap2_dir / "annotation.gtf" + if output_file.exists(): + transcript_count = check_gtf_content(output_file, "transcript") + if transcript_count > 0: + logging.info("Minimap2 gtf file exists, skipping analysis") + return + minimap2_index_file = minimap2_dir / f"{genome_file.name}.mmi" + # minimap2_hints_file = minimap2_dir /"minimap2_hints.gff" + file_types = ("*.fastq", "*.fq") + fastq_file_list = [ + path for file_type in file_types for path in Path(long_read_fastq_dir).rglob(file_type) + ] + if len(fastq_file_list) == 0: + raise IndexError(f"The list of fastq files is empty. Fastq dir:\n{long_read_fastq_dir}") + + if not minimap2_index_file.exists(): + logging.info("Did not find an index file for minimap2. Will create now") + try: + subprocess.run( # pylint:disable=subprocess-run-check + [ + minimap2_bin, + "-t", + str(num_threads), + "-d", + str(minimap2_index_file), + genome_file, + ] + ) + except subprocess.CalledProcessError as e: + logging.error("An error occurred while creating minimap2 index: %s", e) + except OSError as e: + logging.error("An OS error occurred: %s", e) + + logging.info("Running minimap2 on the files in the long read fastq dir") + for fastq_file in fastq_file_list: + sam_file = minimap2_dir / f"{fastq_file.name}.sam" + bed_file = minimap2_dir / f"{fastq_file.name}.bed" + logging.info("Processing %s", fastq_file) + with open(bed_file, "w+", encoding="utf8") as bed_file_out: + subprocess.run( # pylint:disable=subprocess-run-check + [ + minimap2_bin, + "-G", + str(max_intron_length), + "-t", + str(num_threads), + "--cs", + "--secondary=no", + "-ax", + "splice", + "-u", + "b", + minimap2_index_file, + fastq_file, + "-o", + sam_file, + ] + ) + logging.info("Creating bed file from SAM") + subprocess.run( + [paftools_bin, "splice2bed", sam_file], stdout=bed_file_out + ) # pylint:disable=subprocess-run-check + + bed_to_gtf(minimap2_dir) + + logging.info("Completed running minimap2")
+ + +def bed_to_gtf(output_dir: Path) -> None: + """ + Convert bed file into gtf file + Args: + output_dir : Working directory path. + """ + gtf_file_path = output_dir / "annotation.gtf" + with open(gtf_file_path, "w+", encoding="utf8") as gtf_out: + gene_id = 1 + for bed_file in output_dir.glob("*.bed"): + logging.info("Converting bed to GTF: %s", str(bed_file)) + with open(bed_file, "r", encoding="utf8") as bed_in: + for line in bed_in: + elements = line.rstrip().split("\t") + seq_region_name = elements[0] + offset = int(elements[1]) + strand = elements[5] + # sizes of individual block of exons + block_sizes = [size for size in elements[10].split(",") if size] + block_starts = [size for size in elements[11].split(",") if size] + exons = bed_block_to_exons(block_sizes, block_starts, offset) + transcript_start = None + transcript_end = None + exon_records = [] + for i, exon_coords in enumerate(exons): + if transcript_start is None or exon_coords[0] < transcript_start: + transcript_start = exon_coords[0] + + if transcript_end is None or exon_coords[1] > transcript_end: + transcript_end = exon_coords[1] + + exon_line = ( + f"{seq_region_name}\tminimap\texon\t{exon_coords[0]}\t" + f"{exon_coords[1]}\t.\t{strand}\t.\t" + f'gene_id "minimap_{gene_id}"; transcript_id "minimap_{gene_id}"; ' + f'exon_number "{i+ 1}";\n' + ) + exon_records.append(exon_line) + transcript_line = ( + f"{seq_region_name}\tminimap\ttranscript\t{transcript_start}\t" + f"{transcript_end}\t.\t{strand}\t.\t" + f'gene_id "minimap_{gene_id}"; transcript_id "minimap_{gene_id}"\n' + ) + gtf_out.write(transcript_line) + for exon_line in exon_records: + gtf_out.write(exon_line) + gene_id += 1 + + +def bed_block_to_exons(block_sizes: List, block_starts: List, offset: int) -> List: + """ + Extract exon size and start from exon feature block + Args: + block_sizes : Block feature size. + block_starts : Block feature starts. + offset : Feature offset. + + Returns: + List of exon coordinates + """ + exons = [] + for i, _ in enumerate(block_sizes): + block_start = offset + int(block_starts[i]) + 1 + block_end = block_start + int(block_sizes[i]) - 1 + if block_end < block_start: + logging.warning("Warning: block end is less than block start, skipping exon") + continue + exon_coords = [str(block_start), str(block_end)] + exons.append(exon_coords) + return exons + + +class InputSchema(argschema.ArgSchema): + """Input arguments expected to run Minimap2 software.""" + + output_dir = argschema.fields.OutputDir(required=True, description="Output directory path") + long_read_fastq_dir = argschema.fields.String( + required=True, + description="Long read directory path", + ) + genome_file = argschema.fields.InputFile(required=True, description="Genome file path") + minimap2_bin = argschema.fields.String( + required=False, + default="minimap2", + description="Minimap2 software path", + ) + paftools_bin = argschema.fields.String( + required=False, + default="paftools.js", + description="Paftools software path", + ) + max_intron_length = argschema.fields.Integer( + required=False, + default="100000", + description="The maximum intron length.", + ) + max_intron_length = argschema.fields.Integer( + required=False, + default="100000", + description="The maximum intron size for alignments.", + ) + num_threads = argschema.fields.Integer(required=False, default=1, description="Number of threads") + + +def main() -> None: + """Minimap2's entry-point.""" + mod = argschema.ArgSchemaParser(schema_type=InputSchema) + log_file_path = create_dir(mod.args["output_dir"], "log") / "minimap.log" + loginipath = Path(__file__).parents[6] / "conf" / "logging.conf" + logging.config.fileConfig( + loginipath, + defaults={"logfilename": str(log_file_path)}, + disable_existing_loggers=False, + ) + run_minimap2( + mod.args["output_dir"], + mod.args["long_read_fastq_dir"], + mod.args["genome_file"], + mod.args["minimap2_bin"], + mod.args["paftools_bin"], + mod.args["max_intron_length"], + mod.args["num_threads"], + ) +
+ +
+
+
+
+
+ +
+
+
+ + + + + \ No newline at end of file diff --git a/_modules/ensembl/tools/anno/transcriptomic_annotation/scallop.html b/_modules/ensembl/tools/anno/transcriptomic_annotation/scallop.html new file mode 100644 index 0000000..0dec6ff --- /dev/null +++ b/_modules/ensembl/tools/anno/transcriptomic_annotation/scallop.html @@ -0,0 +1,301 @@ + + + + + + + ensembl.tools.anno.transcriptomic_annotation.scallop — ensembl-anno 0.1 documentation + + + + + + + + + + + +
+
+
+ +
+
+
+ +

Source code for ensembl.tools.anno.transcriptomic_annotation.scallop

+# See the NOTICE file distributed with this work for additional information
+# regarding copyright ownership.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""
+Scallop is a high-performance tool designed for the accurate and efficient quantification 
+of transcriptome assembly. 
+It's capable of handling large-scale transcriptomic data while providing precise estimates 
+of transcript abundances.
+Scallop's algorithmic approach allows it to efficiently reconstruct transcript structures 
+and quantify their expression levels, making it a valuable resource for studying gene 
+expression and transcriptome analysis.
+
+Shao M, Kingsford C. Accurate assembly of transcripts through phase-preserving graph 
+decomposition. Nat Biotechnol.
+2017 Dec;35(12):1167-1169. doi: 10.1038/nbt.4020. Epub 2017 Nov 13. PMID: 29131147; PMCID: PMC5722698.
+"""
+
+__all__ = ["run_scallop"]
+import logging
+import logging.config
+from pathlib import Path
+import re
+import subprocess
+import argschema
+
+from ensembl.tools.anno.utils._utils import (
+    check_exe,
+    create_dir,
+    check_gtf_content,
+)
+
+
+
[docs]def run_scallop( + output_dir: Path, + scallop_bin: Path = Path("scallop"), + prlimit_bin: Path = Path("prlimit"), + stringtie_bin: Path = Path("stringtie"), + memory_limit: int = 40 * 1024**3, +) -> None: + """ + Run Scallop assembler on short read data after STAR alignment. + + Args: + output_dir : Working directory path. + scallop_bin : Software path. + prlimit_bin : Software path. + stringtie_bin : Software path. + memory_limit : Memory limit Scallop command Defaults to 40*1024**3. + """ + check_exe(scallop_bin) + check_exe(stringtie_bin) + scallop_dir = create_dir(output_dir, "scallop_output") + logging.info("Skip analysis if the gtf file already exists") + output_file = scallop_dir / "annotation.gtf" + if output_file.exists(): + transcript_count = check_gtf_content(output_file, "transcript") + if transcript_count > 0: + logging.info("Scallop gtf file exists, skipping analysis") + return + + star_dir = output_dir / "star_output" + + if star_dir.exists() and len(list(star_dir.glob("*.bam"))) != 0: + for sorted_bam_file in star_dir.glob("*.bam"): + transcript_file_name = re.sub(".bam", ".scallop.gtf", sorted_bam_file.name) + transcript_file = scallop_dir / transcript_file_name + if transcript_file.exists(): + logging.info( + "Found an existing stringtie gtf file, will not overwrite. \ + File found: %s", + transcript_file, + ) + else: + logging.info("Running Scallop on: %s", sorted_bam_file.name) + try: + scallop_cmd = [ + scallop_bin, + "-i", + sorted_bam_file, + "-o", + transcript_file, + "--min_flank_length", + "10", + ] + if memory_limit is not None: + scallop_cmd = prlimit_command(prlimit_bin, scallop_cmd, memory_limit) + subprocess.check_output(scallop_cmd, stderr=subprocess.STDOUT, universal_newlines=True) + # This combines the standard output and error streams into a single + # string and ensures that the output is in text mode + + except subprocess.CalledProcessError as ex: + logging.error("Error occurred while running Scallop:") + logging.error("Command: %s\n", " ".join(scallop_cmd)) + logging.error("Return code: %s\n", str(ex.returncode)) + logging.error("Output and error messages: %s\n", ex.output) + else: + raise IndexError(f"The list of sorted bam files is empty, Star output dir: {star_dir}") + + # Now need to merge + logging.info("Merge Scaalop's output.") + scallop_merge(scallop_dir, stringtie_bin)
+ + +def scallop_merge(scallop_dir: Path, stringtie_bin: Path = Path("stringtie")) -> None: + """ + Merge Scallop result in a single gtf file + + scallop_dir : Input directory's path. + stringtie_bin : Software path. + """ + scallop_input_to_file = scallop_dir / "scallop_assemblies.txt" + scallop_merge_output_file = scallop_dir / "annotation.gtf" + with open(scallop_input_to_file, "w+", encoding="utf8") as gtf_list_out: + for gtf_file in scallop_dir.glob("*.scallop.gtf"): + transcript_count = check_gtf_content(gtf_file, "transcript") + if transcript_count > 0: + gtf_list_out.write(gtf_file + "\n") + else: + logging.warning("Warning, skipping file with no transcripts. Path:%s\n", gtf_file) + + try: + subprocess.check_output( + [ + stringtie_bin, + "--merge", + "-o", + scallop_merge_output_file, + scallop_input_to_file, + ], + stderr=subprocess.STDOUT, + text=True, + ) + + except subprocess.CalledProcessError as e: + print("StringTie execution failed with an error:%s", e.output) + + +def prlimit_command(prlimit_bin, command_list, virtual_memory_limit) -> list: + """ + Prepend memory limiting arguments to a command list to be run with subprocess. + + This method uses the `prlimit` program to set the memory limit. + + The `virtual_memory_limit` size is in bytes. + + prlimit arguments: + -v, --as[=limits] + Address space limit. + """ + return [str(prlimit_bin), f"-v{virtual_memory_limit}"] + command_list + + +class InputSchema(argschema.ArgSchema): + """Input arguments expected to run StringTie software.""" + + output_dir = argschema.fields.OutputDir(required=True, description="Output directory path") + scallop_bin = argschema.fields.String( + required=False, + default="scallop", + description="Scallop software path", + ) + prlimit_bin = argschema.fields.String( + required=False, + default="prlimit", + description="Prlimit software path", + ) + memory_limit = argschema.fields.Integer( + required=False, default=40 * 1024**3, description="Memory's limit for Scallop command" + ) + + +def main() -> None: + """Scallop's entry-point. :no-index:""" + mod = argschema.ArgSchemaParser(schema_type=InputSchema) + log_file_path = create_dir(mod.args["output_dir"], "log") / "scallop.log" + loginipath = Path(__file__).parents[6] / "conf" / "logging.conf" + logging.config.fileConfig( + loginipath, + defaults={"logfilename": str(log_file_path)}, + disable_existing_loggers=False, + ) + run_scallop( + mod.args["output_dir"], mod.args["scallop_bin"], mod.args["prlimit_bin"], mod.args["memory_limit"] + ) +
+ +
+
+
+
+
+ +
+
+
+ + + + + \ No newline at end of file diff --git a/_modules/ensembl/tools/anno/transcriptomic_annotation/star.html b/_modules/ensembl/tools/anno/transcriptomic_annotation/star.html new file mode 100644 index 0000000..06def85 --- /dev/null +++ b/_modules/ensembl/tools/anno/transcriptomic_annotation/star.html @@ -0,0 +1,716 @@ + + + + + + + ensembl.tools.anno.transcriptomic_annotation.star — ensembl-anno 0.1 documentation + + + + + + + + + + + +
+
+
+ +
+
+
+ +

Source code for ensembl.tools.anno.transcriptomic_annotation.star

+# See the NOTICE file distributed with this work for additional information
+# regarding copyright ownership.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""
+The STAR (Spliced Transcripts Alignment to a Reference) alignment tool is widely used
+in genomics research for aligning RNA-seq data to a reference genome.
+Dobin A, Davis CA, Schlesinger F, et al. STAR: ultrafast universal RNA-seq aligner.
+Bioinformatics. 2013;29(1):15-21. doi:10.1093/bioinformatics/bts635
+"""
+
+__all__ = ["run_star", "subsample_transcriptomic_data"]
+import logging
+import logging.config
+import gzip
+import math
+import multiprocessing
+from pathlib import Path
+import random
+import re
+import shutil
+import subprocess
+from typing import List
+import argschema
+
+
+from ensembl.tools.anno.utils._utils import (
+    check_exe,
+    create_dir,
+    check_gtf_content,
+    get_seq_region_length,
+)
+
+
+
[docs]def run_star( + genome_file: Path, + output_dir: Path, + short_read_fastq_dir: Path, + delete_pre_trim_fastq: bool = False, + trim_fastq: bool = False, + max_reads_per_sample: int = 0, + max_intron_length: int = 100000, + num_threads: int = 1, + star_bin: Path = Path("star"), + samtools_bin: Path = Path("samtools"), + trim_galore_bin: Path = Path("trim_galore"), +) -> None: + """ + Run STAR alignment on list of short read data. + + Args: + genome_file : Genome file path. + output_dir : Working directory path. + short_read_fastq_dir : Short read directory path. + delete_pre_trim_fastq : Delete the original fastq files after trimming. Defaults to False. + trim_fastq : Trim short read files using TrimGalore. Defaults to False. + max_reads_per_sample : Max number of reads per sample. Defaults to 0 (unlimited). + max_intron_length : The maximum intron size for alignments. Defaults to 100000. + num_threads : Number of available threads. + star_bin : Software path. + samtools_bin : Software path. + trim_galore_bin : Software path. + + """ + check_exe(star_bin) + # If trimming has been enabled then switch the path for + # short_read_fastq_dir from the original location to the trimmed fastq dir + if trim_fastq: + run_trimming(output_dir, short_read_fastq_dir, delete_pre_trim_fastq, num_threads, trim_galore_bin) + short_read_fastq_dir = output_dir / "trim_galore_output" + + # if not os.path.exists(subsample_script_path): + #subsample_script_path = "subsample_fastq.py" + + star_dir = create_dir(output_dir, "star_output") + + for output_file in [ + output_dir / "stringtie_output/annotation.gtf", + output_dir / "scallop_output/annotation.gtf", + ]: + if output_file.exists(): + transcript_count = check_gtf_content(output_file, "transcript") # check a gtf + if transcript_count > 0: + logging.info("Transcriptomic alignment exists") + return + + star_index_file = star_dir / "SAindex" + fastq_file_list = [] + file_types = ("*.fastq", "*.fq", "*.fastq.gz", "*.fq.gz") + fastq_file_list = [ + path for file_type in file_types for path in Path(short_read_fastq_dir).rglob(file_type) + ] + if len(fastq_file_list) == 0: + raise IndexError(f"The list of fastq files is empty. Fastq dir:\n{short_read_fastq_dir}") + + + # for file_type in file_types: + # fastq_file_list.extend(glob.glob(os.path.join(short_read_fastq_dir, file_type))) + + # Get list of paired paths + fastq_file_list = _create_paired_paths(fastq_file_list) + # Subsamples in parallel if there's a value set + if max_reads_per_sample: + subsample_transcriptomic_data(fastq_file_list) + # Get the list of the new subsampled files + fastq_file_list = [ + path for file_type in file_types for path in Path(short_read_fastq_dir).rglob(file_type) + ] + # I don't think is needed + # fastq_file_list = check_for_fastq_subsamples(fastq_file_list) + + if not star_index_file.exists(): + logging.info("Did not find an index file for Star. Will create now") + seq_region_to_length = get_seq_region_length(genome_file, 0) + genome_size = sum(seq_region_to_length.values()) + # This calculates the base-2 logarithm of the genome_size. The logarithm of the genome size is + # a measure of how many bits are needed to represent the genome size in binary. + # + # The choice of 14 as the maximum value is likely based on empirical observations and optimization + # considerations. Too large of a seed length can lead to increased memory usage and potentially + # slower indexing, while a seed length that is too small might affect alignment accuracy. + index_bases = min(14, math.floor((math.log(genome_size, 2) / 2) - 1)) + try: + subprocess.run(#pylint:disable=subprocess-run-check + [ + str(star_bin), + "--runThreadN", + str(num_threads), + "--runMode", + "genomeGenerate", + "--outFileNamePrefix", + f"{star_dir}/", + "--genomeDir", + str(star_dir), + "--genomeSAindexNbases", + str(index_bases), + "--genomeFastaFiles", + str(genome_file), + ] + ) + except Exception as e: + logging.error("An error occurred while creating star index: %s", e) + + logging.info("Running Star on the files in the fastq dir") + for fastq_file in fastq_file_list: + # logger.info(fastq_file_path) + # fastq_file_name = os.path.basename(fastq_file_path) + star_tmp_dir = star_dir / "tmp" + if star_tmp_dir.exists(): + shutil.rmtree(star_tmp_dir) + sam_file = Path(f"{star_dir}/{fastq_file.name}.sam") + junctions_file = Path(f"{star_dir}/{fastq_file.name}.sj.tab") + sam_file_name = sam_file.name + sam_temp_file = Path(f"{star_dir}/{sam_file_name}.tmp") + bam_file = re.sub(".sam", ".bam", sam_file_name) + bam_sort_file = Path(f"{star_dir}/{bam_file}") + log_out_file = Path(f"{star_dir}/{fastq_file.name}.Log.final.out") + if log_out_file.exists() and bam_sort_file.exists() and bam_sort_file.stat().st_size != 0: + logging.info( + "Found an existing bam file for the fastq file, \ + presuming the file has been processed, will skip" + ) + continue + + logging.info("Processing %s", fastq_file) + star_command = [ + str(star_bin), + "--outFilterIntronMotifs", + "RemoveNoncanonicalUnannotated", + "--outSAMstrandField", + "intronMotif", + "--runThreadN", + str(num_threads), + "--twopassMode", + "Basic", + "--runMode", + "alignReads", + "--genomeDir", + str(star_dir), + "--readFilesIn", + str(fastq_file), + "--outFileNamePrefix", + f"{star_dir}/", + "--outTmpDir", + str(star_tmp_dir), + "--outSAMtype", + "SAM", + "--alignIntronMax", + str(max_intron_length), + ] + #'--outSJfilterIntronMaxVsReadN','5000','10000','25000','40000', + #'50000','50000','50000','50000','50000','100000'] + check_compression = re.search(r".gz$", fastq_file) + if check_compression: + star_command.append("--readFilesCommand") + star_command.append("gunzip") + star_command.append("-c") + subprocess.run(star_command)#pylint:disable=subprocess-run-check + shutil.move(Path(f"{star_dir}/Aligned.out.sam"), sam_file) + shutil.move(Path(f"{star_dir}/SJ.out.tab"), junctions_file) + logging.info("Converting samfile into sorted bam file. Bam file: %s", bam_file) + subprocess.run(#pylint:disable=subprocess-run-check + [ + str(samtools_bin), + "sort", + "-@", + str(num_threads), + "-T", + str(sam_temp_file), + "-o", + str(bam_sort_file), + str(sam_file), + ] + ) + shutil.move(star_dir / "Log.final.out", log_out_file) + sam_file.unlink() + logging.info("Completed running STAR")
+ + +def _create_paired_paths(fastq_file_paths: List) -> List: + """ + Create list of paired transcriptomic fastq files + + Args: + fastq_file_paths (List): List of transcriptomic file paths. + + Returns: + List: List of paired transcriptomic files + """ + path_dict = {} + # final_list = [] + for fastq_file in fastq_file_paths: + paired_name = re.search(r"(.+)_\d+\.(fastq|fq)", fastq_file) + if not paired_name: + logging.exception( + "Could not find _1 or _2 at the end of the prefix \ + for file. Assuming file is not paired: %s", + fastq_file, + ) + # final_list.append([fastq_file]) + path_dict[fastq_file] = [fastq_file] + continue + run_accession = paired_name.group(1) + if run_accession in path_dict: + path_dict[run_accession].append(fastq_file) + else: + path_dict[run_accession] = [fastq_file] + # for pair in path_dict: + # final_list.append(path_dict[pair]) + logging.info([value for values_list in path_dict.values() for value in values_list]) + return [value for values_list in path_dict.values() for value in values_list] + +#pylint:disable=pointless-string-statement +""" +For an advanced and optimised subsampling we could use +https://github.com/lh3/seqtk +""" + + +def _subsample_paired_fastq_files( + fastq_files: List[Path], + output_files: List[Path] = "", + subsample_read_limit: int = 100000000, + num_threads: int = 2, + compressed: bool = False, +) -> None: + """ + Perform subsampling on two paired FastQ files in parallel using multiple threads. + + Args: + fastq_files : Path for paired fastq files. + output_files : Path for the output file. + subsample_read_limit : Subsample size, defaults to 100000000. + num_threads : Number of threads, defaults to 2. + compressed : file compressed, defaults to False. + """ + fastq_file_1, fastq_file_2 = fastq_files + if len(output_files) == 0: + output_files = [f"{fastq_file_1}.sub", f"{fastq_file_2}.sub"] + output_file_1, output_file_2 = output_files + if re.search(r"\.gz$", fastq_file_1): + compressed = True + num_lines = sum(1 for line in gzip.open(fastq_file_1))#pylint:disable=consider-using-with + else: + num_lines = sum(1 for line in open(fastq_file_1))#pylint:disable=consider-using-with + + range_limit = int(num_lines / 4) + if range_limit <= subsample_read_limit: + logging.info("Number of reads (%s is less than the max allowed read count (%s), \ + no need to subsample", str(range_limit),str(subsample_read_limit) + ) + return + + rand_list = random.sample(range(0, range_limit - 1), subsample_read_limit) + random_indices = {idx * 4: 1 for idx in rand_list} + logging.info("Processing paired files in parallel") + pool = multiprocessing.Pool(int(num_threads))#pylint:disable=consider-using-with + pool.apply_async( + _subsample_fastq_subset, + args=( + fastq_file_1, + output_file_1, + random_indices, + compressed, + ), + ) + pool.apply_async( + _subsample_fastq_subset, + args=( + fastq_file_2, + output_file_2, + random_indices, + compressed, + ), + ) + pool.close() + pool.join() + + +def _subsample_fastq_subset( + fastq_file: Path, output_file: Path, random_indices: dict, compressed: bool +) -> None: + """ + Selecting specific sets of four lines from an input FastQ file and writing them to an output file. + + Args: + fastq_file : Path for the fastq file. + output_file : Path for the output file. + random_indices : set of random indices. + compressed : the files is compressed + """ + line_index = 0 + + with gzip.open(fastq_file, "rt") if compressed else open(fastq_file) as file_in, open( + output_file, "w+" + ) as file_out: + lines = [file_in.readline() for _ in range(4)] + while lines[3]: # This ensures that the loop continues until the end of the input file. + if line_index in random_indices: + file_out.writelines(lines) + line_index += 4 + lines = [file_in.readline() for _ in range(4)] + + +
[docs]def subsample_transcriptomic_data(fastq_file_list: List[Path], num_threads: int = 2) -> None: + """ + Subsample paired fastq files. + + Args: + fastq_file_list : List of fastq file path to process. + num_threads : number of threads + """ + for fastq_files in fastq_file_list: + fastq_file_1, fastq_file_2 = fastq_files + # fastq_file_pair = "" + # if len(fastq_files) == 2: + # fastq_file_pair = fastq_files[1] + + if len(fastq_files) == 1: + fastq_file_1 = fastq_files[0] + if Path(f"{fastq_file_1}.sub").exists(): + logging.info( + "Found an existing .sub file on the fastq path, will use that instead. File:%s.sub", + fastq_file_1, + ) + else: + _subsample_paired_fastq_files(fastq_files, compressed=True, num_threads=num_threads) + + elif len(fastq_files) == 2: + fastq_file_1, fastq_file_2 = fastq_files + if Path(f"{fastq_file_1}.sub").exists() and Path(f"{fastq_file_2}.sub").exists(): + logging.info( + "Found an existing .sub files on the fastq path for both members of the pair, will use \ + those instead of subsampling again. Files: %s.sub,%s.sub", + fastq_file_1, + fastq_file_2, + ) + elif Path(f"{fastq_file_2}.sub").exists(): + _subsample_paired_fastq_files(fastq_files, compressed=True, num_threads=num_threads)
+ + +def run_trimming( + output_dir: Path, + short_read_fastq_dir: Path, + delete_pre_trim_fastq: bool = False, + num_threads: int = 1, + trim_galore_bin="trim_galore", +) -> None: + """ + Trim list of short read fastq files. + Args: + output_dir : Working directory path. + short_read_fastq_dir : Short read directory path. + delete_pre_trim_fastq : Removing original fastq file post trimming. Defaults to False. + num_threads : Number of threads. + trim_galore_bin : Software path. + """ + check_exe(trim_galore_bin) + trim_dir = create_dir(output_dir, "trim_galore_output") + + fastq_file_list = [] + file_types = ("*.fastq", "*.fq", "*.fastq.gz", "*.fq.gz") + fastq_file_list = [ + path for file_type in file_types for path in Path(short_read_fastq_dir).rglob(file_type) + ] + fastq_file_list = _create_paired_paths(fastq_file_list) + + trim_galore_cmd = [ + str(trim_galore_bin), + "--illumina", + "--quality", + "20", + "--length", + "50", + "--output_dir", + str(trim_dir), + ] + + pool = multiprocessing.Pool(int(num_threads)) # pylint:disable=consider-using-with + for fastq_paired_files in fastq_file_list: + pool.apply_async( + multiprocess_trim_galore, + args=( + trim_galore_cmd, + fastq_paired_files, + trim_dir, + ), + ) + if delete_pre_trim_fastq: + for file_path in fastq_paired_files: + file_path.unlink() + pool.close() + pool.join() + + trimmed_fastq_list = trim_dir.glob("*.fq.gz") + + for trimmed_fastq_path in trimmed_fastq_list: + logging.info("Trimmed file path: %s", str(trimmed_fastq_path)) + sub_patterns = re.compile(r"|".join(("_val_1.fq", "_val_2.fq", "_trimmed.fq"))) + updated_file_path = sub_patterns.sub(".fq", trimmed_fastq_path.name) + updated_file_path = short_read_fastq_dir / updated_file_path + logging.info("Updated file path: %s", str(updated_file_path)) + trimmed_fastq_path.rename(updated_file_path) + + files_to_delete_list = [] + for file_type in file_types: + files_to_delete_list.extend(short_read_fastq_dir.glob(file_type)) + + for file_to_delete in files_to_delete_list: + file_to_delete.unlink() + + +def multiprocess_trim_galore(trim_galore_cmd: List, fastq_paired_files: List[Path]) -> None: + """ + Trim short paired or single short read fastq file. + Args: + trim_galore_cmd : Generic command. + fastq_paired_files : List of single or paired fastq files. + """ + + fastq_file = fastq_paired_files[0] + fastq_file_pair = None + + if len(fastq_paired_files) == 2: + fastq_file, fastq_file_pair = fastq_paired_files + trim_galore_cmd.append("--paired") + trim_galore_cmd.append(fastq_file) + trim_galore_cmd.append(fastq_file_pair) + elif len(fastq_paired_files) == 1: + trim_galore_cmd.append(fastq_paired_files) + + logging.info("Running Trim Galore with the following command: %s", {" ".join(trim_galore_cmd)}) + subprocess.run(trim_galore_cmd, check=True) + + +class InputSchema(argschema.ArgSchema): + """Input arguments expected to run STAR software.""" + + genome_file = argschema.fields.InputFile(required=True, description="Genome file path") + output_dir = argschema.fields.OutputDir(required=True, description="Output directory path") + short_read_fastq_dir = argschema.fields.String( + required=True, + description="Short read directory path", + ) + delete_pre_trim_fastq = argschema.fields.Bool( + required=False, + default=False, + description="Delete the original fastq files after trimming", + ) + trim_fastq = argschema.fields.Bool( + required=False, + default=False, + description="Trim the short read files using Trim Galore", + ) + max_reads_per_sample = argschema.fields.Integer( + required=False, + default="0", + description="The maximum number of reads to use per sample.", + ) + max_intron_length = argschema.fields.Integer( + required=False, + default="100000", + description="The maximum intron size for alignments.", + ) + num_threads = argschema.fields.Integer(required=False, default=1, description="Number of threads") + star_bin = argschema.fields.String( + required=False, + default="star", + description="Star software path", + ) + samtools_bin = argschema.fields.String( + required=False, + default="samtools", + description="Samtools software path", + ) + trim_galore_bin = argschema.fields.String( + required=False, + default="trim_galore", + description="Trim Galore software path", + ) + + +def main() -> None: + """STAR's entry-point.""" + mod = argschema.ArgSchemaParser(schema_type=InputSchema) + log_file_path = create_dir(mod.args["output_dir"], "log") / "star.log" + loginipath = Path(__file__).parents[6] / "conf" / "logging.conf" + logging.config.fileConfig( + loginipath, + defaults={"logfilename": str(log_file_path)}, + disable_existing_loggers=False, + ) + run_star( + mod.args["genome_file"], + mod.args["output_dir"], + mod.args["short_read_fastq_dir"], + mod.args["delete_pre_trim_fastq"], + mod.args["trim_fastq"], + mod.args["max_reads_per_sample"], + mod.args["max_intron_length"], + mod.args["num_threads"], + mod.args["star_bin"], + mod.args["samtools_bin"], + mod.args["trim_galore_bin"], + ) + + +# pylint:disable=pointless-string-statement +""" +def model_builder(work_dir): + + star_output_dir = os.path.join(work_dir, "star_output") + + all_junctions_file = os.path.join(star_output_dir, "all_junctions.sj") + sjf_out = open(all_junctions_file, "w+") + + for sj_tab_file in glob.glob(input_dir + "/*.sj.tab"): + sjf_in = open(sj_tab_file) + sjf_lines = sjf_in.readlines() + for line in sjf_lines: + elements = line.split("\t") + strand = "+" + + # my $slice_name = $eles[0]; + # my $start = $eles[1]; + # my $end = $eles[2]; + # my $strand = $eles[3]; + + # If the strand is undefined then skip, Augustus expects a strand + if elements[3] == "0": + continue + elif elements[3] == "2": + strand = "-" + + junction_length = int(elements[2]) - int(elements[1]) + 1 + if junction_length < 100: + continue + + if not elements[4] and elements[7] < 10: + continue + + # For the moment treat multimapping and single + # mapping things as a combined score + score = float(elements[6]) + float(elements[7]) + score = str(score) + output_line = [ + elements[0], + "RNASEQ", + "intron", + elements[1], + elements[2], + score, + strand, + ".", + ("src=W;mul=" + score + ";"), + ] + sjf_out.write("\t".join(output_line) + "\n") + + sjf_out.close() +""" +
+ +
+
+
+
+
+ +
+
+
+ + + + + \ No newline at end of file diff --git a/_modules/ensembl/tools/anno/transcriptomic_annotation/stringtie.html b/_modules/ensembl/tools/anno/transcriptomic_annotation/stringtie.html new file mode 100644 index 0000000..9f52d85 --- /dev/null +++ b/_modules/ensembl/tools/anno/transcriptomic_annotation/stringtie.html @@ -0,0 +1,252 @@ + + + + + + + ensembl.tools.anno.transcriptomic_annotation.stringtie — ensembl-anno 0.1 documentation + + + + + + + + + + + +
+
+
+ +
+
+
+ +

Source code for ensembl.tools.anno.transcriptomic_annotation.stringtie

+# See the NOTICE file distributed with this work for additional information
+# regarding copyright ownership.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""
+StringTie is a fast and highly efficient assembler of RNA-Seq alignments into potential transcripts.
+It uses a novel network flow algorithm as well as an optional de novo assembly step to assemble and
+quantitate full-length transcripts representing multiple splice variants for each gene locus.
+Pertea M, Pertea GM, Antonescu CM, Chang TC, Mendell JT & Salzberg SL. StringTie enables improved 
+reconstruction of a transcriptome from RNA-seq reads Nature Biotechnology 2015, doi:10.1038/nbt.3122
+"""
+
+__all__ = ["run_stringtie"]
+import logging
+import logging.config
+from pathlib import Path
+import re
+import subprocess
+import argschema
+
+from ensembl.tools.anno.utils._utils import (
+    check_exe,
+    create_dir,
+    check_gtf_content,
+)
+
+
+
[docs]def run_stringtie( + output_dir: Path, + stringtie_bin: Path = Path("stringtie"), + num_threads: int = 1, +) -> None: + """ + StringTie assembler of short read data. + Args: + output_dir : Working directory path. + stringtie_bin : Software path. + num_threads : Number of available threads. + """ + check_exe(stringtie_bin) + stringtie_dir = create_dir(output_dir, "stringtie_output") + logging.info("Skip analysis if the gtf file already exists") + output_file = stringtie_dir / "annotation.gtf" + if output_file.exists(): + transcript_count = check_gtf_content(output_file, "transcript") + if transcript_count > 0: + logging.info("Stringtie gtf file exists, skipping analysis") + return + + stringtie_merge_input_file = stringtie_dir / "stringtie_assemblies.txt" + stringtie_merge_output_file = stringtie_dir / "annotation.gtf" + star_dir = output_dir / "star_output" + + if star_dir.exists() and len(list(star_dir.glob("*.bam"))) != 0: + for sorted_bam_file in star_dir.glob("*.bam"): + transcript_file_name = re.sub(".bam", ".stringtie.gtf", sorted_bam_file.name) + transcript_file = stringtie_dir / transcript_file_name + if transcript_file.exists(): + logging.info( + "Found an existing stringtie gtf file, will not overwrite. \ + File found: %s", + transcript_file, + ) + else: + logging.info("Running Stringtie on: %s", sorted_bam_file.name) + try: + subprocess.check_output( # pylint:disable=subprocess-run-check + [ + stringtie_bin, + sorted_bam_file, + "-o", + transcript_file, + "-p", + str(num_threads), + "-t", # disable trimming of predicted transcripts based on coverage + "-a", # minimum anchor length for junctions + "15", + ] + ) + except subprocess.CalledProcessError as e: + logging.error("Error running Stringtie command: %s", e) + logging.error("Return code: %s", str(e.returncode)) + logging.error("Output and error messages:%s\n", e.output) + else: + raise IndexError(f"The list of sorted bam files is empty, Star output dir: {star_dir}") + + logging.info("Creating Stringtie merge input file: %s", stringtie_merge_input_file) + with open(stringtie_merge_input_file, "w+", encoding="utf8") as gtf_list_out: + for gtf_file in stringtie_dir.glob("*.stringtie.gtf"): + transcript_count = check_gtf_content(gtf_file, "transcript") + if transcript_count > 0: + gtf_list_out.write(f"{gtf_file}\n") + else: + logging.warning("Warning, skipping file with no transcripts. Path:%s", gtf_file) + logging.info("Merging Stringtie results.") + try: + subprocess.run( # pylint:disable=subprocess-run-check + [ + stringtie_bin, + "--merge", + "-o", + stringtie_merge_output_file, + stringtie_merge_input_file, + ] + ) + except subprocess.CalledProcessError as e: + logging.error("Error running Stringtie merging command: %s", e)
+ + +class InputSchema(argschema.ArgSchema): + """Input arguments expected to run StringTie software.""" + + output_dir = argschema.fields.OutputDir(required=True, description="Output directory path") + stringtie_bin = argschema.fields.String( + required=False, + default="stringtie", + description="StringTie software path", + ) + num_threads = argschema.fields.Integer(required=False, default=1, description="Number of threads") + + +def main() -> None: + """StringTie's entry-point.""" + mod = argschema.ArgSchemaParser(schema_type=InputSchema) + log_file_path = create_dir(mod.args["output_dir"], "log") / "stringtie.log" + loginipath = Path(__file__).parents[6] / "conf" / "logging.conf" + logging.config.fileConfig( + loginipath, + defaults={"logfilename": str(log_file_path)}, + disable_existing_loggers=False, + ) + run_stringtie( + mod.args["output_dir"], + mod.args["stringtie_bin"], + mod.args["num_threads"], + ) +
+ +
+
+
+
+
+ +
+
+
+ + + + + \ No newline at end of file diff --git a/_modules/index.html b/_modules/index.html new file mode 100644 index 0000000..8777d03 --- /dev/null +++ b/_modules/index.html @@ -0,0 +1,117 @@ + + + + + + + Overview: module code — ensembl-anno 0.1 documentation + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/_sources/cpg.rst.txt b/_sources/cpg.rst.txt new file mode 100644 index 0000000..8603218 --- /dev/null +++ b/_sources/cpg.rst.txt @@ -0,0 +1,8 @@ +CpG Module Documentation +============================== + +.. automodule:: ensembl.tools.anno.simple_feature_annotation.cpg + :members: + :undoc-members: + :show-inheritance: + diff --git a/_sources/dust.rst.txt b/_sources/dust.rst.txt new file mode 100644 index 0000000..f1a98b4 --- /dev/null +++ b/_sources/dust.rst.txt @@ -0,0 +1,8 @@ +DustMasker Module Documentation +=================================== + +.. automodule:: ensembl.tools.anno.repeat_annotation.dust + :members: + :undoc-members: + :show-inheritance: + diff --git a/_sources/eponine.rst.txt b/_sources/eponine.rst.txt new file mode 100644 index 0000000..e460382 --- /dev/null +++ b/_sources/eponine.rst.txt @@ -0,0 +1,8 @@ +Eponine Module Documentation +============================== + +.. automodule:: ensembl.tools.anno.simple_feature_annotation.eponine + :members: + :undoc-members: + :show-inheritance: + diff --git a/_sources/genblast.rst.txt b/_sources/genblast.rst.txt new file mode 100644 index 0000000..401f411 --- /dev/null +++ b/_sources/genblast.rst.txt @@ -0,0 +1,8 @@ +Genblast Module Documentation +============================== + +.. automodule:: ensembl.tools.anno.protein_annotation.genblast + :members: + :undoc-members: + :show-inheritance: + diff --git a/_sources/index.rst.txt b/_sources/index.rst.txt new file mode 100644 index 0000000..add9008 --- /dev/null +++ b/_sources/index.rst.txt @@ -0,0 +1,58 @@ +.. See the NOTICE file distributed with this work for additional information + regarding copyright ownership. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +.. ensembl-anno documentation master file, created by + sphinx-quickstart on Fri Sep 1 12:25:36 2023. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +======================================== +Ensembl-anno +======================================== + +Anno tool kit + + +Contents +-------- +Check out :ref:`installation ` section for further information on how +to install the project. + +.. toctree:: + :maxdepth: 1 + :caption: Index + + install + license + + cpg + dust + eponine + genblast + minimap + red + repeatmasker + scallop + star + stringtie + trf + trnascan + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` \ No newline at end of file diff --git a/_sources/install.rst.txt b/_sources/install.rst.txt new file mode 100644 index 0000000..997e6c0 --- /dev/null +++ b/_sources/install.rst.txt @@ -0,0 +1,54 @@ +.. See the NOTICE file distributed with this work for additional information + regarding copyright ownership. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +API Setup and installation +=========================== + +Requirements +-------------- + +.. _install: + +An Ensembl API checkout including: + +- ensembl-production `ensembl-production `_. +- ensembl-analysis `ensembl-analysis `_. (on dev/hive_master branch) +- ensembl-taxonomy `ensembl-taxonomy `_. +- ensembl-orm `ensembl-orm `_. + +Software +^^^^^^^^ + +#. Python 3.8+ +#. Bioperl 1.6.9+ + +Python Modules +^^^^^^^^^^^^^^ +#. argschema + + + +Installation +------------ +Directly from GitHub: + +.. code-block:: none + :linenos: + + git clone https://github.com/Ensembl/ensembl-analysis -b experimental/gbiab + git clone https://github.com/Ensembl/ensembl-production + git clone https://github.com/Ensembl/ensembl-hive + git clone https://github.com/Ensembl/ensembl-taxonomy + git clone https://github.com/Ensembl/ensembl-orm \ No newline at end of file diff --git a/_sources/license.rst.txt b/_sources/license.rst.txt new file mode 100644 index 0000000..9e9b2fe --- /dev/null +++ b/_sources/license.rst.txt @@ -0,0 +1,203 @@ +License +------- + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. \ No newline at end of file diff --git a/_sources/minimap.rst.txt b/_sources/minimap.rst.txt new file mode 100644 index 0000000..bf3a45c --- /dev/null +++ b/_sources/minimap.rst.txt @@ -0,0 +1,8 @@ +Minimap2 Module Documentation +============================== + +.. automodule:: ensembl.tools.anno.transcriptomic_annotation.minimap + :members: + :undoc-members: + :show-inheritance: + diff --git a/_sources/red.rst.txt b/_sources/red.rst.txt new file mode 100644 index 0000000..26743cd --- /dev/null +++ b/_sources/red.rst.txt @@ -0,0 +1,8 @@ +Red Module Documentation +============================== + +.. automodule:: ensembl.tools.anno.repeat_annotation.red + :members: + :undoc-members: + :show-inheritance: + diff --git a/_sources/repeatmasker.rst.txt b/_sources/repeatmasker.rst.txt new file mode 100644 index 0000000..dd07f72 --- /dev/null +++ b/_sources/repeatmasker.rst.txt @@ -0,0 +1,8 @@ +Repeatmasker Module Documentation +==================================== + +.. automodule:: ensembl.tools.anno.repeat_annotation.repeatmasker + :members: + :undoc-members: + :show-inheritance: + diff --git a/_sources/scallop.rst.txt b/_sources/scallop.rst.txt new file mode 100644 index 0000000..744055b --- /dev/null +++ b/_sources/scallop.rst.txt @@ -0,0 +1,8 @@ +Scallop Module Documentation +============================== + +.. automodule:: ensembl.tools.anno.transcriptomic_annotation.scallop + :members: + :undoc-members: + :show-inheritance: + diff --git a/_sources/star.rst.txt b/_sources/star.rst.txt new file mode 100644 index 0000000..d83c66b --- /dev/null +++ b/_sources/star.rst.txt @@ -0,0 +1,8 @@ +STAR Module Documentation +============================== + +.. automodule:: ensembl.tools.anno.transcriptomic_annotation.star + :members: + :undoc-members: + :show-inheritance: + diff --git a/_sources/stringtie.rst.txt b/_sources/stringtie.rst.txt new file mode 100644 index 0000000..980dcbd --- /dev/null +++ b/_sources/stringtie.rst.txt @@ -0,0 +1,8 @@ +Stringtie Module Documentation +================================== + +.. automodule:: ensembl.tools.anno.transcriptomic_annotation.stringtie + :members: + :undoc-members: + :show-inheritance: + diff --git a/_sources/trf.rst.txt b/_sources/trf.rst.txt new file mode 100644 index 0000000..9268f3c --- /dev/null +++ b/_sources/trf.rst.txt @@ -0,0 +1,8 @@ +TRF Module Documentation +============================== + +.. automodule:: ensembl.tools.anno.repeat_annotation.trf + :members: + :undoc-members: + :show-inheritance: + diff --git a/_sources/trnascan.rst.txt b/_sources/trnascan.rst.txt new file mode 100644 index 0000000..6193545 --- /dev/null +++ b/_sources/trnascan.rst.txt @@ -0,0 +1,8 @@ +tRNAscan-SE Module Documentation +=================================== + +.. automodule:: ensembl.tools.anno.snc_rna_annotation.trnascan + :members: + :undoc-members: + :show-inheritance: + diff --git a/_static/agogo.css b/_static/agogo.css new file mode 100644 index 0000000..401127b --- /dev/null +++ b/_static/agogo.css @@ -0,0 +1,549 @@ +/* + * agogo.css_t + * ~~~~~~~~~~~ + * + * Sphinx stylesheet -- agogo theme. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +* { + margin: 0px; + padding: 0px; +} + +body { + font-family: Garamond, Arial, serif; + line-height: 1.4em; + color: black; + background-color: #009999; +} + + +/* Page layout */ + +div.header, div.content, div.footer { + width: 70em; + margin-left: auto; + margin-right: auto; +} + +div.header-wrapper { + background: #009999; + border-bottom: 3px solid #2e3436; +} + + +/* Default body styles */ +a { + color: green; +} + +div.bodywrapper a, div.footer a { + text-decoration: underline; +} + +.clearer { + clear: both; +} + +.left { + float: left; +} + +.right { + float: right; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +h1, h2, h3, h4 { + font-family: Arial, Helvetica, serif; + font-weight: normal; + color: #3465a4; + margin-bottom: .8em; +} + +h1 { + color: #204a87; +} + +h2 { + padding-bottom: .5em; + border-bottom: 1px solid #3465a4; +} + +a.headerlink { + visibility: hidden; + color: #dddddd; + padding-left: .3em; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +img { + border: 0; +} + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 2px 7px 1px 7px; + border-left: 0.2em solid black; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +dt:target, .highlighted { + background-color: #fbe54e; +} + +/* Header */ + +div.header { + padding-top: 10px; + padding-bottom: 10px; +} + +div.header .headertitle { + font-family: Arial, Helvetica, serif; + font-weight: normal; + font-size: 180%; + letter-spacing: .08em; + margin-bottom: .8em; +} + +div.header .headertitle a { + color: white; +} + +div.header div.rel { + margin-top: 1em; +} + +div.header div.rel a { + color: #33d6ff; + letter-spacing: .1em; + text-transform: uppercase; +} + +p.logo { + float: right; +} + +img.logo { + border: 0; +} + + +/* Content */ +div.content-wrapper { + background-color: white; + padding-top: 20px; + padding-bottom: 20px; +} + +div.document { + width: 50em; + float: left; +} + +div.body { + padding-right: 2em; + text-align: justify; +} + +div.document h1 { + line-height: 120%; +} + +div.document ul { + margin: 1.5em; + list-style-type: square; +} + +div.document dd { + margin-left: 1.2em; + margin-top: .4em; + margin-bottom: 1em; +} + +div.document .section { + margin-top: 1.7em; +} +div.document .section:first-child { + margin-top: 0px; +} + +div.document div.highlight { + padding: 3px; + border-top: 2px solid #dddddd; + border-bottom: 2px solid #dddddd; + margin-top: .8em; + margin-bottom: .8em; +} + +div.document div.literal-block-wrapper { + margin-top: .8em; + margin-bottom: .8em; +} + +div.document div.literal-block-wrapper div.highlight { + margin: 0; +} + +div.document div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.document div.code-block-caption span.caption-text { +} + +div.document h2 { + margin-top: .7em; +} + +div.document p { + margin-bottom: .5em; +} + +div.document li.toctree-l1 { + margin-bottom: 1em; +} + +div.document .descname { + font-weight: bold; +} + +div.document .sig-paren { + font-size: larger; +} + +div.document .docutils.literal { + background-color: #eeeeec; + padding: 1px; +} + +div.document .docutils.xref.literal { + background-color: transparent; + padding: 0px; +} + +div.document blockquote { + margin: 1em; +} + +div.document ol { + margin: 1.5em; +} + + +/* Sidebar */ + +div.sidebar, +aside.sidebar { + width: 20em; + float: right; + font-size: .9em; +} + +div.sidebar a, aside.sidebar a, div.header a { + text-decoration: none; +} + +div.sidebar a:hover, aside.sidebar a:hover, div.header a:hover { + text-decoration: underline; +} + +div.sidebar h3, +aside.sidebar h3 { + color: #2e3436; + text-transform: uppercase; + font-size: 130%; + letter-spacing: .1em; +} + +div.sidebar ul, +aside.sidebar ul { + list-style-type: none; +} + +div.sidebar li.toctree-l1 a, +aside.sidebar li.toctree-l1 a { + display: block; + padding: 1px; + border: 1px solid #dddddd; + background-color: #eeeeec; + margin-bottom: .4em; + padding-left: 3px; + color: #2e3436; +} + +div.sidebar li.toctree-l2 a, +aside.sidebar li.toctree-l2 a { + background-color: transparent; + border: none; + margin-left: 1em; + border-bottom: 1px solid #dddddd; +} + +div.sidebar li.toctree-l3 a, +aside.sidebar li.toctree-l3 a { + background-color: transparent; + border: none; + margin-left: 2em; + border-bottom: 1px solid #dddddd; +} + +div.sidebar li.toctree-l2:last-child a, +aside.sidebar li.toctree-l2:last-child a { + border-bottom: none; +} + +div.sidebar li.toctree-l1.current a, +aside.sidebar li.toctree-l1.current a { + border-right: 5px solid #33d6ff; +} + +div.sidebar li.toctree-l1.current li.toctree-l2 a, +aside.sidebar li.toctree-l1.current li.toctree-l2 a { + border-right: none; +} + +div.sidebar input[type="text"], +aside.sidebar input[type="text"] { + width: 170px; +} + +div.sidebar input[type="submit"], +aside.sidebar input[type="submit"] { + width: 30px; +} + + +/* Footer */ + +div.footer-wrapper { + background: #e6fff9; + border-top: 4px solid #babdb6; + padding-top: 10px; + padding-bottom: 10px; + min-height: 80px; +} + +div.footer, div.footer a { + color: #888a85; +} + +div.footer .right { + text-align: right; +} + +div.footer .left { + text-transform: uppercase; +} + + +/* Styles copied from basic theme */ + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-right { + text-align: right; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li div.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- viewcode extension ---------------------------------------------------- */ + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family:: Garamond, Arial, serif; +} + +div.viewcode-block:target { + margin: -1px -3px; + padding: 0 3px; + background-color: #f4debf; + border-top: 1px solid #ac9; + border-bottom: 1px solid #ac9; +} + +div.code-block-caption { + background-color: #ddd; + color: #333; + padding: 2px 5px; + font-size: small; +} + +/* -- math display ---------------------------------------------------------- */ + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} \ No newline at end of file diff --git a/_static/basic.css b/_static/basic.css new file mode 100644 index 0000000..a5cba42 --- /dev/null +++ b/_static/basic.css @@ -0,0 +1,921 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 20em; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} + +nav.contents, +aside.topic, +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ + +nav.contents, +aside.topic, +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +nav.contents > :last-child, +aside.topic > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +nav.contents::after, +aside.topic::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +aside.footnote > span, +div.citation > span { + float: left; +} +aside.footnote > span:last-of-type, +div.citation > span:last-of-type { + padding-right: 0.5em; +} +aside.footnote > p { + margin-left: 2em; +} +div.citation > p { + margin-left: 4em; +} +aside.footnote > p:last-of-type, +div.citation > p:last-of-type { + margin-bottom: 0em; +} +aside.footnote > p:last-of-type:after, +div.citation > p:last-of-type:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +.sig dd { + margin-top: 0px; + margin-bottom: 0px; +} + +.sig dl { + margin-top: 0px; + margin-bottom: 0px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; + white-space: nowrap; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/_static/bgfooter.png b/_static/bgfooter.png new file mode 100644 index 0000000000000000000000000000000000000000..b7c7cadd4e6978aa7081fe672fcf5afc97516bda GIT binary patch literal 276 zcmV+v0qg#WP)qvnR6EfsQ*t~7O=UY2%BZy- zs#7>Lw$#|1-#yb5jZ8}CcXenmE?Bb?+emvZy3eu4G&!aT9i`%Ot1U0%(#mRx?NNc)^t8TJHA0R4$Di^IIL4X9&MVm&N-9#bE;?}xqq}wTrc0WUU#YK z#2JfT+O{=ipwX3&j4H~AegD$wD(9Ee_Le?vx(rq^B%Dj?^+nzae0J!bK00|W&N)Yz aUi|<^NiO;Hz(H~V0000P0IhA`JcOe?|*M3M!YD+&^mI=Y=U~-8S>8l1XAJ*3?jZZ Q8UO$Q07*qoM6N<$f;!4|TmS$7 literal 0 HcmV?d00001 diff --git a/_static/doctools.js b/_static/doctools.js new file mode 100644 index 0000000..d06a71d --- /dev/null +++ b/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + TRANSLATIONS: {}, + PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), + LOCALE: "unknown", + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext: (string) => { + const translated = Documentation.TRANSLATIONS[string]; + switch (typeof translated) { + case "undefined": + return string; // no translation + case "string": + return translated; // translation exists + default: + return translated[0]; // (singular, plural) translation tuple exists + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + initDomainIndexTable: () => { + const toggler = (el) => { + const idNumber = el.id.substr(7); + const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); + if (el.src.substr(-9) === "minus.png") { + el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; + toggledRows.forEach((el) => (el.style.display = "none")); + } else { + el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; + toggledRows.forEach((el) => (el.style.display = "")); + } + }; + + const togglerElements = document.querySelectorAll("img.toggler"); + togglerElements.forEach((el) => + el.addEventListener("click", (event) => toggler(event.currentTarget)) + ); + togglerElements.forEach((el) => (el.style.display = "")); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); + }, + + initOnKeyListeners: () => { + // only install a listener if it is really needed + if ( + !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && + !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS + ) + return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + if (!event.shiftKey) { + switch (event.key) { + case "ArrowLeft": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const prevLink = document.querySelector('link[rel="prev"]'); + if (prevLink && prevLink.href) { + window.location.href = prevLink.href; + event.preventDefault(); + } + break; + case "ArrowRight": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const nextLink = document.querySelector('link[rel="next"]'); + if (nextLink && nextLink.href) { + window.location.href = nextLink.href; + event.preventDefault(); + } + break; + } + } + + // some keyboard layouts may need Shift to get / + switch (event.key) { + case "/": + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; + Documentation.focusSearchBar(); + event.preventDefault(); + } + }); + }, +}; + +// quick alias for translations +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/_static/documentation_options.js b/_static/documentation_options.js new file mode 100644 index 0000000..cf359c0 --- /dev/null +++ b/_static/documentation_options.js @@ -0,0 +1,14 @@ +var DOCUMENTATION_OPTIONS = { + URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'), + VERSION: '0.1', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/_static/file.png b/_static/file.png new file mode 100644 index 0000000000000000000000000000000000000000..a858a410e4faa62ce324d814e4b816fff83a6fb3 GIT binary patch literal 286 zcmV+(0pb3MP)s`hMrGg#P~ix$^RISR_I47Y|r1 z_CyJOe}D1){SET-^Amu_i71Lt6eYfZjRyw@I6OQAIXXHDfiX^GbOlHe=Ae4>0m)d(f|Me07*qoM6N<$f}vM^LjV8( literal 0 HcmV?d00001 diff --git a/_static/language_data.js b/_static/language_data.js new file mode 100644 index 0000000..250f566 --- /dev/null +++ b/_static/language_data.js @@ -0,0 +1,199 @@ +/* + * language_data.js + * ~~~~~~~~~~~~~~~~ + * + * This script contains the language-specific data used by searchtools.js, + * namely the list of stopwords, stemmer, scorer and splitter. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +var stopwords = ["a", "and", "are", "as", "at", "be", "but", "by", "for", "if", "in", "into", "is", "it", "near", "no", "not", "of", "on", "or", "such", "that", "the", "their", "then", "there", "these", "they", "this", "to", "was", "will", "with"]; + + +/* Non-minified version is copied as a separate JS file, is available */ + +/** + * Porter Stemmer + */ +var Stemmer = function() { + + var step2list = { + ational: 'ate', + tional: 'tion', + enci: 'ence', + anci: 'ance', + izer: 'ize', + bli: 'ble', + alli: 'al', + entli: 'ent', + eli: 'e', + ousli: 'ous', + ization: 'ize', + ation: 'ate', + ator: 'ate', + alism: 'al', + iveness: 'ive', + fulness: 'ful', + ousness: 'ous', + aliti: 'al', + iviti: 'ive', + biliti: 'ble', + logi: 'log' + }; + + var step3list = { + icate: 'ic', + ative: '', + alize: 'al', + iciti: 'ic', + ical: 'ic', + ful: '', + ness: '' + }; + + var c = "[^aeiou]"; // consonant + var v = "[aeiouy]"; // vowel + var C = c + "[^aeiouy]*"; // consonant sequence + var V = v + "[aeiou]*"; // vowel sequence + + var mgr0 = "^(" + C + ")?" + V + C; // [C]VC... is m>0 + var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 + var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 + var s_v = "^(" + C + ")?" + v; // vowel in stem + + this.stemWord = function (w) { + var stem; + var suffix; + var firstch; + var origword = w; + + if (w.length < 3) + return w; + + var re; + var re2; + var re3; + var re4; + + firstch = w.substr(0,1); + if (firstch == "y") + w = firstch.toUpperCase() + w.substr(1); + + // Step 1a + re = /^(.+?)(ss|i)es$/; + re2 = /^(.+?)([^s])s$/; + + if (re.test(w)) + w = w.replace(re,"$1$2"); + else if (re2.test(w)) + w = w.replace(re2,"$1$2"); + + // Step 1b + re = /^(.+?)eed$/; + re2 = /^(.+?)(ed|ing)$/; + if (re.test(w)) { + var fp = re.exec(w); + re = new RegExp(mgr0); + if (re.test(fp[1])) { + re = /.$/; + w = w.replace(re,""); + } + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1]; + re2 = new RegExp(s_v); + if (re2.test(stem)) { + w = stem; + re2 = /(at|bl|iz)$/; + re3 = new RegExp("([^aeiouylsz])\\1$"); + re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re2.test(w)) + w = w + "e"; + else if (re3.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + else if (re4.test(w)) + w = w + "e"; + } + } + + // Step 1c + re = /^(.+?)y$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(s_v); + if (re.test(stem)) + w = stem + "i"; + } + + // Step 2 + re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step2list[suffix]; + } + + // Step 3 + re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step3list[suffix]; + } + + // Step 4 + re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; + re2 = /^(.+?)(s|t)(ion)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + if (re.test(stem)) + w = stem; + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1] + fp[2]; + re2 = new RegExp(mgr1); + if (re2.test(stem)) + w = stem; + } + + // Step 5 + re = /^(.+?)e$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + re2 = new RegExp(meq1); + re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) + w = stem; + } + re = /ll$/; + re2 = new RegExp(mgr1); + if (re.test(w) && re2.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + + // and turn initial Y back to y + if (firstch == "y") + w = firstch.toLowerCase() + w.substr(1); + return w; + } +} + diff --git a/_static/minus.png b/_static/minus.png new file mode 100644 index 0000000000000000000000000000000000000000..d96755fdaf8bb2214971e0db9c1fd3077d7c419d GIT binary patch literal 90 zcmeAS@N?(olHy`uVBq!ia0vp^+#t*WBp7;*Yy1LIik>cxAr*|t7R?Mi>2?kWtu=nj kDsEF_5m^0CR;1wuP-*O&G^0G}KYk!hp00i_>zopr08q^qX#fBK literal 0 HcmV?d00001 diff --git a/_static/plus.png b/_static/plus.png new file mode 100644 index 0000000000000000000000000000000000000000..7107cec93a979b9a5f64843235a16651d563ce2d GIT binary patch literal 90 zcmeAS@N?(olHy`uVBq!ia0vp^+#t*WBp7;*Yy1LIik>cxAr*|t7R?Mi>2?kWtu>-2 m3q%Vub%g%s<8sJhVPMczOq}xhg9DJoz~JfX=d#Wzp$Pyb1r*Kz literal 0 HcmV?d00001 diff --git a/_static/pygments.css b/_static/pygments.css new file mode 100644 index 0000000..6110e9f --- /dev/null +++ b/_static/pygments.css @@ -0,0 +1,84 @@ +pre { line-height: 125%; } +td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +.highlight .hll { background-color: #ffffcc } +.highlight { background: #f8f8f8; } +.highlight .c { color: #8f5902; font-style: italic } /* Comment */ +.highlight .err { color: #a40000; border: 1px solid #ef2929 } /* Error */ +.highlight .g { color: #000000 } /* Generic */ +.highlight .k { color: #204a87; font-weight: bold } /* Keyword */ +.highlight .l { color: #000000 } /* Literal */ +.highlight .n { color: #000000 } /* Name */ +.highlight .o { color: #ce5c00; font-weight: bold } /* Operator */ +.highlight .x { color: #000000 } /* Other */ +.highlight .p { color: #000000; font-weight: bold } /* Punctuation */ +.highlight .ch { color: #8f5902; font-style: italic } /* Comment.Hashbang */ +.highlight .cm { color: #8f5902; font-style: italic } /* Comment.Multiline */ +.highlight .cp { color: #8f5902; font-style: italic } /* Comment.Preproc */ +.highlight .cpf { color: #8f5902; font-style: italic } /* Comment.PreprocFile */ +.highlight .c1 { color: #8f5902; font-style: italic } /* Comment.Single */ +.highlight .cs { color: #8f5902; font-style: italic } /* Comment.Special */ +.highlight .gd { color: #a40000 } /* Generic.Deleted */ +.highlight .ge { color: #000000; font-style: italic } /* Generic.Emph */ +.highlight .ges { color: #000000; font-weight: bold; font-style: italic } /* Generic.EmphStrong */ +.highlight .gr { color: #ef2929 } /* Generic.Error */ +.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ +.highlight .gi { color: #00A000 } /* Generic.Inserted */ +.highlight .go { color: #000000; font-style: italic } /* Generic.Output */ +.highlight .gp { color: #8f5902 } /* Generic.Prompt */ +.highlight .gs { color: #000000; font-weight: bold } /* Generic.Strong */ +.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ +.highlight .gt { color: #a40000; font-weight: bold } /* Generic.Traceback */ +.highlight .kc { color: #204a87; font-weight: bold } /* Keyword.Constant */ +.highlight .kd { color: #204a87; font-weight: bold } /* Keyword.Declaration */ +.highlight .kn { color: #204a87; font-weight: bold } /* Keyword.Namespace */ +.highlight .kp { color: #204a87; font-weight: bold } /* Keyword.Pseudo */ +.highlight .kr { color: #204a87; font-weight: bold } /* Keyword.Reserved */ +.highlight .kt { color: #204a87; font-weight: bold } /* Keyword.Type */ +.highlight .ld { color: #000000 } /* Literal.Date */ +.highlight .m { color: #0000cf; font-weight: bold } /* Literal.Number */ +.highlight .s { color: #4e9a06 } /* Literal.String */ +.highlight .na { color: #c4a000 } /* Name.Attribute */ +.highlight .nb { color: #204a87 } /* Name.Builtin */ +.highlight .nc { color: #000000 } /* Name.Class */ +.highlight .no { color: #000000 } /* Name.Constant */ +.highlight .nd { color: #5c35cc; font-weight: bold } /* Name.Decorator */ +.highlight .ni { color: #ce5c00 } /* Name.Entity */ +.highlight .ne { color: #cc0000; font-weight: bold } /* Name.Exception */ +.highlight .nf { color: #000000 } /* Name.Function */ +.highlight .nl { color: #f57900 } /* Name.Label */ +.highlight .nn { color: #000000 } /* Name.Namespace */ +.highlight .nx { color: #000000 } /* Name.Other */ +.highlight .py { color: #000000 } /* Name.Property */ +.highlight .nt { color: #204a87; font-weight: bold } /* Name.Tag */ +.highlight .nv { color: #000000 } /* Name.Variable */ +.highlight .ow { color: #204a87; font-weight: bold } /* Operator.Word */ +.highlight .pm { color: #000000; font-weight: bold } /* Punctuation.Marker */ +.highlight .w { color: #f8f8f8 } /* Text.Whitespace */ +.highlight .mb { color: #0000cf; font-weight: bold } /* Literal.Number.Bin */ +.highlight .mf { color: #0000cf; font-weight: bold } /* Literal.Number.Float */ +.highlight .mh { color: #0000cf; font-weight: bold } /* Literal.Number.Hex */ +.highlight .mi { color: #0000cf; font-weight: bold } /* Literal.Number.Integer */ +.highlight .mo { color: #0000cf; font-weight: bold } /* Literal.Number.Oct */ +.highlight .sa { color: #4e9a06 } /* Literal.String.Affix */ +.highlight .sb { color: #4e9a06 } /* Literal.String.Backtick */ +.highlight .sc { color: #4e9a06 } /* Literal.String.Char */ +.highlight .dl { color: #4e9a06 } /* Literal.String.Delimiter */ +.highlight .sd { color: #8f5902; font-style: italic } /* Literal.String.Doc */ +.highlight .s2 { color: #4e9a06 } /* Literal.String.Double */ +.highlight .se { color: #4e9a06 } /* Literal.String.Escape */ +.highlight .sh { color: #4e9a06 } /* Literal.String.Heredoc */ +.highlight .si { color: #4e9a06 } /* Literal.String.Interpol */ +.highlight .sx { color: #4e9a06 } /* Literal.String.Other */ +.highlight .sr { color: #4e9a06 } /* Literal.String.Regex */ +.highlight .s1 { color: #4e9a06 } /* Literal.String.Single */ +.highlight .ss { color: #4e9a06 } /* Literal.String.Symbol */ +.highlight .bp { color: #3465a4 } /* Name.Builtin.Pseudo */ +.highlight .fm { color: #000000 } /* Name.Function.Magic */ +.highlight .vc { color: #000000 } /* Name.Variable.Class */ +.highlight .vg { color: #000000 } /* Name.Variable.Global */ +.highlight .vi { color: #000000 } /* Name.Variable.Instance */ +.highlight .vm { color: #000000 } /* Name.Variable.Magic */ +.highlight .il { color: #0000cf; font-weight: bold } /* Literal.Number.Integer.Long */ \ No newline at end of file diff --git a/_static/searchtools.js b/_static/searchtools.js new file mode 100644 index 0000000..97d56a7 --- /dev/null +++ b/_static/searchtools.js @@ -0,0 +1,566 @@ +/* + * searchtools.js + * ~~~~~~~~~~~~~~~~ + * + * Sphinx JavaScript utilities for the full-text search. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +/** + * Simple result scoring code. + */ +if (typeof Scorer === "undefined") { + var Scorer = { + // Implement the following function to further tweak the score for each result + // The function takes a result array [docname, title, anchor, descr, score, filename] + // and returns the new score. + /* + score: result => { + const [docname, title, anchor, descr, score, filename] = result + return score + }, + */ + + // query matches the full name of an object + objNameMatch: 11, + // or matches in the last dotted part of the object name + objPartialMatch: 6, + // Additive scores depending on the priority of the object + objPrio: { + 0: 15, // used to be importantResults + 1: 5, // used to be objectResults + 2: -5, // used to be unimportantResults + }, + // Used when the priority is not in the mapping. + objPrioDefault: 0, + + // query found in title + title: 15, + partialTitle: 7, + // query found in terms + term: 5, + partialTerm: 2, + }; +} + +const _removeChildren = (element) => { + while (element && element.lastChild) element.removeChild(element.lastChild); +}; + +/** + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#escaping + */ +const _escapeRegExp = (string) => + string.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string + +const _displayItem = (item, searchTerms) => { + const docBuilder = DOCUMENTATION_OPTIONS.BUILDER; + const docUrlRoot = DOCUMENTATION_OPTIONS.URL_ROOT; + const docFileSuffix = DOCUMENTATION_OPTIONS.FILE_SUFFIX; + const docLinkSuffix = DOCUMENTATION_OPTIONS.LINK_SUFFIX; + const showSearchSummary = DOCUMENTATION_OPTIONS.SHOW_SEARCH_SUMMARY; + + const [docName, title, anchor, descr, score, _filename] = item; + + let listItem = document.createElement("li"); + let requestUrl; + let linkUrl; + if (docBuilder === "dirhtml") { + // dirhtml builder + let dirname = docName + "/"; + if (dirname.match(/\/index\/$/)) + dirname = dirname.substring(0, dirname.length - 6); + else if (dirname === "index/") dirname = ""; + requestUrl = docUrlRoot + dirname; + linkUrl = requestUrl; + } else { + // normal html builders + requestUrl = docUrlRoot + docName + docFileSuffix; + linkUrl = docName + docLinkSuffix; + } + let linkEl = listItem.appendChild(document.createElement("a")); + linkEl.href = linkUrl + anchor; + linkEl.dataset.score = score; + linkEl.innerHTML = title; + if (descr) + listItem.appendChild(document.createElement("span")).innerHTML = + " (" + descr + ")"; + else if (showSearchSummary) + fetch(requestUrl) + .then((responseData) => responseData.text()) + .then((data) => { + if (data) + listItem.appendChild( + Search.makeSearchSummary(data, searchTerms) + ); + }); + Search.output.appendChild(listItem); +}; +const _finishSearch = (resultCount) => { + Search.stopPulse(); + Search.title.innerText = _("Search Results"); + if (!resultCount) + Search.status.innerText = Documentation.gettext( + "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories." + ); + else + Search.status.innerText = _( + `Search finished, found ${resultCount} page(s) matching the search query.` + ); +}; +const _displayNextItem = ( + results, + resultCount, + searchTerms +) => { + // results left, load the summary and display it + // this is intended to be dynamic (don't sub resultsCount) + if (results.length) { + _displayItem(results.pop(), searchTerms); + setTimeout( + () => _displayNextItem(results, resultCount, searchTerms), + 5 + ); + } + // search finished, update title and status message + else _finishSearch(resultCount); +}; + +/** + * Default splitQuery function. Can be overridden in ``sphinx.search`` with a + * custom function per language. + * + * The regular expression works by splitting the string on consecutive characters + * that are not Unicode letters, numbers, underscores, or emoji characters. + * This is the same as ``\W+`` in Python, preserving the surrogate pair area. + */ +if (typeof splitQuery === "undefined") { + var splitQuery = (query) => query + .split(/[^\p{Letter}\p{Number}_\p{Emoji_Presentation}]+/gu) + .filter(term => term) // remove remaining empty strings +} + +/** + * Search Module + */ +const Search = { + _index: null, + _queued_query: null, + _pulse_status: -1, + + htmlToText: (htmlString) => { + const htmlElement = new DOMParser().parseFromString(htmlString, 'text/html'); + htmlElement.querySelectorAll(".headerlink").forEach((el) => { el.remove() }); + const docContent = htmlElement.querySelector('[role="main"]'); + if (docContent !== undefined) return docContent.textContent; + console.warn( + "Content block not found. Sphinx search tries to obtain it via '[role=main]'. Could you check your theme or template." + ); + return ""; + }, + + init: () => { + const query = new URLSearchParams(window.location.search).get("q"); + document + .querySelectorAll('input[name="q"]') + .forEach((el) => (el.value = query)); + if (query) Search.performSearch(query); + }, + + loadIndex: (url) => + (document.body.appendChild(document.createElement("script")).src = url), + + setIndex: (index) => { + Search._index = index; + if (Search._queued_query !== null) { + const query = Search._queued_query; + Search._queued_query = null; + Search.query(query); + } + }, + + hasIndex: () => Search._index !== null, + + deferQuery: (query) => (Search._queued_query = query), + + stopPulse: () => (Search._pulse_status = -1), + + startPulse: () => { + if (Search._pulse_status >= 0) return; + + const pulse = () => { + Search._pulse_status = (Search._pulse_status + 1) % 4; + Search.dots.innerText = ".".repeat(Search._pulse_status); + if (Search._pulse_status >= 0) window.setTimeout(pulse, 500); + }; + pulse(); + }, + + /** + * perform a search for something (or wait until index is loaded) + */ + performSearch: (query) => { + // create the required interface elements + const searchText = document.createElement("h2"); + searchText.textContent = _("Searching"); + const searchSummary = document.createElement("p"); + searchSummary.classList.add("search-summary"); + searchSummary.innerText = ""; + const searchList = document.createElement("ul"); + searchList.classList.add("search"); + + const out = document.getElementById("search-results"); + Search.title = out.appendChild(searchText); + Search.dots = Search.title.appendChild(document.createElement("span")); + Search.status = out.appendChild(searchSummary); + Search.output = out.appendChild(searchList); + + const searchProgress = document.getElementById("search-progress"); + // Some themes don't use the search progress node + if (searchProgress) { + searchProgress.innerText = _("Preparing search..."); + } + Search.startPulse(); + + // index already loaded, the browser was quick! + if (Search.hasIndex()) Search.query(query); + else Search.deferQuery(query); + }, + + /** + * execute search (requires search index to be loaded) + */ + query: (query) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + const allTitles = Search._index.alltitles; + const indexEntries = Search._index.indexentries; + + // stem the search terms and add them to the correct list + const stemmer = new Stemmer(); + const searchTerms = new Set(); + const excludedTerms = new Set(); + const highlightTerms = new Set(); + const objectTerms = new Set(splitQuery(query.toLowerCase().trim())); + splitQuery(query.trim()).forEach((queryTerm) => { + const queryTermLower = queryTerm.toLowerCase(); + + // maybe skip this "word" + // stopwords array is from language_data.js + if ( + stopwords.indexOf(queryTermLower) !== -1 || + queryTerm.match(/^\d+$/) + ) + return; + + // stem the word + let word = stemmer.stemWord(queryTermLower); + // select the correct list + if (word[0] === "-") excludedTerms.add(word.substr(1)); + else { + searchTerms.add(word); + highlightTerms.add(queryTermLower); + } + }); + + if (SPHINX_HIGHLIGHT_ENABLED) { // set in sphinx_highlight.js + localStorage.setItem("sphinx_highlight_terms", [...highlightTerms].join(" ")) + } + + // console.debug("SEARCH: searching for:"); + // console.info("required: ", [...searchTerms]); + // console.info("excluded: ", [...excludedTerms]); + + // array of [docname, title, anchor, descr, score, filename] + let results = []; + _removeChildren(document.getElementById("search-progress")); + + const queryLower = query.toLowerCase(); + for (const [title, foundTitles] of Object.entries(allTitles)) { + if (title.toLowerCase().includes(queryLower) && (queryLower.length >= title.length/2)) { + for (const [file, id] of foundTitles) { + let score = Math.round(100 * queryLower.length / title.length) + results.push([ + docNames[file], + titles[file] !== title ? `${titles[file]} > ${title}` : title, + id !== null ? "#" + id : "", + null, + score, + filenames[file], + ]); + } + } + } + + // search for explicit entries in index directives + for (const [entry, foundEntries] of Object.entries(indexEntries)) { + if (entry.includes(queryLower) && (queryLower.length >= entry.length/2)) { + for (const [file, id] of foundEntries) { + let score = Math.round(100 * queryLower.length / entry.length) + results.push([ + docNames[file], + titles[file], + id ? "#" + id : "", + null, + score, + filenames[file], + ]); + } + } + } + + // lookup as object + objectTerms.forEach((term) => + results.push(...Search.performObjectSearch(term, objectTerms)) + ); + + // lookup as search terms in fulltext + results.push(...Search.performTermsSearch(searchTerms, excludedTerms)); + + // let the scorer override scores with a custom scoring function + if (Scorer.score) results.forEach((item) => (item[4] = Scorer.score(item))); + + // now sort the results by score (in opposite order of appearance, since the + // display function below uses pop() to retrieve items) and then + // alphabetically + results.sort((a, b) => { + const leftScore = a[4]; + const rightScore = b[4]; + if (leftScore === rightScore) { + // same score: sort alphabetically + const leftTitle = a[1].toLowerCase(); + const rightTitle = b[1].toLowerCase(); + if (leftTitle === rightTitle) return 0; + return leftTitle > rightTitle ? -1 : 1; // inverted is intentional + } + return leftScore > rightScore ? 1 : -1; + }); + + // remove duplicate search results + // note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept + let seen = new Set(); + results = results.reverse().reduce((acc, result) => { + let resultStr = result.slice(0, 4).concat([result[5]]).map(v => String(v)).join(','); + if (!seen.has(resultStr)) { + acc.push(result); + seen.add(resultStr); + } + return acc; + }, []); + + results = results.reverse(); + + // for debugging + //Search.lastresults = results.slice(); // a copy + // console.info("search results:", Search.lastresults); + + // print the results + _displayNextItem(results, results.length, searchTerms); + }, + + /** + * search for object names + */ + performObjectSearch: (object, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const objects = Search._index.objects; + const objNames = Search._index.objnames; + const titles = Search._index.titles; + + const results = []; + + const objectSearchCallback = (prefix, match) => { + const name = match[4] + const fullname = (prefix ? prefix + "." : "") + name; + const fullnameLower = fullname.toLowerCase(); + if (fullnameLower.indexOf(object) < 0) return; + + let score = 0; + const parts = fullnameLower.split("."); + + // check for different match types: exact matches of full name or + // "last name" (i.e. last dotted part) + if (fullnameLower === object || parts.slice(-1)[0] === object) + score += Scorer.objNameMatch; + else if (parts.slice(-1)[0].indexOf(object) > -1) + score += Scorer.objPartialMatch; // matches in last name + + const objName = objNames[match[1]][2]; + const title = titles[match[0]]; + + // If more than one term searched for, we require other words to be + // found in the name/title/description + const otherTerms = new Set(objectTerms); + otherTerms.delete(object); + if (otherTerms.size > 0) { + const haystack = `${prefix} ${name} ${objName} ${title}`.toLowerCase(); + if ( + [...otherTerms].some((otherTerm) => haystack.indexOf(otherTerm) < 0) + ) + return; + } + + let anchor = match[3]; + if (anchor === "") anchor = fullname; + else if (anchor === "-") anchor = objNames[match[1]][1] + "-" + fullname; + + const descr = objName + _(", in ") + title; + + // add custom score for some objects according to scorer + if (Scorer.objPrio.hasOwnProperty(match[2])) + score += Scorer.objPrio[match[2]]; + else score += Scorer.objPrioDefault; + + results.push([ + docNames[match[0]], + fullname, + "#" + anchor, + descr, + score, + filenames[match[0]], + ]); + }; + Object.keys(objects).forEach((prefix) => + objects[prefix].forEach((array) => + objectSearchCallback(prefix, array) + ) + ); + return results; + }, + + /** + * search for full-text terms in the index + */ + performTermsSearch: (searchTerms, excludedTerms) => { + // prepare search + const terms = Search._index.terms; + const titleTerms = Search._index.titleterms; + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + + const scoreMap = new Map(); + const fileMap = new Map(); + + // perform the search on the required terms + searchTerms.forEach((word) => { + const files = []; + const arr = [ + { files: terms[word], score: Scorer.term }, + { files: titleTerms[word], score: Scorer.title }, + ]; + // add support for partial matches + if (word.length > 2) { + const escapedWord = _escapeRegExp(word); + Object.keys(terms).forEach((term) => { + if (term.match(escapedWord) && !terms[word]) + arr.push({ files: terms[term], score: Scorer.partialTerm }); + }); + Object.keys(titleTerms).forEach((term) => { + if (term.match(escapedWord) && !titleTerms[word]) + arr.push({ files: titleTerms[word], score: Scorer.partialTitle }); + }); + } + + // no match but word was a required one + if (arr.every((record) => record.files === undefined)) return; + + // found search word in contents + arr.forEach((record) => { + if (record.files === undefined) return; + + let recordFiles = record.files; + if (recordFiles.length === undefined) recordFiles = [recordFiles]; + files.push(...recordFiles); + + // set score for the word in each file + recordFiles.forEach((file) => { + if (!scoreMap.has(file)) scoreMap.set(file, {}); + scoreMap.get(file)[word] = record.score; + }); + }); + + // create the mapping + files.forEach((file) => { + if (fileMap.has(file) && fileMap.get(file).indexOf(word) === -1) + fileMap.get(file).push(word); + else fileMap.set(file, [word]); + }); + }); + + // now check if the files don't contain excluded terms + const results = []; + for (const [file, wordList] of fileMap) { + // check if all requirements are matched + + // as search terms with length < 3 are discarded + const filteredTermCount = [...searchTerms].filter( + (term) => term.length > 2 + ).length; + if ( + wordList.length !== searchTerms.size && + wordList.length !== filteredTermCount + ) + continue; + + // ensure that none of the excluded terms is in the search result + if ( + [...excludedTerms].some( + (term) => + terms[term] === file || + titleTerms[term] === file || + (terms[term] || []).includes(file) || + (titleTerms[term] || []).includes(file) + ) + ) + break; + + // select one (max) score for the file. + const score = Math.max(...wordList.map((w) => scoreMap.get(file)[w])); + // add result to the result list + results.push([ + docNames[file], + titles[file], + "", + null, + score, + filenames[file], + ]); + } + return results; + }, + + /** + * helper function to return a node containing the + * search summary for a given text. keywords is a list + * of stemmed words. + */ + makeSearchSummary: (htmlText, keywords) => { + const text = Search.htmlToText(htmlText); + if (text === "") return null; + + const textLower = text.toLowerCase(); + const actualStartPosition = [...keywords] + .map((k) => textLower.indexOf(k.toLowerCase())) + .filter((i) => i > -1) + .slice(-1)[0]; + const startWithContext = Math.max(actualStartPosition - 120, 0); + + const top = startWithContext === 0 ? "" : "..."; + const tail = startWithContext + 240 < text.length ? "..." : ""; + + let summary = document.createElement("p"); + summary.classList.add("context"); + summary.textContent = top + text.substr(startWithContext, 240).trim() + tail; + + return summary; + }, +}; + +_ready(Search.init); diff --git a/_static/sphinx_highlight.js b/_static/sphinx_highlight.js new file mode 100644 index 0000000..aae669d --- /dev/null +++ b/_static/sphinx_highlight.js @@ -0,0 +1,144 @@ +/* Highlighting utilities for Sphinx HTML documentation. */ +"use strict"; + +const SPHINX_HIGHLIGHT_ENABLED = true + +/** + * highlight a given string on a node by wrapping it in + * span elements with the given class name. + */ +const _highlight = (node, addItems, text, className) => { + if (node.nodeType === Node.TEXT_NODE) { + const val = node.nodeValue; + const parent = node.parentNode; + const pos = val.toLowerCase().indexOf(text); + if ( + pos >= 0 && + !parent.classList.contains(className) && + !parent.classList.contains("nohighlight") + ) { + let span; + + const closestNode = parent.closest("body, svg, foreignObject"); + const isInSVG = closestNode && closestNode.matches("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.classList.add(className); + } + + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + parent.insertBefore( + span, + parent.insertBefore( + document.createTextNode(val.substr(pos + text.length)), + node.nextSibling + ) + ); + node.nodeValue = val.substr(0, pos); + + if (isInSVG) { + const rect = document.createElementNS( + "http://www.w3.org/2000/svg", + "rect" + ); + const bbox = parent.getBBox(); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute("class", className); + addItems.push({ parent: parent, target: rect }); + } + } + } else if (node.matches && !node.matches("button, select, textarea")) { + node.childNodes.forEach((el) => _highlight(el, addItems, text, className)); + } +}; +const _highlightText = (thisNode, text, className) => { + let addItems = []; + _highlight(thisNode, addItems, text, className); + addItems.forEach((obj) => + obj.parent.insertAdjacentElement("beforebegin", obj.target) + ); +}; + +/** + * Small JavaScript module for the documentation. + */ +const SphinxHighlight = { + + /** + * highlight the search words provided in localstorage in the text + */ + highlightSearchWords: () => { + if (!SPHINX_HIGHLIGHT_ENABLED) return; // bail if no highlight + + // get and clear terms from localstorage + const url = new URL(window.location); + const highlight = + localStorage.getItem("sphinx_highlight_terms") + || url.searchParams.get("highlight") + || ""; + localStorage.removeItem("sphinx_highlight_terms") + url.searchParams.delete("highlight"); + window.history.replaceState({}, "", url); + + // get individual terms from highlight string + const terms = highlight.toLowerCase().split(/\s+/).filter(x => x); + if (terms.length === 0) return; // nothing to do + + // There should never be more than one element matching "div.body" + const divBody = document.querySelectorAll("div.body"); + const body = divBody.length ? divBody[0] : document.querySelector("body"); + window.setTimeout(() => { + terms.forEach((term) => _highlightText(body, term, "highlighted")); + }, 10); + + const searchBox = document.getElementById("searchbox"); + if (searchBox === null) return; + searchBox.appendChild( + document + .createRange() + .createContextualFragment( + '" + ) + ); + }, + + /** + * helper function to hide the search marks again + */ + hideSearchWords: () => { + document + .querySelectorAll("#searchbox .highlight-link") + .forEach((el) => el.remove()); + document + .querySelectorAll("span.highlighted") + .forEach((el) => el.classList.remove("highlighted")); + localStorage.removeItem("sphinx_highlight_terms") + }, + + initEscapeListener: () => { + // only install a listener if it is really needed + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.shiftKey || event.altKey || event.ctrlKey || event.metaKey) return; + if (DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS && (event.key === "Escape")) { + SphinxHighlight.hideSearchWords(); + event.preventDefault(); + } + }); + }, +}; + +_ready(SphinxHighlight.highlightSearchWords); +_ready(SphinxHighlight.initEscapeListener); diff --git a/cpg.html b/cpg.html new file mode 100644 index 0000000..a685340 --- /dev/null +++ b/cpg.html @@ -0,0 +1,150 @@ + + + + + + + + CpG Module Documentation — ensembl-anno 0.1 documentation + + + + + + + + + + + + + +
+
+
+ +
+
+
+ +
+

CpG Module Documentation

+

Set of discriminant functions that can recognize structural and compositional features +such as CpG islands, promoter regions and first splice-donor sites. +Davuluri RV, Grosse I, Zhang MQ: Computational identification of promoters and +first exons in the human genome. Nat Genet. 2001, 29(4):412-417. [PMID: 11726928]

+
+
+ensembl.tools.anno.simple_feature_annotation.cpg.run_cpg(genome_file: PathLike, output_dir: Path, cpg_bin: Path = PosixPath('cpg_lh'), cpg_min_length: int = 400, cpg_min_gc_content: int = 50, cpg_min_oe: float = 0.6, num_threads: int = 1) None[source]
+

Run CpG islands on genomic slices

+
+

:param genome_file : Genome file path. +:type genome_file: PathLike +:param output_dir : Working directory path +:type output_dir : Path +:param cpg_bin : CpG software path. +:param cpg_min_length : Min length of CpG islands +:param cpg_min_gc_content : Min GC frequency percentage +:param cpg_min_oe : Min ratio of the observed to expected number of CpG (CpGo/e) +:param num_threads: int, number of threads.

+
+
return:
+

None

+
+
rtype:
+

None

+
+
+
+
+ +
+ + +
+
+
+
+
+ +
+
+
+ + + + + \ No newline at end of file diff --git a/doctrees/cpg.doctree b/doctrees/cpg.doctree new file mode 100644 index 0000000000000000000000000000000000000000..f709e61897444cfb684811dc14b9492212ae3ce0 GIT binary patch literal 15475 zcmeHOTZ|<~d7jz1pP8M#*lTRrOWGo^Gh*h<&T8@HV4Fm?Vv%JhW=X&ToK~OiI;Z+f zpYEnFyEBM2I2MUlDk*Z@mcs+#i6lytUmOwBoigfOzD@t&@(`fv6BU;Wkf*Jl=9<&VwC|HPR%e9|92RF{*$M2l z&-^5NCEI)w%Mc%y=s2Y{~I721Dk5pB<1anx3D{l$?v91*wvZ zpA#!)sRo}Di@EfBV%~FomhGi&OEjz`iQIOYKx@)+&UIqaXvy}hI7TCWFZfnp{aSX? zuzF})_I|`V)F%~7iPfc789&4C=WF}{KF2SL_wDeY&vv5J_gS=aD~R@Ym>;u#+uOE$ zKNx&~uow4%_xQzZ@+dbZSxti;Q9_bs2NS!lm7;!<`2S1@4(+X@plP-o1_7Z z5V=zB4KW{DZj^~f`qIYlHF6=ENf2PtNR(#m_Ct@E9cCqI#7t^Sg|!4-+2vg~4{D;5*WWM+z>D7#_CBt}un)HGP%OuaO6jT;}{GM{r z@OB+IjoWc;Iq{@a!A~-3C`Rmn7`r}HV+K$A(5=gS_<7UVgRW0ApCwJ>%H_+uTgH_~ zH?D5BuI^shzPkHx)A-mk*WdqC%h=t0_{u|%UU>wrO7VTqTW0(P&6tB90_?XH^6W{s zwT^@bipTfyi~I=y%xn>t@bjiZ`vR_y96tyzi!q`LkS=})NM`~sHa3k7IEccGsbg*v zNHs0aG;_|`c)WT2&4M?T9ujwE#5@*cy9PPMIy!?@7jMki#kxa~UF#$MwU`GLm}bZI zSj%`mh?~z?3IBk*&$f&pO%VE~<3@NBqS|#gNZzVC7yp=zFa=v?$YB#*mmrH(5pz+e4&w^3>wZ=+W0^WiGQKCvJGw zmdXg0Yl0}BD+|A%v+y!mSebX37>rt$e~RBGGk&@@OFMP{9sQSvfsyx!39 zx;4t{YdNpKD3)NcJYaTg0@gz2J6LMX1ME9$vz6}!?x~HabpFB7a?}ls4Ib+_LEm!y zOq>c2v4cQEau@=I79><d zmSVX_^Zq?p<~!J}4Q3;MbCiFu!G5((Q2_w2f#54}q(3iBeYUfT!LB30r|FNPx)=_)+=_!9}gfe+5QLc~pdX~R*w>y;cFbSv?iXUs$*YqlCtvVylm5XW+vdBt;sJ6t2*~be<#IMQ)|4PeJ z%myP1UGIxDwTkckdxrceFPO_w_qcvvOd_g(0jPKQu#l$ zD)aFe^KTe5$)ff@dg9|TCMSMuH2hRge7xi2#4C)M!**6#X>?_i?f)d~)nD9Um=;OYWPnshn)Da@bD*k;^TcfCw?M$_?({MFAE-CmByba@0iq-U)F1;Gv!3^ z@P?MY79J*5;oDjkN5F$3J_rw|-czCj{j4J8-?bc00uGA(NxNe!x~X8ch`Px0Shm zQ_pmIEXX-boh%p-WWr=&QiDFB*G*^8iO}E!TKZZvm{f(2YFQkC28#F~8qDE5qX-=N zyK(`p<#7@`Py(C;5AGg!;xYmTtF>N*QUh(3axZ9=I|2@FW6&gU@TYp>e( zUQc|y_vXYaIGAGB@FhLN>7n3cyN17&#-AuHnADX2tk+Cu%87vBhg$ktAedBz|I)HJ z0tgiGK_HmjEg}ZLsyO+vmi|dVKrx>f1oR!neSLh+a83GzVwUGbc*NNleY)T;<5O^c zB3V01Qzx?#!?Cm<*FPf7mj}4xz7xxrm2ED}YghdV0z=FN?cU(Ag_25?f=(tYCUlfb@g-WSR%pv8Y)8^jpfG(<{q~_432gGjB+h!jO9H<5$CzN*s?L5_iqeNod1UUO$VHy< zVpc3VKfwZ1ln&%22{i{TiYtDr{9y6mjnuD~U>QMP?c~}@D^jHzAZ7;C*P5CjgrpB{>hc68+8LxS1maG6VT2!2cLM?;pK@2)I zX*ODP#8>atGU$+kYD5}2iR$DF6h49?MyjPl-3aD7hz=#4oXkK^B2$o{Z3HSxFrLcU z;-HhXfIU$VjHZa1KUH>zn1+Op)rF_OSw2RPMCm_s!wZPeZ6f^0wXemf+$vPH1k?GY#o@XirD4*8s=87@}a|pF<4+JA1aoM;;~v2UYthi-V44BPX;k2|R^;iMq0HEzKLcS3py8i)1fiMc>t? zuF7N-URCmr!%2)XoVhr~|hIZ+-eMouBg>Q+wlgRRMaeyus zm?-4$qLftKa#=`lx5LY>&4@#yY@pUq>_+dK#uI>EJ?1>fB1?E)+cyKJ7ekWEx%=SsGp%_o$h{wC_nDgeWn;B z?^i9%W3t7(w?4DX&3C)k?HzWvZ4@^MzydAl7-vvynGe*T#q{T z5P52;$iJ%~k6^XPW%pUsbXn4oJP`IfJn4I2wvt$FM3IB4$!p8vB7CxMmf=|{kQdJ0 z5ohB=?8XjE?sjqKpv&RE^Ikx%za~p#)OI$8q3)`c%9z;cS{}@RyKNV3jxud*%OVwT zu(C8E3TyV$5TH#L66Gz!90%^edji|_JMe)57|s(^#A$n|pW7$r#cc!?jdWLVKZDO; z_vavl4nK>eBj%WYlkOafWd$dQ zU$`Px9l4J-)yEvE-8l#a*Ghn@0B)2N5on9^1Fe)?%4SgOln=-$@ij-bFHxiV-J3&< z_h#_FSgcSpEqv5TzPJBH`Z({T;&k1GrA<%UuDU8mVWV0IsfvDT^6D+B9~>4g-){$A85OeY z-9wFK@09_HD+O0M===bEEILs_tK5ZQTKOBS@W4?!NC_oT8fyoh2e*e~VJ%&HGH-tc z&hXjn1~36%Vt_92tr$_D7?yB4(7akUOGjRHecMYN3Y;!QXu~1I&%u$Bm$cpdIcEGG A3IG5A literal 0 HcmV?d00001 diff --git a/doctrees/dust.doctree b/doctrees/dust.doctree new file mode 100644 index 0000000000000000000000000000000000000000..c2bbc5304aef94069e9293381cd87d184f69a311 GIT binary patch literal 10197 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 literal 0 HcmV?d00001 diff --git a/doctrees/eponine.doctree b/doctrees/eponine.doctree new file mode 100644 index 0000000000000000000000000000000000000000..f590611432a1d366464c70a00211111db478a782 GIT binary patch literal 13349 zcmeHOU2Ggz6}IF5pV)DlM3f|D3Y6GtylbaPNu4whB~_tmOq51Yp_b9?%-y}So}HP_ zPi#xHP?eS#-51oUN*{nHio^p{An^iHsYF3SNPq;q01_b77oeE#Cd3-3QYApa+3eV3c|Mny9W+cB6QiE+cx!xpoH==o^j z>FCL5UQBq}y6=RZ&LS~@7CJXA!((>zcqC@1d0<+8CFwurGd(aJJL}Fz_$VKHJeubd zVk9sFixsNGu?JkoHf^R{b&Swr%H?EqP0FBt=r(+VZIC`Yw0<^<^&NFJXct6$PE4rT zboh`MO=htwhAoU4t%fyCOlm>knYA#$>}j?`rs31f#&k>beH7yNh^@8aU*ksT<{vdp zU-MX<+Js^(&>B<~@mYS9PxE7Zh#wc1s@!R@su$We^Q!BPw^n7g&ssHWQL}BQ{R7JS z)mX_Yiw#rpe9YvIEBnG49}pv^ZLp1k0b|?p4?uH%CyezW{JRVPPT=1H%>st-OsV_4 z73BZzy%gQw$bRyg-w{(`;Y&OqV=g z@dM2Z6yJnbD)ToUd1PVIw3U|DYH60K*-C@iP79KJ_C&~Rot;$H&44Qn2V#Af>1N&3 z&0tf}Y(rriI@hjJ~fIn=m0p6T203fM` z>7m9&v1Qg|^-0AJTWY{PrWyW z@sl0fSGi01xgM-zhfxiE=J{C;f_to2FP&YydhzFM{PuWNRtsd+_xXj(pZEMrBfTaHFkTdLf5-+c?p;ss^Z!4@XoSq+G3 zX=U2R(GDcty73WlW>0RL;OJg^=OAG927!4o1+Q3iu~#FV#eSNC+;qur*0ztC*l1ZR zzN^t5bR1n^`kO2w>}Ucr>d9v7-5yI<2IVeqLN4a^m7FSsO1eI6Wx3U#F0=YLSv@xS zI1SWkZT@-wB$@ULxoP=R1kX~tgHk)%_h28xJlfL~9PZHt1oeA?+-D$X@f)LLX4HZ~ z#o;zmEaQ-W-R&pLYQs|M-`S-o`C>j_CZdNy(mS)?*DOZ(*HZ&TFK07ZF3jX-rQ^`ipss~hpx)H1khRZB z+~$X_>v)0cw{U0nMCi~>?iMmt^QXnh?gc46n4cmEQo9`<<#gr?;5(l7Nhg{YL)k7SuVUgVkE+Mbo2j|3-9g`iSQgTc9o%K_Lb(^-DAdE%utiir@su< z?ANOEi0%7|6e{|i!sXH-dO$@iy!m=@3UeJ7G-)Jt zsmVj?dg=Jh-)x`a&bSdPw-?-aw(UZx6FT0Wd!!C%nkuN3+O(}Kx8_=@HG2S51D*N- zsLgWW-2o~Qz9T?=xm1IHqTq?g50{fl9XG@3Z0fDjbb_g7i z&roRuC11H4@X~Si0u`|meM3cgLvecxhe=bV!>O9xx#JTr8FX;uU&WPL@}^XH_=w-w zJcegX+b}8(CO5Rr zFOkk2CczFmW{-iLRk>-hbsZG4NX(``!5-3i+eOAsY$dw*PH(mESL18z{DpNlEFavI zLzZbo{24KdUts(Y87k&f(Ys;u<+eG+EQNyGJf;zs3Un|$ZA4;{-ppWiaCM^ghsn{m zcDc^q;G<%^9$J=sy@9rqYT)SPm4P2MUnM1nM5c$@7_)0>hNi25BnwFd@d&5G=HA-ECU1zoY&*Pk#3f{ z-S&(4`S{%mj*T}#VuNlAn&fq>`4`9%V+btyy4CzEeac7a!uOc%#H`0HF`fJ*QsX8b zw`Of8@oqmUBJ@_}{E32joMUnz>g91g&(DiviEk~&p}Uw;MB}GRmU1Ywb}4bFy`7eF zENRF|#NAMAc78HuYi>J!6;L(fq4JaBkYvzVa%dGS!3L-eF%NYl0Q1s{t_+CDv<)-x z8Pa%zVg~#@V!5grr*%3liMg#}+-CtX3qk6gBh@8Kx9&+aFd{MfX}U`-L z_7g>zqILre$X0}s8De9)s_wLidF(^v(YS)HC*tVmjD$<6SO^`8{G9sl!;`p|j zZ6caShY=PtvE0ty$J#5lbruI`4n7P8JajEdpxJL}b|cgp3>K%1y$@V&aT_4o@eI{q z^t6p(h&8+_MiF3jq(E52G~l5~svBUki5V>n95pWz`;csLQ6IKkHFG=|RujhoGPT%KdWnul024G;>?O+0pS+JGlC#^P0~y<%p|e<2<0yf0y+`3!3vW!14}*y(tGv^7oC%vMbKy)a74>& znL%{*zzH$qGFOFB7-A8r5`%yl;KJXbI|YY$9}fc8U#V76>{nvma>el))kqwsmQn$< zR09U)H6o7Q+nKv~*V1X&bH=Od+r(2zF8(8_cm%6PF1yCOiphey90Orr zLlhZ!OTRKMj>9KgY8IZ^1QJTcmN?*V+JUyAa9N2>QIJ#-q;R7i!93-gl z!`ilXW{aE`jJP-&iOs(j!Do>B4TSI}RNxHMh%IqgN2@iJflOhkpvMusLcd#LF8MnJ zIIC5UVQotcG5aR{Re%_e;RNvuS48%a`xiCdn#$SDK`FRa091wB;CYHbTO4dFrQMn= zhO~P2LAz1<69Y6Kqr&)i^B+ik%{TFXzL=n5N`TZzR&4qFPB8psJ<{5F5YI=GeRBS` zwtaJbUhZJq4iqD%kDM3XqBO1nRPgr+??&o<8&CK#UJu3oqAN?=?g#%p&Z@9?TtbMI zwu=|BSVCbYOX2#hnqy_rAqx*}E6iF?v`L&uN0prpw#k>2e#&--x64Xukm-S^x)Tyw zf;gc&pzX`;6LRXZC?mFF7 zJ=Il}y39@kMsb84k2n%SDT{<)B}fTx1VOlk%Uc8}iFn`zag%sJ!U!G+4|(7L@%`u2 zt-GsF*YpEsku8n4>eM;^IsbqD|2zLV{r~6F3va&q@j3AyUk`oDc8{BeX}X@t!h|oI zUOVnHH%dO2Y`>bkl5Fvnz_=TFanNQ7pF@qdWjkiT+~iKe*Qk1AJ7F_zzZ9}|WP5Jj z+*+^}t))B3mbJncB0F+e=@Z|0hPf@r2qW!T&x{?WJ)L%M2qM%F?asZ(j%h&Cs=t=V z5ij}%#up{lCBCBP3|VLSV#>z>Kj+vkOAg|e!5c;t1$HZrz(4VO);2@pZK;icg($@H zf@}2U)3O=+#Y@X*9|o*Lbz;608D096SnJmP)~fY@b=KP8Pw!b?pX~*)>#|_)t`{8c zF*juWma}WPt~dOG!G?QskbB)!G|eCcD-Yf}6Su56zF@m1J1)skir4yn4BdJk#PtLC z`vCqn@wZKEKoWs12EWD6`Gy@N{KI`A?T=~cNScx7VGe0LO+WA=X1hAQL}D76*+>%p zh-|of%68V`L6jJ=^^mn&lFV05BbhL0@A-qs^4v^fdt%UgLWtvoF2v^#_DQS|g4@-+ z&S`nJ9)y-a30I(0MmI2gt0er}pP!$bgAP9_bl5f_Yr6wsYnXG-@w#3dYLFh&LiVYc zxov#0T`KYVc3U%z$Y>c*v1a2r)WO&yi)n{!pmmrL#Q|!gtRRoZQK)qsc5Jt7$BqVC z>vvX59sKhz>4JPb8d(2RCF##iPHv~-k%Y>c7Cj+m?6wV2zW{)?en z28hMbx1j404|dlDcWuLs(8P0K_?~M71FelQbcu@>Ej!fOhHs?9>l=r}aikgAk>SKf z3lcfi++*@WN0t z!Fv#5oIY!#W-}4+aqZnX`oBC!DP{u}o{)ffAPml!2xx>NKWuGSj{_3tGcIE$}jttuo3TuQ71Ih_2 zG8{4kSXv)1yR?G906j;8BBK|WUqtq5+MN!g^+#*jp6x=-`!LHkD%d`wMlh7;OL~vN zkl6t?9Fy8tS~A)2h|-Gz+hN1&L|`u<<~+AR3qXU<0_q(W?S{5Mh7^_tC=zBT+4WkH zVY`joL~T^>T7Vkc1r-`xZjGc$=t`^$p=JA$KxT=CgVAGg3ywqu3{4DLfLqWPoIAr zZm$m95^!+n61q_+uH8q+5sF4;kIsJtG6m9lJ@4b zsm%7{)&kFVKsC2*Id+}8T>&F+OoovyejduU>%--taqOMr-XQK5t*?<^|hU?5RF zpSIGJ@%u*Ri@-5&C#;cH1ASB_FAO!ybaJG$P|81d_zX@mqP1`4Xs0s44WD&ue*KTB)ypRP}Xtysy7c z`}*U|KjPBl%7EU}t;QP4L!AL{y24pv$5J<0viY2|rI~m2^6SQ=H@kM_Pk@>5V14c{=Zk(0i~idpw}& z{tpP`-*KEeyl?;WNov7{>y-{HGxYj82>v$o=l606Uo870xwN;eVh$Qbjck_7MY*_p z?*+;!Bwjh}-c>ZhfWDm%s9JA(n`+{JGbR%#Zbtkc3gVTD+IvJz{OvK~(A120A*hnF zemCoJl5X~%QFmFIyRv%r=FqHA&)yk&CG|bEZuXX_>A1f2o_j^K4#bAJr*je1j6J5j(_hL%S_J#ELnQ2Yi{`r`;QR&jHC3~H{9RU&G+V5+|sf_X?Om)F#iMJN`ysD(H1fRMr{Iar(366{; z-Wvj+2TR~HW>Be3TG#lrYK7Ikr5xETa3qI43mjc9{a!c;h)Pu|AZWexxePvI<%IzL zKq-I;u=BfUR0npxsU}_xJ1Oz0u=Cey;?;JM5}y%v{#o7SI|n=eBqpR5?9>(Sf2(;_ ziMJN)te#UjBudz+%fk05yO;nwlK3#}yr%>^B@-(EXL5zY(zcYNnFVU(P-lUfD^;-w zV;;@Y?jq1S2b86z%Fp?6V3L|&a#H;l@C0@YDDGmrdb%(Qp z$jk?Xhhi3LVMkq=o~T(=$+Q-B{Hl_^5-cG^zs;f2Ss14G}5vsSxqDns~K3 zr^HJTf#5DFqKe-T=vyJG|5A52Gel4?v;2neJuwTlAfm2JuPmsR{|WXbiPwUN_bcfu zA)+n|*OgtUSs2>YT&oWF%j{{==R#i|SB_*BFp)B-4JPV}{Jnh~8{0Y^N9%cn5?&Em zMn}ZfZy}T;4ecuhqRH^afFaSz4a*1e=kh2>YuuFN$3iwgqm<30*qM>w1b)_Q^@by7 zWIwZ5(@$eWV^Ikun@$5i-#aRQAM1YC4$d@~@3X|TOG{P^vj(HZP zGKO-k9GJPaEkaR0jr1ZBFp24Tg(5VtL}lT)IF>-VO*v#Tm4A_c^so3y_D7Ey5@V50 z^h}lgd7jWU_UEfWnIb&Ldu+vpG2Bj^&-S+UwawZq?F}= z2yIBxLvGGc)oh_IB3EQ?r${`6GoWp~Bm!My)=ef z+d>dG@-K3J#zMcJHID6m+@}z5M1*THB0O)9cO!oPc>(!Mcagt4Je0B1AbEmPUAeS} zQ&r3RP5IbIRuuX%^O-5_kJ9jUl(bkNGc`q|cNSZH``t+&jrafmJn6;y^JM}Rk?CDG zaq(wm;$rWuw54jTAYlEX1Xck=88F4I60{0j6~UmuKA93b3aV+yXzvd}i!T9qMaXFH zkLXoIk(b_=Tx2a$j`;~+O&j!)VvPnY{@B*M_$TaQy$pMloM4B{tRfl+O zq_1({;Ozn}YjpVleMNT*ayt0sj^{bqTjV6OV6%AK#ysI^iG5WBrh-#5a1wt96~$88(8BHY28zH~5<~@p|#+n^Ro!yV_3h&{8 z;g32C0x!^IB0P3Li!@X?7JNNjD+?+Mf(kB@82K_nqW4`gj5SGjy!8XaA4VGUi^Kyo zEJQMp?}${F3l5SPW24I;adPL*;Q9=H9~NydFm;nrv^ctYFW8~MXEy?V zn>4P`6FNcS4_zOC8768bru;na8OdLvqL;*eLi!4@g1#Lk&tBZ*Yd-UJ2!&Ft;YDFg z2)6g3?-)B72Y-(hMSi%yw};}eDesJEBIkH7;a91q7yxSO5$j`mB9V#2{M`>+{}AN4 z7IfMpZ3<|0hiCZV2X1H|am4sg&DkYa*6oXnPf1wQv-RXkrOH?SIdw&5N z?|l>h3;7Ba(-KIP#D|m6dLM375#O<}J&FrJ7Sq7>BH(It=k=)A;|%RN7m(-fLAz-o z|HvX-g$;hMTzhh>e7nN2^_iGoD66lK=Y_T{?}#CjktKvuSv@&%AJF!Vd)1@nf8YZEA3XF17+58_Y ChUnS= literal 0 HcmV?d00001 diff --git a/doctrees/index.doctree b/doctrees/index.doctree new file mode 100644 index 0000000000000000000000000000000000000000..3141c25d7f66f2448ace1ac19f098d452e51e817 GIT binary patch literal 7476 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 literal 0 HcmV?d00001 diff --git a/doctrees/minimap.doctree b/doctrees/minimap.doctree new file mode 100644 index 0000000000000000000000000000000000000000..0908a6501ff4c5d0f51d40e0fc1c9df8dc0c343e GIT binary patch literal 14285 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 Xp6$jB3ZNE6>U@KcKLts>?W_G40rscn literal 0 HcmV?d00001 diff --git a/doctrees/red.doctree b/doctrees/red.doctree new file mode 100644 index 0000000000000000000000000000000000000000..245f8d4f6079bc61e49b2e4f3f44ac1fa63426c8 GIT binary patch literal 10722 zcmeHN+lwSu8K2qNx%BK@b|#xKGTB%`;`ZQn_wJfaHj|qsVhrmJaTN_pD66YZ_oOY_cL_vSwscUyn_x1#p z2nIIOb*|s}o!|M+cR4T2zWkf5DfORRjRJ0a`%S~LJl|qbA{Q**jC;%z$*pATGs< zx~zr9jmVEflO=KrElh5^R>-{MxkRo|b78wtGwVMeF;m#SS9IsIe2&jQm(+Pp&I((& ztWqWKy3Q=^ns3D})83uUY^eU!2VG8nknNK!V_LqLq;k#$2BZ=RUz0VxSO%YwbD8uz z@}z5fEZK?MhFmm+2<>((uxeW6jBQ1muDlYwD}iM-HL z7(c9KLNtZ%W79~KX2=3&2%UZlg*{5FM7Gi{jfs2kxgC)hF@HO6RDgKpI6y?9*$NH> z_q`mTmJ+n3FdGt7ffXEV6Mk5-*VX*ayu$V|$u90+_X#_?a1jgj9(PrRSSF;8Bg@*0Xhh+$3(eSLY1l7##Xhtmj z9xyiz*FDgDPcuBoFYJ(MUFLy6&Bdqeuxm%>wf8nZ($pZ(Hnp)m!Ccoy8*yHPz*ZB8awIEz7r?e%NhYywJRO@yY|O=;Ea-mmg}NQRBh`m+x;} zPSP{K@$CBlaWscv+iXjpOtvg}GW4#u%+* z<{)Go+6li#=ly9~M%-p2+f$>*`C0xLwAys89B}xW=@paT5hMHe>$JHDhYI(Id<^PU zhq9_~X?5GvQiV0K0@#9DoK(3rvzd}3m0Y%WQ}QJ4P_wda`PDatixM?@WaFw3aoD%D zLB5Lg$m<>3W!u`P14D4vZa1I7-}9Ouiy#)dWrssm06=fs-axtbsP>E>+56PJeh!M` z+}4)Xcua$$%+BVNTv9^O;Kz z>YMf5c(whWyB!4vSttwW60vZPB}BT9gKT@*mHg#5>P=LV3#UWf`8BmMgS#?ckdSPn z4Ox7bh<;%lq6>s*3g-e%FpMOZ{3U|z^CfKjb982vRO?DAx-EOS07KV?nNlIm$Ntm& zEqI$Arb3Xa5Nmxx5c!KAYJDHqMP-*V3w9%GU9R;{qvx*z3zvj-ELcvqm&g;r0c>6r zh=Ty10d zK2mI_hE5RZ2ZcaKGuGK0KlsmvFac%r!GBQ>ek4Vmt?`5Zc4%;LG#|VKszTF0<};3B zr9-a37_h3oSB04TFC{DaYp;)w{O?E5%z04l!z4`07XEt32A?4_D~M@FSQCn1Rr28s zsvbG>itmzk`gkOdrrk%?a&J$&-uS_frd>ApZE5$3@q-^tyKL~+NxPTEPx)V`-J#lt ziD)+|s;`b;;#gFtLM>xY#)MovGP6A`~k3Vvtolycf1y5*d2Q|o{u-Z?3!T_?mHiLt z7Iop9L^%;9PJ;xy^;uYssx4qPu!85wBv6)p%0$ygP_7a;&x0Cu z{?6ROkQ>)ykAipp@V~vi~Qg4dZAt~ zXG;U5HM!WanQNswpwxtUI0cymRbM&vWmVR7(8pVRCih#T9PVmS3GoMx1F`ddYQ5>~ z(4UkWWFi*}X#3W|kd&xC)dmfj7`?z6sXyHotT)`f6*AHq4ecovG*+C_$meOQ zrPkq!t+*H~G+Z6Z(f7KQL1mw(n=!Gkti)#TSlEaZn*e`+$%dTOe*eO)io5AhO_j}P zvo^eha{9sc6}>T#1WDPy>GagxV^4{*n~KR*Q^&=h{Jds*vc&to(!V0OKa8}Fiti&} zZ^HaIsDkdqm62rC4a+dD7L{xK5=k@Z33oDxzo=wC3Sz3M4u>{x8YOlq#9*)61O1AU z;NJ%H+02(9lu2Jken;FekQS-1x*y=e+sM!@zROkpbO4L-(q_>9cqFt`GXU-S5we!^ z4|cdcsy{j|s$++AIwbL?V@@!tkv1j0cALPy^S-p{)2gX+4S)L2Pu;m*DUYp^?#AhH=!T+F6g$j1sl{tsb@p{jQc0sEn?%<=UO36;o978hPznji7dW^H} z$R^6brWG6u?D4z(6aiA+tNiScu{EqTop-2Csd1AVJA*RS)0i7fDa0`;*FRvIWsy1O zAuL_a!+cYbIcJ+bRp7buJ?|mkNcrtUxs?5+^z{M0S3N(osiLfiw7Rc|L5cRE_0;(z z@-8TjMrs>2@;3l!q?P4~a@8hJ7WKC=@+3OVvB)WQf(ZP)l(-S%Sxet*ySMi2ccVrDD&%9%NAQjCbVf2Dz2N@Ris)HP_U3@NP zpK<8oYne=Adgws4m~J-R1G(PueSwz(tWtS(S}xPO4=?WN`;&phD!sksuD$M+WxXAh*)g-I`VU9b(-x5 ze#G=@PsI`wVF)|2DS(5qkmQW$Jp~q$NjaY%2pp~@EGEJcNDnnwlQmN|uzIz#K`s?0 zK^Bm-6Ly$Jv#{l-@RF(c1Vz_W$iZb^7esXJo-LAVr_afifCWe^XIXe!3=$au_zv0W zaLBvzWIT$aX8K@7J%>o-ozzkZfR;MUcWjSPX-O6|?z?b5@LUNy=D_e&QV##Ne0X{{ zLX_QQVbf-!qvpV|Z*kFcTVSj(+BiiPl3Z68Hjrd-P&pMk7yCsk{Qa)x<(^yEt}r0N9c7gWThql|VvjdQ5gtwAVI zOF*lFHVBZB(w6IerQ}wsVvN=)J}AsV@5j)5o(j|7&eJ&K&U^5`NY<#B?mcRxDh?xl zFP?CzdfaA@z$=`~f-Zv|Z<$kiM1@EC0#mbgg!?YJNruFCF&BLPH}adSzV{zJz8A~o zDrFUh%ch;aM5AMpmXK!3+ohXTElJzq?HefGYx{0-3RKfG1BFHFTHlDZd{)(Iy>EP6 zGNGVb?aslmvKrjz(3_?olU78E(e&ZpE9(e%=lqjd`7Lbzi^+B900f<&O~9oHtWPH_ k)MsDusiIgB_mu6KZfwy(>CzKLJn4dl&y*nFKUJ-FNzS zclu{{E@Y!2M0cP-BpqTNqED_6!H9w{dC-6gf}rBxi-HfD7k?fU1VO>?RQ2!uskt*^ zV8w-5ZdX^Gs&nd`?^O5s`m+-+z4q=A@sBS?f$ey^4a2fL-(pe9r!C)1+RTg77t=G( zrB~7wJ`)<3BR>gEmhutwFm1=RLguAUrF?<9$Br8{vhh<9Gh@g1isANzJ!wxpm9E$` zd?I#YmsM`@(-&F5jJRz?J1o>5^R2{X+C$kA3?YaHW9;}x*)A<=m?1Bua^;hOfpx~I zy~JnqLNR-cPiFdT@^RPkSh|^P8GP1=BZ|<7-xHqEmcOR0 zBq%So409)BP3n{Iso2=2TdBQh-)zs@x7cI$DgMa1?YG%_n0Ouw*Dw3w&N}lV*4}d0 z4A1lH7g%hxE*H5TR!r0gBdBxh`6J1eJ;Em(&tkh3drDK=@5J)$(=gk+@OL}@mhpFn zRDm@@M<}qu#{{)uZIk6E))3yk(G&Gj#9rr!=+w(G>5`pCxY6KyA6)y{qR+^Y6SvgNYQs&-MkLwlH} zS=BBywAz9m516-hPvfpsMAwbi&2qEIhRd9jVYMl?!5HZBm!GAj|5XO$7;Al%U-2bdctVJ*GrKaH8``se)VN^8_M^@Y zTh;s|4w6{6oDg>cG`r50xV@@XcUs?aysi$~{n`aTa&}49%5pW(md~te5EB|(mptZeBL@|?Lu3RaiqQ)oU;?a*J81HfwjSFdGb}U%DIo9c8Ex$WZPP~@lX-T8 z&kKuCQl~7GCvtm&-+gc&%Ms!*L(6D&2S@7)pTpj*1<2I2T7HxkFH)|!X0-%1v)gtz zqQIcD$TWsTEWE^03i1|$yP2ih>)hebkBaO*BX+TS3y*cXbiP5oH%jwAr!xOEnP1v| znx^bEyZwxPg>3wp(#H0)1gK)2$Hh7+3$__jm+Rn&Qt`Q;{||;-5or>83f-%EpRDPf z!%Q(!xH+Mg-o3+fm4W%@*4oN_{mS5d<)dC|RAYxW@KtQ!D`L}5h)tvEgTyoAM4q)P z+cvt9&y8Q@jNeqv81&Bgjbg?Erga&=)w#4{F0C@xo2t1k_s;d*Y_2coxt&kf%#IWD zJkC89a=5;W(|TpMvV-%Dl@X=RzZ$%bs)6yK#G01hHXJYIM}iKH+h~Y80kCR909q=# z#74Ny;*`%-vJbB4@qqxp>6qyrPL-Vvd6-D~*#o0Cfn#Sw&bdh&{|lJrr+CPzpL1Rt zZMN`wDPVetNI{s)%wda;!L zzT27`9T`zbext`4}16i0;El4j#j*@Q`wf0pKBpw|-Dn;mGoG9xn8=-2RKo8CpN< zR$~9ym(w36_HU~lA_ly>>4AeA`i#nT?R&3Oen+YN0GQaupkZL5qZZyDCNkms!o=s* z!u$JnCj3w^@rruFw+kj-62>3u)G@3nzpd6xWy+yo;!UM|B}@#f!cUY_41ftKybcpH z%lRwPJc24MW!(H$Ip1MGLoVhppt02RDz^tArm`-%PQ`Vp(chIC4M2jwV$d*1Fg~VC zvHg)C6TUAJ99IkP@4lJvLm|O!>IvU2B+#&oArB10n(_g)W-3z-g#?c(lD;P8k417T? zygv+N!uN%NSJlG%`)($@0t2XfNfY&XZlHUmsa{u4cnBCE`3HV(__{FuPzQoxP5C3W zW-3z-1p~iU%2&d`uqymPImG}NkizRQFnTtR82lf?&{gbyZIW;Q7f%OI zNXCaoHZJa#RkIE4aluj1z)^t<_+h6$UF8h1p=~DZEpRHqZOaHFjSMCKZ)8EM`EMDy z1lf;K;0W^Puq?GtOO{&eVm49*iv%7QBzTBG%LA{wzP2K3(TH!<`H7j^1sqw$y5&L^ zp8~juigl|^mx2#cxt{WTNjcr)^Vv^gly*?CUiADdzN4&(a+ogkClc%_8_Iz(Sz_CY zeIGwvjjT0^VQV>4S8@_q&SI^1&Z&0w&PGmkrO9W3L1S_Q>{Usc?K*>1vP{7VwpaOy zI5fP-74z$Yw#g#N37&{Sgmu&NBYZaR!z^4TG~Xy+Fq4oN$9lmpp3hq(&zMg~ERI1y z0M&YlmM*x{%}^ktmGa4tQzfI4*B3YW3@|UN72(1%0FANH4$@5!rvxpVju1PzoXswi z(8bkJf^gy`(_KtAA-9DeZ~A@=gk+VQ=STTbB5o6a?1F^aPSLVJ?ASmD<&^l~5k%fB zTbRp4i+19R3VN(b^&5;xcGT@#t|mikSdg`pqn zHWG%*Kzg2}r6P&)#SC3bDHB3U%1?FO=@QYpMgg)Q<@S!grGBGpFh52*z{4VN`2tta z*^at~x1AW<3>K#o%n>l`Io=JMerV|yQX#nB9`ONThe?E569)oV#IfL^IA`pF{K*%L zB=+^Pi66oF17)(L9q5JQ!LXtMk1{Mo!X$xvSbKVo`y zr0^0GB{(N?sGJE|pioAX3!zB1%Begc5M1+6CPE0v=!Vy1-9!!+B>NjF0b>%7`v|bG z!z9hZme1i+gyIq|ib5O?&o17=!x3Ev6zKG^W6OLYU;)^&+F#&4=?!hYS3+b$-XiH$8pkp;5M`DuO%KH1ib@GKO_2vd9fSk&=i zV^_DGZIDy9ZTRoF>yzuxiz263B`}Kn@JY2`ZvwtE->WCg*j1Lq;QgS+SGCXK)O$5W*cS z!Db*n?eUW)dhO^8R4G>nO%>-i`o7{SU&_87fwQ_z32S?NjCq&n3k^PvSOJ_Me&LG9 zL*fvm%cHu`ZV8KmYsElSxDATK1ls&~t(A^eq8ZYf#RVPE>2nWspQ1+jyY&oWyw$;f z5uc%EN`=%(+}Mlk)A-Or+(&}D58nbzX3q^hC*0zTjQhlSzD66Ha3UnW^eQFvKVdF> zD{_5(2T>!|KWR4;ezfYu!m3A2M}9#HLnA6ynr-`?`wA}&PN6J3o( z@0ps!nS53;=y**&(oPsto;%qsE4zan4m`|~IO literal 0 HcmV?d00001 diff --git a/doctrees/scallop.doctree b/doctrees/scallop.doctree new file mode 100644 index 0000000000000000000000000000000000000000..a8c6c6d00a5aba66da39c97382a14b7ae0a0b26e GIT binary patch literal 15038 zcmds8S&SvuS?*bSyS>a3&k*F9xI$!4x0$}ZOxxpWZ*lBAM5Ad&9t-jkRq9rqdr#e| zTUD-Qx-VjxAQ`#C5sKsrB#IQ}As~?j1x3gZ60u7l5nd4>gm6IOAumy0;0eC}oLcWv zefuU#WLp~dt+V|5`OfyAhqIsk=H86_Pn-*VZo7v~!?Ik@Vqqc{EYFO4%#D(_lJ!p| zznZLx#lScSy*MygB4*IS$>@J=1U;&)4pFR_rkCm6W?7X;43OJNp_tBzcZ${YIkXo%0Py7bX0HSk!ZM z_!%*mYOycQI=0J_{kUa_h7m=9-HIb7pfU5g!-45)0&AA{ulgD}>I@b7W_yM}-3qy-ES*i!a2 zan?8NAQ8{?q^+OTQbC%L=fQy_PBRJ&H#7s=kG!63>Qoj=C!A@0{;Ml2cfx$ zSTj0-;q#JHKK>V{W@fU$wnNR(xZU9!J`37j&@)_XC z@WZt<)^6LT4gYDc$A%l(_>!JzK<2WRXpJ~UK=qrAk44u)%`|+Yg|UQo9E1?+9nCR< z4%;9ff_KHonq@?Wc7QR>G(Yej*cP?-17_MG(^weUJxCN*xoSo$b}iB*Y&KF&!P#&+ zUSLNYp`#f-s2L_lq2nEdnjJyuLMf-OfraP753z}=TqaGG!~uAc8B*o@WFR}x*das< zLm-Uium{WuuWLQyK8XwlhW5a4VyQeDNyw764WroVQ=1NRS))XP7!<5AP+@t)>4$dM zOeFYR{`lYg^nCfw!_WWJyeWCVr~H{t4}hJQ6gKb6L2Qf#PeQ2|`BnY`;P+I9Rv7gk zR`VjC75{RN8=iLOx^^4E6=D=y+RIJtrF;~pV5oIAFIq>2R*L-e-Y=h#N1rKC+ z5|A`3jEkP{g*MHBO>N(Zw2#Ha`6!*0rtMuse1CkzuZbl%kZ?)LELKPbxf+(=tg^sdJnT7p zp>NRUU?GJvmJoCvV1R__D)`&)wgp~wFaZDM@_SJ_bI_AZrNGYoQz|_AvD)>P ze0FLtV~t-0$M4i}^oKeASshJJ{RbIC>N%y~I&UFiC~@%+n%#VG}ATVBtw-9()B``G%TAnN z9IV=|w5885;L9NRB}CEh<#t}H%$#KOF%xDQ{Dp^>NWTmJ5OG9uM!YapDVX2MIF5_m?lbi) zOI|I9FaJRiyZndKMJ@lI5dqlUm428c1~bKvwd$+&D%M(cMqJ1N(8KA75qUug62z(J zvtY!pA_QBtEX65r2$Z^?q%OHPk5%gRS`NHcsYNkoyYhIkgsqQ^TDNA(jjk;8{Zy?q zv^;AYu@mWZ_Q9&Ui}!`G?|VU{hdm>RUXQVj43i@OQuo)(CYcIuDy!~cxXBmW!*EmT znHgcJTvq7*g<9SDXt?=ZbeaTi{-B=tXt+s<9~(n&*ApKdLn-ko;pXq_S^mV~=5M7R zCW4zut@^!s73-|pHPAPM>~YxggIfCC9;yfDi40sORpI|?S&RV}MZEj4tU?(#s)LPR z7NaYRfwgkFZXWN7K}C;85+&j^NOC>jVyn&gFqY&EuB{KD$x2>Hy)!%+C@mC!qE_)S zi1KsjGzp^Y))OC%C@Jw{5#=NG#7D<|N_Wat3Fg%0|Q6 zAX!(K>fh@bo*YCZ{hBTN=*`c+O5;z29g~{!f9o}?Gv!3sF@L6ZlCE2gOsc}AS{7rl zLlLiH$5QDSJR3ZfvLYZpRLgT3lu!aqj1u(?#n1Mzow9Mr?=n3s&*m2be0Z#=%EC4ut+ma#6R+}-fjHx}y4Axj#pJ{z<|W87 zbYxW;uIW)!_eGL<$Rt=Xs^lUh?=&CS?7&2ZQ6kP|KapHw^2&z)xZ5*2;>*tOp4Zj+ zTsTz{2+jmS%eE5!88L@nNC?4!VR{Niw-;TbqLaG$Duqqgpi~=V3*qoK5e+)Iht-k# zlvJ-r=6h55rbRDs_F0W!< z$1S$JCxDk+I=#arlwD0B2O~m~Nhx5n+q~kQ`-N9ySG$*HYNgpGEYOgH5yFEJGC2%O z<&hX|+&pOaUVG_P7Dc0N zGsjY}R2(&>V+gr+vU-GD^PWQ&9(S{=qc8*TMyaT<{+CW-{q7g3^`qS{&>t0sv;MwGj0z8m%8C6D|@U>vqI?!`+L}eZ08E(Ka@;UqS*NWm@3k8G{v9xf#Pu_yp6Av7218Dr5@SP9&_M&>1@>$^-`yny?{=mgO_S1w(MZz<1M=? z8Q05rf|z}*a+EZgZ3hmTQe+q?Eu!az0fW@bp4xYBtbM6wV*3s@KHk1Jf4ug6rM$x? z^WKr^G@4AO$rl*NenXP1g&a3|uYr6yPutyka(ioM_sJ)3q*z^rj_NKw^+C0;a6xCl zW)r!<9P0wA8F0bwRC*N>4w5|HQJ*}iqiRWZze#}jX!jcv0M{R?rZm0Bt$M1TS51Fs z0;-8>nk{(v)u9#m@GRDSC_AYYZnokblxa;R2VhN&gbRA7FtA=vQwX|WfkDMQ*7P!k zp!-$&lvz2Y?|Ii#`S?d-IsJ*{ZqP>p!8zAU7uI1~MANJzhBxWN#32>6zGoq2TVHQ4P;&)1{B88ovU+DQ`i{-3DJ-QGJA&Vj`!tmPU0*Nl4 zkF>Ge!al@G#N02^J!WYKeQsYYQsTC{AI1kV){&QP^!#KWiw2qIO`G-m_-v$~ap2%< zh4xDHNP}v@ZdUn1Tx@$@gqICS{>v+GpAswdcEyc*`XS}%Cn#B^3BlJ1kn;I20PoD~8!7T?TZS(L>21jBYZLJ9$&A+AgJ0G8cPmw8BO(j@lc~Y{*^dm1?EVg1`%O z`6Phh8OR)oiVdqcmoAYDDzlPGBCZb943OylCyk0#MR&OOm1@O6XK|i%2w^A=6FD-0 zaK$m)PHc1-EKX+yr}4;0ypP@q1eR_wN*w|ldd{*h<}kk6*nGnxwuK1AcK#4)t76rN zBTp}i#A$5vaY-Kcd_5057*-bG5R(PS_$PwrWQh!Ea(_|ehb*={9f^);bsnz=ypZYT zo-#^IT)^AN*~Wo5w#Si~z0FhS;(k9ddd zG&scjc@+8K-sUEX!=`#r)AWMQW+E<8ODOeyhxJ(0}sWd6qETf4C5YS1a7D6)`~cY8rxMNIbee0b&xr0Hr$;(XY5 zBjZq~7d1Fw;E3O|4(-&$vP^N%(;SC4ar{)IJm`)`PhX^IubLeDToaC0;|*4pCPeG| zu@CH~H*NBvT8aZlh#t?h-8Nz%1BQzP6=B>OXot5l2wulC)M%t}sOs~Z(4B?lwIgwcxew^MnpjY9g7J$`#N;El zvAQ}GliFQ?PzbFEsEV*bY6yY0xL7HrjlV1gwRZkN=V0{q4bA7NQ2p+H3uC|r?gPM|4K%yx{1yvLg{-{7u%1cOy7SRHwDt{s%P$B^mf22i<1ix=) zc4wb+_MTXVpjxthb{^k+uleol%r`U7O@8K%&KUp0_5?lK>2B1`R;%l^tYE-qT3)l? zvAW^l<-x+o1|J>N*sO0}47|SIv<7SpC7QO=ZuwSsaCX3UQ}NJg2X$G0I{&J$I$_&NWU*^bKX%_K;}NgbZ(GJm*|f93k>&J07}S?!0Ao8;W?v;vZ8y4f~^0EzfL z*)==j*G#M5QxB_V^PF$3QJFrQ4$XDS8rXa6L-tPlI(xf)nBBW%dmU@Z?{~YFzjV>_ z&n;Qq!0N2F7tLfO}*VshQbo>Fky~DM9hatJBhn@$!5ij-7H@iX8cY2}MaheTE z3%M2Q#LR%bPt;x9dR2RBB^;Q2``z|pLN{O9if#hGxzyVXZLb^YY>BhJ#MM~Jy3k{9 zbD4AtZFJWSZ*2tO?d#z!aKu?Sm$~knJv(8DCvF`d8+**Q4DQFZ)4jISv|7evu|5Oi zzP7X8r5%7r2LsJlkOA6wms#Tvm>8*m$eMgOx<^?qH0Dhfr+HETU0n0ZY zJZe}WDAu_E%SOKqeXf~7X!N_z1_hg^^K@LiFoKz_X)UJ z;cjY{LIU-`d+fvZ-2j#Gs3*d&>jLB>lrF8GhLkCCA0Rne`eCEx__?gW_WZEnTV|_4ed>H+A@q1Fv>H9%Y5=7= zqU5r%3UoH^G9EPBfpyd<&*_*OyoI3Av;0P2c6!941Gu@%ICj*aY&`g0x6!t`>!BUx z9Y02YjvC#5rxDu3V-RN@HOQn5AV)?d(0tSjoDGt^c7zHYSwLa4!vT4C1zC_Paf#N= zwg-tiZQm6Tam^v^b(H7E%qckv2~Y{z%)`-)hW-Fcgh;u z0e@SBxjDCN7ctLA9Q@fzy~k%aI_>44XVTDX22}#fzhDihFFWYNmK|k{ z5Fgyka_ePHHxu=}$RH{~srfmbnrBGOLdP@IL|(o2Q})xO%V(4>?T->Za=!L)zUZaj zLI3pI4n}0kx1M0YhabR#0KxwYun?nx!1UN|37fI`l)(tZ;##~L(wm@>^~4>CN|7_B z(v&}buG}Blcz0kX`!+e=XW@9i$enFJcQ$Ii*Y7sNzW4-E?#9NKqqgx&wfI}Q7JK;? ze=}||e)Tm3z9ic+;tepGKa_2~5)CofM67bWm3Q{6ZVSVR#s)^M2`kBO zn}f2nlJ(o=?I#tB?^SE9<#kM_J7C*-oA??+Lb%xjhE8&z9q=M}d97RF0DL4~=L5C_ zg@c~ebk>~a;1Wjto6BNQGhoNJ{5m1j-dq-qu8_sQ1)Y2oAD`)Q)~}a&hLtXt_{58_ z>*qo6=ioxW5G#3aazGL*yk;vi%&8KQp_55U<8Nv-Ud;3N!OE*KE5%Oh&H*|#l)sYG z26-(}{v$=X&_&&=^_2f2N11$-C@bY8eDrUl=E_{seV4wyguRkpY5${gN&B_YoY8*0 zz_r|Wf}e`s1*u2zu4{|Ow1s}Qzo=~FamAUj@3|{_)fT#+`=ea`;U4&;o_L`LM#P6Y zp{ple=!6mR5&iIKeUn$*4>!0Ss-T<{d=yu_xx$wd_qHVV9Vo06Ib}(%^2*Qa6sRA{RJ9eJiw);IJ`Zrv*M-%VJ z)buv(ds!>gESqw=d~Q84keuYR7m+mbNlEk$ZF}@(yk=rTvT?y|_pP*a?5d#O>(T5= z&@uh+eBYy4{7V>Oxd(`9B=jh_a&_5c3l}5_CUdG}BxEv4NqSr>sa*^ki>Op(ICYPn zcrk29;zMEM5k2u@pOC~ygpG#2$twmMXSn_=!A4bWZt6wTY1924I&(B2EyIXUXz9D# zk)0g^M<7vEgwJT3u(cu_MBP|~A>i-@Z9DEwSy6@~f{<_&L^!OSWX-|C{-WX$Kon;x zsQ9W@?h>f@T~w+96<^mAFNO+9d?-}>ot}8HXGr1-Dz;;`TIec2z~FgGRj=zC+&WNj z`dc1e{4-a6C7h_L%8BhGyom+zN;t7kOJ9o_3O?L0WR)d{5c9bTk&Fd7O6G^OGM8Y(1E^F58-83*ycioK@uAqz)Dthp21$G* zZ0PG7yi(Y3o-4l+HdIyRr}UEPR9OidUeVImVnbCCenZA8JiH`&aV-wmJ>Xm|nH@WgF!9i73UaOZ(r^-rjP}9=a!a-FLZqqhV0tbS48V<&f zM?D6=R6jYXr9TP?h{i_&ftyrh1v3Q2^6Wk7!aG|PJe@!o`c~; zBu^(Qp}(sYx&%l536-kg$Qyd%#W*5~55+q+e8VD2;ylRIgrGWbbqrCvXWfYwLYZfV-!3QOpbyl z#}YA>BK|TDDTyLS7ILVvCy`AQB4Ej-D+L5v1(aZmhe}njW=55<;G>4_Kj z0!e&CZ21*^lUE#DUg37AG)Aea)!)~PsMBgCZ26j&z7|`mitrt66D8Oph^MjT>IAkV zdY0^XfS2+Ds)N0zq)FlEHTHl6y}lIFQkO z?l|$BQwf&3#I`-`jH_R8tcy+T-5any(NFB(YGUU>LQ})`i&4mA6c4%F5b=(|)^}SW zz!HR<*1&$AP2m@IUJcj;eZ5l5x_fg<8nHbi;V@5{w2uw@@DK(&U~?3{4Si!f;UFCp zKlK*kG40pvDK@j#Z?}1vFZi5mgkF=JF$@Oooy6huABT;3s)!z+i$c+B3q16`iET7I zOdOW^FvT(A?G$Z7XnNfcTfK6sui5v;3!n8<{jS(ArZ#|iU4wc7?NH-EbJ+1^w)n=b zdh}l1YBlBg50O-SQ)0zkLhNn3qX2;)C#AHo$}F2(bF6ktAdCu3k=+3sQh9cPwc?uD zXz;m5qYVK;WSC@Tr?h{eTSAo+ntOaW~qb^*5Kv4+o0u}ZS48NmZJ3pQI?8{ z7u);NX-YRQY)LmiC3N#F{)0{qvPt6~o_jeFnC?9NbT_5%TT}oxsrzy44W|8^*g^)h^Zd=E(%qj< zP-4kAZK>mAl9KUN;-+e!ccqHI#Cb1LG36x5q0BqV*j7wrYYkWQ7dZ!)P0=TcB9KYt zr)g)N1li$QFOF4~`Y+B@O88Djb$a2XCB9W^3ChV>;#!R~ijQo?;l}u@%WI4?g`u}( zjgx!}q!D5twdXtQP8Yk5`G!djL4jee0d)9|!4CRK9p!moU_hImd5EC|sB~W`3Feh% zE6G**8kSjH`@*Pqmj=>{%GaY`36N@wA*G-&By&G=f zC3LDNN{xEsBjyI}3SLE*!*G=E3^ov^Oxt|1w>WLEV@9oyu-^_w1+9g`URWIO7GY-* z4+&$Q%4lCNyu{9xQe#q1)|hWWT4l^E;o-)7`0^U_QBq`TpEp^O4yHhc)9H6;M>s}o zM&Nt|1H0%H2|AVnClDm@R76x1nzA4^N!qa>M=9s2jMgg|@nWeFDJNsZJKl<*iqS0P z;Z_VUuNB{&i2We@t;D_1ykI(Qa~0!pxmUl?K&dzpX_{1;lJ!?JTC8N0&zBm7axzA_ zPRqUGBwKa3)?c~2TE8}0UMH2G_SV9SI7O&@2(A|2rG{0466!BA`lzJdua&Boax&`O zo#9lqoh>|Ep?`LH6?%Pgy|J27)2oqEvFSu5;2RljR8sDLmMWKWDl0czc(`)^Go-~ ze#rGJjF5YxC{5kyw$#!T!5LBXi3(IdD2hgtS@z-FbZLI7!o8nY5|fhABxRPTn%EPM zIZ&K4KnJyDCRgRod3O~GWz(2|!##-CSL!s39SJbgoy<}kRQcCAgPe(MKYk{``M>HpFE)rIUZ5B9 z!UXm2>8V%H%jG>HB(D|GWq=psXA^wym`#t@(jaW>w2~QG74L2qPM0Z~&_)F6IN-+p zWnoDL07Y9VPUL!i>eE*acvESr$1mumEf(PxRI1YB->WBHtV&6IXpjF9J@MimFNv!j zzlB|wkLw#un6Rv)XB>L8U6-f1@-tqkwbM{lp4UsJQ)Q)aq-VACwc$urz2RrIO_YQq z3F7H+q;b)m2o+8wP~n%f^hXIW5{+*K2lQp#F}y{hV4~vDiMtI&;sMH*f{4DNmA~v5 zvgCnJ`M2DNF+{%uR;tGkm1yFJ5}LTuK|=1!fb}>|$UOm8=p*@N{GS?EX1{#hP1F;y zLhfxS?7kQOq{gT29Y`7FxHbw8a_=IV#G89J{rVT^nLmDf;NDAgZ_p0DRgh3T9)>he zfgFAN_E+5pKqGQKq4H#K(Bae3cP(Zhu`=CCE`*9nUmDr#OR4wTzg6~E`aH)0!T-;` znxOjEr3#?>$8)N8pUfrITr-izlF>bK43SJys@^uI9WW){i{#}p;OD=Ixxz(r>o>aQ)uH+t#z0(yx|e zG+Vp30#!L%OZ_f8Gn#yRQx}!9wQusGdS2yhZ3H#Z?53V;Ftgm-QF^)vL#iGR8Hb;&))|83L1K0MBL(fujtY>f@NU}1oi-E?_HuhH~6 ze6=1V4~Y~6P4Se*MJKcy(WND5QC5(*m_T^n;zy;mtqT^EwvEl%CXQ8;kCSZP+HjyN z-1yNCRO)2QTJ5i+x!qU~?Lt=+^J$qKq|8F;O^f&*yvTMtT{{0BS6X;}VYt8L+4ktt#o0p4tnjEGcJCOMS>JDkbMkZ}J1-p+Oly7}7I zr86>>*RQ)zwbi=MfV5aA{8ZCJaE$ zJ0VPfE+Bd}yhaw|LBRa(n}d8=!NHw1J}nf%!bGhFlkdQdK=C77be?bM5cdn97a$sF z@W|dHY^zz$GJ&Hzd_ z5Wfubg!~kItG9T|u^)y$cl&G240%dXkwP#IeFP-Uhn;k{x#1Xlyn# zSJ8`Fn7Dg*h8^ZBta0~@1&{}2Ut)WM&2ETz8{1jOJrL_Q{CA>F(a>xsKaH>G!X(v*9skO+6W_W!hE8?!IWHuD1ENq!}1y3tHdu$k~nY)-s3gt))fT| z`v@xVEs`ncbjW$zo+)}GU3heE0G~lXR|{Qu6D-&k4!*v`4m45fT*Jaq+3g0dPat>& ze=o9md5II8wY?@_?GoE=buZAxNo+>I3HmQw5$k_EezqaDk8tVc=>rK|0af8PIK`1b zo9#=bQd~Vx2DP>Lfi{iMElemrO^M>S`!c=JUcx^Co26u0f}}z`<5FPXhV74x|4rDCg1qDWGTQ4Z}1|$`nT_(VL5wyT~n00*X2pu;@`>qyT8wN zCEc0pcURL9S3FS{5-EgQQ8{7AWQr&U=Y{)sR=sv3RdjzQF)lruDmELn%IWV*(Wfy- zNN>CYSz0m&Z+l>B)9VxNVLhPfVeQJ2IGH>34yW5}_gmD7)~UD7wFvzsP>Qek`u_m$FFNu7 literal 0 HcmV?d00001 diff --git a/doctrees/stringtie.doctree b/doctrees/stringtie.doctree new file mode 100644 index 0000000000000000000000000000000000000000..a7f8913417ba885c76643630361dbc242bfb4fa4 GIT binary patch literal 10092 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 literal 0 HcmV?d00001 diff --git a/doctrees/trf.doctree b/doctrees/trf.doctree new file mode 100644 index 0000000000000000000000000000000000000000..e6457962c0b8954c6e57d1f59de75c023edbd576 GIT binary patch literal 17930 zcmeHPYm6jUb)MOIKX&%P+8FG$%MjQZvC}iNcv*XFFBtp~T6s`L{nVq{6J95FnD%h0*%0Gt42DcU&Gu<7ik_cJl9zmb2F?dKAX;dhfh1U%aWbAZSX}SiUPYGN3fc#oU%J1Su|%lMi`g^Aa-3AY+Un#y$$Au ztlxIl4cGOmH<)a=At$*J1>IH+RSkw~I0t_WcvOY# z#HPb+Q+von;9{0xOWV5dzWeUiE?io@u(o~i(!2lp6E`m2yV=q@p1r-b+1lE?@7)`& z5o}zz)Vk2Z^F%=G);EHsX^KEtJ|ywEBNpEn2_lN(_gZJI%Yflz7R`v3mduG+QX4tG z3c}eCv5CaTFC!o5K-cP;wu-or2x}a%Yrt_+G`3PrNj)n6{C5?V#k>VNC-^kBC9?#~ zY&V&}-h(H4Xe0YZaZuh?KD;zJF_F1?m$}Hqde?T?w)UJCww^R1>v4OJo!7iL^5aPF z*a4pSXm;$jczj-S#oH)edVOTs*IJm=hUU$4lomzn|UQyNNqHyW7HD-*zi<@1Zth-)DjC zb+V2ZH#gU`^~>6hhaFFDz!Q8~xQupt+OV=6-kRZSjpHiI8b=sWpwAhNzE!@2rCj&1 zh11;lahj^wi^V;wY;g#naI3Tx%l~Jim!D6%iBU!k zt@9VK&M%9#JtNkZ)cdh(MzK6~msWRjJJXG;LgQbmH2T9Dzn*K%^R+IKTh^uJy0nt6 zS5>;M4eR=wRM($oyELD#xE-hIWuLhn?8f>&4)CSbN)OeymPQmd|9JE~$_~bx66rrov8 z7Co|ME;ki^{h9oOywK-RO&;vN2dXW|7{_;Hb8rCQA_^LkYtKb zl3X}vI(M1%qfA{MjPhabpx(RG`bz6njz#NVia@k}UJ1cvzjW$R#h~?zn$YT z7pxv9y3W)c#D*elsnjbAu}WLv!ar2Iur|zkSA?C1N7^%L;kA*L2|qO0_SC{_gDn$Y z#M>0kqS8gf;U=CHu6kCj@aWMd@(sQ~B2E;mmDB zUQpUd_~e6G1mdc2<`aUd=ETvHkeAafwhhybkc`LVMt7OTy zm3rvl-Zf$;(ytm$%&J!LH-)k9dqJe*H7JNa7JKyZ+jZsbWNmkix4eVp75hA6?<9z{%e$<&TpDr1Ei+z?(;W zBs-J`R;nGdR4~|FSoz;dD@SC5|G=Oo*ObmX2kQ%jP$O6{PRjvMnL{q3~B=T&#HyjLp~LLDCEDO7G58xsqnEN z{|&Xmn+5r=3guSqXu51MPpD5)kA>Y)5e^sg&0eLBW0P>eItV~`iLH<9L z^2dR^R6Y*mm&;$Z4gvm{-_IFKDAZTg!t3KR z6+RZ!x77-77S!J(oZkrQO zYFiu!>{9(WU_U)vC^ZE6`K(U{{Gy>S>TOD+M!^403~B=ZO||fP_@}}Th5u!>@cNid zg^vaQC)EmX7W^L<&Tj<&rmpO%EmOI&5&ZX+@|Ey!YQm?LDn`Ix3Lk*~Jq7%6Ss*1* zY8VIpQvEpa$H)7_HIYLJU?K07Wq?vkVc6G{hK)!8U&f#&Dd1ab;q@sX6@F+6cwH^L zK5kRtW2JzfsukX>6z~(_{6;CDsVo0WZJElIjZ(nWta9^Ief!tcgi}ftBT|4AUQGd0 zC@{_tBd!aq+@;hpP7;t4Xq*Jp9r;`OC{M6;DtFNH%1zv&x|K>1tk0oHE3F|e6~oHf z>42fu+zrbGAJch>bzKFQcv$%6A*F9dRTGvgxcHRU?o|s3sM&8#GkfuPm8YO`x57-R`QkzImNWLlNdn8S!mR6d#2MsDe{_%Uou1VW7^ z#@n65`Xryl6-Yq|pF)WT)rI$-sn{UtAEhw)s6jL;u)t6doA5=dn}(M`WlO4s=d(vI z$+UiM&GPwf>^P#%7qeT`BhRGBi^8OLl_vJdPh&wvtE|>u$jA$8qNu$CCW@%a#wr+8 z$%suQE9N&nH!9Qha%#%^vRZ=={{mmCKeEq2)MKGWggcOrM2RuzL!o1XleD-ka3EVV zuEb-4IH3`7LZdRlR@SR1=iJta*+#@Ga46s{FF2@nE!E`-VuB!6w85hSQ7ffa$wOkTWG*U5#cg|iqXmYOIkNcY8fX70-OHEKa zh*}0#7%HW51^GFJCbcgHNydj3+MtIO1JbPg`(>9@n>Wm|7n{uUlv4x`wJFc-k0j5n z_gp$swJlIO{kTl0A{k}LX|TX|Ro1{G^?_eNl;D9>npVp9UVhjc3{<$EvFt)Q!v z?&n;OxRLuPj9*SKiRF5L`xCC0=D;v*qCH#}_7flXtOeu1^enRds`UWB4cTU0CiC@- zD=aAxEF;v4J{d=^+Q-PqwxntiS$Rsj+d404y91}r(w>@=k*)LmOcWSy=m@pC;FPjZ zl96X3P;s5)$^>7``mhdeW70RtSIjsds44Q5Mn>OHc0kM$>~A_S?csJYy^RA0cgJZjBSJJi zg}NEJ2>f){^CB>cS?S@GNq(I8;j}C4cfFvWpk;-qyS{FEeM)~JMBXl2n8QSie$9?7 zJ)>nqV>%$^Y47l5nJIOLU1f0EF}`Ra$!E7S{1n@_;VY1v;qJ!9 zE`!JEymkyke*PwG-d@nrJ0Lp)X0A!}@f|)3V0CdIf=BEQA{57~eGp3diV;ViUNrGz zICi1%H}3m-9(Zu9Xh6L=3$W{wz!RcHgfuOG(d36L?sz(Aedu+P?fYKH^zuj%B_@iB z?a-!zYsdm`Gc?)`8IsO&E&~L>wG3lIKtO^TQImEPL{P!*zm-llPy+HGr6;T~N$X(A zm+*@R`7J{9lz3Hen7fNWbnLzzB~P3@$5(vj>u?GK7IBEeoWL&f5$~8gfrH;>MUfwF zZ)~7BY)N8!%L{fl5`GKy6ca#CJz{+>dkRHjBDK2VlQpMSTa#79yh!6m`JOxiZhsA}0HK4$s_xl$Ld!p9~M&$k^8{9IJ3F zu@Jx0jz^)tEXua^v~K$ayaE(u+&WR=9k>BML2%ZzKpHf$@DgwEvTz}K@5MfnHvMjd z_%Vny4_rs|c&6=k5d&FbI8CV{jN1eK>^=pr;~5f-^pg&I31SAvu?`@7fGJoE^s4Lp z78AYpbOu6}ql5Gco+$mW!wdXW`XdzxR;Me|+I2p~+^h7{5PV*y6W|x2h+RjVY<2l! zBCI=wNg=c%WL1O>%H1hx^V5}9I>(D0GlA}N)F`ieUjoK^ui(FsFHkdW zeAG!ixE@+}&K)3>CeR)6r->H+aSQ+b`7!7eOurY(Q5f?y(BC^KdKzRSZy!S#y z;zFiX3_4wrk4+|sXji*sP*(Z`J38{F>BW>4LAWwK$3d7Qkg#{oeIRYWfyMt+@)U9a t-pi0p5KAGVUMkGfXQg>5Zx(^OWV@ylcL*rEgviAXW%x81%2&wNZvn{ehT;GK literal 0 HcmV?d00001 diff --git a/doctrees/trnascan.doctree b/doctrees/trnascan.doctree new file mode 100644 index 0000000000000000000000000000000000000000..6219808225c39a4df5bb8879db86c80dc957fc36 GIT binary patch literal 11752 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 M?Gs>>A100e0X)(Vwg3PC literal 0 HcmV?d00001 diff --git a/dust.html b/dust.html new file mode 100644 index 0000000..d302e09 --- /dev/null +++ b/dust.html @@ -0,0 +1,135 @@ + + + + + + + + DustMasker Module Documentation — ensembl-anno 0.1 documentation + + + + + + + + + + + +

+ +
+
+
+ +
+
+
+ +
+

DustMasker Module Documentation

+

DustMasker is a program that identifies and masks out low complexity +parts of a genome using a new and improved DUST algorithm.

+

Morgulis A, Gertz EM, Schaffer AA, Agarwala R. A Fast and Symmetric +DUST Implementation to Mask Low-Complexity DNA Sequences.

+
+
+ensembl.tools.anno.repeat_annotation.dust.run_dust(genome_file: PathLike, output_dir: Path, dust_bin: Path = PosixPath('dustmasker'), num_threads: int = 1) None[source]
+

Run Dust on genomic slices with mutiprocessing +:param genome_file: Genome file path. +:param output_dir: Working directory path. +:param dust_bin: Dust software path. +:param num_threads: Number of threads.

+
+ +
+ + +
+
+
+
+
+ +
+
+
+ + + + + \ No newline at end of file diff --git a/eponine.html b/eponine.html new file mode 100644 index 0000000..c402713 --- /dev/null +++ b/eponine.html @@ -0,0 +1,137 @@ + + + + + + + + Eponine Module Documentation — ensembl-anno 0.1 documentation + + + + + + + + + + + + + +
+
+
+ +
+
+
+ +
+

Eponine Module Documentation

+

Eponine is a probabilistic method for detecting transcription start sites (TSS) +in mammalian genomic sequence, with good specificity and excellent positional accuracy. +Down TA, Hubbard TJ. Computational detection and location of transcription start sites +in mammalian genomic DNA. Genome Res. 2002 Mar;12(3):458-61. doi: 10.1101/gr.216102. +PMID: 11875034; PMCID: PMC155284.

+
+
+ensembl.tools.anno.simple_feature_annotation.eponine.run_eponine(genome_file: PathLike, output_dir: Path, num_threads: int = 1, java_bin: Path = PosixPath('java'), eponine_bin: Path = PosixPath('/hps/software/users/ensembl/ensw/C8-MAR21-sandybridge/linuxbrew/opt/eponine/libexec/eponine-scan.jar'), eponine_threshold: float = 0.999) None[source]
+

Run Eponine on genomic slices +:param genome_file: Genome file path. +:param output_dir: Working directory path. +:param java_bin: Java path. +:param eponine_bin: Eponine software path +:param num_threads: Number of threads.

+
+ +
+ + +
+
+
+
+
+ +
+
+
+ + + + + \ No newline at end of file diff --git a/genblast.html b/genblast.html new file mode 100644 index 0000000..f9eebf5 --- /dev/null +++ b/genblast.html @@ -0,0 +1,152 @@ + + + + + + + + Genblast Module Documentation — ensembl-anno 0.1 documentation + + + + + + + + + + + + + +
+
+
+ +
+
+
+ +
+

Genblast Module Documentation

+

GenBlast identifies homologous gene sequences in genomic databases. +One of the key features of GenBlast is its flexibility to handle +comparative genomics tasks and accurately identify homologs even when +the sequences have undergone significant evolutionary changes. +This capability makes it a valuable resource for researchers studying gene +evolution, gene families, and gene function across diverse species.

+

GenBlast has been widely used in various genomic analyses and is available as +a standalone command-line tool or as part of different bioinformatics pipelines. +Researchers in the field of comparative genomics and gene function analysis +often rely on GenBlast to perform sensitive homology searches and obtain +valuable insights into the evolutionary relationships and functional conservation +of genes in different organisms.

+

She, R., Chu, J.S., Uyar, B., Wang, J., Wang, K., and Chen, N. (2011). +GenBlastA: enabling BLAST to identify homologous gene sequences. +Genome Res., 21(5): 936-949.

+
+
+ensembl.tools.anno.protein_annotation.genblast.run_genblast(masked_genome: Path, output_dir: Path, protein_dataset: Path, max_intron_length: int, genblast_timeout_secs: int = 10800, genblast_bin: Path = PosixPath('genblast'), convert2blastmask_bin: Path = PosixPath('convert2blastmask'), makeblastdb_bin: Path = PosixPath('makeblastdb'), num_threads: int = 1, protein_set: str = ['uniprot', 'orthodb']) None[source]
+

Executes GenBlast on genomic slices +:param masked_genome: Masked genome file path. +:param output_dir: Working directory path. +:param protein_dataset: Protein dataset (Uniprot/OrthoDb) path. +:param genblast_timeout_secs: Time for timeout (sec). +:param max_intron_length: Maximum intron length. +:param genblast_bin: Software path. +:param convert2blastmask_bin: Software path. +:param makeblastdb_bin: Software path. +:param genblast_timeout: seconds +:param num_threads: int, number of threads.

+
+ +
+ + +
+
+
+
+
+ +
+
+
+ + + + + \ No newline at end of file diff --git a/genindex.html b/genindex.html new file mode 100644 index 0000000..b2cac20 --- /dev/null +++ b/genindex.html @@ -0,0 +1,281 @@ + + + + + + + Index — ensembl-anno 0.1 documentation + + + + + + + + + + + +
+
+
+ +
+
+
+ + +

Index

+ +
+ E + | M + | R + | S + +
+

E

+ + + +
    +
  • + ensembl.tools.anno.protein_annotation.genblast + +
  • +
  • + ensembl.tools.anno.repeat_annotation.dust + +
  • +
  • + ensembl.tools.anno.repeat_annotation.red + +
  • +
  • + ensembl.tools.anno.repeat_annotation.repeatmasker + +
  • +
  • + ensembl.tools.anno.repeat_annotation.trf + +
  • +
  • + ensembl.tools.anno.simple_feature_annotation.cpg + +
  • +
    +
  • + ensembl.tools.anno.simple_feature_annotation.eponine + +
  • +
  • + ensembl.tools.anno.snc_rna_annotation.trnascan + +
  • +
  • + ensembl.tools.anno.transcriptomic_annotation.minimap + +
  • +
  • + ensembl.tools.anno.transcriptomic_annotation.scallop + +
  • +
  • + ensembl.tools.anno.transcriptomic_annotation.star + +
  • +
  • + ensembl.tools.anno.transcriptomic_annotation.stringtie + +
  • +
+ +

M

+ + +
+ +

R

+ + + +
+ +

S

+ + +
+ + + +
+
+
+
+
+ +
+
+
+ + + + + \ No newline at end of file diff --git a/html/output.json b/html/output.json new file mode 100644 index 0000000..7220cfe --- /dev/null +++ b/html/output.json @@ -0,0 +1,9 @@ +{"filename": "index.rst", "lineno": 56, "status": "unchecked", "code": 0, "uri": "", "info": ""} +{"filename": "index.rst", "lineno": 30, "status": "unchecked", "code": 0, "uri": "#install", "info": ""} +{"filename": "license.rst", "lineno": 197, "status": "redirected", "code": 301, "uri": "http://www.apache.org/licenses/LICENSE-2.0", "info": "https://www.apache.org/licenses/LICENSE-2.0"} +{"filename": "license.rst", "lineno": 4, "status": "redirected", "code": 301, "uri": "http://www.apache.org/licenses/", "info": "https://www.apache.org/licenses/"} +{"filename": "install.rst", "lineno": 29, "status": "working", "code": 0, "uri": "https://github.com/Ensembl/ensembl-orm", "info": ""} +{"filename": "install.rst", "lineno": 27, "status": "working", "code": 0, "uri": "https://github.com/Ensembl/ensembl-analysis/tree/dev/hive_master", "info": ""} +{"filename": "red.rst", "lineno": 1, "status": "redirected", "code": 302, "uri": "https://doi.org/10.1186/s12859-015-0654-5", "info": "https://bmcbioinformatics.biomedcentral.com/articles/10.1186/s12859-015-0654-5"} +{"filename": "install.rst", "lineno": 28, "status": "working", "code": 0, "uri": "https://github.com/Ensembl/ensembl-taxonomy", "info": ""} +{"filename": "install.rst", "lineno": 26, "status": "working", "code": 0, "uri": "https://github.com/Ensembl/ensembl-production", "info": ""} diff --git a/html/output.txt b/html/output.txt new file mode 100644 index 0000000..3ee86ee --- /dev/null +++ b/html/output.txt @@ -0,0 +1,3 @@ +license.rst:197: [redirected permanently] http://www.apache.org/licenses/LICENSE-2.0 to https://www.apache.org/licenses/LICENSE-2.0 +license.rst:4: [redirected permanently] http://www.apache.org/licenses/ to https://www.apache.org/licenses/ +red.rst:1: [redirected with Found] https://doi.org/10.1186/s12859-015-0654-5 to https://bmcbioinformatics.biomedcentral.com/articles/10.1186/s12859-015-0654-5 diff --git a/index.html b/index.html new file mode 100644 index 0000000..013d0e4 --- /dev/null +++ b/index.html @@ -0,0 +1,149 @@ + + + + + + + + Ensembl-anno — ensembl-anno 0.1 documentation + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/install.html b/install.html new file mode 100644 index 0000000..19ce844 --- /dev/null +++ b/install.html @@ -0,0 +1,155 @@ + + + + + + + + API Setup and installation — ensembl-anno 0.1 documentation + + + + + + + + + + + + + +
+
+
+ +
+
+
+ +
+

API Setup and installation

+
+

Requirements

+

An Ensembl API checkout including:

+ +
+

Software

+
    +
  1. Python 3.8+

  2. +
  3. Bioperl 1.6.9+

  4. +
+
+
+

Python Modules

+
    +
  1. argschema

  2. +
+
+
+
+

Installation

+

Directly from GitHub:

+
1git clone https://github.com/Ensembl/ensembl-analysis -b experimental/gbiab
+2git clone https://github.com/Ensembl/ensembl-production
+3git clone https://github.com/Ensembl/ensembl-hive
+4git clone https://github.com/Ensembl/ensembl-taxonomy
+5git clone https://github.com/Ensembl/ensembl-orm
+
+
+
+
+ + +
+
+
+
+
+ +
+
+
+ + + + + \ No newline at end of file diff --git a/license.html b/license.html new file mode 100644 index 0000000..857023e --- /dev/null +++ b/license.html @@ -0,0 +1,301 @@ + + + + + + + + License — ensembl-anno 0.1 documentation + + + + + + + + + + + + + +
+
+
+ +
+
+
+ +
+

License

+
+

Apache License +Version 2.0, January 2004 +http://www.apache.org/licenses/

+
    +
  1. Definitions.

    +

    “License” shall mean the terms and conditions for use, reproduction, +and distribution as defined by Sections 1 through 9 of this document.

    +

    “Licensor” shall mean the copyright owner or entity authorized by +the copyright owner that is granting the License.

    +

    “Legal Entity” shall mean the union of the acting entity and all +other entities that control, are controlled by, or are under common +control with that entity. For the purposes of this definition, +“control” means (i) the power, direct or indirect, to cause the +direction or management of such entity, whether by contract or +otherwise, or (ii) ownership of fifty percent (50%) or more of the +outstanding shares, or (iii) beneficial ownership of such entity.

    +

    “You” (or “Your”) shall mean an individual or Legal Entity +exercising permissions granted by this License.

    +

    “Source” form shall mean the preferred form for making modifications, +including but not limited to software source code, documentation +source, and configuration files.

    +

    “Object” form shall mean any form resulting from mechanical +transformation or translation of a Source form, including but +not limited to compiled object code, generated documentation, +and conversions to other media types.

    +

    “Work” shall mean the work of authorship, whether in Source or +Object form, made available under the License, as indicated by a +copyright notice that is included in or attached to the work +(an example is provided in the Appendix below).

    +

    “Derivative Works” shall mean any work, whether in Source or Object +form, that is based on (or derived from) the Work and for which the +editorial revisions, annotations, elaborations, or other modifications +represent, as a whole, an original work of authorship. For the purposes +of this License, Derivative Works shall not include works that remain +separable from, or merely link (or bind by name) to the interfaces of, +the Work and Derivative Works thereof.

    +

    “Contribution” shall mean any work of authorship, including +the original version of the Work and any modifications or additions +to that Work or Derivative Works thereof, that is intentionally +submitted to Licensor for inclusion in the Work by the copyright owner +or by an individual or Legal Entity authorized to submit on behalf of +the copyright owner. For the purposes of this definition, “submitted” +means any form of electronic, verbal, or written communication sent +to the Licensor or its representatives, including but not limited to +communication on electronic mailing lists, source code control systems, +and issue tracking systems that are managed by, or on behalf of, the +Licensor for the purpose of discussing and improving the Work, but +excluding communication that is conspicuously marked or otherwise +designated in writing by the copyright owner as “Not a Contribution.”

    +

    “Contributor” shall mean Licensor and any individual or Legal Entity +on behalf of whom a Contribution has been received by Licensor and +subsequently incorporated within the Work.

    +
  2. +
  3. Grant of Copyright License. Subject to the terms and conditions of +this License, each Contributor hereby grants to You a perpetual, +worldwide, non-exclusive, no-charge, royalty-free, irrevocable +copyright license to reproduce, prepare Derivative Works of, +publicly display, publicly perform, sublicense, and distribute the +Work and such Derivative Works in Source or Object form.

  4. +
  5. Grant of Patent License. Subject to the terms and conditions of +this License, each Contributor hereby grants to You a perpetual, +worldwide, non-exclusive, no-charge, royalty-free, irrevocable +(except as stated in this section) patent license to make, have made, +use, offer to sell, sell, import, and otherwise transfer the Work, +where such license applies only to those patent claims licensable +by such Contributor that are necessarily infringed by their +Contribution(s) alone or by combination of their Contribution(s) +with the Work to which such Contribution(s) was submitted. If You +institute patent litigation against any entity (including a +cross-claim or counterclaim in a lawsuit) alleging that the Work +or a Contribution incorporated within the Work constitutes direct +or contributory patent infringement, then any patent licenses +granted to You under this License for that Work shall terminate +as of the date such litigation is filed.

  6. +
  7. Redistribution. You may reproduce and distribute copies of the +Work or Derivative Works thereof in any medium, with or without +modifications, and in Source or Object form, provided that You +meet the following conditions:

    +
      +
    1. You must give any other recipients of the Work or +Derivative Works a copy of this License; and

    2. +
    3. You must cause any modified files to carry prominent notices +stating that You changed the files; and

    4. +
    5. You must retain, in the Source form of any Derivative Works +that You distribute, all copyright, patent, trademark, and +attribution notices from the Source form of the Work, +excluding those notices that do not pertain to any part of +the Derivative Works; and

    6. +
    7. If the Work includes a “NOTICE” text file as part of its +distribution, then any Derivative Works that You distribute must +include a readable copy of the attribution notices contained +within such NOTICE file, excluding those notices that do not +pertain to any part of the Derivative Works, in at least one +of the following places: within a NOTICE text file distributed +as part of the Derivative Works; within the Source form or +documentation, if provided along with the Derivative Works; or, +within a display generated by the Derivative Works, if and +wherever such third-party notices normally appear. The contents +of the NOTICE file are for informational purposes only and +do not modify the License. You may add Your own attribution +notices within Derivative Works that You distribute, alongside +or as an addendum to the NOTICE text from the Work, provided +that such additional attribution notices cannot be construed +as modifying the License.

    8. +
    +

    You may add Your own copyright statement to Your modifications and +may provide additional or different license terms and conditions +for use, reproduction, or distribution of Your modifications, or +for any such Derivative Works as a whole, provided Your use, +reproduction, and distribution of the Work otherwise complies with +the conditions stated in this License.

    +
  8. +
  9. Submission of Contributions. Unless You explicitly state otherwise, +any Contribution intentionally submitted for inclusion in the Work +by You to the Licensor shall be under the terms and conditions of +this License, without any additional terms or conditions. +Notwithstanding the above, nothing herein shall supersede or modify +the terms of any separate license agreement you may have executed +with Licensor regarding such Contributions.

  10. +
  11. Trademarks. This License does not grant permission to use the trade +names, trademarks, service marks, or product names of the Licensor, +except as required for reasonable and customary use in describing the +origin of the Work and reproducing the content of the NOTICE file.

  12. +
  13. Disclaimer of Warranty. Unless required by applicable law or +agreed to in writing, Licensor provides the Work (and each +Contributor provides its Contributions) on an “AS IS” BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or +implied, including, without limitation, any warranties or conditions +of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A +PARTICULAR PURPOSE. You are solely responsible for determining the +appropriateness of using or redistributing the Work and assume any +risks associated with Your exercise of permissions under this License.

  14. +
  15. Limitation of Liability. In no event and under no legal theory, +whether in tort (including negligence), contract, or otherwise, +unless required by applicable law (such as deliberate and grossly +negligent acts) or agreed to in writing, shall any Contributor be +liable to You for damages, including any direct, indirect, special, +incidental, or consequential damages of any character arising as a +result of this License or out of the use or inability to use the +Work (including but not limited to damages for loss of goodwill, +work stoppage, computer failure or malfunction, or any and all +other commercial damages or losses), even if such Contributor +has been advised of the possibility of such damages.

  16. +
  17. Accepting Warranty or Additional Liability. While redistributing +the Work or Derivative Works thereof, You may choose to offer, +and charge a fee for, acceptance of support, warranty, indemnity, +or other liability obligations and/or rights consistent with this +License. However, in accepting such obligations, You may act only +on Your own behalf and on Your sole responsibility, not on behalf +of any other Contributor, and only if You agree to indemnify, +defend, and hold each Contributor harmless for any liability +incurred by, or claims asserted against, such Contributor by reason +of your accepting any such warranty or additional liability.

  18. +
+

END OF TERMS AND CONDITIONS

+

APPENDIX: How to apply the Apache License to your work.

+
+

To apply the Apache License to your work, attach the following +boilerplate notice, with the fields enclosed by brackets “{}” +replaced with your own identifying information. (Don’t include +the brackets!) The text should be enclosed in the appropriate +comment syntax for the file format. We also recommend that a +file or class name and description of purpose be included on the +same “printed page” as the copyright notice for easier +identification within third-party archives.

+
+

Copyright [yyyy] [name of copyright owner]

+

Licensed under the Apache License, Version 2.0 (the “License”); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at

+
+
+

Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an “AS IS” BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License.

+
+
+ + +
+
+
+
+
+ +
+
+
+ + + + + \ No newline at end of file diff --git a/minimap.html b/minimap.html new file mode 100644 index 0000000..2f7e26c --- /dev/null +++ b/minimap.html @@ -0,0 +1,139 @@ + + + + + + + + Minimap2 Module Documentation — ensembl-anno 0.1 documentation + + + + + + + + + + + + + +
+
+
+ +
+
+
+ +
+

Minimap2 Module Documentation

+

Minimap2 is a pairwise sequence alignment algorithm designed for efficiently comparing nucleotide sequences. +The algorithm uses a versatile indexing strategy to quickly find approximate matches between sequences, +allowing it to efficiently align long sequences against reference genomes or other sequences.

+

Li, H. (2018). Minimap2: pairwise alignment for nucleotide sequences. Bioinformatics, 34(18), 3094-3100.

+
+
+ensembl.tools.anno.transcriptomic_annotation.minimap.run_minimap2(output_dir: Path, long_read_fastq_dir: Path, genome_file: Path, minimap2_bin: Path = PosixPath('minimap2'), paftools_bin: Path = PosixPath('paftools.js'), max_intron_length: int = 100000, num_threads: int = 1) None[source]
+

Run Minimap2 to align long read data against genome file. +Default Minimap set for PacBio data. +:param output_dir: Working directory path. +:param long_read_fastq_dir: Long read directory path. +:param genome_file: Genome file path. +:param minimap2_bin: Software path. +:param paftools_bin: Software path. +:param max_intron_length: The maximum intron size for alignments. Defaults to 100000. +:param num_threads: Number of available threads.

+
+ +
+ + +
+
+
+
+
+ +
+
+
+ + + + + \ No newline at end of file diff --git a/objects.inv b/objects.inv new file mode 100644 index 0000000000000000000000000000000000000000..febdcfbb284a2c27f1acf362876502b60096d2fe GIT binary patch literal 792 zcmV+z1LyoBAX9K?X>NERX>N99Zgg*Qc_4OWa&u{KZXhxWBOp+6Z)#;@bUGkqZgXXA zVr(s8Zf%ZEX>4U6 zX>%ZBZ*6dLWpi_7WFU2OX>MmAdTeQ8E(&~7J z2=i?t`qlS0)@zn zy%6}&ZMKayM+EN1_wo8dkC_AkT`xJI)$&FQwm&+-&M>H1=@Wu;<2i8u6bz6_7(n*Y zH)}GjB$o_$g?ip_!kR5+lg=jQ=B^10c-y|fStlc(5YU!cg=#YYj*B?eUvZZJ*)WR7a(h6iL|wMd(z}CASW;`&e!#^!pzd6~e!k?E0Kh34fCU#rYaVKDIxm3evHQ Ws=%2`?Dp5vkBZ%DT;eZ@q`B_QDt3YZ literal 0 HcmV?d00001 diff --git a/py-modindex.html b/py-modindex.html new file mode 100644 index 0000000..6668401 --- /dev/null +++ b/py-modindex.html @@ -0,0 +1,185 @@ + + + + + + + Python Module Index — ensembl-anno 0.1 documentation + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/red.html b/red.html new file mode 100644 index 0000000..f34cf04 --- /dev/null +++ b/red.html @@ -0,0 +1,144 @@ + + + + + + + + Red Module Documentation — ensembl-anno 0.1 documentation + + + + + + + + + + + + + +
+
+
+ +
+
+
+ +
+

Red Module Documentation

+

Red is the first repeat-detection tool capable of labeling its training data +and training itself automatically on an entire genome. +Girgis, H.Z. Red: an intelligent, rapid, accurate tool for detecting repeats +de-novo on the genomic scale. BMC Bioinformatics 16, 227 (2015). +https://doi.org/10.1186/s12859-015-0654-5

+
+
+ensembl.tools.anno.repeat_annotation.red.run_red(genome_file: Path, output_dir: Path, red_bin: Path = PosixPath('Red')) str[source]
+

Run Red on genome file

+
+
Parameters:
+
    +
  • genome_file – Genome file path.

  • +
  • output_dir – Working directory path.

  • +
  • red_bin – Red software path.

  • +
+
+
Returns:
+

masked genome file

+
+
+
+ +
+ + +
+
+
+
+
+ +
+
+
+ + + + + \ No newline at end of file diff --git a/repeatmasker.html b/repeatmasker.html new file mode 100644 index 0000000..ba47121 --- /dev/null +++ b/repeatmasker.html @@ -0,0 +1,136 @@ + + + + + + + + Repeatmasker Module Documentation — ensembl-anno 0.1 documentation + + + + + + + + + + + + + +
+
+
+ +
+
+
+ +
+

Repeatmasker Module Documentation

+

RepeatMasker is a program that screens DNA sequences for interspersed +repeats and low complexity DNA sequences. +Smit, AFA, Hubley, R & Green, P. RepeatMasker Open-4.0

+
+
+ensembl.tools.anno.repeat_annotation.repeatmasker.run_repeatmasker(genome_file: PathLike, output_dir: Path, repeatmasker_bin: Path = PosixPath('RepeatMasker'), library: str = '', repeatmasker_engine: str = 'rmblast', species: str = '', num_threads: int = 1) None[source]
+

Executes RepeatMasker on the genome slices and stores the final annotation.gtf in repeatmasker_output +:param genome_file: Genome file path. +:param repeatmasker_path: RepeatMasker executable path. +:param library: Custom repeat library. +:param species: Species name. +:param output_dir: Output directory path. +:param num_threads: Number of threads.

+
+ +
+ + +
+
+
+
+
+ +
+
+
+ + + + + \ No newline at end of file diff --git a/scallop.html b/scallop.html new file mode 100644 index 0000000..eb3b311 --- /dev/null +++ b/scallop.html @@ -0,0 +1,148 @@ + + + + + + + + Scallop Module Documentation — ensembl-anno 0.1 documentation + + + + + + + + + + + + + +
+
+
+ +
+
+
+ +
+

Scallop Module Documentation

+

Scallop is a high-performance tool designed for the accurate and efficient quantification +of transcriptome assembly. +It’s capable of handling large-scale transcriptomic data while providing precise estimates +of transcript abundances. +Scallop’s algorithmic approach allows it to efficiently reconstruct transcript structures +and quantify their expression levels, making it a valuable resource for studying gene +expression and transcriptome analysis.

+

Shao M, Kingsford C. Accurate assembly of transcripts through phase-preserving graph +decomposition. Nat Biotechnol. +2017 Dec;35(12):1167-1169. doi: 10.1038/nbt.4020. Epub 2017 Nov 13. PMID: 29131147; PMCID: PMC5722698.

+
+
+ensembl.tools.anno.transcriptomic_annotation.scallop.run_scallop(output_dir: Path, scallop_bin: Path = PosixPath('scallop'), prlimit_bin: Path = PosixPath('prlimit'), stringtie_bin: Path = PosixPath('stringtie'), memory_limit: int = 42949672960) None[source]
+

Run Scallop assembler on short read data after STAR alignment.

+
+
Parameters:
+
    +
  • output_dir – Working directory path.

  • +
  • scallop_bin – Software path.

  • +
  • prlimit_bin – Software path.

  • +
  • stringtie_bin – Software path.

  • +
  • memory_limit – Memory limit Scallop command Defaults to 40*1024**3.

  • +
+
+
+
+ +
+ + +
+
+
+
+
+ +
+
+
+ + + + + \ No newline at end of file diff --git a/search.html b/search.html new file mode 100644 index 0000000..85eee41 --- /dev/null +++ b/search.html @@ -0,0 +1,139 @@ + + + + + + + Search — ensembl-anno 0.1 documentation + + + + + + + + + + + + + + + + + +
+
+
+ +
+
+
+ +

Search

+ + + + +

+ Searching for multiple words only shows matches that contain + all words. +

+ + +
+ + + +
+ + + +
+ +
+ + +
+
+
+
+
+ +
+
+
+ + + + + \ No newline at end of file diff --git a/searchindex.js b/searchindex.js new file mode 100644 index 0000000..799f146 --- /dev/null +++ b/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"docnames": ["cpg", "dust", "eponine", "genblast", "index", "install", "license", "minimap", "red", "repeatmasker", "scallop", "star", "stringtie", "trf", "trnascan"], "filenames": ["cpg.rst", "dust.rst", "eponine.rst", "genblast.rst", "index.rst", "install.rst", "license.rst", "minimap.rst", "red.rst", "repeatmasker.rst", "scallop.rst", "star.rst", "stringtie.rst", "trf.rst", "trnascan.rst"], "titles": ["CpG Module Documentation", "DustMasker Module Documentation", "Eponine Module Documentation", "Genblast Module Documentation", "Ensembl-anno", "API Setup and installation", "License", "Minimap2 Module Documentation", "Red Module Documentation", "Repeatmasker Module Documentation", "Scallop Module Documentation", "STAR Module Documentation", "Stringtie Module Documentation", "TRF Module Documentation", "tRNAscan-SE Module Documentation"], "terms": {"set": [0, 7, 14], "discrimin": 0, "function": [0, 3], "can": 0, "recogn": 0, "structur": [0, 10], "composit": 0, "featur": [0, 3], "island": 0, "promot": 0, "region": 0, "first": [0, 8], "splice": [0, 11, 12], "donor": 0, "site": [0, 2], "davuluri": 0, "rv": 0, "gross": 0, "i": [0, 1, 2, 3, 6, 7, 8, 9, 10, 11, 12, 13], "zhang": 0, "mq": 0, "comput": [0, 2, 6], "identif": [0, 6], "exon": 0, "human": 0, "genom": [0, 1, 2, 3, 7, 8, 9, 11, 13, 14], "nat": [0, 10], "genet": 0, "2001": 0, "29": [0, 11], "4": [0, 9], "412": 0, "417": 0, "pmid": [0, 2, 10, 14], "11726928": 0, "ensembl": [0, 1, 2, 3, 5, 7, 8, 9, 10, 11, 12, 13, 14], "tool": [0, 1, 2, 3, 4, 7, 8, 9, 10, 11, 12, 13, 14], "anno": [0, 1, 2, 3, 7, 8, 9, 10, 11, 12, 13, 14], "simple_feature_annot": [0, 2], "run_cpg": 0, "genome_fil": [0, 1, 2, 7, 8, 9, 11, 13, 14], "pathlik": [0, 1, 2, 9, 13, 14], "output_dir": [0, 1, 2, 3, 7, 8, 9, 10, 11, 12, 13, 14], "path": [0, 1, 2, 3, 7, 8, 9, 10, 11, 12, 13, 14], "cpg_bin": 0, "posixpath": [0, 1, 2, 3, 7, 8, 9, 10, 11, 12, 13, 14], "cpg_lh": 0, "cpg_min_length": 0, "int": [0, 1, 2, 3, 7, 9, 10, 11, 12, 13, 14], "400": 0, "cpg_min_gc_cont": 0, "50": [0, 6], "cpg_min_o": 0, "float": [0, 2], "0": [0, 2, 6, 9, 11], "6": [0, 5], "num_thread": [0, 1, 2, 3, 7, 9, 11, 12, 13, 14], "1": [0, 1, 2, 3, 5, 6, 7, 9, 11, 12, 13, 14], "none": [0, 1, 2, 3, 7, 9, 10, 11, 12, 13, 14], "sourc": [0, 1, 2, 3, 6, 7, 8, 9, 10, 11, 12, 13, 14], "run": [0, 1, 2, 7, 8, 10, 11], "slice": [0, 1, 2, 3, 9, 13, 14], "param": [0, 1, 2, 3, 7, 9, 12, 13, 14], "file": [0, 1, 2, 3, 6, 7, 8, 9, 11, 13, 14], "type": [0, 6], "work": [0, 1, 2, 3, 6, 7, 8, 10, 11, 12, 13, 14], "directori": [0, 1, 2, 3, 7, 8, 9, 10, 11, 12, 13, 14], "softwar": [0, 1, 2, 3, 6, 7, 8, 10, 11, 12, 13, 14], "min": 0, "length": [0, 3, 12], "gc": 0, "frequenc": 0, "percentag": 0, "ratio": 0, "observ": 0, "expect": 0, "number": [0, 1, 2, 3, 7, 9, 11, 12, 13, 14], "cpgo": 0, "e": 0, "thread": [0, 1, 2, 3, 7, 9, 11, 12, 13, 14], "return": [0, 8], "rtype": 0, "program": [1, 9, 13, 14], "identifi": [1, 3, 6, 14], "mask": [1, 3, 8], "out": [1, 4, 6], "low": [1, 9, 14], "complex": [1, 9], "part": [1, 3, 6], "us": [1, 3, 6, 7, 11, 12], "new": 1, "improv": [1, 6, 12, 14], "dust": 1, "algorithm": [1, 7, 10, 12], "morguli": 1, "A": [1, 6, 11], "gertz": 1, "em": 1, "schaffer": 1, "aa": 1, "agarwala": 1, "r": [1, 3, 9], "fast": [1, 12], "symmetr": 1, "implement": 1, "dna": [1, 2, 9, 13, 14], "sequenc": [1, 2, 3, 7, 9, 13, 14], "repeat_annot": [1, 8, 9, 13], "run_dust": 1, "dust_bin": 1, "mutiprocess": 1, "probabilist": 2, "method": 2, "detect": [2, 8, 14], "transcript": [2, 10, 11, 12], "start": 2, "tss": 2, "mammalian": 2, "good": 2, "specif": [2, 6], "excel": 2, "posit": [2, 14], "accuraci": 2, "down": 2, "ta": 2, "hubbard": 2, "tj": 2, "locat": [2, 13], "re": [2, 3, 13, 14], "2002": 2, "mar": 2, "12": [2, 10], "3": [2, 5, 10], "458": 2, "61": 2, "doi": [2, 8, 10, 11, 12, 13], "10": [2, 8, 10, 11, 12, 13], "1101": 2, "gr": 2, "216102": 2, "11875034": 2, "pmcid": [2, 10], "pmc155284": 2, "run_eponin": 2, "java_bin": 2, "java": 2, "eponine_bin": 2, "hp": 2, "user": 2, "ensw": 2, "c8": 2, "mar21": 2, "sandybridg": 2, "linuxbrew": 2, "opt": 2, "libexec": 2, "scan": 2, "jar": 2, "eponine_threshold": 2, "999": 2, "homolog": 3, "gene": [3, 10, 12, 14], "databas": 3, "One": 3, "kei": 3, "its": [3, 6, 8], "flexibl": 3, "handl": [3, 10], "compar": [3, 7], "task": 3, "accur": [3, 8, 10], "even": [3, 6], "when": 3, "have": [3, 6], "undergon": 3, "signific": 3, "evolutionari": 3, "chang": [3, 6, 12], "thi": [3, 6], "capabl": [3, 8, 10], "make": [3, 6, 10], "valuabl": [3, 10], "resourc": [3, 10], "research": [3, 11], "studi": [3, 10], "evolut": 3, "famili": 3, "across": 3, "divers": 3, "speci": [3, 9], "ha": [3, 6], "been": [3, 6], "wide": [3, 11], "variou": 3, "analys": 3, "avail": [3, 6, 7, 11, 12], "standalon": 3, "command": [3, 10], "line": 3, "differ": [3, 6], "bioinformat": [3, 7, 8, 11], "pipelin": 3, "field": [3, 6], "analysi": [3, 5, 10], "often": 3, "reli": 3, "perform": [3, 6, 10], "sensit": 3, "homologi": 3, "search": [3, 4], "obtain": [3, 6], "insight": 3, "relationship": 3, "conserv": 3, "organ": 3, "she": 3, "chu": 3, "j": [3, 7], "": [3, 6, 10], "uyar": 3, "b": [3, 5], "wang": 3, "k": 3, "chen": 3, "n": 3, "2011": 3, "genblasta": 3, "enabl": [3, 12], "blast": 3, "21": [3, 11], "5": [3, 8, 13, 14], "936": 3, "949": 3, "protein_annot": 3, "run_genblast": 3, "masked_genom": 3, "protein_dataset": 3, "max_intron_length": [3, 7, 11], "genblast_timeout_sec": 3, "10800": 3, "genblast_bin": 3, "convert2blastmask_bin": 3, "convert2blastmask": 3, "makeblastdb_bin": 3, "makeblastdb": 3, "protein_set": 3, "str": [3, 8, 9], "uniprot": 3, "orthodb": 3, "execut": [3, 6, 9, 13, 14], "protein": 3, "dataset": 3, "time": 3, "timeout": 3, "sec": 3, "maximum": [3, 7, 11, 13], "intron": [3, 7, 11], "genblast_timeout": 3, "second": 3, "kit": 4, "check": 4, "instal": 4, "section": [4, 6], "further": 4, "inform": [4, 6], "how": [4, 6], "project": 4, "api": 4, "setup": 4, "licens": 4, "cpg": 4, "modul": 4, "document": [4, 6], "dustmask": 4, "eponin": 4, "genblast": 4, "minimap2": 4, "red": 4, "repeatmask": 4, "scallop": 4, "star": [4, 10], "stringti": [4, 10], "trf": 4, "trnascan": 4, "se": 4, "page": [4, 6], "an": [5, 6, 8, 12], "checkout": 5, "includ": [5, 6], "product": [5, 6], "dev": 5, "hive_mast": 5, "branch": 5, "taxonomi": 5, "orm": 5, "8": 5, "bioperl": 5, "9": [5, 6], "argschema": 5, "directli": 5, "from": [5, 6, 12], "github": 5, "git": 5, "clone": 5, "http": [5, 6, 8], "com": 5, "experiment": 5, "gbiab": 5, "hive": 5, "apach": 6, "version": 6, "2": [6, 11, 13], "januari": 6, "2004": 6, "www": 6, "org": [6, 8], "definit": 6, "shall": 6, "mean": 6, "term": 6, "condit": 6, "reproduct": 6, "distribut": 6, "defin": 6, "through": [6, 10], "licensor": 6, "copyright": 6, "owner": 6, "entiti": 6, "author": 6, "grant": 6, "legal": 6, "union": 6, "act": 6, "all": 6, "other": [6, 7], "control": 6, "ar": 6, "under": 6, "common": 6, "For": 6, "purpos": 6, "power": 6, "direct": 6, "indirect": 6, "caus": 6, "manag": 6, "whether": 6, "contract": 6, "otherwis": 6, "ii": 6, "ownership": 6, "fifti": 6, "percent": 6, "more": 6, "outstand": 6, "share": 6, "iii": 6, "benefici": 6, "you": 6, "your": 6, "individu": 6, "exercis": 6, "permiss": 6, "form": 6, "prefer": 6, "modif": 6, "limit": [6, 10], "code": 6, "configur": 6, "object": 6, "ani": 6, "result": 6, "mechan": 6, "transform": 6, "translat": 6, "compil": 6, "gener": 6, "convers": 6, "media": 6, "authorship": 6, "made": 6, "indic": 6, "notic": 6, "attach": 6, "exampl": 6, "provid": [6, 10], "appendix": 6, "below": 6, "deriv": 6, "base": 6, "which": 6, "editori": 6, "revis": 6, "annot": [6, 9], "elabor": 6, "repres": [6, 12], "whole": [6, 13], "origin": [6, 11], "remain": 6, "separ": 6, "mere": 6, "link": 6, "bind": 6, "name": [6, 9], "interfac": 6, "thereof": 6, "contribut": 6, "addit": 6, "intention": 6, "submit": 6, "inclus": 6, "behalf": 6, "electron": 6, "verbal": 6, "written": 6, "commun": 6, "sent": 6, "mail": 6, "list": [6, 11], "system": 6, "issu": 6, "track": 6, "discuss": 6, "exclud": 6, "conspicu": 6, "mark": 6, "design": [6, 7, 10], "write": 6, "Not": 6, "contributor": 6, "whom": 6, "receiv": 6, "subsequ": 6, "incorpor": 6, "within": 6, "subject": 6, "each": [6, 12], "herebi": 6, "perpetu": 6, "worldwid": 6, "non": 6, "exclus": 6, "charg": 6, "royalti": 6, "free": 6, "irrevoc": 6, "reproduc": 6, "prepar": 6, "publicli": 6, "displai": [6, 13], "sublicens": 6, "patent": 6, "except": 6, "state": 6, "offer": 6, "sell": 6, "import": 6, "transfer": [6, 14], "where": 6, "appli": 6, "onli": 6, "those": 6, "claim": 6, "necessarili": 6, "infring": 6, "alon": 6, "combin": 6, "wa": 6, "If": 6, "institut": 6, "litig": 6, "against": [6, 7], "cross": 6, "counterclaim": 6, "lawsuit": 6, "alleg": 6, "constitut": 6, "contributori": 6, "termin": 6, "date": 6, "redistribut": 6, "mai": 6, "copi": 6, "medium": 6, "without": 6, "meet": 6, "follow": 6, "must": 6, "give": [6, 14], "recipi": 6, "modifi": 6, "carri": 6, "promin": 6, "retain": 6, "trademark": 6, "attribut": 6, "do": 6, "pertain": 6, "text": 6, "readabl": 6, "contain": 6, "least": 6, "one": [6, 14], "place": 6, "along": 6, "wherev": 6, "third": 6, "parti": 6, "normal": 6, "appear": 6, "The": [6, 7, 11], "content": 6, "add": 6, "own": 6, "alongsid": 6, "addendum": 6, "cannot": 6, "constru": 6, "statement": 6, "compli": 6, "submiss": 6, "unless": 6, "explicitli": 6, "notwithstand": 6, "abov": 6, "noth": 6, "herein": 6, "supersed": 6, "agreement": 6, "regard": 6, "doe": 6, "trade": 6, "servic": 6, "requir": 6, "reason": 6, "customari": 6, "describ": 6, "disclaim": 6, "warranti": 6, "applic": 6, "law": 6, "agre": 6, "AS": 6, "basi": 6, "OR": 6, "OF": 6, "kind": 6, "either": 6, "express": [6, 10], "impli": 6, "titl": 6, "merchant": 6, "fit": 6, "FOR": 6, "particular": 6, "sole": 6, "respons": 6, "determin": 6, "appropri": 6, "assum": 6, "risk": 6, "associ": 6, "liabil": 6, "In": 6, "event": 6, "theori": 6, "tort": 6, "neglig": 6, "deliber": 6, "grossli": 6, "liabl": 6, "damag": 6, "special": 6, "incident": 6, "consequenti": 6, "charact": 6, "aris": 6, "inabl": 6, "loss": 6, "goodwil": 6, "stoppag": 6, "failur": 6, "malfunct": 6, "commerci": 6, "advis": 6, "possibl": 6, "accept": 6, "while": [6, 10, 14], "choos": 6, "fee": 6, "support": 6, "indemn": 6, "oblig": 6, "right": 6, "consist": 6, "howev": 6, "indemnifi": 6, "defend": 6, "hold": 6, "harmless": 6, "incur": 6, "assert": 6, "end": 6, "AND": 6, "To": 6, "boilerpl": 6, "enclos": 6, "bracket": 6, "replac": 6, "don": 6, "t": 6, "should": 6, "comment": 6, "syntax": 6, "format": 6, "we": 6, "also": 6, "recommend": 6, "class": 6, "descript": 6, "same": 6, "print": 6, "easier": 6, "archiv": 6, "yyyi": 6, "complianc": 6, "see": 6, "languag": 6, "govern": 6, "pairwis": 7, "align": [7, 10, 11, 12, 13], "effici": [7, 10, 12], "nucleotid": 7, "versatil": 7, "index": 7, "strategi": 7, "quickli": 7, "find": 7, "approxim": 7, "match": [7, 13], "between": 7, "allow": [7, 10], "long": 7, "refer": [7, 11], "li": 7, "h": [7, 8], "2018": 7, "34": 7, "18": 7, "3094": 7, "3100": 7, "transcriptomic_annot": [7, 10, 11, 12], "minimap": 7, "run_minimap2": 7, "long_read_fastq_dir": 7, "minimap2_bin": 7, "paftools_bin": 7, "paftool": 7, "100000": [7, 11], "read": [7, 10, 11, 12], "data": [7, 8, 10, 11, 12], "default": [7, 10, 11], "pacbio": 7, "size": [7, 11, 13], "repeat": [8, 9, 13], "label": 8, "train": 8, "itself": 8, "automat": 8, "entir": 8, "girgi": 8, "z": 8, "intellig": 8, "rapid": 8, "de": [8, 12], "novo": [8, 12], "scale": [8, 10], "bmc": 8, "16": 8, "227": 8, "2015": [8, 12], "1186": 8, "s12859": 8, "015": 8, "0654": 8, "run_r": 8, "red_bin": 8, "paramet": [8, 10, 11], "screen": 9, "interspers": 9, "smit": 9, "afa": 9, "hublei": 9, "green": 9, "p": 9, "open": 9, "run_repeatmask": 9, "repeatmasker_bin": 9, "librari": 9, "repeatmasker_engin": 9, "rmblast": 9, "store": 9, "final": 9, "gtf": 9, "repeatmasker_output": 9, "repeatmasker_path": 9, "custom": 9, "output": 9, "high": 10, "quantif": 10, "transcriptom": [10, 12], "assembli": [10, 12], "It": [10, 12], "larg": 10, "precis": 10, "estim": 10, "abund": 10, "approach": 10, "reconstruct": [10, 12], "quantifi": 10, "level": 10, "shao": 10, "m": [10, 12], "kingsford": 10, "c": 10, "phase": 10, "preserv": 10, "graph": 10, "decomposit": 10, "biotechnol": 10, "2017": 10, "dec": 10, "35": 10, "1167": 10, "1169": 10, "1038": [10, 12], "nbt": [10, 12], "4020": 10, "epub": 10, "nov": 10, "13": 10, "29131147": 10, "pmc5722698": 10, "run_scallop": 10, "scallop_bin": 10, "prlimit_bin": 10, "prlimit": 10, "stringtie_bin": [10, 12], "memory_limit": 10, "42949672960": 10, "assembl": [10, 12], "short": [10, 11, 12], "after": [10, 11], "memori": 10, "40": [10, 13], "1024": 10, "rna": [11, 12, 14], "seq": [11, 12], "dobin": 11, "davi": 11, "ca": 11, "schlesing": 11, "f": 11, "et": 11, "al": 11, "ultrafast": 11, "univers": 11, "2013": 11, "15": [11, 14], "1093": [11, 13], "bts635": 11, "run_star": 11, "short_read_fastq_dir": 11, "delete_pre_trim_fastq": 11, "bool": 11, "fals": [11, 14], "trim_fastq": 11, "max_reads_per_sampl": 11, "star_bin": 11, "samtools_bin": 11, "samtool": 11, "trim_galore_bin": 11, "trim_galor": 11, "delet": 11, "fastq": 11, "trim": 11, "trimgalor": 11, "max": 11, "per": [11, 14], "sampl": 11, "unlimit": 11, "subsample_transcriptomic_data": 11, "fastq_file_list": 11, "subsampl": 11, "pair": 11, "process": 11, "highli": 12, "potenti": 12, "novel": 12, "network": 12, "flow": 12, "well": 12, "option": 12, "step": 12, "quantit": 12, "full": 12, "multipl": 12, "variant": 12, "locu": 12, "pertea": 12, "gm": 12, "antonescu": 12, "cm": 12, "tc": 12, "mendel": 12, "jt": 12, "salzberg": 12, "sl": 12, "natur": 12, "biotechnologi": 12, "3122": 12, "run_stringti": 12, "tandem": 13, "finder": 13, "benson": 13, "g": 13, "analyz": 13, "nucleic": [13, 14], "acid": [13, 14], "1999": 13, "27": 13, "573": 13, "580": 13, "nar": 13, "run_trf": 13, "trf_bin": 13, "match_scor": 13, "mismatch_scor": 13, "delta": 13, "7": 13, "pm": 13, "80": 13, "pi": 13, "minscor": 13, "maxperiod": 13, "500": 13, "weight": 13, "mismatch": 13, "penalti": 13, "indel": 13, "probabl": 13, "minimum": 13, "score": 13, "report": 13, "period": 13, "99": 14, "100": 14, "less": 14, "than": 14, "gigabas": 14, "tm": 14, "eddi": 14, "sr": 14, "1997": 14, "25": 14, "955": 14, "64": 14, "9023104": 14, "snc_rna_annot": 14, "run_trnascan": 14, "trnascan_bin": 14, "trnascan_filt": 14, "eukhighconfidencefilt": 14, "filter": 14}, "objects": {"ensembl.tools.anno.protein_annotation": [[3, 0, 0, "-", "genblast"]], "ensembl.tools.anno.protein_annotation.genblast": [[3, 1, 1, "", "run_genblast"]], "ensembl.tools.anno.repeat_annotation": [[1, 0, 0, "-", "dust"], [8, 0, 0, "-", "red"], [9, 0, 0, "-", "repeatmasker"], [13, 0, 0, "-", "trf"]], "ensembl.tools.anno.repeat_annotation.dust": [[1, 1, 1, "", "run_dust"]], "ensembl.tools.anno.repeat_annotation.red": [[8, 1, 1, "", "run_red"]], "ensembl.tools.anno.repeat_annotation.repeatmasker": [[9, 1, 1, "", "run_repeatmasker"]], "ensembl.tools.anno.repeat_annotation.trf": [[13, 1, 1, "", "run_trf"]], "ensembl.tools.anno.simple_feature_annotation": [[0, 0, 0, "-", "cpg"], [2, 0, 0, "-", "eponine"]], "ensembl.tools.anno.simple_feature_annotation.cpg": [[0, 1, 1, "", "run_cpg"]], "ensembl.tools.anno.simple_feature_annotation.eponine": [[2, 1, 1, "", "run_eponine"]], "ensembl.tools.anno.snc_rna_annotation": [[14, 0, 0, "-", "trnascan"]], "ensembl.tools.anno.snc_rna_annotation.trnascan": [[14, 1, 1, "", "run_trnascan"]], "ensembl.tools.anno.transcriptomic_annotation": [[7, 0, 0, "-", "minimap"], [10, 0, 0, "-", "scallop"], [11, 0, 0, "-", "star"], [12, 0, 0, "-", "stringtie"]], "ensembl.tools.anno.transcriptomic_annotation.minimap": [[7, 1, 1, "", "run_minimap2"]], "ensembl.tools.anno.transcriptomic_annotation.scallop": [[10, 1, 1, "", "run_scallop"]], "ensembl.tools.anno.transcriptomic_annotation.star": [[11, 1, 1, "", "run_star"], [11, 1, 1, "", "subsample_transcriptomic_data"]], "ensembl.tools.anno.transcriptomic_annotation.stringtie": [[12, 1, 1, "", "run_stringtie"]]}, "objtypes": {"0": "py:module", "1": "py:function"}, "objnames": {"0": ["py", "module", "Python module"], "1": ["py", "function", "Python function"]}, "titleterms": {"cpg": 0, "modul": [0, 1, 2, 3, 5, 7, 8, 9, 10, 11, 12, 13, 14], "document": [0, 1, 2, 3, 7, 8, 9, 10, 11, 12, 13, 14], "dustmask": 1, "eponin": 2, "genblast": 3, "ensembl": 4, "anno": 4, "content": 4, "index": 4, "indic": 4, "tabl": 4, "api": 5, "setup": 5, "instal": 5, "requir": 5, "softwar": 5, "python": 5, "licens": 6, "minimap2": 7, "red": 8, "repeatmask": 9, "scallop": 10, "star": 11, "stringti": 12, "trf": 13, "trnascan": 14, "se": 14}, "envversion": {"sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.viewcode": 1, "sphinx": 58}, "alltitles": {"CpG Module Documentation": [[0, "module-ensembl.tools.anno.simple_feature_annotation.cpg"]], "DustMasker Module Documentation": [[1, "module-ensembl.tools.anno.repeat_annotation.dust"]], "Eponine Module Documentation": [[2, "module-ensembl.tools.anno.simple_feature_annotation.eponine"]], "Genblast Module Documentation": [[3, "module-ensembl.tools.anno.protein_annotation.genblast"]], "Ensembl-anno": [[4, "ensembl-anno"]], "Contents": [[4, "contents"]], "Index": [[4, null]], "Indices and tables": [[4, "indices-and-tables"]], "API Setup and installation": [[5, "api-setup-and-installation"]], "Requirements": [[5, "requirements"]], "Software": [[5, "software"]], "Python Modules": [[5, "python-modules"]], "Installation": [[5, "installation"]], "License": [[6, "license"]], "Minimap2 Module Documentation": [[7, "module-ensembl.tools.anno.transcriptomic_annotation.minimap"]], "Red Module Documentation": [[8, "module-ensembl.tools.anno.repeat_annotation.red"]], "Repeatmasker Module Documentation": [[9, "module-ensembl.tools.anno.repeat_annotation.repeatmasker"]], "Scallop Module Documentation": [[10, "module-ensembl.tools.anno.transcriptomic_annotation.scallop"]], "STAR Module Documentation": [[11, "module-ensembl.tools.anno.transcriptomic_annotation.star"]], "Stringtie Module Documentation": [[12, "module-ensembl.tools.anno.transcriptomic_annotation.stringtie"]], "TRF Module Documentation": [[13, "module-ensembl.tools.anno.repeat_annotation.trf"]], "tRNAscan-SE Module Documentation": [[14, "module-ensembl.tools.anno.snc_rna_annotation.trnascan"]]}, "indexentries": {"ensembl.tools.anno.simple_feature_annotation.cpg": [[0, "module-ensembl.tools.anno.simple_feature_annotation.cpg"]], "module": [[0, "module-ensembl.tools.anno.simple_feature_annotation.cpg"], [1, "module-ensembl.tools.anno.repeat_annotation.dust"], [2, "module-ensembl.tools.anno.simple_feature_annotation.eponine"], [3, "module-ensembl.tools.anno.protein_annotation.genblast"], [7, "module-ensembl.tools.anno.transcriptomic_annotation.minimap"], [8, "module-ensembl.tools.anno.repeat_annotation.red"], [9, "module-ensembl.tools.anno.repeat_annotation.repeatmasker"], [10, "module-ensembl.tools.anno.transcriptomic_annotation.scallop"], [11, "module-ensembl.tools.anno.transcriptomic_annotation.star"], [12, "module-ensembl.tools.anno.transcriptomic_annotation.stringtie"], [13, "module-ensembl.tools.anno.repeat_annotation.trf"], [14, "module-ensembl.tools.anno.snc_rna_annotation.trnascan"]], "run_cpg() (in module ensembl.tools.anno.simple_feature_annotation.cpg)": [[0, "ensembl.tools.anno.simple_feature_annotation.cpg.run_cpg"]], "ensembl.tools.anno.repeat_annotation.dust": [[1, "module-ensembl.tools.anno.repeat_annotation.dust"]], "run_dust() (in module ensembl.tools.anno.repeat_annotation.dust)": [[1, "ensembl.tools.anno.repeat_annotation.dust.run_dust"]], "ensembl.tools.anno.simple_feature_annotation.eponine": [[2, "module-ensembl.tools.anno.simple_feature_annotation.eponine"]], "run_eponine() (in module ensembl.tools.anno.simple_feature_annotation.eponine)": [[2, "ensembl.tools.anno.simple_feature_annotation.eponine.run_eponine"]], "ensembl.tools.anno.protein_annotation.genblast": [[3, "module-ensembl.tools.anno.protein_annotation.genblast"]], "run_genblast() (in module ensembl.tools.anno.protein_annotation.genblast)": [[3, "ensembl.tools.anno.protein_annotation.genblast.run_genblast"]], "ensembl.tools.anno.transcriptomic_annotation.minimap": [[7, "module-ensembl.tools.anno.transcriptomic_annotation.minimap"]], "run_minimap2() (in module ensembl.tools.anno.transcriptomic_annotation.minimap)": [[7, "ensembl.tools.anno.transcriptomic_annotation.minimap.run_minimap2"]], "ensembl.tools.anno.repeat_annotation.red": [[8, "module-ensembl.tools.anno.repeat_annotation.red"]], "run_red() (in module ensembl.tools.anno.repeat_annotation.red)": [[8, "ensembl.tools.anno.repeat_annotation.red.run_red"]], "ensembl.tools.anno.repeat_annotation.repeatmasker": [[9, "module-ensembl.tools.anno.repeat_annotation.repeatmasker"]], "run_repeatmasker() (in module ensembl.tools.anno.repeat_annotation.repeatmasker)": [[9, "ensembl.tools.anno.repeat_annotation.repeatmasker.run_repeatmasker"]], "ensembl.tools.anno.transcriptomic_annotation.scallop": [[10, "module-ensembl.tools.anno.transcriptomic_annotation.scallop"]], "run_scallop() (in module ensembl.tools.anno.transcriptomic_annotation.scallop)": [[10, "ensembl.tools.anno.transcriptomic_annotation.scallop.run_scallop"]], "ensembl.tools.anno.transcriptomic_annotation.star": [[11, "module-ensembl.tools.anno.transcriptomic_annotation.star"]], "run_star() (in module ensembl.tools.anno.transcriptomic_annotation.star)": [[11, "ensembl.tools.anno.transcriptomic_annotation.star.run_star"]], "subsample_transcriptomic_data() (in module ensembl.tools.anno.transcriptomic_annotation.star)": [[11, "ensembl.tools.anno.transcriptomic_annotation.star.subsample_transcriptomic_data"]], "ensembl.tools.anno.transcriptomic_annotation.stringtie": [[12, "module-ensembl.tools.anno.transcriptomic_annotation.stringtie"]], "run_stringtie() (in module ensembl.tools.anno.transcriptomic_annotation.stringtie)": [[12, "ensembl.tools.anno.transcriptomic_annotation.stringtie.run_stringtie"]], "ensembl.tools.anno.repeat_annotation.trf": [[13, "module-ensembl.tools.anno.repeat_annotation.trf"]], "run_trf() (in module ensembl.tools.anno.repeat_annotation.trf)": [[13, "ensembl.tools.anno.repeat_annotation.trf.run_trf"]], "ensembl.tools.anno.snc_rna_annotation.trnascan": [[14, "module-ensembl.tools.anno.snc_rna_annotation.trnascan"]], "run_trnascan() (in module ensembl.tools.anno.snc_rna_annotation.trnascan)": [[14, "ensembl.tools.anno.snc_rna_annotation.trnascan.run_trnascan"]]}}) \ No newline at end of file diff --git a/star.html b/star.html new file mode 100644 index 0000000..eff198b --- /dev/null +++ b/star.html @@ -0,0 +1,162 @@ + + + + + + + + STAR Module Documentation — ensembl-anno 0.1 documentation + + + + + + + + + + + + + +
+
+
+ +
+
+
+ +
+

STAR Module Documentation

+

The STAR (Spliced Transcripts Alignment to a Reference) alignment tool is widely used +in genomics research for aligning RNA-seq data to a reference genome. +Dobin A, Davis CA, Schlesinger F, et al. STAR: ultrafast universal RNA-seq aligner. +Bioinformatics. 2013;29(1):15-21. doi:10.1093/bioinformatics/bts635

+
+
+ensembl.tools.anno.transcriptomic_annotation.star.run_star(genome_file: Path, output_dir: Path, short_read_fastq_dir: Path, delete_pre_trim_fastq: bool = False, trim_fastq: bool = False, max_reads_per_sample: int = 0, max_intron_length: int = 100000, num_threads: int = 1, star_bin: Path = PosixPath('star'), samtools_bin: Path = PosixPath('samtools'), trim_galore_bin: Path = PosixPath('trim_galore')) None[source]
+

Run STAR alignment on list of short read data.

+
+
Parameters:
+
    +
  • genome_file – Genome file path.

  • +
  • output_dir – Working directory path.

  • +
  • short_read_fastq_dir – Short read directory path.

  • +
  • delete_pre_trim_fastq – Delete the original fastq files after trimming. Defaults to False.

  • +
  • trim_fastq – Trim short read files using TrimGalore. Defaults to False.

  • +
  • max_reads_per_sample – Max number of reads per sample. Defaults to 0 (unlimited).

  • +
  • max_intron_length – The maximum intron size for alignments. Defaults to 100000.

  • +
  • num_threads – Number of available threads.

  • +
  • star_bin – Software path.

  • +
  • samtools_bin – Software path.

  • +
  • trim_galore_bin – Software path.

  • +
+
+
+
+ +
+
+ensembl.tools.anno.transcriptomic_annotation.star.subsample_transcriptomic_data(fastq_file_list: List[Path], num_threads: int = 2) None[source]
+

Subsample paired fastq files.

+
+
Parameters:
+
    +
  • fastq_file_list – List of fastq file path to process.

  • +
  • num_threads – number of threads

  • +
+
+
+
+ +
+ + +
+
+
+
+
+ +
+
+
+ + + + + \ No newline at end of file diff --git a/stringtie.html b/stringtie.html new file mode 100644 index 0000000..e7c4975 --- /dev/null +++ b/stringtie.html @@ -0,0 +1,135 @@ + + + + + + + + Stringtie Module Documentation — ensembl-anno 0.1 documentation + + + + + + + + + + + + + +
+
+
+ +
+
+
+ +
+

Stringtie Module Documentation

+

StringTie is a fast and highly efficient assembler of RNA-Seq alignments into potential transcripts. +It uses a novel network flow algorithm as well as an optional de novo assembly step to assemble and +quantitate full-length transcripts representing multiple splice variants for each gene locus. +Pertea M, Pertea GM, Antonescu CM, Chang TC, Mendell JT & Salzberg SL. StringTie enables improved +reconstruction of a transcriptome from RNA-seq reads Nature Biotechnology 2015, doi:10.1038/nbt.3122

+
+
+ensembl.tools.anno.transcriptomic_annotation.stringtie.run_stringtie(output_dir: Path, stringtie_bin: Path = PosixPath('stringtie'), num_threads: int = 1) None[source]
+

StringTie assembler of short read data. +:param output_dir: Working directory path. +:param stringtie_bin: Software path. +:param num_threads: Number of available threads.

+
+ +
+ + +
+
+
+
+
+ +
+
+
+ + + + + \ No newline at end of file diff --git a/trf.html b/trf.html new file mode 100644 index 0000000..223dadd --- /dev/null +++ b/trf.html @@ -0,0 +1,141 @@ + + + + + + + + TRF Module Documentation — ensembl-anno 0.1 documentation + + + + + + + + + + + + + +
+
+
+ +
+
+
+ +
+

TRF Module Documentation

+

Tandem Repeats Finder is a program to locate and display tandem repeats in DNA sequences. +Benson G. Tandem repeats finder: a program to analyze DNA sequences. +Nucleic Acids Res. 1999; 27(2):573–580. doi:10.1093/nar/27.2.573

+
+
+ensembl.tools.anno.repeat_annotation.trf.run_trf(genome_file: PathLike, output_dir: Path, num_threads: int = 1, trf_bin: Path = PosixPath('trf'), match_score: int = 2, mismatch_score: int = 5, delta: int = 7, pm: int = 80, pi: int = 10, minscore: int = 40, maxperiod: int = 500) None[source]
+

Executes TRF on genomic slices +:param genome_file: Genome file path. +:param output_dir: working directory path. +:param num_threads: int, number of threads. +:param trf_bin: TRF software path. +:param match_score: Matching weight. +:param mismatch_score: Mismatching penalty. +:param delta: Indel penalty. +:param pm: Match probability (whole number). +:param pi: Indel probability (whole number). +:param minscore: Minimum alignment score to report. +:param maxperiod: Maximum period size to report.

+
+ +
+ + +
+
+
+
+
+ +
+
+
+ + + + + \ No newline at end of file diff --git a/trnascan.html b/trnascan.html new file mode 100644 index 0000000..ddac21c --- /dev/null +++ b/trnascan.html @@ -0,0 +1,132 @@ + + + + + + + + tRNAscan-SE Module Documentation — ensembl-anno 0.1 documentation + + + + + + + + + + + + +
+
+
+ +
+
+
+ +
+

tRNAscan-SE Module Documentation

+

tRNAscan-SE identifies 99-100% of transfer RNA genes in DNA sequence while +giving less than one false positive per 15 gigabases. +Lowe TM, Eddy SR: tRNAscan-SE: a program for improved detection of transfer +RNA genes in genomic sequence. +Nucleic Acids Res. 1997, 25(5):955-64. [PMID: 9023104]

+
+
+ensembl.tools.anno.snc_rna_annotation.trnascan.run_trnascan(genome_file: PathLike, output_dir: Path, trnascan_bin: Path = PosixPath('tRNAscan-SE'), trnascan_filter: Path = PosixPath('EukHighConfidenceFilter'), num_threads: int = 1) None[source]
+

Executes tRNAscan-SE on genomic slices +:param genome_file: Genome file path. +:param trnascan_bin: tRNAscan-SE software path. +:param trnascan_filter: tRNAscan-SE filter set path. +:param output_dir: working directory path. +:param num_threads: int, number of threads.

+
+ +
+ + +
+
+
+
+
+ +
+
+
+ + + + + \ No newline at end of file