From 0680a6eca511d594e8325aa37be7dc3b88142265 Mon Sep 17 00:00:00 2001 From: theGreatHerrLebert Date: Tue, 7 Jan 2025 09:38:36 +0000 Subject: [PATCH] deploy: dfb99ef535a0bba1d71d7554cd97c48cb69aa3a4 --- main/imspy/.buildinfo | 4 + main/imspy/.doctrees/environment.pickle | Bin 0 -> 520365 bytes .../.doctrees/imspy.algorithm.ccs.doctree | Bin 0 -> 117211 bytes main/imspy/.doctrees/imspy.algorithm.doctree | Bin 0 -> 40430 bytes .../imspy.algorithm.intensity.doctree | Bin 0 -> 97897 bytes .../imspy.algorithm.ionization.doctree | Bin 0 -> 80726 bytes .../imspy.algorithm.pretrained.doctree | Bin 0 -> 3191 bytes .../.doctrees/imspy.algorithm.rt.doctree | Bin 0 -> 74693 bytes main/imspy/.doctrees/imspy.chemistry.doctree | Bin 0 -> 46529 bytes main/imspy/.doctrees/imspy.data.doctree | Bin 0 -> 356670 bytes main/imspy/.doctrees/imspy.doctree | Bin 0 -> 3512 bytes main/imspy/.doctrees/imspy.simulation.doctree | Bin 0 -> 549416 bytes .../.doctrees/imspy.simulation.timsim.doctree | Bin 0 -> 4310 bytes .../imspy.simulation.timsim.jobs.doctree | Bin 0 -> 202950 bytes .../.doctrees/imspy.timstof.dbsearch.doctree | Bin 0 -> 116542 bytes main/imspy/.doctrees/imspy.timstof.doctree | Bin 0 -> 550685 bytes main/imspy/.doctrees/imspy.utility.doctree | Bin 0 -> 65261 bytes main/imspy/.doctrees/imspy.vis.doctree | Bin 0 -> 3545 bytes main/imspy/.doctrees/index.doctree | Bin 0 -> 5154 bytes main/imspy/.doctrees/modules.doctree | Bin 0 -> 3290 bytes .../_sources/imspy.algorithm.ccs.rst.txt | 21 + .../imspy.algorithm.intensity.rst.txt | 29 + .../imspy.algorithm.ionization.rst.txt | 21 + .../imspy.algorithm.pretrained.rst.txt | 10 + main/imspy/_sources/imspy.algorithm.rst.txt | 49 + .../imspy/_sources/imspy.algorithm.rt.rst.txt | 21 + main/imspy/_sources/imspy.chemistry.rst.txt | 69 + main/imspy/_sources/imspy.data.rst.txt | 29 + main/imspy/_sources/imspy.rst.txt | 12 + main/imspy/_sources/imspy.simulation.rst.txt | 101 + .../imspy.simulation.timsim.jobs.rst.txt | 125 + .../_sources/imspy.simulation.timsim.rst.txt | 29 + .../_sources/imspy.timstof.dbsearch.rst.txt | 45 + main/imspy/_sources/imspy.timstof.rst.txt | 77 + main/imspy/_sources/imspy.utility.rst.txt | 29 + main/imspy/_sources/imspy.vis.rst.txt | 21 + main/imspy/_sources/index.rst.txt | 21 + main/imspy/_sources/modules.rst.txt | 16 + main/imspy/_static/alabaster.css | 663 ++++++ main/imspy/_static/basic.css | 914 +++++++ main/imspy/_static/custom.css | 1 + main/imspy/_static/doctools.js | 149 ++ main/imspy/_static/documentation_options.js | 13 + main/imspy/_static/file.png | Bin 0 -> 286 bytes main/imspy/_static/github-banner.svg | 5 + main/imspy/_static/language_data.js | 192 ++ main/imspy/_static/minus.png | Bin 0 -> 90 bytes main/imspy/_static/plus.png | Bin 0 -> 90 bytes main/imspy/_static/pygments.css | 84 + main/imspy/_static/searchtools.js | 632 +++++ main/imspy/_static/sphinx_highlight.js | 154 ++ main/imspy/genindex.html | 2092 +++++++++++++++++ main/imspy/imspy.algorithm.ccs.html | 483 ++++ main/imspy/imspy.algorithm.html | 400 ++++ main/imspy/imspy.algorithm.intensity.html | 392 +++ main/imspy/imspy.algorithm.ionization.html | 370 +++ main/imspy/imspy.algorithm.pretrained.html | 126 + main/imspy/imspy.algorithm.rt.html | 373 +++ main/imspy/imspy.chemistry.html | 279 +++ main/imspy/imspy.data.html | 1305 ++++++++++ main/imspy/imspy.html | 125 + main/imspy/imspy.simulation.html | 1578 +++++++++++++ main/imspy/imspy.simulation.timsim.html | 198 ++ main/imspy/imspy.simulation.timsim.jobs.html | 518 ++++ main/imspy/imspy.timstof.dbsearch.html | 494 ++++ main/imspy/imspy.timstof.html | 1954 +++++++++++++++ main/imspy/imspy.utility.html | 330 +++ main/imspy/imspy.vis.html | 128 + main/imspy/index.html | 133 ++ main/imspy/modules.html | 198 ++ main/imspy/objects.inv | Bin 0 -> 5425 bytes main/imspy/py-modindex.html | 444 ++++ main/imspy/search.html | 122 + main/imspy/searchindex.js | 1 + 74 files changed, 15579 insertions(+) create mode 100644 main/imspy/.buildinfo create mode 100644 main/imspy/.doctrees/environment.pickle create mode 100644 main/imspy/.doctrees/imspy.algorithm.ccs.doctree create mode 100644 main/imspy/.doctrees/imspy.algorithm.doctree create mode 100644 main/imspy/.doctrees/imspy.algorithm.intensity.doctree create mode 100644 main/imspy/.doctrees/imspy.algorithm.ionization.doctree create mode 100644 main/imspy/.doctrees/imspy.algorithm.pretrained.doctree create mode 100644 main/imspy/.doctrees/imspy.algorithm.rt.doctree create mode 100644 main/imspy/.doctrees/imspy.chemistry.doctree create mode 100644 main/imspy/.doctrees/imspy.data.doctree create mode 100644 main/imspy/.doctrees/imspy.doctree create mode 100644 main/imspy/.doctrees/imspy.simulation.doctree create mode 100644 main/imspy/.doctrees/imspy.simulation.timsim.doctree create mode 100644 main/imspy/.doctrees/imspy.simulation.timsim.jobs.doctree create mode 100644 main/imspy/.doctrees/imspy.timstof.dbsearch.doctree create mode 100644 main/imspy/.doctrees/imspy.timstof.doctree create mode 100644 main/imspy/.doctrees/imspy.utility.doctree create mode 100644 main/imspy/.doctrees/imspy.vis.doctree create mode 100644 main/imspy/.doctrees/index.doctree create mode 100644 main/imspy/.doctrees/modules.doctree create mode 100644 main/imspy/_sources/imspy.algorithm.ccs.rst.txt create mode 100644 main/imspy/_sources/imspy.algorithm.intensity.rst.txt create mode 100644 main/imspy/_sources/imspy.algorithm.ionization.rst.txt create mode 100644 main/imspy/_sources/imspy.algorithm.pretrained.rst.txt create mode 100644 main/imspy/_sources/imspy.algorithm.rst.txt create mode 100644 main/imspy/_sources/imspy.algorithm.rt.rst.txt create mode 100644 main/imspy/_sources/imspy.chemistry.rst.txt create mode 100644 main/imspy/_sources/imspy.data.rst.txt create mode 100644 main/imspy/_sources/imspy.rst.txt create mode 100644 main/imspy/_sources/imspy.simulation.rst.txt create mode 100644 main/imspy/_sources/imspy.simulation.timsim.jobs.rst.txt create mode 100644 main/imspy/_sources/imspy.simulation.timsim.rst.txt create mode 100644 main/imspy/_sources/imspy.timstof.dbsearch.rst.txt create mode 100644 main/imspy/_sources/imspy.timstof.rst.txt create mode 100644 main/imspy/_sources/imspy.utility.rst.txt create mode 100644 main/imspy/_sources/imspy.vis.rst.txt create mode 100644 main/imspy/_sources/index.rst.txt create mode 100644 main/imspy/_sources/modules.rst.txt create mode 100644 main/imspy/_static/alabaster.css create mode 100644 main/imspy/_static/basic.css create mode 100644 main/imspy/_static/custom.css create mode 100644 main/imspy/_static/doctools.js create mode 100644 main/imspy/_static/documentation_options.js create mode 100644 main/imspy/_static/file.png create mode 100644 main/imspy/_static/github-banner.svg create mode 100644 main/imspy/_static/language_data.js create mode 100644 main/imspy/_static/minus.png create mode 100644 main/imspy/_static/plus.png create mode 100644 main/imspy/_static/pygments.css create mode 100644 main/imspy/_static/searchtools.js create mode 100644 main/imspy/_static/sphinx_highlight.js create mode 100644 main/imspy/genindex.html create mode 100644 main/imspy/imspy.algorithm.ccs.html create mode 100644 main/imspy/imspy.algorithm.html create mode 100644 main/imspy/imspy.algorithm.intensity.html create mode 100644 main/imspy/imspy.algorithm.ionization.html create mode 100644 main/imspy/imspy.algorithm.pretrained.html create mode 100644 main/imspy/imspy.algorithm.rt.html create mode 100644 main/imspy/imspy.chemistry.html create mode 100644 main/imspy/imspy.data.html create mode 100644 main/imspy/imspy.html create mode 100644 main/imspy/imspy.simulation.html create mode 100644 main/imspy/imspy.simulation.timsim.html create mode 100644 main/imspy/imspy.simulation.timsim.jobs.html create mode 100644 main/imspy/imspy.timstof.dbsearch.html create mode 100644 main/imspy/imspy.timstof.html create mode 100644 main/imspy/imspy.utility.html create mode 100644 main/imspy/imspy.vis.html create mode 100644 main/imspy/index.html create mode 100644 main/imspy/modules.html create mode 100644 main/imspy/objects.inv create mode 100644 main/imspy/py-modindex.html create mode 100644 main/imspy/search.html create mode 100644 main/imspy/searchindex.js diff --git a/main/imspy/.buildinfo b/main/imspy/.buildinfo new file mode 100644 index 00000000..b7e87682 --- /dev/null +++ b/main/imspy/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file records the configuration used when building these files. When it is not found, a full rebuild will be done. +config: 6a2a48b2f86eb88b01a898cf9d4af968 +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/main/imspy/.doctrees/environment.pickle b/main/imspy/.doctrees/environment.pickle new file mode 100644 index 0000000000000000000000000000000000000000..64413ab4c79d12e872fb3f935f925d63b8d4fff1 GIT binary patch literal 520365 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

ej^qL6*JOd%SC*AyII^syaYkYFHHu&jO9~xz~Y+ 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

VOhOV(1a+8fP-KlqG$~}JO;#eD_8(ABS*^tb8;4 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°o#^vBUrg1WJlbZ zhS5Ad3#ytXM9l_YM~bU9c$lP1Ry|ZNN>24fvxEN@uwR-V_AR}`9+!?AMI)&cU=;UB zAa`?q>YNeB)KO7{<0iin2)@&dpeeh)lb&ghnR_uYjrF21 zZ3)bj94+!J@cD?jryLBU0QAJLmCB?Z$FE^lf@2l_7MOj}jG2j3Ur5iXC(XT>IK_HV zI5kMj7>*VDC2;zlxwjnLqCjNimbrK&z#xnvcP%173=GkR`%`cydJizr;KCEZcoxGH z7r;k{z;8_s-v+T}B3bt?W$8*^16m<-fB)9-`ubsE2UiS z-uqhE2eZGQyBcURzY?9j>r4n8M3&AW=?wQOAOHjEeg|LN@Du}eo4&14M}R=Px1z6B&XCq0#zl7 z(loYi`$^)2*0iN0q^7#1#2~VYMv!(?L$7!bC4fsSd^~h76q&K>((CcOo zD=E`G^?@%*&YD%j63~e|`cK$WOLT1|`D78M%#sTT?REeJ%w(FG za-!}I>jsaX#;YvJauKuCa@UDkYGGkC<)jg5u>@I`Yi-33nUHyHWge=U<|Hk)TPMZ) zxwaDIhy9V>VUJrHiLxQ7RM)kY_vT0LJ-s7$YS&gil^^$y5!_R)t^AF-7gO+;^`ZuU z&1)-PH}{q!_)CFMjRV;NN-_TWxwi6x89`IT{@L_Q`)_kECZ@4o6s8&0R#q-EO>J%t zhEV`AGR#~&60H}Ls(T1YrAO=c!OQ+d>$hb#a4=+F0?L{~_Q{3^iQ8YAxl<{4&xrzN z_MJ?WqA7|edav3JqiD%v7`+pAGSMVfN*TQ0M1uFX+4DZ+;{ds;?TQa6lXt**L$ePi=1uyqD%_x23M#L)1Qcz>gBul7hUEsMcLb59)U7aqfGJ^iAt? z-wCal>>E=I7OF}S!<0TZj*Coj?!5%UXq+40%T~D*=iV93b%GS21`DNPb64Eo=#n`#7S~F z`9TnA56MlMC`HWVz=?^OgeM-z*E3{FP?1`ZhP8?Kc(L~eav@f2T%C}6B9FDG; zsa?0$GnLr2oQS17ZIpd;#_E${-QW{1!B|QtFEJsNeJ6sUap4qkR)rc#5$|E9)z7f_ zNl5t2@sk&!s>#04{I};waW#I@PycOfL^T@JIn|hDI|^0X)2W>9^US@N{5RH1TL0}8 z=ALr+ZxjG^0+wgd6bw7Hag|+Wl9*idYtys%c5^Q#7PDRy7I(>6Et`AG!Db3XPi$VP zOeRd(`0{}v;f7l_PlUh4d~no^nTcC|dTu>z?#09{){Dw5a|&d~+*=NAQ6PHbRzDI} zKWN6x#H|mc=hi39y_mSgddb4AFPMAF!7U0zMsAslM?zr27IL4(*;x;P9fz0w3xQpk z*HFbs*!O|Jrbt*<>yZS+Ci8+I#l<+Kz@z#)677_n;q)Iyd6TDFDK7RCtdue?CY_Ol zdRNIsJ!NM&oiPds&;W`ApO^>MLYts-YDL~ciffAH$J(`v27^krq zh>h`%Q6r%=@geb!;g~M8ay&T%#VlpKq5+1p1EB@Dg^Jg@JWK&AM@eMJl%M0D-8HcnvCejS+2A_H9#zZ(j*?COrnL)Sp zo5_8Pi~L$h{LFEYhoP!zrqbN(H<99MT;xo#Ay5+gI6rK)UXlxI^n;MfNAn~1E(&d$ zy`LX8_hPd3SucvMzZ6G4$BzCG82yF0uN;;>1;K2(qZP+)Qi|i^8o`?#R7=HiP~Pdu z%qaPl!0~Hl98DhDSJHFspUl0OxW;->xHcpq4&g`sQ(*N&bALHFN5SZcbEh`UwPLx+ zs4_+}mqFE(k<4?=y_guydQlkNCCpVc_m+dr6o`y$HW!b$;$jMRA3{0RU2zv)_Rkf+ zu2-80UGm*PXp>8x+K3^p`SrbmB)RCEg5U(y*`Po9sVjFGCo*K31dUny1)i-87#qC%#Vyi#N6S#$Gso1M%&UZ^*Z*sUECmxAXH=a|AHJ}Jvq+~GfI zCjfsNL`Ftiji8xN0Dda08+_o@JNv15P7EUHKHyEMYtq>$b$Q`1JRedj&NDZMR0NgX z=dhWWbd7D9<%~IX%GQ=4+6wukW@E@-&>><41%87oOj2aD{ue=2(*&$V9)1QS0B1n~ ze2|>E8w0oW0l;Rz1k@YzLw!!~P>+P#AkM=cBwxuF1fBj8pkJOJ^lb$6REZJ>_t41ptQUnriv@r1QDF11xt|>Dq22eyp1ve}yxWYKiBG?io=+b%_hRA`>qX&Hmou+E zY3?ltwYIusNj}AVmlG zd<-`HH?Yar1$^o3?YrdQJ|A< zX><}cXxQx6WMMMtR!DL`NalO<(er(V>M(A}_fN6|kAt(a_SLon;VplbGD z7SW)16#X80488G$uWq~knU{dll0;=a zevy3qd{kZwt>mO~0jl;+<+Bnf5!u}oQe4^Hq|;l>v0aaX!Lde;_PL=Svw*}I^B}%0 zGKhPc52AMg{-P{rJ+&Q?#+!sRCZCuoEbZ6yMMQ7NFQR+A> zyhA~~h6`%GnLo9No}q~-OoCA{TP2AZ6o|-*kIbhN#1i-}b$%GX^sKpBF=UkE`iA-8 zL8#ih<|0_>%x%O#m5#YraOP&Tu_VHp6;EHd`Y7@)maFf@FFkYhJu&o4$<+@*)f2?k z-;IGP9amq)xtiIUP0iOcwb6=pZFIPX`SA^(^`hXthmzl@)HX6@g`5HTfd zpMt8rvvw&#OCPa+69ZN{-oAqKHihdTCPjUasuqh(5QG$O&v}WhM}QUlG_!&sxE;N< zx!C>M=Hb1z-)=Ri#|1`q_*;;1aLgo=8X0*W!D6hGGLPW;v~dlqQ6(`Dt1$~pe~{8z zt6Qy_4+mxNfNDRQ5}2>gf;q`jUk5czMm`7{&r(MUrCb94Z!&PYGjlm*W&uMzoFd9Q zf!d{6P~%M9ij`6_^_+ceSi{^uQ*T=Sc!3;pLY@yq&JkhPcf)c8sUm5^*Q5qA7-`uv z)#jX4YjlFe^9!B0Gk+;rzDmmaRto}m9o{D??m+~qHdCu~9tlR~7bd~4 zbsll2;4h719)PDPM(V-FDNxb_6Gx$0nF=QWBidz3ghCd9%0zVJQ?HZx^41fN#b74B zC=PjqEg*^fIFb;}ZgbuScPAj3Qf1-z&!n=9y}K-HhfiVgc`UN@3hg zc{;57l3~%!i-1SsI>C#&vxHkXX^INN=f#jT*>h?HS=|?~nV6iK#Y|9~3+@MDxe$yU zI44`yVLX9g7Q)|XzlY#RO$xQ?egnSuY5DR;*wt}&^(s(!_)L~B(}_MR-uvK!RE{+O z{uBc|n%68{8vJ*-d}HB_sD2AfGrL--+V;G-Ar-Uu?E2_Fr{>Ye!V$|WRGUW{$bKk3 z(`wEY?zwT#tvB2{S#W%R-kaRA>n0g|Gq7$5}=0)y!`1V(qeRqMDHK^=5$ z&d0hNTttGz`$s~C7*KRCfa2ke1(*@l&e&P?Myu&{&?B{) z?!+fzHIb*hRue-9r{}y^0pAjH?<_N8*rm~olJB_!L=v-s6LEPjfi}T(b$&98) zfx?vyEGasAfA5Zctu`bME6Ks*1-Nmh>^m*nf=$H}+fKSA(`16m&2?3ym@Sz@Vcp<& zPrb33%p`>`su#~pkGmm=yB%elM{K`!rYExTH)(0tyRmNh$P zL+&F)DhrUkVK*QI2rF8Jwg>66Ea8-=@2c}?<~+$#zORfENt*3lc zK1T3R>&n)ify(cIs=ZS=b!u%$@o=RMQ<-&oi&?H~YAud65^6iZQ)EtvW|jtqd35(F zMe5H{F4(}-Ql$P5eoBnor9HsmlZ0-$MCJ=nwRe$;Pm%g)3|Ph#sVM)$`7N@UezG7< zLt(L0)8NVG|Gy%WzGAk($AM$!$Gn zO~_s?V|fF9>6yD{K`S|@-Iqhv-nko_vAiw@s&veq;L1InbthauU0JI$i!AVLf#D?( zWrYdzPNoC$W<4rNaZJxB?*s++7zI+JAWxLL87rkslv}!|*`NlwYA3Iw$;Pm;aA0!a zAQpyQzxa26e!UzmXQ)f5^O6}+)~7TU-;%Gyv> z8f8nckGNE}BUY=?Ip(f}Kq__5CDWD?4uO&Pd{kn9G7hq`krEn%Ns{MOOcz=?p5%#w zps%#)MW3LV0IwlMyC->u8M=(K;cvm*N3)>BW%k`zDW%Nbj?y$vEQiGSh1G%-T{y1? zR`F{MQq;83mq)HnK+A$Ik7uC^VfBXzQHj^mn+ubmkyk)>W9 zhKjF|W|{XXz=SUI{yjdCWnS`>cbS*1e&$``y}4!2H4oe6cB2OQB4w-5X!_(ts9X!Y z>Gqfv88JO6DY6GjSdR)&F8xH~8&Szbuw-78w`Wz z*)TAM{DXJzCHjlZfmDYTgbt%AZjd8KuVRJ69qw&ot``sa^WT}n!k*uf!os4NXjeqe zFdBSQe*l$y$(=}K$(>V8T-}!hkfS!Py!#ajM2y^9u?sqQm%w+a^V_w~)oDDmal72c zaSOC!5_>~%aX(a*tlX4$%Myu{>|BDCZszWefy!v+A}2_o@M7*u8bv~A44s8yG$!Pz zo%S;V4BTsg8Yq`}9mvq=PBy~d%(~!qm@0j`6Tohceh4e2G{Q@`ZBADkg(EfJX}0}B zMA2{yJ8Lx|32)DW5iy^C6Ka^oj$}R~<|)nR2T0NGo|59xGe#-z1Zsbp1vTz5{V`Tb z$t*I62@K!ksjlI^BTa36J~b@zZm>+d-bjz~)+wTMl)Yg8mk`+~w1mZf*}WY1kdR)P zSZq`^+(Y6+nU6DLCE_9RSv$T)(R~8o42+4eSb};;KgB2FA(5xvJR|{n(U}P@A(^NX zR(%#u((;|T37#FWFu_t2nk{dF?NYS4GG^6EVYO0Ntt6_k<8wQfvkA5*Y(7BFfEjf* zI4kIE?TmwEx(w!v<*Kw6oz?tBP)yF0ZTq!)&0pZXu(6lEf*6>i>!_mUyfO>qDp2ji zVGV-BYCs~N<5>+hQ{rA_IAxe&+6juZ>_k_hs2-#QZjWB_=fIkRjSkMDc4t5LuBqVB-*$u3P%A#7KL zq7$EKYx0P%2R_?k9r{0 zGBH}1JG#k);=>M2;R=RpNMj`u_29-!e2t>J^o(v%4=h2W9WF@!i;? z(>pbbr=VND&CgB=gB{#~#EXOQ>Q&G7v%AH6x*C*lXHa?odT^ZY&eBhjhxR?#E9~G& zSNPDZ!-?xi4svijO#C}Ai{m7^*SkP!nv=DI^g5ks#6y| zTP2}W_l6|P?!*gnySHOAF;4s?8H9|?=|$Do9SQ5lc(~d}@N1Knu|xGDzT$kwBb$y zR{e;o>_h4tcb|ZNTzn=`l}t0F6nEiz2du5DvE8n5mp@yAx1`Y77-Ax9(kHIQGo*bY-202{O(x_Uk zmbIW=<$@$ru6x+L6>BnLTS2D2(O|b3v!bnI}`5rw&NB%!KsWiHD!eFBAy67%T%( zsI*%i+>pb{gd~mFM?a@7>@1b2TbR0!aR!2a$YQh~r5vN^T!6By(LXFi?=J!~v_$6| z(6)D;nBgm>1U<<#33r0je59+i^SuY;YmWvF4onpWrUv$FgY+9p(d zFMA8pCe&^zVJpuJDXQgGtimr+K3YD4E{9ff67(FX+B-oBR(eWUNJwRGsZK^Q?PGMo zm@)KVQIP=APRM0^T2@^opG+LGZfS#TH{(F zJ9(W?lcQ5}Ns<>4;rko8Dv zl%UCjTswpKM95sh7N~Mw0^cPP+gjTRs$>{;P+>RmTc|7oxLQ?C4K%3cCRCL)$x_lu zR=SRY1qW7f2~pGaNk~-nG;jk=l_`&MjEuPmRex1bb&!;h=z1(2UAtuM{z`trzD*@; z%B)>oV)0}lFtjOliKLb0Jn(anwDQU1!3J3$Fjg`B6rt%KBHgH@4zn^6RX>Pdd!G0{ z0IlSl_&y3%C2`G3)iIR_$ubLsElTJ|g!Xy9ejltocu>;rpxh5K(!%j`>IbR4FB-`y zk6>gyZk7y3(+Hb4b`+%cBJhP-qCw1@z$TW62>b&=#YBLWk^1;YBg|>j;h%<9a*DvS zP_=gvU{e9dFL7wClO|m<=Wd3pCqyJir+6N_=vHnQ^~v3oz%x23cMU?oD#6HMwg4C% zvbXY*H?I1PG@P!$7Ge#jS7~jl)=#L1%!bqD1aP>ac5C(=Mng5w`z^ zQ%F?Ra5B&|wc)g1P&HyW9Y{ylE{4CX_V zM8oN$Mwml|)n#Bk4z1)Aflou#-bJ8`;S|z&eT?B$xKFlL4Mgv9BFQ%dq4lM;C(}{c zcp}Ny^3(XAR2ru`kwo|T;!h-@gw11LUKiSzF>4d4BJ0B5)eTA&9(~|pO65x{&jMVm zud|48?557{>2oRebdH^6nhZ1|^0c|-SSe-N+}%41{!9t2_0kRS2a=W`rJ5vK`;O%o z7HW3A>J_HxiK@7qg+*a0lODy=Y{6Npg)r-TdV#!#jY)Q$F0z23cLIA5!gfIxI+4uD z^Pq-FJHl+h6Y7wjDHH0JrD&BU)N$eAD?{e-fwz$HRq6N|X%1R>4S+`z>UQH3NvI=F zr!JxHHn`l&z2)*>mp% zDcyUqnV8(WthbECHYqfmdpGpcj|3ne;XUsD2K?jVGf4nSBjaf7;{{_JVNkDA*cLcm zumY)VwvsLwd+yaRL*m9GNNpuMt3-Ma9H&k-7RdmjTYw*3q0c~(U5;a zGFkR(X)z+DC%g^{i{msM1J-z9wsx5Bo1zt9Uk==6Mi1;3HN=_lB2(hZym(6?#{bC( z%;&GuAs6Dk2orV0^jwI?G;r0}Pg*bRQE0_vXBgr}ABL*gy)ZHs(&j?Ei$E6*$KiWf zGfUyPZn+SDja4Z{wOok5(HhN1(9aQ&)w;4FY#``Yp=$30jm?D!38~~l=wuWcuxl;^ z4i=INagTJ_TfaxQm_PKfsX{8#7d0nd47VS-2~!1V&bQ$s(VWR_!D?v4axELSkn3W& zC1-O(b}2p)LzX=CV8}9zdbu0!^{}&+7?u^=lTH*UbKP2|cT`x}ZQ9-4ZQ7K5Cz`fw zXN=)6h3zT3D58@{_QRY+V{#)1f~>MsQ8aJ%I47(d{Qjxj?2(eb(S079QrD!KIdyrV zA;v=*Ww$T|ecem2nHURmB$OFq{;C@v^pDDJ0qrA9X3`r0|Mf=rjaxUafvToCTuYgs zOi?_NG9ODKp@rQupwWI<%q1klad#U2aq*d0%$rk+kCZLX`3Nd~JvJF@I7_D#1mDCy z@bm%Hjl_f&+vvG|lyl_SF7Z$-a+uKb7A!-0B|M>~1YOM8B*t|UK1o@`QV;k@3hKuU zm_ZHmiFfvlqhu~SjI8nIaw)PLZ@@Ns$YD`V^fA$GfO`5E8y-WqJ7EN zc%M-=G?ci(_$XFNX)wNw7%^gZF?g%&Hea!7!`BZ}l@)URzq7zjawr~$8YUT**nv1^ zVuvb6I^|dn1$PCweQvBo!p}Tb5nm%s4#m@e3C*GSHa?NiGkNME^vpu9`Hl_tf~#Sh zWZ7?)YmKUXG<$5h)IGK=chExs884dVAPjK+jlsGsS4roI$|f7!Waa+nU_736S-v6-0Y?%F7?Y0ylK^Dcp6 z)QeRjyy0u~Ot6T6`+OtZ#;ESOP}QWpw5aZSQe1_1r6RoyBL(zPQG%;w`ISKAmH83b zP9aNkbj=OsUQ9>VuwIn#!s1J}a;)%CV6)fUPmW`2X!pqqK9*bN;*l79tRRav+#kTW z??()N6sdFE_23^DpGgdUOdhUMpq&pXFn?ZTdMBEpA_v+hcQqSuC#zq8!+_ZtFL(>P z6{f7fG*N>fJOuwWDdZAvF$$kR)k0>uwA6k;=ci``Ae z(c3IsZSd`u#|Mi1O3>=9S!l%#$G2c5qv1FbET3-I>yToJ`AVI)b@(n+ev0%+FoIvo zHQ%0#e3tT_c7P}qijZ)$xiB#ShpfO8rV_PmSQ+u`hL1ladBa1Z=V}d*x=O7Y9=I|P zjKM7paC~CD4E39hS*b^=*m;OZRq}tFi8vp`(i_|lz&|9$zF66qi?8K*Urj>l%LP%N z$1Yf`3-FZG;uo~e)qqu6*YUFiGqtWfnhe3NuRzu8t|L)Y(&9*L2F#~ppfb9DA%hle zmPn-Y2d4bN!gn5go4g$)rp(sNA}Pk6-ki|*@yjI}+{a>Yl{tWp&wHT^h~e*%qVD_P zA9d_WgX=nBBovCEmB|>x!;s;9ZLU36pawGL^F4*XT?~>?TtaYv;l6G_z z2xe+snYV_~Rf4L07+r`JkXpHA_`DdXjH4@LkTSY-{=|*0m@?y;gi(l=-cnjEO~R%9ECGV|^7LK1$%C<$qmSpcn=d|ZPv`)#P&yE5yt z;P?oEFS_7}@8xljeZlchu?03ws0)rC(b`tWSV&p(g5!q?;A&M_PZVO}*fFTu?Q#;P~})bnUV(^40u={fs z1xKCYssU)UiQjA-OFHv$!SSIk<3=(Z(F*Ic;h18B_?%HTG?aMU$i+%24aS|~+)eOH z>{*Cp!A)0I#nECv4G1T~>XRX;*oT&cdGtUQyvbtaFGCHJ{7bAv`eb6IDuX)J*ulzLdFL~lJZ*TeYux=2X%JoW}kkK{E)zKn!T8w@Wy5LJ8 zdf9iT2-3KJht0&ST}l^$;2iBX5YK@pN;Sv*D${WRZU7wTNV3O zisF$~u~-rbjpu$08tuob*q4zE$K9cgps4VftctDG1wvXG;|zm&`V&~U>lT!6`7NvA z!O;@7v>G;3I||#NS%g)}u3_tAR)K1%8Hls8N47JChhgCYg-LJTsWpz4t+wBU>vPMv z1b@%PUa3aVw`-rL0i^ooX|3e5p%v4BGWhks09CVF$wb_x zwH4#h^=HIDXS8^cOC(JH>VCNw%sNp59baeGb` zQOyG6#`63he}lCm1t|x;rdE> z^O#VNUD}BZW*0G|gP8*^q^oYERoda~Kr1VAF;pNRWOo=%`*lR6klY+pD{$ql)mk8@aIt|aqN3qhnYG4z+xN&(VVKjSo|)Ol z7KJEWk2FYJNz$f$l8$*=jb32KwG4w3o{jnXETrOQ$3Co-((GvRF;BB8N(A`MgTFNnIf3ttAp-e?WPr~xgn-Xd z3`2)TD4uu^7S0|Zn5mPYHgdSZjN*{eio2Z@?Tf+u4voNOP+0;|2P>tN+)|MEMk7-`uv)#jX4YjlFe^9!B0 z8^bVO+Ht;0%KCVHyx$SMy8Fil1|D&z;4huP55UtNT%P|f%n8Q{2LZ~Zh@=D}eo$0R zxH2Cib|KEZW||0Qy`Z(1EMGFp?suVDT9i}3lZF`G)!0`E(ULKc)_0{of4~qMk3a+ zoJ~+?^8peu8g(`}E2x}1p&5z6wLEocc(^s_zRnwy6o%UjJRp0a7f(p@K5v<0RV3Ic3$Y8-+BqwHt9Rfk_I zeOQs31_I+(0A&zhZoxdXb_SYhG<{q8_(-tQvnxKVx|NU4!0iT|M}jfj>NF46^v%r? zS=bY7pl|HDP2QBzN-vW`h5#Apk5#~X$;pcquuH1hf-P9~VH?P~I2d)TdiZlNSYscB zWC*~{Z+pDZU@%y1Y5t-tU{?yFw*vC zCa#?DYVdrX`mt=cTFqA30Ry>iw}1l(Y6T|SRh05lD}$t!POwq?qBY?j!vQl!+Z8bI z+UKbsw93J1!~qs$JqJis2b?;=%DUBQv5LDl7|J#RynQKJI4 zcmo}VV1Uj5nn00Sl?#M36pZ0IY+1Yt7S}-BR#xGH%yKA_Kv?nu)oiO_)v>`<J*AWp0tPEvq*LV_>P5VU*Y~N@2ezbg}~9Ov5c7WgHs8*^ckedy`wXz-y1M-ZWdYFrv=H zk^}%K35hy$z#bpiu?*f%ynO3rK+mz(Ohs!R--zaafj5tb+o8xFvRkE^4fl;;AD|Gn zIR0E6Iveq=X&6OS-|5`EEZ7J#Iadw`XNUkCo{JK4ELiO=G<-NVz^TnTb@(6TcWE7W z69y~1ISU5by=@rP9uR6B`AvV8>&=SANV^f8W~&11qvH*zOh^c|54Go^i!p%CulYcK zss@gM^fW8A#tg^+(+jYrz2bZAX{}go4rRCAwCG@5N>mbv%-pnHg%P{}5I8p2x5t7r zD^TiC*#^_NUbd=L)Vl=gHP|w8+_UR5RHq#ame`HM9XOjfSVpx83}28$+{z1M15&Ao z)lB4O4FCm_<%7C~HmddvYV%;N^0on+Qpsy*Z6^FNgetX4-VftT`doCUV2rzWGW2E@8wsRrOGPKNaz`iw3~2p21}^zJm6jmDMap-_-FAF_%n=u zp20sa;Gdr^g+Bv>@MqsJ{J9(d9A5^1p2R=yDEw*SpRX;4KTqMGZ=i4VH2#@c1%D3V zpJ&&=pBM2D;m|NL42@IwOF$WJ4>DJX6O|N5Mb}^MovzHP%|KLEgHhB)lqgZ%?TFYF z_-7LCWOA>?KX}K4ix*LlvvXZMV3+LRcX69P$y#zTwTZ--T?|AM0Vc+)i)NsaP*@-p zq5R$nRR;A020}SKr8tGSrQ4ov2P!Y@n9kff?;gy)E_yOi`HDE6p}eyLEK-YPom1&3J?5@0C9=;}ub$P8(skf`B$Y*gb9<8DQ L!sco!bEW?evMYqj literal 0 HcmV?d00001 diff --git a/main/imspy/.doctrees/imspy.algorithm.ionization.doctree b/main/imspy/.doctrees/imspy.algorithm.ionization.doctree new file mode 100644 index 0000000000000000000000000000000000000000..a6f9b15b64533b215537c9f17104905e40cb5d0d GIT binary patch literal 80726 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 literal 0 HcmV?d00001 diff --git a/main/imspy/.doctrees/imspy.algorithm.pretrained.doctree b/main/imspy/.doctrees/imspy.algorithm.pretrained.doctree new file mode 100644 index 0000000000000000000000000000000000000000..ee3344d3254ae63dfe21df01bf22c7cd1070b4a0 GIT binary patch literal 3191 zcma)8TWcIQ6pk;u_WH86bEA+rbz0ImG`pLJK9m&t(nn)MLMQ|hgmy-|64s2Sy4dT7 zK>HAgL2priSN~E!&285X4lyhq9UUE=%XdDVzdQfRty|@v-!TOj`D{qjG*>Az!LO$( zaT&{P_#B@76F!7P-_!KmD5nz^{4HoCT*y?jJiHISAJwgpW>}wJGc2(}!~Z|i!r>_Y!Y>xU$b-?w*uec5BL^;$XEEje?8(VV<~7Aa`|m+2V6 zQ8TI>9NnCtp*9HY(b2LS^UbPO^JMQf0>5*tQYYC#qH>E=m@1$5zm(TGgTpT>hfnyU zm=^v$a={;?2tVTY1iz>FJwu%Q=Q6%QrOuzjnGT$}DX1I?V+tkQuUHwH_Td*PeCYqEkjIniNG}Y z?w?dT6uYIEu5z|;Hk|OC6W^OM^ar&{2P{&GZnQKju-Mc}S-8q3Vix?;DEQ6F1%i7| zp|DXeot9W_Ta}R5mvI-abRx(ug11q~QkKS0AX!;>2%hRw!+WWM>TNT=pBB%68fDdu%37g76iy=k-M2?&hmM1EOR`5M%Cxc%HM&SG5)lI^*R+?~{ zr;?$!y3y6d2ES8fe!)tov=aROwVi7w_@(bxM&}MRM;~6@xOUR-#sC03!;v3}fP&wa zG@m-KJ<^?Gy^QC@-_a~lIwdJ982BVlB0-$^F8XtV7?BQ1$hG8g$}0jzDO zE-OfjM`X1W2#}%9sf-49N=b?ISo*oBFwCWj%(954T{bI}VPx@S36aE-Ghsx9*Bz1y zL&q`(QhT}9^a*-y3&DW#^Rnq+bh}m~6Cq3X^Y`NyE-_4(jmh$8Ek(UI@eZR-)$(Y` z@5N>VZ1O2kC`Bf0INp8g`vofqT7;oRlQLmjQ8K3RJ@$qFj$2!pm!lEHW>{QUuJWPM zQ?%2)s98DyO=4Mw@>rB(9rD4G7r!8%eLYF8nU9jW`JWo|=v*4{ddl=rFgq#l02_?B z%_J`CSvp1wrIv@Ib-xclW~A-RHUMJ4kt|&LU2~CJIwM?6xx^3PU6m^0e#>MOUG|ql zOB*EWPPwj@M5=_=sohUFg+C~K)ojRenL?aCbp@`7(@Z&{)EsaL^r%GS6JVewh1-!O zj2mB56IsNrRJ7{EI8&SkKqecr6zzKf4>)5Mcic;$bxK%9g(R4}BI%Z1@70qNuqr1N zpDh#IILWg5CuZ@wy81h9#EjDFZcOF4==qK$gWc20BmUB=P}NcSTxFD-grl zq+N6)pJLE~d@TyA??e8MzvXZEE9ZMrYA*`787F~vm;BA8H7`(dSQ+!$e!;EzHtusS^XUPNM(HC=HOCjg@S{U8>%_ zCTz8PS1k6LTgyYYuh_@Kp=|&Y+`De8-og6~I!u&{WQWHxQBndnhykzR+8?$2GphPA wyhdwdSO!U8yfr{`bz#ejSHzpGxCG>;$P?+(*Z|Xr#f>x)cg=BeG;!nM|7EW1xBvhE literal 0 HcmV?d00001 diff --git a/main/imspy/.doctrees/imspy.algorithm.rt.doctree b/main/imspy/.doctrees/imspy.algorithm.rt.doctree new file mode 100644 index 0000000000000000000000000000000000000000..3599a641869295c7b5edc18e75e1bbd681beec30 GIT binary patch literal 74693 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 NG|q}4iEDHD9|0#q&)NV0 literal 0 HcmV?d00001 diff --git a/main/imspy/.doctrees/imspy.chemistry.doctree b/main/imspy/.doctrees/imspy.chemistry.doctree new file mode 100644 index 0000000000000000000000000000000000000000..cbef8cd56d514fa4bb10d887cdc1047ecc31ec33 GIT binary patch literal 46529 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 literal 0 HcmV?d00001 diff --git a/main/imspy/.doctrees/imspy.data.doctree b/main/imspy/.doctrees/imspy.data.doctree new file mode 100644 index 0000000000000000000000000000000000000000..16e10209e7c32f1a084a818f7d97fadbc52f6b25 GIT binary patch literal 356670 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 w2)E-DU@MIJbX8$n4YC@oV3LE_Y0r6Pn0ssI2 literal 0 HcmV?d00001 diff --git a/main/imspy/.doctrees/imspy.doctree b/main/imspy/.doctrees/imspy.doctree new file mode 100644 index 0000000000000000000000000000000000000000..bb53d7aee661c364bd2c658d377f23daa69bbde9 GIT binary patch literal 3512 zcmc&%TW=&a7M_`;yVJR6V4{_nK%o^7#H5=Cq}^q;4`_Ko0}+cxXm=%4xU1Z4D^+%l zFG=TNq~QT+BKZyTGx&A;2l#APRd*r=@wOwirhI&CpUZc?bMkWV^Dle%;y-tw8^*VqQmHlNXDFyQX?k3Ly6YzW>r zo*lVy-W$v|+_1It+-+7|P=9V`#BCE}6rWiG|AIdoywt(=QBe`CA;kAUkUD*Bm9|+e zW-v_AdC;+LWXK|Hd3M0wV!P}y+h8Z|A5$i4I#pH(s-{;`UEo_AIM)9kot(l@JxvBq zqhz8qe0clm13QD$V>m??iZpCJKtDWVH2XfPf1foeOj)DkB}ck4BW0ztxm4M|pJe}e zk`Ym6|D9yd7}ro<(2NVCWNC|_i;HT)MOH&l(WtxNm)Id9lb2Loa(b1?dB%;-w4Eh2 zJ&8#xvmTY)#JPE0stxQNTT7~eGJ$FZ>;b&carx?%< z5pgrSy-C(#vfahGjXT_1-QF_GSzA$_^w+kGwAxrhUbu2&En+C#*F&`@Blg6-X%rE< ziZ0}+-i4w%k(R6)rr8l8E$>`jx2B)Rr<|)&Wh2blFHv^YxPv zB8AB>x#kJ42YJagnN`7&*2+;=C#bnyIDGLu;hRARSwfpS}0-Cy3|1niqGj50cgO?|0Xua!J7J1yvJH z%{;yVHkdL~S9ok}$P6V^8s?vFxf1}g&il&j8+NY2deq;zLwzj_S>}u{ScMZ5i@1y-whBD5Q~LB(Yl7~NK)64Wk`h;GPH8zwhIEhwl7!{QN)0&8K9t{a#cCZLx$Y>HdN)9SDu4k#pvR5=*~))Hu7332 vpkOh=qxA8Yga$^_gFV;X67Tfl2(uk7iprJ&){B6!?K04D%UogLu(Qdp2i{sN literal 0 HcmV?d00001 diff --git a/main/imspy/.doctrees/imspy.simulation.doctree b/main/imspy/.doctrees/imspy.simulation.doctree new file mode 100644 index 0000000000000000000000000000000000000000..83aca96afe3273e59067390400eaf95110bfd111 GIT binary patch literal 549416 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 literal 0 HcmV?d00001 diff --git a/main/imspy/.doctrees/imspy.simulation.timsim.jobs.doctree b/main/imspy/.doctrees/imspy.simulation.timsim.jobs.doctree new file mode 100644 index 0000000000000000000000000000000000000000..d8a9c6269652aa6f6ba53ee34eb1c613d2416a50 GIT binary patch literal 202950 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 Gp86LFRep^C literal 0 HcmV?d00001 diff --git a/main/imspy/.doctrees/imspy.timstof.dbsearch.doctree b/main/imspy/.doctrees/imspy.timstof.dbsearch.doctree new file mode 100644 index 0000000000000000000000000000000000000000..580ceb89a52bd03c91cc2cf07bc730503df87d06 GIT binary patch literal 116542 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 fhL6dFJy!7pn(8da>h1bStB=|*Y*h!_^~RWN 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 G=l=qt4bpl5 literal 0 HcmV?d00001 diff --git a/main/imspy/.doctrees/imspy.utility.doctree b/main/imspy/.doctrees/imspy.utility.doctree new file mode 100644 index 0000000000000000000000000000000000000000..f5bbfa409f4a36f1a797ddd5298b43509b69060f GIT binary patch literal 65261 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 literal 0 HcmV?d00001 diff --git a/main/imspy/.doctrees/imspy.vis.doctree b/main/imspy/.doctrees/imspy.vis.doctree new file mode 100644 index 0000000000000000000000000000000000000000..9f906800a931189b7e8d9064bc84ba7716a78c35 GIT binary patch literal 3545 zcmb7HTW=IM6ix`c$>ttzs>G$KDoRk74%+Re;(>I>OC zAX*_15f(4Fzo!48zp0C6$TISz-J;fAcT@%+*R2snEM6O%Cap`JfElvya#$IPoEsmp*#dEh+pk zp6|FGX&vWFu3P(i;Lc{EVE(`ksavJSC^57KafY~-M5;p!%SlGHh7jMKg68pSCAH;r zF@$r9je?GK%Z84_mgigiGGFIc_!7VBejIR_vw^Zj!PMYLszZEhg8wGcZ067lk{ zkk_yAyN=%t{B9x^{%sXQKdSRv@Srn$z^&@(jkGyFC!I02I!#Dp>=WT!o`zpaQJ5r? zHrNde8LIO!iQ$AFr*Jg!nCY!6;hjj0R>TrIKUCbR?mUk%nge!Gc?DbXba| z4Jlf5n~7C{;z&zq>y0E5n_JP$7*UMD-8(HAk5q-8)VuDlG_!c9md(4;n$jA7z_$)u zZ_Gee)JWyANGYh%(7eQAO-X6sDjSK3cZ&n>)}jjp_Z~uFwO(44VYOjoLIO#KUAWQ- z06F&V+z4h0Y1qu>Yqt@aL}7C>8A+A<*KSh-P9;fX9$Jrv!OKy?GFC~*kuaPzM2-9E z12uCWxOK%!sSL^3Q-*Y&ajTqW?Xu%`*hCQY-q>0Zu5w$0$GHHVl;=O zhv!IG2r2j{3gnEiB9SSyyz5yr>VMzY0^e6oZxW`IRD{za%^2#U8(d9{cUv*@Ggdm4 z74NRj?aZ0r|G3R)bm~BJ^vdatxsz@?1OVV^j{IZ@$h(b<7GsM}i*%=0pFt;g=M_t& zN=eE}1}-R)P}~Qui|QL8Mx;Ze4H|gYZBlC_nTp&Q0jzDLHZMtwM`X1UfY_NTXci1^ zRgwzn;pwNMQZt)MGRXs)w%MeVnvvO)6+{w4K+GcIb&I4z(_t0@sl8lo>I5~nj$qJ! zi>l~gbfZ=yBN5ssn*F8lg-bM3RbjFsSWEHVYZ!U(PI38Q(d~p{18j;hP?(8a82@nl zhTAMzNl+pTC7M(TTMv>Uh3}y*+!x%KQr{U2AlCckvEj1Vmuif1x)?Mo2cSs|%kex0 z&#?k||N8Ckkk3suO6JT5$<+Kejd@fq4R}3dYF{ujs_p7DYb5G?wT?@Y$%NLa zy_#?efAH|J*pTHag*bg^OI#5K$7&j^Ip757k%=fqz(7q3=K@P${FqY{dBAQaX{^LB z;2omVuzbi;lWEl*;pz}10h0j2Br=)Rogc#OF?V=m_6jLYU%Rv~w z_xM}>hTr3N`D6YYf5l%|*9*JmxP-f5bbEWk@15|+C;ZikK(LguwWu>;5hWiL}nS#f*8;Qm+#f` zcX-5?{%2G){$K$&;7<$<5XTE!GCU<-YsD1~*F=$IHVwER2MDgFfv;<73loVQ?*9io Cf@LcJ literal 0 HcmV?d00001 diff --git a/main/imspy/.doctrees/index.doctree b/main/imspy/.doctrees/index.doctree new file mode 100644 index 0000000000000000000000000000000000000000..ab2f37057019e0afc38da8cc64b8688b1091a371 GIT binary patch literal 5154 zcmb7I+lypJ8K2#m?w+3O_Ut8wWJoWX-QFZU9nps{AR6)%hMflq`m~&>KBv0t%$!@Q z>df>!2niU;NIeKSJ_vz8z`sBQ6%kZWpY=Zw{{j&~@WJ0#bx!x`PNsKUws%i`_0?D3 z{Zbz^e)___75m5Rs!W8*`N-n5CvkMBGDZTgXOb%}&v}uXmS$r*QHTxkK&+a!S4mW0)vR>%t$|2mK9G5m za5=b0Z_9rM*i%)fu|voGK}HTNLx*To~TDjpw; zC&&4ai5H+>@gj`&5`O#my@KDvXGJbv6$7BZ;m}1-JULpkg0x{OHkK?Cb$-9`o(NSJ zf3@K7h%o79Y|Ojq$O2BR2q*Ir99Ri@qGR@#9xi6gzg=e@dfT;n^I&fd_ko#f8f=x9 zR(fh!9%{sn>cp07;$3LsZAjlSyNfbh!yI3#*>8)-R-?^I!=U{g7p1U$`<*n=hz507 z@m_<>?(=WXe|6t_?Y=e=KpJOho&+_uIiD0Oh>_ISlGjyQ?p^0H;(=*c??<45dl}mB zJT|R34e|(!9~I1Og^3^K0jF$1F)Dt@%zDfw0nfBRtRTi&X5++cJta4KS{^oQ<0u^# zSEeb#AVAW(GTSAsDPTRx;~_jDD2`UlhV>1VCebBuH<0^gOxb01k@zt=`*~>+$_Q#P zGT>-V8~qD7e#T|N7K7#eO0|v-f@|girhDO{xv$f{b;G{uS1HFPQP3*`&^#=0mqb3R zN9k+0cy%F4U$1=`eRwkFiFK|M$L%y)#BVM4D`qR>kSrN{ z6X4efln8Cp3=^A>YgfCo9kX6huce2-TrY3Wtl3MctRmQM0uu9%AJMyn`vRCFEdoGRU&OR@h_ibQRs&n{!H5!OeV$0_MB#N%u#Y? zf{;)DzVzw4VB>eo*dXL8M-cLFo`?La8s%S-qF~`)PkpR38RGuSP4+KqvOiS#!ma=CH-qa}KA2sIdrnm>~{(IT|byE=XKc9zO znSzkNXo_tYJ&H5wi^bSEeFUNAZ7~B)%`pRY&>LAoGkcsK5Q%GBir&pka{4-`EEDuP ztGxC9TBQ=8Zj<}s!D;U~4Ajj+_+PsLeq|ZpSC*O8geu=xsoXSOdMwPX*KGIoi&}`; zWI9(-_7GW=#`{R){W6WuYDl$PPx4EP1~T+A*2<1p^vpdiS)w9aw7g8FV|3N7NpI*> zv&dE662}(eoK$zq?D)B)7T+sr9hWd@`?`ofHVZ zOgq=3{#$(&;``9MW zBD6dRe#qvd%IrGL*QhismBQ>V>@1Kt{RzeEj-xx{p*sEY{KmpzbBAPr?kg`Rs<>A_X}!eP-g&4( z=d!zA5Gv}%AV|q&s|po_-4=ww*c)G5U$8cOILajAye+iiAN&mBHJ=JB5b%iqJY!hl2sY>L9z+B25lb zIYva?Crrx#Fg-MIFpsuFH_!U7zWGh)b4QN+1@Z)$k$+T?NANOo*)uK=Las;l4kUzu z&~b#z+DLbZqJZXwb+ZqjjJ;`aQkP^$LC?+oSLTkoOf;K#A{>hdKRcMGU3}JCmPWdT*I+QCY;N}Epzd`A zU{D)P7u34a!wldp0=n;>_)L6y>LboiPpC$kHtkU-Ys-ZA?8EzpdiYelVe!Q0 zx!JB;(bC;Uv+GI??s5pf@E6n?KgG~vUw%+bTJMzbPoTAriti#U@S1`E!&8=mC%6lz f8D$Q!P{% literal 0 HcmV?d00001 diff --git a/main/imspy/.doctrees/modules.doctree b/main/imspy/.doctrees/modules.doctree new file mode 100644 index 0000000000000000000000000000000000000000..0a2d2cd670e084ff7a305a34afb01434df7e5c33 GIT binary patch literal 3290 zcmb7G%WfMt6m@LtWy_ZBBu0V6se>YogTzu7MIYI8(WMaqZG-HB2{l8BtU1Fe$%*Af zfOe6>Mz{<6Fa3-DQV)kSBUwNS)PUgO<>h^zd&u8gfBn;6EC1|3=Zt6bAxV-U>Aj*l?LO$61TD zS?9GoVLjV2+z7g~Wp{Y0^ULEGGARVydqwDNzNB*>!0PsU7b0rs1pbX<`?eP~0kaL; zuHqcqO~Etj#>Ir#En%|0V_mCEuDU!405`FWM(c?Fzi8seN;vqA79LvlQp6O$Q&8ZYZUhr&otcyuy`FUB( z6LyGVLd8|3L)@bf_n19Eb>MYSHYGxq6h%do>&CN|?Nok4V-9Vr3}eaI_shlz`yBOU z57EOf@Oy;cWBi_=cI+wp*87IXL;Ljqr16Qs>3{k88>bhC?sm!z+%QTlomMo&5Cpa z@FebR&2E)&(lQg5(A@%eEGpw+@TzJ}8?E^T<9VZx0AuLF=>^6hr^=C482wbYG}r-# z7f`5*b6R(W)Htk(WU;XX%q>{l2skc5gJHZG)p7_8#jt1gj!`7jp*K;kE!)-97)&%6dB369slwD#z}L245mBI%^{Cpm zEKFV)H)eye?ae5th#0AWmmcs$wIOMa#kP{tAXETh?(D6Rv)dtr2!79@uvIM!B|O&9 zjmT4=-$f`b-^xp852i4aNkf-5uk4Peen26bPo+xTmE8rjc^+Zv{Dq=n@LrHmK}$(= zfr*G}8iv2>K*h^r+gCJ~%0z;`r6}jR-C{&E%a+}zbB-z+VhUX=wQMV)lVS#UyB9=d zs3J5JB`G95v@E7RB_AKpP_qc6ClhEn+bhiU^t)5d@qPd1W<-^eDqJMEFFiC_D9> zVCMQr2A69V2oaE})S{Z&?4kdH6HS$;Ff_(nOVICakWsTdyJh$NumLvN3@8*l<;K0( zdu(@enlG+HpG@CNCIqqjxv-xxV{-j`G=f+U^Gm~IHk4|Hak}d@%K)Gm8JeO!2JPrV ze){OEuTjrkHH}xyd&$E5m$i9+6L`FyQ#It&OiLeNgAp^SfU}+<6O2&eIlF6*0LV0I zCbPNEBaKG`1sCt>OFSCp5#uu^@B?@^h4i@Z>y%*1ek(B28il%DuER1CGA7~Hutzb& z3nfP5!?2;sWeIWmyvX6gKL^8eB5(jM3rKi21qLcoIPfficgl(yPd#>pBw-T$^X=RL zGPqb0jPE5PV3Zp8xEn+3JfbP#BErMflWrOHe)aSOR>d?B+O^%F*<1e%wB0}@m|Y-| zX9>q_n8*+{qo5`{0rwFUkY#X<0yVfRJ(b&o8`AJFgc#PQ&7$r36mLq%J6;&R*#~x| zZO;qLWsV5nIriaNvxoS9#roRrEcdEBy%TeE+`EUxAn_wv>xD3vB|#6tqqpfqil+Ug z>YWu~qusk .section { + text-align: left; +} + +div.footer { + width: 940px; + margin: 20px auto 30px auto; + font-size: 14px; + color: #888; + text-align: right; +} + +div.footer a { + color: #888; +} + +p.caption { + font-family: inherit; + font-size: inherit; +} + + +div.relations { + display: none; +} + + +div.sphinxsidebar { + max-height: 100%; + overflow-y: auto; +} + +div.sphinxsidebar a { + color: #444; + text-decoration: none; + border-bottom: 1px dotted #999; +} + +div.sphinxsidebar a:hover { + border-bottom: 1px solid #999; +} + +div.sphinxsidebarwrapper { + padding: 18px 10px; +} + +div.sphinxsidebarwrapper p.logo { + padding: 0; + margin: -10px 0 0 0px; + text-align: center; +} + +div.sphinxsidebarwrapper h1.logo { + margin-top: -10px; + text-align: center; + margin-bottom: 5px; + text-align: left; +} + +div.sphinxsidebarwrapper h1.logo-name { + margin-top: 0px; +} + +div.sphinxsidebarwrapper p.blurb { + margin-top: 0; + font-style: normal; +} + +div.sphinxsidebar h3, +div.sphinxsidebar h4 { + font-family: Georgia, serif; + color: #444; + font-size: 24px; + font-weight: normal; + margin: 0 0 5px 0; + padding: 0; +} + +div.sphinxsidebar h4 { + font-size: 20px; +} + +div.sphinxsidebar h3 a { + color: #444; +} + +div.sphinxsidebar p.logo a, +div.sphinxsidebar h3 a, +div.sphinxsidebar p.logo a:hover, +div.sphinxsidebar h3 a:hover { + border: none; +} + +div.sphinxsidebar p { + color: #555; + margin: 10px 0; +} + +div.sphinxsidebar ul { + margin: 10px 0; + padding: 0; + color: #000; +} + +div.sphinxsidebar ul li.toctree-l1 > a { + font-size: 120%; +} + +div.sphinxsidebar ul li.toctree-l2 > a { + font-size: 110%; +} + +div.sphinxsidebar input { + border: 1px solid #CCC; + font-family: Georgia, serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox { + margin: 1em 0; +} + +div.sphinxsidebar .search > div { + display: table-cell; +} + +div.sphinxsidebar hr { + border: none; + height: 1px; + color: #AAA; + background: #AAA; + + text-align: left; + margin-left: 0; + width: 50%; +} + +div.sphinxsidebar .badge { + border-bottom: none; +} + +div.sphinxsidebar .badge:hover { + border-bottom: none; +} + +/* To address an issue with donation coming after search */ +div.sphinxsidebar h3.donation { + margin-top: 10px; +} + +/* -- body styles ----------------------------------------------------------- */ + +a { + color: #004B6B; + text-decoration: underline; +} + +a:hover { + color: #6D4100; + text-decoration: underline; +} + +div.body h1, +div.body h2, +div.body h3, +div.body h4, +div.body h5, +div.body h6 { + font-family: Georgia, serif; + font-weight: normal; + margin: 30px 0px 10px 0px; + padding: 0; +} + +div.body h1 { margin-top: 0; padding-top: 0; font-size: 240%; } +div.body h2 { font-size: 180%; } +div.body h3 { font-size: 150%; } +div.body h4 { font-size: 130%; } +div.body h5 { font-size: 100%; } +div.body h6 { font-size: 100%; } + +a.headerlink { + color: #DDD; + padding: 0 4px; + text-decoration: none; +} + +a.headerlink:hover { + color: #444; + background: #EAEAEA; +} + +div.body p, div.body dd, div.body li { + line-height: 1.4em; +} + +div.admonition { + margin: 20px 0px; + padding: 10px 30px; + background-color: #EEE; + border: 1px solid #CCC; +} + +div.admonition tt.xref, div.admonition code.xref, div.admonition a tt { + background-color: #FBFBFB; + border-bottom: 1px solid #fafafa; +} + +div.admonition p.admonition-title { + font-family: Georgia, serif; + font-weight: normal; + font-size: 24px; + margin: 0 0 10px 0; + padding: 0; + line-height: 1; +} + +div.admonition p.last { + margin-bottom: 0; +} + +dt:target, .highlight { + background: #FAF3E8; +} + +div.warning { + background-color: #FCC; + border: 1px solid #FAA; +} + +div.danger { + background-color: #FCC; + border: 1px solid #FAA; + -moz-box-shadow: 2px 2px 4px #D52C2C; + -webkit-box-shadow: 2px 2px 4px #D52C2C; + box-shadow: 2px 2px 4px #D52C2C; +} + +div.error { + background-color: #FCC; + border: 1px solid #FAA; + -moz-box-shadow: 2px 2px 4px #D52C2C; + -webkit-box-shadow: 2px 2px 4px #D52C2C; + box-shadow: 2px 2px 4px #D52C2C; +} + +div.caution { + background-color: #FCC; + border: 1px solid #FAA; +} + +div.attention { + background-color: #FCC; + border: 1px solid #FAA; +} + +div.important { + background-color: #EEE; + border: 1px solid #CCC; +} + +div.note { + background-color: #EEE; + border: 1px solid #CCC; +} + +div.tip { + background-color: #EEE; + border: 1px solid #CCC; +} + +div.hint { + background-color: #EEE; + border: 1px solid #CCC; +} + +div.seealso { + background-color: #EEE; + border: 1px solid #CCC; +} + +div.topic { + background-color: #EEE; +} + +p.admonition-title { + display: inline; +} + +p.admonition-title:after { + content: ":"; +} + +pre, tt, code { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; + font-size: 0.9em; +} + +.hll { + background-color: #FFC; + margin: 0 -12px; + padding: 0 12px; + display: block; +} + +img.screenshot { +} + +tt.descname, tt.descclassname, code.descname, code.descclassname { + font-size: 0.95em; +} + +tt.descname, code.descname { + padding-right: 0.08em; +} + +img.screenshot { + -moz-box-shadow: 2px 2px 4px #EEE; + -webkit-box-shadow: 2px 2px 4px #EEE; + box-shadow: 2px 2px 4px #EEE; +} + +table.docutils { + border: 1px solid #888; + -moz-box-shadow: 2px 2px 4px #EEE; + -webkit-box-shadow: 2px 2px 4px #EEE; + box-shadow: 2px 2px 4px #EEE; +} + +table.docutils td, table.docutils th { + border: 1px solid #888; + padding: 0.25em 0.7em; +} + +table.field-list, table.footnote { + border: none; + -moz-box-shadow: none; + -webkit-box-shadow: none; + box-shadow: none; +} + +table.footnote { + margin: 15px 0; + width: 100%; + border: 1px solid #EEE; + background: #FDFDFD; + font-size: 0.9em; +} + +table.footnote + table.footnote { + margin-top: -15px; + border-top: none; +} + +table.field-list th { + padding: 0 0.8em 0 0; +} + +table.field-list td { + padding: 0; +} + +table.field-list p { + margin-bottom: 0.8em; +} + +/* Cloned from + * https://github.com/sphinx-doc/sphinx/commit/ef60dbfce09286b20b7385333d63a60321784e68 + */ +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +table.footnote td.label { + width: .1px; + padding: 0.3em 0 0.3em 0.5em; +} + +table.footnote td { + padding: 0.3em 0.5em; +} + +dl { + margin-left: 0; + margin-right: 0; + margin-top: 0; + padding: 0; +} + +dl dd { + margin-left: 30px; +} + +blockquote { + margin: 0 0 0 30px; + padding: 0; +} + +ul, ol { + /* Matches the 30px from the narrow-screen "li > ul" selector below */ + margin: 10px 0 10px 30px; + padding: 0; +} + +pre { + background: unset; + padding: 7px 30px; + margin: 15px 0px; + line-height: 1.3em; +} + +div.viewcode-block:target { + background: #ffd; +} + +dl pre, blockquote pre, li pre { + margin-left: 0; + padding-left: 30px; +} + +tt, code { + background-color: #ecf0f3; + color: #222; + /* padding: 1px 2px; */ +} + +tt.xref, code.xref, a tt { + background-color: #FBFBFB; + border-bottom: 1px solid #fff; +} + +a.reference { + text-decoration: none; + border-bottom: 1px dotted #004B6B; +} + +a.reference:hover { + border-bottom: 1px solid #6D4100; +} + +/* Don't put an underline on images */ +a.image-reference, a.image-reference:hover { + border-bottom: none; +} + +a.footnote-reference { + text-decoration: none; + font-size: 0.7em; + vertical-align: top; + border-bottom: 1px dotted #004B6B; +} + +a.footnote-reference:hover { + border-bottom: 1px solid #6D4100; +} + +a:hover tt, a:hover code { + background: #EEE; +} + +@media screen and (max-width: 940px) { + + body { + margin: 0; + padding: 20px 30px; + } + + div.documentwrapper { + float: none; + background: #fff; + margin-left: 0; + margin-top: 0; + margin-right: 0; + margin-bottom: 0; + } + + div.sphinxsidebar { + display: block; + float: none; + width: unset; + margin: 50px -30px -20px -30px; + padding: 10px 20px; + background: #333; + color: #FFF; + } + + div.sphinxsidebar h3, div.sphinxsidebar h4, div.sphinxsidebar p, + div.sphinxsidebar h3 a { + color: #fff; + } + + div.sphinxsidebar a { + color: #AAA; + } + + div.sphinxsidebar p.logo { + display: none; + } + + div.document { + width: 100%; + margin: 0; + } + + div.footer { + display: none; + } + + div.bodywrapper { + margin: 0; + } + + div.body { + min-height: 0; + min-width: auto; /* fixes width on small screens, breaks .hll */ + padding: 0; + } + + .hll { + /* "fixes" the breakage */ + width: max-content; + } + + .rtd_doc_footer { + display: none; + } + + .document { + width: auto; + } + + .footer { + width: auto; + } + + .github { + display: none; + } + + ul { + margin-left: 0; + } + + li > ul { + /* Matches the 30px from the "ul, ol" selector above */ + margin-left: 30px; + } +} + + +/* misc. */ + +.revsys-inline { + display: none!important; +} + +/* Hide ugly table cell borders in ..bibliography:: directive output */ +table.docutils.citation, table.docutils.citation td, table.docutils.citation th { + border: none; + /* Below needed in some edge cases; if not applied, bottom shadows appear */ + -moz-box-shadow: none; + -webkit-box-shadow: none; + box-shadow: none; +} + + +/* relbar */ + +.related { + line-height: 30px; + width: 100%; + font-size: 0.9rem; +} + +.related.top { + border-bottom: 1px solid #EEE; + margin-bottom: 20px; +} + +.related.bottom { + border-top: 1px solid #EEE; +} + +.related ul { + padding: 0; + margin: 0; + list-style: none; +} + +.related li { + display: inline; +} + +nav#rellinks { + float: right; +} + +nav#rellinks li+li:before { + content: "|"; +} + +nav#breadcrumbs li+li:before { + content: "\00BB"; +} + +/* Hide certain items when printing */ +@media print { + div.related { + display: none; + } +} + +img.github { + position: absolute; + top: 0; + border: 0; + right: 0; +} \ No newline at end of file diff --git a/main/imspy/_static/basic.css b/main/imspy/_static/basic.css new file mode 100644 index 00000000..d9846dac --- /dev/null +++ b/main/imspy/_static/basic.css @@ -0,0 +1,914 @@ +/* + * Sphinx stylesheet -- basic theme. + */ + +/* -- 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: 230px; + 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-top: 10px; +} + +ul.search li { + padding: 5px 0; +} + +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: inherit; + 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; +} + +a:visited { + color: #551A8B; +} + +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/main/imspy/_static/custom.css b/main/imspy/_static/custom.css new file mode 100644 index 00000000..2a924f1d --- /dev/null +++ b/main/imspy/_static/custom.css @@ -0,0 +1 @@ +/* This file intentionally left blank. */ diff --git a/main/imspy/_static/doctools.js b/main/imspy/_static/doctools.js new file mode 100644 index 00000000..0398ebb9 --- /dev/null +++ b/main/imspy/_static/doctools.js @@ -0,0 +1,149 @@ +/* + * Base JavaScript utilities for all Sphinx HTML documentation. + */ +"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/main/imspy/_static/documentation_options.js b/main/imspy/_static/documentation_options.js new file mode 100644 index 00000000..f2a4111a --- /dev/null +++ b/main/imspy/_static/documentation_options.js @@ -0,0 +1,13 @@ +const DOCUMENTATION_OPTIONS = { + VERSION: '0.2.33', + 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/main/imspy/_static/file.png b/main/imspy/_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/main/imspy/_static/github-banner.svg b/main/imspy/_static/github-banner.svg new file mode 100644 index 00000000..c47d9dc0 --- /dev/null +++ b/main/imspy/_static/github-banner.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/main/imspy/_static/language_data.js b/main/imspy/_static/language_data.js new file mode 100644 index 00000000..c7fe6c6f --- /dev/null +++ b/main/imspy/_static/language_data.js @@ -0,0 +1,192 @@ +/* + * This script contains the language-specific data used by searchtools.js, + * namely the list of stopwords, stemmer, scorer and splitter. + */ + +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, if 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/main/imspy/_static/minus.png b/main/imspy/_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/main/imspy/_static/plus.png b/main/imspy/_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/main/imspy/_static/pygments.css b/main/imspy/_static/pygments.css new file mode 100644 index 00000000..9392ddcb --- /dev/null +++ b/main/imspy/_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: #000 } /* Generic */ +.highlight .k { color: #004461; font-weight: bold } /* Keyword */ +.highlight .l { color: #000 } /* Literal */ +.highlight .n { color: #000 } /* Name */ +.highlight .o { color: #582800 } /* Operator */ +.highlight .x { color: #000 } /* Other */ +.highlight .p { color: #000; 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 } /* 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: #000; font-style: italic } /* Generic.Emph */ +.highlight .ges { color: #000 } /* 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: #888 } /* Generic.Output */ +.highlight .gp { color: #745334 } /* Generic.Prompt */ +.highlight .gs { color: #000; 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: #004461; font-weight: bold } /* Keyword.Constant */ +.highlight .kd { color: #004461; font-weight: bold } /* Keyword.Declaration */ +.highlight .kn { color: #004461; font-weight: bold } /* Keyword.Namespace */ +.highlight .kp { color: #004461; font-weight: bold } /* Keyword.Pseudo */ +.highlight .kr { color: #004461; font-weight: bold } /* Keyword.Reserved */ +.highlight .kt { color: #004461; font-weight: bold } /* Keyword.Type */ +.highlight .ld { color: #000 } /* Literal.Date */ +.highlight .m { color: #900 } /* Literal.Number */ +.highlight .s { color: #4E9A06 } /* Literal.String */ +.highlight .na { color: #C4A000 } /* Name.Attribute */ +.highlight .nb { color: #004461 } /* Name.Builtin */ +.highlight .nc { color: #000 } /* Name.Class */ +.highlight .no { color: #000 } /* Name.Constant */ +.highlight .nd { color: #888 } /* Name.Decorator */ +.highlight .ni { color: #CE5C00 } /* Name.Entity */ +.highlight .ne { color: #C00; font-weight: bold } /* Name.Exception */ +.highlight .nf { color: #000 } /* Name.Function */ +.highlight .nl { color: #F57900 } /* Name.Label */ +.highlight .nn { color: #000 } /* Name.Namespace */ +.highlight .nx { color: #000 } /* Name.Other */ +.highlight .py { color: #000 } /* Name.Property */ +.highlight .nt { color: #004461; font-weight: bold } /* Name.Tag */ +.highlight .nv { color: #000 } /* Name.Variable */ +.highlight .ow { color: #004461; font-weight: bold } /* Operator.Word */ +.highlight .pm { color: #000; font-weight: bold } /* Punctuation.Marker */ +.highlight .w { color: #F8F8F8 } /* Text.Whitespace */ +.highlight .mb { color: #900 } /* Literal.Number.Bin */ +.highlight .mf { color: #900 } /* Literal.Number.Float */ +.highlight .mh { color: #900 } /* Literal.Number.Hex */ +.highlight .mi { color: #900 } /* Literal.Number.Integer */ +.highlight .mo { color: #900 } /* 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: #000 } /* Name.Function.Magic */ +.highlight .vc { color: #000 } /* Name.Variable.Class */ +.highlight .vg { color: #000 } /* Name.Variable.Global */ +.highlight .vi { color: #000 } /* Name.Variable.Instance */ +.highlight .vm { color: #000 } /* Name.Variable.Magic */ +.highlight .il { color: #900 } /* Literal.Number.Integer.Long */ \ No newline at end of file diff --git a/main/imspy/_static/searchtools.js b/main/imspy/_static/searchtools.js new file mode 100644 index 00000000..2c774d17 --- /dev/null +++ b/main/imspy/_static/searchtools.js @@ -0,0 +1,632 @@ +/* + * Sphinx JavaScript utilities for the full-text search. + */ +"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, kind] = 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, + }; +} + +// Global search result kind enum, used by themes to style search results. +class SearchResultKind { + static get index() { return "index"; } + static get object() { return "object"; } + static get text() { return "text"; } + static get title() { return "title"; } +} + +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, highlightTerms) => { + const docBuilder = DOCUMENTATION_OPTIONS.BUILDER; + const docFileSuffix = DOCUMENTATION_OPTIONS.FILE_SUFFIX; + const docLinkSuffix = DOCUMENTATION_OPTIONS.LINK_SUFFIX; + const showSearchSummary = DOCUMENTATION_OPTIONS.SHOW_SEARCH_SUMMARY; + const contentRoot = document.documentElement.dataset.content_root; + + const [docName, title, anchor, descr, score, _filename, kind] = item; + + let listItem = document.createElement("li"); + // Add a class representing the item's type: + // can be used by a theme's CSS selector for styling + // See SearchResultKind for the class names. + listItem.classList.add(`kind-${kind}`); + 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 = contentRoot + dirname; + linkUrl = requestUrl; + } else { + // normal html builders + requestUrl = contentRoot + 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 + ")"; + // highlight search terms in the description + if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js + highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); + } + else if (showSearchSummary) + fetch(requestUrl) + .then((responseData) => responseData.text()) + .then((data) => { + if (data) + listItem.appendChild( + Search.makeSearchSummary(data, searchTerms, anchor) + ); + // highlight search terms in the summary + if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js + highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); + }); + 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 = Documentation.ngettext( + "Search finished, found one page matching the search query.", + "Search finished, found ${resultCount} pages matching the search query.", + resultCount, + ).replace('${resultCount}', resultCount); +}; +const _displayNextItem = ( + results, + resultCount, + searchTerms, + highlightTerms, +) => { + // 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, highlightTerms); + setTimeout( + () => _displayNextItem(results, resultCount, searchTerms, highlightTerms), + 5 + ); + } + // search finished, update title and status message + else _finishSearch(resultCount); +}; +// Helper function used by query() to order search results. +// Each input is an array of [docname, title, anchor, descr, score, filename, kind]. +// Order the results by score (in opposite order of appearance, since the +// `_displayNextItem` function uses pop() to retrieve items) and then alphabetically. +const _orderResultsByScoreThenName = (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; +}; + +/** + * 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, anchor) => { + const htmlElement = new DOMParser().parseFromString(htmlString, 'text/html'); + for (const removalQuery of [".headerlink", "script", "style"]) { + htmlElement.querySelectorAll(removalQuery).forEach((el) => { el.remove() }); + } + if (anchor) { + const anchorContent = htmlElement.querySelector(`[role="main"] ${anchor}`); + if (anchorContent) return anchorContent.textContent; + + console.warn( + `Anchored content block not found. Sphinx search tries to obtain it via DOM query '[role=main] ${anchor}'. Check your theme or template.` + ); + } + + // if anchor not specified or not found, fall back to main content + const docContent = htmlElement.querySelector('[role="main"]'); + if (docContent) return docContent.textContent; + + console.warn( + "Content block not found. Sphinx search tries to obtain it via DOM query '[role=main]'. 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.setAttribute("role", "list"); + 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); + }, + + _parseQuery: (query) => { + // 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]); + + return [query, searchTerms, excludedTerms, highlightTerms, objectTerms]; + }, + + /** + * execute search (requires search index to be loaded) + */ + _performSearch: (query, searchTerms, excludedTerms, highlightTerms, objectTerms) => { + 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; + + // Collect multiple result groups to be sorted separately and then ordered. + // Each is an array of [docname, title, anchor, descr, score, filename, kind]. + const normalResults = []; + const nonMainIndexResults = []; + + _removeChildren(document.getElementById("search-progress")); + + const queryLower = query.toLowerCase().trim(); + for (const [title, foundTitles] of Object.entries(allTitles)) { + if (title.toLowerCase().trim().includes(queryLower) && (queryLower.length >= title.length/2)) { + for (const [file, id] of foundTitles) { + const score = Math.round(Scorer.title * queryLower.length / title.length); + const boost = titles[file] === title ? 1 : 0; // add a boost for document titles + normalResults.push([ + docNames[file], + titles[file] !== title ? `${titles[file]} > ${title}` : title, + id !== null ? "#" + id : "", + null, + score + boost, + filenames[file], + SearchResultKind.title, + ]); + } + } + } + + // 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, isMain] of foundEntries) { + const score = Math.round(100 * queryLower.length / entry.length); + const result = [ + docNames[file], + titles[file], + id ? "#" + id : "", + null, + score, + filenames[file], + SearchResultKind.index, + ]; + if (isMain) { + normalResults.push(result); + } else { + nonMainIndexResults.push(result); + } + } + } + } + + // lookup as object + objectTerms.forEach((term) => + normalResults.push(...Search.performObjectSearch(term, objectTerms)) + ); + + // lookup as search terms in fulltext + normalResults.push(...Search.performTermsSearch(searchTerms, excludedTerms)); + + // let the scorer override scores with a custom scoring function + if (Scorer.score) { + normalResults.forEach((item) => (item[4] = Scorer.score(item))); + nonMainIndexResults.forEach((item) => (item[4] = Scorer.score(item))); + } + + // Sort each group of results by score and then alphabetically by name. + normalResults.sort(_orderResultsByScoreThenName); + nonMainIndexResults.sort(_orderResultsByScoreThenName); + + // Combine the result groups in (reverse) order. + // Non-main index entries are typically arbitrary cross-references, + // so display them after other results. + let results = [...nonMainIndexResults, ...normalResults]; + + // 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; + }, []); + + return results.reverse(); + }, + + query: (query) => { + const [searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms] = Search._parseQuery(query); + const results = Search._performSearch(searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms); + + // for debugging + //Search.lastresults = results.slice(); // a copy + // console.info("search results:", Search.lastresults); + + // print the results + _displayNextItem(results, results.length, searchTerms, highlightTerms); + }, + + /** + * 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]], + SearchResultKind.object, + ]); + }; + 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); + if (!terms.hasOwnProperty(word)) { + Object.keys(terms).forEach((term) => { + if (term.match(escapedWord)) + arr.push({ files: terms[term], score: Scorer.partialTerm }); + }); + } + if (!titleTerms.hasOwnProperty(word)) { + Object.keys(titleTerms).forEach((term) => { + if (term.match(escapedWord)) + arr.push({ files: titleTerms[term], 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.set(file, [word]); + else if (fileMap.get(file).indexOf(word) === -1) fileMap.get(file).push(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], + SearchResultKind.text, + ]); + } + 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, anchor) => { + const text = Search.htmlToText(htmlText, anchor); + 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/main/imspy/_static/sphinx_highlight.js b/main/imspy/_static/sphinx_highlight.js new file mode 100644 index 00000000..8a96c69a --- /dev/null +++ b/main/imspy/_static/sphinx_highlight.js @@ -0,0 +1,154 @@ +/* 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))); + const rest = document.createTextNode(val.substr(pos + text.length)); + parent.insertBefore( + span, + parent.insertBefore( + rest, + node.nextSibling + ) + ); + node.nodeValue = val.substr(0, pos); + /* There may be more occurrences of search term in this node. So call this + * function recursively on the remaining fragment. + */ + _highlight(rest, addItems, text, className); + + 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(() => { + /* Do not call highlightSearchWords() when we are on the search page. + * It will highlight words from the *previous* search query. + */ + if (typeof Search === "undefined") SphinxHighlight.highlightSearchWords(); + SphinxHighlight.initEscapeListener(); +}); diff --git a/main/imspy/genindex.html b/main/imspy/genindex.html new file mode 100644 index 00000000..0057c004 --- /dev/null +++ b/main/imspy/genindex.html @@ -0,0 +1,2092 @@ + + + + + + + Index — imspy 0.2.33 documentation + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ + +

Index

+ +
+ A + | B + | C + | D + | E + | F + | G + | I + | J + | K + | L + | M + | N + | O + | P + | R + | S + | T + | U + | V + | W + +
+

A

+ + + +
+ +

B

+ + + +
+ +

C

+ + + +
+ +

D

+ + + +
+ +

E

+ + + +
+ +

F

+ + + +
+ +

G

+ + + +
+ +

I

+ + + +
    +
  • im_lower (imspy.timstof.data.TimsDataset property) +
  • +
  • im_upper (imspy.timstof.data.TimsDataset property) +
  • +
  • + imspy + +
  • +
  • + imspy.algorithm + +
  • +
  • + imspy.algorithm.ccs + +
  • +
  • + imspy.algorithm.ccs.predictors + +
  • +
  • + imspy.algorithm.hashing + +
  • +
  • + imspy.algorithm.intensity + +
  • +
  • + imspy.algorithm.intensity.predictors + +
  • +
  • + imspy.algorithm.intensity.utility + +
  • +
  • + imspy.algorithm.ionization + +
  • +
  • + imspy.algorithm.ionization.predictors + +
  • +
  • + imspy.algorithm.pretrained + +
  • +
  • + imspy.algorithm.rt + +
  • +
  • + imspy.algorithm.rt.predictors + +
  • +
  • + imspy.algorithm.utility + +
  • +
  • + imspy.chemistry + +
  • +
  • + imspy.chemistry.amino_acids + +
  • +
  • + imspy.chemistry.constants + +
  • +
  • + imspy.chemistry.elements + +
  • +
  • + imspy.chemistry.mobility + +
  • +
  • + imspy.chemistry.sum_formula + +
  • +
  • + imspy.chemistry.unimod + +
  • +
  • + imspy.chemistry.utility + +
  • +
  • + imspy.data + +
  • +
  • + imspy.data.peptide + +
  • +
  • + imspy.data.spectrum + +
  • +
  • + imspy.simulation + +
  • +
  • + imspy.simulation.acquisition + +
  • +
  • + imspy.simulation.annotation + +
  • +
  • + imspy.simulation.experiment + +
  • +
  • + imspy.simulation.handle + +
  • +
  • + imspy.simulation.noise + +
  • +
  • + imspy.simulation.proteome + +
  • +
  • + imspy.simulation.tdf + +
  • +
  • + imspy.simulation.timsim + +
  • +
  • + imspy.simulation.timsim.jobs + +
  • +
  • + imspy.simulation.timsim.jobs.add_noise_from_real_data + +
  • +
  • + imspy.simulation.timsim.jobs.assemble_frames + +
  • +
  • + imspy.simulation.timsim.jobs.build_acquisition + +
  • +
  • + imspy.simulation.timsim.jobs.digest_fasta + +
  • +
  • + imspy.simulation.timsim.jobs.simulate_charge_states + +
  • +
+ +

J

+ + + +
+ +

K

+ + +
+ +

L

+ + + +
+ +

M

+ + + +
+ +

N

+ + + +
+ +

O

+ + + +
+ +

P

+ + + +
+ +

R

+ + + +
+ +

S

+ + + +
+ +

T

+ + + +
+ +

U

+ + +
+ +

V

+ + +
+ +

W

+ + + +
+ + + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/main/imspy/imspy.algorithm.ccs.html b/main/imspy/imspy.algorithm.ccs.html new file mode 100644 index 00000000..cd88029e --- /dev/null +++ b/main/imspy/imspy.algorithm.ccs.html @@ -0,0 +1,483 @@ + + + + + + + + imspy.algorithm.ccs package — imspy 0.2.33 documentation + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

imspy.algorithm.ccs package¶

+
+

Submodules¶

+
+
+

imspy.algorithm.ccs.predictors module¶

+
+
+class imspy.algorithm.ccs.predictors.DeepPeptideIonMobilityApex(model, tokenizer, verbose=False, name='gru_predictor')¶
+

Bases: PeptideIonMobilityApex

+
+
+fine_tune_model(data, batch_size=64, re_compile=False, verbose=False, decoys_separate=True)¶
+
+ +
+
+simulate_ion_mobilities(sequences, charges, mz, batch_size=1024)¶
+
+
Return type:
+

ndarray[Any, dtype[TypeVar(_ScalarType_co, bound= generic, covariant=True)]]

+
+
+
+ +
+
+simulate_ion_mobilities_pandas(data, batch_size=1024, return_ccs=False, decoys_separate=True)¶
+
+
Return type:
+

DataFrame

+
+
+
+ +
+ +
+
+class imspy.algorithm.ccs.predictors.GRUCCSPredictor(*args, **kwargs)¶
+

Bases: Model

+
+
+build(input_shape)¶
+

Builds the model based on input shapes received.

+

This is to be used for subclassed models, which do not know at +instantiation time what their inputs look like.

+

This method only exists for users who want to call model.build() in a +standalone way (as a substitute for calling the model on real data to +build it). It will never be called by the framework (and thus it will +never throw unexpected errors in an unrelated workflow).

+
+
Parameters:
+

input_shape – Single tuple, TensorShape instance, or list/dict of +shapes, where shapes are tuples, integers, or TensorShape +instances.

+
+
Raises:
+
    +
  • ValueError –

      +
    1. In case of invalid user-provided data (not of type tuple, + list, TensorShape, or dict). + 2. If the model requires call arguments that are agnostic + to the input shapes (positional or keyword arg in call + signature). + 3. If not all layers were properly built. + 4. If float type inputs are not supported within the layers.

    2. +
    +

  • +
  • In each of these cases, the user should build their model by calling –

  • +
  • it on real tensor data. –

  • +
+
+
+
+ +
+
+call(inputs, training=False)¶
+

Calls the model on new inputs and returns the outputs as tensors.

+

In this case call() just reapplies +all ops in the graph to the new inputs +(e.g. build a new computational graph from the provided inputs).

+

Note: This method should not be called directly. It is only meant to be +overridden when subclassing tf.keras.Model. +To call a model on an input, always use the __call__() method, +i.e. model(inputs), which relies on the underlying call() method.

+
+
Parameters:
+
    +
  • inputs – Input tensor, or dict/list/tuple of input tensors.

  • +
  • training – Boolean or boolean scalar tensor, indicating whether to +run the Network in training mode or inference mode.

  • +
  • mask – A mask or list of masks. A mask can be either a boolean tensor +or None (no mask). For more details, check the guide +[here](https://www.tensorflow.org/guide/keras/masking_and_padding).

  • +
+
+
Returns:
+

A tensor if there is a single output, or +a list of tensors if there are more than one outputs.

+
+
+
+ +
+
+classmethod from_config(config)¶
+

Creates a layer from its config.

+

This method is the reverse of get_config, +capable of instantiating the same layer from the config +dictionary. It does not handle layer connectivity +(handled by Network), nor weights (handled by set_weights).

+
+
Parameters:
+

config – A Python dictionary, typically the +output of get_config.

+
+
Returns:
+

A layer instance.

+
+
+
+ +
+
+get_config()¶
+

Returns the config of the Model.

+

Config is a Python dictionary (serializable) containing the +configuration of an object, which in this case is a Model. This allows +the Model to be be reinstantiated later (without its trained weights) +from this configuration.

+

Note that get_config() does not guarantee to return a fresh copy of +dict every time it is called. The callers should make a copy of the +returned dict if they want to modify it.

+

Developers of subclassed Model are advised to override this method, +and continue to update the dict from super(MyModel, self).get_config() +to provide the proper configuration of this Model. The default config +will return config dict for init parameters if they are basic types. +Raises NotImplementedError when in cases where a custom +get_config() implementation is required for the subclassed model.

+
+
Returns:
+

Python dictionary containing the configuration of this Model.

+
+
+
+ +
+ +
+
+class imspy.algorithm.ccs.predictors.PeptideIonMobilityApex¶
+

Bases: ABC

+
+
+abstract simulate_ion_mobilities(sequences, charges)¶
+
+
Return type:
+

ndarray[Any, dtype[TypeVar(_ScalarType_co, bound= generic, covariant=True)]]

+
+
+
+ +
+
+abstract simulate_ion_mobilities_pandas(data)¶
+
+
Return type:
+

DataFrame

+
+
+
+ +
+ +
+
+class imspy.algorithm.ccs.predictors.SquareRootProjectionLayer(slopes, intercepts, trainable=True, **kwargs)¶
+

Bases: Layer

+
+
+build(input_shape)¶
+

Creates the variables of the layer (for subclass implementers).

+

This is a method that implementers of subclasses of Layer or Model +can override if they need a state-creation step in-between +layer instantiation and layer call. It is invoked automatically before +the first execution of call().

+

This is typically used to create the weights of Layer subclasses +(at the discretion of the subclass implementer).

+
+
Parameters:
+

input_shape – Instance of TensorShape, or list of instances of +TensorShape if the layer expects a list of inputs +(one instance per input).

+
+
+
+ +
+
+call(inputs)¶
+

This is where the layer’s logic lives.

+

The call() method may not create state (except in its first +invocation, wrapping the creation of variables or other resources in +tf.init_scope()). It is recommended to create state, including +tf.Variable instances and nested Layer instances,

+
+

in __init__(), or in the build() method that is

+
+

called automatically before call() executes for the first time.

+
+
Parameters:
+
    +
  • inputs –

    Input tensor, or dict/list/tuple of input tensors. +The first positional inputs argument is subject to special rules: +- inputs must be explicitly passed. A layer cannot have zero

    +
    +

    arguments, and inputs cannot be provided via the default value +of a keyword argument.

    +
    +
      +
    • NumPy array or Python scalar values in inputs get cast as +tensors.

    • +
    • Keras mask metadata is only collected from inputs.

    • +
    • Layers are built (build(input_shape) method) +using shape info from inputs only.

    • +
    • input_spec compatibility is only checked against inputs.

    • +
    • Mixed precision input casting is only applied to inputs. +If a layer has tensor arguments in *args or **kwargs, their +casting behavior in mixed precision should be handled manually.

    • +
    • The SavedModel input specification is generated using inputs +only.

    • +
    • Integration with various ecosystem packages like TFMOT, TFLite, +TF.js, etc is only supported for inputs and not for tensors in +positional and keyword arguments.

    • +
    +

  • +
  • *args – Additional positional arguments. May contain tensors, although +this is not recommended, for the reasons above.

  • +
  • **kwargs –

    Additional keyword arguments. May contain tensors, although +this is not recommended, for the reasons above. +The following optional keyword arguments are reserved: +- training: Boolean scalar tensor of Python boolean indicating

    +
    +

    whether the call is meant for training or inference.

    +
    +
      +
    • mask: Boolean input mask. If the layer’s call() method takes a +mask argument, its default value will be set to the mask +generated for inputs by the previous layer (if input did come +from a layer that generated a corresponding mask, i.e. if it came +from a Keras layer with masking support).

    • +
    +

  • +
+
+
Returns:
+

A tensor or list/tuple of tensors.

+
+
+
+ +
+
+classmethod from_config(config)¶
+

Creates a layer from its config.

+

This method is the reverse of get_config, +capable of instantiating the same layer from the config +dictionary. It does not handle layer connectivity +(handled by Network), nor weights (handled by set_weights).

+
+
Parameters:
+

config – A Python dictionary, typically the +output of get_config.

+
+
Returns:
+

A layer instance.

+
+
+
+ +
+
+get_config()¶
+

Returns the config of the layer.

+

A layer config is a Python dictionary (serializable) +containing the configuration of a layer. +The same layer can be reinstantiated later +(without its trained weights) from this configuration.

+

The config of a layer does not include connectivity +information, nor the layer class name. These are handled +by Network (one layer of abstraction above).

+

Note that get_config() does not guarantee to return a fresh copy of +dict every time it is called. The callers should make a copy of the +returned dict if they want to modify it.

+
+
Returns:
+

Python dictionary.

+
+
+
+ +
+ +
+
+imspy.algorithm.ccs.predictors.get_sqrt_slopes_and_intercepts(mz, charge, ccs, fit_charge_state_one=False)¶
+

Fit the square root model to the provided data. +:type mz: ndarray[Any, dtype[TypeVar(_ScalarType_co, bound= generic, covariant=True)]] +:param mz: The m/z values. +:type charge: ndarray[Any, dtype[TypeVar(_ScalarType_co, bound= generic, covariant=True)]] +:param charge: The charge states. +:type ccs: ndarray[Any, dtype[TypeVar(_ScalarType_co, bound= generic, covariant=True)]] +:param ccs: The collision cross sections. +:type fit_charge_state_one: bool +:param fit_charge_state_one: Whether to fit the charge state one.

+
+
Return type:
+

Tuple[ndarray[Any, dtype[TypeVar(_ScalarType_co, bound= generic, covariant=True)]], ndarray[Any, dtype[TypeVar(_ScalarType_co, bound= generic, covariant=True)]]]

+
+
Returns:
+

The slopes and intercepts of the square root model fit.

+
+
+
+ +
+
+imspy.algorithm.ccs.predictors.load_deep_ccs_predictor()¶
+
+
Return type:
+

Model

+
+
+
+ +
+
+imspy.algorithm.ccs.predictors.predict_inverse_ion_mobility(psm_collection, refine_model=True, verbose=False)¶
+

Predicts the inverse ion mobility for a collection of peptide spectrum matches. +:type psm_collection: List[Psm] +:param psm_collection: A list of peptide spectrum matches. +:type refine_model: bool +:param refine_model: Whether to refine the model by fine-tuning it on the provided data. +:type verbose: bool +:param verbose: Whether to print additional information during the prediction.

+
+
Return type:
+

None

+
+
Returns:
+

None, the inverse ion mobility is set in the peptide spectrum matches in place.

+
+
+
+ +
+
+

Module contents¶

+
+
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/main/imspy/imspy.algorithm.html b/main/imspy/imspy.algorithm.html new file mode 100644 index 00000000..6f2c1a0e --- /dev/null +++ b/main/imspy/imspy.algorithm.html @@ -0,0 +1,400 @@ + + + + + + + + imspy.algorithm package — imspy 0.2.33 documentation + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

imspy.algorithm package¶

+
+

Subpackages¶

+
+ +
+
+
+

Submodules¶

+
+
+

imspy.algorithm.hashing module¶

+
+
+class imspy.algorithm.hashing.CosimHasher(target_vector_length, trials=32, len_trial=20, seed=42)¶
+

Bases: object

+
+
+calculate_keys(W)¶
+
+
Return type:
+

Tensor

+
+
+
+ +
+ +
+
+class imspy.algorithm.hashing.TimsHasher(trials=32, len_trial=20, seed=5671, resolution=1, num_dalton=10)¶
+

Bases: CosimHasher

+

Class to create hash keys from a given set of weights.

+
+
Parameters:
+
    +
  • trials (int) – number of trials to use for random projection.

  • +
  • len_trial (int) – length of each trial.

  • +
  • seed (int) – seed for random projection.

  • +
  • resolution (int) – resolution of the random projection.

  • +
  • num_dalton (int) – number of dalton to use for random projection.

  • +
+
+
+
+ +
+
+

imspy.algorithm.mixture module¶

+
+
+

imspy.algorithm.utility module¶

+
+
+class imspy.algorithm.utility.InMemoryCheckpoint(validation_target='val_loss')¶
+

Bases: Callback

+
+
+on_epoch_end(epoch, logs=None)¶
+

Called at the end of an epoch.

+

Subclasses should override for any actions to run. This function should +only be called during TRAIN mode.

+
+
Parameters:
+
    +
  • epoch – Integer, index of epoch.

  • +
  • logs – Dict, metric results for this training epoch, and for the +validation epoch if validation is performed. Validation result +keys are prefixed with val_. For training epoch, the values of +the Model’s metrics are returned. Example: +{‘loss’: 0.2, ‘accuracy’: 0.7}.

  • +
+
+
+
+ +
+
+on_train_begin(logs=None)¶
+

Called at the beginning of training.

+

Subclasses should override for any actions to run.

+
+
Parameters:
+

logs – Dict. Currently no data is passed to this argument for this +method but that may change in the future.

+
+
+
+ +
+
+on_train_end(logs=None)¶
+

Called at the end of training.

+

Subclasses should override for any actions to run.

+
+
Parameters:
+

logs – Dict. Currently the output of the last call to +on_epoch_end() is passed to this argument for this method but +that may change in the future.

+
+
+
+ +
+ +
+
+imspy.algorithm.utility.get_model_path(model_name)¶
+

Get the path to a pretrained model

+
+
Parameters:
+

model_name (str) – The name of the model to load

+
+
Return type:
+

Traversable

+
+
Returns:
+

The path to the pretrained model

+
+
+
+ +
+
+imspy.algorithm.utility.load_tokenizer_from_resources(tokenizer_name)¶
+

Load a tokenizer from resources

+
+
Return type:
+

Tokenizer

+
+
Returns:
+

The pretrained tokenizer

+
+
+
+ +
+
+

Module contents¶

+
+
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/main/imspy/imspy.algorithm.intensity.html b/main/imspy/imspy.algorithm.intensity.html new file mode 100644 index 00000000..61cc5ea9 --- /dev/null +++ b/main/imspy/imspy.algorithm.intensity.html @@ -0,0 +1,392 @@ + + + + + + + + imspy.algorithm.intensity package — imspy 0.2.33 documentation + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

imspy.algorithm.intensity package¶

+
+

Submodules¶

+
+
+

imspy.algorithm.intensity.predictors module¶

+
+
+class imspy.algorithm.intensity.predictors.IonIntensityPredictor¶
+

Bases: ABC

+

ABSTRACT INTERFACE for simulation of ion-mobility apex value

+
+
+abstract simulate_ion_intensities(sequences, charges, collision_energies)¶
+
+
Return type:
+

ndarray[Any, dtype[TypeVar(_ScalarType_co, bound= generic, covariant=True)]]

+
+
+
+ +
+
+abstract simulate_ion_intensities_pandas(data)¶
+
+
Return type:
+

DataFrame

+
+
+
+ +
+ +
+
+class imspy.algorithm.intensity.predictors.Prosit2023TimsTofWrapper(verbose=True, model_name='deep_ion_intensity_predictor')¶
+

Bases: IonIntensityPredictor

+

Wrapper for the Prosit 2023 TIMS-TOF predictor

+
+
+predict_intensities(sequences, charges, collision_energies, divide_collision_energy_by=100.0, batch_size=512, flatten=False)¶
+
+
Return type:
+

List[ndarray[Any, dtype[TypeVar(_ScalarType_co, bound= generic, covariant=True)]]]

+
+
+
+ +
+
+simulate_ion_intensities(sequences, charges, collision_energies, divide_collision_energy_by=100.0, batch_size=512)¶
+
+
Return type:
+

List[PeptideProductIonSeriesCollection]

+
+
+
+ +
+
+simulate_ion_intensities_pandas(data, batch_size=512, divide_collision_energy_by=100.0, verbose=False, flatten=False)¶
+
+
Return type:
+

DataFrame

+
+
+
+ +
+
+simulate_ion_intensities_pandas_batched(data, batch_size_tf_ds=1024, batch_size=400000, divide_collision_energy_by=100.0)¶
+
+
Return type:
+

DataFrame

+
+
+
+ +
+ +
+
+imspy.algorithm.intensity.predictors.get_collision_energy_calibration_factor(sample, model, lower=-30, upper=30, verbose=False)¶
+

Get the collision energy calibration factor for a given sample. +:type sample: List[Psm] +:param sample: a list of PeptideSpectrumMatch objects +:type model: Prosit2023TimsTofWrapper +:param model: a Prosit2023TimsTofWrapper object +:type lower: int +:param lower: lower bound for the search +:type upper: int +:param upper: upper bound for the search +:type verbose: bool +:param verbose: whether to print progress

+
+
Returns:
+

the collision energy calibration factor and the angle similarities

+
+
Return type:
+

Tuple[float, List[float]]

+
+
+
+ +
+
+imspy.algorithm.intensity.predictors.load_prosit_2023_timsTOF_predictor()¶
+

Get a pretrained deep predictor model +This model was downloaded from ZENODO: https://zenodo.org/records/8211811 +PAPER : https://doi.org/10.1101/2023.07.17.549401 +:returns: The pretrained deep predictor model

+
+ +
+
+imspy.algorithm.intensity.predictors.predict_intensities_prosit(psm_collection, calibrate_collision_energy=True, verbose=False, num_threads=-1)¶
+

Predict the fragment ion intensities using Prosit. +:type psm_collection: List[Psm] +:param psm_collection: a list of peptide-spectrum matches +:type calibrate_collision_energy: bool +:param calibrate_collision_energy: whether to calibrate the collision energy +:type verbose: bool +:param verbose: whether to print progress +:type num_threads: int +:param num_threads: number of threads to use

+
+
Return type:
+

None

+
+
Returns:
+

None, the fragment ion intensities are stored in the PeptideSpectrumMatch objects

+
+
+
+ +
+
+imspy.algorithm.intensity.predictors.remove_unimod_annotation(sequence)¶
+

Remove the unimod annotation from a peptide sequence. +:type sequence: str +:param sequence: a peptide sequence

+
+
Returns:
+

the peptide sequence without unimod annotation

+
+
Return type:
+

str

+
+
+
+ +
+
+

imspy.algorithm.intensity.utility module¶

+
+
+imspy.algorithm.intensity.utility.beta_score(fragments_observed, fragments_predicted)¶
+

The beta score is a variant of the OpenMS proposed score calculation, using predicted intensities instead of a constant value for the expected intensity. +:type fragments_observed: +:param fragments_observed: The Sage Fragment object containing the observed intensities +:type fragments_predicted: +:param fragments_predicted: The Sage Fragment object containing the predicted intensities, e.g. from Prosit

+
+
Returns:
+

The beta score, hyper score variant using predicted intensities instead of a constant value for the expected intensity

+
+
Return type:
+

float

+
+
+
+ +
+
+imspy.algorithm.intensity.utility.generate_prosit_intensity_prediction_dataset(sequences, charges, collision_energies=None)¶
+

Generate a dataset for predicting fragment intensities using Prosit. +:type sequences: List[str] +:param sequences: A list of peptide sequences. +:type charges: ndarray[Any, dtype[TypeVar(_ScalarType_co, bound= generic, covariant=True)]] +:param charges: A numpy array of precursor charges. +:type collision_energies: ndarray[Any, dtype[TypeVar(_ScalarType_co, bound= generic, covariant=True)]] | None +:param collision_energies: A numpy array of collision energies.

+
+
Returns:
+

A tf.data.Dataset object that yields batches of data in the format expected by the model.

+
+
+
+ +
+
+imspy.algorithm.intensity.utility.get_prosit_intensity_flat_labels()¶
+

Get the list of fragment ion labels for Prosit. +:rtype: List[str] +:returns: List of fragment ion labels, giving the returned order of fragment intensities.

+
+ +
+
+imspy.algorithm.intensity.utility.post_process_predicted_fragment_spectra(data_pred)¶
+

post process the predicted fragment intensities +:type data_pred: DataFrame +:param data_pred: dataframe containing the predicted fragment intensities

+
+
Return type:
+

ndarray[Any, dtype[TypeVar(_ScalarType_co, bound= generic, covariant=True)]]

+
+
Returns:
+

numpy array of fragment intensities

+
+
+
+ +
+
+imspy.algorithm.intensity.utility.seq_to_index(seq, max_length=30)¶
+

Convert a sequence to a list of indices into the alphabet.

+
+
Parameters:
+
    +
  • seq (str) – A string representing a sequence of amino acids.

  • +
  • max_length (int) – The maximum length of the sequence to allow.

  • +
+
+
Return type:
+

ndarray[Any, dtype[TypeVar(_ScalarType_co, bound= generic, covariant=True)]]

+
+
Returns:
+

A list of integers, each representing an index into the alphabet.

+
+
+
+ +
+
+imspy.algorithm.intensity.utility.to_prosit_tensor(sequences)¶
+

translate a list of fixed length numpy arrays into a tensorflow tensor +:type sequences: List +:param sequences: list of numpy arrays, representing peptide sequences

+
+
Return type:
+

Tensor

+
+
Returns:
+

tensorflow tensor

+
+
+
+ +
+
+imspy.algorithm.intensity.utility.unpack_dict(features)¶
+

Unpack the dictionary of features into the expected inputs for the model.

+
+
Parameters:
+

features – A dictionary of features, with keys ‘peptides_in’, ‘precursor_charge_in’, and ‘collision_energy_in’

+
+
Returns:
+

(peptides, precursor_charge, collision_energy)

+
+
Return type:
+

A tuple of the expected inputs for the model

+
+
+
+ +
+
+

Module contents¶

+
+
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/main/imspy/imspy.algorithm.ionization.html b/main/imspy/imspy.algorithm.ionization.html new file mode 100644 index 00000000..30cde8be --- /dev/null +++ b/main/imspy/imspy.algorithm.ionization.html @@ -0,0 +1,370 @@ + + + + + + + + imspy.algorithm.ionization package — imspy 0.2.33 documentation + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

imspy.algorithm.ionization package¶

+
+

Submodules¶

+
+
+

imspy.algorithm.ionization.predictors module¶

+
+
+class imspy.algorithm.ionization.predictors.BinomialChargeStateDistributionModel(charged_probability=0.5, max_charge=4)¶
+

Bases: PeptideChargeStateDistribution, ABC

+
+
+simulate_charge_state_distribution_pandas(data, min_charge_contrib=0.005)¶
+
+
Return type:
+

DataFrame

+
+
+
+ +
+
+simulate_ionizations(sequences)¶
+
+
Return type:
+

array

+
+
+
+ +
+ +
+
+class imspy.algorithm.ionization.predictors.DeepChargeStateDistribution(model, tokenizer, allowed_charges=array([1, 2, 3, 4]), name='gru_predictor', verbose=True)¶
+

Bases: PeptideChargeStateDistribution, ABC

+
+
+simulate_charge_state_distribution_pandas(data, charge_state_one_probability=0.1, batch_size=1024, min_charge_contrib=0.005)¶
+

Simulate charge state distribution for a pandas DataFrame containing peptide sequences

+
+
Parameters:
+
    +
  • data (DataFrame) – pandas DataFrame containing peptide sequences

  • +
  • charge_state_one_probability (float) – probability of charge state 1

  • +
  • batch_size (int) – batch size for prediction

  • +
  • min_charge_contrib (float) – minimum relative abundance of a charge state to be included in the output

  • +
+
+
Return type:
+

DataFrame

+
+
Returns:
+

pandas DataFrame containing simulated charge state distributions

+
+
+
+ +
+
+simulate_ionizations(sequences, batch_size=1024)¶
+
+
Return type:
+

ndarray[Any, dtype[TypeVar(_ScalarType_co, bound= generic, covariant=True)]]

+
+
+
+ +
+ +
+
+class imspy.algorithm.ionization.predictors.GRUChargeStatePredictor(*args, **kwargs)¶
+

Bases: Model

+
+
+build(input_shape)¶
+

Builds the model based on input shapes received.

+

This is to be used for subclassed models, which do not know at +instantiation time what their inputs look like.

+

This method only exists for users who want to call model.build() in a +standalone way (as a substitute for calling the model on real data to +build it). It will never be called by the framework (and thus it will +never throw unexpected errors in an unrelated workflow).

+
+
Parameters:
+

input_shape – Single tuple, TensorShape instance, or list/dict of +shapes, where shapes are tuples, integers, or TensorShape +instances.

+
+
Raises:
+
    +
  • ValueError –

      +
    1. In case of invalid user-provided data (not of type tuple, + list, TensorShape, or dict). + 2. If the model requires call arguments that are agnostic + to the input shapes (positional or keyword arg in call + signature). + 3. If not all layers were properly built. + 4. If float type inputs are not supported within the layers.

    2. +
    +

  • +
  • In each of these cases, the user should build their model by calling –

  • +
  • it on real tensor data. –

  • +
+
+
+
+ +
+
+call(inputs, training=False)¶
+

Calls the model on new inputs and returns the outputs as tensors.

+

In this case call() just reapplies +all ops in the graph to the new inputs +(e.g. build a new computational graph from the provided inputs).

+

Note: This method should not be called directly. It is only meant to be +overridden when subclassing tf.keras.Model. +To call a model on an input, always use the __call__() method, +i.e. model(inputs), which relies on the underlying call() method.

+
+
Parameters:
+
    +
  • inputs – Input tensor, or dict/list/tuple of input tensors.

  • +
  • training – Boolean or boolean scalar tensor, indicating whether to +run the Network in training mode or inference mode.

  • +
  • mask – A mask or list of masks. A mask can be either a boolean tensor +or None (no mask). For more details, check the guide +[here](https://www.tensorflow.org/guide/keras/masking_and_padding).

  • +
+
+
Returns:
+

A tensor if there is a single output, or +a list of tensors if there are more than one outputs.

+
+
+
+ +
+
+classmethod from_config(config)¶
+

Creates a layer from its config.

+

This method is the reverse of get_config, +capable of instantiating the same layer from the config +dictionary. It does not handle layer connectivity +(handled by Network), nor weights (handled by set_weights).

+
+
Parameters:
+

config – A Python dictionary, typically the +output of get_config.

+
+
Returns:
+

A layer instance.

+
+
+
+ +
+
+get_config()¶
+

Returns the config of the Model.

+

Config is a Python dictionary (serializable) containing the +configuration of an object, which in this case is a Model. This allows +the Model to be be reinstantiated later (without its trained weights) +from this configuration.

+

Note that get_config() does not guarantee to return a fresh copy of +dict every time it is called. The callers should make a copy of the +returned dict if they want to modify it.

+

Developers of subclassed Model are advised to override this method, +and continue to update the dict from super(MyModel, self).get_config() +to provide the proper configuration of this Model. The default config +will return config dict for init parameters if they are basic types. +Raises NotImplementedError when in cases where a custom +get_config() implementation is required for the subclassed model.

+
+
Returns:
+

Python dictionary containing the configuration of this Model.

+
+
+
+ +
+ +
+
+class imspy.algorithm.ionization.predictors.PeptideChargeStateDistribution¶
+

Bases: ABC

+

ABSTRACT INTERFACE for ionization simulation of peptides

+
+
+abstract simulate_charge_state_distribution_pandas(data)¶
+
+
Return type:
+

DataFrame

+
+
+
+ +
+
+abstract simulate_ionizations(sequences)¶
+
+
Return type:
+

array

+
+
+
+ +
+ +
+
+imspy.algorithm.ionization.predictors.charge_state_distribution_from_sequence_rust(sequence, max_charge=None, charge_probability=None)¶
+
+
Return type:
+

ndarray[Any, dtype[TypeVar(_ScalarType_co, bound= generic, covariant=True)]]

+
+
+
+ +
+
+imspy.algorithm.ionization.predictors.charge_state_distributions_from_sequences_rust(sequences, n_threads=4, max_charge=None, charge_probability=None)¶
+
+
Return type:
+

ndarray[Any, dtype[TypeVar(_ScalarType_co, bound= generic, covariant=True)]]

+
+
+
+ +
+
+imspy.algorithm.ionization.predictors.load_deep_charge_state_predictor()¶
+

Get a pretrained deep predictor model

+
+
Return type:
+

Model

+
+
Returns:
+

The pretrained deep predictor model

+
+
+
+ +
+
+

Module contents¶

+
+
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/main/imspy/imspy.algorithm.pretrained.html b/main/imspy/imspy.algorithm.pretrained.html new file mode 100644 index 00000000..67368604 --- /dev/null +++ b/main/imspy/imspy.algorithm.pretrained.html @@ -0,0 +1,126 @@ + + + + + + + + imspy.algorithm.pretrained package — imspy 0.2.33 documentation + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

imspy.algorithm.pretrained package¶

+
+

Module contents¶

+
+
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/main/imspy/imspy.algorithm.rt.html b/main/imspy/imspy.algorithm.rt.html new file mode 100644 index 00000000..0eed8404 --- /dev/null +++ b/main/imspy/imspy.algorithm.rt.html @@ -0,0 +1,373 @@ + + + + + + + + imspy.algorithm.rt package — imspy 0.2.33 documentation + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

imspy.algorithm.rt package¶

+
+

Submodules¶

+
+
+

imspy.algorithm.rt.predictors module¶

+
+
+class imspy.algorithm.rt.predictors.DeepChromatographyApex(model, tokenizer, name='gru_predictor', verbose=False)¶
+

Bases: PeptideChromatographyApex

+
+
+fine_tune_model(data, batch_size=64, re_compile=False, verbose=False, decoys_separate=True)¶
+
+ +
+
+generate_tf_ds_inference(sequences)¶
+
+
Return type:
+

DatasetV2

+
+
+
+ +
+
+generate_tf_ds_train(sequences, rt_target)¶
+
+
Return type:
+

DatasetV2

+
+
+
+ +
+
+simulate_separation_times(sequences, batch_size=1024)¶
+
+
Return type:
+

ndarray[Any, dtype[TypeVar(_ScalarType_co, bound= generic, covariant=True)]]

+
+
+
+ +
+
+simulate_separation_times_pandas(data, batch_size=1024, gradient_length=None, decoys_separate=True)¶
+
+
Return type:
+

DataFrame

+
+
+
+ +
+ +
+
+class imspy.algorithm.rt.predictors.GRURetentionTimePredictor(*args, **kwargs)¶
+

Bases: Model

+
+
+build(input_shape)¶
+

Builds the model based on input shapes received.

+

This is to be used for subclassed models, which do not know at +instantiation time what their inputs look like.

+

This method only exists for users who want to call model.build() in a +standalone way (as a substitute for calling the model on real data to +build it). It will never be called by the framework (and thus it will +never throw unexpected errors in an unrelated workflow).

+
+
Parameters:
+

input_shape – Single tuple, TensorShape instance, or list/dict of +shapes, where shapes are tuples, integers, or TensorShape +instances.

+
+
Raises:
+
    +
  • ValueError –

      +
    1. In case of invalid user-provided data (not of type tuple, + list, TensorShape, or dict). + 2. If the model requires call arguments that are agnostic + to the input shapes (positional or keyword arg in call + signature). + 3. If not all layers were properly built. + 4. If float type inputs are not supported within the layers.

    2. +
    +

  • +
  • In each of these cases, the user should build their model by calling –

  • +
  • it on real tensor data. –

  • +
+
+
+
+ +
+
+call(inputs, training=False)¶
+

Calls the model on new inputs and returns the outputs as tensors.

+

In this case call() just reapplies +all ops in the graph to the new inputs +(e.g. build a new computational graph from the provided inputs).

+

Note: This method should not be called directly. It is only meant to be +overridden when subclassing tf.keras.Model. +To call a model on an input, always use the __call__() method, +i.e. model(inputs), which relies on the underlying call() method.

+
+
Parameters:
+
    +
  • inputs – Input tensor, or dict/list/tuple of input tensors.

  • +
  • training – Boolean or boolean scalar tensor, indicating whether to +run the Network in training mode or inference mode.

  • +
  • mask – A mask or list of masks. A mask can be either a boolean tensor +or None (no mask). For more details, check the guide +[here](https://www.tensorflow.org/guide/keras/masking_and_padding).

  • +
+
+
Returns:
+

A tensor if there is a single output, or +a list of tensors if there are more than one outputs.

+
+
+
+ +
+
+classmethod from_config(config)¶
+

Creates a layer from its config.

+

This method is the reverse of get_config, +capable of instantiating the same layer from the config +dictionary. It does not handle layer connectivity +(handled by Network), nor weights (handled by set_weights).

+
+
Parameters:
+

config – A Python dictionary, typically the +output of get_config.

+
+
Returns:
+

A layer instance.

+
+
+
+ +
+
+get_config()¶
+

Returns the config of the Model.

+

Config is a Python dictionary (serializable) containing the +configuration of an object, which in this case is a Model. This allows +the Model to be be reinstantiated later (without its trained weights) +from this configuration.

+

Note that get_config() does not guarantee to return a fresh copy of +dict every time it is called. The callers should make a copy of the +returned dict if they want to modify it.

+

Developers of subclassed Model are advised to override this method, +and continue to update the dict from super(MyModel, self).get_config() +to provide the proper configuration of this Model. The default config +will return config dict for init parameters if they are basic types. +Raises NotImplementedError when in cases where a custom +get_config() implementation is required for the subclassed model.

+
+
Returns:
+

Python dictionary containing the configuration of this Model.

+
+
+
+ +
+ +
+
+class imspy.algorithm.rt.predictors.PeptideChromatographyApex¶
+

Bases: ABC

+

ABSTRACT INTERFACE for a chromatographic separation for peptides

+
+
+abstract simulate_separation_times(sequences)¶
+
+
Return type:
+

ndarray[Any, dtype[TypeVar(_ScalarType_co, bound= generic, covariant=True)]]

+
+
+
+ +
+
+abstract simulate_separation_times_pandas(data)¶
+
+
Return type:
+

DataFrame

+
+
+
+ +
+ +
+
+imspy.algorithm.rt.predictors.get_rt_prediction_set(tokenizer, sequence)¶
+
+
Return type:
+

DatasetV2

+
+
+
+ +
+
+imspy.algorithm.rt.predictors.get_rt_train_set(tokenizer, sequence, rt)¶
+
+
Return type:
+

DatasetV2

+
+
+
+ +
+
+imspy.algorithm.rt.predictors.load_deep_retention_time_predictor()¶
+
+
Return type:
+

Model

+
+
+
+ +
+
+imspy.algorithm.rt.predictors.predict_retention_time(psm_collection, refine_model=True, verbose=False)¶
+

Predict the retention times for a collection of peptide-spectrum matches +:type psm_collection: List[Psm] +:param psm_collection: a list of peptide-spectrum matches +:type refine_model: bool +:param refine_model: whether to refine the model +:type verbose: bool +:param verbose: whether to print verbose output

+
+
Return type:
+

None

+
+
Returns:
+

None, retention times are set in the peptide-spectrum matches

+
+
+
+ +
+
+

Module contents¶

+
+
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/main/imspy/imspy.chemistry.html b/main/imspy/imspy.chemistry.html new file mode 100644 index 00000000..b05f670d --- /dev/null +++ b/main/imspy/imspy.chemistry.html @@ -0,0 +1,279 @@ + + + + + + + + imspy.chemistry package — imspy 0.2.33 documentation + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

imspy.chemistry package¶

+
+

Submodules¶

+
+
+

imspy.chemistry.amino_acids module¶

+
+
+

imspy.chemistry.constants module¶

+
+
+

imspy.chemistry.elements module¶

+
+
+

imspy.chemistry.mobility module¶

+
+
+imspy.chemistry.mobility.ccs_to_one_over_k0(ccs, mz, charge, mass_gas=28.013, temp=31.85, t_diff=273.15)¶
+

Convert CCS to reduced ion mobility (1/k0).

+
+
Parameters:
+
    +
  • ccs – collision cross-section

  • +
  • mz – mass-over-charge of the ion

  • +
  • charge – charge state of the ion

  • +
  • mass_gas – mass of drift gas

  • +
  • temp – temperature of the drift gas in C°

  • +
  • t_diff – factor to translate from C° to K

  • +
+
+
Returns:
+

reduced ion mobility

+
+
Return type:
+

float

+
+
+
+ +
+
+imspy.chemistry.mobility.one_over_k0_to_ccs(one_over_k0, mz, charge, mass_gas=28.013, temp=31.85, t_diff=273.15)¶
+

Convert reduced ion mobility (1/k0) to CCS.

+
+
Parameters:
+
    +
  • one_over_k0 – reduced ion mobility

  • +
  • mz – mass-over-charge of the ion

  • +
  • charge – charge state of the ion

  • +
  • mass_gas – mass of drift gas

  • +
  • temp – temperature of the drift gas in C°

  • +
  • t_diff – factor to translate from C° to K

  • +
+
+
Returns:
+

collision cross-section

+
+
Return type:
+

float

+
+
+
+ +
+
+

imspy.chemistry.sum_formula module¶

+
+
+class imspy.chemistry.sum_formula.SumFormula(sum_formula)¶
+

Bases: RustWrapperObject

+
+
+property formula: str¶
+
+ +
+
+property formula_dict: dict¶
+
+ +
+
+classmethod from_py_ptr(py_ptr)¶
+
+ +
+
+generate_isotope_distribution(charge)¶
+
+
Return type:
+

MzSpectrum

+
+
+
+ +
+
+get_py_ptr()¶
+
+ +
+
+property monoisotopic_mass: float¶
+
+ +
+ +
+
+

imspy.chemistry.unimod module¶

+
+
+

imspy.chemistry.utility module¶

+
+
+imspy.chemistry.utility.calculate_mz(mass, charge)¶
+

Calculate m/z value.

+
+
Parameters:
+
    +
  • mass (float) – Mass.

  • +
  • charge (int) – Charge.

  • +
+
+
Returns:
+

m/z value.

+
+
Return type:
+

float

+
+
+
+ +
+
+imspy.chemistry.utility.calculate_transmission_dependent_fragment_ion_isotope_distribution(target_spec, complement_spec, transmitted_isotopes, max_isotope)¶
+

Calculate transmission dependent fragment ion isotope distribution.

+
+
Parameters:
+
    +
  • target_spec (MzSpectrum) – Target spectrum.

  • +
  • complement_spec (MzSpectrum) – Complement spectrum.

  • +
  • transmitted_isotopes (MzSpectrum) – Transmitted isotopes.

  • +
  • max_isotope (int) – Maximum isotope.

  • +
+
+
Returns:
+

Transmission dependent fragment ion isotope distribution.

+
+
Return type:
+

MzSpectrum

+
+
+
+ +
+
+

Module contents¶

+
+
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/main/imspy/imspy.data.html b/main/imspy/imspy.data.html new file mode 100644 index 00000000..02bf4498 --- /dev/null +++ b/main/imspy/imspy.data.html @@ -0,0 +1,1305 @@ + + + + + + + + imspy.data package — imspy 0.2.33 documentation + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

imspy.data package¶

+
+

Submodules¶

+
+
+

imspy.data.peptide module¶

+
+
+class imspy.data.peptide.PeptideIon(sequence, charge, intensity, peptide_id=None)¶
+

Bases: RustWrapperObject

+
+
+property atomic_composition¶
+
+ +
+
+calculate_isotopic_spectrum(mass_tolerance=0.001, abundance_threshold=1e-08, max_result=200, intensity_min=0.0001)¶
+

Calculate the isotopic spectrum of the peptide ion.

+
+
Parameters:
+
    +
  • mass_tolerance (float) – The mass tolerance for the isotopic spectrum calculation.

  • +
  • abundance_threshold (float) – The abundance threshold for the isotopic spectrum calculation.

  • +
  • max_result (int) – The maximum number of results to return.

  • +
  • intensity_min (float) – The minimum intensity of the isotopic spectrum.

  • +
+
+
Return type:
+

MzSpectrum

+
+
Returns:
+

The isotopic spectrum of the peptide ion.

+
+
+
+ +
+
+calculate_isotopic_spectrum_annotated(mass_tolerance=0.001, abundance_threshold=1e-08, max_result=200, intensity_min=0.0001)¶
+

Calculate the isotopic spectrum of the peptide ion.

+
+
Parameters:
+
    +
  • mass_tolerance (float) – The mass tolerance for the isotopic spectrum calculation.

  • +
  • abundance_threshold (float) – The abundance threshold for the isotopic spectrum calculation.

  • +
  • max_result (int) – The maximum number of results to return.

  • +
  • intensity_min (float) – The minimum intensity of the isotopic spectrum.

  • +
+
+
Return type:
+

MzSpectrumAnnotated

+
+
Returns:
+

The isotopic spectrum of the peptide ion.

+
+
+
+ +
+
+property charge: int¶
+
+ +
+
+classmethod from_py_ptr(ion)¶
+
+ +
+
+get_py_ptr()¶
+
+ +
+
+property intensity: float¶
+
+ +
+
+property mz: float¶
+
+ +
+
+property peptide_id: None | int¶
+
+ +
+
+property sequence: PeptideSequence¶
+
+ +
+
+to_json()¶
+
+
Return type:
+

str

+
+
+
+ +
+ +
+
+class imspy.data.peptide.PeptideProductIon(kind, sequence, charge=1, intensity=1.0, peptide_id=None)¶
+

Bases: RustWrapperObject

+
+
+atomic_composition()¶
+
+ +
+
+property charge: int¶
+
+ +
+
+classmethod from_py_ptr(product_ion)¶
+
+ +
+
+get_py_ptr()¶
+
+ +
+
+property intensity: float¶
+
+ +
+
+isotope_distribution(mass_tolerance=0.001, abundance_threshold=1e-08, max_result=200, intensity_min=0.0001)¶
+

Calculate the isotope distribution of the product ion.

+
+
Parameters:
+
    +
  • mass_tolerance (float) – The mass tolerance for the isotope distribution calculation.

  • +
  • abundance_threshold (float) – The abundance threshold for the isotope distribution calculation.

  • +
  • max_result (int) – The maximum number of results to return.

  • +
  • intensity_min (float) – The minimum intensity of the isotope distribution.

  • +
+
+
Return type:
+

List[Tuple[float, float]]

+
+
Returns:
+

The isotope distribution of the product ion.

+
+
+
+ +
+
+property kind: str¶
+
+ +
+
+property mono_isotopic_mass: float¶
+
+ +
+
+property mz: float¶
+
+ +
+
+property sequence: str¶
+
+ +
+
+to_json()¶
+
+
Return type:
+

str

+
+
+
+ +
+ +
+
+class imspy.data.peptide.PeptideProductIonSeries(charge, n_ions, c_ions)¶
+

Bases: RustWrapperObject

+
+
+property c_ions: List[PeptideProductIon]¶
+
+ +
+
+property charge: int¶
+
+ +
+
+classmethod from_py_ptr(series)¶
+
+ +
+
+get_py_ptr()¶
+
+ +
+
+property n_ions: List[PeptideProductIon]¶
+
+ +
+
+to_json()¶
+
+
Return type:
+

str

+
+
+
+ +
+ +
+
+class imspy.data.peptide.PeptideProductIonSeriesCollection(series)¶
+

Bases: RustWrapperObject

+
+
+find_series(charge)¶
+

Find the product ion series with the given charge.

+
+
Parameters:
+

charge (int) – The charge of the product ion series.

+
+
Return type:
+

Optional[PeptideProductIonSeries]

+
+
Returns:
+

The product ion series with the given charge, or None if not found.

+
+
+
+ +
+
+classmethod from_py_ptr(collection)¶
+
+ +
+
+generate_isotopic_spectrum(mass_tolerance=0.001, abundance_threshold=1e-06, max_result=2000, intensity_min=1e-06)¶
+

Calculate the isotope distribution of the product ion series collection.

+
+
Parameters:
+
    +
  • mass_tolerance (float) – The mass tolerance for the isotope distribution calculation.

  • +
  • abundance_threshold (float) – The abundance threshold for the isotope distribution calculation.

  • +
  • max_result (int) – The maximum number of results to return.

  • +
  • intensity_min (float) – The minimum intensity of the isotope distribution.

  • +
+
+
Return type:
+

MzSpectrum

+
+
Returns:
+

The isotope distribution of the product ion series collection.

+
+
+
+ +
+
+generate_isotopic_spectrum_annotated(mass_tolerance=0.001, abundance_threshold=1e-06, max_result=2000, intensity_min=1e-06)¶
+

Calculate the isotope distribution of the product ion series collection.

+
+
Parameters:
+
    +
  • mass_tolerance (float) – The mass tolerance for the isotope distribution calculation.

  • +
  • abundance_threshold (float) – The abundance threshold for the isotope distribution calculation.

  • +
  • max_result (int) – The maximum number of results to return.

  • +
  • intensity_min (float) – The minimum intensity of the isotope distribution.

  • +
+
+
Return type:
+

MzSpectrumAnnotated

+
+
Returns:
+

The isotope distribution of the product ion series collection.

+
+
+
+ +
+
+get_py_ptr()¶
+
+ +
+
+property series: List[PeptideProductIonSeries]¶
+
+ +
+
+to_json()¶
+
+
Return type:
+

str

+
+
+
+ +
+ +
+
+class imspy.data.peptide.PeptideSequence(sequence, peptide_id=None)¶
+

Bases: RustWrapperObject

+
+
+property amino_acid_count: int¶
+
+ +
+
+associate_fragment_ion_series_with_prosit_intensities(flat_intensities, charge, fragment_type='b', normalize=True, half_charge_one=True)¶
+

Associate the peptide sequence with predicted intensities from Prosit intensity prediction.

+
+
Parameters:
+
    +
  • flat_intensities (List[float]) – The flat intensities.

  • +
  • TODO (#) – check how charge should be handled

  • +
  • charge (int) – The charge of the product ions.

  • +
  • fragment_type (str) – The type of the product ions, must be one of ‘a’, ‘b’, ‘c’, ‘x’, ‘y’, ‘z’.

  • +
  • normalize (bool) – Whether to normalize the intensities.

  • +
  • half_charge_one (bool) – Whether to use half charge one.

  • +
+
+
Return type:
+

PeptideProductIonSeriesCollection

+
+
Returns:
+

The b and y product ion series of the peptide sequence.

+
+
+
+ +
+
+property atomic_composition¶
+
+ +
+
+calculate_isotopic_product_ion_spectrum_annotated(charge=1, fragment_type='b', mass_tolerance=0.001, abundance_threshold=1e-08, max_result=200, intensity_min=0.0001)¶
+

Calculate the isotopic product ion spectrum of the peptide sequence.

+
+
Parameters:
+
    +
  • intensity_min (float)

  • +
  • max_result (int)

  • +
  • abundance_threshold (float)

  • +
  • mass_tolerance (float)

  • +
  • charge (int) – The charge of the product ions.

  • +
  • fragment_type (str) – The type of the product ions, must be one of ‘a’, ‘b’, ‘c’, ‘x’, ‘y’, ‘z’.

  • +
+
+
Return type:
+

MzSpectrumAnnotated

+
+
Returns:
+

The isotopic product ion spectrum of the peptide sequence.

+
+
+
+ +
+
+calculate_mono_isotopic_product_ion_spectrum(charge=1, fragment_type='b')¶
+

Calculate the mono-isotopic product ion spectrum of the peptide sequence.

+
+
Parameters:
+
    +
  • charge (int) – The charge of the product ions.

  • +
  • fragment_type (str) – The type of the product ions, must be one of ‘a’, ‘b’, ‘c’, ‘x’, ‘y’, ‘z’.

  • +
+
+
Return type:
+

MzSpectrum

+
+
Returns:
+

The mono-isotopic product ion spectrum of the peptide sequence.

+
+
+
+ +
+
+calculate_mono_isotopic_product_ion_spectrum_annotated(charge=1, fragment_type='b')¶
+

Calculate the mono-isotopic product ion spectrum of the peptide sequence.

+
+
Parameters:
+
    +
  • charge (int) – The charge of the product ions.

  • +
  • fragment_type (str) – The type of the product ions, must be one of ‘a’, ‘b’, ‘c’, ‘x’, ‘y’, ‘z’.

  • +
+
+
Return type:
+

MzSpectrumAnnotated

+
+
Returns:
+

The mono-isotopic product ion spectrum of the peptide sequence.

+
+
+
+ +
+
+calculate_product_ion_series(charge=1, fragment_type='b')¶
+

Calculate the b and y product ion series of the peptide sequence.

+
+
Parameters:
+
    +
  • charge (int) – The charge of the product ions.

  • +
  • fragment_type (str) – The type of the product ions, must be one of ‘a’, ‘b’, ‘c’, ‘x’, ‘y’, ‘z’.

  • +
+
+
Return type:
+

Tuple[List[PeptideProductIon], List[PeptideProductIon]]

+
+
Returns:
+

The b and y product ion series of the peptide sequence.

+
+
+
+ +
+
+classmethod from_py_ptr(obj)¶
+
+ +
+
+get_py_ptr()¶
+
+ +
+
+property mono_isotopic_mass: float¶
+
+ +
+
+property peptide_id: None | int¶
+
+ +
+
+property sequence: str¶
+
+ +
+
+to_json()¶
+
+
Return type:
+

str

+
+
+
+ +
+
+to_sage_representation()¶
+
+
Return type:
+

Tuple[str, List[float]]

+
+
+
+ +
+
+to_tokens(group_modifications=True)¶
+
+
Return type:
+

List[str]

+
+
+
+ +
+ +
+
+

imspy.data.spectrum module¶

+
+
+class imspy.data.spectrum.IndexedMzSpectrum(index, mz, intensity)¶
+

Bases: RustWrapperObject

+
+
+property df: DataFrame¶
+

Data.

+
+
Returns:
+

Data.

+
+
Return type:
+

pd.DataFrame

+
+
+
+ +
+
+filter(mz_min=0.0, mz_max=2000.0, intensity_min=0.0, intensity_max=1000000000.0)¶
+

Filter the spectrum for a given m/z range and intensity range.

+
+
Parameters:
+
    +
  • mz_min (float) – Minimum m/z value.

  • +
  • mz_max (float) – Maximum m/z value.

  • +
  • intensity_min (float, optional) – Minimum intensity value. Defaults to 0.0.

  • +
  • intensity_max (float, optional) – Maximum intensity value. Defaults to 1e9.

  • +
+
+
Returns:
+

Filtered spectrum.

+
+
Return type:
+

IndexedMzSpectrum

+
+
+
+ +
+
+classmethod from_py_ptr(spec)¶
+

Create a IndexedMzSpectrum from a PyIndexedMzSpectrum.

+
+
Parameters:
+

spec (pims.PyIndexedMzSpectrum) – PyIndexedMzSpectrum to create the IndexedMzSpectrum from.

+
+
Returns:
+

IndexedMzSpectrum created from the PyIndexedMzSpectrum.

+
+
Return type:
+

IndexedMzSpectrum

+
+
+
+ +
+
+get_py_ptr()¶
+

Get the spec_ptr.

+
+
Returns:
+

spec_ptr.

+
+
Return type:
+

pims.PyIndexedMzSpectrum

+
+
+
+ +
+
+property index: ndarray[Any, dtype[int32]]¶
+

Index.

+
+
Returns:
+

Index.

+
+
Return type:
+

NDArray[np.int32]

+
+
+
+ +
+
+property intensity: ndarray[Any, dtype[float64]]¶
+

Intensity.

+
+
Returns:
+

Intensity.

+
+
Return type:
+

NDArray[np.float64]

+
+
+
+ +
+
+property mz: ndarray[Any, dtype[float64]]¶
+

m/z.

+
+
Returns:
+

m/z.

+
+
Return type:
+

NDArray[np.float64]

+
+
+
+ +
+ +
+
+class imspy.data.spectrum.MzSpectrum(mz, intensity)¶
+

Bases: RustWrapperObject

+
+
+add_mz_noise_normal(noise_ppm)¶
+

Add normal noise to the intensity values of the spectrum.

+
+
Parameters:
+

noise_ppm (float) – Noise ppm, noise will be sampled from a normal distribution with mean 0 and std noise_ppm / 3.0.

+
+
Returns:
+

Spectrum with added noise.

+
+
Return type:
+

MzSpectrum

+
+
+
+ +
+
+add_mz_noise_uniform(noise_ppm, right_drag=False)¶
+

Add uniform noise to the m/z values of the spectrum.

+
+
Parameters:
+
    +
  • noise_ppm (float) – Noise ppm, noise will be sampled from a uniform distribution with mean 0 and std noise_ppm.

  • +
  • right_drag (bool, optional) – If true, the noise will be shifted to the right. Defaults to False.

  • +
+
+
Returns:
+

Spectrum with added noise.

+
+
Return type:
+

MzSpectrum

+
+
+
+ +
+
+property df: DataFrame¶
+

Data.

+
+
Returns:
+

Data.

+
+
Return type:
+

pd.DataFrame

+
+
+
+ +
+
+filter(mz_min=0.0, mz_max=2000.0, intensity_min=0.0, intensity_max=1000000000.0)¶
+

Filter the spectrum for a given m/z range and intensity range.

+
+
Parameters:
+
    +
  • mz_min (float) – Minimum m/z value.

  • +
  • mz_max (float) – Maximum m/z value.

  • +
  • intensity_min (float, optional) – Minimum intensity value. Defaults to 0.0.

  • +
  • intensity_max (float, optional) – Maximum intensity value. Defaults to 1e9.

  • +
+
+
Returns:
+

Filtered spectrum.

+
+
Return type:
+

MzSpectrum

+
+
+
+ +
+
+classmethod from_jsons(jsons)¶
+
+
Return type:
+

MzSpectrum

+
+
+
+ +
+
+classmethod from_mz_spectra_list(spectra_list, resolution)¶
+

Generates a convoluted mass spectrum by adding all spectra in the given list.

+
+
Parameters:
+
    +
  • spectra_list (List[MzSpectrum]) – List of mass spectra.

  • +
  • resolution (int) – Desired resolution of returned spectrum.

  • +
+
+
Returns:
+

Convoluted spectrum.

+
+
Return type:
+

MzSpectrum

+
+
+
+ +
+
+classmethod from_py_ptr(spec)¶
+

Create a MzSpectrum from a PyMzSpectrum.

+
+
Parameters:
+

spec (pims.PyMzSpectrum) – PyMzSpectrum to create the MzSpectrum from.

+
+
Returns:
+

MzSpectrum created from the PyMzSpectrum.

+
+
Return type:
+

MzSpectrum

+
+
+
+ +
+
+get_py_ptr()¶
+

Get the spec_ptr.

+
+
Returns:
+

spec_ptr.

+
+
Return type:
+

pims.PyMzSpectrum

+
+
+
+ +
+
+property intensity: ndarray[Any, dtype[float64]]¶
+

Intensity.

+
+
Returns:
+

Intensity.

+
+
Return type:
+

NDArray[np.float64]

+
+
+
+ +
+
+property mz: ndarray[Any, dtype[float64]]¶
+

m/z.

+
+
Returns:
+

m/z.

+
+
Return type:
+

NDArray[np.float64]

+
+
+
+ +
+
+to_centroided(baseline_noise_level=0.0, sigma=0.1, normalize=True)¶
+

Convert the spectrum to a centroided spectrum.

+
+
Returns:
+

Centroided spectrum.

+
+
Return type:
+

MzSpectrum

+
+
+
+ +
+
+to_jsons()¶
+

generates json string representation of MzSpectrum

+
+
Return type:
+

str

+
+
+
+ +
+
+to_resolution(resolution)¶
+

Bins the spectrum’s m/z values to a +given resolution and sums the intensities.

+
+
Parameters:
+

resolution (int) – Negative decadic logarithm of bin size.

+
+
Returns:
+

A new MzSpectrum where m/z values are binned according to the given resolution.

+
+
Return type:
+

MzSpectrum

+
+
+
+ +
+
+to_windows(window_length=10, overlapping=True, min_num_peaks=5, min_intensity=1)¶
+

Convert the spectrum to a list of windows.

+
+
Parameters:
+
    +
  • window_length (float, optional) – Window length. Defaults to 10.

  • +
  • overlapping (bool, optional) – Whether the windows should overlap. Defaults to True.

  • +
  • min_num_peaks (int, optional) – Minimum number of peaks in a window. Defaults to 5.

  • +
  • min_intensity (float, optional) – Minimum intensity of a peak in a window. Defaults to 1.

  • +
+
+
Returns:
+

List of windows.

+
+
Return type:
+

Tuple[NDArray, List[MzSpectrum]]

+
+
+
+ +
+
+vectorized(resolution=2)¶
+

Convert the spectrum to a vectorized spectrum.

+
+
Parameters:
+

resolution (int, optional) – Resolution. Defaults to 2.

+
+
Returns:
+

Vectorized spectrum.

+
+
Return type:
+

MzSpectrumVectorized

+
+
+
+ +
+ +
+
+class imspy.data.spectrum.MzSpectrumVectorized(indices, values, resolution)¶
+

Bases: RustWrapperObject

+
+
+classmethod from_py_ptr(spec)¶
+

Create a MzSpectrum from a PyMzSpectrum.

+
+
Parameters:
+

spec (pims.PyMzSpectrum) – PyMzSpectrum to create the MzSpectrum from.

+
+
Returns:
+

MzSpectrum created from the PyMzSpectrum.

+
+
Return type:
+

MzSpectrum

+
+
+
+ +
+
+get_py_ptr()¶
+

Get the spec_ptr.

+
+
Returns:
+

spec_ptr.

+
+
Return type:
+

pims.PyMzSpectrumVectorized

+
+
+
+ +
+
+property indices: ndarray[Any, dtype[int32]]¶
+

m/z.

+
+
Returns:
+

m/z.

+
+
Return type:
+

NDArray[np.float64]

+
+
+
+ +
+
+property resolution: float¶
+

Resolution.

+
+
Returns:
+

Resolution.

+
+
Return type:
+

float

+
+
+
+ +
+
+to_centroided(integrate_method=<function get_peak_integral>)¶
+

Convert the spectrum to a centroided spectrum.

+
+
Returns:
+

Centroided spectrum.

+
+
Return type:
+

MzSpectrum

+
+
+
+ +
+
+property values: ndarray[Any, dtype[float64]]¶
+

Intensity.

+
+
Returns:
+

Intensity.

+
+
Return type:
+

NDArray[np.float64]

+
+
+
+ +
+ +
+
+class imspy.data.spectrum.TimsSpectrum(frame_id, scan, retention_time, mobility, ms_type, index, mz, intensity)¶
+

Bases: RustWrapperObject

+
+
+property df: DataFrame¶
+

Data.

+
+
Returns:
+

Data.

+
+
Return type:
+

pd.DataFrame

+
+
+
+ +
+
+filter(mz_min=0.0, mz_max=2000.0, intensity_min=0.0, intensity_max=1000000000.0)¶
+

Filter the spectrum for a given m/z range and intensity range.

+
+
Parameters:
+
    +
  • mz_min (float) – Minimum m/z value.

  • +
  • mz_max (float) – Maximum m/z value.

  • +
  • intensity_min (float, optional) – Minimum intensity value. Defaults to 0.0.

  • +
  • intensity_max (float, optional) – Maximum intensity value. Defaults to 1e9.

  • +
+
+
Returns:
+

Filtered spectrum.

+
+
Return type:
+

TimsSpectrum

+
+
+
+ +
+
+property frame_id: int¶
+

Frame ID.

+
+
Returns:
+

Frame ID.

+
+
Return type:
+

int

+
+
+
+ +
+
+classmethod from_py_ptr(spec)¶
+

Create a TimsSpectrum from a PyTimsSpectrum.

+
+
Parameters:
+

spec (pims.PyTimsSpectrum) – PyTimsSpectrum to create the TimsSpectrum from.

+
+
Returns:
+

TimsSpectrum created from the PyTimsSpectrum.

+
+
Return type:
+

TimsSpectrum

+
+
+
+ +
+
+get_py_ptr()¶
+

Get the spec_ptr.

+
+
Returns:
+

spec_ptr.

+
+
Return type:
+

pims.PyTimsSpectrum

+
+
+
+ +
+
+property index: ndarray[Any, dtype[int32]]¶
+

Index.

+
+
Returns:
+

Index.

+
+
Return type:
+

NDArray[np.int32]

+
+
+
+ +
+
+property intensity: ndarray[Any, dtype[float64]]¶
+

Intensity.

+
+
Returns:
+

Intensity.

+
+
Return type:
+

NDArray[np.float64]

+
+
+
+ +
+
+property mobility: float¶
+

Inverse mobility.

+
+
Returns:
+

Inverse mobility.

+
+
Return type:
+

float

+
+
+
+ +
+
+property ms_type: str¶
+

MS type.

+
+
Returns:
+

MS type.

+
+
Return type:
+

str

+
+
+
+ +
+
+property mz: ndarray[Any, dtype[float64]]¶
+

m/z.

+
+
Returns:
+

m/z.

+
+
Return type:
+

NDArray[np.float64]

+
+
+
+ +
+
+property mz_spectrum: MzSpectrum¶
+

Get the MzSpectrum.

+
+
Returns:
+

Spectrum.

+
+
Return type:
+

MzSpectrum

+
+
+
+ +
+
+property retention_time: float¶
+

Retention time.

+
+
Returns:
+

Retention time.

+
+
Return type:
+

float

+
+
+
+ +
+
+property scan: int¶
+

Scan.

+
+
Returns:
+

Scan.

+
+
Return type:
+

int

+
+
+
+ +
+ +
+
+imspy.data.spectrum.get_peak_integral(peaks, peak_info)¶
+

Calculates the integral of the peaks in a spectrum.

+
+
Parameters:
+
    +
  • peaks (NDArray[np.int32]) – Peak indices.

  • +
  • peak_info (dict) – Peak info.

  • +
+
+
Returns:
+

Peak integrals.

+
+
Return type:
+

NDArray[np.float64]

+
+
+
+ +
+
+

Module contents¶

+
+
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/main/imspy/imspy.html b/main/imspy/imspy.html new file mode 100644 index 00000000..66841afb --- /dev/null +++ b/main/imspy/imspy.html @@ -0,0 +1,125 @@ + + + + + + + + imspy Package — imspy 0.2.33 documentation + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

imspy Package¶

+

The imspy package provides tools for X, Y, and Z. This page introduces the main module and gives an overview of its submodules.

+
+

API Documentation¶

+
+
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/main/imspy/imspy.simulation.html b/main/imspy/imspy.simulation.html new file mode 100644 index 00000000..0493ff6f --- /dev/null +++ b/main/imspy/imspy.simulation.html @@ -0,0 +1,1578 @@ + + + + + + + + imspy.simulation package — imspy 0.2.33 documentation + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

imspy.simulation package¶

+
+

Subpackages¶

+ +
+
+

Submodules¶

+
+
+

imspy.simulation.acquisition module¶

+
+
+class imspy.simulation.acquisition.TimsTofAcquisitionBuilder(path, reference_ds, gradient_length, rt_cycle_length, exp_name='RAW.d')¶
+

Bases: object

+
+
+abstract calculate_frame_types(*args)¶
+
+
Return type:
+

ndarray[Any, dtype[TypeVar(_ScalarType_co, bound= generic, covariant=True)]]

+
+
+
+ +
+
+classmethod from_existing(path, reference_ds)¶
+

Create an instance from existing data without calling __init__.

+
+
Return type:
+

TimsTofAcquisitionBuilder

+
+
+
+ +
+
+generate_frame_table(verbose=True)¶
+
+
Return type:
+

DataFrame

+
+
+
+ +
+
+generate_scan_table(verbose=True)¶
+
+
Return type:
+

DataFrame

+
+
+
+ +
+ +
+
+class imspy.simulation.acquisition.TimsTofAcquisitionBuilderDDA(path, reference_ds, verbose=True, precursor_every=7, gradient_length=7200, rt_cycle_length=0.109, exp_name='RAW.d')¶
+

Bases: TimsTofAcquisitionBuilder, ABC

+
+
+calculate_frame_types(table, precursor_every=7, verbose=True)¶
+
+
Return type:
+

ndarray[Any, dtype[TypeVar(_ScalarType_co, bound= generic, covariant=True)]]

+
+
+
+ +
+ +
+
+class imspy.simulation.acquisition.TimsTofAcquisitionBuilderDIA(path, reference_ds, window_group_file, acquisition_name='dia', exp_name='RAW', verbose=True, precursor_every=17, gradient_length=3000, rt_cycle_length=0.1054, use_reference_ds_layout=True, round_collision_energy=True, collision_energy_decimals=1)¶
+

Bases: TimsTofAcquisitionBuilder, ABC

+
+
+calculate_frame_types(verbose=True)¶
+
+
Return type:
+

ndarray[Any, dtype[TypeVar(_ScalarType_co, bound= generic, covariant=True)]]

+
+
+
+ +
+
+static from_config(path, reference_ds, exp_name, config, verbose=True, use_reference_layout=True, round_collision_energy=True, collision_energy_decimals=1)¶
+
+
Return type:
+

TimsTofAcquisitionBuilderDIA

+
+
+
+ +
+
+classmethod from_existing(path, reference_ds, use_reference_ds_layout=True, verbose=True)¶
+

Create an instance from existing data for DIA without calling __init__.

+
+
Return type:
+

TimsTofAcquisitionBuilderDIA

+
+
+
+ +
+
+generate_frame_to_window_group_table(verbose=True)¶
+
+
Return type:
+

DataFrame

+
+
+
+ +
+ +
+
+

imspy.simulation.annotation module¶

+
+
+class imspy.simulation.annotation.ContributionSource(intensity_contribution, source_type, signal_attributes=None)¶
+

Bases: RustWrapperObject

+
+
+classmethod from_py_ptr(contribution_source)¶
+
+
Return type:
+

ContributionSource

+
+
+
+ +
+
+get_py_ptr()¶
+
+
Return type:
+

PyContributionSource

+
+
+
+ +
+
+property intensity_contribution: float¶
+
+ +
+
+property signal_attributes: None | SignalAttributes¶
+
+ +
+
+property source_type: SourceType¶
+
+ +
+ +
+
+class imspy.simulation.annotation.MzSpectrumAnnotated(mz, intensity, annotations)¶
+

Bases: RustWrapperObject

+
+
+property annotations: list[PeakAnnotation]¶
+
+ +
+
+filter(mz_min=0.0, mz_max=1700.0, intensity_min=0.0, intensity_max=1000000000.0)¶
+
+
Return type:
+

MzSpectrumAnnotated

+
+
+
+ +
+
+classmethod from_py_ptr(mz_spectrum_annotated)¶
+
+
Return type:
+

MzSpectrumAnnotated

+
+
+
+ +
+
+get_py_ptr()¶
+
+
Return type:
+

PyMzSpectrumAnnotated

+
+
+
+ +
+
+property intensity: list[float]¶
+
+ +
+
+property mz: list[float]¶
+
+ +
+ +
+
+class imspy.simulation.annotation.PeakAnnotation(contributions)¶
+

Bases: RustWrapperObject

+
+
+property contributions: list[ContributionSource]¶
+
+ +
+
+classmethod from_py_ptr(peak_annotation)¶
+
+
Return type:
+

PeakAnnotation

+
+
+
+ +
+
+get_py_ptr()¶
+
+
Return type:
+

PyPeakAnnotation

+
+
+
+ +
+ +
+
+class imspy.simulation.annotation.RustWrapperObject¶
+

Bases: ABC

+
+
+abstract classmethod from_py_ptr(obj)¶
+
+ +
+
+abstract get_py_ptr()¶
+
+ +
+ +
+
+class imspy.simulation.annotation.SignalAttributes(charge_state, peptide_id, isotope_peak, description=None)¶
+

Bases: RustWrapperObject

+
+
+property charge_state¶
+
+ +
+
+property description: None | str¶
+
+ +
+
+classmethod from_py_ptr(signal_attributes)¶
+
+
Return type:
+

SignalAttributes

+
+
+
+ +
+
+get_py_ptr()¶
+
+
Return type:
+

PySignalAttributes

+
+
+
+ +
+
+property isotope_peak¶
+
+ +
+
+property peptide_id¶
+
+ +
+ +
+
+class imspy.simulation.annotation.SourceType(source_type)¶
+

Bases: RustWrapperObject

+
+
+classmethod from_py_ptr(source_type)¶
+
+
Return type:
+

SourceType

+
+
+
+ +
+
+get_py_ptr()¶
+
+
Return type:
+

PySourceType

+
+
+
+ +
+
+property source_type: str¶
+
+ +
+ +
+
+class imspy.simulation.annotation.TimsFrameAnnotated(frame_id, retention_time, ms_type, tof, mz, scan, inv_mobility, intensity, annotations)¶
+

Bases: RustWrapperObject

+
+
+property annotations: list[PeakAnnotation]¶
+
+ +
+
+property charge_states_first_only: ndarray[Any, dtype[int]]¶
+
+ +
+
+property df: DataFrame¶
+
+ +
+
+filter(mz_min=0.0, mz_max=1700.0, inv_mobility_min=0.0, inv_mobility_max=4.0, scan_min=0, scan_max=1000, intensity_min=0.0, intensity_max=1000000000.0)¶
+
+
Return type:
+

TimsFrameAnnotated

+
+
+
+ +
+
+property frame_id: int¶
+
+ +
+
+classmethod from_py_ptr(tims_frame_annotated)¶
+
+
Return type:
+

TimsFrameAnnotated

+
+
+
+ +
+
+get_py_ptr()¶
+
+
Return type:
+

PyTimsFrameAnnotated

+
+
+
+ +
+
+property intensity: list[float]¶
+
+ +
+
+property inv_mobility: list[float]¶
+
+ +
+
+property isotope_peaks_first_only: ndarray[Any, dtype[int]]¶
+
+ +
+
+property ms_type: int¶
+
+ +
+
+property ms_type_numeric: int¶
+
+ +
+
+property mz: list[float]¶
+
+ +
+
+property peptide_ids_first_only: ndarray[Any, dtype[int]]¶
+
+ +
+
+property retention_time: float¶
+
+ +
+
+property scan: list[int]¶
+
+ +
+
+property tof: list[int]¶
+
+ +
+ +
+
+

imspy.simulation.experiment module¶

+
+
+class imspy.simulation.experiment.SyntheticExperimentDataHandle(database_path, database_name='synthetic_data.db', verbose=True)¶
+

Bases: object

+
+
+append_table(table_name, table)¶
+
+ +
+
+close()¶
+
+ +
+
+create_table(table_name, table)¶
+
+ +
+
+create_table_sql(sql)¶
+
+ +
+
+get_table(table_name)¶
+
+
Return type:
+

DataFrame

+
+
+
+ +
+
+list_columns(table_name)¶
+
+ +
+
+list_tables()¶
+
+ +
+ +
+
+class imspy.simulation.experiment.SyntheticExperimentDataHandleDIA(database_path, database_name='synthetic_data.db', verbose=True)¶
+

Bases: SyntheticExperimentDataHandle, ABC

+
+
+get_frame_to_window_group()¶
+
+ +
+
+get_window_group_settings()¶
+
+ +
+ +
+
+class imspy.simulation.experiment.TimsTofSyntheticFrameBuilderDIA(db_path, with_annotations=False, num_threads=4)¶
+

Bases: RustWrapperObject

+
+
+build_frame(frame_id, fragment=True, mz_noise_precursor=False, mz_noise_uniform=False, precursor_noise_ppm=5.0, mz_noise_fragment=False, fragment_noise_ppm=5.0, right_drag=True)¶
+

Build a frame.

+
+
Parameters:
+
    +
  • frame_id (int) – Frame ID.

  • +
  • fragment (bool) – if true, frame will undergo synthetic fragmentation if it is a fragment frame,

  • +
  • fragmentation. (otherwise quadrupole isolation will still be applied but no)

  • +
  • mz_noise_precursor (bool) – if true, noise will be added to the precursor m/z values.

  • +
  • mz_noise_uniform (bool) – if true, noise will be added to the precursor m/z values uniformly.

  • +
  • precursor_noise_ppm (float) – PPM of the precursor noise.

  • +
  • mz_noise_fragment (bool) – if true, noise will be added to the fragment m/z values.

  • +
  • fragment_noise_ppm (float) – PPM of the fragment noise.

  • +
  • right_drag (bool) – if true, the noise will be shifted to the right.

  • +
+
+
Returns:
+

Frame.

+
+
Return type:
+

TimsFrame

+
+
+
+ +
+
+build_frame_annotated(frame_id, fragment=True, mz_noise_precursor=False, mz_noise_uniform=False, precursor_noise_ppm=5.0, mz_noise_fragment=False, fragment_noise_ppm=5.0, right_drag=True)¶
+

Build a frame. The frame will be annotated.

+
+
Parameters:
+
    +
  • frame_id (int) – Frame ID.

  • +
  • fragment (bool) – if true, frame will undergo synthetic fragmentation if it is a fragment frame,

  • +
  • fragmentation. (otherwise quadrupole isolation will still be applied but no)

  • +
  • mz_noise_precursor (bool) – if true, noise will be added to the precursor m/z values.

  • +
  • mz_noise_uniform (bool) – if true, noise will be added to the precursor m/z values uniformly.

  • +
  • precursor_noise_ppm (float) – PPM of the precursor noise.

  • +
  • mz_noise_fragment (bool) – if true, noise will be added to the fragment m/z values.

  • +
  • fragment_noise_ppm (float) – PPM of the fragment noise.

  • +
  • right_drag (bool) – if true, the noise will be shifted to the right.

  • +
+
+
Returns:
+

Frame.

+
+
Return type:
+

TimsFrameAnnotated

+
+
+
+ +
+
+build_frames(frame_ids, fragment=True, mz_noise_precursor=False, mz_noise_uniform=False, precursor_noise_ppm=5.0, mz_noise_fragment=False, fragment_noise_ppm=5.0, right_drag=True, num_threads=4)¶
+

Build frames.

+
+
Parameters:
+
    +
  • frame_ids (List[int]) – Frame IDs.

  • +
  • fragment (bool) – if true, frame will undergo synthetic fragmentation if it is a fragment frame,

  • +
  • fragmentation. (otherwise quadrupole isolation will still be applied but no)

  • +
  • mz_noise_precursor (bool) – if true, noise will be added to the precursor m/z values.

  • +
  • mz_noise_uniform (bool) – if true, noise will be added to the precursor m/z values uniformly.

  • +
  • precursor_noise_ppm (float) – PPM of the precursor noise.

  • +
  • mz_noise_fragment (bool) – if true, noise will be added to the fragment m/z values.

  • +
  • fragment_noise_ppm (float) – PPM of the fragment noise.

  • +
  • right_drag (bool) – if true, the noise will be shifted to the right.

  • +
  • num_threads (int) – Number of threads.

  • +
+
+
Returns:
+

Frames.

+
+
Return type:
+

List[TimsFrame]

+
+
+
+ +
+
+build_frames_annotated(frame_ids, fragment=True, mz_noise_precursor=False, mz_noise_uniform=False, precursor_noise_ppm=5.0, mz_noise_fragment=False, fragment_noise_ppm=5.0, right_drag=True, num_threads=4)¶
+

Build frames. The frames will be annotated.

+
+
Parameters:
+
    +
  • frame_ids (List[int]) – Frame IDs.

  • +
  • fragment (bool) – if true, frame will undergo synthetic fragmentation if it is a fragment frame,

  • +
  • fragmentation. (otherwise quadrupole isolation will still be applied but no)

  • +
  • mz_noise_precursor (bool) – if true, noise will be added to the precursor m/z values.

  • +
  • mz_noise_uniform (bool) – if true, noise will be added to the precursor m/z values uniformly.

  • +
  • precursor_noise_ppm (float) – PPM of the precursor noise.

  • +
  • mz_noise_fragment (bool) – if true, noise will be added to the fragment m/z values.

  • +
  • fragment_noise_ppm (float) – PPM of the fragment noise.

  • +
  • right_drag (bool) – if true, the noise will be shifted to the right.

  • +
  • num_threads (int) – Number of threads.

  • +
+
+
Returns:
+

Frames.

+
+
Return type:
+

List[TimsFrameAnnotated]

+
+
+
+ +
+
+count_number_transmissions(peptide_id, charge)¶
+
+
Return type:
+

(int, int)

+
+
+
+ +
+
+count_number_transmissions_parallel(peptide_ids, charges, num_threads=4)¶
+
+
Return type:
+

List[Tuple[int, int]]

+
+
+
+ +
+
+classmethod from_py_ptr(py_ptr)¶
+

Create a TimsTofSyntheticFrameBuilderDIA from a PyTimsTofSyntheticsFrameBuilderDIA.

+
+
Parameters:
+

py_ptr (ims.PyTimsTofSyntheticsFrameBuilderDIA) – PyTimsTofSyntheticsFrameBuilderDIA.

+
+
Returns:
+

TimsTofSyntheticFrameBuilderDIA.

+
+
Return type:
+

TimsTofSyntheticFrameBuilderDIA

+
+
+
+ +
+
+get_collision_energies(frame_ids, scan_ids)¶
+
+
Return type:
+

List[float]

+
+
+
+ +
+
+get_collision_energy(frame_id, scan_id)¶
+
+
Return type:
+

float

+
+
+
+ +
+
+get_ion_transmission_matrix(peptide_id, charge, include_precursor_frames=False)¶
+
+
Return type:
+

ndarray[Any, dtype[TypeVar(_ScalarType_co, bound= generic, covariant=True)]]

+
+
+
+ +
+
+get_py_ptr()¶
+
+
Return type:
+

PyTimsTofSyntheticsFrameBuilderDIA

+
+
+
+ +
+ +
+
+class imspy.simulation.experiment.TimsTofSyntheticPrecursorFrameBuilder(db_path)¶
+

Bases: RustWrapperObject

+
+
+build_precursor_frame(frame_id, mz_noise_precursor=False, mz_noise_uniform=False, precursor_noise_ppm=5.0, right_drag=True)¶
+
+
Return type:
+

TimsFrame

+
+
+
+ +
+
+build_precursor_frame_annotated(frame_id, mz_noise_precursor=False, mz_noise_uniform=False, precursor_noise_ppm=5.0, right_drag=True)¶
+
+
Return type:
+

TimsFrameAnnotated

+
+
+
+ +
+
+build_precursor_frames(frame_ids, mz_noise_precursor=False, mz_noise_uniform=False, precursor_noise_ppm=5.0, right_drag=True, num_threads=4)¶
+
+ +
+
+build_precursor_frames_annotated(frame_ids, mz_noise_precursor=False, mz_noise_uniform=False, precursor_noise_ppm=5.0, right_drag=True, num_threads=4)¶
+
+
Return type:
+

List[TimsFrameAnnotated]

+
+
+
+ +
+
+classmethod from_py_ptr(py_ptr)¶
+
+
Return type:
+

TimsTofSyntheticPrecursorFrameBuilder

+
+
+
+ +
+
+get_py_ptr()¶
+
+
Return type:
+

PyTimsTofSyntheticsPrecursorFrameBuilder

+
+
+
+ +
+ +
+
+

imspy.simulation.feature module¶

+
+
+

imspy.simulation.handle module¶

+
+
+class imspy.simulation.handle.TimsTofSyntheticsDataHandleRust(path)¶
+

Bases: object

+
+
+get_py_ptr()¶
+
+ +
+
+get_transmitted_ions(num_threads=4)¶
+
+
Return type:
+

DataFrame

+
+
+
+ +
+ +
+
+

imspy.simulation.isotopes module¶

+
+
+

imspy.simulation.noise module¶

+

This module contains several noise models, +such as detection noise, shot noise and baseline noise.

+
+
+imspy.simulation.noise.baseline_noise()¶
+
+ +
+
+imspy.simulation.noise.baseline_shot_noise(spectrum, window_size=50, expected_noise_peaks_per_Th=10, min_intensity=5, resolution=3)¶
+
+ +
+
+imspy.simulation.noise.baseline_shot_noise_window(window, window_theoretical_mz_min, window_theoretical_mz_max, expected_noise_peaks=5, expected_noise_intensity=10, expected_noise_sigma=0.001, resolution=3)¶
+
+
Return type:
+

MzSpectrum

+
+
+
+ +
+
+imspy.simulation.noise.detection_noise(signal, method='poisson', custom_mu_function=None, custom_sigma_function=None)¶
+
+
Parameters:
+
    +
  • signal (Union[_SupportsArray[dtype[Any]], _NestedSequence[_SupportsArray[dtype[Any]]], bool, int, float, complex, str, bytes, _NestedSequence[Union[bool, int, float, complex, str, bytes]]])

  • +
  • method (str)

  • +
  • custom_mu_function (Optional[Callable])

  • +
  • custom_sigma_function (Optional[Callable])

  • +
+
+
Return type:
+

Union[_SupportsArray[dtype[Any]], _NestedSequence[_SupportsArray[dtype[Any]]], bool, int, float, complex, str, bytes, _NestedSequence[Union[bool, int, float, complex, str, bytes]]]

+
+
+
+ +
+
+imspy.simulation.noise.generate_noise_peak(pos, sigma, intensity, min_intensity=0, resolution=3)¶
+
+ +
+
+imspy.simulation.noise.mu_function_normal_default(intensity)¶
+
+
Return type:
+

Union[_SupportsArray[dtype[Any]], _NestedSequence[_SupportsArray[dtype[Any]]], bool, int, float, complex, str, bytes, _NestedSequence[Union[bool, int, float, complex, str, bytes]]]

+
+
+
+ +
+
+imspy.simulation.noise.mu_function_poisson_default(intensity)¶
+
+
Return type:
+

Union[_SupportsArray[dtype[Any]], _NestedSequence[_SupportsArray[dtype[Any]]], bool, int, float, complex, str, bytes, _NestedSequence[Union[bool, int, float, complex, str, bytes]]]

+
+
+
+ +
+
+imspy.simulation.noise.sigma_function_normal_default(intensity)¶
+
+
Return type:
+

Union[_SupportsArray[dtype[Any]], _NestedSequence[_SupportsArray[dtype[Any]]], bool, int, float, complex, str, bytes, _NestedSequence[Union[bool, int, float, complex, str, bytes]]]

+
+
+
+ +
+
+

imspy.simulation.proteome module¶

+
+
+class imspy.simulation.proteome.PeptideDigest(fasta_path, missed_cleavages=2, min_len=7, max_len=50, cleave_at='KR', restrict='P', generate_decoys=False, c_terminal=True, verbose=True, variable_mods={'M': ['[UNIMOD:35]'], '[': ['[UNIMOD:1]']}, static_mods={'C': '[UNIMOD:4]'})¶
+

Bases: object

+
+ +
+
+

imspy.simulation.tdf module¶

+
+
+class imspy.simulation.tdf.TDFWriter(helper_handle, path='./', exp_name='RAW.d', offset_bytes=64)¶
+

Bases: object

+
+
+build_frame_meta_row(frame, scan_mode, frame_start_pos, only_frame_one=False)¶
+

Build a row for the frame meta data table from a TimsFrame object. +:type frame: TimsFrame +:param frame: TimsFrame object +:type scan_mode: int +:param scan_mode: int +:type frame_start_pos: int +:param frame_start_pos: int +:type only_frame_one: bool +:param only_frame_one: bool

+
+ +
+
+compress_frame(frame, only_frame_one=False)¶
+

Compress a single frame using zstd. +:type frame: TimsFrame +:param frame: TimsFrame object +:type only_frame_one: bool +:param only_frame_one: bool

+
+
Returns:
+

compressed data

+
+
Return type:
+

bytes

+
+
+
+ +
+
+get_frame_meta_data()¶
+
+
Return type:
+

DataFrame

+
+
+
+ +
+
+inv_mobility_to_scan(frame_id, inv_mobs)¶
+

Convert inverse mobility values to scan values for a given frame using the helper handle. +# CAUTION: This will use the calibration data from the reference handle.

+
+ +
+
+mz_to_tof(frame_id, mzs)¶
+

Convert m/z values to TOF values for a given frame using the helper handle. +# CAUTION: This will use the calibration data from the reference handle.

+
+ +
+
+scan_to_inv_mobility(frame_id, scans)¶
+

Convert scan values to inverse mobility values for a given frame using the helper handle. +# CAUTION: This will use the calibration data from the reference handle.

+
+ +
+
+tof_to_mz(frame_id, tofs)¶
+

Convert TOF values to m/z values for a given frame using the helper handle. +# CAUTION: This will use the calibration data from the reference handle.

+
+ +
+
+write_dia_ms_ms_info(dia_ms_ms_info)¶
+
+
Return type:
+

None

+
+
+
+ +
+
+write_dia_ms_ms_windows(dia_ms_ms_windows)¶
+
+
Return type:
+

None

+
+
+
+ +
+
+write_frame(frame, scan_mode, only_frame_one=False)¶
+

Write a single frame to the binary file. +:type frame: TimsFrame +:param frame: TimsFrame object +:type scan_mode: int +:param scan_mode: int +:type only_frame_one: bool +:param only_frame_one: bool

+
+
Return type:
+

None

+
+
+
+ +
+
+write_frame_meta_data()¶
+
+
Return type:
+

None

+
+
+
+ +
+ +
+
+

imspy.simulation.utility module¶

+
+
+imspy.simulation.utility.accumulated_intensity_cdf_numba(sample_start, sample_end, mean, std_dev)¶
+

Calculate the accumulated intensity between two points using the custom CDF.

+
+ +
+
+imspy.simulation.utility.add_uniform_noise(rt_abu, noise_level=1.0)¶
+
+ +
+
+imspy.simulation.utility.calculate_b_y_fragment_mz(sequence, modifications, is_y=False, charge=1)¶
+

Calculate the m/z value of a b or y fragment. +:type sequence: str +:param sequence: the peptide sequence +:type modifications: ndarray[Any, dtype[TypeVar(_ScalarType_co, bound= generic, covariant=True)]] +:param modifications: potential modifications +:type is_y: bool +:param is_y: is the fragment a y ion +:type charge: int +:param charge: the charge state of the peptide precursor

+
+
Return type:
+

float

+
+
Returns:
+

m/z value of the fragment

+
+
+
+ +
+
+imspy.simulation.utility.calculate_b_y_ion_series_ims(sequence, modifications, charge=1)¶
+

Calculate the b and y ion series for a given peptide sequence. +:type sequence: str +:param sequence: the peptide sequence +:type modifications: ndarray[Any, dtype[TypeVar(_ScalarType_co, bound= generic, covariant=True)]] +:param modifications: potential modifications +:type charge: int +:param charge: the charge state of the peptide precursor

+
+
Return type:
+

Tuple[List, List]

+
+
Returns:
+

b ion series, y ion series

+
+
+
+ +
+
+imspy.simulation.utility.calculate_bounds_numba(mean, std, z_score)¶
+

Calculate the bounds of a normal distribution for a given z-score.

+
+
Parameters:
+
    +
  • mean (float) – Mean of the normal distribution

  • +
  • std (float) – Standard deviation of the normal distribution

  • +
  • z_score (float) – Z-score of the normal distribution

  • +
+
+
Returns:
+

Lower bound of the normal distribution

+
+
Return type:
+

float

+
+
+
+ +
+
+imspy.simulation.utility.calculate_mobility_spacing(mobility_min, mobility_max, num_scans)¶
+

Calculate the amount of mobility that will be occupied by a single scan

+
+
Parameters:
+
    +
  • mobility_min (float) – Minimum mobility value

  • +
  • mobility_max (float) – Maximum mobility value

  • +
  • num_scans (int) – Number of scans that will be taken during the acquisition

  • +
+
+
Returns:
+

Mobility spacing

+
+
Return type:
+

float

+
+
+
+ +
+
+imspy.simulation.utility.calculate_number_frames(gradient_length, rt_cycle_length)¶
+

Calculate the number of frames that will be taken during the acquisition

+
+
Parameters:
+
    +
  • gradient_length (float) – Length of the gradient in seconds

  • +
  • rt_cycle_length (float) – Length of the RT cycle in seconds

  • +
+
+
Returns:
+

Number of frames that will be taken during the acquisition

+
+
Return type:
+

int

+
+
+
+ +
+
+imspy.simulation.utility.custom_cdf(x, mean, std_dev)¶
+

Custom implementation of the CDF for a normal distribution.

+
+ +
+
+imspy.simulation.utility.flat_intensity_to_sparse(intensity_flat, num_elements=174)¶
+
+ +
+
+imspy.simulation.utility.flatten_prosit_array(array)¶
+
+ +
+
+imspy.simulation.utility.generate_events(n, mean, min_val, max_val, mixture_contribution=1.0)¶
+
+ +
+
+imspy.simulation.utility.get_acquisition_builder_resource_path(acquisition_mode='dia')¶
+

Get the path to a pretrained model

+
+
Parameters:
+

acquisition_mode (str) – The name of the model to load

+
+
Return type:
+

Traversable

+
+
Returns:
+

The path to the pretrained model

+
+
+
+ +
+
+imspy.simulation.utility.get_compressible_data(tofs, scans, intensities, num_scans)¶
+
+ +
+
+imspy.simulation.utility.get_dilution_factors(path=None)¶
+
+
Return type:
+

Dict[str, float]

+
+
+
+ +
+
+imspy.simulation.utility.get_fasta_file_paths(fasta_path)¶
+

Check if the provided fasta path is a folder or file, if its a folder, check if it exists and return all fasta +:type fasta_path: +:param fasta_path: Path to the fasta file or folder containing fasta files

+
+
Return type:
+

Dict[str, str]

+
+
Returns:
+

List of fasta file paths

+
+
+
+ +
+
+imspy.simulation.utility.get_frames_numba(rt_value, times_array, std_rt, z_score)¶
+

Get the frames that will be acquired for a given retention time value. +:type rt_value: +:param rt_value: Retention time value +:type rt_value: float +:type times_array: +:param times_array: Array of retention times +:type times_array: NDArray +:type std_rt: +:param std_rt: Standard deviation of the retention time +:type std_rt: float +:type z_score: +:param z_score: Z-score of the normal distribution +:type z_score: float

+
+
Returns:
+

Array of frame indices

+
+
Return type:
+

NDArray

+
+
+
+ +
+
+imspy.simulation.utility.get_ms_ms_window_layout_resource_path(acquisition_mode)¶
+

Get the path to a pretrained model

+
+
Return type:
+

Traversable

+
+
Returns:
+

The path to the pretrained model

+
+
+
+ +
+
+imspy.simulation.utility.get_native_dataset_path(ds_name='NATIVE.d')¶
+

Get the path to a pretrained model

+
+
Parameters:
+

ds_name (str) – The name of the dataset to load

+
+
Return type:
+

str

+
+
Returns:
+

The path to the pretrained model

+
+
+
+ +
+
+imspy.simulation.utility.get_peak_cnts(total_scans, scans)¶
+
+ +
+
+imspy.simulation.utility.get_realdata(peak_cnts, interleaved)¶
+
+ +
+
+imspy.simulation.utility.get_realdata_loop(peak_cnts, interleaved, back_data, real_data)¶
+
+ +
+
+imspy.simulation.utility.get_scans_numba(im_value, ims_array, scans_array, std_im, z_score)¶
+

Get the scans that will be acquired for a given ion mobility value.

+
+ +
+
+imspy.simulation.utility.get_z_score_for_percentile(target_score=0.95)¶
+
+ +
+
+imspy.simulation.utility.irt_to_rts_numba(irt, new_min=0, new_max=120)¶
+

Scale an array of values from the original range (min_val, max_val) to a new range (new_min, new_max).

+
+
Parameters:
+
    +
  • irt (NDArray) – Array of values to be scaled.

  • +
  • new_min (float) – Minimum value of the new range.

  • +
  • new_max (float) – Maximum value of the new range.

  • +
+
+
Returns:
+

Array of scaled values.

+
+
Return type:
+

NDArray

+
+
+
+ +
+
+imspy.simulation.utility.json_string_to_python_list(json_string)¶
+
+ +
+
+imspy.simulation.utility.modify_tofs(tofs, scans)¶
+
+ +
+
+imspy.simulation.utility.np_zip(xx, yy)¶
+
+ +
+
+imspy.simulation.utility.python_list_to_json_string(lst, as_float=True, num_decimals=4)¶
+
+
Return type:
+

str

+
+
+
+ +
+
+imspy.simulation.utility.read_acquisition_config(acquisition_name='dia')¶
+
+
Return type:
+

Dict[str, Any]

+
+
+
+ +
+
+imspy.simulation.utility.sequence_to_all_ions(sequence, charge, intensities_flat, normalized=True, half_charge_one=True)¶
+

Simulate ion intensities for a peptide sequence, charge, and collision energy. +:type sequence: str +:param sequence: Peptide sequence +:type charge: int +:param charge: Peptide charge +:type intensities_flat: List[float] +:param intensities_flat: List of intensities +:type normalized: bool +:param normalized: Whether to normalize the intensities +:type half_charge_one: bool +:param half_charge_one: Whether to divide the intensity by 2 if the charge is 1

+
+
Returns:
+

Array of ion intensities

+
+
Return type:
+

NDArray

+
+
+
+ +
+
+imspy.simulation.utility.sequence_to_numpy(sequence, max_length=30)¶
+

translate a peptide sequence given as python string into a numpy array of characters with a fixed length +:type sequence: str +:param sequence: the peptide sequence +:type max_length: int +:param max_length: the maximum length a sequence can have

+
+
Return type:
+

ndarray[Any, dtype[TypeVar(_ScalarType_co, bound= generic, covariant=True)]]

+
+
Returns:
+

numpy array of characters

+
+
+
+ +
+
+imspy.simulation.utility.sequences_to_all_ions(sequences, charges, intensities_flat, normalized=True, half_charge_one=True, num_threads=4)¶
+

Simulate ion intensities for a list of peptide sequences, charges, and collision energies. +:type sequences: List[str] +:param sequences: List of peptide sequences +:type charges: List[int] +:param charges: List of peptide charges +:type intensities_flat: List[List[float]] +:param intensities_flat: List of intensities +:type normalized: bool +:param normalized: Whether to normalize the intensities +:type half_charge_one: bool +:param half_charge_one: Whether to divide the intensity by 2 if the charge is 1 +:type num_threads: int +:param num_threads: Number of threads to use for the calculation

+
+
Returns:
+

Array of ion intensities

+
+
Return type:
+

NDArray

+
+
+
+ +
+
+imspy.simulation.utility.set_percentage_to_zero(row, percentage)¶
+

Sets a given percentage of the non-zero elements of a numpy vector to zero, +where the probability of being set to 0 is inversely proportional to the element’s value +relative to other values in the vector.

+
+
Parameters:
+
    +
  • row (np.ndarray) – Input vector of arbitrary length

  • +
  • percentage (float) – Percentage of non-zero elements to set to zero (between 0 and 1)

  • +
+
+
Returns:
+

Modified vector with the specified percentage of non-zero elements set to zero

+
+
Return type:
+

np.ndarray

+
+
+
+ +
+
+

Module contents¶

+
+
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/main/imspy/imspy.simulation.timsim.html b/main/imspy/imspy.simulation.timsim.html new file mode 100644 index 00000000..c809754a --- /dev/null +++ b/main/imspy/imspy.simulation.timsim.html @@ -0,0 +1,198 @@ + + + + + + + + imspy.simulation.timsim package — imspy 0.2.33 documentation + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

imspy.simulation.timsim package¶

+
+

Subpackages¶

+ +
+
+

Submodules¶

+
+
+

imspy.simulation.timsim.simulator module¶

+
+
+

Module contents¶

+
+
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/main/imspy/imspy.simulation.timsim.jobs.html b/main/imspy/imspy.simulation.timsim.jobs.html new file mode 100644 index 00000000..d5316d7f --- /dev/null +++ b/main/imspy/imspy.simulation.timsim.jobs.html @@ -0,0 +1,518 @@ + + + + + + + + imspy.simulation.timsim.jobs package — imspy 0.2.33 documentation + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

imspy.simulation.timsim.jobs package¶

+
+

Submodules¶

+
+
+

imspy.simulation.timsim.jobs.add_noise_from_real_data module¶

+
+
+imspy.simulation.timsim.jobs.add_noise_from_real_data.add_real_data_noise_to_frames(acquisition_builder, frames, intensity_max_precursor=30, intensity_max_fragment=30, precursor_sample_fraction=0.2, fragment_sample_fraction=0.2, num_precursor_frames=5, num_fragment_frames=5)¶
+

Add noise to frame.

+
+
Parameters:
+
    +
  • acquisition_builder (TimsTofAcquisitionBuilderDIA) – Acquisition builder.

  • +
  • frames (List[TimsFrame]) – Frames.

  • +
  • intensity_max_precursor (float) – Maximum intensity for precursor.

  • +
  • intensity_max_fragment (float) – Maximum intensity for fragment.

  • +
  • precursor_sample_fraction (float) – Sample fraction for precursor.

  • +
  • fragment_sample_fraction (float) – Sample fraction for fragment.

  • +
  • num_precursor_frames (int) – Number of precursor frames.

  • +
  • num_fragment_frames (int) – Number of fragment frames.

  • +
+
+
Returns:
+

Frames.

+
+
Return type:
+

List[TimsFrame]

+
+
+
+ +
+
+

imspy.simulation.timsim.jobs.assemble_frames module¶

+
+
+imspy.simulation.timsim.jobs.assemble_frames.assemble_frames(acquisition_builder, frames, batch_size, verbose=False, mz_noise_precursor=False, mz_noise_uniform=False, precursor_noise_ppm=5.0, mz_noise_fragment=False, fragment_noise_ppm=5.0, num_threads=4, add_real_data_noise=False, intensity_max_precursor=150, intensity_max_fragment=75, precursor_sample_fraction=0.01, fragment_sample_fraction=0.05, num_precursor_frames=10, num_fragment_frames=10, fragment=True)¶
+

Assemble frames from frame ids and write them to the database.

+
+
Parameters:
+
    +
  • acquisition_builder (TimsTofAcquisitionBuilderDIA) – Acquisition builder object.

  • +
  • frames (DataFrame) – DataFrame containing frame ids.

  • +
  • batch_size (int) – Batch size for frame assembly, i.e. how many frames are assembled at once.

  • +
  • verbose (bool) – Verbosity.

  • +
  • mz_noise_precursor (bool) – Add noise to precursor m/z values.

  • +
  • mz_noise_uniform (bool) – Add uniform noise to m/z values.

  • +
  • precursor_noise_ppm (float) – PPM value for precursor noise.

  • +
  • mz_noise_fragment (bool) – Add noise to fragment m/z values.

  • +
  • fragment_noise_ppm (float) – PPM value for fragment noise.

  • +
  • num_threads (int) – Number of threads for frame assembly.

  • +
  • add_real_data_noise (bool) – Add real data noise to the frames.

  • +
  • intensity_max_precursor (float) – Maximum intensity for precursor noise.

  • +
  • intensity_max_fragment (float) – Maximum intensity for fragment noise.

  • +
  • precursor_sample_fraction (float) – Sample fraction for precursor noise.

  • +
  • fragment_sample_fraction (float) – Sample fraction for fragment noise.

  • +
  • num_precursor_frames (int) – Number of precursor frames.

  • +
  • num_fragment_frames (int) – Number of fragment frames.

  • +
  • fragment (bool) – if False, Quadrupole isolation will still be used, but no fragmentation will be performed.

  • +
+
+
Return type:
+

None

+
+
Returns:
+

None, writes frames to disk and metadata to database.

+
+
+
+ +
+
+

imspy.simulation.timsim.jobs.build_acquisition module¶

+
+
+imspy.simulation.timsim.jobs.build_acquisition.build_acquisition(path, reference_path, exp_name, acquisition_type='dia', verbose=False, gradient_length=None, use_reference_ds_layout=True, reference_in_memory=True, round_collision_energy=True, collision_energy_decimals=0, use_bruker_sdk=True)¶
+

Build acquisition object from reference path.

+
+
Parameters:
+
    +
  • path (str) – Path where the acquisition will be saved.

  • +
  • reference_path (str) – Path to the reference dataset.

  • +
  • exp_name (str) – Experiment name.

  • +
  • acquisition_type (str) – Acquisition type, must be ‘dia’, ‘midia’, ‘slice’ or ‘synchro’.

  • +
  • verbose (bool) – Verbosity.

  • +
  • gradient_length (float) – Gradient length.

  • +
  • use_reference_ds_layout (bool) – Use reference dataset layout for synthetic dataset.

  • +
  • reference_in_memory (bool) – Load reference dataset into memory.

  • +
  • round_collision_energy (bool) – Round collision energy.

  • +
  • collision_energy_decimals (int) – Number of decimals for collision energy (controls coarseness).

  • +
  • use_bruker_sdk (bool) – Use Bruker SDK for reading reference dataset.

  • +
+
+
Returns:
+

Acquisition object.

+
+
Return type:
+

TimsTofAcquisitionBuilderDIA

+
+
+
+ +
+
+

imspy.simulation.timsim.jobs.digest_fasta module¶

+
+
+imspy.simulation.timsim.jobs.digest_fasta.digest_fasta(fasta_file_path, missed_cleavages=2, min_len=6, max_len=30, cleave_at='KR', restrict=None, decoys=False, verbose=False, job_name='digest_fasta', static_mods={'C': '[UNIMOD:4]'}, variable_mods={'M': ['[UNIMOD:35]'], '[': ['[UNIMOD:1]']}, exclude_accumulated_gradient_start=True, min_rt_percent=2.0, gradient_length=3600)¶
+

Digest a fasta file.

+
+
Parameters:
+
    +
  • fasta_file_path (str) – Path to the fasta file.

  • +
  • missed_cleavages (int) – Number of missed cleavages.

  • +
  • min_len (int) – Minimum peptide length.

  • +
  • max_len (int) – Maximum peptide length.

  • +
  • cleave_at (str) – Cleavage sites.

  • +
  • restrict (str) – Restrict to specific proteins.

  • +
  • decoys (bool) – Generate decoys.

  • +
  • verbose (bool) – Verbosity.

  • +
  • job_name (str) – Job name.

  • +
  • static_mods (dict[str, str]) – Static modifications.

  • +
  • variable_mods (dict[str, list[str]]) – Variable modifications.

  • +
  • exclude_accumulated_gradient_start (bool) – Exclude low retention times.

  • +
  • min_rt_percent (float) – Minimum retention time in percent.

  • +
  • gradient_length (float) – Gradient length in seconds (in seconds).

  • +
+
+
Returns:
+

Peptide digest object.

+
+
Return type:
+

PeptideDigest

+
+
+
+ +
+
+

imspy.simulation.timsim.jobs.simulate_charge_states module¶

+
+
+imspy.simulation.timsim.jobs.simulate_charge_states.simulate_charge_states(peptides, mz_lower, mz_upper, p_charge=0.5, charge_state_one_probability=0.0, min_charge_contrib=0.15)¶
+

Simulate charge states for peptides.

+
+
Parameters:
+
    +
  • peptides (DataFrame) – Peptides DataFrame.

  • +
  • mz_lower (float) – Lower m/z value.

  • +
  • mz_upper (float) – Upper m/z value.

  • +
  • p_charge (float) – Probability of charge.

  • +
  • charge_state_one_probability (float) – Probability of charge state one.

  • +
  • min_charge_contrib (float) – Minimum charge contribution.

  • +
+
+
Returns:
+

Ions DataFrame.

+
+
Return type:
+

pd.DataFrame

+
+
+
+ +
+
+

imspy.simulation.timsim.jobs.simulate_fragment_intensities module¶

+
+
+imspy.simulation.timsim.jobs.simulate_fragment_intensities.simulate_fragment_intensities(path, name, acquisition_builder, batch_size, verbose, num_threads, down_sample_factor=0.5)¶
+

Simulate fragment ion intensity distributions.

+
+
Parameters:
+
    +
  • path (str) – Path to the synthetic data.

  • +
  • name (str) – Name of the synthetic data.

  • +
  • acquisition_builder (TimsTofAcquisitionBuilderDIA) – Acquisition builder object.

  • +
  • batch_size (int) – Batch size for frame assembly, i.e. how many frames are assembled at once.

  • +
  • verbose (bool) – Verbosity.

  • +
  • num_threads (int) – Number of threads for frame assembly.

  • +
  • down_sample_factor (int) – Down sample factor for fragment ion intensity distributions.

  • +
+
+
Return type:
+

None

+
+
Returns:
+

None, writes frames to disk and metadata to database.

+
+
+
+ +
+
+

imspy.simulation.timsim.jobs.simulate_frame_distributions module¶

+
+
+imspy.simulation.timsim.jobs.simulate_frame_distributions.simulate_frame_distributions(peptides, frames, z_score, std_rt, rt_cycle_length, verbose=False, add_noise=False, normalize=False)¶
+

Simulate frame distributions for peptides.

+
+
Parameters:
+
    +
  • peptides (DataFrame) – Peptide DataFrame.

  • +
  • frames (DataFrame) – Frame DataFrame.

  • +
  • z_score (float) – Z-score.

  • +
  • std_rt (float) – Standard deviation of retention time.

  • +
  • rt_cycle_length (float) – Retention time cycle length in seconds.

  • +
  • verbose (bool) – Verbosity.

  • +
  • add_noise (bool) – Add noise.

  • +
  • normalize (bool) – Normalize frame abundance.

  • +
+
+
Returns:
+

Peptide DataFrame with frame distributions.

+
+
Return type:
+

pd.DataFrame

+
+
+
+ +
+
+

imspy.simulation.timsim.jobs.simulate_frame_distributions_emg module¶

+
+
+imspy.simulation.timsim.jobs.simulate_frame_distributions_emg.sample_parameters_rejection(sigma_mean, sigma_variance, lambda_mean, lambda_variance, n)¶
+
+ +
+
+imspy.simulation.timsim.jobs.simulate_frame_distributions_emg.simulate_frame_distributions_emg(peptides, frames, mean_std_rt, variance_std_rt, mean_scewness, variance_scewness, target_p, step_size, rt_cycle_length, verbose=False, add_noise=False, normalize=False, n_steps=1000, num_threads=4, from_existing=False, sigmas=None, lambdas=None)¶
+

Simulate frame distributions for peptides.

+
+
Parameters:
+
    +
  • peptides (DataFrame) – Peptide DataFrame.

  • +
  • frames (DataFrame) – Frame DataFrame.

  • +
  • mean_std_rt (float) – mean retention time.

  • +
  • variance_std_rt (float) – variance retention time.

  • +
  • mean_scewness (float) – mean scewness.

  • +
  • variance_scewness (float) – variance scewness.

  • +
  • target_p (float) – target p.

  • +
  • step_size (float) – step size.

  • +
  • rt_cycle_length (float) – Retention time cycle length in seconds.

  • +
  • verbose (bool) – Verbosity.

  • +
  • add_noise (bool) – Add noise.

  • +
  • normalize (bool) – Normalize frame abundance.

  • +
  • n_steps (int) – number of steps.

  • +
  • num_threads (int) – number of threads.

  • +
  • from_existing (bool) – Use existing parameters.

  • +
  • sigmas (ndarray) – sigmas.

  • +
  • lambdas (ndarray) – lambdas.

  • +
+
+
Returns:
+

Peptide DataFrame with frame distributions.

+
+
Return type:
+

pd.DataFrame

+
+
+
+ +
+
+

imspy.simulation.timsim.jobs.simulate_ion_mobilities module¶

+
+
+imspy.simulation.timsim.jobs.simulate_ion_mobilities.simulate_ion_mobilities(ions, im_lower, im_upper, verbose=False)¶
+

Simulate ion mobilities.

+
+
Parameters:
+
    +
  • ions (DataFrame) – Ions DataFrame.

  • +
  • im_lower (float) – Lower ion mobility.

  • +
  • im_upper (float) – Upper ion mobility.

  • +
  • verbose (bool) – Verbosity.

  • +
+
+
Returns:
+

Ions DataFrame.

+
+
Return type:
+

pd.DataFrame

+
+
+
+ +
+
+

imspy.simulation.timsim.jobs.simulate_occurrences module¶

+
+
+imspy.simulation.timsim.jobs.simulate_occurrences.simulate_peptide_occurrences(peptides, intensity_mean, intensity_min, intensity_max, verbose=False, sample_occurrences=True, intensity_value=1000000.0, mixture_contribution=1.0)¶
+

Simulate peptide occurrences.

+
+
Parameters:
+
    +
  • peptides (DataFrame) – Peptides DataFrame.

  • +
  • intensity_mean (float) – Intensity mean.

  • +
  • intensity_min (float) – Intensity minimum.

  • +
  • intensity_max (float) – Intensity maximum.

  • +
  • verbose (bool) – Verbosity.

  • +
  • sample_occurrences (bool) – Sample occurrences.

  • +
  • intensity_value (float) – Intensity value.

  • +
  • mixture_contribution (float) – Mixture contribution.

  • +
+
+
Returns:
+

Peptides DataFrame.

+
+
Return type:
+

pd.DataFrame

+
+
+
+ +
+
+

imspy.simulation.timsim.jobs.simulate_precursor_spectra module¶

+
+
+

imspy.simulation.timsim.jobs.simulate_retention_time module¶

+
+
+imspy.simulation.timsim.jobs.simulate_retention_time.simulate_retention_times(peptides, verbose=False, gradient_length=3600)¶
+

Simulate retention times.

+
+
Parameters:
+
    +
  • peptides (DataFrame) – Peptides DataFrame.

  • +
  • verbose (bool) – Verbosity.

  • +
  • gradient_length (float) – Gradient length in seconds.

  • +
+
+
Returns:
+

Peptides DataFrame.

+
+
Return type:
+

pd.DataFrame

+
+
+
+ +
+
+

imspy.simulation.timsim.jobs.simulate_scan_distributions module¶

+
+
+imspy.simulation.timsim.jobs.simulate_scan_distributions.simulate_scan_distributions(ions, scans, z_score, mean_std_im=0.01, variance_std_im=0.0, verbose=False, add_noise=False, normalize=False, from_existing=False, std_means=None)¶
+

Simulate scan distributions for ions.

+
+
Parameters:
+
    +
  • ions (DataFrame) – Ions DataFrame.

  • +
  • scans (DataFrame) – Scan DataFrame.

  • +
  • z_score (float) – Z-score.

  • +
  • mean_std_im (float) – Standard deviation of ion mobility.

  • +
  • variance_std_im (float) – Variance of standard deviation of ion mobility.

  • +
  • verbose (bool) – Verbosity.

  • +
  • add_noise (bool) – Add noise.

  • +
  • normalize (bool) – Normalize scan abundance.

  • +
  • from_existing (bool) – Use existing parameters.

  • +
  • std_means (ndarray[Any, dtype[TypeVar(_ScalarType_co, bound= generic, covariant=True)]]) – Standard deviations.

  • +
+
+
Returns:
+

Ions DataFrame with scan distributions.

+
+
Return type:
+

pd.DataFrame

+
+
+
+ +
+
+

imspy.simulation.timsim.jobs.utility module¶

+
+
+imspy.simulation.timsim.jobs.utility.check_path(p)¶
+
+
Return type:
+

str

+
+
+
+ +
+
+

Module contents¶

+
+
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/main/imspy/imspy.timstof.dbsearch.html b/main/imspy/imspy.timstof.dbsearch.html new file mode 100644 index 00000000..35cfa180 --- /dev/null +++ b/main/imspy/imspy.timstof.dbsearch.html @@ -0,0 +1,494 @@ + + + + + + + + imspy.timstof.dbsearch package — imspy 0.2.33 documentation + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

imspy.timstof.dbsearch package¶

+
+

Submodules¶

+
+
+

imspy.timstof.dbsearch.imspy_dda module¶

+
+
+imspy.timstof.dbsearch.imspy_dda.create_database(fasta, static, variab, enzyme_builder, generate_decoys, bucket_size, shuffle_decoys=True, keep_ends=True)¶
+
+ +
+
+imspy.timstof.dbsearch.imspy_dda.load_config(config_path)¶
+
+ +
+
+imspy.timstof.dbsearch.imspy_dda.main()¶
+
+ +
+
+

imspy.timstof.dbsearch.imspy_rescore_sage module¶

+
+
+imspy.timstof.dbsearch.imspy_rescore_sage.main()¶
+
+ +
+
+

imspy.timstof.dbsearch.sage_output_utility module¶

+
+
+class imspy.timstof.dbsearch.sage_output_utility.PatternReplacer(replacements, pattern='\\\\[.*?\\\\]')¶
+

Bases: object

+
+
+apply(string)¶
+
+
Return type:
+

str

+
+
+
+ +
+ +
+
+imspy.timstof.dbsearch.sage_output_utility.break_into_equal_size_sets(sequence_set, k=10)¶
+

Breaks a set of objects into k sets of equal size at random.

+
+
Parameters:
+
    +
  • sequence_set – Set of sequences to be divided

  • +
  • k (int) – Number of sets to divide the objects into

  • +
+
+
Returns:
+

A list containing k sets, each with equal number of randomly chosen sequences

+
+
+
+ +
+
+imspy.timstof.dbsearch.sage_output_utility.cosim_from_dict(observed, predicted)¶
+
+ +
+
+imspy.timstof.dbsearch.sage_output_utility.fragments_to_dict(fragments)¶
+
+ +
+
+imspy.timstof.dbsearch.sage_output_utility.generate_training_data(psms, method='psm', q_max=0.01, balance=True)¶
+

Generate training data. +:type psms: DataFrame +:param psms: List of PeptideSpectrumMatch objects +:type method: str +:param method: Method to use for training data generation +:type q_max: float +:param q_max: Maximum q-value allowed for positive examples +:type balance: bool +:param balance: Whether to balance the dataset

+
+
Returns:
+

X_train and Y_train

+
+
Return type:
+

Tuple[NDArray, NDArray]

+
+
+
+ +
+
+imspy.timstof.dbsearch.sage_output_utility.plot_summary(TARGET, DECOY, save_path, dpi=300, file_format='png')¶
+
+ +
+
+imspy.timstof.dbsearch.sage_output_utility.re_score_psms(psms, num_splits=10, verbose=True, balance=True, score='hyperscore', positive_example_q_max=0.01)¶
+

Re-score PSMs using LDA. +:type psms: DataFrame +:param psms: List of PeptideSpectrumMatch objects +:type num_splits: int +:param num_splits: Number of splits +:type verbose: bool +:param verbose: Whether to print progress +:type balance: bool +:param balance: Whether to balance the dataset +:type score: str +:param score: Score to use for re-scoring +:type positive_example_q_max: float +:param positive_example_q_max: Maximum q-value allowed for positive examples

+
+
Returns:
+

List of PeptideSpectrumMatch objects

+
+
Return type:
+

List[PeptideSpectrumMatch]

+
+
+
+ +
+
+imspy.timstof.dbsearch.sage_output_utility.remove_substrings(input_string)¶
+
+
Return type:
+

str

+
+
+
+ +
+
+imspy.timstof.dbsearch.sage_output_utility.row_to_fragment(r)¶
+
+ +
+
+imspy.timstof.dbsearch.sage_output_utility.split_dataframe_randomly(df, n)¶
+
+
Return type:
+

list

+
+
+
+ +
+
+

imspy.timstof.dbsearch.utility module¶

+
+
+imspy.timstof.dbsearch.utility.extract_timstof_dda_data(path, in_memory=False, use_bruker_sdk=False, isolation_window_lower=-3.0, isolation_window_upper=3.0, take_top_n=100, num_threads=16)¶
+

Extract TIMSTOF DDA data from bruker timsTOF TDF file. +:type path: str +:param path: Path to TIMSTOF DDA data +:type in_memory: bool +:param in_memory: Whether to load data in memory +:type use_bruker_sdk: bool +:param use_bruker_sdk: Whether to use bruker SDK for data extraction +:type isolation_window_lower: float +:param isolation_window_lower: Lower bound for isolation window (Da) +:type isolation_window_upper: float +:param isolation_window_upper: Upper bound for isolation window (Da) +:type take_top_n: int +:param take_top_n: Number of top peaks to take +:type num_threads: int +:param num_threads: Number of threads to use

+
+
Returns:
+

DataFrame containing timsTOF DDA data

+
+
Return type:
+

pd.DataFrame

+
+
+
+ +
+
+imspy.timstof.dbsearch.utility.generate_balanced_im_dataset(psms)¶
+
+
Return type:
+

List[Psm]

+
+
+
+ +
+
+imspy.timstof.dbsearch.utility.generate_balanced_rt_dataset(psms)¶
+
+
Return type:
+

List[Psm]

+
+
+
+ +
+
+imspy.timstof.dbsearch.utility.generate_training_data(psms, method='psm', q_max=0.01, balance=True)¶
+

Generate training data. +:type psms: List[Psm] +:param psms: List of PeptideSpectrumMatch objects +:type method: str +:param method: Method to use for training data generation +:type q_max: float +:param q_max: Maximum q-value allowed for positive examples +:type balance: bool +:param balance: Whether to balance the dataset

+
+
Returns:
+

X_train and Y_train

+
+
Return type:
+

Tuple[NDArray, NDArray]

+
+
+
+ +
+
+imspy.timstof.dbsearch.utility.get_searchable_spec(precursor, raw_fragment_data, spec_processor, time, spec_id, file_id=0, ms_level=2)¶
+

Get SAGE searchable spectrum from raw data. +:type precursor: Precursor +:param precursor: Precursor object +:type raw_fragment_data: TimsFrame +:param raw_fragment_data: TimsFrame object +:type time: float +:param time: float +:type spec_processor: SpectrumProcessor +:param spec_processor: SpectrumProcessor object +:type spec_id: str +:param spec_id: str +:type file_id: int +:param file_id: int +:type ms_level: int +:param ms_level: int

+
+
Returns:
+

ProcessedSpectrum object

+
+
Return type:
+

ProcessedSpectrum

+
+
+
+ +
+
+imspy.timstof.dbsearch.utility.linear_map(value, old_min, old_max, new_min=0.0, new_max=60.0)¶
+
+ +
+
+imspy.timstof.dbsearch.utility.map_to_domain(data, gradient_length=120.0)¶
+

Maps the input data linearly into the domain [0, l].

+

Parameters: +- data: list or numpy array of numerical values +- l: float, the upper limit of the target domain [0, l]

+

Returns: +- mapped_data: list of values mapped into the domain [0, l]

+
+ +
+
+imspy.timstof.dbsearch.utility.merge_dicts_with_merge_dict(dicts)¶
+
+ +
+
+imspy.timstof.dbsearch.utility.sanitize_charge(charge)¶
+

Sanitize charge value. +:type charge: Optional[float] +:param charge: Charge value as float.

+
+
Returns:
+

Charge value as int.

+
+
Return type:
+

int

+
+
+
+ +
+
+imspy.timstof.dbsearch.utility.sanitize_mz(mz, mz_highest)¶
+

Sanitize mz value. +:type mz: Optional[float] +:param mz: Mz value as float. +:type mz_highest: float +:param mz_highest: Highest mz value.

+
+
Returns:
+

Mz value as float.

+
+
Return type:
+

float

+
+
+
+ +
+
+imspy.timstof.dbsearch.utility.split_fasta(fasta, num_splits=16, randomize=True)¶
+

Split a fasta file into multiple fasta files. +:type fasta: str +:param fasta: Fasta file as string. +:type num_splits: int +:param num_splits: Number of splits fasta file should be split into. +:type randomize: bool +:param randomize: Whether to randomize the order of sequences before splitting.

+
+
Return type:
+

List[str]

+
+
Returns:
+

List of fasta files as strings, will contain num_splits fasta files with equal number of sequences.

+
+
+
+ +
+
+imspy.timstof.dbsearch.utility.split_psms(psms, num_splits=10)¶
+

Split PSMs into multiple splits.

+
+
Parameters:
+
    +
  • psms (List[Psm]) – List of PeptideSpectrumMatch objects

  • +
  • num_splits (int) – Number of splits

  • +
+
+
Returns:
+

List of splits

+
+
Return type:
+

List[List[PeptideSpectrumMatch]]

+
+
+
+ +
+
+imspy.timstof.dbsearch.utility.transform_psm_to_pin(psm_df)¶
+
+ +
+
+imspy.timstof.dbsearch.utility.write_psms_binary(byte_array, folder_path, file_name, total=False)¶
+

Write PSMs to binary file. +:type byte_array: +:param byte_array: Byte array +:type folder_path: str +:param folder_path: Folder path +:type file_name: str +:param file_name: File name +:type total: bool +:param total: Whether to write to total folder

+
+ +
+
+

Module contents¶

+
+
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/main/imspy/imspy.timstof.html b/main/imspy/imspy.timstof.html new file mode 100644 index 00000000..e22f7879 --- /dev/null +++ b/main/imspy/imspy.timstof.html @@ -0,0 +1,1954 @@ + + + + + + + + imspy.timstof package — imspy 0.2.33 documentation + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

imspy.timstof package¶

+
+

Subpackages¶

+ +
+
+

Submodules¶

+
+
+

imspy.timstof.collision module¶

+
+
+class imspy.timstof.collision.TimsTofCollisionEnergy¶
+

Bases: object

+
+
+abstract get_collision_energies()¶
+
+
Return type:
+

list[float]

+
+
+
+ +
+
+abstract get_collision_energy()¶
+
+
Return type:
+

float

+
+
+
+ +
+ +
+
+class imspy.timstof.collision.TimsTofCollisionEnergyDIA(frame, frame_window_group, window_group, scan_start, scan_end, collision_energy)¶
+

Bases: TimsTofCollisionEnergy

+
+
+get_collision_energies(frame_ids, scan_ids)¶
+
+
Return type:
+

list[float]

+
+
+
+ +
+
+get_collision_energy(frame_id, scan_id)¶
+
+
Return type:
+

float

+
+
+
+ +
+ +
+
+

imspy.timstof.data module¶

+
+
+class imspy.timstof.data.AcquisitionMode(mode)¶
+

Bases: RustWrapperObject

+
+
+classmethod from_py_ptr(ptr)¶
+

Get an AcquisitionMode from a pointer.

+
+
Parameters:
+

ptr (pims.AcquisitionMode) – Pointer to an acquisition mode.

+
+
Returns:
+

Acquisition mode.

+
+
Return type:
+

AcquisitionMode

+
+
+
+ +
+
+get_py_ptr()¶
+
+ +
+
+property mode: str¶
+

Get the acquisition mode.

+
+
Returns:
+

Acquisition mode.

+
+
Return type:
+

str

+
+
+
+ +
+ +
+
+class imspy.timstof.data.TimsDataset(data_path, in_memory=False, use_bruker_sdk=True)¶
+

Bases: ABC

+
+
+property acquisition_mode: str¶
+

Get the acquisition mode.

+
+
Returns:
+

Acquisition mode.

+
+
Return type:
+

str

+
+
+
+ +
+
+property acquisition_mode_numeric: int¶
+

Get the acquisition mode as a numerical value.

+
+
Returns:
+

Acquisition mode as a numerical value.

+
+
Return type:
+

int

+
+
+
+ +
+
+property average_cycle_length: float¶
+
+ +
+
+bytes_to_indexed_values(values)¶
+

Convert bytes to scan, tof, and intensity values.

+
+
Parameters:
+

values (NDArray[np.uint8]) – Bytes.

+
+
Returns:
+

Scan values. +NDArray[np.int32]: TOF values. +NDArray[np.float64]: Intensity values.

+
+
Return type:
+

NDArray[np.int32]

+
+
+
+ +
+
+compress_frames(frames, num_threads=4)¶
+

Compress a collection of frames.

+
+
Parameters:
+
    +
  • frames (List[TimsFrame]) – List of frames.

  • +
  • num_threads (int) – Number of threads to use.

  • +
+
+
Returns:
+

List of compressed bytes.

+
+
Return type:
+

List[NDArray[np.uint8]]

+
+
+
+ +
+
+compress_zstd(values)¶
+

Compress values using ZSTD.

+
+
Parameters:
+

values (NDArray[np.float64]) – Values to compress.

+
+
Returns:
+

Compressed values.

+
+
Return type:
+

NDArray[np.uint8]

+
+
+
+ +
+
+decompress_zstd(values, ignore_first_n=8)¶
+

Decompress values using ZSTD.

+
+
Parameters:
+
    +
  • values (NDArray[np.float64]) – Values to decompress.

  • +
  • ignore_first_n (int) – Number of bytes to ignore.

  • +
+
+
Returns:
+

Decompressed values.

+
+
Return type:
+

NDArray[np.uint8]

+
+
+
+ +
+
+property description: str¶
+
+ +
+
+property frame_count: int¶
+

Get the number of frames.

+
+
Returns:
+

Number of frames.

+
+
Return type:
+

int

+
+
+
+ +
+
+get_table(table_name)¶
+

Get a table.

+
+
Parameters:
+

table_name (str) – Table name.

+
+
Returns:
+

Table.

+
+
Return type:
+

pd.DataFrame

+
+
+
+ +
+
+get_tims_frame(frame_id)¶
+

Get a TimsFrame.

+
+
Parameters:
+

frame_id (int) – Frame ID.

+
+
Returns:
+

TimsFrame.

+
+
Return type:
+

TimsFrame

+
+
+
+ +
+
+get_tims_slice(frame_ids, num_threads=8)¶
+

Get a TimsFrame.

+
+
Parameters:
+
    +
  • frame_ids (int) – Frame ID.

  • +
  • num_threads (int) – Number of threads.

  • +
+
+
Returns:
+

TimsFrame.

+
+
Return type:
+

TimsFrame

+
+
+
+ +
+
+property im_lower¶
+
+ +
+
+property im_upper¶
+
+ +
+
+indexed_values_to_compressed_bytes(scan_values, tof_values, intensity_values, total_scans)¶
+

Convert scan and intensity values to bytes.

+
+
Parameters:
+
    +
  • scan_values (NDArray[np.int32]) – Scan values.

  • +
  • tof_values (NDArray[np.int32]) – TOF values.

  • +
  • intensity_values (NDArray[np.float64]) – Intensity values.

  • +
  • total_scans (int) – Total number of scans.

  • +
+
+
Returns:
+

Bytes.

+
+
Return type:
+

NDArray[np.uint8]

+
+
+
+ +
+
+inverse_mobility_to_scan(frame_id, im_values)¶
+

Convert inverse mobility values to scan values.

+
+
Parameters:
+
    +
  • frame_id (int) – Frame ID.

  • +
  • im_values (NDArray[np.float64]) – Inverse mobility values.

  • +
+
+
Returns:
+

Scan values.

+
+
Return type:
+

NDArray[np.int32]

+
+
+
+ +
+
+property mz_lower¶
+
+ +
+
+mz_to_tof(frame_id, mz_values)¶
+

Convert m/z values to TOF values.

+
+
Parameters:
+
    +
  • frame_id (int) – Frame ID.

  • +
  • mz_values (NDArray[np.float64]) – m/z values.

  • +
+
+
Returns:
+

TOF values.

+
+
Return type:
+

NDArray[np.int32]

+
+
+
+ +
+
+property mz_upper¶
+
+ +
+
+property num_scans: int¶
+

Get the number of scans.

+
+
Returns:
+

Number of scans.

+
+
Return type:
+

int

+
+
+
+ +
+
+scan_to_inverse_mobility(frame_id, scan_values)¶
+

Convert scan values to inverse mobility values.

+
+
Parameters:
+
    +
  • frame_id (int) – Frame ID.

  • +
  • scan_values (NDArray[np.int32]) – Scan values.

  • +
+
+
Returns:
+

Inverse mobility values.

+
+
Return type:
+

NDArray[np.float64]

+
+
+
+ +
+
+tof_to_mz(frame_id, tof_values)¶
+

Convert TOF values to m/z values.

+
+
Parameters:
+
    +
  • frame_id (int) – Frame ID.

  • +
  • tof_values (NDArray[np.int32]) – TOF values.

  • +
+
+
Returns:
+

m/z values.

+
+
Return type:
+

NDArray[np.float64]

+
+
+
+ +
+ +
+
+

imspy.timstof.dda module¶

+
+
+class imspy.timstof.dda.FragmentDDA(frame_id, precursor_id, collision_energy, selected_fragment)¶
+

Bases: RustWrapperObject

+
+
+property collision_energy: float¶
+
+ +
+
+property frame_id: int¶
+
+ +
+
+classmethod from_py_ptr(fragment)¶
+
+ +
+
+get_py_ptr()¶
+
+ +
+
+property precursor_id: int¶
+
+ +
+
+property selected_fragment: TimsFrame¶
+
+ +
+ +
+
+class imspy.timstof.dda.TimsDatasetDDA(data_path, in_memory=False, use_bruker_sdk=True)¶
+

Bases: TimsDataset, RustWrapperObject

+
+
+classmethod from_py_ptr(ptr)¶
+
+ +
+
+get_pasef_fragments(num_threads=1)¶
+

Get PASEF fragments.

+

Args: num_threads (int, optional): Number of threads. Defaults to 1. CAUTION: As long as connection to +datasets is established via bruker so / dll, using multiple threads is unstable.

+
+
Returns:
+

List of PASEF fragments.

+
+
Return type:
+

List[FragmentDDA]

+
+
+
+ +
+
+get_py_ptr()¶
+
+ +
+ +
+
+

imspy.timstof.dia module¶

+
+
+class imspy.timstof.dia.TimsDatasetDIA(data_path, in_memory=False, use_bruker_sdk=True)¶
+

Bases: TimsDataset, RustWrapperObject

+
+
+property dia_ms_ms_info¶
+

Get DIA MS/MS info.

+
+
Returns:
+

DIA MS/MS info.

+
+
Return type:
+

pd.DataFrame

+
+
+
+ +
+
+property dia_ms_ms_windows¶
+

Get PASEF meta data for DIA.

+
+
Returns:
+

PASEF meta data.

+
+
Return type:
+

pd.DataFrame

+
+
+
+ +
+
+classmethod from_py_ptr(obj)¶
+
+ +
+
+get_py_ptr()¶
+
+ +
+
+read_compressed_data_full()¶
+

Read compressed data.

+
+
Returns:
+

Compressed data.

+
+
Return type:
+

List[bytes]

+
+
+
+ +
+
+sample_fragment_signal(num_frames, window_group, max_intensity=25.0, take_probability=0.5)¶
+

Sample fragment signal.

+
+
Parameters:
+
    +
  • num_frames (int) – Number of frames.

  • +
  • window_group (int) – Window group to take frames from.

  • +
  • max_intensity (float) – Maximum intensity.

  • +
  • take_probability (float) – Probability to take signals from sampled frames.

  • +
+
+
Returns:
+

Frame.

+
+
Return type:
+

TimsFrame

+
+
+
+ +
+
+sample_precursor_signal(num_frames, max_intensity=25.0, take_probability=0.5)¶
+

Sample precursor signal.

+
+
Parameters:
+
    +
  • num_frames (int) – Number of frames.

  • +
  • max_intensity (float) – Maximum intensity.

  • +
  • take_probability (float) – Probability to take signals from sampled frames.

  • +
+
+
Returns:
+

Frame.

+
+
Return type:
+

TimsFrame

+
+
+
+ +
+ +
+
+

imspy.timstof.frame module¶

+
+
+class imspy.timstof.frame.TimsFrame(frame_id, ms_type, retention_time, scan, mobility, tof, mz, intensity)¶
+

Bases: RustWrapperObject

+
+
+property df: DataFrame¶
+

Data as a pandas DataFrame.

+
+
Returns:
+

Data.

+
+
Return type:
+

pd.DataFrame

+
+
+
+ +
+
+filter(mz_min=0.0, mz_max=2000.0, scan_min=0, scan_max=1000, mobility_min=0.0, mobility_max=2.0, intensity_min=0.0, intensity_max=1000000000.0)¶
+

Filter the frame for a given m/z range, scan range and intensity range.

+
+
Parameters:
+
    +
  • mz_min (float) – Minimum m/z value.

  • +
  • mz_max (float) – Maximum m/z value.

  • +
  • scan_min (int, optional) – Minimum scan value. Defaults to 0.

  • +
  • scan_max (int, optional) – Maximum scan value. Defaults to 1000.

  • +
  • mobility_min (float, optional) – Minimum inverse mobility value. Defaults to 0.0.

  • +
  • mobility_max (float, optional) – Maximum inverse mobility value. Defaults to 2.0.

  • +
  • intensity_min (float, optional) – Minimum intensity value. Defaults to 0.0.

  • +
  • intensity_max (float, optional) – Maximum intensity value. Defaults to 1e9.

  • +
+
+
Returns:
+

Filtered frame.

+
+
Return type:
+

TimsFrame

+
+
+
+ +
+
+property frame_id: int¶
+

Frame ID.

+
+
Returns:
+

Frame ID.

+
+
Return type:
+

int

+
+
+
+ +
+
+classmethod from_py_ptr(frame)¶
+

Create a TimsFrame from a PyTimsFrame.

+
+
Parameters:
+

frame (pims.PyTimsFrame) – PyTimsFrame to create the TimsFrame from.

+
+
Returns:
+

TimsFrame created from the PyTimsFrame.

+
+
Return type:
+

TimsFrame

+
+
+
+ +
+
+classmethod from_tims_spectra(spectra)¶
+

Create a TimsFrame from a list of TimsSpectrum.

+
+
Parameters:
+

spectra (List[TimsSpectrum]) – List of TimsSpectrum.

+
+
Returns:
+

TimsFrame created from the TimsSpectrum.

+
+
Return type:
+

TimsFrame

+
+
+
+ +
+
+classmethod from_windows(windows)¶
+

Create a TimsFrame from a list of windows.

+
+
Parameters:
+

windows (List[TimsSpectrum]) – List of windows.

+
+
Returns:
+

TimsFrame created from the windows.

+
+
Return type:
+

TimsFrame

+
+
+
+ +
+
+get_inverse_mobility_along_scan_marginal()¶
+

Get the inverse mobility along the scan marginal.

+
+
Returns:
+

Inverse mobility.

+
+
Return type:
+

float

+
+
+
+ +
+
+get_mobility_mean_and_variance()¶
+

Get the mean and variance of the inverse mobility.

+
+
Returns:
+

Mean and variance of the inverse mobility.

+
+
Return type:
+

Tuple[float, float]

+
+
+
+ +
+
+get_py_ptr()¶
+
+ +
+
+property intensity: ndarray[Any, dtype[float64]]¶
+

Intensity.

+
+
Returns:
+

Intensity.

+
+
Return type:
+

NDArray[np.float64]

+
+
+
+ +
+
+property mobility: ndarray[Any, dtype[float64]]¶
+

Inverse mobility.

+
+
Returns:
+

Inverse mobility.

+
+
Return type:
+

NDArray[np.float64]

+
+
+
+ +
+
+property ms_type: int¶
+

MS type.

+
+
Returns:
+

MS type.

+
+
Return type:
+

int

+
+
+
+ +
+
+property ms_type_as_string: str¶
+

MS type.

+
+
Returns:
+

MS type.

+
+
Return type:
+

int

+
+
+
+ +
+
+property mz: ndarray[Any, dtype[float64]]¶
+

m/z.

+
+
Returns:
+

m/z.

+
+
Return type:
+

NDArray[np.float64]

+
+
+
+ +
+
+random_subsample_frame(take_probability)¶
+

Randomly subsample the frame.

+

Args: +take_probability (float): Take probability.

+

Returns: +TimsFrame: Subsampled frame.

+
+
Return type:
+

TimsFrame

+
+
+
+ +
+
+property retention_time: float¶
+

Retention time.

+
+
Returns:
+

Retention time.

+
+
Return type:
+

float

+
+
+
+ +
+
+property scan: ndarray[Any, dtype[int32]]¶
+

Scan.

+
+
Returns:
+

Scan.

+
+
Return type:
+

NDArray[np.int32]

+
+
+
+ +
+
+to_dense_windows(window_length=10, resolution=1, overlapping=True, min_num_peaks=5, min_intensity=0.0)¶
+
+
Return type:
+

ndarray[Any, dtype[float64]]

+
+
+
+ +
+
+to_indexed_mz_spectrum()¶
+

Convert the frame to an IndexedMzSpectrum.

+
+
Returns:
+

IndexedMzSpectrum.

+
+
Return type:
+

IndexedMzSpectrum

+
+
+
+ +
+
+to_noise_annotated_tims_frame()¶
+

Convert the frame to a noise annotated frame.

+
+
Returns:
+

Noise annotated frame.

+
+
Return type:
+

TimsFrameAnnotated

+
+
+
+ +
+
+to_resolution(resolution)¶
+

Convert the frame to a given resolution.

+
+
Parameters:
+

resolution (int) – Resolution.

+
+
Returns:
+

Frame with the given resolution.

+
+
Return type:
+

TimsFrame

+
+
+
+ +
+
+to_tims_spectra()¶
+

Convert the frame to a list of TimsSpectrum.

+
+
Returns:
+

List of TimsSpectrum.

+
+
Return type:
+

List[TimsSpectrum]

+
+
+
+ +
+
+to_windows(window_length=10, overlapping=True, min_num_peaks=5, min_intensity=1)¶
+

Convert the frame to a list of windows.

+
+
Parameters:
+
    +
  • window_length (float, optional) – Window length. Defaults to 10.

  • +
  • overlapping (bool, optional) – Whether the windows should overlap. Defaults to True.

  • +
  • min_num_peaks (int, optional) – Minimum number of peaks in a window. Defaults to 5.

  • +
  • min_intensity (float, optional) – Minimum intensity of a peak in a window. Defaults to 1.

  • +
+
+
Returns:
+

List of windows.

+
+
Return type:
+

List[MzSpectrum]

+
+
+
+ +
+
+property tof: ndarray[Any, dtype[int32]]¶
+

Time of flight.

+
+
Returns:
+

Time of flight.

+
+
Return type:
+

NDArray[np.int32]

+
+
+
+ +
+
+vectorized(resolution=2)¶
+

Convert the frame to a vectorized frame.

+
+
Parameters:
+

resolution (int, optional) – Resolution. Defaults to 2.

+
+
Returns:
+

Vectorized frame.

+
+
Return type:
+

TimsFrameVectorized

+
+
+
+ +
+ +
+
+class imspy.timstof.frame.TimsFrameVectorized(frame_id, ms_type, retention_time, scan, mobility, tof, indices, intensity)¶
+

Bases: RustWrapperObject

+
+
+property df: DataFrame¶
+

Data as a pandas DataFrame.

+
+
Returns:
+

Data.

+
+
Return type:
+

pd.DataFrame

+
+
+
+ +
+
+filter(mz_min=0.0, mz_max=2000.0, scan_min=0, scan_max=1000, mobility_min=0.0, mobility_max=2.0, intensity_min=0.0, intensity_max=1000000000.0)¶
+

Filter the frame for a given m/z range, scan range and intensity range.

+
+
Parameters:
+
    +
  • mz_min (float) – Minimum m/z value.

  • +
  • mz_max (float) – Maximum m/z value.

  • +
  • scan_min (int, optional) – Minimum scan value. Defaults to 0.

  • +
  • scan_max (int, optional) – Maximum scan value. Defaults to 1000.

  • +
  • mobility_min (float, optional) – Minimum inverse mobility value. Defaults to 0.0.

  • +
  • mobility_max (float, optional) – Maximum inverse mobility value. Defaults to 2.0.

  • +
  • intensity_min (float, optional) – Minimum intensity value. Defaults to 0.0.

  • +
  • intensity_max (float, optional) – Maximum intensity value. Defaults to 1e9.

  • +
+
+
Returns:
+

Filtered frame.

+
+
Return type:
+

TimsFrameVectorized

+
+
+
+ +
+
+property frame_id: int¶
+

Frame ID.

+
+
Returns:
+

Frame ID.

+
+
Return type:
+

int

+
+
+
+ +
+
+classmethod from_py_ptr(frame)¶
+

Create a TimsFrameVectorized from a PyTimsFrameVectorized.

+
+
Parameters:
+

frame (pims.PyTimsFrameVectorized) – PyTimsFrameVectorized to create the TimsFrameVectorized from.

+
+
Returns:
+

TimsFrameVectorized created from the PyTimsFrameVectorized.

+
+
Return type:
+

TimsFrameVectorized

+
+
+
+ +
+
+get_arrays_at_index(index)¶
+

Get the arrays at a given index.

+
+
Parameters:
+

index (int) – Index.

+
+
Returns:
+

Arrays at the index.

+
+
Return type:
+

NDArray[np.float64]

+
+
+
+ +
+
+get_py_ptr()¶
+
+ +
+
+get_tensor_repr(dense=True, zero_indexed=True, re_index=True, scan_max=None, index_max=None)¶
+
+ +
+
+property indices: ndarray[Any, dtype[int32]]¶
+

Indices.

+
+
Returns:
+

Indices.

+
+
Return type:
+

NDArray[np.int32]

+
+
+
+ +
+
+property intensity: ndarray[Any, dtype[float64]]¶
+

Intensity.

+
+
Returns:
+

Intensity.

+
+
Return type:
+

NDArray[np.float64]

+
+
+
+ +
+
+property mobility: ndarray[Any, dtype[float64]]¶
+

Inverse mobility.

+
+
Returns:
+

Inverse mobility.

+
+
Return type:
+

NDArray[np.float64]

+
+
+
+ +
+
+property ms_type: str¶
+

MS type.

+
+
Returns:
+

MS type.

+
+
Return type:
+

int

+
+
+
+ +
+
+property retention_time: float¶
+

Retention time.

+
+
Returns:
+

Retention time.

+
+
Return type:
+

float

+
+
+
+ +
+
+property scan: ndarray[Any, dtype[int32]]¶
+

Scan.

+
+
Returns:
+

Scan.

+
+
Return type:
+

NDArray[np.int32]

+
+
+
+ +
+
+property tof: ndarray[Any, dtype[int32]]¶
+

Time of flight.

+
+
Returns:
+

Time of flight.

+
+
Return type:
+

NDArray[np.int32]

+
+
+
+ +
+ +
+
+

imspy.timstof.quadrupole module¶

+
+
+class imspy.timstof.quadrupole.TimsTofQuadrupoleDIA(frame, frame_window_group, window_group, scan_start, scan_end, isolation_mz, isolation_width, k=None)¶
+

Bases: object

+
+
+all_transmitted(frame_id, scan_id, mz, min_proba=None)¶
+
+
Return type:
+

bool

+
+
+
+ +
+
+any_transmitted(frame_id, scan_id, mz, min_proba=None)¶
+
+
Return type:
+

bool

+
+
+
+ +
+
+apply_transmission(frame_id, scan_id, mz)¶
+
+
Return type:
+

ndarray[Any, dtype[TypeVar(_ScalarType_co, bound= generic, covariant=True)]]

+
+
+
+ +
+
+frame_to_window_group(frame_id)¶
+
+
Return type:
+

int

+
+
+
+ +
+
+get_transmission_set(frame_id, scan_id, mz, min_proba=None)¶
+
+
Return type:
+

set[int]

+
+
+
+ +
+
+is_precursor(frame_id)¶
+
+
Return type:
+

bool

+
+
+
+ +
+
+is_transmitted(frame_id, scan_id, mz, min_proba=None)¶
+
+
Return type:
+

bool

+
+
+
+ +
+
+isotopes_transmitted(frame_id, scan_id, mz_mono, mz, min_proba=None)¶
+

Get the transmission probability for a list of isotopes +:type frame_id: int +:param frame_id: +:type scan_id: int +:param scan_id: +:type mz_mono: float +:param mz_mono: +:type mz: ndarray[Any, dtype[TypeVar(_ScalarType_co, bound= generic, covariant=True)]] +:param mz: +:type min_proba: float | None +:param min_proba:

+

Returns:

+
+
Return type:
+

tuple[float, list[tuple[float, float]]]

+
+
+
+ +
+
+transmit_frame(frame, min_probability=None)¶
+
+
Return type:
+

TimsFrame

+
+
+
+ +
+
+transmit_ion(frame_ids, scan_ids, spectrum, min_probability)¶
+
+
Return type:
+

List[List[MzSpectrum]]

+
+
+
+ +
+
+transmit_spectrum(frame_id, scan_id, spectrum, min_probability=None)¶
+
+
Return type:
+

MzSpectrum

+
+
+
+ +
+ +
+
+

imspy.timstof.slice module¶

+
+
+class imspy.timstof.slice.TimsPlane¶
+

Bases: object

+
+
+property df¶
+
+ +
+
+property frame_ids¶
+
+ +
+
+classmethod from_py_tims_plane(plane)¶
+

Create a TimsPlane from a PyTimsPlane.

+
+
Parameters:
+

plane (pims.PyTimsPlane) – PyTimsPlane to create the TimsPlane from.

+
+
Returns:
+

TimsPlane created from the PyTimsPlane.

+
+
Return type:
+

TimsPlane

+
+
+
+ +
+
+property intensities¶
+
+ +
+
+property mobilities¶
+
+ +
+
+property mz_mean¶
+
+ +
+
+property mz_std¶
+
+ +
+
+property num_points¶
+
+ +
+
+property retention_times¶
+
+ +
+
+property scans¶
+
+ +
+
+property tof_mean¶
+
+ +
+
+property tof_std¶
+
+ +
+ +
+
+class imspy.timstof.slice.TimsSlice(frame_id, scan, tof, retention_time, mobility, mz, intensity)¶
+

Bases: object

+
+
+property df: DataFrame¶
+

Get the data as a pandas DataFrame.

+
+
Returns:
+

Data.

+
+
Return type:
+

pd.DataFrame

+
+
+
+ +
+
+filter(mz_min=0.0, mz_max=2000.0, scan_min=0, scan_max=1000, mobility_min=0.0, mobility_max=2.0, intensity_min=0.0, intensity_max=1000000000.0, num_threads=4)¶
+

Filter the slice by m/z, scan and intensity.

+
+
Parameters:
+
    +
  • mz_min (float) – Minimum m/z value.

  • +
  • mz_max (float) – Maximum m/z value.

  • +
  • scan_min (int, optional) – Minimum scan value. Defaults to 0.

  • +
  • scan_max (int, optional) – Maximum scan value. Defaults to 1000.

  • +
  • mobility_min (float, optional) – Minimum inverse mobility value. Defaults to 0.0.

  • +
  • mobility_max (float, optional) – Maximum inverse mobility value. Defaults to 2.0.

  • +
  • intensity_min (float, optional) – Minimum intensity value. Defaults to 0.0.

  • +
  • intensity_max (float, optional) – Maximum intensity value. Defaults to 1e9.

  • +
  • num_threads (int, optional) – Number of threads to use. Defaults to 4.

  • +
+
+
Returns:
+

Filtered slice.

+
+
Return type:
+

TimsSlice

+
+
+
+ +
+
+filter_by_type(mz_min_ms1=0, mz_max_ms1=2000, scan_min_ms1=0, scan_max_ms1=1000, inv_mob_min_ms1=0, inv_mob_max_ms1=2, intensity_min_ms1=0, intensity_max_ms1=1000000000.0, mz_min_ms2=0, mz_max_ms2=2000, scan_min_ms2=0, scan_max_ms2=1000, inv_mob_min_ms2=0, inv_mob_max_ms2=2, intensity_min_ms2=0, intensity_max_ms2=1000000000.0, num_threads=4)¶
+

Filter the slice by m/z, scan and intensity, for MS1 and MS2 with different ranges.

+
+
Parameters:
+
    +
  • mz_min_ms1 (float, optional) – Minimum m/z value for MS1. Defaults to 0.

  • +
  • mz_max_ms1 (float, optional) – Maximum m/z value for MS1. Defaults to 2000.

  • +
  • scan_min_ms1 (int, optional) – Minimum scan value for MS1. Defaults to 0.

  • +
  • scan_max_ms1 (int, optional) – Maximum scan value for MS1. Defaults to 1000.

  • +
  • inv_mob_min_ms1 (float, optional) – Minimum inverse mobility value for MS1. Defaults to 0.

  • +
  • inv_mob_max_ms1 (float, optional) – Maximum inverse mobility value for MS1. Defaults to 2.

  • +
  • intensity_min_ms1 (float, optional) – Minimum intensity value for MS1. Defaults to 0.

  • +
  • intensity_max_ms1 (float, optional) – Maximum intensity value for MS1. Defaults to 1e9.

  • +
  • mz_min_ms2 (float, optional) – Minimum m/z value for MS2. Defaults to 0.

  • +
  • mz_max_ms2 (float, optional) – Maximum m/z value for MS2. Defaults to 2000.

  • +
  • scan_min_ms2 (int, optional) – Minimum scan value for MS2. Defaults to 0.

  • +
  • scan_max_ms2 (int, optional) – Maximum scan value for MS2. Defaults to 1000.

  • +
  • inv_mob_min_ms2 (float, optional) – Minimum inverse mobility value for MS2. Defaults to 0.

  • +
  • inv_mob_max_ms2 (float, optional) – Maximum inverse mobility value for MS2. Defaults to 2.

  • +
  • intensity_min_ms2 (float, optional) – Minimum intensity value for MS2. Defaults to 0.

  • +
  • intensity_max_ms2 (float, optional) – Maximum intensity value for MS2. Defaults to 1e9.

  • +
  • num_threads (int, optional) – Number of threads to use. Defaults to 4.

  • +
+
+
Returns:
+

Filtered slice.

+
+
Return type:
+

TimsSlice

+
+
+
+ +
+
+property first_frame_id: int¶
+

First frame ID.

+
+
Returns:
+

First frame ID.

+
+
Return type:
+

int

+
+
+
+ +
+
+property fragments¶
+
+ +
+
+property frames: List[TimsFrame]¶
+

Get the frames.

+
+
Returns:
+

Frames.

+
+
Return type:
+

List[TimsFrame]

+
+
+
+ +
+
+classmethod from_frames(frames)¶
+

Create a TimsSlice from a list of TimsFrames.

+
+
Parameters:
+

frames (List[TimsFrame]) – List of TimsFrames.

+
+
Returns:
+

TimsSlice created from the list of TimsFrames.

+
+
Return type:
+

TimsSlice

+
+
+
+ +
+
+classmethod from_py_tims_slice(tims_slice)¶
+

Create a TimsSlice from a PyTimsSlice.

+
+
Parameters:
+

tims_slice (pims.PyTimsSlice) – PyTimsSlice to create the TimsSlice from.

+
+
Returns:
+

TimsSlice created from the PyTimsSlice.

+
+
Return type:
+

TimsSlice

+
+
+
+ +
+
+get_tims_planes(tof_max_value=400000, num_chunks=7, num_threads=4)¶
+
+
Return type:
+

List[TimsPlane]

+
+
+
+ +
+
+property last_frame_id: int¶
+

Last frame ID.

+
+
Returns:
+

Last frame ID.

+
+
Return type:
+

int

+
+
+
+ +
+
+property precursors¶
+
+ +
+
+to_dense_windows(window_length=10, resolution=1, overlapping=True, min_num_peaks=5, min_intensity=0.0, num_theads=4)¶
+
+
Return type:
+

tuple[list[ndarray[Any, dtype[TypeVar(_ScalarType_co, bound= generic, covariant=True)]]], list[ndarray[Any, dtype[TypeVar(_ScalarType_co, bound= generic, covariant=True)]]], list[ndarray[Any, dtype[TypeVar(_ScalarType_co, bound= generic, covariant=True)]]]]

+
+
+
+ +
+
+to_resolution(resolution, num_threads=4)¶
+

Convert the slice to a given resolution.

+
+
Parameters:
+
    +
  • resolution (int) – Resolution.

  • +
  • num_threads (int, optional) – Number of threads to use. Defaults to 4.

  • +
+
+
Returns:
+

Slice with given resolution.

+
+
Return type:
+

TimsSlice

+
+
+
+ +
+
+to_windows(window_length=10, overlapping=True, min_num_peaks=5, min_intensity=1, num_threads=4)¶
+

Convert the slice to a list of windows.

+
+
Parameters:
+
    +
  • window_length (float, optional) – Window length. Defaults to 10.

  • +
  • overlapping (bool, optional) – Whether the windows should overlap. Defaults to True.

  • +
  • min_num_peaks (int, optional) – Minimum number of peaks in a window. Defaults to 5.

  • +
  • min_intensity (float, optional) – Minimum intensity of a peak in a window. Defaults to 1.

  • +
  • num_threads (int, optional) – Number of threads to use. Defaults to 1.

  • +
+
+
Returns:
+

List of windows.

+
+
Return type:
+

List[MzSpectrum]

+
+
+
+ +
+
+vectorized(resolution=2, num_threads=4)¶
+

Get a vectorized version of the slice.

+
+
Parameters:
+
    +
  • resolution (int, optional) – Resolution. Defaults to 2.

  • +
  • num_threads (int, optional) – Number of threads to use. Defaults to 4.

  • +
+
+
Returns:
+

Vectorized version of the slice.

+
+
Return type:
+

TimsSliceVectorized

+
+
+
+ +
+ +
+
+class imspy.timstof.slice.TimsSliceVectorized¶
+

Bases: object

+
+
+property df: DataFrame¶
+

Get the data as a pandas DataFrame.

+
+
Returns:
+

Data.

+
+
Return type:
+

pd.DataFrame

+
+
+
+ +
+
+filter(mz_min=0.0, mz_max=2000.0, scan_min=0, scan_max=1000, mobility_min=0.0, mobility_max=2.0, intensity_min=0.0, intensity_max=1000000000.0, num_threads=4)¶
+

Filter the slice by m/z, scan and intensity.

+
+
Parameters:
+
    +
  • mz_min (float) – Minimum m/z value.

  • +
  • mz_max (float) – Maximum m/z value.

  • +
  • scan_min (int, optional) – Minimum scan value. Defaults to 0.

  • +
  • scan_max (int, optional) – Maximum scan value. Defaults to 1000.

  • +
  • mobility_min (float, optional) – Minimum inverse mobility value. Defaults to 0.0.

  • +
  • mobility_max (float, optional) – Maximum inverse mobility value. Defaults to 2.0.

  • +
  • intensity_min (float, optional) – Minimum intensity value. Defaults to 0.0.

  • +
  • intensity_max (float, optional) – Maximum intensity value. Defaults to 1e9.

  • +
  • num_threads (int, optional) – Number of threads to use. Defaults to 4.

  • +
+
+
Returns:
+

Filtered slice.

+
+
Return type:
+

TimsSlice

+
+
+
+ +
+
+property first_frame_id: int¶
+

First frame ID.

+
+
Returns:
+

First frame ID.

+
+
Return type:
+

int

+
+
+
+ +
+
+property fragments¶
+
+ +
+
+property frames: List[TimsFrameVectorized]¶
+

Get the frames.

+
+
Returns:
+

Frames.

+
+
Return type:
+

List[TimsFrame]

+
+
+
+ +
+
+classmethod from_vectorized_py_tims_slice(tims_slice)¶
+

Create a TimsSlice from a PyTimsSlice.

+
+
Parameters:
+

tims_slice (pims.PyTimsSlice) – PyTimsSlice to create the TimsSlice from.

+
+
Returns:
+

TimsSlice created from the PyTimsSlice.

+
+
Return type:
+

TimsSlice

+
+
+
+ +
+
+get_py_ptr()¶
+
+ +
+
+get_tensor_repr(dense=True, zero_index=True, re_index=True, frame_max=None, scan_max=None, index_max=None)¶
+
+ +
+
+property last_frame_id: int¶
+

Last frame ID.

+
+
Returns:
+

Last frame ID.

+
+
Return type:
+

int

+
+
+
+ +
+
+property precursors¶
+
+ +
+ +
+
+

Module contents¶

+
+
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/main/imspy/imspy.utility.html b/main/imspy/imspy.utility.html new file mode 100644 index 00000000..d51128eb --- /dev/null +++ b/main/imspy/imspy.utility.html @@ -0,0 +1,330 @@ + + + + + + + + imspy.utility package — imspy 0.2.33 documentation + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

imspy.utility package¶

+
+

Submodules¶

+
+
+

imspy.utility.sequence module¶

+
+
+imspy.utility.sequence.tokenize_unimod_sequence(unimod_sequence)¶
+

Tokenizes a sequence of modified amino acids. +:type unimod_sequence: str +:param unimod_sequence: A string representing the sequence of amino acids with modifications.

+
+
Return type:
+

List[str]

+
+
Returns:
+

A list of tokenized amino acids.

+
+
+
+ +
+
+

imspy.utility.utilities module¶

+
+
+class imspy.utility.utilities.ExponentialGaussianDistribution(μ=-3, σ=1, λ=0.25)¶
+

Bases: object

+
+ +
+
+class imspy.utility.utilities.NormalDistribution(μ, σ)¶
+

Bases: object

+
+ +
+
+class imspy.utility.utilities.TokenSequence(sequence_tokenized=None, jsons=None)¶
+

Bases: object

+
+
+property jsons¶
+
+ +
+ +
+
+imspy.utility.utilities.exp_distribution(x, λ=1)¶
+

Exponential function +:type x: +:param x: +:type λ: float +:param λ: +:return:

+
+ +
+
+imspy.utility.utilities.exp_gaussian(x, μ=-3, σ=1, λ=0.25)¶
+

laplacian distribution with exponential decay +:type x: +:param x: +:type μ: float +:param μ: +:type σ: float +:param σ: +:type λ: float +:param λ: +:return:

+
+ +
+
+imspy.utility.utilities.gaussian(x, μ=0, σ=1)¶
+

Gaussian function +:type x: +:param x: +:type μ: float +:param μ: +:type σ: float +:param σ: +:return:

+
+ +
+
+imspy.utility.utilities.get_aa_num_proforma_sequence(sequence)¶
+

get number of amino acids in sequence

+
+
Parameters:
+

sequence (str) – proforma formatted aa sequence

+
+
Returns:
+

Number of amino acids

+
+
Return type:
+

int

+
+
+
+ +
+
+imspy.utility.utilities.is_unimod_end(char)¶
+

Tests if char is end of unimod +bracket

+
+
Parameters:
+

char (str) – Character of a proForma formatted aa sequence

+
+
Returns:
+

Whether char is end of unimod bracket

+
+
Return type:
+

bool

+
+
+
+ +
+
+imspy.utility.utilities.is_unimod_start(char)¶
+

Tests if char is start of unimod +bracket

+
+
Parameters:
+

char (str) – Character of a proForma formatted aa sequence

+
+
Returns:
+

Whether char is start of unimod bracket

+
+
Return type:
+

bool

+
+
+
+ +
+
+imspy.utility.utilities.normal_pdf(x, mass, s=0.001, inv_sqrt_2pi=0.3989422804014327, normalize=False)¶
+
+
Parameters:
+
    +
  • x (Union[_SupportsArray[dtype[Any]], _NestedSequence[_SupportsArray[dtype[Any]]], bool, int, float, complex, str, bytes, _NestedSequence[Union[bool, int, float, complex, str, bytes]]])

  • +
  • mass (float)

  • +
  • s (float)

  • +
  • inv_sqrt_2pi (float)

  • +
  • normalize (bool)

  • +
+
+
+
+ +
+
+imspy.utility.utilities.re_index_indices(ids)¶
+

Re-index indices, i.e. replace gaps in indices with consecutive numbers. +Can be used, e.g., to re-index frame IDs from precursors for visualization. +:type ids: +:param ids: Indices.

+
+
Returns:
+

Indices.

+
+
+
+ +
+
+imspy.utility.utilities.tokenize_proforma_sequence(sequence)¶
+

Tokenize a ProForma formatted sequence string.

+
+
Parameters:
+

sequence (str) – Sequence string (ProForma formatted)

+
+
Returns:
+

List of tokens

+
+
Return type:
+

List

+
+
+
+ +
+
+imspy.utility.utilities.tokenizer_from_json(path)¶
+

load a pre-fit tokenizer from a json file +:type path: str +:param path: path to tokenizer as json file +:return: a keras tokenizer loaded from json

+
+ +
+
+imspy.utility.utilities.tokenizer_to_json(tokenizer, path)¶
+

save a fit keras tokenizer to json for later use +:type tokenizer: Tokenizer +:param tokenizer: fit keras tokenizer to save +:type path: str +:param path: path to save json to

+
+ +
+
+

Module contents¶

+
+
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/main/imspy/imspy.vis.html b/main/imspy/imspy.vis.html new file mode 100644 index 00000000..55bbe762 --- /dev/null +++ b/main/imspy/imspy.vis.html @@ -0,0 +1,128 @@ + + + + + + + + imspy.vis package — imspy 0.2.33 documentation + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

imspy.vis package¶

+
+

Submodules¶

+
+
+

imspy.vis.pointcloud module¶

+
+
+

Module contents¶

+
+
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/main/imspy/index.html b/main/imspy/index.html new file mode 100644 index 00000000..67cdd433 --- /dev/null +++ b/main/imspy/index.html @@ -0,0 +1,133 @@ + + + + + + + + Welcome to imspy’s documentation! — imspy 0.2.33 documentation + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

Welcome to imspy’s documentation!¶

+

This is the main page of the imspy documentation.

+

Contents:

+ +
+
+

Indices and tables¶

+ +
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/main/imspy/modules.html b/main/imspy/modules.html new file mode 100644 index 00000000..d3ce1844 --- /dev/null +++ b/main/imspy/modules.html @@ -0,0 +1,198 @@ + + + + + + + + imspy Modules — imspy 0.2.33 documentation + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

imspy Modules¶

+

The imspy package contains the following submodules:

+ +
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/main/imspy/objects.inv b/main/imspy/objects.inv new file mode 100644 index 0000000000000000000000000000000000000000..4565449182e4f4403c101c2106e62d2234e72e7d GIT binary patch literal 5425 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 bWX|L2%W^8I{m`wJXZ!n;E{p#IQOPY_E(2}a literal 0 HcmV?d00001 diff --git a/main/imspy/py-modindex.html b/main/imspy/py-modindex.html new file mode 100644 index 00000000..73a5d55a --- /dev/null +++ b/main/imspy/py-modindex.html @@ -0,0 +1,444 @@ + + + + + + + Python Module Index — imspy 0.2.33 documentation + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ + +

Python Module Index

+ +
+ i +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 
+ i
+ imspy +
    + imspy.algorithm +
    + imspy.algorithm.ccs +
    + imspy.algorithm.ccs.predictors +
    + imspy.algorithm.hashing +
    + imspy.algorithm.intensity +
    + imspy.algorithm.intensity.predictors +
    + imspy.algorithm.intensity.utility +
    + imspy.algorithm.ionization +
    + imspy.algorithm.ionization.predictors +
    + imspy.algorithm.pretrained +
    + imspy.algorithm.rt +
    + imspy.algorithm.rt.predictors +
    + imspy.algorithm.utility +
    + imspy.chemistry +
    + imspy.chemistry.amino_acids +
    + imspy.chemistry.constants +
    + imspy.chemistry.elements +
    + imspy.chemistry.mobility +
    + imspy.chemistry.sum_formula +
    + imspy.chemistry.unimod +
    + imspy.chemistry.utility +
    + imspy.data +
    + imspy.data.peptide +
    + imspy.data.spectrum +
    + imspy.simulation +
    + imspy.simulation.acquisition +
    + imspy.simulation.annotation +
    + imspy.simulation.experiment +
    + imspy.simulation.handle +
    + imspy.simulation.noise +
    + imspy.simulation.proteome +
    + imspy.simulation.tdf +
    + imspy.simulation.timsim +
    + imspy.simulation.timsim.jobs +
    + imspy.simulation.timsim.jobs.add_noise_from_real_data +
    + imspy.simulation.timsim.jobs.assemble_frames +
    + imspy.simulation.timsim.jobs.build_acquisition +
    + imspy.simulation.timsim.jobs.digest_fasta +
    + imspy.simulation.timsim.jobs.simulate_charge_states +
    + imspy.simulation.timsim.jobs.simulate_fragment_intensities +
    + imspy.simulation.timsim.jobs.simulate_frame_distributions +
    + imspy.simulation.timsim.jobs.simulate_frame_distributions_emg +
    + imspy.simulation.timsim.jobs.simulate_ion_mobilities +
    + imspy.simulation.timsim.jobs.simulate_occurrences +
    + imspy.simulation.timsim.jobs.simulate_retention_time +
    + imspy.simulation.timsim.jobs.simulate_scan_distributions +
    + imspy.simulation.timsim.jobs.utility +
    + imspy.simulation.utility +
    + imspy.timstof +
    + imspy.timstof.collision +
    + imspy.timstof.data +
    + imspy.timstof.dbsearch +
    + imspy.timstof.dbsearch.imspy_dda +
    + imspy.timstof.dbsearch.imspy_rescore_sage +
    + imspy.timstof.dbsearch.sage_output_utility +
    + imspy.timstof.dbsearch.utility +
    + imspy.timstof.dda +
    + imspy.timstof.dia +
    + imspy.timstof.frame +
    + imspy.timstof.quadrupole +
    + imspy.timstof.slice +
    + imspy.utility +
    + imspy.utility.sequence +
    + imspy.utility.utilities +
    + imspy.vis +
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/main/imspy/search.html b/main/imspy/search.html new file mode 100644 index 00000000..7dd50905 --- /dev/null +++ b/main/imspy/search.html @@ -0,0 +1,122 @@ + + + + + + + Search — imspy 0.2.33 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +

Search

+ + + + +

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

+ + +
+ + + +
+ + +
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/main/imspy/searchindex.js b/main/imspy/searchindex.js new file mode 100644 index 00000000..932e3e49 --- /dev/null +++ b/main/imspy/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"alltitles": {"API Documentation": [[0, "module-imspy"]], "Indices and tables": [[16, "indices-and-tables"]], "Main Modules": [[16, null]], "Module contents": [[1, "module-imspy.algorithm"], [2, "module-imspy.algorithm.ccs"], [3, "module-imspy.algorithm.intensity"], [4, "module-imspy.algorithm.ionization"], [5, "module-imspy.algorithm.pretrained"], [6, "module-imspy.algorithm.rt"], [7, "module-imspy.chemistry"], [8, "module-imspy.data"], [9, "module-imspy.simulation"], [10, "module-imspy.simulation.timsim"], [11, "module-imspy.simulation.timsim.jobs"], [12, "module-imspy.timstof"], [13, "module-imspy.timstof.dbsearch"], [14, "module-imspy.utility"], [15, "module-imspy.vis"]], "Submodules": [[1, "submodules"], [2, "submodules"], [3, "submodules"], [4, "submodules"], [6, "submodules"], [7, "submodules"], [8, "submodules"], [9, "submodules"], [10, "submodules"], [11, "submodules"], [12, "submodules"], [13, "submodules"], [14, "submodules"], [15, "submodules"]], "Subpackages": [[1, "subpackages"], [9, "subpackages"], [10, "subpackages"], [12, "subpackages"]], "Welcome to imspy\u2019s documentation!": [[16, null]], "imspy Modules": [[17, null]], "imspy Package": [[0, null]], "imspy.algorithm package": [[1, null]], "imspy.algorithm.ccs package": [[2, null]], "imspy.algorithm.ccs.predictors module": [[2, "module-imspy.algorithm.ccs.predictors"]], "imspy.algorithm.hashing module": [[1, "module-imspy.algorithm.hashing"]], "imspy.algorithm.intensity package": [[3, null]], "imspy.algorithm.intensity.predictors module": [[3, "module-imspy.algorithm.intensity.predictors"]], "imspy.algorithm.intensity.utility module": [[3, "module-imspy.algorithm.intensity.utility"]], "imspy.algorithm.ionization package": [[4, null]], "imspy.algorithm.ionization.predictors module": [[4, "module-imspy.algorithm.ionization.predictors"]], "imspy.algorithm.mixture module": [[1, "imspy-algorithm-mixture-module"]], "imspy.algorithm.pretrained package": [[5, null]], "imspy.algorithm.rt package": [[6, null]], "imspy.algorithm.rt.predictors module": [[6, "module-imspy.algorithm.rt.predictors"]], "imspy.algorithm.utility module": [[1, "module-imspy.algorithm.utility"]], "imspy.chemistry package": [[7, null]], "imspy.chemistry.amino_acids module": [[7, "module-imspy.chemistry.amino_acids"]], "imspy.chemistry.constants module": [[7, "module-imspy.chemistry.constants"]], "imspy.chemistry.elements module": [[7, "module-imspy.chemistry.elements"]], "imspy.chemistry.mobility module": [[7, "module-imspy.chemistry.mobility"]], "imspy.chemistry.sum_formula module": [[7, "module-imspy.chemistry.sum_formula"]], "imspy.chemistry.unimod module": [[7, "module-imspy.chemistry.unimod"]], "imspy.chemistry.utility module": [[7, "module-imspy.chemistry.utility"]], "imspy.data package": [[8, null]], "imspy.data.peptide module": [[8, "module-imspy.data.peptide"]], "imspy.data.spectrum module": [[8, "module-imspy.data.spectrum"]], "imspy.simulation package": [[9, null]], "imspy.simulation.acquisition module": [[9, "module-imspy.simulation.acquisition"]], "imspy.simulation.annotation module": [[9, "module-imspy.simulation.annotation"]], "imspy.simulation.experiment module": [[9, "module-imspy.simulation.experiment"]], "imspy.simulation.feature module": [[9, "imspy-simulation-feature-module"]], "imspy.simulation.handle module": [[9, "module-imspy.simulation.handle"]], "imspy.simulation.isotopes module": [[9, "imspy-simulation-isotopes-module"]], "imspy.simulation.noise module": [[9, "module-imspy.simulation.noise"]], "imspy.simulation.proteome module": [[9, "module-imspy.simulation.proteome"]], "imspy.simulation.tdf module": [[9, "module-imspy.simulation.tdf"]], "imspy.simulation.timsim package": [[10, null]], "imspy.simulation.timsim.jobs package": [[11, null]], "imspy.simulation.timsim.jobs.add_noise_from_real_data module": [[11, "module-imspy.simulation.timsim.jobs.add_noise_from_real_data"]], "imspy.simulation.timsim.jobs.assemble_frames module": [[11, "module-imspy.simulation.timsim.jobs.assemble_frames"]], "imspy.simulation.timsim.jobs.build_acquisition module": [[11, "module-imspy.simulation.timsim.jobs.build_acquisition"]], "imspy.simulation.timsim.jobs.digest_fasta module": [[11, "module-imspy.simulation.timsim.jobs.digest_fasta"]], "imspy.simulation.timsim.jobs.simulate_charge_states module": [[11, "module-imspy.simulation.timsim.jobs.simulate_charge_states"]], "imspy.simulation.timsim.jobs.simulate_fragment_intensities module": [[11, "module-imspy.simulation.timsim.jobs.simulate_fragment_intensities"]], "imspy.simulation.timsim.jobs.simulate_frame_distributions module": [[11, "module-imspy.simulation.timsim.jobs.simulate_frame_distributions"]], "imspy.simulation.timsim.jobs.simulate_frame_distributions_emg module": [[11, "module-imspy.simulation.timsim.jobs.simulate_frame_distributions_emg"]], "imspy.simulation.timsim.jobs.simulate_ion_mobilities module": [[11, "module-imspy.simulation.timsim.jobs.simulate_ion_mobilities"]], "imspy.simulation.timsim.jobs.simulate_occurrences module": [[11, "module-imspy.simulation.timsim.jobs.simulate_occurrences"]], "imspy.simulation.timsim.jobs.simulate_precursor_spectra module": [[11, "imspy-simulation-timsim-jobs-simulate-precursor-spectra-module"]], "imspy.simulation.timsim.jobs.simulate_retention_time module": [[11, "module-imspy.simulation.timsim.jobs.simulate_retention_time"]], "imspy.simulation.timsim.jobs.simulate_scan_distributions module": [[11, "module-imspy.simulation.timsim.jobs.simulate_scan_distributions"]], "imspy.simulation.timsim.jobs.utility module": [[11, "module-imspy.simulation.timsim.jobs.utility"]], "imspy.simulation.timsim.simulator module": [[10, "imspy-simulation-timsim-simulator-module"]], "imspy.simulation.utility module": [[9, "module-imspy.simulation.utility"]], "imspy.timstof package": [[12, null]], "imspy.timstof.collision module": [[12, "module-imspy.timstof.collision"]], "imspy.timstof.data module": [[12, "module-imspy.timstof.data"]], "imspy.timstof.dbsearch package": [[13, null]], "imspy.timstof.dbsearch.imspy_dda module": [[13, "module-imspy.timstof.dbsearch.imspy_dda"]], "imspy.timstof.dbsearch.imspy_rescore_sage module": [[13, "module-imspy.timstof.dbsearch.imspy_rescore_sage"]], "imspy.timstof.dbsearch.sage_output_utility module": [[13, "module-imspy.timstof.dbsearch.sage_output_utility"]], "imspy.timstof.dbsearch.utility module": [[13, "module-imspy.timstof.dbsearch.utility"]], "imspy.timstof.dda module": [[12, "module-imspy.timstof.dda"]], "imspy.timstof.dia module": [[12, "module-imspy.timstof.dia"]], "imspy.timstof.frame module": [[12, "module-imspy.timstof.frame"]], "imspy.timstof.quadrupole module": [[12, "module-imspy.timstof.quadrupole"]], "imspy.timstof.slice module": [[12, "module-imspy.timstof.slice"]], "imspy.utility package": [[14, null]], "imspy.utility.sequence module": [[14, "module-imspy.utility.sequence"]], "imspy.utility.utilities module": [[14, "module-imspy.utility.utilities"]], "imspy.vis package": [[15, null]], "imspy.vis.pointcloud module": [[15, "imspy-vis-pointcloud-module"]]}, "docnames": ["imspy", "imspy.algorithm", "imspy.algorithm.ccs", "imspy.algorithm.intensity", "imspy.algorithm.ionization", "imspy.algorithm.pretrained", "imspy.algorithm.rt", "imspy.chemistry", "imspy.data", "imspy.simulation", "imspy.simulation.timsim", "imspy.simulation.timsim.jobs", "imspy.timstof", "imspy.timstof.dbsearch", "imspy.utility", "imspy.vis", "index", "modules"], "envversion": {"sphinx": 64, "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}, "filenames": ["imspy.rst", "imspy.algorithm.rst", "imspy.algorithm.ccs.rst", "imspy.algorithm.intensity.rst", "imspy.algorithm.ionization.rst", "imspy.algorithm.pretrained.rst", "imspy.algorithm.rt.rst", "imspy.chemistry.rst", "imspy.data.rst", "imspy.simulation.rst", "imspy.simulation.timsim.rst", "imspy.simulation.timsim.jobs.rst", "imspy.timstof.rst", "imspy.timstof.dbsearch.rst", "imspy.utility.rst", "imspy.vis.rst", "index.rst", "modules.rst"], "indexentries": {"accumulated_intensity_cdf_numba() (in module imspy.simulation.utility)": [[9, "imspy.simulation.utility.accumulated_intensity_cdf_numba", false]], "acquisition_mode (imspy.timstof.data.timsdataset property)": [[12, "imspy.timstof.data.TimsDataset.acquisition_mode", false]], "acquisition_mode_numeric (imspy.timstof.data.timsdataset property)": [[12, "imspy.timstof.data.TimsDataset.acquisition_mode_numeric", false]], "acquisitionmode (class in imspy.timstof.data)": [[12, "imspy.timstof.data.AcquisitionMode", false]], "add_mz_noise_normal() (imspy.data.spectrum.mzspectrum method)": [[8, "imspy.data.spectrum.MzSpectrum.add_mz_noise_normal", false]], "add_mz_noise_uniform() (imspy.data.spectrum.mzspectrum method)": [[8, "imspy.data.spectrum.MzSpectrum.add_mz_noise_uniform", false]], "add_real_data_noise_to_frames() (in module imspy.simulation.timsim.jobs.add_noise_from_real_data)": [[11, "imspy.simulation.timsim.jobs.add_noise_from_real_data.add_real_data_noise_to_frames", false]], "add_uniform_noise() (in module imspy.simulation.utility)": [[9, "imspy.simulation.utility.add_uniform_noise", false]], "all_transmitted() (imspy.timstof.quadrupole.timstofquadrupoledia method)": [[12, "imspy.timstof.quadrupole.TimsTofQuadrupoleDIA.all_transmitted", false]], "amino_acid_count (imspy.data.peptide.peptidesequence property)": [[8, "imspy.data.peptide.PeptideSequence.amino_acid_count", false]], "annotations (imspy.simulation.annotation.mzspectrumannotated property)": [[9, "imspy.simulation.annotation.MzSpectrumAnnotated.annotations", false]], "annotations (imspy.simulation.annotation.timsframeannotated property)": [[9, "imspy.simulation.annotation.TimsFrameAnnotated.annotations", false]], "any_transmitted() (imspy.timstof.quadrupole.timstofquadrupoledia method)": [[12, "imspy.timstof.quadrupole.TimsTofQuadrupoleDIA.any_transmitted", false]], "append_table() (imspy.simulation.experiment.syntheticexperimentdatahandle method)": [[9, "imspy.simulation.experiment.SyntheticExperimentDataHandle.append_table", false]], "apply() (imspy.timstof.dbsearch.sage_output_utility.patternreplacer method)": [[13, "imspy.timstof.dbsearch.sage_output_utility.PatternReplacer.apply", false]], "apply_transmission() (imspy.timstof.quadrupole.timstofquadrupoledia method)": [[12, "imspy.timstof.quadrupole.TimsTofQuadrupoleDIA.apply_transmission", false]], "assemble_frames() (in module imspy.simulation.timsim.jobs.assemble_frames)": [[11, "imspy.simulation.timsim.jobs.assemble_frames.assemble_frames", false]], "associate_fragment_ion_series_with_prosit_intensities() (imspy.data.peptide.peptidesequence method)": [[8, "imspy.data.peptide.PeptideSequence.associate_fragment_ion_series_with_prosit_intensities", false]], "atomic_composition (imspy.data.peptide.peptideion property)": [[8, "imspy.data.peptide.PeptideIon.atomic_composition", false]], "atomic_composition (imspy.data.peptide.peptidesequence property)": [[8, "imspy.data.peptide.PeptideSequence.atomic_composition", false]], "atomic_composition() (imspy.data.peptide.peptideproduction method)": [[8, "imspy.data.peptide.PeptideProductIon.atomic_composition", false]], "average_cycle_length (imspy.timstof.data.timsdataset property)": [[12, "imspy.timstof.data.TimsDataset.average_cycle_length", false]], "baseline_noise() (in module imspy.simulation.noise)": [[9, "imspy.simulation.noise.baseline_noise", false]], "baseline_shot_noise() (in module imspy.simulation.noise)": [[9, "imspy.simulation.noise.baseline_shot_noise", false]], "baseline_shot_noise_window() (in module imspy.simulation.noise)": [[9, "imspy.simulation.noise.baseline_shot_noise_window", false]], "beta_score() (in module imspy.algorithm.intensity.utility)": [[3, "imspy.algorithm.intensity.utility.beta_score", false]], "binomialchargestatedistributionmodel (class in imspy.algorithm.ionization.predictors)": [[4, "imspy.algorithm.ionization.predictors.BinomialChargeStateDistributionModel", false]], "break_into_equal_size_sets() (in module imspy.timstof.dbsearch.sage_output_utility)": [[13, "imspy.timstof.dbsearch.sage_output_utility.break_into_equal_size_sets", false]], "build() (imspy.algorithm.ccs.predictors.gruccspredictor method)": [[2, "imspy.algorithm.ccs.predictors.GRUCCSPredictor.build", false]], "build() (imspy.algorithm.ccs.predictors.squarerootprojectionlayer method)": [[2, "imspy.algorithm.ccs.predictors.SquareRootProjectionLayer.build", false]], "build() (imspy.algorithm.ionization.predictors.gruchargestatepredictor method)": [[4, "imspy.algorithm.ionization.predictors.GRUChargeStatePredictor.build", false]], "build() (imspy.algorithm.rt.predictors.gruretentiontimepredictor method)": [[6, "imspy.algorithm.rt.predictors.GRURetentionTimePredictor.build", false]], "build_acquisition() (in module imspy.simulation.timsim.jobs.build_acquisition)": [[11, "imspy.simulation.timsim.jobs.build_acquisition.build_acquisition", false]], "build_frame() (imspy.simulation.experiment.timstofsyntheticframebuilderdia method)": [[9, "imspy.simulation.experiment.TimsTofSyntheticFrameBuilderDIA.build_frame", false]], "build_frame_annotated() (imspy.simulation.experiment.timstofsyntheticframebuilderdia method)": [[9, "imspy.simulation.experiment.TimsTofSyntheticFrameBuilderDIA.build_frame_annotated", false]], "build_frame_meta_row() (imspy.simulation.tdf.tdfwriter method)": [[9, "imspy.simulation.tdf.TDFWriter.build_frame_meta_row", false]], "build_frames() (imspy.simulation.experiment.timstofsyntheticframebuilderdia method)": [[9, "imspy.simulation.experiment.TimsTofSyntheticFrameBuilderDIA.build_frames", false]], "build_frames_annotated() (imspy.simulation.experiment.timstofsyntheticframebuilderdia method)": [[9, "imspy.simulation.experiment.TimsTofSyntheticFrameBuilderDIA.build_frames_annotated", false]], "build_precursor_frame() (imspy.simulation.experiment.timstofsyntheticprecursorframebuilder method)": [[9, "imspy.simulation.experiment.TimsTofSyntheticPrecursorFrameBuilder.build_precursor_frame", false]], "build_precursor_frame_annotated() (imspy.simulation.experiment.timstofsyntheticprecursorframebuilder method)": [[9, "imspy.simulation.experiment.TimsTofSyntheticPrecursorFrameBuilder.build_precursor_frame_annotated", false]], "build_precursor_frames() (imspy.simulation.experiment.timstofsyntheticprecursorframebuilder method)": [[9, "imspy.simulation.experiment.TimsTofSyntheticPrecursorFrameBuilder.build_precursor_frames", false]], "build_precursor_frames_annotated() (imspy.simulation.experiment.timstofsyntheticprecursorframebuilder method)": [[9, "imspy.simulation.experiment.TimsTofSyntheticPrecursorFrameBuilder.build_precursor_frames_annotated", false]], "bytes_to_indexed_values() (imspy.timstof.data.timsdataset method)": [[12, "imspy.timstof.data.TimsDataset.bytes_to_indexed_values", false]], "c_ions (imspy.data.peptide.peptideproductionseries property)": [[8, "imspy.data.peptide.PeptideProductIonSeries.c_ions", false]], "calculate_b_y_fragment_mz() (in module imspy.simulation.utility)": [[9, "imspy.simulation.utility.calculate_b_y_fragment_mz", false]], "calculate_b_y_ion_series_ims() (in module imspy.simulation.utility)": [[9, "imspy.simulation.utility.calculate_b_y_ion_series_ims", false]], "calculate_bounds_numba() (in module imspy.simulation.utility)": [[9, "imspy.simulation.utility.calculate_bounds_numba", false]], "calculate_frame_types() (imspy.simulation.acquisition.timstofacquisitionbuilder method)": [[9, "imspy.simulation.acquisition.TimsTofAcquisitionBuilder.calculate_frame_types", false]], "calculate_frame_types() (imspy.simulation.acquisition.timstofacquisitionbuilderdda method)": [[9, "imspy.simulation.acquisition.TimsTofAcquisitionBuilderDDA.calculate_frame_types", false]], "calculate_frame_types() (imspy.simulation.acquisition.timstofacquisitionbuilderdia method)": [[9, "imspy.simulation.acquisition.TimsTofAcquisitionBuilderDIA.calculate_frame_types", false]], "calculate_isotopic_product_ion_spectrum_annotated() (imspy.data.peptide.peptidesequence method)": [[8, "imspy.data.peptide.PeptideSequence.calculate_isotopic_product_ion_spectrum_annotated", false]], "calculate_isotopic_spectrum() (imspy.data.peptide.peptideion method)": [[8, "imspy.data.peptide.PeptideIon.calculate_isotopic_spectrum", false]], "calculate_isotopic_spectrum_annotated() (imspy.data.peptide.peptideion method)": [[8, "imspy.data.peptide.PeptideIon.calculate_isotopic_spectrum_annotated", false]], "calculate_keys() (imspy.algorithm.hashing.cosimhasher method)": [[1, "imspy.algorithm.hashing.CosimHasher.calculate_keys", false]], "calculate_mobility_spacing() (in module imspy.simulation.utility)": [[9, "imspy.simulation.utility.calculate_mobility_spacing", false]], "calculate_mono_isotopic_product_ion_spectrum() (imspy.data.peptide.peptidesequence method)": [[8, "imspy.data.peptide.PeptideSequence.calculate_mono_isotopic_product_ion_spectrum", false]], "calculate_mono_isotopic_product_ion_spectrum_annotated() (imspy.data.peptide.peptidesequence method)": [[8, "imspy.data.peptide.PeptideSequence.calculate_mono_isotopic_product_ion_spectrum_annotated", false]], "calculate_mz() (in module imspy.chemistry.utility)": [[7, "imspy.chemistry.utility.calculate_mz", false]], "calculate_number_frames() (in module imspy.simulation.utility)": [[9, "imspy.simulation.utility.calculate_number_frames", false]], "calculate_product_ion_series() (imspy.data.peptide.peptidesequence method)": [[8, "imspy.data.peptide.PeptideSequence.calculate_product_ion_series", false]], "calculate_transmission_dependent_fragment_ion_isotope_distribution() (in module imspy.chemistry.utility)": [[7, "imspy.chemistry.utility.calculate_transmission_dependent_fragment_ion_isotope_distribution", false]], "call() (imspy.algorithm.ccs.predictors.gruccspredictor method)": [[2, "imspy.algorithm.ccs.predictors.GRUCCSPredictor.call", false]], "call() (imspy.algorithm.ccs.predictors.squarerootprojectionlayer method)": [[2, "imspy.algorithm.ccs.predictors.SquareRootProjectionLayer.call", false]], "call() (imspy.algorithm.ionization.predictors.gruchargestatepredictor method)": [[4, "imspy.algorithm.ionization.predictors.GRUChargeStatePredictor.call", false]], "call() (imspy.algorithm.rt.predictors.gruretentiontimepredictor method)": [[6, "imspy.algorithm.rt.predictors.GRURetentionTimePredictor.call", false]], "ccs_to_one_over_k0() (in module imspy.chemistry.mobility)": [[7, "imspy.chemistry.mobility.ccs_to_one_over_k0", false]], "charge (imspy.data.peptide.peptideion property)": [[8, "imspy.data.peptide.PeptideIon.charge", false]], "charge (imspy.data.peptide.peptideproduction property)": [[8, "imspy.data.peptide.PeptideProductIon.charge", false]], "charge (imspy.data.peptide.peptideproductionseries property)": [[8, "imspy.data.peptide.PeptideProductIonSeries.charge", false]], "charge_state (imspy.simulation.annotation.signalattributes property)": [[9, "imspy.simulation.annotation.SignalAttributes.charge_state", false]], "charge_state_distribution_from_sequence_rust() (in module imspy.algorithm.ionization.predictors)": [[4, "imspy.algorithm.ionization.predictors.charge_state_distribution_from_sequence_rust", false]], "charge_state_distributions_from_sequences_rust() (in module imspy.algorithm.ionization.predictors)": [[4, "imspy.algorithm.ionization.predictors.charge_state_distributions_from_sequences_rust", false]], "charge_states_first_only (imspy.simulation.annotation.timsframeannotated property)": [[9, "imspy.simulation.annotation.TimsFrameAnnotated.charge_states_first_only", false]], "check_path() (in module imspy.simulation.timsim.jobs.utility)": [[11, "imspy.simulation.timsim.jobs.utility.check_path", false]], "close() (imspy.simulation.experiment.syntheticexperimentdatahandle method)": [[9, "imspy.simulation.experiment.SyntheticExperimentDataHandle.close", false]], "collision_energy (imspy.timstof.dda.fragmentdda property)": [[12, "imspy.timstof.dda.FragmentDDA.collision_energy", false]], "compress_frame() (imspy.simulation.tdf.tdfwriter method)": [[9, "imspy.simulation.tdf.TDFWriter.compress_frame", false]], "compress_frames() (imspy.timstof.data.timsdataset method)": [[12, "imspy.timstof.data.TimsDataset.compress_frames", false]], "compress_zstd() (imspy.timstof.data.timsdataset method)": [[12, "imspy.timstof.data.TimsDataset.compress_zstd", false]], "contributions (imspy.simulation.annotation.peakannotation property)": [[9, "imspy.simulation.annotation.PeakAnnotation.contributions", false]], "contributionsource (class in imspy.simulation.annotation)": [[9, "imspy.simulation.annotation.ContributionSource", false]], "cosim_from_dict() (in module imspy.timstof.dbsearch.sage_output_utility)": [[13, "imspy.timstof.dbsearch.sage_output_utility.cosim_from_dict", false]], "cosimhasher (class in imspy.algorithm.hashing)": [[1, "imspy.algorithm.hashing.CosimHasher", false]], "count_number_transmissions() (imspy.simulation.experiment.timstofsyntheticframebuilderdia method)": [[9, "imspy.simulation.experiment.TimsTofSyntheticFrameBuilderDIA.count_number_transmissions", false]], "count_number_transmissions_parallel() (imspy.simulation.experiment.timstofsyntheticframebuilderdia method)": [[9, "imspy.simulation.experiment.TimsTofSyntheticFrameBuilderDIA.count_number_transmissions_parallel", false]], "create_database() (in module imspy.timstof.dbsearch.imspy_dda)": [[13, "imspy.timstof.dbsearch.imspy_dda.create_database", false]], "create_table() (imspy.simulation.experiment.syntheticexperimentdatahandle method)": [[9, "imspy.simulation.experiment.SyntheticExperimentDataHandle.create_table", false]], "create_table_sql() (imspy.simulation.experiment.syntheticexperimentdatahandle method)": [[9, "imspy.simulation.experiment.SyntheticExperimentDataHandle.create_table_sql", false]], "custom_cdf() (in module imspy.simulation.utility)": [[9, "imspy.simulation.utility.custom_cdf", false]], "decompress_zstd() (imspy.timstof.data.timsdataset method)": [[12, "imspy.timstof.data.TimsDataset.decompress_zstd", false]], "deepchargestatedistribution (class in imspy.algorithm.ionization.predictors)": [[4, "imspy.algorithm.ionization.predictors.DeepChargeStateDistribution", false]], "deepchromatographyapex (class in imspy.algorithm.rt.predictors)": [[6, "imspy.algorithm.rt.predictors.DeepChromatographyApex", false]], "deeppeptideionmobilityapex (class in imspy.algorithm.ccs.predictors)": [[2, "imspy.algorithm.ccs.predictors.DeepPeptideIonMobilityApex", false]], "description (imspy.simulation.annotation.signalattributes property)": [[9, "imspy.simulation.annotation.SignalAttributes.description", false]], "description (imspy.timstof.data.timsdataset property)": [[12, "imspy.timstof.data.TimsDataset.description", false]], "detection_noise() (in module imspy.simulation.noise)": [[9, "imspy.simulation.noise.detection_noise", false]], "df (imspy.data.spectrum.indexedmzspectrum property)": [[8, "imspy.data.spectrum.IndexedMzSpectrum.df", false]], "df (imspy.data.spectrum.mzspectrum property)": [[8, "imspy.data.spectrum.MzSpectrum.df", false]], "df (imspy.data.spectrum.timsspectrum property)": [[8, "imspy.data.spectrum.TimsSpectrum.df", false]], "df (imspy.simulation.annotation.timsframeannotated property)": [[9, "imspy.simulation.annotation.TimsFrameAnnotated.df", false]], "df (imspy.timstof.frame.timsframe property)": [[12, "imspy.timstof.frame.TimsFrame.df", false]], "df (imspy.timstof.frame.timsframevectorized property)": [[12, "imspy.timstof.frame.TimsFrameVectorized.df", false]], "df (imspy.timstof.slice.timsplane property)": [[12, "imspy.timstof.slice.TimsPlane.df", false]], "df (imspy.timstof.slice.timsslice property)": [[12, "imspy.timstof.slice.TimsSlice.df", false]], "df (imspy.timstof.slice.timsslicevectorized property)": [[12, "imspy.timstof.slice.TimsSliceVectorized.df", false]], "dia_ms_ms_info (imspy.timstof.dia.timsdatasetdia property)": [[12, "imspy.timstof.dia.TimsDatasetDIA.dia_ms_ms_info", false]], "dia_ms_ms_windows (imspy.timstof.dia.timsdatasetdia property)": [[12, "imspy.timstof.dia.TimsDatasetDIA.dia_ms_ms_windows", false]], "digest_fasta() (in module imspy.simulation.timsim.jobs.digest_fasta)": [[11, "imspy.simulation.timsim.jobs.digest_fasta.digest_fasta", false]], "exp_distribution() (in module imspy.utility.utilities)": [[14, "imspy.utility.utilities.exp_distribution", false]], "exp_gaussian() (in module imspy.utility.utilities)": [[14, "imspy.utility.utilities.exp_gaussian", false]], "exponentialgaussiandistribution (class in imspy.utility.utilities)": [[14, "imspy.utility.utilities.ExponentialGaussianDistribution", false]], "extract_timstof_dda_data() (in module imspy.timstof.dbsearch.utility)": [[13, "imspy.timstof.dbsearch.utility.extract_timstof_dda_data", false]], "filter() (imspy.data.spectrum.indexedmzspectrum method)": [[8, "imspy.data.spectrum.IndexedMzSpectrum.filter", false]], "filter() (imspy.data.spectrum.mzspectrum method)": [[8, "imspy.data.spectrum.MzSpectrum.filter", false]], "filter() (imspy.data.spectrum.timsspectrum method)": [[8, "imspy.data.spectrum.TimsSpectrum.filter", false]], "filter() (imspy.simulation.annotation.mzspectrumannotated method)": [[9, "imspy.simulation.annotation.MzSpectrumAnnotated.filter", false]], "filter() (imspy.simulation.annotation.timsframeannotated method)": [[9, "imspy.simulation.annotation.TimsFrameAnnotated.filter", false]], "filter() (imspy.timstof.frame.timsframe method)": [[12, "imspy.timstof.frame.TimsFrame.filter", false]], "filter() (imspy.timstof.frame.timsframevectorized method)": [[12, "imspy.timstof.frame.TimsFrameVectorized.filter", false]], "filter() (imspy.timstof.slice.timsslice method)": [[12, "imspy.timstof.slice.TimsSlice.filter", false]], "filter() (imspy.timstof.slice.timsslicevectorized method)": [[12, "imspy.timstof.slice.TimsSliceVectorized.filter", false]], "filter_by_type() (imspy.timstof.slice.timsslice method)": [[12, "imspy.timstof.slice.TimsSlice.filter_by_type", false]], "find_series() (imspy.data.peptide.peptideproductionseriescollection method)": [[8, "imspy.data.peptide.PeptideProductIonSeriesCollection.find_series", false]], "fine_tune_model() (imspy.algorithm.ccs.predictors.deeppeptideionmobilityapex method)": [[2, "imspy.algorithm.ccs.predictors.DeepPeptideIonMobilityApex.fine_tune_model", false]], "fine_tune_model() (imspy.algorithm.rt.predictors.deepchromatographyapex method)": [[6, "imspy.algorithm.rt.predictors.DeepChromatographyApex.fine_tune_model", false]], "first_frame_id (imspy.timstof.slice.timsslice property)": [[12, "imspy.timstof.slice.TimsSlice.first_frame_id", false]], "first_frame_id (imspy.timstof.slice.timsslicevectorized property)": [[12, "imspy.timstof.slice.TimsSliceVectorized.first_frame_id", false]], "flat_intensity_to_sparse() (in module imspy.simulation.utility)": [[9, "imspy.simulation.utility.flat_intensity_to_sparse", false]], "flatten_prosit_array() (in module imspy.simulation.utility)": [[9, "imspy.simulation.utility.flatten_prosit_array", false]], "formula (imspy.chemistry.sum_formula.sumformula property)": [[7, "imspy.chemistry.sum_formula.SumFormula.formula", false]], "formula_dict (imspy.chemistry.sum_formula.sumformula property)": [[7, "imspy.chemistry.sum_formula.SumFormula.formula_dict", false]], "fragmentdda (class in imspy.timstof.dda)": [[12, "imspy.timstof.dda.FragmentDDA", false]], "fragments (imspy.timstof.slice.timsslice property)": [[12, "imspy.timstof.slice.TimsSlice.fragments", false]], "fragments (imspy.timstof.slice.timsslicevectorized property)": [[12, "imspy.timstof.slice.TimsSliceVectorized.fragments", false]], "fragments_to_dict() (in module imspy.timstof.dbsearch.sage_output_utility)": [[13, "imspy.timstof.dbsearch.sage_output_utility.fragments_to_dict", false]], "frame_count (imspy.timstof.data.timsdataset property)": [[12, "imspy.timstof.data.TimsDataset.frame_count", false]], "frame_id (imspy.data.spectrum.timsspectrum property)": [[8, "imspy.data.spectrum.TimsSpectrum.frame_id", false]], "frame_id (imspy.simulation.annotation.timsframeannotated property)": [[9, "imspy.simulation.annotation.TimsFrameAnnotated.frame_id", false]], "frame_id (imspy.timstof.dda.fragmentdda property)": [[12, "imspy.timstof.dda.FragmentDDA.frame_id", false]], "frame_id (imspy.timstof.frame.timsframe property)": [[12, "imspy.timstof.frame.TimsFrame.frame_id", false]], "frame_id (imspy.timstof.frame.timsframevectorized property)": [[12, "imspy.timstof.frame.TimsFrameVectorized.frame_id", false]], "frame_ids (imspy.timstof.slice.timsplane property)": [[12, "imspy.timstof.slice.TimsPlane.frame_ids", false]], "frame_to_window_group() (imspy.timstof.quadrupole.timstofquadrupoledia method)": [[12, "imspy.timstof.quadrupole.TimsTofQuadrupoleDIA.frame_to_window_group", false]], "frames (imspy.timstof.slice.timsslice property)": [[12, "imspy.timstof.slice.TimsSlice.frames", false]], "frames (imspy.timstof.slice.timsslicevectorized property)": [[12, "imspy.timstof.slice.TimsSliceVectorized.frames", false]], "from_config() (imspy.algorithm.ccs.predictors.gruccspredictor class method)": [[2, "imspy.algorithm.ccs.predictors.GRUCCSPredictor.from_config", false]], "from_config() (imspy.algorithm.ccs.predictors.squarerootprojectionlayer class method)": [[2, "imspy.algorithm.ccs.predictors.SquareRootProjectionLayer.from_config", false]], "from_config() (imspy.algorithm.ionization.predictors.gruchargestatepredictor class method)": [[4, "imspy.algorithm.ionization.predictors.GRUChargeStatePredictor.from_config", false]], "from_config() (imspy.algorithm.rt.predictors.gruretentiontimepredictor class method)": [[6, "imspy.algorithm.rt.predictors.GRURetentionTimePredictor.from_config", false]], "from_config() (imspy.simulation.acquisition.timstofacquisitionbuilderdia static method)": [[9, "imspy.simulation.acquisition.TimsTofAcquisitionBuilderDIA.from_config", false]], "from_existing() (imspy.simulation.acquisition.timstofacquisitionbuilder class method)": [[9, "imspy.simulation.acquisition.TimsTofAcquisitionBuilder.from_existing", false]], "from_existing() (imspy.simulation.acquisition.timstofacquisitionbuilderdia class method)": [[9, "imspy.simulation.acquisition.TimsTofAcquisitionBuilderDIA.from_existing", false]], "from_frames() (imspy.timstof.slice.timsslice class method)": [[12, "imspy.timstof.slice.TimsSlice.from_frames", false]], "from_jsons() (imspy.data.spectrum.mzspectrum class method)": [[8, "imspy.data.spectrum.MzSpectrum.from_jsons", false]], "from_mz_spectra_list() (imspy.data.spectrum.mzspectrum class method)": [[8, "imspy.data.spectrum.MzSpectrum.from_mz_spectra_list", false]], "from_py_ptr() (imspy.chemistry.sum_formula.sumformula class method)": [[7, "imspy.chemistry.sum_formula.SumFormula.from_py_ptr", false]], "from_py_ptr() (imspy.data.peptide.peptideion class method)": [[8, "imspy.data.peptide.PeptideIon.from_py_ptr", false]], "from_py_ptr() (imspy.data.peptide.peptideproduction class method)": [[8, "imspy.data.peptide.PeptideProductIon.from_py_ptr", false]], "from_py_ptr() (imspy.data.peptide.peptideproductionseries class method)": [[8, "imspy.data.peptide.PeptideProductIonSeries.from_py_ptr", false]], "from_py_ptr() (imspy.data.peptide.peptideproductionseriescollection class method)": [[8, "imspy.data.peptide.PeptideProductIonSeriesCollection.from_py_ptr", false]], "from_py_ptr() (imspy.data.peptide.peptidesequence class method)": [[8, "imspy.data.peptide.PeptideSequence.from_py_ptr", false]], "from_py_ptr() (imspy.data.spectrum.indexedmzspectrum class method)": [[8, "imspy.data.spectrum.IndexedMzSpectrum.from_py_ptr", false]], "from_py_ptr() (imspy.data.spectrum.mzspectrum class method)": [[8, "imspy.data.spectrum.MzSpectrum.from_py_ptr", false]], "from_py_ptr() (imspy.data.spectrum.mzspectrumvectorized class method)": [[8, "imspy.data.spectrum.MzSpectrumVectorized.from_py_ptr", false]], "from_py_ptr() (imspy.data.spectrum.timsspectrum class method)": [[8, "imspy.data.spectrum.TimsSpectrum.from_py_ptr", false]], "from_py_ptr() (imspy.simulation.annotation.contributionsource class method)": [[9, "imspy.simulation.annotation.ContributionSource.from_py_ptr", false]], "from_py_ptr() (imspy.simulation.annotation.mzspectrumannotated class method)": [[9, "imspy.simulation.annotation.MzSpectrumAnnotated.from_py_ptr", false]], "from_py_ptr() (imspy.simulation.annotation.peakannotation class method)": [[9, "imspy.simulation.annotation.PeakAnnotation.from_py_ptr", false]], "from_py_ptr() (imspy.simulation.annotation.rustwrapperobject class method)": [[9, "imspy.simulation.annotation.RustWrapperObject.from_py_ptr", false]], "from_py_ptr() (imspy.simulation.annotation.signalattributes class method)": [[9, "imspy.simulation.annotation.SignalAttributes.from_py_ptr", false]], "from_py_ptr() (imspy.simulation.annotation.sourcetype class method)": [[9, "imspy.simulation.annotation.SourceType.from_py_ptr", false]], "from_py_ptr() (imspy.simulation.annotation.timsframeannotated class method)": [[9, "imspy.simulation.annotation.TimsFrameAnnotated.from_py_ptr", false]], "from_py_ptr() (imspy.simulation.experiment.timstofsyntheticframebuilderdia class method)": [[9, "imspy.simulation.experiment.TimsTofSyntheticFrameBuilderDIA.from_py_ptr", false]], "from_py_ptr() (imspy.simulation.experiment.timstofsyntheticprecursorframebuilder class method)": [[9, "imspy.simulation.experiment.TimsTofSyntheticPrecursorFrameBuilder.from_py_ptr", false]], "from_py_ptr() (imspy.timstof.data.acquisitionmode class method)": [[12, "imspy.timstof.data.AcquisitionMode.from_py_ptr", false]], "from_py_ptr() (imspy.timstof.dda.fragmentdda class method)": [[12, "imspy.timstof.dda.FragmentDDA.from_py_ptr", false]], "from_py_ptr() (imspy.timstof.dda.timsdatasetdda class method)": [[12, "imspy.timstof.dda.TimsDatasetDDA.from_py_ptr", false]], "from_py_ptr() (imspy.timstof.dia.timsdatasetdia class method)": [[12, "imspy.timstof.dia.TimsDatasetDIA.from_py_ptr", false]], "from_py_ptr() (imspy.timstof.frame.timsframe class method)": [[12, "imspy.timstof.frame.TimsFrame.from_py_ptr", false]], "from_py_ptr() (imspy.timstof.frame.timsframevectorized class method)": [[12, "imspy.timstof.frame.TimsFrameVectorized.from_py_ptr", false]], "from_py_tims_plane() (imspy.timstof.slice.timsplane class method)": [[12, "imspy.timstof.slice.TimsPlane.from_py_tims_plane", false]], "from_py_tims_slice() (imspy.timstof.slice.timsslice class method)": [[12, "imspy.timstof.slice.TimsSlice.from_py_tims_slice", false]], "from_tims_spectra() (imspy.timstof.frame.timsframe class method)": [[12, "imspy.timstof.frame.TimsFrame.from_tims_spectra", false]], "from_vectorized_py_tims_slice() (imspy.timstof.slice.timsslicevectorized class method)": [[12, "imspy.timstof.slice.TimsSliceVectorized.from_vectorized_py_tims_slice", false]], "from_windows() (imspy.timstof.frame.timsframe class method)": [[12, "imspy.timstof.frame.TimsFrame.from_windows", false]], "gaussian() (in module imspy.utility.utilities)": [[14, "imspy.utility.utilities.gaussian", false]], "generate_balanced_im_dataset() (in module imspy.timstof.dbsearch.utility)": [[13, "imspy.timstof.dbsearch.utility.generate_balanced_im_dataset", false]], "generate_balanced_rt_dataset() (in module imspy.timstof.dbsearch.utility)": [[13, "imspy.timstof.dbsearch.utility.generate_balanced_rt_dataset", false]], "generate_events() (in module imspy.simulation.utility)": [[9, "imspy.simulation.utility.generate_events", false]], "generate_frame_table() (imspy.simulation.acquisition.timstofacquisitionbuilder method)": [[9, "imspy.simulation.acquisition.TimsTofAcquisitionBuilder.generate_frame_table", false]], "generate_frame_to_window_group_table() (imspy.simulation.acquisition.timstofacquisitionbuilderdia method)": [[9, "imspy.simulation.acquisition.TimsTofAcquisitionBuilderDIA.generate_frame_to_window_group_table", false]], "generate_isotope_distribution() (imspy.chemistry.sum_formula.sumformula method)": [[7, "imspy.chemistry.sum_formula.SumFormula.generate_isotope_distribution", false]], "generate_isotopic_spectrum() (imspy.data.peptide.peptideproductionseriescollection method)": [[8, "imspy.data.peptide.PeptideProductIonSeriesCollection.generate_isotopic_spectrum", false]], "generate_isotopic_spectrum_annotated() (imspy.data.peptide.peptideproductionseriescollection method)": [[8, "imspy.data.peptide.PeptideProductIonSeriesCollection.generate_isotopic_spectrum_annotated", false]], "generate_noise_peak() (in module imspy.simulation.noise)": [[9, "imspy.simulation.noise.generate_noise_peak", false]], "generate_prosit_intensity_prediction_dataset() (in module imspy.algorithm.intensity.utility)": [[3, "imspy.algorithm.intensity.utility.generate_prosit_intensity_prediction_dataset", false]], "generate_scan_table() (imspy.simulation.acquisition.timstofacquisitionbuilder method)": [[9, "imspy.simulation.acquisition.TimsTofAcquisitionBuilder.generate_scan_table", false]], "generate_tf_ds_inference() (imspy.algorithm.rt.predictors.deepchromatographyapex method)": [[6, "imspy.algorithm.rt.predictors.DeepChromatographyApex.generate_tf_ds_inference", false]], "generate_tf_ds_train() (imspy.algorithm.rt.predictors.deepchromatographyapex method)": [[6, "imspy.algorithm.rt.predictors.DeepChromatographyApex.generate_tf_ds_train", false]], "generate_training_data() (in module imspy.timstof.dbsearch.sage_output_utility)": [[13, "imspy.timstof.dbsearch.sage_output_utility.generate_training_data", false]], "generate_training_data() (in module imspy.timstof.dbsearch.utility)": [[13, "imspy.timstof.dbsearch.utility.generate_training_data", false]], "get_aa_num_proforma_sequence() (in module imspy.utility.utilities)": [[14, "imspy.utility.utilities.get_aa_num_proforma_sequence", false]], "get_acquisition_builder_resource_path() (in module imspy.simulation.utility)": [[9, "imspy.simulation.utility.get_acquisition_builder_resource_path", false]], "get_arrays_at_index() (imspy.timstof.frame.timsframevectorized method)": [[12, "imspy.timstof.frame.TimsFrameVectorized.get_arrays_at_index", false]], "get_collision_energies() (imspy.simulation.experiment.timstofsyntheticframebuilderdia method)": [[9, "imspy.simulation.experiment.TimsTofSyntheticFrameBuilderDIA.get_collision_energies", false]], "get_collision_energies() (imspy.timstof.collision.timstofcollisionenergy method)": [[12, "imspy.timstof.collision.TimsTofCollisionEnergy.get_collision_energies", false]], "get_collision_energies() (imspy.timstof.collision.timstofcollisionenergydia method)": [[12, "imspy.timstof.collision.TimsTofCollisionEnergyDIA.get_collision_energies", false]], "get_collision_energy() (imspy.simulation.experiment.timstofsyntheticframebuilderdia method)": [[9, "imspy.simulation.experiment.TimsTofSyntheticFrameBuilderDIA.get_collision_energy", false]], "get_collision_energy() (imspy.timstof.collision.timstofcollisionenergy method)": [[12, "imspy.timstof.collision.TimsTofCollisionEnergy.get_collision_energy", false]], "get_collision_energy() (imspy.timstof.collision.timstofcollisionenergydia method)": [[12, "imspy.timstof.collision.TimsTofCollisionEnergyDIA.get_collision_energy", false]], "get_collision_energy_calibration_factor() (in module imspy.algorithm.intensity.predictors)": [[3, "imspy.algorithm.intensity.predictors.get_collision_energy_calibration_factor", false]], "get_compressible_data() (in module imspy.simulation.utility)": [[9, "imspy.simulation.utility.get_compressible_data", false]], "get_config() (imspy.algorithm.ccs.predictors.gruccspredictor method)": [[2, "imspy.algorithm.ccs.predictors.GRUCCSPredictor.get_config", false]], "get_config() (imspy.algorithm.ccs.predictors.squarerootprojectionlayer method)": [[2, "imspy.algorithm.ccs.predictors.SquareRootProjectionLayer.get_config", false]], "get_config() (imspy.algorithm.ionization.predictors.gruchargestatepredictor method)": [[4, "imspy.algorithm.ionization.predictors.GRUChargeStatePredictor.get_config", false]], "get_config() (imspy.algorithm.rt.predictors.gruretentiontimepredictor method)": [[6, "imspy.algorithm.rt.predictors.GRURetentionTimePredictor.get_config", false]], "get_dilution_factors() (in module imspy.simulation.utility)": [[9, "imspy.simulation.utility.get_dilution_factors", false]], "get_fasta_file_paths() (in module imspy.simulation.utility)": [[9, "imspy.simulation.utility.get_fasta_file_paths", false]], "get_frame_meta_data() (imspy.simulation.tdf.tdfwriter method)": [[9, "imspy.simulation.tdf.TDFWriter.get_frame_meta_data", false]], "get_frame_to_window_group() (imspy.simulation.experiment.syntheticexperimentdatahandledia method)": [[9, "imspy.simulation.experiment.SyntheticExperimentDataHandleDIA.get_frame_to_window_group", false]], "get_frames_numba() (in module imspy.simulation.utility)": [[9, "imspy.simulation.utility.get_frames_numba", false]], "get_inverse_mobility_along_scan_marginal() (imspy.timstof.frame.timsframe method)": [[12, "imspy.timstof.frame.TimsFrame.get_inverse_mobility_along_scan_marginal", false]], "get_ion_transmission_matrix() (imspy.simulation.experiment.timstofsyntheticframebuilderdia method)": [[9, "imspy.simulation.experiment.TimsTofSyntheticFrameBuilderDIA.get_ion_transmission_matrix", false]], "get_mobility_mean_and_variance() (imspy.timstof.frame.timsframe method)": [[12, "imspy.timstof.frame.TimsFrame.get_mobility_mean_and_variance", false]], "get_model_path() (in module imspy.algorithm.utility)": [[1, "imspy.algorithm.utility.get_model_path", false]], "get_ms_ms_window_layout_resource_path() (in module imspy.simulation.utility)": [[9, "imspy.simulation.utility.get_ms_ms_window_layout_resource_path", false]], "get_native_dataset_path() (in module imspy.simulation.utility)": [[9, "imspy.simulation.utility.get_native_dataset_path", false]], "get_pasef_fragments() (imspy.timstof.dda.timsdatasetdda method)": [[12, "imspy.timstof.dda.TimsDatasetDDA.get_pasef_fragments", false]], "get_peak_cnts() (in module imspy.simulation.utility)": [[9, "imspy.simulation.utility.get_peak_cnts", false]], "get_peak_integral() (in module imspy.data.spectrum)": [[8, "imspy.data.spectrum.get_peak_integral", false]], "get_prosit_intensity_flat_labels() (in module imspy.algorithm.intensity.utility)": [[3, "imspy.algorithm.intensity.utility.get_prosit_intensity_flat_labels", false]], "get_py_ptr() (imspy.chemistry.sum_formula.sumformula method)": [[7, "imspy.chemistry.sum_formula.SumFormula.get_py_ptr", false]], "get_py_ptr() (imspy.data.peptide.peptideion method)": [[8, "imspy.data.peptide.PeptideIon.get_py_ptr", false]], "get_py_ptr() (imspy.data.peptide.peptideproduction method)": [[8, "imspy.data.peptide.PeptideProductIon.get_py_ptr", false]], "get_py_ptr() (imspy.data.peptide.peptideproductionseries method)": [[8, "imspy.data.peptide.PeptideProductIonSeries.get_py_ptr", false]], "get_py_ptr() (imspy.data.peptide.peptideproductionseriescollection method)": [[8, "imspy.data.peptide.PeptideProductIonSeriesCollection.get_py_ptr", false]], "get_py_ptr() (imspy.data.peptide.peptidesequence method)": [[8, "imspy.data.peptide.PeptideSequence.get_py_ptr", false]], "get_py_ptr() (imspy.data.spectrum.indexedmzspectrum method)": [[8, "imspy.data.spectrum.IndexedMzSpectrum.get_py_ptr", false]], "get_py_ptr() (imspy.data.spectrum.mzspectrum method)": [[8, "imspy.data.spectrum.MzSpectrum.get_py_ptr", false]], "get_py_ptr() (imspy.data.spectrum.mzspectrumvectorized method)": [[8, "imspy.data.spectrum.MzSpectrumVectorized.get_py_ptr", false]], "get_py_ptr() (imspy.data.spectrum.timsspectrum method)": [[8, "imspy.data.spectrum.TimsSpectrum.get_py_ptr", false]], "get_py_ptr() (imspy.simulation.annotation.contributionsource method)": [[9, "imspy.simulation.annotation.ContributionSource.get_py_ptr", false]], "get_py_ptr() (imspy.simulation.annotation.mzspectrumannotated method)": [[9, "imspy.simulation.annotation.MzSpectrumAnnotated.get_py_ptr", false]], "get_py_ptr() (imspy.simulation.annotation.peakannotation method)": [[9, "imspy.simulation.annotation.PeakAnnotation.get_py_ptr", false]], "get_py_ptr() (imspy.simulation.annotation.rustwrapperobject method)": [[9, "imspy.simulation.annotation.RustWrapperObject.get_py_ptr", false]], "get_py_ptr() (imspy.simulation.annotation.signalattributes method)": [[9, "imspy.simulation.annotation.SignalAttributes.get_py_ptr", false]], "get_py_ptr() (imspy.simulation.annotation.sourcetype method)": [[9, "imspy.simulation.annotation.SourceType.get_py_ptr", false]], "get_py_ptr() (imspy.simulation.annotation.timsframeannotated method)": [[9, "imspy.simulation.annotation.TimsFrameAnnotated.get_py_ptr", false]], "get_py_ptr() (imspy.simulation.experiment.timstofsyntheticframebuilderdia method)": [[9, "imspy.simulation.experiment.TimsTofSyntheticFrameBuilderDIA.get_py_ptr", false]], "get_py_ptr() (imspy.simulation.experiment.timstofsyntheticprecursorframebuilder method)": [[9, "imspy.simulation.experiment.TimsTofSyntheticPrecursorFrameBuilder.get_py_ptr", false]], "get_py_ptr() (imspy.simulation.handle.timstofsyntheticsdatahandlerust method)": [[9, "imspy.simulation.handle.TimsTofSyntheticsDataHandleRust.get_py_ptr", false]], "get_py_ptr() (imspy.timstof.data.acquisitionmode method)": [[12, "imspy.timstof.data.AcquisitionMode.get_py_ptr", false]], "get_py_ptr() (imspy.timstof.dda.fragmentdda method)": [[12, "imspy.timstof.dda.FragmentDDA.get_py_ptr", false]], "get_py_ptr() (imspy.timstof.dda.timsdatasetdda method)": [[12, "imspy.timstof.dda.TimsDatasetDDA.get_py_ptr", false]], "get_py_ptr() (imspy.timstof.dia.timsdatasetdia method)": [[12, "imspy.timstof.dia.TimsDatasetDIA.get_py_ptr", false]], "get_py_ptr() (imspy.timstof.frame.timsframe method)": [[12, "imspy.timstof.frame.TimsFrame.get_py_ptr", false]], "get_py_ptr() (imspy.timstof.frame.timsframevectorized method)": [[12, "imspy.timstof.frame.TimsFrameVectorized.get_py_ptr", false]], "get_py_ptr() (imspy.timstof.slice.timsslicevectorized method)": [[12, "imspy.timstof.slice.TimsSliceVectorized.get_py_ptr", false]], "get_realdata() (in module imspy.simulation.utility)": [[9, "imspy.simulation.utility.get_realdata", false]], "get_realdata_loop() (in module imspy.simulation.utility)": [[9, "imspy.simulation.utility.get_realdata_loop", false]], "get_rt_prediction_set() (in module imspy.algorithm.rt.predictors)": [[6, "imspy.algorithm.rt.predictors.get_rt_prediction_set", false]], "get_rt_train_set() (in module imspy.algorithm.rt.predictors)": [[6, "imspy.algorithm.rt.predictors.get_rt_train_set", false]], "get_scans_numba() (in module imspy.simulation.utility)": [[9, "imspy.simulation.utility.get_scans_numba", false]], "get_searchable_spec() (in module imspy.timstof.dbsearch.utility)": [[13, "imspy.timstof.dbsearch.utility.get_searchable_spec", false]], "get_sqrt_slopes_and_intercepts() (in module imspy.algorithm.ccs.predictors)": [[2, "imspy.algorithm.ccs.predictors.get_sqrt_slopes_and_intercepts", false]], "get_table() (imspy.simulation.experiment.syntheticexperimentdatahandle method)": [[9, "imspy.simulation.experiment.SyntheticExperimentDataHandle.get_table", false]], "get_table() (imspy.timstof.data.timsdataset method)": [[12, "imspy.timstof.data.TimsDataset.get_table", false]], "get_tensor_repr() (imspy.timstof.frame.timsframevectorized method)": [[12, "imspy.timstof.frame.TimsFrameVectorized.get_tensor_repr", false]], "get_tensor_repr() (imspy.timstof.slice.timsslicevectorized method)": [[12, "imspy.timstof.slice.TimsSliceVectorized.get_tensor_repr", false]], "get_tims_frame() (imspy.timstof.data.timsdataset method)": [[12, "imspy.timstof.data.TimsDataset.get_tims_frame", false]], "get_tims_planes() (imspy.timstof.slice.timsslice method)": [[12, "imspy.timstof.slice.TimsSlice.get_tims_planes", false]], "get_tims_slice() (imspy.timstof.data.timsdataset method)": [[12, "imspy.timstof.data.TimsDataset.get_tims_slice", false]], "get_transmission_set() (imspy.timstof.quadrupole.timstofquadrupoledia method)": [[12, "imspy.timstof.quadrupole.TimsTofQuadrupoleDIA.get_transmission_set", false]], "get_transmitted_ions() (imspy.simulation.handle.timstofsyntheticsdatahandlerust method)": [[9, "imspy.simulation.handle.TimsTofSyntheticsDataHandleRust.get_transmitted_ions", false]], "get_window_group_settings() (imspy.simulation.experiment.syntheticexperimentdatahandledia method)": [[9, "imspy.simulation.experiment.SyntheticExperimentDataHandleDIA.get_window_group_settings", false]], "get_z_score_for_percentile() (in module imspy.simulation.utility)": [[9, "imspy.simulation.utility.get_z_score_for_percentile", false]], "gruccspredictor (class in imspy.algorithm.ccs.predictors)": [[2, "imspy.algorithm.ccs.predictors.GRUCCSPredictor", false]], "gruchargestatepredictor (class in imspy.algorithm.ionization.predictors)": [[4, "imspy.algorithm.ionization.predictors.GRUChargeStatePredictor", false]], "gruretentiontimepredictor (class in imspy.algorithm.rt.predictors)": [[6, "imspy.algorithm.rt.predictors.GRURetentionTimePredictor", false]], "im_lower (imspy.timstof.data.timsdataset property)": [[12, "imspy.timstof.data.TimsDataset.im_lower", false]], "im_upper (imspy.timstof.data.timsdataset property)": [[12, "imspy.timstof.data.TimsDataset.im_upper", false]], "imspy": [[0, "module-imspy", false]], "imspy.algorithm": [[1, "module-imspy.algorithm", false]], "imspy.algorithm.ccs": [[2, "module-imspy.algorithm.ccs", false]], "imspy.algorithm.ccs.predictors": [[2, "module-imspy.algorithm.ccs.predictors", false]], "imspy.algorithm.hashing": [[1, "module-imspy.algorithm.hashing", false]], "imspy.algorithm.intensity": [[3, "module-imspy.algorithm.intensity", false]], "imspy.algorithm.intensity.predictors": [[3, "module-imspy.algorithm.intensity.predictors", false]], "imspy.algorithm.intensity.utility": [[3, "module-imspy.algorithm.intensity.utility", false]], "imspy.algorithm.ionization": [[4, "module-imspy.algorithm.ionization", false]], "imspy.algorithm.ionization.predictors": [[4, "module-imspy.algorithm.ionization.predictors", false]], "imspy.algorithm.pretrained": [[5, "module-imspy.algorithm.pretrained", false]], "imspy.algorithm.rt": [[6, "module-imspy.algorithm.rt", false]], "imspy.algorithm.rt.predictors": [[6, "module-imspy.algorithm.rt.predictors", false]], "imspy.algorithm.utility": [[1, "module-imspy.algorithm.utility", false]], "imspy.chemistry": [[7, "module-imspy.chemistry", false]], "imspy.chemistry.amino_acids": [[7, "module-imspy.chemistry.amino_acids", false]], "imspy.chemistry.constants": [[7, "module-imspy.chemistry.constants", false]], "imspy.chemistry.elements": [[7, "module-imspy.chemistry.elements", false]], "imspy.chemistry.mobility": [[7, "module-imspy.chemistry.mobility", false]], "imspy.chemistry.sum_formula": [[7, "module-imspy.chemistry.sum_formula", false]], "imspy.chemistry.unimod": [[7, "module-imspy.chemistry.unimod", false]], "imspy.chemistry.utility": [[7, "module-imspy.chemistry.utility", false]], "imspy.data": [[8, "module-imspy.data", false]], "imspy.data.peptide": [[8, "module-imspy.data.peptide", false]], "imspy.data.spectrum": [[8, "module-imspy.data.spectrum", false]], "imspy.simulation": [[9, "module-imspy.simulation", false]], "imspy.simulation.acquisition": [[9, "module-imspy.simulation.acquisition", false]], "imspy.simulation.annotation": [[9, "module-imspy.simulation.annotation", false]], "imspy.simulation.experiment": [[9, "module-imspy.simulation.experiment", false]], "imspy.simulation.handle": [[9, "module-imspy.simulation.handle", false]], "imspy.simulation.noise": [[9, "module-imspy.simulation.noise", false]], "imspy.simulation.proteome": [[9, "module-imspy.simulation.proteome", false]], "imspy.simulation.tdf": [[9, "module-imspy.simulation.tdf", false]], "imspy.simulation.timsim": [[10, "module-imspy.simulation.timsim", false]], "imspy.simulation.timsim.jobs": [[11, "module-imspy.simulation.timsim.jobs", false]], "imspy.simulation.timsim.jobs.add_noise_from_real_data": [[11, "module-imspy.simulation.timsim.jobs.add_noise_from_real_data", false]], "imspy.simulation.timsim.jobs.assemble_frames": [[11, "module-imspy.simulation.timsim.jobs.assemble_frames", false]], "imspy.simulation.timsim.jobs.build_acquisition": [[11, "module-imspy.simulation.timsim.jobs.build_acquisition", false]], "imspy.simulation.timsim.jobs.digest_fasta": [[11, "module-imspy.simulation.timsim.jobs.digest_fasta", false]], "imspy.simulation.timsim.jobs.simulate_charge_states": [[11, "module-imspy.simulation.timsim.jobs.simulate_charge_states", false]], "imspy.simulation.timsim.jobs.simulate_fragment_intensities": [[11, "module-imspy.simulation.timsim.jobs.simulate_fragment_intensities", false]], "imspy.simulation.timsim.jobs.simulate_frame_distributions": [[11, "module-imspy.simulation.timsim.jobs.simulate_frame_distributions", false]], "imspy.simulation.timsim.jobs.simulate_frame_distributions_emg": [[11, "module-imspy.simulation.timsim.jobs.simulate_frame_distributions_emg", false]], "imspy.simulation.timsim.jobs.simulate_ion_mobilities": [[11, "module-imspy.simulation.timsim.jobs.simulate_ion_mobilities", false]], "imspy.simulation.timsim.jobs.simulate_occurrences": [[11, "module-imspy.simulation.timsim.jobs.simulate_occurrences", false]], "imspy.simulation.timsim.jobs.simulate_retention_time": [[11, "module-imspy.simulation.timsim.jobs.simulate_retention_time", false]], "imspy.simulation.timsim.jobs.simulate_scan_distributions": [[11, "module-imspy.simulation.timsim.jobs.simulate_scan_distributions", false]], "imspy.simulation.timsim.jobs.utility": [[11, "module-imspy.simulation.timsim.jobs.utility", false]], "imspy.simulation.utility": [[9, "module-imspy.simulation.utility", false]], "imspy.timstof": [[12, "module-imspy.timstof", false]], "imspy.timstof.collision": [[12, "module-imspy.timstof.collision", false]], "imspy.timstof.data": [[12, "module-imspy.timstof.data", false]], "imspy.timstof.dbsearch": [[13, "module-imspy.timstof.dbsearch", false]], "imspy.timstof.dbsearch.imspy_dda": [[13, "module-imspy.timstof.dbsearch.imspy_dda", false]], "imspy.timstof.dbsearch.imspy_rescore_sage": [[13, "module-imspy.timstof.dbsearch.imspy_rescore_sage", false]], "imspy.timstof.dbsearch.sage_output_utility": [[13, "module-imspy.timstof.dbsearch.sage_output_utility", false]], "imspy.timstof.dbsearch.utility": [[13, "module-imspy.timstof.dbsearch.utility", false]], "imspy.timstof.dda": [[12, "module-imspy.timstof.dda", false]], "imspy.timstof.dia": [[12, "module-imspy.timstof.dia", false]], "imspy.timstof.frame": [[12, "module-imspy.timstof.frame", false]], "imspy.timstof.quadrupole": [[12, "module-imspy.timstof.quadrupole", false]], "imspy.timstof.slice": [[12, "module-imspy.timstof.slice", false]], "imspy.utility": [[14, "module-imspy.utility", false]], "imspy.utility.sequence": [[14, "module-imspy.utility.sequence", false]], "imspy.utility.utilities": [[14, "module-imspy.utility.utilities", false]], "imspy.vis": [[15, "module-imspy.vis", false]], "index (imspy.data.spectrum.indexedmzspectrum property)": [[8, "imspy.data.spectrum.IndexedMzSpectrum.index", false]], "index (imspy.data.spectrum.timsspectrum property)": [[8, "imspy.data.spectrum.TimsSpectrum.index", false]], "indexed_values_to_compressed_bytes() (imspy.timstof.data.timsdataset method)": [[12, "imspy.timstof.data.TimsDataset.indexed_values_to_compressed_bytes", false]], "indexedmzspectrum (class in imspy.data.spectrum)": [[8, "imspy.data.spectrum.IndexedMzSpectrum", false]], "indices (imspy.data.spectrum.mzspectrumvectorized property)": [[8, "imspy.data.spectrum.MzSpectrumVectorized.indices", false]], "indices (imspy.timstof.frame.timsframevectorized property)": [[12, "imspy.timstof.frame.TimsFrameVectorized.indices", false]], "inmemorycheckpoint (class in imspy.algorithm.utility)": [[1, "imspy.algorithm.utility.InMemoryCheckpoint", false]], "intensities (imspy.timstof.slice.timsplane property)": [[12, "imspy.timstof.slice.TimsPlane.intensities", false]], "intensity (imspy.data.peptide.peptideion property)": [[8, "imspy.data.peptide.PeptideIon.intensity", false]], "intensity (imspy.data.peptide.peptideproduction property)": [[8, "imspy.data.peptide.PeptideProductIon.intensity", false]], "intensity (imspy.data.spectrum.indexedmzspectrum property)": [[8, "imspy.data.spectrum.IndexedMzSpectrum.intensity", false]], "intensity (imspy.data.spectrum.mzspectrum property)": [[8, "imspy.data.spectrum.MzSpectrum.intensity", false]], "intensity (imspy.data.spectrum.timsspectrum property)": [[8, "imspy.data.spectrum.TimsSpectrum.intensity", false]], "intensity (imspy.simulation.annotation.mzspectrumannotated property)": [[9, "imspy.simulation.annotation.MzSpectrumAnnotated.intensity", false]], "intensity (imspy.simulation.annotation.timsframeannotated property)": [[9, "imspy.simulation.annotation.TimsFrameAnnotated.intensity", false]], "intensity (imspy.timstof.frame.timsframe property)": [[12, "imspy.timstof.frame.TimsFrame.intensity", false]], "intensity (imspy.timstof.frame.timsframevectorized property)": [[12, "imspy.timstof.frame.TimsFrameVectorized.intensity", false]], "intensity_contribution (imspy.simulation.annotation.contributionsource property)": [[9, "imspy.simulation.annotation.ContributionSource.intensity_contribution", false]], "inv_mobility (imspy.simulation.annotation.timsframeannotated property)": [[9, "imspy.simulation.annotation.TimsFrameAnnotated.inv_mobility", false]], "inv_mobility_to_scan() (imspy.simulation.tdf.tdfwriter method)": [[9, "imspy.simulation.tdf.TDFWriter.inv_mobility_to_scan", false]], "inverse_mobility_to_scan() (imspy.timstof.data.timsdataset method)": [[12, "imspy.timstof.data.TimsDataset.inverse_mobility_to_scan", false]], "ionintensitypredictor (class in imspy.algorithm.intensity.predictors)": [[3, "imspy.algorithm.intensity.predictors.IonIntensityPredictor", false]], "irt_to_rts_numba() (in module imspy.simulation.utility)": [[9, "imspy.simulation.utility.irt_to_rts_numba", false]], "is_precursor() (imspy.timstof.quadrupole.timstofquadrupoledia method)": [[12, "imspy.timstof.quadrupole.TimsTofQuadrupoleDIA.is_precursor", false]], "is_transmitted() (imspy.timstof.quadrupole.timstofquadrupoledia method)": [[12, "imspy.timstof.quadrupole.TimsTofQuadrupoleDIA.is_transmitted", false]], "is_unimod_end() (in module imspy.utility.utilities)": [[14, "imspy.utility.utilities.is_unimod_end", false]], "is_unimod_start() (in module imspy.utility.utilities)": [[14, "imspy.utility.utilities.is_unimod_start", false]], "isotope_distribution() (imspy.data.peptide.peptideproduction method)": [[8, "imspy.data.peptide.PeptideProductIon.isotope_distribution", false]], "isotope_peak (imspy.simulation.annotation.signalattributes property)": [[9, "imspy.simulation.annotation.SignalAttributes.isotope_peak", false]], "isotope_peaks_first_only (imspy.simulation.annotation.timsframeannotated property)": [[9, "imspy.simulation.annotation.TimsFrameAnnotated.isotope_peaks_first_only", false]], "isotopes_transmitted() (imspy.timstof.quadrupole.timstofquadrupoledia method)": [[12, "imspy.timstof.quadrupole.TimsTofQuadrupoleDIA.isotopes_transmitted", false]], "json_string_to_python_list() (in module imspy.simulation.utility)": [[9, "imspy.simulation.utility.json_string_to_python_list", false]], "jsons (imspy.utility.utilities.tokensequence property)": [[14, "imspy.utility.utilities.TokenSequence.jsons", false]], "kind (imspy.data.peptide.peptideproduction property)": [[8, "imspy.data.peptide.PeptideProductIon.kind", false]], "last_frame_id (imspy.timstof.slice.timsslice property)": [[12, "imspy.timstof.slice.TimsSlice.last_frame_id", false]], "last_frame_id (imspy.timstof.slice.timsslicevectorized property)": [[12, "imspy.timstof.slice.TimsSliceVectorized.last_frame_id", false]], "linear_map() (in module imspy.timstof.dbsearch.utility)": [[13, "imspy.timstof.dbsearch.utility.linear_map", false]], "list_columns() (imspy.simulation.experiment.syntheticexperimentdatahandle method)": [[9, "imspy.simulation.experiment.SyntheticExperimentDataHandle.list_columns", false]], "list_tables() (imspy.simulation.experiment.syntheticexperimentdatahandle method)": [[9, "imspy.simulation.experiment.SyntheticExperimentDataHandle.list_tables", false]], "load_config() (in module imspy.timstof.dbsearch.imspy_dda)": [[13, "imspy.timstof.dbsearch.imspy_dda.load_config", false]], "load_deep_ccs_predictor() (in module imspy.algorithm.ccs.predictors)": [[2, "imspy.algorithm.ccs.predictors.load_deep_ccs_predictor", false]], "load_deep_charge_state_predictor() (in module imspy.algorithm.ionization.predictors)": [[4, "imspy.algorithm.ionization.predictors.load_deep_charge_state_predictor", false]], "load_deep_retention_time_predictor() (in module imspy.algorithm.rt.predictors)": [[6, "imspy.algorithm.rt.predictors.load_deep_retention_time_predictor", false]], "load_prosit_2023_timstof_predictor() (in module imspy.algorithm.intensity.predictors)": [[3, "imspy.algorithm.intensity.predictors.load_prosit_2023_timsTOF_predictor", false]], "load_tokenizer_from_resources() (in module imspy.algorithm.utility)": [[1, "imspy.algorithm.utility.load_tokenizer_from_resources", false]], "main() (in module imspy.timstof.dbsearch.imspy_dda)": [[13, "imspy.timstof.dbsearch.imspy_dda.main", false]], "main() (in module imspy.timstof.dbsearch.imspy_rescore_sage)": [[13, "imspy.timstof.dbsearch.imspy_rescore_sage.main", false]], "map_to_domain() (in module imspy.timstof.dbsearch.utility)": [[13, "imspy.timstof.dbsearch.utility.map_to_domain", false]], "merge_dicts_with_merge_dict() (in module imspy.timstof.dbsearch.utility)": [[13, "imspy.timstof.dbsearch.utility.merge_dicts_with_merge_dict", false]], "mobilities (imspy.timstof.slice.timsplane property)": [[12, "imspy.timstof.slice.TimsPlane.mobilities", false]], "mobility (imspy.data.spectrum.timsspectrum property)": [[8, "imspy.data.spectrum.TimsSpectrum.mobility", false]], "mobility (imspy.timstof.frame.timsframe property)": [[12, "imspy.timstof.frame.TimsFrame.mobility", false]], "mobility (imspy.timstof.frame.timsframevectorized property)": [[12, "imspy.timstof.frame.TimsFrameVectorized.mobility", false]], "mode (imspy.timstof.data.acquisitionmode property)": [[12, "imspy.timstof.data.AcquisitionMode.mode", false]], "modify_tofs() (in module imspy.simulation.utility)": [[9, "imspy.simulation.utility.modify_tofs", false]], "module": [[0, "module-imspy", false], [1, "module-imspy.algorithm", false], [1, "module-imspy.algorithm.hashing", false], [1, "module-imspy.algorithm.utility", false], [2, "module-imspy.algorithm.ccs", false], [2, "module-imspy.algorithm.ccs.predictors", false], [3, "module-imspy.algorithm.intensity", false], [3, "module-imspy.algorithm.intensity.predictors", false], [3, "module-imspy.algorithm.intensity.utility", false], [4, "module-imspy.algorithm.ionization", false], [4, "module-imspy.algorithm.ionization.predictors", false], [5, "module-imspy.algorithm.pretrained", false], [6, "module-imspy.algorithm.rt", false], [6, "module-imspy.algorithm.rt.predictors", false], [7, "module-imspy.chemistry", false], [7, "module-imspy.chemistry.amino_acids", false], [7, "module-imspy.chemistry.constants", false], [7, "module-imspy.chemistry.elements", false], [7, "module-imspy.chemistry.mobility", false], [7, "module-imspy.chemistry.sum_formula", false], [7, "module-imspy.chemistry.unimod", false], [7, "module-imspy.chemistry.utility", false], [8, "module-imspy.data", false], [8, "module-imspy.data.peptide", false], [8, "module-imspy.data.spectrum", false], [9, "module-imspy.simulation", false], [9, "module-imspy.simulation.acquisition", false], [9, "module-imspy.simulation.annotation", false], [9, "module-imspy.simulation.experiment", false], [9, "module-imspy.simulation.handle", false], [9, "module-imspy.simulation.noise", false], [9, "module-imspy.simulation.proteome", false], [9, "module-imspy.simulation.tdf", false], [9, "module-imspy.simulation.utility", false], [10, "module-imspy.simulation.timsim", false], [11, "module-imspy.simulation.timsim.jobs", false], [11, "module-imspy.simulation.timsim.jobs.add_noise_from_real_data", false], [11, "module-imspy.simulation.timsim.jobs.assemble_frames", false], [11, "module-imspy.simulation.timsim.jobs.build_acquisition", false], [11, "module-imspy.simulation.timsim.jobs.digest_fasta", false], [11, "module-imspy.simulation.timsim.jobs.simulate_charge_states", false], [11, "module-imspy.simulation.timsim.jobs.simulate_fragment_intensities", false], [11, "module-imspy.simulation.timsim.jobs.simulate_frame_distributions", false], [11, "module-imspy.simulation.timsim.jobs.simulate_frame_distributions_emg", false], [11, "module-imspy.simulation.timsim.jobs.simulate_ion_mobilities", false], [11, "module-imspy.simulation.timsim.jobs.simulate_occurrences", false], [11, "module-imspy.simulation.timsim.jobs.simulate_retention_time", false], [11, "module-imspy.simulation.timsim.jobs.simulate_scan_distributions", false], [11, "module-imspy.simulation.timsim.jobs.utility", false], [12, "module-imspy.timstof", false], [12, "module-imspy.timstof.collision", false], [12, "module-imspy.timstof.data", false], [12, "module-imspy.timstof.dda", false], [12, "module-imspy.timstof.dia", false], [12, "module-imspy.timstof.frame", false], [12, "module-imspy.timstof.quadrupole", false], [12, "module-imspy.timstof.slice", false], [13, "module-imspy.timstof.dbsearch", false], [13, "module-imspy.timstof.dbsearch.imspy_dda", false], [13, "module-imspy.timstof.dbsearch.imspy_rescore_sage", false], [13, "module-imspy.timstof.dbsearch.sage_output_utility", false], [13, "module-imspy.timstof.dbsearch.utility", false], [14, "module-imspy.utility", false], [14, "module-imspy.utility.sequence", false], [14, "module-imspy.utility.utilities", false], [15, "module-imspy.vis", false]], "mono_isotopic_mass (imspy.data.peptide.peptideproduction property)": [[8, "imspy.data.peptide.PeptideProductIon.mono_isotopic_mass", false]], "mono_isotopic_mass (imspy.data.peptide.peptidesequence property)": [[8, "imspy.data.peptide.PeptideSequence.mono_isotopic_mass", false]], "monoisotopic_mass (imspy.chemistry.sum_formula.sumformula property)": [[7, "imspy.chemistry.sum_formula.SumFormula.monoisotopic_mass", false]], "ms_type (imspy.data.spectrum.timsspectrum property)": [[8, "imspy.data.spectrum.TimsSpectrum.ms_type", false]], "ms_type (imspy.simulation.annotation.timsframeannotated property)": [[9, "imspy.simulation.annotation.TimsFrameAnnotated.ms_type", false]], "ms_type (imspy.timstof.frame.timsframe property)": [[12, "imspy.timstof.frame.TimsFrame.ms_type", false]], "ms_type (imspy.timstof.frame.timsframevectorized property)": [[12, "imspy.timstof.frame.TimsFrameVectorized.ms_type", false]], "ms_type_as_string (imspy.timstof.frame.timsframe property)": [[12, "imspy.timstof.frame.TimsFrame.ms_type_as_string", false]], "ms_type_numeric (imspy.simulation.annotation.timsframeannotated property)": [[9, "imspy.simulation.annotation.TimsFrameAnnotated.ms_type_numeric", false]], "mu_function_normal_default() (in module imspy.simulation.noise)": [[9, "imspy.simulation.noise.mu_function_normal_default", false]], "mu_function_poisson_default() (in module imspy.simulation.noise)": [[9, "imspy.simulation.noise.mu_function_poisson_default", false]], "mz (imspy.data.peptide.peptideion property)": [[8, "imspy.data.peptide.PeptideIon.mz", false]], "mz (imspy.data.peptide.peptideproduction property)": [[8, "imspy.data.peptide.PeptideProductIon.mz", false]], "mz (imspy.data.spectrum.indexedmzspectrum property)": [[8, "imspy.data.spectrum.IndexedMzSpectrum.mz", false]], "mz (imspy.data.spectrum.mzspectrum property)": [[8, "imspy.data.spectrum.MzSpectrum.mz", false]], "mz (imspy.data.spectrum.timsspectrum property)": [[8, "imspy.data.spectrum.TimsSpectrum.mz", false]], "mz (imspy.simulation.annotation.mzspectrumannotated property)": [[9, "imspy.simulation.annotation.MzSpectrumAnnotated.mz", false]], "mz (imspy.simulation.annotation.timsframeannotated property)": [[9, "imspy.simulation.annotation.TimsFrameAnnotated.mz", false]], "mz (imspy.timstof.frame.timsframe property)": [[12, "imspy.timstof.frame.TimsFrame.mz", false]], "mz_lower (imspy.timstof.data.timsdataset property)": [[12, "imspy.timstof.data.TimsDataset.mz_lower", false]], "mz_mean (imspy.timstof.slice.timsplane property)": [[12, "imspy.timstof.slice.TimsPlane.mz_mean", false]], "mz_spectrum (imspy.data.spectrum.timsspectrum property)": [[8, "imspy.data.spectrum.TimsSpectrum.mz_spectrum", false]], "mz_std (imspy.timstof.slice.timsplane property)": [[12, "imspy.timstof.slice.TimsPlane.mz_std", false]], "mz_to_tof() (imspy.simulation.tdf.tdfwriter method)": [[9, "imspy.simulation.tdf.TDFWriter.mz_to_tof", false]], "mz_to_tof() (imspy.timstof.data.timsdataset method)": [[12, "imspy.timstof.data.TimsDataset.mz_to_tof", false]], "mz_upper (imspy.timstof.data.timsdataset property)": [[12, "imspy.timstof.data.TimsDataset.mz_upper", false]], "mzspectrum (class in imspy.data.spectrum)": [[8, "imspy.data.spectrum.MzSpectrum", false]], "mzspectrumannotated (class in imspy.simulation.annotation)": [[9, "imspy.simulation.annotation.MzSpectrumAnnotated", false]], "mzspectrumvectorized (class in imspy.data.spectrum)": [[8, "imspy.data.spectrum.MzSpectrumVectorized", false]], "n_ions (imspy.data.peptide.peptideproductionseries property)": [[8, "imspy.data.peptide.PeptideProductIonSeries.n_ions", false]], "normal_pdf() (in module imspy.utility.utilities)": [[14, "imspy.utility.utilities.normal_pdf", false]], "normaldistribution (class in imspy.utility.utilities)": [[14, "imspy.utility.utilities.NormalDistribution", false]], "np_zip() (in module imspy.simulation.utility)": [[9, "imspy.simulation.utility.np_zip", false]], "num_points (imspy.timstof.slice.timsplane property)": [[12, "imspy.timstof.slice.TimsPlane.num_points", false]], "num_scans (imspy.timstof.data.timsdataset property)": [[12, "imspy.timstof.data.TimsDataset.num_scans", false]], "on_epoch_end() (imspy.algorithm.utility.inmemorycheckpoint method)": [[1, "imspy.algorithm.utility.InMemoryCheckpoint.on_epoch_end", false]], "on_train_begin() (imspy.algorithm.utility.inmemorycheckpoint method)": [[1, "imspy.algorithm.utility.InMemoryCheckpoint.on_train_begin", false]], "on_train_end() (imspy.algorithm.utility.inmemorycheckpoint method)": [[1, "imspy.algorithm.utility.InMemoryCheckpoint.on_train_end", false]], "one_over_k0_to_ccs() (in module imspy.chemistry.mobility)": [[7, "imspy.chemistry.mobility.one_over_k0_to_ccs", false]], "patternreplacer (class in imspy.timstof.dbsearch.sage_output_utility)": [[13, "imspy.timstof.dbsearch.sage_output_utility.PatternReplacer", false]], "peakannotation (class in imspy.simulation.annotation)": [[9, "imspy.simulation.annotation.PeakAnnotation", false]], "peptide_id (imspy.data.peptide.peptideion property)": [[8, "imspy.data.peptide.PeptideIon.peptide_id", false]], "peptide_id (imspy.data.peptide.peptidesequence property)": [[8, "imspy.data.peptide.PeptideSequence.peptide_id", false]], "peptide_id (imspy.simulation.annotation.signalattributes property)": [[9, "imspy.simulation.annotation.SignalAttributes.peptide_id", false]], "peptide_ids_first_only (imspy.simulation.annotation.timsframeannotated property)": [[9, "imspy.simulation.annotation.TimsFrameAnnotated.peptide_ids_first_only", false]], "peptidechargestatedistribution (class in imspy.algorithm.ionization.predictors)": [[4, "imspy.algorithm.ionization.predictors.PeptideChargeStateDistribution", false]], "peptidechromatographyapex (class in imspy.algorithm.rt.predictors)": [[6, "imspy.algorithm.rt.predictors.PeptideChromatographyApex", false]], "peptidedigest (class in imspy.simulation.proteome)": [[9, "imspy.simulation.proteome.PeptideDigest", false]], "peptideion (class in imspy.data.peptide)": [[8, "imspy.data.peptide.PeptideIon", false]], "peptideionmobilityapex (class in imspy.algorithm.ccs.predictors)": [[2, "imspy.algorithm.ccs.predictors.PeptideIonMobilityApex", false]], "peptideproduction (class in imspy.data.peptide)": [[8, "imspy.data.peptide.PeptideProductIon", false]], "peptideproductionseries (class in imspy.data.peptide)": [[8, "imspy.data.peptide.PeptideProductIonSeries", false]], "peptideproductionseriescollection (class in imspy.data.peptide)": [[8, "imspy.data.peptide.PeptideProductIonSeriesCollection", false]], "peptidesequence (class in imspy.data.peptide)": [[8, "imspy.data.peptide.PeptideSequence", false]], "plot_summary() (in module imspy.timstof.dbsearch.sage_output_utility)": [[13, "imspy.timstof.dbsearch.sage_output_utility.plot_summary", false]], "post_process_predicted_fragment_spectra() (in module imspy.algorithm.intensity.utility)": [[3, "imspy.algorithm.intensity.utility.post_process_predicted_fragment_spectra", false]], "precursor_id (imspy.timstof.dda.fragmentdda property)": [[12, "imspy.timstof.dda.FragmentDDA.precursor_id", false]], "precursors (imspy.timstof.slice.timsslice property)": [[12, "imspy.timstof.slice.TimsSlice.precursors", false]], "precursors (imspy.timstof.slice.timsslicevectorized property)": [[12, "imspy.timstof.slice.TimsSliceVectorized.precursors", false]], "predict_intensities() (imspy.algorithm.intensity.predictors.prosit2023timstofwrapper method)": [[3, "imspy.algorithm.intensity.predictors.Prosit2023TimsTofWrapper.predict_intensities", false]], "predict_intensities_prosit() (in module imspy.algorithm.intensity.predictors)": [[3, "imspy.algorithm.intensity.predictors.predict_intensities_prosit", false]], "predict_inverse_ion_mobility() (in module imspy.algorithm.ccs.predictors)": [[2, "imspy.algorithm.ccs.predictors.predict_inverse_ion_mobility", false]], "predict_retention_time() (in module imspy.algorithm.rt.predictors)": [[6, "imspy.algorithm.rt.predictors.predict_retention_time", false]], "prosit2023timstofwrapper (class in imspy.algorithm.intensity.predictors)": [[3, "imspy.algorithm.intensity.predictors.Prosit2023TimsTofWrapper", false]], "python_list_to_json_string() (in module imspy.simulation.utility)": [[9, "imspy.simulation.utility.python_list_to_json_string", false]], "random_subsample_frame() (imspy.timstof.frame.timsframe method)": [[12, "imspy.timstof.frame.TimsFrame.random_subsample_frame", false]], "re_index_indices() (in module imspy.utility.utilities)": [[14, "imspy.utility.utilities.re_index_indices", false]], "re_score_psms() (in module imspy.timstof.dbsearch.sage_output_utility)": [[13, "imspy.timstof.dbsearch.sage_output_utility.re_score_psms", false]], "read_acquisition_config() (in module imspy.simulation.utility)": [[9, "imspy.simulation.utility.read_acquisition_config", false]], "read_compressed_data_full() (imspy.timstof.dia.timsdatasetdia method)": [[12, "imspy.timstof.dia.TimsDatasetDIA.read_compressed_data_full", false]], "remove_substrings() (in module imspy.timstof.dbsearch.sage_output_utility)": [[13, "imspy.timstof.dbsearch.sage_output_utility.remove_substrings", false]], "remove_unimod_annotation() (in module imspy.algorithm.intensity.predictors)": [[3, "imspy.algorithm.intensity.predictors.remove_unimod_annotation", false]], "resolution (imspy.data.spectrum.mzspectrumvectorized property)": [[8, "imspy.data.spectrum.MzSpectrumVectorized.resolution", false]], "retention_time (imspy.data.spectrum.timsspectrum property)": [[8, "imspy.data.spectrum.TimsSpectrum.retention_time", false]], "retention_time (imspy.simulation.annotation.timsframeannotated property)": [[9, "imspy.simulation.annotation.TimsFrameAnnotated.retention_time", false]], "retention_time (imspy.timstof.frame.timsframe property)": [[12, "imspy.timstof.frame.TimsFrame.retention_time", false]], "retention_time (imspy.timstof.frame.timsframevectorized property)": [[12, "imspy.timstof.frame.TimsFrameVectorized.retention_time", false]], "retention_times (imspy.timstof.slice.timsplane property)": [[12, "imspy.timstof.slice.TimsPlane.retention_times", false]], "row_to_fragment() (in module imspy.timstof.dbsearch.sage_output_utility)": [[13, "imspy.timstof.dbsearch.sage_output_utility.row_to_fragment", false]], "rustwrapperobject (class in imspy.simulation.annotation)": [[9, "imspy.simulation.annotation.RustWrapperObject", false]], "sample_fragment_signal() (imspy.timstof.dia.timsdatasetdia method)": [[12, "imspy.timstof.dia.TimsDatasetDIA.sample_fragment_signal", false]], "sample_parameters_rejection() (in module imspy.simulation.timsim.jobs.simulate_frame_distributions_emg)": [[11, "imspy.simulation.timsim.jobs.simulate_frame_distributions_emg.sample_parameters_rejection", false]], "sample_precursor_signal() (imspy.timstof.dia.timsdatasetdia method)": [[12, "imspy.timstof.dia.TimsDatasetDIA.sample_precursor_signal", false]], "sanitize_charge() (in module imspy.timstof.dbsearch.utility)": [[13, "imspy.timstof.dbsearch.utility.sanitize_charge", false]], "sanitize_mz() (in module imspy.timstof.dbsearch.utility)": [[13, "imspy.timstof.dbsearch.utility.sanitize_mz", false]], "scan (imspy.data.spectrum.timsspectrum property)": [[8, "imspy.data.spectrum.TimsSpectrum.scan", false]], "scan (imspy.simulation.annotation.timsframeannotated property)": [[9, "imspy.simulation.annotation.TimsFrameAnnotated.scan", false]], "scan (imspy.timstof.frame.timsframe property)": [[12, "imspy.timstof.frame.TimsFrame.scan", false]], "scan (imspy.timstof.frame.timsframevectorized property)": [[12, "imspy.timstof.frame.TimsFrameVectorized.scan", false]], "scan_to_inv_mobility() (imspy.simulation.tdf.tdfwriter method)": [[9, "imspy.simulation.tdf.TDFWriter.scan_to_inv_mobility", false]], "scan_to_inverse_mobility() (imspy.timstof.data.timsdataset method)": [[12, "imspy.timstof.data.TimsDataset.scan_to_inverse_mobility", false]], "scans (imspy.timstof.slice.timsplane property)": [[12, "imspy.timstof.slice.TimsPlane.scans", false]], "selected_fragment (imspy.timstof.dda.fragmentdda property)": [[12, "imspy.timstof.dda.FragmentDDA.selected_fragment", false]], "seq_to_index() (in module imspy.algorithm.intensity.utility)": [[3, "imspy.algorithm.intensity.utility.seq_to_index", false]], "sequence (imspy.data.peptide.peptideion property)": [[8, "imspy.data.peptide.PeptideIon.sequence", false]], "sequence (imspy.data.peptide.peptideproduction property)": [[8, "imspy.data.peptide.PeptideProductIon.sequence", false]], "sequence (imspy.data.peptide.peptidesequence property)": [[8, "imspy.data.peptide.PeptideSequence.sequence", false]], "sequence_to_all_ions() (in module imspy.simulation.utility)": [[9, "imspy.simulation.utility.sequence_to_all_ions", false]], "sequence_to_numpy() (in module imspy.simulation.utility)": [[9, "imspy.simulation.utility.sequence_to_numpy", false]], "sequences_to_all_ions() (in module imspy.simulation.utility)": [[9, "imspy.simulation.utility.sequences_to_all_ions", false]], "series (imspy.data.peptide.peptideproductionseriescollection property)": [[8, "imspy.data.peptide.PeptideProductIonSeriesCollection.series", false]], "set_percentage_to_zero() (in module imspy.simulation.utility)": [[9, "imspy.simulation.utility.set_percentage_to_zero", false]], "sigma_function_normal_default() (in module imspy.simulation.noise)": [[9, "imspy.simulation.noise.sigma_function_normal_default", false]], "signal_attributes (imspy.simulation.annotation.contributionsource property)": [[9, "imspy.simulation.annotation.ContributionSource.signal_attributes", false]], "signalattributes (class in imspy.simulation.annotation)": [[9, "imspy.simulation.annotation.SignalAttributes", false]], "simulate_charge_state_distribution_pandas() (imspy.algorithm.ionization.predictors.binomialchargestatedistributionmodel method)": [[4, "imspy.algorithm.ionization.predictors.BinomialChargeStateDistributionModel.simulate_charge_state_distribution_pandas", false]], "simulate_charge_state_distribution_pandas() (imspy.algorithm.ionization.predictors.deepchargestatedistribution method)": [[4, "imspy.algorithm.ionization.predictors.DeepChargeStateDistribution.simulate_charge_state_distribution_pandas", false]], "simulate_charge_state_distribution_pandas() (imspy.algorithm.ionization.predictors.peptidechargestatedistribution method)": [[4, "imspy.algorithm.ionization.predictors.PeptideChargeStateDistribution.simulate_charge_state_distribution_pandas", false]], "simulate_charge_states() (in module imspy.simulation.timsim.jobs.simulate_charge_states)": [[11, "imspy.simulation.timsim.jobs.simulate_charge_states.simulate_charge_states", false]], "simulate_fragment_intensities() (in module imspy.simulation.timsim.jobs.simulate_fragment_intensities)": [[11, "imspy.simulation.timsim.jobs.simulate_fragment_intensities.simulate_fragment_intensities", false]], "simulate_frame_distributions() (in module imspy.simulation.timsim.jobs.simulate_frame_distributions)": [[11, "imspy.simulation.timsim.jobs.simulate_frame_distributions.simulate_frame_distributions", false]], "simulate_frame_distributions_emg() (in module imspy.simulation.timsim.jobs.simulate_frame_distributions_emg)": [[11, "imspy.simulation.timsim.jobs.simulate_frame_distributions_emg.simulate_frame_distributions_emg", false]], "simulate_ion_intensities() (imspy.algorithm.intensity.predictors.ionintensitypredictor method)": [[3, "imspy.algorithm.intensity.predictors.IonIntensityPredictor.simulate_ion_intensities", false]], "simulate_ion_intensities() (imspy.algorithm.intensity.predictors.prosit2023timstofwrapper method)": [[3, "imspy.algorithm.intensity.predictors.Prosit2023TimsTofWrapper.simulate_ion_intensities", false]], "simulate_ion_intensities_pandas() (imspy.algorithm.intensity.predictors.ionintensitypredictor method)": [[3, "imspy.algorithm.intensity.predictors.IonIntensityPredictor.simulate_ion_intensities_pandas", false]], "simulate_ion_intensities_pandas() (imspy.algorithm.intensity.predictors.prosit2023timstofwrapper method)": [[3, "imspy.algorithm.intensity.predictors.Prosit2023TimsTofWrapper.simulate_ion_intensities_pandas", false]], "simulate_ion_intensities_pandas_batched() (imspy.algorithm.intensity.predictors.prosit2023timstofwrapper method)": [[3, "imspy.algorithm.intensity.predictors.Prosit2023TimsTofWrapper.simulate_ion_intensities_pandas_batched", false]], "simulate_ion_mobilities() (imspy.algorithm.ccs.predictors.deeppeptideionmobilityapex method)": [[2, "imspy.algorithm.ccs.predictors.DeepPeptideIonMobilityApex.simulate_ion_mobilities", false]], "simulate_ion_mobilities() (imspy.algorithm.ccs.predictors.peptideionmobilityapex method)": [[2, "imspy.algorithm.ccs.predictors.PeptideIonMobilityApex.simulate_ion_mobilities", false]], "simulate_ion_mobilities() (in module imspy.simulation.timsim.jobs.simulate_ion_mobilities)": [[11, "imspy.simulation.timsim.jobs.simulate_ion_mobilities.simulate_ion_mobilities", false]], "simulate_ion_mobilities_pandas() (imspy.algorithm.ccs.predictors.deeppeptideionmobilityapex method)": [[2, "imspy.algorithm.ccs.predictors.DeepPeptideIonMobilityApex.simulate_ion_mobilities_pandas", false]], "simulate_ion_mobilities_pandas() (imspy.algorithm.ccs.predictors.peptideionmobilityapex method)": [[2, "imspy.algorithm.ccs.predictors.PeptideIonMobilityApex.simulate_ion_mobilities_pandas", false]], "simulate_ionizations() (imspy.algorithm.ionization.predictors.binomialchargestatedistributionmodel method)": [[4, "imspy.algorithm.ionization.predictors.BinomialChargeStateDistributionModel.simulate_ionizations", false]], "simulate_ionizations() (imspy.algorithm.ionization.predictors.deepchargestatedistribution method)": [[4, "imspy.algorithm.ionization.predictors.DeepChargeStateDistribution.simulate_ionizations", false]], "simulate_ionizations() (imspy.algorithm.ionization.predictors.peptidechargestatedistribution method)": [[4, "imspy.algorithm.ionization.predictors.PeptideChargeStateDistribution.simulate_ionizations", false]], "simulate_peptide_occurrences() (in module imspy.simulation.timsim.jobs.simulate_occurrences)": [[11, "imspy.simulation.timsim.jobs.simulate_occurrences.simulate_peptide_occurrences", false]], "simulate_retention_times() (in module imspy.simulation.timsim.jobs.simulate_retention_time)": [[11, "imspy.simulation.timsim.jobs.simulate_retention_time.simulate_retention_times", false]], "simulate_scan_distributions() (in module imspy.simulation.timsim.jobs.simulate_scan_distributions)": [[11, "imspy.simulation.timsim.jobs.simulate_scan_distributions.simulate_scan_distributions", false]], "simulate_separation_times() (imspy.algorithm.rt.predictors.deepchromatographyapex method)": [[6, "imspy.algorithm.rt.predictors.DeepChromatographyApex.simulate_separation_times", false]], "simulate_separation_times() (imspy.algorithm.rt.predictors.peptidechromatographyapex method)": [[6, "imspy.algorithm.rt.predictors.PeptideChromatographyApex.simulate_separation_times", false]], "simulate_separation_times_pandas() (imspy.algorithm.rt.predictors.deepchromatographyapex method)": [[6, "imspy.algorithm.rt.predictors.DeepChromatographyApex.simulate_separation_times_pandas", false]], "simulate_separation_times_pandas() (imspy.algorithm.rt.predictors.peptidechromatographyapex method)": [[6, "imspy.algorithm.rt.predictors.PeptideChromatographyApex.simulate_separation_times_pandas", false]], "source_type (imspy.simulation.annotation.contributionsource property)": [[9, "imspy.simulation.annotation.ContributionSource.source_type", false]], "source_type (imspy.simulation.annotation.sourcetype property)": [[9, "imspy.simulation.annotation.SourceType.source_type", false]], "sourcetype (class in imspy.simulation.annotation)": [[9, "imspy.simulation.annotation.SourceType", false]], "split_dataframe_randomly() (in module imspy.timstof.dbsearch.sage_output_utility)": [[13, "imspy.timstof.dbsearch.sage_output_utility.split_dataframe_randomly", false]], "split_fasta() (in module imspy.timstof.dbsearch.utility)": [[13, "imspy.timstof.dbsearch.utility.split_fasta", false]], "split_psms() (in module imspy.timstof.dbsearch.utility)": [[13, "imspy.timstof.dbsearch.utility.split_psms", false]], "squarerootprojectionlayer (class in imspy.algorithm.ccs.predictors)": [[2, "imspy.algorithm.ccs.predictors.SquareRootProjectionLayer", false]], "sumformula (class in imspy.chemistry.sum_formula)": [[7, "imspy.chemistry.sum_formula.SumFormula", false]], "syntheticexperimentdatahandle (class in imspy.simulation.experiment)": [[9, "imspy.simulation.experiment.SyntheticExperimentDataHandle", false]], "syntheticexperimentdatahandledia (class in imspy.simulation.experiment)": [[9, "imspy.simulation.experiment.SyntheticExperimentDataHandleDIA", false]], "tdfwriter (class in imspy.simulation.tdf)": [[9, "imspy.simulation.tdf.TDFWriter", false]], "timsdataset (class in imspy.timstof.data)": [[12, "imspy.timstof.data.TimsDataset", false]], "timsdatasetdda (class in imspy.timstof.dda)": [[12, "imspy.timstof.dda.TimsDatasetDDA", false]], "timsdatasetdia (class in imspy.timstof.dia)": [[12, "imspy.timstof.dia.TimsDatasetDIA", false]], "timsframe (class in imspy.timstof.frame)": [[12, "imspy.timstof.frame.TimsFrame", false]], "timsframeannotated (class in imspy.simulation.annotation)": [[9, "imspy.simulation.annotation.TimsFrameAnnotated", false]], "timsframevectorized (class in imspy.timstof.frame)": [[12, "imspy.timstof.frame.TimsFrameVectorized", false]], "timshasher (class in imspy.algorithm.hashing)": [[1, "imspy.algorithm.hashing.TimsHasher", false]], "timsplane (class in imspy.timstof.slice)": [[12, "imspy.timstof.slice.TimsPlane", false]], "timsslice (class in imspy.timstof.slice)": [[12, "imspy.timstof.slice.TimsSlice", false]], "timsslicevectorized (class in imspy.timstof.slice)": [[12, "imspy.timstof.slice.TimsSliceVectorized", false]], "timsspectrum (class in imspy.data.spectrum)": [[8, "imspy.data.spectrum.TimsSpectrum", false]], "timstofacquisitionbuilder (class in imspy.simulation.acquisition)": [[9, "imspy.simulation.acquisition.TimsTofAcquisitionBuilder", false]], "timstofacquisitionbuilderdda (class in imspy.simulation.acquisition)": [[9, "imspy.simulation.acquisition.TimsTofAcquisitionBuilderDDA", false]], "timstofacquisitionbuilderdia (class in imspy.simulation.acquisition)": [[9, "imspy.simulation.acquisition.TimsTofAcquisitionBuilderDIA", false]], "timstofcollisionenergy (class in imspy.timstof.collision)": [[12, "imspy.timstof.collision.TimsTofCollisionEnergy", false]], "timstofcollisionenergydia (class in imspy.timstof.collision)": [[12, "imspy.timstof.collision.TimsTofCollisionEnergyDIA", false]], "timstofquadrupoledia (class in imspy.timstof.quadrupole)": [[12, "imspy.timstof.quadrupole.TimsTofQuadrupoleDIA", false]], "timstofsyntheticframebuilderdia (class in imspy.simulation.experiment)": [[9, "imspy.simulation.experiment.TimsTofSyntheticFrameBuilderDIA", false]], "timstofsyntheticprecursorframebuilder (class in imspy.simulation.experiment)": [[9, "imspy.simulation.experiment.TimsTofSyntheticPrecursorFrameBuilder", false]], "timstofsyntheticsdatahandlerust (class in imspy.simulation.handle)": [[9, "imspy.simulation.handle.TimsTofSyntheticsDataHandleRust", false]], "to_centroided() (imspy.data.spectrum.mzspectrum method)": [[8, "imspy.data.spectrum.MzSpectrum.to_centroided", false]], "to_centroided() (imspy.data.spectrum.mzspectrumvectorized method)": [[8, "imspy.data.spectrum.MzSpectrumVectorized.to_centroided", false]], "to_dense_windows() (imspy.timstof.frame.timsframe method)": [[12, "imspy.timstof.frame.TimsFrame.to_dense_windows", false]], "to_dense_windows() (imspy.timstof.slice.timsslice method)": [[12, "imspy.timstof.slice.TimsSlice.to_dense_windows", false]], "to_indexed_mz_spectrum() (imspy.timstof.frame.timsframe method)": [[12, "imspy.timstof.frame.TimsFrame.to_indexed_mz_spectrum", false]], "to_json() (imspy.data.peptide.peptideion method)": [[8, "imspy.data.peptide.PeptideIon.to_json", false]], "to_json() (imspy.data.peptide.peptideproduction method)": [[8, "imspy.data.peptide.PeptideProductIon.to_json", false]], "to_json() (imspy.data.peptide.peptideproductionseries method)": [[8, "imspy.data.peptide.PeptideProductIonSeries.to_json", false]], "to_json() (imspy.data.peptide.peptideproductionseriescollection method)": [[8, "imspy.data.peptide.PeptideProductIonSeriesCollection.to_json", false]], "to_json() (imspy.data.peptide.peptidesequence method)": [[8, "imspy.data.peptide.PeptideSequence.to_json", false]], "to_jsons() (imspy.data.spectrum.mzspectrum method)": [[8, "imspy.data.spectrum.MzSpectrum.to_jsons", false]], "to_noise_annotated_tims_frame() (imspy.timstof.frame.timsframe method)": [[12, "imspy.timstof.frame.TimsFrame.to_noise_annotated_tims_frame", false]], "to_prosit_tensor() (in module imspy.algorithm.intensity.utility)": [[3, "imspy.algorithm.intensity.utility.to_prosit_tensor", false]], "to_resolution() (imspy.data.spectrum.mzspectrum method)": [[8, "imspy.data.spectrum.MzSpectrum.to_resolution", false]], "to_resolution() (imspy.timstof.frame.timsframe method)": [[12, "imspy.timstof.frame.TimsFrame.to_resolution", false]], "to_resolution() (imspy.timstof.slice.timsslice method)": [[12, "imspy.timstof.slice.TimsSlice.to_resolution", false]], "to_sage_representation() (imspy.data.peptide.peptidesequence method)": [[8, "imspy.data.peptide.PeptideSequence.to_sage_representation", false]], "to_tims_spectra() (imspy.timstof.frame.timsframe method)": [[12, "imspy.timstof.frame.TimsFrame.to_tims_spectra", false]], "to_tokens() (imspy.data.peptide.peptidesequence method)": [[8, "imspy.data.peptide.PeptideSequence.to_tokens", false]], "to_windows() (imspy.data.spectrum.mzspectrum method)": [[8, "imspy.data.spectrum.MzSpectrum.to_windows", false]], "to_windows() (imspy.timstof.frame.timsframe method)": [[12, "imspy.timstof.frame.TimsFrame.to_windows", false]], "to_windows() (imspy.timstof.slice.timsslice method)": [[12, "imspy.timstof.slice.TimsSlice.to_windows", false]], "tof (imspy.simulation.annotation.timsframeannotated property)": [[9, "imspy.simulation.annotation.TimsFrameAnnotated.tof", false]], "tof (imspy.timstof.frame.timsframe property)": [[12, "imspy.timstof.frame.TimsFrame.tof", false]], "tof (imspy.timstof.frame.timsframevectorized property)": [[12, "imspy.timstof.frame.TimsFrameVectorized.tof", false]], "tof_mean (imspy.timstof.slice.timsplane property)": [[12, "imspy.timstof.slice.TimsPlane.tof_mean", false]], "tof_std (imspy.timstof.slice.timsplane property)": [[12, "imspy.timstof.slice.TimsPlane.tof_std", false]], "tof_to_mz() (imspy.simulation.tdf.tdfwriter method)": [[9, "imspy.simulation.tdf.TDFWriter.tof_to_mz", false]], "tof_to_mz() (imspy.timstof.data.timsdataset method)": [[12, "imspy.timstof.data.TimsDataset.tof_to_mz", false]], "tokenize_proforma_sequence() (in module imspy.utility.utilities)": [[14, "imspy.utility.utilities.tokenize_proforma_sequence", false]], "tokenize_unimod_sequence() (in module imspy.utility.sequence)": [[14, "imspy.utility.sequence.tokenize_unimod_sequence", false]], "tokenizer_from_json() (in module imspy.utility.utilities)": [[14, "imspy.utility.utilities.tokenizer_from_json", false]], "tokenizer_to_json() (in module imspy.utility.utilities)": [[14, "imspy.utility.utilities.tokenizer_to_json", false]], "tokensequence (class in imspy.utility.utilities)": [[14, "imspy.utility.utilities.TokenSequence", false]], "transform_psm_to_pin() (in module imspy.timstof.dbsearch.utility)": [[13, "imspy.timstof.dbsearch.utility.transform_psm_to_pin", false]], "transmit_frame() (imspy.timstof.quadrupole.timstofquadrupoledia method)": [[12, "imspy.timstof.quadrupole.TimsTofQuadrupoleDIA.transmit_frame", false]], "transmit_ion() (imspy.timstof.quadrupole.timstofquadrupoledia method)": [[12, "imspy.timstof.quadrupole.TimsTofQuadrupoleDIA.transmit_ion", false]], "transmit_spectrum() (imspy.timstof.quadrupole.timstofquadrupoledia method)": [[12, "imspy.timstof.quadrupole.TimsTofQuadrupoleDIA.transmit_spectrum", false]], "unpack_dict() (in module imspy.algorithm.intensity.utility)": [[3, "imspy.algorithm.intensity.utility.unpack_dict", false]], "values (imspy.data.spectrum.mzspectrumvectorized property)": [[8, "imspy.data.spectrum.MzSpectrumVectorized.values", false]], "vectorized() (imspy.data.spectrum.mzspectrum method)": [[8, "imspy.data.spectrum.MzSpectrum.vectorized", false]], "vectorized() (imspy.timstof.frame.timsframe method)": [[12, "imspy.timstof.frame.TimsFrame.vectorized", false]], "vectorized() (imspy.timstof.slice.timsslice method)": [[12, "imspy.timstof.slice.TimsSlice.vectorized", false]], "write_dia_ms_ms_info() (imspy.simulation.tdf.tdfwriter method)": [[9, "imspy.simulation.tdf.TDFWriter.write_dia_ms_ms_info", false]], "write_dia_ms_ms_windows() (imspy.simulation.tdf.tdfwriter method)": [[9, "imspy.simulation.tdf.TDFWriter.write_dia_ms_ms_windows", false]], "write_frame() (imspy.simulation.tdf.tdfwriter method)": [[9, "imspy.simulation.tdf.TDFWriter.write_frame", false]], "write_frame_meta_data() (imspy.simulation.tdf.tdfwriter method)": [[9, "imspy.simulation.tdf.TDFWriter.write_frame_meta_data", false]], "write_psms_binary() (in module imspy.timstof.dbsearch.utility)": [[13, "imspy.timstof.dbsearch.utility.write_psms_binary", false]]}, "objects": {"": [[0, 0, 0, "-", "imspy"]], "imspy": [[1, 0, 0, "-", "algorithm"], [7, 0, 0, "-", "chemistry"], [8, 0, 0, "-", "data"], [9, 0, 0, "-", "simulation"], [12, 0, 0, "-", "timstof"], [14, 0, 0, "-", "utility"], [15, 0, 0, "-", "vis"]], "imspy.algorithm": [[2, 0, 0, "-", "ccs"], [1, 0, 0, "-", "hashing"], [3, 0, 0, "-", "intensity"], [4, 0, 0, "-", "ionization"], [5, 0, 0, "-", "pretrained"], [6, 0, 0, "-", "rt"], [1, 0, 0, "-", "utility"]], "imspy.algorithm.ccs": [[2, 0, 0, "-", "predictors"]], "imspy.algorithm.ccs.predictors": [[2, 1, 1, "", "DeepPeptideIonMobilityApex"], [2, 1, 1, "", "GRUCCSPredictor"], [2, 1, 1, "", "PeptideIonMobilityApex"], [2, 1, 1, "", "SquareRootProjectionLayer"], [2, 3, 1, "", "get_sqrt_slopes_and_intercepts"], [2, 3, 1, "", "load_deep_ccs_predictor"], [2, 3, 1, "", "predict_inverse_ion_mobility"]], "imspy.algorithm.ccs.predictors.DeepPeptideIonMobilityApex": [[2, 2, 1, "", "fine_tune_model"], [2, 2, 1, "", "simulate_ion_mobilities"], [2, 2, 1, "", "simulate_ion_mobilities_pandas"]], "imspy.algorithm.ccs.predictors.GRUCCSPredictor": [[2, 2, 1, "", "build"], [2, 2, 1, "", "call"], [2, 2, 1, "", "from_config"], [2, 2, 1, "", "get_config"]], "imspy.algorithm.ccs.predictors.PeptideIonMobilityApex": [[2, 2, 1, "", "simulate_ion_mobilities"], [2, 2, 1, "", "simulate_ion_mobilities_pandas"]], "imspy.algorithm.ccs.predictors.SquareRootProjectionLayer": [[2, 2, 1, "", "build"], [2, 2, 1, "", "call"], [2, 2, 1, "", "from_config"], [2, 2, 1, "", "get_config"]], "imspy.algorithm.hashing": [[1, 1, 1, "", "CosimHasher"], [1, 1, 1, "", "TimsHasher"]], "imspy.algorithm.hashing.CosimHasher": [[1, 2, 1, "", "calculate_keys"]], "imspy.algorithm.intensity": [[3, 0, 0, "-", "predictors"], [3, 0, 0, "-", "utility"]], "imspy.algorithm.intensity.predictors": [[3, 1, 1, "", "IonIntensityPredictor"], [3, 1, 1, "", "Prosit2023TimsTofWrapper"], [3, 3, 1, "", "get_collision_energy_calibration_factor"], [3, 3, 1, "", "load_prosit_2023_timsTOF_predictor"], [3, 3, 1, "", "predict_intensities_prosit"], [3, 3, 1, "", "remove_unimod_annotation"]], "imspy.algorithm.intensity.predictors.IonIntensityPredictor": [[3, 2, 1, "", "simulate_ion_intensities"], [3, 2, 1, "", "simulate_ion_intensities_pandas"]], "imspy.algorithm.intensity.predictors.Prosit2023TimsTofWrapper": [[3, 2, 1, "", "predict_intensities"], [3, 2, 1, "", "simulate_ion_intensities"], [3, 2, 1, "", "simulate_ion_intensities_pandas"], [3, 2, 1, "", "simulate_ion_intensities_pandas_batched"]], "imspy.algorithm.intensity.utility": [[3, 3, 1, "", "beta_score"], [3, 3, 1, "", "generate_prosit_intensity_prediction_dataset"], [3, 3, 1, "", "get_prosit_intensity_flat_labels"], [3, 3, 1, "", "post_process_predicted_fragment_spectra"], [3, 3, 1, "", "seq_to_index"], [3, 3, 1, "", "to_prosit_tensor"], [3, 3, 1, "", "unpack_dict"]], "imspy.algorithm.ionization": [[4, 0, 0, "-", "predictors"]], "imspy.algorithm.ionization.predictors": [[4, 1, 1, "", "BinomialChargeStateDistributionModel"], [4, 1, 1, "", "DeepChargeStateDistribution"], [4, 1, 1, "", "GRUChargeStatePredictor"], [4, 1, 1, "", "PeptideChargeStateDistribution"], [4, 3, 1, "", "charge_state_distribution_from_sequence_rust"], [4, 3, 1, "", "charge_state_distributions_from_sequences_rust"], [4, 3, 1, "", "load_deep_charge_state_predictor"]], "imspy.algorithm.ionization.predictors.BinomialChargeStateDistributionModel": [[4, 2, 1, "", "simulate_charge_state_distribution_pandas"], [4, 2, 1, "", "simulate_ionizations"]], "imspy.algorithm.ionization.predictors.DeepChargeStateDistribution": [[4, 2, 1, "", "simulate_charge_state_distribution_pandas"], [4, 2, 1, "", "simulate_ionizations"]], "imspy.algorithm.ionization.predictors.GRUChargeStatePredictor": [[4, 2, 1, "", "build"], [4, 2, 1, "", "call"], [4, 2, 1, "", "from_config"], [4, 2, 1, "", "get_config"]], "imspy.algorithm.ionization.predictors.PeptideChargeStateDistribution": [[4, 2, 1, "", "simulate_charge_state_distribution_pandas"], [4, 2, 1, "", "simulate_ionizations"]], "imspy.algorithm.rt": [[6, 0, 0, "-", "predictors"]], "imspy.algorithm.rt.predictors": [[6, 1, 1, "", "DeepChromatographyApex"], [6, 1, 1, "", "GRURetentionTimePredictor"], [6, 1, 1, "", "PeptideChromatographyApex"], [6, 3, 1, "", "get_rt_prediction_set"], [6, 3, 1, "", "get_rt_train_set"], [6, 3, 1, "", "load_deep_retention_time_predictor"], [6, 3, 1, "", "predict_retention_time"]], "imspy.algorithm.rt.predictors.DeepChromatographyApex": [[6, 2, 1, "", "fine_tune_model"], [6, 2, 1, "", "generate_tf_ds_inference"], [6, 2, 1, "", "generate_tf_ds_train"], [6, 2, 1, "", "simulate_separation_times"], [6, 2, 1, "", "simulate_separation_times_pandas"]], "imspy.algorithm.rt.predictors.GRURetentionTimePredictor": [[6, 2, 1, "", "build"], [6, 2, 1, "", "call"], [6, 2, 1, "", "from_config"], [6, 2, 1, "", "get_config"]], "imspy.algorithm.rt.predictors.PeptideChromatographyApex": [[6, 2, 1, "", "simulate_separation_times"], [6, 2, 1, "", "simulate_separation_times_pandas"]], "imspy.algorithm.utility": [[1, 1, 1, "", "InMemoryCheckpoint"], [1, 3, 1, "", "get_model_path"], [1, 3, 1, "", "load_tokenizer_from_resources"]], "imspy.algorithm.utility.InMemoryCheckpoint": [[1, 2, 1, "", "on_epoch_end"], [1, 2, 1, "", "on_train_begin"], [1, 2, 1, "", "on_train_end"]], "imspy.chemistry": [[7, 0, 0, "-", "amino_acids"], [7, 0, 0, "-", "constants"], [7, 0, 0, "-", "elements"], [7, 0, 0, "-", "mobility"], [7, 0, 0, "-", "sum_formula"], [7, 0, 0, "-", "unimod"], [7, 0, 0, "-", "utility"]], "imspy.chemistry.mobility": [[7, 3, 1, "", "ccs_to_one_over_k0"], [7, 3, 1, "", "one_over_k0_to_ccs"]], "imspy.chemistry.sum_formula": [[7, 1, 1, "", "SumFormula"]], "imspy.chemistry.sum_formula.SumFormula": [[7, 4, 1, "", "formula"], [7, 4, 1, "", "formula_dict"], [7, 2, 1, "", "from_py_ptr"], [7, 2, 1, "", "generate_isotope_distribution"], [7, 2, 1, "", "get_py_ptr"], [7, 4, 1, "", "monoisotopic_mass"]], "imspy.chemistry.utility": [[7, 3, 1, "", "calculate_mz"], [7, 3, 1, "", "calculate_transmission_dependent_fragment_ion_isotope_distribution"]], "imspy.data": [[8, 0, 0, "-", "peptide"], [8, 0, 0, "-", "spectrum"]], "imspy.data.peptide": [[8, 1, 1, "", "PeptideIon"], [8, 1, 1, "", "PeptideProductIon"], [8, 1, 1, "", "PeptideProductIonSeries"], [8, 1, 1, "", "PeptideProductIonSeriesCollection"], [8, 1, 1, "", "PeptideSequence"]], "imspy.data.peptide.PeptideIon": [[8, 4, 1, "", "atomic_composition"], [8, 2, 1, "", "calculate_isotopic_spectrum"], [8, 2, 1, "", "calculate_isotopic_spectrum_annotated"], [8, 4, 1, "", "charge"], [8, 2, 1, "", "from_py_ptr"], [8, 2, 1, "", "get_py_ptr"], [8, 4, 1, "", "intensity"], [8, 4, 1, "", "mz"], [8, 4, 1, "", "peptide_id"], [8, 4, 1, "", "sequence"], [8, 2, 1, "", "to_json"]], "imspy.data.peptide.PeptideProductIon": [[8, 2, 1, "", "atomic_composition"], [8, 4, 1, "", "charge"], [8, 2, 1, "", "from_py_ptr"], [8, 2, 1, "", "get_py_ptr"], [8, 4, 1, "", "intensity"], [8, 2, 1, "", "isotope_distribution"], [8, 4, 1, "", "kind"], [8, 4, 1, "", "mono_isotopic_mass"], [8, 4, 1, "", "mz"], [8, 4, 1, "", "sequence"], [8, 2, 1, "", "to_json"]], "imspy.data.peptide.PeptideProductIonSeries": [[8, 4, 1, "", "c_ions"], [8, 4, 1, "", "charge"], [8, 2, 1, "", "from_py_ptr"], [8, 2, 1, "", "get_py_ptr"], [8, 4, 1, "", "n_ions"], [8, 2, 1, "", "to_json"]], "imspy.data.peptide.PeptideProductIonSeriesCollection": [[8, 2, 1, "", "find_series"], [8, 2, 1, "", "from_py_ptr"], [8, 2, 1, "", "generate_isotopic_spectrum"], [8, 2, 1, "", "generate_isotopic_spectrum_annotated"], [8, 2, 1, "", "get_py_ptr"], [8, 4, 1, "", "series"], [8, 2, 1, "", "to_json"]], "imspy.data.peptide.PeptideSequence": [[8, 4, 1, "", "amino_acid_count"], [8, 2, 1, "", "associate_fragment_ion_series_with_prosit_intensities"], [8, 4, 1, "", "atomic_composition"], [8, 2, 1, "", "calculate_isotopic_product_ion_spectrum_annotated"], [8, 2, 1, "", "calculate_mono_isotopic_product_ion_spectrum"], [8, 2, 1, "", "calculate_mono_isotopic_product_ion_spectrum_annotated"], [8, 2, 1, "", "calculate_product_ion_series"], [8, 2, 1, "", "from_py_ptr"], [8, 2, 1, "", "get_py_ptr"], [8, 4, 1, "", "mono_isotopic_mass"], [8, 4, 1, "", "peptide_id"], [8, 4, 1, "", "sequence"], [8, 2, 1, "", "to_json"], [8, 2, 1, "", "to_sage_representation"], [8, 2, 1, "", "to_tokens"]], "imspy.data.spectrum": [[8, 1, 1, "", "IndexedMzSpectrum"], [8, 1, 1, "", "MzSpectrum"], [8, 1, 1, "", "MzSpectrumVectorized"], [8, 1, 1, "", "TimsSpectrum"], [8, 3, 1, "", "get_peak_integral"]], "imspy.data.spectrum.IndexedMzSpectrum": [[8, 4, 1, "", "df"], [8, 2, 1, "", "filter"], [8, 2, 1, "", "from_py_ptr"], [8, 2, 1, "", "get_py_ptr"], [8, 4, 1, "", "index"], [8, 4, 1, "", "intensity"], [8, 4, 1, "", "mz"]], "imspy.data.spectrum.MzSpectrum": [[8, 2, 1, "", "add_mz_noise_normal"], [8, 2, 1, "", "add_mz_noise_uniform"], [8, 4, 1, "", "df"], [8, 2, 1, "", "filter"], [8, 2, 1, "", "from_jsons"], [8, 2, 1, "", "from_mz_spectra_list"], [8, 2, 1, "", "from_py_ptr"], [8, 2, 1, "", "get_py_ptr"], [8, 4, 1, "", "intensity"], [8, 4, 1, "", "mz"], [8, 2, 1, "", "to_centroided"], [8, 2, 1, "", "to_jsons"], [8, 2, 1, "", "to_resolution"], [8, 2, 1, "", "to_windows"], [8, 2, 1, "", "vectorized"]], "imspy.data.spectrum.MzSpectrumVectorized": [[8, 2, 1, "", "from_py_ptr"], [8, 2, 1, "", "get_py_ptr"], [8, 4, 1, "", "indices"], [8, 4, 1, "", "resolution"], [8, 2, 1, "", "to_centroided"], [8, 4, 1, "", "values"]], "imspy.data.spectrum.TimsSpectrum": [[8, 4, 1, "", "df"], [8, 2, 1, "", "filter"], [8, 4, 1, "", "frame_id"], [8, 2, 1, "", "from_py_ptr"], [8, 2, 1, "", "get_py_ptr"], [8, 4, 1, "", "index"], [8, 4, 1, "", "intensity"], [8, 4, 1, "", "mobility"], [8, 4, 1, "", "ms_type"], [8, 4, 1, "", "mz"], [8, 4, 1, "", "mz_spectrum"], [8, 4, 1, "", "retention_time"], [8, 4, 1, "", "scan"]], "imspy.simulation": [[9, 0, 0, "-", "acquisition"], [9, 0, 0, "-", "annotation"], [9, 0, 0, "-", "experiment"], [9, 0, 0, "-", "handle"], [9, 0, 0, "-", "noise"], [9, 0, 0, "-", "proteome"], [9, 0, 0, "-", "tdf"], [10, 0, 0, "-", "timsim"], [9, 0, 0, "-", "utility"]], "imspy.simulation.acquisition": [[9, 1, 1, "", "TimsTofAcquisitionBuilder"], [9, 1, 1, "", "TimsTofAcquisitionBuilderDDA"], [9, 1, 1, "", "TimsTofAcquisitionBuilderDIA"]], "imspy.simulation.acquisition.TimsTofAcquisitionBuilder": [[9, 2, 1, "", "calculate_frame_types"], [9, 2, 1, "", "from_existing"], [9, 2, 1, "", "generate_frame_table"], [9, 2, 1, "", "generate_scan_table"]], "imspy.simulation.acquisition.TimsTofAcquisitionBuilderDDA": [[9, 2, 1, "", "calculate_frame_types"]], "imspy.simulation.acquisition.TimsTofAcquisitionBuilderDIA": [[9, 2, 1, "", "calculate_frame_types"], [9, 2, 1, "", "from_config"], [9, 2, 1, "", "from_existing"], [9, 2, 1, "", "generate_frame_to_window_group_table"]], "imspy.simulation.annotation": [[9, 1, 1, "", "ContributionSource"], [9, 1, 1, "", "MzSpectrumAnnotated"], [9, 1, 1, "", "PeakAnnotation"], [9, 1, 1, "", "RustWrapperObject"], [9, 1, 1, "", "SignalAttributes"], [9, 1, 1, "", "SourceType"], [9, 1, 1, "", "TimsFrameAnnotated"]], "imspy.simulation.annotation.ContributionSource": [[9, 2, 1, "", "from_py_ptr"], [9, 2, 1, "", "get_py_ptr"], [9, 4, 1, "", "intensity_contribution"], [9, 4, 1, "", "signal_attributes"], [9, 4, 1, "", "source_type"]], "imspy.simulation.annotation.MzSpectrumAnnotated": [[9, 4, 1, "", "annotations"], [9, 2, 1, "", "filter"], [9, 2, 1, "", "from_py_ptr"], [9, 2, 1, "", "get_py_ptr"], [9, 4, 1, "", "intensity"], [9, 4, 1, "", "mz"]], "imspy.simulation.annotation.PeakAnnotation": [[9, 4, 1, "", "contributions"], [9, 2, 1, "", "from_py_ptr"], [9, 2, 1, "", "get_py_ptr"]], "imspy.simulation.annotation.RustWrapperObject": [[9, 2, 1, "", "from_py_ptr"], [9, 2, 1, "", "get_py_ptr"]], "imspy.simulation.annotation.SignalAttributes": [[9, 4, 1, "", "charge_state"], [9, 4, 1, "", "description"], [9, 2, 1, "", "from_py_ptr"], [9, 2, 1, "", "get_py_ptr"], [9, 4, 1, "", "isotope_peak"], [9, 4, 1, "", "peptide_id"]], "imspy.simulation.annotation.SourceType": [[9, 2, 1, "", "from_py_ptr"], [9, 2, 1, "", "get_py_ptr"], [9, 4, 1, "", "source_type"]], "imspy.simulation.annotation.TimsFrameAnnotated": [[9, 4, 1, "", "annotations"], [9, 4, 1, "", "charge_states_first_only"], [9, 4, 1, "", "df"], [9, 2, 1, "", "filter"], [9, 4, 1, "", "frame_id"], [9, 2, 1, "", "from_py_ptr"], [9, 2, 1, "", "get_py_ptr"], [9, 4, 1, "", "intensity"], [9, 4, 1, "", "inv_mobility"], [9, 4, 1, "", "isotope_peaks_first_only"], [9, 4, 1, "", "ms_type"], [9, 4, 1, "", "ms_type_numeric"], [9, 4, 1, "", "mz"], [9, 4, 1, "", "peptide_ids_first_only"], [9, 4, 1, "", "retention_time"], [9, 4, 1, "", "scan"], [9, 4, 1, "", "tof"]], "imspy.simulation.experiment": [[9, 1, 1, "", "SyntheticExperimentDataHandle"], [9, 1, 1, "", "SyntheticExperimentDataHandleDIA"], [9, 1, 1, "", "TimsTofSyntheticFrameBuilderDIA"], [9, 1, 1, "", "TimsTofSyntheticPrecursorFrameBuilder"]], "imspy.simulation.experiment.SyntheticExperimentDataHandle": [[9, 2, 1, "", "append_table"], [9, 2, 1, "", "close"], [9, 2, 1, "", "create_table"], [9, 2, 1, "", "create_table_sql"], [9, 2, 1, "", "get_table"], [9, 2, 1, "", "list_columns"], [9, 2, 1, "", "list_tables"]], "imspy.simulation.experiment.SyntheticExperimentDataHandleDIA": [[9, 2, 1, "", "get_frame_to_window_group"], [9, 2, 1, "", "get_window_group_settings"]], "imspy.simulation.experiment.TimsTofSyntheticFrameBuilderDIA": [[9, 2, 1, "", "build_frame"], [9, 2, 1, "", "build_frame_annotated"], [9, 2, 1, "", "build_frames"], [9, 2, 1, "", "build_frames_annotated"], [9, 2, 1, "", "count_number_transmissions"], [9, 2, 1, "", "count_number_transmissions_parallel"], [9, 2, 1, "", "from_py_ptr"], [9, 2, 1, "", "get_collision_energies"], [9, 2, 1, "", "get_collision_energy"], [9, 2, 1, "", "get_ion_transmission_matrix"], [9, 2, 1, "", "get_py_ptr"]], "imspy.simulation.experiment.TimsTofSyntheticPrecursorFrameBuilder": [[9, 2, 1, "", "build_precursor_frame"], [9, 2, 1, "", "build_precursor_frame_annotated"], [9, 2, 1, "", "build_precursor_frames"], [9, 2, 1, "", "build_precursor_frames_annotated"], [9, 2, 1, "", "from_py_ptr"], [9, 2, 1, "", "get_py_ptr"]], "imspy.simulation.handle": [[9, 1, 1, "", "TimsTofSyntheticsDataHandleRust"]], "imspy.simulation.handle.TimsTofSyntheticsDataHandleRust": [[9, 2, 1, "", "get_py_ptr"], [9, 2, 1, "", "get_transmitted_ions"]], "imspy.simulation.noise": [[9, 3, 1, "", "baseline_noise"], [9, 3, 1, "", "baseline_shot_noise"], [9, 3, 1, "", "baseline_shot_noise_window"], [9, 3, 1, "", "detection_noise"], [9, 3, 1, "", "generate_noise_peak"], [9, 3, 1, "", "mu_function_normal_default"], [9, 3, 1, "", "mu_function_poisson_default"], [9, 3, 1, "", "sigma_function_normal_default"]], "imspy.simulation.proteome": [[9, 1, 1, "", "PeptideDigest"]], "imspy.simulation.tdf": [[9, 1, 1, "", "TDFWriter"]], "imspy.simulation.tdf.TDFWriter": [[9, 2, 1, "", "build_frame_meta_row"], [9, 2, 1, "", "compress_frame"], [9, 2, 1, "", "get_frame_meta_data"], [9, 2, 1, "", "inv_mobility_to_scan"], [9, 2, 1, "", "mz_to_tof"], [9, 2, 1, "", "scan_to_inv_mobility"], [9, 2, 1, "", "tof_to_mz"], [9, 2, 1, "", "write_dia_ms_ms_info"], [9, 2, 1, "", "write_dia_ms_ms_windows"], [9, 2, 1, "", "write_frame"], [9, 2, 1, "", "write_frame_meta_data"]], "imspy.simulation.timsim": [[11, 0, 0, "-", "jobs"]], "imspy.simulation.timsim.jobs": [[11, 0, 0, "-", "add_noise_from_real_data"], [11, 0, 0, "-", "assemble_frames"], [11, 0, 0, "-", "build_acquisition"], [11, 0, 0, "-", "digest_fasta"], [11, 0, 0, "-", "simulate_charge_states"], [11, 0, 0, "-", "simulate_fragment_intensities"], [11, 0, 0, "-", "simulate_frame_distributions"], [11, 0, 0, "-", "simulate_frame_distributions_emg"], [11, 0, 0, "-", "simulate_ion_mobilities"], [11, 0, 0, "-", "simulate_occurrences"], [11, 0, 0, "-", "simulate_retention_time"], [11, 0, 0, "-", "simulate_scan_distributions"], [11, 0, 0, "-", "utility"]], "imspy.simulation.timsim.jobs.add_noise_from_real_data": [[11, 3, 1, "", "add_real_data_noise_to_frames"]], "imspy.simulation.timsim.jobs.assemble_frames": [[11, 3, 1, "", "assemble_frames"]], "imspy.simulation.timsim.jobs.build_acquisition": [[11, 3, 1, "", "build_acquisition"]], "imspy.simulation.timsim.jobs.digest_fasta": [[11, 3, 1, "", "digest_fasta"]], "imspy.simulation.timsim.jobs.simulate_charge_states": [[11, 3, 1, "", "simulate_charge_states"]], "imspy.simulation.timsim.jobs.simulate_fragment_intensities": [[11, 3, 1, "", "simulate_fragment_intensities"]], "imspy.simulation.timsim.jobs.simulate_frame_distributions": [[11, 3, 1, "", "simulate_frame_distributions"]], "imspy.simulation.timsim.jobs.simulate_frame_distributions_emg": [[11, 3, 1, "", "sample_parameters_rejection"], [11, 3, 1, "", "simulate_frame_distributions_emg"]], "imspy.simulation.timsim.jobs.simulate_ion_mobilities": [[11, 3, 1, "", "simulate_ion_mobilities"]], "imspy.simulation.timsim.jobs.simulate_occurrences": [[11, 3, 1, "", "simulate_peptide_occurrences"]], "imspy.simulation.timsim.jobs.simulate_retention_time": [[11, 3, 1, "", "simulate_retention_times"]], "imspy.simulation.timsim.jobs.simulate_scan_distributions": [[11, 3, 1, "", "simulate_scan_distributions"]], "imspy.simulation.timsim.jobs.utility": [[11, 3, 1, "", "check_path"]], "imspy.simulation.utility": [[9, 3, 1, "", "accumulated_intensity_cdf_numba"], [9, 3, 1, "", "add_uniform_noise"], [9, 3, 1, "", "calculate_b_y_fragment_mz"], [9, 3, 1, "", "calculate_b_y_ion_series_ims"], [9, 3, 1, "", "calculate_bounds_numba"], [9, 3, 1, "", "calculate_mobility_spacing"], [9, 3, 1, "", "calculate_number_frames"], [9, 3, 1, "", "custom_cdf"], [9, 3, 1, "", "flat_intensity_to_sparse"], [9, 3, 1, "", "flatten_prosit_array"], [9, 3, 1, "", "generate_events"], [9, 3, 1, "", "get_acquisition_builder_resource_path"], [9, 3, 1, "", "get_compressible_data"], [9, 3, 1, "", "get_dilution_factors"], [9, 3, 1, "", "get_fasta_file_paths"], [9, 3, 1, "", "get_frames_numba"], [9, 3, 1, "", "get_ms_ms_window_layout_resource_path"], [9, 3, 1, "", "get_native_dataset_path"], [9, 3, 1, "", "get_peak_cnts"], [9, 3, 1, "", "get_realdata"], [9, 3, 1, "", "get_realdata_loop"], [9, 3, 1, "", "get_scans_numba"], [9, 3, 1, "", "get_z_score_for_percentile"], [9, 3, 1, "", "irt_to_rts_numba"], [9, 3, 1, "", "json_string_to_python_list"], [9, 3, 1, "", "modify_tofs"], [9, 3, 1, "", "np_zip"], [9, 3, 1, "", "python_list_to_json_string"], [9, 3, 1, "", "read_acquisition_config"], [9, 3, 1, "", "sequence_to_all_ions"], [9, 3, 1, "", "sequence_to_numpy"], [9, 3, 1, "", "sequences_to_all_ions"], [9, 3, 1, "", "set_percentage_to_zero"]], "imspy.timstof": [[12, 0, 0, "-", "collision"], [12, 0, 0, "-", "data"], [13, 0, 0, "-", "dbsearch"], [12, 0, 0, "-", "dda"], [12, 0, 0, "-", "dia"], [12, 0, 0, "-", "frame"], [12, 0, 0, "-", "quadrupole"], [12, 0, 0, "-", "slice"]], "imspy.timstof.collision": [[12, 1, 1, "", "TimsTofCollisionEnergy"], [12, 1, 1, "", "TimsTofCollisionEnergyDIA"]], "imspy.timstof.collision.TimsTofCollisionEnergy": [[12, 2, 1, "", "get_collision_energies"], [12, 2, 1, "", "get_collision_energy"]], "imspy.timstof.collision.TimsTofCollisionEnergyDIA": [[12, 2, 1, "", "get_collision_energies"], [12, 2, 1, "", "get_collision_energy"]], "imspy.timstof.data": [[12, 1, 1, "", "AcquisitionMode"], [12, 1, 1, "", "TimsDataset"]], "imspy.timstof.data.AcquisitionMode": [[12, 2, 1, "", "from_py_ptr"], [12, 2, 1, "", "get_py_ptr"], [12, 4, 1, "", "mode"]], "imspy.timstof.data.TimsDataset": [[12, 4, 1, "", "acquisition_mode"], [12, 4, 1, "", "acquisition_mode_numeric"], [12, 4, 1, "", "average_cycle_length"], [12, 2, 1, "", "bytes_to_indexed_values"], [12, 2, 1, "", "compress_frames"], [12, 2, 1, "", "compress_zstd"], [12, 2, 1, "", "decompress_zstd"], [12, 4, 1, "", "description"], [12, 4, 1, "", "frame_count"], [12, 2, 1, "", "get_table"], [12, 2, 1, "", "get_tims_frame"], [12, 2, 1, "", "get_tims_slice"], [12, 4, 1, "", "im_lower"], [12, 4, 1, "", "im_upper"], [12, 2, 1, "", "indexed_values_to_compressed_bytes"], [12, 2, 1, "", "inverse_mobility_to_scan"], [12, 4, 1, "", "mz_lower"], [12, 2, 1, "", "mz_to_tof"], [12, 4, 1, "", "mz_upper"], [12, 4, 1, "", "num_scans"], [12, 2, 1, "", "scan_to_inverse_mobility"], [12, 2, 1, "", "tof_to_mz"]], "imspy.timstof.dbsearch": [[13, 0, 0, "-", "imspy_dda"], [13, 0, 0, "-", "imspy_rescore_sage"], [13, 0, 0, "-", "sage_output_utility"], [13, 0, 0, "-", "utility"]], "imspy.timstof.dbsearch.imspy_dda": [[13, 3, 1, "", "create_database"], [13, 3, 1, "", "load_config"], [13, 3, 1, "", "main"]], "imspy.timstof.dbsearch.imspy_rescore_sage": [[13, 3, 1, "", "main"]], "imspy.timstof.dbsearch.sage_output_utility": [[13, 1, 1, "", "PatternReplacer"], [13, 3, 1, "", "break_into_equal_size_sets"], [13, 3, 1, "", "cosim_from_dict"], [13, 3, 1, "", "fragments_to_dict"], [13, 3, 1, "", "generate_training_data"], [13, 3, 1, "", "plot_summary"], [13, 3, 1, "", "re_score_psms"], [13, 3, 1, "", "remove_substrings"], [13, 3, 1, "", "row_to_fragment"], [13, 3, 1, "", "split_dataframe_randomly"]], "imspy.timstof.dbsearch.sage_output_utility.PatternReplacer": [[13, 2, 1, "", "apply"]], "imspy.timstof.dbsearch.utility": [[13, 3, 1, "", "extract_timstof_dda_data"], [13, 3, 1, "", "generate_balanced_im_dataset"], [13, 3, 1, "", "generate_balanced_rt_dataset"], [13, 3, 1, "", "generate_training_data"], [13, 3, 1, "", "get_searchable_spec"], [13, 3, 1, "", "linear_map"], [13, 3, 1, "", "map_to_domain"], [13, 3, 1, "", "merge_dicts_with_merge_dict"], [13, 3, 1, "", "sanitize_charge"], [13, 3, 1, "", "sanitize_mz"], [13, 3, 1, "", "split_fasta"], [13, 3, 1, "", "split_psms"], [13, 3, 1, "", "transform_psm_to_pin"], [13, 3, 1, "", "write_psms_binary"]], "imspy.timstof.dda": [[12, 1, 1, "", "FragmentDDA"], [12, 1, 1, "", "TimsDatasetDDA"]], "imspy.timstof.dda.FragmentDDA": [[12, 4, 1, "", "collision_energy"], [12, 4, 1, "", "frame_id"], [12, 2, 1, "", "from_py_ptr"], [12, 2, 1, "", "get_py_ptr"], [12, 4, 1, "", "precursor_id"], [12, 4, 1, "", "selected_fragment"]], "imspy.timstof.dda.TimsDatasetDDA": [[12, 2, 1, "", "from_py_ptr"], [12, 2, 1, "", "get_pasef_fragments"], [12, 2, 1, "", "get_py_ptr"]], "imspy.timstof.dia": [[12, 1, 1, "", "TimsDatasetDIA"]], "imspy.timstof.dia.TimsDatasetDIA": [[12, 4, 1, "", "dia_ms_ms_info"], [12, 4, 1, "", "dia_ms_ms_windows"], [12, 2, 1, "", "from_py_ptr"], [12, 2, 1, "", "get_py_ptr"], [12, 2, 1, "", "read_compressed_data_full"], [12, 2, 1, "", "sample_fragment_signal"], [12, 2, 1, "", "sample_precursor_signal"]], "imspy.timstof.frame": [[12, 1, 1, "", "TimsFrame"], [12, 1, 1, "", "TimsFrameVectorized"]], "imspy.timstof.frame.TimsFrame": [[12, 4, 1, "", "df"], [12, 2, 1, "", "filter"], [12, 4, 1, "", "frame_id"], [12, 2, 1, "", "from_py_ptr"], [12, 2, 1, "", "from_tims_spectra"], [12, 2, 1, "", "from_windows"], [12, 2, 1, "", "get_inverse_mobility_along_scan_marginal"], [12, 2, 1, "", "get_mobility_mean_and_variance"], [12, 2, 1, "", "get_py_ptr"], [12, 4, 1, "", "intensity"], [12, 4, 1, "", "mobility"], [12, 4, 1, "", "ms_type"], [12, 4, 1, "", "ms_type_as_string"], [12, 4, 1, "", "mz"], [12, 2, 1, "", "random_subsample_frame"], [12, 4, 1, "", "retention_time"], [12, 4, 1, "", "scan"], [12, 2, 1, "", "to_dense_windows"], [12, 2, 1, "", "to_indexed_mz_spectrum"], [12, 2, 1, "", "to_noise_annotated_tims_frame"], [12, 2, 1, "", "to_resolution"], [12, 2, 1, "", "to_tims_spectra"], [12, 2, 1, "", "to_windows"], [12, 4, 1, "", "tof"], [12, 2, 1, "", "vectorized"]], "imspy.timstof.frame.TimsFrameVectorized": [[12, 4, 1, "", "df"], [12, 2, 1, "", "filter"], [12, 4, 1, "", "frame_id"], [12, 2, 1, "", "from_py_ptr"], [12, 2, 1, "", "get_arrays_at_index"], [12, 2, 1, "", "get_py_ptr"], [12, 2, 1, "", "get_tensor_repr"], [12, 4, 1, "", "indices"], [12, 4, 1, "", "intensity"], [12, 4, 1, "", "mobility"], [12, 4, 1, "", "ms_type"], [12, 4, 1, "", "retention_time"], [12, 4, 1, "", "scan"], [12, 4, 1, "", "tof"]], "imspy.timstof.quadrupole": [[12, 1, 1, "", "TimsTofQuadrupoleDIA"]], "imspy.timstof.quadrupole.TimsTofQuadrupoleDIA": [[12, 2, 1, "", "all_transmitted"], [12, 2, 1, "", "any_transmitted"], [12, 2, 1, "", "apply_transmission"], [12, 2, 1, "", "frame_to_window_group"], [12, 2, 1, "", "get_transmission_set"], [12, 2, 1, "", "is_precursor"], [12, 2, 1, "", "is_transmitted"], [12, 2, 1, "", "isotopes_transmitted"], [12, 2, 1, "", "transmit_frame"], [12, 2, 1, "", "transmit_ion"], [12, 2, 1, "", "transmit_spectrum"]], "imspy.timstof.slice": [[12, 1, 1, "", "TimsPlane"], [12, 1, 1, "", "TimsSlice"], [12, 1, 1, "", "TimsSliceVectorized"]], "imspy.timstof.slice.TimsPlane": [[12, 4, 1, "", "df"], [12, 4, 1, "", "frame_ids"], [12, 2, 1, "", "from_py_tims_plane"], [12, 4, 1, "", "intensities"], [12, 4, 1, "", "mobilities"], [12, 4, 1, "", "mz_mean"], [12, 4, 1, "", "mz_std"], [12, 4, 1, "", "num_points"], [12, 4, 1, "", "retention_times"], [12, 4, 1, "", "scans"], [12, 4, 1, "", "tof_mean"], [12, 4, 1, "", "tof_std"]], "imspy.timstof.slice.TimsSlice": [[12, 4, 1, "", "df"], [12, 2, 1, "", "filter"], [12, 2, 1, "", "filter_by_type"], [12, 4, 1, "", "first_frame_id"], [12, 4, 1, "", "fragments"], [12, 4, 1, "", "frames"], [12, 2, 1, "", "from_frames"], [12, 2, 1, "", "from_py_tims_slice"], [12, 2, 1, "", "get_tims_planes"], [12, 4, 1, "", "last_frame_id"], [12, 4, 1, "", "precursors"], [12, 2, 1, "", "to_dense_windows"], [12, 2, 1, "", "to_resolution"], [12, 2, 1, "", "to_windows"], [12, 2, 1, "", "vectorized"]], "imspy.timstof.slice.TimsSliceVectorized": [[12, 4, 1, "", "df"], [12, 2, 1, "", "filter"], [12, 4, 1, "", "first_frame_id"], [12, 4, 1, "", "fragments"], [12, 4, 1, "", "frames"], [12, 2, 1, "", "from_vectorized_py_tims_slice"], [12, 2, 1, "", "get_py_ptr"], [12, 2, 1, "", "get_tensor_repr"], [12, 4, 1, "", "last_frame_id"], [12, 4, 1, "", "precursors"]], "imspy.utility": [[14, 0, 0, "-", "sequence"], [14, 0, 0, "-", "utilities"]], "imspy.utility.sequence": [[14, 3, 1, "", "tokenize_unimod_sequence"]], "imspy.utility.utilities": [[14, 1, 1, "", "ExponentialGaussianDistribution"], [14, 1, 1, "", "NormalDistribution"], [14, 1, 1, "", "TokenSequence"], [14, 3, 1, "", "exp_distribution"], [14, 3, 1, "", "exp_gaussian"], [14, 3, 1, "", "gaussian"], [14, 3, 1, "", "get_aa_num_proforma_sequence"], [14, 3, 1, "", "is_unimod_end"], [14, 3, 1, "", "is_unimod_start"], [14, 3, 1, "", "normal_pdf"], [14, 3, 1, "", "re_index_indices"], [14, 3, 1, "", "tokenize_proforma_sequence"], [14, 3, 1, "", "tokenizer_from_json"], [14, 3, 1, "", "tokenizer_to_json"]], "imspy.utility.utilities.TokenSequence": [[14, 4, 1, "", "jsons"]]}, "objnames": {"0": ["py", "module", "Python module"], "1": ["py", "class", "Python class"], "2": ["py", "method", "Python method"], "3": ["py", "function", "Python function"], "4": ["py", "property", "Python property"]}, "objtypes": {"0": "py:module", "1": "py:class", "2": "py:method", "3": "py:function", "4": "py:property"}, "terms": {"": [1, 2, 8, 9, 14], "0": [1, 3, 4, 8, 9, 11, 12, 13, 14], "0001": 8, "001": [8, 9, 14], "005": 4, "01": [11, 13], "013": 7, "05": 11, "06": 8, "07": 3, "08": 8, "1": [1, 3, 4, 7, 8, 9, 11, 12, 14], "10": [1, 3, 8, 9, 11, 12, 13], "100": [3, 13], "1000": [9, 11, 12], "1000000": 11, "1000000000": [8, 9, 12], "1024": [2, 3, 4, 6], "1054": 9, "109": 9, "1101": 3, "120": [9, 13], "15": [7, 11], "150": 11, "16": 13, "17": [3, 9], "1700": 9, "174": 9, "1e": 8, "1e9": [8, 12], "2": [1, 2, 4, 6, 8, 9, 11, 12, 13], "20": 1, "200": 8, "2000": [8, 12], "2023": 3, "25": [12, 14], "273": 7, "28": 7, "3": [2, 4, 6, 8, 9, 13, 14], "30": [3, 9, 11], "300": 13, "3000": 9, "31": 7, "32": 1, "35": [9, 11], "3600": 11, "3989422804014327": 14, "4": [2, 4, 6, 9, 11, 12], "400000": [3, 12], "42": 1, "5": [4, 8, 9, 11, 12], "50": 9, "512": 3, "549401": 3, "5671": 1, "6": 11, "60": 13, "64": [2, 6, 9], "7": [1, 9, 12], "7200": 9, "75": 11, "8": 12, "8211811": 3, "85": 7, "95": 9, "A": [2, 3, 4, 6, 8, 13, 14], "As": 12, "For": [1, 2, 4, 6], "If": [2, 4, 6, 8], "In": [2, 4, 6], "It": [2, 4, 6], "The": [0, 1, 2, 3, 4, 6, 8, 9, 17], "These": 2, "To": [2, 4, 6], "__call__": [2, 4, 6], "__init__": [2, 9], "_nestedsequ": [9, 14], "_scalartype_co": [2, 3, 4, 6, 9, 11, 12], "_supportsarrai": [9, 14], "aa": 14, "abc": [2, 3, 4, 6, 9, 12], "abov": 2, "abstract": [2, 3, 4, 6, 9, 12], "abund": [4, 8, 11], "abundance_threshold": 8, "accord": 8, "accumul": 9, "accumulated_intensity_cdf_numba": 9, "accuraci": 1, "acid": [3, 14], "acquir": 9, "acquisit": [11, 12, 17], "acquisition_build": 11, "acquisition_mod": [9, 12], "acquisition_mode_numer": 12, "acquisition_nam": 9, "acquisition_typ": 11, "acquisitionmod": 12, "action": 1, "ad": [8, 9], "add": [8, 11], "add_mz_noise_norm": 8, "add_mz_noise_uniform": 8, "add_nois": 11, "add_noise_from_real_data": [9, 10], "add_real_data_nois": 11, "add_real_data_noise_to_fram": [10, 11], "add_uniform_nois": 9, "addit": 2, "advis": [2, 4, 6], "against": 2, "agnost": [2, 4, 6], "algorithm": [16, 17], "all": [2, 4, 6, 8, 9], "all_transmit": 12, "allow": [2, 3, 4, 6, 13], "allowed_charg": 4, "along": 12, "alphabet": 3, "although": 2, "alwai": [2, 4, 6], "amino": [3, 14], "amino_acid": 17, "amino_acid_count": 8, "amount": 9, "an": [0, 1, 2, 3, 4, 6, 9, 12], "angl": 3, "ani": [1, 2, 3, 4, 6, 8, 9, 11, 12, 14], "annot": [3, 12, 17], "any_transmit": 12, "apex": 3, "api": 17, "append_t": 9, "appli": [2, 9, 12, 13], "apply_transmiss": 12, "ar": [1, 2, 3, 4, 6, 8, 11], "arbitrari": 9, "arg": [2, 4, 6, 9, 12], "argument": [1, 2, 4, 6], "arrai": [2, 3, 4, 9, 12, 13], "as_float": 9, "assembl": 11, "assemble_fram": [9, 10], "assembli": 11, "associ": 8, "associate_fragment_ion_series_with_prosit_intens": 8, "atomic_composit": 8, "automat": 2, "average_cycle_length": 12, "b": [8, 9], "back_data": 9, "balanc": 13, "base": [1, 2, 3, 4, 6, 7, 8, 9, 12, 13, 14], "baselin": 9, "baseline_nois": 9, "baseline_noise_level": 8, "baseline_shot_nois": 9, "baseline_shot_noise_window": 9, "basic": [2, 4, 6], "batch": [3, 4, 11], "batch_siz": [2, 3, 4, 6, 11], "batch_size_tf_d": 3, "befor": [2, 13], "begin": 1, "behavior": 2, "being": 9, "beta": 3, "beta_scor": [1, 3], "between": [2, 9], "bin": 8, "binari": [9, 13], "binomialchargestatedistributionmodel": [1, 4], "bool": [2, 3, 6, 8, 9, 11, 12, 13, 14], "boolean": [2, 4, 6], "bound": [2, 3, 4, 6, 9, 11, 12, 13], "bracket": 14, "break": 13, "break_into_equal_size_set": [12, 13], "bruker": [11, 12, 13], "bucket_s": 13, "build": [1, 2, 4, 6, 9, 11], "build_acquisit": [9, 10], "build_fram": 9, "build_frame_annot": 9, "build_frame_meta_row": 9, "build_frames_annot": 9, "build_precursor_fram": 9, "build_precursor_frame_annot": 9, "build_precursor_frames_annot": 9, "builder": 11, "built": [2, 4, 6], "byte": [9, 12, 13, 14], "byte_arrai": 13, "bytes_to_indexed_valu": 12, "c": [7, 8, 9, 11], "c_ion": 8, "c_termin": 9, "calcul": [3, 7, 8, 9], "calculate_b_y_fragment_mz": 9, "calculate_b_y_ion_series_im": 9, "calculate_bounds_numba": 9, "calculate_frame_typ": 9, "calculate_isotopic_product_ion_spectrum_annot": 8, "calculate_isotopic_spectrum": 8, "calculate_isotopic_spectrum_annot": 8, "calculate_kei": 1, "calculate_mobility_spac": 9, "calculate_mono_isotopic_product_ion_spectrum": 8, "calculate_mono_isotopic_product_ion_spectrum_annot": 8, "calculate_mz": 7, "calculate_number_fram": 9, "calculate_product_ion_seri": 8, "calculate_transmission_dependent_fragment_ion_isotope_distribut": 7, "calibr": [3, 9], "calibrate_collision_energi": 3, "call": [1, 2, 4, 6, 9], "callabl": 9, "callback": 1, "caller": [2, 4, 6], "came": 2, "can": [2, 4, 6, 9, 14], "cannot": 2, "capabl": [2, 4, 6], "case": [2, 4, 6], "cast": 2, "caution": [9, 12], "cc": [1, 7], "ccs_to_one_over_k0": 7, "cdf": 9, "centroid": 8, "chang": 1, "char": 14, "charact": [9, 14], "charg": [2, 3, 4, 7, 8, 9, 11, 13], "charge_prob": 4, "charge_st": 9, "charge_state_distribution_from_sequence_rust": [1, 4], "charge_state_distributions_from_sequences_rust": [1, 4], "charge_state_one_prob": [4, 11], "charge_states_first_onli": 9, "charged_prob": 4, "check": [2, 4, 6, 8, 9], "check_path": [10, 11], "chemistri": [16, 17], "chosen": 13, "chromatograph": 6, "class": [1, 2, 3, 4, 6, 7, 8, 9, 12, 13, 14], "classmethod": [2, 4, 6, 7, 8, 9, 12], "cleavag": 11, "cleave_at": [9, 11], "close": 9, "coars": 11, "collect": [2, 6, 8, 12], "collis": [2, 3, 7, 9, 11, 17], "collision_energi": [3, 12], "collision_energy_decim": [9, 11], "collision_energy_in": 3, "come": 2, "compat": 2, "complement": 7, "complement_spec": 7, "complex": [9, 14], "compress": [9, 12], "compress_fram": [9, 12], "compress_zstd": 12, "comput": [2, 4, 6], "config": [2, 4, 6, 9], "config_path": 13, "configur": [2, 4, 6], "connect": [2, 4, 6, 12], "consecut": 14, "constant": [3, 17], "contain": [2, 3, 4, 6, 9, 11, 13, 17], "content": [16, 17], "continu": [2, 4, 6], "contribut": [9, 11], "contribution_sourc": 9, "contributionsourc": 9, "control": 11, "convert": [3, 7, 8, 9, 12], "convolut": 8, "copi": [2, 4, 6], "correspond": 2, "cosim_from_dict": [12, 13], "cosimhash": 1, "count_number_transmiss": 9, "count_number_transmissions_parallel": 9, "covari": [2, 3, 4, 6, 9, 11, 12], "creat": [1, 2, 4, 6, 8, 9, 12], "create_databas": [12, 13], "create_t": 9, "create_table_sql": 9, "creation": 2, "cross": [2, 7], "current": 1, "custom": [2, 4, 6, 9], "custom_cdf": 9, "custom_mu_funct": 9, "custom_sigma_funct": 9, "cycl": [9, 11], "d": 9, "da": 13, "dalton": 1, "data": [1, 2, 3, 4, 6, 9, 11, 13, 16, 17], "data_path": 12, "data_pr": 3, "databas": 11, "database_nam": 9, "database_path": 9, "datafram": [2, 3, 4, 6, 8, 9, 11, 12, 13], "dataset": [3, 9, 11, 12, 13], "datasetv2": 6, "db": 9, "db_path": 9, "dbsearch": 12, "dda": [13, 17], "decad": 8, "decai": 14, "decim": 11, "decoi": [11, 13], "decompress": 12, "decompress_zstd": 12, "decoys_separ": [2, 6], "deep": [3, 4], "deep_ion_intensity_predictor": 3, "deepchargestatedistribut": [1, 4], "deepchromatographyapex": [1, 6], "deeppeptideionmobilityapex": [1, 2], "default": [2, 4, 6, 8, 12], "dens": 12, "depend": 7, "descript": [9, 12], "desir": 8, "detail": [2, 4, 6], "detect": 9, "detection_nois": 9, "develop": [2, 4, 6], "deviat": [9, 11], "df": [8, 9, 12, 13], "dia": [9, 11, 17], "dia_ms_ms_info": [9, 12], "dia_ms_ms_window": [9, 12], "dict": [1, 2, 4, 6, 7, 8, 9, 11, 13], "dictionari": [2, 3, 4, 6], "did": 2, "differ": 12, "digest": 11, "digest_fasta": [9, 10], "directli": [2, 4, 6], "discret": 2, "disk": 11, "distribut": [4, 7, 8, 9, 11, 14], "divid": [9, 13], "divide_collision_energy_bi": 3, "dll": 12, "do": [2, 4, 6], "document": 17, "doe": [2, 4, 6], "doi": 3, "domain": 13, "down": 11, "down_sample_factor": 11, "download": 3, "dpi": 13, "drift": 7, "ds_name": 9, "dtype": [2, 3, 4, 6, 8, 9, 11, 12, 14], "dure": [1, 2, 9], "e": [2, 3, 4, 6, 11, 14], "each": [1, 2, 3, 4, 6, 13], "ecosystem": 2, "either": [2, 4, 6], "element": [9, 17], "end": [1, 14], "energi": [3, 9, 11], "enzyme_build": 13, "epoch": 1, "equal": 13, "error": [2, 4, 6], "establish": 12, "etc": 2, "everi": [2, 4, 6], "exampl": [1, 13], "except": 2, "exclud": 11, "exclude_accumulated_gradient_start": 11, "execut": 2, "exist": [2, 4, 6, 9, 11], "exp_distribut": 14, "exp_gaussian": 14, "exp_nam": [9, 11], "expect": [2, 3], "expected_noise_intens": 9, "expected_noise_peak": 9, "expected_noise_peaks_per_th": 9, "expected_noise_sigma": 9, "experi": [11, 17], "explicitli": 2, "exponenti": 14, "exponentialgaussiandistribut": 14, "extract": 13, "extract_timstof_dda_data": [12, 13], "factor": [3, 7, 11], "fals": [2, 3, 4, 6, 8, 9, 11, 12, 13, 14], "fasta": [9, 11, 13], "fasta_file_path": 11, "fasta_path": 9, "featur": [3, 17], "file": [9, 11, 13, 14], "file_format": 13, "file_id": 13, "file_nam": 13, "filter": [8, 9, 12], "filter_by_typ": 12, "find": 8, "find_seri": 8, "fine": 2, "fine_tune_model": [1, 2, 6], "first": [2, 12], "first_frame_id": 12, "fit": [2, 14], "fit_charge_state_on": 2, "fix": [3, 9], "flat": 8, "flat_intens": 8, "flat_intensity_to_spars": 9, "flatten": 3, "flatten_prosit_arrai": 9, "flight": 12, "float": [2, 3, 4, 6, 7, 8, 9, 11, 12, 13, 14], "float64": [8, 12], "folder": [9, 13], "folder_path": 13, "follow": [2, 17], "format": [3, 14], "formula": 7, "formula_dict": 7, "found": 8, "fraction": 11, "fragment": [3, 7, 9, 11, 12, 13], "fragment_noise_ppm": [9, 11], "fragment_sample_fract": 11, "fragment_typ": 8, "fragmentdda": 12, "fragments_observ": 3, "fragments_predict": 3, "fragments_to_dict": [12, 13], "frame": [8, 9, 11, 14, 17], "frame_count": 12, "frame_id": [8, 9, 12], "frame_max": 12, "frame_start_po": 9, "frame_to_window_group": 12, "frame_window_group": 12, "framework": [2, 4, 6], "fresh": [2, 4, 6], "from": [1, 2, 3, 4, 6, 7, 8, 9, 11, 12, 13, 14], "from_config": [1, 2, 4, 6, 9], "from_exist": [9, 11], "from_fram": 12, "from_json": 8, "from_mz_spectra_list": 8, "from_py_ptr": [7, 8, 9, 12], "from_py_tims_plan": 12, "from_py_tims_slic": 12, "from_tims_spectra": 12, "from_vectorized_py_tims_slic": 12, "from_window": 12, "function": [1, 8, 14], "futur": 1, "g": [2, 3, 4, 6, 14], "ga": 7, "gap": 14, "gaussian": 14, "gener": [2, 3, 4, 6, 8, 9, 11, 12, 13], "generate_balanced_im_dataset": [12, 13], "generate_balanced_rt_dataset": [12, 13], "generate_decoi": [9, 13], "generate_ev": 9, "generate_frame_t": 9, "generate_frame_to_window_group_t": 9, "generate_isotope_distribut": 7, "generate_isotopic_spectrum": 8, "generate_isotopic_spectrum_annot": 8, "generate_noise_peak": 9, "generate_prosit_intensity_prediction_dataset": [1, 3], "generate_scan_t": 9, "generate_tf_ds_infer": [1, 6], "generate_tf_ds_train": [1, 6], "generate_training_data": [12, 13], "get": [1, 2, 3, 4, 8, 9, 12, 13, 14], "get_aa_num_proforma_sequ": 14, "get_acquisition_builder_resource_path": 9, "get_arrays_at_index": 12, "get_collision_energi": [9, 12], "get_collision_energy_calibration_factor": [1, 3], "get_compressible_data": 9, "get_config": [1, 2, 4, 6], "get_dilution_factor": 9, "get_fasta_file_path": 9, "get_frame_meta_data": 9, "get_frame_to_window_group": 9, "get_frames_numba": 9, "get_inverse_mobility_along_scan_margin": 12, "get_ion_transmission_matrix": 9, "get_mobility_mean_and_vari": 12, "get_model_path": 1, "get_ms_ms_window_layout_resource_path": 9, "get_native_dataset_path": 9, "get_pasef_frag": 12, "get_peak_cnt": 9, "get_peak_integr": 8, "get_prosit_intensity_flat_label": [1, 3], "get_py_ptr": [7, 8, 9, 12], "get_realdata": 9, "get_realdata_loop": 9, "get_rt_prediction_set": [1, 6], "get_rt_train_set": [1, 6], "get_scans_numba": 9, "get_searchable_spec": [12, 13], "get_sqrt_slopes_and_intercept": [1, 2], "get_tabl": [9, 12], "get_tensor_repr": 12, "get_tims_fram": 12, "get_tims_plan": 12, "get_tims_slic": 12, "get_transmission_set": 12, "get_transmitted_ion": 9, "get_window_group_set": 9, "get_z_score_for_percentil": 9, "give": [0, 3], "given": [1, 3, 8, 9, 12], "gradient": [9, 11], "gradient_length": [6, 9, 11, 13], "graph": [2, 4, 6], "group": 12, "group_modif": 8, "gru_predictor": [2, 4, 6], "gruccspredictor": [1, 2], "gruchargestatepredictor": [1, 4], "gruretentiontimepredictor": [1, 6], "guarante": [2, 4, 6], "guid": [2, 4, 6], "ha": 2, "half": 8, "half_charge_on": [8, 9], "handl": [2, 4, 6, 8, 17], "hash": 17, "have": [2, 9], "helper": 9, "helper_handl": 9, "here": [2, 4, 6], "highest": 13, "how": [8, 11], "http": [2, 3, 4, 6], "hyper": 3, "hyperscor": 13, "i": [1, 2, 3, 4, 6, 9, 11, 12, 14, 16], "id": [8, 9, 11, 12, 14], "ignor": 12, "ignore_first_n": 12, "im": 9, "im_low": [11, 12], "im_upp": [11, 12], "im_valu": [9, 12], "implement": [2, 4, 6, 9], "ims_arrai": 9, "imspy_dda": 12, "imspy_rescore_sag": 12, "in_memori": [12, 13], "includ": [2, 4], "include_precursor_fram": 9, "index": [1, 3, 8, 12, 14, 16], "index_max": 12, "indexed_values_to_compressed_byt": 12, "indexedmzspectrum": [8, 12], "indic": [2, 3, 4, 6, 8, 9, 12, 14], "infer": [2, 4, 6], "info": [2, 8, 12], "inform": 2, "init": [2, 4, 6], "init_scop": 2, "inmemorycheckpoint": 1, "input": [2, 3, 4, 6, 9, 13], "input_shap": [2, 4, 6], "input_spec": 2, "input_str": 13, "instanc": [2, 4, 6, 9], "instanti": [2, 4, 6], "instead": 3, "int": [1, 3, 4, 7, 8, 9, 11, 12, 13, 14], "int32": [8, 12], "integ": [1, 2, 3, 4, 6], "integr": [2, 8], "integrate_method": 8, "intens": [1, 8, 9, 11, 12], "intensities_flat": 9, "intensity_contribut": 9, "intensity_flat": 9, "intensity_max": [8, 9, 11, 12], "intensity_max_frag": 11, "intensity_max_ms1": 12, "intensity_max_ms2": 12, "intensity_max_precursor": 11, "intensity_mean": 11, "intensity_min": [8, 9, 11, 12], "intensity_min_ms1": 12, "intensity_min_ms2": 12, "intensity_valu": [11, 12], "intercept": 2, "interfac": [3, 4, 6], "interleav": 9, "introduc": 0, "inv_mob": 9, "inv_mob_max_ms1": 12, "inv_mob_max_ms2": 12, "inv_mob_min_ms1": 12, "inv_mob_min_ms2": 12, "inv_mobility_max": 9, "inv_mobility_min": 9, "inv_mobility_to_scan": 9, "inv_mobl": 9, "inv_sqrt_2pi": 14, "invalid": [2, 4, 6], "invers": [2, 8, 9, 12], "inverse_mobility_to_scan": 12, "invoc": 2, "invok": 2, "ion": [2, 3, 7, 8, 9, 11], "ionintensitypredictor": [1, 3], "ioniz": 1, "irt": 9, "irt_to_rts_numba": 9, "is_i": 9, "is_precursor": 12, "is_transmit": 12, "is_unimod_end": 14, "is_unimod_start": 14, "isol": [9, 11, 13], "isolation_mz": 12, "isolation_width": 12, "isolation_window_low": 13, "isolation_window_upp": 13, "isotop": [7, 8, 12, 17], "isotope_distribut": 8, "isotope_peak": 9, "isotope_peaks_first_onli": 9, "isotopes_transmit": 12, "its": [0, 2, 4, 6, 9], "j": 2, "job": [9, 10], "job_nam": 11, "json": [8, 14], "json_str": 9, "json_string_to_python_list": 9, "just": [2, 4, 6], "k": [7, 12, 13], "k0": 7, "keep_end": 13, "kei": [1, 3], "kera": [2, 4, 6, 14], "keyword": [2, 4, 6], "kind": 8, "know": [2, 4, 6], "kr": [9, 11], "kwarg": [2, 4, 6], "l": 13, "label": 3, "lambda": 11, "lambda_mean": 11, "lambda_vari": 11, "laplacian": 14, "last": [1, 12], "last_frame_id": 12, "later": [2, 4, 6, 14], "layer": [2, 4, 6], "layout": 11, "lda": 13, "len_trial": 1, "length": [1, 3, 8, 9, 11, 12], "like": [2, 4, 6], "limit": 13, "linear_map": [12, 13], "linearli": 13, "list": [2, 3, 4, 6, 8, 9, 11, 12, 13, 14], "list_column": 9, "list_tabl": 9, "live": 2, "load": [1, 9, 11, 13, 14], "load_config": [12, 13], "load_deep_ccs_predictor": [1, 2], "load_deep_charge_state_predictor": [1, 4], "load_deep_retention_time_predictor": [1, 6], "load_prosit_2023_timstof_predictor": [1, 3], "load_tokenizer_from_resourc": 1, "log": 1, "logarithm": 8, "logic": 2, "long": 12, "look": [2, 4, 6], "loss": 1, "low": 11, "lower": [3, 9, 11, 13], "lst": 9, "m": [2, 7, 8, 9, 11, 12], "mai": [1, 2], "main": [0, 12, 13], "make": [2, 4, 6], "mani": 11, "manual": 2, "map": 13, "map_to_domain": [12, 13], "mapped_data": 13, "margin": 12, "mask": [2, 4, 6], "masking_and_pad": [2, 4, 6], "mass": [7, 8, 14], "mass_ga": 7, "mass_toler": 8, "match": [2, 3, 6], "max_charg": 4, "max_intens": 12, "max_isotop": 7, "max_len": [9, 11], "max_length": [3, 9], "max_result": 8, "max_val": 9, "maximum": [3, 7, 8, 9, 11, 12, 13], "mean": [8, 9, 11, 12], "mean_scew": 11, "mean_std_im": 11, "mean_std_rt": 11, "meant": [2, 4, 6], "memori": [11, 13], "merge_dicts_with_merge_dict": [12, 13], "meta": [9, 12], "metadata": [2, 11], "method": [1, 2, 4, 6, 9, 13], "metric": 1, "midia": 11, "min_charge_contrib": [4, 11], "min_intens": [8, 9, 12], "min_len": [9, 11], "min_num_peak": [8, 12], "min_prob": 12, "min_proba": 12, "min_rt_perc": 11, "min_val": 9, "minimum": [4, 8, 9, 11, 12], "miss": 11, "missed_cleavag": [9, 11], "mix": 2, "mixtur": [11, 17], "mixture_contribut": [9, 11], "mobil": [2, 3, 8, 9, 11, 12, 17], "mobility_max": [9, 12], "mobility_min": [9, 12], "mode": [1, 2, 4, 6, 12], "model": [1, 2, 3, 4, 6, 9], "model_nam": [1, 3], "modif": [9, 11, 14], "modifi": [2, 4, 6, 9, 14], "modify_tof": 9, "modul": 0, "mono": 8, "mono_isotopic_mass": 8, "monoisotopic_mass": 7, "more": [2, 4, 6], "ms1": 12, "ms2": 12, "ms_level": 13, "ms_type": [8, 9, 12], "ms_type_as_str": 12, "ms_type_numer": 9, "mu_function_normal_default": 9, "mu_function_poisson_default": 9, "multipl": [12, 13], "must": [2, 8, 11], "mymodel": [2, 4, 6], "mz": [2, 7, 8, 9, 12, 13], "mz_highest": 13, "mz_lower": [11, 12], "mz_max": [8, 9, 12], "mz_max_ms1": 12, "mz_max_ms2": 12, "mz_mean": 12, "mz_min": [8, 9, 12], "mz_min_ms1": 12, "mz_min_ms2": 12, "mz_mono": 12, "mz_noise_frag": [9, 11], "mz_noise_precursor": [9, 11], "mz_noise_uniform": [9, 11], "mz_spectrum": 8, "mz_spectrum_annot": 9, "mz_std": 12, "mz_to_tof": [9, 12], "mz_upper": [11, 12], "mz_valu": 12, "mzspectrum": [7, 8, 9, 12], "mzspectrumannot": [8, 9], "mzspectrumvector": 8, "n": [9, 11, 13], "n_ion": 8, "n_step": 11, "n_thread": 4, "name": [1, 2, 4, 6, 9, 11, 12, 13], "nativ": 9, "ndarrai": [2, 3, 4, 6, 8, 9, 11, 12, 13], "need": 2, "neg": 8, "nest": 2, "network": [2, 4, 6], "never": [2, 4, 6], "new": [2, 4, 6, 8, 9], "new_max": [9, 13], "new_min": [9, 13], "nois": [8, 11, 12, 17], "noise_level": 9, "noise_ppm": 8, "non": 9, "none": [1, 2, 3, 4, 6, 8, 9, 11, 12, 14], "nor": [2, 4, 6], "normal": [8, 9, 11, 14], "normal_pdf": 14, "normaldistribut": 14, "note": [2, 4, 6], "notimplementederror": [2, 4, 6], "np": [8, 9, 12], "np_zip": 9, "num_chunk": 12, "num_dalton": 1, "num_decim": 9, "num_el": 9, "num_fragment_fram": 11, "num_fram": 12, "num_point": 12, "num_precursor_fram": 11, "num_scan": [9, 12], "num_split": 13, "num_thead": 12, "num_thread": [3, 9, 11, 12, 13], "number": [1, 3, 8, 9, 11, 12, 13, 14], "numer": [12, 13], "numpi": [2, 3, 9, 13], "obj": [8, 9, 12], "object": [1, 2, 3, 4, 6, 9, 11, 12, 13, 14], "observ": [3, 13], "occupi": 9, "occurr": 11, "offset_byt": 9, "old_max": 13, "old_min": 13, "on_epoch_end": 1, "on_train_begin": 1, "on_train_end": 1, "onc": 11, "one": [2, 4, 6, 8, 11], "one_over_k0": 7, "one_over_k0_to_cc": 7, "onli": [1, 2, 4, 6], "only_frame_on": 9, "op": [2, 4, 6], "openm": 3, "option": [2, 8, 9, 12, 13], "order": [3, 13], "org": [2, 3, 4, 6], "origin": 9, "other": [2, 9], "otherwis": 9, "output": [1, 2, 4, 6], "over": 7, "overlap": [8, 12], "overrid": [1, 2, 4, 6], "overridden": [2, 4, 6], "overview": 0, "p": [9, 11], "p_charg": 11, "packag": [16, 17], "page": [0, 16], "panda": [4, 12], "paper": 3, "param": [2, 3, 6, 9, 12, 13, 14], "paramet": [1, 2, 3, 4, 6, 7, 8, 9, 11, 12, 13, 14], "pasef": 12, "pass": [1, 2], "path": [1, 9, 11, 13, 14], "pattern": 13, "patternreplac": [12, 13], "pd": [8, 11, 12, 13], "peak": [8, 12, 13], "peak_annot": 9, "peak_cnt": 9, "peak_info": 8, "peakannot": 9, "peptid": [2, 3, 4, 6, 9, 11, 17], "peptide_id": [8, 9], "peptide_ids_first_onli": 9, "peptidechargestatedistribut": [1, 4], "peptidechromatographyapex": [1, 6], "peptidedigest": [9, 11], "peptideion": 8, "peptideionmobilityapex": [1, 2], "peptideproduct": 8, "peptideproductionseri": 8, "peptideproductionseriescollect": [3, 8], "peptides_in": 3, "peptidesequ": 8, "peptidespectrummatch": [3, 13], "per": 2, "percent": 11, "percentag": 9, "perform": [1, 11], "pim": [8, 12], "place": 2, "plane": 12, "plot_summari": [12, 13], "png": 13, "po": 9, "point": 9, "pointcloud": 17, "pointer": 12, "poisson": 9, "posit": [2, 4, 6, 13], "positive_example_q_max": 13, "post": 3, "post_process_predicted_fragment_spectra": [1, 3], "potenti": 9, "ppm": [8, 9, 11], "pre": 14, "precis": 2, "precursor": [3, 9, 11, 12, 13, 14], "precursor_charg": 3, "precursor_charge_in": 3, "precursor_everi": 9, "precursor_id": 12, "precursor_noise_ppm": [9, 11], "precursor_sample_fract": 11, "predict": [2, 3, 4, 6, 8, 13], "predict_intens": [1, 3], "predict_intensities_prosit": [1, 3], "predict_inverse_ion_mobl": [1, 2], "predict_retention_tim": [1, 6], "predictor": 1, "prefix": 1, "pretrain": [1, 3, 4, 9], "previou": 2, "print": [2, 3, 6, 13], "probabl": [4, 9, 11, 12], "process": 3, "processedspectrum": 13, "product": 8, "product_ion": 8, "proforma": 14, "progress": [3, 13], "project": 1, "proper": [2, 4, 6], "properli": [2, 4, 6], "properti": [7, 8, 9, 12, 14], "proport": 9, "propos": 3, "prosit": [3, 8], "prosit2023timstofwrapp": [1, 3], "protein": 11, "proteom": 17, "provid": [0, 2, 4, 6, 9], "psm": [2, 3, 6, 13], "psm_collect": [2, 3, 6], "psm_df": 13, "ptr": 12, "py_ptr": [7, 9], "pycontributionsourc": 9, "pyindexedmzspectrum": 8, "pymzspectrum": 8, "pymzspectrumannot": 9, "pymzspectrumvector": 8, "pypeakannot": 9, "pysignalattribut": 9, "pysourcetyp": 9, "python": [2, 4, 6, 9], "python_list_to_json_str": 9, "pytimsfram": 12, "pytimsframeannot": 9, "pytimsframevector": 12, "pytimsplan": 12, "pytimsslic": 12, "pytimsspectrum": 8, "pytimstofsyntheticsframebuilderdia": 9, "pytimstofsyntheticsprecursorframebuild": 9, "q": 13, "q_max": 13, "quadrupol": [9, 11, 17], "r": 13, "rais": [2, 4, 6], "random": [1, 13], "random_subsample_fram": 12, "randomli": [12, 13], "rang": [8, 9, 12], "raw": [9, 13], "raw_fragment_data": 13, "re": [13, 14], "re_compil": [2, 6], "re_index": 12, "re_index_indic": 14, "re_score_psm": [12, 13], "read": [11, 12], "read_acquisition_config": 9, "read_compressed_data_ful": 12, "real": [2, 4, 6, 11], "real_data": 9, "reappli": [2, 4, 6], "reason": 2, "receiv": [2, 4, 6], "recommend": 2, "record": 3, "reduc": 7, "refer": [9, 11], "reference_d": 9, "reference_in_memori": 11, "reference_path": 11, "refin": [2, 6], "refine_model": [2, 6], "reinstanti": [2, 4, 6], "rel": [4, 9], "reli": [2, 4, 6], "remov": 3, "remove_substr": [12, 13], "remove_unimod_annot": [1, 3], "replac": [13, 14], "repres": [3, 14], "represent": 8, "requir": [2, 4, 6], "reserv": 2, "resolut": [1, 8, 9, 12], "resourc": [1, 2], "restrict": [9, 11], "result": [1, 8], "retent": [6, 8, 9, 11, 12], "retention_tim": [8, 9, 12], "return": [1, 2, 3, 4, 6, 7, 8, 9, 11, 12, 13, 14], "return_cc": 2, "revers": [2, 4, 6], "right": [8, 9], "right_drag": [8, 9], "root": 2, "round": 11, "round_collision_energi": [9, 11], "row": 9, "row_to_frag": [12, 13], "rt": [1, 9], "rt_abu": 9, "rt_cycle_length": [9, 11], "rt_target": 6, "rt_valu": 9, "rtype": 3, "rule": 2, "run": [1, 2, 4, 6], "rustwrapperobject": [7, 8, 9, 12], "sage": [3, 13], "sage_output_util": 12, "same": [2, 4, 6], "sampl": [3, 8, 11, 12], "sample_end": 9, "sample_fragment_sign": 12, "sample_occurr": 11, "sample_parameters_reject": [10, 11], "sample_precursor_sign": 12, "sample_start": 9, "sanit": 13, "sanitize_charg": [12, 13], "sanitize_mz": [12, 13], "save": [11, 14], "save_path": 13, "savedmodel": 2, "scalar": [2, 4, 6], "scale": 9, "scan": [8, 9, 11, 12], "scan_end": 12, "scan_id": [9, 12], "scan_max": [9, 12], "scan_max_ms1": 12, "scan_max_ms2": 12, "scan_min": [9, 12], "scan_min_ms1": 12, "scan_min_ms2": 12, "scan_mod": 9, "scan_start": 12, "scan_to_inv_mobl": 9, "scan_to_inverse_mobl": 12, "scan_valu": 12, "scans_arrai": 9, "scew": 11, "score": [3, 9, 11, 13], "sdk": [11, 13], "search": [3, 16], "searchabl": 13, "second": [9, 11], "section": [2, 7], "seed": 1, "selected_frag": 12, "self": [2, 4, 6], "separ": 6, "seq": 3, "seq_to_index": [1, 3], "sequenc": [2, 3, 4, 6, 8, 9, 13, 17], "sequence_set": 13, "sequence_to_all_ion": 9, "sequence_to_numpi": 9, "sequence_token": 14, "sequences_to_all_ion": 9, "seri": [8, 9], "serializ": [2, 4, 6], "set": [1, 2, 6, 9, 12, 13], "set_percentage_to_zero": 9, "set_weight": [2, 4, 6], "sever": 9, "shape": [2, 4, 6], "shift": [8, 9], "shot": 9, "should": [1, 2, 4, 6, 8, 12, 13], "shuffle_decoi": 13, "sigma": [8, 9, 11], "sigma_function_normal_default": 9, "sigma_mean": 11, "sigma_vari": 11, "signal": [9, 12], "signal_attribut": 9, "signalattribut": 9, "signatur": [2, 4, 6], "similar": 3, "simul": [3, 4, 16, 17], "simulate_charge_st": [9, 10], "simulate_charge_state_distribution_panda": [1, 4], "simulate_fragment_intens": [9, 10], "simulate_frame_distribut": [9, 10], "simulate_frame_distributions_emg": [9, 10], "simulate_ion": [1, 4], "simulate_ion_intens": [1, 3], "simulate_ion_intensities_panda": [1, 3], "simulate_ion_intensities_pandas_batch": [1, 3], "simulate_ion_mobilities_panda": [1, 2], "simulate_ion_mobl": [1, 2, 9, 10], "simulate_occurr": [9, 10], "simulate_peptide_occurr": [10, 11], "simulate_precursor_spectra": [9, 10], "simulate_retention_tim": [9, 10], "simulate_scan_distribut": [9, 10], "simulate_separation_tim": [1, 6], "simulate_separation_times_panda": [1, 6], "singl": [2, 4, 6, 9], "site": 11, "size": [4, 8, 11, 13], "slice": [11, 17], "slope": 2, "so": 12, "source_typ": 9, "sourcetyp": 9, "space": 9, "spec": 8, "spec_id": 13, "spec_processor": 13, "spec_ptr": 8, "special": 2, "specif": [2, 11], "specifi": 9, "spectra": [8, 12], "spectra_list": 8, "spectrum": [2, 3, 6, 7, 9, 12, 13, 17], "spectrumprocessor": 13, "split": 13, "split_dataframe_randomli": [12, 13], "split_fasta": [12, 13], "split_psm": [12, 13], "sql": 9, "squar": 2, "squarerootprojectionlay": [1, 2], "standalon": [2, 4, 6], "standard": [9, 11], "start": 14, "state": [2, 4, 7, 9, 11], "static": [9, 11, 13], "static_mod": [9, 11], "std": [8, 9], "std_dev": 9, "std_im": 9, "std_mean": 11, "std_rt": [9, 11], "step": [2, 11], "step_siz": 11, "still": [9, 11], "store": 3, "str": [1, 3, 7, 8, 9, 11, 12, 13, 14], "string": [3, 8, 9, 13, 14], "subclass": [1, 2, 4, 6], "subject": 2, "submodul": [0, 17], "subpackag": 17, "subsampl": 12, "substitut": [2, 4, 6], "sum": 8, "sum_formula": 17, "sumformula": 7, "super": [2, 4, 6], "support": [2, 4, 6], "synchro": 11, "synthet": [9, 11], "synthetic_data": 9, "syntheticexperimentdatahandl": 9, "syntheticexperimentdatahandledia": 9, "t_diff": 7, "tabl": [9, 12], "table_nam": [9, 12], "take": [2, 12, 13], "take_prob": 12, "take_top_n": 13, "taken": 9, "target": [7, 11, 13], "target_p": 11, "target_scor": 9, "target_spec": 7, "target_vector_length": 1, "tdf": [13, 17], "tdfwriter": 9, "temp": 7, "temperatur": 7, "tensor": [1, 2, 3, 4, 6], "tensorflow": [2, 3, 4, 6], "tensorshap": [2, 4, 6], "test": 14, "tf": [2, 3, 4, 6], "tflite": 2, "tfmot": 2, "than": [2, 4, 6], "thei": [2, 4, 6], "them": 11, "thi": [0, 1, 2, 3, 4, 6, 9, 16], "thread": [3, 9, 11, 12, 13], "threshold": 8, "throw": [2, 4, 6], "thu": [2, 4, 6], "tim": 3, "time": [2, 4, 6, 8, 9, 11, 12, 13], "times_arrai": 9, "tims_frame_annot": 9, "tims_slic": 12, "timsdataset": 12, "timsdatasetdda": 12, "timsdatasetdia": 12, "timsfram": [9, 11, 12, 13], "timsframeannot": [9, 12], "timsframevector": 12, "timshash": 1, "timsim": 9, "timsplan": 12, "timsslic": 12, "timsslicevector": 12, "timsspectrum": [8, 12], "timstof": [16, 17], "timstofacquisitionbuild": 9, "timstofacquisitionbuilderdda": 9, "timstofacquisitionbuilderdia": [9, 11], "timstofcollisionenergi": 12, "timstofcollisionenergydia": 12, "timstofquadrupoledia": 12, "timstofsyntheticframebuilderdia": 9, "timstofsyntheticprecursorframebuild": 9, "timstofsyntheticsdatahandlerust": 9, "to_centroid": 8, "to_dense_window": 12, "to_indexed_mz_spectrum": 12, "to_json": 8, "to_noise_annotated_tims_fram": 12, "to_prosit_tensor": [1, 3], "to_resolut": [8, 12], "to_sage_represent": 8, "to_tims_spectra": 12, "to_token": 8, "to_window": [8, 12], "todo": 8, "tof": [3, 9, 12], "tof_max_valu": 12, "tof_mean": 12, "tof_std": 12, "tof_to_mz": [9, 12], "tof_valu": 12, "token": [1, 2, 4, 6, 14], "tokenize_proforma_sequ": 14, "tokenize_unimod_sequ": 14, "tokenizer_from_json": 14, "tokenizer_nam": 1, "tokenizer_to_json": 14, "tokensequ": 14, "toler": 8, "tool": 0, "top": 13, "total": [12, 13], "total_scan": [9, 12], "train": [1, 2, 4, 6, 13], "trainabl": 2, "transform_psm_to_pin": [12, 13], "translat": [3, 7, 9], "transmiss": [7, 12], "transmit": 7, "transmit_fram": 12, "transmit_ion": 12, "transmit_spectrum": 12, "transmitted_isotop": 7, "travers": [1, 9], "trial": 1, "true": [2, 3, 4, 6, 8, 9, 11, 12, 13], "tune": 2, "tupl": [2, 3, 4, 6, 8, 9, 12, 13], "two": 9, "type": [1, 2, 3, 4, 6, 7, 8, 9, 11, 12, 13, 14], "typevar": [2, 3, 4, 6, 9, 11, 12], "typic": [2, 4, 6], "uint8": 12, "undergo": 9, "underli": [2, 4, 6], "unexpect": [2, 4, 6], "uniform": [8, 11], "uniformli": 9, "unimod": [3, 9, 11, 14, 17], "unimod_sequ": 14, "union": [9, 14], "unpack": 3, "unpack_dict": [1, 3], "unrel": [2, 4, 6], "unstabl": 12, "updat": [2, 4, 6], "upper": [3, 11, 13], "us": [1, 2, 3, 4, 6, 8, 9, 11, 12, 13, 14], "use_bruker_sdk": [11, 12, 13], "use_reference_ds_layout": [9, 11], "use_reference_layout": 9, "user": [2, 4, 6], "util": [10, 12, 16, 17], "val_": 1, "val_loss": 1, "valid": 1, "validation_target": 1, "valu": [1, 2, 3, 7, 8, 9, 11, 12, 13], "valueerror": [2, 4, 6], "variab": 13, "variabl": [2, 11], "variable_mod": [9, 11], "varianc": [11, 12], "variance_scew": 11, "variance_std_im": 11, "variance_std_rt": 11, "variant": 3, "variou": 2, "vector": [8, 9, 12], "verbos": [2, 3, 4, 6, 9, 11, 13], "version": 12, "vi": [16, 17], "via": [2, 12], "visual": 14, "w": 1, "wa": 3, "wai": [2, 4, 6], "want": [2, 4, 6], "weight": [1, 2, 4, 6], "were": [2, 4, 6], "what": [2, 4, 6], "when": [2, 4, 6], "where": [2, 4, 6, 8, 9, 11], "whether": [2, 3, 4, 6, 8, 9, 12, 13, 14], "which": [2, 4, 6], "who": [2, 4, 6], "window": [8, 9, 12, 13], "window_group": 12, "window_group_fil": 9, "window_length": [8, 12], "window_s": 9, "window_theoretical_mz_max": 9, "window_theoretical_mz_min": 9, "with_annot": 9, "within": [2, 4, 6], "without": [2, 3, 4, 6, 9], "workflow": [2, 4, 6], "wrap": 2, "wrapper": 3, "write": [9, 11, 13], "write_dia_ms_ms_info": 9, "write_dia_ms_ms_window": 9, "write_fram": 9, "write_frame_meta_data": 9, "write_psms_binari": [12, 13], "www": [2, 4, 6], "x": [0, 8, 9, 14], "x_train": 13, "xx": 9, "y": [0, 8, 9], "y_train": 13, "yield": 3, "yy": 9, "z": [0, 2, 7, 8, 9, 11, 12], "z_score": [9, 11], "zenodo": 3, "zero": [2, 9], "zero_index": 12, "zstd": [9, 12], "\u03bb": 14, "\u03bc": 14, "\u03c3": 14}, "titles": ["imspy Package", "imspy.algorithm package", "imspy.algorithm.ccs package", "imspy.algorithm.intensity package", "imspy.algorithm.ionization package", "imspy.algorithm.pretrained package", "imspy.algorithm.rt package", "imspy.chemistry package", "imspy.data package", "imspy.simulation package", "imspy.simulation.timsim package", "imspy.simulation.timsim.jobs package", "imspy.timstof package", "imspy.timstof.dbsearch package", "imspy.utility package", "imspy.vis package", "Welcome to imspy\u2019s documentation!", "imspy Modules"], "titleterms": {"": 16, "acquisit": 9, "add_noise_from_real_data": 11, "algorithm": [1, 2, 3, 4, 5, 6], "amino_acid": 7, "annot": 9, "api": 0, "assemble_fram": 11, "build_acquisit": 11, "cc": 2, "chemistri": 7, "collis": 12, "constant": 7, "content": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], "data": [8, 12], "dbsearch": 13, "dda": 12, "dia": 12, "digest_fasta": 11, "document": [0, 16], "element": 7, "experi": 9, "featur": 9, "frame": 12, "handl": 9, "hash": 1, "imspi": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17], "imspy_dda": 13, "imspy_rescore_sag": 13, "indic": 16, "intens": 3, "ioniz": 4, "isotop": 9, "job": 11, "main": 16, "mixtur": 1, "mobil": 7, "modul": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17], "nois": 9, "packag": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], "peptid": 8, "pointcloud": 15, "predictor": [2, 3, 4, 6], "pretrain": 5, "proteom": 9, "quadrupol": 12, "rt": 6, "sage_output_util": 13, "sequenc": 14, "simul": [9, 10, 11], "simulate_charge_st": 11, "simulate_fragment_intens": 11, "simulate_frame_distribut": 11, "simulate_frame_distributions_emg": 11, "simulate_ion_mobl": 11, "simulate_occurr": 11, "simulate_precursor_spectra": 11, "simulate_retention_tim": 11, "simulate_scan_distribut": 11, "slice": 12, "spectrum": 8, "submodul": [1, 2, 3, 4, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], "subpackag": [1, 9, 10, 12], "sum_formula": 7, "tabl": 16, "tdf": 9, "timsim": [10, 11], "timstof": [12, 13], "unimod": 7, "util": [1, 3, 7, 9, 11, 13, 14], "vi": 15, "welcom": 16}}) \ No newline at end of file