From f4746ad0297be9817c16da8e9f50e32603324e22 Mon Sep 17 00:00:00 2001 From: WillForan Date: Thu, 7 Nov 2024 18:56:30 +0000 Subject: [PATCH] deploy: b20e42588e79942f93cb258e8a633bfe8ae382b3 --- .buildinfo | 4 + .doctrees/_autosummary/acq2sqlite.doctree | Bin 0 -> 52526 bytes .doctrees/_autosummary/change_header.doctree | Bin 0 -> 37222 bytes .doctrees/_autosummary/dcmmeta2tsv.doctree | Bin 0 -> 51155 bytes .doctrees/environment.pickle | Bin 0 -> 34776 bytes .doctrees/index.doctree | Bin 0 -> 24985 bytes .nojekyll | 0 _autosummary/acq2sqlite.html | 318 +++++++ _autosummary/change_header.html | 254 ++++++ _autosummary/dcmmeta2tsv.html | 320 +++++++ _images/nonconforming_example.png | Bin 0 -> 143360 bytes _sources/_autosummary/acq2sqlite.rst.txt | 19 + _sources/_autosummary/change_header.rst.txt | 16 + _sources/_autosummary/dcmmeta2tsv.rst.txt | 29 + _sources/index.rst.txt | 52 ++ _static/alabaster.css | 663 ++++++++++++++ _static/basic.css | 914 +++++++++++++++++++ _static/custom.css | 1 + _static/doctools.js | 149 +++ _static/documentation_options.js | 13 + _static/file.png | Bin 0 -> 286 bytes _static/github-banner.svg | 5 + _static/language_data.js | 192 ++++ _static/minus.png | Bin 0 -> 90 bytes _static/plus.png | Bin 0 -> 90 bytes _static/pygments.css | 84 ++ _static/searchtools.js | 632 +++++++++++++ _static/sphinx_highlight.js | 154 ++++ genindex.html | 271 ++++++ index.html | 235 +++++ objects.inv | Bin 0 -> 607 bytes py-modindex.html | 140 +++ search.html | 122 +++ searchindex.js | 1 + taglist.csv | 22 + 35 files changed, 4610 insertions(+) create mode 100644 .buildinfo create mode 100644 .doctrees/_autosummary/acq2sqlite.doctree create mode 100644 .doctrees/_autosummary/change_header.doctree create mode 100644 .doctrees/_autosummary/dcmmeta2tsv.doctree create mode 100644 .doctrees/environment.pickle create mode 100644 .doctrees/index.doctree create mode 100644 .nojekyll create mode 100644 _autosummary/acq2sqlite.html create mode 100644 _autosummary/change_header.html create mode 100644 _autosummary/dcmmeta2tsv.html create mode 100644 _images/nonconforming_example.png create mode 100644 _sources/_autosummary/acq2sqlite.rst.txt create mode 100644 _sources/_autosummary/change_header.rst.txt create mode 100644 _sources/_autosummary/dcmmeta2tsv.rst.txt create mode 100644 _sources/index.rst.txt create mode 100644 _static/alabaster.css create mode 100644 _static/basic.css create mode 100644 _static/custom.css create mode 100644 _static/doctools.js create mode 100644 _static/documentation_options.js create mode 100644 _static/file.png create mode 100644 _static/github-banner.svg create mode 100644 _static/language_data.js create mode 100644 _static/minus.png create mode 100644 _static/plus.png create mode 100644 _static/pygments.css create mode 100644 _static/searchtools.js create mode 100644 _static/sphinx_highlight.js create mode 100644 genindex.html create mode 100644 index.html create mode 100644 objects.inv create mode 100644 py-modindex.html create mode 100644 search.html create mode 100644 searchindex.js create mode 100644 taglist.csv diff --git a/.buildinfo b/.buildinfo new file mode 100644 index 00000000..b637720f --- /dev/null +++ b/.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: a0fcf460302088f3b558fee9146ad410 +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/.doctrees/_autosummary/acq2sqlite.doctree b/.doctrees/_autosummary/acq2sqlite.doctree new file mode 100644 index 0000000000000000000000000000000000000000..c3bd41b743443da6fb14f5fdd32fea4d2d640597 GIT binary patch literal 52526 zcmeHweUv0ub>Du>%+AbyucSq=TB#%g7`4Tam*o3Y@Coo z?ELQgsCuuuKDv8$1b;+F+tdB(z5DLF@80|Fz3;wPkBqXaj20ZKv7rt#q^7Ncr!jwS?#C!(>Y)3$mix{D?tgrV;&c0-JeMzYyy1cddLdeaO7 z6yp1M+idY~lZ|dC`LSr$&-&I9)#*lCLUWlO_3WMYK6{&ejlJ34AH8hO_FC4Q-)*-o zf9`_kpPg&@e*K``@DH9dweOtHb2YOYdO^3uyzzNx!tZ-~a7cEegx zsKg0qUxy*s*Mmkk;@?g9H-mq(G#pUGci12*(OAcH{9d%DvkjQr5Ekyg$I=~ zd*VdcGrRV4?Ssn5?i+k$39M>obskd^0GIZ%;Vr3M+t*@3Fu7BhKXchPJGL^u=;mWy z`@H3c#==5lu^O&~3k!zR4n4y(IBysYGc*^?z^XDXsn~m?N!g|+cmwDkg#$oglJVs(OhLD4`n9^(tOXrQMWT#F z$5{Pn*F!)5@GTb~K73LB?GXusq`TQE#=Z z&^#Ol=OH16*=`tz4%HUBP@*+39=O^zjy-VHSaP5R4j66EZ<$S_;ncmBVOwUy@`D4c zRcKpn)M{GPS#^5aHqTqNj?=MfBprl{RH5T()W!5nMHAt&?{zy0`y|?V3x+o2v`(VQ z1*Z|(z2nm~lW)aLz8TE&IA1!X?$70OEG994f1(1QwPMk0tY#v*+4nAFJ{TuO*x$x} zkwhoDZ5~R>TXg3a)Oj@SP_&r(;K;&5#zU2dW`)+-5N+#N?FQ6aZ3SzCfJwNN^JilMgMtR{ zMbF4tsCqC4s7lLp+CBS=(H8s)S358aHdB|;R{XYBI!&kUguTbu;|r$W?p=c7U!CWx zkG`-+lX$?Er2HQ}I!CD$14kp9v-Y zVQN-Hf10ExAwj>3K7TJ}3}!tkEWGlQ(l~N;`N<)WEN1^poq~LhCW>MmeVTaXZ--}nqM1?y zBYu0@bd!5E8#pXaO+B$a6^}*;PI0C8b1NmkQZ$A|IOxG2!+gF8wcn8DujnepQZ$-gdzqVDW*YIw z(E69tt<_4=)Jm&4A9PG|uO~Y`tV#d8#a6jT(N_4H_9NV{k&C)skNx+>%!WD&L2!-hJ2oUCUpcza`72 zw_hVsjqW2eT~w|-2nX^EOk?IPwjCIV#sl}i%s2-~@R*Gy&o@FJu0FY}n$0~&MmrhS z+~u?{N%(>k|4jc~8Oi3AMzi}~E=p^$n-?6b1ZG}WAw54amtry>=7JR+Rz3*^H~uWjzTG61_>6lSeu z?h_fc)s@736)L!oP%R*?tYCsZ6b7uOG}K^$&4~ay8UdMTzf?{Y<~JhhrbHTN5&F!K zyUZ}Bh!bvz#t{1Mk7iX6i`_v_YJr33Z`k#<(DiPCMg@xS&J$kSN}>ciSu3;M_Chli z437>!c*l()0#EbC3`2kB$N}RH*$cvIumk3exQa1z7uJ* z%wef9ij9VJ;qWa1a(@bl&STNW3%xWaxc5<$eJ*w1UCie-jTzi~c%!3nchM`>$wZ)7 z`bIDs;x&9Gu)RUid%2}yk4IY-CXrOp$`blGF~V79R3+L9_BaT`jdc-irykinvEN!0 zMyJPenjY>Fl}Oa580u-f@RB=yp1uAJzhFM}_CQ9&M9dg4%Zfjf&Nv;{6uh=uP-jWDF!S5IwU6 z)SMa(xEAvReu9A*8gJwf6NRA*$e7n|W(0e&$wW~|$Rj+egpS;7cRvQ0spSWINe}Yf z!!u$sq1wKKdO<2y8f`!CSQqNpC_M{p%38}fNOXl8vK5Ce>^@wd$$OWRfq(%_+#eT0IYmO!|1HEGLvL~X+rEasy zw2pfbP^0Nu=+%h>!l36)Z-)Iq#jiuKnLS8q(hy%rnC_1`0aJAcm9UUStnlj|2(0X3 z%Z-SN5=Z?hGB&Tmm{kj0Ux8Kg3KU=g&2?QlLDM|~BPhdU^W@BF+X)O|bOqR)?RcKw zTs53lr)g2nfYrcGRpX%T)#nzipyQpjjQdW#oH^NY1J{5?g1k4#YFk(c>bBJ~t5D?& z3rxk)&hCAexf?}8KRZQeJKleZc4S}!WTq1o6*vb{aEd1kTf{E)Tx2SViFI!z$k!g< ztk1zn7PEUB3D-@>?mO|o=?9F8V(>@G(Gg;_@j2LQz<$PQZGi-_FUSr|Iu854*6*-)J=!K3yVGZk-@;w*R`qMZ)}g zs=sJZi|jW6IBk)+-_PPQVZOc(4T>z$bvMJ_Q-%OH!`uy255yEkSVGJ`BkX0U$&D~~ z3}4-GeCP^q3ME?RoV%4Ol0oHeqi1Pl>~5#$pQlH$Zy8Db`}&@{lOBHoAB3SWzT_N3 zo=)HiH@@86_?lV=6yxEW6c#2cV19w?dZc)f4MFBUC5yo#g-V2BV4mwbfkR=FgHHRr zi7-84_OW{qR4L=eVE#-%?T{6N{F`_s3yi?_x=m!>SoFvUpjVjzVj;l{**EnV`gC9e zIKuuW3=yG`jZeSbP&G30&?udb7Ej*`fNryCAa5`La;$UH5DjN#Vp(DsCmrRmjtq!ukfx{SO&bXz(M{R z6GTPw3}klF#<^h{_je&uPPl3u4T7$3!Voen-}n6K3zY0e0?Z_xWs|m76M0Yc0So^c zJT|O}_mYXUWa^4%zGC{k?be1b-2xWrC^Csv`_hReQS~1CY zg91E#3c8N%hMK`y>;w0xR#0DudEP>8=3H{e@(c*grFuv`Q~87=2J=(cJV@e~x!&l}b19R3$+&Q5DNm}`4&C{>7Qi*itf^j16VWj^ZMjkL`y!dMv? zS~Oipp0a~wA0gq3y=ddjJ@-)%Fo?E!zO(EgbXj8{pF0eWWI=Xm8sg<+yGD>gI=Z`P znMn*z8Gg_kRd~MGRBR9Gb`etjdG4zF7T^(WLHLrTuexugpKLco{oVFpg3?(G7&~oG ze%&F94?-y--S|?pO+1vpccX>~K?ZT9oo!E+$$A8d`U|Wu#Dwyw_dHB>W?hIVoJigo zZP%2?fMyV8tDmi539ig$27<72V|xumfv)L~5>?~IYYqfmDFZ<<$O<}TyPJAAXezEC z#aSsy1o0!pO!+qQFhQXY#h@Z{y@Eo@ptyq^Dc*3jvBAdbzBQ}x9T|mKqR=Lx#uwuu zWCmn@10ebWGGgEB^JrS+C+JSU*y;Jqz>VCmqHlFeC!x0cX~KFv;sxIa;GyCLe_1k~ zb&nT(uMC0gctJwUzIee00CA1+0-5HZr~w`_*g39+3={zsQG@7;esP~=yGaCsoi=WrDI1m+4H{rQ+gzt zvTeC!e>IvuDN_LAb7*Q&LZe%Up^AyyGkg%o z62TXte`eM=c+fbCK#t-=(qToGMI=K{d{Lrw8gYcMhNj5!RS4pKj(C=bZ!|spvZ2QJ zQa-+W@rQXGn~aL0)2UeHCp(TWi8Ry=(JqN0oLlS#IDvvAGMg}V$?g0{G7*a@;Dx@C zyTB1W!w}7{s;1a;V@x{~#KT71$fC%kdgjM%05*#<(J?f*n{}KaQVtHeOywj8hFG+T zhnV)coPe$g5HbiEZG2D;9p931{}PQP*K9}$sT{YMpcMV}{x*Y2WRL87(&w8;=`%v3 zqGeg7wR-`TvqE$^w0;Y!yAR{zG4~hgE78`y$Ud-G7g2T7fjEzhz9wV*7ij%-)Ae7E z(&tCeXuatAF(Tneblu2z-^i?!i6|9lzAuk5!dRVbR1U5&8Br$)U5y*xdE{|*68kjH z-l$w#COnXCuDfR`*+L|7pL?uiGRSK@N;Ke$K*=V$dw^G+Wl-IN_#@SUSlryhN?Ek! zl!e63cD!W8zmp;T13?^EU5NGS$J8iZuiU$oK85Cfk;E&y?zG>v=I%9{*vN2}=oo_7 z@E|LPvZ2H(Q(7;nh!Tq zqXDO5Y|-;XYGF#-Ltgm91e?1C#%2x5TJ&13R*sZUBAe{n%j-#*Bgzdm*@Y7C&X8Or zwrF+~C#5E2=tnvU*^MfE1)Siq3_b4S{t9e0_S}6ted}US?mOadPvF}n_gC5Hud&Z} zvd?$1&v&!W_s}N^!8*ie4v@$r*A4dp)Nr=FEJ$;GMvz8_kQ=Fqmewn{kw$@AVw65l4?$M<7%C4DL-_?% zABn6{ZVbg6WsGa2>m#G|c@d3@Yyp*Bho$SIqtey=io&jH5ak`C3{j93@fbCTLZzyn zDD-!jw{=AcsT9|m)aQWS);~aop{|bRYH0b&h)@<9|KrqXaE-4VXG`e; z@~+ugw`2+Wj{_sL26hv@mJ9M9vB@bU3Y+gQme-TsH4$&9`7Y!(>0L_`A)XfaV#N(b za)mUg@*7sTEEjm$q(ixvJu!)I%*$rq*5+jklVara<2)1MX51}SlWBlue)e@4ezw{^ z*URPxcDeWaY-#VRP%G>bQrg2jM_X)}`4QXH2GTs$3lkx_4%472ES-Uea)S58prXcl z1rqe3Wh6@M&^|>4VJ7z=VZ9#SeH(y>^6t-;5MkZDd%FyQ zZ0|lHW}kPz7ZBIz-N%Vrns9R8{w)Bn`1ZOMlAe7W9#8@3e!b)Y`1Mx<t2o+0S;sB&tQD^T@$=Ln)Mw;CR<=8TRbVN- zcqJwIs!Rl=qTbzyoC5WIDX6-(PI=wzkO$$x{MiXULIqd>iq{T62&kB64dG;$>s?nU3a`h%gyE8;Z&4UID5G*qmb zGsSV5f^fp-DIHLuq{%4F1~e*K=2bsr*eK07V5?pTY1aNIO-vTeEA697#@2pDo$dO} zCU!)+ZkeR+bN_-(S1}R)oaPRfYp|;B_wYwlDGXiG*QnD5dB6dbPm-{AoU8!H? z&tx>W4>i?-|9*x|HJOR&90_`&vEbflyN+bib-HdjA)m+ky=;Ue%*c`8(wrr{u^B1E zH~yWBqLCVLF?NE03zC3(P8$_#)Jw$y295`=rT`TqCGywKGo4~req`(qtOJe5TyGpE}P$AvYAgGC0IoZQdwX@q~m;nRV@!z#pySa z6=ix(!ixV2!&cd+7*!FZ`aNn?xOOJ#I2CE08Q6>Grw8enFlox?LY9~oVuviHz8Snh zGKxPOW)v){^qB#sTjWX6XfN}`3=u{A?l41>#?7~>(SQ@Q`4sN|XAF|k97qeE%*ujI z8tjeO_hcUaekf#rOtts9Kf<3ujesF_2yT;OZ^OB@N`ov{CO<4eh1=2l-2Yi#PsSu^ zDu&{oV!a|Vexz+Jy`|ztA|5Fn!R$sAPTPW5BgyGv(|R8)(MMj|SykFrSO$L0$vy+NRjDa8tyY!@@hMDh z{*o|Mg!4oU>ggh1UycuM0jHA`pbHze9vw_Q(}J7&GZ?N(K|(7h9^lX+P76(o)Ls(n zBO^ha5;F&G)E6L3=E7Ydtk)wzcnN@q3J|`oWIXF0Abd?30@(q=gqVE+!hZ~iYYY&^ zN4->`)W3!{|B@ zx(EXI8Q>jD(#{h%yyL|Gzzq_4`iQ_rE>VT%D9hz}DYf9aJWnP=S>J%u7ly%7+GL-j zM*CfXFGRmMmuH7mTSf(mQ*z%*3lk*@N!a&EK|;}|hQd|&ntzH$8NnhdR#%3SU=i?^ zOU-8bo*?x%DL{qOEQ3XV&5+8ks`{G428(_O*s6I*V%8rlipiq+nrW&O+G5Q4_-e^W z6t9rDW6V2hS;=`P$_UQfCUM7*KqyO7&t3WL;)@w5z@!XQ_N{Du`y+yb|Oh|k@I7JXxG z1N*i%w?SyqHKs7kay5(Cgwq(sbx@lB1Y8HL_rY9;c<)eYn{z;5t5QWOa;+>;=j zsw;!8D2DPGUK4{_Kc7JxSbtJPoFS`w3-V40%}o%6@DH?O%kPRuF|=dw1ez9Ul}yLr zR|am>=NKdeci%=>uZLss2>>3-G5A=?c-Gx9_-Gjd*^WU%%s$89A|PHa$3SIZ?ihRv z&{fAktankcP+isnLG-RrKfDK6bJcxJ2GPO5g`ux~7PO!mn7MAt~G|I5FsaVyg#g=wq`ux=?P`YYPr9enq z`znT3epS`F8rIf+7GSHkHgRsht<4Fe?Ox@k&)+i25C!E^L2s?YqV)Nrqx5-X2(r2d zQF(Bq)jfvlBat;fef}3l8RHu1>WvnJT*uOV{S8bj?kle{_@~3bLls=c!cF z6B+yK8FjYnN-nYE(sc{H3+BuIUr28e=@nm=^z(qe&0n&r<-Y6yJDmSAMWTGArueWQ zq(*};C3j&{fxmRcsI;vM2D=OtsX^H3oTYtFik0z8KUZnz zdfUFR5JMI3bAXXK6_+XDl+O+`M3&|D2XPCrT#_5LH@bBM^c6f3sNDETR;{S~{^qX} zN_qD;|K}LrEOR=3V`1_A&0htOB38|NW#ONr-Ej9e(~_2Zf3q}DHo?e}6e|%6CTYK4 zg1#bY#J(jU<<%a8O4<-nqix%Dr8JPlO;Mx4C2kr4MdKHZ_-#&=gx5s!6E>&ypyTxe zqqTcWh7>b(?~#nMi)a)TnB=W|f~71&k&DC5w9x^_U=g>q(rx;5x|w-V^p-aM z=3D*Fv+DHE(ly#f-@Ww**q#aZFH{hrZHCHq`~0?kvmH*$+wzmk_T^Rm{62n`j&=dB zxuRD$;!?J5V>P(}`o))N7z&G;DSk^NZvZWSmKx`2`BnQi`kpobSqAln&lOsk(& z(w%?4iPw`JIdTL?`;9vdvGqu=@kCnmt$6QRyNx$dRA%N|R?EZtre|hnr>QnEtbx}7 zwktEqOQB|P$s~kn-lzf8gN;QxMo_g@ta>-JD)m`*g?OFrpIoZaRg{(4YS2MHl^brq zVfM^)wOVDMZv-k@%Ntm2BkAV`j)T0g{Z8ZIvv`B($_(oOdz@{8!0ob&3?zQ4F%!{n zcKVj#pFVu^&7wJ879{TdoNd36tARueE1^hHbcwZj0na4f4b8o4L&Pt zr#lxb2*%qW&*^Apv_%Mr{<0)JSo=5{DuR{RJ6D#iZz6?D2Ib*24J^~I+jP4&cc{uXWo|^x!(7|M?>|Yy$laOY&P4gq z(tR?cA`Llb=VVv9p4>j^e~{?v&k=Lv-i$ZY9?GX;P?5b}X>0vMT$hcM{}K-+%ky)K z?&1C#nilzcx@?LJt3MgIQQt;NLUs3#3G4OPNck}Ur&Ukkd%J#AGM;tcNcp=m1hO|$ z5@PasPb?Sr6M(qJjg?J6;e{qWmlPAbsuyxfCp{-Hf{!`uW4mb2Cn&-EeLO@nUW;>1o#Q;NN)OcJ;AZvX-SMFOlB#8xV;d=nYGY zG)ibp^l%e>Kd3=HBXs{hSk>1pyMgyL$cwz1qBgGI*$TvhdG?(QY_$p^Dyv+&j z2lqX)vi{=S1c>Wm0wj2WDUFh_-?>f!&oF<{o9Y6FxohCw;w+;$`A$R3kh3r-1f7h^!X_?Dl&*v zvbrBaPa!y8iX3bj{s^Zr0jEFT{0~+JaNX4lzN#9E)HL|Sk=q2HTk@u zWUnNVUKjZa`w0jxD-jP!X8BP%gi1_?5Bmp5KSgSouftr zvdIXWX_p4ZX$^}?|7KeDV*Oe+Jurw;n`u<8si)Lxo3WYpo>Y^323^az`Zv>x23F3> zk1_(}MHLCf!exN8hr z#>YZcUgq)2dw{PJuhc|VhAQJ@p-OW-`&%*qVldw&UKk`wX`I4FEbTdxOat=|(-;(5o-B{@ zT*<5{#xlv$fX4C}R`s%k1^#3hB1p0S3N;!~>|c!JuqUb@^aq?Y7QO@7QL3MuPcEK)9TtAMX9t%sbg47lP8>1 zO|{4;_gY59IvrwA`ujYGAJyGIm7~&LrufE70cT(^r4OO*gU*sx42w9kD{3~Jp8#cuO@r8?woDpll|^}=M(PsW&L z<&F&%qDltseu$uEM36R#NwTlI*sIvrp{-YfkR5+XW~nd!@&q7`5`VEL z+--QXy8B_Y=dqT*p>Oo_bv<_{9z|(MrFBERUQhB0CgGiEK@wP+_qB4`w(#y^rqlSo zopAwYLuLY_8^A4JTs3s}iP`Fh4%HUBPP2iRo>mvlz@9$#z)@t5`9XNVXnTGO7j(fA zOb)gmV6AW%0lD-})1uB|C8FYSt_Cw_x4iXP&VPX2TjjPRYMeTW<+JrA;G|l#M*IdS` zvfTD?tg~)3J@0I{!w)2|1%;*UEG#5v41~K&sdvxJ?O3tQx9s8kA;+t1ukOSP5LEo6 z-rK5_Dv)-jAQe;YCE!i!o7v$n7$Dx}x1)M^MTrxRj zflB~iYlI{Qw%2Vo6oI7c@4RkES(b~d(|9AsoGO`mt5u-kE}1&Ow9;G1O#~5=*n}LTIsl^g+m%8oxycXpmtx`MN_Aaz*kj-F$k(*S&RNPP*M?E!;#D9;T zLy5fu!cS)1Z4pGC_qt!@#uQ$#R1#`>DJ=BK*3w}KA>BJ5-AfweEPxbR3=_V!gcCA7 z`)isDzKV8gIxOoUE7EYm^xM5l_ERn`zxKCI*x!!!6^xMHach4Zd8J}e*a{qp+$H{` zx{gqjL_4@W8u;0z{x-sJ?fSme4r>C|iD;WFVH?^fqDkCQLAO{0 zy=XV2w;MXmpbGwMhgQ4Miza@~Y<8_6J`Ea8@CC7V!rplznp(En7WR@nzlR?UaBvWs ztqy){^*t{Hs@9UT(u+3E^>9%;b6W7Ko%UH&m=-^~eiOg8<8?W;MYDdEo(4Vp$!O0K z0JOc(Qi>m=*M`)?cDGeqS%S&ido0>PdsrR3vI-kk?JxkSeZ0hKTCAi-$53l5>VaXP zC((eyAgo{;UTW?6cmytU{~q`EX1u9QMT}D0PPsb^<4ZmoQ9F#A!%YuqUD&W;gV3TemEVHaTFl z?Tv1$Q;V4qgk=TTYqtEh*`%r4$x0ZT)9fcjoxtigyxK~OSZSBF((wYTrnY2UQV(nA zoxtJDy0g}B0&}rxVITs_EmBAzaN95#y4;0H9Dr^Y)oSEQ1-&!9XfJ(3C-k0lXd=uF zL2F>jxBBLV_~-GB(QcA7a87#}jM#KqPS|_-u9;{@$LiD|A6O&Wb69AFzZw7quK^Oqq@S5Zxd0BXh;;@Fgp*XO zct89~&32aUCjNnc$C@6o{~%7gN=o7JNMP#XLhojFb^rrnP7_ zAi=A^z_zRqeOy&Xt+O?&Wjf88*=Uf)WmxYf$TZ`D)m-A*>{7JZYM<|6d59*tHi7tp z6LGA|fo$Lns-}+@`7yrP4Wz(XArviOG^{1k%74q-y zleEhHE2ii*S44)DC#V-GF`_VrjM*mDFw@4zwt364yx(d}_@ok|?kx`RbgRIe%; zcLGFRdyipNai4t!%(MN`eU~|e+T)Hr578oo@_dB8+@tjIGK$XJPahu`!^el{hHxaqz@zd#9iokp2N3gLrxXVc;FcN>wY~ e8W%Hu-s-gL&2EF_XPH#sbc6K1P?0?FRsDa&Q{Nf@ literal 0 HcmV?d00001 diff --git a/.doctrees/_autosummary/change_header.doctree b/.doctrees/_autosummary/change_header.doctree new file mode 100644 index 0000000000000000000000000000000000000000..e41c0cea70da6dbece4dabe819c023f4bd2ded39 GIT binary patch literal 37222 zcmeHQdypJQd6#tWhfWV$0wc>F%a~iqcY6=Zl6{tBgp9xuI@`h+8A``Gco{1VSLBLdAhfLVjOA zW_o6KXLs*mJ1JD9y_ufwufP8K`@Zh}zOTC<>3QdwcWhw)f-PRfw8~3ay-+AS1;eWa z{RJmqEg5CM_E>H2n`#f&GQohWU-F!)n>T8~2IR<_R=Wui1C5mN5r{9^dkdhVm&G$(wq4(Kwqk4ZUEvHOh&M-S-Mv9)(aXG^Kkpg~l&2c>`T8P#s+n8NUFNWPt=VPn4(^#Sosu!(R?B6> zow($<=O;?8n;$m|?)U{g_RQ%$k<+Wb<5f!~-CdsGBoHmkx*l3}-HA=rd2>V1W0ecW zl0q;}OY?fP!n^^bx)J|x!v9hH-%Bk5QCy3)BNKF2bjz&;J4#NWS~Tv^Vinbbt9kl( zJlX7>^=o?7yxAOAn)sUbn-~L^tt`)=dpsajUeuh01P9OboGjsIGoE3Y;&sHM56y5PdPFh*7| z5yZ`#nVLDIh|3X32bd<7A&Kn5mv;@daV1M%ryfdBHMK`PeMz{;AdmkUlwL*}aGS&Xj>`m%;p&9_R1 zgjIIR1m~oF-jGEIIN>pGxxP83>5B$_P|P!yL@DUG3^mFss3_chR}2f}E$LP{R|4o9 zbOOWo(3N9n#VGJeRvX#tITXDxn!mdZ|)0G$NdK$_0xD6$a^6@6gZ4tcg8MJ`zd->jV&BsP5`*z_St!msghOb$d%g%~4S2;g-p z0BXa$Q&?_@XqW3;YWSgtRB?S7^Q97<;B_<5j?TP2GpBH)c1XN%eWyyok-4+lS>o2S z#F}Rrzv2;eKYIpmU|Ig*+}XWMvt%%W3|EYD0eUgFgh5QfGnneQaydBn6)hjUTvVW$ zA7%sh&R|GsNiEW4A8)S9FibJjf=!j>TF_fr9tTBghB~TIUwjmu`5}zu&3msG4a87W z3trTGbgf}BL%E3GYv!kdKD_zM6-;cpsMcTz@5WN4Xyq-xcA0&?q`T$X6^u~JGkm

-DmTZK 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 literal 0 HcmV?d00001 diff --git a/.doctrees/index.doctree b/.doctrees/index.doctree new file mode 100644 index 0000000000000000000000000000000000000000..1173ac5e03f62be5071971827142b056e2b06296 GIT binary patch literal 24985 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 literal 0 HcmV?d00001 diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 00000000..e69de29b diff --git a/_autosummary/acq2sqlite.html b/_autosummary/acq2sqlite.html new file mode 100644 index 00000000..2efe5359 --- /dev/null +++ b/_autosummary/acq2sqlite.html @@ -0,0 +1,318 @@ + + + + + + + + acq2sqlite — mrrc-hdr-qa documentation + + + + + + + + + + + + + + + + + + + + +

+
+
+ + +
+ +
+

acq2sqlite

+

Convert db.txt into a sqlite database.

+

Functions

+ + + + + + + + + +

column_names()

These names match what's used by dcmmeta2tsv.py and 00_build_db.bash CSA first, normal dicom headers, and then filename.

have_pipe_data()

+

Classes

+ + + + + + +

DBQuery([sql])

Convenient SQL queries for tracking dicom headers/metadata.

+
+
+class acq2sqlite.DBQuery(sql=None)[source]
+

Convenient SQL queries for tracking dicom headers/metadata.

+

This class is a poorly implemented, ad-hoc/bespoke ORM for database defined in schema.sql

+
+
+CONSTS = ['Project', 'SequenceName', 'iPAT', 'Comments', 'SequenceType', 'PED_major', 'Phase', 'TR', 'TE', 'Matrix', 'PixelResol', 'BWP', 'BWPPE', 'FA', 'TA', 'FoV'][source]
+

CONSTS is a list of expected aquisition-invarient parameters. +The values of these attributes should be the same for every acquisition +sharing a Project × SequenceName pair (across all sessions of a Project).

+

We consider the acquisition to have a Quallity Assurance error +when the value of any of these parameters in a single acquisition +fails to match the template.

+

For example TR for task EPI acquisition identified by +SequenceName=RewardedAnti in Project=WPC-8620 +should always be 1300 ms.

+../_images/nonconforming_example.png +
+ +
+
+check_acq(d)[source]
+

Is this exact acquisition (time, id, series) already in the database?

+
+
Parameters:
+

d (dict[str, str]) – All parameters of an acquisition

+
+
Returns:
+

True/False if dict params exist

+
+
Return type:
+

bool

+
+
+
+ +
+
+dict_to_db_row(d)[source]
+

insert a dicom header (representative of acquisition) into db

+
+
Parameters:
+

d (dict[str, str])

+
+
Return type:
+

None

+
+
+
+ +
+
+get_template(pname, seqname)[source]
+

Find the template from template_by_count. See make_template_by_count.sql

+
+
Parameters:
+
    +
  • pname (str) – protocol name

  • +
  • sqname – sequence name

  • +
  • seqname (str)

  • +
+
+
Returns:
+

template row matching prot+seq name pair

+
+
Return type:
+

Row

+
+
+
+ +
+
+is_template(param_id)[source]
+

Check if param id is the ideal template.

+
+
Parameters:
+

param_id (int)

+
+
Return type:
+

bool

+
+
+
+ +
+
+param_rowid(d)[source]
+
+
Parameters:
+

d (dict[str, str]) – dicom headers

+
+
Returns:
+

acq_param (new or existing) rowid identifying unique set of CONSTS

+
+
Return type:
+

int | None

+
+
+

Find or insert the combination of parameters for an acquisition. +Using CONSTS, the header parameters that should be invariant +across acquisitions of the same name within a study.

+
>>> db = DBQuery(sqlite3.connect(':memory:'))
+>>> with open('schema.sql') as f: _ = [db.sql.execute(c) for c in f.read().split(";")]
+...
+>>> # db.sql.execute(".read schema.sql")
+>>> example = {k: 'x' for k in db.CONSTS}
+>>> db.param_rowid(example)
+1
+>>> db.param_rowid(example)
+1
+>>> db.param_rowid({**example, 'Project': 'b'})
+2
+>>> str(db.param_rowid({}))
+'None'
+
+
+
+ +
+
+search_acq_param(d)[source]
+

Try to find aca_param row id of CONSTS part of input d

+
+
Parameters:
+

d (dict[str, str]) – dictionary of tag values (keys in CONSTS)

+
+
Returns:
+

rowid of matching (param_id) or None

+
+
Return type:
+

int | None

+
+
+
+ +
+
+tsv_to_dict(line)[source]
+

Read a tsv line into dictionary.

+
+
Parameters:
+

line (str) – tab separated string. likely line from dcmmeta2tsv.py

+
+
Returns:
+

dictionary with taglist.txt names and acquisition values.

+
+
Return type:
+

dict[str, str]

+
+
+
+ +
+ +
+
+acq2sqlite.column_names()[source]
+

These names match what’s used by dcmmeta2tsv.py and 00_build_db.bash +CSA first, normal dicom headers, and then filename.

+

Defaults to reading from taglist.txt +This provides a language agnostic lookup for columns in schema.sql

+

These column names should match what is output by +./dcmmeta2tsv.bash or ./dcmmeta2tsv.py

+

Also see dcmmeta2tsv.read_known_tags()

+
>>> cn = column_names() # reads taglist.txt
+>>> cn[0] # hard coded here
+'Phase'
+>>> cn[3] # from taglist.xt
+'AcqDate'
+
+
+
+ +
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/_autosummary/change_header.html b/_autosummary/change_header.html new file mode 100644 index 00000000..21664a4f --- /dev/null +++ b/_autosummary/change_header.html @@ -0,0 +1,254 @@ + + + + + + + + change_header — mrrc-hdr-qa documentation + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

change_header

+

Modify DICOM header information to simulate failing QA.

+

Functions

+ + + + + + + + + + + + + + + + + + +

change_tags(dcm_dir, new_data[, out_dir])

Change specified tags of all dicoms in a directory.

gen_acqdates()

Generate DataElements for random acquisition day and time.

gen_anon()

Make random date of birth, age, and sex.

gen_ids(new_id)

Generate ID DataElements.

main_make_mods()

Exercise header modification code to make example data we can use.

+
+
+change_header.change_tags(dcm_dir, new_data, out_dir=None)[source]
+

Change specified tags of all dicoms in a directory. Optionally make copies in out_dir.

+

sideffect: writes copies of dcm_dir dicoms into out_dir unless out_dir is None.

+
+
Parameters:
+
    +
  • dcm_dir (Path) – input directory with dicom files (MR*, *IMA , or *dcm)

  • +
  • new_data (List[DataElement]) – list of data elements to replace +like [pydicom.DataElement(value="newpname", VR="LO", tag=(0x0018, 0x1030))]

  • +
  • out_dir (Path | None) – Optional. Where to save modified dicoms

  • +
+
+
Returns:
+

example modified dicom. last if out_dir, first and only if no out_dir.

+
+
Return type:
+

FileDataset | None

+
+
+
>>> new_data = [pydicom.DataElement(value="newpname", VR="LO", tag=(0x0018, 0x1030))]
+>>> ex_path = Path('example_dicoms/')
+>>> ex = change_tags(ex_path, new_data)
+>>> ex.ProtocolName
+'newpname'
+
+
+
+ +
+
+change_header.gen_acqdates()[source]
+

Generate DataElements for random acquisition day and time.

+
+
Returns:
+

ID DataElements List

+
+
Return type:
+

List[DataElement]

+
+
+

See gen_anon() for tag and VR info.

+
+ +
+
+change_header.gen_anon()[source]
+

Make random date of birth, age, and sex.

+
+
Returns:
+

list of DataElements with randomized values

+
+
Return type:
+

List[DataElement]

+
+
+
+

Tip

+

Field tag type and location can be extracted like:

+
x = pydicom.dcmread(example_fname)
+fields = ['AcquisitionDate', 'AcquisitionTime',
+          'PatientBirthDate', 'PatientAge', 'PatientSex']
+[x[k] for k in fields]
+
+# yields
+[(0008,0022) Acquisition Date                    DA: '20221222',
+ (0008,0032) Acquisition Time                    TM: '092132.722500',
+ (0010,0030) Patient's Birth Date                DA: '20070404',
+ (0010,1010) Patient's Age                       AS: '015Y',
+ (0010,0040) Patient's Sex                       CS: 'F']
+
+
+
+

Where the tag is the tuple and “XX:” is the type

+
+ +
+
+change_header.gen_ids(new_id)[source]
+

Generate ID DataElements.

+
+
Parameters:
+

new_id (str) – id string to put into pat name and pat id dicom headers.

+
+
Returns:
+

ID DataElements List

+
+
Return type:
+

List[DataElement]

+
+
+

See gen_anon() for tag and VR info.

+
>>> data_els = gen_ids('example_name')
+>>> data_els[0].value
+'example_name'
+>>> data_els[0].VR
+'PN'
+>>> data_els[0].tag
+(0010,0010)
+
+
+
+ +
+
+change_header.main_make_mods()[source]
+

Exercise header modification code to make example data we can use.

+

We can confirm changes are made from shell using AFNI’s dicom_hinfo

+
find example/dicom/mod* -iname 'MR*' -exec dicom_hinfo -tag 0010,0010 -sepstr $'\t' -last {} \+
+
+#   mod1 example/dicom/mod1/HabitTask/MR.1.3.12.2.1107.5.2.43.167046.2022122209214150118864465
+#   mod1 example/dicom/mod1/HabitTask/MR.1.3.12.2.1107.5.2.43.167046.2022122209214176799264617
+#   mod2 example/dicom/mod2/HabitTask/MR.1.3.12.2.1107.5.2.43.167046.2022122209214150118864465
+#   mod2 example/dicom/mod2/HabitTask/MR.1.3.12.2.1107.5.2.43.167046.2022122209214176799264617
+
+
+
+ +
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/_autosummary/dcmmeta2tsv.html b/_autosummary/dcmmeta2tsv.html new file mode 100644 index 00000000..9a7fd652 --- /dev/null +++ b/_autosummary/dcmmeta2tsv.html @@ -0,0 +1,320 @@ + + + + + + + + dcmmeta2tsv — mrrc-hdr-qa documentation + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

dcmmeta2tsv

+

Give a tab separated metadata value line per dicom file.

+

Module Attributes

+ + + + + + + + + +

NULLVAL

object that has obj.value for when a dicom tag does not exist using 'null' to match AFNI's dicom_hinfo

TagValues

keys are names from taglist.txt, also has dcm_path key for file

+

Functions

+ + + + + + + + + + + + + + + + + + +

csa_fetch(csa_tr, itemname)

safely look into csa_tr dicom dictionary.

read_csa(csa)

extract parameters from siemens CSA :param csa: content of siemens private tag (0x0029, 0x1010) :return: [pepd, ipat] is phase encode positive direction and GRAPA iPATModeText

read_known_tags([tagfile])

read in tsv file like with header name,tag,desc.

read_tags(dcm_path, tags)

Read dicom header and isolate tags

tagpair_to_hex(csv_str)

move our text files has tags like "0051,1017" to pydicom indexe like (0x51,0x1017)

+

Classes

+ + + + + + +

DicomTagReader()

Class to cache read_known_tags() output

+
+
+class dcmmeta2tsv.DicomTagReader[source]
+

Class to cache read_known_tags() output

+
+
+read_dicom_tags(dcm_path)[source]
+

return values of dicom header priority fields +ordered as defined in taglist.txt +:param dcm_path: path to dciom +:return: dict[taglist.txt tagname, tag value]

+
>>> dtr = DicomTagReader()
+>>> hdr = dtr.read_dicom_tags('example_dicoms/RewardedAnti_good.dcm')
+>>> list(hdr.values()) 
+[1, 'p2', '154833.265000', '20220913', ...
+
+
+
>>> list(hdr.values())[-1]
+'example_dicoms/RewardedAnti_good.dcm'
+
+
+
+
Parameters:
+

dcm_path (PathLike)

+
+
Return type:
+

dict[str, str]

+
+
+
+ +
+ +
+
+dcmmeta2tsv.NULLVAL = <dcmmeta2tsv. object>[source]
+

object that has obj.value for when a dicom tag does not exist +using ‘null’ to match AFNI’s dicom_hinfo

+
+ +
+
+dcmmeta2tsv.TagValues[source]
+

keys are names from taglist.txt, also has dcm_path key for file

+
+ +
+
+dcmmeta2tsv.csa_fetch(csa_tr, itemname)[source]
+

safely look into csa_tr dicom dictionary. +Expect nested structure like 'tags'->itemname->'items'->[0].

+

In future, might want to check itemname and pull out more than the first array item.

+
>>> csa_fetch({'notags':'badinput'}, 'PhaseEncodingDirectionPositive')
+'null'
+>>> csa_fetch({'tags':{'ImaPATModeText': {'items': [1]}}}, 'ImaPATModeText')
+1
+
+
+
+
Parameters:
+
    +
  • csa_tr (dict)

  • +
  • itemname (str)

  • +
+
+
Return type:
+

str

+
+
+
+ +
+
+dcmmeta2tsv.read_csa(csa)[source]
+

extract parameters from siemens CSA +:param csa: content of siemens private tag (0x0029, 0x1010) +:return: [pepd, ipat] is phase encode positive direction and GRAPA iPATModeText

+
>>> read_csa(None) is None
+True
+
+
+
+
Return type:
+

list[str]

+
+
+
+ +
+
+dcmmeta2tsv.read_known_tags(tagfile='taglist.txt')[source]
+

read in tsv file like with header name,tag,desc. +skip comments and header

+
+
Parameters:
+

tagfile – text tsv file to get name,tag(hex pair),desc from

+
+
Returns:
+

file parsed into a list of dictonaires

+
+
Return type:
+

list[Tag]

+
+
+
+ +
+
+dcmmeta2tsv.read_tags(dcm_path, tags)[source]
+

Read dicom header and isolate tags

+
+
Parameters:
+
    +
  • dcm_path (PathLike) – dicom file with headers to extract

  • +
  • tags (list[Tag]) – ordered dictionary with ‘tag’ key as hex pair, see tagpair_to_hex()

  • +
+
+
Returns:
+

dict[tag,value] values in same order as tags

+
+
Return type:
+

dict[str, str]

+
+
+
>>> tr = {'name': 'TR', 'tag': (0x0018,0x0080), 'loc': 'header'}
+>>> ipat = {'name': 'iPAT', 'tag': 'ImaPATModeText', 'loc': 'csa'}
+>>> list(read_tags('example_dicoms/RewardedAnti_good.dcm', [ipat, tr]).values())
+['p2', '1300', 'example_dicoms/RewardedAnti_good.dcm']
+
+
+
>>> list(read_tags('example_dicoms/DNE.dcm', [ipat,tr]).values())
+['null', 'null', 'example_dicoms/DNE.dcm']
+
+
+
+ +
+
+dcmmeta2tsv.tagpair_to_hex(csv_str)[source]
+

move our text files has tags like “0051,1017” +to pydicom indexe like (0x51,0x1017)

+
+
Parameters:
+

csv_str – comma separated string to convert

+
+
Returns:
+

dicom header tag hex pair

+
+
Return type:
+

tuple[int, int]

+
+
+
>>> tagpair_to_hex("0051,1017")
+('0x51', '0x1017')
+
+
+
+ +
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/_images/nonconforming_example.png b/_images/nonconforming_example.png new file mode 100644 index 0000000000000000000000000000000000000000..a7ccaed04da8460ccf33de291a24745652b1488b GIT binary patch literal 143360 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 .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/_static/basic.css b/_static/basic.css new file mode 100644 index 00000000..d9846dac --- /dev/null +++ b/_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/_static/custom.css b/_static/custom.css new file mode 100644 index 00000000..2a924f1d --- /dev/null +++ b/_static/custom.css @@ -0,0 +1 @@ +/* This file intentionally left blank. */ diff --git a/_static/doctools.js b/_static/doctools.js new file mode 100644 index 00000000..0398ebb9 --- /dev/null +++ b/_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/_static/documentation_options.js b/_static/documentation_options.js new file mode 100644 index 00000000..7e4c114f --- /dev/null +++ b/_static/documentation_options.js @@ -0,0 +1,13 @@ +const DOCUMENTATION_OPTIONS = { + VERSION: '', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/_static/file.png b/_static/file.png new file mode 100644 index 0000000000000000000000000000000000000000..a858a410e4faa62ce324d814e4b816fff83a6fb3 GIT binary patch literal 286 zcmV+(0pb3MP)s`hMrGg#P~ix$^RISR_I47Y|r1 z_CyJOe}D1){SET-^Amu_i71Lt6eYfZjRyw@I6OQAIXXHDfiX^GbOlHe=Ae4>0m)d(f|Me07*qoM6N<$f}vM^LjV8( literal 0 HcmV?d00001 diff --git a/_static/github-banner.svg b/_static/github-banner.svg new file mode 100644 index 00000000..c47d9dc0 --- /dev/null +++ b/_static/github-banner.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/_static/language_data.js b/_static/language_data.js new file mode 100644 index 00000000..c7fe6c6f --- /dev/null +++ b/_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/_static/minus.png b/_static/minus.png new file mode 100644 index 0000000000000000000000000000000000000000..d96755fdaf8bb2214971e0db9c1fd3077d7c419d GIT binary patch literal 90 zcmeAS@N?(olHy`uVBq!ia0vp^+#t*WBp7;*Yy1LIik>cxAr*|t7R?Mi>2?kWtu=nj kDsEF_5m^0CR;1wuP-*O&G^0G}KYk!hp00i_>zopr08q^qX#fBK literal 0 HcmV?d00001 diff --git a/_static/plus.png b/_static/plus.png new file mode 100644 index 0000000000000000000000000000000000000000..7107cec93a979b9a5f64843235a16651d563ce2d GIT binary patch literal 90 zcmeAS@N?(olHy`uVBq!ia0vp^+#t*WBp7;*Yy1LIik>cxAr*|t7R?Mi>2?kWtu>-2 m3q%Vub%g%s<8sJhVPMczOq}xhg9DJoz~JfX=d#Wzp$Pyb1r*Kz literal 0 HcmV?d00001 diff --git a/_static/pygments.css b/_static/pygments.css new file mode 100644 index 00000000..04a41742 --- /dev/null +++ b/_static/pygments.css @@ -0,0 +1,84 @@ +pre { line-height: 125%; } +td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +.highlight .hll { background-color: #ffffcc } +.highlight { background: #f8f8f8; } +.highlight .c { color: #8f5902; font-style: italic } /* Comment */ +.highlight .err { color: #a40000; border: 1px solid #ef2929 } /* Error */ +.highlight .g { color: #000000 } /* Generic */ +.highlight .k { color: #004461; font-weight: bold } /* Keyword */ +.highlight .l { color: #000000 } /* Literal */ +.highlight .n { color: #000000 } /* Name */ +.highlight .o { color: #582800 } /* Operator */ +.highlight .x { color: #000000 } /* Other */ +.highlight .p { color: #000000; font-weight: bold } /* Punctuation */ +.highlight .ch { color: #8f5902; font-style: italic } /* Comment.Hashbang */ +.highlight .cm { color: #8f5902; font-style: italic } /* Comment.Multiline */ +.highlight .cp { color: #8f5902 } /* Comment.Preproc */ +.highlight .cpf { color: #8f5902; font-style: italic } /* Comment.PreprocFile */ +.highlight .c1 { color: #8f5902; font-style: italic } /* Comment.Single */ +.highlight .cs { color: #8f5902; font-style: italic } /* Comment.Special */ +.highlight .gd { color: #a40000 } /* Generic.Deleted */ +.highlight .ge { color: #000000; font-style: italic } /* Generic.Emph */ +.highlight .ges { color: #000000 } /* 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: #888888 } /* Generic.Output */ +.highlight .gp { color: #745334 } /* Generic.Prompt */ +.highlight .gs { color: #000000; font-weight: bold } /* Generic.Strong */ +.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ +.highlight .gt { color: #a40000; font-weight: bold } /* Generic.Traceback */ +.highlight .kc { color: #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: #000000 } /* Literal.Date */ +.highlight .m { color: #990000 } /* Literal.Number */ +.highlight .s { color: #4e9a06 } /* Literal.String */ +.highlight .na { color: #c4a000 } /* Name.Attribute */ +.highlight .nb { color: #004461 } /* Name.Builtin */ +.highlight .nc { color: #000000 } /* Name.Class */ +.highlight .no { color: #000000 } /* Name.Constant */ +.highlight .nd { color: #888888 } /* Name.Decorator */ +.highlight .ni { color: #ce5c00 } /* Name.Entity */ +.highlight .ne { color: #cc0000; font-weight: bold } /* Name.Exception */ +.highlight .nf { color: #000000 } /* Name.Function */ +.highlight .nl { color: #f57900 } /* Name.Label */ +.highlight .nn { color: #000000 } /* Name.Namespace */ +.highlight .nx { color: #000000 } /* Name.Other */ +.highlight .py { color: #000000 } /* Name.Property */ +.highlight .nt { color: #004461; font-weight: bold } /* Name.Tag */ +.highlight .nv { color: #000000 } /* Name.Variable */ +.highlight .ow { color: #004461; font-weight: bold } /* Operator.Word */ +.highlight .pm { color: #000000; font-weight: bold } /* Punctuation.Marker */ +.highlight .w { color: #f8f8f8 } /* Text.Whitespace */ +.highlight .mb { color: #990000 } /* Literal.Number.Bin */ +.highlight .mf { color: #990000 } /* Literal.Number.Float */ +.highlight .mh { color: #990000 } /* Literal.Number.Hex */ +.highlight .mi { color: #990000 } /* Literal.Number.Integer */ +.highlight .mo { color: #990000 } /* Literal.Number.Oct */ +.highlight .sa { color: #4e9a06 } /* Literal.String.Affix */ +.highlight .sb { color: #4e9a06 } /* Literal.String.Backtick */ +.highlight .sc { color: #4e9a06 } /* Literal.String.Char */ +.highlight .dl { color: #4e9a06 } /* Literal.String.Delimiter */ +.highlight .sd { color: #8f5902; font-style: italic } /* Literal.String.Doc */ +.highlight .s2 { color: #4e9a06 } /* Literal.String.Double */ +.highlight .se { color: #4e9a06 } /* Literal.String.Escape */ +.highlight .sh { color: #4e9a06 } /* Literal.String.Heredoc */ +.highlight .si { color: #4e9a06 } /* Literal.String.Interpol */ +.highlight .sx { color: #4e9a06 } /* Literal.String.Other */ +.highlight .sr { color: #4e9a06 } /* Literal.String.Regex */ +.highlight .s1 { color: #4e9a06 } /* Literal.String.Single */ +.highlight .ss { color: #4e9a06 } /* Literal.String.Symbol */ +.highlight .bp { color: #3465a4 } /* Name.Builtin.Pseudo */ +.highlight .fm { color: #000000 } /* Name.Function.Magic */ +.highlight .vc { color: #000000 } /* Name.Variable.Class */ +.highlight .vg { color: #000000 } /* Name.Variable.Global */ +.highlight .vi { color: #000000 } /* Name.Variable.Instance */ +.highlight .vm { color: #000000 } /* Name.Variable.Magic */ +.highlight .il { color: #990000 } /* Literal.Number.Integer.Long */ \ No newline at end of file diff --git a/_static/searchtools.js b/_static/searchtools.js new file mode 100644 index 00000000..2c774d17 --- /dev/null +++ b/_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/_static/sphinx_highlight.js b/_static/sphinx_highlight.js new file mode 100644 index 00000000..8a96c69a --- /dev/null +++ b/_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/genindex.html b/genindex.html new file mode 100644 index 00000000..93c0dd34 --- /dev/null +++ b/genindex.html @@ -0,0 +1,271 @@ + + + + + + + Index — mrrc-hdr-qa documentation + + + + + + + + + + + + + + + + + + +
+ + +
+
+ + + + + + + \ No newline at end of file diff --git a/index.html b/index.html new file mode 100644 index 00000000..07a430c0 --- /dev/null +++ b/index.html @@ -0,0 +1,235 @@ + + + + + + + + mrrc-hdr-qa documentation — mrrc-hdr-qa documentation + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

mrrc-hdr-qa documentation

+

Code to parse dicoms into a template database and alert on non-conforming sequences.

+
+

Code

+
+
+ + + + + + + + + + + + +

dcmmeta2tsv

Give a tab separated metadata value line per dicom file.

acq2sqlite

Convert db.txt into a sqlite database.

change_header

Modify DICOM header information to simulate failing QA.

+
+
+

Overview

+
+

Template

+

See acq2sqlite.DBQuery.CONSTS

+

Here’s an example for the RewardedAnti task acquisitions in the WPC-8620 project. The ideal template is found finding the most frequent set of repeated key parameters. 150 of the RewardedAnti seqeuences share the same acq_param set, here stored in the sqlite db on rowid=35. But 4 acquisitions (rows in acq) don’t match. In this case all mismatches can be found in TA.

+_images/nonconforming_example.png +
+
+
+

Parameters

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Dicom tag list

name

tag

desc

Phase

PhaseEncodingDirectionPositive

csa header phase 0/1

iPAT

ImaPATModeText

csa header grappa acceleration

AcqTime

00080032

Acquisition Time like 145446.685000

AcqDate

00080022

like 20241004

SeriesNumber

00200011

REL Series Number

SubID

00100010

patient name

Comments

00204000

REL Image Comments//Unaliased MB3/PE4/LB SENSE1

Operator

00081070

Project

00081030

ID Study Description//Brain^wpc-8620

SequenceName

0008103e

series description

SequenceType

00180024

ACQ Sequence Name

PED_major

00181312

ACQ Phase Encoding Direction ROW or COL

TR

00180080

TE

00180081

Matrix

00181310

ACQ Acquisition Matrix

PixelResol

00280030

IMG Pixel Spacing//2.29787230491642.2978723049164

BWP

00180095

ACQ Pixel Bandwidth (?) also unimplemented? need CSA value?

BWPPE

00191028

in matlab S.BandwidthPerPixelPhaseEncode;

FA

00181314

TA

0051100a

FoV

0051100c

eg FoV 1617*1727; but actually cocaluated from matrix and spacing?

+
+
+
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/objects.inv b/objects.inv new file mode 100644 index 0000000000000000000000000000000000000000..fcf974c7b2db52d660c9312cea9bacd4cd0c69ad GIT binary patch literal 607 zcmV-l0-*gPAX9K?X>NERX>N99Zgg*Qc_4OWa&u{KZXhxWBOp+6Z)#;@bUGkya&luW zXk>CNabXH0AXa5^b7^mGIv@%oAXI2&AaZ4GVQFq;WpW^IW*~HEX>%ZEX>4U6X>%ZB zZ*6dLWpi_7WFU2OX>MmAdTeQ8E(&wI-Kl05-XAIXfPaZ zhQ2iXOcEE&Q*S8WQfr9|K=1w> zau9NHHj5cqD@`>hbP@7cYvzT~ufebqbb+));AqF2rQ_D?m#+2r<)N57%>c5`Dp1E@ z^H2vDg6SZ>1W54Z2T~w3Rj@-Ef_V;(GZiWZu0j=!=dR_{%Us)bBbZV5Q2aX8!r;W~ z;ifq&8y>N~jXIUYaFx%3Z-1}X51-eO5DEg`tPf{;09mI>8lA(l80LUJqG#n)!e%Ll zumsd{$WEIlJ=<=tV=blxKn23anO5T8H={=86>*+lbHhkJJ<`a_cQ)QXqqKgPkR7=>RjQZ!* + + + + + + Python Module Index — mrrc-hdr-qa documentation + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ + +

Python Module Index

+ +
+ a | + c | + d +
+ + + + + + + + + + + + + + + + + +
 
+ a
+ acq2sqlite +
 
+ c
+ change_header +
 
+ d
+ dcmmeta2tsv +
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/search.html b/search.html new file mode 100644 index 00000000..929af5ba --- /dev/null +++ b/search.html @@ -0,0 +1,122 @@ + + + + + + + Search — mrrc-hdr-qa documentation + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +

Search

+ + + + +

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

+ + +
+ + + +
+ + +
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/searchindex.js b/searchindex.js new file mode 100644 index 00000000..623df0af --- /dev/null +++ b/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"alltitles": {"Code": [[3, "code"]], "Dicom tag list": [[3, "id1"]], "Overview": [[3, "overview"]], "Parameters": [[3, "parameters"]], "Template": [[3, "template"]], "acq2sqlite": [[0, null]], "change_header": [[1, null]], "dcmmeta2tsv": [[2, null]], "mrrc-hdr-qa documentation": [[3, null]]}, "docnames": ["_autosummary/acq2sqlite", "_autosummary/change_header", "_autosummary/dcmmeta2tsv", "index"], "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": ["_autosummary/acq2sqlite.rst", "_autosummary/change_header.rst", "_autosummary/dcmmeta2tsv.rst", "index.rst"], "indexentries": {"acq2sqlite": [[0, "module-acq2sqlite", false]], "change_header": [[1, "module-change_header", false]], "change_tags() (in module change_header)": [[1, "change_header.change_tags", false]], "check_acq() (acq2sqlite.dbquery method)": [[0, "acq2sqlite.DBQuery.check_acq", false]], "column_names() (in module acq2sqlite)": [[0, "acq2sqlite.column_names", false]], "consts (acq2sqlite.dbquery attribute)": [[0, "acq2sqlite.DBQuery.CONSTS", false]], "csa_fetch() (in module dcmmeta2tsv)": [[2, "dcmmeta2tsv.csa_fetch", false]], "dbquery (class in acq2sqlite)": [[0, "acq2sqlite.DBQuery", false]], "dcmmeta2tsv": [[2, "module-dcmmeta2tsv", false]], "dicomtagreader (class in dcmmeta2tsv)": [[2, "dcmmeta2tsv.DicomTagReader", false]], "dict_to_db_row() (acq2sqlite.dbquery method)": [[0, "acq2sqlite.DBQuery.dict_to_db_row", false]], "gen_acqdates() (in module change_header)": [[1, "change_header.gen_acqdates", false]], "gen_anon() (in module change_header)": [[1, "change_header.gen_anon", false]], "gen_ids() (in module change_header)": [[1, "change_header.gen_ids", false]], "get_template() (acq2sqlite.dbquery method)": [[0, "acq2sqlite.DBQuery.get_template", false]], "is_template() (acq2sqlite.dbquery method)": [[0, "acq2sqlite.DBQuery.is_template", false]], "main_make_mods() (in module change_header)": [[1, "change_header.main_make_mods", false]], "module": [[0, "module-acq2sqlite", false], [1, "module-change_header", false], [2, "module-dcmmeta2tsv", false]], "nullval (in module dcmmeta2tsv)": [[2, "dcmmeta2tsv.NULLVAL", false]], "param_rowid() (acq2sqlite.dbquery method)": [[0, "acq2sqlite.DBQuery.param_rowid", false]], "read_csa() (in module dcmmeta2tsv)": [[2, "dcmmeta2tsv.read_csa", false]], "read_dicom_tags() (dcmmeta2tsv.dicomtagreader method)": [[2, "dcmmeta2tsv.DicomTagReader.read_dicom_tags", false]], "read_known_tags() (in module dcmmeta2tsv)": [[2, "dcmmeta2tsv.read_known_tags", false]], "read_tags() (in module dcmmeta2tsv)": [[2, "dcmmeta2tsv.read_tags", false]], "search_acq_param() (acq2sqlite.dbquery method)": [[0, "acq2sqlite.DBQuery.search_acq_param", false]], "tagpair_to_hex() (in module dcmmeta2tsv)": [[2, "dcmmeta2tsv.tagpair_to_hex", false]], "tagvalues (in module dcmmeta2tsv)": [[2, "dcmmeta2tsv.TagValues", false]], "tsv_to_dict() (acq2sqlite.dbquery method)": [[0, "acq2sqlite.DBQuery.tsv_to_dict", false]]}, "objects": {"": [[0, 0, 0, "-", "acq2sqlite"], [1, 0, 0, "-", "change_header"], [2, 0, 0, "-", "dcmmeta2tsv"]], "acq2sqlite": [[0, 1, 1, "", "DBQuery"], [0, 4, 1, "", "column_names"]], "acq2sqlite.DBQuery": [[0, 2, 1, "", "CONSTS"], [0, 3, 1, "", "check_acq"], [0, 3, 1, "", "dict_to_db_row"], [0, 3, 1, "", "get_template"], [0, 3, 1, "", "is_template"], [0, 3, 1, "", "param_rowid"], [0, 3, 1, "", "search_acq_param"], [0, 3, 1, "", "tsv_to_dict"]], "change_header": [[1, 4, 1, "", "change_tags"], [1, 4, 1, "", "gen_acqdates"], [1, 4, 1, "", "gen_anon"], [1, 4, 1, "", "gen_ids"], [1, 4, 1, "", "main_make_mods"]], "dcmmeta2tsv": [[2, 1, 1, "", "DicomTagReader"], [2, 5, 1, "", "NULLVAL"], [2, 2, 1, "", "TagValues"], [2, 4, 1, "", "csa_fetch"], [2, 4, 1, "", "read_csa"], [2, 4, 1, "", "read_known_tags"], [2, 4, 1, "", "read_tags"], [2, 4, 1, "", "tagpair_to_hex"]], "dcmmeta2tsv.DicomTagReader": [[2, 3, 1, "", "read_dicom_tags"]]}, "objnames": {"0": ["py", "module", "Python module"], "1": ["py", "class", "Python class"], "2": ["py", "attribute", "Python attribute"], "3": ["py", "method", "Python method"], "4": ["py", "function", "Python function"], "5": ["py", "data", "Python data"]}, "objtypes": {"0": "py:module", "1": "py:class", "2": "py:attribute", "3": "py:method", "4": "py:function", "5": "py:data"}, "terms": {"": [0, 1, 2, 3], "0": [0, 1, 2, 3], "0008": 1, "00080022": 3, "00080032": 3, "00081030": 3, "0008103e": 3, "00081070": 3, "0010": 1, "00100010": 3, "00180024": 3, "00180080": 3, "00180081": 3, "00180095": 3, "00181310": 3, "00181312": 3, "00181314": 3, "00191028": 3, "00200011": 3, "00204000": 3, "0022": 1, "00280030": 3, "0030": 1, "0032": 1, "0040": 1, "0051": 2, "0051100a": 3, "0051100c": 3, "00_build_db": 0, "015y": 1, "092132": 1, "0x0018": [1, 2], "0x0029": 2, "0x0080": 2, "0x1010": 2, "0x1017": 2, "0x1030": 1, "0x51": 2, "1": [0, 1, 2, 3], "1010": 1, "1017": 2, "1107": 1, "12": 1, "1300": [0, 2], "145446": 3, "150": 3, "154833": 2, "1617": 3, "167046": 1, "1727": 3, "2": [0, 1, 3], "20070404": 1, "20220913": 2, "20221222": 1, "2022122209214150118864465": 1, "2022122209214176799264617": 1, "20241004": 3, "265000": 2, "2978723049164": 3, "29787230491642": 3, "3": [0, 1], "35": 3, "4": 3, "43": 1, "5": 1, "685000": 3, "722500": 1, "8620": [0, 3], "AS": 1, "But": 3, "For": 0, "In": [2, 3], "The": [0, 3], "These": 0, "_": 0, "aca_param": 0, "acceler": 3, "acq": 3, "acq2sqlit": 3, "acq_param": [0, 3], "acqdat": [0, 3], "acqtim": 3, "acquisit": [0, 1, 3], "acquisitiond": 1, "acquisitiontim": 1, "across": 0, "actual": 3, "ad": 0, "afni": [1, 2], "ag": 1, "agnost": 0, "alert": 3, "all": [0, 1, 3], "alreadi": 0, "also": [0, 2, 3], "alwai": 0, "an": [0, 3], "ani": 0, "aquisit": 0, "ar": [1, 2], "arrai": 2, "assur": 0, "attribut": [0, 2], "b": 0, "badinput": 2, "bandwidth": 3, "bandwidthperpixelphaseencod": 3, "bash": 0, "bespok": 0, "birth": 1, "bool": 0, "brain": 3, "bwp": [0, 3], "bwppe": [0, 3], "c": [0, 1], "cach": 2, "can": [1, 3], "case": 3, "chang": 1, "change_tag": 1, "check": [0, 2], "check_acq": 0, "class": [0, 2], "cn": 0, "cocalu": 3, "code": [0, 1], "col": 3, "column": 0, "column_nam": 0, "combin": 0, "comma": 2, "comment": [0, 2, 3], "confirm": 1, "conform": 3, "connect": 0, "consid": 0, "const": [0, 3], "content": 2, "conveni": 0, "convert": [0, 2], "copi": 1, "csa": [0, 2, 3], "csa_fetch": 2, "csa_tr": 2, "csv_str": 2, "d": 0, "da": 1, "dai": 1, "data": 1, "data_el": 1, "databas": [0, 3], "datael": 1, "date": 1, "db": [0, 3], "dbqueri": [0, 3], "dciom": 2, "dcm": [1, 2], "dcm_dir": 1, "dcm_path": 2, "dcmmeta2tsv": 0, "dcmread": 1, "default": 0, "defin": [0, 2], "desc": [2, 3], "descript": 3, "dicom": [0, 1, 2], "dicom_hinfo": [1, 2], "dicomtagread": 2, "dict": [0, 2], "dict_to_db_row": 0, "dictionari": [0, 2], "dictonair": 2, "direct": [2, 3], "directori": 1, "dne": 2, "doe": 2, "don": 3, "dtr": 2, "eg": 3, "element": 1, "encod": [2, 3], "epi": 0, "error": 0, "everi": 0, "ex": 1, "ex_path": 1, "exact": 0, "exampl": [0, 1, 3], "example_dicom": [1, 2], "example_fnam": 1, "example_nam": 1, "exec": 1, "execut": 0, "exercis": 1, "exist": [0, 2], "expect": [0, 2], "extract": [1, 2], "f": [0, 1], "fa": [0, 3], "fail": [0, 1], "fals": 0, "field": [1, 2], "file": [1, 2], "filedataset": 1, "filenam": 0, "find": [0, 1, 3], "first": [0, 1, 2], "found": 3, "fov": [0, 3], "frequent": 3, "from": [0, 1, 2, 3], "function": [0, 1, 2], "futur": 2, "gen_acqd": 1, "gen_anon": 1, "gen_id": 1, "gener": 1, "get": 2, "get_templ": 0, "give": 2, "grapa": 2, "grappa": 3, "ha": 2, "habittask": 1, "hard": 0, "have": 0, "hdr": 2, "header": [0, 1, 2, 3], "here": [0, 3], "hex": 2, "hoc": 0, "i": [0, 1, 2, 3], "id": [0, 1, 3], "ideal": [0, 3], "identifi": 0, "ima": 1, "imag": 3, "imapatmodetext": [2, 3], "img": 3, "implement": 0, "inam": 1, "index": 2, "info": 1, "inform": 1, "input": [0, 1], "insert": 0, "int": [0, 2], "invari": 0, "ipat": [0, 2, 3], "ipatmodetext": 2, "is_templ": 0, "isol": 2, "item": 2, "itemnam": 2, "k": [0, 1], "kei": [0, 2, 3], "languag": 0, "last": 1, "lb": 3, "like": [0, 1, 2, 3], "line": [0, 2], "list": [0, 1, 2], "lo": 1, "loc": 2, "locat": 1, "look": 2, "lookup": 0, "m": 0, "made": 1, "main_make_mod": 1, "make": 1, "make_template_by_count": 0, "match": [0, 2, 3], "matlab": 3, "matrix": [0, 3], "mb3": 3, "memori": 0, "metadata": [0, 2], "might": 2, "mismatch": 3, "mod": 1, "mod1": 1, "mod2": 1, "modif": 1, "modifi": 1, "modul": 2, "more": 2, "most": 3, "move": 2, "mr": 1, "name": [0, 1, 2, 3], "need": 3, "nest": 2, "new": 0, "new_data": 1, "new_id": 1, "newpnam": 1, "non": 3, "none": [0, 1, 2], "normal": 0, "notag": 2, "null": 2, "nullval": 2, "number": 3, "obj": 2, "object": 2, "onli": 1, "open": 0, "oper": 3, "option": 1, "order": 2, "orm": 0, "our": 2, "out": 2, "out_dir": 1, "output": [0, 2], "p2": 2, "pair": [0, 2], "param": [0, 2], "param_id": 0, "param_rowid": 0, "paramet": [0, 1, 2], "pars": [2, 3], "part": 0, "pat": 1, "path": [1, 2], "pathlik": 2, "patient": [1, 3], "patientag": 1, "patientbirthd": 1, "patientsex": 1, "pe4": 3, "ped_major": [0, 3], "pepd": 2, "per": 2, "phase": [0, 2, 3], "phaseencodingdirectionposit": [2, 3], "pixel": 3, "pixelresol": [0, 3], "pn": 1, "pname": 0, "poorli": 0, "posit": 2, "prioriti": 2, "privat": 2, "project": [0, 3], "prot": 0, "protocol": 0, "protocolnam": 1, "provid": 0, "pull": 2, "put": 1, "py": 0, "pydicom": [1, 2], "qa": 1, "qualliti": 0, "queri": 0, "random": 1, "read": [0, 2], "read_csa": 2, "read_dicom_tag": 2, "read_known_tag": [0, 2], "read_tag": 2, "rel": 3, "repeat": 3, "replac": 1, "repres": 0, "return": [0, 1, 2], "rewardedanti": [0, 3], "rewardedanti_good": 2, "row": [0, 3], "rowid": [0, 3], "safe": 2, "same": [0, 2, 3], "save": 1, "schema": 0, "search_acq_param": 0, "see": [0, 1, 2, 3], "sense1": 3, "separ": [0, 2], "sepstr": 1, "seq": 0, "seqeuenc": 3, "seqnam": 0, "sequenc": [0, 3], "sequencenam": [0, 3], "sequencetyp": [0, 3], "seri": [0, 3], "seriesnumb": 3, "session": 0, "set": [0, 3], "sex": 1, "share": [0, 3], "shell": 1, "should": 0, "sideffect": 1, "siemen": 2, "simul": 1, "singl": 0, "skip": 2, "sourc": [0, 1, 2], "space": 3, "specifi": 1, "split": 0, "sql": 0, "sqlite": [0, 3], "sqlite3": 0, "sqname": 0, "store": 3, "str": [0, 1, 2], "string": [0, 1, 2], "structur": 2, "studi": [0, 3], "subid": 3, "t": [1, 3], "ta": [0, 3], "tab": [0, 2], "tag": [0, 1, 2], "tagfil": 2, "taglist": [0, 2], "tagnam": 2, "tagpair_to_hex": 2, "tagvalu": 2, "task": [0, 3], "te": [0, 3], "templat": 0, "template_by_count": 0, "text": 2, "than": 2, "thi": [0, 3], "time": [0, 1, 3], "tm": 1, "tr": [0, 2, 3], "track": 0, "true": [0, 2], "try": 0, "tsv": [0, 2], "tsv_to_dict": 0, "tupl": [1, 2], "txt": [0, 2], "type": [0, 1, 2], "unalias": 3, "unimpl": 3, "uniqu": 0, "unless": 1, "us": [0, 1, 2], "valu": [0, 1, 2, 3], "vr": 1, "want": 2, "we": [0, 1], "what": 0, "when": [0, 2], "where": 1, "within": 0, "wpc": [0, 3], "write": 1, "x": [0, 1], "xt": 0, "xx": 1, "yield": 1}, "titles": ["acq2sqlite", "change_header", "dcmmeta2tsv", "mrrc-hdr-qa documentation"], "titleterms": {"acq2sqlit": 0, "change_head": 1, "code": 3, "dcmmeta2tsv": 2, "dicom": 3, "document": 3, "hdr": 3, "list": 3, "mrrc": 3, "overview": 3, "paramet": 3, "qa": 3, "tag": 3, "templat": 3}}) \ No newline at end of file diff --git a/taglist.csv b/taglist.csv new file mode 100644 index 00000000..8c860f63 --- /dev/null +++ b/taglist.csv @@ -0,0 +1,22 @@ +name,tag,desc +Phase,PhaseEncodingDirectionPositive, csa header phase 0/1 +iPAT,ImaPATModeText,csa header grappa acceleration +AcqTime,00080032, Acquisition Time like 145446.685000 +AcqDate,00080022, like 20241004 +SeriesNumber,00200011, REL Series Number +SubID,00100010, patient name +Comments,00204000,REL Image Comments//Unaliased MB3/PE4/LB SENSE1 +Operator,00081070 +Project,00081030, ID Study Description//Brain^wpc-8620 +SequenceName,0008103e, series description +SequenceType,00180024, ACQ Sequence Name +PED_major,00181312, ACQ Phase Encoding Direction ROW or COL +TR,00180080 +TE,00180081 +Matrix,00181310, ACQ Acquisition Matrix +PixelResol,00280030, IMG Pixel Spacing//2.2978723049164\2.2978723049164 +BWP,00180095, ACQ Pixel Bandwidth (?) also unimplemented? need CSA value? +BWPPE,00191028, in matlab S.BandwidthPerPixelPhaseEncode; +FA,00181314 +TA,0051100a +FoV,0051100c, eg FoV 1617*1727; but actually cocaluated from matrix and spacing?