From 81edcf3ce2a54e146af4ac6641f0c6f0f7f290ea Mon Sep 17 00:00:00 2001 From: "James A. Fellows Yates" Date: Thu, 28 Mar 2024 13:31:30 +0000 Subject: [PATCH 1/8] Start skeleton of convert tutorial and try fixing logo rendering on readme/install page for RTD --- README.md | 19 ++- assets/logo_rectangular_transparent.png | Bin 0 -> 69286 bytes assets/logo_rectangular_transparent.svg | 153 ++++++++++++++++++++++++ docs/source/index.rst | 4 +- docs/source/tutorials/convert.md | 1 + docs/source/tutorials/index.rst | 3 +- 6 files changed, 166 insertions(+), 14 deletions(-) create mode 100644 assets/logo_rectangular_transparent.png create mode 100644 assets/logo_rectangular_transparent.svg create mode 100644 docs/source/tutorials/convert.md diff --git a/README.md b/README.md index 1b7cbff..cd3d841 100644 --- a/README.md +++ b/README.md @@ -1,20 +1,15 @@ [![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.4003825.svg)](https://doi.org/10.5281/zenodo.4003825) [![PyPI version](https://badge.fury.io/py/AMDirT.svg)](https://pypi.org/project/AMDirT) [![Documentation Status](https://readthedocs.org/projects/amdirt/badge/?version=dev)](https://amdirt.readthedocs.io/en/dev/?badge=dev) [![AMDirT-CI](https://github.com/SPAAM-community/AMDirT/actions/workflows/ci_test.yml/badge.svg)](https://github.com/SPAAM-community/AMDirT/actions/workflows/ci_test.yml) -
- -![AMDirT](https://raw.githubusercontent.com/SPAAM-community/AMDirT/master/assets/logo_rectangular.png#gh-light-mode-only) - -
- -
- -![AMDirT](https://raw.githubusercontent.com/SPAAM-community/AMDirT/master/assets/logo_rectangular_dark.png#gh-dark-mode-only) - -
+ + + AMDirT Logo + **AMDirT**: [**A**ncient**M**etagenome**Dir**](https://github.com/SPAAM-community/ancientmetagenomedir) **T**oolkit -AMDirT is a toolkit for interacting with the AncientMetagenomeDir metadata repository of ancient metagenomic samples and ancient microbial genomes. This tool provides ways to validate AncientMetagenomeDir submissions, explore and download sequencing data for ancient microbial and environmental (meta)genomes, and automatically prepare input samplesheets for a range of bioinformatic processing pipelines. +AMDirT is a toolkit for interacting with the AncientMetagenomeDir metadata repository of ancient metagenomic samples and ancient microbial genomes. + +This tool provides ways to explore and download sequencing data for ancient microbial and environmental (meta)genomes, automatically prepare input samplesheets for a range of bioinformatic processing pipelines, and to validate AncientMetagenomeDir submissions. For documentation on using the tool, please see [How Tos](https://amdirt.readthedocs.io/en/latest/how_to/index.html), [Tutorials](https://amdirt.readthedocs.io/en/latest/tutorials/index.html) and/or [Quick Reference](https://amdirt.readthedocs.io/en/latest/reference.html). diff --git a/assets/logo_rectangular_transparent.png b/assets/logo_rectangular_transparent.png new file mode 100644 index 0000000000000000000000000000000000000000..ea4d442c8e26386c0163b5e942a5e0b609879ff5 GIT binary patch literal 69286 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%0Ax*F3l<{56;Ld?}Pc;vN)C>7moi3$H~v<;(HIT zP^}k1uP2ro%)?&GEj^n8vHA+Wnx!QauOU4jX0gAzrTy=;$5Ba*z6Y~ApD?esMcAGY#RI*>OMFk#-#+@OAQaYMj%f>?w;9tUYhxAX@B}W$*a+ zJW}wf?i2rg%UiQpvgda+YOtlMGBG*VRcL zl@+mxS2<0_WvG_d#>$~{aO|H#^n`jrGnSi3J4;ZSQ5)Qap?5oeKKtfOC)$(eP0AiY zKNxs|Q7alAatlahyRQ@Qu9Br|pN@@1-N$mH>4$8CGZID7lV}9j^81fQVKBNEy)NWi zk@%VrHp?%z=1{w@i$5f%WsEEdZiFrD=0_~hpl)%*ZNdgw@QLd;UpVE#u|*)eQU5m>%{4G7S(5m9I% zWo0lwdWv$EFqKXxr36i4*d96&0Pl~Elwk5fD*=T{c?Ah!RnSrBm#NttpV$pAtq4Ye zA)XF=V*jliV1YXI|A%tp*raN~L@k!zD7lj^mwzie#Wll$hy1|jrY^+e(bTOeTE$ln z7kh`3_!~XyMWiWQJ69>5@O0OX|G+)pQ{tQ1s&Ncy84p`I2wp6WEK&|Ri`glb@clWBO6U)M1V^RU;PHmx*C~qhb(|P}H=6#UyAP&h37`rbhkj4F-Sn=< z@c5lqU5~Cn*F2i?k?+#xl~( z*Z7(Tl(%_|{6d7sM2Eq48+_<^_`WA1>x~1SAl83=Caj4&T%{oWfvOFah?SC)Uaoo@ z4n^r~zHR7{HA0AX)GBX{B@2r{qj@4f)=Ih`{e>W0@PFmUKR#($!qFt`5XC7&*N9jd z?@kf@s#VNgXsWLum@C@#&D^vgnn^b0BR6x&KlE5<1yv)ZWzw}cA%yKCID)XKtA8kV zaHKzQx>VmNa0ttPK1uakxd?RYwSHimaXdEh0pl{dl3^ELB%S!!S> zmQGhJ-UD8Db?f0g*>f2|LeL>dDvZ~@%uI)$d^pNaaRq}$nhZUEpQk%wTtM4t5e~<8 zpZ1M`F(7b~OMeW56g~tw|AN%48@ZnshpH!<)Ahf@?IE`nmy&TGF7+qqYCMP)rwn(S z3Q}C-{W7VNFZgTP-!tmqJl%JNO(CA0da1|BM4g{AFGVP+-V%`cc0XGNrKsU`P{mK)b@n9hM(y zT)|hmLi5J|a$lGhoQ`5!#aRPc=3B%ucQQNz)!4QM

AW&82R%~A z@)a{Svl{%t8^osJo6NKUS;7_N!L3fXQ!tT>hjnoxQm8r%7K;%jwc*J~d#oCMCKO^1 z-!x4AeaZ1DMiqBDdSU$4cg}flLSKG^<| z?RQ_8%u}(J5Eat?YeD))$3s|-mu$D&k|#ad3d2MQY&7Nc_!!(>ly2EG+ZF5;RZ7%8 zyxJeaUN--g80rj*w}A=SJ5s20%`yX~JOLC4LR0Kj&s@+;=s|RF)w6fcQa0}NtabIy zH=Xk_vySjRbT=p);>Lh)7MKhReLtzrOMu9F1V7Ws3E*-CL*zGh2_F|2tlY4Z`qtdu z6x`a0t`<-gBjpH?@D%@ksZGhY1?jnIBK%ali*vVDOKYrJ`Hg5!zA# zXqk(jkn!$8C91xFjW5rSbRTdD53YwpW7e#ATl5K4@ly%3j(5Rq+lQIps1z(UXzc4K zs2df$(xwk_wb)0Z^v?_6pTV*DTbESX!JrR5N}Q^SRD=W#=!XY6L~2fs!RrjxFD1<5 zO2W4Z3w+W1MzJ-V`Y#yEt(zVPx!a)RKem+T=)~<2JO~K(IJgovko04n;9@wPRGZ4d z?W}7h1-0&@WBJ4$Z{3(4^mKqNIP#{s&*e2f>E9hIl4N& zt2(v@Ot9qh&2xa54L+LtBTv8)Q}Cb`zu}iie|3^0Ewk`jk+#0JRL2V?@>25Bji!Z3 znP=|pG6S}CLLU>iFl=52*TXpy*N*ipsaQ90MqJBph@)kk_bCKiNgg|4=Vq%Q`Rn|+ z5O08T?cgY*j6M%83u(T8CEox+1z?_IMbQDEQvWP?Ggqtafi%sb|E1~{r%>p$Mb7qYGsoZMW~L1luS%@%l<|n!X1qL!eBpxI|=r{fag%ge@9)q z*r50;_8}w^;@;687xy?Vv+5R3Ii^xQTfWUqJz;e-C*nGP|4etW(5*KP#aG%2x6H1q@R+R0QXf}iEMylmn z1N@0xmBqI{R5S*urAE%2m;sx(X@-WG6Lci@q{GYhD`pk^k5JTCOo%JI6-%o80M zpy68a0y8F?piOjhjQ>)?LfZtP{FWIa6pBwwZx7@yUO4$wKg8~NP_2C7IzDXuDNrx) zr8gsFBbZ@U(7D|lmf;ZjK3hRRal`yW2H5)_zm#?n+o?U;{{3)v#=ZNb!l%i?X)->Z zUo^mfAv0$jlBsj|o&+M4VuJQixw45eDVZvL3D?zh^i(39<`^Zn;sHfbnNxluvLd%4 zN~d^2KLL>?J~ZFXvL$>;#+Wvl0TMgZS-`AQh;Hi9;d9i0mXucAVzWUp`C&RLv>U5x zvs`c|nrbl5Vfj+A{g<%UfX^_DD1QlpvPRk@XbHqg)MTPpK>WJ4Rzjc#T4Bj4Z!1RE zq@aCP_yD0@q+YP+0TBP`RSF}br)fG8*EVH}6#B3a4IhzG80^yYPgs^0-{G=I71KGf{tr zi7(jDs|v`{@oh8`1eeD%=Tl{%2EOXA>=)}d@-{0$Y(p+#Xbx&J#5&*d55X>L+8s@B z$`>cJJxs^19M>9HI=_aaTKZHzx7QiGcQf7fA{)3XaU%;Mn_fqbZGSsE4qBhg=j)$3 ztbStQ2(1q2%uOMXElp{@-~V(vGvM!@{>iHCj(hN9j%??rYo$b|iQ>-U0JmcYAkqcm z#Xk(R)2crbG`wnS&;5=&^+wnx1b*X!DzN&$ZM&aOE6Aomf5;2&0QBEk!94b6tu(l4 z%_24O-Z;JAB&yic=^phH@(C=~Hik`IT9fKB*ESod^8g74Ru4a7v~2QuwX0PB!6(z} zkzhR8QJF*GCONzB0f=Mganx_|^iz%Y;a}1cZEtY5{3(@}G?7-+s%BrKs z&yYMBw7F3Yl<3|NO81=go zH7!9AqJOU1A)pGK*dnuEsVNWO_h?VQWA>cj-Qk}kOZ5u3m=)_xPy0U*IclD5a?p}{ zC#D3Cp2H$Tk(uCv6zuJ~BC=SnqF37YLsN%NaHn7#2t4TKPBSRvzuo!nZG^|RZ>fe> z>n}GRdE-Jv#fcB;BZ}4wJ9TSsk*yFWyad80F1&F8i2{~Zl{j73(- zkDB&RJ$smGM|8eBzIc`G!Mp%NOyC|YNjl>>O*IEb8XhB4g6U;tLAicBiM?`;$ho*C z3!}8dXM&|7XbTbG4jdmnGr2kuAl(aANhI@qy2H^qguX`v2ZirAY1j#tF4d84c%z3` zI{#e5*RACQEyn$8#E%OqXYYcGIxmQ5;%8Hv4P7Y|9pFb`U{CXEu0%};x-opQz9}e? zg`}4=-@u7sD~TRjN^D9HBXCDA5R&{8cirgI3*)f>9xF#7u3{EPxS6rTNttGu#{sy1 zA_$sP7Sh?VZFAjoNVa@fQQXGL2sDiBoJR=A+Qj#Ys@+7+TbQfa>ILr_j#w$EBwoM! z@dV0p0aLUqb)Bpziw|@dT|Jwpk{~_$k~LrzEvFjCwq57%Uvt)PJsrZ@zGUMniKc^{ zlD7ST3yi^H?N+4Pwdf>5?tRPq#y>8xNAD9{`@@?*}=02lrIB|4aVF9eCL>J2sFVH z={h`%-HG4f9>5_({qdgT5ca#{Bn>=^!e^hcW&}lV${0N8!YjI{-+G!6Oar>>qew(; zyi^BfmHdo7cou7`2i2!$y=pF_JW6lq8k;MwWC*Ud-of|qeo<2xan?Mhn@XpSuVaU zDG9-p%_xrtBpCLp1-D?H~P1BUgZnQ;}cj=G&Pz4b`B!xm$+vC1Vj>D93bUClI z^}*oA2i-}QKsBC;L3o`BI3J_=4ZlwcK_gLI9^5Irzo@kJ0_?(v=g7g(hq+Q`{St2z z@4v2MH<^^sVlQ2|Z;njK&iZn=Z*aKIFl99-E(G#jZn&CRwq;_5cg-HIBzVWDCpRnA zVh)r@IfwLdT&!`F1EhTrzgDE9gm|9cFrt%Ix~kqV zR=E7QPZGMO_Wgx(;^@K`Do~x=>L7Cxdky%LGp~c?^9qLc?UTFU)f^{O(r7wY8LWiZ z8QN_mVM=XN?WeZY=1~kyV@;++fcER+vQ`ljB_-{mt|C+o8vqB8lb=w5bj-%$33E&0 zx@yjLwegRbH9@tpWry9GJk7BTFgD5f7VOwH^p7g|QvbeqFx`8;$&bJF6|#CBG@?}?+A=aVGzA&_y)#(ytf#{?Oz{rsRKK6P-(?D) zvy5_P>?5T1I%qZBN^LayG9@za+Sb&^=Mfv!@ibt;^ndC8 z%rn$|OCv*g5#rox{<&DY;b@e8Owz=GWcmc{hC97YQl5awB9+!#DP8&-7}Ojz{x@lD z)rF!`y1@I$=&MB^Xq8ZuHWy6%v~UKaAx;VqCVXeWr{@72j&HH1pu#}b`{;OKt7?K% zx*g+3;s;iWtq*i_@VSsaH1+4f%vItrKRuMYXqnk)hcfvw zfUWgyBbgR{@)L8__AjQN#;3T(N${s4cLY?TSXOtXggo}p#M0t-8|V^qPzz*S{1oTK zTFf30lxmcpxIw_m1j=PFkOiOb1Pk$IF-pziOm4vqG2q3W3TB35y~Cb4L|%Baw*n;f z!9KhJSfVWca0WtOvQ&$Tk6(VG-33ZRD7HzUEXnZX*oL5ZR44-z`7xz=YFiaFObo(} zJtVL}e%7(p$yF{YT2 z7wZOLne!WJFt*ZZf!4nGWGseIj`OOxxQtHy?uNXf~=pDhC;6{|~B2I%K zI6OG~V)&VceHnHGtxG@qH6*4j{=+l@1bae>II97-s4gp?`B93jj~8u61ce0tq~(1# zq7?Ll{K(g}H0^SruH7bat;L=#x)MDF>Yi@NFF$W>NA0~a$#SJ<=2BD6p7`Z)8&GV9 z)qxZ$&}hx3f4DH&V(SazgSf>69|A`y6Jr?60a{}e26b4zAkNkRnuO;BTh?FDlh%Bc zH`IkGjYL&wOX+qt9-%LepJ_6hKPVujSOx$~S@+XpVwmA}m3{`PvN zS?a&%<8?Hy0|mG9Q|XIF zXV0hMB|ks%0br@&%YR^~wimN1AlXNa%-}^^QN*9($E9J~h3W;zP1h^S`NqMf7M@Q9 z!^b0-ru+mAFV6Q`@R+{8{RG1KbvZ5NU12TObCksemCThw$&)yA3Wx`OARe@1njl@o ziIJxnT%#LjHHbNTgt5s{SL?;wn}&-fgI8R_NIt*FrZq;_$%W@Cl8@18| zjCgmHrr*ziXp`kHf$aVaNXuo~m?dh1Sf1Hyh*&3C3A`U0i@yTl^+jrfL3dst{_}q> z#C;}vIlogML_WXuQS9#Cm*KAMXPLL4stIZr`(%0#-9+UFte_?*Q28L4@v@leYg-;4 zLPML(hxW+1rMk_E_m}4hwd#wg9n0=Mxc?z#w0DShI|az{Ou>eJ7;|*Z(h$02DiBw4 zifaIe70=iC&gWvlpBZR%2!nua)L;yK$28vY7oN~?w>XCfOQ~pOzhZ^H8G9psmwpQ+ zS_cI2rlf6pXDtezw#dw~&Y3Ki$#mXHE?5{EM>V>=dPyMksy|P5^7O}Zi`1nwhVhIP z$%xw9uqVtOp3f{4D1qK^X+$h=wq=%njnpO+yZmAJLX)7J@c9d|qP@Ytr6DvMS{e@F ztzERq$NREA!27W&6fHD;psAU*Q<-0hc78}gt(Dxdx)C81!~SGpG~k2H-KWbo%r$pA z7R5}P-K=5lK`S_($-y|BWnE~8ul!&SA^usGtNwC14cgdy}_}7Vvp|$Cle$ccmV@#*Ft16wd_^k-y_V>Ov(!Mx$sXTHC+je5wAZaR4_HK zw}H8+AdA>}n%QYpNMg$xI#y|cJ<_n@Qnh6u{h>!ujLlW0{XBi;gUu^*HE5R|zoz}B z>8#-U$IqioP<|#tr5{pM?glHiKe8L}F<^e^8XX&u5lG)4=SmNx4U;*{Re-RzH6`#W zeopn0H|#Cm!HjP{2wee81f4Hx(Qz%v&R=P)xzk~4%yD(DOay9;c(1M%2o#0E<}z<3 z1tN{P7s<2(fh)tg5xF$*x|!ZX)1iYDtYj1_sXYvT!}>gkDn%-NI`+ua+8?x3O$NR; zwUWUeganKRhsxjId!S(5&>>b4c=f&Id!Nt_-`Y#GYligG#(O$i1BE@qH`9!*5QRKI zcgnSrLCsz@{#E^tPyWCOrx2a&Yt+zb%H#F(wM>mg@DG!x6 zNMq#V$gD|QCBBsq-K(_Ucd7%Ugwz4ATGayrAZ=_9DRQD|yu$Z`NuWkLZdcO70LN-X zi;id1``;`8dg*F8igOf|zyHNG&JBOOF{JviC(#Q8uJ>byUfF6g<1OIv`y=aOLTbh1 z>jw3tJ*yKanaE=`Z8KF7AvIw)SU|<@;|Jkbzw=H%k9w zPF{+w(sMyrcL$Q4Mt2PeD;^m}R0Y1>z3|PzEWca#-IAqK+QqYFluGk)p_wg*f}gg^ z@?=uy%Rj4IG48XEUiV&!PcHB>_ivcvW;2XJiU?A0e`taYWg|$Y-Y+y6h~g>*nKFU? zwM~%#(~Y%~-}Kvpc&)(*B+y2@1Q+qX+M$YSvV4QO9ilTMYTx+`0aqGM-tva$w=>e0xQaCZ}{*@gw_wX$jt`!7Hd z(Wmwzu9TFzk1boZ=EnTyS)XD2uCRyO`N3lhZsdbS>2%oyp|@==|h1erSw7B=hPI2Nt4w2qS-_xn;ioTh=JY2pUZ01fq$gLMG;8E z79;jmA#lHh#^Ot#x)6wyF7D;Y<{S86BZZp1k2l3eDI~?UnZJ&nYYECEq~ad zceaJ4#uBwS)!cQI{H~!&bWW4O!5lYGyN&wYyswFu-M`F4wSKN9n37Wa+Wl^QS1~%7 zVhx_-FDv&egivv!|51+qk!I7y2@ui|TR~bhzzZP?d3dcOs@knn=fq~HFN#ZQ z5*fWF`fm3&Shq)u2j!c~{ew9V1t?&cYM~hT>pl>zVu(uco)r>i1P8#Li(v=iy!Utq zc_>_IT(Pe|&+wn>B~bJbP=6OHgGhvhh!#7MLGkNXN@!&~csb6dAQ1KE`vZlkaNZTF zXdDmLr~i*o<-@p}rZPc;)|~gmW-bDCcNjmH1LM4;UAbsoBg>&hDy)xz)|Noo#Pbh1 zd7imKDXDOx0xU8%QBoS{s1MPO)E_M<6kD!8h8tbeLK`%C-}z#yG!wMOj>~9^T6`D+ zWC}B*koM>syZb?IDp+#X^8^cCSNz3?(iKTOe&;wC<7iMVbrgRPHCRG zhG_;e%Zh=-S;kDu0R$gQALtRxV%QvnOhr*?dWc1xMkOTemYJMx8sYtOsfMaA{s_i^<77+$9XXz zN7et>Ih92BioNv-?NJBgP*vX8U^KZk}bI6$_ZCz{`e5i zuN6zjAO{FJ^lNQtMw)vQKMQn8;Q?!E&Qt8ec0iqMX#njnK`Zh2mPccmku2u3W6d;R+@;sYs4<1E8CLA%&0lc=-tRkpnQ(8g!7ziwoFAOa4o1}-3(jiY*lV$+R%Ccvo^4#q6QNT zvagrej#Cng!r1V67aY{j0B$qJ`EcK@eg9p9_C`>TqOOUu%U^kH*2_6wERi7QurRe!mnQ`9oKN3qepL{dQN#!}2`vA6#Cqxp8;dU^yvhy(%T8fSz_U zx52hvY~x9JbwPg8{~qyMr_6}y`zaGAo1vMHE+kq9glXSSAVtC44r#y%{RNLTzmuAs zU^LyxS$V^#4w@WY9cL;QL(Rg=1!tJ%06pRHDm<8e1_bjtE0EQXaVAqP<)x(AY`^C~*Tnlu-E8EQb;mTV_ z9&5ZQ5cp70gY7oHLQnIzWTIGDT0A?w_vA>lo_xL%`TnTSYVB$MJziIePZ!O}Ctl|c z59OiXQMj>_iIRj|ETs_Uae``vZfeYqa5)5mTNQhv^~_|Y{3|Osqgqv1DW&i|&p%&( z-*3H2K)Y=dO>M2~RhEAbyb_k&FF^SG+b-G^oR(TGxw=1NGjfFv%F(#b39$C%aQ(uV z_?a4dHk&?Rbihc<0vRVfO9Ms^ij@CLTU3nTso&*Sp$8d~TFE8^?9-(u7!L0x1rdAP zhn2=(dp(+*UlmvWX4eszzW*fU$l&xdAkovV#^HO5nVqYNDW)y67RjRWZXU|M39~1KyfN??`i=z6?q9 zJ${`*mac>Y7zlPkF~~;l1)gZpQD1h%)GJSVwmw_DdkgrG#(?m=AwJ(1?TipX7#@&7@~Z32lJOodn&$HQurvx$<(G9|uvDal1bFa(wEAw>6r4{s z`M3oiuXvX%V0MtE8OR1C>SK#9*u_w+Nf*vq^Pch)PeatdNHxlVL zlFFZLfL%})@mOiYu{(RtL!m(MU0ZvwYO{d);l>$|#;i;1Ul$&$`tFMEF+>?2J1Wb-*xJQXw0UwXSFM z$7vd`FJW}tZAIf{o;_sDMG!&xXG$ccyiPt(o2Qn>>5H%>9x}W~Vh;%0ihzvoHDqPmir428l~^k-Ux-UQdv<6 zrz+@kyd)Wm-!;Umt%HARuzD}av`@lkYIPJ-?HsMEKD2@!pmSkBZ*n_y5eKF0se$6u zilQ{b4mF5oj?2`nGy_@pO8BUd=vh&|j?q$;=_3ciwj6+$eZN!8XW}=s4NMr|K>UXO zqR-ErzBX&WV2*eM& zH&5Kv;haulLy9-4?9PxAb9wuvI4%eKc_F(9;^}7cQtp*8;-Fds8Me1Gy4|3N1+yec zAW*RroC12n!eo&t;tT#o-8pP-wRoHtmgF6o9L>PBkT?8Si}r?$Q&aJN5Al2h*zB0n zt6UBN^YD2Zv|`GS-QlP>YTy@$KVKL%+Gjt^j5$o|G$wC#oQ6&lcJWL(Ys_Pi$x?$M za4og=IP_e2!DSa2!U@f|m`jD%xW-5m%NmZA=hyMss4hp~=A$^(p4&7vdH#*pKHCk&iKj?p{kwAt7yMzFV{KI$s?q4}^#4K#`0x+h3g|}q@ zAKm^4?Pm`W(N#JoKpmQZ^nP*-Q;xRT_-ds65s#* zexGmt+jCD#jiEL4V{~Iw9p!u%+LqfP2Nsm7YXW;h-avb3l`BHBe$D9&c2sL}2m+G6JF_+)$@_9J?t6z-{4_F{IyK*}G{Yks$ zU@OrKCVYjq2=bahfvDy|tT9=n_SE%%S))eKGiS(d>e<4GJp+g_@`7JJzRIr;qY8u4 zxgGJ&zd#a1OLN*`bn_iEA2*e(RY~*q%K{n7e zFq_jPb9$FH$zGlKFQe5UfHM*y&kE=KFVQ+#0j?)P4}^GLk+i5yG45`Xlt&?zlqmWQ zV~`}_7sGb6;;`hFz@K#8g;pSj|qtz|XN0m-wJoxzOf(9q? zrWU9|-^Ymf#Ug2ndWKEo__Ud+*9r0!JE|2u?g1{avue~FhPg~jX7JJ?RqXqi7!hy> zb81tXUe`ct2$g3bQG%22%JdBEzTxXfVGtCoVi>ID=ly&05r9D_4#^VNDbbR@ za47ob_p^m`^jlg_OBg20!r( z0@sBWn#&$=Ih0q&44I%EqUu{&51;01T;8091MNC9t0Q^#FHS~x8R?$@lthiC!SA0M zo9i0%Qe`EE-!KarHS!A4AK4H_(@Yb52;_eqm^D2ZhKaT}$vVEA)P_iuDCEK?73T(c zBcr+6kk0=eE#YFqxDG) zRsZk!8C}?D50NIzQ>6J-^NJXe5Z)DA{5x~eF);te6PZN93V${ai*^|1n*=sIjAN;j zpjb@~yz;C6;z+>AQ8PW6*m-r~fJ2%Ka`{Cebp${cOnp$wNzU#?DPh_QMYNuF#nL}$ zHAW6B&t$de!ZU!ucXLCYhDJ}?P_Mz0H+NhE<`a>JS}@GSvy-xLE{C_s1_D_QfBl6G zegc%vR4J>Yz3Sc56UF=(5q3iAJM>+a`NBLClHlbv6TZZ|X4v*bUI58@FsD&KzBJiF z9(TbQ`&QIL8d_3cE#TCMJiG-=bzoe+)1HVEqDx zj9ss2{iGn5;`L7uKzg(g9g}JXKl6ppo1rsktNg&K-r{noLmu*a$ZXZJTP={-`Dz{Q z+HKZN6aFeZnhXl7z5JlcZxWfCovo$!b{81m!Gp&>Zo3nFQG!nh7w?1@c||_TzCoX{ zg24#aAd{h7iP1=RSbIOMCk$rANUKjI1~G%Q79FNH$@Z-s-+QZ`rp-^l;@3EO2MoKeV&Tj@ah(v9dbeZ_r3;q&+Om?+W@D3T!ve2vpX*(yoT7s1wKa-?`LlnJs(`@ZTCFy22CUYti}B z+zZUnqG`HSvXz%R1pT3FarxV{p2FBxF;>Zknt{Ny3R+Vajl3$L9@cMmDl1lrzJKP% zIUm|v@kgSA)rTLFro)`1fW)U*3lmXe=DQEx4te_6<`b)FWXD`yhrZ#-V53D4JS5~; z`^;-fM6EY@Z3I{fFhVrBnY{|-qH>BHNfi`u!HmzqM?vj**{+}N& zj~}j2vC$5=*C=rd~mp>K20EmD+Kd%7rTGNqN{A>f!8G_JO3473Q zZLnK8$VW@}uBo@@pikp6H$VFd$0H9ZEBPxeX~du}7B-Kzl|HGjX)&|Vt`RO1l=wAb zchO&wOxIURal;m0T$2=Tl0+_1+a(TK&^u-Yj-FIr8GDJO(G284T&j_Nv+EB7Tk)-e zj_M5ON)w1nr3T7(LsF!${&vrKuB@lxU*YvTNeW?mNipwMb%xgBS|BbIpT_cfF{JB6 zimbFpu;=$AWvpONbt!YZA91T{$}yfS#ht9Ym*!8Uj`bS|bfIK7nA&yVx!@ z?OHx3o-M8UDRvvU-+UK6iB1s8t~j8FsNiB4%dZXc^(b@;dYKnH{AKO`Ywyb+pxu1*uIKQ;L+X$(lLcstD@aTccE>7n6p!!b1 zX<;`|kPO7wgeeuHr;buMC=cm?v1@a|g}^UbT!RAF(?F4_V}NZA(%FW0vbj#wHIiR) z-Av7F62uz_gM!Z2I9*W`B1Tm~IQ{GAH)WvQ=Ow)|0q)o*5*C{dDRMtl@vm@X#QJLQ zXM$8>T0fJl37*VO@aF!IxRPq?&aI%h+z9;oN^x$Z&xig1(PHl==CzMe1SX)C-rT|6 zBUID|D-k4+<-ejI{RRUJorZPFdk66okQOkpdED#3n~P$ggdU>B`Rrk!G}RB-an_W# zXJp?i#4ILbY9xf4MknX(nT6fHV~(6#nW02I7HZac3KPl*@eq2c{C9^iejTj?tbqtu zoQ5<VqwnJN;)$RgGaZlo}-(*X3 zxc*AG*gE&&`5LTcEV3@ujd#>}t*ZXeAFxt*Y%*p<*ey)2>*J))um%PrDm(#8=s6z? zGp6yA_v$tgGP~sH~O*8}`$5eGMXfGk!1*m?o;8&ik`Ge1)p2Ts7sbIY)0d!+c(o{sSWPL1b+_al#e4)p(l zj6l0B4A9~(ZiWnHO1!ts<^U}cj{+-anvw!w-Yhl2tHU(Py0F{lU%Y!J!OeNgzbMX%?gUqyuV6#> z8rF&IF-S~6fhF7e)zNHo`TpCudr&frk9pT{CGwM;5G;ma)G_()mc3pSE@i+!>6PlN zGq1*S2N5S$lI_tvm z`hX^Wr;r4N+Tc%r6SYl%7vc2TyAxxh!_a1^#4o`nqXG8AL~nmvw<*8mn;hIz(P(}< zz8Y=a+bQto{nUFH4dICykaU4rp6>wMp(gCMh*3QncDL}Lhp}suwt)cGan>jc(m64lOBL2Srd+PRj%w7JR{H6h9O5Frm#ZbI`4 ze1CORf(>2;SoS7}Bg&UbBT)83df)80u}q1|?f;vFeg1AXmA09wa}^7^cJM+v z3Kx6zfvLIzK*nXg90BfL2GqW-eJ)I%9Y>bTTy2o0VPnz3hDVK8Xp;I~#rEiL!V~Yn zEVuh%e4x6Z?!b@BMMFx;D-Y1^&6&la)>N2s5QvWhLfzA1Ekk(IR`Wm^)XdDGKaPSp zc`@*KF~(%ON~c8n$Rpj+jUp3<359Py6Bfd)Dz5x^!vXNBu|k{p(4l{F0ZORq6h4Y9 z()>%}MN^PRpnV{U-R`d2{&5naOD)*6rIFxFcn*n8bGqkZ*F5#2awkG|F4m7;7o>c` zY(x!J5VL$LM;WA+BiSmwHQ2)V?Br1oILm;m8@m<;koxIB#sDGtuOO8L{`8lxF&%?; zj}t~1=P?fRi0z2J!tm2$px!~M<+n7E#+c*W&F~vcRg9jU*>gW-4wPMr z0i_M)7^>l@3te8Z=!x4Oc%b(le{IAHyP3IiQ{V&xNmgt+I7gmcNBkV9lRAt>JVEgl zRD`VUCIYV`UpViY4!mH@WdOv)=fQjEsE~?CO2W9K^QU@9akFTSIF}htw|*vwm)n4$ zxieR^65DZ06%g7KC5KPKl?E{@&?Q(Y8{mL_Ar+QFz0L(<$ zzJe4^xL7wRMXvySX7?M(&~*NZ5`&Jf(y=p0bG=qZf;uRUO!>%N@fhbtPv?On<<7Te z@{&84KJ-Dw1PoRXj_$3_|M3nKSRA@)0VO|0!}YiHf)9F{Om7JtRw^Z*2lWT7>B3I@l= z*B81zGUWdS~^ z7@ZdPO;X+2PO*V~flEee))Bf63T|&oU#=j@a(^(bC|$SLli9y*4wTL67JFsS&fyw4 z;0!#S_RF7L$5*3>N@jP4_0ZS)1PKINUzZ~pKo6a|t&wPK#sC+oX^th7f%E=Y73Ypok4;< z{L8H*x=YmJqjP>&mg_--r+FuTafENyHto}bj_m$)iKV_qXzyt8(39STC&&Z`kg}7V z_|P{9+7}SThJxb9 z-Rq|x&(-Adh%RQFx&I~+mo4hY(ZD=-XoE*y*1sffbzguIo^@Fpsgu4IFl}OM1-xqW z`^;@d-R@xQR4*guUx+2mMZ#4<;Is0Hl(~C81n!&w`^G}iG;C?%`Vr-eO`JJd8U{j_ zWM|_>Px)qLEpMJZi$YgnmH5K6QJj?~f=p*&O($oUYTwx{Du3RZR!x!4c_Oy0eN$&L za~*PF?m84)U>O`;KT+3?{w#URE)p4`Pf~zv8OJz$8JvuQn@*_^zwthezsN9l+FKeK z8z_G07%Q?Do^9i#eF7izR<+;J9Ym@C29%?R)dJ$dJ~5zdH~dXE*2A<=uw#%|BWH-u zgI&k$GL}nCS<6R9nW!h-Z%uP2z;lICL+aQxd@6w+`&y_v$x}IU#S{b;pQ< zm-`#c_@Yx27SU{I-;QXMn6*QeGO#gZ!@Yn}e~BDTXdz@sCSa>%6S42TdOSD~vu7wd z37yS3XA;*xC4$1+1g>M|;uUL}4!zjbuuS?KwCV&XWO2uE7Dt^uMl9;AjsoHmdF}c2n zstmoq`qpk$tbwVzMVaoT85H3qf4TJd3VE5 zc~wyFMJE)-f7||=M_hOJmw_0M_VUAMIg4%kOGh6`IuaW4n0Gmyn4LIADc6zx#?bW? zj8EJbbtiRDJ1!t{(>fi(@e5CcCkTH~_c6MB$DSvL|;KoLC!JKvWQ8?}lPv-X~tCN<8#?(&Zms zfTg?{&E<`66+u0CzC4dsPSB82{unP^mU$p2PaQKff{d^ysX;fOHO7Q}AQGi<;eK(1 zrVn9Ez~I7EATM6B&AXHl@#3_%4sxK@khqDP^VuF1%!(+uaHcrNVCgK`JHa*9JclJ(D~UypRB; zKMW~Ld?=F|Yw?q1|8A2S2PDXl*Olvj^d$%@mvti=VWZg^?MhCWKqiPgJ^N%LRDz#Q zUe*6pR*q=2;hWtyBh^8C1rp8$25BzN zQL;|sb+-gE1E4lt@mb}Bmo1^|Ofi&Ub7tTM=`VhY){4_dypWsiXb3FxL-g%zk+KOk zwYo~J`9aK&5>^PJbY4NLH*+4Skq1)7ENsnDv9bDXmLv33zVul`g_^e$D5buUf(ehK z!4plsPcnDJI>R1ij5S|xWN0v4ah<(Dsi@xBc;?mM&`pNlXYia2xRkbZI=x+uu=LC; zdx(X=O^3TlxOS0=DA(Lk`>__aTKK0V+&%8Vqj-0!%o4%9D$Cp4)pYnH%QpcEbFHqO zXc78LaC{guzfpu13Ult%>>Os}*mB#beV4jCcg@X-%K2I<`g*iHs~xENjS2`HI@SBc zj~Cdgr^Z_HMYTXG+z{*tfNFW-oMV;`&6YDyr1 z;Ax8rBA1>JD89|`D%`VRIEgx7$*j;>p!s=4iqhd)iL(8o9GmR@leaYW)-#s^QW)hT zefnv*Y>^2!*Cen>(`Wc4O*3)v!V^xEW3`nH-Ts$wpPV4-eT*ME^;3C31&_|RcMqqb zH3z-pj0=!P=ZMpiaPh9ROGXTQAx|T5h~4BxKhx% zDC~62;lX1YHMkVy@QA*VExegwPASWnkV5w~rV{)>foad<^1|Q%Fa$FNfJ9|%<^f;n zl)qmw1r=C+yU!qIZKvWjM=$E_7;Iyw7%{BVHdnY!SHy}Zs{M5z*Ik^rOtZtEMl646KEzWdv z?5*#EhqN!%#oF;C&IcjUU>Y_6?_BQSCk#l-Tv7_<15iCb$a!;1S|+r>5+qadsmi00 zNw&Z&1a1G=K2oEDIzVwDe5Z?qF}h@cX&7!sQV*t|5BH}SD3$8=3&nACGHdqlgUkxP z$~+h$f13Zi^oNuVSJa(|2J?y=$IL$vUAZWggqu*42mp~@tLFi}gv{W{-MP04pMA>z zA|<6`wV0{F9H8CiWvV!@h^%JNnCW3~;#{Byv4G$6+7ofeny}*(;o_=czQ64E|IoxI<8sFNUm#{#T*K#7o(yL#+9xot)-y=Mf{izC z;u;a;lh3K+@NTi{69K00=bH^zqANQthi#=qqdzJ-|BOhW^~dZecFr7J<;x#qDx2vY z?7u>vw3IkD{XT{f5(ia~>+EYM>X?D%X?n26hv)nu7?ZN^#$O?Rl^`cmETMTzZP+BS zFfprrf5>A^@=u!tGwYoj4{+)^Yn6hjAt&*C%a-6&FEinv<1Tf|TJ)dsU|1ZGxc-nf zQVKE^Mq8eqM`#&bD6@VV_@@83KZDAJ?H@x2?W{?ELjCEl%Wm1xtbh)x+UWbBi#B*iBw8M!duQ_nfwV~!e- zbO}LgwDkxsq^!gVfaVLo;-WmJC9w5}H*#DQhsztzHE9MQh2*xBmPL`&Q7c_&40?S6 ze<xG!NOxxwSm>afr>~^)=idQ@{(@wlrfh8|ZdXzueIKCDoRPNo+^BL~f&BN_u`MQ4b zQzPL}%;T$`{bt-NEEK+z>Q0+d^8P>G4<7|r2%gpu>y1+6loh$T!`Q+~Bf0oqg~EDO;=IuKhST>mU#$m~brCM%~Ttq~y$k6L7PoVpRF<>fe$Q5z(hZ z1?QVrPZ2nIxtM3Zwun;qS7n6gbA3Nsnb6V8yamtxJNsA>KMdfkGUiAw+^Sf=EulOP zB|5fy$o00yLH4TEmVs%4EMaRaWXKCW4v#mAXfz*qeKY}63|x^OJpMcWAndaXy%!%F z**qzn4r^kFV%cDqj~vtMk6R%~6FRZcrn}89xUV7KRrN2BtYRKrKdbbmW$hLcly6sB z1~PHCX(*B&Lr`5_X?4{3W90|+RqIxkz1x?W$0BHtL;gEQ+O&R1nVNK61L?9Hhq+Z? z`7iNnfv(8ja%DxI42)gcToK=m2O$<6n)Hag$%^Z0B(Ccy)L!|_9&r8m7R+(;oolzNM}2Rzm2qUO zKGUaUa}SK_e>gX*gsi5C6*OMb>q4$X?3{L0OJJ_jT{+lhw|oJ*zHmX)=N{%!QlXtU zBPEen#WX&&rdy8^lfW%}k%8YhLhZ7NPXWg6?!@|{4^ZDX!rs3A zhros0G)7}-*f@hNoKJ9qbWws6p0rOkq@eIkCR-XfwqvFjE?ip2eK1Gts9#1XDt12B z3|!|gNwKMMB6YBc*qf%QAk!a*sjkJiIw!m>zRde#(}mG_9~FK*ZOteT=b3I9UieLf zcX4K%1K>W6uKf+?108l1DBKiJWVuJewPMU8h7Cm9{CXj8d0((ah*H>zu!O=tX8HJ! zI;se}ou?G>K5gV@;(PqHM(H{J$2c!pIj=~S_~T$eig}QON{23AeqmVjmQVsUU-80r z_%YL!ov$&Jd}ypI?IUoTRhVuy7VAE7pKc}{tSqI(648FLze?D#wOHb$V;SqZU221PSjdFZxNpONZ`2Sdy2vg z?LLrzfDalu#JVYyaN}tp;4NsX2V4zwIow?22dq!F%eG45Ry^hVK~B-Q52^ z{c_Z2p8_E2KF+0}V<_7*iazL9SW-BMg(6%v_$BFp@ZZN?r?$wFO|LbFpcAKGKYERH zYhJhB9OQ6Frs*5a>~k^2lZ6m|`L06$&V>Hsm#Q-co;$)D!u?CvzbFKFdMaCikGAt{ zINV&M!nCEmO>Q>+KWpx~+f_8~@F&TXV8&9FrNnf71Y{9r+GmIzqoo%b&Wciw?fKLG z8L09&Fad=<_;KS1;3m`+cB}u@K;J{WSkX|C>c@_+!Z9CO08{;sr(Yo@#wQbVfMVxb zxqpP^$f;TUuU5<*W=1p66GQLg`r^fG|J};=o(4#QPw1#TjZS5$3ic9JtYilaN(!~i zg844|*G_bHgNp_TZ(+RJY(g4mPz97}9}6PnUJNeAc=CQ%UF1`-L6Fb!A5WPyKse7| z+08~0kStZ%)@85#ZZ;kjVRh-qedlYT-@3qE0W9hrYe2sgC4HkwG=~%JS3vULg@t|w zN#|H4hCyCcg_axG_k<*nZ@H+i2V;g`Jm30-o?MdI#e~!=;~ZsiI>zlY-Sd$Pn-uA& z+;W2lZHmZEbCvsttiS%OL;%_bVUyyFZOTFdMiSG+q%E`7#%qNGeDoIV`3^m@Ptj}r zlRHp2fE#~6UL?R1yb>W#^%FrB{WtB>O$-+8K36WrLpq_210|?hNOF(zfs-e@|I14{{PFlXC*+K^AD#orBGc7%d9KH z0ql4z?t>QieoPSe$~lT*0@cInW1XAme=+gU$(66w4B+wyh$QNt;FUbLLi3cSjA87m zpSE<-vv@I>OK}>HZloT1?aQ8%`0zjW2IM3CT~kDY1$hM{D6`q+>q;m=zdA`{HqpPQ{b!FP4O>9wX3(yXN| zZ{9`O2BiXV@E;F{6w3OjtA|%H51NC=SKPG*_l{?wj~|4cPZ6qEsv8A23UKp0RPX*U zZUuJW-DH%HE%Y1T-=7-dUAPkgKn_z6gDp6gsuT^7M}g1ykFLRa>ZND!aa^mgOi6es z#vP!J&&C-<;G6A>^jeP+{Nqx-yKcSbl?G?q3tkGsz?#c`|3yoCY?w(OTDqO!XH=&U z5Z@ooK6+(xEaC!ge_Q!GCPE{3poLx+xoG}TpMzeMlCbPPS)7W#5lj(2(-+O|q()t2 zC-F*}!p`3KuVpJIX-Eky$L6Lb!*^XGX@a5lmj(j2zkMk@^h6Tpo$h&0`uP{qf-vM= z=zT5IEfWz^NqYS%JI#BnGJCpF_{|xH+N<}Zza2XKw&dX%)^3u=6^rnKbhLbOSJak! z{=WFk&*41_(ci=K!W;YDx`ptu%}eaTJ=+RP>tyki04MPu71Wrv171mUOsOO(_mZDx ztEEV15?SM7m|Rz33H8C$5HjW@u|T@+h8M(BzcqT8TzxswaCQOV-fCSBX%^I*3w@S> z{d&-8hon}1R&DuE_)X>3K=A+3FO#m59dJh9~vq4j*#y<~E@;_HvYl8j%}p zQCaV3hnr~XUSq=Ui8C}e#Wg!3Qs1*?ZqKHERBw+#Gf5TMBZu1i^K5b~|aq7gEGF z)YSjHeuoxxu%zT2Hs{gQQz)vNwR|jdstuVpKpv3sto4AZMb%<%e-j@myYdeu2=4(U z@cLzIbqMn#pKHukN2xL24|s_pOXl#1aNoqd_KIf7`$ zPQ9i!MYN$RlWh8O&)mkCo4uMl?d)&5`kK1C>^!X=w6Y{5|5i%_3pUaJ_~$ajPa&&Z z?9?fdSyIp=D9kAcqlDXB!}@gS@G$&jeLjqSCGCS^YW(dQ^(#A?X~5I zR@iMf$T3-|*YvzmWY;nyGOyy%jLQ<3J_m;qPJ5w{BY8D>gX@-iudk z=wB$KHihV*E<%xFKVGs|v^^TRfA+BCqQbx>>~;{;F7}+;Yxr5IV#Ce3`-r7E>b&Qp zIOR7OA2XBH4aE4P@R$_m%+HFe+2lqroH^)J_bV+6;Xg-BS(>5hVn&{fFMBdm=ya3$-sys?3iinR^RboC~J zOLI9j{W}ri<$+0;{YoV(_PjMInfr#-lp;<-nyQn&KkeTqvvW_dedmY!wNA{ei3_NJ z{WM!ON6HfME3+MlYQvxr_HhlD?9UokP5$pJgsmsgGH%5K9)t3)(zGh;^L3`k?s@gMI~9E$)TN1cjz#zJIa=9}HHo@se7{G8ydT-Fyq}AVks}7zZ>`?q5i*9s zI6flv&RJJ*z9@@%q6LSF2H$3<<@J$!9ozJ6LZj}w&SqZ>9A|REPBqB9EvD|KWX@dXDVckT6wEwj z7V!u4&hx}oydv=!RChNXi zkfsO`eleOBvtYJ5#{Qu_94Y(C&%4nYFjp0`mJ;zDHj3E56P@gHreR`HpS-hF+7MP@ zKkJ92R(C{Z{CnC1EO?|8O2BC!Mu_)nb;g81`Abxn%wSAO9SX`fSOqV>^4mF%1mey}!gE=ZNX=Bj(SlL=8 zV*Df7tM^}eJAqZaERiD0o!+%q0b1>Oy?JirgP&G5E)S;+AWdbWpO>JQ%MH;VTL^x! z+LOd^a&%jRh@YHIXgj-OoY`Lo#iKp?btyPqotzkZh%IGgsu zcxpWrkupnd&W}9!doXk@OWGrA8?rc20NE5ZePJwj3P;_gWzN(f69*?g2vo^v$ktOLnjOcm+X1N9Ytw3b zi|K!ByI~wug{L-25F4Qe1Tj?c{_=D75u2uPX+0w(iCkZ|RYr}mfZWgcVk%x>Y$E+3 zA)}ynYRrV~y@wF4emrX`4{2t8#vmy&9BN0=fKJ)#dZ6;cy|m{g&UzhSpVgh;?~1BWwta~lb~x*W!+X*ZG7gRHn|U`ys$YBR$QKLtRTuemLnRZ&ubss z>we^*ltOlix)jkJ8+8$yghqXdMK6t3y^uYItLfCH8#yckjy5Ntsa>RC##Af9pj$QB z!W-Lv(t5LiZc9Y5r^3=^y;wk7F{OLip+h%Aa}J9fOaHtcw6s7~bN1T~%oC zNsIWxR`Vtp)sr<%J7<0pM=Rf;zOk|a4Wpp)&gI--6KF*IM+2f78RYl!=UA=MJ6ew@ z67Uavk;~%uI?<-wQY~jIF-=X%M3h{NrW@k`YuZ`wI|U>UWKY*Y@kSIQZBGOdoKKvk z!3Z^c+1Edq_qq;sEjn~uuViizk@D9; zS+dHc-&(~5Z|wQ8XCZzNo8oQcObE?GB$w^?>#!m)lXE2{fC=AWHD!n@qH3G4WF9F$ z(t!e!j;NZPZq6D%P(2S@_TG0D{!{d%jSVu{bd`W;emM2aRPYqoW>MYZZ&)BQTyD_X z-{-ULz5GP6-zOe@x{Ns^ga)8(`{*~kIoJk8fbf4mzWRUeDJ>YxHRyl#Z&!9@8jSf~ zUgX}~VRq>jEQ2547;6T%ezo#-2h5bdwY#%6Sh@ECT_K^hF4eXw8YF4AeZR2=^glmP0!-{O2m6xGEb zcMmYaYz?37Uzp7Y|9Gm%tfKMsme0Cek=Y*4z@!n@`@XNmiRNo~f0C?vUa|=xXf6{U zI_pMC{~2QN)omj}o~+R;_j@x`7aN*Dj^4b2VWa?PzRC#*T zcCCBQE3$Q8E~M#AZ2uY6^^ZA0S7(H=26y6&psh{HiBM?qiw82$4T4#v2`0~9a0o9~u8#IfK?cRxkUerPRJ|;TaDpna$E&8e ze_}7cJG|GeuQwpLOAm6jmw9;`RDQO$8P_IhIvUxK3rn1Hrd}gdG|)xPW8{m;N_$2L ztm{0WvJGm`OKhzvxy1Eh|gd}*@!>H-t|_fY6e z8&t0r9RH+b?g3DJKkjlTkK|67W4A9us1Wd}qMX{ZC3DhrfF&tVg-rS^Ubj^&lDh|5 zVU>VTTQ)W{qt!7)d~(k0yE1_BDkpIxsSl?Fk=J!rhxo;7%~38YtF?P8 zlxHhA6o4(6Q$yw{(~dKzoW>D<%U6*p%L&=pR?;P5nM~u++ePM z*wS6&3Y7uVy6!=qda7Q1^Tb$-w!c2tC@fTX5R zr6aGWP4y2&aDPl@KSxSKYNt-=BDEh)O(2$Lsl7d_dpZ(UcA{XBRnDI{aq2|9N!S<$o*Q9i$&U^h+fn_09BN{^@%2{{T1%y#4?H literal 0 HcmV?d00001 diff --git a/assets/logo_rectangular_transparent.svg b/assets/logo_rectangular_transparent.svg new file mode 100644 index 0000000..16f60ef --- /dev/null +++ b/assets/logo_rectangular_transparent.svg @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AMDirT + + + + + + diff --git a/docs/source/index.rst b/docs/source/index.rst index 4fca812..5341de5 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -11,7 +11,9 @@ Welcome to AMDirT's documentation! 🛠️ **AMDirT**: `AncientMetagenomeDir `_ Toolkit 🛠️ -AMDirT is a toolkit for interacting with the AncientMetagenomeDir metadata repository of ancient metagenomic samples and ancient microbial genomes. This tool provides ways to validate AncientMetagenomeDir submissions, explore and download sequencing data for ancient microbial and environmental (meta)genomes, and automatically prepare input samplesheets for a range of bioinformatic processing pipelines. +AMDirT is a toolkit for interacting with the AncientMetagenomeDir metadata repository of ancient metagenomic samples and ancient microbial genomes. + +This tool provides ways to explore and download sequencing data for ancient microbial and environmental (meta)genomes, automatically prepare input samplesheets for a range of bioinformatic processing pipelines, and to validate AncientMetagenomeDir submissions. For more information on installation see: :doc:`README`. For how to use the toolkit (tutorials, how-toes, references) please see the table of contents. diff --git a/docs/source/tutorials/convert.md b/docs/source/tutorials/convert.md new file mode 100644 index 0000000..81dea33 --- /dev/null +++ b/docs/source/tutorials/convert.md @@ -0,0 +1 @@ +# convert diff --git a/docs/source/tutorials/index.rst b/docs/source/tutorials/index.rst index 3037871..5ef29f1 100644 --- a/docs/source/tutorials/index.rst +++ b/docs/source/tutorials/index.rst @@ -11,4 +11,5 @@ All tutorials assume you have already installed AMDirT following the installatio :maxdepth: 1 :caption: Tutorials: - viewer \ No newline at end of file + viewer + convert \ No newline at end of file From 018a1c3b190b789ffcad33464713b49d903f1d6c Mon Sep 17 00:00:00 2001 From: "James A. Fellows Yates" Date: Thu, 28 Mar 2024 13:33:16 +0000 Subject: [PATCH 2/8] Use generally transparent dark mode --- README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/README.md b/README.md index cd3d841..f28495e 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,7 @@ [![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.4003825.svg)](https://doi.org/10.5281/zenodo.4003825) [![PyPI version](https://badge.fury.io/py/AMDirT.svg)](https://pypi.org/project/AMDirT) [![Documentation Status](https://readthedocs.org/projects/amdirt/badge/?version=dev)](https://amdirt.readthedocs.io/en/dev/?badge=dev) [![AMDirT-CI](https://github.com/SPAAM-community/AMDirT/actions/workflows/ci_test.yml/badge.svg)](https://github.com/SPAAM-community/AMDirT/actions/workflows/ci_test.yml) - - AMDirT Logo + AMDirT Logo **AMDirT**: [**A**ncient**M**etagenome**Dir**](https://github.com/SPAAM-community/ancientmetagenomedir) **T**oolkit From d535f0f87434423c0d00abe9d2be2aacedab6642 Mon Sep 17 00:00:00 2001 From: "James A. Fellows Yates" Date: Thu, 28 Mar 2024 13:44:58 +0000 Subject: [PATCH 3/8] Add autofill caveat of not running manually usually in howto --- docs/source/how_to/autofill.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/source/how_to/autofill.md b/docs/source/how_to/autofill.md index e1002a4..d2edecf 100644 --- a/docs/source/how_to/autofill.md +++ b/docs/source/how_to/autofill.md @@ -8,6 +8,8 @@ The purpose of the `autofill` command is to help AncientMetagenomeDir contributo You should use these commands when you want to contribute to AncientMetagenomeDir, by adding a newly published dataset, if it's already available on a sequencing archive (ENA/SRA). +It is normally executed for you by a 'bot' on GitHub when you have opened a pull-request with a samplesheet, by leaving a comment of `@spaam-bot autofill `. Thus, you should also only run this command if you want to do your AncientMetagenomeDir _entirely_ locally. + ## How ### `autofill` From 77c2919096697999efe66b6a0fa74c814d2a8eaf Mon Sep 17 00:00:00 2001 From: "James A. Fellows Yates" Date: Thu, 28 Mar 2024 14:09:39 +0000 Subject: [PATCH 4/8] Add merge HOW TO --- docs/source/how_to/convert.md | 44 +++++++++++++++++------------------ docs/source/how_to/merge.md | 33 ++++++++++++++++++++++++++ 2 files changed, 55 insertions(+), 22 deletions(-) create mode 100644 docs/source/how_to/merge.md diff --git a/docs/source/how_to/convert.md b/docs/source/how_to/convert.md index c0146b2..10732f4 100644 --- a/docs/source/how_to/convert.md +++ b/docs/source/how_to/convert.md @@ -37,7 +37,7 @@ AMDirT convert --libraries ancientmetagenome-hostassociated_libraries_warinnerli See [Output](#output) for descriptions of all output files. -> ⚠️ _When using a **pipeline input samplesheet**, you should always double check the sheet is correctly configured. We cannot guarantee accuracy between metadata and sequencing files._ +> ⚠️ _When using a **pipeline input samplesheet**, you should always double check the sheet is correctly configured. We cannot guarantee accuracy between metadata and sequencing files._ Once you have validated it, you can directly supply it to the appropriate pipeline as follows (using nf-core/eager as an example): @@ -51,33 +51,33 @@ The **citations BibTex** file contains all the citation information of your sele ## Output -> ⚠️ _We highly recommend generating and reviewing `AncientMetagenomeDir_filtered_libraries.tsv` **before** downloading or running any pipelines to ensure you have in the download scripts and/or pipeline input sheets only the actual library types you wish to use (e.g. you may only want paired-end data, or non-UDG treated data)._ +> ⚠️ _We highly recommend generating and reviewing `AncientMetagenomeDir_filtered_libraries.tsv` **before** downloading or running any pipelines to ensure you have in the download scripts and/or pipeline input sheets only the actual library types you wish to use (e.g. you may only want paired-end data, or non-UDG treated data)._ -> ⚠️ _To use a **pipeline input samplesheet**, you should always double check the sheet is correctly configured. We cannot guarantee accuracy between metadata and sequencing files._ +> ⚠️ _To use a **pipeline input samplesheet**, you should always double check the sheet is correctly configured. We cannot guarantee accuracy between metadata and sequencing files._ All possible output is as follows: - ``: where all the pipeline samplesheets are placed (by default `.`) -- `AncientMetagenomeDir_bibliography.bib`: - - A BibTex format citation information file with all references (where available) present in the filtered sample table. -- `AncientMetagenomeDir_filtered_libraries.tsv`: - - The associated AncientMetagenomeDir curated metadata for all _libraries_ of the samples in the input table. +- `AncientMetagenomeDir_bibliography.bib`: + - A BibTex format citation information file with all references (where available) present in the filtered sample table. +- `AncientMetagenomeDir_filtered_libraries.tsv`: + - The associated AncientMetagenomeDir curated metadata for all _libraries_ of the samples in the input table. - `AncientMetagenomeDir_curl_download_script.sh`: - - A bash script containing curl commands for all libraries in the input samples list. + - A bash script containing curl commands for all libraries in the input samples list. - `AncientMetagenomeDir_aspera_download_script.sh`: - - A bash script containing Aspera commands for all libraries in the input samples list. See [How Tos](/how_to/miscellaneous) for Aspera configuration information. -- `AncientMetagenomeDir_nf_core_fetchngs_input_table.tsv`: - - An input sheet containing ERS/SRS accession numbers in a format compatible with the [nf-core/fetchngs](https://nf-co.re/fetchngs) input samplesheet. + - A bash script containing Aspera commands for all libraries in the input samples list. See [How Tos](/how_to/miscellaneous) for Aspera configuration information. +- `AncientMetagenomeDir_nf_core_fetchngs_input_table.tsv`: + - An input sheet containing ERS/SRS accession numbers in a format compatible with the [nf-core/fetchngs](https://nf-co.re/fetchngs) input samplesheet. - `AncientMetagenomeDir_nf_core_eager_input_table.tsv`: - - An input sheet with metadata in a format compatible with the [nf-core/eager](https://nf-co.re/eager) input samplesheet. - - Contained paths are relative to the directory output when using the `curl` and `aspera` download scripts (i.e., input sheet assumes files are in the same directory as the input sheet itself). -- `AncientMetagenomeDir_nf_core_taxprofiler_input_table.csv`: - - An input sheet with metadata in a format compatible with the [nf-core/taxprofiler](https://nf-co.re/eager) input samplesheet. - - Contained paths are relative to the directory output when using the `curl` and `aspera` download scripts (i.e., input sheet assumes files are in the same directory as the input sheet itself). + - An input sheet with metadata in a format compatible with the [nf-core/eager](https://nf-co.re/eager) input samplesheet. + - Contained paths are relative to the directory output when using the `curl` and `aspera` download scripts (i.e., input sheet assumes files are in the same directory as the input sheet itself). +- `AncientMetagenomeDir_nf_core_taxprofiler_input_table.csv`: + - An input sheet with metadata in a format compatible with the [nf-core/taxprofiler](https://nf-co.re/eager) input samplesheet. + - Contained paths are relative to the directory output when using the `curl` and `aspera` download scripts (i.e., input sheet assumes files are in the same directory as the input sheet itself). - `AncientMetagenomeDir_aMeta_input_table.tsv`: - - An input sheet with metadata in a format compatible with the [aMeta](https://github.com/NBISweden/aMeta) input samplesheet. - - Contained paths are relative to the directory output when using the `curl` and `aspera` download scripts (i.e., input sheet assumes files are in the same directory as the input sheet itself). -- `AncientMetagenomeDir_nf_core_mag_input_{single,paired}_table.csv`: - - An input sheet with metadata in a format compatible with the [nf-core/mag](https://nf-co.re/eager) input samplesheet. - - Contained paths are relative to the directory output when using the `curl` and `aspera` download scripts (i.e., input sheet assumes files are in the same directory as the input sheet itself). - - nf-core/mag does not support paired- and single-end data in the same run, therefore two sheets will be generated if your selected samples contain both types of libraries. + - An input sheet with metadata in a format compatible with the [aMeta](https://github.com/NBISweden/aMeta) input samplesheet. + - Contained paths are relative to the directory output when using the `curl` and `aspera` download scripts (i.e., input sheet assumes files are in the same directory as the input sheet itself). +- `AncientMetagenomeDir_nf_core_mag_input_{single,paired}_table.csv`: + - An input sheet with metadata in a format compatible with the [nf-core/mag](https://nf-co.re/eager) input samplesheet. + - Contained paths are relative to the directory output when using the `curl` and `aspera` download scripts (i.e., input sheet assumes files are in the same directory as the input sheet itself). + - nf-core/mag does not support paired- and single-end data in the same run, therefore two sheets will be generated if your selected samples contain both types of libraries. diff --git a/docs/source/how_to/merge.md b/docs/source/how_to/merge.md new file mode 100644 index 0000000..f2d0fbe --- /dev/null +++ b/docs/source/how_to/merge.md @@ -0,0 +1,33 @@ +# merge + +## What + +Merges a user-supplied metadata table with the latest AncientMetagenomeDir master metadata tables, with on-the-fly [validation](validation.md). + +## When + +This command would be used when you have a local version of an AncientMetagenomeDir table (samples or libraries) of just the new samples or libraries to add, and want to append to the current master table before submitting a pull request. + +You typically only do this if preparing a pull request to the AncientMetagenomeDir repository entirely locally. + +## How + +The following description assumes you have already prepared a AncientMetagenomeDir **samples** or **libraries** table whose rows only consist of the header and new samples to be added. + +> ⚠️ _The header, and present columns etc. should match exactly that on the corresponding AncientMetagenomeDir table_ + +Given a new samples table `samples_for_new_pr.tsv` to be added to the single genome samples table `ancientsinglegenome-hostassociated`, you can run the following command: + +```bash +AMDirT merge -n ancientsinglegenome-hostassociated -t samples samples_for_new_pr.tsv +``` + +Note that during merge `merge` will also perform schema validation to ensure the contents of the new rows are valid against the AncientMetagenomeDir schema. + +## Output + +The output of the `merge` command is a new table with the merged rows named after the table you merged the new rows onto, placed by default in the directory you ran the command from (customisable with `-o`). + +In the example above, the file result would be: `ancientsinglegenome-hostassociated_samples.tsv`. + +The contents of this file can then theoretically be used to submit a pull request to the AncientMetagenomeDir repository. From 907778e6a93bb824f78f98d8aafbb0ec4c450e4d Mon Sep 17 00:00:00 2001 From: "James A. Fellows Yates" Date: Thu, 28 Mar 2024 14:14:55 +0000 Subject: [PATCH 5/8] Typo fixes --- docs/source/how_to/autofill.md | 2 +- docs/source/how_to/convert.md | 2 +- docs/source/how_to/index.rst | 1 + docs/source/how_to/merge.md | 4 +- docs/source/how_to/validate.md | 2 +- docs/source/tutorials/index.rst | 4 +- tests/data/libraries_schema.json | 119 +++++++------------------------ 7 files changed, 35 insertions(+), 99 deletions(-) diff --git a/docs/source/how_to/autofill.md b/docs/source/how_to/autofill.md index d2edecf..3effc20 100644 --- a/docs/source/how_to/autofill.md +++ b/docs/source/how_to/autofill.md @@ -52,7 +52,7 @@ project_name publication_year data_publication_doi sample_name archive archive_p You will notice that some columns are missing information, especially in the sample metadata table (in this example, `samples.tsv`). Despite our best efforts, not all information is made available through ENA, and it will be up to you to fill these missing columns, from the original publication, its supplementary material, or elsewhere. You can do it in your favorite text editor, or table editor (like LibreOffice Calc, or Excel). -Please refer to the AncientMetagenomeDir wiki for information on this process: [https://github.com/SPAAM-community/AncientMetagenomeDir/wiki](github.com/SPAAM-community/AncientMetagenomeDir/wiki). +Please refer to the AncientMetagenomeDir wiki for information on this process: [https://github.com/SPAAM-community/AncientMetagenomeDir/wiki](https://github.com/SPAAM-community/AncientMetagenomeDir/wiki). > ⚠️ The sample and library names reported on sequencing archives (ENA, SRA, ...) might not be the same as the one list in the original article. Please double check before proceeding further. diff --git a/docs/source/how_to/convert.md b/docs/source/how_to/convert.md index 10732f4..e28c1f9 100644 --- a/docs/source/how_to/convert.md +++ b/docs/source/how_to/convert.md @@ -12,7 +12,7 @@ You typically will use `convert` if you are a command-line power user, and have ## How -The following description assumes that you have already have a AncientMetagenomeDir **samples** table that has been filtered to the samples you wish to run through a given pipeline(s). +The following description assumes that you have already have an AncientMetagenomeDir **samples** table that has been filtered to the samples you wish to run through a given pipeline(s). > ⚠️ _The header, and present columns etc. should match exactly that on AncientMetagenomeDir, only rows may be removed._ diff --git a/docs/source/how_to/index.rst b/docs/source/how_to/index.rst index ac3eb4d..a6b8970 100644 --- a/docs/source/how_to/index.rst +++ b/docs/source/how_to/index.rst @@ -13,4 +13,5 @@ All 'How Tos' assume you have already installed AMDirT following the installatio convert validate autofill + merge miscellaneous \ No newline at end of file diff --git a/docs/source/how_to/merge.md b/docs/source/how_to/merge.md index f2d0fbe..8ce4fec 100644 --- a/docs/source/how_to/merge.md +++ b/docs/source/how_to/merge.md @@ -2,7 +2,7 @@ ## What -Merges a user-supplied metadata table with the latest AncientMetagenomeDir master metadata tables, with on-the-fly [validation](validation.md). +Merges a user-supplied metadata table with the latest AncientMetagenomeDir master metadata tables, with on-the-fly [validation](/how_to/validate). ## When @@ -12,7 +12,7 @@ You typically only do this if preparing a pull request to the AncientMetagenomeD ## How -The following description assumes you have already prepared a AncientMetagenomeDir **samples** or **libraries** table whose rows only consist of the header and new samples to be added. +The following description assumes you have already prepared an AncientMetagenomeDir **samples** or **libraries** table whose rows only consist of the header and new samples to be added. > ⚠️ _The header, and present columns etc. should match exactly that on the corresponding AncientMetagenomeDir table_ diff --git a/docs/source/how_to/validate.md b/docs/source/how_to/validate.md index 1de7590..071621f 100644 --- a/docs/source/how_to/validate.md +++ b/docs/source/how_to/validate.md @@ -2,7 +2,7 @@ ## What -The purpose of the `validate` command is to check that a AncientMetagenomeDir metadata file confirms the specifications of the project. +The purpose of the `validate` command is to check that an AncientMetagenomeDir metadata file confirms the specifications of the project. ## When diff --git a/docs/source/tutorials/index.rst b/docs/source/tutorials/index.rst index 5ef29f1..8dc5326 100644 --- a/docs/source/tutorials/index.rst +++ b/docs/source/tutorials/index.rst @@ -1,12 +1,14 @@ Tutorials ============================================= -Introductory tutorials for each sub-command can be found below in text and/or video format. +Introductory tutorials for sub-commands can be found below in text and/or video format. All videos can be also found on the `SPAAM Community Youtube channel `_. All tutorials assume you have already installed AMDirT following the installation instructions (:doc:`/README`). +Note that tutorials currently exist for user-facing commands, sub-commands such as `validate` and `autofill` are generally executed by users. For these please see the respective (:doc:`/how_to/index`) page. + .. toctree:: :maxdepth: 1 :caption: Tutorials: diff --git a/tests/data/libraries_schema.json b/tests/data/libraries_schema.json index 702618a..b23768d 100644 --- a/tests/data/libraries_schema.json +++ b/tests/data/libraries_schema.json @@ -38,13 +38,9 @@ "$id": "#/items/properties/project_name", "type": "string", "title": "AncientMetagenomeDir key of the publication", - "description": "Format: surnameYYYY (if duplicate key but different publication, add b,c,d etc. as necessary). Must match a AncientMetagenomeDir samples table entry", + "description": "Format: surnameYYYY (if duplicate key but different publication, add b,c,d etc. as necessary). Must match an AncientMetagenomeDir samples table entry", "pattern": "^[a-zA-Z]+\\d{4}[b-z]?$", - "examples": [ - "Warinner2014", - "Muhlemann2018", - "Muhlemann2018a" - ] + "examples": ["Warinner2014", "Muhlemann2018", "Muhlemann2018a"] }, "publication_year": { "$id": "#/items/properties/publication_year", @@ -53,28 +49,22 @@ "maximum": 2100, "title": "Year of publication", "description": "Format: YYYY", - "examples": [ - 2014 - ] + "examples": [2014] }, "publication_doi": { "$id": "#/items/properties/publication_doi", "type": "string", "pattern": "^10.\\d{4,9}\\/[^,]+$", "title": "Digital Object Identifier (DOI) of the publication.", - "description": "A valid DOI code (not as an URL). Must match a AncientMetagenomeDir samples table entry", - "examples": [ - "10.1038/ng.2906" - ] + "description": "A valid DOI code (not as an URL). Must match an AncientMetagenomeDir samples table entry", + "examples": ["10.1038/ng.2906"] }, "sample_name": { "$id": "#/items/properties/sample_name", "type": "string", "title": "Name of the sample", - "description": "In most cases this should be the name of the host individual. Must match a AncientMetagenomeDir samples table entry", - "examples": [ - "B61" - ] + "description": "In most cases this should be the name of the host individual. Must match an AncientMetagenomeDir samples table entry", + "examples": ["B61"] }, "archive": { "$id": "#/items/properties/archive", @@ -82,29 +72,22 @@ "title": "Archiving platform", "description": "Name of the nucleotide data archiving platform", "$ref": "https://spaam-community.github.io/AncientMetagenomeDir/assets/enums/archive.json", - "examples": [ - "ENA" - ] + "examples": ["ENA"] }, "archive_project": { "$id": "#/items/properties/archive_project", "type": "string", "title": "Archive project accession platform", - "description": "Name of the nucleotide data archiving platform. Must match a AncientMetagenomeDir samples table entry", - "examples": [ - "PRJNA438985", - "mgp13354" - ] + "description": "Name of the nucleotide data archiving platform. Must match an AncientMetagenomeDir samples table entry", + "examples": ["PRJNA438985", "mgp13354"] }, "archive_sample_accession": { "$id": "#/items/properties/archive_sample_accession", "type": "string", "pattern": "^[\\S]+$", "title": "Archive accession number", - "description": "Samples archive accession numbers, multiple records can be separated with commas. No spaces allowed. . Must match a AncientMetagenomeDir samples table entry", - "examples": [ - "SRS473742,SRS473743,SRS473744,SRS473745" - ] + "description": "Samples archive accession numbers, multiple records can be separated with commas. No spaces allowed. . Must match an AncientMetagenomeDir samples table entry", + "examples": ["SRS473742,SRS473743,SRS473744,SRS473745"] }, "library_name": { "$id": "#/items/properties/library_name", @@ -112,11 +95,7 @@ "pattern": "^[\\S]+$", "title": "Name of the sequencing library", "description": "Name of the sequencing library generated from the sample. Typically matches the corresponding FASTQ file name", - "examples": [ - "ElSidron1_12056", - "DRT001.A0301", - "L1" - ] + "examples": ["ElSidron1_12056", "DRT001.A0301", "L1"] }, "strand_type": { "$id": "#/items/properties/strand_type", @@ -125,10 +104,7 @@ "title": "Strandedness of library", "description": "Strandedness of the DNA in the library, i.e. whether single or double stranded.", "$ref": "https://spaam-community.github.io/AncientMetagenomeDir/assets/enums/strand_type.json", - "examples": [ - "single", - "double" - ] + "examples": ["single", "double"] }, "library_polymerase": { "$id": "#/items/properties/library_polymerase", @@ -145,36 +121,20 @@ }, "library_treatment": { "$id": "#/items/properties/library_treatment", - "type": [ - "string", - "null" - ], + "type": ["string", "null"], "pattern": "^[\\S]+$", "title": "Name of damage-removal treatment", "description": "Name of any established damage-removal treatment that may have been performed.", "$ref": "https://spaam-community.github.io/AncientMetagenomeDir/assets/enums/library_treatment.json", - "examples": [ - "none", - "half-udg", - "full-udg" - ] + "examples": ["none", "half-udg", "full-udg"] }, "library_concentration": { "$id": "#/items/properties/library_concentration", - "type": [ - "integer", - "null" - ], + "type": ["integer", "null"], "minimum": 0, "title": "Number of pre-amplification DNA copies of library per microlitre", "description": "Number of pre-amplification DNA copies of library per microlitre as measured by qPCR. Can be used for contamination estimation against blanks", - "examples": [ - "NA", - 0, - 9064000, - 15730000, - 1331500000 - ] + "examples": ["NA", 0, 9064000, 15730000, 1331500000] }, "instrument_model": { "$id": "#/items/properties/instrument_model", @@ -196,10 +156,7 @@ "title": "Sequencing layout of library", "description": "Sequencing layout of library, i.e. either single or paired end, based on ENA controlled vocabulary (https://www.ebi.ac.uk/ena/portal/api/controlledVocab?field=library_layout", "$ref": "https://spaam-community.github.io/AncientMetagenomeDir/assets/enums/library_layout.json", - "examples": [ - "PAIRED", - "SINGLE" - ] + "examples": ["PAIRED", "SINGLE"] }, "library_strategy": { "$id": "#/items/properties/library_strategy", @@ -207,27 +164,14 @@ "title": "Type of sequencing library", "description": "Type of sequencing library. Whether shotgun sequenced (WGS) or enriched using 'Target-Capture' protocols and similar.", "$ref": "https://spaam-community.github.io/AncientMetagenomeDir/assets/enums/library_strategy.json", - "examples": [ - "WGS", - "Target-Capture", - "depletion", - "Unknown" - ] + "examples": ["WGS", "Target-Capture", "depletion", "Unknown"] }, "read_count": { "$id": "#/items/properties/read_count", - "type": [ - "integer", - "null" - ], + "type": ["integer", "null"], "title": "Number of reads or pairs in library", "description": "Number of reads or pairs in library, i.e. how deep sequenced. For paired end, count pairs (should be same number for both directions)", - "examples": [ - "NA", - 10000, - 6900000, - 123982 - ] + "examples": ["NA", 10000, 6900000, 123982] }, "archive_data_accession": { "$id": "#/items/properties/archive_data_accession", @@ -235,12 +179,7 @@ "pattern": "^[\\S]+$", "title": "Archive run accession number", "description": "Run archive accession numbers, single run accession per line. TODO: improve regex", - "examples": [ - "SRR13263119", - "SRR13263120", - "ERR3003613", - "ERR3003661" - ] + "examples": ["SRR13263119", "SRR13263120", "ERR3003613", "ERR3003661"] }, "download_links": { "$id": "#/items/properties/download_links", @@ -266,18 +205,12 @@ }, "download_sizes": { "$id": "#/items/properties/download_sizes", - "type": [ - "string", - "null" - ], + "type": ["string", "null"], "pattern": "^[0-9]+;[0-9]+;[0-9]+$|^[0-9]+;[0-9]+$|^[0-9]+$", "title": "File sizes of downloads", "description": "File sizes of corresponding download files in bytes, to allow calculation of HDD usage. Can be semi-colon separated list for paired end. TODO: improve regex", - "examples": [ - "126181389", - "614385694;622383780" - ] + "examples": ["126181389", "614385694;622383780"] } } } -} \ No newline at end of file +} From 6a988610bf31d34209aff268ac8d695be4a35378 Mon Sep 17 00:00:00 2001 From: "James A. Fellows Yates" Date: Thu, 28 Mar 2024 14:28:41 +0000 Subject: [PATCH 6/8] Start convert tutorial text --- docs/source/tutorials/convert.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/docs/source/tutorials/convert.md b/docs/source/tutorials/convert.md index 81dea33..05bc918 100644 --- a/docs/source/tutorials/convert.md +++ b/docs/source/tutorials/convert.md @@ -1 +1,14 @@ # convert + +On this page we provide a brief tutorial on how you can use the AMDirT command-line-interface (CLI) of the `convert` command. + +This tutorial assumes you are on a UNIX based operating system and has internet access. + +## Data + +We will take use one of the previous releases of AncientMetagenomeDir as an example dataset. You can download the dataset from the following link. + +```bash +curl https://github.com/SPAAM-community/AncientMetagenomeDir/releases/download/v23.09.0/AncientMetagenomeDir_v23.09.0.zip -o AncientMetagenomeDir-v23.09.0.zip +`` +``` From 2879c64ea40710718f5eededebd519e7f0529735 Mon Sep 17 00:00:00 2001 From: "James A. Fellows Yates" Date: Thu, 28 Mar 2024 15:40:43 +0000 Subject: [PATCH 7/8] Add a convert tutorial --- docs/source/tutorials/convert.md | 86 ++++++++++++++++++++++++++++++-- 1 file changed, 83 insertions(+), 3 deletions(-) diff --git a/docs/source/tutorials/convert.md b/docs/source/tutorials/convert.md index 05bc918..80dc270 100644 --- a/docs/source/tutorials/convert.md +++ b/docs/source/tutorials/convert.md @@ -2,13 +2,93 @@ On this page we provide a brief tutorial on how you can use the AMDirT command-line-interface (CLI) of the `convert` command. -This tutorial assumes you are on a UNIX based operating system and has internet access. +This tutorial assumes you are on a UNIX based operating system and has internet access. It also assumes you have already installed `AMDirT`. + +We will show how given a pre-filtered samples or libraries table (e.g. via command line tools or in an R session), in much the same way as the graphical-based `GUI` command, you can use the command-line interface to convert the table to various formats such as download scripts or prepared input sample sheets for ancient metagenomic pipelines. + +In this case we will want to download all metagenomic sequencing data of ancient dental calculus samples from Germany, and prepare a sample sheet for the nf-core/eager pipeline. ## Data We will take use one of the previous releases of AncientMetagenomeDir as an example dataset. You can download the dataset from the following link. ```bash -curl https://github.com/SPAAM-community/AncientMetagenomeDir/releases/download/v23.09.0/AncientMetagenomeDir_v23.09.0.zip -o AncientMetagenomeDir-v23.09.0.zip -`` +mkdir amdirt-convert-tutorial +cd amdirt-convert-tutorial +curl -LO https://github.com/SPAAM-community/AncientMetagenomeDir/releases/download/v23.09.0/AncientMetagenomeDir_v23.09.0.zip +unzip AncientMetagenomeDir_v23.09.0.zip +``` + +## Filter a sample metadata table + +Next we can filter the ancient metagenome 'host-associated' sample sheet for all dental calculus tables from Germany. + +```bash +cat ancientmetagenome-hostassociated/samples/ancientmetagenome-hostassociated_samples.tsv | grep -e '^project_name' -e 'dental calculus' | grep -e '^project_name' -e 'Germany' > germany_dentalcalculus.tsv +``` + +> ⚠ _The command above is not robust and is only used for system portability and demonstration purposes. For example the `Germany` string could be in a site name. In practice, you should use more robust filtering methods such more specific `grep` expressions or in R_. + +Now we can use the `convert` command to provide a download script, a nf-core/eager samplesheet, the AncientMetagenomeDir library metadata, and a citations file. + +```bash +AMDirT convert --curl --eager --librarymetadata --bibliography germany_dentalcalculus.tsv ancientmetagenome-hostassociated +``` + +This will create the following files: + +- `AncientMetagenomeDir_bibliography.bib`: A BiBTeX file with the citations of the samples in the filtered table supplied to `convert` +- `AncientMetagenomeDir_curl_download_script.sh`: A curl download script to download all associated FASTQ files of the samples in the filtered table +- `AncientMetagenomeDir_filtered_libraries.tsv`: A AncientMetagenomeDir _library_ metadata table of the samples in the filtered table +- `AncientMetagenomeDir_nf_core_eager_input_table.tsv`: A nf-core/eager input table for the samples and FASTQ files downloaded from the `curl` script in the filtered table + +You could then supply run the `curl` script to download the FASTQ files, and then run the nf-core/eager pipeline with the input table. + +```bash +bash AncientMetagenomeDir_curl_download_script.sh +nextflow run nf-core/eager -profile docker --input AncientMetagenomeDir_nf_core_eager_input_table.tsv <...> +``` + +## Filter a library metadata table + +The `convert` command is not just for sample metadata! You can also use it to filter AncientMetagenomeDir library metadata tables. + +Let's say of the samples we just downloaded, you realised you only wanted to use the libraries that were with sequenced with a paired-end sequencing kit. We can filter the previously downloaded library metadata table in the same manner as above. + +```bash + grep -e '^project_name' -e 'PAIRED' AncientMetagenomeDir_filtered_libraries.tsv > germany_dentalcalculus_libraries_pe.tsv +``` + +> ⚠ _The command above is not robust and is only used for system portability and demonstration purposes. For example the `Germany` string could be in a site name. In practice, you should use more robust filtering methods such more specific `grep` expressions or in R_. + +We can then again use the `convert` command to provide an updated download script, nf-core/eager samplesheet, and an citations file. + +```bash +AMDirT convert --curl --eager --bibliography --libraries germany_dentalcalculus_libraries_pe.tsv germany_dentalcalculus.tsv ancientmetagenome-hostassociated +``` + +> ℹ _It's important to note that you still need a (full or filtered) AncientMetagenomeDir samples sheet even when supplying `--libraries`_. + +Once again you will have similar output as above (minus the libraries metadata table), you can than download in this case just the FASTQ files and run these through nf-core eager: + +- `AncientMetagenomeDir_bibliography.bib`: A BiBTeX file with the citations of the samples in the filtered table supplied to `convert` +- `AncientMetagenomeDir_curl_download_script.sh`: A curl download script to download all associated FASTQ files of the samples in the filtered table +- `AncientMetagenomeDir_nf_core_eager_input_table.tsv`: A nf-core/eager input table for the samples and FASTQ files downloaded from the `curl` script in the filtered table + +You could then supply run the `curl` script to download the FASTQ files, and then run the nf-core/eager pipeline with the input table. + +```bash +bash AncientMetagenomeDir_curl_download_script.sh +nextflow run nf-core/eager -profile docker --input AncientMetagenomeDir_nf_core_eager_input_table.tsv <...> +``` + +## Clean up + +Once you've completed this tutorial, simply leave the `amdirt-convert-tutorial` directory and remove it. + +For example: + +```bash +cd .. +rm -r amdirt-convert-tutorial/ ``` From d2f1d4c0a433ae9b019ae960c71f8ff4e5408f70 Mon Sep 17 00:00:00 2001 From: "James A. Fellows Yates" Date: Thu, 28 Mar 2024 15:43:27 +0000 Subject: [PATCH 8/8] Index structure --- docs/source/index.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/source/index.rst b/docs/source/index.rst index 5341de5..7e9194a 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -15,9 +15,9 @@ AMDirT is a toolkit for interacting with the AncientMetagenomeDir metadata repos This tool provides ways to explore and download sequencing data for ancient microbial and environmental (meta)genomes, automatically prepare input samplesheets for a range of bioinformatic processing pipelines, and to validate AncientMetagenomeDir submissions. -For more information on installation see: :doc:`README`. For how to use the toolkit (tutorials, how-toes, references) please see the table of contents. +For more information on installation see: :doc:`README`. -__ homepage_ +For how to use the toolkit (tutorials, how-toes, references) please see the table of contents. .. toctree:: :maxdepth: 1