From e89664a5befc523d4ea3b4df24dccad27c39d648 Mon Sep 17 00:00:00 2001 From: ens-ftricomi Date: Thu, 28 Sep 2023 15:31:45 +0000 Subject: [PATCH] deploy: 23ba3b80bad225c845a0f605e67632cc931d09b5 --- .buildinfo | 4 + .doctrees/cpg.doctree | Bin 0 -> 20286 bytes .doctrees/dust.doctree | Bin 0 -> 14598 bytes .doctrees/environment.pickle | Bin 0 -> 547331 bytes .doctrees/eponine.doctree | Bin 0 -> 18505 bytes .doctrees/genblast.doctree | Bin 0 -> 28543 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 -> 20870 bytes .doctrees/red.doctree | Bin 0 -> 12639 bytes .doctrees/repeatmasker.doctree | Bin 0 -> 20305 bytes .doctrees/scallop.doctree | Bin 0 -> 18131 bytes .doctrees/star.doctree | Bin 0 -> 34952 bytes .doctrees/stringtie.doctree | Bin 0 -> 13716 bytes .doctrees/trf.doctree | Bin 0 -> 27933 bytes .doctrees/trnascan.doctree | Bin 0 -> 17077 bytes .nojekyll | 0 .../anno/protein_annotation/genblast.html | 615 ++++++++++++ .../tools/anno/repeat_annotation/dust.html | 306 ++++++ .../tools/anno/repeat_annotation/red.html | 272 ++++++ .../anno/repeat_annotation/repeatmasker.html | 378 +++++++ .../tools/anno/repeat_annotation/trf.html | 410 ++++++++ .../anno/simple_feature_annotation/cpg.html | 369 +++++++ .../simple_feature_annotation/eponine.html | 351 +++++++ .../anno/snc_rna_annotation/trnascan.html | 405 ++++++++ .../transcriptomic_annotation/minimap.html | 370 +++++++ .../transcriptomic_annotation/scallop.html | 308 ++++++ .../anno/transcriptomic_annotation/star.html | 727 ++++++++++++++ .../transcriptomic_annotation/stringtie.html | 257 +++++ _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 | 183 ++++ doctrees/cpg.doctree | Bin 0 -> 20286 bytes doctrees/dust.doctree | Bin 0 -> 14598 bytes doctrees/environment.pickle | Bin 0 -> 547330 bytes doctrees/eponine.doctree | Bin 0 -> 18505 bytes doctrees/genblast.doctree | Bin 0 -> 28543 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 -> 20870 bytes doctrees/red.doctree | Bin 0 -> 12639 bytes doctrees/repeatmasker.doctree | Bin 0 -> 20305 bytes doctrees/scallop.doctree | Bin 0 -> 18131 bytes doctrees/star.doctree | Bin 0 -> 34952 bytes doctrees/stringtie.doctree | Bin 0 -> 13716 bytes doctrees/trf.doctree | Bin 0 -> 27933 bytes doctrees/trnascan.doctree | Bin 0 -> 17077 bytes dust.html | 165 ++++ eponine.html | 172 ++++ genblast.html | 218 +++++ genindex.html | 281 ++++++ html/output.json | 9 + html/output.txt | 3 + index.html | 149 +++ install.html | 155 +++ license.html | 301 ++++++ minimap.html | 184 ++++ objects.inv | Bin 0 -> 792 bytes py-modindex.html | 185 ++++ red.html | 160 +++ repeatmasker.html | 182 ++++ scallop.html | 177 ++++ search.html | 139 +++ searchindex.js | 1 + star.html | 221 +++++ stringtie.html | 160 +++ trf.html | 206 ++++ trnascan.html | 167 ++++ 97 files changed, 11351 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..d1a7c987acf6b5b88164404e9a1d68c9af1f1499 GIT binary patch literal 20286 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 literal 0 HcmV?d00001 diff --git a/.doctrees/environment.pickle b/.doctrees/environment.pickle new file mode 100644 index 0000000000000000000000000000000000000000..6877c7a8e66b8d6058e896a5bba794674ea0900e GIT binary patch literal 547331 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 z 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 a<8|DmOAfR{o{BUrB7YVnX%myQTmKLKOYV~Z literal 0 HcmV?d00001 diff --git a/.doctrees/genblast.doctree b/.doctrees/genblast.doctree new file mode 100644 index 0000000000000000000000000000000000000000..d86992c04b560baf6868c941d22283318e99fdd1 GIT binary patch literal 28543 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
)4P;0B9;lsCP17Ad^@Culo z2o4cvg51^24i9UWgT0z{kxt$Urg=Eg$jJ_3{9*eU8hnopbDTpE3a;g`gNEQ{IA`mz zFgQGLm$IVv2qM- zw;-c>GTQKyP7s%$$GwH^#~IieHGxxYYa?;hn5g=XN^MeCP_ht4x z&@%Y3VAN&!9g0$-9tSRYhu6bNWN`Oh(>CKC!Kxlj-HdC`3~-zgtums+1N<@II3A5~ z$I`r_5{&MMp)K2|IENjbE!#A?V`3bgx;?u8NjSns!ut^q@SqEk1%BnC2k-{tP&#mX gHoncAc-F95rr)Mcvq`7M)!G#8qrgZL7r$BmUm~@>&Hw-a 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..1135099271a4f3b4452acfaa2a0581eabce89653 GIT binary patch literal 20870 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 Ufp*DLm%0@B;~+_!n6TaYA453^d;kCd literal 0 HcmV?d00001 diff --git a/.doctrees/red.doctree b/.doctrees/red.doctree new file mode 100644 index 0000000000000000000000000000000000000000..5faa08da6cebfd89a0347aa6418e84ad6a554eae GIT binary patch literal 12639 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 literal 0 HcmV?d00001 diff --git a/.doctrees/repeatmasker.doctree b/.doctrees/repeatmasker.doctree new file mode 100644 index 0000000000000000000000000000000000000000..e56e5b070f53b373706f8f8b6ab70332ab3bb3ee GIT binary patch literal 20305 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 literal 0 HcmV?d00001 diff --git a/.doctrees/scallop.doctree b/.doctrees/scallop.doctree new file mode 100644 index 0000000000000000000000000000000000000000..610e945acff63530210372f1eb7807dbb3f80c5e GIT binary patch literal 18131 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 Mf+W4fgstZP0}!cz`~Uy| literal 0 HcmV?d00001 diff --git a/.doctrees/star.doctree b/.doctrees/star.doctree new file mode 100644 index 0000000000000000000000000000000000000000..5385ae64d1ed5a5c032e34a7d5d547490e38f21f GIT binary patch literal 34952 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 EzxWC1kpKVy literal 0 HcmV?d00001 diff --git a/.doctrees/stringtie.doctree b/.doctrees/stringtie.doctree new file mode 100644 index 0000000000000000000000000000000000000000..952b4e07b68d52e7bb70253d6877a449a2afa851 GIT binary patch literal 13716 zcmeHO+m9th8K2p?pWT_+S(XLeou!F^oyD0mJ0MC%F5*JGtUDpQ8$<)NeY)$M?lXP5 zd;2mMWf6(!PEr^n?IjV=kodrZ`k;nH5;VSQlmz($4B51b zWSQ>js`|d~_g$*$tM5ED@y)$EN5p@8KJZM-*{N!V;kX71Vm@uSdemZ07(W-E{!)A; zUg9&pwjH>Uud|qspoeZ+w&61;ek|s5)IGH9pqh-I3YZ>Ru9FQnC(KE6>alpqoZ%Cp z722%uiJ!a}`j*oOEvB4zjmT!o0||Xi%t9kEaQqV6A&#!u|Cw0wJn3oRFpSLwKBHzL znPYr1kz|99+m^%Pji{#aiWY*6S`-2Sl6cHA0+Mb@x3wTZBc3N5ttFqPjmXPiYMQ?3 zvpV&O_*AGh=u>RYo5#&V<_UAmT;va~nr@4&`jO)>e|6jSH&>YxuvX1p(HzGuzku0b zRWi96q~KKj0J5AscOa^nBYeVg47O8%Q6g;K1m4Y?0oeQS?-u+!g@30>4nW~sg8L;t z?rD}E^LtwY?++^pE7j0-p+;h;8v2?O=)UEJZp+eDY72!vsu@Qyzei56vd{76RJ#gnqw%Y)iCW{h1KhpZb3^5*&7Ul`NYnJjr&(F zvdfBQTMdVtGEgihbQRAH@nUJVk_#DBE1w9J2-b@E9e0b_io-%OHl=R6+nA%_`c`PR zKtkDOwoQLEM{zxJG)!eM8s?@P>?%RXJO$KJmWbiXvTB`Aqq!1>AMhac#G;tK5EO?apPz zaIN*VGu5>-cigq=)WYf=Yq#GXi>P(%|BC;gQ+%@gAfVkZWB-N-4O-98O!4nNbJ4sP z!F@E1gNP+nx%Q@uXV3BF&^{T!<*>l=3s`GZ8P>40E}d4EEJu;?dY>`wbj%;vU!<>= zc!|5leF+nmwsCAi^g{4V_YNc2Y2b?*AP@>?EcD@5N)(pdDDNcdJmdz}4)t6*mGwMzdRcLzmKvHO7OYbQM%T5|%F4aU1_G1t z_9gIsNN`A7DcS*~+b45^e`ue;C2?f`<8yP|>}`%q{2)+WLCh9>^H~x@Y<$E!EA1p^ zc3Sp&;AylMoEBl;-(oRYu?6d8$%f}w@5WWU-A>_={b>eP*!F+;1eliEyyh0&EaCk&;NPCYK3z=_Q*en*zul}ELh|CY9r)KOF zSvg!}g&Zv#B&?3yTWv?Wl8;GYE;i*Dzt|gNKI+6;(U1wu=KW16WEGOm%yj>hV&=Br=2pAJ0s>Gs8 zsQC>R#^9q6pkscJj#3`eE$oNmJ#46V*X6Pm^AGMXic*}~U6+(MNbPR`nBU>lS6)+J z?qwdV+^=w~N}cjsnD860qi<(OFK4TVTxSUQp36((0=b@MOQTa`XluAEVX8uJ!b5~1l-q?TUUw6z*rc5*E5EV@M_bItvmfO6o zKfQuRi^gldm0Pa)_Wo?v{8Ja>Yu*Ze2DHC{@O+@Ze7*4;;R{*db3Nv3q3ahy0Uy05 zH9kCL2G_jQmmVK=JAzU30u33^JoLWPo4v)E;ggmlk~)QGdaV1NE)}fT=Um#LFFUkb zs%tpos#}^Jv9jd+x*+mA*ALa8rTO9I2*<}D-a`;-Ud{m7PkcGrZA01-M-CQxrSg{A zav`7XE2P;qj5PN!Xpl(q-TsqzjU?&h*9;~v_n*A0wWO2h@nj5}dI?cyI1%4+s9x<) zaQJ8<=I^ucbq^x12=E74#8PRm3FVvpCF=)e^CHHkfw))Pc&qRHO%M^5hh0yoUzVkPqY!~605g;Kxa1iLB1>92r&(JGI?^QDvZ(rJ-h(2*k( z2VQ9FbF?kR!jooPkkF-cc)@TJbZ4jAYZWGYg!YdY zMdFC^_h~j&mB*f~QP4@=-w8^>-CI@}Mgnib_4{ zn2^qp=~JE{F1qz_8&_JTv2A^5I1f#DwTB^Eie%>V0a^0V3SqC$!dlg8rO5mxwFnskz2(foXn258so#eI(tmG`~-C(M|KQ-a~S( zU!vZF8X0BxQ(g~%`xh~|-^xVM`*|WD1&wNju-$g8OI^Q8T}uSMEC@8O;!i4{RQpo% z*+LtiZwo)EzB<}-!Cxa{g9_eE)b%P2$~c7V%@>Mn6i)KFK7LDMq(0>LoQKzk;h_lr z7!dsp1`h~6u{|94L|{%x_-+6`13FTq)PZB4eG6gx$^ST?jG;ZXsM3& zo;hFt7>2K+V#a~n-!XVV#gHh&DTW9Ps+c3fE4u2X+oxRo_l^OhVSVEU8q`}YH}qK1 z+x2rBO_PMLUPE$DmxtlBsHh3xxP-w2DvE>~PEkZ)P(>|B4=QX@Qvd1lB^UnV!w8>x z&x16mx0+7$+f23V>Jget>Z<>^oafID!*fw#lfd&~3?5KnB<64mBLage?6B~xF8b>H zkc+-GjOeMl0vgm?UGr^w*)|RFx$^hatlFD%Ca(^|WKlm;1fKxCEss+;sTTGFB-e2I z5d=iMy!L(oM@c&Wr{bosxtKo~M$A+fFVUdhx+o+V^40%mG$vX7MFJw{;gw-{C_+t} zkxT4zRPhBD>1NQ~z1()HQ>dl&%jzK$8R>r#}Pl5grwT zWVR#CezZfiB(GSJVZpUERo%AbZ<34H=1t=xBYX-u9ty&7Q=wN;YEXEea$H$gy2lSC zkI1U{ySRp(cibe&LS=o_gs@~jE@YuH*Twb>(~@~NKbh^KR%9A!C9T7i*Xt}TQ!VsN zYm~}8wX~3xs6ziJsud`j%d#Z4cl6B4ea&TlRMbk^g1Cxmzy^vGWx4M}i1JoDJ~zTE zX&+|bH6nVWd`^#iDkfI5(&0mCi!34L(*X;q+7b2B3&gr8h(;YD<)w_6Pd-d{Lxs%h z{05()vPXI2h8HA{SP*J0FWx{kj;OV!B=~6D(^rt2kow?9>aH82 zN|zNro*U(}REqiYbrF7G^WiqHd!|R80$?K`|MSR6=j? zL#XehJ1v``#xy>6fLBZn_g~5D1Yck~7O+BzXcXkF69%hA4Un5d8q1-=1I){`7FuQi zy3Rtv)x3!xK=KzCk5S80Gs6S0 zq5+#1=A)dKCY%>7!lX(4d6O5g$Z%EEa-r8@w&S@0Q;Q>omFT$Cv;vDRg)tZE=>kd< zLXd>Zsnj9hT!$b`02h$14Xa7IsdWqGw^ToWjGjOwK#4D8;&UGJRDi|H7p+N9lVos@EgrA^n&%(RWt`xSr}e*{l;p{ zucw}Z0rXUn--UWYQNqT&m0Qky0C>*%b-itRYRRX+HJzR^y=1bR%&%H3tP2`&`&Bb+ z*&sF(YBhL~f$FAn(|i#&*-|t2%mhdZfA;v{VAlz?9aWTqqZ}OeJ8rvV`iI1|v6|c) zU&XaVevPc6Vp>a}UDQp~e(6xW^f#a^AVlxY$V2?5UulS+ULD-n8KjR5xbQAmFc}JY_W1QWdTpuVMJzxfORmbx5@9$CU<#%cBC5h{kk_Q3&5x8? zDH|!8F;>k{_!))xj+O0hWIQL6 zo12cigY5SfcZ>U!QW?~Q6=2niuhRbgd!U6p^Skx84W+{5M@<&-*`hfMd}np~O#mqf zn9CN5T4_J2$YP7^hqwUqZ`E8o^AOSXXj@~}d!{twOiEP@I#QY+3y>euig$hcT*()# z_K2yv8&SkW<(cl~%SH6P5Hg;5{0 Z9Nmr#a-s$WLZs#q{gXgR8=0t9{TB_#fn)#x literal 0 HcmV?d00001 diff --git a/.doctrees/trf.doctree b/.doctrees/trf.doctree new file mode 100644 index 0000000000000000000000000000000000000000..61be72e788e80963a1f8f9f03b8c649c37a808f2 GIT binary patch literal 27933 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 RL;@MnJ`0SraY=fe{{<|}!KDBI 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..cb71cf4 --- /dev/null +++ b/_modules/ensembl/tools/anno/protein_annotation/genblast.html @@ -0,0 +1,615 @@ + + + + + + + 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 + + :param masked_genome: Masked genome file path. + :type masked_genome: Path + :param output_dir: Working directory path. + :type output_dir: Path + :param protein_dataset: Protein dataset (Uniprot/OrthoDb) path. + :type protein_dataset: Path + :param genblast_timeout_secs: Time for timeout (sec). + :type genblast_timeout_secs: int, default 10800 + :param max_intron_length: Maximum intron length. + :type max_intron_length: int + :param genblast_bin: Software path. + :type genblast_bin: Path, default genblast + :param convert2blastmask_bin: Software path. + :type convert2blastmask_bin: Path, default convert2blastmask + :param makeblastdb_bin: Software path. + :type makeblastdb_bin: Path, default makeblastdb + :param genblast_timeout: seconds + :type genblast_timeout: int, default 1 + :param num_threads: int, number of threads. + :type num_threads: int, default 1 + :param protein_set: Source + :type str: ["uniprot", "orthodb"] + + :return: None + :rtype: None + + """ + + 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..cc62410 --- /dev/null +++ b/_modules/ensembl/tools/anno/repeat_annotation/dust.html @@ -0,0 +1,306 @@ + + + + + + + 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 + :param genome_file: Genome file path. + :type genome_file: PathLike + :param output_dir: Working directory path. + :type output_dir: Path + :param dust_bin: Dust software path. + :type dust_bin: Path, default dustmasker + :param num_threads: Number of threads. + :type num_threads: int, default 1 + + :return: None + :rtype: None + """ + + 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..c010a31 --- /dev/null +++ b/_modules/ensembl/tools/anno/repeat_annotation/red.html @@ -0,0 +1,272 @@ + + + + + + + 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 + :param genome_file: Genome file path. + :type genome_file: Path + :param output_dir: Working directory path. + :type output_dir: Path + :param red_bin: Red software path. + :type red_bin: Path, default Red + + :return: Masked genome file + :rtype: str + """ + 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..f086cc4 --- /dev/null +++ b/_modules/ensembl/tools/anno/repeat_annotation/repeatmasker.html @@ -0,0 +1,378 @@ + + + + + + + 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 + + :param genome_file: Genome file path. + :type genome_file: PathLike + :param output_dir: Output directory path. + :type output_dir: Path + :param repeatmasker_bin: RepeatMasker executable path. + :type repeatmasker_bin: Path, default RepeatMasker + :param library: Custom repeat library. + :type library: str + :param repeatmasker_engine: RepeatMasker engine. + :type repeatmasker_engine: str, default rmblast + :param species: Species name. + :type species: str + :param num_threads: Number of threads. + :type num_threads: int, default 1 + + :return: None + :rtype: None + """ + 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..504bb56 --- /dev/null +++ b/_modules/ensembl/tools/anno/repeat_annotation/trf.html @@ -0,0 +1,410 @@ + + + + + + + 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 + :param genome_file: Genome file path. + :type genome_file: PathLike + :param output_dir: Working directory path. + :type output_dir: Path + :param num_threads: int, number of threads. + :type num_threads: int, default 1 + :param trf_bin: TRF software path. + :type trf_bin: Path, default trf + :param match_score: Matching weight. + :type match_score: int, default 2 + :param mismatch_score: Mismatching penalty. + :type mismatch_score: int, default 5 + :param delta: Indel penalty. + :type delta: int, default 7 + :param pm: Match probability (whole number). + :type pm: int, default 80 + :param pi: Indel probability (whole number). + :type pi: int, default 10 + :param minscore: Minimum alignment score to report. + :type minscore: int, default 40 + :param maxperiod: Maximum period size to report. + :type maxperiod: int, default 500 + + :return: None + :rtype: None + """ + 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..28c5c2f --- /dev/null +++ b/_modules/ensembl/tools/anno/simple_feature_annotation/cpg.html @@ -0,0 +1,369 @@ + + + + + + + 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. + :type cpg_bin: Path + :param cpg_min_length: Min length of CpG islands + :type cpg_min_length: int + :param cpg_min_gc_content: Min GC frequency percentage + :type cpg_min_gc_content: int + :param cpg_min_oe: Min ratio of the observed to expected number of CpG (CpGo/e) + :type cpg_min_oe: float + :param num_threads: int, number of threads. + :type num_threads: int + + :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..4bb18bd --- /dev/null +++ b/_modules/ensembl/tools/anno/simple_feature_annotation/eponine.html @@ -0,0 +1,351 @@ + + + + + + + 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 + :param genome_file: Genome file path. + :param genome_file: PathLike + :param output_dir: Working directory path. + :param output_dir: Path + :param java_bin: Java path. + :param java_bin: Path, default java + :param eponine_bin: Eponine software path + :param eponine_bin: Path + :param num_threads: Number of threads. + :param num_threads: int, default 1 + + :return: None + :rtype: None + """ + 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..22caf86 --- /dev/null +++ b/_modules/ensembl/tools/anno/snc_rna_annotation/trnascan.html @@ -0,0 +1,405 @@ + + + + + + + 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 + :param genome_file: Genome file path. + :type genome_file: PathLike + :param output_dir: working directory path. + :type output_dir: Path + :param trnascan_bin: tRNAscan-SE software path. + :type trnascan_bin: Path, default tRNAscan-SE + :param trnascan_filter: tRNAscan-SE filter set path. + :type trnascan_filter: Path, default EukHighConfidenceFilter + :param num_threads: int, number of threads. + :type num_threads: int, default 1 + + :return: None + :rtype: None + """ + 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..652315c --- /dev/null +++ b/_modules/ensembl/tools/anno/transcriptomic_annotation/minimap.html @@ -0,0 +1,370 @@ + + + + + + + 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 #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.
+"""
+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. + + :param output_dir: Working directory path. + :type output_dir: Path + :param long_read_fastq_dir: Long read directory path. + :type long_read_fastq_dir: Path + :param genome_file: Genome file path. + :type genome_file: Path + :param minimap2_bin: Software path. + :type minimap2_bin: Path, default minimap2 + :param paftools_bin: Software path. + :type paftools_bin: Path, default paftools.js + :param max_intron_length: The maximum intron size for alignments. Defaults to 100000. + :type max_intron_length: int, default 100000 + :param num_threads: Number of available threads. + :type num_threads: int, default 1 + + :return: None + :rtype: None + """ + 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..473e233 --- /dev/null +++ b/_modules/ensembl/tools/anno/transcriptomic_annotation/scallop.html @@ -0,0 +1,308 @@ + + + + + + + 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. + + :param output_dir: Working directory path. + :type output_dir: Path + :param scallop_bin: Software path. + :type scallop_bin: Path, default scallop + :param prlimit_bin: Software path. + :type prlimit_bin: Path, default prlimit + :param stringtie_bin: Software path. + :type stringtie_bin: Path, default stringtie + :param memory_limit: Memory limit Scallop command Defaults to 40*1024**3. + :type memory_limit: int + + :return: None + :rtype: None + """ + 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..c4d0135 --- /dev/null +++ b/_modules/ensembl/tools/anno/transcriptomic_annotation/star.html @@ -0,0 +1,727 @@ + + + + + + + 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. + :param genome_file: Genome file path. + :type genome_file: Path + :param output_dir: Working directory path. + :type output_dir: Path + :param short_read_fastq_dir: Short read directory path. + :type short_read_fastq_dir: Path + :param delete_pre_trim_fastq: Delete the original fastq files after trimming. Defaults to False. + :type delete_pre_trim_fastq: boolean, default False + :param trim_fastq: Trim short read files using TrimGalore. Defaults to False. + :type trim_fastq: boolean, default False + :param max_reads_per_sample: Max number of reads per sample. Defaults to 0 (unlimited). + :type max_reads_per_sample: int, default 0 + :param max_intron_length: The maximum intron size for alignments. Defaults to 100000. + :type max_intron_length: int, default 100000 + :param num_threads: Number of available threads. + :type num_threads: int, default 1 + :param star_bin: Software path. + :type star_bin: Path, default star + :param samtools_bin: Software path. + :type samtools_bin: Path,default samtools + :param trim_galore_bin: Software path. + :type trim_galore_bin: Path, default trim_galore + + :return: None + :rtype: None + """ + 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..9609284 --- /dev/null +++ b/_modules/ensembl/tools/anno/transcriptomic_annotation/stringtie.html @@ -0,0 +1,257 @@ + + + + + + + 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. + :param output_dir: Working directory path. + :type output_dir: Path + :param stringtie_bin: Software path. + :type stringtie_bin: Path, default stringtie + :param num_threads: Number of available threads. + :type num_threads: int, default 1 + + :return: None + :rtype: None + """ + 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..58b7389 --- /dev/null +++ b/cpg.html @@ -0,0 +1,183 @@ + + + + + + + + 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.

+
+
type cpg_bin:
+

Path

+
+
param cpg_min_length:
+

Min length of CpG islands

+
+
type cpg_min_length:
+

int

+
+
param cpg_min_gc_content:
+

Min GC frequency percentage

+
+
type cpg_min_gc_content:
+

int

+
+
param cpg_min_oe:
+

Min ratio of the observed to expected number of CpG (CpGo/e)

+
+
type cpg_min_oe:
+

float

+
+
param num_threads:
+

int, number of threads.

+
+
type num_threads:
+

int

+
+
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..d1a7c987acf6b5b88164404e9a1d68c9af1f1499 GIT binary patch literal 20286 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 literal 0 HcmV?d00001 diff --git a/doctrees/environment.pickle b/doctrees/environment.pickle new file mode 100644 index 0000000000000000000000000000000000000000..1e8cfc5054cbe9cb6ae2104a045040894e996c87 GIT binary patch literal 547330 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 aCk%P}KYs?~?XL^+_Q&^#yd90!r~ePPppD1? literal 0 HcmV?d00001 diff --git a/doctrees/eponine.doctree b/doctrees/eponine.doctree new file mode 100644 index 0000000000000000000000000000000000000000..d1c61bcd3832819117e93316c7b81321563497e0 GIT binary patch literal 18505 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 a<8|DmOAfR{o{BUrB7YVnX%myQTmKLKOYV~Z literal 0 HcmV?d00001 diff --git a/doctrees/genblast.doctree b/doctrees/genblast.doctree new file mode 100644 index 0000000000000000000000000000000000000000..d86992c04b560baf6868c941d22283318e99fdd1 GIT binary patch literal 28543 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
)4P;0B9;lsCP17Ad^@Culo z2o4cvg51^24i9UWgT0z{kxt$Urg=Eg$jJ_3{9*eU8hnopbDTpE3a;g`gNEQ{IA`mz zFgQGLm$IVv2qM- zw;-c>GTQKyP7s%$$GwH^#~IieHGxxYYa?;hn5g=XN^MeCP_ht4x z&@%Y3VAN&!9g0$-9tSRYhu6bNWN`Oh(>CKC!Kxlj-HdC`3~-zgtums+1N<@II3A5~ z$I`r_5{&MMp)K2|IENjbE!#A?V`3bgx;?u8NjSns!ut^q@SqEk1%BnC2k-{tP&#mX gHoncAc-F95rr)Mcvq`7M)!G#8qrgZL7r$BmUm~@>&Hw-a 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..1135099271a4f3b4452acfaa2a0581eabce89653 GIT binary patch literal 20870 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 Ufp*DLm%0@B;~+_!n6TaYA453^d;kCd literal 0 HcmV?d00001 diff --git a/doctrees/red.doctree b/doctrees/red.doctree new file mode 100644 index 0000000000000000000000000000000000000000..5faa08da6cebfd89a0347aa6418e84ad6a554eae GIT binary patch literal 12639 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 literal 0 HcmV?d00001 diff --git a/doctrees/repeatmasker.doctree b/doctrees/repeatmasker.doctree new file mode 100644 index 0000000000000000000000000000000000000000..e56e5b070f53b373706f8f8b6ab70332ab3bb3ee GIT binary patch literal 20305 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 literal 0 HcmV?d00001 diff --git a/doctrees/scallop.doctree b/doctrees/scallop.doctree new file mode 100644 index 0000000000000000000000000000000000000000..610e945acff63530210372f1eb7807dbb3f80c5e GIT binary patch literal 18131 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 Mf+W4fgstZP0}!cz`~Uy| literal 0 HcmV?d00001 diff --git a/doctrees/star.doctree b/doctrees/star.doctree new file mode 100644 index 0000000000000000000000000000000000000000..5385ae64d1ed5a5c032e34a7d5d547490e38f21f GIT binary patch literal 34952 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 EzxWC1kpKVy literal 0 HcmV?d00001 diff --git a/doctrees/stringtie.doctree b/doctrees/stringtie.doctree new file mode 100644 index 0000000000000000000000000000000000000000..952b4e07b68d52e7bb70253d6877a449a2afa851 GIT binary patch literal 13716 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 Z9Nmr#a-s$WLZs#q{gXgR8=0t9{TB_#fn)#x literal 0 HcmV?d00001 diff --git a/doctrees/trf.doctree b/doctrees/trf.doctree new file mode 100644 index 0000000000000000000000000000000000000000..61be72e788e80963a1f8f9f03b8c649c37a808f2 GIT binary patch literal 27933 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 RL;@MnJ`0SraY=fe{{<|}!KDBI literal 0 HcmV?d00001 diff --git a/dust.html b/dust.html new file mode 100644 index 0000000..125fe2d --- /dev/null +++ b/dust.html @@ -0,0 +1,165 @@ + + + + + + + + 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.

+
+
type genome_file:
+

PathLike

+
+
param output_dir:
+

Working directory path.

+
+
type output_dir:
+

Path

+
+
param dust_bin:
+

Dust software path.

+
+
type dust_bin:
+

Path, default dustmasker

+
+
param num_threads:
+

Number of threads.

+
+
type num_threads:
+

int, default 1

+
+
return:
+

None

+
+
rtype:
+

None

+
+
+
+
+
+ +
+ + +
+
+
+
+
+ +
+
+
+ + + + + \ No newline at end of file diff --git a/eponine.html b/eponine.html new file mode 100644 index 0000000..cd0198a --- /dev/null +++ b/eponine.html @@ -0,0 +1,172 @@ + + + + + + + + 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 genome_file:
+

PathLike

+
+
param output_dir:
+

Working directory path.

+
+
param output_dir:
+

Path

+
+
param java_bin:
+

Java path.

+
+
param java_bin:
+

Path, default java

+
+
param eponine_bin:
+

Eponine software path

+
+
param eponine_bin:
+

Path

+
+
param num_threads:
+

Number of threads.

+
+
param num_threads:
+

int, default 1

+
+
return:
+

None

+
+
rtype:
+

None

+
+
+
+
+
+ +
+ + +
+
+
+
+
+ +
+
+
+ + + + + \ No newline at end of file diff --git a/genblast.html b/genblast.html new file mode 100644 index 0000000..b6493b4 --- /dev/null +++ b/genblast.html @@ -0,0 +1,218 @@ + + + + + + + + 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.

+
+
type masked_genome:
+

Path

+
+
param output_dir:
+

Working directory path.

+
+
type output_dir:
+

Path

+
+
param protein_dataset:
+

Protein dataset (Uniprot/OrthoDb) path.

+
+
type protein_dataset:
+

Path

+
+
param genblast_timeout_secs:
+

Time for timeout (sec).

+
+
type genblast_timeout_secs:
+

int, default 10800

+
+
param max_intron_length:
+

Maximum intron length.

+
+
type max_intron_length:
+

int

+
+
param genblast_bin:
+

Software path.

+
+
type genblast_bin:
+

Path, default genblast

+
+
param convert2blastmask_bin:
+

Software path.

+
+
type convert2blastmask_bin:
+

Path, default convert2blastmask

+
+
param makeblastdb_bin:
+

Software path.

+
+
type makeblastdb_bin:
+

Path, default makeblastdb

+
+
param genblast_timeout:
+

seconds

+
+
type genblast_timeout:
+

int, default 1

+
+
param num_threads:
+

int, number of threads.

+
+
type num_threads:
+

int, default 1

+
+
param protein_set:
+

Source

+
+
type str:
+

[“uniprot”, “orthodb”]

+
+
return:
+

None

+
+
rtype:
+

None

+
+
+
+
+ +
+ + +
+
+
+
+
+ +
+
+
+ + + + + \ 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..8f1d0bd --- /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": 26, "status": "working", "code": 0, "uri": "https://github.com/Ensembl/ensembl-production", "info": ""} +{"filename": "install.rst", "lineno": 28, "status": "working", "code": 0, "uri": "https://github.com/Ensembl/ensembl-taxonomy", "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..6965c6d --- /dev/null +++ b/minimap.html @@ -0,0 +1,184 @@ + + + + + + + + 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.

+
+
type output_dir:
+

Path

+
+
param long_read_fastq_dir:
+

Long read directory path.

+
+
type long_read_fastq_dir:
+

Path

+
+
param genome_file:
+

Genome file path.

+
+
type genome_file:
+

Path

+
+
param minimap2_bin:
+

Software path.

+
+
type minimap2_bin:
+

Path, default minimap2

+
+
param paftools_bin:
+

Software path.

+
+
type paftools_bin:
+

Path, default paftools.js

+
+
param max_intron_length:
+

The maximum intron size for alignments. Defaults to 100000.

+
+
type max_intron_length:
+

int, default 100000

+
+
param num_threads:
+

Number of available threads.

+
+
type num_threads:
+

int, default 1

+
+
return:
+

None

+
+
rtype:
+

None

+
+
+
+
+ +
+ + +
+
+
+
+
+ +
+
+
+ + + + + \ 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..bddc245 --- /dev/null +++ b/red.html @@ -0,0 +1,160 @@ + + + + + + + + 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
+
param genome_file:
+

Genome file path.

+
+
type genome_file:
+

Path

+
+
param output_dir:
+

Working directory path.

+
+
type output_dir:
+

Path

+
+
param red_bin:
+

Red software path.

+
+
type red_bin:
+

Path, default Red

+
+
return:
+

Masked genome file

+
+
rtype:
+

str

+
+
+
+
+
+ +
+ + +
+
+
+
+
+ +
+
+
+ + + + + \ No newline at end of file diff --git a/repeatmasker.html b/repeatmasker.html new file mode 100644 index 0000000..8c8c3c2 --- /dev/null +++ b/repeatmasker.html @@ -0,0 +1,182 @@ + + + + + + + + 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.

+
+
type genome_file:
+

PathLike

+
+
param output_dir:
+

Output directory path.

+
+
type output_dir:
+

Path

+
+
param repeatmasker_bin:
+

RepeatMasker executable path.

+
+
type repeatmasker_bin:
+

Path, default RepeatMasker

+
+
param library:
+

Custom repeat library.

+
+
type library:
+

str

+
+
param repeatmasker_engine:
+

RepeatMasker engine.

+
+
type repeatmasker_engine:
+

str, default rmblast

+
+
param species:
+

Species name.

+
+
type species:
+

str

+
+
param num_threads:
+

Number of threads.

+
+
type num_threads:
+

int, default 1

+
+
return:
+

None

+
+
rtype:
+

None

+
+
+
+
+ +
+ + +
+
+
+
+
+ +
+
+
+ + + + + \ No newline at end of file diff --git a/scallop.html b/scallop.html new file mode 100644 index 0000000..b947e84 --- /dev/null +++ b/scallop.html @@ -0,0 +1,177 @@ + + + + + + + + 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.

+
+
+
param output_dir:
+

Working directory path.

+
+
type output_dir:
+

Path

+
+
param scallop_bin:
+

Software path.

+
+
type scallop_bin:
+

Path, default scallop

+
+
param prlimit_bin:
+

Software path.

+
+
type prlimit_bin:
+

Path, default prlimit

+
+
param stringtie_bin:
+

Software path.

+
+
type stringtie_bin:
+

Path, default stringtie

+
+
param memory_limit:
+

Memory limit Scallop command Defaults to 40*1024**3.

+
+
type memory_limit:
+

int

+
+
return:
+

None

+
+
rtype:
+

None

+
+
+
+
+ +
+ + +
+
+
+
+
+ +
+
+
+ + + + + \ 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..0a03cc6 --- /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, 8, 9, 10, 11, 12, 13, 14], "file": [0, 1, 2, 3, 6, 7, 8, 9, 11, 13, 14], "type": [0, 1, 3, 6, 7, 8, 9, 10, 11, 12, 13, 14], "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, 1, 2, 3, 7, 8, 9, 10, 11, 12, 13, 14], "rtype": [0, 1, 2, 3, 7, 8, 9, 10, 11, 12, 13, 14], "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, "default": [1, 2, 3, 7, 8, 9, 10, 11, 12, 13, 14], "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], "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, "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, "output": 9, "custom": 9, "engin": 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, "boolean": 11, "trimgalor": 11, "max": 11, "per": [11, 14], "sampl": 11, "unlimit": 11, "subsample_transcriptomic_data": 11, "fastq_file_list": 11, "subsampl": 11, "pair": 11, "paramet": 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..f3ea268 --- /dev/null +++ b/star.html @@ -0,0 +1,221 @@ + + + + + + + + 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.
+
param genome_file:
+

Genome file path.

+
+
type genome_file:
+

Path

+
+
param output_dir:
+

Working directory path.

+
+
type output_dir:
+

Path

+
+
param short_read_fastq_dir:
+

Short read directory path.

+
+
type short_read_fastq_dir:
+

Path

+
+
param delete_pre_trim_fastq:
+

Delete the original fastq files after trimming. Defaults to False.

+
+
type delete_pre_trim_fastq:
+

boolean, default False

+
+
param trim_fastq:
+

Trim short read files using TrimGalore. Defaults to False.

+
+
type trim_fastq:
+

boolean, default False

+
+
param max_reads_per_sample:
+

Max number of reads per sample. Defaults to 0 (unlimited).

+
+
type max_reads_per_sample:
+

int, default 0

+
+
param max_intron_length:
+

The maximum intron size for alignments. Defaults to 100000.

+
+
type max_intron_length:
+

int, default 100000

+
+
param num_threads:
+

Number of available threads.

+
+
type num_threads:
+

int, default 1

+
+
param star_bin:
+

Software path.

+
+
type star_bin:
+

Path, default star

+
+
param samtools_bin:
+

Software path.

+
+
type samtools_bin:
+

Path,default samtools

+
+
param trim_galore_bin:
+

Software path.

+
+
type trim_galore_bin:
+

Path, default trim_galore

+
+
return:
+

None

+
+
rtype:
+

None

+
+
+
+
+
+ +
+
+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..edc6e83 --- /dev/null +++ b/stringtie.html @@ -0,0 +1,160 @@ + + + + + + + + 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.

+
+
type output_dir:
+

Path

+
+
param stringtie_bin:
+

Software path.

+
+
type stringtie_bin:
+

Path, default stringtie

+
+
param num_threads:
+

Number of available threads.

+
+
type num_threads:
+

int, default 1

+
+
return:
+

None

+
+
rtype:
+

None

+
+
+
+
+
+ +
+ + +
+
+
+
+
+ +
+
+
+ + + + + \ No newline at end of file diff --git a/trf.html b/trf.html new file mode 100644 index 0000000..820f45c --- /dev/null +++ b/trf.html @@ -0,0 +1,206 @@ + + + + + + + + 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.

+
+
type genome_file:
+

PathLike

+
+
param output_dir:
+

Working directory path.

+
+
type output_dir:
+

Path

+
+
param num_threads:
+

int, number of threads.

+
+
type num_threads:
+

int, default 1

+
+
param trf_bin:
+

TRF software path.

+
+
type trf_bin:
+

Path, default trf

+
+
param match_score:
+

Matching weight.

+
+
type match_score:
+

int, default 2

+
+
param mismatch_score:
+

Mismatching penalty.

+
+
type mismatch_score:
+

int, default 5

+
+
param delta:
+

Indel penalty.

+
+
type delta:
+

int, default 7

+
+
param pm:
+

Match probability (whole number).

+
+
type pm:
+

int, default 80

+
+
param pi:
+

Indel probability (whole number).

+
+
type pi:
+

int, default 10

+
+
param minscore:
+

Minimum alignment score to report.

+
+
type minscore:
+

int, default 40

+
+
param maxperiod:
+

Maximum period size to report.

+
+
type maxperiod:
+

int, default 500

+
+
return:
+

None

+
+
rtype:
+

None

+
+
+
+
+
+ +
+ + +
+
+
+
+
+ +
+
+
+ + + + + \ No newline at end of file diff --git a/trnascan.html b/trnascan.html new file mode 100644 index 0000000..b4c7bc7 --- /dev/null +++ b/trnascan.html @@ -0,0 +1,167 @@ + + + + + + + + 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.

+
+
type genome_file:
+

PathLike

+
+
param output_dir:
+

working directory path.

+
+
type output_dir:
+

Path

+
+
param trnascan_bin:
+

tRNAscan-SE software path.

+
+
type trnascan_bin:
+

Path, default tRNAscan-SE

+
+
param trnascan_filter:
+

tRNAscan-SE filter set path.

+
+
type trnascan_filter:
+

Path, default EukHighConfidenceFilter

+
+
param num_threads:
+

int, number of threads.

+
+
type num_threads:
+

int, default 1

+
+
return:
+

None

+
+
rtype:
+

None

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