From 90cc805cf7dc2cda20b214d0604ee98354b4783c Mon Sep 17 00:00:00 2001 From: Valerio Mariani <valerio.mariani@desy.de> Date: Thu, 18 Jan 2018 11:40:40 +0100 Subject: [PATCH] Add updated documentation, which was forgotten in the previous commits --- doc/build/doctrees/cfelpyutils.doctree | Bin 157040 -> 66955 bytes doc/build/doctrees/environment.pickle | Bin 13920 -> 10671 bytes doc/build/html/_sources/cfelpyutils.rst.txt | 46 +- doc/build/html/cfelpyutils.html | 647 +++++--------------- doc/build/html/genindex.html | 120 +--- doc/build/html/modules.html | 12 +- doc/build/html/objects.inv | Bin 728 -> 516 bytes doc/build/html/py-modindex.html | 20 +- doc/build/html/searchindex.js | 2 +- doc/source/cfelpyutils.rst | 46 +- 10 files changed, 206 insertions(+), 687 deletions(-) diff --git a/doc/build/doctrees/cfelpyutils.doctree b/doc/build/doctrees/cfelpyutils.doctree index 5fce9a4c8fbd504c632809e2236a786e14a3748d..e39049099ba04b6dd292ee3c8b0dfb2695ee82db 100644 GIT binary patch literal 66955 zcmeHw39wvOd8YQIWi6I1WBPfyHeOm-?@5+-fdN^zz?<x{W#bI?wD0S_@7+G?*WK=W zTYAsNiP#dkxI@6S*_UEX1(;!2oDh<#kYO2OU?u}eF-y4u9+C_slObUkn1sN5|JiT% z?Yq2HOhr}d*M09<{_}6=KmY%qb55>%YTc^UtLR^}t=_Kn!bUTgXtnEJ(2q9JgBh<C z_TSpy{hI#c{YtdC>z)YOy>89xN2^ex<~N%4uGi{6)c03K8w0NvHrg#+-e2!;@Halx zui)kSun{&r>s54CZOUtQ=6Ih@$E_W6r@cNEN9lD(y;<rvxzHQ>92_*iGuqH`0YKRI zclfLQwb2F%-jQfsv(fVUM|zWPRC2?x+nDTy7#0m<ZKECl<Y;59=>`EF;`{oRJ0rer zs`onP$0PvjdQ()U7i|pPX?oT7xA|p%3-#!aMYrws+cVzY<1=oz;kFukU)k;++k1~U z(+)l7-u6^@0ub)C2D=xC-7Da<A5U}x4CB1p*Yqa+l0djZpub)Hj!O6TCTH69UK7A_ zWbKMQGN{=H2qy%DNBr{$5B~WWyni7Od=dV?0RJz=|I0Bje>We{6{5KRLO`+Jt`L<1 z)2pkh4?MLR+ib9-8XFu^#TwHKEaW^mQR~hHAz0(Vs$dN<S~b{<tg^ajyrjlKl&|5k z|MFsZy4k|hrru<<J?Qw2*6f5^uS?lk-)PmnS&Q3+AdI9yv=KbqZEyyxfQcKeX$VUU z{=vak1YUOcql?71@zI#+`x}mgeV6F`N{~jvA2o_Ht|E=V_e5vz09ZKy;H_z=J>{eU zaNg~!!Pl#z&5&1jy6bj)3p>$G_d)YCLLk7IYImJREA+bUj@NZ3>G7O%q7nK|=zGo~ zVvfVN+~EXLu$1PQPz<sdO=%ADXMnC_`MIM3b+F7>RrCaQnbs1w9rYW5BlyCpwOgUv zXa!E!Ys_?-9_e(K6gAO|BNWo+O!Zn^dk2o&syifloE{pli`k^X@2dg+qlNJ6&p|t_ zwMPAb8g&sF^Xt(|n{BsV)hs>jL5YXmxyo**(r9VinK^1e03mo+j%N6Y<i?W)QRrv? z{%9R0-kK#BYWln%voqdQg9fIbu-A>vqfT;Hm8nM4qseMFmy8OUKZ7?yT8ic{HLLsU zqp_5MD7i{4V+gtdl=)CTf<~KXXPO5BO#M)Gn>t-D@Vdu6J{x@it-M#X5}jN&Ej5y8 zG<^bpn>qdlk#|lq{uSOvy^f>ock-dk|CIk}(&C>r`0+o(XLo?NlY>Y46^!h4n+@0# z7Lhk8h7gb`p3>!0%I=Cx<v845x6K4)7%00!LHi7#{YsvKUm6;gXQs@)HavWMmDWbI zeyTxs(-YAKX(vSG(aa1pkDGiDLyV}`Y;s!qpCgpM8-2e+P{E*7NDL`Z+YVM{S;f-0 z`|f}?aa=P&DShG)+G$2><88gcb*$T+(|WadMMHtV2h2ar$2l}anw?GuX}Wzi;QpTk zw>@b+a28e~_asbFH1AJ)VYLpfu7&MxRiU=JU(Z_3RJT2&kzaC~GwmRBj(gon%ycso z&OIK~CZ<4}1jedR4T4NCKW6ykI8nMqm}Gd!O%Gj&6V&Z=JhzJm1Lv4G7pOvA-j7$e zDP1}Ylg0(8&8DN)RC4|mEo-C3bitw6;{={}Kq``dMh}=kOwnW`f=CiQS{&GFFc3KF z7lkCk|GBg$h8Qxsn3f@XXWUlLZH^Ba3KM=f(^OhMPf-Ktb`B`pN`LqoGS3PP(#v7p zlq5XSyC5VrEZoVa3(5FX_MC(7!Cb2bp43*fDd_2PrOQXi*yY6Annm3Z-OS81!qU}O zy4O#+H(Y<^4g0R#H|1SluX~f%UVH6z*G_rfbyr?Db<O_$*Ve9^yk2X%_bnL2=T5$3 z1dz|2eCL9}H1s)N&}VF3^eI{NSrwJ08eX$r9hi)jVF$kme{apb=9R2EXm6D6Rx`Zu z09cRoD9})uU4tQ{&AgZv*i~Y*`{>UY&3(6{3YKcJ|H*cJZU{bm=2LcsQ^8Vjw=+J@ zr#u2%Fe7PiCAgRi1wW8Ix(!PVtnr#v)N8k<txha^LpnJ|7$EFO#sH%&<h|*5wZ>GV z);~q#y+e%m6}+auD_Y}J`f;quSFo5nUaOAPZFLr{SnvrVVF)|a5WJa=?*@&)Dip27 zxRiq6-{Zab8K4uaQv%jnMp1a?ys3J72FtvDw5BuH=fn19JIzL|LDtbmybtF(FtpdU zCt07D58W=Lsm~Z1XAk0oW5*ReYV54uos67a(R$~(lW%oKy}dxQ1=mPJOrUWQWt9XQ z6EwD_w9LW;UseM(Zb6MK#y=#6N{ru|Ol^`)h@w~UqHHhz#8;gacD3~^+9>S}MScBS zkD5#8hk0|UjyWZrA3#wfo$O|-H_41<^}pYknMUVp8KmV3CIfCTk!eMA(mHxRRrQ#n z`P2rjo~E%Cm<P-3(>V|)sY{4kWa@4a)OEN(N&OUirZK{){H+|oN*(+sgbA&K)2X~& z*~3nS=q;D|Y!Xexc@rvblPWtPt^XqfG+VE*$5D8sUSTKcEvX@?R;)gUl*{*cw~4A( zyh<L$IvVG|2!6hVBM|+KhJHvj3gA;U2^L{x_T3DiN%KqgC5|Y>zNx*l-DpnPC;pf) zJ5y`;e~setb@Ax((FQpO30~QVsYXmXSZoXLB88RU$>LAhfi+;6jjgtDmOp_}`)}iV zfLzo=z*V9gj_$~g4``cxoJSJIrH8;%eu`M(0r#GC02)sNK{puJfb&0pTtg|~9B~a* zG+$gpl^$%k%x(pO^D9=wwAf)?g9mPQV1V=WuiC+v2?e7ZQF`zqUO4VEwID3+X^%IY z8o!7arMMi$FU%afCmyj->!a}?oP)bZ)#j6Hpl8=&mGmsa8bp;co7Tk1xn5ju3|R~m zL)N{C;RqdL;4vREMLOMf%?l{{r9%^l^$g$?%Mt`XHBOhLZG-w*f%@Y`QO|l*gGVYf z%Pv5e_T4&z@c6yH+wq(V_hHg<*Y<QOmJ<?&=)|R?-%gm;MoO0qO1wR8OH};#s0Yzb z(@G@>_Bd042{phtLA=6kwb~-oWG{<02>6w4tbS^obEE0qxe+eC%<P?lQcvlMQCKu` z5XWHw{SZSaj~0ATqbU|R8R$XbAhk>!F(1?8%TfZ${f=M?Ggx82O$~4upVlyz3@H^z z_M<oipDPRj!WGF7d|5-VL2wZ7z2bjOKVK7QF9&^%L-GtDNn7M83?Kl(zQW7eEhDKz z8t-fHHQw@nF5L2Ht4KkC=td$IOilJ?bgRQ0@|TQs_<#9?|5x$gMx2@Y{`Vm{KVY9H z&_zIlJ&Eta0I<mZHww98;b=!OcHQJ6ALf8_fQ#sXhr=G?#ScrO?20zZ*9KYU5eD~v zbZ>$+V^(~$Eum3(nKnufilrgg>a_ryGJ)V^;2@X|xpG*K_k(n=MC-VdMz}vVb>_xJ zsK*<~bYW|$@iO}bp(!OP#&Vg+piyiwv;(aSE`~NEAtEsfH9#l?JLd#4`kY#^Ws@9m zw1IncYVhP(dK@`Rc#MRiR-epe#+@}|+*I2t36QZ^;6b33Qj8S%VLy^wvVhs}>Zt&; zpcR^rBiPc$j!yl;jF_*=1nC7kUq(ZW@Y#u#m{K@ITw|xq##@aF=jBO!jDjZ(H&WT% zOcIgH|DseGDfE}=S}Tkd<3D2u0F%+5;#UFv$)(Z%K{S9%rA=?tBWCx|S5A@vZE7tM z&OO*{AUsG3P29=vw0bj>Ue~!&QDSrfJsGiwsiQLcm%8h$S)YJKsEECoL&zoWRkCuL zx}$1X>a(OVnh8p+oK^UpT@PXA8kgNb-!^M;>$4Z(0h>eD?8W$IukM9FDG({QV!mt4 ztAnLf1Y~-gUW$MqDxwIe{D2}*j}Z63SIuaAUVU?JF0&Ouq-(8^B2ZYd6v3|pCZh<% zuLUXs^r95O6MDq#ee`vnieO)sBG_l>!#+VBmD$I1*LfAeDGni51ivLK=TQVnV_bkD z_%ga4sR#s!Pz0kpQ2Hs!q8(jpP(MjaPUxm@C4$5~VAA<GZ@skl?#8UwywmNFdZHxr z%+>lODdvoBY(O0uXPw{$KgB%QsT--x?s4Y!I9(Mmco(#@S`kEQF)nQd^)s#}zAxEG z`Dl&Y4bBfzO{lf`U+9WauzZG;9=X(=OSUxssUBXIY%29hOLK!1_7iG=D-&b6ZMMJ{ zOCsw@oGu&Ip?YCEF0p^JFyAQIh3hJNWxje=sV{ts19C0^Nz*ZE__QuRo0qlL<*Vm( zyK@8WUbdiibu4~$cc9&?3%5I3<*2dIYCj3JrY8Fi$ZaMm@vFcj#aH{A2z0sHe@^qC z#YqG9>Ef;S??KNtw`H&P**XBIR1JHG>ZdI7s|iG@u<d9f?-Ku22`$*(fQ%)61JwtX z`0PS-&m8)=h&~AW>|z2*F5B59^!QTxxC|eIi}drs6oj{|nT|3wS4cy0L*XvKNVHvm zX}-Ukx<uDnEw)0xEYB=B0YQ$L<qBFLt+xWx3c-_QlyA}FrP48zoLx)E7J@LOncgM| zk$bA8)NuBsuC<~FF?Ioq0FhC3;#UDx#{~@w^B5YH+WSpCTJ|COI!|kSznXSNEz9?t zS%ZCwIx4eI>aMe9d;*r1<!|B;av}SKteiGeDzi6fjAkYoG`j}P-l1jrGw6EQ8s~DP zKwQYOeE;l{$v%vZ(@ORMPXXDNCX=@ASebZ0%Ko4g^<Bvy#bp0kU2A1zUn0bk{ci&z zBm3gl!eoC|uf+eW9xeM@`Z`b9FSHW>8Ff@<|De0hEBpV2L&#<SC$e%L*-skd0%U*J z`V`q0ATCJu=ax+Nu`oETWFPPpkbSwVF|uDF9+0v>xYF4JBH6~Z5vM_2uhtth?^krK zm63gk5Cbf`7!VoR7rz!J`*T|MFV&-EH_+F4%6=ht{L85$WEbnM^UD4u96~PpH_6I* zWIt()3y}SX(e=oAUx1j)3zxLg%nw$~3)e~nX;HjzuW;+E7lhRgIpeA`@WxdUjH!0! z9trsl^wC>=<MBj<4iBU(Ofq^IP+CQtc2{IHT`?n5sW(gJ+<Lv_+WgiCIk!&gTG12B zw=~N@n^fCc6Gs<jRuF1Bvs~N__EtUkEG=Oxaf34UBsIX*n(@b#49&%Y#pKEiy~5cb zR_Qo!A3@t`8c2aeKDrO&EK5GGB=C)DV2`0GGa-my1ttXU^LmQFkv^}-@m)-m7PeA+ zUWX5Io#1f1IHVJJfcAJJz$U-OqxxI~N=K}_p-YZ?*U>5i`zh+!G^4W*7ppl<8}?-y zP?>#Ek1LCJ<jV5&k}p2deL;=^UL=z^`*ukHp6^MD*$|-@&_-#X`);M7FAp4^)^LBr zJE2ftx&>$Uw8DnlY$A+7&9u9XY1EVZjF2GX;YgsGhi#8R=*`du$eH$WY<a;JY!okr z?ap`;`xI1#2BlVNioUZ5eAsrlj1U?o`BT9p-z>@`>_1Trk(Fww!(ND80m?5634^k$ zWbbh*v=8ww(Qlfz0TZj8PXC=i9Fx*aTM^T@!8~j<oKxY+Vtfmtk?%dUM_cd9o}A-6 zfIX}ooCjr@26`hbu^`_;D^j@xV^r9k7LH<SRhsalHSIrUjNNQ7kvkKA!Yd?hj}fn8 zu698%Hf_Tvz0nf1#2mUE8?q@PcOP!eC~7ChrSCo*+9kwxqHTi!p3hch8UaH)Z1kJN z&4>E!ZHq{LEp^diwh9$b(AsM}GfNJx@q~&mv;UpJNhC#b-w;VrMwCHqYWxl_nl12p z6Qg7+{aa%QtXO8ZXK;%p>aRf20;2x=E(EjddE=fq#K_^|uFf~2T?65Xwljqdj^S1N zDch<u=eXUjI~SBnmCJ*sJ9+tdvvCaj4D`ISTWpZT*)!N895#-7%{hkxo@lh)#m-+B zXU55SqQuPsUX>sFKr;_Ne1!KZK|&fl9iMch-SSB7P#NfwZe30<t0E-EPc>RNTB+Si z-V~0M*s}-9RIyEZrf(hP^7;8A;<Ug69SFD%Tfbw2x?$dfQjYrtw4hm-wTUOoY$gX6 z9~0~==TzE0HO*_$-g!epi*Q0!TgK4I(}EnBX<lE!*$N~fuxM6JMhq2RE2wZXn+iOt zVv*qS>?-Ur(Yl~ks@i296&+J{6VZ4wM+Xm!4j!aGxe_vzhX0iujY|zr%5#x5d~6f5 z)bg=snm}CBKb-?uxv}}vgo*q{on^ly*gB)O1w4}hk8P*0OHp_rx^MCUhU^p_-yb|D z;VT(^D#Cs-yPTT330H*(o6f;v%P&*rzVhFsR^q9^NlWX|wRp^tV^yRAn=QX0+iumy zB-i7j`1x+YVNA_A%a$+T*t;Ulu{Y4{0z7#)4uMG4MAZ$dq;&TPi-fx<_c-ldh_y+T zTP`<}C9&kby>mdDe0oZGg~+$JQ`d?fT}I#D5K*{;%sBIQ45C_@2g5Jo>g-ZIo-CJ( z!UDxy3>MfW)WCqd?ur6*=78EMc4yd?)iB}@<3qR(5Tq@$72xF5yNZ{!67TF4Z04f& zmWA|m<`9dk!6m$jkMQ2Y{f<^y3LE6MOd_MH$+n_f<F*vPin=W?C(xzaay!0Dx255l z6u0Fy2Z`;?zH;~|^dd$chbG-ya9==saNni&Y0a~?#ykrM+%kJaL!BidV%i&9Va33` zkSz(c?S*_`BfKSqQaW*11$*{5v}qX!g~L?{H<89K)^zY38nlvwNUSC$<|j%=<>7++ zaRekSIBCf!>K}KTJ@g^Ye}r$7zm+HQ(u&oEYl<IzD$nFCNiSx{p9>l_x9K$9IY^80 zRT@~2d0vMvc}F`yOVR;~Guvn(I_bG^hSJf>E<c6R>EPrI?aF>&%K}ki77+h`pv7?i zYX$e8EXw`t*Qkc@wi+&625)O0{iaO=kWS@oeG7p&Ca11Z-c}gOlQ_K+XK;=@$8Iyd z8FW+(t#==^Cp4$hs&jeZ4qM{Tn8@IK>JxsWhI7Ahaw^w;C{i*4FeHUy`iwhj<CCSF z)#48|o%x#PGa0BezDnt={UooD=&Tj55*9FVXYEFb1~muj-*L#kngJORRXS|HoKe(X z2o-hMK7+Om5~RacBVov4tKTF#Z1vm2^CADR#xWV1(M|JdF|OA8nDPih+cY*d!6+x~ zCo+&vbov;zT4uk+i?Wa7Pdxl$xriR-Lcx~?r)hj+^`>-fW4J|%%s=sACyI=Cl_@fo ze_)g|;G7JoEO9w2qo^$|>{$Sx-*3RqMcW1eQd~3whQvj`Nfa0Tb}=InTFWeUe1o7Z zCOZGX8N;NHC5TuN(fNeE%y24qb;#@PHebaf0~1o~KE!7qVV7a1@!L%Vipi$ptMG}^ zt#qC)ocY{vLns+1+R!;g#~V0A5o>k$`A;-(u=6Ax`qYAH6~cOSdm+x^49R|L&P|kV z_NLrkGekI`Eg}PzBbd^7gQ}(7iDAYw>;b6hA^uQPkI!C5GC0|Aq7=p3c!fk!6t6Nx zag#!;g3mmN!&b|H%@W9mGm0)mAU(8g&>#g;jx`oTUHvLGB7BPv<*^L-tfAz@;?@{X zs*VSq#({|P1Mx&g(S_jiO}X)j11V&->q7(h{BQ<*L-+*44yjJf%89B|zkTg#AnKZs z(dhsU3=zUkF;)HY93+cbIjM#d`v}byW%j`w6MzhV(849Bm;6n<=%NL<zmsF=GVJjz z;WcY@WpblFevnTJ`keNF&d{#YVVNqJY<VGUCqk(d_aZ2FL53FrH{DEl69;I5(+ewj z2*mOFbU_fUyBa!k3a^xFNzPZyMXVxjy0R(jQS`BSk7#8ERAEgU{OjinzEXAbZ$Rq^ z_H$yQGW%H$wv!QQ>328>wSLNLu~%E88d{Y<vNE`a5?_Iy4PLiz=6KzTKN-#v9%HtU zTFS1XV$1^n>B>*Wn5_<eoP*Xf#{7509fe}df19ImsbooiEwYl0#gnsR%s1sgwN$n* zC3@ypw%W}?KqQ#CU{75{GYz-0Uzq{Z0?aAX<&cefZ$_^$lE9~Bc6W9;6=^1n6(Vms zAInIya&_j9G;gQbpYyPZp^ffJM4F#Po#aUKzrv`7H@PfIr1_A_8=XN8*GzAw%5#Tt zFWaMDftd3(DKY2K9V{UFeA(z$mvalrhd`Kos!B!XD9rqRT`PM1@`ag4V{B;mNI9*n zSn;G4iR+e6>(OR~*c6T^2yJl0K1B@-1fho_yYt*L@+GvLHdQK+D7^fIoMkEangqU) zfA%gkWrDBbSJB|>X9*k`e0>kTOLb$gl@fft<&el0=Z+vL`3}iEnb~g3;Yt86>24(a z)YcR)uL2f27`sTVX|`eCqv4d<b9z)+oFit6vC~GJc$oIjCHQujHu{5Nn3qc;#~ra8 zQnZK%dQG5!wgb_2fuIK}PnS4F>8&6zoPRZJJi!T$GN3Ad$%yUXz7tLGU+zH|KKqg2 zv%f3KXY7YmLxe#Mm6st5y1taIuE?z<ZO1hz3fobrgArj+_EDG|@x^W>J$7^Td}23z z>9~;nCQin%jb$mFz~}J_iB4egD#1FAhcI)*W3I`7iijb@m-{n{+V*wP@a1)A+aN%? ze>DPzoQnEQqEk`7y+A~+mHrsqZe-k@QC3MPa%$B!lgvz*5D(!d|MN2tM!1#ExN~^X zbhf=x-PQt!59Tnwe~xaPpTNluL;I$9_#}yE&mGl@@{Noxpmh#kZnZK-XUHk}nehsV z{48E&^7GE&aVn^jUd7>kT?V`sr=QFyYI8cf4TTFt9^ZiC1~rn?HEM=9UB5}>bn!Nu z6Q?r<G{lLiO)9tWSvgvj9t%?BIhVA*z_f(jg^P8W+m~_xDQBBMLeZ?*#!3OWMr>sY z`0XFKQwckjlm(+Qz?4-gEETd%wfQm6+M1`Mc{Tt|_GdKCLcXbQ=0KvPG$C=3DP7Pv z^`jiXN{auGFp*(jSQNMB(*#`w%_a+IB5_5zX-m4jvjA<PIvi3c>oWR;!1F0;b#^)B zl_FdfB5b-2kzOffdFJ;@B`p(2cO|@1q@$C)QZE4lmdGphqT$)9fH!J9hd0XDu?z4* zotFTnT9GaJ7Kfuie?C>DoEYSLx?9(ZUcLOjCmZVnn;ep?5a~=$dKK3bH9e{<Pl3V( z`IrnY*d#SD;A7gPNGS{@<6#<jfy*d$$v9X&w3^qu^hnOK<XuVv+{iJz9ZebUlK55B zyW|l#(z|pgzDw_t!BdKNY5$?FhpZth-(1|y>Y7Wp6~Y`b`Rl2DK2<f&*;52)nY~rR zo5c-6myfNuC~$w#n<dz`zvzLNB8UBubk><A*&sd#E|im4bt(rPb8#*_NFkE?#a00F z0nxR&)uBt^&8ZRkK3!dgUpiS5r%3FcaE_u83nuauB54d~p74W7YJv#{w*$b#2sace zF8g+Xe?}$YeZ<i+Id@hVS^Kb%wGS4RHTD6jA$(_s<CnpA_B-e|O&QZdPTIDgArQyp zq%gvFX4$rp)@I_~V!AN?;7DB;mrC2Q!sTM2QkmqqF!Pg~QOyHQP;PI3Edxi!SeA~7 zf6pr<Iwr)c1Y<w$XcJcwOSqEmL;g+%Ohh;7W_vcHsJ&b$>SlWmZJXgs=Yt;pkn=&m zNpwEww{t7UCz|rn3Ic)Ins8y;vBr=Y<sAG{2APQ?<dT{sIp@mj-}0i1<~$iYBe%La z7ex!Gn?J&_B6N#k?3frjMJDl}7-#rEj#7!-x&;o35$DG7sU8Q#wCbfgwnn*hAQ>V> zo{Jq#!VEALgNQ1n#*s2J?Y^+!ah?vt9LT?W*+K`UytX$NY{+aavQ9%WZhUqFF=3fq zmxFC(PM(~|&qS@Oc&+rDyk9#VsDYVk#o^G3m)$0C{)%jz^L#xE;kRU0QTcj;HmO=w zoe5)gurEgkGGA{GjiQiGba#%%r2;42xX22;pilJi9KcGu@lnD=e!FpgKG7#L;IWMy z_G3(H`6DbNeWGv5=u@nt%j}KW<<!hfxGF^0bPkq2QMIDT?-NaOZjA0q_(Tb-$v)Aq zVpQoqQPXxMx=1XgQ~Z_v=pxIRIj$BO<9sDPE~@uEWhli8PpHD;{&bueN)gY#t8Tg^ znr-&W{uUv-{L0-O@I90U5(50~>Opj&1<QjIetqhi2jh)PGyZ(594{6xr4?X~1`%=r zO7p81I?w8xx&|NAxfs-Zuj8~wY>%WOogn?_`~(^jX2g&OoXZBX$Svx9HI1fT<8F!} zt?%~LwlgVu{(WHsms8Ub5p;*^D{ek~4G#QkdV%)8rIgTAV?QSR;@V@4=DcpUWg4@^ z0<qzrIBFvQ%6JYO5+#EZ?wabhYhDmgBoY=ZVTpWQI%&X}>@}M8pv1TH%fu=F8l221 zIKgq7@O;&A+=kdwX^^{O{TtG)+sa9|hW-?ovd7qJsv*2KiisB>RxjgTj#h{7T&vQu zq00G|m~nKV$FMfeuiu}nV<u8s9x051f733Tyf&rT3O@pZKyP7p6V6<rbFikn?Ota% z2K2lUP%Eo`<a<p*?x(plH~mz+gJM4y=~~g_ORjy=2{91-8B0O0LQQI!IC`$u1I^M* z3Oy7KGU#Dfac-weW6Ux2&mT!<;c~Oio!S~Jss=FdG!F7%^qA(IRDe<<@=d&~)gM2| zRj{1u%zhN_>1g4ejLD)54P`?ps3<6vgg#S~ori8sP)huY1*OhO7LC6DeX#rw*tG<< z3`kvo??Qc9lu8LmU492b9XOaMwk27{P+Ddh)U#mj@*1-&B#_Fit0BwcJYh1At-K`i z*i&1=jqIVNKRW$4&{-O<12xJM|9XOJOj3D-Cw?ATtTFj?DnZ!gNq<U*)3i^90R5&T z4ro3X%rTI~Iv~>0{2h3znS`tE4`vMB_?V@O{e8SbqKjR;%5<@>#rTw7;NRmA{cZ+C zL=Nd-|7=E4d+k}&!Tx(_+YDYh*!AFt9PIi{qJv$(JwKhM8WT}QLC7|>X&X&OxecmC zA=_p4?hJGhW@Q%ZJ9yFbEY?HDvM@Z$k3Yj1AVQ6G+|XCtOQoI3X1jJw8N0A(#atCX zQp%nyBn#V*G>$m`{xD-qhJ=!T|Atpc<X`b>q5QjkTedop{JSQjsLj9Z>i|5z?}Tkc z+h*{RfA!#p_*cJ4<X`=EZ&CVcYDI;sg2$=fVm$u+41Orc<LB}v0V!QF36Y--Jv=fY zdt1D)(s6^2HA*-G-<ZJzhK7=XZ{QUY8Cbl^W?&3L0k@XE$052W10qWS-<45xAq;#J zZJWVM2G)ZgVqpCyk%7hAY!!KJ#(;*{C$&kHUj0-Krj!n5vM_S`Az#CbE?R`}tvQA+ z9m{V<(JV8_N=O(N>D59y^w}GHJ|I&@SiZ`@(N=H4TAGKWf)$}=K1|~&;D5k{T{(~? zDN4v%WQrCH8T`8(z)H&gAz>oJz_lo=_wUm@ouGH1rF0QZAg=blodMGVG>7SONPT=O zqgRMGPp1Bp>~bn_Ko~1T-gJ#20|#mWls|BA0kpy3B6M_DB5?3^)JYB;Y~7AGFJ7~1 z)f0r0xABIhCwojRB~9CvET?m1JK)F3Z8j=kU>CIg+j)Wo<X2A#7F=Sj=O3Jas}IgG zY&A`e7+h=>Hf2YJ4RSVJW@TVCzn-Dk!Si$t9y@Rr;N-NS92%1eAY7afK+xDqj3O8q zqhm$=cmpk`h7tzK4#yJ?#p4Mm&z<JTil3o7gPIMTCD`U?6!NqYT82zDrh7P2kd9)a zm6>slFG^cl<*@@q$1=NKlQXYBX4x@nF&&uA9G&$lJLDkufe%J26vpAN7=`pw8q$}v z4?~Pw1u<S;lo;$V)eun!#q<jh$QJ_@$GtAD&sEAO7#(cTWrPSK;xLh-qb7!%9*8z5 z_|*iH7Hzn2xHarkCE2M`KKF1~;k-1^)XF2hkfs*57FcdlDHkvW7^ZZs=vS9fF(o2@ zAi{t>B!je9cu9H{$Htr<SC$r0*r0fV!3LY<d>oG_Y_TXRKruT^hTrXqV$b66y%Ei) zIaC!?6g>EioMp+SpELqvhA<aR8JE8J6?5s2rLd*)>pw>DNWXp!-=#@qFqY!iKXgbC z)q#T(zAd_xz|nGRwmwk28x93p@YLE}+@vZllW^!5LcRJ~l(sZk*vDxoW%k>8L|L38 zEa9=!KyY|K;G+`o*p&2<dua8D%Y&8vG&r8K6WKYcK^rKnyI~XHe38yv=wr$krp}%c zSqC_jq%qwR6v6giB8DcD?f{3E(E63`i>Uc-3zy>JN<`2R1n<?boyAkPOPGBwnxelX z&>Eikyx^J773CTByHrC=lZkYD`e+xI#L|r)Fu-v)M<|kZAqaTRPej0>oS0bXFljt- zYY-D$6$w-eshMgwo9z>LQ0gLuC=fe;#7&X(02DzQgxFq0hMt2fLK<~E2yjL;_I0CE z?B*uwf^z)q&qk{xZ$iKm0fstrTIy*}T`;*T`Xz<l(Dkc=u3woiT{l9J7`kSLyP}8X z3Eu*-$kguQq;3*9uT>Ak^`I_JdumOCbdU7f*r|tPpnAJEsebQq8X+#3E@^(D6Ts1g z)U#5;jH$Xz9qw9&kr}EzE2#G0@F#6<m3mvr;1<y8+u2oA*ym3*Psj#fBgBG0(cQU- z`AE<0;yxVQgLBLaCHaiFbMlp3EXV?NJB}gV5_Pa^2_QGb`LQ6*kFqh%GpD73+zR6S zuk0%MiF0Qj;t*Ak7Q{trfF?NC%jn%9v094OcSVcbs-el&9o*#Ef<FZWW;<xIF}q5B zn*2(PCdk^OS?2^MG=5Wou_w6ZqnogNkIn>A^U$!`qYDd<8dK3o&QkZZD_X)H4Bajj zbbCQI5o}qaZ66nASIJK|cO=~oyUhRsqzu8_ghTYZ-EMj?NO%iF^0iz&?uwS7CqvI0 z1wCJsO&pt^XMvvAWmm~h&+15e9_{uPMowyAh?>jO->zuM`!STfPf+sSY_iyt+yzSB zm0cx2B|iyDw&-3MnHGf=#PLSEhil}eZx=Vi(5+_Bp|IXVT3^eO+ydPr_WO&4AQtLk znWt?_TlcnLiPq^j%HTk$<T%(yjk8G6;xwKira9?#C&Xj1)p6jN@B&PfxHqL@xl+TG z7=UswtxV^JiDm>79n0njn~9zWCYt6|aQFKbo<&sUig)Pp_w4n^&S5GF<mjoCy^eqs zCkrQ)HlyJM%j^xsMpMRUUXxu#iNvq+qH#NX`@uNR4UXVlW&}e;4fwoNnY||)7MmDj z0RJ7?RnovO9aM`qAs&`=Y}T(7%UVwi=uguC%j`4RaM+-qhbo`Ut`Y~`_!tK>>!J<f z+Qxpgdc2RNmq_>+Q>!nc^J6)Bn-gOZ3_iLy>fmE^l6#pYE!0L=WZyss>^~4BLom_` z(OS(feY)*m<v@tcM))4#WlXxON2J?Yobw3OJ$!tQIrhS}{YW$!xHwi``s|ETkDLk8 zWm}>IFS`<6*$34ex{LQ9+=$6{ifs^3DCSi^HRtkx#?La4U@{kE*4IyYg~Y5c@hTzv zg2k@e$~@WP%ri4rN-FVoTSiekd!uOL?OABs3}5Db>ERFMed#xed0+bN!%NNzn!wT0 z_XU}yk=eNfqorTCgv#v489Yb2LFO!x;N?te`7STIXjy1?WN;P%DYe6`C|W=}95b#B z;dCTP=NCX}?>#93ddjb1Dp|geJ=kOyidsBmqXPsYY9LOS;wMjV6H_b(GEbCXMIkcf z=LOKf*$;b7bGZ<rG+N<$S~3_Tl9idCgUIq!2k9!i1hwkCR{E(92h5n}g(4`}g*0JC z`j{B$T=qz9^W;(t^LTa@b(Vs_NUG$kvlJ{mx;Z+KXDK{HqbQUZ`7d%bE|m<)?;<Oi zf{Bs;CI_%m*?gQZk>3<ClWoGh3?@rDS?Y@!(AbkIy9|Z%?*@?l4Na?mn9-%0I{qNL zoSHfaQH7|Q&b~4qQdy`fT_v@W|JM+sq~QJNS|T5kkeZwi`G4unP(I}I$nBqy51A*2 zF0ykB$F(s!Dl^h9J(RtdCq2?Z=)9zkPJj)H)osN(OTn>nBaj{$xGgt1HSz+hpeQ#g zEiy-wWwv2w5e-8rk!y7go)TGEKn9i#VQefW9rA*tbV$NZVk)G8EvgmHI5MrKr$L%> z!zqxL#Zw^3nBlaHXFNz}<*q1iaWk)7M%XX2OEeMkCXy^0J}efAWsAJUPGD4rAy~&P z@T>uTmI5xF=4PO}UjgX@p*}yM?o1+i0rz<(;1w%R@3_}&cPPS%91>vv-a8H+a*pr} zQ*4U6!<}p+-4usjdVyR$Vlp@lAu|NOMiBg}q6BCAsfNe`QDU(GQGGGb@2CR3t+3i? z1s$BxkNl97gh?YNL&=in)kJc$1IdyKex>Wvk|i%lZm|-yd)=BhoGW?m2z{z$baVkt zB<@nUKR1O`{vG8=-lJ<pk1m788j0_L{K#{Xv8a|Hqh7}`;_0zvDJg{!%9Au0VRg>J z@jS^5f{+3dlOh>=yem>a;{csNdug#~1qLNX206=8Vq_A?#@1nXqA8OYDSpKgBV)&W zaJ{BxH*wg(G{GX1BJaX?nG|WzladrUeyb2xt_=s`F`US9g5r{`nZ95xjb`?C0<X-T z(oklRUYNLJE6n{o$?-`EbZpxC+)?)!LR1n<g88Jk(y4e8(-V$2+qv=31Gnz2%{FEy z@NYLyu97;EPgM%-GPh2kog*Bs4o(=p8L#dIwQge)lb4v{w2S_3q_ZLe%f7dIl5!wv zf}{VceHCUSC9O$WYyi)l{OD;j0K-)u6<qb<qFlv3L^Z@DXsDZTrbV{@tOTF4*s>HT zEoeW|u=2U!bLcir(O6!zrwPI_sp_(Q>@SfVs1K<?`YlbTPA<+AOfhh3h0>KW;HG}Y zNA!)15t*f}beR7!uaM|47q1c)=5dF4#yJ(wWk5tYmizqwJfo<+vM=f`{~p>lgO~1d zJ@_Gaxqg%AF4u1-@{*Oy>x9`s9_6mdRTUVb%&1q}%Vegm!FZcc)@AmU41^NyrI(5L zJEuS5(>Yp|{s<+^$|6h$nfwt+^XBMU!XNPy0F>;H*mG8rKZ4t-3I2$zMQmg*>c_b} zkMcv<C1XqGJU$3otEc!Nw%^ImgjCas)^kJ8wQ6850v>?e8|Y7NKP7n)uGKZT7vahU zEKSa~EO^Iw4t5TE4hEJL28QTpQQNzUMNlKGR?}Ps!|s7g<L-e&hi|z9ihC+NLFu|! z6VuISW)Eb}(uNuj2x{D~ahuopTDsv|q>h<Y_honkDr)hMl+0QaVIB`(ys!r2gx@Fv z3kjP_=Nyj0A<QjN>ju-)0@GemOtU)G5C(~2zZhQbx)obnM4(*6!t`bfC+JNImJXZ> z@~<eVO6-~-=5c#r8+lian%it*6UR)a-3`6^?gPqJS@d=dE_wnN!F+MCeiV<qkpz3n zoouuZSbm~Omu{3%E+Tpxcdj`VR~@~{T}nVm`$SNZTaK`W1<Ak1M8GY84c>)Yh#%~Q zBT#`r!CkP*XUDrPA=0HyM#fikTES#!@H#<**UXm&w5KGI9}f}@=;&aZ1aw*~WKNxm zdZ;@WgivLJ*AB&ZbT2|nX1s3^<NeL~j<+;wym!-h>4=1s@tT8jol1-w`LVCDy={hZ z7QbPGjrR*|ym!9XIAatxZX;|Ut<&vJ+xUPGAz%{F!qeK?k3zi}tUSf$A{|i~*x0|A zO&SdRYk`4}&ldx>NfOh?M+gJlB8wq_cDP~PPrImS0j?%1;i*=6v3y+?V+Xw`U+iWL zCVpRF;`io@i5)RsFcxwpN;0UT?aIm$nZAK_`nY^$%*oWV#$f@P&Z4t8+UMvn<^aLD z+A(*U&MLp?p}zluhx)PCU`6#>I@M^ELPwde6(%V+FxR9l$F;lAe<9Uf9c`=i_{QL> zbT%G|&QMS26pQ|mXj9;YA!df4ADvlm*EpaPIJubeo$LK*!~Jfv=LIG^cH5C?^R(B( zbc5&v>Tia}$HQK{nGSwz5#3bL_A&e{$)CM$6Th~G?OJsbW2Cp}Zaq(N=|?-K+U>A~ z?RwVB+gC?h1K5yAj;_wqgx1HCZIoNrsgkUcbfU>I@x*I-{7IFzQdFgtMLo(2!tBC> zGrAtx6V)c>%Vz)fHBrfToBHSa=uB@GwlGE$_5xLCeYC#rP4=cyeH+YMO8Y|zoHsRt zC!0gs1Vw}DpNh8ebf2o%s<mmCX+PTB3#Z1fAIE;+eso^^W!39;+ubVm{??mb7kDO6 zYhgdy4u4pu7h0{X=dIvG_JKD8O|XB2q(s|9y9S2!_Z>Yvem(k+zZj?-?VvFPKol<A z=`=B>ezdiTjmbUmD==Qi?=@Zv4BPc+6K%Ebb-*9!1_3DGK_w>wBaM0$iS$#ASu9eb zZDh_>&7){d15CBG-ka%EHRA!X`~gp$$B~cJ;CB85*lh(we)Fgkc)fbNIy*xwwF9cF z9e7y6U@xw$$+@H!R*yG=hG5a{I9(!eu?rLfp{z?(+^7V?e_?b61`|L8cx(;tw#s5v zKJE7*rQ14Qr;0Io*kcb{0cFmhCp2YNiMJ!i55rDyVDH`&Cr)4?MSH?0+TH2Bh~n)< z$zX3k+C?>}MXFH^y%}IR1XefU`S_*#t_E7Rb*E|r-Ov-$&3USu5c_|EiG~+W@oxNZ zrim^#hwdaqpdR}D+c!n$gP~@sTDCO!)c|_N>pu}8_5o<%-o?=&h=76P2uF1=@|Lc9 zLjQ!|?Fi<O@j6@e8`FLh|G}o~nr-6nGlCiH!W9|x0cxJbe~X<=RUFajVp}!Pbv`z^ zLr_2@Ayw#=)K3+akM%l$WgApa*a!iSkoG6QBkdYFijDa1B!z&rL%iG$58Ef|kjOc7 z<$GR;)^^o!$l|f8H{&*%RkvQpj%_Tv0Nz@!bsXSqpZ3Dgn+-{o02yKbRBtlcBy<CW z5q#BX)f?dSuu2w#2VDa$I1_z?PeQ0jV5{y;1^vgNy<$)4q;&omtxf448%Q4N{P{+D zD85(NpFv{TH)(=9=)Z&=!YNtoW%%&>exLnE+(N*<P9JZk=ltWqT709Ar-JpX_&@gR z^oW0ahraQTXdS-sk8jgA{&6uXF#hoved8Znkpj;6$GdRBI^!R7t17=}m7R^86m}+k z(4p4iV-@+4{)tjp=u`~xaTN_>AAL|jNPK*Qem;YbUbLA8%nv~Tw#1N+_y>>h(H`;p zr}#jR@bR7EV>`u%bBYh;6d%SZK7>;o{8JqCQylD59OP3R+*2IhBOJ_AjNm-N!8^qW zz9Ss0Q;gs`((^AQNI2fN_%HFV5J<n7y_9gjD%v1uZl=8TBFn`;AJzN|aXuXt)N{Bx zGdx<~2w+2im*6wJ@oY3z_HULGw~v)FU0Koh-z#W(m}vSnqV7vjGM-Ii`k?}O`eD?Z z=!#9zSKgc8nWv~H&NwgAtP*Kf`3w5SS>;L1D$mk4&MFnnDkte1XO*4AG@Mo5PfWx4 z<!)jc&MI_=0^32nkv1+WkZWA(N(RIg{vIvMadCd6W7!2OQt}l088KyApHv`MpF9_f zy8zjBXj%5j`F)Cd;;c>%Qnr`4JgrYEkgHFV7r<VCmSvw@p6;QZNR;@pmi=*7pHv`M zpK6s1+}?*eqR(Em)t)i9%Gz3Mz#t->2Q?<1(5$Y?3EgNv5#^vUF>lOFwwrnq;ziFM zc&JNnj<vX1^~x*ljJ3~?ejtl**I--n&8lb<Yz|#)8(-vAp_&7jGonFlTErf2(U18& RP^y!)BMk!*u-@dv{{u7%Q#Jqq literal 157040 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 Y9D9AVe$8&o&<r{2(yt};>rGAkKc&A06951J diff --git a/doc/build/doctrees/environment.pickle b/doc/build/doctrees/environment.pickle index a4ed16141619c2a0bb75154cd86c47aadef2da2a..4bce21f622910e0434419ef9043a85fdb43b1e70 100644 GIT binary patch literal 10671 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 literal 13920 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 Kk>e;2)c+5Da2nSD diff --git a/doc/build/html/_sources/cfelpyutils.rst.txt b/doc/build/html/_sources/cfelpyutils.rst.txt index bce7b5a..602f8dc 100644 --- a/doc/build/html/_sources/cfelpyutils.rst.txt +++ b/doc/build/html/_sources/cfelpyutils.rst.txt @@ -4,58 +4,42 @@ cfelpyutils package Submodules ---------- -cfelpyutils.cfel_crystfel module --------------------------------- - -.. automodule:: cfelpyutils.cfel_crystfel - :members: - :undoc-members: - :show-inheritance: - -cfelpyutils.cfel_cxi module ---------------------------- +cfelpyutils\.crystfel\_utils module +----------------------------------- -.. automodule:: cfelpyutils.cfel_cxi +.. automodule:: cfelpyutils.crystfel_utils :members: :undoc-members: :show-inheritance: -cfelpyutils.cfel_fabio module ------------------------------ +cfelpyutils\.geometry\_utils module +----------------------------------- -.. automodule:: cfelpyutils.cfel_fabio +.. automodule:: cfelpyutils.geometry_utils :members: :undoc-members: :show-inheritance: -cfelpyutils.cfel_geom module ----------------------------- +cfelpyutils\.hdf5\_utils module +------------------------------- -.. automodule:: cfelpyutils.cfel_geom +.. automodule:: cfelpyutils.hdf5_utils :members: :undoc-members: :show-inheritance: -cfelpyutils.cfel_hdf5 module ----------------------------- +cfelpyutils\.parameter\_utils module +------------------------------------ -.. automodule:: cfelpyutils.cfel_hdf5 +.. automodule:: cfelpyutils.parameter_utils :members: :undoc-members: :show-inheritance: -cfelpyutils.cfel_optarg module ------------------------------- - -.. automodule:: cfelpyutils.cfel_optarg - :members: - :undoc-members: - :show-inheritance: - -cfelpyutils.cfel_psana module ------------------------------ +cfelpyutils\.psana\_utils module +-------------------------------- -.. automodule:: cfelpyutils.cfel_psana +.. automodule:: cfelpyutils.psana_utils :members: :undoc-members: :show-inheritance: diff --git a/doc/build/html/cfelpyutils.html b/doc/build/html/cfelpyutils.html index 1845ab9..6459b15 100644 --- a/doc/build/html/cfelpyutils.html +++ b/doc/build/html/cfelpyutils.html @@ -48,13 +48,11 @@ <ul> <li><a class="reference internal" href="#">cfelpyutils package</a><ul> <li><a class="reference internal" href="#submodules">Submodules</a></li> -<li><a class="reference internal" href="#module-cfelpyutils.cfel_crystfel">cfelpyutils.cfel_crystfel module</a></li> -<li><a class="reference internal" href="#module-cfelpyutils.cfel_cxi">cfelpyutils.cfel_cxi module</a></li> -<li><a class="reference internal" href="#module-cfelpyutils.cfel_fabio">cfelpyutils.cfel_fabio module</a></li> -<li><a class="reference internal" href="#module-cfelpyutils.cfel_geom">cfelpyutils.cfel_geom module</a></li> -<li><a class="reference internal" href="#module-cfelpyutils.cfel_hdf5">cfelpyutils.cfel_hdf5 module</a></li> -<li><a class="reference internal" href="#module-cfelpyutils.cfel_optarg">cfelpyutils.cfel_optarg module</a></li> -<li><a class="reference internal" href="#module-cfelpyutils.cfel_psana">cfelpyutils.cfel_psana module</a></li> +<li><a class="reference internal" href="#module-cfelpyutils.crystfel_utils">cfelpyutils.crystfel_utils module</a></li> +<li><a class="reference internal" href="#module-cfelpyutils.geometry_utils">cfelpyutils.geometry_utils module</a></li> +<li><a class="reference internal" href="#module-cfelpyutils.hdf5_utils">cfelpyutils.hdf5_utils module</a></li> +<li><a class="reference internal" href="#module-cfelpyutils.parameter_utils">cfelpyutils.parameter_utils module</a></li> +<li><a class="reference internal" href="#module-cfelpyutils.psana_utils">cfelpyutils.psana_utils module</a></li> <li><a class="reference internal" href="#module-cfelpyutils">Module contents</a></li> </ul> </li> @@ -90,25 +88,29 @@ <div class="section" id="submodules"> <h2>Submodules<a class="headerlink" href="#submodules" title="Permalink to this headline">¶</a></h2> </div> -<div class="section" id="module-cfelpyutils.cfel_crystfel"> -<span id="cfelpyutils-cfel-crystfel-module"></span><h2>cfelpyutils.cfel_crystfel module<a class="headerlink" href="#module-cfelpyutils.cfel_crystfel" title="Permalink to this headline">¶</a></h2> +<div class="section" id="module-cfelpyutils.crystfel_utils"> +<span id="cfelpyutils-crystfel-utils-module"></span><h2>cfelpyutils.crystfel_utils module<a class="headerlink" href="#module-cfelpyutils.crystfel_utils" title="Permalink to this headline">¶</a></h2> <p>Utilities for interoperability with the CrystFEL software package.</p> <p>This module contains reimplementation of Crystfel functions and utilities.</p> <dl class="function"> -<dt id="cfelpyutils.cfel_crystfel.load_crystfel_geometry"> -<code class="descclassname">cfelpyutils.cfel_crystfel.</code><code class="descname">load_crystfel_geometry</code><span class="sig-paren">(</span><em>filename</em><span class="sig-paren">)</span><a class="headerlink" href="#cfelpyutils.cfel_crystfel.load_crystfel_geometry" title="Permalink to this definition">¶</a></dt> -<dd><p>Loads a CrystFEL geometry file into a dictionary.</p> -<p>Reimplements the get_detector_geometry_2 function from CrystFEL amost verbatim. Returns a dictionary with the -geometry information. Entries in the geometry file appears as keys in the returned dictionary. For a full -documentation on the CrystFEL geometry format, see:</p> +<dt id="cfelpyutils.crystfel_utils.load_crystfel_geometry"> +<code class="descclassname">cfelpyutils.crystfel_utils.</code><code class="descname">load_crystfel_geometry</code><span class="sig-paren">(</span><em>filename</em><span class="sig-paren">)</span><a class="headerlink" href="#cfelpyutils.crystfel_utils.load_crystfel_geometry" title="Permalink to this definition">¶</a></dt> +<dd><p>Load a CrystFEL geometry file into a dictionary.</p> +<p>Reimplementation of the get_detector_geometry_2 function from CrystFEL +almost verbatim. Returns a dictionary with the geometry information. +Entries in the geometry file appears as keys in the returned dictionary. +For a full documentation on the CrystFEL geometry format, see:</p> <p>tfel/manual-crystfel_geometry.html</p> +<p>he code of this function is synced with the code of the function +‘get_detector_geometry_2’ in CrystFEL at commit +41a8fa9819010fe8ddeb66676fee717f5226c7b8.</p> <table class="docutils field-list" frame="void" rules="none"> <col class="field-name" /> <col class="field-body" /> <tbody valign="top"> -<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>filename</strong> (<em>str</em>) – filename of the geometry file</td> +<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>filename</strong> (<em>str</em>) – filename of the geometry file.</td> </tr> -<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body">dictionary with the geometry loaded from the file</td> +<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body">dictionary with the geometry loaded from the file.</td> </tr> <tr class="field-odd field"><th class="field-name">Return type:</th><td class="field-body">detector (dict)</td> </tr> @@ -117,433 +119,113 @@ documentation on the CrystFEL geometry format, see:</p> </dd></dl> </div> -<div class="section" id="module-cfelpyutils.cfel_cxi"> -<span id="cfelpyutils-cfel-cxi-module"></span><h2>cfelpyutils.cfel_cxi module<a class="headerlink" href="#module-cfelpyutils.cfel_cxi" title="Permalink to this headline">¶</a></h2> -<p>Utilities for writing multi-event files in the CXIDB format.</p> -<p>This module contains utilities to write files that adhere to the CXIDB file format:</p> -<p><a class="reference external" href="http://www.cxidb.org/cxi.html">http://www.cxidb.org/cxi.html</a> .</p> -<dl class="class"> -<dt id="cfelpyutils.cfel_cxi.CXIWriter"> -<em class="property">class </em><code class="descclassname">cfelpyutils.cfel_cxi.</code><code class="descname">CXIWriter</code><span class="sig-paren">(</span><em>filename</em>, <em>max_num_slices=5000</em><span class="sig-paren">)</span><a class="headerlink" href="#cfelpyutils.cfel_cxi.CXIWriter" title="Permalink to this definition">¶</a></dt> -<dd><p>Bases: <code class="xref py py-class docutils literal"><span class="pre">object</span></code></p> -<p>Writing of multi-event CXIDB files.</p> -<p>Implements a simple low-level CXIDB file format writer for multi event files. it allows the user to write data -“stacks†in the CXIDB files, making sure that the entries in all stacks are synchronized.</p> -<p>A CXI Writer instance manages one file. A user can add a stack to a CXI Writer instance with the -add_stack_to_writer function, which also writes the first entry in the stack. The user can then add to the writer -all the stacks that he wants in the file. Once all stacks are added, the user initializes them with the -initialize_stacks function. After initialization, no more stacks can be added. Instead, entries can be appended to -the existing stacks, using the append_data_to_stack function.</p> -<p>A “slice†(a set of synced entries in all the stacks in the file) can be written to the a file only after an entry -has been appended to all stacks in the file. Conversely, after an entry has been appended to a stack, the user -cannot append another entry before a slice is written. This ensures synchronization of the data in all the stacks.</p> -<p>A file can be closed at any time. In any case, the writer will not allow a file to contain more than the -number_of_entries specified during instantiation.</p> -<p>Simple non-stack entries can be written to the file at any time, before or after stack initialization (provided of -course that the file is open). Entries and stacks will general never be overwritten unless the overwrite parameter -is set to True.</p> -<p>Example of usage of the stack API:</p> -<p>c1 = 0 -c2 = 0</p> -<p>f1 = CXIWriter(‘test1.h5’, ) -f2 = CXIWriter(‘test2.h5’, )</p> -<dl class="docutils"> -<dt>f1.add_stack_to_writer(‘detector1’, ‘/entry_1/detector_1/data’, numpy.random.rand(2, 2),</dt> -<dd>‘frame:y:x’)</dd> -<dt>f2.add_stack_to_writer(‘detector2’, ‘/entry_1/detector_1/data’, numpy.random.rand(3, 2),</dt> -<dd>‘frame:y:x’, compression=False, chunk_size=(1,3,2))</dd> -</dl> -<p>f1.add_stack_to_writer(‘counter1’, ‘/entry_1/detector_1/count’, c1) -f2.add_stack_to_writer(‘counter2’, ‘/entry_1/detector_1/count’, c2)</p> -<p>f1.write_simple_entry(‘detectorname1’, ‘/entry_1/detector_1/name’, ‘FrontCSPAD’) -f2.write_simple_entry(‘detectorname2’, ‘/entry_1/detector_1/name’, ‘BackCSPAD’)</p> -<p>f1.initialize_stacks() -f2.initialize_stacks()</p> -<p>a = numpy.random.rand(2, 2) -b = numpy.random.rand(3, 2)</p> -<p>c1 += 1 -c2 += 2</p> -<p>f1.append_data_to_stack(‘detector1’, a) -f2.append_data_to_stack(‘detector2’, b)</p> -<p>f1.append_data_to_stack(‘counter1’, c1) -f2.append_data_to_stack(‘counter2’, c2)</p> -<p>f1.write_stack_slice_and_increment() -f2.write_stack_slice_and_increment()</p> -<p>f1.create_link(‘detectorname1’, ‘/name’) -f2.create_link(‘detectorname2’, ‘/name’)</p> -<p>f1.close_file() -f2.close_file()</p> -<dl class="method"> -<dt id="cfelpyutils.cfel_cxi.CXIWriter.add_stack_to_writer"> -<code class="descname">add_stack_to_writer</code><span class="sig-paren">(</span><em>name</em>, <em>path</em>, <em>initial_data</em>, <em>axes=None</em>, <em>compression=True</em>, <em>chunk_size=None</em>, <em>overwrite=True</em><span class="sig-paren">)</span><a class="headerlink" href="#cfelpyutils.cfel_cxi.CXIWriter.add_stack_to_writer" title="Permalink to this definition">¶</a></dt> -<dd><p>Adds a new stack to the file.</p> -<p>Adds a new stack to the CXI Writer instance. The user must provide a name for the stack, that will identify -the stack in all subsequents operations. The user must also provide the data that will be written as the -initial entry in the stack (initial_data). This initial entry is used to set the size and type of data that the -stack will hold and these parameters are in turn be used to validate all data that is subsequently appended to -the stack.</p> -<table class="docutils field-list" frame="void" rules="none"> -<col class="field-name" /> -<col class="field-body" /> -<tbody valign="top"> -<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first last simple"> -<li><strong>name</strong> (<em>str</em>) – stack name.</li> -<li><strong>path</strong> (<em>str</em>) – path in the hdf5 file where the stack will be written.</li> -<li><strong>(</strong><strong>Union</strong><strong>[</strong><strong>numpy.ndarray</strong><strong>, </strong><strong>bytes</strong><strong>, </strong><strong>int</strong><strong>, </strong><strong>float</strong><strong>]</strong> (<em>initial_data</em>) – initial entry in the stack. It gets written to the</li> -<li><strong>as slice 0. Its characteristics are used to validate all data subsequently appended to the stack.</strong> (<em>stack</em>) – </li> -<li><strong>axes</strong> (<em>bytes</em>) – the ‘axes’ attribute for the stack, as defined by the CXIDB file format.</li> -<li><strong>compression</strong> (<em>Union</em><em>[</em><em>None</em><em>, </em><em>bool</em><em>,</em><em>str</em><em>]</em>) – compression parameter for the stack. This parameters works in the same</li> -<li><strong>as the normal compression parameter from h5py. The default value of this parameter is True.</strong> (<em>way</em>) – </li> -<li><strong>chunk_size</strong> (<em>Union</em><em>[</em><em>None</em><em>, </em><em>tuple</em><em>]</em>) – HDF5 chuck size for the stack. If this parameter is set to None, the</li> -<li><strong>writer will compute a chuck size automatically</strong> (<em>CXI</em>) – </li> -<li><strong>use the provided tuple to set the chunk size.</strong> (<em>will</em>) – </li> -<li><strong>overwrite</strong> (<em>bool</em>) – if set to True, a stack already existing at the same location will be overwritten. If set</li> -<li><strong>False</strong><strong>, </strong><strong>an attempt to overwrite a stack will raise an error.</strong> (<em>to</em>) – </li> -</ul> -</td> -</tr> -</tbody> -</table> -</dd></dl> - -<dl class="method"> -<dt id="cfelpyutils.cfel_cxi.CXIWriter.append_data_to_stack"> -<code class="descname">append_data_to_stack</code><span class="sig-paren">(</span><em>name</em>, <em>data</em><span class="sig-paren">)</span><a class="headerlink" href="#cfelpyutils.cfel_cxi.CXIWriter.append_data_to_stack" title="Permalink to this definition">¶</a></dt> -<dd><p>Appends data to a stack.</p> -<p>Appends data to a stack, validating the data to make sure that the data type and size match the previous entries -in the stack. Only one entry can be appended to each stack before writing a slice across all stacks with -the write_slice_and_increment.</p> -<table class="docutils field-list" frame="void" rules="none"> -<col class="field-name" /> -<col class="field-body" /> -<tbody valign="top"> -<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first last simple"> -<li><strong>name</strong> (<em>str</em>) – stack name, defining the stack to which the data will be appended.</li> -<li><strong>(</strong><strong>Union</strong><strong>[</strong><strong>numpy.ndarray</strong><strong>, </strong><strong>bytes</strong><strong>, </strong><strong>int</strong><strong>, </strong><strong>float</strong><strong>]</strong> (<em>data</em>) – data to write. The data will be validated against the type</li> -<li><strong>size of previous entries in the stack.</strong> (<em>and</em>) – </li> -</ul> -</td> -</tr> -</tbody> -</table> -</dd></dl> - -<dl class="method"> -<dt id="cfelpyutils.cfel_cxi.CXIWriter.close_file"> -<code class="descname">close_file</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#cfelpyutils.cfel_cxi.CXIWriter.close_file" title="Permalink to this definition">¶</a></dt> -<dd><p>Closes the file.</p> -<p>Closes the file for writing, ending all writing operations.</p> -</dd></dl> - -<dl class="method"> -<dt id="cfelpyutils.cfel_cxi.CXIWriter.create_link"> -<code class="descname">create_link</code><span class="sig-paren">(</span><em>name</em>, <em>path</em>, <em>overwrite=False</em><span class="sig-paren">)</span><a class="headerlink" href="#cfelpyutils.cfel_cxi.CXIWriter.create_link" title="Permalink to this definition">¶</a></dt> -<dd><p>Creates a link to a stack or entry.</p> -<p>Creates a link in the file, at the path specified, pointing to the stack or the entry identified by the -provided name. If a link or entry already exists at the specified path, it is deleted and replaced only if the -value of the overwrite parameter is True.</p> -<table class="docutils field-list" frame="void" rules="none"> -<col class="field-name" /> -<col class="field-body" /> -<tbody valign="top"> -<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first last simple"> -<li><strong>name</strong> (<em>str</em>) – name of the stack or entry to which the link points.</li> -<li><strong>path</strong> (<em>str</em>) – path in the hdf5 where the link is created.</li> -<li><strong>overwrite</strong> (<em>bool</em>) – if set to True, an entry already existing at the same location will be overwritten. If set</li> -<li><strong>False</strong><strong>, </strong><strong>an attempt to overwrite an entry will raise an error.</strong> (<em>to</em>) – </li> -</ul> -</td> -</tr> -</tbody> -</table> -</dd></dl> - -<dl class="method"> -<dt id="cfelpyutils.cfel_cxi.CXIWriter.create_link_to_group"> -<code class="descname">create_link_to_group</code><span class="sig-paren">(</span><em>group</em>, <em>path</em>, <em>overwrite=False</em><span class="sig-paren">)</span><a class="headerlink" href="#cfelpyutils.cfel_cxi.CXIWriter.create_link_to_group" title="Permalink to this definition">¶</a></dt> -<dd><p>Creates a link to an HDF5 group.</p> -<p>Creates a link to an HDF5 group (as opposed to a simple entry or stack). If a link or entry already exists at -the specified path, it is deleted and replaced only if the value of the overwrite parameter is True.</p> -<table class="docutils field-list" frame="void" rules="none"> -<col class="field-name" /> -<col class="field-body" /> -<tbody valign="top"> -<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first last simple"> -<li><strong>group</strong> (<em>str</em>) – internal HDF5 path of the group to which the link points.</li> -<li><strong>path</strong> (<em>str</em>) – path in the hdf5 where the link is created.</li> -<li><strong>overwrite</strong> (<em>bool</em>) – if set to True, an entry already existing at the same location will be overwritten. If set</li> -<li><strong>False</strong><strong>, </strong><strong>an attempt to overwrite an entry will raise an error.</strong> (<em>to</em>) – </li> -</ul> -</td> -</tr> -</tbody> -</table> -</dd></dl> - -<dl class="method"> -<dt id="cfelpyutils.cfel_cxi.CXIWriter.file_is_full"> -<code class="descname">file_is_full</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#cfelpyutils.cfel_cxi.CXIWriter.file_is_full" title="Permalink to this definition">¶</a></dt> -<dd><p>Checks if the file is full.</p> -<p>Checks if the file is full (i.e. the maximum number of slices have already been written), and returns the -information to the user.</p> -<table class="docutils field-list" frame="void" rules="none"> -<col class="field-name" /> -<col class="field-body" /> -<tbody valign="top"> -<tr class="field-odd field"><th class="field-name">Returns:</th><td class="field-body">True if the file is full, False otherwise.</td> -</tr> -<tr class="field-even field"><th class="field-name">Return type:</th><td class="field-body">status (bool)</td> -</tr> -</tbody> -</table> -</dd></dl> - -<dl class="method"> -<dt id="cfelpyutils.cfel_cxi.CXIWriter.get_file_handle"> -<code class="descname">get_file_handle</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#cfelpyutils.cfel_cxi.CXIWriter.get_file_handle" title="Permalink to this definition">¶</a></dt> -<dd><p>Access to the naked h5py file handle.</p> -<p>This function allows access to the a naked h5py handle for the file managed by the CXI Writer. This allowa -operations on the file that are not covered by CXI Writer API. Use it at your own risk.</p> -<table class="docutils field-list" frame="void" rules="none"> -<col class="field-name" /> -<col class="field-body" /> -<tbody valign="top"> -<tr class="field-odd field"><th class="field-name">Returns:</th><td class="field-body">an h5py file handle to the file managed by the writer.</td> -</tr> -<tr class="field-even field"><th class="field-name">Return type:</th><td class="field-body">fh (h5py.File)</td> -</tr> -</tbody> -</table> -</dd></dl> - -<dl class="method"> -<dt id="cfelpyutils.cfel_cxi.CXIWriter.initialize_stacks"> -<code class="descname">initialize_stacks</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#cfelpyutils.cfel_cxi.CXIWriter.initialize_stacks" title="Permalink to this definition">¶</a></dt> -<dd><p>Initializes the stacks.</p> -<p>Initializes the stacks in the CXI Writer instance. This fixes the number and type of stacks in the file. No -stacks can be added to the CXI Writer after initialization.</p> -</dd></dl> - -<dl class="method"> -<dt id="cfelpyutils.cfel_cxi.CXIWriter.is_entry_in_file"> -<code class="descname">is_entry_in_file</code><span class="sig-paren">(</span><em>path</em><span class="sig-paren">)</span><a class="headerlink" href="#cfelpyutils.cfel_cxi.CXIWriter.is_entry_in_file" title="Permalink to this definition">¶</a></dt> -<dd><p>Checks if an entry is already present in the file.</p> -<p>Checks if an entry is already present in the file at the path provided by the user. It will return True if -either a dataset or a group are present at the specified path</p> -<table class="docutils field-list" frame="void" rules="none"> -<col class="field-name" /> -<col class="field-body" /> -<tbody valign="top"> -<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>path</strong> (<em>str</em>) – the path where to check for a dataset or group</td> -</tr> -</tbody> -</table> -<p>Results:</p> -<blockquote> -<div>ret (bool): True if a group or dataset can be found in the file, False otherwise</div></blockquote> -</dd></dl> - -<dl class="method"> -<dt id="cfelpyutils.cfel_cxi.CXIWriter.num_slices_in_file"> -<code class="descname">num_slices_in_file</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#cfelpyutils.cfel_cxi.CXIWriter.num_slices_in_file" title="Permalink to this definition">¶</a></dt> -<dd><p>Returns the number of slices already written in the file</p> -<p>Returns the number of slices that have already been written in the file.</p> -<table class="docutils field-list" frame="void" rules="none"> -<col class="field-name" /> -<col class="field-body" /> -<tbody valign="top"> -<tr class="field-odd field"><th class="field-name">Returns:</th><td class="field-body">number of writter slices</td> -</tr> -<tr class="field-even field"><th class="field-name">Return type:</th><td class="field-body">status (num_slices)</td> -</tr> -</tbody> -</table> -</dd></dl> - -<dl class="method"> -<dt id="cfelpyutils.cfel_cxi.CXIWriter.stacks_are_initialized"> -<code class="descname">stacks_are_initialized</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#cfelpyutils.cfel_cxi.CXIWriter.stacks_are_initialized" title="Permalink to this definition">¶</a></dt> -<dd><p>Checks if stacks are initialized.</p> -<p>Checks the status of the stacks in the file and returns the status to the user.</p> -<table class="docutils field-list" frame="void" rules="none"> -<col class="field-name" /> -<col class="field-body" /> -<tbody valign="top"> -<tr class="field-odd field"><th class="field-name">Returns:</th><td class="field-body">True if the stacks are initialized, False otherwise</td> -</tr> -<tr class="field-even field"><th class="field-name">Return type:</th><td class="field-body">status (bool)</td> -</tr> -</tbody> -</table> -</dd></dl> - -<dl class="method"> -<dt id="cfelpyutils.cfel_cxi.CXIWriter.write_simple_entry"> -<code class="descname">write_simple_entry</code><span class="sig-paren">(</span><em>name</em>, <em>path</em>, <em>data</em>, <em>overwrite=False</em><span class="sig-paren">)</span><a class="headerlink" href="#cfelpyutils.cfel_cxi.CXIWriter.write_simple_entry" title="Permalink to this definition">¶</a></dt> -<dd><p>Writes a simple, non-stack entry in the file.</p> -<p>Writes a simple, non-stack entry in the file, at the specified path. A simple entry can be written at all times, -before or after the stack initialization. THe user must provide a name that identifies the entry for further -operations (for example, creating a link).</p> -<table class="docutils field-list" frame="void" rules="none"> -<col class="field-name" /> -<col class="field-body" /> -<tbody valign="top"> -<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first last simple"> -<li><strong>name</strong> (<em>str</em>) – entry name</li> -<li><strong>path</strong> (<em>str</em>) – path in the hdf5 file where the entry will be written.</li> -<li><strong>data</strong> (<em>Union</em><em>[</em><em>numpy.ndarray</em><em>, </em><em>bytes</em><em>, </em><em>int</em><em>, </em><em>float</em><em>]</em>) – data to write</li> -<li><strong>overwrite</strong> (<em>bool</em>) – if set to True, an entry already existing at the same location will be overwritten. If set</li> -<li><strong>False</strong><strong>, </strong><strong>an attempt to overwrite an entry will raise an error.</strong> (<em>to</em>) – </li> -</ul> -</td> -</tr> -</tbody> -</table> -</dd></dl> - -<dl class="method"> -<dt id="cfelpyutils.cfel_cxi.CXIWriter.write_stack_slice_and_increment"> -<code class="descname">write_stack_slice_and_increment</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#cfelpyutils.cfel_cxi.CXIWriter.write_stack_slice_and_increment" title="Permalink to this definition">¶</a></dt> -<dd><p>Writes a slice across all stacks and resets the writer for the next slice.</p> -<p>Writes a slice across all stacks in the file. It checks that an entry has been appended to each stack, and -writes all the entries on top of the relevant stacks in one go. If an entry is missing in a stack, the function -will raise an error. After writing the slice, the function resets the writer to allow again appending data to -the stacks.</p> -</dd></dl> - -</dd></dl> - -</div> -<div class="section" id="module-cfelpyutils.cfel_fabio"> -<span id="cfelpyutils-cfel-fabio-module"></span><h2>cfelpyutils.cfel_fabio module<a class="headerlink" href="#module-cfelpyutils.cfel_fabio" title="Permalink to this headline">¶</a></h2> -<p>Utilities based on the fabio python module.</p> -<p>This module contains utilities based on the fabio python module. -files.</p> -<dl class="function"> -<dt id="cfelpyutils.cfel_fabio.read_cbf_from_stream"> -<code class="descclassname">cfelpyutils.cfel_fabio.</code><code class="descname">read_cbf_from_stream</code><span class="sig-paren">(</span><em>stream</em><span class="sig-paren">)</span><a class="headerlink" href="#cfelpyutils.cfel_fabio.read_cbf_from_stream" title="Permalink to this definition">¶</a></dt> -<dd><p>Reads a cbfimage object out of a data string buffer.</p> -<p>Read a data string buffer received as a payload from the PETRAIII P11 sender, and creates a cbfimage object from -it (See the documentation of the fabio python module).</p> -<table class="docutils field-list" frame="void" rules="none"> -<col class="field-name" /> -<col class="field-body" /> -<tbody valign="top"> -<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>stream</strong> (<em>str</em>) – a data string buffer received from the PETRAIII P11 sender.</td> -</tr> -<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><dl class="docutils"> -<dt>a cbfimage object containing the data extracted</dt> -<dd>from the string buffer.</dd> -</dl> -</td> -</tr> -<tr class="field-odd field"><th class="field-name">Return type:</th><td class="field-body">cbf_obj (fabio.cbfimage)</td> -</tr> -</tbody> -</table> -</dd></dl> - -</div> -<div class="section" id="module-cfelpyutils.cfel_geom"> -<span id="cfelpyutils-cfel-geom-module"></span><h2>cfelpyutils.cfel_geom module<a class="headerlink" href="#module-cfelpyutils.cfel_geom" title="Permalink to this headline">¶</a></h2> +<div class="section" id="module-cfelpyutils.geometry_utils"> +<span id="cfelpyutils-geometry-utils-module"></span><h2>cfelpyutils.geometry_utils module<a class="headerlink" href="#module-cfelpyutils.geometry_utils" title="Permalink to this headline">¶</a></h2> <p>Utilities for CrystFEL-style geometry files.</p> <p>This module contains utilities for the processing of CrystFEL-style geometry files.</p> <dl class="class"> -<dt id="cfelpyutils.cfel_geom.ImageShape"> -<em class="property">class </em><code class="descclassname">cfelpyutils.cfel_geom.</code><code class="descname">ImageShape</code><span class="sig-paren">(</span><em>ss</em>, <em>fs</em><span class="sig-paren">)</span><a class="headerlink" href="#cfelpyutils.cfel_geom.ImageShape" title="Permalink to this definition">¶</a></dt> +<dt id="cfelpyutils.geometry_utils.ImageShape"> +<em class="property">class </em><code class="descclassname">cfelpyutils.geometry_utils.</code><code class="descname">ImageShape</code><span class="sig-paren">(</span><em>ss</em>, <em>fs</em><span class="sig-paren">)</span><a class="headerlink" href="#cfelpyutils.geometry_utils.ImageShape" title="Permalink to this definition">¶</a></dt> <dd><p>Bases: <code class="xref py py-class docutils literal"><span class="pre">tuple</span></code></p> <dl class="attribute"> -<dt id="cfelpyutils.cfel_geom.ImageShape.fs"> -<code class="descname">fs</code><a class="headerlink" href="#cfelpyutils.cfel_geom.ImageShape.fs" title="Permalink to this definition">¶</a></dt> +<dt id="cfelpyutils.geometry_utils.ImageShape.fs"> +<code class="descname">fs</code><a class="headerlink" href="#cfelpyutils.geometry_utils.ImageShape.fs" title="Permalink to this definition">¶</a></dt> <dd><p>Alias for field number 1</p> </dd></dl> <dl class="attribute"> -<dt id="cfelpyutils.cfel_geom.ImageShape.ss"> -<code class="descname">ss</code><a class="headerlink" href="#cfelpyutils.cfel_geom.ImageShape.ss" title="Permalink to this definition">¶</a></dt> +<dt id="cfelpyutils.geometry_utils.ImageShape.ss"> +<code class="descname">ss</code><a class="headerlink" href="#cfelpyutils.geometry_utils.ImageShape.ss" title="Permalink to this definition">¶</a></dt> <dd><p>Alias for field number 0</p> </dd></dl> </dd></dl> <dl class="class"> -<dt id="cfelpyutils.cfel_geom.PixelMaps"> -<em class="property">class </em><code class="descclassname">cfelpyutils.cfel_geom.</code><code class="descname">PixelMaps</code><span class="sig-paren">(</span><em>x</em>, <em>y</em>, <em>r</em><span class="sig-paren">)</span><a class="headerlink" href="#cfelpyutils.cfel_geom.PixelMaps" title="Permalink to this definition">¶</a></dt> +<dt id="cfelpyutils.geometry_utils.PixelMaps"> +<em class="property">class </em><code class="descclassname">cfelpyutils.geometry_utils.</code><code class="descname">PixelMaps</code><span class="sig-paren">(</span><em>x</em>, <em>y</em>, <em>r</em><span class="sig-paren">)</span><a class="headerlink" href="#cfelpyutils.geometry_utils.PixelMaps" title="Permalink to this definition">¶</a></dt> <dd><p>Bases: <code class="xref py py-class docutils literal"><span class="pre">tuple</span></code></p> <dl class="attribute"> -<dt id="cfelpyutils.cfel_geom.PixelMaps.r"> -<code class="descname">r</code><a class="headerlink" href="#cfelpyutils.cfel_geom.PixelMaps.r" title="Permalink to this definition">¶</a></dt> +<dt id="cfelpyutils.geometry_utils.PixelMaps.r"> +<code class="descname">r</code><a class="headerlink" href="#cfelpyutils.geometry_utils.PixelMaps.r" title="Permalink to this definition">¶</a></dt> <dd><p>Alias for field number 2</p> </dd></dl> <dl class="attribute"> -<dt id="cfelpyutils.cfel_geom.PixelMaps.x"> -<code class="descname">x</code><a class="headerlink" href="#cfelpyutils.cfel_geom.PixelMaps.x" title="Permalink to this definition">¶</a></dt> +<dt id="cfelpyutils.geometry_utils.PixelMaps.x"> +<code class="descname">x</code><a class="headerlink" href="#cfelpyutils.geometry_utils.PixelMaps.x" title="Permalink to this definition">¶</a></dt> <dd><p>Alias for field number 0</p> </dd></dl> <dl class="attribute"> -<dt id="cfelpyutils.cfel_geom.PixelMaps.y"> -<code class="descname">y</code><a class="headerlink" href="#cfelpyutils.cfel_geom.PixelMaps.y" title="Permalink to this definition">¶</a></dt> +<dt id="cfelpyutils.geometry_utils.PixelMaps.y"> +<code class="descname">y</code><a class="headerlink" href="#cfelpyutils.geometry_utils.PixelMaps.y" title="Permalink to this definition">¶</a></dt> <dd><p>Alias for field number 1</p> </dd></dl> </dd></dl> <dl class="function"> -<dt id="cfelpyutils.cfel_geom.apply_geometry_from_file"> -<code class="descclassname">cfelpyutils.cfel_geom.</code><code class="descname">apply_geometry_from_file</code><span class="sig-paren">(</span><em>data_as_slab</em>, <em>geometry_filename</em><span class="sig-paren">)</span><a class="headerlink" href="#cfelpyutils.cfel_geom.apply_geometry_from_file" title="Permalink to this definition">¶</a></dt> -<dd><p>Parses a geometry file and applies the geometry to data.</p> -<p>Parses a geometry file and applies the geometry to detector data in ‘slab’ format. Turns a 2d array of pixel -values into an array containing a representation of the physical layout of the detector, keeping the origin of -the reference system at the beam interaction point.</p> +<dt id="cfelpyutils.geometry_utils.adjust_pixel_maps_for_pyqtgraph"> +<code class="descclassname">cfelpyutils.geometry_utils.</code><code class="descname">adjust_pixel_maps_for_pyqtgraph</code><span class="sig-paren">(</span><em>pixel_maps</em><span class="sig-paren">)</span><a class="headerlink" href="#cfelpyutils.geometry_utils.adjust_pixel_maps_for_pyqtgraph" title="Permalink to this definition">¶</a></dt> +<dd><p>Adjust pixel maps for visualization of the data in a pyqtgraph widget.</p> +<p>Adjust the pixel maps for use in a Pyqtgraph’s ImageView widget. +Essentially, the origin of the reference system is moved to the +top-left of the image.</p> <table class="docutils field-list" frame="void" rules="none"> <col class="field-name" /> <col class="field-body" /> <tbody valign="top"> -<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first simple"> -<li><strong>data_as_slab</strong> (<em>numpy.ndarray</em>) – the pixel values to which geometry is to be applied.</li> -<li><strong>geometry_filename</strong> (<em>str</em>) – geometry filename.</li> -</ul> -</td> +<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>pixel_maps</strong> (<em>tuple</em>) – pixel maps, as returned by the +compute_pixel_maps function in this module.</td> </tr> -<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><p class="first">Array containing a representation of the physical layout of the -detector, with the origin of the reference system at the beam interaction point.</p> +<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><dl class="docutils"> +<dt>a three-element tuple containing two float32 numpy arrays</dt> +<dd>(‘slab’-like pixel maps) with respectively x, y coordinates of the +data pixels as the first two elements, and None as the third.</dd> +</dl> </td> </tr> -<tr class="field-odd field"><th class="field-name">Return type:</th><td class="field-body"><p class="first last">im_out (numpy.ndarray data_as_slab.dtype)</p> -</td> +<tr class="field-odd field"><th class="field-name">Return type:</th><td class="field-body">tuple</td> </tr> </tbody> </table> </dd></dl> <dl class="function"> -<dt id="cfelpyutils.cfel_geom.apply_geometry_from_pixel_maps"> -<code class="descclassname">cfelpyutils.cfel_geom.</code><code class="descname">apply_geometry_from_pixel_maps</code><span class="sig-paren">(</span><em>data_as_slab</em>, <em>y</em>, <em>x</em>, <em>im_out=None</em><span class="sig-paren">)</span><a class="headerlink" href="#cfelpyutils.cfel_geom.apply_geometry_from_pixel_maps" title="Permalink to this definition">¶</a></dt> -<dd><p>Applies geometry in pixel map format to data.</p> -<p>Applies geometry, in the form of pixel maps, to detector data in ‘slab’ format. Turns a 2d array of pixel values -into an array containing a representation of the physical layout of the detector, keeping the origin of the -reference system at the beam interaction point.</p> +<dt id="cfelpyutils.geometry_utils.apply_pixel_maps"> +<code class="descclassname">cfelpyutils.geometry_utils.</code><code class="descname">apply_pixel_maps</code><span class="sig-paren">(</span><em>data_as_slab</em>, <em>pixel_maps</em>, <em>output_array=None</em><span class="sig-paren">)</span><a class="headerlink" href="#cfelpyutils.geometry_utils.apply_pixel_maps" title="Permalink to this definition">¶</a></dt> +<dd><p>Apply geometry in pixel map format to the input data.</p> +<p>Applies geometry, described by pixel maps, to input data in ‘slab’ format. +Turns a 2d array of pixel values into an array containing a representation +of the physical layout of the geometry, keeping the origin of the reference +system at the beam interaction point.</p> <table class="docutils field-list" frame="void" rules="none"> <col class="field-name" /> <col class="field-body" /> <tbody valign="top"> <tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first simple"> -<li><strong>data_as_slab</strong> (<em>numpy.ndarray</em>) – the pixel values to which geometry is to be applied.</li> -<li><strong>y</strong> (<em>numpy.ndarray</em>) – the y pixel map describing the geometry of the detector</li> -<li><strong>x</strong> (<em>numpy.ndarray</em>) – the x pixel map describing the geometry of the detector</li> -<li><strong>im_out</strong> (<em>Optional</em><em>[</em><em>numpy.ndarray</em><em>]</em>) – array to hold the output; if not provided, one will be generated</li> -<li><strong>automatically.</strong> – </li> +<li><strong>data_as_slab</strong> (<em>ndarray</em>) – the pixel values on which to apply the +geometry, in ‘slab’ format.</li> +<li><strong>pixel_maps</strong> (<em>tuple</em>) – pixel maps, as returned by the +compute_pixel_maps function in this module.</li> +<li><strong>output_array</strong> (<em>Optional</em><em>[</em><em>numpy.ndarray</em><em>]</em>) – array to hold the output. +If the array is not provided, one will be generated automatically. +Defaults to None (No array provided).</li> </ul> </td> </tr> -<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><p class="first">Array containing a representation of the physical layout of the -detector, with the origin of the reference system at the beam interaction point.</p> +<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><p class="first"><dl class="docutils"> +<dt>Array with the same dtype as the input data containing a</dt> +<dd><p class="first last">representation of the physical layout of the geometry (i.e.: the +geometry information applied to the input data).</p> +</dd> +</dl> +</p> </td> </tr> -<tr class="field-odd field"><th class="field-name">Return type:</th><td class="field-body"><p class="first last">im_out (numpy.ndarray data_as_slab.dtype)</p> +<tr class="field-odd field"><th class="field-name">Return type:</th><td class="field-body"><p class="first last">ndarray</p> </td> </tr> </tbody> @@ -551,97 +233,87 @@ detector, with the origin of the reference system at the beam interaction point </dd></dl> <dl class="function"> -<dt id="cfelpyutils.cfel_geom.get_image_shape"> -<code class="descclassname">cfelpyutils.cfel_geom.</code><code class="descname">get_image_shape</code><span class="sig-paren">(</span><em>geometry_filename</em><span class="sig-paren">)</span><a class="headerlink" href="#cfelpyutils.cfel_geom.get_image_shape" title="Permalink to this definition">¶</a></dt> -<dd><p>Parses a geometry file and returns the minimum size of an image that can represent the detector.</p> -<p>Parses the geometry file and return a numpy shape object representing the minimum size of an image that -can contain the physical representation of the detector. The representation is centered at the point where the beam -hits the detector according to the geometry in the file.</p> +<dt id="cfelpyutils.geometry_utils.compute_minimum_image_size"> +<code class="descclassname">cfelpyutils.geometry_utils.</code><code class="descname">compute_minimum_image_size</code><span class="sig-paren">(</span><em>pixel_maps</em><span class="sig-paren">)</span><a class="headerlink" href="#cfelpyutils.geometry_utils.compute_minimum_image_size" title="Permalink to this definition">¶</a></dt> +<dd><p>Compute the minimum size of an image that can represent the geometry.</p> +<p>Compute the minimum size of an image that can contain a +representation of the geometry described by the pixel maps, assuming +that the image is center at the center of the reference system.</p> <table class="docutils field-list" frame="void" rules="none"> <col class="field-name" /> <col class="field-body" /> <tbody valign="top"> -<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>geometry_filename</strong> (<em>str</em>) – geometry filename.</td> -</tr> -<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body">shape of the array needed to contain the representation of the physical layout -of the detector.</td> -</tr> -<tr class="field-odd field"><th class="field-name">Return type:</th><td class="field-body">img_shape tuple (int, int)</td> -</tr> -</tbody> -</table> -</dd></dl> - -<dl class="function"> -<dt id="cfelpyutils.cfel_geom.pixel_maps_for_image_view"> -<code class="descclassname">cfelpyutils.cfel_geom.</code><code class="descname">pixel_maps_for_image_view</code><span class="sig-paren">(</span><em>geometry_filename</em><span class="sig-paren">)</span><a class="headerlink" href="#cfelpyutils.cfel_geom.pixel_maps_for_image_view" title="Permalink to this definition">¶</a></dt> -<dd><p>Parses a geometry file and creates pixel maps for pyqtgraph visualization.</p> -<p>Parses the geometry file and creates pixel maps for an array in ‘slab’ format containing pixel values. The pixel -maps can be used to create a representation of the physical layout of the detector in a pyqtgraph ImageView -widget (i.e. they apply the detector geometry setting the origin of the reference system is in the top left corner -of the output array). The representation is centered at the point where the beam hits the detector according to -the geometry in the file.</p> -<table class="docutils field-list" frame="void" rules="none"> -<col class="field-name" /> -<col class="field-body" /> -<tbody valign="top"> -<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>geometry_filename</strong> (<em>str</em>) – geometry filename.</td> +<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first simple"> +<li><strong>pixel_maps</strong> (<em>tuple</em>) – pixel maps, as returned by the</li> +<li><strong>function in this module.</strong> (<a class="reference internal" href="#cfelpyutils.geometry_utils.compute_pixel_maps" title="cfelpyutils.geometry_utils.compute_pixel_maps"><em>compute_pixel_maps</em></a>) – </li> +</ul> +</td> </tr> -<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body">pixel map for x coordinate<p>y (numpy.ndarray int): pixel map for x coordinate</p> +<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><p class="first">numpy shape object describing the minimum image size.</p> </td> </tr> -<tr class="field-odd field"><th class="field-name">Return type:</th><td class="field-body"><a class="reference internal" href="#cfelpyutils.cfel_geom.PixelMaps.x" title="cfelpyutils.cfel_geom.PixelMaps.x">x</a> (numpy.ndarray int)</td> +<tr class="field-odd field"><th class="field-name">Return type:</th><td class="field-body"><p class="first last">tuple</p> +</td> </tr> </tbody> </table> </dd></dl> <dl class="function"> -<dt id="cfelpyutils.cfel_geom.pixel_maps_from_geometry_file"> -<code class="descclassname">cfelpyutils.cfel_geom.</code><code class="descname">pixel_maps_from_geometry_file</code><span class="sig-paren">(</span><em>fnam</em><span class="sig-paren">)</span><a class="headerlink" href="#cfelpyutils.cfel_geom.pixel_maps_from_geometry_file" title="Permalink to this definition">¶</a></dt> -<dd><p>Parses a geometry file and creates pixel maps.</p> -<p>Extracts pixel maps from a CrystFEL-style geometry file. The pixel maps can be used to create a representation of -the physical layout of the detector, keeping the origin of the reference system at the beam interaction -point.</p> +<dt id="cfelpyutils.geometry_utils.compute_pixel_maps"> +<code class="descclassname">cfelpyutils.geometry_utils.</code><code class="descname">compute_pixel_maps</code><span class="sig-paren">(</span><em>geometry</em><span class="sig-paren">)</span><a class="headerlink" href="#cfelpyutils.geometry_utils.compute_pixel_maps" title="Permalink to this definition">¶</a></dt> +<dd><p>Create pixel maps from a CrystFEL geometry object.</p> +<p>Compute pixel maps from a CrystFEL-style geometry object (A dictionary +returned by the load_crystfel_geometry function from the crystfel_utils +module). The pixel maps can be used to create a representation of +the physical layout of the geometry, keeping the origin of the reference +system at the beam interaction point.</p> <table class="docutils field-list" frame="void" rules="none"> <col class="field-name" /> <col class="field-body" /> <tbody valign="top"> -<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>fnam</strong> (<em>str</em>) – geometry filename.</td> +<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>geometry</strong> (<em>dict</em>) – A CrystFEL geometry object (A dictionary returned by +the load_crystfel_geometry function from the crystfel_utils +module).</td> </tr> -<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body">slab-like pixel maps with -respectively x, y coordinates of the pixel and distance of the pixel from the center of the reference system.</td> +<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><dl class="docutils"> +<dt>a tuple containing three float32 numpy arrays (‘slab’-like pixel</dt> +<dd>maps) with respectively x, y coordinates of the data pixels and +distance of each pixel from the center of the reference system.</dd> +</dl> +</td> </tr> -<tr class="field-odd field"><th class="field-name">Return type:</th><td class="field-body"><a class="reference internal" href="#cfelpyutils.cfel_geom.PixelMaps.x" title="cfelpyutils.cfel_geom.PixelMaps.x">x</a>,<a class="reference internal" href="#cfelpyutils.cfel_geom.PixelMaps.y" title="cfelpyutils.cfel_geom.PixelMaps.y">y</a>,<a class="reference internal" href="#cfelpyutils.cfel_geom.PixelMaps.r" title="cfelpyutils.cfel_geom.PixelMaps.r">r</a> (numpy.ndarray float, numpy.ndarray float, numpy.ndarray float)</td> +<tr class="field-odd field"><th class="field-name">Return type:</th><td class="field-body">tuple</td> </tr> </tbody> </table> </dd></dl> </div> -<div class="section" id="module-cfelpyutils.cfel_hdf5"> -<span id="cfelpyutils-cfel-hdf5-module"></span><h2>cfelpyutils.cfel_hdf5 module<a class="headerlink" href="#module-cfelpyutils.cfel_hdf5" title="Permalink to this headline">¶</a></h2> +<div class="section" id="module-cfelpyutils.hdf5_utils"> +<span id="cfelpyutils-hdf5-utils-module"></span><h2>cfelpyutils.hdf5_utils module<a class="headerlink" href="#module-cfelpyutils.hdf5_utils" title="Permalink to this headline">¶</a></h2> <p>Utilities for HDF5 files.</p> <p>This module contains utilities for the processing of HDF5. This module builds on what the h5py module already provides.</p> <dl class="function"> -<dt id="cfelpyutils.cfel_hdf5.load_nparray_from_hdf5_file"> -<code class="descclassname">cfelpyutils.cfel_hdf5.</code><code class="descname">load_nparray_from_hdf5_file</code><span class="sig-paren">(</span><em>data_filename</em>, <em>data_group</em><span class="sig-paren">)</span><a class="headerlink" href="#cfelpyutils.cfel_hdf5.load_nparray_from_hdf5_file" title="Permalink to this definition">¶</a></dt> -<dd><p>Loads a numpy.ndarray from an HDF5 file.</p> +<dt id="cfelpyutils.hdf5_utils.load_nparray_from_hdf5_file"> +<code class="descclassname">cfelpyutils.hdf5_utils.</code><code class="descname">load_nparray_from_hdf5_file</code><span class="sig-paren">(</span><em>data_filename</em>, <em>data_group</em><span class="sig-paren">)</span><a class="headerlink" href="#cfelpyutils.hdf5_utils.load_nparray_from_hdf5_file" title="Permalink to this definition">¶</a></dt> +<dd><p>Load a numpy.ndarray from an HDF5 file.</p> <table class="docutils field-list" frame="void" rules="none"> <col class="field-name" /> <col class="field-body" /> <tbody valign="top"> <tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first simple"> <li><strong>data_filename</strong> (<em>str</em>) – filename of the file to read.</li> -<li><strong>data_group</strong> (<em>str</em>) – internal HDF5 path of the data block to read.</li> +<li><strong>data_group</strong> (<em>str</em>) – internal HDF5 path of the data block containing</li> +<li><strong>array to load.</strong> (<em>the</em>) – </li> </ul> </td> </tr> <tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><p class="first">numpy array with the data read from the file.</p> </td> </tr> -<tr class="field-odd field"><th class="field-name">Return type:</th><td class="field-body"><p class="first last">nparray (numpy.ndarray)</p> +<tr class="field-odd field"><th class="field-name">Return type:</th><td class="field-body"><p class="first last">ndarray</p> </td> </tr> </tbody> @@ -649,25 +321,30 @@ on what the h5py module already provides.</p> </dd></dl> </div> -<div class="section" id="module-cfelpyutils.cfel_optarg"> -<span id="cfelpyutils-cfel-optarg-module"></span><h2>cfelpyutils.cfel_optarg module<a class="headerlink" href="#module-cfelpyutils.cfel_optarg" title="Permalink to this headline">¶</a></h2> +<div class="section" id="module-cfelpyutils.parameter_utils"> +<span id="cfelpyutils-parameter-utils-module"></span><h2>cfelpyutils.parameter_utils module<a class="headerlink" href="#module-cfelpyutils.parameter_utils" title="Permalink to this headline">¶</a></h2> <p>Utilities for parsing command line options and configuration files.</p> <p>This module contains utilities for parsing of command line options and configuration files.</p> <dl class="function"> -<dt id="cfelpyutils.cfel_optarg.parse_parameters"> -<code class="descclassname">cfelpyutils.cfel_optarg.</code><code class="descname">parse_parameters</code><span class="sig-paren">(</span><em>config</em><span class="sig-paren">)</span><a class="headerlink" href="#cfelpyutils.cfel_optarg.parse_parameters" title="Permalink to this definition">¶</a></dt> -<dd><p>Sets correct types for parameter dictionaries.</p> -<p>Reads a parameter dictionary returned by the ConfigParser python module, and assigns correct types to parameters, -without changing the structure of the dictionary.</p> -<p>The parser tries to interpret each entry in the dictionary according to the following rules:</p> +<dt id="cfelpyutils.parameter_utils.convert_parameters"> +<code class="descclassname">cfelpyutils.parameter_utils.</code><code class="descname">convert_parameters</code><span class="sig-paren">(</span><em>config_dict</em><span class="sig-paren">)</span><a class="headerlink" href="#cfelpyutils.parameter_utils.convert_parameters" title="Permalink to this definition">¶</a></dt> +<dd><p>Convert strings in parameter dictionaries to the corrent data type.</p> +<p>Read a parameter dictionary returned by the ConfigParser python module, +and assign correct types to the parameters, without changing the structure +of the dictionary.</p> +<p>Try to interpret each entry in the dictionary according to the following +rules. The first rule that returns an valid result determines the type in +which the entry will be converted.</p> <ul> <li><p class="first">If the entry starts and ends with a single quote or double quote, it is interpreted as a string.</p> </li> -<li><p class="first">If the entry starts and ends with a square bracket, it is interpreted as a list.</p> +<li><p class="first">If the entry starts and ends with a square bracket, it is interpreted as +a list.</p> </li> -<li><p class="first">If the entry starts and ends with a brace, it is interpreted as a dictionary.</p> +<li><p class="first">If the entry starts and ends with a brace, it is interpreted as a +dictionary.</p> </li> <li><p class="first">If the entry is the word None, without quotes, then the entry is interpreted as NoneType.</p> @@ -687,55 +364,40 @@ the parser tries to interpret the entry in order as:</p> <li>A string.</li> </ul> </div></blockquote> -<p>The first choice that succeeds determines the entry type.</p> </li> </ul> <table class="docutils field-list" frame="void" rules="none"> <col class="field-name" /> <col class="field-body" /> <tbody valign="top"> -<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>config</strong> (<em>class RawConfigParser</em>) – ConfigParser instance.</td> +<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>config</strong> (<em>dict</em>) – a dictionary containing the parameters as strings +(the dictionary as returned by COnfig Parser).</td> </tr> -<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body">dictionary with the same structure as the input dictionary, but with correct types -assigned to each entry.</td> +<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><dl class="docutils"> +<dt>dictionary with the same structure as the input</dt> +<dd>dictionary, but with correct types assigned to each entry.</dd> +</dl> +</td> </tr> -<tr class="field-odd field"><th class="field-name">Return type:</th><td class="field-body">monitor_params (dict)</td> +<tr class="field-odd field"><th class="field-name">Return type:</th><td class="field-body">dict</td> </tr> </tbody> </table> </dd></dl> </div> -<div class="section" id="module-cfelpyutils.cfel_psana"> -<span id="cfelpyutils-cfel-psana-module"></span><h2>cfelpyutils.cfel_psana module<a class="headerlink" href="#module-cfelpyutils.cfel_psana" title="Permalink to this headline">¶</a></h2> -<p>Utilities based on the psana python module.</p> -<p>This module provides utilities that build on the functionality provided by the psana python module.</p> -<dl class="function"> -<dt id="cfelpyutils.cfel_psana.dirname_from_source_runs"> -<code class="descclassname">cfelpyutils.cfel_psana.</code><code class="descname">dirname_from_source_runs</code><span class="sig-paren">(</span><em>source</em><span class="sig-paren">)</span><a class="headerlink" href="#cfelpyutils.cfel_psana.dirname_from_source_runs" title="Permalink to this definition">¶</a></dt> -<dd><p>Returns a directory name based on a psana source string.</p> -<p>Takes a psana source string (e.g exp=CXI/cxix….) and returns a string that can be used as a subdirectory name or -a prefix for files and directories.</p> -<table class="docutils field-list" frame="void" rules="none"> -<col class="field-name" /> -<col class="field-body" /> -<tbody valign="top"> -<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>source</strong> (<em>str</em>) – a psana source string (e.g. exp=CXI/cxi….).</td> -</tr> -<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body">a string that can be used as a filename or a prefix .</td> -</tr> -<tr class="field-odd field"><th class="field-name">Return type:</th><td class="field-body">dirname (str)</td> -</tr> -</tbody> -</table> -</dd></dl> - +<div class="section" id="module-cfelpyutils.psana_utils"> +<span id="cfelpyutils-psana-utils-module"></span><h2>cfelpyutils.psana_utils module<a class="headerlink" href="#module-cfelpyutils.psana_utils" title="Permalink to this headline">¶</a></h2> +<p>Utilities for the psana python module.</p> +<p>This module provides utilities that build on the functionality provided by the +psana python module (developed at the SLAC National Laboratories).</p> <dl class="function"> -<dt id="cfelpyutils.cfel_psana.psana_event_inspection"> -<code class="descclassname">cfelpyutils.cfel_psana.</code><code class="descname">psana_event_inspection</code><span class="sig-paren">(</span><em>source</em><span class="sig-paren">)</span><a class="headerlink" href="#cfelpyutils.cfel_psana.psana_event_inspection" title="Permalink to this definition">¶</a></dt> -<dd><p>Prints the structure of psana events.</p> -<p>Takes a psana source string (e.g. exp=CXI/cxix….) and inspects the structure of the first event in the data, -printing information about the the content of the event.</p> +<dt id="cfelpyutils.psana_utils.first_event_inspection"> +<code class="descclassname">cfelpyutils.psana_utils.</code><code class="descname">first_event_inspection</code><span class="sig-paren">(</span><em>source</em><span class="sig-paren">)</span><a class="headerlink" href="#cfelpyutils.psana_utils.first_event_inspection" title="Permalink to this definition">¶</a></dt> +<dd><p>Inspect the content of the first psana event.</p> +<p>Takes psana source string (e.g. exp=CXI/cxix….) and inspect the +content in the first event in the data described by the string. +Print information about the the content of the event.</p> <table class="docutils field-list" frame="void" rules="none"> <col class="field-name" /> <col class="field-body" /> @@ -746,25 +408,6 @@ printing information about the the content of the event.</p> </table> </dd></dl> -<dl class="function"> -<dt id="cfelpyutils.cfel_psana.psana_obj_from_string"> -<code class="descclassname">cfelpyutils.cfel_psana.</code><code class="descname">psana_obj_from_string</code><span class="sig-paren">(</span><em>name</em><span class="sig-paren">)</span><a class="headerlink" href="#cfelpyutils.cfel_psana.psana_obj_from_string" title="Permalink to this definition">¶</a></dt> -<dd><p>Converts a string into a psana object type.</p> -<p>Takes a string and returns the python object type described by the string.</p> -<table class="docutils field-list" frame="void" rules="none"> -<col class="field-name" /> -<col class="field-body" /> -<tbody valign="top"> -<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>name</strong> (<em>str</em>) – a string describing a python type.</td> -</tr> -<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body">the python type described by the string.</td> -</tr> -<tr class="field-odd field"><th class="field-name">Return type:</th><td class="field-body">mod (type)</td> -</tr> -</tbody> -</table> -</dd></dl> - </div> <div class="section" id="module-cfelpyutils"> <span id="module-contents"></span><h2>Module contents<a class="headerlink" href="#module-cfelpyutils" title="Permalink to this headline">¶</a></h2> diff --git a/doc/build/html/genindex.html b/doc/build/html/genindex.html index 0d9e625..c5faf62 100644 --- a/doc/build/html/genindex.html +++ b/doc/build/html/genindex.html @@ -72,16 +72,12 @@ <div class="genindex-jumpbox"> <a href="#A"><strong>A</strong></a> | <a href="#C"><strong>C</strong></a> - | <a href="#D"><strong>D</strong></a> | <a href="#F"><strong>F</strong></a> - | <a href="#G"><strong>G</strong></a> | <a href="#I"><strong>I</strong></a> | <a href="#L"><strong>L</strong></a> - | <a href="#N"><strong>N</strong></a> | <a href="#P"><strong>P</strong></a> | <a href="#R"><strong>R</strong></a> | <a href="#S"><strong>S</strong></a> - | <a href="#W"><strong>W</strong></a> | <a href="#X"><strong>X</strong></a> | <a href="#Y"><strong>Y</strong></a> @@ -89,15 +85,11 @@ <h2 id="A">A</h2> <table style="width: 100%" class="indextable genindextable"><tr> <td style="width: 33%; vertical-align: top;"><ul> - <li><a href="cfelpyutils.html#cfelpyutils.cfel_cxi.CXIWriter.add_stack_to_writer">add_stack_to_writer() (cfelpyutils.cfel_cxi.CXIWriter method)</a> -</li> - <li><a href="cfelpyutils.html#cfelpyutils.cfel_cxi.CXIWriter.append_data_to_stack">append_data_to_stack() (cfelpyutils.cfel_cxi.CXIWriter method)</a> + <li><a href="cfelpyutils.html#cfelpyutils.geometry_utils.adjust_pixel_maps_for_pyqtgraph">adjust_pixel_maps_for_pyqtgraph() (in module cfelpyutils.geometry_utils)</a> </li> </ul></td> <td style="width: 33%; vertical-align: top;"><ul> - <li><a href="cfelpyutils.html#cfelpyutils.cfel_geom.apply_geometry_from_file">apply_geometry_from_file() (in module cfelpyutils.cfel_geom)</a> -</li> - <li><a href="cfelpyutils.html#cfelpyutils.cfel_geom.apply_geometry_from_pixel_maps">apply_geometry_from_pixel_maps() (in module cfelpyutils.cfel_geom)</a> + <li><a href="cfelpyutils.html#cfelpyutils.geometry_utils.apply_pixel_maps">apply_pixel_maps() (in module cfelpyutils.geometry_utils)</a> </li> </ul></td> </tr></table> @@ -107,37 +99,23 @@ <td style="width: 33%; vertical-align: top;"><ul> <li><a href="cfelpyutils.html#module-cfelpyutils">cfelpyutils (module)</a> </li> - <li><a href="cfelpyutils.html#module-cfelpyutils.cfel_crystfel">cfelpyutils.cfel_crystfel (module)</a> -</li> - <li><a href="cfelpyutils.html#module-cfelpyutils.cfel_cxi">cfelpyutils.cfel_cxi (module)</a> -</li> - <li><a href="cfelpyutils.html#module-cfelpyutils.cfel_fabio">cfelpyutils.cfel_fabio (module)</a> + <li><a href="cfelpyutils.html#module-cfelpyutils.crystfel_utils">cfelpyutils.crystfel_utils (module)</a> </li> - <li><a href="cfelpyutils.html#module-cfelpyutils.cfel_geom">cfelpyutils.cfel_geom (module)</a> + <li><a href="cfelpyutils.html#module-cfelpyutils.geometry_utils">cfelpyutils.geometry_utils (module)</a> </li> - <li><a href="cfelpyutils.html#module-cfelpyutils.cfel_hdf5">cfelpyutils.cfel_hdf5 (module)</a> + <li><a href="cfelpyutils.html#module-cfelpyutils.hdf5_utils">cfelpyutils.hdf5_utils (module)</a> </li> </ul></td> <td style="width: 33%; vertical-align: top;"><ul> - <li><a href="cfelpyutils.html#module-cfelpyutils.cfel_optarg">cfelpyutils.cfel_optarg (module)</a> + <li><a href="cfelpyutils.html#module-cfelpyutils.parameter_utils">cfelpyutils.parameter_utils (module)</a> </li> - <li><a href="cfelpyutils.html#module-cfelpyutils.cfel_psana">cfelpyutils.cfel_psana (module)</a> + <li><a href="cfelpyutils.html#module-cfelpyutils.psana_utils">cfelpyutils.psana_utils (module)</a> </li> - <li><a href="cfelpyutils.html#cfelpyutils.cfel_cxi.CXIWriter.close_file">close_file() (cfelpyutils.cfel_cxi.CXIWriter method)</a> + <li><a href="cfelpyutils.html#cfelpyutils.geometry_utils.compute_minimum_image_size">compute_minimum_image_size() (in module cfelpyutils.geometry_utils)</a> </li> - <li><a href="cfelpyutils.html#cfelpyutils.cfel_cxi.CXIWriter.create_link">create_link() (cfelpyutils.cfel_cxi.CXIWriter method)</a> + <li><a href="cfelpyutils.html#cfelpyutils.geometry_utils.compute_pixel_maps">compute_pixel_maps() (in module cfelpyutils.geometry_utils)</a> </li> - <li><a href="cfelpyutils.html#cfelpyutils.cfel_cxi.CXIWriter.create_link_to_group">create_link_to_group() (cfelpyutils.cfel_cxi.CXIWriter method)</a> -</li> - <li><a href="cfelpyutils.html#cfelpyutils.cfel_cxi.CXIWriter">CXIWriter (class in cfelpyutils.cfel_cxi)</a> -</li> - </ul></td> -</tr></table> - -<h2 id="D">D</h2> -<table style="width: 100%" class="indextable genindextable"><tr> - <td style="width: 33%; vertical-align: top;"><ul> - <li><a href="cfelpyutils.html#cfelpyutils.cfel_psana.dirname_from_source_runs">dirname_from_source_runs() (in module cfelpyutils.cfel_psana)</a> + <li><a href="cfelpyutils.html#cfelpyutils.parameter_utils.convert_parameters">convert_parameters() (in module cfelpyutils.parameter_utils)</a> </li> </ul></td> </tr></table> @@ -145,23 +123,11 @@ <h2 id="F">F</h2> <table style="width: 100%" class="indextable genindextable"><tr> <td style="width: 33%; vertical-align: top;"><ul> - <li><a href="cfelpyutils.html#cfelpyutils.cfel_cxi.CXIWriter.file_is_full">file_is_full() (cfelpyutils.cfel_cxi.CXIWriter method)</a> -</li> - </ul></td> - <td style="width: 33%; vertical-align: top;"><ul> - <li><a href="cfelpyutils.html#cfelpyutils.cfel_geom.ImageShape.fs">fs (cfelpyutils.cfel_geom.ImageShape attribute)</a> -</li> - </ul></td> -</tr></table> - -<h2 id="G">G</h2> -<table style="width: 100%" class="indextable genindextable"><tr> - <td style="width: 33%; vertical-align: top;"><ul> - <li><a href="cfelpyutils.html#cfelpyutils.cfel_cxi.CXIWriter.get_file_handle">get_file_handle() (cfelpyutils.cfel_cxi.CXIWriter method)</a> + <li><a href="cfelpyutils.html#cfelpyutils.psana_utils.first_event_inspection">first_event_inspection() (in module cfelpyutils.psana_utils)</a> </li> </ul></td> <td style="width: 33%; vertical-align: top;"><ul> - <li><a href="cfelpyutils.html#cfelpyutils.cfel_geom.get_image_shape">get_image_shape() (in module cfelpyutils.cfel_geom)</a> + <li><a href="cfelpyutils.html#cfelpyutils.geometry_utils.ImageShape.fs">fs (cfelpyutils.geometry_utils.ImageShape attribute)</a> </li> </ul></td> </tr></table> @@ -169,13 +135,7 @@ <h2 id="I">I</h2> <table style="width: 100%" class="indextable genindextable"><tr> <td style="width: 33%; vertical-align: top;"><ul> - <li><a href="cfelpyutils.html#cfelpyutils.cfel_geom.ImageShape">ImageShape (class in cfelpyutils.cfel_geom)</a> -</li> - </ul></td> - <td style="width: 33%; vertical-align: top;"><ul> - <li><a href="cfelpyutils.html#cfelpyutils.cfel_cxi.CXIWriter.initialize_stacks">initialize_stacks() (cfelpyutils.cfel_cxi.CXIWriter method)</a> -</li> - <li><a href="cfelpyutils.html#cfelpyutils.cfel_cxi.CXIWriter.is_entry_in_file">is_entry_in_file() (cfelpyutils.cfel_cxi.CXIWriter method)</a> + <li><a href="cfelpyutils.html#cfelpyutils.geometry_utils.ImageShape">ImageShape (class in cfelpyutils.geometry_utils)</a> </li> </ul></td> </tr></table> @@ -183,19 +143,11 @@ <h2 id="L">L</h2> <table style="width: 100%" class="indextable genindextable"><tr> <td style="width: 33%; vertical-align: top;"><ul> - <li><a href="cfelpyutils.html#cfelpyutils.cfel_crystfel.load_crystfel_geometry">load_crystfel_geometry() (in module cfelpyutils.cfel_crystfel)</a> -</li> - </ul></td> - <td style="width: 33%; vertical-align: top;"><ul> - <li><a href="cfelpyutils.html#cfelpyutils.cfel_hdf5.load_nparray_from_hdf5_file">load_nparray_from_hdf5_file() (in module cfelpyutils.cfel_hdf5)</a> + <li><a href="cfelpyutils.html#cfelpyutils.crystfel_utils.load_crystfel_geometry">load_crystfel_geometry() (in module cfelpyutils.crystfel_utils)</a> </li> </ul></td> -</tr></table> - -<h2 id="N">N</h2> -<table style="width: 100%" class="indextable genindextable"><tr> <td style="width: 33%; vertical-align: top;"><ul> - <li><a href="cfelpyutils.html#cfelpyutils.cfel_cxi.CXIWriter.num_slices_in_file">num_slices_in_file() (cfelpyutils.cfel_cxi.CXIWriter method)</a> + <li><a href="cfelpyutils.html#cfelpyutils.hdf5_utils.load_nparray_from_hdf5_file">load_nparray_from_hdf5_file() (in module cfelpyutils.hdf5_utils)</a> </li> </ul></td> </tr></table> @@ -203,19 +155,7 @@ <h2 id="P">P</h2> <table style="width: 100%" class="indextable genindextable"><tr> <td style="width: 33%; vertical-align: top;"><ul> - <li><a href="cfelpyutils.html#cfelpyutils.cfel_optarg.parse_parameters">parse_parameters() (in module cfelpyutils.cfel_optarg)</a> -</li> - <li><a href="cfelpyutils.html#cfelpyutils.cfel_geom.pixel_maps_for_image_view">pixel_maps_for_image_view() (in module cfelpyutils.cfel_geom)</a> -</li> - <li><a href="cfelpyutils.html#cfelpyutils.cfel_geom.pixel_maps_from_geometry_file">pixel_maps_from_geometry_file() (in module cfelpyutils.cfel_geom)</a> -</li> - </ul></td> - <td style="width: 33%; vertical-align: top;"><ul> - <li><a href="cfelpyutils.html#cfelpyutils.cfel_geom.PixelMaps">PixelMaps (class in cfelpyutils.cfel_geom)</a> -</li> - <li><a href="cfelpyutils.html#cfelpyutils.cfel_psana.psana_event_inspection">psana_event_inspection() (in module cfelpyutils.cfel_psana)</a> -</li> - <li><a href="cfelpyutils.html#cfelpyutils.cfel_psana.psana_obj_from_string">psana_obj_from_string() (in module cfelpyutils.cfel_psana)</a> + <li><a href="cfelpyutils.html#cfelpyutils.geometry_utils.PixelMaps">PixelMaps (class in cfelpyutils.geometry_utils)</a> </li> </ul></td> </tr></table> @@ -223,11 +163,7 @@ <h2 id="R">R</h2> <table style="width: 100%" class="indextable genindextable"><tr> <td style="width: 33%; vertical-align: top;"><ul> - <li><a href="cfelpyutils.html#cfelpyutils.cfel_geom.PixelMaps.r">r (cfelpyutils.cfel_geom.PixelMaps attribute)</a> -</li> - </ul></td> - <td style="width: 33%; vertical-align: top;"><ul> - <li><a href="cfelpyutils.html#cfelpyutils.cfel_fabio.read_cbf_from_stream">read_cbf_from_stream() (in module cfelpyutils.cfel_fabio)</a> + <li><a href="cfelpyutils.html#cfelpyutils.geometry_utils.PixelMaps.r">r (cfelpyutils.geometry_utils.PixelMaps attribute)</a> </li> </ul></td> </tr></table> @@ -235,23 +171,7 @@ <h2 id="S">S</h2> <table style="width: 100%" class="indextable genindextable"><tr> <td style="width: 33%; vertical-align: top;"><ul> - <li><a href="cfelpyutils.html#cfelpyutils.cfel_geom.ImageShape.ss">ss (cfelpyutils.cfel_geom.ImageShape attribute)</a> -</li> - </ul></td> - <td style="width: 33%; vertical-align: top;"><ul> - <li><a href="cfelpyutils.html#cfelpyutils.cfel_cxi.CXIWriter.stacks_are_initialized">stacks_are_initialized() (cfelpyutils.cfel_cxi.CXIWriter method)</a> -</li> - </ul></td> -</tr></table> - -<h2 id="W">W</h2> -<table style="width: 100%" class="indextable genindextable"><tr> - <td style="width: 33%; vertical-align: top;"><ul> - <li><a href="cfelpyutils.html#cfelpyutils.cfel_cxi.CXIWriter.write_simple_entry">write_simple_entry() (cfelpyutils.cfel_cxi.CXIWriter method)</a> -</li> - </ul></td> - <td style="width: 33%; vertical-align: top;"><ul> - <li><a href="cfelpyutils.html#cfelpyutils.cfel_cxi.CXIWriter.write_stack_slice_and_increment">write_stack_slice_and_increment() (cfelpyutils.cfel_cxi.CXIWriter method)</a> + <li><a href="cfelpyutils.html#cfelpyutils.geometry_utils.ImageShape.ss">ss (cfelpyutils.geometry_utils.ImageShape attribute)</a> </li> </ul></td> </tr></table> @@ -259,7 +179,7 @@ <h2 id="X">X</h2> <table style="width: 100%" class="indextable genindextable"><tr> <td style="width: 33%; vertical-align: top;"><ul> - <li><a href="cfelpyutils.html#cfelpyutils.cfel_geom.PixelMaps.x">x (cfelpyutils.cfel_geom.PixelMaps attribute)</a> + <li><a href="cfelpyutils.html#cfelpyutils.geometry_utils.PixelMaps.x">x (cfelpyutils.geometry_utils.PixelMaps attribute)</a> </li> </ul></td> </tr></table> @@ -267,7 +187,7 @@ <h2 id="Y">Y</h2> <table style="width: 100%" class="indextable genindextable"><tr> <td style="width: 33%; vertical-align: top;"><ul> - <li><a href="cfelpyutils.html#cfelpyutils.cfel_geom.PixelMaps.y">y (cfelpyutils.cfel_geom.PixelMaps attribute)</a> + <li><a href="cfelpyutils.html#cfelpyutils.geometry_utils.PixelMaps.y">y (cfelpyutils.geometry_utils.PixelMaps attribute)</a> </li> </ul></td> </tr></table> diff --git a/doc/build/html/modules.html b/doc/build/html/modules.html index ab88216..2d489b8 100644 --- a/doc/build/html/modules.html +++ b/doc/build/html/modules.html @@ -75,13 +75,11 @@ <ul> <li class="toctree-l1"><a class="reference internal" href="cfelpyutils.html">cfelpyutils package</a><ul> <li class="toctree-l2"><a class="reference internal" href="cfelpyutils.html#submodules">Submodules</a></li> -<li class="toctree-l2"><a class="reference internal" href="cfelpyutils.html#module-cfelpyutils.cfel_crystfel">cfelpyutils.cfel_crystfel module</a></li> -<li class="toctree-l2"><a class="reference internal" href="cfelpyutils.html#module-cfelpyutils.cfel_cxi">cfelpyutils.cfel_cxi module</a></li> -<li class="toctree-l2"><a class="reference internal" href="cfelpyutils.html#module-cfelpyutils.cfel_fabio">cfelpyutils.cfel_fabio module</a></li> -<li class="toctree-l2"><a class="reference internal" href="cfelpyutils.html#module-cfelpyutils.cfel_geom">cfelpyutils.cfel_geom module</a></li> -<li class="toctree-l2"><a class="reference internal" href="cfelpyutils.html#module-cfelpyutils.cfel_hdf5">cfelpyutils.cfel_hdf5 module</a></li> -<li class="toctree-l2"><a class="reference internal" href="cfelpyutils.html#module-cfelpyutils.cfel_optarg">cfelpyutils.cfel_optarg module</a></li> -<li class="toctree-l2"><a class="reference internal" href="cfelpyutils.html#module-cfelpyutils.cfel_psana">cfelpyutils.cfel_psana module</a></li> +<li class="toctree-l2"><a class="reference internal" href="cfelpyutils.html#module-cfelpyutils.crystfel_utils">cfelpyutils.crystfel_utils module</a></li> +<li class="toctree-l2"><a class="reference internal" href="cfelpyutils.html#module-cfelpyutils.geometry_utils">cfelpyutils.geometry_utils module</a></li> +<li class="toctree-l2"><a class="reference internal" href="cfelpyutils.html#module-cfelpyutils.hdf5_utils">cfelpyutils.hdf5_utils module</a></li> +<li class="toctree-l2"><a class="reference internal" href="cfelpyutils.html#module-cfelpyutils.parameter_utils">cfelpyutils.parameter_utils module</a></li> +<li class="toctree-l2"><a class="reference internal" href="cfelpyutils.html#module-cfelpyutils.psana_utils">cfelpyutils.psana_utils module</a></li> <li class="toctree-l2"><a class="reference internal" href="cfelpyutils.html#module-cfelpyutils">Module contents</a></li> </ul> </li> diff --git a/doc/build/html/objects.inv b/doc/build/html/objects.inv index 58c022b672f3c592ec4e297d5730487d69699b63..6b4b7bb567f5a59c95dcb2769a5a47c55470bd6a 100644 GIT binary patch delta 401 zcmV;C0dD@-1%w2UeSefYQo}G1hI^kv47Bk;L6aM#$V_G^C^Z{-9SihAk~0w%*Wh}b z1S!hHNob7R+57nR|994AEeaEQ&xIo<%%yI6f#i{}bG+`n6!$qZdmyuFm}53LAK&Rz zh+1f9=qa{AEz#SM$ZfBf=US1cTlO{d*jJ$I5>YQCZ1AN6gMW#}1UNTd$beF}ds*PU z<?G&K8O#;KR(ywI3C5M!J3(qYnVxz#9V(Qfpn2<^rzR1pj7ZvQOHKIj8w;i@JJTAB z5n%u?#4#;Rv`HmbT=tUkbT8ELPn-z+f2Cd1J{NqO=l1-+PzJ1pKwGON-6vZvM!Sp< zh&Is{D7#|BRez~1+ITU?_~=y`2MS6Qo%`#S+jzaWMdc}1&R|wCP7!gwnKzn|*=_AG zKn$?=cyZMR6;}=J_KgD8C{pV&n)?>%u{xI>_=Ad96!Gqmcs(5Q^Y!gWEbe9W1j)f& v6&LZxJQHTeL<TPNCiCRHybEuK(2cLkAz0R3(sL}=z6#|0DtZ3}33bA6Ydpj? delta 614 zcmV-s0-61U1lR?TeSep|Zrd;rfOkKIigY!R4q38x@(>_EhIAv&;z?pdkpxL4R;Rv3 zU$0NnqbSQx?Zu=PK_+=0@BiewL1o7wNaZU#KK4co3ak67KCQDZ^y)6{Y`<39&G}w@ z=d~MspqFw2QwGHHi??Wc3~r3zX3%wzMpxf1(bt&=S)kBCvVZSCcCStbbP-c4@cx#& zPvQ)O;66b8#)IJ>3zAIhjL2nLi&}620U~w67ei}hJn}}8zlu=~As|;$zpcrNwzkd; zwip_%<kItIP^uW#Vwl{<JJ4bU?@29#1SNlAimWdudXAb(iA%jsfc4OGuVjsWHDofC zgQLJK4iLrIsej_Qm%XI`O-@(~Io0&!1Ws`$r72T;x*>z#z+RgCel>|RsuSv-`-V5p zP;>(Q?z4JlY`po(L}|9`p~aUDEZ*Ke{{ygQ%6|yK$^8&8o8wD3&+>rk39QewXOU-a z4K3JV70OsZp&6vcWk{!_J2rx>l)Fl_QCHs2j?d%9{(mfE9&mrm$UM+V8QvH-Gv6hC ztb>g9o~+MxWha`4{OXO;={rnYa1Q1$#N~XIj1A!0e5H~+BZcS#g`PkzLYJ2j)`Nz8 zRVHyJq|>Ct+-c3=Xa=}J7ih$$C&zahAT&z6#RMq@n*GmZ9!TBZ$g6x1kHXZ|_VVoc zLS<<dQeQD_TGUbtJWPTL_Vl-aM31XUZWmuSr(-k!?8Gaon#!OG=KPYszyJ7(4i9n2 zLbTw^hC+4aK09uY8wvQ7Vx4YI;r(RWymVpL#v{18`%F)3>Fi6|e~z~Q1EibmE@q@R A00000 diff --git a/doc/build/html/py-modindex.html b/doc/build/html/py-modindex.html index d314a49..ba1ea0c 100644 --- a/doc/build/html/py-modindex.html +++ b/doc/build/html/py-modindex.html @@ -85,37 +85,27 @@ <tr class="cg-1"> <td></td> <td>    - <a href="cfelpyutils.html#module-cfelpyutils.cfel_crystfel"><code class="xref">cfelpyutils.cfel_crystfel</code></a></td><td> + <a href="cfelpyutils.html#module-cfelpyutils.crystfel_utils"><code class="xref">cfelpyutils.crystfel_utils</code></a></td><td> <em></em></td></tr> <tr class="cg-1"> <td></td> <td>    - <a href="cfelpyutils.html#module-cfelpyutils.cfel_cxi"><code class="xref">cfelpyutils.cfel_cxi</code></a></td><td> + <a href="cfelpyutils.html#module-cfelpyutils.geometry_utils"><code class="xref">cfelpyutils.geometry_utils</code></a></td><td> <em></em></td></tr> <tr class="cg-1"> <td></td> <td>    - <a href="cfelpyutils.html#module-cfelpyutils.cfel_fabio"><code class="xref">cfelpyutils.cfel_fabio</code></a></td><td> + <a href="cfelpyutils.html#module-cfelpyutils.hdf5_utils"><code class="xref">cfelpyutils.hdf5_utils</code></a></td><td> <em></em></td></tr> <tr class="cg-1"> <td></td> <td>    - <a href="cfelpyutils.html#module-cfelpyutils.cfel_geom"><code class="xref">cfelpyutils.cfel_geom</code></a></td><td> + <a href="cfelpyutils.html#module-cfelpyutils.parameter_utils"><code class="xref">cfelpyutils.parameter_utils</code></a></td><td> <em></em></td></tr> <tr class="cg-1"> <td></td> <td>    - <a href="cfelpyutils.html#module-cfelpyutils.cfel_hdf5"><code class="xref">cfelpyutils.cfel_hdf5</code></a></td><td> - <em></em></td></tr> - <tr class="cg-1"> - <td></td> - <td>    - <a href="cfelpyutils.html#module-cfelpyutils.cfel_optarg"><code class="xref">cfelpyutils.cfel_optarg</code></a></td><td> - <em></em></td></tr> - <tr class="cg-1"> - <td></td> - <td>    - <a href="cfelpyutils.html#module-cfelpyutils.cfel_psana"><code class="xref">cfelpyutils.cfel_psana</code></a></td><td> + <a href="cfelpyutils.html#module-cfelpyutils.psana_utils"><code class="xref">cfelpyutils.psana_utils</code></a></td><td> <em></em></td></tr> </table> diff --git a/doc/build/html/searchindex.js b/doc/build/html/searchindex.js index 87f178a..8c3bce2 100644 --- a/doc/build/html/searchindex.js +++ b/doc/build/html/searchindex.js @@ -1 +1 @@ -Search.setIndex({docnames:["cfelpyutils","index","modules"],envversion:53,filenames:["cfelpyutils.rst","index.rst","modules.rst"],objects:{"":{cfelpyutils:[0,0,0,"-"]},"cfelpyutils.cfel_crystfel":{load_crystfel_geometry:[0,1,1,""]},"cfelpyutils.cfel_cxi":{CXIWriter:[0,2,1,""]},"cfelpyutils.cfel_cxi.CXIWriter":{add_stack_to_writer:[0,3,1,""],append_data_to_stack:[0,3,1,""],close_file:[0,3,1,""],create_link:[0,3,1,""],create_link_to_group:[0,3,1,""],file_is_full:[0,3,1,""],get_file_handle:[0,3,1,""],initialize_stacks:[0,3,1,""],is_entry_in_file:[0,3,1,""],num_slices_in_file:[0,3,1,""],stacks_are_initialized:[0,3,1,""],write_simple_entry:[0,3,1,""],write_stack_slice_and_increment:[0,3,1,""]},"cfelpyutils.cfel_fabio":{read_cbf_from_stream:[0,1,1,""]},"cfelpyutils.cfel_geom":{ImageShape:[0,2,1,""],PixelMaps:[0,2,1,""],apply_geometry_from_file:[0,1,1,""],apply_geometry_from_pixel_maps:[0,1,1,""],get_image_shape:[0,1,1,""],pixel_maps_for_image_view:[0,1,1,""],pixel_maps_from_geometry_file:[0,1,1,""]},"cfelpyutils.cfel_geom.ImageShape":{fs:[0,4,1,""],ss:[0,4,1,""]},"cfelpyutils.cfel_geom.PixelMaps":{r:[0,4,1,""],x:[0,4,1,""],y:[0,4,1,""]},"cfelpyutils.cfel_hdf5":{load_nparray_from_hdf5_file:[0,1,1,""]},"cfelpyutils.cfel_optarg":{parse_parameters:[0,1,1,""]},"cfelpyutils.cfel_psana":{dirname_from_source_runs:[0,1,1,""],psana_event_inspection:[0,1,1,""],psana_obj_from_string:[0,1,1,""]},cfelpyutils:{cfel_crystfel:[0,0,0,"-"],cfel_cxi:[0,0,0,"-"],cfel_fabio:[0,0,0,"-"],cfel_geom:[0,0,0,"-"],cfel_hdf5:[0,0,0,"-"],cfel_optarg:[0,0,0,"-"],cfel_psana:[0,0,0,"-"]}},objnames:{"0":["py","module","Python module"],"1":["py","function","Python function"],"2":["py","class","Python class"],"3":["py","method","Python method"],"4":["py","attribute","Python attribute"]},objtypes:{"0":"py:module","1":"py:function","2":"py:class","3":"py:method","4":"py:attribute"},terms:{"boolean":0,"byte":0,"case":0,"class":0,"default":0,"float":0,"function":0,"import":0,"int":0,"new":0,"return":0,"true":0,For:0,Its:0,THe:0,The:0,Use:0,about:0,access:0,accord:0,across:0,add:0,add_stack_to_writ:0,added:0,adher:0,after:0,again:0,against:0,alia:0,all:0,allow:0,allowa:0,alreadi:0,also:0,amost:0,ani:0,anoth:0,api:0,appear:0,append:0,append_data_to_stack:0,appli:0,apply_geometry_from_fil:0,apply_geometry_from_pixel_map:0,argument:0,arrai:0,assign:0,attempt:0,attribut:0,automat:0,axes:0,backcspad:0,base:0,beam:0,been:0,befor:0,block:0,bool:0,brace:0,bracket:0,buffer:0,build:0,can:0,cannot:0,cbf_obj:0,cbfimag:0,center:0,cfel:0,cfel_crystfel:2,cfel_cxi:2,cfel_fabio:2,cfel_geom:2,cfel_hdf5:2,cfel_optarg:2,cfel_psana:2,cfelfabio:0,cfelgeom:0,cfelhdf5:0,cfeloptarg:0,cfelpsana:0,chang:0,characterist:0,check:0,choic:0,chuck:0,chunk:0,chunk_siz:0,close:0,close_fil:0,command:0,compress:0,comput:0,config:0,configpars:0,configur:0,contain:0,content:[1,2],convers:0,convert:0,coordin:0,corner:0,correct:0,count:0,counter1:0,counter2:0,cours:0,cover:0,creat:0,create_link:0,create_link_to_group:0,crystfel:0,crystfel_geometri:0,cxi:0,cxidb:0,cxiwrit:0,cxix:0,data:0,data_as_slab:0,data_filenam:0,data_group:0,dataset:0,defin:0,delet:0,describ:0,detector1:0,detector2:0,detector:0,detector_1:0,detectorname1:0,detectorname2:0,determin:0,dict:0,dictionari:0,directori:0,dirnam:0,dirname_from_source_run:0,distanc:0,document:0,doubl:0,dtype:0,dure:0,each:0,either:0,end:0,ensur:0,entri:0,entry_1:0,error:0,etc:0,event:0,exampl:0,exist:0,exp:0,expand:0,extract:0,fabio:0,fals:0,field:0,file:0,file_is_ful:0,filenam:0,first:0,fix:0,fnam:0,follow:0,form:0,format:0,found:0,frame:0,from:0,frontcspad:0,full:0,further:0,gener:0,geometri:0,geometry_filenam:0,get:0,get_detector_geometry_2:0,get_file_handl:0,get_image_shap:0,group:0,h5py:0,handl:0,has:0,have:0,hdf5:0,hit:0,hold:0,html:0,http:0,identifi:0,im_out:0,imag:0,imageshap:0,imageview:0,img_shap:0,implement:0,index:1,inform:0,initi:0,initial_data:0,initialize_stack:0,input:0,inspect:0,instanc:0,instanti:0,instead:0,integ:0,interact:0,intern:0,interoper:0,interpret:0,is_entry_in_fil:0,keep:0,kei:0,layout:0,left:0,level:0,like:0,line:0,link:0,list:0,load:0,load_crystfel_geometri:0,load_nparray_from_hdf5_fil:0,locat:0,low:0,make:0,manag:0,mani:0,manual:0,map:0,match:0,max_num_slic:0,maximum:0,minimum:0,miss:0,mod:0,modul:[1,2],monitor_param:0,more:0,multi:0,must:0,nake:0,name:0,ndarrai:0,need:0,never:0,next:0,non:0,none:0,nonetyp:0,normal:0,nparrai:0,num_slic:0,num_slices_in_fil:0,number:0,number_of_entri:0,numpi:0,object:0,onc:0,one:0,onli:0,open:0,oper:0,oppos:0,option:0,order:0,org:0,origin:0,otherwis:0,out:0,output:0,overwrit:0,overwritten:0,own:0,p11:0,packag:2,page:1,paramet:0,pars:0,parse_paramet:0,parser:0,path:0,payload:0,petraiii:0,physic:0,pixel:0,pixel_maps_for_image_view:0,pixel_maps_from_geometry_fil:0,pixelmap:0,point:0,prefix:0,present:0,previou:0,print:0,process:0,project:0,provid:0,psana:0,psana_event_inspect:0,psana_obj_from_str:0,pyqtgraph:0,python:0,quot:0,rai:0,rais:0,rand:0,random:0,rawconfigpars:0,read:0,read_cbf_from_stream:0,receiv:0,refer:0,reimplement:0,relev:0,replac:0,repres:0,represent:0,reset:0,respect:0,result:0,ret:0,risk:0,rule:0,same:0,search:1,see:0,sender:0,set:0,sever:0,shape:0,simpl:0,singl:0,size:0,slab:0,slice:0,softwar:0,sourc:0,specifi:0,squar:0,stack:0,stacks_are_initi:0,start:0,statu:0,str:0,stream:0,string:0,structur:0,style:0,subdirectori:0,submodul:2,subsequ:0,succe:0,sure:0,sync:0,synchron:0,system:0,take:0,test1:0,test2:0,tfel:0,than:0,thei:0,them:0,thi:0,time:0,top:0,tri:0,tupl:0,turn:0,type:0,union:0,unless:0,usag:0,use:0,used:0,user:0,using:0,util:0,valid:0,valu:0,verbatim:0,visual:0,wai:0,want:0,what:0,where:0,which:0,widget:0,without:0,word:0,work:0,write:0,write_simple_entri:0,write_slice_and_incr:0,write_stack_slice_and_incr:0,writer:0,written:0,writter:0,www:0,your:0},titles:["cfelpyutils package","Welcome to cfelpyutils\u2019s documentation!","cfelpyutils"],titleterms:{cfel_crystfel:0,cfel_cxi:0,cfel_fabio:0,cfel_geom:0,cfel_hdf5:0,cfel_optarg:0,cfel_psana:0,cfelpyutil:[0,1,2],content:0,document:1,indic:1,modul:0,packag:0,submodul:0,tabl:1,welcom:1}}) \ No newline at end of file +Search.setIndex({docnames:["cfelpyutils","index","modules"],envversion:53,filenames:["cfelpyutils.rst","index.rst","modules.rst"],objects:{"":{cfelpyutils:[0,0,0,"-"]},"cfelpyutils.crystfel_utils":{load_crystfel_geometry:[0,1,1,""]},"cfelpyutils.geometry_utils":{ImageShape:[0,2,1,""],PixelMaps:[0,2,1,""],adjust_pixel_maps_for_pyqtgraph:[0,1,1,""],apply_pixel_maps:[0,1,1,""],compute_minimum_image_size:[0,1,1,""],compute_pixel_maps:[0,1,1,""]},"cfelpyutils.geometry_utils.ImageShape":{fs:[0,3,1,""],ss:[0,3,1,""]},"cfelpyutils.geometry_utils.PixelMaps":{r:[0,3,1,""],x:[0,3,1,""],y:[0,3,1,""]},"cfelpyutils.hdf5_utils":{load_nparray_from_hdf5_file:[0,1,1,""]},"cfelpyutils.parameter_utils":{convert_parameters:[0,1,1,""]},"cfelpyutils.psana_utils":{first_event_inspection:[0,1,1,""]},cfelpyutils:{crystfel_utils:[0,0,0,"-"],geometry_utils:[0,0,0,"-"],hdf5_utils:[0,0,0,"-"],parameter_utils:[0,0,0,"-"],psana_utils:[0,0,0,"-"]}},objnames:{"0":["py","module","Python module"],"1":["py","function","Python function"],"2":["py","class","Python class"],"3":["py","attribute","Python attribute"]},objtypes:{"0":"py:module","1":"py:function","2":"py:class","3":"py:attribute"},terms:{"41a8fa9819010fe8ddeb66676fee717f5226c7b8":0,"boolean":0,"byte":[],"case":[],"class":0,"default":0,"float":0,"function":0,"import":0,"int":[],"new":[],"return":0,"true":0,"try":0,For:0,Its:[],THe:[],The:0,Use:[],about:0,access:[],accord:0,across:[],add:[],add_stack_to_writ:[],added:[],adher:[],adjust:0,adjust_pixel_maps_for_pyqtgraph:0,after:[],again:[],against:[],alia:0,all:[],allow:0,allowa:[],almost:0,alreadi:0,also:[],amost:[],ani:[],anoth:[],api:[],appear:0,append:[],append_data_to_stack:[],appli:0,apply_geometry_from_fil:[],apply_geometry_from_pixel_map:[],apply_pixel_map:0,argument:0,arrai:0,assign:0,assum:0,attempt:[],attribut:[],automat:0,axes:[],backcspad:[],base:0,beam:0,been:[],befor:[],block:0,bool:[],brace:0,bracket:0,buffer:[],build:0,can:0,cannot:[],cbf_obj:[],cbfimag:[],center:0,cfel:0,cfel_crystfel:[],cfel_cxi:[],cfel_fabio:[],cfel_geom:[],cfel_hdf5:[],cfel_optarg:[],cfel_psana:[],cfelfabio:0,cfelgeom:0,cfelhdf5:0,cfeloptarg:0,cfelpsana:0,chang:0,characterist:[],check:[],choic:[],chuck:[],chunk:[],chunk_siz:[],close:[],close_fil:[],code:0,command:0,commit:0,compress:[],comput:0,compute_minimum_image_s:0,compute_pixel_map:0,config:0,config_dict:0,configpars:0,configur:0,contain:0,content:[1,2],convers:[],convert:0,convert_paramet:0,coordin:0,corner:[],correct:0,corrent:0,count:[],counter1:[],counter2:[],cours:[],cover:[],creat:0,create_link:[],create_link_to_group:[],crystfel:0,crystfel_geometri:0,crystfel_util:2,cxi:0,cxidb:[],cxiwrit:[],cxix:0,data:0,data_as_slab:0,data_filenam:0,data_group:0,dataset:[],defin:[],delet:[],describ:0,detector1:[],detector2:[],detector:0,detector_1:[],detectorname1:[],detectorname2:[],determin:0,develop:0,dict:0,dictionari:0,directori:[],dirnam:[],dirname_from_source_run:[],distanc:0,document:0,doubl:0,dtype:0,dure:[],each:0,either:[],element:0,end:0,ensur:[],entri:0,entry_1:[],error:[],essenti:0,etc:0,event:0,exampl:[],exist:[],exp:0,expand:0,extract:[],fabio:0,fals:0,field:0,file:0,file_is_ful:[],filenam:0,first:0,first_event_inspect:0,fix:[],float32:0,fnam:[],follow:0,form:[],format:0,found:[],frame:[],from:0,frontcspad:[],full:0,further:[],gener:0,geometri:0,geometry_filenam:[],geometry_util:2,get:[],get_detector_geometry_2:0,get_file_handl:[],get_image_shap:[],group:[],h5py:0,handl:[],has:[],have:[],hdf5:0,hdf5_util:2,hit:[],hold:0,html:0,http:[],identifi:[],im_out:[],imag:0,imageshap:0,imageview:0,img_shap:[],implement:[],index:1,inform:0,initi:[],initial_data:[],initialize_stack:[],input:0,inspect:0,instanc:[],instanti:[],instead:[],integ:0,interact:0,intern:0,interoper:0,interpret:0,is_entry_in_fil:[],keep:0,kei:0,laboratori:0,layout:0,left:0,level:[],like:0,line:0,link:[],list:0,load:0,load_crystfel_geometri:0,load_nparray_from_hdf5_fil:0,locat:[],low:[],make:[],manag:[],mani:0,manual:0,map:0,match:0,max_num_slic:[],maximum:[],minimum:0,miss:[],mod:[],modul:[1,2],monitor_param:[],more:[],move:0,multi:[],must:[],nake:[],name:[],nation:0,ndarrai:0,need:[],never:[],next:[],non:0,none:0,nonetyp:0,normal:[],nparrai:[],num_slic:[],num_slices_in_fil:[],number:0,number_of_entri:[],numpi:0,object:0,onc:[],one:0,onli:[],open:[],oper:[],oppos:[],option:0,order:0,org:[],origin:0,otherwis:[],out:[],output:0,output_arrai:0,overwrit:[],overwritten:[],own:[],p11:[],packag:2,page:1,paramet:0,parameter_util:2,pars:0,parse_paramet:[],parser:0,path:0,payload:[],petraiii:[],physic:0,pixel:0,pixel_map:0,pixel_maps_for_image_view:[],pixel_maps_from_geometry_fil:[],pixelmap:0,point:0,prefix:[],present:[],previou:0,print:0,process:0,project:0,provid:0,psana:0,psana_event_inspect:[],psana_obj_from_str:[],psana_util:2,pyqtgraph:0,python:0,quot:0,rai:0,rais:[],rand:[],random:[],rawconfigpars:[],read:0,read_cbf_from_stream:[],receiv:[],refer:0,reimplement:0,relev:[],replac:[],repres:0,represent:0,reset:[],respect:0,result:0,ret:[],risk:[],rule:0,same:0,search:1,see:0,sender:[],set:[],sever:0,shape:0,simpl:[],singl:0,size:0,slab:0,slac:0,slice:[],softwar:0,sourc:0,specifi:[],squar:0,stack:[],stacks_are_initi:[],start:0,statu:[],str:0,stream:[],string:0,structur:0,style:0,subdirectori:[],submodul:2,subsequ:[],succe:[],sure:[],sync:0,synchron:[],system:0,take:0,test1:[],test2:[],tfel:0,than:[],thei:[],them:[],thi:0,third:0,three:0,time:[],top:0,tri:0,tupl:0,turn:0,two:0,type:0,union:[],unless:[],usag:[],use:0,used:0,user:[],using:[],util:0,valid:0,valu:0,verbatim:0,visual:0,wai:[],want:[],what:0,where:[],which:0,widget:0,without:0,word:0,work:0,write:[],write_simple_entri:[],write_slice_and_incr:[],write_stack_slice_and_incr:[],writer:[],written:[],writter:[],www:[],your:[]},titles:["cfelpyutils package","Welcome to cfelpyutils\u2019s documentation!","cfelpyutils"],titleterms:{cfel_crystfel:[],cfel_cxi:[],cfel_fabio:[],cfel_geom:[],cfel_hdf5:[],cfel_optarg:[],cfel_psana:[],cfelpyutil:[0,1,2],content:0,crystfel_util:0,document:1,geometry_util:0,hdf5_util:0,indic:1,modul:0,packag:0,parameter_util:0,psana_util:0,submodul:0,tabl:1,welcom:1}}) \ No newline at end of file diff --git a/doc/source/cfelpyutils.rst b/doc/source/cfelpyutils.rst index bce7b5a..602f8dc 100644 --- a/doc/source/cfelpyutils.rst +++ b/doc/source/cfelpyutils.rst @@ -4,58 +4,42 @@ cfelpyutils package Submodules ---------- -cfelpyutils.cfel_crystfel module --------------------------------- - -.. automodule:: cfelpyutils.cfel_crystfel - :members: - :undoc-members: - :show-inheritance: - -cfelpyutils.cfel_cxi module ---------------------------- +cfelpyutils\.crystfel\_utils module +----------------------------------- -.. automodule:: cfelpyutils.cfel_cxi +.. automodule:: cfelpyutils.crystfel_utils :members: :undoc-members: :show-inheritance: -cfelpyutils.cfel_fabio module ------------------------------ +cfelpyutils\.geometry\_utils module +----------------------------------- -.. automodule:: cfelpyutils.cfel_fabio +.. automodule:: cfelpyutils.geometry_utils :members: :undoc-members: :show-inheritance: -cfelpyutils.cfel_geom module ----------------------------- +cfelpyutils\.hdf5\_utils module +------------------------------- -.. automodule:: cfelpyutils.cfel_geom +.. automodule:: cfelpyutils.hdf5_utils :members: :undoc-members: :show-inheritance: -cfelpyutils.cfel_hdf5 module ----------------------------- +cfelpyutils\.parameter\_utils module +------------------------------------ -.. automodule:: cfelpyutils.cfel_hdf5 +.. automodule:: cfelpyutils.parameter_utils :members: :undoc-members: :show-inheritance: -cfelpyutils.cfel_optarg module ------------------------------- - -.. automodule:: cfelpyutils.cfel_optarg - :members: - :undoc-members: - :show-inheritance: - -cfelpyutils.cfel_psana module ------------------------------ +cfelpyutils\.psana\_utils module +-------------------------------- -.. automodule:: cfelpyutils.cfel_psana +.. automodule:: cfelpyutils.psana_utils :members: :undoc-members: :show-inheritance: -- GitLab