From e30a5abe2e1e56bc4f3af363f177021d4aeea75f Mon Sep 17 00:00:00 2001 From: Andy Kee Date: Mon, 20 Nov 2023 09:40:10 -0800 Subject: [PATCH 1/3] Reorganize docs, update theme CSS --- docs/_img/logo/Metropolis-Light.otf | Bin 0 -> 23200 bytes docs/_img/logo/favicon.tex | 17 + docs/_img/logo/logo-dark.tex | 11 + docs/_img/logo/logo-light.tex | 11 + docs/_img/logo/logo.sh | 12 + docs/_img/logo/logo.tex | 15 + docs/_img/python/focus_images.py | 4 +- docs/_img/python/jitter.py | 2 +- docs/_img/python/npix_prop.py | 4 +- docs/_img/python/pixelate.py | 2 +- docs/_img/python/smear.py | 2 +- docs/_img/python/smear_directional.py | 2 +- docs/_img/python/tilt_images.py | 4 +- docs/_static/css/lentil.css | 95 ++++- docs/_static/css/lentil_index.css | 52 +++ docs/_static/documentation.svg | 69 ++++ docs/_static/examples.svg | 69 ++++ docs/_static/favicon/apple-touch-icon.png | Bin 0 -> 13793 bytes docs/_static/favicon/favicon-16x16.png | Bin 0 -> 493 bytes docs/_static/favicon/favicon-32x32.png | Bin 0 -> 1544 bytes docs/_static/favicon/favicon-48x48.png | Bin 0 -> 2726 bytes docs/_static/img/lentil.png | Bin 11110 -> 0 bytes docs/_static/img/logo.png | Bin 0 -> 31754 bytes docs/_static/img/psf.png | Bin 0 -> 198272 bytes docs/_static/installation.svg | 85 ++++ docs/_static/js/copybutton.js | 65 --- docs/_static/logo-dark.svg | 83 ++++ docs/_static/logo-light.svg | 83 ++++ docs/_static/reference.svg | 72 ++++ docs/_templates/autosummary/attribute.rst | 13 + docs/_templates/autosummary/base.rst | 17 + docs/_templates/autosummary/class.rst | 51 ++- docs/_templates/autosummary/class2.rst | 32 ++ docs/_templates/autosummary/member.rst | 13 + docs/_templates/autosummary/method.rst | 13 + docs/_templates/autosummary/module.rst | 7 + docs/_templates/index.html | 121 ++++++ docs/cite.rst | 33 ++ docs/conf.py | 49 ++- docs/dev/contributing.rst | 377 ------------------ docs/dev/index.rst | 12 +- docs/dev/install.rst | 77 ++++ docs/dev/publishing.rst | 31 ++ .../dft2_caching.rst => dft_caching.rst} | 0 .../{diffraction => }/dft_sampling.rst | 0 docs/dev/tech_notes/diffraction/index.rst | 12 - docs/dev/tech_notes/index.rst | 6 +- .../{diffraction => }/prop_algorithm.rst | 0 .../verification/index.rst | 0 .../verification/pixel_mtf.rst | 2 +- docs/docs.rst | 96 +++++ .../general/attributes.rst | 0 docs/{patterns => examples}/general/large.rst | 0 .../{patterns => examples}/general/simple.rst | 0 docs/{patterns => examples}/index.rst | 9 +- .../matlab/matlab_interface.rst | 0 .../planes/filter_wheel.rst | 0 .../planes/rb_element.rst | 0 .../planes/translation_stage.rst | 0 .../radiometry/complex_sources.rst | 0 .../radiometry/propagation.rst | 8 +- .../radiometry/self_emission.rst | 0 .../radiometry/source_coupling.rst | 0 .../radiometry/source_defocus.rst | 0 .../tutorial.rst | 0 docs/getting_started/index.rst | 10 - docs/getting_started/install.rst | 35 -- docs/index.rst | 7 - docs/license.rst | 8 + docs/reference.rst | 18 +- docs/release.rst | 3 + docs/requirements.txt | 4 +- .../basics.coordinates.rst} | 6 +- .../basics.diffraction.rst} | 18 +- .../basics.optical_systems.rst} | 8 +- .../planes.rst => user/basics.planes.rst} | 12 +- docs/user/basics.rst | 14 + .../basics.wavefront_error.rst} | 6 +- docs/{user_guide => user}/image_sensors.rst | 2 +- docs/user/index.rst | 42 ++ docs/user/install.rst | 15 + docs/{user_guide => user}/matlab.rst | 6 +- docs/{getting_started => user}/overview.rst | 20 +- docs/{user_guide => user}/performance.rst | 2 + docs/{getting_started => user}/quickstart.rst | 10 +- docs/{user_guide => user}/radiometry.rst | 6 +- docs/user_guide/index.rst | 36 -- 87 files changed, 1351 insertions(+), 675 deletions(-) create mode 100644 docs/_img/logo/Metropolis-Light.otf create mode 100644 docs/_img/logo/favicon.tex create mode 100644 docs/_img/logo/logo-dark.tex create mode 100644 docs/_img/logo/logo-light.tex create mode 100644 docs/_img/logo/logo.sh create mode 100644 docs/_img/logo/logo.tex create mode 100644 docs/_static/css/lentil_index.css create mode 100644 docs/_static/documentation.svg create mode 100644 docs/_static/examples.svg create mode 100644 docs/_static/favicon/apple-touch-icon.png create mode 100644 docs/_static/favicon/favicon-16x16.png create mode 100644 docs/_static/favicon/favicon-32x32.png create mode 100644 docs/_static/favicon/favicon-48x48.png delete mode 100644 docs/_static/img/lentil.png create mode 100644 docs/_static/img/logo.png create mode 100644 docs/_static/img/psf.png create mode 100644 docs/_static/installation.svg delete mode 100644 docs/_static/js/copybutton.js create mode 100644 docs/_static/logo-dark.svg create mode 100644 docs/_static/logo-light.svg create mode 100644 docs/_static/reference.svg create mode 100644 docs/_templates/autosummary/attribute.rst create mode 100644 docs/_templates/autosummary/base.rst create mode 100644 docs/_templates/autosummary/class2.rst create mode 100644 docs/_templates/autosummary/member.rst create mode 100644 docs/_templates/autosummary/method.rst create mode 100644 docs/_templates/autosummary/module.rst create mode 100644 docs/_templates/index.html create mode 100644 docs/cite.rst delete mode 100644 docs/dev/contributing.rst create mode 100644 docs/dev/install.rst create mode 100644 docs/dev/publishing.rst rename docs/dev/tech_notes/{diffraction/dft2_caching.rst => dft_caching.rst} (100%) rename docs/dev/tech_notes/{diffraction => }/dft_sampling.rst (100%) delete mode 100644 docs/dev/tech_notes/diffraction/index.rst rename docs/dev/tech_notes/{diffraction => }/prop_algorithm.rst (100%) rename docs/{user_guide => dev}/verification/index.rst (100%) rename docs/{user_guide => dev}/verification/pixel_mtf.rst (97%) create mode 100644 docs/docs.rst rename docs/{patterns => examples}/general/attributes.rst (100%) rename docs/{patterns => examples}/general/large.rst (100%) rename docs/{patterns => examples}/general/simple.rst (100%) rename docs/{patterns => examples}/index.rst (90%) rename docs/{patterns => examples}/matlab/matlab_interface.rst (100%) rename docs/{patterns => examples}/planes/filter_wheel.rst (100%) rename docs/{patterns => examples}/planes/rb_element.rst (100%) rename docs/{patterns => examples}/planes/translation_stage.rst (100%) rename docs/{patterns => examples}/radiometry/complex_sources.rst (100%) rename docs/{patterns => examples}/radiometry/propagation.rst (94%) rename docs/{patterns => examples}/radiometry/self_emission.rst (100%) rename docs/{patterns => examples}/radiometry/source_coupling.rst (100%) rename docs/{patterns => examples}/radiometry/source_defocus.rst (100%) rename docs/{getting_started => examples}/tutorial.rst (100%) delete mode 100644 docs/getting_started/index.rst delete mode 100644 docs/getting_started/install.rst delete mode 100644 docs/index.rst create mode 100644 docs/license.rst create mode 100644 docs/release.rst rename docs/{user_guide/coordinates.rst => user/basics.coordinates.rst} (93%) rename docs/{user_guide/diffraction.rst => user/basics.diffraction.rst} (95%) rename docs/{user_guide/optical_systems.rst => user/basics.optical_systems.rst} (95%) rename docs/{user_guide/planes.rst => user/basics.planes.rst} (98%) create mode 100644 docs/user/basics.rst rename docs/{user_guide/wavefront_error.rst => user/basics.wavefront_error.rst} (98%) rename docs/{user_guide => user}/image_sensors.rst (99%) create mode 100644 docs/user/index.rst create mode 100644 docs/user/install.rst rename docs/{user_guide => user}/matlab.rst (99%) rename docs/{getting_started => user}/overview.rst (59%) rename docs/{user_guide => user}/performance.rst (99%) rename docs/{getting_started => user}/quickstart.rst (92%) rename docs/{user_guide => user}/radiometry.rst (99%) delete mode 100644 docs/user_guide/index.rst diff --git a/docs/_img/logo/Metropolis-Light.otf b/docs/_img/logo/Metropolis-Light.otf new file mode 100644 index 0000000000000000000000000000000000000000..b8b917c154d67a5cd3678506e7cc05541b9ca585 GIT binary patch literal 23200 zcmdVCcU%=m_c%Pedv`DH>Qz}UD!BJz0lQeSq9R}e1p#|SKm{pEwSz78SYof(8}^E# zq9ENCyMm(8sEJV%O=ihlw~5Cjdey)J+4o zbog&DAu?`C%3-(72r-or(jATrnlg!L<_Auw5R4EN6d8K1W#L@_yMue=r0CeV@`b1d zq_-`&J0j$Vm}UUcG=T{iKhSe@)h@pyj(ZIlbo;j#T59RHe9-6jx*^KCv?`xp<#au?d=*bsT{u6pq z{v-VNgzpV7cK~)|jmVyzhel|o0rF(On9<0I>ka9Hbo{H~8ltxUr}-1oF$dBEhWcf{ z0r+b(7PVl%HVLRX`^6NYLG1r!pqzD$k<-5#c0Y1vS0USfGgD9}_G{A~wPybZ!`%RX zaVUVTiCX@{#35HU3UvWDS9SrI0C4{w4Ko5cvC+uoFXMswL5uDN#@lMjU!ptZ&%oq^ zxdDct!t!)#*y_le8gvi&d@+nO)Kx6P7uQm=CO9`DbPkY6_+W6NUzWX$5uK6-)~*2I6u@9hg`!SAgaf2!pI~ zF!d19+7NB``^sOl!%%yzoen@AEHyPC?k{j(D9^sAJ#z`Ub24(#EkrKdWYmmZiyAWq z6v_O6ToEcC#B@g8m>pmifoWUu-H1HV4S=be3g#r3E?|7XWI{Yp&+uwIj&mq)1H5oy z`JnRebVD@Gr|~kY#WY16>&~n|JhEXIvqJ#uZT&K%Pz?rB0KC`gmD>8hL4*c+5AKh; zBgcBS);Kr^bj=Z=@2DS^XOFZBT8ruL7=ws-Vjiu!QW<^$NH$YKmSX4l%k)5WgoQSHKK% zWCmBjEHW^O6)=ZfnfVp44*Z<2fO#~9d0YVtU*T|q?xUB+T8F=39 z3b-1o!8NXct0R$f^N5}_H70EQggD3jj;&j^a&;U#)zM=@OjxXAKv?9Y*yyMh{X*kn zq9;X1gvI($f2~@yY}v9it%A;fyENCF{{DB={s)D|#D+yjIa-7G1vs{BX$2=l#|1}6 zB~XVJ9XfQ544N1k9XGB;MA+EYE!wqkZQH(myT55!X%7kuj*E_&>gXF4>ew$dBrM3$ zFK()%Ph7}95<4L-Zc--~mjtWl=%~<0>a|61bR>0&1*h?0aTDUlQjAM5&1Ph*HJdJf zM~FO7G@68_q8Jp0#-j-+4w}<`Fs)HbXdtctjRjXn@Hav86AN$v_>F{6u@E*2wE(so z3gKcjO3^3+T&XXgzbN{H`*;)&E6f*@)v|A0!`{?9Hf}$YAlpW z3)BvbD{70{!`luG0(>y|iH6u|Ir&0~gu<7mHw4^*0QLiS>gEIAkpEJWwDjYkTst8b zcoY6XnU-`Yr0NUR7Fx<9wHl*gVk<(8hfr~Vjfd2J@#6x1ztmo&Rz`oqzE0Jmkd|2nj%Y5xLnON1&R%)p$JK3~4pzyB{Ae0@NFpx+pgv14i@jLL!B z&x`@RV>t8?m7-_pIr;&;Krhjc=oN69H|QrAUsR?BV+*|I6H^P~uME7YIx<3G*F_DG z6KW2H&=M-E9Tblz%-MQDgY!lHXgF}WASj~os0_VDpBV@AC({5bJOL%5=_m;;MoZAQ zXgOMkHlR&t8%jaD(GheE9Y?3pd2|uwpj>nfINxnV7<*)4jF2lH@>~tsp^nH68g>L! zN|e@oV$n31*?)uPpt)!zT8&l#_uhr}KsVb9JoON|gsz|r;HdC0mFS#Xd(K%uj6%md zBq4X}KlrKg1^Vh6k5bX^=-00>6nqaxfDxbvG`hnK%P@?N;TeI^Gu6T67BnWrNYvxk z4^tEAP%Ri!YNI;H8OHENs0nn4F5sstbfiFN@++9SOk>8GF){U-MvNol#582gNXJbA zKYlP;@lXyfXcpQDrM3^s?Ib!2amtJXV}=k-nO01DrW4bZ>CN7!!}$J&mHqqAd6$JBbZ<>f$`cH!-RQ$&}T%Ft3wOg*Lv(}HnjIx=pI zJLALnF{7ApCJHEKvk!n`vgxcT-SnHI>{!dO&Oa#9Y)^pNNrX-_f&Tor=W`HsE&Jnd zKPB%qlsV3vWzI3_%tfYiPe9fB02v%fCbWW1&5XTJMmcUDSadQVZHvlZv)w3;m_5 z*1mcmH>Mi2^FdlG8wgCx3!Q^r6aoE+GT2yPYSW+}C2KutHS{IglV(6)+7G>HFZ85+ z(5_RVH(k>D(+zYK+PEG~2F?_TY=A)<&=gb^Sh0*|g1kBlDQE%AU*;hbT8L_**)UUD zit3|fFppUSGbNZKq7~4NH^R`c8Cd@o)CO$@*1sJFh@HUvcR))&2=c}O+PhG1bOQB7 zr%)eg?LO!X3~Fh>TF;^Z=mNBibTkBIpH=z$s0BI#0q>wOl z7y6aCqE|J99_EC`fXqD-<)P820A_6Skr^$5;pltXmnrw9Px*W*d;j~xARUXK%UAz< zw6{(#D6+9y6{&L>bsnqM(vjMgxowqoy~yrA-~Kt2uT%MR)jCxNRzFpzgRd~- z24JcVz*HLoOKk%T&J!4^KV)PyFwJITPo^HRoKp5nP0OWKeKSbd>wpn9zh!_vrC3ftu(M90Vwjpy2qp zP%jPk1V2G>o*L{G5*-&592^=I7atYY%Bx2QFDnV_pNE%~MlX$EFPL;i23dXg`72x> ztCv33a6Vc*J{oQBul)Dd@cqBWXnuUH!F(sgM~x4PiI0p3ijND>{Q7_8*I)DNui*oN zVM-VQ{-VNQy4yNXa~fz(#6T;xfiYoG;|G3Ca&T~1OmKYUxQNgxgEcCHL&8F1LSw^X z2ak^lN(deLxBE~HG3>AW4b%JwX(bS3r5|LCEm(^>SaT22$}~j7gj#K@r%-E<(7)(e zOV-o+={R1aJN~P@(tNdU(>}}^F3d_LLW?9qBRugd&r$z?X+=kAKBKLnqrWbL7|kVC zvtzyr7o$;)(`;*@wu${x##S=%Uz3Tag&S{8R^s2qmZ;H9{8FrmS}9Kb+kL8rn5Ov( zY7rC>H|?(y3HlO-?3ZRz3fHy z4*QCI%YI`2=fF90t)O@J=lr?BTsRlaC3B0p72IlWJ-3D+a_b-ubl-9%lqEw@-IOcSe`4%hcuT zZtL#rigeF)Z*;%tKI&9mInVKqyc6G?Z^w7$`|<<$LHr0lh@ZwUB!@IrVkd=RiurswoF`pU)z;w;e=a*A&# zO2&E$4z#PMNZYq2h*RnVVxeMgBnF6P=~i&B)2j)T zEn3(-qqJ)E`sM2!c5j%G7#}w!Dn9nRO;gNML-=Va2a{7BGEN^lFBvgY(6#<|W{W8N zvHsEB4-Qge5x2y4#DTPxnk&bm_Jl}8KG1jnP5V37vR~i59UhQnI&p!|?%U;fQwLJB zX?vn0=W|>+DE`W zU2rARTxzWtoKu5S&e>ncIFNt-^0bMUOb5>MM*@3q_i>G8Nhy@h7hE4wMQ7 zdBR{(Uf)NlugJ4jEAmBWkqogsAc5)w-cuj}01gGvLogJmj|J7o@|a&OS{@4)AN4Ws z4W*HlmX?(@GR@zAp$Jd&qNX-=awXayfsb+kxy(r-h*ak|d zt66O>+4nsYoOfXVnyoublCk$jVj%VTD}t1iJataILrC0?W0HCYD5)EBEnb4^uHNP^ zT9)@$JL)anEw_0CsoYjk?{op0^;9=p*W$+K3D{lT!1oa#34n*n1G4;e(!h9GI3@B@ z0(Q+)Ydl(#C>gH^*j`GCP^6R?QJOqfl(O)EEZiqc!ZQUNj+^58cqASPl~a#|o23Z~ z)=O8jl4qowJLsi{cP0$HWIl6-FZ6D6qM3szva zcEGMmKl>|EgvgvPl)|DfiF*%8Dc>p55bv4edr3pZt)lcgDZ8{rq7*>e>`45p@m0ay zU*7uMb7|GrysxC)hvQEE!4uFq|()dFqCKfj)akY#j0th*@Jk= zFDT>ot&#l}uajEmhmWhbPyky5Cb4c~}4inMjQg43^a z((jPOQ+kO6p1!|VO4ue!dH716)Il_yJ*Y^e3uGffGPY49OS@6!!Tfbu(X3Tc}cdyNp7Mb!PsMs{5!=~%7+M~3~*r{6-q)H_TdAB zk;DglJW%i8`b<6^0P&alLirQ-i*~I zM#4aM`<4W8>b7`k&bHKfdto?%umqG7v+LGfP2cIms*s75yogeSF8PqG}J2Mb>}_*aTEQ zXF!3m7Ns%knROr>He)uyQqBfuBZ!MFkPEY!*~)AInWrVFhSEXYyU3(4+dz!G1S+If zAU3u}ZJ1rmPFP@Q%WOv(%x=_<*~{z!QSveftC=W^Imqm1_Av)QsO-QT(o_aVKrHTr zt};haHggOXSx%rF<~S&Fa$y-F4@AcT<`i=pgu`nfqI!U`{Va0^)KOk&FU*_LK+$yr z)af_TEl@aQfVg-8R1cRx`PG}bOqWwYP+bYCt2^i}y2oTOSCKa?X!tO>s2|L^azL!^ z56dkDF#F0w_d$4l05h~l=rMDRDFlJL2vk@DK=}2CWuEKIE#@XHW8FZ-%pDM#2QuF? zw?Tk^0+L?|ddA#i?lKRU`yliV0Xgm=^Oz|DnQ<6;&J?2`m?vmB^Ax>co`Hn-5@ftr z%yUqU{J^|nUNb*|8qXF4^%@{|+JSIRRR;E;26F=`vW8Q*lU^b`&=7V}*E+`siXbOh~pd?6Qeqr7*&FED2Fv$5=Kw|$HbUZTXz6LOn z&{zuD#%yc08;GQH*;VXn_5hp8o`gwiK6{V-i9=jX4%Y3sA>0&h9k-Laz}?|K>jYhO zU0q!Vou6*FE=so%rkLOBUg_TJ2yf>7v}xoP{v>~s|B3&Vw+NMm20}}rtKctO7k<Tm*jjXz`YDU#ZRe!CD zt8vwAt2L?STCI1riM?FR&Q%-+rYMy zZBN@k+ljUxWwSg=o-1#ZZ_AJ6A8Y7p)T`0BM%x;_Ys{$epvEu82F5|gQN}RibmIo& zF5@+0v0Y`m=5_&g!|cY}&9mEKci8TQ-CH}grc~2hvq{Z%HG9<@S~Ifd)S3%xrq;}; z`BTl(T2igRhQ)q_9d;WuCH1 zd1`Vtbuf9D#+s&@mYJTJTbX;CgUs8^kIe5KInXAya_s9Eb`U z_es^`PQJ#5q|+f>`tA`oiLx;`Te=@xUfw9d*WV!(&O6U#)c!_3#kFd@QHe_ z5&W+-4&l~0-YZow%vMTm?fNUT6?N}C1pBdQaVow<&o1DH%Z$u9jvR7l`tsP)HBVQ6AxEWtrgZCtneN zUXuGE@26!VqmD1+{_I&QfT*xhZ*eU1;O`1=uq%(Z5mz<#yh1KmoQ-&f>cm@|^oB!A zvhmJrJU83+O@Yc5h8D`7-q_*q1uT_3#O%G{go>#Y|?9Cq}#z&(q7FUgigM>Eh$x%4|3}U*yzANu5Os;Cvq?`g3jg zNm9;;mkK$o_7!oH&oW?kD~GbvMdnf=esGQ}HNQ4)6dQ{nN>7D&V`tJ5drddT2J{v; z9R6W>(TSX#+6G(+<_XubnKzl@8@q90FR=n~Rs;-A?<+R^tT$5pIYqrvDzsJL>jBlj zVUTiI#J`r#8Y1Ey8hl%;?AwEs(Mm~ihH`9;!r@q`>H5UEZ3Pb77jgJ@>3S~(&!yPO zq;qjewnEXAcxwfFlnvibqp;VSL@XutIQ^2MM$y*rl+=YV*A)m6m#&4dN^$s>e%iF; z*h$gKF~$7oykZ!wg$+{TZ*a*7YBOqWlSGkpXR$aVZJ-_A(LZ=4sVCt<0kk z-&U*TS*qbhdc&ur3$zH;nZAk!=VWSsAab0et(>@6wzn4zpJ2*$PxFY6q~W%{%1TRr zV>jg*rJaYf6PZT^YI_KiUFu;Z*_QS=+q=x80HSG6ZWok#=ndP&M|O06x?OzYqY&HA zRhB8K%A*b9qXI5|sIvI8p8i9xnOwZ1U`L_2u`vifq(<5L3iPcakAiC==4f%suP0Lc zcCjR0#5Kx3Q!nq+AqCv%((k?%an-V{Ws0Sp){kOD+k@$g3gp*#kh4+#uml1hQ%t2E z-ev9d@`p(?5+lZ+7wc*hY(|v}I6N!Kh^znb7S}PW17tz6?i`rSBBSzhK2a7&n1 zUM@;XJeX*EqX6sEdxaVZ}L*#Y9#Nif0@RU7hfoVwN|*34Pwbz$B+yj*vx0FEKwme%yJJrJAJ|KRhGq)_r??f}|UL{I(w*ZdR+Q zz4&v3_IY);4;M{_B;~?31#(d1l-jTmvOgh8^e$UgS5&Kx)w&Z0>~yf!-!k=@x}X&q zNCsk8(g6FL)l6WhPL_NlX-R70N+8O%#Wk@VZfSmODG&_b9#Im7MvIVZL#F9Sp0EE9&oRcuP@(e1U6bkbU$I zSj4JaT#$Pf`Z^WBaGAzO^Q^9#D7R9?9%;A_@DGgw_Jpyfo02BtTgh!i_{7pNpjI0( zDmhzynVq&lyi8yR z&#N8l-&@>xn8$Tj7Crgh-Y_TSro!MOkfbAa1^aX@6cL34WQaWs~10uTHxtgtM~j|i~4_`4#CHNY4gs?>ntTZ zBB8W*qV2N+TrC~1E0CY4kAUm873GV>se}Lri89TYJ|`|V8dCNoW%ZVgYfXz+u3WOp z!B5c}7Ar7mfFxjk157xe#M#m%)5Wq3os;rm$)f==R6#MR)D{TJM@fq16G>4&@m>PX zgc-pt_>_9^hB*q}Vb@EUqo~V(gOmaX>7`7C94S<(F+y!HR3S5<>_9md0m`w>eZUbo zyXpw@p;2m|#tI>2>#1uLxNhx3=`4>I8dC&L2}&1t)uARLNy6^$WUbwq(;Nh zX<1Cl?sgGpDr%!pas3Dvae$bUc_tBbLYLIOr3xKVNo7zM zCV{%}k~6rT!wNWF#Ak!V???1j28efxbCok|l*M`S#bi80eFwU3`4ZC9-GHgrgX$WS zsj@NI8KS}EQYgu1orQ|2k!Y5S14L7Az5Ha6NbX|4;S>`Llf_7y_6CTld8C57 zCfZ&HwcHNq-u?9Qj56Q64|+L0QmH>529;|`U9CVwpb}FS4L^Cxd0;Rb!xY@SEDZjE z!CVPTP!qCj&lloZ=U`U-Xq0i4D8JiqsBlI0zB6ZPgEHFj1L1Kkn05N!Qkv7=M^*QK zMSpn@#IGin`Wnd*eFH_F;S9F6LR0_UNabqUNUWn_VI(@O z{!t3^3PC=64GQ~oAL6N(50Av2q#Mn6lyjc?v=A^P&vLw>azw#7XC1{OirOYr+}%VR zMSH|%5kFJ!3=t3i{ht{mKBa#!bvU1YWsQ=S$KhZn(ZzDv@e39=EyDEyojFEaPSK-D zm*Tru72Kov;uIx`QoE79SyV?smuYHArvX}Bd;Fd*W?%5x5s@6oYfw*SP(xq!m^JgubIU`!xx@yz9wdR)U#1@KS6zv1&^HWdZj6C^0 zo&)W_9Gd@o+WO0(@xSjR-n6`R6v>&C1a(XncFqbDks70JFgDi9 zZ+nPx(Mm;ryA!@Al+DU3;5ilE-m9Z1-;tkgBegul&C2gZ;D8&Z;T|-tnd*Dv&dpo4 zZ=bd`&b)HZ=6yT&L~gG&!gqRjnEiw;v3pGNQ|!^sL-b9FrM-v&1uJ(&#M}Bo7XmG^ zhXRUQT;-W<{xkQyYvS)IFvX6rd^WC7b}0AksQoYyR@cgc0rL$NmUEOzgO#$8I{FLz zIHGuG-p)dCjgtrye%bO)3-~xr#Ky8fEy(-y9A%jL1}65^%IpDS>2_UNKWm#hKM_KI zlb%xKNeklQ?_E zN%4Ljci%4a3s_XTxPt;iLv15PK{bD-ed&H4?Mi3w+i8km+?Mo*Y5#+G#Xx>JDPjQ{ zzTx9V;GI)Rv** zff2DHsLEl$rpodn{DgM26C=J=jt0L3xme+ot`TC;xN>GzNhF$pbVPb1W9f zJA{R)|AV|`r|?=@_60Zz+Iumy_iMDhKZf>R0KER%U19??4?*B-Ky#LYZzk0f;WIZ- z8C4ctPn=7cEL|hP-h-6`WnuNi(^}^)ytYOu1neXyv8m-xEl3G82(fI81`kkggH+&C z7DfGoR8T>qoz_NN%AA34Qr4(DDt~Vj<<<}Zq%l=prS>-#+@r$5h>4;6fzgAu1~>$Z zp8NWw4Kw@npu)lCgGc#@)0d`ZI!pxSoq8*}aMXE|yxCHhcpI_JtGAdtb$n)Qs)?kK z>wM&~Dd#in@n{lm3<}w>W1<;v!`Jxz9jq=%DuqZPHdehbm%9FgsX~6U# zpizDR_}5cJ`Gw^hT{q>Vg4ZRrr=K2y%DA%V_6l*%Q>;rgcoGc7b<4sij*i7@w=BAN z)9TzAVABJzV${~2P3@FRLDwedTc`RP4)JeS-phV!Z|Dm8s$JQ5ZMN;x0=!4lS3L!x zd983i`|3lJtUk>4clQeL?`-z-yD4b8C^xshzHQB3elG>AD}mLfyCbi4KLRuTs|Sx{ zeQ*D<-9w@$`nGQMVI64~jNEOq7~tj{zIxr5Eha-ot;i3Q1%Lxyk_N2W1BQM&g1-GS zf)>FDO8S@8GbW1@)A(!}Y`2n`poVMIemlqEEp(Ex@#wDQJJ)X8SX=WnN$h!INcL<~ ztiP*hHcVDjA9X{25xxyVMcl)$zZgS>4p`|-$0vhCJi{+hiJ|lF`+4ivC>v>iy@UgS z+ool@!rJE46%Z7YDGIIwK>>VU8faZjZUC#v*w5~isI4r&w$wB>73C?g1iYc2-Vg(V z35`Pa-KZ?=oT&I_DRfblGOCqyy7@@G0MpGPm~Nhf=_Ujr#d`TsQ_)K=7cCMYI8|NV z&pWq4Nr!o5GCoP?mADz14M|E$ULke{Sp>-KQJ2Y+@Jc&KNgOOq_Y^=V@wW6OK5Ae1 zG0YZmuw75k^Q$t9F&ANs=_yX5eC=@QJP>*h3|5GH*+^p^2qHri5JbR{N&tJPAcAi= zi6jHY8*q&R*R6dh9b=q08pfTTVuSBQ=AatEsY~t1aJ(7Tn^ywsfT?>Balt_V;y|*J zj3AqValk@!1a40vc*7&LpA_;*k4HOq?3K10wts{j~)h?kRiD7@gj^a?zVxLLeD#}MHrUl!!lUmT@kHE}q zwDUp$nkqx-Kn-3Fe9CHL`whL9%OW-b=I*`O3c0y1zRZ8P$=4BUmxrisX)iOA3rkwLQnW7Nfh zW2f-3Jb7<2UIIhZ5h{}G)kKmbR3zC;MUr*NcqXX<1oqNg4Aye77jkhVNnx@J)ow5l z{Rm3I_E-;7>QEd);7i(*4!{5!k`NM#;fp(%b9BVE4X%pavHK6OCBYW7h|qD|iF+GT zl~gwyNE)nc`-0T(YX=I^!2&qx_YK3fN_fK{P!B%1%BX&YT)Le)G1sCO@CfYAW8Kf^ zAH1~3m7153Dvde~Z|`SH8^_5R+xHsVvvGSfSxusOL*FD#BflxzR_#+b zv=A8VF-Ww-+hC}&zF zBPiKRkVyMq-{4xfhVv6r*=KMe(^%-8^m*_>plVQl1kAM*+3$D40o z{n6pggT77M_w49oHUv?9QMNjk!wv1A*IzER<RH4{`Th30p?QSh(dh7aCo8o z8&0QHfSE^F_oPpu>t5jecXs7wJ%&1Pyh|#>jwaNDpl+Fd528)-Z?2R2^lfiXbQpEP zbxiVG)ueM<-XZOg{hiyHFJ9aU=;793M3)8Nk^G=*)cNYer*AS!mYJU|dOfJUy<4XN zjZIJz*?2rH3?`=#TcD|(r?RF)LuX=3jK8_!DlZ-${Oh}%ZiG)Ucb?`kpe1ZcSW?bh znf9z49jiK`9J$A5g5KKwET~#kqjBAuHEWN}KC$4WIW=Z~^uZ}>=5JWBa?Q%M3)atB z8NMZCUFhaxn@_AgxOMf)g~!+|Ke^__G5fW%*CfrFJv%vc zP4J4brm$U6d&9TRSvm8Y`LpLGFQ2t~{-LSIl8#RcnHG{9K4s4Q1+!KqubjQ%o7F3A zQn&2ecW9T*H)Cf9huSBvnY|tc=eh2sSDA0rjvRjHZoDOskEK^Zon^2%C%wYYUom%H zak#SD+PG`m_FW^ym~HWU%$BaYeTqd+dgYm5Tk?xM2J48OQBLtx3^S8xfDf;JrGb(> zMLf{1gNO&&fp^=aSL(+^+b6HOm!mGpNWS?y9%wu-tXJpI31`WXGG8P0rS^GcTl}iL z{CG05`a^OCmQzGIWhV(T4i{!w=D>JjNQF-3oq@waiJ8b8S6^~!xjM+WK7%KQ%L-`= zrm`?=5RWBcAPMJ*sQrkSMcfulRe^e}DqP0k#KQEHwAEnT)|zc=o|7Ow#0-VN<6bx= z+ZKDhax26Rh4Nb%>INDMv7LY`?RfI|h5fJXi;2{v$0#r07eRb>TITTw4kcOrdU5PADjTkg?aPkg>kRP9T-yI&^Mr@AR}Imfqeu zdn?m4<`nNYG9aX@gR6hujqjgi;Yw?OO(v;*aU%15(Yqxg?rj&R7%XkAm?fgYS}SVT zSGFauTz-L>K`phlrzr1Bw45|T{a7n|I#l*_TGzOuu163hi&><;<`xmfsJ_m!ycP_3 zB6hyQ;h#t+BlWcmg?HJm~Voi7XXdpGP!gOU;2_v9}4S;vkB}lBxgw1(m$CzV1e66SL5Mh zJTMd92i6r@*khM`SQgM>!8GA0Pim4%?!W^(*pm)-Nec|W&{M3T@#I2?v#Sx-BP!hm zj?lp#cW}oo=rV%Z=#KoSp@F8}fJK{|Sya0cb&19CY^>^3m#{ChjvdIMot0$fF6Ozxj^IiMNZK|$YW@$_|;H9 zIct2v&IC0!YhfbQ-?gBtCEu#^t{LUEV@^$+FeZM)H?>taecFOk@dv|BpQ<(bwEy0I z%WdQqx!&G-Qa!#oVTgl0ad<;mTs__-_wQ4Xug_n874&}K$s$9K`L*!ri|r;$JALcz zeV_hjZ-BLm2??bRxN`r*ltf!tm#AHUTNcX8tt%5;hYQ4%YQpRFIdiT?oEvE)uRC$U z|5C3boxiIs@6Gkr%f7yPVw2RdOMQFiTO)Cea1+_3cVFB8@X!mvLu+LZco6bpj*YyW zrUTbq^|<(Vdy6Z6Xq5L}yL{!*Y7<$gmzTHMJ?cP~JsxTaGD1Y3qAyP9ZQtA9ztMb? z;bc+{9+-vMEZidp7UE#N{k)M>sau3~W6k(Q7WpVF+_-q-Cj0HnQdXpx@P{l?Ec}}G z;Wic=LKM(2)@no?hMF7u7Yhp#7A3^nPhUD?*$h(`|5pNWI*aRo`q9PVryouh6qq-P zhH*=BaZnb%l@0nv7?pa$>ShoiND%ahk9l{V-!B~7KgD$JEPpGkLz;^NsothBF`0>@ zzd!iV`$h5*>LOV1+`0sN`DeY%!sQ@SrC*n)l-7V%g3%&gO3HcC(;tVlA|YT4AfHyg zu9v64PT7zw67rJTJ@tl>I5UsITR~pjp)y7?3=i)|hLhp_@NhCL4-dn`1gn?p>S*pd z&NQA<436r?M5b8Paq1v7+BoJksY@J*BX%4;20L2eGovy5!=K}sGt`9#8n&=Kb(@8@hho_Udz$r)KfqA%f9;3yhwgLxoSO<{}daW*I?yJMO`>&1aa2&^9 z)?4VOpI)^m11w-*s!07@0YB=h*Ty`(#U2k(!SDbMCvp5hy@3SctZhmm-3?HJPvR`2 zbssAzW@ae3(HhXsB6)hoQbj(KaZr>GX5@lqKEpF;u%8KjHYrQ@iUxJd8ZrMe9(9@e z9ge_nO$2@=1b%BGtKXCln-sN@-8!+L$4j%tX0J$p6d+?Z;BSb{Vch2Qn2Y%CMQl1^ zd*&E6<=~?y%F7>_&X%JZ&wAtVBcRb&yAm7Yk2kiZKQK?-!;kLKe_BTe;zwG;-uHfZ zES*V1JL!j85@(o=$WOZyN6!I)VG+YyJRM+4$H8lE zaKr1(&8x@G9|iq;#-Oz)!*d;ec=?cS7AD<5N*hBGNdT4s_EMMwge0)ILB$v z96o#@HRr&MfjetW?jJocVpQLo1FsIxw0U>(&Z(F7&phw6ZsOt5df3*{XZ%bpf_wIF z4BDZe-EfuS>qiT&n&cTjHRZ{QQcxP69ud%gcx00hb5O?A<45iD&Yj9O$?3x^FOBUz zGN0VePQQ1^obG$Y_h}oOz+r(A{TvJyo=$EsbBV)@yYW)#)xp3`Tb5S8Ky~=4B#*fa ztt(3aW>^!)VI#DUs{(0@_wWM+Lzzr=;{{*w2kiO=+pdCao9GiN>|$e4+B?@`V5vd^EW_boz!R3A*7#rf17gM z+67KimD?Clxs}XNl23|H^0+6UvrXP6G881;jd`VButPU#ow{KiZoTg3bpnZ8r#Gdv zFRxr_No6TZ%#*SzSI(*Wd9Bn!s^;e=>?IJfH#$9^U;GhkcpCfLTB0ozRP!$!~#ECVNa`?CGn!E6w_mfgf2 zha-KL*+TYv_5u4`JNWaF{R{{D6s{T9jqAnrgF`<-aO`I?m%z>A7IEKltGG>E3b&g( z1;>7#bFa7$9OlY&I-LOy{xsLMfqj=AaOkI>Zh&rzZh>~(XQwV#cMXpDJkY(=z0>`s zE9DU{@Dg90x8qHGBfb^ip6|kY@;{))h|E1k2Rn zVz3e^P81h46Q#~dci3=E_gy&Pc3z@n+3P5F_Vj7laX{{K6MoQ-lz?LIaYroNzjh*P zFOcfi0yda)E^q0Y8Px$}_Ei&zOjGf~j{Jepqg+WqJ5hpV%^9$&neHqaw}M{pFx>#P z3J(`>FR}`D(~-V-EsynEi;6L4ZyASM8gZ~NO(emvb04&0O(9iub=@mV)Rx-6hs}4Y z3EXhA=Ovh}*vnvUrSQFOz8;Gi=>E<1#GzGF5bkVS{fr$<$%+J9-{>Bb_Sj##rL=@| zGI%`k6h;Sjo9yY(SS)%T7I@iw<}6>(xBiJHbHukFPv#ezVP$=4CWNV%5Q zc&%DF&r%sLl8oIID+iH+MNpPhCDpK#l%U@d*l&G+1F>oC>JjD+O7M(9=3n>{Yf~()m&e%dtV~lI5gA$=O z93_CIu=lVO_7s-F-osMZ(-VrZ1DtW8`)eF~4-s3w!8Cvj4H0vjdH04f0X z5e%iX;9QEaqvAvqIPD}2n=>tL^4O?rehw1swS4OvQl!#W-lDW53i^N(D6*=O zhEkXa%U7j=aB3w;Av1-7G8?0M4ZG>bi`Wxa2dzdY(wWe&r`a&5_tbGA_95G%5A5BV zvU7K0%4E}b`!^rlbHGMQ64ygnwgVx;fwYuD#(Pfg>mY$Dy<3*lIk8Qshl8PXwh^{5 zzFQzl^CwMdH@Sf z>K%U(jxvD-$F?Ny73itP3UGd^8s1Kx@J|GitBNo~y2iT-q})=MSL=G~r9YnB2T3PO z->lnkuPC#0Rxw3G^MU9FlHD#3FHE~%&UpodT1T}hhK4j zGKYUCkV!a|mlnhJAL;&&2hX38CMoL`X_DCWLg1}Khu5X-F-g-DTdJuZA~^v2m@mQ! z4^BF?_o5gbCV}$tQlVt&_MIr5+}9`Dfga@1OVKkECXO2b%}hSJOObEFib@gpO6_Zm zQ{Z?I><5M8E{k%Z*XO4bIQs+Jd{j?3@#4BrG*oQDf?bl*f(1(!FEC3fa0UuAk>1km z^V1UW@$(zcP?%I^_kKpRsYm8U0S^DE)(Qg<%bc5wH31&r5_pq*+Cl#nno^;;0P8mDc z7miE`u)9>-1X(KJIk}dj{qY>>5RBAnI5dA>0aolz8wZTZxCQ*V5}Xf$O)$5l(R2gP zB}Fb#ku%sjuagh7A@^PbZDr-N;F&_>l41WhV^Wm0-PPr5+q3p|{qQz?BG< z;0_pusl#aZ*nrKzi!?)T(CUjA&z?SkaF9etZ(4x+NI1whV6<3h?L>KM~vXA;dnRzV-JU1 zoVA;~63f2@ivQVW1p^JCucwcKV=|Dx@?XlYl3GmX3I~G>F-@>^m`fg-XzIv^Hd*D3Pad=bNvv8^^>#sLo zgDB=EoV2>h7Qy?ReGTtB&4%j%*iUf&O5iGUw(wHB7F-2leH*}+{x#uR!qow;V0Ynq zz}toE&GoN%1K~^mhH+!KaqvcPF>s2@`pyDb170oedl0|%r75|GnDTE}9=J*j+|$P} zJGpQQYj$sHvzZ!xuGQA?y)<~FX7|!C-88tH6)wL76jp1P)f9uGDU4FAux5K{_F4_U zR)cS8{-;@Oieav5c7$eMr#4)qKvU>#wKaS*4Q{5voi(_#21jXdlm_pjHfy99wx<== z@IPyIAI)bU4eqMJT{XCYRwfPD30*e1x#s9*5JAtzODvqG#P=ya6?%f*cE*fMgR#+12|R+_l3d{&@OPOvo{>L z4E)kstR;YMX<@T8`1?y+z`5FLLcfaz^i^gc8Z4pPc+ zSh5AY)gac^fa?U3c?~!+*#iz%_JZ-P4%~}207jbOXbc>ZrBoUN6&twRCmyII!VyUZ z?nPS!_c-l_`r8iHGfi#ST7zb%FhQndZnQ;3PjW-%@WLpNQ zSPu6x&4i1F4#N@6<8a5)2Dpta8?GJ7g)|(1G?c(WUl^6)-ZV2pOkKtq;6_YiI1IbyVs z0)+H{!=$tvSuG5wh0$qYcb_ANlIEtN)W.current>.nav-link { + border-bottom: 0px; +} + +.bd-sidebar { + --pst-color-primary: #5E81AC; + --pst-color-link-hover: #5E81AC; +} + +/*.bd-sidebar a:hover { + text-decoration: none; +}*/ + +nav.bd-links li>a:hover { + text-decoration: none; +} + +/* remove left vertical bar on active link on left sidebar */ +nav.bd-links .current>a { + box-shadow: none; +} + +.bd-content { + --pst-color-link: #5E81AC; + --pst-color-link-hover: #ee9040; +} + +.toc-entry a.nav-link:hover { + text-decoration: none; + color: #5E81AC; +} + +#pst-back-to-top { + background-color: #2E3440; +} + +.form-control:focus { + outline: 2px solid var(--bs-border-color); +} diff --git a/docs/_static/css/lentil_index.css b/docs/_static/css/lentil_index.css new file mode 100644 index 0000000..633c5e9 --- /dev/null +++ b/docs/_static/css/lentil_index.css @@ -0,0 +1,52 @@ +.bd-main .bd-content .bd-article-container { + max-width: 80em; +} + +.biglinks { + --pst-color-link: var(--pst-color-text-base); + --pst-color-link-hover: var(--pst-color-text-base); +} + +.biglinks img { + width: 5em; + height: 5em; +} + +.bd-footer { + background-color: #3B4252; + color: white; +} + +.bd-footer a { + color: white; +} + +.bd-footer a:hover { + color: #ee9040; +} + +.bd-footer h2 { + color: white; + margin: 0; +} + +.bd-footer ul { + list-style-type: none; +} + +.bd-footer ul li { + margin-bottom: 10px; + font-weight: bold; +} + +.bd-footer dt { + text-transform: uppercase; + color: #E5E9F0; +} + + +.sd-btn-primary:hover, .sd-btn-primary:focus { + color: red !important; + background-color: blue !important; + border-color: green !important; + } diff --git a/docs/_static/documentation.svg b/docs/_static/documentation.svg new file mode 100644 index 0000000..2304118 --- /dev/null +++ b/docs/_static/documentation.svg @@ -0,0 +1,69 @@ + + + + + + + + + + + + diff --git a/docs/_static/examples.svg b/docs/_static/examples.svg new file mode 100644 index 0000000..8191e27 --- /dev/null +++ b/docs/_static/examples.svg @@ -0,0 +1,69 @@ + + + + + + + + + + + + diff --git a/docs/_static/favicon/apple-touch-icon.png b/docs/_static/favicon/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..ab222a423848a36003aa77dfff20a55ab4bc5eda GIT binary patch literal 13793 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 diff --git a/docs/_static/img/logo.png b/docs/_static/img/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..a371fd129042b815fa880f15d086007c210f4ee3 GIT binary patch literal 31754 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 literal 0 HcmV?d00001 diff --git a/docs/_static/img/psf.png b/docs/_static/img/psf.png new file mode 100644 index 0000000000000000000000000000000000000000..a4f341db9edfde585cc35c4877560d4ac6fb3e6a GIT binary patch literal 198272 zcmeFYcTkgSxb~|{T`DT5bZLTs1Q0}|1R*Fz2vxc$ML|TQCZQxizy?uTFb3&FY6KJn zlwMQ}(Etf$AsvJe0*0CZA%t?`KIeS<+xyJynKg6f{B`~a40+zkgyebe=XYP%b-%b_ zV|Ie?4Bx(e`%Zw(P3-sWJDB?CapZ5_Gle~$0K8woP}7^C4#D?BBkn?d_F3Nz4G9Pi z4e;|i8}0*z`2`1Qs_Cd{sGfZg8X5xAQ&$iCUl*taLw(gp`HrA?FLE@*+!eNOpW3-U zkNxms!|;9k_w56lTyuoyEbI)Ur8?8_$9Biql2zVvh$4IbK0AxdFowvD`m2S#dwbs0 zg2zS&5RCgJ@vlhN6r?V7NS%rbT|V3zg7hEQxbQRo=85fAopW^!+1c5d>M$sBVhuUj zDdwG|(eWQYGWPZ_4hB8?zy9Jq#qpGAyL##WT>Nu|+3GR*|8=z(Oz8h#{Qv4h5RZK? zh`z3qKNe9ruk&iP>BfZAl5vBdVktQ^TA0Lbhw0l+7VFi313JU^R?ZJ1#&_8_q(3Eo zsci|`lZut8biv#&OuP{@+#*0L`LVo@PG#JfSil(}VxRkfvuxXr(xkQ)d)_~givxjj(LWWDxVx; z(7CEJuk&oMxkC$Wwi*NOix%QO+Nmehr!vK)yrXlICrkA7gUaocWIkGk!3`woi4ZqU z1;3x)qK1A=UM`DjoJSbO5BjH!f}=z_t@B{d0)cA{0=nvT@RpX3L#J)HF8&qrm?k~`uq60!_z8xaG_$noSXls;?F7F(mS{ud;FPT<7hIZyh_s% zZ|oUC(BQB4Z1Ku{nDb%h#8zWj|8z|9W#Fw{87aC$8E9CgLY6B{lT#DVg5?C;dkBDh z7Z$d}96~OnGPAyKCNrAW+TXpbps0`V@GAFX>`I#{yM z&EI9H3CxMHI_cZuwX6s}@zbtjbl_Hp!Q$|Y8Si^olzLb$Z-6%lOtMrgY)*m7T3I3ZTXgQ9@#a1 z*x|+viwb)@PsMqj$dQHx<#d+(rI_r#BtGdtqv!3?3;vIaj z7nx?NG|8KJ>4;5xvfylnKJFf!e@6kGJsAg0QwO1H08KBTpgphCXk#5a+LK>yy0~5W z+QRN7B|XKt+i&%Sy9oHvCxho{Zeb}@WgXluzuxh=fKB*V#%Rj}>KS|Bd5rH7@8X9N zTCM*%Z_&Z&8WYJ zr3n;a`YRa}REys^^@+NyyFZ`CT)$odP06_Mvjb_`FricVsC0h)%Yqs-@kQ))#IL2) zVt=d^`(%Hf+)=})51LNz2QBZOBw(vtWFjE?76`TThzQvqGzj45yKkeNemUwwDb7$wzPkeB+E|rqyBwvBKun?t z^q&*Ya)d&ip9F7&oeqwTUwI9U1yoXm?l{~~_OVkbE&3I3>`-pnqfBIHOxeiwQ(NY) z)#mZ{#s}6v?73F_WLPZe9~_jcpkNJMj6ChTfnTGxfzyi=;PrvQXa2%IGqDw|l_vAs znj7l?s6Vs^v?D$!9%G)rb@c#I2`7;jn#K46;GI^Pfz(@PX;Bt-i}dH5a;?4MM5xP# zgFA^P6bTr@zM%Ni_M6tbzJFo|+=% zKb0-W{TdMn_0PV<(^arThK*l*W7k)OCj_Jm6Byz|m{jC7tD9eLzDr;L_;6>#ODpKY zi!@@U&5LsgTh6uffLLriL({NX9xTe*>^ zl9xKUtm+#pP8uLuD5>ISnzzm#Fl@a{m}uPEB=B2r+WQxgS0thV%67} z+oIH~(buO6-Ll<9X3%Dk=EaS6_719J@4%1$@~|ithDrug!4o?fO*2RZtqDOrJ`U|&?!1xAe`90~VDM|pdJ$;m{unv$6V3;0rg*sLvNK~-_(acK4a>e7#ED z7IM2eoH!brFj&TXb28G{LnB?q_asF#ut4+e@2AldLukg5#!h?#+ikgwk*&4%{M+Q^ zIG0jewKTYg9blXbul_a{*YukG2K%u~MmL&-m@PG$7 zCFmf24_n&QugHtRg@f^ofJ0o!D4l)^2aA@z&@p`eCZZoy%shUA16B6?RY1^W9CVrJ zlm*oc9UiEOmD8`esHie2gmX2f-1Zxy-!wqa7BX(kW*89WFPj~QC-`G1yQHbFH{)1) zu;~Wq!h)A4Zu;%CZp_fO8nz+*6}0VxK&|O<-E2vAptG6`NWymhz*4N*{aEB$GiI&+ zak(&z!z;9Xgzqua6J{iTX@h!t&74;m8Ah6@VNBN-N4?m+1)#LAYm@uS0%!bo%5QjB zv391<)W`Y0Eo*P3vC=$d(P7hC5$6h?>~2D z%CzWzS@i6FeA!5iftVV~N1@1tt4ef4WnG&9?I`nFc~0L2s0IG50|%5Lpl2538yRZ3}_syQHM8wzTd;$vK8hR-xU9!&iLwj(yuFg|#&^XJuMfc@pNRoaXsu`RX z8z+5APpfSGku;y)vytgZ-P$$9FN5ErWNBL7e1|8G`}hsrwdYvODHaI6fwqT?-yNNU zW0ZC5*3RZk-_lcRJgn?_)Lp>1RTBI=u}Z^ay*Vk?&)0pbTkgy;tE+APCLs7iB%2U!hs zb+Siw6`+`pPxmpSPsjBN$ym7B57pX9-#S_YcnbQJ=j`R1U;`+rFj*EAJo4)-ENX1m zzf4oUq~hLqvvh(cpky1Kqx2#w{%zH1Tl)v#VJZV;aj95;PxOHVp~?QWA#01Q=-T+b zwyM%|!%kb7wjTImRoh9V!M?V$R(eadfTl&sPF$0yUZO@>(nHgyIS|KvgdTpPjalUN0P>v?_c%Fq;6meR`HYaMKPyzknx%+O@(gpaIk~iBv$8e!)mGy zYuI!3F6S*gel=2QU^d225>p`)N$RfTYIHm(@v8N$^iwD@WKo zeF@ff9xSmCg)nfk;x_Ko-8?Llerp-J-Mt}tjD=9QtIV;@XY=0h>Cwi@(2 z2%G*r4OU@;sQ(z6|Bkn$oQ#w^MukYh1{po{QcSn#)8e zmM#Fxm=9BG0pBd23wzrvv6hxItvL;`T~+M8V1(x(=$iPd{yCZ?>*;isIpw-m?A*mS zgLfxp$F^lrVA_d0G67TX?_4R;cP?3kpfT7Tz6%}pX%t&s+wxk-JC=@<)P!%O${g%f z{J6z7_hC!nc^V3O5P5XStXb54Y1ElXuw14=TPFl87omTC8m7j;nRrwqR zT8u=Nr+uDxj;F9+3uC&`p}~CUb^f|7$^Tc+)_Iy%Dm$Z9&kx>GPS#vgEo}y`l~u`< zduw+?aCWp~Gj2DfrZpRHHNB>8=FI9=j@ePTVw1-k(v{;=WPR`ou`GMt8*_?RP;FIN zc$JR|#N^>m-#$H$DNzn8Vgq=m)v%_C`f0i?E!&IR;Q2P^@>-qE^^md@<{5iV5h%_> z0kEu5@A-D);hI!M?VdCVSF=3LJ3f!cc7Vi1*;wz~s81w2Eds`*{Wx}9${FyjWhzd?Gv|+d;Y-*aS7v8Z8=3N_Huk&osk?U_eO-Ob>wB=g zk7%#*IBtPJ}nC{3a`}369QeQumSh zQjiR*fR-+7={oD;l!-@oOnn1$I{Ovr)%}%5b$kYP_8zwzv{xgG7cS--7cQdqx@UX7 zu~t0H5lQ@?K0TorRS4Mk?(WyIBLHGbWMynbehlhyNqc^t$nHSX;=@3B*5TzL!Qj>2|{D zD|vxj-QaRxF?S0$if>%MU*EUd9(C3Tjef8)GcTQ0yCObyX5ROfRP_OjzaG*G#~Slq zQ1tQSH;71!NUE|LBr;q@$bu<$k(fCh46k5QKKw>p7CNT^!c=R%RJ+kpZ=d2bXIIvo z2m3bIjCYff_xrR{cOx%(UWY`@LVl)?At14v*)HEmV^7TyHocG^VlJdr38|t{WFCy( zKljOkTvx!)P9AQ`A|4$#hQZ_J-YGLa4{RNDd5LwmFqSSZ;~#XIPzRv>$ze<4#ro;< z!jW;6V9fn`!=%j3rK@LRVm|=3?&zhkvHa5&@I3P7?!K53!^8guegFHmmLH+BJbC2s zA3NJ_1QL2|{syu<=bj8-<=_gRWqB@kSQftP4=)|Q( zi9&q#2X7AipeM8IG5Z|M$+bK=f+Pj3PlTt&6fGuy%qipafeTl39H#p}bgM9WiFX2l~fZ zx<*e;0hgwqS>T*t0}L)!CCwm|zv$%OYdqZxm5fb!{(8_Y`GCb2fUTivkTn<{W((lM z>o;J+92Bj-Tsl;5--;Ka@RW#+PC!AR(Ue{%{zsEH&ha!`R{8N7{m6%5H2!q|cKs7wYvdfy`k|KJsi zQWafW2HNZ!jJIks(2Q@M{jHy589&n_+>F=1ALho_QVs-b=%G8qoX^CN-}56Vt3Vm) zDKh~vL1!7yyQ7=3hxn??sX3>!H59Y%8h+7G1^a(Hx&5}2_NUFIy75(W@`V9Jg(L{B zb}#SuMYVg}@|bf%_grLD@^5B`DGyBmIuHt{W50Q1G9=>qFds)u?g9;OnU>aK4VR2d z!`DxpO7SMW@qN`S9Z-dz+X_^2xUA*_);9b=04n*|!MC0pSE-lCM_o!lj@AM}#q!xt z79P5>p5BGEzM6vt)DjSlpv3XE%l~F`{^`ra&3r8#;GP)*Tg@D6C5mEiwwx2WFvBGZ z#MK_iZ<~9xJ%e~@+dvG?U;yLHXx_KICRAav^H(rM=@(c4Dnyi;<6tp(g5lUOX`7wF z$Yhw%XE3Hq_1iRPLCBEPOqmL z2urFo-`@&V&f^talEas63P+sM#UV_yVem``HYRMxEW-- zsgsQqWQ`9y112LHpDX(w8`Mcjq^w?bS~+93^C9ZNcT~UdpmCW$KT#?Ax^Wl?Rfdjl z2IKlG@$mTX`9Hk<-Ub^I_Z%8p&#Zk(jRKQcFIey~fh&D*q`%MdF}fhmZ(wICdWuH@ zh4DY7^!khL;-uXpg^h!19mueWhBj+R56MZtAIprc&?qqws`%LnUW50o zcEr4YgTmi37L(9aQ)6pCSD0@s^}1EztNz?i#Y}imClXbLl$SCaYjTP*YDC#UbRm+O z@wB`;J)IW!F^WYW;ds!UcK|1;rAZIASdD3JjbHQfm>|>O5tjW?KZy3Xw6|?1Ql8yx zFYQUmUhYZJr*Ep=sYzt7@!GRe{_(ca@fF?8{MEhxod^DB2b1%Vzi9Oc=SQ68gXHMJ zqtJWA!i9g}ok0M748+hdyTKR;hYcUizK}? z8h8Pk;p+Q|Gw4W<7U98RYyLSf3Gp`cp?)xIf&~|<%%l$s#fWdL1EV!V<-vXVqw!2F zW&j4X;y)|@$`Np!{hL}f&cuJL>r-Y+SCoiF# zNqOf}dX>|2V~*6eLF;>7ePiXIp-VchUj#oaGsjB&&q{gY=mO$UfO((C>X?2|TDC1p zkXr@4++%j}t3kz9;9Py0&I{>-(sfM79^-4l_B?wctLg#umQyY&FWp^`yZea(Wa+a3 zyE2i0xi_U_8gA#R%az#I^p+pprcrSO&ZYSp^otKI#uKt&J*5ik(3g(>a=B;IqMr9m zeqs8hyxDyBF6ZnFmbzP-GwtNn)+-JrLCRYzcNZL#MFn}Do%0pKbYr`2F;wFOr%e}K zyztM|CO3!U_#V(a>oBV~3Qahiz~5?mVDO#>8fe?UHBMVkq0b^zaHp1KDXi%4kc(6d zPd1Pw>M!kIO~o2$=?7`i=S~%%eSj$xPw*L)4a4!cv{z_HqIKZYY{*y#OUe8f9)`%vcYi0PEE&sda&RcHOPMc*zJFv~8-d#%tpDuw0Oe7`~< zpd9P%+abhWkpTC-&F#=z+Z9>W-T{rl9HYi|WG6H|Jm<5Y#HPm-{??~t52<$!d&V&v zSH#0~`CFWwq&k#C?VY?sYZ74*pk#JA^g>nTd{yM|EOPbuB3-(!tmgC0NtuG0AQ#;r zx-R9IWN$40zv;35yFv^8NTIhKr&;J31Xe#V%aA{r1)e9 z|DdJSuz1`v%w-ABXUvB?qnqr0>Q_(j$WlSZYq<}<$0WWtoG%>W2Uv;#x;?D;rp|tg zMKgH+7-50l5SR+D(B2avb-FIN0FEsv-KqG7NQ6jU5poG;+m@1rO-B9AOCnHoM-(*3 z!V1SmxH*VfLp&4?#f}rAzSlaR{$Xa$)xEC*S!qn9-@iRe*q(;KkJq|m)F3#XhatRk z9U|?MCUnQ5uhH!G24vUqE7Zap;8S6eW!yJ!@sm47pnj+XRAP$|f^@Y*gfw_IHN&W{ z#^|jDd@Nlpu@2x>bR(?y8$`_qc!A>ZV+kQmmPzm{R>c=*yfzvuyMXV1*~}K z?KfiPcb_0V{o6u~2TL}oY9bWXuNs}zSh^3!T_v$h>t?liZO zj4jx=v9vo|LK^D=`?;@W43vDvH%}1HbqYuG+hFN}M0xt^P0p}wt@ZYs>so`HoS_H^ z$Vukfo9{p{JCUm;zg?NPWBhfGX?#G;wlbPuM8@V9f;@6pRvYmJCAisp7@XzZG7C}Z zC`ceDnHF#7h;1D~VF#bmbUSu=W`Oi5 zPjy8*ZC=G`Tg_~W|6KRmUm8Wc8R&gQe*UzE>R>m@NUwVXclrv;6`m4P4ywI6wSJH1 z@JqHkMd62*?Pf2~;8-t+MNe_FG_D%;d(|y!F!jXt2b6*-iJlW*B2LvJ^36Hz@r=8 zXUl)_6No~s|CS>DkwZt_nz^1bGM9KKXv!-Kc5z<)cVosLNQDVtqcWCl=ypyhP|gA9 zEae!km(L?#0cvg*_jG!{M}8+~^4TTi*#U&egJY}!1-~XV=T)e5G9RT!lV$TV>NZeo zX|V06&xW8B7_;^`@SACu?xax(l5{? zXGL{$MF?(h3KJSSvW=%gjiQEaBeIw6rDh{*a6Hp>4E9ecb7B6>8#=YUPS}FWY$1 zk)~Nt_&De}g{9~d{J9?O-`o0v;Yxd4M&1Doi21ZRwaR>r>HrOe54U{l1eoXa_vZi?N!EXjH97v{I3xcb<-`b;1Yo+>4NZ+HW2j_4X>5wE>CIjlwg{L z*c1M1JOnX2f`sL~!hepra+wnuep3h4e9u0dW2J%9tt=kFiH)_$#d6 zp?+c#uNNwOY3aRwOp+E45AvcUxuF+&7acyud4Fuo6PGMaGVn~)8xt7sYCS=F=pH$= z%fN+t0EoCG7KP9EB=PL{8+yNPZIR^p>h})ce%PmI4cm@>rF^?-h-lPamA337=<7wz z>rA&=VJfPE?~PgVR2KIA!}^1NOon;gl-r=&9*MOOnXXTaQ&HE!jZbP`tZK184&1wZc}2>>HGy6>UgW4GL=Wcj_12{T$xf#r4JldJOk#z$ z2IUWL%z?%0H1LQ|yMbk}Pn(lQh{O2)zY*=cz|Qs9UJ=CTC^DSqglWX4+r)?U2B%5< zcJQd>>|TsbM||z_d(B+$L9Kr5ZXk3S``Bo*ekzpuOyj=qez3FH2ifo3_ ztIs8UQtJF}&m>Z%gF*zby|TVHXhUy2XA!o(#v6Bg4r$nLcQ-QkJ|Fs0WfUAI zZ@o3-u?2Q^&l{Bt9`;?sN4@&V>#7$RvH~diZtjBWCf1sjwRao|jy*Lf1h`^-Gj9X9 zmpgGHr7lnqHeP&p(4MwY5P^byVDed?*$lZjp=;ABv_=cHj@js+x)hp}K!F_DIT@rt zJ^+5my-9~{TjAO(9>XvT?R-TQ- zA;s>Eo46bw4@m2O!5Ecf%<*=(a`0)~F-!f!^RBO$H>cKDGSAX{cO-XiChIir&3W^r zLUmap|6rFxj*aN^z_Qirwtau+<@ro0PB%8{H4FGOBIW13NWQVnGSOs9gmmAhZ}4Sa zv(t95!Z%5UmJzJvk;a5eB)Aky*3{nAS?+AP8tMp{xYUtWBpuc1u<_U0vWHb6v4%PE zzIJsiw8WX3EInM~H*rO9D`s}c#Tl~0;Flg2+>mU}6ZcvJPaThh@3a|ba<_lGel_4g zMUa&YWOxC@x@h#{nc%2R_XZg}*AmkR0tL?r&R*dIwBa9ARleKch_ZM<(9W2|Pe%Lw zzW^eEvMmo~U5lPC@|-_M`d`H2tC61Ol}c_gBPKrvgsS~ZQ(X(m_d;`j-`Lek^TUX&Q zrQPhhs%8dkRH?b-Z6oG|{ciN5&ur*vpC|UO57_T>{c!-0IvXr4U?-$RYc1}642E=FVQNjFrg?kc456X#eXosh2Dm=t)noC|p5 zY7VgQSJMxAzIlYe{O{V6UTxv4X8?b{@6alqOfz}Cl2w=Cjdiy~MBAxZ&Ev5|iMUR0 zpZ(m_ciB5i!bU!85`>Qf!S+|O9E$oO3l3tp!G^XkUFocEdO5H^_|?pDGc^5at&Gs& zzAX6t+xysjJppz72p7YgDyswz0w-)<-i9?hd4-ZiE6USUW6a40fz{u`9t6QWEO}{; zdu_k#OeMUZ1HO$8G#4Mtq3o;3xA!o!b?xNYFbpHf=10%NduPO69Dh;ESv>?WJgiGE zL+gEL5ejr+DD!S~P=}D@ZA@qiIwHh_*)C;2Vd%yS)7ZT~EcAkyG z!d;y`Ns4A7lvc*iK9)4B;5TM8k|MzQ80Zl}zR15>Rq*5O$wF_#P@dO}a??N7#v(%W z^d)q-^(9FoswjF5GNN99=F>YkX1HQt8WyW`T83KamS&#wC%#j7IywTrv6v7xYf0Vv zpUma|uCPg(U&s+G)TTS6q*5A9*yE2ECDy5I!byDtj6k||&@nS^Cswgn0>dJrFhGx}U!_oyBst%s5Ki+ygB z3WH-ZL@)TD53t^=&^s7vvwog(d-aT(W$N7>cO@6j`)8br1)bR^mSHyA_@4fAw5X2e zCFS$k6{mh?3In^k=y<_5jrgv#lG}IO>x1Evvu(CmUQeo6F!>I8!8!{rxg{Fz9^R*F z25IfjtXg8Z{W8dv6^;IGEDu(3lNmp0zoFg>v;+FVyK~g(fgWa*&`e(QmKSCSm)?@& z9rdH}L5Za7kDza#5;!|7#k$-fw}kTH;c=VUvMzQ`_{KcL_2vPM_%RE74jVQSZZV0EG0qH< z1fVM&X8)cV$`ZB75|_MoPWMR}m-s9Y zG{E>=`S<*>$7x45vg7M{?{yWUa3=_{&^kcb2_9={c zJ><@kFxyY%lJD^_oqlA#C(8>+35p4O@eZp_*1?ybFu zzKJ3C#6-qzxGy~==*~`GLS+K8Froax-N&F#}y+{^BjF}B5G4U9t{y-PzL3w_ih5i)Tv_F#+B zvzRw%`V0DO^c12T*1zYVF@rAMmJUVq#`2=FN1@BZ=hL2|`K4+3`?5T3%(Dmx$ z>p_k^afGnTh=QyIi6j0exwvrIYkqI;i4hlBn{YY_6WMe7a3vYAHExgS&18R2jc)j6Glpp}T3`#Jb4cq(n7l@@h@LtZg5jEK zYj_ozAv>WCZahP*f4Sq_u$LFU(jb>t-uyD4b1OuK6l!aMNWQb}fOxNVy~>kkKf;4F zI#|NU8=U0&AT{D@UJzffJo4?}3f7sSgfz9Rzf}%@9M(|?H=J9<6b&K+B+#8LXvZjX z!#JuDX(x7W8kQT?fe!PMv~3Ha-Jq=}Rf+Tu%F~eN*aX&USQ)E+*IKDx#c?rlUbyjD zT?WjUlqXwD`?R9Dx<~6V{KQjw?j*I&3{5qi1hfetJod^Sbfy#jMM&-c;X#{lAFkqz zIesk4ybcTedLBuNbOGae;W?qVPERZosyu4#zUw@!nfnk}xDaq4(|I7=;``6HHP2FA zF&nAyDl%cA(m~4N2fQ2WY3Z7Aog*F>VgI_pZlBrRDtQCrB(q^xg-34gE}Ok% z9qAip74Z9@vXMeB9E#3^xoUjrfR{~AKG>4_`cR8)9V{WX@829npFwxoWU5wBlaltm z+vPCZY^9ZAH&;x!uG*oO!swHlDYC`*90yXhF-hut;Oi3(IpBG9(|r5aQfi|^XzUk@ z22Z6x{5^Z+EnbY0ZuDALf>4`V7?>s>ap3V9OSVFQUZ{FQe=tnRq4CzyU>ElQb#7xL z9@})9WM4css4u`R(xcR$e2bAq1S&k7(We=dMBl_H5^zXT>kqjRYr($@|U9qE|r#{cS2;0u4xad zf%S-H5%q(mCfj2!tA+Xl#Ekm7nO2OeyYy~GEi_O{Y5w6UXvBMOZ9r-|iMP)gY7MJ-RZ>Rs;0Hz{!0U_HZ96hlerG%sG z$_?ZnoAr@^om1z9;KQ6p;bY>_hOfRp=D9z?-2{Eb{XfG@d|!=t$aSSHk#^Aq(xt;S(Zg#C{G%y>GjdKg&3?| zm|^?~^!8v4EB$m`gpGbb-O$klnso3u$9hwqgNVdr)VXtfGFZ009W>pPMD!vr=ZS98 z)ln7|$^H9BgTq)q!!Ojhcf7sUa#;3yTkqSIgdW$cp4VvpUWNt*7mzrEhsG06NfIm2 z=Ydps(~WRWk8zc~en-jor+IadR@JO>UOwn|VW-!z!=^NyD=xf@oX4Ep%ObqmmA9bc zGlPksio?yGsILah0^$u1c9oS(Dwe2~dsfgV;uOUi-PcHA08+u)lB|yVs-h;Kx1oh^+0Ey?Eyauc5)T#Fr~EJ?o}* zW(0s5ps{kUC2I{4^kEWiSk`)9<^yhSo#!tX-7-5$XGY(VwrtqBLikh$ZLJE-A+i)J znlPayo4)$NVQn7SVpJz-BWQ02{nWUB8gAZowSKM0%4}HtV?eczykudld2H>{^vIP$ z*a!F$q}gDqf#_R`#o^t|fViRslYp%HcsCIb=?TrqIOW09NQWE-&r3kqUNbxCZjT9V zONLyLDvVAsN4WJPVZa~U3a}u~5Y3(B1;8tYV^SETUNF%PdP^i~zXz-6#h=XQ*2CuB z%*dno3p>~C!v!GfAAsL@x2J(jB^q=Auxv0t`u=wS8?xl_m43@zfSuQzhYyq#wV#NB zwh?PB`^4JvYtk$3@Gfk?!EgBru%IHuQU0j4ZcrtG7yOo4yMnW3^Mi`f4&ZkgdUn9HsZRcE-d@K`qo@vf&APsFe7Dt-4Y& zVOzB7y}N$!Agy^#^AAP4t?!q*rXJFBk?laT$rT>6O9Yd{e1q8SvrRWVL>ls_+FM8e zD1fvYaF;_GRCF$1b^D#LM|k|o-pcNZ zSenDrrNbLvB>ANQSHg$tSauuy7k+(zBRJF037qY6@*ORSn|wNPrt$AGt!F{U^up(k zysS2Ux~txJxM;z;z~wEopoe0Dz8WSSiGv#m>+6i49B_LxiP}wjxX@#3q>Seut&Kk) z$Fe-LG1U`yj>fsPR9I6CJ=N=C&k2ctqket|3AtcA=z{Rvb?Z5NU0MB~RNOr3x66hC zQkAR7mKf}oT~5PRzMQ~549c0_un2tWpA0Kxra~50IJX+S;(w+-Tr3cL?k_){+_x9| zo)G%RkrJc#sdmNEsp>ej0jB$`46@2c8Q(g|&6_adrE+w`%W8WM!!44kMu?k_sz#t# z?_1KSs#!pg9Ehuf(ibI99Wzk)IkSsGaz}hbf2N|VBU_nS;>3Quf)8)Af`zLTmj#fK z=~TD#>_Ev_`g3lvB&Fr^I1JQXaYs+rGra2kAgc`=R=-T!U3$0?Sk}&ECDb}`uPoUP z5Bk0uJG^kdLUt_Mq5(IeU6I|dZD^VIvyGod+otEc0ej>1Z=geDE&Jp-nbVPVBliaT zLM7=}xOdPIJcC!OEg4|+XZc~j+J)AS8q)MmDla!F z&0Tq;>LaU7a1DG#D-iN&xnZHb=Tp|cVHmipfK`{>eqF7aq^jt8v3BHJ?FU=MxDPq> zsdc*~Rj}=-5-88;flDs^)L&H=o39xrcEju2qc=)S>K=}A=V5wB`jxNAC_H1dBi}h35dvI5J`vhJUTp%_3-*d~ISF*Qc)^Dwo1f%H@&a0D zSU#3Zfjy2XIOvG+I6U){=f${YSTsm4&{`)F)b`mCc4ian8(<;tDF_Y<@*io3Y$D61OZ+%<|nK^s;zK z)8SoNX%8qsG^7<=C3i4R{IK&fIDK(}0%=rgh>tr9-H!_3-; zl0dqqpSO$ec*2sLWggs->JUg)}4jVjpBY8!K?)Bi` z5d@IY;UUpZUcMdz%K(K@dyy@V9zV5@N!EiCom+c;Hrd52C)ZIb$cRtX*vS?oK(p%ZQKczi{$A zbNn%OQYPtxKm|ywBPKJ+`<*NDo_DfAkV~{K?O!*Mypl;RVqe3|@}^2-OvuyKA%F9_ z#{4cx#H@`)A4^0!8{Eb532KsWS@7Du%u986r&gbz_d3f%41Rp4-$ETRaP0uNT}^H_ z(V~yD1`k^6)TSp23?RnoZqBmb zw9RhKbb86Q^5ow!O!G$VgaUWLN|oG&2X~~mppvjv6`8+TllT=-ugY0k4peVn1raFI z5IDX4#v6rHr^QTbNV9pPWoNc$BZY`EQtI~Mf{@*wV8?51e-Uxmae+e6guvEg`FZi3 z%QA#8-_nKi=EO(AcL(WVC}hhcMnTt)5}l(q@g$iq8+`+I<1%?DYUQm;L>}p>(cIDD z%T>6!)>LLr0XnWit~4Bgw9pcrlN-6Lv6s6f1|CsKxmNqB(a@XFS|osf$i=m5IU*|J zbFSf2n{N;_;7A;-1+SZHvwCyqA+}M6+WZgYesHOwazy}F?he=TEhSP)+F5a7@ne=exIWhP_&etPbQG0}eYXi`&(@JOtyZW^b;yQMpduKsW4 z??^7Nv&pyWukcY$umI<&8Rt5i&A^cp-`ptv^&xo?lLEELoaeTT99v-aw{7>?+$8~^ z=XUfNR!)R_SNEh-SZd|%hNvT~+w=Nf9%WeMr8Pcx%AVrDUCWTVae2$H@1D%{u%(bB zyKrbPi`hrap^@r7N5@E0OFI{Tx!t*~h$P42sn6ALB%QFIM6J|a%z2-~`=rd84fRW~ zEoVZng^XGDnR0pkc&XhrT(9O5r6@!=m!XGMiQvmWH+KkWi%-N#U0A?VfWfp=`IXOi zpO*>D?aS}?`(Ey7$0?aRGaalfdWu`kM4YV9G){R#(iqxU)$y)3w^^k}1MH(8#Vlks z$MpAxBvAd{Rt{5mH&}0r3BI$mP5enk0ZIIu78Et1CIwr zk{WomIPxb_sYZaDeK+{@RHF*m);%eCRB@u8ByJ)g#8Zj-dR~R@H*}{RphCotIW8$x zylhgeutdlCV|JSpwLM@we@F+jI_e6Eh3AxAc((ev0!@7b4fU|{k~FGw35ylG!fGBk z!}@@x=Os@g#M+$0Zq?uA1x2C9J2w}-au~-OtmeJ8hD6}+KFE}9X!mPZT#3k@jK4Gv zvQNofo_geNRbBo(Y|bR>?w&HO<9t9fUFucyI?{=iCmebR}tLp?R@|Fsde7m z3)A@DXw(0FD$2S52|_~|fwC_i${x$UR1CVSOz=JW;-ey3FUnITX?db7}pgLZb{?Fb++p2CuL=`nQk#P!BN}H9Ff}J8m^?Fs5vwsWAVdV9`$~ z(xJlb=i`ITm1@%oL2GNZ9TkXqWily(i*bqUk=SOu5ALJ|zqQ;maVGt;U+XFoCDD90X} z$W}~Yl}#$)TkQ3N6#Pnr*w?C-Rpyuff?AV2Rq}uP3({o?bHYNIYFqVx+kaN|xpw(b z9d^!wa|X!s-vMle%1q`x07bMmnKwG%e`+xEVIFkhMwVq}^%}y6=1{?LP@alVD3G4! zg+TrULmb|AOx`ebri=fsOOVyji`%jnIqlGVd;MJTyPBBCP!X#d0UPo2Zm4<>N13o+ z21U=C9!d~FL>Y?8iAtxmkWBx-D;rLGwHax5F{qJhw6F&c4AQHQXHo7=P|?I>ZxnM$ zc{jf+GNHEO?3wgCSHMPa$c$9@I3;KN3ZFk7bLw%^u z_{qX=9rl$4lpo)TMXHL$7zd*mR)?-_sKwrV zQScjJGM&UV+*M5Z;& zaC~1yG?!l;r&jL|SVfE^HDb%qyZ`?83 zP4&*X*3{;ATgic=i+id660-l~_2%VgGx`AXVDFj0R=K?py&s(K_XI?3XdC(2&mHq* zXKmGfss9c$51aG!YE?pN+LP1WlBin!?($&G8C0!xwC&A?!q+t!w&U!o9bRm-k9K)0 zac&4cE*usjyuZ>`s-5snDgvkAoxizkz;fs2!spbU(Ky;k461?EyO=bflYxv{Mc= zrYn17WjwWRGYK0zMhJV$r1gxmj;EWtyenM0kP}f=sUmt1DczhGHf5T5xpy?=C$V{p zlxP%7Of5IZcnA$1sW|Ly>ibl_TeuQYGW41^XR*Z66DN<(wC+k8lJj5i#%C*^A4fc^ z?{Fc%(OBa0QX*wken>);-}g@+4ZqBP%P3&(9S7!=HE8^%>al=%<@r?#v{eGI!7fk2 zpMXG+#&jLrP&^eGbf*oH2W?3$a+itKL@g&V;;{7pgS9sghq`~`zOU+6Dn&&hgJg&l zxs`_u3F=eh6u zpXa)t`=9E_b~ujt&gcA`=j;7Cr5VlW#6HQY2lv}TSoYlME7{JGUQfzisfI??{SG*Y zya~&KBFmIi(&;((&BU*at+*7o;_2@w|9q4|#HRPFXpE6#QUYOowKrhRl(I%=O?u;> z>3Tr(#wTyRakaT}JhwhuBO*E5a0ovv;U)HM7;;j^l`t)nxR+#X) zzwbsD={@>>73w%TeJ~K*z`eP*)P1K<*FzYdOP_UUVK9l^>9jc8{Ks~;g^oLf^&v-iI~{LpneFGKZw!Pp)yPg^Mp?+^o{nXj?v*OfiAZ?WL=_P~u{Ph>qlhia1xz85Ui z^507`Q!(HfA+$~kaX-EG>PC1+SQ#q3hGm@Ng_}96zqv?HlGu7VWItU^CKNj`JcZEJ zGj(YK*IF=4h=GLy$5jYjAHQp)M}(qI4y&*oYm=t~^_hs=l?vx2wWX~!T+TD4z z4sfAtwmI6P+nIkT+uM-OZl*KU@{!p_2lFp0_EMN&o$@#Jdzff{xBTE3=SQ8+KOgEH z?EA96)(^>kb_)a3R4x3}tBl#Zet*j0tan}V%8_(qg2RgKfT+4D4Ml0@n`7g`gp z=JeFP=+5Kjl}8i@g%v%>cX9e#cQ$X2s0t~+8ArJmt|HXCy4`69(B z6RKOExrQ(*lwxiM;M_@7Vg~3(X$;551jqJ$SGr&6p>R&=UC;<6@E*pq(r>&j^YqmS z+RV#Oao<>t+?kA}mA0-}@3YA#*YUGVuEt1D-X`dz@uBBVqS6HrL~@yDl;KS2=_$2Y z&xSP$*JY{+nSRk*3|P!$^onQ8F}cN0gB+(7)}8#DC4wk3oEplW zCOuP0c>Yzhc~x%W2Mzng^-4bV^!I%n*^0bhZw!(WO~>@l82(VFY0VV-6Nz(27c6^u zp73V2#oS^QMN%r66WckHKloc%bh8eN?>{B=0Hj)EB4-d>aOPA2_#xj+Vb-DL_?Mqa zrUq7~TYIlRxx!a**Tlmb$uHdlTFSw{Di*U3hRP)~xImI|NI3`ELsD2gb2$G$t%2JE z`9E9*QoqDXXugjNusJxbzT@Af@22@P%Iw3|Meczjw_iEG?AN3SCI~D1py?;%oI%t$ zLb7}ZlB!BM!T6?&al3OQC~N}@Kl3Gju*DMw{T;i)BO?0-E)T!_1&u~d;dwG@4tR0% z8fhdNDZ@^j)q~AL9j#U!0$I)<79A8eAmB|s;N}iPI_Y}#f^_eIgniwH z*J-q+C2ek3gkX=`$k61Sa-Ou-?>^Fze!K>uSe+Cec!lHgM1JK-9;8ilsG%1=-K!jI z-lASd@YXw7mm`4LZMot!3{;x|7NLA7GD##51@FxEl@I5l^lL|IpB(`-yejy)}I zwjJg!#~4uNNvv!(?J#f_XE(qZn)UGzYI^-e*qyf3taC0F6+!){G@diBz0Kh48+y2J zVGkm}q>aZ;Y~u6{)pyW~f)oKwNZ#4l(khfcB0hvf4`kmEX-bSB8w zXFL|I744CU8pul>9%+I-r7ts zW*reLFvGm+Rx;W+s@}A#Jm-9RAzHDQ05M3iW7{H97?o+PKZ(dWj|0Cv2LnJZwm1HG`DwZdt5ostNX$@LSriawqECnTq=jD1JLej6Y6{#RI@S+m%w>xQnlv{pQ6+s}iB6^X6 zN%7*z<`Ziiay95~nD$F;;|`@RiJ-=GG$`;{YH92=*|vqVbtTE%Fgk_HR@QWz7`kUf zA9}Nb3oH%?^s#vs!KGYlL4$kZ-$=XuK(LPlS=MNrlMHQREv+WA3;xD z@1J+5n?0ePLDhjv14zmkV>xMNOLfSfZ-r0CDO0V99nDJ4n>aDCt3t&|ECaG%A(s)I zHN=+Wg6G5BexTMMssjC(If7zjAOMZK@e>_4L)~ z>bh3YTm6G-CbkvkwmurN!chC`eD+sqn6^|C%uR!sG50Oa?t%4&Cb>$D&tL1$d`_4j z%RXqn&c0u0$1JS0^gZnXL&|lumQh^~A~o~i(?%((16MxJr6s1jPON@9yx5#YV5CaW zi&_~!+`|2jXnf50HVg1BFY@oDoz7^}%}dP1_q!7{RJ2>Sb6-RDT*6#Pdb;EALy0r- z>&vHSqT^4(rK)0#o<)h2)hB2{DA`|@n>=p|nN8WAg*D6h)CociYDUa{cV0CYOHbI< z?p#z3VdS3f(Q3Rm_$ARCQ~hdsFXI_W(?J_;+CtwFnLVcIZz^u=J=cknaU}GjMGFe< zTh1s?6th0w!wWOuWy=_SN;1jeV18b2|NYX!S}GPsE&AaprD+VI@V7)=4|tM)(&1T) ziBG`>B)efI_XjTCJNQ_vx%h{06*xsbm?=jpqP)VTzgR&}9FLOHcn+uR*>u`QR+wfT;bWSIThIgY+i?2d#eQHKAOC4>%Ih65iNNf%)S(Q*0NBNG-P?Q$rGT}OMLL`AEFnpUiWyn+1J z{wIPuuShP*hQ(@Xha4oCRpj8r-*=XDJ=MVJSzfUFny!0jAnVOXlQcsSZ|TVNws$DZ zh|Zp3Xz7PyVQ^27PNq(b&$~KCfQ-7H}^3*2O`Du4>JN&x&aO zb!g8x9!07}SUsm`lvghvpeo~`=w6`55*gMJWi<2AZxYF8{A$E0>bI0Kp~Lg(vWr22 zj)~a^CFPJdWmZY5FE%!=d){8ysu8zQwc6Q{BfLTDZ`Ro{FYds3gHj}KXC7P8wem8$ zes1amDNf(&p?>I0T`1j#D9-zKCfnwGtBG7e=6^PF+9&RgH1IZE!Hqa?`fD7Rtj;_p zdUjB{*-|=9Y~4h#CghRd@WYu2`HXr9M{r)>s_d%z^|hccFh|;XNu{Y@JU>NF7LAL* zA(s~Lj=$#0yZDzD&6Dlpy5;c~1v9hj-FMg;DcYqYrC8RvK9`?ksuY6fVTdZR#GP;B z=;UzI*5_yDYox-PT}n-hJ*K~~L348?nhNxL!NTU=zuoe$TG0C4xBvQbc(0Qj<+crf z|GASkeq`@NoVMhej*vs~;}O$oE%uQ&E9j@Q`?SW+91U(v-Rj@#$n^^&PXCrV$$0ZL zoAK6bTN|^Q=>;)f;K)MBmpwJ>P2U;0pK)})a2G4+$ZU|J;)Cklj)4kxREjS;Bm6kM zN7!A@7>!0qv}(1H5ubg z4{E3Q%@)qFUjvrQYbsIL1#8>F;Ft`)WvcpGO`>*GJF!N>{bpbywIq~m>@aePbun}9Zd#y=bwwz1{K3L+`ZRb=gP3$`+x8?rt%J5X`f8;!m-F#}XTi~+}ZnsDB z>I*mB!dh=m%_2)U(|XKCNfG-A7HnI^{7=;l+%9B+SMI7ZdHkGz&$fk|=(afjlHQXT ztooelmecuIelfkius*ZOAm1fD*p-3kn+jX~cl*fn~x_S-YUth%aRWfPehJKrv|>u*l;e%9bktnmJsm2d=!H-@J!+ip+`^qnCmOCF)SD(6mrJyD3_(3`X zOz91K2ipR5^*S@u_&IB-k*?^eu+(xwUjyU&?uXj(IP97TP~|L~bl{T
DYq77Q| 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 z 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
@*JpyqKN!2t2l{mR$H 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

U62&M^s~*MJUJ89ge0bx}XA?U)t(ES!3z3 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 Gv;PLztZ + + + + + + + + + + + + + + diff --git a/docs/_static/js/copybutton.js b/docs/_static/js/copybutton.js deleted file mode 100644 index 331cdd4..0000000 --- a/docs/_static/js/copybutton.js +++ /dev/null @@ -1,65 +0,0 @@ -$(document).ready(function() { - /* Add a [>>>] button on the top-right corner of code samples to hide - * the >>> and ... prompts and the output and thus make the code - * copyable. */ - var div = $('.highlight-python .highlight,' + - '.highlight-python3 .highlight,' + - '.highlight-pycon .highlight,' + - '.highlight-default .highlight') - var pre = div.find('pre'); - - // get the styles from the current theme - pre.parent().parent().css('position', 'relative'); - var hide_text = 'Hide the prompts and output'; - var show_text = 'Show the prompts and output'; - //var border_width = pre.css('border-top-width'); - var border_width = '0px'; - var border_style = pre.css('border-top-style'); - //var border_color = pre.css('border-top-color'); - var border_color = 'rgba(0,0,0,0.4)'; - var button_styles = { - 'cursor':'pointer', 'position': 'absolute', 'top': '0', 'right': '0', - 'border-color': border_color, 'border-style': border_style, - 'border-width': border_width, 'color': border_color, 'text-size': '65%', - 'font-family': 'monospace', 'padding-left': '0.2em', 'padding-right': '0.2em', - 'border-radius': '0 3px 0 0' - } - - // create and add the button to all the code blocks that contain >>> - div.each(function(index) { - var jthis = $(this); - if (jthis.find('.gp').length > 0) { - var button = $('>>>'); - button.css(button_styles) - button.attr('title', hide_text); - button.data('hidden', 'false'); - jthis.prepend(button); - } - // tracebacks (.gt) contain bare text elements that need to be - // wrapped in a span to work with .nextUntil() (see later) - jthis.find('pre:has(.gt)').contents().filter(function() { - return ((this.nodeType == 3) && (this.data.trim().length > 0)); - }).wrap(''); - }); - - // define the behavior of the button when it's clicked - $('.copybutton').click(function(e){ - e.preventDefault(); - var button = $(this); - if (button.data('hidden') === 'false') { - // hide the code output - button.parent().find('.go, .gp, .gt').hide(); - button.next('pre').find('.gt').nextUntil('.gp, .go').css('visibility', 'hidden'); - button.css('text-decoration', 'line-through'); - button.attr('title', show_text); - button.data('hidden', 'true'); - } else { - // show the code output - button.parent().find('.go, .gp, .gt').show(); - button.next('pre').find('.gt').nextUntil('.gp, .go').css('visibility', 'visible'); - button.css('text-decoration', 'none'); - button.attr('title', hide_text); - button.data('hidden', 'false'); - } - }); -}); diff --git a/docs/_static/logo-dark.svg b/docs/_static/logo-dark.svg new file mode 100644 index 0000000..8a79e69 --- /dev/null +++ b/docs/_static/logo-dark.svg @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/_static/logo-light.svg b/docs/_static/logo-light.svg new file mode 100644 index 0000000..32bded4 --- /dev/null +++ b/docs/_static/logo-light.svg @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/_static/reference.svg b/docs/_static/reference.svg new file mode 100644 index 0000000..78d2af9 --- /dev/null +++ b/docs/_static/reference.svg @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + diff --git a/docs/_templates/autosummary/attribute.rst b/docs/_templates/autosummary/attribute.rst new file mode 100644 index 0000000..f0d86ad --- /dev/null +++ b/docs/_templates/autosummary/attribute.rst @@ -0,0 +1,13 @@ +:orphan: + +{{ fullname | escape | underline}} + +.. currentmodule:: {{ module }} + +attribute + +.. auto{{ objtype }}:: {{ fullname | replace("numpy.", "numpy::") }} + +{# In the fullname (e.g. `numpy.ma.MaskedArray.methodname`), the module name +is ambiguous. Using a `::` separator (e.g. `numpy::ma.MaskedArray.methodname`) +specifies `numpy` as the module name. #} \ No newline at end of file diff --git a/docs/_templates/autosummary/base.rst b/docs/_templates/autosummary/base.rst new file mode 100644 index 0000000..3d0afed --- /dev/null +++ b/docs/_templates/autosummary/base.rst @@ -0,0 +1,17 @@ +{% if objtype == 'property' %} +:orphan: +{% endif %} + +{{ fullname | escape | underline}} + +.. currentmodule:: {{ module }} + +{% if objtype == 'property' %} +property +{% endif %} + +.. auto{{ objtype }}:: {{ fullname | replace("numpy.", "numpy::") }} + +{# In the fullname (e.g. `numpy.ma.MaskedArray.methodname`), the module name +is ambiguous. Using a `::` separator (e.g. `numpy::ma.MaskedArray.methodname`) +specifies `numpy` as the module name. #} \ No newline at end of file diff --git a/docs/_templates/autosummary/class.rst b/docs/_templates/autosummary/class.rst index 0735953..0ae65c9 100644 --- a/docs/_templates/autosummary/class.rst +++ b/docs/_templates/autosummary/class.rst @@ -1,32 +1,27 @@ -{{ fullname | escape | underline}} - -.. currentmodule:: {{ module }} - -.. autoclass:: {{ objname }} - - -{% if attributes %} -**Attributes** - -.. autosummary:: - :toctree: - {% for item in all_attributes %} - {%- if not item.startswith('_') %} - ~{{ name }}.{{ item }} - {%- endif -%} - {%- endfor %} - -{% endif %} +{% extends "!autosummary/class.rst" %} +{% block methods %} {% if methods %} -**Methods** - -.. autosummary:: - :toctree: - {% for item in all_methods %} - {%- if not item.startswith('_') or item in ['__call__'] %} - ~{{ name }}.{{ item }} - {%- endif -%} - {%- endfor %} + .. HACK -- the point here is that we don't want this to appear in the output, but the autosummary should still generate the pages. + .. autosummary:: + :toctree: + {% for item in all_methods %} + {%- if not item.startswith('_') or item in ['__call__'] %} + {{ name }}.{{ item }} + {%- endif -%} + {%- endfor %} +{% endif %} +{% endblock %} +{% block attributes %} +{% if attributes %} + .. HACK -- the point here is that we don't want this to appear in the output, but the autosummary should still generate the pages. + .. autosummary:: + :toctree: + {% for item in all_attributes %} + {%- if not item.startswith('_') %} + {{ name }}.{{ item }} + {%- endif -%} + {%- endfor %} {% endif %} +{% endblock %} \ No newline at end of file diff --git a/docs/_templates/autosummary/class2.rst b/docs/_templates/autosummary/class2.rst new file mode 100644 index 0000000..0735953 --- /dev/null +++ b/docs/_templates/autosummary/class2.rst @@ -0,0 +1,32 @@ +{{ fullname | escape | underline}} + +.. currentmodule:: {{ module }} + +.. autoclass:: {{ objname }} + + +{% if attributes %} +**Attributes** + +.. autosummary:: + :toctree: + {% for item in all_attributes %} + {%- if not item.startswith('_') %} + ~{{ name }}.{{ item }} + {%- endif -%} + {%- endfor %} + +{% endif %} + +{% if methods %} +**Methods** + +.. autosummary:: + :toctree: + {% for item in all_methods %} + {%- if not item.startswith('_') or item in ['__call__'] %} + ~{{ name }}.{{ item }} + {%- endif -%} + {%- endfor %} + +{% endif %} diff --git a/docs/_templates/autosummary/member.rst b/docs/_templates/autosummary/member.rst new file mode 100644 index 0000000..a3fb4ec --- /dev/null +++ b/docs/_templates/autosummary/member.rst @@ -0,0 +1,13 @@ +:orphan: + +{{ fullname | escape | underline}} + +.. currentmodule:: {{ module }} + +member + +.. auto{{ objtype }}:: {{ fullname | replace("numpy.", "numpy::") }} + +{# In the fullname (e.g. `numpy.ma.MaskedArray.methodname`), the module name +is ambiguous. Using a `::` separator (e.g. `numpy::ma.MaskedArray.methodname`) +specifies `numpy` as the module name. #} \ No newline at end of file diff --git a/docs/_templates/autosummary/method.rst b/docs/_templates/autosummary/method.rst new file mode 100644 index 0000000..0e88fb9 --- /dev/null +++ b/docs/_templates/autosummary/method.rst @@ -0,0 +1,13 @@ +:orphan: + +{{ fullname | escape | underline}} + +.. currentmodule:: {{ module }} + +method + +.. auto{{ objtype }}:: {{ fullname | replace("numpy.", "numpy::") }} + +{# In the fullname (e.g. `numpy.ma.MaskedArray.methodname`), the module name +is ambiguous. Using a `::` separator (e.g. `numpy::ma.MaskedArray.methodname`) +specifies `numpy` as the module name. #} \ No newline at end of file diff --git a/docs/_templates/autosummary/module.rst b/docs/_templates/autosummary/module.rst new file mode 100644 index 0000000..bd36920 --- /dev/null +++ b/docs/_templates/autosummary/module.rst @@ -0,0 +1,7 @@ +{{ fullname | escape | underline}} + +.. automodule:: {{ fullname }} + + {% block docstring %} + {% endblock %} + diff --git a/docs/_templates/index.html b/docs/_templates/index.html new file mode 100644 index 0000000..156134f --- /dev/null +++ b/docs/_templates/index.html @@ -0,0 +1,121 @@ +{# + Loosely inspired by the deprecated sphinx/themes/basic/defindex.html + #} + {%- extends "layout.html" %} + + {% block css %} + {{ super() }} + + {% endblock %} + + {% set title = _('Overview') %} + {% block body %} + +

+
+
+
+

Lentil: Fast optical propagation

+ +

+ Lentil is an Python package for developing high-performance diffraction simulations. + Lentil provides an easy to use framework for modeling optical systems and simulating + the wave propagation of light through them. Lentil was originally developed at NASA's + Jet Propulsion Library and is now available as open-source software. + + +

+
+ +
+
+ +
+ +
+
+
+ + + +
+ +{% endblock %} + +{% block footer %} + + + +{% endblock %} + + + diff --git a/docs/cite.rst b/docs/cite.rst new file mode 100644 index 0000000..e848207 --- /dev/null +++ b/docs/cite.rst @@ -0,0 +1,33 @@ +.. _cite: + +************* +Citing Lentil +************* + +If Lentil has been significant in your research and you would like to +acknowledge the project in a publication, we suggest citing the following +paper: + +* Kee, Andrew G., Troy, Mitchell, Nissly, Carl et al. *Lentil: An open-source + library for fast optical propagation* + +*In BibTeX format:* + +.. code-block:: bibtex + + @Article{ kee2024lentil, + title = {Lentil: An open-source library for fast optical + propagation}, + author = {Andrew G. Kee and Mitchell Troy and Carl Nissly and + Jonathan Tesch and Siddarayappa Bikkannavar and David + Redding}, + year = {2024}, + month = jun, + journal = {}, + volume = {}, + number = {}, + pages = {--}, + doi = {}, + publisher = {}, + url = {} + } diff --git a/docs/conf.py b/docs/conf.py index 2b09594..8da209e 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -16,7 +16,7 @@ project = 'Lentil' author = 'Andy Kee' -copyright = f'{datetime.now().year} California Institute of Technology' +copyright = f'2017-{datetime.now().year} California Institute of Technology' with open(os.path.normpath(os.path.join(path, '..', 'lentil', '__init__.py'))) as f: version = release = re.search("__version__ = '(.*?)'", f.read()).group(1) @@ -30,10 +30,12 @@ 'sphinx.ext.napoleon', 'sphinx.ext.viewcode', 'sphinx_remove_toctrees', + 'sphinx_copybutton', + 'sphinx_design', 'matplotlib.sphinxext.plot_directive'] templates_path = ['_templates'] source_suffix = '.rst' -master_doc = 'index' +master_doc = 'docs' exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] @@ -42,13 +44,45 @@ html_theme = 'pydata_sphinx_theme' html_theme_options = { 'show_prev_next': False, - 'google_analytics_id': 'UA-180546240-1', - 'github_url': 'https://github.com/andykee/lentil' + 'github_url': 'https://github.com/andykee/lentil', + "logo": { + "link": "docs", + "image_light": "_static/logo-light.svg", + "image_dark": "_static/logo-dark.svg", + }, + "collapse_navigation": True, + "navbar_persistent": ["search-button"], + "favicons": [ + { + "rel": "icon", + "sizes": "16x16", + "href": "favicon/favicon-16x16.png", + }, + { + "rel": "icon", + "sizes": "32x32", + "href": "favicon/favicon-32x32.png", + }, + { + "rel": "icon", + "sizes": "48x48", + "href": "favicon/favicon-48x48.png", + }, + { + "rel": "apple-touch-icon", + "sizes": "180x180", + "href": "favicon/apple-touch-icon-180x180.png", + "color": "#000000", + }, + ] } -html_logo = '_static/img/lentil.png' html_additional_pages = { - 'index': 'indexcontent.html' + 'index': 'index.html' +} + +html_sidebars = { + 'index': [] } html_static_path = ['_static'] @@ -56,8 +90,7 @@ html_show_sourcelink = False html_scaled_image_link = False -html_js_files = ['js/copybutton.js'] -html_css_files = ['css/lentil.css', 'css/syntax-highlighting.css'] +html_css_files = ['css/lentil.css'] pygments_style = 'default' diff --git a/docs/dev/contributing.rst b/docs/dev/contributing.rst deleted file mode 100644 index 24ee089..0000000 --- a/docs/dev/contributing.rst +++ /dev/null @@ -1,377 +0,0 @@ -.. _contributing: - -********************** -Contributing to Lentil -********************** - -.. note:: - - This contribution guide is very heavily influenced by (and in many places - directly copied from) the `Pandas development guide - `_. - -Bug reports and enhancement requests - -Bug reports and enhancement requests should be filed using Lentil's -`issue tracker `__. - -Working with the source code -============================ - -Version control, Git, and GitHub --------------------------------- -Lentil's source code is hosted on `GitHub `_. -To contribute you'll need `an account `_. Local -version control is handled by `Git `_. - -`GitHub has instructions `_ for -installing Git, setting up your SSH key, and configuring Git. All these steps -need to be completed before you can work seamlessly between your local repository -and GitHub. - -Some useful resources for learning Git: - -* `Github Docs `_ -* Matthew Brett's `Pydagouge `_ - notes on Git -* `Oh Shit, Git? `_ for when things go horribly wrong - -.. _contributing.forking: - -Forking -------- -You will need your own fork to work on the code. Go to the Lentil GitHub page and -hit the ``Fork`` button. You will want to clone your fork to your machine:: - - git clone https://github.com/your-user-name/lentil.git lentil-yourname - cd lentil-yourname - git remote add upstream https://github.com/andykee/lentil.git - -This creates the directory `lentil-yourname` and connects your repository to the -upstream (main project) Lentil repository. - -Creating a Python environment ------------------------------ -To test out code changes, you’ll need to build install from source, which -requires a suitable Python environment. To create an isolated Lentil development -environment: - -* Install either `Anaconda `_ or `miniconda - `_ -* Make sure your conda is up to date (``conda update conda``) -* Make sure that you have :ref:`cloned the repository ` -* ``cd`` to the Lentil source directory - -We can now create a development environment and install Lentil:: - - # Create and activate the build environment: - conda env create -f environment.yml - conda activate lentil-dev - - # or with older versions of Anaconda: - source activate lentil-dev - - # Install Lentil and its dependencies - python -m pip install -e . --no-build-isolation --no-use-pep517 - -You should now be able to import Lentil in your development environment:: - - $ python - >>> import lentil - -To view your environments:: - - conda info -e - -To return to your root environment:: - - conda deactivate - -See the full conda docs `here `_. - -Contributing to the code base -============================= - -Creating a branch ------------------ -You want your master branch to reflect only production-ready code, so create a feature -branch for making your changes. For example:: - - git branch shiny-new-feature - git checkout shiny-new-feature - -The above can be simplified to:: - - git checkout -b shiny-new-feature - -This changes your working directory to the shiny-new-feature branch. Keep any changes -in this branch specific to one bug or feature so it is clear what the branch brings to -Lentil. You can have many shiny-new-features and switch in between them using the git -checkout command. - -When creating this branch, make sure your master branch is up to date with the latest -upstream master version. To update your local master branch, you can do:: - - git checkout master - git pull upstream master --ff-only - -When you want to update the feature branch with changes in master after you created the -branch, check the section on :ref:`updating a PR `. - -.. _contributing.commit-code: - -Committing your code --------------------- -Once you've made changes, you can see them by typing:: - - git status - -If you have created a new file, it is not being tracked by git. Add it by typing:: - - git add path/to/file-to-be-added.py - -Doing 'git status' again should give something like:: - - # On branch shiny-new-feature - # - # modified: /relative/path/to/file-you-added.py - # - -Finally, commit your changes to your local repository with an explanatory message. -Lentil uses a convention for commit message prefixes and layout. Here are -some common prefixes along with general guidelines for when to use them: - -* ENH: Enhancement, new functionality -* BUG: Bug fix -* DOC: Additions/updates to documentation -* TEST: Additions/updates to tests -* PERF: Performance improvement -* CLN: Code cleanup - -The following defines how a commit message should be structured. Please reference the -relevant GitHub issues in your commit message using #1234. - -* a subject line with ``< 80`` chars. -* One blank line. -* Optionally, a commit message body. - -Now you can commit your changes in your local repository:: - - git commit -m - -.. _contributing.push-code: - -Squashing commits ------------------ -It's possible to combine (or squash) a number of smaller commits into one larger -commit. This helps to keep the project history more concise and readable. The -easiest wat to squash commits is by using interactive rebase. To consider the -most recent ``n`` commits:: - - git rebase -i HEAD~ - -To instead consider all commits including and after a specific commit:: - - git rebase -i - -The interactive rebase interface provides additional syntax details. - -Pushing your changes --------------------- - -When you want your changes to appear publicly on your GitHub page, push your -forked feature branch's commits:: - - git push origin shiny-new-feature - -Here ``origin`` is the default name given to your remote repository on GitHub. -You can see the remote repositories:: - - git remote -v - -If you added the upstream repository as described above you will see something -like:: - - origin git@github.com:yourname/lentil.git (fetch) - origin git@github.com:yourname/lentil.git (push) - upstream git://github.com/andykee/lentil.git (fetch) - upstream git://github.com/andykee/lentil.git (push) - -Now your code is on GitHub, but it is not yet a part of the Lentil project. For that to -happen, a pull request needs to be submitted on GitHub. - -Review your code ----------------- - -When you're ready to ask for a code review, file a pull request. Before you do, once -again make sure that you have followed all the guidelines outlined in this document -regarding code style, tests, and documentation. You should also double check your -branch changes against the branch it was based on: - -#. Navigate to your repository on GitHub -- https://github.com/your-user-name/lentil -#. Click on ``Branches`` -#. Click on the ``Compare`` button for your feature branch -#. Select the ``base`` and ``compare`` branches, if necessary. This will be ``master`` and - ``shiny-new-feature``, respectively. - -Make a pull request -------------------- - -If everything looks good, you are ready to make a pull request. A pull request is how -code from a local repository becomes available to the GitHub community and can be looked -at and eventually merged into the master version. This pull request and its associated -changes will eventually be committed to the master branch and available in the next -release. To submit a pull request: - -#. Navigate to your repository on GitHub -#. Click on the ``Pull Request`` button -#. You can then click on ``Commits`` and ``Files Changed`` to make sure everything looks - okay one last time -#. Write a description of your changes in the ``Preview Discussion`` tab -#. Click ``Send Pull Request``. - -This request then goes to the repository maintainers, and they will review -the code. - -.. _contributing.update-pr: - -Upadting a pull request ------------------------ - -Based on the review you get on your pull request, you will probably need to make -some changes to the code. In that case, you can make them in your branch, -add a new commit to that branch, push it to GitHub, and the pull request will be -automatically updated. Pushing them to GitHub again is done by:: - - git push origin shiny-new-feature - -Another reason you might need to update your pull request is to solve conflicts -with changes that have been merged into the master branch since you opened your -pull request. - -To do this, you need to "merge upstream master" in your branch:: - - git checkout shiny-new-feature - git fetch upstream - git merge upstream/master - -If there are no conflicts (or they could be fixed automatically), a file with a -default commit message will open, and you can simply save and quit this file. - -If there are merge conflicts, you need to solve those conflicts. See for -example at https://help.github.com/articles/resolving-a-merge-conflict-using-the-command-line/ -for an explanation on how to do this. -Once the conflicts are merged and the files where the conflicts were solved are -added, you can run ``git commit`` to save those fixes. - -If you have uncommitted changes at the moment you want to update the branch with -master, you will need to ``stash`` them prior to updating (see the -`stash docs `__). -This will effectively store your changes and they can be reapplied after updating. - -After the feature branch has been update locally, you can now update your pull -request by pushing to the branch on GitHub:: - - git push origin shiny-new-feature - -Delete your merged branch (optional) ------------------------------------- - -Once your feature branch is accepted into upstream, you'll probably want to get rid of -the branch. First, merge upstream master into your branch so git knows it is safe to -delete your branch:: - - git fetch upstream - git checkout master - git merge upstream/master - -Then you can do:: - - git branch -d shiny-new-feature - -Make sure you use a lower-case ``-d``, or else git won't warn you if your feature -branch has not actually been merged. - -The branch will still exist on GitHub, so to delete it there do:: - - git push origin --delete shiny-new-feature - -.. _run_tests: - -Running the test suite ----------------------- - -.. note:: - - Running the tests requires `pytest `_. - -The tests can then be run directly inside your Git clone by typing:: - - pytest tests - -Documenting your code ---------------------- -Changes should be reflected in the release notes located in ``CHANGES.rst``. This -file contains an ongoing change log for each release. Add an entry to this file to -document your fix, enhancement or (unavoidable) breaking change. Make sure to include -the GitHub issue number when adding your entry (using ``:issue:`1234``` where ``1234`` -is the issue/pull request number). - -If your code is an enhancement, it is most likely necessary to add usage examples to -the existing documentation. Further, to let users know when this feature was added, -the ``versionadded`` directive is used. The sphinx syntax for that is:: - - .. versionadded:: 1.1.0 - -This will put the text New in version 1.1.0 wherever you put the sphinx directive. This -should also be put in the docstring when adding a new function or method or a new keyword -argument. - -Building the documentation --------------------------- - -.. note:: - - Building the documentation requires `Sphinx `_, - `PyData Sphinx Theme `_, - and the ``sphinx-remove-toctrees`` extension. - -To build the documentation, navigate to your local ``docs/`` directory and run:: - - make html - -The HTML documentation will be written to ``docs/_build/html``. - -If you want to do a full clean build, do:: - - make clean && make html - -Publishing to PyPi -================== - -Prepare the release -------------------- -1. Increment the version number appropriately in `lentil/__init__.py - `_ according to - `PEP 440 `_. -2. Document contents of the release in `CHANGES.rst - `_ -3. Commit the changes from above on the master branch with a commit message equal to the - short version name (i.e. ``v0.3.2`` or ``v0.5.0b2``). -4. Push the updated master branch and create a new release. - -Build the release ------------------ -.. code:: bash - - $ python setup.py sdist bdist_wheel - -Upload the release ------------------- -.. code:: bash - - $ twine upload dist/* - -.. note:: - - Only core-team members are able to publish new releases to PyPi. diff --git a/docs/dev/index.rst b/docs/dev/index.rst index b93bf6d..ac8889d 100644 --- a/docs/dev/index.rst +++ b/docs/dev/index.rst @@ -4,17 +4,23 @@ Development *********** +This page provides resources for Lentil developers + + + .. toctree:: - :maxdepth: 3 + :maxdepth: 2 - contributing + tech_notes/index .. toctree:: :maxdepth: 3 - tech_notes/index + verification/index .. toctree:: :maxdepth: 1 + install + publishing changes diff --git a/docs/dev/install.rst b/docs/dev/install.rst new file mode 100644 index 0000000..aa50397 --- /dev/null +++ b/docs/dev/install.rst @@ -0,0 +1,77 @@ +.. _development.install: + +****************************** +Install Lentil for development +****************************** + + +Forking the Lentil repo +======================= +Matplotlib is hosted at `andykee/lentil.git `_. +If you plan on solving issues or submitting pull requests to the main Lentil +repository, you should first fork this repository by visiting +`andykee/lentil.git `_ and clicking on the +``Fork`` button on the top right of the page. See the +`GitHub documentation `_ +for more details. + +Installing from source +====================== +If you want to build from source in order to work on Lentil itself, first +clone the Lentil repository: + +.. code-block:: bash + + git clone https://github.com/andykee/lentil.git + +If you forked the Lentil repository, you should clone the Lentil repository +from your fork instead (replacing ```` with your GitHub +username): + +.. code-block:: bash + + git clone https://github.com//lentil.git + +Now you can install Lentil in editable mode from the ``lentil`` directory: + +.. code-block:: bash + + pip install -e . + +Development dependencies +======================== +Lentil uses the `pytest `_ framework for +testing. Install it with + +.. code-block:: bash + + pip install pytest + +The additional Python packages required to build the documentation are +listed in ``docs/requirements.txt`` and can be installed using + +.. code-block:: bash + + pip install -r docs/requirements.txt + +Running the test suite +====================== +To run the tests, in the root directory of your development repository run: + +.. code-block:: bash + + pytest tests + + +Building the documentation +========================== +The documentation source is found in the ``docs/`` directory. The +configuration file for Sphinx is ``docs/conf.py``. It controls which +directories Sphinx parses, how the docs are built, and how the extensions are +used. To build the documentation in html format, cd into ``docs/`` and run: + +.. code-block:: bash + + make html + +The built docs will be placed in the folder ``docs/_build/html``. \ No newline at end of file diff --git a/docs/dev/publishing.rst b/docs/dev/publishing.rst new file mode 100644 index 0000000..893471c --- /dev/null +++ b/docs/dev/publishing.rst @@ -0,0 +1,31 @@ +.. _publishing: + +Publishing to PyPi +================== + +Prepare the release +------------------- +1. Increment the version number appropriately in `lentil/__init__.py + `_ according to + `PEP 440 `_. +2. Document contents of the release in `CHANGES.rst + `_ +3. Commit the changes from above on the master branch with a commit message equal to the + short version name (i.e. ``v0.3.2`` or ``v0.5.0b2``). +4. Push the updated master branch and create a new release. + +Build the release +----------------- +.. code:: bash + + $ python setup.py sdist bdist_wheel + +Upload the release +------------------ +.. code:: bash + + $ twine upload dist/* + +.. note:: + + Only core-team members are able to publish new releases to PyPi. diff --git a/docs/dev/tech_notes/diffraction/dft2_caching.rst b/docs/dev/tech_notes/dft_caching.rst similarity index 100% rename from docs/dev/tech_notes/diffraction/dft2_caching.rst rename to docs/dev/tech_notes/dft_caching.rst diff --git a/docs/dev/tech_notes/diffraction/dft_sampling.rst b/docs/dev/tech_notes/dft_sampling.rst similarity index 100% rename from docs/dev/tech_notes/diffraction/dft_sampling.rst rename to docs/dev/tech_notes/dft_sampling.rst diff --git a/docs/dev/tech_notes/diffraction/index.rst b/docs/dev/tech_notes/diffraction/index.rst deleted file mode 100644 index 2c878f0..0000000 --- a/docs/dev/tech_notes/diffraction/index.rst +++ /dev/null @@ -1,12 +0,0 @@ -.. _tech_notes.diffraction: - -*********** -Diffraction -*********** - -.. toctree:: - :maxdepth: 1 - - prop_algorithm - dft_sampling - dft2_caching \ No newline at end of file diff --git a/docs/dev/tech_notes/index.rst b/docs/dev/tech_notes/index.rst index aac8014..5a6dec3 100644 --- a/docs/dev/tech_notes/index.rst +++ b/docs/dev/tech_notes/index.rst @@ -5,6 +5,8 @@ Technical Notes *************** .. toctree:: - :maxdepth: 2 + :maxdepth: 1 - diffraction/index + dft_sampling + dft_caching + prop_algorithm diff --git a/docs/dev/tech_notes/diffraction/prop_algorithm.rst b/docs/dev/tech_notes/prop_algorithm.rst similarity index 100% rename from docs/dev/tech_notes/diffraction/prop_algorithm.rst rename to docs/dev/tech_notes/prop_algorithm.rst diff --git a/docs/user_guide/verification/index.rst b/docs/dev/verification/index.rst similarity index 100% rename from docs/user_guide/verification/index.rst rename to docs/dev/verification/index.rst diff --git a/docs/user_guide/verification/pixel_mtf.rst b/docs/dev/verification/pixel_mtf.rst similarity index 97% rename from docs/user_guide/verification/pixel_mtf.rst rename to docs/dev/verification/pixel_mtf.rst index 305a3ea..b5aebb4 100644 --- a/docs/user_guide/verification/pixel_mtf.rst +++ b/docs/dev/verification/pixel_mtf.rst @@ -61,7 +61,7 @@ with the analytic result for the same imaging system: amp = lentil.circle((npix, npix), npix_pup_rad) alpha = (dx*du)/(wave*focal_length*oversample) - psf = np.abs(lentil.fourier.dft2(amp, alpha, npix=npix)**2) + psf = np.abs(lentil.fourier.dft2(amp, alpha, shape=npix)**2) psf = psf/np.max(psf) # Compute the optical MTF from a Lentil-generated PSF diff --git a/docs/docs.rst b/docs/docs.rst new file mode 100644 index 0000000..dc6713e --- /dev/null +++ b/docs/docs.rst @@ -0,0 +1,96 @@ +.. _docs: + +.. toctree:: + :hidden: + + user/index + examples/index + reference + dev/index + +******************** +Lentil Documentation +******************** + + +**Version**: |version| + +**Useful links**: +:doc:`Installation ` | +`Source Repository `_ | +`Issue Tracker `_ | + +Lentil is a Python library for modeling the imaging chain of an optical system. +It was originally developed at NASA's Jet Propulsion Lab by the Wavefront Sensing and +Control group (383E) to provide an easy to use framework for simulating point spread +functions of segmented aperture telescopes. + +.. note:: + + Lentil is still under active development and new features continue to be added. + Until Lentil reaches version 1.0, the API is not guaranteed to be stable, but + changes breaking backwards compatibility will be noted in the + :doc:`release notes `. + +.. grid:: 2 + :gutter: 5 + + .. grid-item-card:: :octicon:`file;1em;` User guide + + The user guide provides in-depth information on the + key concepts of NumPy with useful background information + and explanation. + + +++ + + .. button-ref:: user/index + :expand: + :color: muted + :click-parent: + + To the user guide + + .. grid-item-card:: :octicon:`code-square;1em;` Examples + + New to NumPy? Check out the Absolute Beginner's Guide. It contains an + introduction to NumPy's main concepts and links to additional tutorials. + + +++ + + .. button-ref:: examples/index + :expand: + :color: light + :click-parent: + + To the examples + + .. grid-item-card:: :octicon:`repo;1em;` API reference + + The reference guide contains a detailed description of the functions, + modules, and objects included in NumPy. The reference describes how the + methods work and which parameters can be used. It assumes that you have an + understanding of the key concepts. + + +++ + + .. button-ref:: reference + :expand: + :color: dark + :click-parent: + + To the reference guide + + .. grid-item-card:: :octicon:`terminal;1em;` Development guide + + Want to add to the codebase? Can help add translation or a flowchart to the + documentation? The contributing guidelines will guide you through the + process of improving NumPy. + + +++ + + .. button-ref:: dev/index + :expand: + :color: info + :click-parent: + + To the development guide diff --git a/docs/patterns/general/attributes.rst b/docs/examples/general/attributes.rst similarity index 100% rename from docs/patterns/general/attributes.rst rename to docs/examples/general/attributes.rst diff --git a/docs/patterns/general/large.rst b/docs/examples/general/large.rst similarity index 100% rename from docs/patterns/general/large.rst rename to docs/examples/general/large.rst diff --git a/docs/patterns/general/simple.rst b/docs/examples/general/simple.rst similarity index 100% rename from docs/patterns/general/simple.rst rename to docs/examples/general/simple.rst diff --git a/docs/patterns/index.rst b/docs/examples/index.rst similarity index 90% rename from docs/patterns/index.rst rename to docs/examples/index.rst index 08037d5..90a3788 100644 --- a/docs/patterns/index.rst +++ b/docs/examples/index.rst @@ -1,14 +1,15 @@ -.. _patterns: +.. _examples: -************** -Model Patterns -************** +******** +Examples +******** General ======= .. toctree:: :maxdepth: 1 + tutorial general/simple general/large general/attributes diff --git a/docs/patterns/matlab/matlab_interface.rst b/docs/examples/matlab/matlab_interface.rst similarity index 100% rename from docs/patterns/matlab/matlab_interface.rst rename to docs/examples/matlab/matlab_interface.rst diff --git a/docs/patterns/planes/filter_wheel.rst b/docs/examples/planes/filter_wheel.rst similarity index 100% rename from docs/patterns/planes/filter_wheel.rst rename to docs/examples/planes/filter_wheel.rst diff --git a/docs/patterns/planes/rb_element.rst b/docs/examples/planes/rb_element.rst similarity index 100% rename from docs/patterns/planes/rb_element.rst rename to docs/examples/planes/rb_element.rst diff --git a/docs/patterns/planes/translation_stage.rst b/docs/examples/planes/translation_stage.rst similarity index 100% rename from docs/patterns/planes/translation_stage.rst rename to docs/examples/planes/translation_stage.rst diff --git a/docs/patterns/radiometry/complex_sources.rst b/docs/examples/radiometry/complex_sources.rst similarity index 100% rename from docs/patterns/radiometry/complex_sources.rst rename to docs/examples/radiometry/complex_sources.rst diff --git a/docs/patterns/radiometry/propagation.rst b/docs/examples/radiometry/propagation.rst similarity index 94% rename from docs/patterns/radiometry/propagation.rst rename to docs/examples/radiometry/propagation.rst index 7d62cef..135e22e 100644 --- a/docs/patterns/radiometry/propagation.rst +++ b/docs/examples/radiometry/propagation.rst @@ -33,7 +33,7 @@ and multiply the source irradiance by the collecting area to get photons/second. >>> for wl, wt in zip(source.wave, source.value): ... w = lentil.Wavefront(wl*1e-9) ... w = w * pupil - ... w = w.propagate_image(pixelscale=5e-6, npix=32, oversample=2) + ... w = lentil.propagate_dft(w, pixelscale=5e-6, shape=(32,32), oversample=2) ... psf += (w.intensity * (np.pi*(pupil_diameter/2)**2)) >>> plt.imshow(psf, origin='lower') @@ -57,7 +57,7 @@ fine features present in the source's spectral response. >>> for wl, wt in zip(binned_wave, binned_flux): ... w = lentil.Wavefront(wl*1e-9) ... w = w * pupil - ... w = w.propagate_image(pixelscale=5e-6, npix=32, oversample=2) + ... w = lentil.propagate_dft(w, pixelscale=5e-6, shape=(32,32), oversample=2) ... psf += (w.intensity * (np.pi*(pupil_diameter/2)**2)) >>> plt.imshow(psf, origin='lower') @@ -100,7 +100,7 @@ runs 50 times faster. wave = bandpass.wave trans = bandpass.value - return lentil.propagate(self.planes, wave*1e-9, trans, npix, npix_chip, + return lentil.propagate_dft(self.planes, wave*1e-9, trans, npix, npix_chip, oversample, rebin, tilt, flatten=True) If we would like to render an image as read out by the detector, we add light_flux and @@ -139,7 +139,7 @@ image methods to the Model class: binned_flux = flux.bin(wave, waveunit=flux.waveunit) # do the propagation - img = lentil.propagate(self.planes, + img = lentil.propagate_dft(self.planes, wave=wave * 1e-9, weight=binned_flux, npix=npix, diff --git a/docs/patterns/radiometry/self_emission.rst b/docs/examples/radiometry/self_emission.rst similarity index 100% rename from docs/patterns/radiometry/self_emission.rst rename to docs/examples/radiometry/self_emission.rst diff --git a/docs/patterns/radiometry/source_coupling.rst b/docs/examples/radiometry/source_coupling.rst similarity index 100% rename from docs/patterns/radiometry/source_coupling.rst rename to docs/examples/radiometry/source_coupling.rst diff --git a/docs/patterns/radiometry/source_defocus.rst b/docs/examples/radiometry/source_defocus.rst similarity index 100% rename from docs/patterns/radiometry/source_defocus.rst rename to docs/examples/radiometry/source_defocus.rst diff --git a/docs/getting_started/tutorial.rst b/docs/examples/tutorial.rst similarity index 100% rename from docs/getting_started/tutorial.rst rename to docs/examples/tutorial.rst diff --git a/docs/getting_started/index.rst b/docs/getting_started/index.rst deleted file mode 100644 index e972dc1..0000000 --- a/docs/getting_started/index.rst +++ /dev/null @@ -1,10 +0,0 @@ -*************** -Getting started -*************** - -.. toctree:: - :maxdepth: 1 - - install - overview - quickstart diff --git a/docs/getting_started/install.rst b/docs/getting_started/install.rst deleted file mode 100644 index 754dd06..0000000 --- a/docs/getting_started/install.rst +++ /dev/null @@ -1,35 +0,0 @@ -.. _installation: - -############ -Installation -############ - -The easiest way to install Lentil is with ``pip``: - -.. code-block:: bash - - pip install lentil - -Python version support -====================== -Lentil requires Python 3.6 and above - -Dependencies -============ - -================================== ========================== -Package Minimum supported version -================================== ========================== -`NumPy `__ 1.16 -`SciPy `__ 1.4 -================================== ========================== - -Installing from source -====================== -See the :ref:`contributing guide ` for instructions on installing from -the source code. - -Running the test suite -====================== -Lentil comes with a suite of units tests. See :ref:`running the tests ` -for instructions on running the tests. \ No newline at end of file diff --git a/docs/index.rst b/docs/index.rst deleted file mode 100644 index 9ba4054..0000000 --- a/docs/index.rst +++ /dev/null @@ -1,7 +0,0 @@ -.. toctree:: - :hidden: - - getting_started/index - user_guide/index - reference - dev/index diff --git a/docs/license.rst b/docs/license.rst new file mode 100644 index 0000000..d6f334a --- /dev/null +++ b/docs/license.rst @@ -0,0 +1,8 @@ +.. _license: + +******* +License +******* + +.. include:: ../LICENSE.rst + :literal: \ No newline at end of file diff --git a/docs/reference.rst b/docs/reference.rst index a2f4d7f..023fd4e 100644 --- a/docs/reference.rst +++ b/docs/reference.rst @@ -38,15 +38,15 @@ Wavefront lentil.Wavefront -.. .. _api.propagation: +.. _api.propagation: -.. Numerical diffraction propagation -.. ================================= +Numerical diffraction propagation +================================= -.. .. autosummary:: -.. :toctree: generated/ +.. autosummary:: + :toctree: generated/ -.. lentil.propagate + lentil.propagate_dft .. _api.zernike: @@ -201,13 +201,11 @@ Field :toctree: generated/ lentil.field.Field - lentil.field.NDField - lentil.field.extent - lentil.field.overlap lentil.field.boundary + lentil.field.extent lentil.field.insert lentil.field.merge - lentil.field.multiply + lentil.field.overlap lentil.field.reduce Fourier transforms diff --git a/docs/release.rst b/docs/release.rst new file mode 100644 index 0000000..8b0e791 --- /dev/null +++ b/docs/release.rst @@ -0,0 +1,3 @@ +.. _release: + +.. include:: ../CHANGES.rst \ No newline at end of file diff --git a/docs/requirements.txt b/docs/requirements.txt index 01d0049..d059c04 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -1,4 +1,6 @@ sphinx>=3.0 pydata-sphinx-theme -sphinx_remove_toctrees +sphinx-remove-toctrees +sphinx-coppybutton +sphinx-design matplotlib diff --git a/docs/user_guide/coordinates.rst b/docs/user/basics.coordinates.rst similarity index 93% rename from docs/user_guide/coordinates.rst rename to docs/user/basics.coordinates.rst index c0d3655..9b010a0 100644 --- a/docs/user_guide/coordinates.rst +++ b/docs/user/basics.coordinates.rst @@ -1,4 +1,4 @@ -.. _user_guide.coordinate_system: +.. _user.coordinate_system: ***************** Coordinate system @@ -25,8 +25,8 @@ positive x-axis pointing to the right and the positive y-axis pointing up. Additional details on the sign conventions for representing wavefront error and of the complex exponential in the Fourier kernel are provided below: -* :ref:`user_guide.wavefront_error.sign` -* :ref:`user_guide.diffraction.sign` +* :ref:`user.wavefront_error.sign` +* :ref:`user.diffraction.sign` .. note:: diff --git a/docs/user_guide/diffraction.rst b/docs/user/basics.diffraction.rst similarity index 95% rename from docs/user_guide/diffraction.rst rename to docs/user/basics.diffraction.rst index 43577a4..c03a9aa 100644 --- a/docs/user_guide/diffraction.rst +++ b/docs/user/basics.diffraction.rst @@ -1,4 +1,4 @@ -.. _user_guide.diffraction: +.. _user.diffraction: .. |Wavefront| replace:: :class:`~lentil.Wavefront` .. |Plane| replace:: :class:`~lentil.Plane` @@ -86,7 +86,7 @@ follows the same basic flow: .. note:: Additional details on the plane-wavefront interaction can be found in - :ref:`user_guide.optical_systems.plane_wavefront`. + :ref:`user.optical_systems.plane_wavefront`. 3. **Propagate the wavefront to the next plane in the optical system** - the |Wavefront| object provides a number of methods to propagate between planes. The appropriate method @@ -106,9 +106,9 @@ follows the same basic flow: * :attr:`pixelscale` - the spatial sampling of the output plane * :attr:`npix` - the shape of the output plane * :attr:`npix_prop` - the shape of the propagation plane. See - :ref:`user_guide.diffraction.npix` for additional details. + :ref:`user.diffraction.npix` for additional details. * :attr:`oversample` - the number of times to oversample the output plane. - See the section on :ref:`user_guide.diffraction.sampling` for more + See the section on :ref:`user.diffraction.sampling` for more details. @@ -119,7 +119,7 @@ follows the same basic flow: :include-source: :scale: 50 - >>> w2.propagate_image(pixelscale=5e-6, npix=64, oversample=5) + >>> w2 = lentil.propagate_dft(w2, pixelscale=5e-6, shape=(64,64), oversample=5) >>> plt.imshow(w2.intensity**0.1, origin='lower') .. note:: @@ -155,7 +155,7 @@ different wavelengths and accumulates the resulting image plane intensity: for wl in wavelengths: w = lentil.Wavefront(wl) w = w * pupil - w.propagate_image(pixelscale=5e-6, npix=64, oversample=5) + w = lentil.propagate_dft(w, pixelscale=5e-6, shape=(64,64), oversample=5) img += w.intensity plt.imshow(img**0.1, origin='lower') @@ -178,10 +178,10 @@ wavefront intensity given by ``npix`` * ``oversample``. for wl in wavelengths: w = lentil.Wavefront(wl) w = w * pupil - w.propagate_image(pixelscale=5e-6, npix=64, oversample=5) + w = lentil.propagate_dft(w, pixelscale=5e-6, shape=(64,64), oversample=5) img = w.insert(img) -.. _user_guide.diffraction.npix: +.. _user.diffraction.npix: ``npix`` vs ``npix_prop`` ------------------------- @@ -234,7 +234,7 @@ The chirp Z-transform provides additional efficiency when transforming large arr Lentil selects the most appropriate DFT method automatically based on the plane size and sampling requirements. -.. _user_guide.diffraction.sign: +.. _user.diffraction.sign: Sign of the DFT complex exponential ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/docs/user_guide/optical_systems.rst b/docs/user/basics.optical_systems.rst similarity index 95% rename from docs/user_guide/optical_systems.rst rename to docs/user/basics.optical_systems.rst index cdbce4b..b45aca1 100644 --- a/docs/user_guide/optical_systems.rst +++ b/docs/user/basics.optical_systems.rst @@ -1,4 +1,4 @@ -.. _user_guide.optical_systems: +.. _user.optical_systems: .. currentmodule:: lentil @@ -26,7 +26,7 @@ Lentil uses |Plane| objects to represent discretely sampled planes in an optical and |Wavefront| objects to represent discretely sampled electromagnetic fields as they propagate through an optical system. -.. _user_guide.optical_systems.plane_wavefront: +.. _user.optical_systems.plane_wavefront: How a plane affects a wavefront =============================== @@ -66,7 +66,7 @@ the wavefront's complex data array: Planes in a simple optical system ================================= Most optical systems can be adequately modeled by a single far-field propagation -between a :ref:`user_guide.planes.pupil` and image plane. This includes most cameras, +between a :ref:`user.planes.pupil` and image plane. This includes most cameras, telescopes, and imaging instruments. In these models, all of the optics in a system are represented by a single |Pupil| plane: @@ -99,7 +99,7 @@ with a segmented aperture, as depicted below: This modification is not necessary to achieve accurate propagations, but can greatly improve performance. For additional details, see -:ref:`user_guide.diffraction.segmented`. +:ref:`user.diffraction.segmented`. More complicated optical systems diff --git a/docs/user_guide/planes.rst b/docs/user/basics.planes.rst similarity index 98% rename from docs/user_guide/planes.rst rename to docs/user/basics.planes.rst index f7a36b2..718c469 100644 --- a/docs/user_guide/planes.rst +++ b/docs/user/basics.planes.rst @@ -1,4 +1,4 @@ -.. _user_guide.planes: +.. _user.planes: .. |Plane| replace:: :class:`~lentil.Plane` .. |Pupil| replace:: :class:`~lentil.Pupil` @@ -121,10 +121,10 @@ to the plane's :attr:`~lentil.Plane.tilt` attribute. The default behavior is to perform this operation on a copy of the plane, but it is possible to operate in-place by setting ``inplace=True``. -See :ref:`user_guide.diffraction.tilt` for additional information on when to use +See :ref:`user.diffraction.tilt` for additional information on when to use this method. -.. _user_guide.planes.pupil: +.. _user.planes.pupil: Pupil ===== @@ -217,7 +217,7 @@ operation. Details of this algorithm are available in the :ref:`technical-notes` field information. Because of this, |Detector| planes can only be used as the final plane in a Lentil model. -.. _user_guide.planes.tilt: +.. _user.planes.tilt: Tilt ==== @@ -238,7 +238,7 @@ Given the following |Pupil| and |Detector| planes: ... focal_length=10, pixelscale=1/250) >>> w = lentil.Wavefront(650e-9) >>> w *= pupil - >>> w = w.propagate_image(pixelscale=5e-6, npix=(64,64), oversample=2) + >>> w = lentil.propagate_dft(w, pixelscale=5e-6, shape=(64,64), oversample=2) >>> plt.imshow(w.intensity, origin='lower') It is simple to see the effect of introducing a tilted wavefront into the system: @@ -255,7 +255,7 @@ It is simple to see the effect of introducing a tilted wavefront into the system >>> w = lentil.Wavefront(650e-9) >>> w *= pupil >>> w *= tilt - >>> w = w.propagate_image(pixelscale=5e-6, npix=(64,64), oversample=2) + >>> w = lentil.propagate_dft(w, pixelscale=5e-6, shape=(64,64), oversample=2) >>> plt.imshow(w.intensity, origin='lower') .. .. _user_guide.planes.transformations: diff --git a/docs/user/basics.rst b/docs/user/basics.rst new file mode 100644 index 0000000..86bbc6e --- /dev/null +++ b/docs/user/basics.rst @@ -0,0 +1,14 @@ +.. _user.basics: + +******************* +Lentil fundamentals +******************* + +.. toctree:: + :maxdepth: 1 + + basics.coordinates + basics.planes + basics.wavefront_error + basics.optical_systems + basics.diffraction \ No newline at end of file diff --git a/docs/user_guide/wavefront_error.rst b/docs/user/basics.wavefront_error.rst similarity index 98% rename from docs/user_guide/wavefront_error.rst rename to docs/user/basics.wavefront_error.rst index 289db0c..00f6f59 100644 --- a/docs/user_guide/wavefront_error.rst +++ b/docs/user/basics.wavefront_error.rst @@ -1,4 +1,4 @@ -.. _user_guide.wavefront_error: +.. _user.wavefront_error: **************************** Representing wavefront error @@ -17,7 +17,7 @@ Lentil to a Numpy array. For :class:`~lentil.Pupil` planes, the :attr:`~lentil.Pupil.phase` attribute represents the optical path difference (OPD) relative to the pupil's reference sphere. -.. _user_guide.wavefront_error.sign: +.. _user.wavefront_error.sign: Wavefront error sign convention =============================== @@ -202,7 +202,7 @@ Defining custom Zernike coordinates ----------------------------------- By default, all of Lentil's Zernike functions place the center of the coordinate system at the centroid of the supplied mask with its axes aligned with Lentil's -:ref:`user_guide.coordinate_system`. This works as expected for the vast majority of +:ref:`user.coordinate_system`. This works as expected for the vast majority of needs, but in some cases it may be desirable to manually define the coordinate system. This is accomplished by using :func:`~lentil.zernike_coordinates` to compute ``rho`` and ``theta``, and providing these definitions to the appropriate Zernike function. For diff --git a/docs/user_guide/image_sensors.rst b/docs/user/image_sensors.rst similarity index 99% rename from docs/user_guide/image_sensors.rst rename to docs/user/image_sensors.rst index c1bc8d4..f3e241c 100644 --- a/docs/user_guide/image_sensors.rst +++ b/docs/user/image_sensors.rst @@ -1,4 +1,4 @@ -.. _user_guide.image_sensors: +.. _user.image_sensors: ************* Image sensors diff --git a/docs/user/index.rst b/docs/user/index.rst new file mode 100644 index 0000000..b4e7d6d --- /dev/null +++ b/docs/user/index.rst @@ -0,0 +1,42 @@ +.. _user: + +********** +User Guide +********** + +The User Guide provides documentation for all of Lentil's features and capabilities. + +.. toctree:: + :caption: Getting started + :maxdepth: 1 + + overview + install + quickstart + +.. toctree:: + :caption: Fundamentals + :maxdepth: 2 + + basics + +.. toctree:: + :maxdepth: 1 + + radiometry + image_sensors + matlab + +.. toctree:: + :caption: Advanced usage + :maxdepth: 1 + + performance + +.. toctree:: + :hidden: + :caption: Extras + + ../release + ../cite + ../license \ No newline at end of file diff --git a/docs/user/install.rst b/docs/user/install.rst new file mode 100644 index 0000000..cd8c2b9 --- /dev/null +++ b/docs/user/install.rst @@ -0,0 +1,15 @@ +.. _user.install: + +############ +Installation +############ + +The easiest way to install Lentil is with ``pip``: + +.. code-block:: bash + + pip install lentil + + +For instructions on setting up Lentil for development, see +:ref:`development.install`. \ No newline at end of file diff --git a/docs/user_guide/matlab.rst b/docs/user/matlab.rst similarity index 99% rename from docs/user_guide/matlab.rst rename to docs/user/matlab.rst index 04f6dea..a813bca 100644 --- a/docs/user_guide/matlab.rst +++ b/docs/user/matlab.rst @@ -1,3 +1,5 @@ +.. _user.matlab: + ************************ Using Lentil with MATLAB ************************ @@ -9,7 +11,7 @@ Calling Python libraries from MATLAB is as simple as configuring MATLAB to use t appropriate Python implementation and prepending the Python command with ``py.``. Before using Lentil in MATLAB, be sure that you you have :ref:`configured MATLAB to use the correct version of Python installed on your system -` +` .. _numpy-matlab: @@ -68,7 +70,7 @@ Finally, a few links that may be helpful when developing a MATLAB interface: -.. _configuring-matlab: +.. _user.matlab.config: Configuring MATLAB to use the correct version of Python ======================================================= diff --git a/docs/getting_started/overview.rst b/docs/user/overview.rst similarity index 59% rename from docs/getting_started/overview.rst rename to docs/user/overview.rst index 14d5888..ff63a75 100644 --- a/docs/getting_started/overview.rst +++ b/docs/user/overview.rst @@ -1,4 +1,4 @@ -.. _package-overview: +.. _user.overview: **************** Package overview @@ -53,21 +53,3 @@ Getting help ============ The best place to ask for help on subjects not covered in this documentation or suggest new features/ideas is by opening a ticket on `Github `__. - -License -======= -Copyright (c) 2021, California Institute of Technology ("Caltech"). U.S. Government sponsorship acknowledged. - -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - -Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. -Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - - - - diff --git a/docs/user_guide/performance.rst b/docs/user/performance.rst similarity index 99% rename from docs/user_guide/performance.rst rename to docs/user/performance.rst index 42e0dcf..ae67e02 100644 --- a/docs/user_guide/performance.rst +++ b/docs/user/performance.rst @@ -1,3 +1,5 @@ +.. _user.performance: + ********************** Optimizing Performance ********************** diff --git a/docs/getting_started/quickstart.rst b/docs/user/quickstart.rst similarity index 92% rename from docs/getting_started/quickstart.rst rename to docs/user/quickstart.rst index c7f2e8c..9934ca7 100644 --- a/docs/getting_started/quickstart.rst +++ b/docs/user/quickstart.rst @@ -1,10 +1,10 @@ +.. _user.quickstart: + .. |Plane| replace:: :class:`~lentil.Plane` .. |Pupil| replace:: :class:`~lentil.Pupil` .. |Image| replace:: :class:`~lentil.Image` .. |Wavefront| replace:: :class:`~lentil.Wavefront` -.. _quickstart: - ********** Quickstart ********** @@ -95,12 +95,12 @@ Lentil uses multiplication represent the interaction between a |Plane| and >>> w = w * pupil Finally, we'll propagate the wavefront to a discreetely sampled image plane -using :func:`~lentil.Wavefront.propagate_image`. In this case, we'll sample +using :func:`~lentil.propagate_dft`. In this case, we'll sample the result every 5e-6 meters and perform the propagation 3 times oversampled: .. code-block:: pycon - >>> w = w.propagate_image(npix=64, pixelscale=5e-6, oversample=5) + >>> w = lentil.propagate_dft(w, shape=(64,64), pixelscale=5e-6, oversample=5) The resulting intensity (point spread function) can now be observed: @@ -114,7 +114,7 @@ The resulting intensity (point spread function) can now be observed: w = lentil.Wavefront(wavelength=650e-9) w *= pupil - w = w.propagate_image(npix=64, pixelscale=5e-6, oversample=5) + w = lentil.propagate_dft(w, shape=(64,64), pixelscale=5e-6, oversample=5) plt.imshow(w.intensity, origin='lower') .. Multi-plane propagation diff --git a/docs/user_guide/radiometry.rst b/docs/user/radiometry.rst similarity index 99% rename from docs/user_guide/radiometry.rst rename to docs/user/radiometry.rst index dcf42a1..f039e3f 100644 --- a/docs/user_guide/radiometry.rst +++ b/docs/user/radiometry.rst @@ -1,9 +1,11 @@ +.. _user.radiometry: + +.. currentmodule:: lentil + ************************ Computational radiometry ************************ - .. currentmodule:: lentil - Computational radiometry is used to model the propagation of radiant energy through an optical system. It uses geometry and known optical and imaging properties to compute the irradiance from an observed scene at a detector. Lentil's diff --git a/docs/user_guide/index.rst b/docs/user_guide/index.rst deleted file mode 100644 index 19ad775..0000000 --- a/docs/user_guide/index.rst +++ /dev/null @@ -1,36 +0,0 @@ -.. _user-guide: - -********** -User Guide -********** - -The User Guide provides documentation for all of Lentil's features and capabilities. It -is generally organized by topic area. - -Brand new users should start with the :ref:`package-overview` and :ref:`quickstart`. - -Detailed information on any specific class or method can be found in the :ref:`api`. - -.. note:: - Many of the topics covered in this user guide and the API reference require some - understanding of the underlying physics that govern the phsyical and optical - processes modeled by Lentil. - - This documentation does not attempt to be a guide to these topics but does provide - links and references to supporting materials where applicable. - - -.. toctree:: - :maxdepth: 2 - - coordinates - planes - wavefront_error - optical_systems - diffraction - radiometry - image_sensors - ../patterns/index - performance - matlab - verification/index From 1b4a01cc8adcec5c1fccf33c35b1a77d2706891d Mon Sep 17 00:00:00 2001 From: Andy Kee Date: Tue, 21 Nov 2023 09:37:26 -0800 Subject: [PATCH 2/3] Battling class attributes documentation --- docs/_static/css/lentil.css | 18 +- docs/_templates/autosummary/attribute.rst | 13 -- docs/_templates/autosummary/base.rst | 17 -- docs/_templates/autosummary/class.rst | 1 - docs/_templates/autosummary/class2.rst | 32 ---- docs/_templates/autosummary/member.rst | 13 -- docs/_templates/autosummary/method.rst | 13 -- docs/_templates/autosummary/module.rst | 7 - docs/conf.py | 18 +- docs/reference.rst | 202 +--------------------- 10 files changed, 35 insertions(+), 299 deletions(-) delete mode 100644 docs/_templates/autosummary/attribute.rst delete mode 100644 docs/_templates/autosummary/base.rst delete mode 100644 docs/_templates/autosummary/class2.rst delete mode 100644 docs/_templates/autosummary/member.rst delete mode 100644 docs/_templates/autosummary/method.rst delete mode 100644 docs/_templates/autosummary/module.rst diff --git a/docs/_static/css/lentil.css b/docs/_static/css/lentil.css index c19c2ff..7c3af04 100644 --- a/docs/_static/css/lentil.css +++ b/docs/_static/css/lentil.css @@ -2,6 +2,7 @@ :root { --pst-color-secondary: #5E81AC; /* nord blue */ + --sd-color-secondary: #e83e8c; } @@ -10,17 +11,28 @@ body { } pre, code { - font-family: 'IBM Plex Mono', monospace; + font-family: 'SFMono-Regular', 'Menlo', 'IBM Plex Mono', monospace; font-size: 90%; line-height: 150%; + --pst-color-inline-code-links: #5E81AC; /* nord blue */ --pst-color-inline-code: #e83e8c; } code.literal { background-color: transparent; border: 0px; - font-size: 95%; - font-weight: bold; + padding: 0; + font-size: 94%; +} + +a:hover code{ + color: #ee9040; + text-decoration: underline; + text-decoration-thickness: 1px; +} + +.sig-name { + --pst-color-inline-code: #5E81AC; } pre { diff --git a/docs/_templates/autosummary/attribute.rst b/docs/_templates/autosummary/attribute.rst deleted file mode 100644 index f0d86ad..0000000 --- a/docs/_templates/autosummary/attribute.rst +++ /dev/null @@ -1,13 +0,0 @@ -:orphan: - -{{ fullname | escape | underline}} - -.. currentmodule:: {{ module }} - -attribute - -.. auto{{ objtype }}:: {{ fullname | replace("numpy.", "numpy::") }} - -{# In the fullname (e.g. `numpy.ma.MaskedArray.methodname`), the module name -is ambiguous. Using a `::` separator (e.g. `numpy::ma.MaskedArray.methodname`) -specifies `numpy` as the module name. #} \ No newline at end of file diff --git a/docs/_templates/autosummary/base.rst b/docs/_templates/autosummary/base.rst deleted file mode 100644 index 3d0afed..0000000 --- a/docs/_templates/autosummary/base.rst +++ /dev/null @@ -1,17 +0,0 @@ -{% if objtype == 'property' %} -:orphan: -{% endif %} - -{{ fullname | escape | underline}} - -.. currentmodule:: {{ module }} - -{% if objtype == 'property' %} -property -{% endif %} - -.. auto{{ objtype }}:: {{ fullname | replace("numpy.", "numpy::") }} - -{# In the fullname (e.g. `numpy.ma.MaskedArray.methodname`), the module name -is ambiguous. Using a `::` separator (e.g. `numpy::ma.MaskedArray.methodname`) -specifies `numpy` as the module name. #} \ No newline at end of file diff --git a/docs/_templates/autosummary/class.rst b/docs/_templates/autosummary/class.rst index 0ae65c9..c13da30 100644 --- a/docs/_templates/autosummary/class.rst +++ b/docs/_templates/autosummary/class.rst @@ -17,7 +17,6 @@ {% if attributes %} .. HACK -- the point here is that we don't want this to appear in the output, but the autosummary should still generate the pages. .. autosummary:: - :toctree: {% for item in all_attributes %} {%- if not item.startswith('_') %} {{ name }}.{{ item }} diff --git a/docs/_templates/autosummary/class2.rst b/docs/_templates/autosummary/class2.rst deleted file mode 100644 index 0735953..0000000 --- a/docs/_templates/autosummary/class2.rst +++ /dev/null @@ -1,32 +0,0 @@ -{{ fullname | escape | underline}} - -.. currentmodule:: {{ module }} - -.. autoclass:: {{ objname }} - - -{% if attributes %} -**Attributes** - -.. autosummary:: - :toctree: - {% for item in all_attributes %} - {%- if not item.startswith('_') %} - ~{{ name }}.{{ item }} - {%- endif -%} - {%- endfor %} - -{% endif %} - -{% if methods %} -**Methods** - -.. autosummary:: - :toctree: - {% for item in all_methods %} - {%- if not item.startswith('_') or item in ['__call__'] %} - ~{{ name }}.{{ item }} - {%- endif -%} - {%- endfor %} - -{% endif %} diff --git a/docs/_templates/autosummary/member.rst b/docs/_templates/autosummary/member.rst deleted file mode 100644 index a3fb4ec..0000000 --- a/docs/_templates/autosummary/member.rst +++ /dev/null @@ -1,13 +0,0 @@ -:orphan: - -{{ fullname | escape | underline}} - -.. currentmodule:: {{ module }} - -member - -.. auto{{ objtype }}:: {{ fullname | replace("numpy.", "numpy::") }} - -{# In the fullname (e.g. `numpy.ma.MaskedArray.methodname`), the module name -is ambiguous. Using a `::` separator (e.g. `numpy::ma.MaskedArray.methodname`) -specifies `numpy` as the module name. #} \ No newline at end of file diff --git a/docs/_templates/autosummary/method.rst b/docs/_templates/autosummary/method.rst deleted file mode 100644 index 0e88fb9..0000000 --- a/docs/_templates/autosummary/method.rst +++ /dev/null @@ -1,13 +0,0 @@ -:orphan: - -{{ fullname | escape | underline}} - -.. currentmodule:: {{ module }} - -method - -.. auto{{ objtype }}:: {{ fullname | replace("numpy.", "numpy::") }} - -{# In the fullname (e.g. `numpy.ma.MaskedArray.methodname`), the module name -is ambiguous. Using a `::` separator (e.g. `numpy::ma.MaskedArray.methodname`) -specifies `numpy` as the module name. #} \ No newline at end of file diff --git a/docs/_templates/autosummary/module.rst b/docs/_templates/autosummary/module.rst deleted file mode 100644 index bd36920..0000000 --- a/docs/_templates/autosummary/module.rst +++ /dev/null @@ -1,7 +0,0 @@ -{{ fullname | escape | underline}} - -.. automodule:: {{ fullname }} - - {% block docstring %} - {% endblock %} - diff --git a/docs/conf.py b/docs/conf.py index 8da209e..c764f0a 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -32,7 +32,8 @@ 'sphinx_remove_toctrees', 'sphinx_copybutton', 'sphinx_design', - 'matplotlib.sphinxext.plot_directive'] + 'matplotlib.sphinxext.plot_directive', + 'numpydoc'] templates_path = ['_templates'] source_suffix = '.rst' master_doc = 'docs' @@ -99,8 +100,9 @@ add_module_names = True autodoc_default_options = { - 'member-order': 'alphabetical', - 'exclude-members': '__init__, __weakref__, __dict__, __module__' + 'member-order': 'bysource', + 'undoc-members': None +# 'exclude-members': '__init__, __weakref__, __dict__, __module__' } autosummary_generate = True @@ -139,3 +141,13 @@ import numpy as np np.random.seed(12345) """ + + + + +#def fix_attributes(app, pagename, templatename, context, doctree): +# if 'generated' in pagename: +# context['body'] = context['body'].replace('Variables', 'Attributes') + +#def setup(app): +# app.connect("html-page-context", fix_attributes) \ No newline at end of file diff --git a/docs/reference.rst b/docs/reference.rst index 023fd4e..52725ac 100644 --- a/docs/reference.rst +++ b/docs/reference.rst @@ -16,213 +16,21 @@ Some subpackages are public including ``lentil.radiometry`` and Planes ====== + .. autosummary:: + :caption: Planes :toctree: generated/ - + lentil.Plane lentil.Pupil lentil.Image - lentil.Detector - lentil.Grism - lentil.Tilt - lentil.Rotate - lentil.Flip -.. _api.wavefront: Wavefront ========= .. autosummary:: + :caption: Wavefront :toctree: generated/ - lentil.Wavefront - -.. _api.propagation: - -Numerical diffraction propagation -================================= - -.. autosummary:: - :toctree: generated/ - - lentil.propagate_dft - -.. _api.zernike: - -Zernike polynomials -=================== -.. autosummary:: - :toctree: generated/ - - lentil.zernike - lentil.zernike_basis - lentil.zernike_compose - lentil.zernike_coordinates - lentil.zernike_fit - lentil.zernike_remove - -.. _api.wfe: - -Wavefront errors -================ -.. autosummary:: - :toctree: generated/ - - lentil.power_spectrum - lentil.translation_defocus - -.. _api.imaging: - -Imaging artifacts -================= -.. autosummary:: - :toctree: generated/ - - lentil.jitter - lentil.smear - -.. _api.util: - -Utilities -========= - -Shapes ------- -.. autosummary:: - :toctree: generated/ - - lentil.circle - lentil.circlemask - lentil.hexagon - lentil.slit - -Array manipulation ------------------- -.. autosummary:: - :toctree: generated/ - - lentil.boundary - lentil.centroid - lentil.pad - lentil.window - lentil.rebin - lentil.rescale - -Miscellaneous -------------- -.. autosummary:: - :toctree: generated/ - - lentil.min_sampling - lentil.pixelscale_nyquist - lentil.normalize_power - lentil.sanitize_shape - lentil.sanitize_bandpass - -.. _api.detector: - -Detector module -=============== - -Charge collection ------------------ -.. autosummary:: - :toctree: generated/ - - lentil.detector.collect_charge - lentil.detector.collect_charge_bayer - -Pixel effects -------------- -.. autosummary:: - :toctree: generated/ - - lentil.detector.pixel - lentil.detector.pixelate - -Noise ------ -.. autosummary:: - :toctree: generated/ - - lentil.detector.shot_noise - lentil.detector.read_noise - lentil.detector.charge_diffusion - lentil.detector.dark_current - lentil.detector.rule07_dark_current - -Readout -------- -.. autosummary:: - :toctree: generated/ - - lentil.detector.adc - -Cosmic rays ------------ -.. autosummary:: - :toctree: generated/ - - lentil.detector.cosmic_rays - -.. _api.radiometry: - -Radiometry module -================= - -.. autosummary:: - :toctree: generated/ - - lentil.radiometry.Spectrum - lentil.radiometry.Blackbody - lentil.radiometry.Material - lentil.radiometry.planck_radiance - lentil.radiometry.planck_exitance - lentil.radiometry.vegaflux - lentil.radiometry.path_transmission - lentil.radiometry.path_emission - - -.. _apt.internal: - -Internals -========= - -.. warning:: - - The ``lentil.field``, ``lentil.fourier``, and ``lentil.helper`` top-level - modules are intended for internal use. Stable functionality in these - modules is not guaranteed. - -Field ------ -.. autosummary:: - :toctree: generated/ - - lentil.field.Field - lentil.field.boundary - lentil.field.extent - lentil.field.insert - lentil.field.merge - lentil.field.overlap - lentil.field.reduce - -Fourier transforms ------------------- -.. autosummary:: - :toctree: generated/ - - lentil.fourier.dft2 - lentil.fourier.idft2 - -Helper functions ----------------- -.. autosummary:: - :toctree: generated/ - - lentil.helper.boundary_slice - lentil.helper.gaussian2d - lentil.helper.mesh - lentil.helper.slice_offset - + lentil.Wavefront \ No newline at end of file From aae2c058a17445c51de2fb6a7eb835e29b2ada77 Mon Sep 17 00:00:00 2001 From: Andy Kee Date: Sun, 26 Nov 2023 19:42:47 -0800 Subject: [PATCH 3/3] Rework API docs --- .gitignore | 2 +- docs/_img/python/focus_images.py | 60 ----- docs/_img/python/tilt_images.py | 50 ---- docs/_static/css/lentil.css | 16 +- docs/_templates/autosummary/attribute.rst | 7 + docs/_templates/autosummary/class.rst | 49 ++-- docs/_templates/autosummary/property.rst | 12 + docs/_templates/index.html | 2 +- docs/_templates/indexcontent.html | 82 ------- docs/conf.py | 28 +-- docs/dev/tech_notes/dft_caching.rst | 86 ------- docs/dev/tech_notes/index.rst | 1 - docs/docs.rst | 16 +- docs/examples/index.rst | 1 - docs/examples/tutorial.rst | 86 ------- docs/ref/detector.rst | 47 ++++ docs/ref/imaging_artifacts.rst | 13 ++ docs/ref/index.rst | 28 +++ docs/ref/internals.rst | 42 ++++ docs/ref/planes.rst | 37 +++ docs/ref/propagate.rst | 10 + docs/ref/radiometry.rst | 23 ++ docs/ref/util.rst | 36 +++ docs/ref/wavefront.rst | 10 + docs/ref/wavefront_errors.rst | 13 ++ docs/ref/zernike.rst | 15 ++ docs/reference.rst | 36 --- docs/user/basics.coordinates.rst | 10 +- docs/user/basics.diffraction.rst | 37 ++- docs/user/basics.optical_systems.rst | 2 - docs/user/basics.planes.rst | 21 +- docs/user/basics.wavefront_error.rst | 60 ++--- .../images}/propagate_npix_prop.png | Bin docs/user/plots/focus_images.py | 47 ++++ docs/{_img/python => user/plots}/npix_prop.py | 19 +- docs/user/plots/tilt_images.py | 45 ++++ docs/user/quickstart.rst | 122 +++++----- lentil/field.py | 33 ++- lentil/plane.py | 216 +++++++++++++----- lentil/wavefront.py | 85 +++++-- 40 files changed, 812 insertions(+), 693 deletions(-) delete mode 100644 docs/_img/python/focus_images.py delete mode 100644 docs/_img/python/tilt_images.py create mode 100644 docs/_templates/autosummary/attribute.rst create mode 100644 docs/_templates/autosummary/property.rst delete mode 100644 docs/_templates/indexcontent.html delete mode 100644 docs/dev/tech_notes/dft_caching.rst delete mode 100644 docs/examples/tutorial.rst create mode 100644 docs/ref/detector.rst create mode 100644 docs/ref/imaging_artifacts.rst create mode 100644 docs/ref/index.rst create mode 100644 docs/ref/internals.rst create mode 100644 docs/ref/planes.rst create mode 100644 docs/ref/propagate.rst create mode 100644 docs/ref/radiometry.rst create mode 100644 docs/ref/util.rst create mode 100644 docs/ref/wavefront.rst create mode 100644 docs/ref/wavefront_errors.rst create mode 100644 docs/ref/zernike.rst delete mode 100644 docs/reference.rst rename docs/{_static/img => user/images}/propagate_npix_prop.png (100%) create mode 100644 docs/user/plots/focus_images.py rename docs/{_img/python => user/plots}/npix_prop.py (69%) create mode 100644 docs/user/plots/tilt_images.py diff --git a/.gitignore b/.gitignore index ff67362..5416535 100644 --- a/.gitignore +++ b/.gitignore @@ -57,7 +57,7 @@ cover/ # Sphinx documentation docs/_build/ -docs/generated +docs/ref/generated # PyBuilder .pybuilder/ diff --git a/docs/_img/python/focus_images.py b/docs/_img/python/focus_images.py deleted file mode 100644 index cceac3c..0000000 --- a/docs/_img/python/focus_images.py +++ /dev/null @@ -1,60 +0,0 @@ -import matplotlib.pyplot as plt -import numpy as np -import lentil - -import matplotlib as mpl -mpl.rcParams['figure.figsize'] = (4, 4) - -amp = np.zeros((256, 256)) -amp += lentil.circlemask((256, 256), 64, shift=(32, 8)) -amp -= lentil.circlemask((256, 256), 40, shift=(32, 8)) -amp[:, 0:128+8] = 0 -amp[32:225, 104-16:128-16] = 1 -amp[96:120, 128-16:144-8] = 1 -amp[201:225, 128-16:144-8] = 1 - -focus = lentil.zernike(mask=np.ones((256, 256)), index=4) - -pupil_neg = lentil.Pupil(amplitude=amp, pixelscale=1/240, focal_length=10) -pupil_neg.phase = -6e-6 * focus -w_neg = lentil.Wavefront(650e-9) -w_neg *= pupil_neg -w_neg = lentil.propagate_dft(w_neg, pixelscale=5e-6, shape=200, oversample=2) - -pupil_pos = lentil.Pupil(amplitude=amp, pixelscale=1/240, focal_length=10) -pupil_pos.phase = 6e-6 * focus -w_pos = lentil.Wavefront(650e-9) -w_pos *= pupil_pos -w_pos = lentil.propagate_dft(w_pos, pixelscale=5e-6, shape=200, oversample=2) - -plt.subplot(1, 2, 1) -plt.imshow(w_pos.intensity, origin='lower') -plt.title('Image plane (+focus)') -plt.xticks(np.linspace(0, 400, 5), labels=np.linspace(-1, 1, 5)) -plt.yticks(np.linspace(0, 400, 5), labels=np.linspace(-1, 1, 5)) -plt.xlabel('[m]') - -plt.subplot(1, 2, 2) -plt.imshow(w_neg.intensity, origin='lower') -plt.title('Image plane (-focus)') -plt.xticks(np.linspace(0, 400, 5), labels=np.linspace(-1, 1, 5)) -plt.yticks(np.linspace(0, 400, 5), labels=np.linspace(-1, 1, 5)) -plt.xlabel('[m]') - -#fig, axs = plt.subplots(1, 2) -# -#ax1 = axs[0] -#ax1.imshow(w_pos.intensity, origin='lower') -#ax1.set_title('Image plane (+focus)') -#ax1.set_xticks(np.linspace(0, 400, 5), labels=np.linspace(-1, 1, 5)) -#ax1.set_yticks(np.linspace(0, 400, 5), labels=np.linspace(-1, 1, 5)) -#ax1.set_xlabel('[mm]') -# -#ax2 = axs[1] -#ax2.imshow(w_neg.intensity, origin='lower') -##ax2.set_title('Image plane (-focus)') -#ax2.set_xticks(np.linspace(0, 400, 5), labels=np.linspace(-1, 1, 5)) -#ax2.set_yticks(np.linspace(0, 400, 5), labels=np.linspace(-1, 1, 5)) -#ax2.set_xlabel('[mm]') - -plt.tight_layout() diff --git a/docs/_img/python/tilt_images.py b/docs/_img/python/tilt_images.py deleted file mode 100644 index 7a387af..0000000 --- a/docs/_img/python/tilt_images.py +++ /dev/null @@ -1,50 +0,0 @@ -import matplotlib.pyplot as plt -import numpy as np -import lentil - -import matplotlib as mpl -mpl.rcParams['figure.figsize'] = (3.5, 3.5) - -amp = lentil.circle((256, 256), 120) -x_tilt = 8e-6 * lentil.zernike(amp, 3) # +x tilt -y_tilt = 8e-6 * lentil.zernike(amp, 2) # +y tilt - -py = lentil.Pupil(focal_length=10, pixelscale=1 / 240, amplitude=amp, phase=y_tilt) -wy = lentil.Wavefront(650e-9) -wy *= py -wy = lentil.propagate_dft(wy, pixelscale=5e-6, shape=200, oversample=5) - -px = lentil.Pupil(focal_length=10, pixelscale=1 / 240, amplitude=amp, phase=x_tilt) -wx = lentil.Wavefront(650e-9) -wx *= px -wx = lentil.propagate_dft(wx, pixelscale=5e-6, shape=200, oversample=5) - -plt.subplot(2, 2, 1) -plt.imshow(x_tilt, origin='lower') -plt.title('Pupil plane ($+R_x$)') -plt.xticks(np.linspace(0, 256, 5), labels=np.linspace(-0.5, 0.5, 5)) -plt.yticks(np.linspace(0, 256, 5), labels=np.linspace(-0.5, 0.5, 5)) -plt.xlabel('[m]') - -plt.subplot(2, 2, 2) -plt.imshow(y_tilt, origin='lower') -plt.title('Pupil plane ($+R_y$)') -plt.xticks(np.linspace(0, 256, 5), labels=np.linspace(-0.5, 0.5, 5)) -plt.yticks(np.linspace(0, 256, 5), labels=np.linspace(-0.5, 0.5, 5)) -plt.xlabel('[m]') - -plt.subplot(2, 2, 3) -plt.imshow(wx.intensity ** 0.2, origin='lower') -plt.title('Image plane ($+R_x$)') -plt.xticks(np.linspace(0, 200 * 5, 5), labels=np.linspace(-1, 1, 5)) -plt.yticks(np.linspace(0, 200 * 5, 5), labels=np.linspace(-1, 1, 5)) -plt.xlabel('[mm]') - -plt.subplot(2, 2, 4) -plt.imshow(wy.intensity ** 0.2, origin='lower') -plt.title('Image plane ($+R_y$)') -plt.xticks(np.linspace(0, 200 * 5, 5), labels=np.linspace(-1, 1, 5)) -plt.yticks(np.linspace(0, 200 * 5, 5), labels=np.linspace(-1, 1, 5)) -plt.xlabel('[mm]') - -plt.tight_layout() diff --git a/docs/_static/css/lentil.css b/docs/_static/css/lentil.css index 7c3af04..a456efd 100644 --- a/docs/_static/css/lentil.css +++ b/docs/_static/css/lentil.css @@ -31,15 +31,12 @@ a:hover code{ text-decoration-thickness: 1px; } -.sig-name { - --pst-color-inline-code: #5E81AC; +a.headerlink { + color: #ee9040; } -pre { - background-color: #f8f8f8; - border: 0px; - box-shadow: none; - padding: 20px; +.sig-name { + --pst-color-inline-code: #5E81AC; } h1, h2, h3, h4, h5, h6 { @@ -89,6 +86,11 @@ a.hederlink:hover { color: #ee9040 } +/* Disable API reference name highlighting */ +dt:target, span.highlighted { + background-color: transparent; +} + :target:before{ content:""; display:block; diff --git a/docs/_templates/autosummary/attribute.rst b/docs/_templates/autosummary/attribute.rst new file mode 100644 index 0000000..f1baeaf --- /dev/null +++ b/docs/_templates/autosummary/attribute.rst @@ -0,0 +1,7 @@ +:orphan: + +{{ fullname | escape | underline}} + +.. currentmodule:: {{ module }} + +.. auto{{ objtype }}:: {{ fullname | replace("lentil.", "lentil::") }} diff --git a/docs/_templates/autosummary/class.rst b/docs/_templates/autosummary/class.rst index c13da30..5a887a9 100644 --- a/docs/_templates/autosummary/class.rst +++ b/docs/_templates/autosummary/class.rst @@ -1,26 +1,31 @@ -{% extends "!autosummary/class.rst" %} +{{ fullname | escape | underline}} -{% block methods %} -{% if methods %} - .. HACK -- the point here is that we don't want this to appear in the output, but the autosummary should still generate the pages. - .. autosummary:: - :toctree: - {% for item in all_methods %} - {%- if not item.startswith('_') or item in ['__call__'] %} - {{ name }}.{{ item }} - {%- endif -%} - {%- endfor %} -{% endif %} -{% endblock %} +.. currentmodule:: {{ module }} + +.. autoclass:: {{ objname }} -{% block attributes %} {% if attributes %} - .. HACK -- the point here is that we don't want this to appear in the output, but the autosummary should still generate the pages. - .. autosummary:: - {% for item in all_attributes %} - {%- if not item.startswith('_') %} - {{ name }}.{{ item }} - {%- endif -%} - {%- endfor %} +.. rubric:: {{ _('Attributes') }} + +.. autosummary:: + :toctree: + {% for item in attributes %} + {%- if not item.startswith('_') %} + ~{{ name }}.{{ item }} + {%- endif -%} + {%- endfor %} + {% endif %} -{% endblock %} \ No newline at end of file + +{% if methods %} +.. rubric:: {{ _('Methods') }} + +.. autosummary:: + :toctree: + {% for item in methods %} + {%- if not item.startswith('_') or item in ['__call__'] %} + ~{{ name }}.{{ item }} + {%- endif -%} + {%- endfor %} + +{% endif %} \ No newline at end of file diff --git a/docs/_templates/autosummary/property.rst b/docs/_templates/autosummary/property.rst new file mode 100644 index 0000000..de272bd --- /dev/null +++ b/docs/_templates/autosummary/property.rst @@ -0,0 +1,12 @@ +:orphan: + +{{ fullname | escape | underline}} + +.. currentmodule:: {{ module }} + +.. autoattribute:: {{ fullname | replace("lentil.", "lentil::") }} + +{# Normally this line would read + .. auto{{ objtype }}:: {{ fullname | replace("lentil.", "lentil::") }} +but we've explicitly called autoattribute so that properties are rendered +in a way that is indistinguishable from attributes #} \ No newline at end of file diff --git a/docs/_templates/index.html b/docs/_templates/index.html index 156134f..e15fbbd 100644 --- a/docs/_templates/index.html +++ b/docs/_templates/index.html @@ -63,7 +63,7 @@

Lentil: Fast optical propagation

- +
Reference
diff --git a/docs/_templates/indexcontent.html b/docs/_templates/indexcontent.html deleted file mode 100644 index 207d801..0000000 --- a/docs/_templates/indexcontent.html +++ /dev/null @@ -1,82 +0,0 @@ -{# - Loosely inspired by the deprecated sphinx/themes/basic/defindex.html - #} - {%- extends "layout.html" %} - {% set title = _('Overview') %} - {% block body %} -

Lentil documentation

-

Version: {{ release|e }}

- {% if last_updated %}

Date: {{ last_updated|e }}

{% endif %} - -

- Lentil is a Python library for modeling the imaging chain of an optical system. - It was originally developed at NASA's Jet Propulsion Lab by the Wavefront Sensing and - Control group (383E) to provide an easy to use framework for simulating point spread - functions of segmented aperture telescopes. -

- -
-

Note

-

Lentil is still under active development and new features continue to be added. - Until Lentil reaches version 1.0, the API is not guaranteed to be stable, but - changes breaking backwards compatibility will be noted in the release notes.

-
- -

Getting started

- - -
- - - -
- -

User guide

- - -
- - - - - - - - - - -
- -

API reference

- - -
- -
- - -

Developer guide

- - -
- - -
- - {% endblock %} diff --git a/docs/conf.py b/docs/conf.py index c764f0a..ca3131d 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -21,6 +21,7 @@ with open(os.path.normpath(os.path.join(path, '..', 'lentil', '__init__.py'))) as f: version = release = re.search("__version__ = '(.*?)'", f.read()).group(1) +today_fmt = '%B %d, %Y' # -- General configuration --------------------------------------------------- @@ -32,8 +33,8 @@ 'sphinx_remove_toctrees', 'sphinx_copybutton', 'sphinx_design', - 'matplotlib.sphinxext.plot_directive', - 'numpydoc'] + 'matplotlib.sphinxext.plot_directive']#, + #'numpydoc'] templates_path = ['_templates'] source_suffix = '.rst' master_doc = 'docs' @@ -53,6 +54,8 @@ }, "collapse_navigation": True, "navbar_persistent": ["search-button"], + "pygment_light_style": "tango", + "pygment_dark_style": "nord", "favicons": [ { "rel": "icon", @@ -93,20 +96,20 @@ html_css_files = ['css/lentil.css'] -pygments_style = 'default' - # if true, the current module name will be prepended to all description # unit titles (such as .. function::). add_module_names = True +add_function_parentheses = True + autodoc_default_options = { - 'member-order': 'bysource', - 'undoc-members': None -# 'exclude-members': '__init__, __weakref__, __dict__, __module__' + 'member-order': 'alphabetical', + 'exclude-members': '__init__, __weakref__, __dict__, __module__', } autosummary_generate = True + #remove_from_toctrees = ["generated/*"] # -- Plot config ------------------------------------------------------------- @@ -138,16 +141,9 @@ plot_html_show_formats = False plot_formats = [('png', dpi*2)] plot_pre_code = """ +import lentil +import matplotlib.pyplot as plt import numpy as np np.random.seed(12345) """ - - - -#def fix_attributes(app, pagename, templatename, context, doctree): -# if 'generated' in pagename: -# context['body'] = context['body'].replace('Variables', 'Attributes') - -#def setup(app): -# app.connect("html-page-context", fix_attributes) \ No newline at end of file diff --git a/docs/dev/tech_notes/dft_caching.rst b/docs/dev/tech_notes/dft_caching.rst deleted file mode 100644 index 4fc4dfc..0000000 --- a/docs/dev/tech_notes/dft_caching.rst +++ /dev/null @@ -1,86 +0,0 @@ -***************************** -Caching in ``fourier.dft2()`` -***************************** - -:func:`~lentil.fourier.dft2` uses the matrix triple product (MTP) approach to -compute Fourier transforms with variable input and output plane sampling and -sizes [1]_. - -The Fourier transform of an array :math:`f` is given by - -.. math:: - - F = E_1 f E_2 - -where the Fourier kernels :math:`E_1` and :math:`E_2` are constructed as - -.. math:: - - E_1 = \exp{(-2\pi i \alpha_y Y V)} - - E_2 = \exp{(-2\pi i \alpha_x X U)} - -given vectors of input plane coordinates :math:`X` and :math:`Y`, vectors of output -plane coordinates :math:`U` and :math:`V`, and sampling coefficients :math:`\alpha_x` -and :math:`\alpha_y`. - -Fourier kernel caching ----------------------- -If the input and output array sizes and sampling are held constant, :math:`E_1` and -:math:`E_2` can be computed once and reused providing increased performance for all -subsequent evaluations. This is achieved by employing Python's ``modeltools.lru_cache`` -decorator on a method which computes these matrices. The maximum cache size is 32 -entries. - -Caching with variable output plane shifts ------------------------------------------ -Repeated calls to :func:`~lentil.fourier.dft2` with a static :attr:`shift` term will -hit the Fourier kernel cache described above. In the event that :attr:`shift` varies -on repeated calls to :func:`~lentil.fourier.dft2` we can still achieve some performance -gains by caching the :math:`X`, :math:`Y`, :math:`U`, and :math:`V` vectors. - -Implementation --------------- -The MTP described above is imlemented in Lentil using a two stage LRU caching approach -that caches the calculation of ``X``, ``Y``, ``U``, and ``V`` in all cases and caches -the calculation of ``E1`` and ``E2`` for when ``shift`` does not vary. - -.. code:: python - - @functools.lru_cache(maxsize=32) - def _dft2_coords(m, n, M, N): - # Y and X are (r,c) coordinates in the (m x n) input plane f - # V and U are (r,c) coordinates in the (M x N) ourput plane F - - X = np.arange(n) - np.floor(n/2.0) - Y = np.arange(m) - np.floor(m/2.0) - U = np.arange(N) - np.floor(N/2.0) - V = np.arange(M) - np.floor(M/2.0) - - return X, Y, U, V - - - @functools.lru_cache(maxsize=32) - def _dft2_matrices(m, n, M, N, ax, ay, sx, sy): - X, Y, U, V = _dft2_coords(m, n, M, N) - E1 = np.exp(-2.0 * np.pi * 1j * ay * np.outer(Y-sy, V-sy)).T - E2 = np.exp(-2.0 * np.pi * 1j * ax * np.outer(X-sx, U-sx)) - return E1, E2 - - - def dft2(f, alpha, npix=None, shift=(0, 0)): - - ... - - E1, E2 = _dft2_matrices(m, n, M, N, ax, ay, sx, sy) - F = np.dot(E1.dot(f), E2) - - ... - - return F - - -References ----------- - -.. [1] Jurling et. al., *Techniques for arbitrary sampling in two-dimensional Fourier transforms*. \ No newline at end of file diff --git a/docs/dev/tech_notes/index.rst b/docs/dev/tech_notes/index.rst index 5a6dec3..d25ae27 100644 --- a/docs/dev/tech_notes/index.rst +++ b/docs/dev/tech_notes/index.rst @@ -8,5 +8,4 @@ Technical Notes :maxdepth: 1 dft_sampling - dft_caching prop_algorithm diff --git a/docs/docs.rst b/docs/docs.rst index dc6713e..c6476f1 100644 --- a/docs/docs.rst +++ b/docs/docs.rst @@ -3,10 +3,10 @@ .. toctree:: :hidden: - user/index - examples/index - reference - dev/index + User Guide + Examples + API Reference + Development ******************** Lentil Documentation @@ -45,7 +45,7 @@ functions of segmented aperture telescopes. .. button-ref:: user/index :expand: - :color: muted + :color: info :click-parent: To the user guide @@ -59,7 +59,7 @@ functions of segmented aperture telescopes. .. button-ref:: examples/index :expand: - :color: light + :color: info :click-parent: To the examples @@ -73,9 +73,9 @@ functions of segmented aperture telescopes. +++ - .. button-ref:: reference + .. button-ref:: ref/index :expand: - :color: dark + :color: info :click-parent: To the reference guide diff --git a/docs/examples/index.rst b/docs/examples/index.rst index 90a3788..0bc04e9 100644 --- a/docs/examples/index.rst +++ b/docs/examples/index.rst @@ -9,7 +9,6 @@ General .. toctree:: :maxdepth: 1 - tutorial general/simple general/large general/attributes diff --git a/docs/examples/tutorial.rst b/docs/examples/tutorial.rst deleted file mode 100644 index 0e9e75d..0000000 --- a/docs/examples/tutorial.rst +++ /dev/null @@ -1,86 +0,0 @@ -.. _tutorial: - -************************ -Getting started tutorial -************************ - -In this short example, we'll walk through the steps to develop a very simple Lentil -model of an imaging system with a single pupil. We'll then propagate light through -the imaging system to an image plane and view the resulting point spread function -(PSF). The imaging system has a 1m diameter primary mirror, a secondary mirror -obscuration of 0.33m centered over the primary, a focal length of 10m, and a focal -plane with 5um pixels. - -First, we'll import Lentil and matplotlib: - -.. code-block:: pycon - - >>> import matplotlib.pyplot as plt - >>> import lentil - -Now we can define the system amplitude and plot it: - -.. code-block:: pycon - - >>> amplitude = lentil.circle(shape=(256, 256), radius=128) - - ... lentil.circle(shape=(256, 256), radius=128/3) - >>> plt.imshow(amplitude) - -.. image:: /_static/img/getting_started_amp.png - :width: 350px - -We'll create some wavefront error constructed from a combination of Zernikes: - -.. code-block:: pycon - - >>> coeffs = [0, 0, 0, 300e-9, 50e-9, -100e-9, 50e-9] - >>> opd = lentil.zernike_compose(mask=amplitude, coeffs=coeffs) - >>> plt.imshow(opd) - -.. image:: /_static/img/getting_started_opd.png - :width: 350px - -Next we'll define the system's pupil plane. Note that the -:attr:`~lentil.Pupil.pixelscale` attribute represents the physical sampling of each -pixel in the pupil (in meters/pixel). Because our amplitude has a diameter of 256 pixels -and the system diameter was specified as 1m, the pixelscale is 1/256. - -.. code-block:: pycon - - >>> pupil = lentil.Pupil(amplitude=amplitude, phase=opd, focal_length=10, - ... pixelscale=1/256) - -We'll create a monochromatic :class:`~lentil.Wavefront` with wavelength of 650nm and -propagate it "through" the pupil plane. This operation is represented by multiplying the -wavefront by the pupil: - -propagate the wavefront through the pupil plane, and finally on to an image plane with -5um pixels. We'll also oversample the image plane by a factor of 10. - -.. code-block:: pycon - - >>> w = lentil.Wavefront(wavelength=650e-9) - >>> w = w * pupil - -Now we can propagate the wavefront from the pupil plane to an image plane with 5 micron -pixels. We'll perform this propagation 10x oversampled and look at the resulting intensity -pattern: - -.. code-block:: pycon - - >>> w = lentil.propagate_image(w, pixelscale=5e-6, npix=32, oversample=10) - >>> plt.imshow(w.intensity) - -.. image:: /_static/img/getting_started_psf_oversample.png - :width: 350px - -Finally, we will rescale the oversampled image to native sampling and include the -blurring effects of the pixel MTF: - -.. code-block:: pycon - - >>> img = lentil.detector.pixellate(w.intensity, oversample=10) - >>> plt.imshow(img) - -.. image:: /_static/img/getting_started_psf_detector.png - :width: 350px diff --git a/docs/ref/detector.rst b/docs/ref/detector.rst new file mode 100644 index 0000000..c890d37 --- /dev/null +++ b/docs/ref/detector.rst @@ -0,0 +1,47 @@ +.. _api.detector: + +****************************** +Detector (``lentil.detector``) +****************************** + +Charge collection +----------------- +.. autosummary:: + :toctree: generated/ + + lentil.detector.collect_charge + lentil.detector.collect_charge + +Pixel effects +------------- +.. autosummary:: + :toctree: generated/ + + lentil.detector.pixel + lentil.detector.pixelate + +Noise +----- +.. autosummary:: + :toctree: generated/ + + lentil.detector.shot_noise + lentil.detector.read_noise + lentil.detector.charge_diffusion + lentil.detector.dark_current + lentil.detector.rule07_dark_current + +Readout +------- +.. autosummary:: + :toctree: generated/ + + lentil.detector.adc + +Cosmic rays +----------- +.. autosummary:: + :toctree: generated/ + + lentil.detector.cosmic_rays + \ No newline at end of file diff --git a/docs/ref/imaging_artifacts.rst b/docs/ref/imaging_artifacts.rst new file mode 100644 index 0000000..174569b --- /dev/null +++ b/docs/ref/imaging_artifacts.rst @@ -0,0 +1,13 @@ +.. _api.imaging_artifacts: + +***************** +Imaging artifacts +***************** + +.. autosummary:: + :toctree: generated/ + + lentil.jitter + lentil.smear + + diff --git a/docs/ref/index.rst b/docs/ref/index.rst new file mode 100644 index 0000000..921ca70 --- /dev/null +++ b/docs/ref/index.rst @@ -0,0 +1,28 @@ +.. _api: + +.. module:: lentil + +**************** +Lentil reference +**************** + +:Release: |version| +:Date: |today| + +This reference manual gives an overview of all public functions, modules, and +objects included in Lentil. For learning how to use Lentil, see the +:ref:`user guide `. + +.. toctree:: + :maxdepth: 1 + + planes + wavefront + propagate + zernike + wavefront_errors + imaging_artifacts + radiometry + detector + util + internals diff --git a/docs/ref/internals.rst b/docs/ref/internals.rst new file mode 100644 index 0000000..cdf0414 --- /dev/null +++ b/docs/ref/internals.rst @@ -0,0 +1,42 @@ +.. _api.internals: + +********* +Internals +********* + +Field +----- +.. autosummary:: + :toctree: generated/ + + lentil.field.Field + lentil.field.boundary + lentil.field.extent + lentil.field.insert + lentil.field.merge + lentil.field.overlap + lentil.field.reduce + +Tilt interface +-------------- +.. autosummary:: + :toctree: generated/ + + lentil.plane.TiltInterface + +Fourier transforms +------------------ +.. autosummary:: + :toctree: generated/ + + lentil.fourier.dft2 + +Helper functions +---------------- +.. autosummary:: + :toctree: generated/ + + lentil.helper.mesh + lentil.helper.gaussian2d + lentil.helper.boundary_slice + lentil.helper.slice_offset diff --git a/docs/ref/planes.rst b/docs/ref/planes.rst new file mode 100644 index 0000000..3ac62cb --- /dev/null +++ b/docs/ref/planes.rst @@ -0,0 +1,37 @@ +.. _api.planes: + +************* +Plane objects +************* + +.. autosummary:: + :toctree: generated/ + + lentil.Plane + lentil.Pupil + lentil.Image + lentil.Detector + +Plane transformations +--------------------- +.. autosummary:: + :toctree: generated/ + + lentil.Tilt + lentil.Rotate + lentil.Flip + +Dispersive Planes +----------------- +.. autosummary:: + :toctree: generated/ + + lentil.DispersiveTilt + + +Deprecated +---------- +.. autosummary:: + :toctree: generated/ + + lentil.Grism diff --git a/docs/ref/propagate.rst b/docs/ref/propagate.rst new file mode 100644 index 0000000..66e05cd --- /dev/null +++ b/docs/ref/propagate.rst @@ -0,0 +1,10 @@ +.. _api.propagate: + +*********** +Propagation +*********** + +.. autosummary:: + :toctree: generated/ + + lentil.propagate_dft \ No newline at end of file diff --git a/docs/ref/radiometry.rst b/docs/ref/radiometry.rst new file mode 100644 index 0000000..5ff20ce --- /dev/null +++ b/docs/ref/radiometry.rst @@ -0,0 +1,23 @@ +.. _api.radiometry: + +********************************** +Radiometry (``lentil.radiometry``) +********************************** + +.. autosummary:: + :toctree: generated/ + + lentil.radiometry.Spectrum + lentil.radiometry.Blackbody + lentil.radiometry.Material + +Utilities +--------- +.. autosummary:: + :toctree: generated/ + + lentil.radiometry.path_transmission + lentil.radiometry.path_emission + lentil.radiometry.planck_radiance + lentil.radiometry.planck_exitance + lentil.radiometry.vegaflux \ No newline at end of file diff --git a/docs/ref/util.rst b/docs/ref/util.rst new file mode 100644 index 0000000..0f25c08 --- /dev/null +++ b/docs/ref/util.rst @@ -0,0 +1,36 @@ +.. _api.util: + +********* +Utilities +********* + +Shapes +------ +.. autosummary:: + :toctree: generated/ + + lentil.circle + lentil.circlemask + lentil.hexagon + lentil.slit + +Array manipulation +------------------ +.. autosummary:: + :toctree: generated/ + + lentil.boundary + lentil.centroid + lentil.pad + lentil.window + lentil.rebin + lentil.rescale + +Miscellaneous +------------- +.. autosummary:: + :toctree: generated/ + + lentil.min_sampling + lentil.pixelscale_nyquist + lentil.normalize_power diff --git a/docs/ref/wavefront.rst b/docs/ref/wavefront.rst new file mode 100644 index 0000000..f455efa --- /dev/null +++ b/docs/ref/wavefront.rst @@ -0,0 +1,10 @@ +.. _api.wavefront: + +********* +Wavefront +********* + +.. autosummary:: + :toctree: generated/ + + lentil.Wavefront \ No newline at end of file diff --git a/docs/ref/wavefront_errors.rst b/docs/ref/wavefront_errors.rst new file mode 100644 index 0000000..becf1ba --- /dev/null +++ b/docs/ref/wavefront_errors.rst @@ -0,0 +1,13 @@ +.. _api.wfe: + +**************** +Wavefront errors +**************** + +.. autosummary:: + :toctree: generated/ + + lentil.power_spectrum + lentil.translation_defocus + + diff --git a/docs/ref/zernike.rst b/docs/ref/zernike.rst new file mode 100644 index 0000000..860f909 --- /dev/null +++ b/docs/ref/zernike.rst @@ -0,0 +1,15 @@ +.. _api.zernike: + +******************* +Zernike polynomials +******************* + +.. autosummary:: + :toctree: generated/ + + lentil.zernike + lentil.zernike_compose + lentil.zernike_fit + lentil.zernike_remove + lentil.zernike_basis + lentil.zernike_coordinates \ No newline at end of file diff --git a/docs/reference.rst b/docs/reference.rst deleted file mode 100644 index 52725ac..0000000 --- a/docs/reference.rst +++ /dev/null @@ -1,36 +0,0 @@ -.. _api: - -.. currentmodule:: lentil - -************* -API reference -************* - -This page gives an overview of all public functions, modules, and objects included -in Lentil. All classes and functions exposed in the ``lentil`` namespace are public. - -Some subpackages are public including ``lentil.radiometry`` and -``lentil.detector``. - -.. _api.planes: - -Planes -====== - -.. autosummary:: - :caption: Planes - :toctree: generated/ - - lentil.Plane - lentil.Pupil - lentil.Image - - -Wavefront -========= - -.. autosummary:: - :caption: Wavefront - :toctree: generated/ - - lentil.Wavefront \ No newline at end of file diff --git a/docs/user/basics.coordinates.rst b/docs/user/basics.coordinates.rst index 9b010a0..a4df4a3 100644 --- a/docs/user/basics.coordinates.rst +++ b/docs/user/basics.coordinates.rst @@ -28,16 +28,18 @@ of the complex exponential in the Fourier kernel are provided below: * :ref:`user.wavefront_error.sign` * :ref:`user.diffraction.sign` +.. _user.coordinate_system.origin: + .. note:: Matplotlib's ``imshow()`` method (and MATLAB's ``imagesc()`` method) place the origin in the upper left corner of the plotted image by default. This presents arrays in the standard (row, column) ordering. The result is that the direction of y-axis is flipped relative to Lentil's coordinate system. This doesn't necessarily - present a problem as long as results are consistently plotted "incorrectly", but - to be completely correct (particularly when comparing model-generated images against - intuition or measured data) the origin should be located in the lower left corner - of the displayed image. + present a problem as long as results are consistently plotted, but to be completely + correct (particularly when comparing model-generated images against intuition or + measured data) the origin should be located in the lower left corner of the + displayed image. .. image:: /_static/img/coordinate_system_plot.png :width: 700px diff --git a/docs/user/basics.diffraction.rst b/docs/user/basics.diffraction.rst index c03a9aa..6ea92ec 100644 --- a/docs/user/basics.diffraction.rst +++ b/docs/user/basics.diffraction.rst @@ -60,20 +60,17 @@ follows the same basic flow: .. code-block:: pycon - >>> plt.imshow(np.abs(w2.field), origin='lower') + >>> plt.imshow(np.abs(w2.field)) .. plot:: :context: reset :scale: 50 - import matplotlib.pyplot as plt - import lentil - pupil = lentil.Pupil(amplitude=lentil.circle((256, 256), 120), pixelscale=1/240, focal_length=10) w1 = lentil.Wavefront(650e-9) w2 = w1 * pupil - plt.imshow(np.abs(w2.field), origin='lower') + plt.imshow(np.abs(w2.field)) Additionally, because ``w2`` was propagated through a |Pupil| plane, it has inherited the pupil's focal length: @@ -120,7 +117,7 @@ follows the same basic flow: :scale: 50 >>> w2 = lentil.propagate_dft(w2, pixelscale=5e-6, shape=(64,64), oversample=5) - >>> plt.imshow(w2.intensity**0.1, origin='lower') + >>> plt.imshow(w2.intensity, norm='log') .. note:: @@ -142,10 +139,6 @@ different wavelengths and accumulates the resulting image plane intensity: :scale: 50 :include-source: - import matplotlib.pyplot as plt - import numpy as np - import lentil - pupil = lentil.Pupil(amplitude=lentil.circle((256, 256), 120), pixelscale=1/240, focal_length=10) @@ -158,7 +151,7 @@ different wavelengths and accumulates the resulting image plane intensity: w = lentil.propagate_dft(w, pixelscale=5e-6, shape=(64,64), oversample=5) img += w.intensity - plt.imshow(img**0.1, origin='lower') + plt.imshow(img, norm='log') Keep in mind the output ``img`` array must be sized to accommodate the oversampled wavefront intensity given by ``npix`` * ``oversample``. @@ -195,7 +188,7 @@ appropriate location in the (potentially larger) output plane when a |Wavefront| :attr:`~lentil.Wavefront.field` or :attr:`~lentil.Wavefront.intensity` attribute is accessed. -.. image:: /_static/img/propagate_npix_prop.png +.. image:: images/propagate_npix_prop.png :width: 450px :align: center @@ -203,7 +196,7 @@ It can be advantageous to specify ``npix_prop`` < ``npix`` for performance reasons, although care must be taken to ensure needed data is not accidentally left out: -.. plot:: _img/python/npix_prop.py +.. plot:: user/plots/npix_prop.py :scale: 50 For most pupil to image plane propagations, setting ``npix_prop`` to 128 or 256 @@ -253,10 +246,10 @@ optics texts. The implications of this choice are as follows: :math:`\exp\left[i\frac{k}{2z} (x^2 + y^2)\right]` -.. .. _user_guide.diffraction.sampling: +.. _user.diffraction.sampling: -.. Sampling considerations -.. ======================= +Sampling considerations +======================= .. .. plot:: _img/python/dft_discrete_Q_sweep.py .. :scale: 50 @@ -269,10 +262,10 @@ optics texts. The implications of this choice are as follows: .. :width: 550px .. :align: center -.. .. _user_guide.diffraction.tilt: +.. _user.diffraction.tilt: -.. Working with large tilts -.. ======================== +Working with large tilts +======================== .. .. image:: /_static/img/propagate_tilt_phase.png .. :width: 450px .. :align: center @@ -289,10 +282,10 @@ optics texts. The implications of this choice are as follows: .. :width: 600px .. :align: center -.. .. _user_guide.diffraction.segmented: +.. _user.diffraction.segmented: -.. Differences for segmented apertures -.. =================================== +Differences for segmented apertures +=================================== diff --git a/docs/user/basics.optical_systems.rst b/docs/user/basics.optical_systems.rst index b45aca1..aa2cd7f 100644 --- a/docs/user/basics.optical_systems.rst +++ b/docs/user/basics.optical_systems.rst @@ -74,8 +74,6 @@ represented by a single |Pupil| plane: :scale: 50 :include-source: - >>> import matplotlib.pyplot as plt - >>> import lentil >>> amplitude = lentil.circle(shape=(256, 256), radius=120) >>> opd = lentil.zernike_compose(mask=amplitude, ... coeffs=[0, 0, 0, 100e-9, 300e-9, 0, -100e-9]) diff --git a/docs/user/basics.planes.rst b/docs/user/basics.planes.rst index 718c469..8251202 100644 --- a/docs/user/basics.planes.rst +++ b/docs/user/basics.planes.rst @@ -15,8 +15,8 @@ Lentil plane types All Lentil planes are derived from the |Plane| class. This base class defines the interface to represent any discretely sampled plane in an optical model. It can also be used directly in a model. Planes typically have some influence on the propagation -of a wavefront though this is not strictly required and some models may use *dummy* -or *reference* planes as needed. +of a wavefront though this is not strictly required and models may use *dummy* or +*reference* planes as needed. Lentil provides several general planes that are the building blocks for most optical models: @@ -74,7 +74,7 @@ plane. A plane is defined by the following parameters: .. note:: All Plane attributes have sensible default values that have no effect on - propagations when not defined. + propagations when not specified. Create a new Plane with @@ -83,8 +83,6 @@ Create a new Plane with :include-source: :scale: 50 - >>> import matplotlib.pyplot as plt - >>> import lentil >>> p = lentil.Plane(amplitude=lentil.util.circle((256,256), 120)) >>> plt.imshow(p.amplitude, origin='lower') @@ -94,8 +92,6 @@ Once a Plane is defined, its attributes can be modified at any time: :include-source: :scale: 50 - >>> import matplotlib.pyplot as plt - >>> import lentil >>> p = lentil.Plane(amplitude=lentil.util.circle((256,256), 120)) >>> p.phase = 2e-6 * lentil.zernike(p.mask, index=4) >>> plt.imshow(p.phase, origin='lower') @@ -232,14 +228,12 @@ Given the following |Pupil| and |Detector| planes: :include-source: :scale: 50 - >>> import matplotlib.pyplot as plt - >>> import lentil >>> pupil = lentil.Pupil(amplitude=lentil.util.circle((256, 256), 120), ... focal_length=10, pixelscale=1/250) >>> w = lentil.Wavefront(650e-9) >>> w *= pupil >>> w = lentil.propagate_dft(w, pixelscale=5e-6, shape=(64,64), oversample=2) - >>> plt.imshow(w.intensity, origin='lower') + >>> plt.imshow(w.intensity) It is simple to see the effect of introducing a tilted wavefront into the system: @@ -247,8 +241,6 @@ It is simple to see the effect of introducing a tilted wavefront into the system :include-source: :scale: 50 - >>> import matplotlib.pyplot as plt - >>> import lentil >>> pupil = lentil.Pupil(amplitude=lentil.util.circle((256, 256), 120), ... focal_length=10, pixelscale=1/250) >>> tilt = lentil.Tilt(x=10e-6, y=-5e-6) @@ -258,6 +250,11 @@ It is simple to see the effect of introducing a tilted wavefront into the system >>> w = lentil.propagate_dft(w, pixelscale=5e-6, shape=(64,64), oversample=2) >>> plt.imshow(w.intensity, origin='lower') +.. note:: + + Notice the use of ``origin='lower'`` in the plot above. For an explanation, see + the note :ref:`here `. + .. .. _user_guide.planes.transformations: .. Plane transformations diff --git a/docs/user/basics.wavefront_error.rst b/docs/user/basics.wavefront_error.rst index 00f6f59..6d85c37 100644 --- a/docs/user/basics.wavefront_error.rst +++ b/docs/user/basics.wavefront_error.rst @@ -32,7 +32,7 @@ in a shift in the image plane in the positive y direction. A positive y-tilt rotates the xz plane clockwise about the y-axis resulting in a shift in the image plane in the negative x direction. -.. plot:: _img/python/tilt_images.py +.. plot:: user/plots/tilt_images.py :scale: 50 Focus @@ -53,7 +53,7 @@ image to be flipped about both axes relative to the aperture (consistent with observing the image after passing through focus). The results of this exercise are presented below: -.. plot:: _img/python/focus_images.py +.. plot:: user/plots/focus_images.py :scale: 50 Static Errors @@ -88,36 +88,32 @@ polynomials `_. Lentil uses the Noll indexing scheme for defining Zernike polynomials [1]_. Wavefront error maps are easily computed using either the :func:`~lentil.zernike` or -:func:`~lentil.zernike_compose` functions. For example, we can represent 100 nm of focus over a -circular aperture with :func:`~lentil.zernike`: +:func:`~lentil.zernike_compose` functions. For example, we can represent 100 nm of +astigmatism over a circular aperture with :func:`~lentil.zernike`: .. plot:: :include-source: :scale: 50 - >>> import matplotlib.pyplot as plt - >>> import lentil >>> mask = lentil.circlemask((256,256), 120) - >>> z4 = 100e-9 * lentil.zernike(mask, index=4) - >>> plt.imshow(z4, origin='lower') + >>> astig = 100e-9 * lentil.zernike(mask, index=6) + >>> plt.imshow(astig, origin='lower') -Any combination of Zernike polynomials can be combined by providing a list of coefficients -to the :func:`~lentil.zernike_compose` function. For example, we can represent 200 nm of -focus and -100 nm of astigmatism as: +Any arbitrary combination of Zernike polynomials can be represented by providing a +list of coefficients to the :func:`~lentil.zernike_compose` function: .. plot:: :include-source: :scale: 50 - >>> import matplotlib.pyplot as plt - >>> import lentil >>> mask = lentil.circlemask((256,256), 120) - >>> coefficients = [0, 0, 0, 200e-9, 0, -100e-9] - >>> z = lentil.zernike_compose(mask, coefficients) + >>> coeff = np.random.uniform(low=-200e-9, high=200e-9, size=10) + >>> z = lentil.zernike_compose(mask, coeff) >>> plt.imshow(z, origin='lower') -Note that the coefficients list is ordered according to the Noll indexing scheme so the +Note that the coefficients list is ordered according to the `Noll indexing scheme +`_ so the first entry in the list represents piston, the second represents, tilt, and so on. For models requiring many random trials, it may make more sense to pre-compute the @@ -127,36 +123,30 @@ each independent term using Numpy's `einsum `_ function. Note that in this case we are only computing the Zernike modes we intend to use (Noll -indices 4 and 6) so now the first entry in ``coefficients`` corresponds to focus and the +indices 4 and 6) so now the first entry in ``coeff`` corresponds to focus and the second corresponds to astigmatism. .. plot:: :include-source: :scale: 50 - >>> import matplotlib.pyplot as plt - >>> import numpy as np - >>> import lentil >>> mask = lentil.circlemask((256,256), 120) - >>> coefficients = [200e-9, -100e-9] + >>> coeff = [200e-9, -100e-9] >>> basis = lentil.zernike_basis(mask, modes=(4,6)) - >>> z = np.einsum('ijk,i->jk', basis, coefficients) + >>> z = np.einsum('ijk,i->jk', basis, coeff) >>> plt.imshow(z, origin='lower') -If you don't love ``einsum``, it's possible to achieve the same result with Numpy's +It's also possible to achieve the same result using Numpy's `tensordot `_: .. plot:: :include-source: :scale: 50 - >>> import matplotlib.pyplot as plt - >>> import numpy as np - >>> import lentil >>> mask = lentil.circlemask((256,256), 120) - >>> coefficients = [200e-9, -100e-9] + >>> coeff = [200e-9, -100e-9] >>> basis = lentil.zernike_basis(mask, modes=(4,6)) - >>> z = np.tensordot(basis, coefficients, axes=(0,0)) + >>> z = np.tensordot(basis, coeff, axes=(0,0)) >>> plt.imshow(z, origin='lower') Normalization @@ -174,8 +164,6 @@ the error magnitude: .. code-block:: pycon - >>> import numpy as np - >>> import lentil >>> mask = lentil.circlemask((256,256), 128) >>> z4 = 100e-9 * lentil.zernike(mask, mode=4, normalize=True) >>> np.std(z4[np.nonzero(z4)]) @@ -188,8 +176,6 @@ the discretely sampled mode spans [-0.5 0.5] before multiplying by the error mag .. code-block:: pycon - >>> import numpy as np - >>> import lentil >>> mask = lentil.circlemask((256,256), 128) >>> z4 = lentil.zernike(mask, mode=4) >>> z4 /= np.max(z4) - np.min(z4) @@ -213,8 +199,6 @@ the center of the defined array: :include-source: :scale: 50 - >>> import matplotlib.pyplot as plt - >>> import lentil >>> mask = lentil.circlemask((256,256), radius=50, shift=(0,60)) >>> rho, theta = lentil.zernike_coordinates(mask, shift=(0,60)) >>> z4 = lentil.zernike(mask, 4, rho=rho, theta=theta) @@ -226,8 +210,6 @@ If we wish to align a tilt mode with one side of a hexagon: :include-source: :scale: 50 - >>> import matplotlib.pyplot as plt - >>> import lentil >>> mask = lentil.hexagon((256,256), radius=120) >>> rho, theta = lentil.zernike_coordinates(mask, shift=(0,0), rotate=30) >>> z2 = lentil.zernike(mask, 2, rho=rho, theta=theta) @@ -281,11 +263,9 @@ wavefront error map given a PSD: :include-source: :scale: 50 - >>> import matplotlib.pyplot as plt - >>> import lentil >>> mask = lentil.circle((256, 256), 120) - >>> w = lentil.power_spectrum(mask, pixelscale=1/120, rms=25e-9, half_power_freq=8, - ... exp=3) + >>> w = lentil.power_spectrum(mask, pixelscale=1/120, rms=25e-9, + ... half_power_freq=8, exp=3) >>> plt.imshow(w, origin='lower') diff --git a/docs/_static/img/propagate_npix_prop.png b/docs/user/images/propagate_npix_prop.png similarity index 100% rename from docs/_static/img/propagate_npix_prop.png rename to docs/user/images/propagate_npix_prop.png diff --git a/docs/user/plots/focus_images.py b/docs/user/plots/focus_images.py new file mode 100644 index 0000000..e8492d7 --- /dev/null +++ b/docs/user/plots/focus_images.py @@ -0,0 +1,47 @@ +import matplotlib.pyplot as plt +import numpy as np +import lentil + +amp = np.zeros((256, 256)) +amp += lentil.circlemask((256, 256), 64, shift=(32, 8)) +amp -= lentil.circlemask((256, 256), 40, shift=(32, 8)) +amp[:, 0:128+8] = 0 +amp[32:225, 104-16:128-16] = 1 +amp[96:120, 128-16:144-8] = 1 +amp[201:225, 128-16:144-8] = 1 + +focus = lentil.zernike(mask=np.ones((256, 256)), index=4) + +pupil_neg = lentil.Pupil(amplitude=amp, pixelscale=1/240, focal_length=10) +pupil_neg.phase = -6e-6 * focus +w_neg = lentil.Wavefront(650e-9) +w_neg *= pupil_neg +w_neg = lentil.propagate_dft(w_neg, pixelscale=5e-6, shape=200, oversample=2) + +pupil_pos = lentil.Pupil(amplitude=amp, pixelscale=1/240, focal_length=10) +pupil_pos.phase = 6e-6 * focus +w_pos = lentil.Wavefront(650e-9) +w_pos *= pupil_pos +w_pos = lentil.propagate_dft(w_pos, pixelscale=5e-6, shape=200, oversample=2) + +fig, (ax1,ax2,ax3) = plt.subplots(nrows=1, ncols=3, figsize=(5, 3)) + +ax1.imshow(amp, origin='lower') +ax1.set_title('Aperture') +ax1.set_xticks(np.linspace(0, 256, 5), labels=np.linspace(-1, 1, 5)) +ax1.set_yticks(np.linspace(0, 256, 5), labels=np.linspace(-1, 1, 5)) +ax1.set_xlabel('[m]') + +ax2.imshow(w_pos.intensity, origin='lower') +ax2.set_title('Image plane (+focus)') +ax2.set_xticks(np.linspace(0, 400, 5), labels=np.linspace(-1, 1, 5)) +ax2.set_yticks(np.linspace(0, 400, 5), labels=np.linspace(-1, 1, 5)) +ax2.set_xlabel('[mm]') + +ax3.imshow(w_neg.intensity, origin='lower') +ax3.set_title('Image plane (-focus)') +ax3.set_xticks(np.linspace(0, 400, 5), labels=np.linspace(-1, 1, 5)) +ax3.set_yticks(np.linspace(0, 400, 5), labels=np.linspace(-1, 1, 5)) +ax3.set_xlabel('[mm]') + +plt.tight_layout() diff --git a/docs/_img/python/npix_prop.py b/docs/user/plots/npix_prop.py similarity index 69% rename from docs/_img/python/npix_prop.py rename to docs/user/plots/npix_prop.py index 843ea9c..69a062a 100644 --- a/docs/_img/python/npix_prop.py +++ b/docs/user/plots/npix_prop.py @@ -16,12 +16,13 @@ w2 *= pupil w2 = lentil.propagate_dft(w2, pixelscale=5e-6, shape=128, prop_shape=40, oversample=5) -plt.subplot(1, 2, 1) -plt.imshow(w1.intensity, origin='lower') -plt.title('npix_prop ok') -plt.axis('off') - -plt.subplot(1, 2, 2) -plt.imshow(w2.intensity, origin='lower') -plt.title('npix_prop too small') -plt.axis('off') + +fig, (ax1, ax2) = plt.subplots(nrows=1, ncols=2, figsize=(4, 4)) + +ax1.imshow(w1.intensity, origin='lower') +ax1.set_title('npix_prop ok') +ax1.axis('off') + +ax2.imshow(w2.intensity, origin='lower') +ax2.set_title('npix_prop too small') +ax2.axis('off') diff --git a/docs/user/plots/tilt_images.py b/docs/user/plots/tilt_images.py new file mode 100644 index 0000000..a116a31 --- /dev/null +++ b/docs/user/plots/tilt_images.py @@ -0,0 +1,45 @@ +import matplotlib.pyplot as plt +import numpy as np +import lentil + +amp = lentil.circle((256, 256), 120) +x_tilt = 8e-6 * lentil.zernike(amp, 3) # +x tilt +y_tilt = 8e-6 * lentil.zernike(amp, 2) # +y tilt + +py = lentil.Pupil(focal_length=10, pixelscale=1 / 240, amplitude=amp, phase=y_tilt) +wy = lentil.Wavefront(650e-9) +wy *= py +wy = lentil.propagate_dft(wy, pixelscale=5e-6, shape=200, oversample=5) + +px = lentil.Pupil(focal_length=10, pixelscale=1 /240, amplitude=amp, phase=x_tilt) +wx = lentil.Wavefront(650e-9) +wx *= px +wx = lentil.propagate_dft(wx, pixelscale=5e-6, shape=200, oversample=5) + +fig, ((ax1,ax2),(ax3,ax4)) = plt.subplots(nrows=2, ncols=2, figsize=(3.5, 3.5)) + +ax1.imshow(x_tilt, origin='lower') +ax1.set_title('Pupil plane ($+R_x$)') +ax1.set_xticks(np.linspace(0, 256, 5), labels=np.linspace(-0.5, 0.5, 5)) +ax1.set_yticks(np.linspace(0, 256, 5), labels=np.linspace(-0.5, 0.5, 5)) +ax1.set_xlabel('[m]') + +ax2.imshow(y_tilt, origin='lower') +ax2.set_title('Pupil plane ($+R_y$)') +ax2.set_xticks(np.linspace(0, 256, 5), labels=np.linspace(-0.5, 0.5, 5)) +ax2.set_yticks(np.linspace(0, 256, 5), labels=np.linspace(-0.5, 0.5, 5)) +ax2.set_xlabel('[m]') + +ax3.imshow(wx.intensity ** 0.2, origin='lower') +ax3.set_title('Image plane ($+R_x$)') +ax3.set_xticks(np.linspace(0, 200 * 5, 5), labels=np.linspace(-1, 1, 5)) +ax3.set_yticks(np.linspace(0, 200 * 5, 5), labels=np.linspace(-1, 1, 5)) +ax3.set_xlabel('[mm]') + +ax4.imshow(wy.intensity ** 0.2, origin='lower') +ax4.set_title('Image plane ($+R_y$)') +ax4.set_xticks(np.linspace(0, 200 * 5, 5), labels=np.linspace(-1, 1, 5)) +ax4.set_yticks(np.linspace(0, 200 * 5, 5), labels=np.linspace(-1, 1, 5)) +ax4.set_xlabel('[mm]') + +fig.tight_layout() diff --git a/docs/user/quickstart.rst b/docs/user/quickstart.rst index 9934ca7..32a477d 100644 --- a/docs/user/quickstart.rst +++ b/docs/user/quickstart.rst @@ -9,7 +9,7 @@ Quickstart ********** This is a short introduction to Lentil, mainly written for new users. More -complex recipes are available in the Cookbook. +detailed examples are available :ref:`here`. First, we import Lentil: @@ -23,55 +23,54 @@ We'll also import `Matplotlib `_ to visualize results: >>> import matplotlib.pyplot as plt -.. note:: - - Lentil is "unitless" in the sense that it doesn't enforce a specific base - unit. All calculations are well behaved for both metric and imperial units. - It is important that units are consistent however, and this task is left to - the user. - - That being said, it is recommended that all calculations be performed in - terms of either meters, millimeters, or microns. - Creating planes =============== -Most Lentil models can be constructed using |Pupil| and |Image| planes. We'll -create a circular |Pupil| with a focal length of 10 meters and a diameter of -1 meter: +Most simple diffraction simulations can be represented by a single far-field +propagation from a pupil plane to an image plane. First, we'll create a +pupil amplitude map and corresponding optical path difference (OPD) map which +represents the wavefront error of the system. We'll construct the OPD map from +a combination of Zernike modes: -.. code-block:: pycon +.. plot:: + :context: reset + :include-source: + :scale: 50 >>> amp = lentil.circle(shape=(256,256), radius=120) - >>> pupil = lentil.Pupil(amplitude=amp, pixelscale=1/240, focal_length=10) - >>> plt.imshow(pupil.amplitude, origin='lower') + >>> coef = [0, 0, 0, 300e-9, 50e-9, -100e-9, 50e-9] + >>> opd = lentil.zernike_compose(mask=amp, coeffs=coef) + >>> fig, (ax1, ax2) = plt.subplots(ncols=2, figsize=(5, 4)) + >>> ax1.imshow(amp) + >>> ax1.set_title('Amplitude') + >>> ax2.imshow(opd) + >>> ax2.set_title('OPD') + +Now we can use the amplitude and OPD maps to construct a |Pupil| plane with +a focal length of 20 meters and a diameter of 1 meter: .. plot:: - :scale: 50 - :context: reset + :context: close-figs + :include-source: - import matplotlib.pyplot as plt - import lentil - amp = lentil.circle(shape=(256,256), radius=120) - pupil = lentil.Pupil(amplitude=amp, pixelscale=1/240, focal_length=10) - plt.imshow(pupil.amplitude, origin='lower') + >>> pupil = lentil.Pupil(amplitude=amp, phase=opd, pixelscale=1/240, + ... focal_length=20) -Note the diameter is defined via the :attr:`~lentil.Pupil.pixelscale` -attribute: +Note the diameter is implicitly defined via the +:attr:`~lentil.Pupil.pixelscale` attribute: .. image:: /_static/img/pixelscale.png :width: 500px :align: center -Here, we'll create an |Image| plane with spatial sampling of 5 microns, -represented here in trems of meters: - -.. code-block:: pycon - - >>> image = lentil.Image(pixelscale=5e-6) +.. note:: + Lentil is "unitless" in the sense that it doesn't enforce a specific base + unit. All calculations are well behaved for both metric and imperial units. + It is important that units are consistent however, and this task is left to + the user. -.. Wavefront error -.. =============== + That being said, it is recommended that all calculations be performed in + terms of either meters, millimeters, or microns. Diffraction =========== @@ -79,56 +78,61 @@ Diffraction Pupil to image plane propagation -------------------------------- The simplest diffraction propagation is from a pupil to image plane. Here, we -construct a |Wavefront| with wavelength of 650 nanometers, again represented +construct a |Wavefront| with wavelength of 500 nm, again represented in meters: -.. code-block:: pycon +.. plot:: + :context: + :include-source: - >>> w = lentil.Wavefront(wavelength=650e-9) + >>> w0 = lentil.Wavefront(wavelength=500e-9) Next, we'll propagate the wavefront through the pupil plane we defined above. Lentil uses multiplication represent the interaction between a |Plane| and |Wavefront|: -.. code-block:: pycon +.. plot:: + :context: + :include-source: - >>> w = w * pupil + >>> w1 = w0 * pupil Finally, we'll propagate the wavefront to a discreetely sampled image plane using :func:`~lentil.propagate_dft`. In this case, we'll sample -the result every 5e-6 meters and perform the propagation 3 times oversampled: +the result on a grid with spacing of 5e-6 meters and perform the propagation +2 times oversampled: -.. code-block:: pycon +.. plot:: + :context: + :include-source: - >>> w = lentil.propagate_dft(w, shape=(64,64), pixelscale=5e-6, oversample=5) + >>> w2 = lentil.propagate_dft(w1, shape=(64,64), pixelscale=5e-6, oversample=2) The resulting intensity (point spread function) can now be observed: -.. code-block:: pycon - - >>> plt.imshow(w.intensity, origin='lower') - .. plot:: - :context: close-figs + :context: + :include-source: :scale: 50 - w = lentil.Wavefront(wavelength=650e-9) - w *= pupil - w = lentil.propagate_dft(w, shape=(64,64), pixelscale=5e-6, oversample=5) - plt.imshow(w.intensity, origin='lower') + >>> plt.imshow(w2.intensity) -.. Multi-plane propagation -.. ----------------------- +Finally, we will rescale the oversampled image to native sampling and include the +blurring effects due to the pixel MTF: -.. Free-space propagation -.. ---------------------- +.. plot:: + :context: close-figs + :include-source: + :scale: 50 + >>> img = lentil.detector.pixelate(w2.intensity, oversample=2) + >>> plt.imshow(img) -Focal planes -============ +.. Focal planes +.. ============ -Radiometry -========== +.. Radiometry +.. ========== diff --git a/lentil/field.py b/lentil/field.py index e60ecc6..980423c 100644 --- a/lentil/field.py +++ b/lentil/field.py @@ -25,18 +25,32 @@ class Field: and return an updated x and y shift. If None (default), tilt = []. - Attributes - ---------- - extent : tuple - Array indices defining the extent of the offset Field. """ __slots__ = ('data', 'offset', 'tilt', 'pixelscale', 'extent') def __init__(self, data, pixelscale=None, offset=None, tilt=None): - self.data = np.asarray(data, dtype=complex) + #: ndarray : Complex field data + self.data = np.asarray(data, dtype=complex) + self.pixelscale = pixelscale + """Spatial sampling of data + + If None (default), the Field is assumed to be broadcastable to any + legal shape without interpolation. + + Returns + ------- + tuple of ints or None + """ + + #: tuple of ints : Field offset from (0, 0). self.offset = offset if offset is not None else [0, 0] + + #: list : List of objects that implement the tilt interface defined + # in :class:`~lentil.plane.TiltInterface` self.tilt = tilt if tilt else [] + + #: tuple of ints : Extent of ``data`` self.extent = extent(self.shape, self.offset) @property @@ -46,7 +60,7 @@ def shape(self): Returns ------- - shape : tuple + tuple of ints """ return self.data.shape @@ -57,7 +71,7 @@ def size(self): Returns ------- - size : int + int """ return self.data.size @@ -232,7 +246,8 @@ def extent(shape, offset): def insert(field, out, intensity=False, weight=1): - """ + """Insert a field into an array. + Parameters ---------- field : :class:`~lentil.field.Field` @@ -247,7 +262,7 @@ def insert(field, out, intensity=False, weight=1): Returns ------- - out : ndarray + ndarray """ #if indexing not in ('xy', 'ij'): diff --git a/lentil/plane.py b/lentil/plane.py index fc9fddb..094fe98 100644 --- a/lentil/plane.py +++ b/lentil/plane.py @@ -38,24 +38,21 @@ class Plane: Physical sampling of each pixel in the plane. If ``pixelscale`` is a scalar, uniform sampling in x and y is assumed. If None (default), ``pixelscale`` is left undefined. - - Attributes - ---------- - tilt : list - List of :class:`~lentil.Tilt` terms associated wirth this Plane - + diameter : float, optional + Outscribing diameter around mask. If not provided (default), it is computed + from the boundary of :attr:`mask`. + ptype : ptype object + Plane type + """ def __init__(self, amplitude=1, phase=0, mask=None, pixelscale=None, diameter=None, ptype=None): self.amplitude = np.asarray(amplitude) self.phase = np.asarray(phase) self.mask = mask - self.pixelscale = None if pixelscale is None else np.broadcast_to(pixelscale, (2,)) + self.pixelscale = pixelscale self.diameter = diameter self.ptype = lentil.ptype(ptype) - - self._mask = np.asarray(mask) if mask is not None else None - self._slice = _plane_slice(self._mask) self.tilt = [] @@ -63,8 +60,44 @@ def __init__(self, amplitude=1, phase=0, mask=None, pixelscale=None, diameter=No def __repr__(self): return f'{self.__class__.__name__}()' + @property + def amplitude(self): + """Electric field amplitude transmission + + Returns + ------- + ndarray + + """ + return self._amplitude + + @amplitude.setter + def amplitude(self, value): + self._amplitude = np.asarray(value) + + @property + def phase(self): + """Electric field phase + + Returns + ------- + ndarray + + """ + return self._phase + + @phase.setter + def phase(self, value): + self._phase = np.asarray(value) + @property def mask(self): + """Binary transmission mask + + Returns + ------- + ndarray + """ if self._mask is not None: return self._mask else: @@ -84,19 +117,47 @@ def mask(self, value): @property def global_mask(self): """ - Flattened view of :attr:`mask` + Flattened view of :attr:`~mask` Returns ------- - mask : ndarray + ndarray + """ - if self.depth < 2: + if self.size < 2: return self.mask else: return np.sum(self.mask, axis=0) + @property + def pixelscale(self): + """Physical sampling of each pixel in the plane + + Returns + ------- + tuple of ints or None + + """ + return self._pixelscale + + @pixelscale.setter + def pixelscale(self, value): + self._pixelscale = None if value is None else np.broadcast_to(value, (2,)) + @property def diameter(self): + """Plane diameter + + Notes + ----- + If :attr:`diameter` was no provided during Plane creation, it is + autocomputed if possible. If it is not possible, None is returned. + + Returns + ------- + float or None + + """ if self._diameter is None: [rmin, rmax, cmin, cmax] = lentil.boundary(self.global_mask) # since pixelscale has shape=(2,), we need to return the overall @@ -114,22 +175,27 @@ def shape(self): """ Plane dimensions computed from :attr:`mask`. - Returns (mask.shape[1], mask.shape[2]) if mask has ``ndim == 3``. Returns + Returns (mask.shape[1], mask.shape[2]) if :attr:`size: > 1. Returns None if :attr:`mask` is None. + + Returns + ------- + tuple of ints """ - if self.depth == 1: + if self.size == 1: return self.mask.shape else: return self.mask.shape[1], self.mask.shape[2] @property - def depth(self): + def size(self): """ Number of independent masks (segments) in :attr:`mask` Returns ------- - depth : int + int + """ if self.mask.ndim in (0, 1, 2): return 1 @@ -141,11 +207,11 @@ def ptt_vector(self): """ 2D vector representing piston and tilt in x and y. - Planes with no mask have ``ptt_vector = None``. + Planes with no mask have :attr:`ptt_vector` = None. Returns ------- - ptt_vector : ndarray or None + ndarray or None """ # if there's no mask, we just set ptt_vector to None and move on @@ -164,14 +230,14 @@ def ptt_vector(self): unmasked_ptt_vector = np.einsum('ij,i->ij', [np.ones(r.size), r.ravel(), -c.ravel()], [1, self.pixelscale[0], self.pixelscale[1]]) - if self.depth == 1: + if self.size == 1: ptt_vector = np.einsum('ij,j->ij', unmasked_ptt_vector, self.mask.ravel()) else: # prepare empty ptt_vector - ptt_vector = np.empty((self.depth * 3, np.prod(self.shape))) + ptt_vector = np.empty((self.size * 3, np.prod(self.shape))) # loop over the masks and fill in the masked ptt_vectors - for mask in np.arange(self.depth): + for mask in np.arange(self.size): ptt_vector[3*mask:3*mask+3] = unmasked_ptt_vector * self.mask[mask].ravel() return ptt_vector @@ -182,7 +248,7 @@ def copy(self): Returns ------- - copy : :class:`~lentil.Plane` + :class:`~lentil.Plane` """ return copy.deepcopy(self) @@ -199,7 +265,7 @@ def fit_tilt(self, inplace=False): Returns ------- - plane : :class:`~lentil.Plane` + :class:`~lentil.Plane` """ if inplace: plane = self @@ -213,31 +279,30 @@ def fit_tilt(self, inplace=False): if ptt_vector is None or plane.phase.size == 1: return plane - if self.depth == 1: + if self.size == 1: t = np.linalg.lstsq(ptt_vector.T, plane.phase.ravel(), rcond=None)[0] phase_tilt = np.einsum('ij,i->j', ptt_vector[1:3], t[1:3]) plane.phase -= phase_tilt.reshape(plane.phase.shape) plane.tilt.append(Tilt(x=t[1], y=t[2])) else: - t = np.empty((self.depth, 3)) - phase_no_tilt = np.empty((self.depth, plane.phase.shape[0], plane.phase.shape[1])) + t = np.empty((self.size, 3)) + phase_no_tilt = np.empty((self.size, plane.phase.shape[0], plane.phase.shape[1])) # iterate over the segments and compute the tilt term - for seg in np.arange(self.depth): + for seg in np.arange(self.size): t[seg] = np.linalg.lstsq(ptt_vector[3 * seg:3 * seg + 3].T, plane.phase.ravel(), rcond=None)[0] seg_tilt = np.einsum('ij,i->j', ptt_vector[3 * seg + 1:3 * seg + 3], t[seg, 1:3]) phase_no_tilt[seg] = (plane.phase - seg_tilt.reshape(plane.phase.shape)) * self.mask[seg] plane.phase = np.sum(phase_no_tilt, axis=0) - plane.tilt.extend([Tilt(x=t[seg, 1], y=t[seg, 2]) for seg in range(self.depth)]) + plane.tilt.extend([Tilt(x=t[seg, 1], y=t[seg, 2]) for seg in range(self.size)]) return plane def rescale(self, scale): - """ - Rescale a plane via interpolation. + """Rescale a plane via interpolation. The following Plane attributes are resampled: @@ -257,8 +322,8 @@ def rescale(self, scale): ------- plane : :class:`Plane` - Note - ---- + Notes + ----- All interpolation is performed via `scipy.ndimage.map_coordinates` See Also @@ -318,13 +383,13 @@ def resample(self, pixelscale): plane : :class:`Plane` Resampled Plane. - Note - ---- + Notes + ----- All interpolation is performed via `scipy.ndimage.map_coordinates` See Also -------- - * :func:`Plane.rescale` + Plane.rescale """ if not self.pixelscale: @@ -342,8 +407,8 @@ def multiply(self, wavefront): wavefront : :class:`~lentil.wavefront.Wavefront` object Wavefront to be multiplied - Note - ---- + Notes + ----- It is possible to customize the way multiplication is performed by creating a subclass and overloading its ``multiply`` method. @@ -374,7 +439,7 @@ def multiply(self, wavefront): for n, s in enumerate(self._slice): # We have to multiply amplitude[s] by mask[n][s] because the requested # slice of the amplitude array may contain parts of adjacent segments - mask = self.mask if self.depth == 1 else self.mask[n] + mask = self.mask if self.size == 1 else self.mask[n] amp = self.amplitude if self.amplitude.size == 1 else self.amplitude[s] * mask[s] phase = self.phase if self.phase.size == 1 else self.phase[s] @@ -459,11 +524,12 @@ def _plane_slice(mask): slices : list List of slices corresponding to the data extent defined by ``mask``. - See also + See Also -------- - * :func:`~lentil.helper.boundary_slice` - * :func:`~lentil.Plane.slice_offset` - """ + helper.boundary_slice + Plane.slice_offset + + """ # self.mask may still return None so we catch that here if mask is None: @@ -507,8 +573,8 @@ class Pupil(Plane): .. plot:: _img/python/segmask.py :scale: 50 - Note - ---- + Notes + ----- By definition, a pupil is represented by a spherical wavefront. Any aberrations in the optical system appear as deviations from this perfect sphere. The primary use of :class:`Pupil` is to represent these aberrations @@ -548,8 +614,8 @@ class Image(Plane): :class:`Image` is assumed to be square with nrows = ncols = shape. Default is None. - Note - ---- + Notes + ----- If image plane intensity is desired, significant performance improvements can be realized by using a :class:`Detector` plane instead. @@ -600,7 +666,7 @@ class Detector(Image): ---------- pixelscale : float, optional Pixel size in meters. Pixels are assumed to be square. Default is None. - shape : {int, (2,) array_like}, optional + shape : tuple of ints, optional Number of pixels as (rows, cols). If a single value is provided, :class:`Image` is assumed to be square with nrows = ncols = shape. Default is None. @@ -613,10 +679,25 @@ class Detector(Image): pass -class TiltInterfcace(Plane): - # Utility class for holding some common logic shared by - # classes that implement the Tilt interface +class TiltInterface(Plane): + """Utility class for holding common lofic shared by classes that need to + implement the tilt interface. + + Other Parameters + ---------------- + **kwargs : :class:`~lentil.Plane` parameters + Keyword arguments passed to :class:`~lentil.Plane` constructor + Notes + ----- + If :attr:`ptype` is not provided, it defaults to `lentil.tilt`. + + See Also + -------- + Tilt + DispersiveTilt + + """ def __init__(self, **kwargs): # if ptype is provided as a kwarg use that, otherwise default # to lentil.tilt @@ -626,16 +707,37 @@ def __init__(self, **kwargs): super().__init__(ptype=ptype, **kwargs) def multiply(self, wavefront): + """Multiply with a wavefront. This is a custom implementation + supporting the tilt interface. + + Notes + ----- + This method performs the following actions: + + .. code:: python + + wavefront = super().multiply(wavefront) + for field in wavefront.data: + field.tilt.append(self) + return wavefront + + Returns + ------- + :class:`~lentil.Wavefront` + + """ wavefront = super().multiply(wavefront) for field in wavefront.data: field.tilt.append(self) return wavefront def shift(self, wavelength, x0, y0, **kwargs): + """TODO + """ raise NotImplementedError -class Tilt(TiltInterfcace): +class Tilt(TiltInterface): """Object for representing tilt in terms of angle Parameters @@ -674,7 +776,7 @@ def shift(self, xs=0, ys=0, z=0, **kwargs): return x, y -class DispersiveTilt(TiltInterfcace): +class DispersiveTilt(TiltInterface): r"""Class for representing spectral dispersion that appears as a tilt. Light is dispersed along a line called the the spectral trace. The position @@ -883,8 +985,8 @@ class Grism(DispersiveTilt): and should return units of meters of wavelength provided an input distance along the spectral trace. - Note - ---- + Notes + ----- Lentil supports trace and dispersion functions with any arbitrary polynomial order. While a simple analytic solution exists for modeling first-order trace and/or dispersion, there is no general solution for higher order functions. @@ -936,8 +1038,8 @@ class Rotate(Plane): The order of the spline interpolation (if needed), default is 3. The order has to be in the range 0-5. - Note - ---- + Notes + ----- If the angle is an even multiple of 90 degrees, ``numpy.rot90`` is used to perform the rotation rather than ``scipy.ndimage.rotate``. In this case, the order parameter is irrelevant because no interpolation occurs. diff --git a/lentil/wavefront.py b/lentil/wavefront.py index 772f597..3c6aade 100644 --- a/lentil/wavefront.py +++ b/lentil/wavefront.py @@ -23,33 +23,32 @@ class Wavefront: focal_length : float or np.inf, optional Wavefront focal length. A plane wave (default) has an infinite focal length (``np.inf``). - tilt: list_like, optional - - shape : (2,) array_like + tilt: (2,) array_like, optional + Radians of wavefront tilt about the x and y axes provided as + ``[rx, ry]``. Default is ``[0, 0]`` (no tilt). + shape : (2,) array_like, optional Wavefront shape. If ``shape`` is None (default), the wavefront is assumed to be infinite (broadcastable to any shape). - ptype : lentil.ptype - Plane type. - - Attributes - ---------- - data : list_like - Wavefront data. Default is [1+0j] (a plane wave). + ptype : lentil.ptype, optional + Plane type. Default is ``lentil.none``. """ - __slots__ = ('wavelength', 'pixelscale', 'focal_length', 'diameter', - 'focal_length', '_ptype', 'shape', 'data') - def __init__(self, wavelength, pixelscale=None, diameter=None, focal_length=None, tilt=None, ptype=None): - - self.wavelength = wavelength - self.pixelscale = None if pixelscale is None else np.broadcast_to(pixelscale, (2,)) + + #: float: Wavefront focal length self.focal_length = focal_length if focal_length else np.inf + + #: float: Wavefront diameter self.diameter = diameter - self.ptype = lentil.ptype(ptype) + + #: tuple of ints: Wavefront shape self.shape = () + self._wavelength = wavelength + self._pixelscale = None if pixelscale is None else np.broadcast_to(pixelscale, (2,)) + self.ptype = lentil.ptype(ptype) + if tilt is not None: if len(tilt) != 2: raise ValueError('tilt must be specified as [rx, ry]') @@ -65,8 +64,34 @@ def __mul__(self, plane): def __rmul__(self, other): return self.__mul__(other) + @property + def wavelength(self): + """Wavefront wavelength + + Returns + ------- + float + """ + return self._wavelength + + @property + def pixelscale(self): + """Physical sampling of wavefront + + Returns + ------- + tuple of floats + """ + return self._pixelscale + @property def ptype(self): + """Wavefront plane type + + Returns + ------- + ptype object + """ return self._ptype @ptype.setter @@ -78,7 +103,12 @@ def ptype(self, value): @property def field(self): - """Wavefront complex field""" + """Wavefront complex field + + Returns + ------- + ndarray + """ out = np.zeros(self.shape, dtype=complex) for field in self.data: out = lentil.field.insert(field, out) @@ -86,7 +116,12 @@ def field(self): @property def intensity(self): - """Wavefront intensity""" + """Wavefront intensity + + Returns + ------- + ndarray + """ out = np.zeros(self.shape, dtype=float) for field in lentil.field.reduce(self.data): out = lentil.field.insert(field, out, intensity=True) @@ -95,14 +130,20 @@ def intensity(self): @classmethod def empty(cls, wavelength, pixelscale=None, diameter=None, focal_length=None, tilt=None, shape=None, ptype=None): + """Create an empty Wavefront + + The resulting wavefront will have an empty :attr:`data` attribute. + + Parameters + ---------- + + """ w = cls(wavelength=wavelength, pixelscale=pixelscale, diameter=diameter, focal_length=focal_length, tilt=tilt, ptype=ptype) w.data = [] w.shape = () if shape is None else shape return w - - def copy(self): - return copy.deepcopy(self) + def insert(self, out, weight=1): """Directly insert wavefront intensity data into an output array.