From fc88f7bbb3cd8110d5fe87100a31f57a49765995 Mon Sep 17 00:00:00 2001 From: teald Date: Tue, 2 Jan 2024 23:23:18 +0000 Subject: [PATCH] deploy: 2f0ead573fe53b3ca914951ae795b22f76749eab --- .buildinfo | 4 + .doctrees/api/astrodata.AstroData.doctree | Bin 0 -> 174856 bytes .../api/astrodata.AstroDataError.doctree | Bin 0 -> 11484 bytes .../api/astrodata.AstroDataMixin.doctree | Bin 0 -> 25864 bytes .doctrees/api/astrodata.NDAstroData.doctree | Bin 0 -> 61592 bytes .doctrees/api/astrodata.Section.doctree | Bin 0 -> 45119 bytes .doctrees/api/astrodata.TagSet.doctree | Bin 0 -> 27471 bytes .../api/astrodata.add_header_to_table.doctree | Bin 0 -> 11576 bytes .../astrodata.astro_data_descriptor.doctree | Bin 0 -> 14152 bytes .../api/astrodata.astro_data_tag.doctree | Bin 0 -> 13968 bytes .doctrees/api/astrodata.create.doctree | Bin 0 -> 12691 bytes .doctrees/api/astrodata.from_file.doctree | Bin 0 -> 12750 bytes .doctrees/api/astrodata.open.doctree | Bin 0 -> 12470 bytes .doctrees/api/astrodata.returns_list.doctree | Bin 0 -> 13558 bytes .doctrees/api/astrodata.version.doctree | Bin 0 -> 13304 bytes .doctrees/api_short.doctree | Bin 0 -> 34304 bytes .doctrees/environment.pickle | Bin 0 -> 3972970 bytes .doctrees/index.doctree | Bin 0 -> 11706 bytes .../manuals/appendix_descriptors.doctree | Bin 0 -> 77587 bytes .doctrees/manuals/cheatsheet.doctree | Bin 0 -> 56440 bytes .doctrees/manuals/full_api.doctree | Bin 0 -> 10136 bytes .doctrees/manuals/index.doctree | Bin 0 -> 15146 bytes .doctrees/manuals/progmanual/adclass.doctree | Bin 0 -> 86388 bytes .../manuals/progmanual/containers.doctree | Bin 0 -> 29843 bytes .../manuals/progmanual/descriptors.doctree | Bin 0 -> 23220 bytes .doctrees/manuals/progmanual/design.doctree | Bin 0 -> 24326 bytes .doctrees/manuals/progmanual/index.doctree | Bin 0 -> 10946 bytes .doctrees/manuals/progmanual/intro.doctree | Bin 0 -> 17852 bytes .doctrees/manuals/progmanual/tags.doctree | Bin 0 -> 41582 bytes .doctrees/manuals/usermanual/data.doctree | Bin 0 -> 108396 bytes .doctrees/manuals/usermanual/headers.doctree | Bin 0 -> 47224 bytes .doctrees/manuals/usermanual/index.doctree | Bin 0 -> 10911 bytes .doctrees/manuals/usermanual/intro.doctree | Bin 0 -> 56813 bytes .doctrees/manuals/usermanual/iomef.doctree | Bin 0 -> 88494 bytes .../manuals/usermanual/structure.doctree | Bin 0 -> 46541 bytes .doctrees/manuals/usermanual/tables.doctree | Bin 0 -> 33157 bytes .doctrees/manuals/usermanual/tags.doctree | Bin 0 -> 33703 bytes .nojekyll | 0 _modules/astrodata.html | 198 ++ _modules/astrodata/_version.html | 137 ++ _modules/astrodata/core.html | 1624 +++++++++++++++++ _modules/astrodata/factory.html | 350 ++++ _modules/astrodata/fits.html | 1301 +++++++++++++ _modules/astrodata/nddata.html | 780 ++++++++ _modules/astrodata/utils.html | 608 ++++++ _modules/index.html | 106 ++ _sources/api/astrodata.AstroData.rst.txt | 101 + _sources/api/astrodata.AstroDataError.rst.txt | 6 + _sources/api/astrodata.AstroDataMixin.rst.txt | 23 + _sources/api/astrodata.NDAstroData.rst.txt | 39 + _sources/api/astrodata.Section.rst.txt | 45 + _sources/api/astrodata.TagSet.rst.txt | 7 + .../api/astrodata.add_header_to_table.rst.txt | 6 + .../astrodata.astro_data_descriptor.rst.txt | 6 + _sources/api/astrodata.astro_data_tag.rst.txt | 6 + _sources/api/astrodata.create.rst.txt | 6 + _sources/api/astrodata.from_file.rst.txt | 6 + _sources/api/astrodata.open.rst.txt | 6 + _sources/api/astrodata.returns_list.rst.txt | 6 + _sources/api/astrodata.version.rst.txt | 6 + _sources/api_short.rst.txt | 13 + _sources/index.rst.txt | 19 + _sources/manuals/appendix_descriptors.rst.txt | 246 +++ _sources/manuals/cheatsheet.rst.txt | 463 +++++ _sources/manuals/full_api.rst.txt | 8 + _sources/manuals/index.rst.txt | 55 + _sources/manuals/progmanual/adclass.rst.txt | 397 ++++ .../manuals/progmanual/containers.rst.txt | 96 + .../manuals/progmanual/descriptors.rst.txt | 65 + _sources/manuals/progmanual/design.rst.txt | 82 + _sources/manuals/progmanual/index.rst.txt | 22 + _sources/manuals/progmanual/intro.rst.txt | 45 + _sources/manuals/progmanual/tags.rst.txt | 160 ++ _sources/manuals/usermanual/data.rst.txt | 903 +++++++++ _sources/manuals/usermanual/headers.rst.txt | 302 +++ _sources/manuals/usermanual/index.rst.txt | 23 + _sources/manuals/usermanual/intro.rst.txt | 225 +++ _sources/manuals/usermanual/iomef.rst.txt | 546 ++++++ _sources/manuals/usermanual/structure.rst.txt | 190 ++ _sources/manuals/usermanual/tables.rst.txt | 228 +++ _sources/manuals/usermanual/tags.rst.txt | 172 ++ _static/alabaster.css | 703 +++++++ _static/basic.css | 925 ++++++++++ _static/custom.css | 1 + _static/doctools.js | 156 ++ _static/documentation_options.js | 13 + _static/file.png | Bin 0 -> 286 bytes _static/graphviz.css | 19 + _static/language_data.js | 199 ++ _static/minus.png | Bin 0 -> 90 bytes _static/plus.png | Bin 0 -> 90 bytes _static/pygments.css | 84 + _static/searchtools.js | 574 ++++++ _static/sphinx_highlight.js | 154 ++ api/astrodata.AstroData.html | 700 +++++++ api/astrodata.AstroDataError.html | 117 ++ api/astrodata.AstroDataMixin.html | 175 ++ api/astrodata.NDAstroData.html | 313 ++++ api/astrodata.Section.html | 231 +++ api/astrodata.TagSet.html | 207 +++ api/astrodata.add_header_to_table.html | 117 ++ api/astrodata.astro_data_descriptor.html | 129 ++ api/astrodata.astro_data_tag.html | 130 ++ api/astrodata.create.html | 119 ++ api/astrodata.from_file.html | 119 ++ api/astrodata.open.html | 118 ++ api/astrodata.returns_list.html | 129 ++ api/astrodata.version.html | 126 ++ api_short.html | 178 ++ genindex.html | 461 +++++ index.html | 123 ++ manuals/appendix_descriptors.html | 532 ++++++ manuals/cheatsheet.html | 535 ++++++ manuals/full_api.html | 111 ++ manuals/index.html | 128 ++ manuals/progmanual/adclass.html | 471 +++++ manuals/progmanual/containers.html | 189 ++ manuals/progmanual/descriptors.html | 168 ++ manuals/progmanual/design.html | 187 ++ manuals/progmanual/index.html | 129 ++ manuals/progmanual/intro.html | 155 ++ manuals/progmanual/tags.html | 267 +++ manuals/usermanual/data.html | 964 ++++++++++ manuals/usermanual/headers.html | 379 ++++ manuals/usermanual/index.html | 176 ++ manuals/usermanual/intro.html | 331 ++++ manuals/usermanual/iomef.html | 606 ++++++ manuals/usermanual/structure.html | 278 +++ manuals/usermanual/tables.html | 315 ++++ manuals/usermanual/tags.html | 264 +++ objects.inv | Bin 0 -> 1804 bytes py-modindex.html | 122 ++ search.html | 123 ++ searchindex.js | 1 + 134 files changed, 22388 insertions(+) create mode 100644 .buildinfo create mode 100644 .doctrees/api/astrodata.AstroData.doctree create mode 100644 .doctrees/api/astrodata.AstroDataError.doctree create mode 100644 .doctrees/api/astrodata.AstroDataMixin.doctree create mode 100644 .doctrees/api/astrodata.NDAstroData.doctree create mode 100644 .doctrees/api/astrodata.Section.doctree create mode 100644 .doctrees/api/astrodata.TagSet.doctree create mode 100644 .doctrees/api/astrodata.add_header_to_table.doctree create mode 100644 .doctrees/api/astrodata.astro_data_descriptor.doctree create mode 100644 .doctrees/api/astrodata.astro_data_tag.doctree create mode 100644 .doctrees/api/astrodata.create.doctree create mode 100644 .doctrees/api/astrodata.from_file.doctree create mode 100644 .doctrees/api/astrodata.open.doctree create mode 100644 .doctrees/api/astrodata.returns_list.doctree create mode 100644 .doctrees/api/astrodata.version.doctree create mode 100644 .doctrees/api_short.doctree create mode 100644 .doctrees/environment.pickle create mode 100644 .doctrees/index.doctree create mode 100644 .doctrees/manuals/appendix_descriptors.doctree create mode 100644 .doctrees/manuals/cheatsheet.doctree create mode 100644 .doctrees/manuals/full_api.doctree create mode 100644 .doctrees/manuals/index.doctree create mode 100644 .doctrees/manuals/progmanual/adclass.doctree create mode 100644 .doctrees/manuals/progmanual/containers.doctree create mode 100644 .doctrees/manuals/progmanual/descriptors.doctree create mode 100644 .doctrees/manuals/progmanual/design.doctree create mode 100644 .doctrees/manuals/progmanual/index.doctree create mode 100644 .doctrees/manuals/progmanual/intro.doctree create mode 100644 .doctrees/manuals/progmanual/tags.doctree create mode 100644 .doctrees/manuals/usermanual/data.doctree create mode 100644 .doctrees/manuals/usermanual/headers.doctree create mode 100644 .doctrees/manuals/usermanual/index.doctree create mode 100644 .doctrees/manuals/usermanual/intro.doctree create mode 100644 .doctrees/manuals/usermanual/iomef.doctree create mode 100644 .doctrees/manuals/usermanual/structure.doctree create mode 100644 .doctrees/manuals/usermanual/tables.doctree create mode 100644 .doctrees/manuals/usermanual/tags.doctree create mode 100644 .nojekyll create mode 100644 _modules/astrodata.html create mode 100644 _modules/astrodata/_version.html create mode 100644 _modules/astrodata/core.html create mode 100644 _modules/astrodata/factory.html create mode 100644 _modules/astrodata/fits.html create mode 100644 _modules/astrodata/nddata.html create mode 100644 _modules/astrodata/utils.html create mode 100644 _modules/index.html create mode 100644 _sources/api/astrodata.AstroData.rst.txt create mode 100644 _sources/api/astrodata.AstroDataError.rst.txt create mode 100644 _sources/api/astrodata.AstroDataMixin.rst.txt create mode 100644 _sources/api/astrodata.NDAstroData.rst.txt create mode 100644 _sources/api/astrodata.Section.rst.txt create mode 100644 _sources/api/astrodata.TagSet.rst.txt create mode 100644 _sources/api/astrodata.add_header_to_table.rst.txt create mode 100644 _sources/api/astrodata.astro_data_descriptor.rst.txt create mode 100644 _sources/api/astrodata.astro_data_tag.rst.txt create mode 100644 _sources/api/astrodata.create.rst.txt create mode 100644 _sources/api/astrodata.from_file.rst.txt create mode 100644 _sources/api/astrodata.open.rst.txt create mode 100644 _sources/api/astrodata.returns_list.rst.txt create mode 100644 _sources/api/astrodata.version.rst.txt create mode 100644 _sources/api_short.rst.txt create mode 100644 _sources/index.rst.txt create mode 100644 _sources/manuals/appendix_descriptors.rst.txt create mode 100644 _sources/manuals/cheatsheet.rst.txt create mode 100644 _sources/manuals/full_api.rst.txt create mode 100644 _sources/manuals/index.rst.txt create mode 100644 _sources/manuals/progmanual/adclass.rst.txt create mode 100644 _sources/manuals/progmanual/containers.rst.txt create mode 100644 _sources/manuals/progmanual/descriptors.rst.txt create mode 100644 _sources/manuals/progmanual/design.rst.txt create mode 100644 _sources/manuals/progmanual/index.rst.txt create mode 100644 _sources/manuals/progmanual/intro.rst.txt create mode 100644 _sources/manuals/progmanual/tags.rst.txt create mode 100644 _sources/manuals/usermanual/data.rst.txt create mode 100644 _sources/manuals/usermanual/headers.rst.txt create mode 100644 _sources/manuals/usermanual/index.rst.txt create mode 100644 _sources/manuals/usermanual/intro.rst.txt create mode 100644 _sources/manuals/usermanual/iomef.rst.txt create mode 100644 _sources/manuals/usermanual/structure.rst.txt create mode 100644 _sources/manuals/usermanual/tables.rst.txt create mode 100644 _sources/manuals/usermanual/tags.rst.txt create mode 100644 _static/alabaster.css create mode 100644 _static/basic.css create mode 100644 _static/custom.css create mode 100644 _static/doctools.js create mode 100644 _static/documentation_options.js create mode 100644 _static/file.png create mode 100644 _static/graphviz.css create mode 100644 _static/language_data.js create mode 100644 _static/minus.png create mode 100644 _static/plus.png create mode 100644 _static/pygments.css create mode 100644 _static/searchtools.js create mode 100644 _static/sphinx_highlight.js create mode 100644 api/astrodata.AstroData.html create mode 100644 api/astrodata.AstroDataError.html create mode 100644 api/astrodata.AstroDataMixin.html create mode 100644 api/astrodata.NDAstroData.html create mode 100644 api/astrodata.Section.html create mode 100644 api/astrodata.TagSet.html create mode 100644 api/astrodata.add_header_to_table.html create mode 100644 api/astrodata.astro_data_descriptor.html create mode 100644 api/astrodata.astro_data_tag.html create mode 100644 api/astrodata.create.html create mode 100644 api/astrodata.from_file.html create mode 100644 api/astrodata.open.html create mode 100644 api/astrodata.returns_list.html create mode 100644 api/astrodata.version.html create mode 100644 api_short.html create mode 100644 genindex.html create mode 100644 index.html create mode 100644 manuals/appendix_descriptors.html create mode 100644 manuals/cheatsheet.html create mode 100644 manuals/full_api.html create mode 100644 manuals/index.html create mode 100644 manuals/progmanual/adclass.html create mode 100644 manuals/progmanual/containers.html create mode 100644 manuals/progmanual/descriptors.html create mode 100644 manuals/progmanual/design.html create mode 100644 manuals/progmanual/index.html create mode 100644 manuals/progmanual/intro.html create mode 100644 manuals/progmanual/tags.html create mode 100644 manuals/usermanual/data.html create mode 100644 manuals/usermanual/headers.html create mode 100644 manuals/usermanual/index.html create mode 100644 manuals/usermanual/intro.html create mode 100644 manuals/usermanual/iomef.html create mode 100644 manuals/usermanual/structure.html create mode 100644 manuals/usermanual/tables.html create mode 100644 manuals/usermanual/tags.html create mode 100644 objects.inv create mode 100644 py-modindex.html create mode 100644 search.html create mode 100644 searchindex.js diff --git a/.buildinfo b/.buildinfo new file mode 100644 index 00000000..058fdd1b --- /dev/null +++ b/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. +config: b922d7da3a1aaca6704d4e9ce9e416ce +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/.doctrees/api/astrodata.AstroData.doctree b/.doctrees/api/astrodata.AstroData.doctree new file mode 100644 index 0000000000000000000000000000000000000000..28ab563dd161fcaa6cc041863b40b2e03c11fa23 GIT binary patch literal 174856 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

oCZrp-${6QEZZ z?|SN>5H&rK$B1Z7J^2b771H}BHD8_^axP`cnw(idire*Z1#}|F4I(%(_Rhh#j7UWC z^iI^^j+!F3nVi$RJ<5Vl^T-3)MDvwy=2HtbQv&IBWSS?VJaG!bl_)!eSR-6FdR5{` z5Bg%^_`2T4T>RABaEk~lGJ9WfYiiz7_=>3b{i4o zsGcnYf|`fn<0d)-aX`x@HF9r-_@#CBXB@S+fvQl<&#U927I$xjY_KQN=ln4Lq$Ozu zjht*{ktwVopOq>Fe+0DX7n;rQjCoTy(C2N)nlsSn!{J&&;Rv!8D;!}N&COM-#1Gw~ zPlxO3BN#!DkPbiIK%X}Y?pQKgAzI|-sx$cVAqi9gtZB8p)c`Clm&Ay1&lId{-F!wZ`70xqodPBc1) z;z*D{3f-SZK)Y#W*~5)%m5T-H<7G4f$1axSgJa3Xo$L+LgEv*%2t0-<9`9!|Uuia7 zQ;1D+`tU5uv_bU<8Z+i;ZRfdagsXUbxvq_j1w@*2ux|z-%Q(?uq*d+KX}xWxgYXs! z#@2j8kCjMhJCO2bew|1`Yc^GEhZ{Gsp+yQy5ci~ zvf~L5A%(NzBN&p?Wz*}Yb&}=o1k*Y#L@)3tfyYPH>rU{derkU`GUc9Jz7mNGtoXbI z$+LOux@;1<=9zqY(wraeSVqT4WY(uy-~{Km2kHarSH+Q&&V*Q2h8Ek5CaR_8WTpai_pYAR*KE)fWM@yak2rT!Xk zbi=<@gr#al>IrTQl*o27)9d_*6?8NIhf`EK5D}9lX8nlCN>6HHR#dQG{TIp(^{bdA z)=FxEBc6WcNpk`ERhG!L2;Bm5>F)o|;8j9*!=*}(=gm1vm5w5^1adlxcIGHmI*OF> zQ^--IY)oyKcpOEnF9AmpeHV_R=ROTjyt9m-=EG4GX1?@yy&LbDgS6D1qmxkhglLK@pm+H*X|Qx2lU zetF5gbM@`_&XFEINM)?AFO`j(6OCIE(w^Qxr#aIeugyi2x_1W7)|~#oU0pqF97PmP zO#E~Hx!4X)0|ms}r1H|JXj`NYar4%}HkY-cn!`6Kt4 z*kM992TIfb%87IVS%y$q4SuI;3O0>FkKiojq1cMDs=>s^i=9 zF!q8SL-245-GoHq2)fF>m3U8Un?Yp?u}`uiG1O}&sp7<|%eNod4&tm9fgj|zO9X0i};q}$5zo@vyUHjVyh z*n>AU@SW+F^gCL$gOwlWk_Gi>S$cECK36b|FzQofa22CfUqVagXkt*FybWDU<19Ar z((JNrc4S9DE)rqhVXcg$YzAmPjl-T)#&q=aYil6u)y}R_MZQ{;?KNi?SkgBDB?Yt6 z!zo}yCO}^~`|NWNX|rsF2iTLc&;DGGJ>3_zc1xD4u{14T2YkSqGFghs8pyx_LyC-Y z>l1bfYMF_?h4wojbO(y>_Ux?QMcDX`P;pzO_=5@`LGU3oep+V;^%ieeKFi2Wd(2c-L!M$Ob^Vp zeeKrv>?1PYcGx&=Cu)xZ6NWa%c@)DwjHvVA``*o=QBW-d7YiPdYse%AI#cT~Rk$EOxp`0F)b;==i+AGOsoQo6M>zJ%IrYGfcctUhLpx@I zHjLW&j@SiXPEg%wT_M6yXpX*nUC#AQJmq{>?N|u63dQ!_wM@a8JKte`m1MdYh+l(0 zdv3?^y@IFpI^TWxT9{_Lis7le6reS9^5D^kLoZ-ldt0iGc^!pDS##{s7Z5g{SmC45a7IR%&?Tqe9u_=<3! zaCi|gM)-^HH{sqA;2XmH6Mz$h-6sL>5$>M`d`tM_4B$_~OXmO^gf9vA2*;NJi-eB| zpAfE`2fRu6?kT|cgmX^=E)cF?0Nfz(km`hoSo{3T36nG@Ol*}f@m0bs7YVaqB-}fg zaBpG47r_Z%6jyd;&|mq{oe5)jJz5}!zou|z>XoZ4b&yh*gLi^|%QlO&?*e_%M-LGD zr5i&W8@*cnL-RxYvB)S5S2YU5eBO&hXutkc-!9bM=31lfyOu literal 0 HcmV?d00001 diff --git a/.doctrees/api/astrodata.AstroDataError.doctree b/.doctrees/api/astrodata.AstroDataError.doctree new file mode 100644 index 0000000000000000000000000000000000000000..2a6487d1bcc6f72dff06da32aab5b88b1e3914f7 GIT binary patch literal 11484 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 literal 0 HcmV?d00001 diff --git a/.doctrees/api/astrodata.AstroDataMixin.doctree b/.doctrees/api/astrodata.AstroDataMixin.doctree new file mode 100644 index 0000000000000000000000000000000000000000..31c9f706c6774109552e8a870916e5f157e8c626 GIT binary patch literal 25864 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 literal 0 HcmV?d00001 diff --git a/.doctrees/api/astrodata.NDAstroData.doctree b/.doctrees/api/astrodata.NDAstroData.doctree new file mode 100644 index 0000000000000000000000000000000000000000..b05ab590c2756bfc368ad3523708ecc70607a9d1 GIT binary patch literal 61592 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 ~20Sv1pySi-G@DD6JM5kDG{H-qTIrK{R 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∪e{o+9P9wW1MS z_)qy)#fop2@k0LnGGWDkCR*4A!>Ciq$h2irvNv&^OR`#A7?SK}ms2Fe)msjdb5W$w zCHwHTFwG%l##1Q;%CuzJ)2x&vk`Q2nTm&+{N?#1Ufuu7Ps%Q5lcvAO8{6wNn#c~$` zB3W@a;@9v2kgS(`2pM&i5&A@|>6Rk_Of1HYye&Bh~YQ)^IYA?Q+ zmA?ytd?|eut_N{hI5B8dL}?oGmX{01T`68Eilx1*IDX$tY_iWGwOY=C6&NTzpfg3% G>--OLY8`q2 literal 0 HcmV?d00001 diff --git a/.doctrees/api/astrodata.astro_data_tag.doctree b/.doctrees/api/astrodata.astro_data_tag.doctree new file mode 100644 index 0000000000000000000000000000000000000000..7cbf67567a157f4397aadc88346be442c67749a9 GIT binary patch literal 13968 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 CQXkX+ literal 0 HcmV?d00001 diff --git a/.doctrees/api/astrodata.from_file.doctree b/.doctrees/api/astrodata.from_file.doctree new file mode 100644 index 0000000000000000000000000000000000000000..ca1ca6d8b82f9c70716b882d517fa7667aca4426 GIT binary patch literal 12750 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 literal 0 HcmV?d00001 diff --git a/.doctrees/api/astrodata.returns_list.doctree b/.doctrees/api/astrodata.returns_list.doctree new file mode 100644 index 0000000000000000000000000000000000000000..4a60dda564a4b014fbfd0935ac54bb2e53251abf GIT binary patch literal 13558 zcmdU0>yISYRiB-i?wRhHoqgDAukA6Z^{&|&In!+$D+v=Tka#hmVMn&JSP>$st**Y^ zw`!`ZntII62pijwL|*0c$rbT|PZ3s#LO?=D2qE!_hY&=G07U^lAYS4Ne?UZp5WjP8 zJ#KYZPtVSR1go9ys(a75_nz}R=RVH4{chtc|Nhc~{3k9%WA6Az9jo8>gFcH=vDy#p zWW@Y9{UF_bFMT`R60Oj>7X?XZvs5gA!sd?G51F5S9+ewJA3I*u$r^Y(N_tW3#3&4W zv(E;O@6cn>9&d<`bvnjdpN`@%xMjuGTSmyno@KM$U1QhwtSH*O`%4zp_EFm@=7hBc zAa$JbtDuZXqB|M#yYy2`g<8R`3=dkAZqajZ3VdgdL4N z$9CfMz9hJ3g+3lz)@VRS!UF}j}!!yr7Z(~6NAKW(zyBceSU+ir~>E~e{RZBbdX5}WC?Ff zGU`NyCGeLkaNm6pxcO)H`78VUmbhAjsFEmyRpPOPK}|_RgPPJqEu6$Y56;`pk>j5h zPD%V=aOx~2obOD*Dd{vg-+OpC-#!bRU;ZD1Q%R)5xePpx>jtI4skmz4B=%`IcgZ{V zZxwzq2TP4|3doPt_~kTxiQ+dh6xTE&4Z?3eJcM7b(^fun&GN|KKNEykN{`gV(eY~l zfDh|NBq|!H1&?^A!F!Rw`z*6*ou30-Ml}W6Q#GJfX-mMqn*p|x5oln2@8QAvn>y9Z z1M8p81lFYztXvcws3w&Cox0J8Lh@RWh;JIC=Lw`c*6_0|o`aDhnu6%b8i*>S1w!t^ zxrK!cq^2S%F>)8F@}XC`|Eg2W9GKj7bbThIE|y4T^5{UVK;b{A8;{7Puf>Vjrg6GW zILYoz+W%q;9oeBXjwiM&gT%Kh`{Y`dDG;}IABeGp^tlq!$7{RV+SV}MIUU9;*z?kO zQl{@wNVV9=xZ7x?POI}!{&*GTW!b~*&1qZ?2G{lH49JTm)2SV z8mh5^ADgg(*cw*6_9PTRJB9nT6LBv&O2FSF27hfwKmy z=Lo9+0f&>3B8n-T9-qcZqbpJRCc&UkY7#*Oqu-&*hsEd{Gc+;}qdx%OSuj%0A;UK$ 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 literal 0 HcmV?d00001 diff --git a/.doctrees/api/astrodata.version.doctree b/.doctrees/api/astrodata.version.doctree new file mode 100644 index 0000000000000000000000000000000000000000..688e9b748275cc9b62dab590148196036095d0ad GIT binary patch literal 13304 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 literal 0 HcmV?d00001 diff --git a/.doctrees/environment.pickle b/.doctrees/environment.pickle new file mode 100644 index 0000000000000000000000000000000000000000..94c1b64896cc917364a028004f0a722314d66045 GIT binary patch literal 3972970 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%0D{Jot?_qBj1-K0F$}&k;bekut?`S}W9@<%tVLc5 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

5TTd=HC%|t|!k_4~$Ft981^mNK)uugd*`bx+ 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 z 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ř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%0DO)g~aA)r4*Qu%; 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 literal 0 HcmV?d00001 diff --git a/.doctrees/index.doctree b/.doctrees/index.doctree new file mode 100644 index 0000000000000000000000000000000000000000..3d23fee671f6bb435d3f3a5d5418caf88a21e6e0 GIT binary patch literal 11706 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 GSpGk6m#oJC literal 0 HcmV?d00001 diff --git a/.doctrees/manuals/appendix_descriptors.doctree b/.doctrees/manuals/appendix_descriptors.doctree new file mode 100644 index 0000000000000000000000000000000000000000..413bbb94188abceeccf3a75fb532f93bde3744fb GIT binary patch literal 77587 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 AcK`qY literal 0 HcmV?d00001 diff --git a/.doctrees/manuals/cheatsheet.doctree b/.doctrees/manuals/cheatsheet.doctree new file mode 100644 index 0000000000000000000000000000000000000000..e3a78abdd52ccd2dc6e8b5f7f852974fc6f0954a GIT binary patch literal 56440 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 aX3Hs>$1T&8Dwd)cgf~~GC|r3l{(k{??iNx2 literal 0 HcmV?d00001 diff --git a/.doctrees/manuals/full_api.doctree b/.doctrees/manuals/full_api.doctree new file mode 100644 index 0000000000000000000000000000000000000000..d51212ead99f3de597f849ee5f750c0bc35bc84b GIT binary patch literal 10136 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 literal 0 HcmV?d00001 diff --git a/.doctrees/manuals/progmanual/adclass.doctree b/.doctrees/manuals/progmanual/adclass.doctree new file mode 100644 index 0000000000000000000000000000000000000000..1fc1736bacf0f7b5ff49dec3f0d0d8a3a290c823 GIT binary patch literal 86388 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 Dg*;wn literal 0 HcmV?d00001 diff --git a/.doctrees/manuals/progmanual/containers.doctree b/.doctrees/manuals/progmanual/containers.doctree new file mode 100644 index 0000000000000000000000000000000000000000..12f23bcac2a8ba107699959e5f280630b03ab87a GIT binary patch literal 29843 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
$2!T+nT>Hvc)t&r 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 Kx>~|U^?w13zhtTa literal 0 HcmV?d00001 diff --git a/.doctrees/manuals/progmanual/descriptors.doctree b/.doctrees/manuals/progmanual/descriptors.doctree new file mode 100644 index 0000000000000000000000000000000000000000..9921e0ffdf596a4132029cacfb37358012071983 GIT binary patch literal 23220 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 L1fi>$EZ6@Jye%2h literal 0 HcmV?d00001 diff --git a/.doctrees/manuals/progmanual/index.doctree b/.doctrees/manuals/progmanual/index.doctree new file mode 100644 index 0000000000000000000000000000000000000000..70d3eed312a8271423d4c7bda52b0f1684c18100 GIT binary patch literal 10946 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 literal 0 HcmV?d00001 diff --git a/.doctrees/manuals/usermanual/data.doctree b/.doctrees/manuals/usermanual/data.doctree new file mode 100644 index 0000000000000000000000000000000000000000..ca2e27acb47e86ebbd4620e4a2b085639627f517 GIT binary patch literal 108396 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

@pDR(d^!NSNS8^5 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 NLiq4Wa<)r_{|_jWHhcg8 literal 0 HcmV?d00001 diff --git a/.doctrees/manuals/usermanual/iomef.doctree b/.doctrees/manuals/usermanual/iomef.doctree new file mode 100644 index 0000000000000000000000000000000000000000..9d6e1c0405932ac35c360a1d62b6f6477aa0f643 GIT binary patch literal 88494 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 TvUL+_vhk%YOkS?)Z1VpD2fRiC literal 0 HcmV?d00001 diff --git a/.doctrees/manuals/usermanual/structure.doctree b/.doctrees/manuals/usermanual/structure.doctree new file mode 100644 index 0000000000000000000000000000000000000000..270b7a810ca0ce6116f44a86b96e2812d9cbdafd GIT binary patch literal 46541 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 literal 0 HcmV?d00001 diff --git a/.doctrees/manuals/usermanual/tags.doctree b/.doctrees/manuals/usermanual/tags.doctree new file mode 100644 index 0000000000000000000000000000000000000000..8b286d6f12a3abc62c0dfb1d2831625e4853e496 GIT binary patch literal 33703 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 literal 0 HcmV?d00001 diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 00000000..e69de29b diff --git a/_modules/astrodata.html b/_modules/astrodata.html new file mode 100644 index 00000000..696f74b3 --- /dev/null +++ b/_modules/astrodata.html @@ -0,0 +1,198 @@ + + + + + + + astrodata — astrodata 3.2.0 documentation + + + + + + + + + + + + + + + + + +

+ + + + + + + \ No newline at end of file diff --git a/_modules/astrodata/_version.html b/_modules/astrodata/_version.html new file mode 100644 index 00000000..bdc4c758 --- /dev/null +++ b/_modules/astrodata/_version.html @@ -0,0 +1,137 @@ + + + + + + + astrodata._version — astrodata 3.2.0 documentation + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +

Source code for astrodata._version

+#!/usr/bin/env python
+"""
+Holds the DRAGONS version to be propagated throught all the DRAGONS package
+and to be used in the documentation.
+"""
+
+# --- Setup Version Here ---
+API = 3
+FEATURE = 2
+BUG = 0
+TAG = ""
+
+
+
+[docs] +def version(short=False, tag=TAG): + """ + Returns DRAGONS's version based on the api, + feature and bug numbers. + + Returns + ------- + str : formatted version + """ + + if short: + _version = "{:d}.{:d}".format(API, FEATURE) + + else: + _tag = "_{:s}".format(tag) if tag else "" + _version = "{:d}.{:d}.{:d}".format(API, FEATURE, BUG) + _tag + + return _version
+ +
+ +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/_modules/astrodata/core.html b/_modules/astrodata/core.html new file mode 100644 index 00000000..b5d6e8a5 --- /dev/null +++ b/_modules/astrodata/core.html @@ -0,0 +1,1624 @@ + + + + + + + astrodata.core — astrodata 3.2.0 documentation + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +

Source code for astrodata.core

+"""This is the core module of the AstroData package. It provides the
+`AstroData` class, which is the main interface to manipulate astronomical
+data sets.
+"""
+import inspect
+import logging
+import os
+import re
+import textwrap
+import warnings
+from collections import OrderedDict
+from contextlib import suppress
+from copy import deepcopy
+from functools import partial
+
+import numpy as np
+
+from astropy.io import fits
+from astropy.nddata import NDData
+from astropy.table import Table
+from astropy.utils import format_doc
+
+from .fits import (
+    DEFAULT_EXTENSION,
+    FitsHeaderCollection,
+    _process_table,
+    read_fits,
+    write_fits,
+)
+from .nddata import ADVarianceUncertainty
+from .nddata import NDAstroData as NDDataObject
+from .utils import (
+    assign_only_single_slice,
+    astro_data_descriptor,
+    deprecated,
+    normalize_indices,
+    returns_list,
+)
+
+NO_DEFAULT = object()
+
+
+_ARIT_DOC = """
+    Performs {name} by evaluating ``self {op} operand``.
+
+    Parameters
+    ----------
+    oper : number or object
+        The operand to perform the operation  ``self {op} operand``.
+
+    Returns
+    --------
+    `AstroData` instance
+"""
+
+
+
+[docs] +class AstroData: + """Base class for the AstroData software package. It provides an interface + to manipulate astronomical data sets. + + Parameters + ---------- + nddata : `astrodata.NDAstroData` or list of `astrodata.NDAstroData` + List of NDAstroData objects. + + tables : dict[name, `astropy.table.Table`] + Dict of table objects. + + phu : `astropy.io.fits.Header` + Primary header. + + indices : list of int + List of indices mapping the `astrodata.NDAstroData` objects that this + object will access to. This is used when slicing an object, then the + sliced AstroData will have the ``.nddata`` list from its parent and + access the sliced NDAstroData through this list of indices. + """ + + # Derived classes may provide their own __keyword_dict. Being a private + # variable, each class will preserve its own, and there's no risk of + # overriding the whole thing + __keyword_dict = { + "instrument": "INSTRUME", + "object": "OBJECT", + "telescope": "TELESCOP", + "ut_date": "DATE-OBS", + } + + def __init__( + self, nddata=None, tables=None, phu=None, indices=None, is_single=False + ): + if nddata is None: + nddata = [] + + # Check that nddata is either a single or iterable of NDAstroData + # objects + is_nddata = isinstance(nddata, NDDataObject) + + try: + is_nddata_iterable = isinstance(nddata[0], NDDataObject) + + except IndexError: + # Fall back on checking if it's a list or tuple---could be empty. + is_nddata_iterable = isinstance(nddata, (list, tuple)) + + if not (is_nddata or is_nddata_iterable): + raise TypeError( + f"nddata must be an NDAstroData object or a list of " + f"NDAstroData objects, not {type(nddata)} ({nddata})." + ) + + # If nddata is a single NDAstroData object, make it a list. + if not isinstance(nddata, (list, tuple)): + nddata = [nddata] + + # _all_nddatas contains all the extensions from the original file or + # object. And _indices is used to map extensions for sliced objects. + self._all_nddatas = nddata + self._indices = indices + + # TODO: Is there no way to know if this is a single frame without + # passing an arg? + self.is_single = is_single + + # If this data provider represents a single slice out of a whole + # dataset, return True. Otherwise, return False. + if tables is not None and not isinstance(tables, dict): + raise ValueError("tables must be a dict") + + self._tables = tables or {} + + self._phu = phu or fits.Header() + self._fixed_settable = { + "data", + "uncertainty", + "mask", + "variance", + "wcs", + "path", + "filename", + } + self._logger = logging.getLogger(__name__) + self._orig_filename = None + self._path = None + + def __deepcopy__(self, memo): + """Returns a new instance of this class. + + Parameters + ---------- + memo : dict + See the documentation on `deepcopy` for an explanation on how + this works. + + """ + obj = self.__class__() + + for attr in ("_phu", "_path", "_orig_filename", "_tables"): + obj.__dict__[attr] = deepcopy(self.__dict__[attr]) + + obj.__dict__["_all_nddatas"] = [deepcopy(nd) for nd in self._nddata] + return obj + + def _keyword_for(self, name): + """Returns the FITS keyword name associated to ``name``. + + Parameters + ---------- + name : str + The common "key" name for which we want to know the associated + FITS keyword. + + Returns + ------- + str + The desired keyword name. + + Raises + ------ + AttributeError + If there is no keyword for the specified ``name``. + + """ + for cls in self.__class__.mro(): + with suppress(AttributeError, KeyError): + # __keyword_dict is a mangled variable + return getattr(self, f"_{cls.__name__}__keyword_dict")[name] + + raise AttributeError(f"No match for '{name}'") + + def _process_tags(self): + """Return the tag set (as a set of str) for the current instance.""" + results = [] + # Calling inspect.getmembers on `self` would trigger all the + # properties (tags, phu, hdr, etc.), and that's undesirable. To + # prevent that, we'll inspect the *class*. + members = inspect.getmembers( + self.__class__, lambda x: hasattr(x, "tag_method") + ) + + for _, method in members: + ts = method(self) + if ts.add or ts.remove or ts.blocks: + results.append(ts) + + # Sort by the length of substractions... those that substract + # from others go first + results = sorted( + results, key=lambda x: len(x.remove) + len(x.blocks), reverse=True + ) + + # Sort by length of blocked_by, those that are never disabled go first + results = sorted(results, key=lambda x: len(x.blocked_by)) + + # Sort by length of if_present... those that need other tags to + # be present go last + results = sorted(results, key=lambda x: len(x.if_present)) + + tags = set() + removals = set() + blocked = set() + for plus, minus, blocked_by, blocks, is_present in results: + if is_present: + # If this TagSet requires other tags to be present, make + # sure that all of them are. Otherwise, skip... + if len(tags & is_present) != len(is_present): + continue + + allowed = (len(tags & blocked_by) + len(plus & blocked)) == 0 + if allowed: + # This set is not being blocked by others... + removals.update(minus) + tags.update(plus - removals) + blocked.update(blocks) + + return tags + + @staticmethod + def _matches_data(source): + # This one is trivial. Will be more specific for subclasses. + logging.debug("Using default _matches_data with %s", source) + return True + + @property + def path(self): + """Return the file path.""" + return self._path + + @path.setter + def path(self, value): + if self._path is None and value is not None: + self._orig_filename = os.path.basename(value) + self._path = value + + @property + def filename(self): + """Return the file name.""" + if self.path is not None: + return os.path.basename(self.path) + + return self.path + + @filename.setter + def filename(self, value): + if os.path.isabs(value): + raise ValueError("Cannot set the filename to an absolute path!") + + if self.path is None: + self.path = os.path.abspath(value) + + else: + dirname = os.path.dirname(self.path) + self.path = os.path.join(dirname, value) + + @property + def orig_filename(self): + """Return the original file name (before it was modified).""" + return self._orig_filename + + @orig_filename.setter + def orig_filename(self, value): + self._orig_filename = value + + @property + def phu(self): + """Return the primary header.""" + return self._phu + + @phu.setter + def phu(self, phu): + self._phu = phu + + @property + def hdr(self): + """Return all headers, as a `astrodata.fits.FitsHeaderCollection`.""" + if not self.nddata: + return None + headers = [nd.meta["header"] for nd in self._nddata] + return headers[0] if self.is_single else FitsHeaderCollection(headers) + + @property + @deprecated( + "Access to headers through this property is deprecated and " + "will be removed in the future. Use '.hdr' instead." + ) + def header(self): + """Deprecated header access. Use ``.hdr`` instead.""" + return [self.phu] + [ndd.meta["header"] for ndd in self._nddata] + + @property + def tags(self): + """A set of strings that represent the tags defining this instance.""" + return self._process_tags() + + @property + def descriptors(self): + """Returns a sequence of names for the methods that have been + decorated as descriptors. + + Returns + -------- + tuple of str + """ + members = inspect.getmembers( + self.__class__, lambda x: hasattr(x, "descriptor_method") + ) + return tuple(mname for (mname, method) in members) + + @property + def id(self): + """Returns the extension identifier (1-based extension number) + for sliced objects. + """ + if self.is_single: + return self._indices[0] + 1 + + raise ValueError( + "Cannot return id for an AstroData object " + "that is not a single slice" + ) + + @property + def indices(self): + """Returns the extensions indices for sliced objects.""" + return self._indices if self._indices else list(range(len(self))) + + @property + def is_sliced(self): + """If this data provider instance represents the whole dataset, return + False. If it represents a slice out of the whole, return True. + """ + return self._indices is not None + +
+[docs] + def is_settable(self, attr): + """Return True if the attribute is meant to be modified.""" + if self.is_sliced and attr in {"path", "filename"}: + return False + return attr in self._fixed_settable or attr.isupper()
+ + + @property + def _nddata(self): + """Return the list of `astrodata.NDAstroData` objects. Contrary to + ``self.nddata`` this always returns a list. + """ + if self._indices is not None: + return [self._all_nddatas[i] for i in self._indices] + + return self._all_nddatas + + @property + def nddata(self): + """Return the list of `astrodata.NDAstroData` objects. + + If the `AstroData` object is sliced, this returns only the NDData + objects of the sliced extensions. And if this is a single extension + object, the NDData object is returned directly (i.e. not a list). + """ + return self._nddata[0] if self.is_single else self._nddata + +
+[docs] + def table(self): + """Return a dictionary of `astropy.table.Table` objects. + + Notes + ----- + This returns a _copy_ of the tables, so modifying them will not + affect the original ones. + """ + # FIXME: do we need this in addition to .tables ? + return self._tables.copy()
+ + + @property + def tables(self): + """Return the names of the `astropy.table.Table` objects associated to + the top-level object. + """ + return set(self._tables) + + @property + def ext_tables(self): + """Return the names of the `astropy.table.Table` objects associated to + an extension. + """ + if not self.is_single: + raise AttributeError("this is only available for extensions") + + return set( + key + for key, obj in self.nddata.meta["other"].items() + if isinstance(obj, Table) + ) + + @property + @returns_list + def shape(self): + """Return the shape of the data array for each extension as a list of + shapes. + """ + return [nd.shape for nd in self._nddata] + + @property + @returns_list + def data(self): + """A list of the arrays (or single array, if this is a single slice) + corresponding to the science data attached to each extension. + """ + return [nd.data for nd in self._nddata] + + @data.setter + @assign_only_single_slice + def data(self, value): + # Setting the ._data in the NDData is a bit kludgy, but we're all + # grown adults and know what we're doing, isn't it? + if hasattr(value, "shape"): + self.nddata._data = value + + else: + raise AttributeError( + "Trying to assign data to be something with no shape" + ) + + @property + @returns_list + def uncertainty(self): + """A list of the uncertainty objects (or a single object, if this is + a single slice) attached to the science data, for each extension. + + The objects are instances of AstroPy's `astropy.nddata.NDUncertainty`, + or `None` where no information is available. + + See also + -------- + variance : The actual array supporting the uncertainty object. + + """ + return [nd.uncertainty for nd in self._nddata] + + @uncertainty.setter + @assign_only_single_slice + def uncertainty(self, value): + self.nddata.uncertainty = value + + @property + @returns_list + def mask(self): + """A list of the mask arrays (or a single array, if this is a single + slice) attached to the science data, for each extension. + + For objects that miss a mask, `None` will be provided instead. + """ + return [nd.mask for nd in self._nddata] + + @mask.setter + @assign_only_single_slice + def mask(self, value): + self.nddata.mask = value + + @property + @returns_list + def variance(self): + """A list of the variance arrays (or a single array, if this is a + single slice) attached to the science data, for each extension. + + For objects that miss uncertainty information, `None` will be provided + instead. + + See also + --------- + uncertainty : The uncertainty objects used under the hood. + + """ + return [nd.variance for nd in self._nddata] + + @variance.setter + @assign_only_single_slice + def variance(self, value): + if value is None: + self.nddata.uncertainty = None + else: + self.nddata.uncertainty = ADVarianceUncertainty(value) + + @property + def wcs(self): + """Returns the list of WCS objects for each extension.""" + if self.is_single: + return self.nddata.wcs + + raise ValueError( + "Cannot return WCS for an AstroData object " + "that is not a single slice" + ) + + @wcs.setter + @assign_only_single_slice + def wcs(self, value): + self.nddata.wcs = value + + def __iter__(self): + if self.is_single: + yield self + else: + for n in range(len(self)): + yield self[n] + + def __getitem__(self, idx): + """Returns a sliced view of the instance. It supports the standard + Python indexing syntax. + + Parameters + ---------- + slice : int, `slice` + An integer or an instance of a Python standard `slice` object + + Raises + ------- + TypeError + If trying to slice an object when it doesn't make sense (e.g. + slicing a single slice) + + ValueError + If `slice` does not belong to one of the recognized types + + IndexError + If an index is out of range + """ + if self.is_single: + raise TypeError("Can't slice a single slice!") + + indices, _ = normalize_indices(idx, nitems=len(self)) + + if self._indices: + indices = [self._indices[i] for i in indices] + + is_single = not isinstance(idx, (tuple, slice)) + + obj = self.__class__( + self._all_nddatas, + tables=self._tables, + phu=self.phu, + indices=indices, + is_single=is_single, + ) + + obj._path = self.path + obj._orig_filename = self.orig_filename + + return obj + + def __delitem__(self, idx): + """Called to implement deletion of ``self[idx]``. Supports standard + Python syntax (including negative indices). + + Parameters + ---------- + idx : int + This index represents the order of the element that you want + to remove. + + Raises + ------- + IndexError + If `idx` is out of range. + """ + if self.is_sliced: + raise TypeError("Can't remove items from a sliced object") + del self._all_nddatas[idx] + + def __getattr__(self, attribute): + """Called when an attribute lookup has not found the attribute in the + usual places (not an instance attribute, and not in the class tree for + ``self``). + + Parameters + ---------- + attribute : str + The attribute's name. + + Raises + ------- + AttributeError + If the attribute could not be found/computed. + """ + # I we're working with single slices, let's look some things up + # in the ND object + if self.is_single and attribute.isupper(): + with suppress(KeyError): + return self.nddata.meta["other"][attribute] + + if attribute in self._tables: + return self._tables[attribute] + + raise AttributeError( + f"{self.__class__.__name__!r} object has no " + f"attribute {attribute!r}" + ) + + def __setattr__(self, attribute, value): + """Called when an attribute assignment is attempted, instead of the + normal mechanism. + + Parameters + ---------- + attribute : str + The attribute's name. + + value : object + The value to be assigned to the attribute. + """ + + def _my_attribute(attr): + return attr in self.__dict__ or attr in self.__class__.__dict__ + + if ( + attribute.isupper() + and self.is_settable(attribute) + and not _my_attribute(attribute) + ): + # This method is meant to let the user set certain attributes of + # the NDData objects. First we check if the attribute belongs to + # this object's dictionary. Otherwise, see if we can pass it down. + # + if self.is_sliced and not self.is_single: + raise TypeError( + "This attribute can only be " + "assigned to a single-slice object" + ) + + if attribute == DEFAULT_EXTENSION: + raise AttributeError( + f"{attribute} extensions should be " + "appended with .append" + ) + + if attribute in {"DQ", "VAR"}: + raise AttributeError( + f"{attribute} should be set on the " "nddata object" + ) + + add_to = self.nddata if self.is_single else None + self._append(value, name=attribute, add_to=add_to) + + return + + super().__setattr__(attribute, value) + + def __delattr__(self, attribute): + """Implements attribute removal.""" + if not attribute.isupper(): + super().__delattr__(attribute) + return + + if self.is_sliced: + if not self.is_single: + raise TypeError("Can't delete attributes on non-single slices") + + other = self.nddata.meta["other"] + if attribute in other: + del other[attribute] + else: + raise AttributeError( + f"{self.__class__.__name__!r} sliced " + "object has no attribute {attribute!r}" + ) + else: + if attribute in self._tables: + del self._tables[attribute] + else: + raise AttributeError( + f"'{attribute}' is not a global table " "for this instance" + ) + + def __contains__(self, attribute): + """Implements the ability to use the ``in`` operator with an + `AstroData` object. + + Parameters + ---------- + attribute : str + An attribute name. + + Returns + -------- + bool + """ + return attribute in self.exposed + + def __len__(self): + """Return the number of independent extensions stored by the object.""" + if self._indices is not None: + return len(self._indices) + + return len(self._all_nddatas) + + @property + def exposed(self): + """A collection of strings with the names of objects that can be + accessed directly by name as attributes of this instance, and that are + not part of its standard interface (i.e. data objects that have been + added dynamically). + + Examples + --------- + >>> ad[0].exposed # doctest: +SKIP + set(['OBJMASK', 'OBJCAT']) + + """ + exposed = set(self._tables) + if self.is_single: + exposed |= set(self.nddata.meta["other"]) + + return exposed + + def _pixel_info(self): + for idx, nd in enumerate(self._nddata): + other_objects = [] + uncer = nd.uncertainty + fixed = ( + ("variance", None if uncer is None else uncer), + ("mask", nd.mask), + ) + + for name, other in fixed + tuple(sorted(nd.meta["other"].items())): + if other is None: + continue + + if isinstance(other, Table): + other_objects.append( + { + "attr": name, + "type": "Table", + "dim": str((len(other), len(other.columns))), + "data_type": "n/a", + } + ) + + else: + dim = "" + if hasattr(other, "dtype"): + dt = other.dtype.name + dim = str(other.shape) + + elif hasattr(other, "data"): + dt = other.data.dtype.name + dim = str(other.data.shape) + + elif hasattr(other, "array"): + dt = other.array.dtype.name + dim = str(other.array.shape) + + else: + dt = "unknown" + + obj_dict = { + "attr": name, + "type": type(other).__name__, + "dim": dim, + "data_type": dt, + } + + other_objects.append(obj_dict) + + main_dict = { + "content": "science", + "type": type(nd).__name__, + "dim": str(nd.data.shape), + "data_type": nd.data.dtype.name, + } + + out_dict = { + "idx": f"[{idx:2}]", + "main": main_dict, + "other": other_objects, + } + + yield out_dict + +
+[docs] + def info(self): + """Prints out information about the contents of this instance.""" + + print(f"Filename: {self.path if self.path else 'Unknown'}") + # This is fixed. We don't support opening for update + # print("Mode: readonly") + + text = "Tags: " + " ".join(sorted(self.tags)) + textwrapper = textwrap.TextWrapper(width=80, subsequent_indent=" ") + for line in textwrapper.wrap(text): + print(line) + + if len(self) > 0: + main_fmt = "{:6} {:24} {:17} {:14} {}" + other_fmt = " .{:20} {:17} {:14} {}" + print("\nPixels Extensions") + print( + main_fmt.format( + "Index", "Content", "Type", "Dimensions", "Format" + ) + ) + for pi in self._pixel_info(): + main_obj = pi["main"] + print( + main_fmt.format( + pi["idx"], + main_obj["content"][:24], + main_obj["type"][:17], + main_obj["dim"], + main_obj["data_type"], + ) + ) + for other in pi["other"]: + print( + other_fmt.format( + other["attr"][:20], + other["type"][:17], + other["dim"], + other["data_type"], + ) + ) + + # NOTE: This covers tables, only. Study other cases before + # implementing a more general solution + if self._tables: + print("\nOther Extensions") + print(" Type Dimensions") + for name, table in sorted(self._tables.items()): + if isinstance(table, list): + # This is not a free floating table + continue + + print( + f".{name[:13]:13s} {'Table':11s} {len(table), len(table.columns)}" + )
+ + + def _oper(self, operator, operand): + ind = self.indices + ndd = self._all_nddatas + if isinstance(operand, AstroData): + if len(operand) != len(self): + raise ValueError("Operands are not the same size") + for n in range(len(self)): + try: + data = ( + operand.nddata + if operand.is_single + else operand.nddata[n] + ) + ndd[ind[n]] = operator(ndd[ind[n]], data) + except TypeError: + # This may happen if operand is a sliced, single + # AstroData object + ndd[ind[n]] = operator(ndd[ind[n]], operand.nddata) + op_table = operand.table() + ltab, rtab = set(self._tables), set(op_table) + for tab in rtab - ltab: + self._tables[tab] = op_table[tab] + + else: + for n in range(len(self)): + ndd[ind[n]] = operator(ndd[ind[n]], operand) + + def _standard_nddata_op(self, fn, operand): + return self._oper( + partial(fn, handle_mask=np.bitwise_or, handle_meta="first_found"), + operand, + ) + + @format_doc(_ARIT_DOC, name="addition", op="+") + def __add__(self, oper): + copy = deepcopy(self) + copy += oper + return copy + + @format_doc(_ARIT_DOC, name="subtraction", op="-") + def __sub__(self, oper): + copy = deepcopy(self) + copy -= oper + return copy + + @format_doc(_ARIT_DOC, name="multiplication", op="*") + def __mul__(self, oper): + copy = deepcopy(self) + copy *= oper + return copy + + @format_doc(_ARIT_DOC, name="division", op="/") + def __truediv__(self, oper): + copy = deepcopy(self) + copy /= oper + return copy + + @format_doc(_ARIT_DOC, name="inplace addition", op="+=") + def __iadd__(self, oper): + self._standard_nddata_op(NDDataObject.add, oper) + return self + + @format_doc(_ARIT_DOC, name="inplace subtraction", op="-=") + def __isub__(self, oper): + self._standard_nddata_op(NDDataObject.subtract, oper) + return self + + @format_doc(_ARIT_DOC, name="inplace multiplication", op="*=") + def __imul__(self, oper): + self._standard_nddata_op(NDDataObject.multiply, oper) + return self + + @format_doc(_ARIT_DOC, name="inplace division", op="/=") + def __itruediv__(self, oper): + self._standard_nddata_op(NDDataObject.divide, oper) + return self + + add = __iadd__ + subtract = __isub__ + multiply = __imul__ + divide = __itruediv__ + + __radd__ = __add__ + __rmul__ = __mul__ + + def __rsub__(self, oper): + copy = (deepcopy(self) - oper) * -1 + return copy + + def _rdiv(self, ndd, operand): + # Divide method works with the operand first + return NDDataObject.divide(operand, ndd) + + def __rtruediv__(self, oper): + obj = deepcopy(self) + obj._oper(obj._rdiv, oper) + return obj + + def _process_pixel_plane( + self, pixim, name=None, top_level=False, custom_header=None + ): + # Assume that we get an ImageHDU or something that can be + # turned into one + if isinstance(pixim, fits.ImageHDU): + nd = NDDataObject(pixim.data, meta={"header": pixim.header}) + elif isinstance(pixim, NDDataObject): + nd = pixim + else: + nd = NDDataObject(pixim) + + if custom_header is not None: + nd.meta["header"] = custom_header + + header = nd.meta.setdefault("header", fits.Header()) + currname = header.get("EXTNAME") + + if currname is None: + header["EXTNAME"] = name if name is not None else DEFAULT_EXTENSION + + if top_level: + nd.meta.setdefault("other", OrderedDict()) + + return nd + + def _append_array(self, data, name=None, header=None, add_to=None): + if name in {"DQ", "VAR"}: + raise ValueError( + f"'{name}' need to be associated to a " + f"'{DEFAULT_EXTENSION}' one" + ) + + if add_to is None: + # Top level extension + if name is not None: + hname = name + elif header is not None: + hname = header.get("EXTNAME", DEFAULT_EXTENSION) + else: + hname = DEFAULT_EXTENSION + + hdu = fits.ImageHDU(data, header=header) + hdu.header["EXTNAME"] = hname + ret = self._append_imagehdu( + hdu, name=hname, header=None, add_to=None + ) + else: + ret = add_to.meta["other"][name] = data + + return ret + + def _append_imagehdu(self, hdu, name, header, add_to): + if name in {"DQ", "VAR"} or add_to is not None: + return self._append_array(hdu.data, name=name, add_to=add_to) + + nd = self._process_pixel_plane( + hdu, name=name, top_level=True, custom_header=header + ) + return self._append_nddata(nd, name, add_to=None) + + def _append_raw_nddata(self, raw_nddata, name, header, add_to): + logging.debug("Appending data to nddata: %s", name) + + # We want to make sure that the instance we add is whatever we specify + # as NDDataObject, instead of the random one that the user may pass + top_level = add_to is None + + if not isinstance(raw_nddata, NDDataObject): + raw_nddata = NDDataObject(raw_nddata) + + processed_nddata = self._process_pixel_plane( + raw_nddata, top_level=top_level, custom_header=header + ) + return self._append_nddata(processed_nddata, name=name, add_to=add_to) + + def _append_nddata(self, new_nddata, name, add_to): + # NOTE: This method is only used by others that have constructed NDData + # according to our internal format. We don't accept new headers at this + # point, and that's why it's missing from the signature. 'name' is + # ignored. It's there just to comply with the _append_XXX signature. + if add_to is not None: + raise TypeError( + "You can only append NDData derived instances " + "at the top level" + ) + + hd = new_nddata.meta["header"] + hname = hd.get("EXTNAME", DEFAULT_EXTENSION) + + if hname == DEFAULT_EXTENSION: + self._all_nddatas.append(new_nddata) + + else: + raise ValueError( + f"Arbitrary image extensions can only be added " + f"in association to a '{DEFAULT_EXTENSION}'" + ) + + logging.debug("Appending data to nddata: %s", name) + + return new_nddata + + def _append_table(self, new_table, name, header, add_to): + tb = _process_table(new_table, name, header) + hname = tb.meta["header"].get("EXTNAME") + + def find_next_num(tables): + table_num = 1 + while f"TABLE{table_num}" in tables: + table_num += 1 + return f"TABLE{table_num}" + + if add_to is None: + # Find table names for all extensions + ext_tables = set() + for nd in self._nddata: + ext_tables |= set( + key + for key, obj in nd.meta["other"].items() + if isinstance(obj, Table) + ) + + if hname is None: + hname = find_next_num(set(self._tables) | ext_tables) + elif hname in ext_tables: + raise ValueError( + f"Cannot append table '{hname}' because it " + "would hide an extension table" + ) + + self._tables[hname] = tb + else: + if hname in self._tables: + raise ValueError( + f"Cannot append table '{hname}' because it " + "would hide a top-level table" + ) + + add_to.meta["other"][hname] = tb + + return tb + + def _append_astrodata(self, ad, name, header, add_to): + logging.debug("Appending astrodata object: %s", name) + + if not ad.is_single: + raise ValueError( + "Cannot append AstroData instances that are " + "not single slices" + ) + + if add_to is not None: + raise ValueError( + "Cannot append an AstroData slice to another slice" + ) + + new_nddata = deepcopy(ad.nddata) + if header is not None: + new_nddata.meta["header"] = deepcopy(header) + + return self._append_nddata(new_nddata, name=None, add_to=None) + + def _append(self, ext, name=None, header=None, add_to=None): + """ + Internal method to dispatch to the type specific methods. This is + called either by ``.append`` to append on top-level objects only or + by ``__setattr__``. In the second case ``name`` cannot be None, so + this is always the case when appending to extensions (add_to != None). + """ + dispatcher = ( + (NDData, self._append_raw_nddata), + ((Table, fits.TableHDU, fits.BinTableHDU), self._append_table), + (fits.ImageHDU, self._append_imagehdu), + (AstroData, self._append_astrodata), + ) + + for bases, method in dispatcher: + if isinstance(ext, bases): + return method(ext, name=name, header=header, add_to=add_to) + + # Assume that this is an array for a pixel plane + return self._append_array(ext, name=name, header=header, add_to=add_to) + +
+[docs] + def append(self, ext, name=None, header=None): + """ + Adds a new top-level extension. + + Parameters + ---------- + ext : array, `astropy.nddata.NDData`, `astropy.table.Table`, other + The contents for the new extension. The exact accepted types depend + on the class implementing this interface. Implementations specific + to certain data formats may accept specialized types (eg. a FITS + provider will accept an `astropy.io.fits.ImageHDU` and extract the + array out of it). + name : str, optional + A name that may be used to access the new object, as an attribute + of the provider. The name is typically ignored for top-level + (global) objects, and required for the others. If the name cannot + be derived from the metadata associated to ``ext``, you will + have to provider one. + It can consist in a combination of numbers and letters, with the + restriction that the letters have to be all capital, and the first + character cannot be a number ("[A-Z][A-Z0-9]*"). + + Returns + -------- + The same object, or a new one, if it was necessary to convert it to + a more suitable format for internal use. + + Raises + ------- + TypeError + If adding the object in an invalid situation (eg. ``name`` is + `None` when adding to a single slice). + ValueError + Raised if the extension is of a proper type, but its value is + illegal somehow. + + """ + if self.is_sliced: + raise TypeError( + "Can't append objects to slices, use " + "'ext.NAME = obj' instead" + ) + + # NOTE: Most probably, if we want to copy the input argument, we + # should do it here... + if isinstance(ext, fits.PrimaryHDU): + raise ValueError( + "Only one Primary HDU allowed. " + "Use .phu if you really need to set one" + ) + + if isinstance(ext, Table): + raise ValueError( + "Tables should be set directly as attribute, " + "i.e. 'ad.MYTABLE = table'" + ) + + if name is not None and not name.isupper(): + warnings.warn( + f"extension name '{name}' should be uppercase", UserWarning + ) + name = name.upper() + + return self._append(ext, name=name, header=header)
+ + +
+[docs] + @classmethod + def read(cls, source, extname_parser=None): + """Read from a file, file object, HDUList, etc.""" + return read_fits(cls, source, extname_parser=extname_parser)
+ + + load = read # for backward compatibility + +
+[docs] + def write(self, filename=None, overwrite=False): + """ + Write the object to disk. + + Parameters + ---------- + filename : str, optional + If the filename is not given, ``self.path`` is used. + overwrite : bool + If True, overwrites existing file. + + """ + if filename is None: + if self.path is None: + raise ValueError("A filename needs to be specified") + filename = self.path + + write_fits(self, filename, overwrite=overwrite)
+ + +
+[docs] + def operate(self, operator, *args, **kwargs): + """ + Applies a function to the main data array on each extension, replacing + the data with the result. The data will be passed as the first argument + to the function. + + It will be applied to the mask and variance of each extension, too, if + they exist. + + This is a convenience method, which is equivalent to:: + + for ext in ad: + ext.data = operator(ext.data, *args, **kwargs) + if ext.mask is not None: + ext.mask = operator(ext.mask, *args, **kwargs) + if ext.variance is not None: + ext.variance = operator(ext.variance, *args, **kwargs) + + with the additional advantage that it will work on single slices, too. + + Parameters + ---------- + operator : callable + A function that takes an array (and, maybe, other arguments) + and returns an array. + args, kwargs : optional + Additional arguments to be passed to the ``operator``. + + Examples + --------- + >>> import numpy as np + >>> ad.operate(np.squeeze) # doctest: +SKIP + + """ + # Ensure we can iterate, even on a single slice + for ext in [self] if self.is_single else self: + ext.data = operator(ext.data, *args, **kwargs) + if ext.mask is not None: + ext.mask = operator(ext.mask, *args, **kwargs) + if ext.variance is not None: + ext.variance = operator(ext.variance, *args, **kwargs)
+ + +
+[docs] + def reset(self, data, mask=NO_DEFAULT, variance=NO_DEFAULT, check=True): + """ + Sets the ``.data``, and optionally ``.mask`` and ``.variance`` + attributes of a single-extension AstroData slice. This function will + optionally check whether these attributes have the same shape. + + Parameters + ---------- + data : ndarray + The array to assign to the ``.data`` attribute ("SCI"). + mask : ndarray, optional + The array to assign to the ``.mask`` attribute ("DQ"). + variance: ndarray, optional + The array to assign to the ``.variance`` attribute ("VAR"). + check: bool + If set, then the function will check that the mask and variance + arrays have the same shape as the data array. + + Raises + ------- + TypeError + if an attempt is made to set the .mask or .variance attributes + with something other than an array + ValueError + if the .mask or .variance attributes don't have the same shape as + .data, OR if this is called on an AD instance that isn't a single + extension slice + + """ + if not self.is_single: + raise ValueError("Trying to reset a non-sliced AstroData object") + + # In case data is an NDData object + try: + self.data = data.data + except AttributeError: + self.data = data + # Set mask, with checking if required + try: + if mask.shape != self.data.shape and check: + raise ValueError("Mask shape incompatible with data shape") + + except AttributeError as err: + if mask is None: + self.mask = mask + + elif mask == NO_DEFAULT: + if hasattr(data, "mask"): + self.mask = data.mask + + else: + raise TypeError("Attempt to set mask inappropriately") from err + + else: + self.mask = mask + + # Set variance, with checking if required + try: + if variance.shape != self.data.shape and check: + raise ValueError("Variance shape incompatible with data shape") + + except AttributeError as err: + if variance is None: + self.uncertainty = None + + elif variance == NO_DEFAULT: + if hasattr(data, "uncertainty"): + self.uncertainty = data.uncertainty + + else: + raise TypeError( + "Attempt to set variance inappropriately" + ) from err + + else: + self.variance = variance + + if hasattr(data, "wcs"): + self.wcs = data.wcs
+ + +
+[docs] + def update_filename(self, prefix=None, suffix=None, strip=False): + """Update the "filename" attribute of the AstroData object. + + A prefix and/or suffix can be specified. If ``strip=True``, these will + replace the existing prefix/suffix; if ``strip=False``, they will + simply be prepended/appended. + + The current filename is broken down into its existing prefix, root, and + suffix using the ``ORIGNAME`` phu keyword, if it exists and is + contained within the current filename. Otherwise, the filename is split + at the last underscore and the part before is assigned as the root and + the underscore and part after the suffix. No prefix is assigned. + + Note that, if ``strip=True``, a prefix or suffix will only be stripped + if '' is specified. + + Parameters + ---------- + prefix: str, optional + New prefix (None => leave alone) + + suffix: str, optional + New suffix (None => leave alone) + + strip: bool, optional + Strip existing prefixes and suffixes if new ones are given? + + Raises + ------ + ValueError + If the filename cannot be determined + """ + if self.filename is None: + if "ORIGNAME" in self.phu: + self.filename = self.phu["ORIGNAME"] + else: + raise ValueError( + "A filename needs to be set before it can be updated" + ) + + # Set the ORIGNAME keyword if it's not there + if "ORIGNAME" not in self.phu: + self.phu.set( + "ORIGNAME", + self.orig_filename, + "Original filename prior to processing", + ) + + if strip: + root, filetype = os.path.splitext(self.phu["ORIGNAME"]) + filename, filetype = os.path.splitext(self.filename) + m = re.match(f"(.*){re.escape(root)}(.*)", filename) + + # Do not strip a prefix/suffix unless a new one is provided + if m: + if prefix is None: + prefix = m.groups()[0] + + existing_suffix = m.groups()[1] + + if "_" in existing_suffix: + last_underscore = existing_suffix.rfind("_") + root += existing_suffix[:last_underscore] + existing_suffix = existing_suffix[last_underscore:] + + else: + try: + root, existing_suffix = filename.rsplit("_", 1) + existing_suffix = "_" + existing_suffix + + except ValueError as err: + logging.info( + "Could not split filename (ValueError): %s", err + ) + root, existing_suffix = filename, "" + + if suffix is None: + suffix = existing_suffix + + else: + root, filetype = os.path.splitext(self.filename) + + # Cope with prefix or suffix as None + self.filename = (prefix or "") + root + (suffix or "") + filetype
+ + + def _crop_nd(self, nd, x1, y1, x2, y2): + y_start, y_end = y1, y2 + 1 + x_start, x_end = x1, x2 + 1 + + nd.data = nd.data[y_start:y_end, x_start:x_end] + + if nd.uncertainty is not None: + nd.uncertainty = nd.uncertainty[y_start:y_end, x_start:x_end] + + if nd.mask is not None: + nd.mask = nd.mask[y_start:y_end, x_start:x_end] + +
+[docs] + def crop(self, x1, y1, x2, y2): + """Crop the NDData objects given indices. + + Parameters + ---------- + x1, y1, x2, y2 : int + Minimum and maximum indices for the x and y axis. + + """ + # TODO: Consider cropping of objects in the meta section + for nd in self._nddata: + orig_shape = nd.data.shape + self._crop_nd(nd, x1, y1, x2, y2) + for o in nd.meta["other"].values(): + try: + if o.shape == orig_shape: + self._crop_nd(o, x1, y1, x2, y2) + except AttributeError: + # No 'shape' attribute in the object. It's probably + # not array-like + pass
+ + +
+[docs] + @astro_data_descriptor + def instrument(self): + """Returns the name of the instrument making the observation.""" + return self.phu.get(self._keyword_for("instrument"))
+ + +
+[docs] + @astro_data_descriptor + def object(self): + """Returns the name of the object being observed.""" + return self.phu.get(self._keyword_for("object"))
+ + +
+[docs] + @astro_data_descriptor + def telescope(self): + """Returns the name of the telescope.""" + return self.phu.get(self._keyword_for("telescope"))
+
+ +
+ +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/_modules/astrodata/factory.html b/_modules/astrodata/factory.html new file mode 100644 index 00000000..af96bde9 --- /dev/null +++ b/_modules/astrodata/factory.html @@ -0,0 +1,350 @@ + + + + + + + astrodata.factory — astrodata 3.2.0 documentation + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +

Source code for astrodata.factory

+"""Factory for AstroData objects."""
+import logging
+import os
+from contextlib import contextmanager
+from copy import deepcopy
+
+from astropy.io import fits
+
+from .utils import deprecated
+
+LOGGER = logging.getLogger(__name__)
+
+
+
+[docs] +class AstroDataError(Exception): + """Exception raised when there is a problem with the AstroData class."""
+ + + +class AstroDataFactory: + """Factory class for AstroData objects.""" + + _file_openers = (fits.open,) + + def __init__(self): + self._registry = set() + + @staticmethod + @deprecated( + "Renamed to _open_file, please use that method instead: " + "astrodata.factory.AstroDataFactory._open_file" + ) + @contextmanager + def _openFile(source): # pylint: disable=invalid-name + return AstroDataFactory._open_file(source) + + @staticmethod + @contextmanager + def _open_file(source): + """Internal static method that takes a ``source``, assuming that it is + a string pointing to a file to be opened. + + If this is the case, it will try to open the file and return an + instance of the appropriate native class to be able to manipulate it + (eg. ``HDUList``). + + If ``source`` is not a string, it will be returned verbatim, assuming + that it represents an already opened file. + """ + if isinstance(source, (str, os.PathLike)): + # Check that the file exists. + if not os.path.isfile(source): + raise FileNotFoundError(f"Path is not a file: {source}") + + # Check that the file has nonzero size. + stats = os.stat(source) + + if stats.st_size == 0: + LOGGER.warning("File %s is zero size", source) + + if not AstroDataFactory._file_openers: + raise AstroDataError( + "No file openers registered. Register some using" + " 'add_class' method." + ) + + # try vs all handlers + for func in AstroDataFactory._file_openers: + try: + fp = func(source) + yield fp + + except Exception as err: # pylint: disable=broad-except + # TODO: Should be more specific than this. + # Log the exception, if it's a serious error then + # re-raise it, e.g., user exits with Ctrl-C. + LOGGER.error( + "Failed to open %s with %s, got error: %s", + source, + func, + err, + ) + + # Handle nonexistent files. + if isinstance(err, FileNotFoundError): + raise err + + else: + if hasattr(fp, "close"): + fp.close() + + return + + raise AstroDataError( + f"No access, or not supported format for: {source}" + ) + + yield source + + @deprecated( + "Renamed to add_class, please use that method instead: " + "astrodata.factory.AstroDataFactory.add_class" + ) + def addClass(self, cls): # pylint: disable=invalid-name + """Add a new class to the AstroDataFactory registry. It will be used + when instantiating an AstroData class for a FITS file. + """ + self.add_class(cls) + + def add_class(self, cls): + """Add a new class to the AstroDataFactory registry. It will be used + when instantiating an AstroData class for a FITS file. + """ + if not hasattr(cls, "_matches_data"): + raise AttributeError( + f"Class '{cls.__name__}' has no '_matches_data' method" + ) + + self._registry.add(cls) + + def remove_class(self, cls: type | str): + """Remove a class from the AstroDataFactory registry.""" + if isinstance(cls, str): + cls = next((c for c in self._registry if c.__name__ == cls), None) + + self._registry.remove(cls) + + @deprecated( + "Renamed to get_astro_data, please use that method instead: " + "astrodata.factory.AstroDataFactory.get_astro_data" + ) + def getAstroData(self, source): # pylint: disable=invalid-name + """Deprecated, see |get_astro_data|.""" + self.get_astro_data(source) + + def get_astro_data(self, source): + """Takes either a string (with the path to a file) or an HDUList as + input, and tries to return an AstroData instance. + + It will raise exceptions if the file is not found, or if there is no + match for the HDUList, among the registered AstroData classes. + + Returns an instantiated object, or raises AstroDataError if it was + not possible to find a match + + Parameters + ---------- + source : `str` or `pathlib.Path` or `fits.HDUList` + The file path or HDUList to read. + """ + candidates = [] + with self._open_file(source) as opened: + for adclass in self._registry: + try: + # TODO: accessing protected member + # pylint: disable=protected-access + if adclass._matches_data(opened): + candidates.append(adclass) + + except Exception as err: # pylint: disable=broad-except + # TODO: Should be more specific than this. + LOGGER.error( + "Failed to open %s with %s, got error: %s", + source, + adclass, + err, + ) + + # For every candidate in the list, remove the ones that are base + # classes for other candidates. That way we keep only the more + # specific ones. + final_candidates = [] + for cnd in candidates: + if any(cnd in x.mro() for x in candidates if x != cnd): + continue + + final_candidates.append(cnd) + + if len(final_candidates) > 1: + raise AstroDataError( + "More than one class is candidate for this dataset" + ) + + if not final_candidates: + raise AstroDataError("No class matches this dataset") + + return final_candidates[0].read(source) + + @deprecated( + "Renamed to create_from_scratch, please use that method instead: " + "astrodata.factory.AstroDataFactory.create_from_scratch" + ) + def createFromScratch( + self, + phu, + extensions=None, + ): # pylint: disable=invalid-name + """Deprecated, see |create_from_scratch|.""" + self.create_from_scratch(phu=phu, extensions=extensions) + + def create_from_scratch(self, phu, extensions=None): + """Creates an AstroData object from a collection of objects. + + Parameters + ---------- + phu : `fits.PrimaryHDU` or `fits.Header` or `dict` or `list` + FITS primary HDU or header, or something that can be used to create + a fits.Header (a dict, a list of "cards"). + + extensions : list of HDUs + List of HDU objects. + + Returns + ------- + `astrodata.AstroData` + An AstroData instance. + + Raises + ------ + ValueError + If ``phu`` is not a valid object. + """ + lst = fits.HDUList() + if phu is not None: + if isinstance(phu, fits.PrimaryHDU): + lst.append(deepcopy(phu)) + + elif isinstance(phu, fits.Header): + lst.append(fits.PrimaryHDU(header=deepcopy(phu))) + + elif isinstance(phu, (dict, list, tuple)): + p = fits.PrimaryHDU() + p.header.update(phu) + lst.append(p) + + else: + raise ValueError( + "phu must be a PrimaryHDU or a valid header object" + ) + + # TODO: Verify the contents of extensions... + if extensions is not None: + for ext in extensions: + lst.append(ext) + + return self.get_astro_data(lst) +
+ +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/_modules/astrodata/fits.html b/_modules/astrodata/fits.html new file mode 100644 index 00000000..4e6582b9 --- /dev/null +++ b/_modules/astrodata/fits.html @@ -0,0 +1,1301 @@ + + + + + + + astrodata.fits — astrodata 3.2.0 documentation + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +

Source code for astrodata.fits

+"""Functions used when interacting with FITS files and HDUs.
+
+.. |NDData| replace:: :class:`~astropy.nddata.NDData`
+.. |NDDataRef| replace:: :class:`~astropy.nddata.NDDataRef`
+.. |BinTableHDU| replace:: :class:`~astropy.io.fits.BinTableHDU`
+.. |TableHDU| replace:: :class:`~astropy.io.fits.TableHDU`
+.. |NDAstroData| replace:: :class:`~astrodata.nddata.NDAstroData`
+.. |NDAstroDataRef| replace:: :class:`~astrodata.nddata.NDAstroDataRef`
+"""
+from collections import OrderedDict
+from copy import deepcopy
+from io import BytesIO
+from itertools import product as cart_product, zip_longest
+import gc
+import logging
+import os
+import traceback
+import warnings
+
+from astropy import units as u
+from astropy.io import fits
+from astropy.io.fits import (
+    BinTableHDU,
+    Column,
+    DELAYED,
+    HDUList,
+    ImageHDU,
+    PrimaryHDU,
+    TableHDU,
+)
+from astropy.nddata import NDData
+
+# NDDataRef is still not in the stable astropy, but this should be the one
+# we use in the future...
+# from astropy.nddata import NDData, NDDataRef as NDDataObject
+from astropy.table import Table
+
+import asdf
+import astropy
+import jsonschema
+import numpy as np
+
+
+from gwcs.wcs import WCS as gWCS
+
+from .nddata import ADVarianceUncertainty, NDAstroData as NDDataObject
+from .utils import deprecated
+from .wcs import fitswcs_to_gwcs, gwcs_to_fits
+
+DEFAULT_EXTENSION = "SCI"
+NO_DEFAULT = object()
+LOGGER = logging.getLogger(__name__)
+
+
+class FitsHeaderCollection:
+    """Group access to a list of FITS Header-like objects.
+
+    It exposes a number of methods (``set``, ``get``, etc.) that operate over
+    all the headers at the same time. It can also be iterated.
+
+    Parameters
+    ----------
+    headers : list of `astropy.io.fits.Header`
+        List of Header objects.
+    """
+
+    def __init__(self, headers):
+        self._headers = list(headers)
+
+    def _insert(self, idx, header):
+        self._headers.insert(idx, header)
+
+    def __iter__(self):
+        yield from self._headers
+
+    def __setitem__(self, key, value):
+        if isinstance(value, tuple):
+            self.set(key, value=value[0], comment=value[1])
+        else:
+            self.set(key, value=value)
+
+    def set(self, key, value=None, comment=None):
+        """Set a keyword in all the headers."""
+        for header in self._headers:
+            header.set(key, value=value, comment=comment)
+
+    def __getitem__(self, key):
+        missing_at = []
+        ret = []
+        for n, header in enumerate(self._headers):
+            try:
+                ret.append(header[key])
+
+            except KeyError:
+                logging.debug(
+                    "Assigning None to header missing keyword %s", key
+                )
+
+                missing_at.append(n)
+                ret.append(None)
+
+        if missing_at:
+            error = KeyError(
+                f"The keyword couldn't be found at headers: "
+                f"{tuple(missing_at)}"
+            )
+
+            error.missing_at = missing_at
+            error.values = ret
+            raise error
+
+        return ret
+
+    def get(self, key, default=None):
+        """Get a keyword, defaulting to None."""
+        try:
+            return self[key]
+        except KeyError as err:
+            vals = err.values
+            for n in err.missing_at:
+                vals[n] = default
+            return vals
+
+    def __delitem__(self, key):
+        self.remove(key)
+
+    def remove(self, key):
+        """Remove a keyword from all the headers."""
+        deleted = 0
+        for header in self._headers:
+            try:
+                del header[key]
+                deleted = deleted + 1
+            except KeyError:
+                pass
+        if not deleted:
+            raise KeyError(f"'{key}' is not on any of the extensions")
+
+    def get_comment(self, key):
+        """Get the comment for a keyword, from all the headers, as a list."""
+        return [header.comments[key] for header in self._headers]
+
+    def set_comment(self, key, comment):
+        """Set the comment for a keyword in all the headers."""
+
+        def _inner_set_comment(header):
+            if key not in header:
+                raise KeyError(f"Keyword {key!r} not available")
+
+            header.set(key, comment=comment)
+
+        for n, header in enumerate(self._headers):
+            try:
+                _inner_set_comment(header)
+            except KeyError as err:
+                raise KeyError(f"{err.args[0]} at header {n}") from err
+
+    def __contains__(self, key):
+        return any(tuple(key in h for h in self._headers))
+
+
+def new_imagehdu(data, header, name=None):
+    """Create a new ImageHDU from data and header.
+
+    Parameters
+    ----------
+    data : `numpy.ndarray`
+        The data array.
+
+    header : `astropy.io.fits.Header`
+        The header.
+
+    name : str
+        The extension name.
+
+    Notes
+    -----
+    Assigning data in a delayed way, won't reset BZERO/BSCALE in the header,
+    for some reason. Need to investigated. Maybe astropy.io.fits bug. Figure
+    out WHY were we delaying in the first place.
+
+    Example:
+    >> i = ImageHDU(data=DELAYED, header=header.copy(), name=name)
+    >> i.data = data
+    """
+    # Assigning data in a delayed way, won't reset BZERO/BSCALE in the header,
+    # for some reason. Need to investigated. Maybe astropy.io.fits bug. Figure
+    # out WHY were we delaying in the first place.
+    #    i = ImageHDU(data=DELAYED, header=header.copy(), name=name)
+    #    i.data = data
+    return ImageHDU(data=data, header=header.copy(), name=name)
+
+
+def table_to_bintablehdu(table, extname=None):
+    """Convert an astropy Table object to a BinTableHDU before writing to disk.
+
+    Parameters
+    ----------
+    table: astropy.table.Table instance
+        the table to be converted to a BinTableHDU
+
+    extname: str
+        name to go in the EXTNAME field of the FITS header
+
+    Returns
+    -------
+    BinTableHDU
+    """
+    # remove header to avoid warning from table_to_hdu
+    table_header = table.meta.pop("header", None)
+
+    # table_to_hdu sets units only if the unit conforms to the FITS standard,
+    # otherwise it issues a warning, which we catch here.
+    with warnings.catch_warnings():
+        warnings.simplefilter("ignore", UserWarning)
+        hdu = fits.table_to_hdu(table)
+
+    # And now we try to set the units that do not conform to the standard,
+    # using unit.to_string() without the format='fits' argument.
+    for col in table.itercols():
+        if col.unit and not hdu.columns[col.name].unit:
+            hdu.columns[col.name].unit = col.unit.to_string()
+
+    if table_header is not None:
+        # Update with cards from table.meta, but skip structural FITS
+        # keywords since those have been set by table_to_hdu
+        exclude = (
+            "SIMPLE",
+            "XTENSION",
+            "BITPIX",
+            "NAXIS",
+            "EXTEND",
+            "PCOUNT",
+            "GCOUNT",
+            "TFIELDS",
+            "TFORM",
+            "TSCAL",
+            "TZERO",
+            "TNULL",
+            "TTYPE",
+            "TUNIT",
+            "TDISP",
+            "TDIM",
+            "THEAP",
+            "TBCOL",
+        )
+        hdr = fits.Header(
+            [
+                card
+                for card in table_header.cards
+                if not card.keyword.startswith(exclude)
+            ]
+        )
+        update_header(hdu.header, hdr)
+        # reset table's header
+        table.meta["header"] = table_header
+    if extname:
+        hdu.header["EXTNAME"] = (extname, "added by AstroData")
+    return hdu
+
+
+def header_for_table(table):
+    """Return a FITS header for a table."""
+    table_header = table.meta.pop("header", None)
+    fits_header = fits.table_to_hdu(table).header
+    if table_header:
+        table.meta["header"] = table_header  # restore original meta
+        fits_header = update_header(table_header, fits_header)
+    return fits_header
+
+
+
+[docs] +def add_header_to_table(table): + """Add a FITS header to a table.""" + header = header_for_table(table) + table.meta["header"] = header + return header
+ + + +def _process_table(table, name=None, header=None): + """Convert a BinTableHDU or TableHDU to an astropy Table object. + + Arguments + --------- + table : |BinTableHDU| or |TableHDU| or |Table| + The table to convert. If it's already an |Table|, it will be returned + as is. + + name : str + The name to assign to the table. + + header : `astropy.io.fits.Header` + The header to assign to the table. + """ + if isinstance(table, (BinTableHDU, TableHDU)): + obj = Table(table.data, meta={"header": header or table.header}) + for i, col in enumerate(obj.columns, start=1): + try: + obj[col].unit = u.Unit(obj.meta["header"][f"TUNIT{i}"]) + except (KeyError, TypeError, ValueError): + pass + elif isinstance(table, Table): + obj = Table(table) + if header is not None: + obj.meta["header"] = deepcopy(header) + elif "header" not in obj.meta: + obj.meta["header"] = header_for_table(obj) + else: + raise ValueError(f"{table.__class__} is not a recognized table type") + + if name is not None: + obj.meta["header"]["EXTNAME"] = name + + return obj + + +def card_filter(cards, include=None, exclude=None): + """Filter a list of cards, lazily returning only those that match the + criteria. + + Parameters + ---------- + cards : iterable + The cards to filter. + + include : iterable of str + Only cards with these keywords will be returned. + + exclude : iterable of str + Cards with these keywords will be skipped. + + Yields + ------ + card : tuple + A card that matches the criteria. + """ + for card in cards: + if include is not None and card[0] not in include: + continue + + if exclude is not None and card[0] in exclude: + continue + + yield card + + +def update_header(headera, headerb): + """Update headera with the cards from headerb, but only if they are + different. + + Parameters + ---------- + headera : `astropy.io.fits.Header` + The header to update. + + headerb : `astropy.io.fits.Header` + The header to update from. + """ + cardsa = tuple(tuple(cr) for cr in headera.cards) + cardsb = tuple(tuple(cr) for cr in headerb.cards) + + if cardsa == cardsb: + return headera + + # Ok, headerb differs somehow. Let's try to bring the changes to headera + # Updated keywords that should be unique + difference = set(cardsb) - set(cardsa) + headera.update(card_filter(difference, exclude={"HISTORY", "COMMENT", ""})) + # Check the HISTORY and COMMENT cards, just in case + for key in ("HISTORY", "COMMENT"): + fltcardsa = card_filter(cardsa, include={key}) + fltcardsb = card_filter(cardsb, include={key}) + # assume we start with two headers that are mostly the same and + # that will have added comments/history at the end (in headerb) + for ca, cb in zip_longest(fltcardsa, fltcardsb): + if ca is None: + headera.update((cb,)) + + return headera + + +def fits_ext_comp_key(ext): + """Returns a pair (int, str) that will be used to sort extensions.""" + if isinstance(ext, PrimaryHDU): + # This will guarantee that the primary HDU goes first + ret = (-1, "") + else: + # When two extensions share version number, we'll use their names + # to sort them out. Choose a suitable key so that: + # + # - SCI extensions come first + # - unnamed extensions come last + # + # We'll resort to add 'z' in front of the usual name to force + # SCI to be the "smallest" + name = ext.name + if name == "": + name = "zzzz" + elif name != DEFAULT_EXTENSION: + name = "z" + name + + ver = ext.header.get("EXTVER") + if ver in (-1, None): + # In practice, this number should be larger than any EXTVER found + # in real life HDUs, pushing unnumbered HDUs to the end. + ver = 2**32 - 1 + + # For the general case, just return version and name, to let them + # be sorted naturally + ret = (ver, name) + + return ret + + +class FitsLazyLoadable: + """Class to delay loading of data from a FITS file.""" + + def __init__(self, obj): + """Initializes the object. + + Parameters + ---------- + obj : `astropy.io.fits.ImageHDU` or `astropy.io.fits.BinTableHDU` + The HDU to delay loading from. + """ + self._obj = obj + self.lazy = True + + def _create_result(self, shape): + """Create an empty array to hold the data.""" + return np.empty(shape, dtype=self.dtype) + + def _scale(self, data): + """Scale the data, if necessary.""" + # TODO: It would be goot to access these differently. Is this always an + # object we control? Even if so, should access through a property, not + # a protected member. No friends in python... + # pylint: disable=protected-access + bscale = self._obj._orig_bscale + bzero = self._obj._orig_bzero + + if bscale == 1 and bzero == 0: + return data + + return (bscale * data + bzero).astype(self.dtype) + + def __getitem__(self, arr_slice): + # TODO: We may want (read: should) create an empty result array before + # scaling + return self._scale(self._obj.section[arr_slice]) + + @property + def header(self): + """The header of the HDU.""" + return self._obj.header + + @property + def data(self): + """The data of the HDU.""" + res = self._create_result(self.shape) + res[:] = self._scale(self._obj.data) + return res + + @property + def shape(self): + """The shape of the data.""" + return self._obj.shape + + @property + def dtype(self): + """Need to to some overriding of astropy.io.fits since it doesn't + know about BITPIX=8 + """ + # TODO: It would be goot to access these differently. Is this always an + # object we control? Even if so, should access through a property, not + # a protected member. No friends in python... These are scattered + # throughout the function. + # pylint: disable=protected-access + bitpix = self._obj._orig_bitpix + if self._obj._orig_bscale == 1 and self._obj._orig_bzero == 0: + dtype = fits.BITPIX2DTYPE[bitpix] + else: + # this method from astropy will return the dtype if the data + # needs to be converted to unsigned int or scaled to float + dtype = self._obj._dtype_for_bitpix() + + if dtype is None: + if bitpix < 0: + dtype = np.dtype(f"float{abs(bitpix)}") + + if ( + self._obj.header["EXTNAME"] == "DQ" + or self._obj._uint + and self._obj._orig_bscale == 1 + and bitpix == 8 + ): + dtype = np.uint16 + + return dtype + + +def _prepare_hdulist(hdulist, default_extension="SCI", extname_parser=None): + """Prepare an HDUList for reading. + + Parameters + ---------- + hdulist : `astropy.io.fits.HDUList` + The HDUList to prepare. + + default_extension : str + The name of the default extension. + + extname_parser : callable + A function to parse the EXTNAME of an HDU. + + Returns + ------- + hdulist : `astropy.io.fits.HDUList` + The prepared HDUList. + """ + new_list = [] + highest_ver = 0 + recognized = set() + + if len(hdulist) > 1 or (len(hdulist) == 1 and hdulist[0].data is None): + # MEF file + # First get HDUs for which EXTVER is defined + for hdu in hdulist: + if extname_parser: + extname_parser(hdu) + ver = hdu.header.get("EXTVER") + if ver not in (-1, None) and hdu.name: + highest_ver = max(highest_ver, ver) + elif not isinstance(hdu, PrimaryHDU): + continue + + new_list.append(hdu) + recognized.add(hdu) + + # Then HDUs that miss EXTVER + for hdu in hdulist: + if hdu in recognized: + continue + + if isinstance(hdu, ImageHDU): + highest_ver += 1 + if "EXTNAME" not in hdu.header: + hdu.header["EXTNAME"] = ( + default_extension, + "Added by AstroData", + ) + + if hdu.header.get("EXTVER") in (-1, None): + hdu.header["EXTVER"] = (highest_ver, "Added by AstroData") + + new_list.append(hdu) + recognized.add(hdu) + + else: + # Uh-oh, a single image FITS file + new_list.append(PrimaryHDU(header=hdulist[0].header)) + image = ImageHDU(header=hdulist[0].header, data=hdulist[0].data) + # Fudge due to apparent issues with assigning ImageHDU from data + # TODO: protected members + # pylint: disable=protected-access + image._orig_bscale = hdulist[0]._orig_bscale + image._orig_bzero = hdulist[0]._orig_bzero + + for keyw in ("SIMPLE", "EXTEND"): + if keyw in image.header: + del image.header[keyw] + + image.header["EXTNAME"] = (default_extension, "Added by AstroData") + image.header["EXTVER"] = (1, "Added by AstroData") + new_list.append(image) + + return HDUList(sorted(new_list, key=fits_ext_comp_key)) + + +def read_fits(cls, source, extname_parser=None): + """Takes either a string (with the path to a file) or an HDUList as input, + and tries to return a populated AstroData (or descendant) instance. + + It will raise exceptions if the file is not found, or if there is no match + for the HDUList, among the registered AstroData classes. + + Parameters + ---------- + cls : class + The class to instantiate. + + source : str or `astropy.io.fits.HDUList` + The path to the file, or an HDUList. + + extname_parser : callable + A function to parse the EXTNAME of an HDU. + + Returns + ------- + ad : `astrodata.AstroData` or descendant + The populated AstroData object. This is of the type specified by cls. + """ + + ad = cls() + + if isinstance(source, (str, os.PathLike)): + hdulist = fits.open( + source, memmap=True, do_not_scale_image_data=True, mode="readonly" + ) + + ad.path = source + + else: + hdulist = source + + try: + ad.path = source[0].header.get("ORIGNAME") + + except AttributeError as err: + logging.info("Attribute error in read_fits: %s", err) + ad.path = None + + # TODO: This is a hack to get around the fact that we don't have a + # proper way to pass the original filename to the object. This is + # needed for the writer to be able to write the ORIGNAME keyword. + # pylint: disable=protected-access + _file = hdulist._file + + hdulist = _prepare_hdulist( + hdulist, + default_extension=DEFAULT_EXTENSION, + extname_parser=extname_parser, + ) + + if _file is not None: + hdulist._file = _file + + # Initialize the object containers to a bare minimum + # pylint: disable=no-member + if "ORIGNAME" not in hdulist[0].header and ad.orig_filename is not None: + hdulist[0].header.set( + "ORIGNAME", + ad.orig_filename, + "Original filename prior to processing", + ) + + ad.phu = hdulist[0].header + + # This is hashable --- we can use it to check if we've seen this object + # before. + # pylint: disable=unhashable-member + seen = {hdulist[0]} + + skip_names = {DEFAULT_EXTENSION, "REFCAT", "MDF"} + + def associated_extensions(ver): + for hdu in hdulist: + if hdu.header.get("EXTVER") == ver and hdu.name not in skip_names: + yield hdu + + # Only SCI HDUs + sci_units = [hdu for hdu in hdulist[1:] if hdu.name == DEFAULT_EXTENSION] + + seen_vers = [] + + for hdu in sci_units: + seen.add(hdu) + ver = hdu.header.get("EXTVER", -1) + + if ver > -1 and seen_vers.count(ver) == 1: + LOGGER.warning("Multiple SCI extension with EXTVER %s", ver) + + seen_vers.append(ver) + parts = { + "data": hdu, + "uncertainty": None, + "mask": None, + "wcs": None, + "other": [], + } + + # For each SCI HDU find if it has an associated variance, mask, wcs + for extra_unit in associated_extensions(ver): + seen.add(extra_unit) + name = extra_unit.name + if name == "DQ": + parts["mask"] = extra_unit + elif name == "VAR": + parts["uncertainty"] = extra_unit + elif name == "WCS": + parts["wcs"] = extra_unit + else: + parts["other"].append(extra_unit) + + header = parts["data"].header + lazy = hdulist._file is not None and hdulist._file.memmap + + for part_name in ("data", "mask", "uncertainty"): + if parts[part_name] is not None: + if lazy: + # Use FitsLazyLoadable to delay loading of the data + parts[part_name] = FitsLazyLoadable(parts[part_name]) + else: + # Otherwise use the data array + # parts[part_name] = parts[part_name].data + # TODO: we open the file with do_not_scale_data=True, so + # the data array does not have the correct data values. + # AstroData handles scaling internally, and we can ensure + # it does that by making the data a FitsLazyLoadable; the + # side-effect of this is that the is_lazy() function will + # return True, but this has minimal knock-on effects. + # Hopefully astropy will handle this better in future. + if hdulist._file is not None: # probably compressed + parts[part_name] = FitsLazyLoadable(parts[part_name]) + else: # for astrodata.create() files + parts[part_name] = parts[part_name].data + + # handle the variance if not lazy + if parts["uncertainty"] is not None and not isinstance( + parts["uncertainty"], FitsLazyLoadable + ): + parts["uncertainty"] = ADVarianceUncertainty(parts["uncertainty"]) + + # Create the NDData object + nd = NDDataObject( + data=parts["data"], + uncertainty=parts["uncertainty"], + mask=parts["mask"], + meta={"header": header}, + ) + + ad.append(nd, name=DEFAULT_EXTENSION) + + # This is used in the writer to keep track of the extensions that + # were read from the current object. + nd.meta["parent_ad"] = id(ad) + + for other in parts["other"]: + if not other.name: + warnings.warn(f"Skip HDU {other} because it has no EXTNAME") + else: + setattr(ad[-1], other.name, other) + + if parts["wcs"] is not None: + # Load the gWCS object from the ASDF extension + nd.wcs = asdftablehdu_to_wcs(parts["wcs"]) + if nd.wcs is None: + # Fallback to the data header + nd.wcs = fitswcs_to_gwcs(nd) + if nd.wcs is None: + # In case WCS info is in the PHU + nd.wcs = fitswcs_to_gwcs(hdulist[0].header) + + for other in hdulist: + if other in seen: + continue + name = other.header.get("EXTNAME") + try: + ad.append(other, name=name) + except ValueError as e: + warnings.warn(f"Discarding {name} :\n {e}") + + return ad + + +def ad_to_hdulist(ad): + """Creates an HDUList from an AstroData object.""" + hdul = HDUList() + hdul.append(PrimaryHDU(header=ad.phu, data=DELAYED)) + + # Find the maximum EXTVER for extensions that belonged with this + # object if it was read from a FITS file + # TODO: Is there a way to access _nddata without using the protected + # variable? Should it be a protected variable? + # pylint: disable=protected-access + maxver = max( + ( + nd.meta["header"].get("EXTVER", 0) + for nd in ad._nddata + if nd.meta.get("parent_ad") == id(ad) + ), + default=0, + ) + + for ext in ad._nddata: + header = ext.meta["header"].copy() + + if not isinstance(header, fits.Header): + header = fits.Header(header) + + if ext.meta.get("parent_ad") == id(ad): + # If the extension belonged with this object, use its + # original EXTVER + ver = header["EXTVER"] + else: + # Otherwise renumber the extension + ver = header["EXTVER"] = maxver + 1 + maxver += 1 + + wcs = ext.wcs + + if isinstance(wcs, gWCS): + # We don't have access to the AD tags so see if it's an image + # Catch ValueError as any sort of failure + try: + wcs_dict = gwcs_to_fits(ext, ad.phu) + + except (ValueError, NotImplementedError) as e: + LOGGER.warning(e) + + else: + # Must delete keywords if image WCS has been downscaled + # from a higher number of dimensions + for i in range(1, 5): + for kw in ( + f"CDELT{i}", + f"CRVAL{i}", + f"CUNIT{i}", + f"CTYPE{i}", + f"NAXIS{i}", + ): + if kw in header: + del header[kw] + + for j in range(1, 5): + for kw in (f"CD{i}_{j}", f"PC{i}_{j}", f"CRPIX{j}"): + if kw in header: + del header[kw] + + # Delete this if it's left over from a previous save + if "FITS-WCS" in header: + del header["FITS-WCS"] + + try: + extensions = wcs_dict.pop("extensions") + + except KeyError: + pass + + else: + for k, v in extensions.items(): + ext.meta["other"][k] = v + + header.update(wcs_dict) + + # Use "in" here as the dict entry may be (value, comment) + if "APPROXIMATE" not in wcs_dict.get("FITS-WCS", ""): + wcs = None # There's no need to create a WCS extension + + hdul.append(new_imagehdu(ext.data, header, "SCI")) + + if ext.uncertainty is not None: + hdul.append(new_imagehdu(ext.uncertainty.array, header, "VAR")) + + if ext.mask is not None: + hdul.append(new_imagehdu(ext.mask, header, "DQ")) + + if isinstance(wcs, gWCS): + hdul.append(wcs_to_asdftablehdu(ext.wcs, extver=ver)) + + for name, other in ext.meta.get("other", {}).items(): + if isinstance(other, Table): + hdu = table_to_bintablehdu(other, extname=name) + + elif isinstance(other, np.ndarray): + hdu = new_imagehdu(other, header, name=name) + + elif isinstance(other, NDDataObject): + hdu = new_imagehdu(other.data, ext.meta["header"]) + + else: + raise ValueError( + "I don't know how to write back an object " + f"of type {type(other)}" + ) + + hdu.ver = ver + hdul.append(hdu) + + if ad._tables is not None: + for name, table in sorted(ad._tables.items()): + hdul.append(table_to_bintablehdu(table, extname=name)) + + # Additional FITS compatibility, add to PHU + # pylint: disable=no-member + hdul[0].header["NEXTEND"] = len(hdul) - 1 + + return hdul + + +def write_fits(ad, filename, overwrite=False): + """Writes the AstroData object to a FITS file.""" + hdul = ad_to_hdulist(ad) + hdul.writeto(filename, overwrite=overwrite) + + +@deprecated( + "Renamed to 'windowed_operation', this is just an alias for now, " + "and will be removed in a future version." +) +def windowedOp(*args, **kwargs): # pylint: disable=invalid-name + """Alias for windowed_operation.""" + return windowed_operation(*args, **kwargs) + + +# TODO: Need to refactor this function +def windowed_operation( + func, + sequence, + kernel, + shape=None, + dtype=None, + with_uncertainty=False, + with_mask=False, + **kwargs, +): + """Apply function on a NDData obbjects, splitting the data in chunks to + limit memory usage. + + Parameters + ---------- + func : callable + The function to apply. + + sequence : list of NDData + List of NDData objects. + + kernel : tuple of int + Shape of the blocks. + + shape : tuple of int + Shape of inputs. Defaults to ``sequence[0].shape``. + + dtype : str or dtype + Type of the output array. Defaults to ``sequence[0].dtype``. + + with_uncertainty : bool + Compute uncertainty? + + with_mask : bool + Compute mask? + + **kwargs + Additional args are passed to ``func``. + """ + + def generate_boxes(shape, kernel): + if len(shape) != len(kernel): + raise AssertionError( + f"Incompatible shape ({shape}) and kernel ({kernel})" + ) + + ticks = [ + [(x, x + step) for x in range(0, axis, step)] + for axis, step in zip(shape, kernel) + ] + + return list(cart_product(*ticks)) + + if shape is None: + if len({x.shape for x in sequence}) > 1: + raise ValueError( + "Can't calculate final shape: sequence elements " + "disagree on shape, and none was provided" + ) + + shape = sequence[0].shape + + if dtype is None: + dtype = sequence[0].window[:1, :1].data.dtype + + result = NDDataObject( + np.empty(shape, dtype=dtype), + variance=np.zeros(shape, dtype=dtype) if with_uncertainty else None, + mask=np.empty(shape, dtype=np.uint16) if with_mask else None, + meta=sequence[0].meta, + wcs=sequence[0].wcs, + ) + + # Delete other extensions because we don't know what to do with them + result.meta["other"] = OrderedDict() + + # The Astropy logger's "INFO" messages aren't warnings, so have to fudge + # pylint: disable=no-member + log_level = astropy.logger.conf.log_level + astropy.log.setLevel(astropy.logger.WARNING) + + boxes = generate_boxes(shape, kernel) + + try: + for coords in boxes: + section = tuple(slice(start, end) for (start, end) in coords) + out = func( + [element.window[section] for element in sequence], **kwargs + ) + result.set_section(section, out) + + # propagate additional attributes + if out.meta.get("other"): + for k, v in out.meta["other"].items(): + if len(boxes) > 1: + result.meta["other"][k, coords] = v + else: + result.meta["other"][k] = v + + gc.collect() + + finally: + astropy.log.setLevel(log_level) # and reset + + # Now if the input arrays where splitted in chunks, we need to gather + # the data arrays for the additional attributes. + other = result.meta["other"] + if other: + if len(boxes) > 1: + for (name, coords), obj in list(other.items()): + if not isinstance(obj, NDData): + raise ValueError("only NDData objects are handled here") + if name not in other: + other[name] = NDDataObject( + np.empty(shape, dtype=obj.data.dtype) + ) + section = tuple(slice(start, end) for (start, end) in coords) + other[name].set_section(section, obj) + del other[name, coords] + + for name in other: + # To set the name of our object we need to save it as an ndarray, + # otherwise for a NDData one AstroData would use the name of the + # AstroData object. + other[name] = other[name].data + + return result + + +# --------------------------------------------------------------------------- +# gWCS <-> FITS WCS helper functions go here +# --------------------------------------------------------------------------- +# Could parametrize some naming conventions in the following two functions if +# done elsewhere for hard-coded names like 'SCI' in future, but they only have +# to be self-consistent with one another anyway. + + +def wcs_to_asdftablehdu(wcs, extver=None): + """Serialize a gWCS object as a FITS TableHDU (ASCII) extension. + + The ASCII table is actually a mini ASDF file. The constituent AstroPy + models must have associated ASDF "tags" that specify how to serialize them. + + In the event that serialization as pure ASCII fails (this should not + happen), a binary table representation will be used as a fallback. + + Returns None (issuing a warning) if the WCS object cannot be serialized, + so the rest of the file can still be written. + + Parameters + ---------- + wcs : gWCS + The gWCS object to serialize. + + extver : int + The EXTVER to assign to the extension. + + Returns + ------- + hdu : TableHDU or BinTableHDU + The FITS table extension containing the serialized WCS object. + """ + # Create a small ASDF file in memory containing the WCS object + # representation because there's no public API for generating only the + # relevant YAML subsection and an ASDF file handles the "tags" properly. + try: + af = asdf.AsdfFile({"wcs": wcs}) + except jsonschema.exceptions.ValidationError as err: + # (The original traceback also gets printed here) + raise TypeError( + f"Cannot serialize model(s) for 'WCS' extension " f"{extver or ''}" + ) from err + + # ASDF can only dump YAML to a binary file object, so do that and read + # the contents back from it for storage in a FITS extension: + with BytesIO() as fd: + with af: + # Generate the YAML, dumping any binary arrays as text: + af.write_to(fd, all_array_storage="inline") + fd.seek(0) + wcsbuf = fd.read() + + # Convert the bytes to readable lines of text for storage (falling back to + # saving as binary in the unexpected event that this is not possible): + try: + wcsbuf = wcsbuf.decode("ascii").splitlines() + + except UnicodeDecodeError as err: + # This should not happen, but if the ASDF contains binary data in + # spite of the 'inline' option above, we have to dump the bytes to + # a non-human-readable binary table rather than an ASCII one: + LOGGER.warning( + "Could not convert WCS %s ASDF to ASCII; saving table " + "as binary (error was %s)", + extver or "", + err, + ) + + hduclass = BinTableHDU + fmt = "B" + wcsbuf = np.frombuffer(wcsbuf, dtype=np.uint8) + + else: + hduclass = TableHDU + fmt = f"A{max(len(line) for line in wcsbuf)}" + + # Construct the FITS table extension: + col = Column( + name="gWCS", format=fmt, array=wcsbuf, ascii=hduclass is TableHDU + ) + + return hduclass.from_columns([col], name="WCS", ver=extver) + + +def asdftablehdu_to_wcs(hdu): + """Recreate a gWCS object from its serialization in a FITS table extension. + + Returns None (issuing a warning) if the extension cannot be parsed, so + the rest of the file can still be read. + """ + ver = hdu.header.get("EXTVER", -1) + + if isinstance(hdu, (TableHDU, BinTableHDU)): + try: + colarr = hdu.data["gWCS"] + + except KeyError as err: + LOGGER.warning( + "Ignoring 'WCS' extension %s with no 'gWCS' table " + "column (error was %s)", + ver, + err, + ) + + return None + + # If this table column contains text strings as expected, join the rows + # as separate lines of a string buffer and encode the resulting YAML as + # bytes that ASDF can parse. If AstroData has produced another format, + # it will be a binary dump due to the unexpected presence of non-ASCII + # data, in which case we just extract unmodified bytes from the table. + if colarr.dtype.kind in ("U", "S"): + sep = os.linesep + # Just in case io.fits ever produces 'S' on Py 3 (not the default): + # join lines as str & avoid a TypeError with unicode linesep; could + # also use astype('U') but it assumes an encoding implicitly. + if colarr.dtype.kind == "S" and not isinstance(sep, bytes): + colarr = np.char.decode( + np.char.rstrip(colarr), encoding="ascii" + ) + wcsbuf = sep.join(colarr).encode("ascii") + else: + wcsbuf = colarr.tobytes() + + # Convert the stored text to a Bytes file object that ASDF can open: + with BytesIO(wcsbuf) as fd: + # Try to extract a 'wcs' entry from the YAML: + try: + af = asdf.open(fd) + + except IOError: + LOGGER.warning( + "Ignoring 'WCS' extension %s: failed to parse " + "ASDF.\nError was as follows:\n%s", + ver, + traceback.format_exc(), + ) + + return None + + with af: + try: + wcs = af.tree["wcs"] + + except KeyError as err: + LOGGER.warning( + "Ignoring 'WCS' extension %s: missing " + "'wcs' dict entry. Error was %s", + ver, + err, + ) + + return None + + else: + LOGGER.warning("Ignoring non-FITS-table 'WCS' extension %s", ver) + + return None + + return wcs +
+ +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/_modules/astrodata/nddata.html b/_modules/astrodata/nddata.html new file mode 100644 index 00000000..0632ae74 --- /dev/null +++ b/_modules/astrodata/nddata.html @@ -0,0 +1,780 @@ + + + + + + + astrodata.nddata — astrodata 3.2.0 documentation + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +

Source code for astrodata.nddata

+"""This module implements a derivative class based on NDData with some Mixins,
+implementing windowing and on-the-fly data scaling.
+"""
+
+
+import warnings
+from copy import deepcopy
+from functools import reduce
+
+import numpy as np
+
+from astropy.io.fits import ImageHDU
+from astropy.modeling import Model, models
+from astropy.nddata import (
+    NDArithmeticMixin,
+    NDData,
+    NDSlicingMixin,
+    VarianceUncertainty,
+)
+from gwcs.wcs import WCS as gWCS
+from .wcs import remove_axis_from_frame
+
+INTEGER_TYPES = (int, np.integer)
+
+__all__ = ["NDAstroData"]
+
+
+class ADVarianceUncertainty(VarianceUncertainty):
+    """Subclass VarianceUncertainty to check for negative values."""
+
+    @VarianceUncertainty.array.setter
+    def array(self, value):
+        if value is not None and np.any(value < 0):
+            warnings.warn(
+                "Negative variance values found. Setting to zero.",
+                RuntimeWarning,
+            )
+            value = np.where(value >= 0.0, value, 0.0)
+        VarianceUncertainty.array.fset(self, value)
+
+
+
+[docs] +class AstroDataMixin: + """A Mixin for ``NDData``-like classes (such as ``Spectrum1D``) to enable + them to behave similarly to ``AstroData`` objects. + + These behaviors are: + 1. ``mask`` attributes are combined with bitwise, not logical, or, + since the individual bits are important. + 2. The WCS must be a ``gwcs.WCS`` object and slicing results in + the model being modified. + 3. There is a settable ``variance`` attribute. + 4. Additional attributes such as OBJMASK can be extracted from + the .meta['other'] dict + """ + + def __getattr__(self, attribute): + """Allow access to attributes stored in self.meta['other'], as we do + with AstroData objects. + """ + if attribute.isupper(): + try: + return self.meta["other"][attribute] + + # Does this ever happen? If so under what circumstances? + except KeyError: + pass + + raise AttributeError( + f"{self.__class__.__name__!r} object has no " + f"attribute {attribute!r}" + ) + + def _arithmetic( + self, + operation, + operand, + propagate_uncertainties=True, + handle_mask=np.bitwise_or, + handle_meta=None, + uncertainty_correlation=0, + compare_wcs="first_found", + **kwds, + ): + """Override the NDData method so that "bitwise_or" becomes the default + operation to combine masks, rather than "logical_or" + """ + # TODO: What is this doing, and where? + return super()._arithmetic( + operation, + operand, + propagate_uncertainties=propagate_uncertainties, + handle_mask=handle_mask, + handle_meta=handle_meta, + uncertainty_correlation=uncertainty_correlation, + compare_wcs=compare_wcs, + **kwds, + ) + + def _slice_wcs(self, slices): + """The ``__call__()`` method of gWCS doesn't appear to conform to the + APE 14 interface for WCS implementations, and doesn't react to slicing + properly. We override NDSlicing's method to do what we want. + """ + if not isinstance(self.wcs, gWCS): + return self.wcs + + # Sanitize the slices, catching some errors early + if not isinstance(slices, (tuple, list)): + slices = (slices,) + slices = list(slices) + ndim = len(self.shape) + if len(slices) > ndim: + raise ValueError( + f"Too many dimensions specified in slice {slices}" + ) + + if Ellipsis in slices: + if slices.count(Ellipsis) > 1: + raise IndexError( + "Only one ellipsis can be specified in a slice" + ) + + ell_index = slices.index(Ellipsis) + 1 + slice_fill = [slice(None)] * (ndim - len(slices) + 1) + slices[ell_index:ell_index] = slice_fill + + slices.extend([slice(None)] * (ndim - len(slices))) + + mods = [] + mapped_axes = [] + for i, (slice_, length) in enumerate(zip(slices[::-1], self.shape)): + model = [] + if isinstance(slice_, slice): + if slice_.step and slice_.step > 1: + raise IndexError("Cannot slice with a step") + if slice_.start: + start = ( + length + slice_.start + if slice_.start < 1 + else slice_.start + ) + if start > 0: + model.append(models.Shift(start)) + mapped_axes.append(max(mapped_axes) + 1 if mapped_axes else 0) + elif isinstance(slice_, INTEGER_TYPES): + model.append(models.Const1D(slice_)) + mapped_axes.append(-1) + else: + raise IndexError("Slice not an integer or range") + if model: + mods.append(reduce(Model.__or__, model)) + else: + # If the previous model was an Identity, we can hang this + # one onto that without needing to append a new Identity + if i > 0 and isinstance(mods[-1], models.Identity): + mods[-1] = models.Identity(mods[-1].n_inputs + 1) + else: + mods.append(models.Identity(1)) + + slicing_model = reduce(Model.__and__, mods) + if mapped_axes != list(np.arange(ndim)): + slicing_model = ( + models.Mapping(tuple(max(ax, 0) for ax in mapped_axes)) + | slicing_model + ) + slicing_model.inverse = models.Mapping( + tuple(ax for ax in mapped_axes if ax != -1), n_inputs=ndim + ) + + if ( + isinstance(slicing_model, models.Identity) + and slicing_model.n_inputs == ndim + ): + return self.wcs # Unchanged! + new_wcs = deepcopy(self.wcs) + input_frame = new_wcs.input_frame + for axis, mapped_axis in reversed(list(enumerate(mapped_axes))): + if mapped_axis == -1: + input_frame = remove_axis_from_frame(input_frame, axis) + new_wcs.pipeline[0].frame = input_frame + new_wcs.insert_transform( + new_wcs.input_frame, slicing_model, after=True + ) + return new_wcs + + @property + def variance(self): + """A convenience property to access the contents of ``uncertainty``.""" + return getattr(self.uncertainty, "array", None) + + @variance.setter + def variance(self, value): + self.uncertainty = ( + ADVarianceUncertainty(value) if value is not None else None + ) + + @property + def wcs(self): + """The WCS of the data. This is a gWCS object, not a FITS WCS object. + + This is returning wcs from an inhertited class, see NDData.wcs for more + details. + """ + return super().wcs + + @wcs.setter + def wcs(self, value): + if value is not None and not isinstance(value, gWCS): + raise TypeError("wcs value must be None or a gWCS object") + self._wcs = value + + @property + def shape(self): + """The shape of the data.""" + return self._data.shape + + @property + def size(self): + """The size of the data.""" + return self._data.size
+ + + +class FakeArray: + """A class that pretends to be an array, but is actually a lazy-loaded""" + + def __init__(self, very_faked): + self.data = very_faked + self.shape = (100, 100) # Won't matter. This is just to fool NDData + self.dtype = np.float32 # Same here + + def __getitem__(self, index): + return None + + def __array__(self): + return self.data + + +class NDWindowing: + """A class to allow "windowed" access to some properties of an + ``NDAstroData`` instance. In particular, ``data``, ``uncertainty``, + ``variance``, and ``mask`` return clipped data. + """ + + def __init__(self, target): + self._target = target + + def __getitem__(self, window_slice): + return NDWindowingAstroData(self._target, window=window_slice) + + +class NDWindowingAstroData( + AstroDataMixin, NDArithmeticMixin, NDSlicingMixin, NDData +): + """Allows "windowed" access to some properties of an ``NDAstroData`` + instance. In particular, ``data``, ``uncertainty``, ``variance``, and + ``mask`` return clipped data. + """ + + # pylint: disable=super-init-not-called + def __init__(self, target, window): + self._target = target + self._window = window + + # TODO: __init__ exists in parent classes, but we don't call it. + # Is this a problem? + + def __getattr__(self, attribute): + """Allow access to attributes stored in self.meta['other'], as we do + with AstroData objects. + """ + if attribute.isupper(): + try: + return self._target._get_simple( + attribute, section=self._window + ) + except KeyError: + pass + raise AttributeError( + f"{self.__class__.__name__!r} object has no " + f"attribute {attribute!r}" + ) + + @property + def unit(self): + return self._target.unit + + @property + def wcs(self): + # TODO: Accessing protected member from _target + # pylint: disable=protected-access + return self._target._slice_wcs(self._window) + + @property + def data(self): + # TODO: Accessing protected member from _target + # pylint: disable=protected-access + return self._target._get_simple("_data", section=self._window) + + @property + def uncertainty(self): + # TODO: Accessing protected member from _target + # pylint: disable=protected-access + return self._target._get_uncertainty(section=self._window) + + @property + def variance(self): + if self.uncertainty is not None: + return self.uncertainty.array + + return None + + @property + def mask(self): + # TODO: Accessing protected member from _target + # pylint: disable=protected-access + return self._target._get_simple("_mask", section=self._window) + + +def is_lazy(item): + """Returns True if the item is a lazy-loaded object, False otherwise.""" + return isinstance(item, ImageHDU) or getattr(item, "lazy", False) + + +
+[docs] +class NDAstroData(AstroDataMixin, NDArithmeticMixin, NDSlicingMixin, NDData): + """Implements ``NDData`` with all Mixins, plus some ``AstroData`` + specifics. + + This class implements an ``NDData``-like container that supports reading + and writing as implemented in the ``astropy.io.registry`` and also slicing + (indexing) and simple arithmetics (add, subtract, divide and multiply). + + A very important difference between ``NDAstroData`` and ``NDData`` is that + the former attempts to load all its data lazily. There are also some + important differences in the interface (eg. ``.data`` lets you reset its + contents after initialization). + + Documentation is provided where our class differs. + + See also + -------- + NDData + NDArithmeticMixin + NDSlicingMixin + + Examples + -------- + + The mixins allow operation that are not possible with ``NDData`` or + ``NDDataBase``, i.e. simple arithmetics:: + + >>> from astropy.nddata import StdDevUncertainty + >>> import numpy as np + >>> data = np.ones((3,3), dtype=float) + >>> ndd1 = NDAstroData(data, uncertainty=StdDevUncertainty(data)) + >>> ndd2 = NDAstroData(data, uncertainty=StdDevUncertainty(data)) + >>> ndd3 = ndd1.add(ndd2) + >>> ndd3.data + array([[2., 2., 2.], + [2., 2., 2.], + [2., 2., 2.]]) + >>> ndd3.uncertainty.array + array([[1.41421356, 1.41421356, 1.41421356], + [1.41421356, 1.41421356, 1.41421356], + [1.41421356, 1.41421356, 1.41421356]]) + + see ``NDArithmeticMixin`` for a complete list of all supported arithmetic + operations. + + But also slicing (indexing) is possible:: + + >>> ndd4 = ndd3[1,:] + >>> ndd4.data + array([2., 2., 2.]) + >>> ndd4.uncertainty.array + array([1.41421356, 1.41421356, 1.41421356]) + + See ``NDSlicingMixin`` for a description how slicing works (which + attributes) are sliced. + """ + + def __init__( + self, + data, + uncertainty=None, + mask=None, + wcs=None, + meta=None, + unit=None, + copy=False, + variance=None, + ): + """Initialize an ``NDAstroData`` instance. + + Parameters + ---------- + data : array-like + The actual data. This can be a numpy array, a memmap, or a + ``fits.ImageHDU`` object. + + uncertainty : ``NDUncertainty``-like object, optional + An object that represents the uncertainty of the data. If not + specified, the uncertainty will be set to None. + + mask : array-like, optional + An array that represents the mask of the data. If not specified, + the mask will be set to None. + + wcs : ``gwcs.WCS`` object, optional + The WCS of the data. If not specified, the WCS will be set to None. + + meta : dict-like, optional + A dictionary-like object that holds the meta data. If not + specified, the meta data will be set to None. + + unit : ``astropy.units.Unit`` object, optional + The unit of the data. If not specified, the unit will be set to + None. + + copy : bool, optional + If True, the data, uncertainty, mask, wcs, meta, and unit will be + copied. Otherwise, they will be referenced. Default is False. + + variance : array-like, optional + An array that represents the variance of the data. If not + specified, the variance will be set to None. + + Raises + ------ + ValueError + If ``uncertainty`` and ``variance`` are both specified. + + Notes + ----- + The ``uncertainty`` and ``variance`` parameters are mutually exclusive. + """ + if variance is not None: + if uncertainty is not None: + raise ValueError( + f"Cannot specify both uncertainty and variance" + f"({uncertainty = }, {variance = })." + ) + + uncertainty = ADVarianceUncertainty(variance) + + super().__init__( + FakeArray(data) if is_lazy(data) else data, + None if is_lazy(uncertainty) else uncertainty, + mask, + wcs, + meta, + unit, + copy, + ) + + if is_lazy(data): + self.data = data + if is_lazy(uncertainty): + self.uncertainty = uncertainty + + def __deepcopy__(self, memo): + new = self.__class__( + self._data if is_lazy(self._data) else deepcopy(self.data, memo), + self._uncertainty if is_lazy(self._uncertainty) else None, + self._mask if is_lazy(self._mask) else deepcopy(self.mask, memo), + deepcopy(self.wcs, memo), + None, + self.unit, + ) + new.meta = deepcopy(self.meta, memo) + # Needed to avoid recursion because of uncertainty's weakref to self + if not is_lazy(self._uncertainty): + new.variance = deepcopy(self.variance) + return new + + @property + def window(self): + """Interface to access a section of the data, using lazy access + whenever possible. + + Returns + -------- + An instance of ``NDWindowing``, which provides ``__getitem__``, + to allow the use of square brackets when specifying the window. + Ultimately, an ``NDWindowingAstrodata`` instance is returned. + + Examples + --------- + + >>> ad[0].nddata.window[100:200, 100:200] # doctest: +SKIP + <NDWindowingAstrodata .....> + """ + return NDWindowing(self) + + def _get_uncertainty(self, section=None): + """Return the ADVarianceUncertainty object, or a slice of it.""" + if self._uncertainty is not None: + if is_lazy(self._uncertainty): + if section is None: + self.uncertainty = ADVarianceUncertainty( + self._uncertainty.data + ) + return self.uncertainty + + return ADVarianceUncertainty(self._uncertainty[section]) + + if section is not None: + return self._uncertainty[section] + + return self._uncertainty + + return None + + def _get_simple(self, target, section=None): + """Only use 'section' for image-like objects that have the same shape + as the NDAstroData object; otherwise, return the whole object""" + source = getattr(self, target) + if source is not None: + if is_lazy(source): + if section is None: + ret = np.empty(source.shape, dtype=source.dtype) + ret[:] = source.data + setattr(self, target, ret) + + else: + ret = source[section] + + return ret + + if hasattr(source, "shape"): + if section is None or source.shape != self.shape: + return np.array(source, copy=False) + + return np.array(source, copy=False)[section] + + return source + + return None + + @property + def data(self): + """An array representing the raw data stored in this instance. It + implements a setter. + """ + return self._get_simple("_data") + + @data.setter + def data(self, value): + if value is None: + raise ValueError(f"Cannot set data to {value}.") + + if is_lazy(value): + self.meta["header"] = value.header + + self._data = value + + @property + def uncertainty(self): + return self._get_uncertainty() + + @uncertainty.setter + def uncertainty(self, value): + if value is not None and not is_lazy(value): + # TODO: Accessing protected member from value + # pylint: disable=protected-access + if value._parent_nddata is not None: + value = value.__class__(value, copy=False) + + value.parent_nddata = self + + self._uncertainty = value + + @property + def mask(self): + """Get or set the mask of the data.""" + return self._get_simple("_mask") + + @mask.setter + def mask(self, value): + self._mask = value + + @property + def variance(self): + """A convenience property to access the contents of ``uncertainty``, + squared (as the uncertainty data is stored as standard deviation). + """ + # TODO: Is this supposed to be squared? + arr = self._get_uncertainty() + + if arr is not None: + return arr.array + + return arr + + @variance.setter + def variance(self, value): + self.uncertainty = ( + ADVarianceUncertainty(value) if value is not None else None + ) + +
+[docs] + def set_section(self, section, input_data): + """Sets only a section of the data. This method is meant to prevent + fragmentation in the Python heap, by reusing the internal structures + instead of replacing them with new ones. + + Args + ----- + section : ``slice`` + The area that will be replaced + + input_data : ``NDData``-like instance + This object needs to implement at least ``data``, ``uncertainty``, + and ``mask``. Their entire contents will replace the data in the + area defined by ``section``. + + Examples + --------- + + >>> def setup(): + ... sec = NDData(np.zeros((100,100))) + ... ad[0].nddata.set_section( + ... (slice(None,100),slice(None,100)), + ... sec + ... ) + ... + >>> setup() # doctest: +SKIP + + """ + self.data[section] = input_data.data + + if self.uncertainty is not None: + self.uncertainty.array[section] = input_data.uncertainty.array + + if self.mask is not None: + self.mask[section] = input_data.mask
+ + + def __repr__(self): + if is_lazy(self._data): + return self.__class__.__name__ + "(Memmapped)" + + return super().__repr__() + + # This is a common idiom in numpy, so keep the name. + # pylint: disable=invalid-name + @property + def T(self): + """Transpose the data. This is not a copy of the data.""" + return self.transpose() + +
+[docs] + def transpose(self): + """Transpose the data. This is not a copy of the data.""" + unc = self.uncertainty + new_wcs = deepcopy(self.wcs) + inframe = new_wcs.input_frame + new_wcs.insert_transform( + inframe, + models.Mapping(tuple(reversed(range(inframe.naxes)))), + after=True, + ) + return self.__class__( + self.data.T, + uncertainty=None if unc is None else unc.__class__(unc.array.T), + mask=None if self.mask is None else self.mask.T, + wcs=new_wcs, + copy=False, + )
+
+ +
+ +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/_modules/astrodata/utils.html b/_modules/astrodata/utils.html new file mode 100644 index 00000000..ee52b0be --- /dev/null +++ b/_modules/astrodata/utils.html @@ -0,0 +1,608 @@ + + + + + + + astrodata.utils — astrodata 3.2.0 documentation + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +

Source code for astrodata.utils

+"""Utility functions and classes for AstroData objects."""
+import inspect
+import logging
+import warnings
+from collections import namedtuple
+from functools import wraps
+from traceback import format_stack
+
+import numpy as np
+
+INTEGER_TYPES = (int, np.integer)
+
+__all__ = (
+    "assign_only_single_slice",
+    "astro_data_descriptor",
+    "AstroDataDeprecationWarning",
+    "astro_data_tag",
+    "deprecated",
+    "normalize_indices",
+    "returns_list",
+    "TagSet",
+    "Section",
+)
+
+
+class AstroDataDeprecationWarning(DeprecationWarning):
+    """Warning class for deprecated AstroData methods."""
+
+
+warnings.simplefilter("always", AstroDataDeprecationWarning)
+
+
+def deprecated(reason):
+    """Marks a function as deprecated.
+
+    Parameters
+    ----------
+    reason : str
+        The reason why the function is deprecated
+
+    Returns
+    -------
+    function
+        The decorated function
+
+    Usage
+    -----
+
+    >>> @deprecated("Use another function instead")
+    ... def my_function():
+    ...     pass
+    """
+
+    def decorator_wrapper(fn):
+        @wraps(fn)
+        def wrapper(*args, **kw):
+            current_source = "|".join(format_stack(inspect.currentframe()))
+            if current_source not in wrapper.seen:
+                wrapper.seen.add(current_source)
+                warnings.warn(reason, AstroDataDeprecationWarning)
+            return fn(*args, **kw)
+
+        wrapper.seen = set()
+        return wrapper
+
+    return decorator_wrapper
+
+
+def normalize_indices(slc, nitems):
+    """Normalize a slice or index to a list of indices."""
+    multiple = True
+    if isinstance(slc, slice):
+        start, stop, step = slc.indices(nitems)
+        indices = list(range(start, stop, step))
+    elif isinstance(slc, INTEGER_TYPES) or (
+        isinstance(slc, tuple)
+        and all(isinstance(i, INTEGER_TYPES) for i in slc)
+    ):
+        if isinstance(slc, INTEGER_TYPES):
+            slc = (int(slc),)  # slc's type m
+            multiple = False
+
+        else:
+            multiple = True
+
+        # Normalize negative indices...
+        indices = [(x if x >= 0 else nitems + x) for x in slc]
+
+    else:
+        raise ValueError(f"Invalid index: {slc}")
+
+    if any(i >= nitems for i in indices):
+        raise IndexError("Index out of range")
+
+    return indices, multiple
+
+
+
+[docs] +class TagSet(namedtuple("TagSet", "add remove blocked_by blocks if_present")): + """Named tuple that is used by tag methods to return which actions should + be performed on a tag set. + + All the attributes are optional, and any combination of them can be used, + allowing to create complex tag structures. Read the documentation on the + tag-generating algorithm if you want to better understand the interactions. + + The simplest TagSet, though, tends to just add tags to the global set. + + It can be initialized by position, like any other tuple (the order of the + arguments is the one in which the attributes are listed below). It can + also be initialized by name. + + Attributes + ---------- + add : set of str, optional + Tags to be added to the global set + + remove : set of str, optional + Tags to be removed from the global set + + blocked_by : set of str, optional + Tags that will prevent this TagSet from being applied + + blocks : set of str, optional + Other TagSets containing these won't be applied + + if_present : set of str, optional + This TagSet will be applied only *all* of these tags are present + + Examples + --------- + >>> TagSet() # doctest: +SKIP + TagSet( + add=set(), + remove=set(), + blocked_by=set(), + blocks=set(), + if_present=set() + ) + >>> TagSet({'BIAS', 'CAL'}) # doctest: +SKIP + TagSet( + add={'BIAS', 'CAL'}, + remove=set(), + blocked_by=set(), + blocks=set(), + if_present=set() + ) + >>> TagSet(remove={'BIAS', 'CAL'}) # doctest: +SKIP + TagSet( + add=set(), + remove={'BIAS', 'CAL'}, + blocked_by=set(), + blocks=set(), + if_present=set() + ) + """ + + def __new__( + cls, + add=None, + remove=None, + blocked_by=None, + blocks=None, + if_present=None, + ): + return super().__new__( + cls, + add or set(), + remove or set(), + blocked_by or set(), + blocks or set(), + if_present or set(), + )
+ + + +
+[docs] +def astro_data_descriptor(fn): + """Decorator that will mark a class method as an AstroData descriptor. + Useful to produce list of descriptors, for example. + + If used in combination with other decorators, this one *must* be the + one on the top (ie. the last one applying). It doesn't modify the + method in any other way. + + Args + ----- + fn : method + The method to be decorated + + Returns + -------- + The tagged method (not a wrapper) + """ + fn.descriptor_method = True + return fn
+ + + +
+[docs] +def returns_list(fn): + """Decorator to ensure that descriptors that should return a list (of one + value per extension) only returns single values when operating on single + slices; and vice versa. + + This is a common case, and you can use the decorator to simplify the + logic of your descriptors. + + Args + ----- + fn : method + The method to be decorated + + Returns + -------- + A function + """ + + @wraps(fn) + def wrapper(self, *args, **kwargs): + ret = fn(self, *args, **kwargs) + if self.is_single: + if isinstance(ret, list): + if len(ret) > 1: + logging.warning( + "Descriptor %s returned a list " + "of %s elements when operating on " + "a single slice", + fn.__name__, + len(ret), + ) + + return ret[0] + + return ret + + if isinstance(ret, list): + if len(ret) == len(self): + return ret + + raise IndexError( + f"Incompatible numbers of extensions and " + f"elements in {fn.__name__}" + ) + + return [ret] * len(self) + + return wrapper
+ + + +def assign_only_single_slice(fn): + """Raise `ValueError` if assigning to a non-single slice.""" + + @wraps(fn) + def wrapper(self, *args, **kwargs): + if not self.is_single: + raise ValueError( + "Trying to assign to an AstroData object that " + "is not a single slice" + ) + return fn(self, *args, **kwargs) + + return wrapper + + +
+[docs] +def astro_data_tag(fn): + """Decorator that marks methods of an `AstroData` derived class as part of + the tag-producing system. + + It wraps the method around a function that will ensure a consistent return + value: the wrapped method can return any sequence of sequences of strings, + and they will be converted to a TagSet. If the wrapped method + returns None, it will be turned into an empty TagSet. + + Args + ----- + fn : method + The method to be decorated + + Returns + -------- + A wrapper function + """ + + @wraps(fn) + def wrapper(self): + try: + ret = fn(self) + if ret is not None: + if not isinstance(ret, TagSet): + raise TypeError( + f"Tag function {fn.__name__} didn't return a TagSet" + ) + + return TagSet(*tuple(set(s) for s in ret)) + + except KeyError: + pass + + # Return empty TagSet for the "doesn't apply" case + return TagSet() + + wrapper.tag_method = True + return wrapper
+ + + +
+[docs] +class Section(tuple): + """A class to handle n-dimensional sections""" + + def __new__(cls, *args, **kwargs): + # Ensure that the order of keys is what we want + axis_names = [x for axis in "xyzuvw" for x in (f"{axis}1", f"{axis}2")] + + _dict = dict(zip(axis_names, args + ("",) * len(kwargs))) + + _dict.update(kwargs) + + if list(_dict.values()).count("") or (len(_dict) % 2): + raise ValueError("Cannot initialize 'Section' object") + + instance = tuple.__new__(cls, tuple(_dict.values())) + instance._axis_names = tuple(_dict.keys()) + + if not all(np.diff(instance)[::2] > 0): + raise ValueError( + "Not all 'Section' end coordinates exceed the " + "start coordinates" + ) + + return instance + + @property + def axis_dict(self): + return dict(zip(self._axis_names, self)) + + def __getnewargs__(self): + return tuple(self) + + def __getattr__(self, attr): + if attr in self._axis_names: + return self.axis_dict[attr] + + raise AttributeError(f"No such attribute '{attr}'") + + def __repr__(self): + return ( + "Section(" + + ", ".join([f"{k}={self.axis_dict[k]}" for k in self._axis_names]) + + ")" + ) + + @property + def ndim(self): + """The number of dimensions in the section.""" + return len(self) // 2 + +
+[docs] + @staticmethod + def from_shape(value): + """Produce a Section object defining a given shape.""" + return Section(*[y for x in reversed(value) for y in (0, x)])
+ + +
+[docs] + @staticmethod + def from_string(value): + """The inverse of __str__, produce a Section object from a string.""" + return Section( + *[ + y + for x in value.strip("[]").split(",") + for start, end in [x.split(":")] + for y in ( + None if start == "" else int(start) - 1, + None if end == "" else int(end), + ) + ] + )
+ + +
+[docs] + @deprecated( + "Renamed to 'as_iraf_section', this is just an alias for now " + "and will be removed in a future version." + ) + def asIRAFsection(self): # pylint: disable=invalid-name + """Deprecated, see as_iraf_section""" + return self.as_iraf_section()
+ + +
+[docs] + def as_iraf_section(self): + """Produce string of style '[x1:x2,y1:y2]' that is 1-indexed + and end-inclusive + """ + return ( + "[" + + ",".join( + [ + ":".join( + [ + str(self.axis_dict[axis] + 1), + str(self.axis_dict[axis.replace("1", "2")]), + ] + ) + for axis in self._axis_names[::2] + ] + ) + + "]" + )
+ + +
+[docs] + def asslice(self, add_dims=0): + """Return the Section object as a slice/list of slices. Higher + dimensionality can be achieved with the add_dims parameter. + """ + return (slice(None),) * add_dims + tuple( + slice(self.axis_dict[axis], self.axis_dict[axis.replace("1", "2")]) + for axis in reversed(self._axis_names[::2]) + )
+ + +
+[docs] + def contains(self, section): + """Return True if the supplied section is entirely within self""" + if self.ndim != section.ndim: + raise ValueError("Sections have different dimensionality") + + con1 = all(s2 >= s1 for s1, s2 in zip(self[::2], section[::2])) + + if not con1: + return False + + con2 = all(s2 <= s1 for s1, s2 in zip(self[1::2], section[1::2])) + + return con1 and con2
+ + +
+[docs] + def is_same_size(self, section): + """Return True if the Sections are the same size""" + return np.array_equal(np.diff(self)[::2], np.diff(section)[::2])
+ + +
+[docs] + def overlap(self, section): + """Determine whether the two sections overlap. If so, the Section + common to both is returned, otherwise None + """ + if self.ndim != section.ndim: + raise ValueError("Sections have different dimensionality") + + mins = [max(s1, s2) for s1, s2 in zip(self[::2], section[::2])] + maxs = [min(s1, s2) for s1, s2 in zip(self[1::2], section[1::2])] + + try: + return self.__class__( + *[v for pair in zip(mins, maxs) for v in pair] + ) + + except ValueError as err: + logging.warning( + "Sections do not overlap, recieved %s: %s", + err.__class__.__name__, + err, + ) + + return None
+ + +
+[docs] + def shift(self, *shifts): + """Shift a section in each direction by the specified amount""" + if len(shifts) != self.ndim: + raise ValueError( + f"Number of shifts {len(shifts)} incompatible " + f"with dimensionality {self.ndim}" + ) + return self.__class__( + *[ + x + s + for x, s in zip(self, [ss for s in shifts for ss in [s] * 2]) + ] + )
+
+ +
+ +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/_modules/index.html b/_modules/index.html new file mode 100644 index 00000000..4f07ef11 --- /dev/null +++ b/_modules/index.html @@ -0,0 +1,106 @@ + + + + + + + Overview: module code — astrodata 3.2.0 documentation + + + + + + + + + + + + + + + + + +
+
+
+ + + + +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/_sources/api/astrodata.AstroData.rst.txt b/_sources/api/astrodata.AstroData.rst.txt new file mode 100644 index 00000000..24707c0c --- /dev/null +++ b/_sources/api/astrodata.AstroData.rst.txt @@ -0,0 +1,101 @@ +AstroData +========= + +.. currentmodule:: astrodata + +.. autoclass:: AstroData + :show-inheritance: + + .. rubric:: Attributes Summary + + .. autosummary:: + + ~AstroData.data + ~AstroData.descriptors + ~AstroData.exposed + ~AstroData.ext_tables + ~AstroData.filename + ~AstroData.hdr + ~AstroData.header + ~AstroData.id + ~AstroData.indices + ~AstroData.is_sliced + ~AstroData.mask + ~AstroData.nddata + ~AstroData.orig_filename + ~AstroData.path + ~AstroData.phu + ~AstroData.shape + ~AstroData.tables + ~AstroData.tags + ~AstroData.uncertainty + ~AstroData.variance + ~AstroData.wcs + + .. rubric:: Methods Summary + + .. autosummary:: + + ~AstroData.add + ~AstroData.append + ~AstroData.crop + ~AstroData.divide + ~AstroData.info + ~AstroData.instrument + ~AstroData.is_settable + ~AstroData.load + ~AstroData.multiply + ~AstroData.object + ~AstroData.operate + ~AstroData.read + ~AstroData.reset + ~AstroData.subtract + ~AstroData.table + ~AstroData.telescope + ~AstroData.update_filename + ~AstroData.write + + .. rubric:: Attributes Documentation + + .. autoattribute:: data + .. autoattribute:: descriptors + .. autoattribute:: exposed + .. autoattribute:: ext_tables + .. autoattribute:: filename + .. autoattribute:: hdr + .. autoattribute:: header + .. autoattribute:: id + .. autoattribute:: indices + .. autoattribute:: is_sliced + .. autoattribute:: mask + .. autoattribute:: nddata + .. autoattribute:: orig_filename + .. autoattribute:: path + .. autoattribute:: phu + .. autoattribute:: shape + .. autoattribute:: tables + .. autoattribute:: tags + .. autoattribute:: uncertainty + .. autoattribute:: variance + .. autoattribute:: wcs + + .. rubric:: Methods Documentation + + .. automethod:: add + .. automethod:: append + .. automethod:: crop + .. automethod:: divide + .. automethod:: info + .. automethod:: instrument + .. automethod:: is_settable + .. automethod:: load + .. automethod:: multiply + .. automethod:: object + .. automethod:: operate + .. automethod:: read + .. automethod:: reset + .. automethod:: subtract + .. automethod:: table + .. automethod:: telescope + .. automethod:: update_filename + .. automethod:: write diff --git a/_sources/api/astrodata.AstroDataError.rst.txt b/_sources/api/astrodata.AstroDataError.rst.txt new file mode 100644 index 00000000..b93c97b1 --- /dev/null +++ b/_sources/api/astrodata.AstroDataError.rst.txt @@ -0,0 +1,6 @@ +AstroDataError +============== + +.. currentmodule:: astrodata + +.. autoexception:: AstroDataError diff --git a/_sources/api/astrodata.AstroDataMixin.rst.txt b/_sources/api/astrodata.AstroDataMixin.rst.txt new file mode 100644 index 00000000..a9892094 --- /dev/null +++ b/_sources/api/astrodata.AstroDataMixin.rst.txt @@ -0,0 +1,23 @@ +AstroDataMixin +============== + +.. currentmodule:: astrodata + +.. autoclass:: AstroDataMixin + :show-inheritance: + + .. rubric:: Attributes Summary + + .. autosummary:: + + ~AstroDataMixin.shape + ~AstroDataMixin.size + ~AstroDataMixin.variance + ~AstroDataMixin.wcs + + .. rubric:: Attributes Documentation + + .. autoattribute:: shape + .. autoattribute:: size + .. autoattribute:: variance + .. autoattribute:: wcs diff --git a/_sources/api/astrodata.NDAstroData.rst.txt b/_sources/api/astrodata.NDAstroData.rst.txt new file mode 100644 index 00000000..65784550 --- /dev/null +++ b/_sources/api/astrodata.NDAstroData.rst.txt @@ -0,0 +1,39 @@ +NDAstroData +=========== + +.. currentmodule:: astrodata + +.. autoclass:: NDAstroData + :show-inheritance: + + .. rubric:: Attributes Summary + + .. autosummary:: + + ~NDAstroData.T + ~NDAstroData.data + ~NDAstroData.mask + ~NDAstroData.uncertainty + ~NDAstroData.variance + ~NDAstroData.window + + .. rubric:: Methods Summary + + .. autosummary:: + + ~NDAstroData.set_section + ~NDAstroData.transpose + + .. rubric:: Attributes Documentation + + .. autoattribute:: T + .. autoattribute:: data + .. autoattribute:: mask + .. autoattribute:: uncertainty + .. autoattribute:: variance + .. autoattribute:: window + + .. rubric:: Methods Documentation + + .. automethod:: set_section + .. automethod:: transpose diff --git a/_sources/api/astrodata.Section.rst.txt b/_sources/api/astrodata.Section.rst.txt new file mode 100644 index 00000000..1fa174a9 --- /dev/null +++ b/_sources/api/astrodata.Section.rst.txt @@ -0,0 +1,45 @@ +Section +======= + +.. currentmodule:: astrodata + +.. autoclass:: Section + :show-inheritance: + + .. rubric:: Attributes Summary + + .. autosummary:: + + ~Section.axis_dict + ~Section.ndim + + .. rubric:: Methods Summary + + .. autosummary:: + + ~Section.asIRAFsection + ~Section.as_iraf_section + ~Section.asslice + ~Section.contains + ~Section.from_shape + ~Section.from_string + ~Section.is_same_size + ~Section.overlap + ~Section.shift + + .. rubric:: Attributes Documentation + + .. autoattribute:: axis_dict + .. autoattribute:: ndim + + .. rubric:: Methods Documentation + + .. automethod:: asIRAFsection + .. automethod:: as_iraf_section + .. automethod:: asslice + .. automethod:: contains + .. automethod:: from_shape + .. automethod:: from_string + .. automethod:: is_same_size + .. automethod:: overlap + .. automethod:: shift diff --git a/_sources/api/astrodata.TagSet.rst.txt b/_sources/api/astrodata.TagSet.rst.txt new file mode 100644 index 00000000..2d6191cd --- /dev/null +++ b/_sources/api/astrodata.TagSet.rst.txt @@ -0,0 +1,7 @@ +TagSet +====== + +.. currentmodule:: astrodata + +.. autoclass:: TagSet + :show-inheritance: diff --git a/_sources/api/astrodata.add_header_to_table.rst.txt b/_sources/api/astrodata.add_header_to_table.rst.txt new file mode 100644 index 00000000..920b0cae --- /dev/null +++ b/_sources/api/astrodata.add_header_to_table.rst.txt @@ -0,0 +1,6 @@ +add_header_to_table +=================== + +.. currentmodule:: astrodata + +.. autofunction:: add_header_to_table diff --git a/_sources/api/astrodata.astro_data_descriptor.rst.txt b/_sources/api/astrodata.astro_data_descriptor.rst.txt new file mode 100644 index 00000000..80688c15 --- /dev/null +++ b/_sources/api/astrodata.astro_data_descriptor.rst.txt @@ -0,0 +1,6 @@ +astro_data_descriptor +===================== + +.. currentmodule:: astrodata + +.. autofunction:: astro_data_descriptor diff --git a/_sources/api/astrodata.astro_data_tag.rst.txt b/_sources/api/astrodata.astro_data_tag.rst.txt new file mode 100644 index 00000000..1f224c4d --- /dev/null +++ b/_sources/api/astrodata.astro_data_tag.rst.txt @@ -0,0 +1,6 @@ +astro_data_tag +============== + +.. currentmodule:: astrodata + +.. autofunction:: astro_data_tag diff --git a/_sources/api/astrodata.create.rst.txt b/_sources/api/astrodata.create.rst.txt new file mode 100644 index 00000000..ae5daa40 --- /dev/null +++ b/_sources/api/astrodata.create.rst.txt @@ -0,0 +1,6 @@ +create +====== + +.. currentmodule:: astrodata + +.. autofunction:: create diff --git a/_sources/api/astrodata.from_file.rst.txt b/_sources/api/astrodata.from_file.rst.txt new file mode 100644 index 00000000..fb9081fa --- /dev/null +++ b/_sources/api/astrodata.from_file.rst.txt @@ -0,0 +1,6 @@ +from_file +========= + +.. currentmodule:: astrodata + +.. autofunction:: from_file diff --git a/_sources/api/astrodata.open.rst.txt b/_sources/api/astrodata.open.rst.txt new file mode 100644 index 00000000..37110c63 --- /dev/null +++ b/_sources/api/astrodata.open.rst.txt @@ -0,0 +1,6 @@ +open +==== + +.. currentmodule:: astrodata + +.. autofunction:: open diff --git a/_sources/api/astrodata.returns_list.rst.txt b/_sources/api/astrodata.returns_list.rst.txt new file mode 100644 index 00000000..60a14c66 --- /dev/null +++ b/_sources/api/astrodata.returns_list.rst.txt @@ -0,0 +1,6 @@ +returns_list +============ + +.. currentmodule:: astrodata + +.. autofunction:: returns_list diff --git a/_sources/api/astrodata.version.rst.txt b/_sources/api/astrodata.version.rst.txt new file mode 100644 index 00000000..553303d6 --- /dev/null +++ b/_sources/api/astrodata.version.rst.txt @@ -0,0 +1,6 @@ +version +======= + +.. currentmodule:: astrodata + +.. autofunction:: version diff --git a/_sources/api_short.rst.txt b/_sources/api_short.rst.txt new file mode 100644 index 00000000..e19dc12a --- /dev/null +++ b/_sources/api_short.rst.txt @@ -0,0 +1,13 @@ +Common API for Users +==================== + +This package contains the common API for users of the AstroData system. It +provides a single interface to the data, regardless of the format in which it +is stored. + +If you would like a more extensive description of the astrodata package as a +user, see the |UserGuide|. If you are interested in developing with AstroData, +see the |DeveloperGuide|. + +.. automodapi:: astrodata + :no-inheritance-diagram: diff --git a/_sources/index.rst.txt b/_sources/index.rst.txt new file mode 100644 index 00000000..1fcf4a3d --- /dev/null +++ b/_sources/index.rst.txt @@ -0,0 +1,19 @@ +astrodata Documentation +----------------------- + +This is the documentation for astrodata. + +.. toctree:: + :maxdepth: 1 + :caption: Contents: + + manuals/index + api_short + + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` diff --git a/_sources/manuals/appendix_descriptors.rst.txt b/_sources/manuals/appendix_descriptors.rst.txt new file mode 100644 index 00000000..b808fd8a --- /dev/null +++ b/_sources/manuals/appendix_descriptors.rst.txt @@ -0,0 +1,246 @@ +.. descriptors.rst + +*********************************** +List of Gemini Standard Descriptors +*********************************** + +To run and re-use Gemini primitives and functions this list of Standard +Descriptors must be defined for input data. This also applies to data +that is to be served by the Gemini Observatory Archive (GOA). + +For any ``AstroData`` objects, to get the list of the descriptors that are +defined use the ``AstroData.descriptors`` attribute:: + + >> import astrodata + >> import gemini_instruments + >> ad = astrodata.open('../playdata/N20170609S0154.fits') + + >> ad.descriptors + ('airmass', 'amp_read_area', 'ao_seeing', ..., 'well_depth_setting') + +To get the values:: + + >> ad.airmass() + + >> for descriptor in ad.descriptors: + ... print(descriptor, getattr(ad, descriptor)()) + +Note that not all of the descriptors below are defined for all of the +instruments. For example, ``shuffle_pixels`` is defined only for GMOS data +since only GMOS offers a Nod & Shuffle mode. + + +.. tabularcolumns:: |l|p{3.0in}|l| + + ++--------------------------------+----------------------------------------------------------------+-----------------+ +| **Descriptor** | **Short Definition** | **Python type** | ++--------------------------------+----------------------------------------------------------------+-----------------+ +| | | ad[0].desc() | +| | +-----------------+ +| | | ad.desc() | ++================================+================================================================+=================+ +| airmass | Airmass of the observation. | float | ++--------------------------------+----------------------------------------------------------------+-----------------+ +| amp_read_area | Combination of amplifier name and 1-indexed section relative | str | +| | to the detector. +-----------------+ +| | | list of str | ++--------------------------------+----------------------------------------------------------------+-----------------+ +| ao_seeing | Estimate of the natural seeing as calculated from the | float | +| | adaptive optics systems. | | ++--------------------------------+----------------------------------------------------------------+-----------------+ +| array_name | Name assigned to the array generated by a given amplifier, | str | +| | one array per amplifier. +-----------------+ +| | | list of str | ++--------------------------------+----------------------------------------------------------------+-----------------+ +| array_section | Section covered by the array(s), in 0-indexed pixels, relative | Section | +| | to the detector frame (e.g. position of multiple amps read +-----------------+ +| | within a CCD). Uses ``namedtuple`` "Section" defined in | list of Section | +| | ``gemini_instruments.common``. | | ++--------------------------------+----------------------------------------------------------------+-----------------+ +| azimuth | Pointing position in azimuth, in degrees. | float | ++--------------------------------+----------------------------------------------------------------+-----------------+ +| calibration_key | Key used in the database that the ``getProcessed*`` primitives | str | +| | use to store previous calibration association information. | | ++--------------------------------+----------------------------------------------------------------+-----------------+ +| camera | Name of the camera. | str | ++--------------------------------+----------------------------------------------------------------+-----------------+ +| cass_rotator_pa | Position angle of the Cassegrain rotator, in degrees. | float | ++--------------------------------+----------------------------------------------------------------+-----------------+ +| central_wavelength | Central wavelength, in meters. | float | ++--------------------------------+----------------------------------------------------------------+-----------------+ +| coadds | Number of co-adds. | int | ++--------------------------------+----------------------------------------------------------------+-----------------+ +| data_label | Gemini data label. | str | ++--------------------------------+----------------------------------------------------------------+-----------------+ +| data_section | Section where the sky-exposed data falls, in 0-indexed pixels. | Section | +| | Uses ``namedtuple`` "Section" defined in +-----------------+ +| | ``gemini_instruments.common`` | list of Section | ++--------------------------------+----------------------------------------------------------------+-----------------+ +| dec | Declination of the center of the field, in degrees. | float | ++--------------------------------+----------------------------------------------------------------+-----------------+ +| decker | Name of the decker. | str | ++--------------------------------+----------------------------------------------------------------+-----------------+ +| detector_name | Name assigned to the detector. | str | ++--------------------------------+----------------------------------------------------------------+-----------------+ +| detector_roi_setting | Human readable Region of Interest (ROI) setting | str | ++--------------------------------+----------------------------------------------------------------+-----------------+ +| detector_rois_requested | Section defining the Regions of Interest, in 0-indexed pixels. | list of Section | +| | Uses ``namedtuple`` "Section" defined in | | +| | ``gemini_instruments.common``. | | ++--------------------------------+----------------------------------------------------------------+-----------------+ +| detector_section | Section covered by the detector(s), in 0-indexed pixels, | list | +| | relative to the whole mosaic of detectors. +-----------------+ +| | Uses ``namedtuple`` "Section" defined in | list of Section | +| | ``gemini_instruments.common``. | | ++--------------------------------+----------------------------------------------------------------+-----------------+ +| detector_x_bin | X-axis binning. | int | ++--------------------------------+----------------------------------------------------------------+-----------------+ +| detector_x_offset | Telescope offset along the detector X-axis, in pixels. | float | ++--------------------------------+----------------------------------------------------------------+-----------------+ +| detector_y_bin | Y-axis binning. | int | ++--------------------------------+----------------------------------------------------------------+-----------------+ +| detector_y_offset | Telescope offset along the detector Y-axis, in pixels. | float | ++--------------------------------+----------------------------------------------------------------+-----------------+ +| disperser | Name of the disperser. | str | ++--------------------------------+----------------------------------------------------------------+-----------------+ +| dispersion | Value for the dispersion, in meters per pixel. | float | +| | +-----------------+ +| | | list of float | ++--------------------------------+----------------------------------------------------------------+-----------------+ +| dispersion_axis | Dispersion axis. | int | +| | +-----------------+ +| | | list of int | ++--------------------------------+----------------------------------------------------------------+-----------------+ +| effective_wavelength | Wavelength representing the bandpass or the spectrum coverage. | float | ++--------------------------------+----------------------------------------------------------------+-----------------+ +| elevation | Pointing position in elevation, in degrees. | float | ++--------------------------------+----------------------------------------------------------------+-----------------+ +| exposure_time | Exposure time, in seconds. | float | ++--------------------------------+----------------------------------------------------------------+-----------------+ +| filter_name | Name of the filter combination. | str | ++--------------------------------+----------------------------------------------------------------+-----------------+ +| focal_plane_mask | Name of the mask in the focal plane. | str | ++--------------------------------+----------------------------------------------------------------+-----------------+ +| gain | Gain in electrons per ADU | float | +| | +-----------------+ +| | | list of float | ++--------------------------------+----------------------------------------------------------------+-----------------+ +| gain_setting | Human readable gain setting (eg. low, high) | str | ++--------------------------------+----------------------------------------------------------------+-----------------+ +| gcal_lamp | Returns the name of the GCAL lamp being used, or "Off" if no | str | +| | lamp is in use. | | ++--------------------------------+----------------------------------------------------------------+-----------------+ +| group_id | Gemini observation group ID that identifies compatible data. | str | ++--------------------------------+----------------------------------------------------------------+-----------------+ +| instrument | Name of the instrument | str | ++--------------------------------+----------------------------------------------------------------+-----------------+ +| is_ao | Whether or not the adaptive optics system was used. | bool | ++--------------------------------+----------------------------------------------------------------+-----------------+ +| is_coadds_summed | Whether co-adds are summed or averaged. | bool | ++--------------------------------+----------------------------------------------------------------+-----------------+ +| local_time | Local time. | datetime | ++--------------------------------+----------------------------------------------------------------+-----------------+ +| lyot_stop | Name of the lyot stop. | str | ++--------------------------------+----------------------------------------------------------------+-----------------+ +| mdf_row_id | Mask Definition File row ID of a cut MOS or XD spectrum. | int ?? | ++--------------------------------+----------------------------------------------------------------+-----------------+ +| nod_count | Number of nods to A and B positions. | tuple of int | ++--------------------------------+----------------------------------------------------------------+-----------------+ +| nod_offsets | Nod offsets to A and B positions, in arcseconds | tuple of float | ++--------------------------------+----------------------------------------------------------------+-----------------+ +| nominal_atmospheric_extinction | Nomimal atmospheric extinction, from model. | float | ++--------------------------------+----------------------------------------------------------------+-----------------+ +| nominal_photometric_zeropoint | Nominal photometric zeropoint. | float | +| | +-----------------+ +| | | list of float | ++--------------------------------+----------------------------------------------------------------+-----------------+ +| non_linear_level | Lower boundary of the non-linear regime. | float | +| | +-----------------+ +| | | list of int | ++--------------------------------+----------------------------------------------------------------+-----------------+ +| object | Name of the target (as entered by the user). | str | ++--------------------------------+----------------------------------------------------------------+-----------------+ +| observation_class | Gemini class name for the observation | str | +| | (eg. 'science', 'acq', 'dayCal'). | | ++--------------------------------+----------------------------------------------------------------+-----------------+ +| observation_epoch | Observation epoch. | float | ++--------------------------------+----------------------------------------------------------------+-----------------+ +| observation_id | Gemini observation ID. | str | ++--------------------------------+----------------------------------------------------------------+-----------------+ +| observation_type | Gemini observation type (eg. 'OBJECT', 'FLAT', 'ARC'). | str | ++--------------------------------+----------------------------------------------------------------+-----------------+ +| overscan_section | Section where the overscan data falls, in 0-indexed pixels. | Section | +| | Uses namedtuple "Section" defined in +-----------------+ +| | ``gemini_instruments.common``. | list of Section | ++--------------------------------+----------------------------------------------------------------+-----------------+ +| pixel_scale | Pixel scale in arcsec per pixel. | float | ++--------------------------------+----------------------------------------------------------------+-----------------+ +| program_id | Gemini program ID. | str | ++--------------------------------+----------------------------------------------------------------+-----------------+ +| pupil_mask | Name of the pupil mask. | str ?? | ++--------------------------------+----------------------------------------------------------------+-----------------+ +| qa_state | Gemini quality assessment state (eg. pass, usable, fail). | str | ++--------------------------------+----------------------------------------------------------------+-----------------+ +| ra | Right ascension, in degrees. | float | ++--------------------------------+----------------------------------------------------------------+-----------------+ +| raw_bg | Gemini sky background band. | int ?? | ++--------------------------------+----------------------------------------------------------------+-----------------+ +| raw_cc | Gemini cloud coverage band. | int | ++--------------------------------+----------------------------------------------------------------+-----------------+ +| raw_iq | Gemini image quality band. | int | ++--------------------------------+----------------------------------------------------------------+-----------------+ +| raw_wv | Gemini water vapor band. | int ?? | ++--------------------------------+----------------------------------------------------------------+-----------------+ +| read_mode | Gemini name for combination for gain setting and read setting. | str | ++--------------------------------+----------------------------------------------------------------+-----------------+ +| read_noise | Read noise in electrons. | float | +| | +-----------------+ +| | | list of float | ++--------------------------------+----------------------------------------------------------------+-----------------+ +| read_speed_setting | human readable read mode setting (eg. slow, fast). | str | ++--------------------------------+----------------------------------------------------------------+-----------------+ +| requested_bg | PI requested Gemini sky background band. | int | ++--------------------------------+----------------------------------------------------------------+-----------------+ +| requested_cc | PI requested Gemini cloud coverage band. | int | ++--------------------------------+----------------------------------------------------------------+-----------------+ +| requested_iq | PI requested Gemini image quality band. | int | ++--------------------------------+----------------------------------------------------------------+-----------------+ +| requested_wv | PI requested Gemini water vapor band. | int | ++--------------------------------+----------------------------------------------------------------+-----------------+ +| saturation_level | Saturation level. | int | +| | +-----------------+ +| | | list of int | ++--------------------------------+----------------------------------------------------------------+-----------------+ +| shuffle_pixels | Charge shuffle, in pixels. (nod and shuffle mode) | int | ++--------------------------------+----------------------------------------------------------------+-----------------+ +| slit | Name of the slit. | str | ++--------------------------------+----------------------------------------------------------------+-----------------+ +| target_dec | Declination of the target, in degrees. | float | ++--------------------------------+----------------------------------------------------------------+-----------------+ +| target_ra | Right Ascension of the target, in degrees. | float | ++--------------------------------+----------------------------------------------------------------+-----------------+ +| telescope | Name of the telescope. | str | ++--------------------------------+----------------------------------------------------------------+-----------------+ +| telescope_x_offset | Offset along the telescope's x-axis. | float | ++--------------------------------+----------------------------------------------------------------+-----------------+ +| telescope_y_offset | Offset along the telescope's y-axis. | float | ++--------------------------------+----------------------------------------------------------------+-----------------+ +| ut_date | UT date of the observation. | datetime.date | ++--------------------------------+----------------------------------------------------------------+-----------------+ +| ut_datetime | UT date and time of the observation. | datetime | ++--------------------------------+----------------------------------------------------------------+-----------------+ +| ut_time | UT time of the observation. | datetime.time | ++--------------------------------+----------------------------------------------------------------+-----------------+ +| wavefront_sensor | Wavefront sensor used for the observation. | str | ++--------------------------------+----------------------------------------------------------------+-----------------+ +| wavelength_band | Band associated with the filter or the central wavelength. | str | ++--------------------------------+----------------------------------------------------------------+-----------------+ +| wcs_dec | Declination of the center of field from the WCS keywords. | float | +| | In degrees. | | ++--------------------------------+----------------------------------------------------------------+-----------------+ +| wcs_ra | Right Ascension of the center of field from the WCS keywords. | float | +| | In degrees. | | ++--------------------------------+----------------------------------------------------------------+-----------------+ +| well_depth_setting | Human readable well depth setting (eg. shallow, deep) | str | ++--------------------------------+----------------------------------------------------------------+-----------------+ diff --git a/_sources/manuals/cheatsheet.rst.txt b/_sources/manuals/cheatsheet.rst.txt new file mode 100644 index 00000000..624f6364 --- /dev/null +++ b/_sources/manuals/cheatsheet.rst.txt @@ -0,0 +1,463 @@ +.. cheatsheet + +.. _cheatsheet: + +*********** +Cheat Sheet +*********** + +.. admonition:: Document ID + + PIPE-USER-105_AstrodataCheatSheet + +A data package is available for download if you wish to run the examples +included in this cheat sheet. Download it at: + + ``_ + +To unpack:: + + $ cd + $ tar xvf ad_usermanual_datapkg-v1.tar + $ bunzip2 ad_usermanual/playdata/*.bz2 + +Then go to the ``ad_usermanual/playground`` directory to run the examples. + +Imports +======= + +Import :mod:`astrodata` and :mod:`gemini_instruments`:: + + >> import astrodata + >> import gemini_instruments + +Basic read and write operations +=============================== + +Open a file:: + + >> ad = astrodata.open('../playdata/N20170609S0154.fits') + +Get path and filename:: + + >> ad.path + '../playdata/N20170609S0154.fits' + >> ad.filename + 'N20170609S0154.fits' + +Write to a new file:: + + >> ad.write(filename='new154.fits') + >> ad.filename + N20170609S0154.fits + +Overwrite the file:: + + >> adnew = astrodata.open('new154.fits') + >> adnew.filename + new154.fits + >> adnew.write(overwrite=True) + +Object structure +================ + +Description +----------- +The |AstroData| object is assigned by "tags" that describe the +type of data it contains. The tags are drawn from rules defined in +|gemini_instruments| and are based on header information. + +When mapping a FITS file, each science pixel extension is loaded as a +|NDAstroData| object. The list is zero-indexed. So FITS +extension 1 becomes element 0 of the |AstroData| object. If a ``VAR`` +extension is present, it is loaded to the variance attribute of the +|NDAstroData|. If a ``DQ`` extension is present, it is loaded to the ``.mask`` +attribute of the |NDAstroData|. ``SCI``, ``VAR`` and ``DQ`` are associated +through the ``EXTVER`` keyword value. + +In the file below, each |AstroData| "extension" contains the pixel data, +then an error plane (``.variance``) and a bad pixel mask plane (``.mask``). +|Table| can be attached to an extension, like OBJCAT, or to the +|AstroData| object globally, like REFCAT. (In this case, OBJCAT is a +catalogue of the sources detected in the image, REFCAT is a reference catalog +for the area covered by the whole file.) If other 2D data needs to be +associated with an extension this can also be done, like here with OBJMASK, +a 2D mask matching the sources in the image. + +:: + + >> ad = astrodata.open('../playdata/N20170609S0154_varAdded.fits') + >> ad.info() + Filename: ../playdata/N20170609S0154_varAdded.fits + Tags: ACQUISITION GEMINI GMOS IMAGE NORTH OVERSCAN_SUBTRACTED OVERSCAN_TRIMMED + PREPARED SIDEREAL + Pixels Extensions + Index Content Type Dimensions Format + [ 0] science NDAstroData (2112, 256) float32 + .variance ndarray (2112, 256) float32 + .mask ndarray (2112, 256) int16 + .OBJCAT Table (6, 43) n/a + .OBJMASK ndarray (2112, 256) uint8 + [ 1] science NDAstroData (2112, 256) float32 + .variance ndarray (2112, 256) float32 + .mask ndarray (2112, 256) int16 + .OBJCAT Table (8, 43) n/a + .OBJMASK ndarray (2112, 256) uint8 + [ 2] science NDAstroData (2112, 256) float32 + .variance ndarray (2112, 256) float32 + .mask ndarray (2112, 256) int16 + .OBJCAT Table (7, 43) n/a + .OBJMASK ndarray (2112, 256) uint8 + [ 3] science NDAstroData (2112, 256) float32 + .variance ndarray (2112, 256) float32 + .mask ndarray (2112, 256) int16 + .OBJCAT Table (5, 43) n/a + .OBJMASK ndarray (2112, 256) uint8 + Other Extensions + Type Dimensions + .REFCAT Table (245, 16) + + + +Modifying the structure +----------------------- + +Let's first get our play data loaded. You are encouraged to do a +:meth:`~astrodata.AstroData.info` before and after each structure-modification +step, to see how things change. + +:: + + >> from copy import deepcopy + >> ad = astrodata.open('../playdata/N20170609S0154.fits') + >> adcopy = deepcopy(ad) + >> advar = astrodata.open('../playdata/N20170609S0154_varAdded.fits') + +Append an extension:: + + >> adcopy.append(advar[3]) + >> adcopy.append(advar[3].data) + + +Delete an extension:: + + >> del adcopy[5] + +Delete and add variance and mask planes:: + + >> var = adcopy[4].variance + >> adcopy[4].variance = None + >> adcopy[4].variance = var + +Attach a table to an extension:: + + >> adcopy[3].SMAUG = advar[0].OBJCAT.copy() + + +Attach a table to the |AstroData| object:: + + >> adcopy.DROGON = advar.REFCAT.copy() + +Delete a table:: + + >> del adcopy[3].SMAUG + >> del adcopy.DROGON + + + +Astrodata tags +============== + +:: + + >> ad = astrodata.open('../playdata/N20170521S0925_forStack.fits') + >> ad.tags + {'GMOS', 'OVERSCAN_SUBTRACTED', 'SIDEREAL', 'NORTH', 'OVERSCAN_TRIMMED', + 'PREPARED', 'IMAGE', 'GEMINI'} + + >> type(ad.tags) + + + >> {'IMAGE', 'PREPARED'}.issubset(ad.tags) + True + >> 'PREPARED' in ad.tags + True + + +Headers +======= + +The use of descriptors is favored over direct header access when retrieving +values already represented by descriptors, and when writing instrument agnostic +routines. + +Descriptors +----------- + +:: + + >> ad = astrodata.open('../playdata/N20170609S0154.fits') + >> ad.filter_name() + 'open1-6&g_G0301' + >> ad.filter_name(pretty=True) + 'g' + >> ad.gain() # uses a look-up table to get the correct values + [2.03, 1.97, 1.96, 2.01] + >> ad.hdr['GAIN'] + [1.0, 1.0, 1.0, 1.0] # the wrong values contained in the raw data. + >> ad[0].gain() + 2.03 + >> ad.gain()[0] + 2.03 + + >> ad.descriptors + ('airmass', 'amp_read_area', 'ao_seeing', ... + ...) + + +Direct access to header keywords +-------------------------------- + +:: + + >> ad = astrodata.open('../playdata/N20170609S0154_varAdded.fits') + +Primary Header Unit +******************* + +To see a print out of the full PHU: + + >> ad.phu + +Get value from PHU:: + + >> ad.phu['EXPTIME'] + 1.0 + + >> default = 5. + >> ad.phu.get('BOGUSKEY', default) + 5.0 + +Set PHU keyword, with and without comment:: + + >> ad.phu['NEWKEY'] = 50. + >> ad.phu['ANOTHER'] = (30., 'Some comment') + +Delete PHU keyword:: + + >> del ad.phu['NEWKEY'] + + + +Pixel extension header +********************** +To see a print out of the full header for an extension or all the extensions: + + >> ad[0].hdr + >> list(ad.hdr) + +Get value from an extension header:: + + >> ad[0].hdr['OVERSCAN'] + 469.7444308769482 + >> ad[0].hdr.get('OVERSCAN', default) + +Get keyword value for all extensions:: + + >> ad.hdr['OVERSCAN'] + [469.7444308769482, 469.656175780001, 464.9815279808291, 467.5701178951787] + >> ad.hdr.get('BOGUSKEY', 5.) + [5.0, 5.0, 5.0, 5.0] + +Set extension header keyword, with and without comment:: + + >> ad[0].hdr['NEWKEY'] = 50. + >> ad[0].hdr['ANOTHER'] = (30., 'Some comment') + +Delete an extension keyword:: + + >> del ad[0].hdr['NEWKEY'] + +Table header +************ +See the :ref:`cheatsheet_tables` section. + + +Pixel data +========== + +Arithmetics +----------- +Arithmetics with variance and mask propagation is offered for +``+``, ``-``, ``*``, ``/``, and ``**``. + +:: + + >> ad_hcont = astrodata.open('../playdata/N20170521S0925_forStack.fits') + >> ad_halpha = astrodata.open('../playdata/N20170521S0926_forStack.fits') + + >> adsub = ad_halpha - ad_hcont + + >> ad_halpha[0].data.mean() + 646.11896 + >> ad_hcont[0].data.mean() + 581.81342 + >> adsub[0].data.mean() + 64.305862 + + >> ad_halpha[0].variance.mean() + 669.80664 + >> ad_hcont[0].variance.mean() + 598.46667 + >> adsub[0].variance.mean() + 1268.274 + + + # In place multiplication + >> ad_mult = deepcopy(ad) + >> ad_mult.multiply(ad) + >> ad_mult.multiply(5.) + + + # Using descriptors to operate in-place on extensions. + >> from copy import deepcopy + >> ad = astrodata.open('../playdata/N20170609S0154_varAdded.fits') + >> ad_gain = deepcopy(ad) + >> for (ext, gain) in zip(ad_gain, ad_gain.gain()): + ... ext.multiply(gain) + >> ad_gain[0].data.mean() + 366.39545 + >> ad[0].data.mean() + 180.4904 + >> ad[0].gain() + 2.03 + + +Other pixel data operations +--------------------------- + +:: + + >> import numpy as np + >> ad_halpha[0].mask[300:350,300:350] = 1 + >> np.mean(ad_halpha[0].data[ad_halpha[0].mask==0]) + 657.1994 + >> np.mean(ad_halpha[0].data) + 646.11896 + + +.. _cheatsheet_tables: + +Tables +====== + +Tables are stored as :class:`astropy.table.Table` class. FITS tables are +represented in :mod:`astrodata` as |Table| and FITS headers are stored in the +|NDAstroData| ``meta`` attribute. Most table +access should be done through the |Table| interface. The best reference is the +|astropy| documentation itself. Below are just a few examples. + +:: + + >> ad = astrodata.open('../playdata/N20170609S0154_varAdded.fits') + +Get column names:: + + >> ad.REFCAT.colnames + +Get column content:: + + >> ad.REFCAT['zmag'] + >> ad.REFCAT['zmag', 'zmag_err'] + +Get content of row:: + + >> ad.REFCAT[4] # 5th row + >> ad.REFCAT[4:6] # 5th and 6th rows + + +Get content from specific row and column:: + + >> ad.REFCAT['zmag'][4] + +Add a column:: + + >> new_column = [0] * len(ad.REFCAT) + >> ad.REFCAT['new_column'] = new_column + +Add a row:: + + >> new_row = [0] * len(ad.REFCAT.colnames) + >> new_row[1] = '' # Cat_Id column is of "str" type. + >> ad.REFCAT.add_row(new_row) + +Selecting value from criterion:: + + >> ad.REFCAT['zmag'][ad.REFCAT['Cat_Id'] == '1237662500002005475'] + >> ad.REFCAT['zmag'][ad.REFCAT['zmag'] < 18.] + +Rejecting :class:`numpy.nan` before doing something with the values:: + + >> t = ad.REFCAT # to save typing. + >> t['zmag'][np.where(np.isnan(t['zmag']), 99, t['zmag']) < 18.] + + >> t['zmag'].mean() + nan + >> t['zmag'][np.where(~np.isnan(t['zmag']))].mean() + 20.377306 + +If for some reason you need to access the FITS table headers, here is how to do it. + +To see the FITS headers:: + + >> ad.REFCAT.meta + >> ad[0].OBJCAT.meta + +To retrieve a specific FITS table header:: + + >> ad.REFCAT.meta['header']['TTYPE3'] + 'RAJ2000' + >> ad[0].OBJCAT.meta['header']['TTYPE3'] + 'Y_IMAGE' + +To retrieve all the keyword names matching a selection:: + + >> keynames = [key for key in ad.REFCAT.meta['header'] if key.startswith('TTYPE')] + + +Create new AstroData object +=========================== + +Basic header and data array set to zeros:: + + >> from astropy.io import fits + + >> phu = fits.PrimaryHDU() + >> pixel_data = np.zeros((100,100)) + + >> hdu = fits.ImageHDU() + >> hdu.data = pixel_data + >> ad = astrodata.create(phu) + >> ad.append(hdu, name='SCI') + +or another way:: + + >> hdu = fits.ImageHDU(data=pixel_data, name='SCI') + >> ad = astrodata.create(phu, [hdu]) + +A |Table| as an |AstroData| object:: + + >> from astropy.table import Table + + >> my_astropy_table = Table(list(np.random.rand(2,100)), names=['col1', 'col2']) + >> phu = fits.PrimaryHDU() + + >> ad = astrodata.create(phu) + >> ad.SMAUG = my_astropy_table + + >> phu = fits.PrimaryHDU() + >> ad = astrodata.create(phu) + >> ad.SMAUG = my_fits_table + +WARNING: This last line will not run like the others as we have not defined +``my_fits_table``. This is nonetheless how it is done if you had a FITS table. diff --git a/_sources/manuals/full_api.rst.txt b/_sources/manuals/full_api.rst.txt new file mode 100644 index 00000000..776bbae2 --- /dev/null +++ b/_sources/manuals/full_api.rst.txt @@ -0,0 +1,8 @@ +.. _api: + +************* +Reference API +************* + +.. need to make this a reference for all the modules/functions/private + methods/attrs diff --git a/_sources/manuals/index.rst.txt b/_sources/manuals/index.rst.txt new file mode 100644 index 00000000..6d065a60 --- /dev/null +++ b/_sources/manuals/index.rst.txt @@ -0,0 +1,55 @@ +.. Astrodata Master Manual + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + Manually edited by SC December 2020 + +################ +Astrodata Manual +################ + +.. admonition:: Document ID + + PIPE-USER-120_AstrodataMasterManual + +.. toctree:: + :hidden: + :numbered: + + cheatsheet + usermanual/index + progmanual/index + full_api + +This documentation provides different levels of information: + +- :doc:`cheatsheet` - A refresher on common astrodata operations +- :doc:`usermanual/index` - How to code with astrodata +- :doc:`progmanual/index` - How to code for astrodata +- :doc:`full_api` - The full API documentation for developers. + + +.. raw:: latex + + % Set up the appendix mode and modify the LaTeX toc behavior + \appendix + \noappendicestocpagenum + \addappheadtotoc + + +.. rubric:: Appendix + +.. toctree:: + :maxdepth: 1 + + appendix_descriptors + api + +.. ****************** +.. Indices and tables +.. ****************** + +.. * :ref:`genindex` +.. * :ref:`modindex` +.. * :ref:`search` + +.. todolist:: diff --git a/_sources/manuals/progmanual/adclass.rst.txt b/_sources/manuals/progmanual/adclass.rst.txt new file mode 100644 index 00000000..5fb36f65 --- /dev/null +++ b/_sources/manuals/progmanual/adclass.rst.txt @@ -0,0 +1,397 @@ +.. astrodata.rst + +.. _astrodata: + +************************* +AstroData and Derivatives +************************* + +The |AstroData| class is the main interface to the package. When opening files +or creating new objects, a derivative of this class is returned, as the +|AstroData| class is not intended to be used directly. It provides the logic to +calculate the :ref:`tag set ` for an image, which is common to all +data products. Aside from that, it lacks any kind of specialized knowledge +about the different instruments that produce the FITS files. More importantly, +it defines two methods (``info`` and ``load``) as abstract, meaning that the +class cannot be instantiated directly: a derivative must implement those +methods in order to be useful. Such derivatives can also implement descriptors, +which provide processed metadata in a way that abstracts the user from the raw +information (e.g., the keywords in FITS headers). + +|AstroData| does define a common interface, though. Much of it consists on +implementing semantic behavior (access to components through indices, like a +list; arithmetic using standard operators; etc), mostly by implementing +standard Python methods: + +* Defines a common ``__init__`` function. + +* Implements ``__deepcopy__``. + +* Implements ``__iter__`` to allow sequential iteration over the main set of + components (e.g., FITS science HDUs). + +* Implements ``__getitem__`` to allow data slicing (e.g., ``ad[2:4]`` returns + a new |AstroData| instance that contains only the third and fourth main + components). + +* Implements ``__delitem__`` to allow for data removal based on index. It does + not define ``__setitem__``, though. The basic AstroData series of classes + only allows to append new data blocks, not to replace them in one sweeping + move. + +* Implements ``__iadd__``, ``__isub__``, ``__imul__``, ``__itruediv__``, and + their not-in-place versions, based on them. + +There are a few other methods. For a detailed discussion, please refer to the +:ref:`api`. + +.. _tags_prop_entry: + +The ``tags`` Property +===================== + +Additionally, and crucial to the package, AstroData offers a ``tags`` property, +that under the hood calculates textual tags that describe the object +represented by an instance, and returns a set of strings. Returning a set (as +opposed to a list, or other similar structure) is intentional, because it is +fast to compare sets, e.g., testing for membership; or calculating intersection, +etc., to figure out if a certain dataset belongs to an arbitrary category. + +The implementation for the tags property is just a call to +``AstroData._process_tags()``. This function implements the actual logic behind +calculating the tag set (described :ref:`below `). A derivative class +could redefine the algorithm, or build upon it. + + +Writing an ``AstroData`` Derivative +=================================== + +The first step when creating new |AstroData| derivative hierarchy would be to +create a new class that knows how to deal with some kind of specific data in a +broad sense. + +|AstroData| implements both ``.info()`` and ``.load()`` in ways that are +specific to FITS files. It also introduces a number of FITS-specific methods +and properties, e.g.: + +* The properties ``phu`` and ``hdr``, which return the primary header and + a list of headers for the science HDUs, respectively. + +* A ``write`` method, which will write the data back to a FITS file. + +* A ``_matches_data`` **static** method, which is very important, involved in + guiding for the automatic class choice algorithm during data loading. We'll + talk more about this when dealing with :ref:`registering our classes + `. + +It also defines the first few descriptors, which are common to all Gemini data: +``instrument``, ``object``, and ``telescope``, which are good examples of simple +descriptors that just map a PHU keyword without applying any conversion. + +A typical AstroData programmer will extend this class (|AstroData|). Any of +the classes under the ``gemini_instruments`` package can be used as examples, +but we'll describe the important bits here. + + +Create a package for it +----------------------- + +This is not strictly necessary, but simplifies many things, as we'll see when +talking about *registration*. The package layout is up to the designer, so you +can decide how to do it. For DRAGONS we've settled on the following +recommendation for our internal process (just to keep things familiar):: + + gemini_instruments + __init__.py + instrument_name + __init__.py + adclass.py + lookup.py + +Where ``instrument_name`` would be the package name (for Gemini we group all +our derivative packages under ``gemini_instruments``, and we would import +``gemini_instruments.gmos``, for example). ``__init__.py`` and ``adclass.py`` +would be the only required modules under our recommended layout, with +``lookup.py`` being there just to hold hard-coded values in a module separate +from the main logic. + +``adclass.py`` would contain the declaration of the derivative class, and +``__init__.py`` will contain any code needed to register our class with the +|AstroData| system upon import. + + +Create your derivative class +---------------------------- + +This is an excerpt of a typical derivative module:: + + from astrodata import astro_data_tag, astro_data_descriptor, TagSet + from astrodata import AstroData + + from . import lookup + + class AstroDataInstrument(AstroData): + __keyword_dict = dict( + array_name = 'AMPNAME', + array_section = 'CCDSECT' + ) + + @staticmethod + def _matches_data(source): + return source[0].header.get('INSTRUME', '').upper() == 'MYINSTRUMENT' + + @astro_data_tag + def _tag_instrument(self): + return TagSet(['MYINSTRUMENT']) + + @astro_data_tag + def _tag_image(self): + if self.phu.get('GRATING') == 'MIRROR': + return TagSet(['IMAGE']) + + @astro_data_tag + def _tag_dark(self): + if self.phu.get('OBSTYPE') == 'DARK': + return TagSet(['DARK'], blocks=['IMAGE', 'SPECT']) + + @astro_data_descriptor + def array_name(self): + return self.phu.get(self._keyword_for('array_name')) + + @astro_data_descriptor + def amp_read_area(self): + ampname = self.array_name() + detector_section = self.detector_section() + return "'{}':{}".format(ampname, detector_section) + +.. note:: + An actual Gemini Facility Instrument class will derive from + ``gemini_instruments.AstroDataGemini``, but this is irrelevant + for the example. + +The class typically relies on functionality declared elsewhere, in some +ancestor, e.g., the tag set computation and the ``_keyword_for`` method are +defined at |AstroData|. + +Some highlights: + +* ``__keyword_dict``\ [#keywdict]_ defines one-to-one mappings, assigning a more + readable moniker for an HDU header keyword. The idea here is to prevent + hard-coding the names of the keywords, in the actual code. While these are + typically quite stable and not prone to change, it's better to be safe than + sorry, and this can come in useful during instrument development, which is + the more likely source of instability. The actual value can be extracted by + calling ``self._keyword_for('moniker')``. + +* ``_matches_data`` is a static method. It does not have any knowledge about + the class itself, and it does not work on an *instance* of the class: it's + a member of the class just to make it easier for the AstroData registry to + find it. This method is passed some object containing cues of the internal + structure and contents of the data. This could be, for example, an instance + of ``HDUList``. Using these data, ``_matches_data`` must return a boolean, + with ``True`` meaning "I know how to handle this data". + + Note that ``True`` **does not mean "I have full knowledge of the data"**. It + is acceptable for more than one class to claim compatibility. For a GMOS FITS + file, the classes that will return ``True`` are: |AstroData| (because it is + a FITS file that comply with certain minimum requirements), + `~gemini_instruments.gemini.AstroDataGemini` (the data contains Gemini + Facility common metadata), and `~gemini_instruments.gmos.AstroDataGmos` (the + actual handler!). + + But this does not mean that multiple classes can be valid "final" candidates. + If AstroData's automatic class discovery finds more than one class claiming + matching with the data, it will start discarding them on the basis of + inheritance: any class that appears in the inheritance tree of another one is + dropped, because the more specialized one is preferred. If at some point the + algorithm cannot find more classes to drop, and there is more than one left + in the list, an exception will occur, as AstroData will have no way to choose + one over the other. + +* A number of "tag methods" have been declared. Their naming is a convention, + at the end of the day (the "``_tag_``" prefix, and the related "``_status_``" + one, are *just hints* for the programmer): each team should establish + a convention that works for them. What is important here is to **decorate** + them using `~astrodata.astro_data_tag`, which earmarks the method so that it + can be discovered later, and ensures that it returns an appropriate value. + + A tag method will return either a `~astrodata.TagSet` instance (which can be + empty), or ``None``, which is the same as returning an empty + `~astrodata.TagSet`\ [#tagset1]_. + + **All** these methods will be executed when looking up for tags, and it's up + to the tag set construction algorithm (see :ref:`ad_tags`) to figure out the final + result. In theory, one **could** provide *just one* big method, but this is + feasible only when the logic behind deciding the tag set is simple. The + moment that there are a few competing alternatives, with some conditions + precluding other branches, one may end up with a rather complicated dozens of + lines of logic. Let the algorithm do the heavy work for you: split the tags + as needed to keep things simple, with an easy to understand logic. + + Also, keeping the individual (or related) tags in separate methods lets you + exploit the inheritance, keeping common ones at a higher level, and + redefining them as needed later on, at derived classes. + + Please, refer to `~gemini_instruments.gemini.AstroDataGemini`, + `~gemini_instruments.gmos.AstroDataGmos`, and + `~gemini_instruments.gnirs.AstroDataGnirs` for examples using most of the + features. + +* The `astrodata.AstroData.read` method calls the `astrodata.fits.read_fits` + function, which uses metadata in the FITS headers to determine how the data + should be stored in the |AstroData| object. In particular, the ``EXTNAME`` + and ``EXTVER`` keywords are used to assign individual FITS HDUs, using the + same names (``SCI``, ``DQ``, and ``VAR``) as Gemini-IRAF for the ``data``, + ``mask``, and ``variance`` planes. A ``SCI`` HDU *must* exist if there is + another HDU with the same ``EXTVER``, or else an error will occur. + + If the raw data do not conform to this format, the `astrodata.AstroData.read` + method can be overridden by your class, by having it call the + `astrodata.fits.read_fits` function with an additional parameter, + ``extname_parser``, that provides a function to modify the header. This + function will be called on each HDU before further processing. As an example, + the SOAR Adaptive Module Imager (SAMI) instrument writes raw data as + a 4-extension MEF file, with the extensions having ``EXTNAME`` values + ``im1``, ``im2``, etc. These need to be modified to ``SCI``, and an + appropriate ``EXTVER`` keyword added` [#extver]_\. This can be done by + writing a suitable ``read`` method for the ``AstroDataSami`` class:: + + @classmethod + def read(cls, source, extname_parser=None): + def sami_parser(hdu): + m = re.match('im(\d)', hdu.header.get('EXTNAME', '')) + if m: + hdu.header['EXTNAME'] = ('SCI', 'Added by AstroData') + hdu.header['EXTVER'] = (int(m.group(1)), 'Added by AstroData') + + return super().read(source, extname_parser=extname_parser) + + +* *Descriptors* will make the bulk of the class: again, the name is arbitrary, + and it should be descriptive. What *may* be important here is to use + `~astrodata.astro_data_descriptor` to decorate them. This is *not required*, + because unlike tag methods, descriptors are meant to be called explicitly by + the programmer, but they can still be marked (using this decorator) to be + listed when calling the ``descriptors`` property. The decorator does not + alter the descriptor input or output in any way, so it is always safe to use + it, and you probably should, unless there's a good reason against it (e.g., + if a descriptor is deprecated and you don't want it to show up in lookups). + + More detailed information can be found in :ref:`ad_descriptors`. + + +.. _class_registration: + +Register your class +------------------- + +Finally, you need to include your class in the **AstroData Registry**. This is +an internal structure with a list of all the |AstroData|\-derived classes that +we want to make available for our programs. Including the classes in this +registry is an important step, because a file should be opened using +`astrodata.open` or `astrodata.create`, which uses the registry to identify +the appropriate class (via the ``_matches_data`` methods), instead of having +the user specify it explicitly. + +The version of AstroData prior to DRAGONS had an auto-discovery mechanism, that +explored the source tree looking for the relevant classes and other related +information. This forced a fixed directory structure (because the code needed +to know where to look for files), and gave the names of files and classes +semantic meaning (to know *which* files to look into, for example). Aside from +the rigidness of the scheme, this introduced all sort of inefficiencies, +including an unacceptably high overhead when importing the AstroData package +for the first time during execution. + +In this new version of AstroData we've introduced a more manageable scheme, +that places the discovery responsibility on the programmer. A typical +``__init__.py`` file on an instrument package will look like this:: + + __all__ = ['AstroDataMyInstrument'] + + from astrodata import factory + from .adclass import AstroDataMyInstrument + + factory.addClass(AstroDataMyInstrument) + +The call to ``factory.addClass`` is the one registering the class. This step +**needs** to be done **before** the class can be used effectively in the +AstroData system. Placing the registration step in the ``__init__.py`` file is +convenient, because importing the package will be enough! + +Thus, a script making use of DRAGONS' AstroData to manipulate GMOS data +could start like this:: + + import astrodata + from gemini_instruments import gmos + + ... + + ad = astrodata.open(some_file) + +The first import line is not needed, technically, because the ``gmos`` package +will import it too, anyway, but we'll probably need the ``astrodata`` package +in the namespace anyway, and it's always better to be explicit. Our +typical DRAGONS scripts and modules start like this, instead:: + + import astrodata + import gemini_instruments + +``gemini_instruments`` imports all the packages under it, making knowledge +about all Gemini instruments available for the script, which is perfect for a +multi-instrument pipeline, for example. Loading all the instrument classes is +not typically a burden on memory, though, so it's easier for everyone to take +the more general approach. It also makes things easier on the end user, because +they won't need to know internal details of our packages (like their naming +scheme). We suggest this "*cascade import*" scheme for all new source trees, +letting the user decide which level of detail they need. + +As an additional step, the ``__init__.py`` file in a package may do extra +initialization. For example, for the Gemini modules, one piece of functionality +that is shared across instruments is a descriptor that translates a filter's +name (say "u" or "FeII") to its central wavelength (e.g., +0.35µm, 1.644µm). As it is a rather common function for us, it is implemented +by `~gemini_instruments.gemini.AstroDataGemini`. This class **does not know** +about its daughter classes, though, meaning that it **cannot know** about the +filters offered by their instruments. Instead, we offer a function that can +be used to update the filter → wavelength mapping in +`gemini_instruments.gemini.lookup` so that it is accessible by the +`~gemini_instruments.gemini.AstroDataGemini`\-level descriptor. So our +``gmos/__init__.py`` looks like this:: + + __all__ = ['AstroDataGmos'] + + from astrodata import factory + from ..gemini import addInstrumentFilterWavelengths + from .adclass import AstroDataGmos + from .lookup import filter_wavelengths + + factory.addClass(AstroDataGmos) + # Use the generic GMOS name for both GMOS-N and GMOS-S + addInstrumentFilterWavelengths('GMOS', filter_wavelengths) + +where `~gemini_instruments.gemini.addInstrumentFilterWavelengths` is provided +by the ``gemini`` package to perform the update in a controlled way. + +We encourage package maintainers and creators to follow such explicit +initialization methods, driven by the modules that add functionality +themselves, as opposed to active discovery methods on the core code. This +favors decoupling between modules, which is generally a good idea. + +.. rubric:: Footnotes + +.. [#keywdict] Note that the keyword dictionary is a "private" property of the + class (due to the double-underscore prefix). Each class can define its own + set, which will not be replaced by derivative classes. ``_keyword_for`` is + aware of this and will look up each class up the inheritance chain, in turn, + when looking up for keywords. + +.. [#tagset1] Notice that the example functions will return only + a `~astrodata.TagSet`, if appropriate. This is OK, remember that *every + function* in Python returns a value, which will be ``None``, implicitly, if + you don't specify otherwise. + +.. [#extver] An ``EXTVER`` keyword is not formally required as the + `astrodata.fits.read_fits` method will assign the lowest available integer + to a ``SCI`` header with no ``EXTVER`` keyword (or if its value is -1). But + we wish to be able to identify the original ``im1`` header by assigning it + an ``EXTVER`` of 1, etc. diff --git a/_sources/manuals/progmanual/containers.rst.txt b/_sources/manuals/progmanual/containers.rst.txt new file mode 100644 index 00000000..fe2a1a26 --- /dev/null +++ b/_sources/manuals/progmanual/containers.rst.txt @@ -0,0 +1,96 @@ +.. containers.rst + +.. _containers: + +*************** +Data Containers +*************** + +A third, and very important part of the AstroData core package is the data +container. We have chosen to extend Astropy's |NDData| with our own +requirements, particularly lazy-loading of data using by opening the FITS files +in read-only, memory-mapping mode, and exploiting the windowing capability of +`astropy.io.fits` (using ``section``) to reduce our memory requirements, which +becomes important when reducing data (e.g., stacking). + +We'll describe here how we depart from |NDData|, and how do we integrate the +data containers with the rest of the package. Please refer to |NDData| for the +full interface. + +Our main data container is `astrodata.NDAstroData`. Fundamentally, it is +a derivative of `astropy.nddata.NDData`, plus a number of mixins to add +functionality:: + + class NDAstroData(AstroDataMixin, NDArithmeticMixin, NDSlicingMixin, NDData): + ... + +This allows us out of the box to have proper arithmetic with error +propagation, and slicing the data with the array syntax. + +Our first customization is ``NDAstroData.__init__``. It relies mostly on the +upstream initialization, but customizes it because our class is initialized +with lazy-loaded data wrapped around a custom class +(`astrodata.fits.FitsLazyLoadable`) that mimics a `astropy.io.fits` HDU +instance just enough to play along with |NDData|'s initialization code. + +``FitsLazyLoadable`` is an integral part of our memory-mapping scheme, and +among other things it will scale data on the fly, as memory-mapped FITS data +can only be read unscaled. Our NDAstroData redefines the properties ``data``, +``uncertainty``, and ``mask``, in two ways: + +* To deal with the fact that our class is storing ``FitsLazyLoadable`` + instances, not arrays, as |NDData| would expect. This is to keep data out + of memory as long as possible. + +* To replace lazy-loaded data with a real in-memory array, under certain + conditions (e.g., if the data is modified, as we won't apply the changes to the + original file!) + +Our obsession with lazy-loading and discarding data is directed to reduce +memory fragmentation as much as possible. This is a real problem that can hit +applications dealing with large arrays, particularly when using Python. Given +the choice to optimize for speed or for memory consumption, we've chosen the +latter, which is the more pressing issue. + +We've added another new property, ``window``, that can be used to +explicitly exploit the `astropy.io.fits`'s ``section`` property, to (again) +avoid loading unneeded data to memory. This property returns an instance of +``NDWindowing`` which, when sliced, in turn produces an instance of +``NDWindowingAstroData``, itself a proxy of ``NDAstroData``. This scheme may +seem complex, but it was deemed the easiest and cleanest way to achieve the +result that we were looking for. + +The base ``NDAstroData`` class provides the memory-mapping functionality, +with other important behaviors added by the ``AstroDataMixin``, which can +be used with other |NDData|-like classes (such as ``Spectrum1D``) to add +additional convenience. + +One addition is the ``variance`` property, which allows direct access and +setting of the data's uncertainty, without the user needing to explicitly wrap +it as an ``NDUncertainty`` object. Internally, the variance is stored as an +``ADVarianceUncertainty`` object, which is subclassed from Astropy's standard +``VarianceUncertainty`` class with the addition of a check for negative values +whenever the array is accessed. + +``NDAstroDataMixin`` also changes the default method of combining the ``mask`` +attributes during arithmetic operations from ``logical_or`` to ``bitwise_or``, +since the individual bits in the mask have separate meanings. + +The way slicing affects the ``wcs`` is also changed since DRAGONS regularly +uses the callable nature of ``gWCS`` objects and this is broken by the standard +slicing method. + +Finally, the additional image planes and tables stored in the ``meta`` dict +are exposed as attributes of the ``NDAstroData`` object, and any image planes +that have the same shape as the parent ``NDAstroData`` object will be handled +by ``NDWindowingAstroData``. Sections will be ignored when accessing image +planes with a different shape, as well as tables. + + +.. note:: + + We expect to make changes to ``NDAstroData`` in future releases. In particular, + we plan to make use of the ``unit`` attribute provided by the + |NDData| class and increase the use of memory-mapping by default. These + changes mostly represent increased functionality and we anticipate a high + (and possibly full) degree of backward compatibility. diff --git a/_sources/manuals/progmanual/descriptors.rst.txt b/_sources/manuals/progmanual/descriptors.rst.txt new file mode 100644 index 00000000..e9ae03a2 --- /dev/null +++ b/_sources/manuals/progmanual/descriptors.rst.txt @@ -0,0 +1,65 @@ +.. descriptors.rst + +.. _ad_descriptors: + +*********** +Descriptors +*********** + +Descriptors are just regular methods that translate metadata from the raw +storage (e.g., cards from FITS headers) to values useful for the user, +potentially doing some processing in between. They exist to: + +* Abstract the actual organization of the metadata; e.g. + `~gemini_instruments.gemini.AstroDataGemini` takes the detector gain from + a keyword in the FITS PHU, where `~gemini_instruments.niri.AstroDataNiri` + overrides this to provide a hard-coded value. + + More complex implementations also exist. In order to determine the gain of + a GMOS observation, `~gemini_instruments.gmos.AstroDataGmos` uses the + observation date (provided by a descriptor) to select a particular lookup + table, and then uses the values of other descriptors to select the correct + entry in the table. + +* Provide a common interface to a set of instruments. This simplifies user + training (no need to learn a different API for each instrument), and + facilitates the reuse of code for pipelines, etc. + +* Also, since FITS header keywords are limited to 8 characters, for simple + keyword → value mappings, they provide a more meaningful and readable name. + +Descriptors **should** be decorated using `~astrodata.astro_data_descriptor`. +The only function of this decorator is to ensure that the descriptor is marked +as such: it does not alter its input or output in any way. This lets the user +explore the API of an |AstroData| object via the +`~astrodata.AstroData.descriptors` property. + +Descriptors **can** be decorated with `~astrodata.core.returns_list` to +eliminate the need to code some logic. Some descriptors return single values, +while some return lists, one per extension. Typically, the former are +descriptors that refer to the entire observation (and, for MEF files, are +usually extracted from metadata in the PHU, such as ``airmass``), while the +latter are descriptors where different extensions might return different values +(and typically come from metadata in the individual HDUs, such as ``gain``). +A list is returned even if there is only one extension in the |AstroData| +object, as this allows code to be written generically to iterate over the +|AstroData| object and the descriptor return, without needing to know how many +extensions there are. The `~astrodata.core.returns_list` decorator ensures that +the descriptor returns an appropriate object (value or list), using the +following rules: + +* If the |AstroData| object is not a single slice: + + * If the undecorated descriptor returns a list, an exception is raised + if the list is not the same length as the number of extensions. + * If the undecorated descriptor returns a single value, the decorator + will turn it into a list of the correct length by copying this value. + +* If the |AstroData| object is a single slice and the undecorated + descriptor returns a list, only the first element is returned. + +An example of the use of this decorator is the NIRI +`~gemini_instruments.niri.AstroDataNiri.gain` descriptor, which reads the +value from a lookup table and simply returns it. A single value is only +appropriate if the |AstroData| object is singly-sliced and the decorator ensures +that a list is returned otherwise. diff --git a/_sources/manuals/progmanual/design.rst.txt b/_sources/manuals/progmanual/design.rst.txt new file mode 100644 index 00000000..bab79e65 --- /dev/null +++ b/_sources/manuals/progmanual/design.rst.txt @@ -0,0 +1,82 @@ +.. design.rst + +.. _design: + +************** +General Design +************** + +As astronomical instruments have become more complex, there +has been an increasing need for bespoke reduction packages and pipelines to +deal with the specific needs of each instrument. Despite this +complexity, many of the reduction steps can be very similar and the overall +effort could be reduced significantly by sharing code. In practice, however, +there are often issues regarding the manner in which the data are stored +internally. The purpose of AstroData is to provide a uniform interface to the data +and metadata, in a manner that is independent both of the specific instrument +and the way the data are stored on disk, thereby facilitating this code-sharing. +It is *not* a new astronomical data format. + +One of the main features of AstroData is the use of *descriptors*, which +provide a level of abstraction between the metadata and the code accessing it. +Somebody using the AstroData interface who wishes to know the exposure time +of a particular astronomical observation represented by the ``AstroData`` object +``ad`` can simply write ``ad.exposure_time()`` without needing to concern +themselves about how that value is stored internally, for example, the name +of the FITS header keyword. These are discussed further in :ref:`ad_descriptors`. + +AstroData also provides a clearer representation of the relationships +between different parts of the data produced from a single astronomical +observation. Modern astronomical instruments often contain multiple +detectors that are read out separately and the multi-extension FITS (MEF) +format used by many institutions, including Gemini Observatory, handles +the raw data well. In this format, each detector's data and metadata is +assigned to its own extension, +while there is also a separate extension (the Primary Header Unit, +or PHU) containing additional metadata that applies to the entire +observation. However, as the data are processed, more data and/or +metadata may be added whose relationship is obscured by the limitations +of the MEF format. One example is the creation and propagation of information +describing the quality and uncertainty of the scientific data: while +this was a feature of +Gemini IRAF\ [#iraf]_, the coding required to implement it was cumbersome +and AstroData uses the `astropy.nddata.NDData` class, +as discussed in :ref:`containers`. This makes the relationship between these +data much clearer, and AstroData creates a syntax that makes readily apparent the +roles of other data and metadata that may be created during the reduction +process. + +An ``AstroData`` object therefore consists of one or more self-contained +"extensions" (data and metadata) plus additional data and metadata that is +relevant to all the extensions. In many data reduction processes, the same +operation will be performed on each extension (e.g., subtracting an overscan +region from a CCD frame) and an axiom of AstroData is that iterating over +the extensions produces AstroData "slices" which retain knowledge of the +top-level data and metadata. Since a slice has one (or more) extensions +plus this top-level (meta)data, it too is an ``AstroData`` object and, +specifically, an instance of the same subclass as its parent. + + +A final feature of AstroData is the implementation of very high-level metadata. +These data, called ``tags``, facilitate a key part of the Gemini data reduction +system, DRAGONS, by linking the astronomical data to the recipes +required to process them. They are explained in detail in :ref:`ad_tags` and the +Recipe System Programmers Manual\ [#rsprogman]_. + +.. note:: + + AstroData and DRAGONS have been developed for the reduction of data from + Gemini Observatory, which produces data in the FITS format that is still the + most widely-used format for astronomical data. In light of this, and the + limited resources in the Science User Support Department, we have only + *developed* support for FITS, even though the AstroData format is designed + to be independent of the file format. In some cases, this has led to + uncertainty and internal disagreement over where precisely to engage in + abstraction and, should AstroData support a different file format, we + may find alternative solutions that result in small, but possibly + significant, changes to the API. + + +.. [#iraf] ``_ + +.. [#rsprogman] |RSProgManual| diff --git a/_sources/manuals/progmanual/index.rst.txt b/_sources/manuals/progmanual/index.rst.txt new file mode 100644 index 00000000..751abd29 --- /dev/null +++ b/_sources/manuals/progmanual/index.rst.txt @@ -0,0 +1,22 @@ +.. Astrodata Programmer's Manual documentation master file, created by + sphinx-quickstart on Fri Jun 1 11:08:23 2018. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +=================== +Programmer's Manual +=================== + +.. admonition:: Document ID + + PIPE-USER-104_AstrodataProgManual + +.. toctree:: + :maxdepth: 2 + + intro + design + adclass + containers + tags + descriptors diff --git a/_sources/manuals/progmanual/intro.rst.txt b/_sources/manuals/progmanual/intro.rst.txt new file mode 100644 index 00000000..d2b9a939 --- /dev/null +++ b/_sources/manuals/progmanual/intro.rst.txt @@ -0,0 +1,45 @@ +.. intro.rst + +.. _intro_progmanual: + +************************* +Precedents and Motivation +************************* + + +The Gemini Observatory has produced a number of tools for data processing. +Historically this has translated into a number of IRAF\ [#IRAF]_ packages but +the lack of long-term support for IRAF, coupled with the well-known +difficulty in creating robust reduction pipelines within the IRAF +environment, led to a decision +to adopt Python as a programming tool and a new +package was born: Gemini Python. Gemini Python provided tools to load and +manipulate Gemini-produced multi-extension FITS\ [#FITS]_ (MEF) files, +along with a pipeline that +allowed the construction of reduction recipes. At the center of this package +was the AstroData subpackage, which supported the abstraction of the FITS +files. + +Gemini Python reached version 1.0.1, released during November 2014. In 2015 +the Science User Support Department (SUSD) was created at Gemini, which took on the +responsibility of maintaining the software reduction tools, and started +planning future steps. With improved oversight and time and thought, it became +evident that the design of Gemini Python and, specially, of AstroData, made +further development a daunting task. + +In 2016 a decision was reached to overhaul Gemini Python. While the +principles behind AstroData were sound, the coding involved unnecessary +layers of abstraction and eschewed features of the Python language in favor +of its own implementation. Thus, +|DRAGONS| was born, with a new, simplified (and backward *incompatible*) +AstroData v2.0 (which we will refer to simply as AstroData) + +This manual documents both the high level design and some implementation +details of AstroData, together with an explanation of how to extend the +package to work for new environments. + +.. rubric:: Footnotes + +.. [#IRAF] http://iraf.net +.. [#FITS] The `Flexible Image Transport System `_ +.. [#DRAGONS] The `Data Reduction for Astronomy from Gemini Observatory North and South `_ package diff --git a/_sources/manuals/progmanual/tags.rst.txt b/_sources/manuals/progmanual/tags.rst.txt new file mode 100644 index 00000000..58bef846 --- /dev/null +++ b/_sources/manuals/progmanual/tags.rst.txt @@ -0,0 +1,160 @@ +.. tags.rst + +.. _ad_tags: + +**** +Tags +**** + +We described :ref:`in previous section ` how to generate tags for an +AstroData derivative. In this section we'll describe the algorithm that +generates the complete tag set out of the individual ``TagSet`` instances. The +algorithm collects all the tags in a list and then decides whether to apply +them or not following certain rules, but let's talk about ``TagSet`` first. + +``TagSet`` is actually a standard named tuple customized to generate default +values (``None``) for its missing members. Its signature is:: + + TagSet(add=None, remove=None, blocked_by=None, blocks=None, + if_present=None) + +The most common ``TagSet`` is an **additive** one: ``TagSet(['FOO', 'BAR'])``. +If all you need is to add tags, then you're done here. But the real power of +our tag generating system is that you can specify some conditions to apply a +certain ``TagSet``, or put restrictions on others. The different arguments to +``TagSet`` all expect a list (or some others work in the following way): + +* ``add``: if this ``TagSet`` is selected, then add all these members to the tag + set. +* ``remove``: if this ``TagSet`` is selected, then prevent all these members + from joining the tag set. +* ``blocked_by``: if any of the tags listed in here exist in the tag set, then + discard this ``TagSet`` altogether. +* ``blocks``: discard from the list of unprocessed ones any ``TagSet`` that + would add any of the tags listed here. +* ``if_present``: process this tag only if all the tags listed in here exist in + the tag set at this point. + +Note that ``blocked_by`` and ``blocks`` look like two sides of the same coin. +This is intentional: which one to use is up to the programmer, depending on +what will reduce the amount of typing and/or make the logic easier (sometimes one +wants to block a bunch of other tags from a single one; sometimes one wants a +tag to be blocked by a bunch of others). Furthermore, while ``blocks`` and +``blocked_by`` prevent the entire ``TagSet`` from being added if it contains a +tag affected by these, ``remove`` only affects the specific tag. + +Now, the algorithm works like this: + +#. Collect all the ``TagSet`` generated by methods in the instance that are + decorated using ``astro_data_tag``. +#. Then we sort them out: + + #. Those that subtract tags from the tag set go first (the ones with + non-empty ``remove`` or ``blocks``), allowing them to act early on + #. Those with non-empty ``blocked_by`` are moved to the end of the list, to + ensure that other tags can be generated before them. + #. Those with non-empty ``if_present`` are moved behind those with + ``blocked_by``. + +#. Now that we've sorted the tags, process them sequentially and for each one: + + #. If they require other tags to be present, make sure that this is the case. + If the requirements are not met, drop the tagset. If not... + #. Figure out if any other tag is blocking the tagset. This will be the + case if *any* of the tags to be added is in the "blocked" list, or if + any of the tags added by previous tag sets are in the ``blocked_by`` + list of the one being processed. Then... + #. If all the previous hurdles have been passed, apply the changes declared + by this tag (add, remove, and/or block others). + +Note that Python's sort algorithm is stable. This means, that if two elements +are indistinguishable from the point of view of the sorting algorithm, they are +guaranteed to stay in the same relative position. To better understand how this +affects our tags, and the algorithm itself, let's follow up with an example taken +from real code (the Gemini-generic and GMOS modules):: + + # Simple tagset, with only a constant, additive content + @astro_data_tag + def _tag_instrument(self): + return TagSet(['GMOS']) + + # Simple tagset, also with additive content. This one will + # check if the frame fits the requirements to be classified + # as "GMOS imaging". It returns a value conditionally: + # if this is not imaging, then it will return None, which + # means the algorithm will ignore the value + @astro_data_tag + def _tag_image(self): + if self.phu.get('GRATING') == 'MIRROR': + return TagSet(['IMAGE']) + + # This is a slightly more complex TagSet (but fairly simple, anyway), + # inherited by all Gemini instruments. + @astro_data_tag + def _type_gcal_lamp(self): + if self.phu.get('GCALLAMP') == 'IRhigh': + shut = self.phu.get('GCALSHUT') + if shut == 'OPEN': + return TagSet(['GCAL_IR_ON', 'LAMPON'], + blocked_by=['PROCESSED']) + elif shut == 'CLOSED': + return TagSet(['GCAL_IR_OFF', 'LAMPOFF'], + blocked_by=['PROCESSED']) + + # This tagset is only active when we detect that the frame is + # a bias. In that case we want to prevent the frame from being + # classified as "imaging" or "spectroscopy", which depend on the + # configuration of the instrument + @astro_data_tag + def _tag_bias(self): + if self.phu.get('OBSTYPE') == 'BIAS': + return TagSet(['BIAS', 'CAL'], blocks=['IMAGE', 'SPECT']) + +These four simple tag methods will serve to illustrate the algorithm. Let's pretend +that the requirements for all four of them are somehow met, meaning that we get four +``TagSet`` instances in our list, in some random order. After step 1 in the algorithm, +then, we may have collected the following list:: + + [ TagSet(['GMOS']), + TagSet(['GCAL_IR_OFF', 'LAMPOFF'], blocked_by=['PROCESSED']), + TagSet(['BIAS', 'CAL'], blocks=['IMAGE', 'SPECT']), + TagSet(['IMAGE']) ] + +The algorithm then proceeds to sort them. First, it will promote the ``TagSet`` +with non-empty ``blocks`` or ``remove``:: + + [ TagSet(['BIAS', 'CAL'], blocks=['IMAGE', 'SPECT']), + TagSet(['GMOS']), + TagSet(['GCAL_IR_OFF', 'LAMPOFF'], blocked_by=['PROCESSED']), + TagSet(['IMAGE']) ] + +Note that the other three ``TagSet`` stay in exactly the same order. Now the +algorithm will sort the list again, moving the ones with non-empty +``blocked_by`` to the end:: + + [ TagSet(['BIAS', 'CAL'], blocks=['IMAGE', 'SPECT']), + TagSet(['GMOS']), TagSet(['IMAGE']), + TagSet(['GCAL_IR_OFF', 'LAMPOFF'], blocked_by=['PROCESSED']) ] + +Note that at each step, all the instances (except the ones "being moved") have +kept the same position relative to each other -here's where the "stability" of +the sorting comes into play,- ensuring that each step does not affect the previous +one. Finally, there are no ``if_present`` in our example, so no more instances are +moved around. + +Now the algorithm prepares three empty sets (``tags``, ``removals``, and ``blocked``), +and starts iterating over the ``TagSet`` list. + + 1. For the first ``TagSet`` there are no blocks or removals, so we just add its + contents to the current sets: ``tags = {'BIAS', 'CAL'}``, + ``blocked = {'IMAGE', 'SPECT'}``. + 2. Then comes ``TagSet(['GMOS'])``. Again, there are no removals in place, and + ``GMOS`` is not in the list of blocked tags. Thus, we just add it to the current + tag set: ``tags = {'BIAS', 'CAL', 'GMOS'}``. + 3. When processing ``TagSet(['IMAGE'])``, the algorithm observes that this ``IMAGE`` + is in the ``blocked`` set, and stops processing this tag set. + 4. Finally, neither ``GCAL_IR_OFF`` nor ``LAMPOFF`` are in ``blocked``, and + ``PROCESSED`` is not in ``tags``, meaning that we can add this tag set to + the final one. + +Our result will look something like: ``{'BIAS', 'CAL', 'GMOS', 'GCAL_IR_OFF', 'LAMPOFF'}`` diff --git a/_sources/manuals/usermanual/data.rst.txt b/_sources/manuals/usermanual/data.rst.txt new file mode 100644 index 00000000..0cc7d026 --- /dev/null +++ b/_sources/manuals/usermanual/data.rst.txt @@ -0,0 +1,903 @@ +.. data.rst + +.. _pixel-data: + +********** +Pixel Data +********** + +**Try it yourself** + +Download the data package (:ref:`datapkg`) if you wish to follow along and run the +examples. Then :: + + $ cd /ad_usermanual/playground + $ python + +Then import core astrodata and the Gemini astrodata configurations. :: + + >>> import astrodata + >>> import gemini_instruments + + +Operate on Pixel Data +===================== +The pixel data are stored in the ``AstroData`` object as a list of +``NDAstroData`` objects. The ``NDAstroData`` is a subclass of Astropy's +``NDData`` class which combines in one "package" the pixel values, the +variance, and the data quality plane or mask (as well as associated meta-data). +The data can be retrieved as a standard NumPy ``ndarray``. + +In the sections below, we will present several typical examples of data +manipulation. But first let's start with a quick example on how to access +the pixel data. :: + + >>> ad = astrodata.open('../playdata/N20170609S0154.fits') + + >>> the_data = ad[1].data + >>> type(the_data) + + + >>> # Loop through the extensions + >>> for ext in ad: + ... the_data = ext.data + ... print(the_data.sum()) + 333071030 + 335104458 + 333170484 + 333055206 + +In this example, we first access the pixels for the second extensions. +Remember that in Python, list are zero-indexed, hence we access the second +extension as ``ad[1]``. The ``.data`` attribute contains a NumPy ``ndarray``. +In the for-loop, for each extension, we get the data and use the NumPy +``.sum()`` method to sum the pixel values. Anything that can be done +with a ``ndarray`` can be done on ``AstroData`` pixel data. + + +Arithmetic on AstroData Objects +=============================== +``AstroData`` objects support basic in-place arithmetics with these methods: + ++----------------+-------------+ +| addition | .add() | ++----------------+-------------+ +| subtraction | .subtract() | ++----------------+-------------+ +| multiplication | .multiply() | ++----------------+-------------+ +| division | .divide() | ++----------------+-------------+ + +Normal, not in-place, arithmetics is also possible using the standard +operators, ``+``, ``-``, ``*``, and ``/``. + +The big advantage of using ``AstroData`` to do arithmetics is that the +variance and mask, if present, will be propagated through to the output +``AstroData`` object. We will explore the variance propagation in the next +section and mask usage later in this chapter. + +Simple operations +----------------- +Here are a few examples of arithmetics on ``AstroData`` objects.:: + + >>> ad = astrodata.open('../playdata/N20170521S0925_forStack.fits') + + >>> # Addition + >>> ad.add(50.) + >>> ad = ad + 50. + >>> ad += 50. + + >>> # Subtraction + >>> ad.subtract(50.) + >>> ad = ad - 50. + >>> ad -= 50. + + >>> # Multiplication (Using a descriptor) + >>> ad.multiply(ad.exposure_time()) + >>> ad = ad * ad.exposure_time() + >>> ad *= ad.exposure_time() + + >>> # Division (Using a descriptor) + >>> ad.divide(ad.exposure_time()) + >>> ad = ad / ad.exposure_time() + >>> ad /= ad.exposure_time() + +When the syntax ``adout = adin + 1`` is used, the output variable is a copy +of the original. In the examples above we reassign the result back onto the +original. The two other forms, ``ad.add()`` and ``ad +=`` are in-place +operations. + +When a descriptor returns a list because the value changes for each +extension, a for-loop is needed:: + + >>> for (ext, gain) in zip(ad, ad.gain()): + ... ext.multiply(gain) + +If you want to do the above but on a new object, leaving the original unchanged, +use ``deepcopy`` first. :: + + >>> from copy import deepcopy + >>> adcopy = deepcopy(ad) + >>> for (ext, gain) in zip(adcopy, adcopy.gain()): + ... ext.multiply(gain) + + +Operator Precedence +------------------- +The ``AstroData`` arithmetics methods can be stringed together but beware that +there is no operator precedence when that is done. For arithmetics that +involve more than one operation, it is probably safer to use the normal +Python operator syntax. Here is a little example to illustrate the difference. + +:: + + >>> ad.add(5).multiply(10).subtract(5) + + >>> # means: ad = ((ad + 5) * 10) - 5 + >>> # NOT: ad = ad + (5 * 10) - 5 + +This is because the methods modify the object in-place, one operation after +the other from left to right. This also means that the original is modified. + +This example applies the expected operator precedence:: + + >>> ad = ad + ad * 3 - 40. + >>> # means: ad = ad + (ad * 3) - 40. + +If you need a copy, leaving the original untouched, which is sometimes useful +you can use ``deepcopy`` or just use the normal operator and assign to a new +variable.:: + + >>> adnew = ad + ad * 3 - 40. + + +Variance +======== +When doing arithmetic on an ``AstroData`` object, if a variance is present +it will be propagated appropriately to the output no matter which syntax +you use (the methods or the Python operators). + +Adding a Variance Plane +----------------------- +In this example, we will add the poisson noise to an ``AstroData`` dataset. +The data is still in ADU, therefore the poisson noise as variance is +``signal / gain``. We want to set the variance for each of the pixel +extensions. + +:: + + >>> ad = astrodata.open('../playdata/N20170609S0154.fits') + + >>> for (extension, gain) in zip(ad, ad.gain()): + ... extension.variance = extension.data / gain + +Check ``ad.info()``, you will see a variance plane for each of the four +extensions. + +Automatic Variance Propagation +------------------------------ +As mentioned before, if present, the variance plane will be propagated to the +resulting ``AstroData`` object when doing arithmetics. The variance +calculation assumes that the data are not correlated. + +Let's look into an example. + +:: + + >>> # output = x * x + >>> # var_output = var * x^2 + var * x^2 + >>> ad = astrodata.open('../playdata/N20170609S0154_varAdded.fits') + + >>> ad[1].data[50,50] + 56.160931 + >>> ad[1].variance[50,50] + 96.356529 + >>> adout = ad * ad + >>> adout[1].data[50,50] + 3154.05 + >>> adout[1].variance[50,50] + 607826.62 + +Data Quality Plane +================== +The NDData ``mask`` stores the data quality plane. The simplest form is a +True/False array of the same size at the pixel array. In Astrodata we favor +a bit array that allows for additional information about why the pixel is being +masked. For example at Gemini here is our bit mapping for bad pixels. + ++---------------+-------+ +| Meaning | Value | ++===============+=======+ +| Bad pixel | 1 | ++---------------+-------+ +| Non Linear | 2 | ++---------------+-------+ +| Saturated | 4 | ++---------------+-------+ +| Cosmic Ray | 8 | ++---------------+-------+ +| No Data | 16 | ++---------------+-------+ +| Overlap | 32 | ++---------------+-------+ +| Unilluminated | 64 | ++---------------+-------+ + +(These definitions are located in ``geminidr.gemini.lookups.DQ_definitions``.) + +So a pixel marked 10 in the mask, would be a "non-linear" "cosmic ray". The +``AstroData`` masks are propagated with bitwise-OR operation. For example, +let's say that we are stacking frames. A pixel is set as bad (value 1) +in one frame, saturated in another (value 4), and fine in all the other +the frames (value 0). The mask of the resulting stack will be assigned +a value of 5 for that pixel. + +These bitmasks will work like any other NumPy True/False mask. There is a +usage example below using the mask. + +The mask can be accessed as follow:: + + >>> ad = astrodata.open('../playdata/N20170609S0154_varAdded.fits') + >>> ad.info() + + >>> ad[2].mask + + +Display +======= +Since the data is stored in the ``AstroData`` object as a NumPy ``ndarray`` +any tool that works on ``ndarray`` can be used. To display to DS9 there +is the ``imexam`` package. The ``numdisplay`` package is still available for +now but it is no longer supported by STScI. We will show +how to use ``imexam`` to display and read the cursor position. Read the +documentation on that tool to learn more about what else it has +to offer. + +Displaying with imexam +---------------------- + +Here is an example how to display pixel data to DS9 with ``imexam``. You must +start ``ds9`` before running this example. + +:: + + >>> import imexam + >>> ad = astrodata.open('../playdata/N20170521S0925_forStack.fits') + + # Connect to the DS9 window (should already be opened.) + >>> ds9 = imexam.connect(list(imexam.list_active_ds9())[0]) + + >>> ds9.view(ad[0].data) + + # To scale "a la IRAF" + >>> ds9.view(ad[0].data) + >>> ds9.scale('zscale') + + # To set the mininum and maximum scale values + >>> ds9.view(ad[0].data) + >>> ds9.scale('limits 0 2000') + + +Retrieving cursor position with imexam +-------------------------------------- + +The function ``readcursor()`` can be used to retrieve cursor +position in pixel coordinates. Note that it will **not** respond to +mouse clicks, **only** keyboard entries are acknowledged. + +When invoked, ``readcursor()`` will stop the flow of the program and wait +for the user to put the cursor on top of the image and type a key. A +tuple with three values will be returned: the x and +y coordinates **in 0-based system**, and the value of the key the user +hit. + +:: + + >>> import imexam + >>> ad = astrodata.open('../playdata/N20170521S0925_forStack.fits') + + # Connect to the DS9 window (should already be opened.) + # and display + >>> ds9 = imexam.connect(list(imexam.list_active_ds9())[0]) + >>> ds9.view(ad[0].data) + >>> ds9.scale('zscale') + + + >>> cursor_coo = ds9.readcursor() + >>> print(cursor_coo) + + # To extract only the x,y coordinates + >>> (xcoo, ycoo) = cursor_coo[:2] + >>> print(xcoo, ycoo) + + # If you are also interested in the keystroke + >>> keystroke = cursor_coo[2] + >>> print('You pressed this key: %s' % keystroke) + + +Useful tools from the NumPy, SciPy, and Astropy Packages +======================================================== +Like for the Display section, this section is not really specific to +Astrodata but is rather a quick show-and-tell of a few things that can +be done on the pixels with the big scientific packages NumPy, SciPy, +and Astropy. + +Those three packages are very large and rich. They have their own +extensive documentation and it is highly recommend for the users to learn about what +they have to offer. It might save you from re-inventing the wheel. + +The pixels, the variance, and the mask are stored as NumPy ``ndarray``'s. +Let us go through some basic examples, just to get a feel for how the +data in an ``AstroData`` object can be manipulated. + +ndarray +------- +The data are contained in NumPy ``ndarray`` objects. Any tools that works +on an ``ndarray`` can be used with Astrodata. + +:: + + >>> ad = astrodata.open('../playdata/N20170609S0154.fits') + + >>> data = ad[0].data + + >>> # Shape of the array. (equivalent to NAXIS2, NAXIS1) + >>> data.shape + (2112, 288) + + >>> # Value of a pixel at "IRAF" or DS9 coordinates (100, 50) + >>> data[49,99] + 455 + + >>> # Data type + >>> data.dtype + dtype('uint16') + +The two most important thing to remember for users coming from the IRAF +world or the Fortran world are that the array has the y-axis in the first +index, the x-axis in the second, and that the array indices are zero-indexed, +not one-indexed. The examples above illustrate those two critical +differences. + +It is sometimes useful to know the data type of the values stored in the +array. Here, the file is a raw dataset, fresh off the telescope. No +operations has been done on the pixels yet. The data type of Gemini raw +datasets is always "Unsigned integer (0 to 65535)", ``uint16``. + +.. warning:: + Beware that doing arithmetic on ``uint16`` can lead to unexpected + results. This is a NumPy behavior. If the result of an operation + is higher than the range allowed by ``uint16``, the output value will + be "wrong". The data type will not be modified to accommodate the large + value. A workaround, and a safety net, is to multiply the array by + ``1.0`` to force the conversion to a ``float64``. :: + + >>> a = np.array([65535], dtype='uint16') + >>> a + a + array([65534], dtype=uint16) + >>> 1.0*a + a + array([ 131070.]) + + + +Simple Numpy Statistics +----------------------- +A lot of functions and methods are available in NumPy to probe the array, +too many to cover here, but here are a couple examples. + +:: + + >>> import numpy as np + + >>> ad = astrodata.open('../playdata/N20170609S0154.fits') + >>> data = ad[0].data + + >>> data.mean() + >>> np.average(data) + >>> np.median(data) + +Note how ``mean()`` is called differently from the other two. ``mean()`` +is a ``ndarray`` method, the others are NumPy functions. The implementation +details are clearly well beyond the scope of this manual, but when looking +for the tool you need, keep in mind that there are two sets of functions to +look into. Duplications like ``.mean()`` and ``np.average()`` can happen, +but they are not the norm. The readers are strongly encouraged to refer to +the NumPy documentation to find the tool they need. + + +Clipped Statistics +------------------ +It is common in astronomy to apply clipping to the statistics, a clipped +average, for example. The NumPy ``ma`` module can be used to create masks +of the values to reject. In the examples below, we calculated the clipped +average of the first pixel extension with a rejection threshold set to ++/- 3 times the standard deviation. + +Before Astropy, it was possible to do something like that with only +NumPy tools, like in this example:: + + >>> import numpy as np + + >>> ad = astrodata.open('../playdata/N20170609S0154.fits') + >>> data = ad[0].data + + >>> stddev = data.std() + >>> mean = data.mean() + + >>> clipped_mean = np.ma.masked_outside(data, mean-3*stddev, mean+3*stddev).mean() + +There is no iteration in that example. It is a straight one-time clipping. + +For something more robust, there is an Astropy function that can help, in +particular by adding an iterative process to the calculation. Here is +how it is done:: + + >>> import numpy as np + >>> from astropy.stats import sigma_clip + + >>> ad = astrodata.open('../playdata/N20170609S0154.fits') + >>> data = ad[0].data + + >>> clipped_mean = np.ma.mean(sigma_clip(data, sigma=3)) + + +Filters with SciPy +------------------ +Another common operation is the filtering of an image, for example convolving +with a gaussian filter. The SciPy module ``ndimage.filters`` offers +several functions for image processing. See the SciPy documentation for +more information. + +The example below applies a gaussian filter to the pixel array. + +:: + + >>> from scipy.ndimage import filters + >>> import imexam + + >>> ad = astrodata.open('../playdata/N20170521S0925_forStack.fits') + >>> data = ad[0].data + + >>> # We need to prepare an array of the same size and shape as + >>> # the data array. The result will be put in there. + >>> convolved_data = np.zeros(data.size).reshape(data.shape) + + >>> # We now apply the convolution filter. + >>> sigma = 10. + >>> filters.gaussian_filter(data, sigma, output=convolved_data) + + >>> # Let's visually compare the convolved image with the original + >>> ds9 = imexam.connect(list(imexam.list_active_ds9())[0]) + >>> ds9.view(data) + >>> ds9.scale('zscale') + >>> ds9.frame(2) + >>> ds9.view(convolved_data) + >>> ds9.scale('zscale') + >>> ds9.blink() + >>> # When you are convinced it's been convolved, stop the blinking. + >>> ds9.blink(blink=False) + +Note that there is an Astropy way to do this convolution, with tools in +``astropy.convolution`` package. Beware that for this particular kernel +we have found that the Astropy ``convolve`` function is extremely slow +compared to the SciPy solution. +This is because the SciPy function is optimized for a Gaussian convolution +while the generic ``convolve`` function in Astropy can take in any kernel. +Being able to take in any kernel is a very powerful feature, but the cost +is time. The lesson here is do your research, and find the best tool for +your needs. + + +Many other tools +---------------- +There are many, many other tools available out there. Here are the links to +the three big projects we have featured in this section. + +* NumPy: `www.numpy.org `_ +* SciPy: `www.scipy.org `_ +* Astropy: `www.astropy.org `_ + +Using the Astrodata Data Quality Plane +====================================== +Let us look at an example where the use of the Astrodata mask is +necessary to get correct statistics. A GMOS imaging frame has large sections +of unilluminated pixels; the edges are not illuminated and there are two +bands between the three CCDs that represent the physical gap between the +CCDs. Let us have a look at the pixels to have a better sense of the +data:: + + >>> ad = astrodata.open('../playdata/N20170521S0925_forStack.fits') + >>> import imexam + >>> ds9 = imexam.connect(list(imexam.list_active_ds9())[0]) + + >>> ds9.view(ad[0].data) + >>> ds9.scale('zscale') + +See how the right and left portions of the frame are not exposed to the sky, +and the 45 degree angle cuts of the four corners. The chip gaps too. +If we wanted to do statistics on the whole frames, we certainly would not want +to include those unilluminated areas. We would want to mask them out. + +Let us have a look at the mask associated with that image:: + + >>> ds9.view(ad[0].mask) + >>> ds9.scale('zscale') + +The bad sections are all white (pixel value > 0). There are even some +illuminated pixels that have been marked as bad for a reason or another. + +Let us use that mask to reject the pixels with no or bad information and +do calculations only on the good pixels. For the sake of simplicity we will +just do an average. This is just illustrative. We show various ways to +accomplish the task; choose the one that best suits your need or that you +find most readable. + +:: + + >>> import numpy as np + + >>> # For clarity... + >>> data = ad[0].data + >>> mask = ad[0].mask + + >>> # Reject all flagged pixels and calculate the mean + >>> np.mean(data[mask == 0]) + >>> np.ma.masked_array(data, mask).mean() + + >>> # Reject only the pixels flagged "no_data" (bit 16) + >>> np.mean(data[(mask & 16) == 0]) + >>> np.ma.masked_array(data, mask & 16).mean() + >>> np.ma.masked_where(mask & 16, data).mean() + +The "long" form with ``np.ma.masked_*`` is useful if you are planning to do +more than one operation on the masked array. For example:: + + >>> clean_data = np.ma.masked_array(data, mask) + >>> clean_data.mean() + >>> np.ma.median(clean_data) + >>> clean_data.max() + + +Manipulate Data Sections +======================== +So far we have shown examples using the entire data array. It is possible +to work on sections of that array. If you are already familiar with +Python, you probably already know how to do most if not all of what is in +this section. For readers new to Python, and especially those coming +from IRAF, there are a few things that are worth explaining. + +When indexing a NumPy ``ndarray``, the left most number refers to the +highest dimension's axis. For example, in a 2D array, the IRAF section +are in (x-axis, y-axis) format, while in Python they are in +(y-axis, x-axis) format. Also important to remember is that the ``ndarray`` +is 0-indexed, rather than 1-indexed like in Fortran or IRAF. + +Putting it all together, a pixel position (x,y) = (50,75) in IRAF or from +the cursor on a DS9 frame, is accessed in Python as ``data[74,49]``. +Similarly, the IRAF section [10:20, 30:40] translate in Python to +[9:20, 29:40]. Also remember that when slicing in Python, the upper limit +of the slice is not included in the slice. This is why here we request +20 and 40 rather 19 and 39. + +Let's put it in action. + +Basic Statistics on Section +--------------------------- +In this example, we do simple statistics on a section of the image. + +:: + + >>> import numpy as np + + >>> ad = astrodata.open('../playdata/N20170521S0925_forStack.fits') + >>> data = ad[0].data + + >>> # Get statistics for a 25x25 pixel-wide box centered on pixel + >>> # (50,75) (DS9 frame coordinate) + >>> xc = 49 + >>> yc = 74 + >>> buffer = 25 + >>> (xlow, xhigh) = (xc - buffer//2, xc + buffer//2 + 1) + >>> (ylow, yhigh) = (yc - buffer//2, yc + buffer//2 + 1) + >>> # The section is [62:87, 37:62] + >>> stamp = data[ylow:yhigh, xlow:xhigh] + >>> mean = stamp.mean() + >>> median = np.median(stamp) + >>> stddev = stamp.std() + >>> minimum = stamp.min() + >>> maximum = stamp.max() + + >>> print(' Mean Median Stddev Min Max\n \ + ... %.2f %.2f %.2f %.2f %.2f' % \ + ... (mean, median, stddev, minimum, maximum)) + +Have you noticed that the median is calculated with a function rather +than a method? This is simply because the ``ndarray`` object does not +have a method to calculate the median. + +Example - Overscan Subtraction with Trimming +-------------------------------------------- +Several concepts from previous sections and chapters are used in this +example. The Descriptors are used to retrieve the overscan section and +the data section information from the headers. Statistics are done on the +NumPy ``ndarray`` representing the pixel data. Astrodata arithmetics is +used to subtract the overscan level. Finally, the overscan section is +trimmed off and the modified ``AstroData`` object is written to a new file +on disk. + +To make the example more complete, and to show that when the pixel data +array is trimmed, the variance (and mask) arrays are also trimmed, let us +add a variance plane to our raw data frame. + +:: + + >>> ad = astrodata.open('../playdata/N20170609S0154.fits') + + >>> for (extension, gain) in zip(ad, ad.gain()): + ... extension.variance = extension.data / gain + ... + + >>> # Here is how the data structure looks like before the trimming. + >>> ad.info() + Filename: ../playdata/N20170609S0154.fits + Tags: ACQUISITION GEMINI GMOS IMAGE NORTH RAW SIDEREAL UNPREPARED + + Pixels Extensions + Index Content Type Dimensions Format + [ 0] science NDAstroData (2112, 288) uint16 + .variance ndarray (2112, 288) float64 + [ 1] science NDAstroData (2112, 288) uint16 + .variance ndarray (2112, 288) float64 + [ 2] science NDAstroData (2112, 288) uint16 + .variance ndarray (2112, 288) float64 + [ 3] science NDAstroData (2112, 288) uint16 + .variance ndarray (2112, 288) float64 + + >>> # Let's operate on the first extension. + >>> # + >>> # The section descriptors return the section in a Python format + >>> # ready to use, 0-indexed. + >>> oversec = ad[0].overscan_section() + >>> datasec = ad[0].data_section() + + >>> # Measure the overscan level + >>> mean_overscan = ad[0].data[oversec.y1: oversec.y2, oversec.x1: oversec.x2].mean() + + >>> # Subtract the overscan level. The variance will be propagated. + >>> ad[0].subtract(mean_overscan) + + >>> # Trim the data to remove the overscan section and keep only + >>> # the data section. Note that the WCS will be automatically + >>> # adjusted when the trimming is done. + >>> # + >>> # Here we work on the NDAstroData object to have the variance + >>> # trimmed automatically to the same size as the science array. + >>> # To reassign the cropped NDAstroData, we use the reset() method. + >>> ad[0].reset(ad[0].nddata[datasec.y1:datasec.y2, datasec.x1:datasec.x2] + + >>> # Now look at the dimensions of the first extension, science + >>> # and variance. That extension is smaller than the others. + >>> ad.info() + Filename: ../playdata/N20170609S0154.fits + Tags: ACQUISITION GEMINI GMOS IMAGE NORTH RAW SIDEREAL UNPREPARED + + Pixels Extensions + Index Content Type Dimensions Format + [ 0] science NDAstroData (2112, 256) float64 + .variance ndarray (2112, 256) float64 + [ 1] science NDAstroData (2112, 288) uint16 + .variance ndarray (2112, 288) float64 + [ 2] science NDAstroData (2112, 288) uint16 + .variance ndarray (2112, 288) float64 + [ 3] science NDAstroData (2112, 288) uint16 + .variance ndarray (2112, 288) float64 + + >>> # We can write this to a new file + >>> ad.write('partly_overscan_corrected.fits') + +A new feature presented in this example is the ability to work on the +``NDAstroData`` object directly. This is particularly useful when cropping +the science pixel array as one will want the variance and the mask arrays +cropped exactly the same way. Taking a section of the ``NDAstroData`` +object (ad[0].nddata[y1:y2, x1:x2]), instead of just the ``.data`` array, +does all that for us. + +To reassign the cropped ``NDAstroData`` to the extension one uses the +``.reset()`` method as shown in the example. + +Of course to do the overscan correction correctly and completely, one would +loop over all four extensions. But that's the only difference. + +Data Cubes +========== +Reduced Integral Field Unit (IFU) data is commonly represented as a cube, +a three-dimensional array. The ``data`` component of an ``AstroData`` +object extension can be such a cube, and it can be manipulated and explored +with NumPy, AstroPy, SciPy, imexam, like we did already in this section +with 2D arrays. We can use matplotlib to plot the 1D spectra represented +in the third dimension. + +In Gemini IFU cubes, the first axis is the X-axis, the second, the Y-axis, +and the wavelength is in the third axis. Remember that in a ``ndarray`` +that order is reversed (wlen, y, x). + +In the example below we "collapse" the cube along the wavelenth axis to +create a "white light" image and display it. Then we plot a 1D spectrum +from a given (x,y) position. + +:: + + >>> import imexam + >>> import matplotlib.pyplot as plt + + >>> ds9 = imexam.connect(list(imexam.list_active_ds9())[0]) + + >>> adcube = astrodata.open('../playdata/gmosifu_cube.fits') + >>> adcube.info() + + >>> # Sum along the wavelength axis to create a "white light" image + >>> summed_image = adcube[0].data.sum(axis=0) + >>> ds9.view(summed_image) + >>> ds9.scale('minmax') + + >>> # Plot a 1-D spectrum from the spatial position (14,25). + >>> plt.plot(adcube[0].data[:,24,13]) + >>> plt.show() # might be needed, depends on matplotlibrc interactive setting + + +Now that is nice but it would be nicer if we could plot the x-axis in units +of Angstroms instead of pixels. We use the AstroData's WCS handler, which is +based on ``gwcs.wcs.WCS`` to get the necessary information. A particularity +of ``gwcs.wcs.WCS`` is that it refers to the axes in the "natural" way, +(x, y, wlen) contrary to Python's (wlen, y, x). It truly requires you to pay +attention. + +:: + + >>> import matplotlib.pyplot as plt + + >>> adcube = astrodata.open('../playdata/gmosifu_cube.fits') + + # We get the wavelength axis in Angstroms at the position we want to + # extract, x=13, y=24. + # The wcs call returns a 3-element list, the third element ([2]) contains + # the wavelength values for each pixel along the wavelength axis. + + >>> length_wlen_axis = adcube[0].shape[0] # (wlen, y, x) + >>> wavelengths = adcube[0].wcs(13, 24, range(length_wlen_axis))[2] # (x, y, wlen) + + # We get the intensity along that axis + >>> intensity = adcube[0].data[:, 24, 13] # (wlen, y, x) + + # We plot + plt.clf() + plt.plot(wavelengths, intensity) + plt.show() + + +Plot Data +========= +The main plotting package in Python is ``matplotlib``. We have used it in the +previous section on data cubes to plot a spectrum. There is also the project +called ``imexam`` which provides astronomy-specific tools for the +exploration and measurement of data. We have also used that package above to +display images to DS9. + +In this section we absolutely do not aim at covering all the features of +either package but rather to give a few examples that can get the readers +started in their exploration of the data and of the visualization packages. + +Refer to the projects web pages for full documentation. + +* Matplotlib: `https://matplotlib.org `_ +* imexam: `https://github.com/spacetelescope/imexam `_ + +Matplotlib +---------- +With Matplotlib you have full control on your plot. You do have to do a bit +for work to get it perfect though. However it can produce publication +quality plots. Here we just scratch the surface of Matplotlib. + +:: + + >>> import numpy as np + >>> import matplotlib.pyplot as plt + >>> from astropy import wcs + + >>> ad_image = astrodata.open('../playdata/N20170521S0925_forStack.fits') + >>> ad_spectrum = astrodata.open('../playdata/estgsS20080220S0078.fits') + + >>> # Line plot from image. Row #1044 (y-coordinate) + >>> line_index = 1043 + >>> line = ad_image[0].data[line_index, :] + >>> plt.clf() + >>> plt.plot(line) + >>> plt.show() + + >>> # Column plot from image, averaging across 11 pixels around colum #327 + >>> col_index = 326 + >>> width = 5 + >>> xlow = col_index - width + >>> xhigh = col_index + width + 1 + >>> thick_column = ad_image[0].data[:, xlow:xhigh] + >>> plt.clf() + >>> plt.plot(thick_column.mean(axis=1)) # mean along the width. + >>> plt.show() + >>> plt.ylim(0, 50) # Set the y-axis range + >>> plt.plot(thick_column.mean(axis=1)) + >>> plt.show() + + >>> # Contour plot for a section of an image. + >>> center = (1646, 2355) + >>> width = 15 + >>> xrange = (center[1]-width//2, center[1] + width//2 + 1) + >>> yrange = (center[0]-width//2, center[0] + width//2 + 1) + >>> blob = ad_image[0].data[yrange[0]:yrange[1], xrange[0]:xrange[1]] + >>> plt.clf() + >>> plt.imshow(blob, cmap='gray', origin='lower') + >>> plt.contour(blob) + >>> plt.show() + + >>> # Spectrum in pixels + >>> plt.clf() + >>> plt.plot(ad_spectrum[0].data) + >>> plt.show() + + >>> # Spectrum in Angstroms + >>> spec_wcs = wcs.WCS(ad_spectrum[0].hdr) + >>> pixcoords = np.array(range(ad_spectrum[0].data.shape[0])) + >>> wlen = spec_wcs.wcs_pix2world(pixcoords, 0)[0] + >>> plt.clf() + >>> plt.plot(wlen, ad_spectrum[0].data) + >>> plt.show() + + +imexam +------ +For those who have used IRAF, ``imexam`` is a well-known tool. The Python +``imexam`` reproduces many of of the features of its IRAF predecesor, the interactive mode of +course, but it also offers programmatic tools. One can even control DS9 +from Python. As for Matplotlib, here we really just scratch the surface of +what ``imexam`` has to offer. + +:: + + >>> import imexam + >>> from imexam.imexamine import Imexamine + + >>> ad_image = astrodata.open('../playdata/N20170521S0925_forStack.fits') + + # Display the image + >>> ds9 = imexam.connect(list(imexam.list_active_ds9())[0]) + >>> ds9.view(ad_image[0].data) + >>> ds9.scale('zscale') + + # Run in interactive mode. Try the various commands. + >>> ds9.imexam() + + # Use the programmatic interface + # First initialize an Imexamine object. + >>> plot = Imexamine() + + # Line plot from image. Row #1044 (y-coordinate) + >>> line_index = 1043 + >>> plot.plot_line(0, line_index, ad_image[0].data) + + # Column plot from image, averaging across 11 pixels around colum #327 + # There is no setting for this, so we have to do something similar + # to what we did with matplotlib. + >>> col_index = 326 + >>> width = 5 + >>> xlow = col_index - width + >>> xhigh = col_index + width + 1 + >>> thick_column = ad_image[0].data[:, xlow:xhigh] + >>> mean_column = thick_column.mean(axis=1) + >>> plot.plot_column(0, 0, np.expand_dims(mean_column, 1)) + + >>> # Contour plot for a section of an image. + >>> center = (1646, 2355) # in python coordinates + >>> width = 15 + >>> plot.contour_pars['ncolumns'][0] = width + >>> plot.contour_pars['nlines'][0] = width + >>> plot.contour(center[1], center[0], ad_image[0].data) diff --git a/_sources/manuals/usermanual/headers.rst.txt b/_sources/manuals/usermanual/headers.rst.txt new file mode 100644 index 00000000..fec6cdee --- /dev/null +++ b/_sources/manuals/usermanual/headers.rst.txt @@ -0,0 +1,302 @@ +.. headers.rst + +.. _headers: + +******************** +Metadata and Headers +******************** + +**Try it yourself** + +Download the data package (:ref:`datapkg`) if you wish to follow along and run the +examples. Then :: + + $ cd /ad_usermanual/playground + $ python + +You need to import Astrodata and the Gemini instrument configuration package. + +:: + + >>> import astrodata + >>> import gemini_instruments + +Astrodata Descriptors +===================== + +We show in this chapter how to use the Astrodata Descriptors. But first +let's explain what they are. + +Astrodata Descriptors provide a "header-to-concept" mapping that allows the +user to access header information from a unique interface, regardless of +which instrument the dataset is from. Like for the Astrodata Tags, the +mapping is coded in a configuration package separate from core Astrodata. +For Gemini instruments, that package is named ``gemini_instruments``. + +For example, if the user is interested to know the effective filter used +for an observation, normally one needs to know which specific keyword or +set of keywords to look at for that instrument. However, once the concept +of "filter" is coded as a Descriptor, the user only needs to call the +``filter_name()`` descriptor to retrieve the information. + +The Descriptors are closely associated with the Astrodata Tags. In fact, +they are implemented in the same ``AstroData`` class as the tags. Once +the specific ``AstroData`` class is selected (upon opening the file), all +the tags and descriptors for that class are defined. For example, all the +descriptor functions of GMOS data, ie. the functions that map a descriptor +concept to the actual header content, are defined in the ``AstroDataGmos`` +class. + +This is all completely transparent to the user. One simply opens the data +file and all the descriptors are ready to be used. + +.. note:: + Of course if the Descriptors have not been implemented for that specific + data, they will not work. They should all be defined for Gemini data. + For other sources, the headers can be accessed directly, one keyword at + a time. This type of access is discussed below. This is also useful + when the information needed is not associated with one of the standard + descriptors. + +To get the list of descriptors available for an ``AstroData`` object:: + + >>> ad = astrodata.open('../playdata/N20170609S0154.fits') + >>> ad.descriptors + ('airmass', 'amp_read_area', 'ao_seeing', ... + ...) + +Most Descriptor names are readily understood, but one can get a short +description of what the Descriptor refers to by calling the Python help +function. For example:: + + >>> help(ad.airmass) + >>> help(ad.filter_name) + +The full list of standard descriptors is available in the Appendix +:ref:`descriptors`. + +Accessing Metadata +================== + +Accessing Metadata with Descriptors +----------------------------------- +Whenever possible the Descriptors should be used to get information from +headers. This allows for maximum re-usability of the code as it will then +work on any datasets with an ``AstroData`` class. + +Here are a few examples using Descriptors:: + + >>> ad = astrodata.open('../playdata/N20170609S0154.fits') + + >>> #--- print a value + >>> print('The airmass is : ', ad.airmass()) + The airmass is : 1.089 + + >>> #--- use a value to control the flow + >>> if ad.exposure_time() < 240.: + ... print('This is a short exposure.') + ... else: + ... print('This is a long exposure.') + This is a short exposure. + + >>> #--- multiply all extensions by their respective gain + >>> for ext, gain in zip(ad, ad.gain()): + ... ext *= gain + + >>> #--- do arithmetics + >>> fwhm_pixel = 3.5 + >>> fwhm_arcsec = fwhm_pixel * ad.pixel_scale() + +The return values for Descriptors depend on the nature of the information +being requested and the number of extensions in the ``AstroData`` object. +When the value has words, it will be string, if it is a number +it will be a float or an integer. +The dataset used in this section has 4 extensions. When the descriptor +value can be different for each extension, the descriptor will return a +Python list. + +:: + + >>> ad.airmass() + 1.089 + >>> ad.gain() + [2.03, 1.97, 1.96, 2.01] + >>> ad.filter_name() + 'open1-6&g_G0301' + +Some descriptors accept arguments. For example:: + + >>> ad.filter_name(pretty=True) + 'g' + +A full list of standard descriptors is available in the Appendix +:ref:`descriptors`. + + +Accessing Metadata Directly +--------------------------- +Not all header content is mapped to Descriptors, nor should it. Direct access +is available for header content falling outside the scope of the descriptors. + +One important thing to keep in mind is that the PHU (Primary Header Unit) and +the extension headers are accessed slightly differently. The attribute +``phu`` needs to be used for the PHU, and ``hdr`` for the extension headers. + +Here are some examples of direct header access:: + + >>> ad = astrodata.open('../playdata/N20170609S0154.fits') + + >>> #--- Get keyword value from the PHU + >>> ad.phu['AOFOLD'] + 'park-pos.' + + >>> #--- Get keyword value from a specific extension + >>> ad[0].hdr['CRPIX1'] + 511.862999160781 + + >>> #--- Get keyword value from all the extensions in one call. + >>> ad.hdr['CRPIX1'] + [511.862999160781, 287.862999160781, -0.137000839218696, -224.137000839219] + + + +Whole Headers +------------- +Entire headers can be retrieved as ``fits`` ``Header`` objects:: + + >>> ad = astrodata.open('../playdata/N20170609S0154.fits') + >>> type(ad.phu) + + >>> type(ad[0].hdr) + + +In interactive mode, it is possible to print the headers on the screen as +follows:: + + >>> ad.phu + SIMPLE = T / file does conform to FITS standard + BITPIX = 16 / number of bits per data pixel + NAXIS = 0 / number of data axes + .... + + >>> ad[0].hdr + XTENSION= 'IMAGE ' / IMAGE extension + BITPIX = 16 / number of bits per data pixel + NAXIS = 2 / number of data axes + .... + + + +Updating, Adding and Deleting Metadata +====================================== +Header cards can be updated, added to, or deleted from the headers. The PHU +and the extensions headers are again accessed in a mostly identical way +with ``phu`` and ``hdr``, respectively. + +:: + + >>> ad = astrodata.open('../playdata/N20170609S0154.fits') + +Add and update a keyword, without and with comment:: + + >>> ad.phu['NEWKEY'] = 50. + >>> ad.phu['NEWKEY'] = (30., 'Updated PHU keyword') + + >>> ad[0].hdr['NEWKEY'] = 50. + >>> ad[0].hdr['NEWKEY'] = (30., 'Updated extension keyword') + +Delete a keyword:: + + >>> del ad.phu['NEWKEY'] + >>> del ad[0].hdr['NEWKEY'] + + +World Co-ordinate System attribute +================================== + +The ``wcs`` of an extension's ``nddata`` attribute (eg. ``ad[0].nddata.wcs``; +see :ref:`pixel-data`) is stored as an instance of ``astropy.wcs.WCS`` (a +standard FITS WCS object) or ``gwcs.WCS`` (a `"Generalized WCS" or gWCS +`_ object). This defines a transformation +between array indices and some other co-ordinate system such as "World" +co-ordinates (see `APE 14 +`_). GWCS allows +multiple, almost arbitrary co-ordinate mappings from different calibration +steps (eg. CCD mosaicking, distortion correction & wavelength calibration) to +be combined in a single, reversible transformation chain --- but this +information cannot always be represented as a FITS standard WCS. If a gWCS +object is too complex to be defined by the basic FITS keywords, it gets stored +as a table extension named 'WCS' when the ``AstroData`` instance is saved to a +file (with the same EXTVER as the corresponding 'SCI' array) and the FITS +header keywords are updated to provide an approximation to the true WCS and an +additional keyword ``FITS-WCS`` is added with the value 'APPROXIMATE'. +The representation in the table is produced using +`ASDF `_, with one line of text per row. Likewise, +when the file is re-opened, the gWCS object gets recreated in ``wcs`` from the +table. If the transformation defined by the gWCS object can be accurately +described by standard FITS keywords, then no WCS extension is created as the +gWCS object can be created from these keywords when the file is re-opened. + +In future, it is intended to improve the quality of the FITS approximation +using the Simple Imaging Polynomial convention +(`SIP `_) or +a discrete sampling of the World co-ordinate +values will be stored as part of the FITS WCS, following `Greisen et al. (2006) +`_, S6 (in addition to the +definitive 'WCS' table), allowing standard FITS readers to report accurate +World co-ordinates for each pixel. + + +Adding Descriptors [Advanced Topic] +=================================== +For proper and complete instructions on how to create Astrodata Descriptors, +the reader is invited to refer to the Astrodata Programmer Manual. Here we +provide a simple introduction that might help some readers better understand +Astrodata Descriptors, or serve as a quick reference for those who have +written Astrodata Descriptors in the past but need a little refresher. + +The Astrodata Descriptors are defined in an ``AstroData`` class. The +``AstroData`` class specific to an instrument is located in a separate +package, not in ``astrodata``. For example, for Gemini instruments, all the +various ``AstroData`` classes are contained in the ``gemini_instruments`` +package. + +An Astrodata Descriptor is a function within the instrument's ``AstroData`` +class. The descriptor function is distinguished from normal functions by +applying the ``@astro_data_descriptor`` decorator to it. The descriptor +function returns the value(s) using a Python type, ``int``, ``float``, +``string``, ``list``; it depends on the value being returned. There is no +special "descriptor" type. + +Here is an example of code defining a descriptor:: + + class AstroDataGmos(AstroDataGemini): + ... + @astro_data_descriptor + def detector_x_bin(self): + def _get_xbin(b): + try: + return int(b.split()[0]) + except (AttributeError, ValueError): + return None + + binning = self.hdr.get('CCDSUM') + if self.is_single: + return _get_xbin(binning) + else: + xbin_list = [_get_xbin(b) for b in binning] + # Check list is single-valued + return xbin_list[0] if xbin_list == xbin_list[::-1] else None + +This descriptor returns the X-axis binning as a integer when called on a +single extension, or an object with only one extension, for example after the +GMOS CCDs have been mosaiced. If there are more than one extensions, it +will return a Python list or an integer if the binning is the same for all +the extensions. + +Gemini has defined a standard list of descriptors that should be defined +one way or another for each instrument to ensure the re-usability of our +algorithms. That list is provided in the Appendix :ref:`descriptors`. + +For more information on adding to Astrodata, see the Astrodata Programmer +Manual. diff --git a/_sources/manuals/usermanual/index.rst.txt b/_sources/manuals/usermanual/index.rst.txt new file mode 100644 index 00000000..9c5dff7a --- /dev/null +++ b/_sources/manuals/usermanual/index.rst.txt @@ -0,0 +1,23 @@ +.. Astrodata User Manual master file, created from team template + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + Manually edited by KL Wed Jan 18 2017 + +=========== +User Manual +=========== + +.. admonition:: Document ID + + PIPE-USER-106_AstrodataUserManual + +.. toctree:: + :maxdepth: 2 + + intro + structure + iomef + tags + headers + data + tables diff --git a/_sources/manuals/usermanual/intro.rst.txt b/_sources/manuals/usermanual/intro.rst.txt new file mode 100644 index 00000000..8981afb4 --- /dev/null +++ b/_sources/manuals/usermanual/intro.rst.txt @@ -0,0 +1,225 @@ +.. intro.rst + +.. _intro_usermanual: + +************ +Introduction +************ + +This is the AstroData User's Manual. AstroData is a DRAGONS package. +The current chapter covers basic concepts +like what is the |astrodata| package and how to install it (together with the +other DRAGONS' packages). :ref:`Chapter 2 ` +explains with more details what is |AstroData| and how the data is represented +using it. :ref:`Chapter 3 ` describes input and output operations and +how multi-extension (MEF) FITS files are represented. :ref:`Chapter 4 ` +provides information regarding the |TagSet| class, its usage and a few advanced +topics. In :ref:`Chapter 5 ` you will find information about the FITS +headers and how to access/modify the metadata. The last two chapters, +:ref:`Chapter 6 ` and :ref:`Chapter 7 ` cover more details +about how to read, manipulate and write pixel data and tables, respectively. + + +If you are looking for a quick reference, please, have a look on the +:doc:`../cheatsheet`. + +Reference Documents +=================== + + - |DRAGONS| + - :doc:`../cheatsheet` + - |RSUserManual| + - |RSProgManual| + +What is |astrodata|? +==================== + +|astrodata| is a package that wraps together tools to represent internally +astronomical datasets stored on disks and to properly parse their metadata +using the |AstroData| and the |TagSet| classes. |astrodata| provides uniform +interfaces for working on datasets from different +instruments. Once a dataset has been opened with |astrodata|, the object +"knows about itself". Information like instrument, observation mode, and how +to access headers, is readily available through the uniform interface. All +the details are coded inside the class associated with the instrument, that +class then provides the interface. The appropriate class is selected +automatically when the file is opened and inspected by |astrodata|. + +Currently |astrodata| implements a representation for Multi-Extension FITS +(MEF) files. (Other representations can be implemented.) + + +.. _install: + +Installing Astrodata +==================== + +The |astrodata| package has a few dependencies, |astropy|, |numpy| and others. +The best way to get everything you need is to install Anaconda_, and the +|dragons| stack from conda-forge and Gemini's public conda channel. + +|astrodata| itself is part of |DRAGONS|. It is available from the +repository, as a tar file, or as a conda package. The bare |astrodata| package +does not do much by itself, it needs a companion instrument definitions +package. For Gemini, this is ``gemini_instruments``, also included in +|DRAGONS|. + +Installing Anaconda and the DRAGONS stack +----------------------------------------- +This is required whether you are installing |DRAGONS| from the +repository, the tar file or the conda package. + +#. Install Anaconda. + Go to https://www.anaconda.com/download/ and install the latest 64-bit + Anaconda. + +#. Open a bash session. + Anaconda requires bash. If you are not familiar with bash, note that the + shell configuration files are named ``.bash_profile`` and ``.bashrc``. + During the installation, a PATH setting has been added to your + ``.bash_profile`` or ``.bashrc`` to add the Anaconda bin directory to + the ``PATH``. + +#. Activate Anaconda. + Normal Python 3 installation puts the software in ``~/anaconda3/``.:: + + $ conda init + +#. Set up conda channels. + Configure the ``conda`` package manager to look in conda-forge, and in the + GEMINI Conda Channel. This is a one-time step. It affects current and + future Anaconda installations belonging to the same user on the same + machine.:: + + $ conda config --add channels conda-forge + $ conda config --add channels http://astroconda.gemini.edu/public + +#. Create an environment. + To keep things clean, Anaconda offers virtual environments. Each project + can use its own environment. For example, if you do not want to modify + the software packages needed for a previous project, just create a new + environment for the new project. + + Here we set up an environment where the ``DRAGONS`` dependencies can + be installed without affecting the rest of the system when not using that + virtual environement. The new virtual environment here is named + ``dragons``. The software has been tested with Python 3.10 hence we + recommend that you use this specific version of Python with DRAGONS. + :: + + $ conda create -n dragons python=3.10 dragons ds9 + + +#. Activate your new virtual environment. + :: + + $ conda activate dragons + + +#. Configure DRAGONS. + These configurations are not strictly required when using only |astrodata|. + It is however likely that if you are using |astrodata| you will be using + DRAGONS too at some point. So let's configure it to have it ready to go. + + DRAGONS requires a configuration file located in ``~/.dragons/``. The + ``dragonsrc`` file contains basic configuration for DRAGONS local calibration + manager used by ``reduce``. + + :: + + $ cd ~ + $ mkdir .dragons + $ cd .dragons + $ touch dragonsrc + + Open ``dragonsrc`` with your favorite editor and add these lines:: + [interactive] + browser = one of "safari", "chrome", "firefox" + + [calibs] + databases = ~/.dragons/dragons.db + + Next time you start a DRAGONS project, set the ``databases`` to a path + of your liking, this is where the local calibration database will be written. + + Then configure buffers for ``ds9``:: + + $ cd ~/ + $ cp $CONDA_PREFIX/lib/python3.10/site-packages/gempy/numdisplay/imtoolrc ~/.imtoolrc + $ vi .bash_profile (or use your favority editor) + Add this line to the .bash_profile: + export IMTOOLRC=~/.imtoolrc + + +Update an existing DRAGONS installation +--------------------------------------- +To check which version of DRAGONS you have installed:: + + $ conda list dragons + +To check for newer version:: + + $ conda search dragons + +To update to the newest version:: + + $ conda update dragons + + +Smoke test the Astrodata installation +------------------------------------- +From the configured bash shell:: + + $ type python + python is hashed (/anaconda3/envs/dragons/python) + + Make sure that python is indeed pointing to the Anaconda environment you + have just set up. + +:: + + $ python + >>> import astrodata + >>> import gemini_instruments + + Expected result: Just a python prompt and no error messages. + +Source code availability +------------------------ +The source code is available on Github: + + ``_ + +.. _datapkg: + +Try it yourself +=============== + +**Try it yourself** + +Download the data package if you wish to follow along and run the +examples presented in this manual. It is available at: + + ``_ + +Unpack it:: + + $ cd + $ tar xvf ad_usermanual_datapkg-v1.tar + $ bunzip2 ad_usermanual/playdata/*.bz2 + +Then :: + + $ cd ad_usermanual/playground + $ python + + +Astrodata Support +================= + +Astrodata is developed and supported by staff at the Gemini Observatory. +Questions about the reduction of Gemini data should be directed to the +Gemini Helpdesk system at +``_ +The github issue tracker can be used to report software bugs in DRAGONS +(``_). diff --git a/_sources/manuals/usermanual/iomef.rst.txt b/_sources/manuals/usermanual/iomef.rst.txt new file mode 100644 index 00000000..8bb228da --- /dev/null +++ b/_sources/manuals/usermanual/iomef.rst.txt @@ -0,0 +1,546 @@ +.. iomef.rst + +.. _iomef: + +************************************************************ +Input and Output Operations and Extension Manipulation - MEF +************************************************************ + +|AstroData| is not intended to be Multi-Extension FITS (MEF) centric. The core +is independent of the file format. At Gemini, our data model uses MEF. +Therefore we have implemented a FITS handler that maps a MEF to the +internal |AstroData| representation. A different handler can be implemented +for a different file format. + +In this chapter, we present examples that will help the reader understand how +to access the information stored in a MEF with the |AstroData| object and +understand that mapping. + +**Try it yourself** + +Download the data package (:ref:`datapkg`) if you wish to follow along and run the +examples. Then :: + + $ cd /ad_usermanual/playground + $ python + + +Imports +======= + +Before doing anything, you need to import |AstroData| and the Gemini instrument +configuration package |gemini_instruments|. + +:: + + >>> import astrodata + >>> import gemini_instruments + + +Open and access existing dataset +================================ + +Read in the dataset +------------------- + +The file on disk is loaded into the |AstroData| class associated with the +instrument the data is from. This association is done automatically based on +header content. + +:: + + >>> ad = astrodata.open('../playdata/N20170609S0154.fits') + >>> type(ad) + + +From now on, ``ad`` knows it is GMOS data. It knows how to access its headers +and when using the Recipe System (|recipe_system|), it will trigger the +selection of the GMOS primitives and recipes. + +The original path and filename are stored in the object. If you were to write +the |AstroData| object to disk without specifying anything, those path and +filename would be used. :: + + >>> ad.path + '../playdata/N20170609S0154.fits' + >>> ad.filename + 'N20170609S0154.fits' + + +Accessing the content of a MEF file +----------------------------------- + +Accessing pixel data, headers, and tables will be covered in detail in the +following chapters. Here we just introduce the basic content interface. + +For details on the |AstroData| structure, please refer to the +:ref:`previous chapter `. + +|AstroData| uses |NDData| as the core of its structure. Each FITS extension +becomes a |NDAstroData| object, subclassed from |NDData|, and is added to +a list. + +Pixel data +^^^^^^^^^^ + +To access pixel data, the list index and the ``.data`` attribute are used. That +returns a :class:`numpy.ndarray`. The list of |NDAstroData| is zero-indexed. +*Extension number 1 in a MEF is index 0 in an |AstroData| object*. :: + + >>> ad = astrodata.open('../playdata/N20170609S0154_varAdded.fits') + >>> data = ad[0].data + >>> type(data) + + >>> data.shape + (2112, 256) + +Remember that in a :class:`~numpy.ndarray` the y-axis is the first number. + +The variance and data quality planes, the VAR and DQ planes in Gemini MEF +files, are represented by the ``.variance`` and ``.mask`` attributes, +respectively. They are not their own "extension", they don't have their +own index in the list, unlike in a MEF. They are attached to the pixel data, +packaged together by the |NDAstroData| object. They are represented as +:class:`numpy.ndarray` just like the pixel data :: + + >>> var = ad[0].variance + >>> dq = ad[0].mask + +Tables +^^^^^^ +Tables in the MEF file will also be loaded into the |AstroData| object. If a table +is associated with a specific science extension through the EXTVER header keyword, that +table will be packaged within the same AstroData extension as the pixel data. +The |AstroData| "extension" is the |NDAstroData| object plus any table or other pixel +array. If the table is not associated with a specific extension and applies +globally, it will be added to the AstroData object as a global addition. No +indexing will be required to access it. In the example below, one ``OBJCAT`` is +associated with each extension, while the ``REFCAT`` has a global scope :: + + >>> ad.info() + Filename: ../playdata/N20170609S0154_varAdded.fits + Tags: ACQUISITION GEMINI GMOS IMAGE NORTH OVERSCAN_SUBTRACTED OVERSCAN_TRIMMED + PREPARED SIDEREAL + + Pixels Extensions + Index Content Type Dimensions Format + [ 0] science NDAstroData (2112, 256) float32 + .variance ndarray (2112, 256) float32 + .mask ndarray (2112, 256) uint16 + .OBJCAT Table (6, 43) n/a + .OBJMASK ndarray (2112, 256) uint8 + [ 1] science NDAstroData (2112, 256) float32 + .variance ndarray (2112, 256) float32 + .mask ndarray (2112, 256) uint16 + .OBJCAT Table (8, 43) n/a + .OBJMASK ndarray (2112, 256) uint8 + [ 2] science NDAstroData (2112, 256) float32 + .variance ndarray (2112, 256) float32 + .mask ndarray (2112, 256) uint16 + .OBJCAT Table (7, 43) n/a + .OBJMASK ndarray (2112, 256) uint8 + [ 3] science NDAstroData (2112, 256) float32 + .variance ndarray (2112, 256) float32 + .mask ndarray (2112, 256) uint16 + .OBJCAT Table (5, 43) n/a + .OBJMASK ndarray (2112, 256) uint8 + + Other Extensions + Type Dimensions + .REFCAT Table (245, 16) + + +The tables are stored internally as :class:`astropy.table.Table` objects. :: + + >>> ad[0].OBJCAT + + NUMBER X_IMAGE Y_IMAGE ... REF_MAG_ERR PROFILE_FWHM PROFILE_EE50 + int32 float32 float32 ... float32 float32 float32 + ------ ------- ------- ... ----------- ------------ ------------ + 1 283.461 55.4393 ... 0.16895 -999.0 -999.0 + ... + >>> type(ad[0].OBJCAT) + + + >>> refcat = ad.REFCAT + >>> type(refcat) + + + +Headers +^^^^^^^ +Headers are stored in the |NDAstroData| ``.meta`` attribute as :class:`astropy.io.fits.Header` objects, +which is a form of Python ordered dictionaries. Headers associated with extensions +are stored with the corresponding |NDAstroData| object. The MEF Primary Header +Unit (PHU) is stored "globally" in the |AstroData| object. Note that when slicing an |AstroData| object, +for example copying over just the first extension, the PHU will follow. The +slice of an |AstroData| object is an |AstroData| object. +Headers can be accessed directly, or for some predefined concepts, the use of +Descriptors is preferred. See the chapters on headers for details. + +Using Descriptors:: + + >>> ad = astrodata.open('../playdata/N20170609S0154.fits') + >>> ad.filter_name() + 'open1-6&g_G0301' + >>> ad.filter_name(pretty=True) + 'g' + +Using direct header access:: + + >>> ad.phu['FILTER1'] + 'open1-6' + >>> ad.phu['FILTER2'] + 'g_G0301' + +Accessing the extension headers:: + + >>> ad.hdr['CCDSEC'] + ['[1:512,1:4224]', '[513:1024,1:4224]', '[1025:1536,1:4224]', '[1537:2048,1:4224]'] + >>> ad[0].hdr['CCDSEC'] + '[1:512,1:4224]' + + With descriptors: + >>> ad.array_section(pretty=True) + ['[1:512,1:4224]', '[513:1024,1:4224]', '[1025:1536,1:4224]', '[1537:2048,1:4224]'] + + +Modify Existing MEF Files +========================= +Before you start modify the structure of an |AstroData| object, you should be +familiar with it. Please make sure that you have read the previous chapter +on :ref:`the structure of the AstroData object `. + +Appending an extension +---------------------- +In this section, we take an extension from one |AstroData| object and append it +to another. + +Here is an example appending a whole AstroData extension, with pixel data, +variance, mask and tables. + +:: + + >>> ad = astrodata.open('../playdata/N20170609S0154.fits') + >>> advar = astrodata.open('../playdata/N20170609S0154_varAdded.fits') + + >>> ad.info() + Filename: ../playdata/N20170609S0154.fits + Tags: ACQUISITION GEMINI GMOS IMAGE NORTH RAW SIDEREAL UNPREPARED + Pixels Extensions + Index Content Type Dimensions Format + [ 0] science NDAstroData (2112, 288) uint16 + [ 1] science NDAstroData (2112, 288) uint16 + [ 2] science NDAstroData (2112, 288) uint16 + [ 3] science NDAstroData (2112, 288) uint16 + + >>> ad.append(advar[3]) + >>> ad.info() + Filename: ../playdata/N20170609S0154.fits + Tags: ACQUISITION GEMINI GMOS IMAGE NORTH RAW SIDEREAL UNPREPARED + Pixels Extensions + Index Content Type Dimensions Format + [ 0] science NDAstroData (2112, 288) uint16 + [ 1] science NDAstroData (2112, 288) uint16 + [ 2] science NDAstroData (2112, 288) uint16 + [ 3] science NDAstroData (2112, 288) uint16 + [ 4] science NDAstroData (2112, 256) float32 + .variance ndarray (2112, 256) float32 + .mask ndarray (2112, 256) int16 + .OBJCAT Table (5, 43) n/a + .OBJMASK ndarray (2112, 256) uint8 + + >>> ad[4].hdr['EXTVER'] + 4 + >>> advar[3].hdr['EXTVER'] + 4 + +As you can see above, the fourth extension of ``advar``, along with everything +it contains was appended at the end of the first |AstroData| object. However, +note that, because the EXTVER of the extension in ``advar`` was 4, there are +now two extensions in ``ad`` with this EXTVER. This is not a problem because +EXTVER is not used by |AstroData| (it uses the index instead) and it is handled +only when the file is written to disk. + +In this next example, we are appending only the pixel data, leaving behind the other +associated data. One can attach the headers too, like we do here. + +:: + + >>> ad = astrodata.open('../playdata/N20170609S0154.fits') + >>> advar = astrodata.open('../playdata/N20170609S0154_varAdded.fits') + + >>> ad.append(advar[3].data, header=advar[3].hdr) + >>> ad.info() + Filename: ../playdata/N20170609S0154.fits + Tags: ACQUISITION GEMINI GMOS IMAGE NORTH RAW SIDEREAL UNPREPARED + Pixels Extensions + Index Content Type Dimensions Format + [ 0] science NDAstroData (2112, 288) uint16 + [ 1] science NDAstroData (2112, 288) uint16 + [ 2] science NDAstroData (2112, 288) uint16 + [ 3] science NDAstroData (2112, 288) uint16 + [ 4] science NDAstroData (2112, 256) float32 + +Notice how a new extension was created but ``variance``, ``mask``, the OBJCAT +table and OBJMASK image were not copied over. Only the science pixel data was +copied over. + +Please note, there is no implementation for the "insertion" of an extension. + +Removing an extension or part of one +------------------------------------ +Removing an extension or a part of an extension is straightforward. The +Python command :func:`del` is used on the item to remove. Below are a few +examples, but first let us load a file :: + + >>> ad = astrodata.open('../playdata/N20170609S0154_varAdded.fits') + >>> ad.info() + +As you go through these examples, check the new structure with :func:`ad.info()` +after every removal to see how the structure has changed. + +Deleting a whole |AstroData| extension, the fourth one :: + + >>> del ad[3] + +Deleting only the variance array from the second extension :: + + >>> ad[1].variance = None + +Deleting a table associated with the first extension :: + + >>> del ad[0].OBJCAT + +Deleting a global table, not attached to a specific extension :: + + >>> del ad.REFCAT + + + +Writing back to disk +==================== +The :class:`~astrodata.AstroData` layer takes care of converting +the |AstroData| object back to a MEF file on disk. When writing to disk, +one should be aware of the path and filename information associated +with the |AstroData| object. + +:: + + >>> ad = astrodata.open('../playdata/N20170609S0154.fits') + >>> ad.path + '../playdata/N20170609S0154.fits' + >>> ad.filename + 'N20170609S0154.fits' + +Writing to a new file +--------------------- +There are various ways to define the destination for the new FITS file. +The most common and natural way is :: + + >>> ad.write('new154.fits') + + >>> ad.write('new154.fits', overwrite=True) + +This will write a FITS file named 'new154.fits' in the current directory. +With ``overwrite=True``, it will overwrite the file if it already exists. +A path can be prepended to the filename if the current directory is not +the destination. +Note that ``ad.filename`` and ``ad.path`` have not changed, we have just +written to the new file, the |AstroData| object is in no way associated +with that new file. :: + + >>> ad.path + '../playdata/N20170609S0154.fits' + >>> ad.filename + 'N20170609S0154.fits' + +If you want to create that association, the ``ad.filename`` and ``ad.path`` +needs to be modified first. For example:: + + >>> ad.filename = 'new154.fits' + >>> ad.write(overwrite=True) + + >>> ad.path + '../playdata/new154.fits' + >>> ad.filename + 'new154.fits' + +Changing ``ad.filename`` also changes the filename in the ``ad.path``. The +sequence above will write 'new154.fits' not in the current directory but +rather to the directory that is specified in ``ad.path``. + +WARNING: :func:`ad.write` has an argument named ``filename``. Setting ``filename`` +in the call to :func:`ad.write`, as in ``ad.write(filename='new154.fits')`` will NOT +modify ``ad.filename`` or ``ad.path``. The two "filenames", one a method argument +the other a class attribute have no association to each other. + + +Updating an existing file on disk +---------------------------------- +Updating an existing file on disk requires explicitly allowing overwrite. + +If you have not written 'new154.fits' to disk yet (from previous section) :: + + >>> ad = astrodata.open('../playdata/N20170609S0154.fits') + >>> ad.write('new154.fits', overwrite=True) + +Now let's open 'new154.fits', and write to it :: + + >>> adnew = astrodata.open('new154.fits') + >>> adnew.write(overwrite=True) + + +A note on FITS header keywords +------------------------------ + +.. _fitskeys: + +When writing an |AstroData| object to disk as a FITS file, it is necessary to add or +update header keywords to represent some of the internally-stored information. Any +extensions that did not originally belong to this |AstroData| will be assigned new +EXTVER keywords to avoid conflicts with existing extensions, and the internal WCS is +converted to the appropriate FITS keywords. Note that in some cases it may not be +possible for standard FITS keywords to accurately represent the true WCS. In such +cases, the FITS keywords are written as an approximation to the true WCS, together +with an additional keyword :: + + FITS-WCS= 'APPROXIMATE' / FITS WCS is approximate + +to indicate this. The accurate WCS is written as an additional FITS extension with +``EXTNAME='WCS'`` that AstroData will recognize when the file is read back in. The +``WCS`` extension will not be written to disk if there is an accurate FITS +representation of the WCS (e.g., for a simple image). + + +Create New MEF Files +==================== + +A new MEF file can be created from an existing, maybe modified, file or it +can be created from scratch. We discuss both cases here. + +Create New Copy of MEF Files +---------------------------- +To create a new copy of a MEF file, modified or not, the user has already +been given most of the tools in the sections above. Yet, let's throw a +couple examples for completeness. + +Basic example +^^^^^^^^^^^^^ +As seen above, a MEF file can be opened with |astrodata|, the |AstroData| +object can be modified (or not), and then written back to disk under a +new name. :: + + >>> ad = astrodata.open('../playdata/N20170609S0154.fits') + ... optional modifications here ... + >>> ad.write('newcopy.fits') + + +Needing true copies in memory +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Sometimes it is a true copy in memory that is needed. This is not specific +to MEF. In Python, doing something like ``adnew = ad`` does not create a +new copy of the AstrodData object; it just gives it a new name. If you +modify ``adnew`` you will be modifying ``ad`` too. They point to the same +block of memory. + +To create a true independent copy, the ``deepcopy`` utility needs to be used. :: + + >>> from copy import deepcopy + >>> ad = astrodata.open('../playdata/N20170609S0154.fits') + >>> adcopy = deepcopy(ad) + +Be careful using ``deepcopy``, your memory could balloon really fast. Use it +only when truly needed. + + +Create New MEF Files from Scratch +--------------------------------- +Before one creates a new MEF file on disk, one has to create the AstroData +object that will be eventually written to disk. The |AstroData| object +created also needs to know that it will have to be written using the MEF +format. This is fortunately handled fairly transparently by |astrodata|. + +The key to associating the FITS data to the |AstroData| object is simply to +create the |AstroData| object from :mod:`astropy.io.fits` header objects. Those +will be recognized by |astrodata| as FITS and the constructor for FITS will be +used. The user does not need to do anything else special. Here is how it is +done. + +Create a MEF with basic header and data array set to zeros +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +:: + + >>> import numpy as np + >>> from astropy.io import fits + + >>> phu = fits.PrimaryHDU() + + >>> pixel_data = np.zeros((100,100)) + + >>> hdu = fits.ImageHDU() + >>> hdu.data = pixel_data + + >>> ad = astrodata.create(phu) + >>> ad.append(hdu, name='SCI') + + or another way to do the last two blocs: + >>> hdu = fits.ImageHDU(data=pixel_data, name='SCI') + >>> ad = astrodata.create(phu, [hdu]) + +Then it is just a matter of calling ``ad.write('somename.fits')`` on that +new ``Astrodata`` object. + +Associate a pixel array with a science pixel array +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Only main science ("SCI") pixel arrays are added as slices to an astrodata +object. It not uncommon to have pixels information associated with those +main science pixels, for example an object mask where marked pixels in the mask +are directly associated with sources in the science array. + +Such pixel arrays are added to specific slice of the astrodata object they are +associated with. + +Building on the astrodata object we created in the previous subsection, one +would add a pixel array to the first slice of the astrodata object as +follows: + + >>> extra_data = np.ones((100, 100)) + >>> ad[0].EXTRADATA = extra_data + +When the file is written to disk as a MEF, an extension will be created with +``EXTNAME = EXTRADATA`` and an ``EXTVER`` that matches the slice's ``EXTVER``, +in this case is would be ``1``. + +Represent a table as a FITS binary table in an ``AstroData`` object +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +One first needs to create a table, either an :class:`astropy.table.Table` +or a :class:`~astropy.io.fits.BinTableHDU`. See the |astropy| documentation +on tables and this manual's :ref:`section ` dedicated to tables for +more information. + +In the first example, we assume that ``my_astropy_table`` is +a :class:`~astropy.table.Table` ready to be attached to an |AstroData| +object. (Warning: we have not created ``my_astropy_table`` therefore the +example below will not run, though this is how it would be done.) + +:: + + >>> phu = fits.PrimaryHDU() + >>> ad = astrodata.create(phu) + + >>> astrodata.add_header_to_table(my_astropy_table) + >>> ad.append(my_astropy_table, name='SMAUG') + + +In the second example, we start with a FITS :class:`~astropy.io.fits.BinTableHDU` +and attach it to a new |AstroData| object. (Again, we have not created +``my_fits_table`` so the example will not run.) :: + + >>> phu = fits.PrimaryHDU() + >>> ad = astrodata.create(phu) + >>> ad.append(my_fits_table, name='DROGON') + +As before, once the |AstroData| object is constructed, the ``ad.write()`` +method can be used to write it to disk as a MEF file. diff --git a/_sources/manuals/usermanual/structure.rst.txt b/_sources/manuals/usermanual/structure.rst.txt new file mode 100644 index 00000000..591edd03 --- /dev/null +++ b/_sources/manuals/usermanual/structure.rst.txt @@ -0,0 +1,190 @@ +.. structure.rst + +.. _structure: + +******************** +The AstroData Object +******************** + +The |AstroData| object is an internal representation of a file on disk. +As of this version, only a FITS layer has been written, but |AstroData| itself +is not limited to FITS. + +The internal structure of the |AstroData| object makes uses of +:class:`astropy.nddata.NDData`, :mod:`astropy.table`, and +:class:`astropy.io.fits.Header`, the latter simply because it is a +convenient ordered dictionary. + +**Try it yourself** + +Download the data package (:ref:`datapkg`) if you wish to follow along and run the +examples. Then :: + + $ cd /ad_usermanual/playground + $ python + + +Global vs Extension-specific +============================ +At the very top level, the structure is divided in two types of information. +In the first category, there is the information that applies to the data +globally, for example the information that would be stored in a FITS Primary +Header Unit, a table from a catalog that matches the RA and DEC of the field, +etc. In the second category, there is the information specific to individual +science pixel extensions, for example the gain of the amplifier, the data +themselves, the error on those data, etc. + +Let us look at an example. The :meth:`~astrodata.AstroData.info` method shows +the content of the |AstroData| object and its organization, from the user's +perspective.:: + + >>> import astrodata + >>> import gemini_instruments + + >>> ad = astrodata.open('../playdata/N20170609S0154_varAdded.fits') + >>> ad.info() + Filename: N20170609S0154_varAdded.fits + Tags: ACQUISITION GEMINI GMOS IMAGE NORTH OVERSCAN_SUBTRACTED OVERSCAN_TRIMMED + PREPARED SIDEREAL + + Pixels Extensions + Index Content Type Dimensions Format + [ 0] science NDAstroData (2112, 256) float32 + .variance ndarray (2112, 256) float32 + .mask ndarray (2112, 256) uint16 + .OBJCAT Table (6, 43) n/a + .OBJMASK ndarray (2112, 256) uint8 + [ 1] science NDAstroData (2112, 256) float32 + .variance ndarray (2112, 256) float32 + .mask ndarray (2112, 256) uint16 + .OBJCAT Table (8, 43) n/a + .OBJMASK ndarray (2112, 256) uint8 + [ 2] science NDAstroData (2112, 256) float32 + .variance ndarray (2112, 256) float32 + .mask ndarray (2112, 256) uint16 + .OBJCAT Table (7, 43) n/a + .OBJMASK ndarray (2112, 256) uint8 + [ 3] science NDAstroData (2112, 256) float32 + .variance ndarray (2112, 256) float32 + .mask ndarray (2112, 256) uint16 + .OBJCAT Table (5, 43) n/a + .OBJMASK ndarray (2112, 256) uint8 + + Other Extensions + Type Dimensions + .REFCAT Table (245, 16) + + +The "Pixel Extensions" contain the pixel data. Each extension is represented +individually in a list (0-indexed like all Python lists). The science pixel +data, its associated metadata (extension header), and any other pixel or table +extensions directly associated with that science pixel data are stored in +a |NDAstroData| object which is a subclass of astropy |NDData|. We will +return to this structure later. An |AstroData| extension is accessed like +any list: ``ad[0]``. To access the science pixels, one uses ``ad[0].data``; for +the object mask of the first extension, ``ad[0].OBJMASK``. + +In the example above, the "Other Extensions" at the bottom of the +:meth:`~astrodata.AstroData.info` display contains a ``REFCAT`` table which in +this case is a list of stars from a catalog that overlaps the field of view +covered by the pixel data. The "Other Extensions" are global extensions. They +are not attached to any pixel extension in particular. To access a global +extension one simply uses the name of that extension: ``ad.REFCAT``. + + +Organization of the Global Information +====================================== +All the global information is stored in attributes of the |AstroData| object. +The global headers, or Primary Header Unit (PHU), is stored in the ``phu`` +attribute as an :class:`astropy.io.fits.Header`. + +Any global tables, like ``REFCAT`` above, are stored in the private attribute +``_tables`` as a Python dictionary with the name (eg. "REFCAT") as the key. +All tables are stored as :class:`astropy.table.Table`. Access to those table +is done using the key directly as if it were a normal attribute, eg. +``ad.REFCAT``. Header information for the table, if read in from a FITS table, +is stored in the ``meta`` attribute of the :class:`astropy.table.Table`, eg. +``ad.REFCAT.meta['header']``. It is for information only, it is not used. + + +Organization of the Extension-specific Information +================================================== +The pixel data are stored in the |AstroData| attribute ``nddata`` as a list +of |NDAstroData| object. The |NDAstroData| object is a subclass of astropy +|NDData| and it is fully compatible with any function expecting an |NDData| as +input. The pixel extensions are accessible through slicing, eg. ``ad[0]`` or +even ``ad[0:2]``. A slice of an AstroData object is an AstroData object, and +all the global attributes are kept. For example:: + + >>> ad[0].info() + Filename: N20170609S0154_varAdded.fits + Tags: ACQUISITION GEMINI GMOS IMAGE NORTH OVERSCAN_SUBTRACTED OVERSCAN_TRIMMED + PREPARED SIDEREAL + + Pixels Extensions + Index Content Type Dimensions Format + [ 0] science NDAstroData (2112, 256) float32 + .variance ndarray (2112, 256) float32 + .mask ndarray (2112, 256) uint16 + .OBJCAT Table (6, 43) n/a + .OBJMASK ndarray (2112, 256) uint8 + + Other Extensions + Type Dimensions + .REFCAT Table (245, 16) + +Note how ``REFCAT`` is still present. + +The science data is accessed as ``ad[0].data``, the variance as ``ad[0].variance``, +and the data quality plane as ``ad[0].mask``. Those familiar with astropy +|NDData| will recognize the structure "data, error, mask", and will notice +some differences. First |AstroData| uses the variance for the error plane, not +the standard deviation. Another difference will be evident only when one looks +at the content of the mask. |NDData| masks contain booleans, |AstroData| masks +are ``uint16`` bit mask that contains information about the type of bad pixels +rather than just flagging them a bad or not. Since ``0`` is equivalent to +``False`` (good pixel), the |AstroData| mask is fully compatible with the +|NDData| mask. + +Header information for the extension is stored in the |NDAstroData| ``meta`` +attribute. All table and pixel extensions directly associated with the +science extension are also stored in the ``meta`` attribute. + +Technically, an extension header is located in ``ad.nddata[0].meta['header']``. +However, for obviously needed convenience, the normal way to access that header +is ``ad[0].hdr``. + +Tables and pixel arrays associated with a science extension are +stored in ``ad.nddata[0].meta['other']`` as a dictionary keyed on the array +name, eg. ``OBJCAT``, ``OBJMASK``. As it is for global tables, astropy tables +are used for extension tables. The extension tables and extra pixel arrays are +accessed, like the global tables, by using the table name rather than the long +format, for example ``ad[0].OBJCAT`` and ``ad[0].OBJMASK``. + +When reading a FITS Table, the header information is stored in the +``meta['header']`` of the table, eg. ``ad[0].OBJCAT.meta['header']``. That +information is not used, it is simply a place to store what was read from disk. + +The header of a pixel extension directly associated with the science extension +should match that of the science extension. Therefore such headers are not +stored in |AstroData|. For example, the header of ``ad[0].OBJMASK`` is the +same as that of the science, ``ad[0].hdr``. + +The world coordinate system (WCS) is stored internally in the ``wcs`` attribute +of the |NDAstroData| object. It is constructed from the header keywords when +the FITS file is read from disk, or directly from the ``WCS`` extension if +present (see :ref:`the next chapter `). If the WCS is modified (for +example, by refining the pointing or attaching a more accurate wavelength +calibration), the FITS header keywords are not updated and therefore they should +never be used to determine the world coordinates of any pixel. These keywords are +only updated when the object is written to disk as a FITS file. The WCS is +retrieved as follows: ``ad[0].wcs``. + + +A Note on Memory Usage +====================== +When an file is opened, the headers are loaded into memory, but the pixels +are not. The pixel data are loaded into memory only when they are first +needed. This is not real "memory mapping", more of a delayed loading. This +is useful when someone is only interested in the metadata, especially when +the files are very large. diff --git a/_sources/manuals/usermanual/tables.rst.txt b/_sources/manuals/usermanual/tables.rst.txt new file mode 100644 index 00000000..20316d38 --- /dev/null +++ b/_sources/manuals/usermanual/tables.rst.txt @@ -0,0 +1,228 @@ +.. tables.rst + +.. _tables: + +********** +Table Data +********** +**Try it yourself** + +Download the data package (:ref:`datapkg`) if you wish to follow along and run the +examples. Then :: + + $ cd /ad_usermanual/playground + $ python + +Then import core astrodata and the Gemini astrodata configurations. :: + + >>> import astrodata + >>> import gemini_instruments + +Tables and Astrodata +==================== +Tables are stored as ``astropy.table`` ``Table`` class. FITS tables too +are represented in Astrodata as ``Table`` and FITS headers are stored in +the NDAstroData `.meta` attribute. Most table access should be done +through the ``Table`` interface. The best reference on ``Table`` is the +Astropy documentation itself. In this chapter we covers some common +examples to get the reader started. + +The ``astropy.table`` documentation can be found at: ``_ + + +Operate on a Table +================== + +Let us open a file with tables. Some tables are associated with specific +extensions, and there is one table that is global to the `AstroData` object. + +:: + + >>> ad = astrodata.open('../playdata/N20170609S0154_varAdded.fits') + >>> ad.info() + +To access the global table named ``REFCAT``:: + + >>> ad.REFCAT + +To access the ``OBJCAT`` table in the first extension :: + + >>> ad[0].OBJCAT + + +Column and Row Operations +------------------------- +Columns are named. Those names are used to access the data as columns. +Rows are not names and are simply represented as a sequential list. + +Read columns and rows ++++++++++++++++++++++ +To get the names of the columns present in the table:: + + >>> ad.REFCAT.colnames + ['Id', 'Cat_Id', 'RAJ2000', 'DEJ2000', 'umag', 'umag_err', 'gmag', + 'gmag_err', 'rmag', 'rmag_err', 'imag', 'imag_err', 'zmag', 'zmag_err', + 'filtermag', 'filtermag_err'] + +Then it is easy to request the values for specific columns:: + + >>> ad.REFCAT['zmag'] + >>> ad.REFCAT['zmag', 'zmag_err'] + +To get the content of a specific row, row 10 in this case:: + + >>> ad.REFCAT[9] + +To get the content of a specific row(s) from a specific column(s):: + + >>> ad.REFCAT['zmag'][4] + >>> ad.REFCAT['zmag'][4:10] + >>> ad.REFCAT['zmag', 'zmag_err'][4:10] + +Change values ++++++++++++++ +Assigning new values works in a similar way. When working on multiple elements +it is important to feed a list that matches in size with the number of elements +to replace. + +:: + + >>> ad.REFCAT['imag'][4] = 20.999 + >>> ad.REFCAT['imag'][4:10] = [5, 6, 7, 8, 9, 10] + + >>> overwrite_col = [0] * len(ad.REFCAT) # a list of zeros, size = nb of rows + >>> ad.REFCAT['imag_err'] = overwrite_col + +Add a row ++++++++++ +To append a row, there is the ``add_row()`` method. The length of the row +should match the number of columns:: + + >>> new_row = [0] * len(ad.REFCAT.colnames) + >>> new_row[1] = '' # Cat_Id column is of "str" type. + >>> ad.REFCAT.add_row(new_row) + +Add a column +++++++++++++ +Adding a new column can be more involved. If you need full control, please +see the AstroPy Table documentation. For a quick addition, which might be +sufficient for your use case, we simply use the "dictionary" technique. Please +note that when adding a column, it is important to ensure that all the +elements are of the same type. Also, if you are planning to use that table +in IRAF/PyRAF, we recommend not using 64-bit types. + +:: + + >>> import numpy as np + + >>> new_column = [0] * len(ad.REFCAT) + >>> # Ensure that the type is int32, otherwise it will default to int64 + >>> # which generally not necessary. Also, IRAF 32-bit does not like it. + >>> new_column = np.array(new_column).astype(np.int32) + >>> ad.REFCAT['my_column'] = new_column + +If you are going to write that table back to disk as a FITS Bintable, then +some additional headers need to be set. Astrodata will take care of that +under the hood when the `write` method is invoked. + +:: + + >>> ad.write('myfile_with_modified_table.fits') + + +Selection and Rejection Operations +---------------------------------- +Normally, one does not know exactly where the information needed is located +in a table. Rather some sort of selection needs to be done. This can also +be combined with various calculations. We show two such examples here. + +Select a table element from criterion ++++++++++++++++++++++++++++++++++++++ + +:: + + >>> # Get the magnitude of a star selected by ID number + >>> ad.REFCAT['zmag'][ad.REFCAT['Cat_Id'] == '1237662500002005475'] + + >>> # Get the ID and magnitude of all the stars brighter than zmag 18. + >>> ad.REFCAT['Cat_Id', 'zmag'][ad.REFCAT['zmag'] < 18.] + + +Rejection and selection before statistics ++++++++++++++++++++++++++++++++++++++++++ + +:: + + >>> t = ad.REFCAT # to save typing + + >>> # The table has "NaN" values. ("Not a number") We need to ignore them. + >>> t['zmag'].mean() + nan + >>> # applying rejection of NaN values: + >>> t['zmag'][np.where(~np.isnan(t['zmag']))].mean() + 20.377306 + + + +Accessing FITS table headers directly +------------------------------------- +If for some reason you need to access the FITS table headers directly, here +is how to do it. It is very unlikely that you will need this. + +To see the FITS headers:: + + >>> ad.REFCAT.meta['header'] + >>> ad[0].OBJCAT.meta['header'] + +To retrieve a specific FITS table header:: + + >>> ad.REFCAT.meta['header']['TTYPE3'] + 'RAJ2000' + >>> ad[0].OBJCAT.meta['header']['TTYPE3'] + 'Y_IMAGE' + +To retrieve all the keyword names matching a selection:: + + >>> keynames = [key for key in ad.REFCAT.meta['header'] if key.startswith('TTYPE')] + + + +Create a Table +============== + +To create a table that can be added to an ``AstroData`` object and eventually +written to disk as a FITS file, the first step is to create an Astropy +``Table``. + +Let us first add our data to NumPy arrays, one array per column:: + + >>> import numpy as np + + >>> snr_id = np.array(['S001', 'S002', 'S003']) + >>> feii = np.array([780., 78., 179.]) + >>> pabeta = np.array([740., 307., 220.]) + >>> ratio = pabeta / feii + +Then build the table from that data:: + + >>> from astropy.table import Table + + >>> my_astropy_table = Table([snr_id, feii, pabeta, ratio], + ... names=('SNR_ID', 'FeII', 'PaBeta', 'ratio')) + + +Now we append this Astropy ``Table`` to a new ``AstroData`` object. + +:: + + >>> # Since we are going to write a FITS, we build the AstroData object + >>> # from FITS objects. + >>> from astropy.io import fits + + >>> phu = fits.PrimaryHDU() + >>> ad = astrodata.create(phu) + >>> ad.MYTABLE = my_astropy_table + >>> ad.info() + >>> ad.MYTABLE + + >>> ad.write('new_table.fits') diff --git a/_sources/manuals/usermanual/tags.rst.txt b/_sources/manuals/usermanual/tags.rst.txt new file mode 100644 index 00000000..6caaf387 --- /dev/null +++ b/_sources/manuals/usermanual/tags.rst.txt @@ -0,0 +1,172 @@ +.. tags.rst + +.. _tags: + +************** +Astrodata Tags +************** + +What are the Astrodata Tags? +============================ +The Astrodata Tags identify the data represented in the |AstroData| object. +When a file on disk is opened with |astrodata|, the headers are inspected to +identify which specific |AstroData| class needs to be loaded, +:class:`~gemini_instruments.gmos.AstroDataGmos`, +:class:`~gemini_instruments.niri.AstroDataNiri`, etc. Based on the class the data is +associated with, a list of "tags" will be defined. The tags will tell whether the +file is a flatfield or a dark, if it is a raw dataset, or if it has been processed by the +recipe system, if it is imaging or spectroscopy. The tags will tell the +users and the system what that data is and also give some information about +the processing status. + +As a side note, the tags are used by DRAGONS Recipe System to match recipes +and primitives to the data. + +Using the Astrodata Tags +======================== +**Try it yourself** + +Download the data package (:ref:`datapkg`) if you wish to follow along and run the +examples. Then :: + + $ cd /ad_usermanual/playground + $ python + +Before doing anything, you need to import |astrodata| and the Gemini instrument +configuration package (|gemini_instruments|). + +:: + + >>> import astrodata + >>> import gemini_instruments + +Let us open a Gemini dataset and see what tags we get:: + + >>> ad = astrodata.open('../playdata/N20170609S0154.fits') + >>> ad.tags + {'RAW', 'GMOS', 'GEMINI', 'NORTH', 'SIDEREAL', 'UNPREPARED', 'IMAGE', 'ACQUISITION'} + +The file we loaded is raw, GMOS North data. It is a 2D image and it is an +acquisition image, not a science observation. The "UNPREPARED" tag indicates +that the file has never been touched by the Recipe System which runs a +"prepare" primitive as the first step of each recipe. + +Let's try another :: + + >>> ad = astrodata.open('../playdata/N20170521S0925_forStack.fits') + >>> ad.tags + {'GMOS', 'GEMINI', 'NORTH', 'SIDEREAL', 'OVERSCAN_TRIMMED', 'IMAGE', + 'OVERSCAN_SUBTRACTED', 'PREPARED'} + +This file is a science GMOS North image. It has been processed by the +Recipe System. The overscan level has been subtracted and the overscan section +has been trimmed away. The tags do NOT include all the processing steps. Rather, +at least from the time being, it focuses on steps that matter when associating +calibrations. + +The tags can be used when coding. For example:: + + >>> if 'GMOS' in ad.tags: + ... print('I am GMOS') + ... else: + ... print('I am these instead:', ad.tags) + ... + +And:: + + >>> if {'IMAGE', 'GMOS'}.issubset(ad.tags): + ... print('I am a GMOS Image.') + ... + +Using typewalk +============== +In DRAGONS, there is a convenience tool that will list the Astrodata tags +for all the FITS file in a directory. + +To try it, from the shell, not Python, go to the "playdata" directory and +run typewalk:: + + % cd /ad_usermanual/playdata + % typewalk + + directory: /data/workspace/ad_usermanual/playdata + N20170521S0925_forStack.fits ...... (GEMINI) (GMOS) (IMAGE) (NORTH) (OVERSCAN_SUBTRACTED) (OVERSCAN_TRIMMED) (PREPARED) (SIDEREAL) + N20170521S0926_forStack.fits ...... (GEMINI) (GMOS) (IMAGE) (NORTH) (OVERSCAN_SUBTRACTED) (OVERSCAN_TRIMMED) (PREPARED) (PROCESSED) (PROCESSED_SCIENCE) (SIDEREAL) + N20170609S0154.fits ............... (ACQUISITION) (GEMINI) (GMOS) (IMAGE) (NORTH) (RAW) (SIDEREAL) (UNPREPARED) + N20170609S0154_varAdded.fits ...... (ACQUISITION) (GEMINI) (GMOS) (IMAGE) (NORTH) (OVERSCAN_SUBTRACTED) (OVERSCAN_TRIMMED) (PREPARED) (SIDEREAL) + estgsS20080220S0078.fits .......... (GEMINI) (GMOS) (LONGSLIT) (LS) (PREPARED) (PROCESSED) (PROCESSED_SCIENCE) (SIDEREAL) (SOUTH) (SPECT) + gmosifu_cube.fits ................. (GEMINI) (GMOS) (IFU) (NORTH) (ONESLIT_RED) (PREPARED) (PROCESSED) (PROCESSED_SCIENCE) (SIDEREAL) (SPECT) + new154.fits ....................... (ACQUISITION) (GEMINI) (GMOS) (IMAGE) (NORTH) (RAW) (SIDEREAL) (UNPREPARED) + Done DataSpider.typewalk(..) + +``typewalk`` can be used to select specific data based on tags, and even create +lists:: + + % typewalk --tags RAW + directory: /data/workspace/ad_usermanual/playdata + N20170609S0154.fits ............... (ACQUISITION) (GEMINI) (GMOS) (IMAGE) (NORTH) (RAW) (SIDEREAL) (UNPREPARED) + new154.fits ....................... (ACQUISITION) (GEMINI) (GMOS) (IMAGE) (NORTH) (RAW) (SIDEREAL) (UNPREPARED) + Done DataSpider.typewalk(..) + +:: + + % typewalk --tags RAW -o rawfiles.lis + % cat rawfiles.lis + # Auto-generated by typewalk, vv2.0 (beta) + # Written: Tue Mar 6 13:06:06 2018 + # Qualifying types: RAW + # Qualifying logic: AND + # ----------------------- + /Users/klabrie/data/tutorials/ad_usermanual/playdata/N20170609S0154.fits + /Users/klabrie/data/tutorials/ad_usermanual/playdata/new154.fits + + + +Creating New Astrodata Tags [Advanced Topic] +============================================ +For proper and complete instructions on how to create Astrodata Tags and +the |AstroData| class that hosts the tags, the reader is invited to refer to the +Astrodata Programmer Manual. Here we provide a simple introduction that +might help some readers better understand Astrodata Tags, or serve as a +quick reference for those who have written Astrodata Tags in the past but need +a little refresher. + +The Astrodata Tags are defined in an |AstroData| class. The |AstroData| +class specific to an instrument is located in a separate package, not in +|astrodata|. For example, for Gemini instruments, all the various |AstroData| +classes are contained in the |gemini_instruments| package. + +An Astrodata Tag is a function within the instrument's |AstroData| class. +The tag function is distinguished from normal functions by applying the +:func:`~astrodata.astro_data_tag` decorator to it. +The tag function returns a :class:`astrodata.TagSet`. + +For example:: + + class AstroDataGmos(AstroDataGemini): + ... + @astro_data_tag + def _tag_arc(self): + if self.phu.get('OBSTYPE) == 'ARC': + return TagSet(['ARC', 'CAL']) + +The tag function looks at the headers and if the keyword "OBSTYPE" is set +to "ARC", the tags "ARC" and "CAL" (for calibration) will be assigned to the +|AstroData| object. + +A whole suite of such tag functions is needed to fully characterize all +types of data an instrument can produce. + +Tags are about what the dataset is, not it's flavor. The Astrodata +"descriptors" (see the section on :ref:`headers`) will describe the flavor. +For example, tags will say that the data is an image, but the descriptor +will say whether it is B-band or R-band. Tags are used for recipe and +primitive selection. A way to understand the difference between a tag and +a descriptor is in terms of the recipe that will be selected: A GMOS image +will use the same recipe whether it's a B-band or R-band image. However, +a GMOS longslit spectrum will need a very different recipe. A bias is +reduced differently from a science image, there should be a tag differentiating +a bias from a science image. (There is for GMOS.) + +For more information on adding to Astrodata, see the Astrodata Programmer +Manual. diff --git a/_static/alabaster.css b/_static/alabaster.css new file mode 100644 index 00000000..517d0b29 --- /dev/null +++ b/_static/alabaster.css @@ -0,0 +1,703 @@ +@import url("basic.css"); + +/* -- page layout ----------------------------------------------------------- */ + +body { + font-family: Georgia, serif; + font-size: 17px; + background-color: #fff; + color: #000; + margin: 0; + padding: 0; +} + + +div.document { + width: 940px; + margin: 30px auto 0 auto; +} + +div.documentwrapper { + float: left; + width: 100%; +} + +div.bodywrapper { + margin: 0 0 0 220px; +} + +div.sphinxsidebar { + width: 220px; + font-size: 14px; + line-height: 1.5; +} + +hr { + border: 1px solid #B1B4B6; +} + +div.body { + background-color: #fff; + color: #3E4349; + padding: 0 30px 0 30px; +} + +div.body > .section { + text-align: left; +} + +div.footer { + width: 940px; + margin: 20px auto 30px auto; + font-size: 14px; + color: #888; + text-align: right; +} + +div.footer a { + color: #888; +} + +p.caption { + font-family: inherit; + font-size: inherit; +} + + +div.relations { + display: none; +} + + +div.sphinxsidebar a { + color: #444; + text-decoration: none; + border-bottom: 1px dotted #999; +} + +div.sphinxsidebar a:hover { + border-bottom: 1px solid #999; +} + +div.sphinxsidebarwrapper { + padding: 18px 10px; +} + +div.sphinxsidebarwrapper p.logo { + padding: 0; + margin: -10px 0 0 0px; + text-align: center; +} + +div.sphinxsidebarwrapper h1.logo { + margin-top: -10px; + text-align: center; + margin-bottom: 5px; + text-align: left; +} + +div.sphinxsidebarwrapper h1.logo-name { + margin-top: 0px; +} + +div.sphinxsidebarwrapper p.blurb { + margin-top: 0; + font-style: normal; +} + +div.sphinxsidebar h3, +div.sphinxsidebar h4 { + font-family: Georgia, serif; + color: #444; + font-size: 24px; + font-weight: normal; + margin: 0 0 5px 0; + padding: 0; +} + +div.sphinxsidebar h4 { + font-size: 20px; +} + +div.sphinxsidebar h3 a { + color: #444; +} + +div.sphinxsidebar p.logo a, +div.sphinxsidebar h3 a, +div.sphinxsidebar p.logo a:hover, +div.sphinxsidebar h3 a:hover { + border: none; +} + +div.sphinxsidebar p { + color: #555; + margin: 10px 0; +} + +div.sphinxsidebar ul { + margin: 10px 0; + padding: 0; + color: #000; +} + +div.sphinxsidebar ul li.toctree-l1 > a { + font-size: 120%; +} + +div.sphinxsidebar ul li.toctree-l2 > a { + font-size: 110%; +} + +div.sphinxsidebar input { + border: 1px solid #CCC; + font-family: Georgia, serif; + font-size: 1em; +} + +div.sphinxsidebar hr { + border: none; + height: 1px; + color: #AAA; + background: #AAA; + + text-align: left; + margin-left: 0; + width: 50%; +} + +div.sphinxsidebar .badge { + border-bottom: none; +} + +div.sphinxsidebar .badge:hover { + border-bottom: none; +} + +/* To address an issue with donation coming after search */ +div.sphinxsidebar h3.donation { + margin-top: 10px; +} + +/* -- body styles ----------------------------------------------------------- */ + +a { + color: #004B6B; + text-decoration: underline; +} + +a:hover { + color: #6D4100; + text-decoration: underline; +} + +div.body h1, +div.body h2, +div.body h3, +div.body h4, +div.body h5, +div.body h6 { + font-family: Georgia, serif; + font-weight: normal; + margin: 30px 0px 10px 0px; + padding: 0; +} + +div.body h1 { margin-top: 0; padding-top: 0; font-size: 240%; } +div.body h2 { font-size: 180%; } +div.body h3 { font-size: 150%; } +div.body h4 { font-size: 130%; } +div.body h5 { font-size: 100%; } +div.body h6 { font-size: 100%; } + +a.headerlink { + color: #DDD; + padding: 0 4px; + text-decoration: none; +} + +a.headerlink:hover { + color: #444; + background: #EAEAEA; +} + +div.body p, div.body dd, div.body li { + line-height: 1.4em; +} + +div.admonition { + margin: 20px 0px; + padding: 10px 30px; + background-color: #EEE; + border: 1px solid #CCC; +} + +div.admonition tt.xref, div.admonition code.xref, div.admonition a tt { + background-color: #FBFBFB; + border-bottom: 1px solid #fafafa; +} + +div.admonition p.admonition-title { + font-family: Georgia, serif; + font-weight: normal; + font-size: 24px; + margin: 0 0 10px 0; + padding: 0; + line-height: 1; +} + +div.admonition p.last { + margin-bottom: 0; +} + +div.highlight { + background-color: #fff; +} + +dt:target, .highlight { + background: #FAF3E8; +} + +div.warning { + background-color: #FCC; + border: 1px solid #FAA; +} + +div.danger { + background-color: #FCC; + border: 1px solid #FAA; + -moz-box-shadow: 2px 2px 4px #D52C2C; + -webkit-box-shadow: 2px 2px 4px #D52C2C; + box-shadow: 2px 2px 4px #D52C2C; +} + +div.error { + background-color: #FCC; + border: 1px solid #FAA; + -moz-box-shadow: 2px 2px 4px #D52C2C; + -webkit-box-shadow: 2px 2px 4px #D52C2C; + box-shadow: 2px 2px 4px #D52C2C; +} + +div.caution { + background-color: #FCC; + border: 1px solid #FAA; +} + +div.attention { + background-color: #FCC; + border: 1px solid #FAA; +} + +div.important { + background-color: #EEE; + border: 1px solid #CCC; +} + +div.note { + background-color: #EEE; + border: 1px solid #CCC; +} + +div.tip { + background-color: #EEE; + border: 1px solid #CCC; +} + +div.hint { + background-color: #EEE; + border: 1px solid #CCC; +} + +div.seealso { + background-color: #EEE; + border: 1px solid #CCC; +} + +div.topic { + background-color: #EEE; +} + +p.admonition-title { + display: inline; +} + +p.admonition-title:after { + content: ":"; +} + +pre, tt, code { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; + font-size: 0.9em; +} + +.hll { + background-color: #FFC; + margin: 0 -12px; + padding: 0 12px; + display: block; +} + +img.screenshot { +} + +tt.descname, tt.descclassname, code.descname, code.descclassname { + font-size: 0.95em; +} + +tt.descname, code.descname { + padding-right: 0.08em; +} + +img.screenshot { + -moz-box-shadow: 2px 2px 4px #EEE; + -webkit-box-shadow: 2px 2px 4px #EEE; + box-shadow: 2px 2px 4px #EEE; +} + +table.docutils { + border: 1px solid #888; + -moz-box-shadow: 2px 2px 4px #EEE; + -webkit-box-shadow: 2px 2px 4px #EEE; + box-shadow: 2px 2px 4px #EEE; +} + +table.docutils td, table.docutils th { + border: 1px solid #888; + padding: 0.25em 0.7em; +} + +table.field-list, table.footnote { + border: none; + -moz-box-shadow: none; + -webkit-box-shadow: none; + box-shadow: none; +} + +table.footnote { + margin: 15px 0; + width: 100%; + border: 1px solid #EEE; + background: #FDFDFD; + font-size: 0.9em; +} + +table.footnote + table.footnote { + margin-top: -15px; + border-top: none; +} + +table.field-list th { + padding: 0 0.8em 0 0; +} + +table.field-list td { + padding: 0; +} + +table.field-list p { + margin-bottom: 0.8em; +} + +/* Cloned from + * https://github.com/sphinx-doc/sphinx/commit/ef60dbfce09286b20b7385333d63a60321784e68 + */ +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +table.footnote td.label { + width: .1px; + padding: 0.3em 0 0.3em 0.5em; +} + +table.footnote td { + padding: 0.3em 0.5em; +} + +dl { + margin-left: 0; + margin-right: 0; + margin-top: 0; + padding: 0; +} + +dl dd { + margin-left: 30px; +} + +blockquote { + margin: 0 0 0 30px; + padding: 0; +} + +ul, ol { + /* Matches the 30px from the narrow-screen "li > ul" selector below */ + margin: 10px 0 10px 30px; + padding: 0; +} + +pre { + background: #EEE; + padding: 7px 30px; + margin: 15px 0px; + line-height: 1.3em; +} + +div.viewcode-block:target { + background: #ffd; +} + +dl pre, blockquote pre, li pre { + margin-left: 0; + padding-left: 30px; +} + +tt, code { + background-color: #ecf0f3; + color: #222; + /* padding: 1px 2px; */ +} + +tt.xref, code.xref, a tt { + background-color: #FBFBFB; + border-bottom: 1px solid #fff; +} + +a.reference { + text-decoration: none; + border-bottom: 1px dotted #004B6B; +} + +/* Don't put an underline on images */ +a.image-reference, a.image-reference:hover { + border-bottom: none; +} + +a.reference:hover { + border-bottom: 1px solid #6D4100; +} + +a.footnote-reference { + text-decoration: none; + font-size: 0.7em; + vertical-align: top; + border-bottom: 1px dotted #004B6B; +} + +a.footnote-reference:hover { + border-bottom: 1px solid #6D4100; +} + +a:hover tt, a:hover code { + background: #EEE; +} + + +@media screen and (max-width: 870px) { + + div.sphinxsidebar { + display: none; + } + + div.document { + width: 100%; + + } + + div.documentwrapper { + margin-left: 0; + margin-top: 0; + margin-right: 0; + margin-bottom: 0; + } + + div.bodywrapper { + margin-top: 0; + margin-right: 0; + margin-bottom: 0; + margin-left: 0; + } + + ul { + margin-left: 0; + } + + li > ul { + /* Matches the 30px from the "ul, ol" selector above */ + margin-left: 30px; + } + + .document { + width: auto; + } + + .footer { + width: auto; + } + + .bodywrapper { + margin: 0; + } + + .footer { + width: auto; + } + + .github { + display: none; + } + + + +} + + + +@media screen and (max-width: 875px) { + + body { + margin: 0; + padding: 20px 30px; + } + + div.documentwrapper { + float: none; + background: #fff; + } + + div.sphinxsidebar { + display: block; + float: none; + width: 102.5%; + margin: 50px -30px -20px -30px; + padding: 10px 20px; + background: #333; + color: #FFF; + } + + div.sphinxsidebar h3, div.sphinxsidebar h4, div.sphinxsidebar p, + div.sphinxsidebar h3 a { + color: #fff; + } + + div.sphinxsidebar a { + color: #AAA; + } + + div.sphinxsidebar p.logo { + display: none; + } + + div.document { + width: 100%; + margin: 0; + } + + div.footer { + display: none; + } + + div.bodywrapper { + margin: 0; + } + + div.body { + min-height: 0; + padding: 0; + } + + .rtd_doc_footer { + display: none; + } + + .document { + width: auto; + } + + .footer { + width: auto; + } + + .footer { + width: auto; + } + + .github { + display: none; + } +} + + +/* misc. */ + +.revsys-inline { + display: none!important; +} + +/* Make nested-list/multi-paragraph items look better in Releases changelog + * pages. Without this, docutils' magical list fuckery causes inconsistent + * formatting between different release sub-lists. + */ +div#changelog > div.section > ul > li > p:only-child { + margin-bottom: 0; +} + +/* Hide fugly table cell borders in ..bibliography:: directive output */ +table.docutils.citation, table.docutils.citation td, table.docutils.citation th { + border: none; + /* Below needed in some edge cases; if not applied, bottom shadows appear */ + -moz-box-shadow: none; + -webkit-box-shadow: none; + box-shadow: none; +} + + +/* relbar */ + +.related { + line-height: 30px; + width: 100%; + font-size: 0.9rem; +} + +.related.top { + border-bottom: 1px solid #EEE; + margin-bottom: 20px; +} + +.related.bottom { + border-top: 1px solid #EEE; +} + +.related ul { + padding: 0; + margin: 0; + list-style: none; +} + +.related li { + display: inline; +} + +nav#rellinks { + float: right; +} + +nav#rellinks li+li:before { + content: "|"; +} + +nav#breadcrumbs li+li:before { + content: "\00BB"; +} + +/* Hide certain items when printing */ +@media print { + div.related { + display: none; + } +} \ No newline at end of file diff --git a/_static/basic.css b/_static/basic.css new file mode 100644 index 00000000..30fee9d0 --- /dev/null +++ b/_static/basic.css @@ -0,0 +1,925 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +a:visited { + color: #551A8B; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} + +nav.contents, +aside.topic, +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ + +nav.contents, +aside.topic, +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +nav.contents > :last-child, +aside.topic > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +nav.contents::after, +aside.topic::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +aside.footnote > span, +div.citation > span { + float: left; +} +aside.footnote > span:last-of-type, +div.citation > span:last-of-type { + padding-right: 0.5em; +} +aside.footnote > p { + margin-left: 2em; +} +div.citation > p { + margin-left: 4em; +} +aside.footnote > p:last-of-type, +div.citation > p:last-of-type { + margin-bottom: 0em; +} +aside.footnote > p:last-of-type:after, +div.citation > p:last-of-type:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +.sig dd { + margin-top: 0px; + margin-bottom: 0px; +} + +.sig dl { + margin-top: 0px; + margin-bottom: 0px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; + white-space: nowrap; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/_static/custom.css b/_static/custom.css new file mode 100644 index 00000000..2a924f1d --- /dev/null +++ b/_static/custom.css @@ -0,0 +1 @@ +/* This file intentionally left blank. */ diff --git a/_static/doctools.js b/_static/doctools.js new file mode 100644 index 00000000..d06a71d7 --- /dev/null +++ b/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + TRANSLATIONS: {}, + PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), + LOCALE: "unknown", + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext: (string) => { + const translated = Documentation.TRANSLATIONS[string]; + switch (typeof translated) { + case "undefined": + return string; // no translation + case "string": + return translated; // translation exists + default: + return translated[0]; // (singular, plural) translation tuple exists + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + initDomainIndexTable: () => { + const toggler = (el) => { + const idNumber = el.id.substr(7); + const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); + if (el.src.substr(-9) === "minus.png") { + el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; + toggledRows.forEach((el) => (el.style.display = "none")); + } else { + el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; + toggledRows.forEach((el) => (el.style.display = "")); + } + }; + + const togglerElements = document.querySelectorAll("img.toggler"); + togglerElements.forEach((el) => + el.addEventListener("click", (event) => toggler(event.currentTarget)) + ); + togglerElements.forEach((el) => (el.style.display = "")); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); + }, + + initOnKeyListeners: () => { + // only install a listener if it is really needed + if ( + !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && + !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS + ) + return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + if (!event.shiftKey) { + switch (event.key) { + case "ArrowLeft": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const prevLink = document.querySelector('link[rel="prev"]'); + if (prevLink && prevLink.href) { + window.location.href = prevLink.href; + event.preventDefault(); + } + break; + case "ArrowRight": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const nextLink = document.querySelector('link[rel="next"]'); + if (nextLink && nextLink.href) { + window.location.href = nextLink.href; + event.preventDefault(); + } + break; + } + } + + // some keyboard layouts may need Shift to get / + switch (event.key) { + case "/": + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; + Documentation.focusSearchBar(); + event.preventDefault(); + } + }); + }, +}; + +// quick alias for translations +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/_static/documentation_options.js b/_static/documentation_options.js new file mode 100644 index 00000000..b1611d5c --- /dev/null +++ b/_static/documentation_options.js @@ -0,0 +1,13 @@ +const DOCUMENTATION_OPTIONS = { + VERSION: '3.2.0', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/_static/file.png b/_static/file.png new file mode 100644 index 0000000000000000000000000000000000000000..a858a410e4faa62ce324d814e4b816fff83a6fb3 GIT binary patch literal 286 zcmV+(0pb3MP)s`hMrGg#P~ix$^RISR_I47Y|r1 z_CyJOe}D1){SET-^Amu_i71Lt6eYfZjRyw@I6OQAIXXHDfiX^GbOlHe=Ae4>0m)d(f|Me07*qoM6N<$f}vM^LjV8( literal 0 HcmV?d00001 diff --git a/_static/graphviz.css b/_static/graphviz.css new file mode 100644 index 00000000..8d81c02e --- /dev/null +++ b/_static/graphviz.css @@ -0,0 +1,19 @@ +/* + * graphviz.css + * ~~~~~~~~~~~~ + * + * Sphinx stylesheet -- graphviz extension. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +img.graphviz { + border: 0; + max-width: 100%; +} + +object.graphviz { + max-width: 100%; +} diff --git a/_static/language_data.js b/_static/language_data.js new file mode 100644 index 00000000..250f5665 --- /dev/null +++ b/_static/language_data.js @@ -0,0 +1,199 @@ +/* + * language_data.js + * ~~~~~~~~~~~~~~~~ + * + * This script contains the language-specific data used by searchtools.js, + * namely the list of stopwords, stemmer, scorer and splitter. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +var stopwords = ["a", "and", "are", "as", "at", "be", "but", "by", "for", "if", "in", "into", "is", "it", "near", "no", "not", "of", "on", "or", "such", "that", "the", "their", "then", "there", "these", "they", "this", "to", "was", "will", "with"]; + + +/* Non-minified version is copied as a separate JS file, is available */ + +/** + * Porter Stemmer + */ +var Stemmer = function() { + + var step2list = { + ational: 'ate', + tional: 'tion', + enci: 'ence', + anci: 'ance', + izer: 'ize', + bli: 'ble', + alli: 'al', + entli: 'ent', + eli: 'e', + ousli: 'ous', + ization: 'ize', + ation: 'ate', + ator: 'ate', + alism: 'al', + iveness: 'ive', + fulness: 'ful', + ousness: 'ous', + aliti: 'al', + iviti: 'ive', + biliti: 'ble', + logi: 'log' + }; + + var step3list = { + icate: 'ic', + ative: '', + alize: 'al', + iciti: 'ic', + ical: 'ic', + ful: '', + ness: '' + }; + + var c = "[^aeiou]"; // consonant + var v = "[aeiouy]"; // vowel + var C = c + "[^aeiouy]*"; // consonant sequence + var V = v + "[aeiou]*"; // vowel sequence + + var mgr0 = "^(" + C + ")?" + V + C; // [C]VC... is m>0 + var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 + var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 + var s_v = "^(" + C + ")?" + v; // vowel in stem + + this.stemWord = function (w) { + var stem; + var suffix; + var firstch; + var origword = w; + + if (w.length < 3) + return w; + + var re; + var re2; + var re3; + var re4; + + firstch = w.substr(0,1); + if (firstch == "y") + w = firstch.toUpperCase() + w.substr(1); + + // Step 1a + re = /^(.+?)(ss|i)es$/; + re2 = /^(.+?)([^s])s$/; + + if (re.test(w)) + w = w.replace(re,"$1$2"); + else if (re2.test(w)) + w = w.replace(re2,"$1$2"); + + // Step 1b + re = /^(.+?)eed$/; + re2 = /^(.+?)(ed|ing)$/; + if (re.test(w)) { + var fp = re.exec(w); + re = new RegExp(mgr0); + if (re.test(fp[1])) { + re = /.$/; + w = w.replace(re,""); + } + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1]; + re2 = new RegExp(s_v); + if (re2.test(stem)) { + w = stem; + re2 = /(at|bl|iz)$/; + re3 = new RegExp("([^aeiouylsz])\\1$"); + re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re2.test(w)) + w = w + "e"; + else if (re3.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + else if (re4.test(w)) + w = w + "e"; + } + } + + // Step 1c + re = /^(.+?)y$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(s_v); + if (re.test(stem)) + w = stem + "i"; + } + + // Step 2 + re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step2list[suffix]; + } + + // Step 3 + re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step3list[suffix]; + } + + // Step 4 + re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; + re2 = /^(.+?)(s|t)(ion)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + if (re.test(stem)) + w = stem; + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1] + fp[2]; + re2 = new RegExp(mgr1); + if (re2.test(stem)) + w = stem; + } + + // Step 5 + re = /^(.+?)e$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + re2 = new RegExp(meq1); + re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) + w = stem; + } + re = /ll$/; + re2 = new RegExp(mgr1); + if (re.test(w) && re2.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + + // and turn initial Y back to y + if (firstch == "y") + w = firstch.toLowerCase() + w.substr(1); + return w; + } +} + diff --git a/_static/minus.png b/_static/minus.png new file mode 100644 index 0000000000000000000000000000000000000000..d96755fdaf8bb2214971e0db9c1fd3077d7c419d GIT binary patch literal 90 zcmeAS@N?(olHy`uVBq!ia0vp^+#t*WBp7;*Yy1LIik>cxAr*|t7R?Mi>2?kWtu=nj kDsEF_5m^0CR;1wuP-*O&G^0G}KYk!hp00i_>zopr08q^qX#fBK literal 0 HcmV?d00001 diff --git a/_static/plus.png b/_static/plus.png new file mode 100644 index 0000000000000000000000000000000000000000..7107cec93a979b9a5f64843235a16651d563ce2d GIT binary patch literal 90 zcmeAS@N?(olHy`uVBq!ia0vp^+#t*WBp7;*Yy1LIik>cxAr*|t7R?Mi>2?kWtu>-2 m3q%Vub%g%s<8sJhVPMczOq}xhg9DJoz~JfX=d#Wzp$Pyb1r*Kz literal 0 HcmV?d00001 diff --git a/_static/pygments.css b/_static/pygments.css new file mode 100644 index 00000000..57c7df37 --- /dev/null +++ b/_static/pygments.css @@ -0,0 +1,84 @@ +pre { line-height: 125%; } +td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +.highlight .hll { background-color: #ffffcc } +.highlight { background: #f8f8f8; } +.highlight .c { color: #8f5902; font-style: italic } /* Comment */ +.highlight .err { color: #a40000; border: 1px solid #ef2929 } /* Error */ +.highlight .g { color: #000000 } /* Generic */ +.highlight .k { color: #004461; font-weight: bold } /* Keyword */ +.highlight .l { color: #000000 } /* Literal */ +.highlight .n { color: #000000 } /* Name */ +.highlight .o { color: #582800 } /* Operator */ +.highlight .x { color: #000000 } /* Other */ +.highlight .p { color: #000000; font-weight: bold } /* Punctuation */ +.highlight .ch { color: #8f5902; font-style: italic } /* Comment.Hashbang */ +.highlight .cm { color: #8f5902; font-style: italic } /* Comment.Multiline */ +.highlight .cp { color: #8f5902 } /* Comment.Preproc */ +.highlight .cpf { color: #8f5902; font-style: italic } /* Comment.PreprocFile */ +.highlight .c1 { color: #8f5902; font-style: italic } /* Comment.Single */ +.highlight .cs { color: #8f5902; font-style: italic } /* Comment.Special */ +.highlight .gd { color: #a40000 } /* Generic.Deleted */ +.highlight .ge { color: #000000; font-style: italic } /* Generic.Emph */ +.highlight .ges { color: #000000 } /* Generic.EmphStrong */ +.highlight .gr { color: #ef2929 } /* Generic.Error */ +.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ +.highlight .gi { color: #00A000 } /* Generic.Inserted */ +.highlight .go { color: #888888 } /* Generic.Output */ +.highlight .gp { color: #745334 } /* Generic.Prompt */ +.highlight .gs { color: #000000; font-weight: bold } /* Generic.Strong */ +.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ +.highlight .gt { color: #a40000; font-weight: bold } /* Generic.Traceback */ +.highlight .kc { color: #004461; font-weight: bold } /* Keyword.Constant */ +.highlight .kd { color: #004461; font-weight: bold } /* Keyword.Declaration */ +.highlight .kn { color: #004461; font-weight: bold } /* Keyword.Namespace */ +.highlight .kp { color: #004461; font-weight: bold } /* Keyword.Pseudo */ +.highlight .kr { color: #004461; font-weight: bold } /* Keyword.Reserved */ +.highlight .kt { color: #004461; font-weight: bold } /* Keyword.Type */ +.highlight .ld { color: #000000 } /* Literal.Date */ +.highlight .m { color: #990000 } /* Literal.Number */ +.highlight .s { color: #4e9a06 } /* Literal.String */ +.highlight .na { color: #c4a000 } /* Name.Attribute */ +.highlight .nb { color: #004461 } /* Name.Builtin */ +.highlight .nc { color: #000000 } /* Name.Class */ +.highlight .no { color: #000000 } /* Name.Constant */ +.highlight .nd { color: #888888 } /* Name.Decorator */ +.highlight .ni { color: #ce5c00 } /* Name.Entity */ +.highlight .ne { color: #cc0000; font-weight: bold } /* Name.Exception */ +.highlight .nf { color: #000000 } /* Name.Function */ +.highlight .nl { color: #f57900 } /* Name.Label */ +.highlight .nn { color: #000000 } /* Name.Namespace */ +.highlight .nx { color: #000000 } /* Name.Other */ +.highlight .py { color: #000000 } /* Name.Property */ +.highlight .nt { color: #004461; font-weight: bold } /* Name.Tag */ +.highlight .nv { color: #000000 } /* Name.Variable */ +.highlight .ow { color: #004461; font-weight: bold } /* Operator.Word */ +.highlight .pm { color: #000000; font-weight: bold } /* Punctuation.Marker */ +.highlight .w { color: #f8f8f8; text-decoration: underline } /* Text.Whitespace */ +.highlight .mb { color: #990000 } /* Literal.Number.Bin */ +.highlight .mf { color: #990000 } /* Literal.Number.Float */ +.highlight .mh { color: #990000 } /* Literal.Number.Hex */ +.highlight .mi { color: #990000 } /* Literal.Number.Integer */ +.highlight .mo { color: #990000 } /* Literal.Number.Oct */ +.highlight .sa { color: #4e9a06 } /* Literal.String.Affix */ +.highlight .sb { color: #4e9a06 } /* Literal.String.Backtick */ +.highlight .sc { color: #4e9a06 } /* Literal.String.Char */ +.highlight .dl { color: #4e9a06 } /* Literal.String.Delimiter */ +.highlight .sd { color: #8f5902; font-style: italic } /* Literal.String.Doc */ +.highlight .s2 { color: #4e9a06 } /* Literal.String.Double */ +.highlight .se { color: #4e9a06 } /* Literal.String.Escape */ +.highlight .sh { color: #4e9a06 } /* Literal.String.Heredoc */ +.highlight .si { color: #4e9a06 } /* Literal.String.Interpol */ +.highlight .sx { color: #4e9a06 } /* Literal.String.Other */ +.highlight .sr { color: #4e9a06 } /* Literal.String.Regex */ +.highlight .s1 { color: #4e9a06 } /* Literal.String.Single */ +.highlight .ss { color: #4e9a06 } /* Literal.String.Symbol */ +.highlight .bp { color: #3465a4 } /* Name.Builtin.Pseudo */ +.highlight .fm { color: #000000 } /* Name.Function.Magic */ +.highlight .vc { color: #000000 } /* Name.Variable.Class */ +.highlight .vg { color: #000000 } /* Name.Variable.Global */ +.highlight .vi { color: #000000 } /* Name.Variable.Instance */ +.highlight .vm { color: #000000 } /* Name.Variable.Magic */ +.highlight .il { color: #990000 } /* Literal.Number.Integer.Long */ \ No newline at end of file diff --git a/_static/searchtools.js b/_static/searchtools.js new file mode 100644 index 00000000..7918c3fa --- /dev/null +++ b/_static/searchtools.js @@ -0,0 +1,574 @@ +/* + * searchtools.js + * ~~~~~~~~~~~~~~~~ + * + * Sphinx JavaScript utilities for the full-text search. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +/** + * Simple result scoring code. + */ +if (typeof Scorer === "undefined") { + var Scorer = { + // Implement the following function to further tweak the score for each result + // The function takes a result array [docname, title, anchor, descr, score, filename] + // and returns the new score. + /* + score: result => { + const [docname, title, anchor, descr, score, filename] = result + return score + }, + */ + + // query matches the full name of an object + objNameMatch: 11, + // or matches in the last dotted part of the object name + objPartialMatch: 6, + // Additive scores depending on the priority of the object + objPrio: { + 0: 15, // used to be importantResults + 1: 5, // used to be objectResults + 2: -5, // used to be unimportantResults + }, + // Used when the priority is not in the mapping. + objPrioDefault: 0, + + // query found in title + title: 15, + partialTitle: 7, + // query found in terms + term: 5, + partialTerm: 2, + }; +} + +const _removeChildren = (element) => { + while (element && element.lastChild) element.removeChild(element.lastChild); +}; + +/** + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#escaping + */ +const _escapeRegExp = (string) => + string.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string + +const _displayItem = (item, searchTerms, highlightTerms) => { + const docBuilder = DOCUMENTATION_OPTIONS.BUILDER; + const docFileSuffix = DOCUMENTATION_OPTIONS.FILE_SUFFIX; + const docLinkSuffix = DOCUMENTATION_OPTIONS.LINK_SUFFIX; + const showSearchSummary = DOCUMENTATION_OPTIONS.SHOW_SEARCH_SUMMARY; + const contentRoot = document.documentElement.dataset.content_root; + + const [docName, title, anchor, descr, score, _filename] = item; + + let listItem = document.createElement("li"); + let requestUrl; + let linkUrl; + if (docBuilder === "dirhtml") { + // dirhtml builder + let dirname = docName + "/"; + if (dirname.match(/\/index\/$/)) + dirname = dirname.substring(0, dirname.length - 6); + else if (dirname === "index/") dirname = ""; + requestUrl = contentRoot + dirname; + linkUrl = requestUrl; + } else { + // normal html builders + requestUrl = contentRoot + docName + docFileSuffix; + linkUrl = docName + docLinkSuffix; + } + let linkEl = listItem.appendChild(document.createElement("a")); + linkEl.href = linkUrl + anchor; + linkEl.dataset.score = score; + linkEl.innerHTML = title; + if (descr) { + listItem.appendChild(document.createElement("span")).innerHTML = + " (" + descr + ")"; + // highlight search terms in the description + if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js + highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); + } + else if (showSearchSummary) + fetch(requestUrl) + .then((responseData) => responseData.text()) + .then((data) => { + if (data) + listItem.appendChild( + Search.makeSearchSummary(data, searchTerms) + ); + // highlight search terms in the summary + if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js + highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); + }); + Search.output.appendChild(listItem); +}; +const _finishSearch = (resultCount) => { + Search.stopPulse(); + Search.title.innerText = _("Search Results"); + if (!resultCount) + Search.status.innerText = Documentation.gettext( + "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories." + ); + else + Search.status.innerText = _( + `Search finished, found ${resultCount} page(s) matching the search query.` + ); +}; +const _displayNextItem = ( + results, + resultCount, + searchTerms, + highlightTerms, +) => { + // results left, load the summary and display it + // this is intended to be dynamic (don't sub resultsCount) + if (results.length) { + _displayItem(results.pop(), searchTerms, highlightTerms); + setTimeout( + () => _displayNextItem(results, resultCount, searchTerms, highlightTerms), + 5 + ); + } + // search finished, update title and status message + else _finishSearch(resultCount); +}; + +/** + * Default splitQuery function. Can be overridden in ``sphinx.search`` with a + * custom function per language. + * + * The regular expression works by splitting the string on consecutive characters + * that are not Unicode letters, numbers, underscores, or emoji characters. + * This is the same as ``\W+`` in Python, preserving the surrogate pair area. + */ +if (typeof splitQuery === "undefined") { + var splitQuery = (query) => query + .split(/[^\p{Letter}\p{Number}_\p{Emoji_Presentation}]+/gu) + .filter(term => term) // remove remaining empty strings +} + +/** + * Search Module + */ +const Search = { + _index: null, + _queued_query: null, + _pulse_status: -1, + + htmlToText: (htmlString) => { + const htmlElement = new DOMParser().parseFromString(htmlString, 'text/html'); + htmlElement.querySelectorAll(".headerlink").forEach((el) => { el.remove() }); + const docContent = htmlElement.querySelector('[role="main"]'); + if (docContent !== undefined) return docContent.textContent; + console.warn( + "Content block not found. Sphinx search tries to obtain it via '[role=main]'. Could you check your theme or template." + ); + return ""; + }, + + init: () => { + const query = new URLSearchParams(window.location.search).get("q"); + document + .querySelectorAll('input[name="q"]') + .forEach((el) => (el.value = query)); + if (query) Search.performSearch(query); + }, + + loadIndex: (url) => + (document.body.appendChild(document.createElement("script")).src = url), + + setIndex: (index) => { + Search._index = index; + if (Search._queued_query !== null) { + const query = Search._queued_query; + Search._queued_query = null; + Search.query(query); + } + }, + + hasIndex: () => Search._index !== null, + + deferQuery: (query) => (Search._queued_query = query), + + stopPulse: () => (Search._pulse_status = -1), + + startPulse: () => { + if (Search._pulse_status >= 0) return; + + const pulse = () => { + Search._pulse_status = (Search._pulse_status + 1) % 4; + Search.dots.innerText = ".".repeat(Search._pulse_status); + if (Search._pulse_status >= 0) window.setTimeout(pulse, 500); + }; + pulse(); + }, + + /** + * perform a search for something (or wait until index is loaded) + */ + performSearch: (query) => { + // create the required interface elements + const searchText = document.createElement("h2"); + searchText.textContent = _("Searching"); + const searchSummary = document.createElement("p"); + searchSummary.classList.add("search-summary"); + searchSummary.innerText = ""; + const searchList = document.createElement("ul"); + searchList.classList.add("search"); + + const out = document.getElementById("search-results"); + Search.title = out.appendChild(searchText); + Search.dots = Search.title.appendChild(document.createElement("span")); + Search.status = out.appendChild(searchSummary); + Search.output = out.appendChild(searchList); + + const searchProgress = document.getElementById("search-progress"); + // Some themes don't use the search progress node + if (searchProgress) { + searchProgress.innerText = _("Preparing search..."); + } + Search.startPulse(); + + // index already loaded, the browser was quick! + if (Search.hasIndex()) Search.query(query); + else Search.deferQuery(query); + }, + + /** + * execute search (requires search index to be loaded) + */ + query: (query) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + const allTitles = Search._index.alltitles; + const indexEntries = Search._index.indexentries; + + // stem the search terms and add them to the correct list + const stemmer = new Stemmer(); + const searchTerms = new Set(); + const excludedTerms = new Set(); + const highlightTerms = new Set(); + const objectTerms = new Set(splitQuery(query.toLowerCase().trim())); + splitQuery(query.trim()).forEach((queryTerm) => { + const queryTermLower = queryTerm.toLowerCase(); + + // maybe skip this "word" + // stopwords array is from language_data.js + if ( + stopwords.indexOf(queryTermLower) !== -1 || + queryTerm.match(/^\d+$/) + ) + return; + + // stem the word + let word = stemmer.stemWord(queryTermLower); + // select the correct list + if (word[0] === "-") excludedTerms.add(word.substr(1)); + else { + searchTerms.add(word); + highlightTerms.add(queryTermLower); + } + }); + + if (SPHINX_HIGHLIGHT_ENABLED) { // set in sphinx_highlight.js + localStorage.setItem("sphinx_highlight_terms", [...highlightTerms].join(" ")) + } + + // console.debug("SEARCH: searching for:"); + // console.info("required: ", [...searchTerms]); + // console.info("excluded: ", [...excludedTerms]); + + // array of [docname, title, anchor, descr, score, filename] + let results = []; + _removeChildren(document.getElementById("search-progress")); + + const queryLower = query.toLowerCase(); + for (const [title, foundTitles] of Object.entries(allTitles)) { + if (title.toLowerCase().includes(queryLower) && (queryLower.length >= title.length/2)) { + for (const [file, id] of foundTitles) { + let score = Math.round(100 * queryLower.length / title.length) + results.push([ + docNames[file], + titles[file] !== title ? `${titles[file]} > ${title}` : title, + id !== null ? "#" + id : "", + null, + score, + filenames[file], + ]); + } + } + } + + // search for explicit entries in index directives + for (const [entry, foundEntries] of Object.entries(indexEntries)) { + if (entry.includes(queryLower) && (queryLower.length >= entry.length/2)) { + for (const [file, id] of foundEntries) { + let score = Math.round(100 * queryLower.length / entry.length) + results.push([ + docNames[file], + titles[file], + id ? "#" + id : "", + null, + score, + filenames[file], + ]); + } + } + } + + // lookup as object + objectTerms.forEach((term) => + results.push(...Search.performObjectSearch(term, objectTerms)) + ); + + // lookup as search terms in fulltext + results.push(...Search.performTermsSearch(searchTerms, excludedTerms)); + + // let the scorer override scores with a custom scoring function + if (Scorer.score) results.forEach((item) => (item[4] = Scorer.score(item))); + + // now sort the results by score (in opposite order of appearance, since the + // display function below uses pop() to retrieve items) and then + // alphabetically + results.sort((a, b) => { + const leftScore = a[4]; + const rightScore = b[4]; + if (leftScore === rightScore) { + // same score: sort alphabetically + const leftTitle = a[1].toLowerCase(); + const rightTitle = b[1].toLowerCase(); + if (leftTitle === rightTitle) return 0; + return leftTitle > rightTitle ? -1 : 1; // inverted is intentional + } + return leftScore > rightScore ? 1 : -1; + }); + + // remove duplicate search results + // note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept + let seen = new Set(); + results = results.reverse().reduce((acc, result) => { + let resultStr = result.slice(0, 4).concat([result[5]]).map(v => String(v)).join(','); + if (!seen.has(resultStr)) { + acc.push(result); + seen.add(resultStr); + } + return acc; + }, []); + + results = results.reverse(); + + // for debugging + //Search.lastresults = results.slice(); // a copy + // console.info("search results:", Search.lastresults); + + // print the results + _displayNextItem(results, results.length, searchTerms, highlightTerms); + }, + + /** + * search for object names + */ + performObjectSearch: (object, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const objects = Search._index.objects; + const objNames = Search._index.objnames; + const titles = Search._index.titles; + + const results = []; + + const objectSearchCallback = (prefix, match) => { + const name = match[4] + const fullname = (prefix ? prefix + "." : "") + name; + const fullnameLower = fullname.toLowerCase(); + if (fullnameLower.indexOf(object) < 0) return; + + let score = 0; + const parts = fullnameLower.split("."); + + // check for different match types: exact matches of full name or + // "last name" (i.e. last dotted part) + if (fullnameLower === object || parts.slice(-1)[0] === object) + score += Scorer.objNameMatch; + else if (parts.slice(-1)[0].indexOf(object) > -1) + score += Scorer.objPartialMatch; // matches in last name + + const objName = objNames[match[1]][2]; + const title = titles[match[0]]; + + // If more than one term searched for, we require other words to be + // found in the name/title/description + const otherTerms = new Set(objectTerms); + otherTerms.delete(object); + if (otherTerms.size > 0) { + const haystack = `${prefix} ${name} ${objName} ${title}`.toLowerCase(); + if ( + [...otherTerms].some((otherTerm) => haystack.indexOf(otherTerm) < 0) + ) + return; + } + + let anchor = match[3]; + if (anchor === "") anchor = fullname; + else if (anchor === "-") anchor = objNames[match[1]][1] + "-" + fullname; + + const descr = objName + _(", in ") + title; + + // add custom score for some objects according to scorer + if (Scorer.objPrio.hasOwnProperty(match[2])) + score += Scorer.objPrio[match[2]]; + else score += Scorer.objPrioDefault; + + results.push([ + docNames[match[0]], + fullname, + "#" + anchor, + descr, + score, + filenames[match[0]], + ]); + }; + Object.keys(objects).forEach((prefix) => + objects[prefix].forEach((array) => + objectSearchCallback(prefix, array) + ) + ); + return results; + }, + + /** + * search for full-text terms in the index + */ + performTermsSearch: (searchTerms, excludedTerms) => { + // prepare search + const terms = Search._index.terms; + const titleTerms = Search._index.titleterms; + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + + const scoreMap = new Map(); + const fileMap = new Map(); + + // perform the search on the required terms + searchTerms.forEach((word) => { + const files = []; + const arr = [ + { files: terms[word], score: Scorer.term }, + { files: titleTerms[word], score: Scorer.title }, + ]; + // add support for partial matches + if (word.length > 2) { + const escapedWord = _escapeRegExp(word); + Object.keys(terms).forEach((term) => { + if (term.match(escapedWord) && !terms[word]) + arr.push({ files: terms[term], score: Scorer.partialTerm }); + }); + Object.keys(titleTerms).forEach((term) => { + if (term.match(escapedWord) && !titleTerms[word]) + arr.push({ files: titleTerms[word], score: Scorer.partialTitle }); + }); + } + + // no match but word was a required one + if (arr.every((record) => record.files === undefined)) return; + + // found search word in contents + arr.forEach((record) => { + if (record.files === undefined) return; + + let recordFiles = record.files; + if (recordFiles.length === undefined) recordFiles = [recordFiles]; + files.push(...recordFiles); + + // set score for the word in each file + recordFiles.forEach((file) => { + if (!scoreMap.has(file)) scoreMap.set(file, {}); + scoreMap.get(file)[word] = record.score; + }); + }); + + // create the mapping + files.forEach((file) => { + if (fileMap.has(file) && fileMap.get(file).indexOf(word) === -1) + fileMap.get(file).push(word); + else fileMap.set(file, [word]); + }); + }); + + // now check if the files don't contain excluded terms + const results = []; + for (const [file, wordList] of fileMap) { + // check if all requirements are matched + + // as search terms with length < 3 are discarded + const filteredTermCount = [...searchTerms].filter( + (term) => term.length > 2 + ).length; + if ( + wordList.length !== searchTerms.size && + wordList.length !== filteredTermCount + ) + continue; + + // ensure that none of the excluded terms is in the search result + if ( + [...excludedTerms].some( + (term) => + terms[term] === file || + titleTerms[term] === file || + (terms[term] || []).includes(file) || + (titleTerms[term] || []).includes(file) + ) + ) + break; + + // select one (max) score for the file. + const score = Math.max(...wordList.map((w) => scoreMap.get(file)[w])); + // add result to the result list + results.push([ + docNames[file], + titles[file], + "", + null, + score, + filenames[file], + ]); + } + return results; + }, + + /** + * helper function to return a node containing the + * search summary for a given text. keywords is a list + * of stemmed words. + */ + makeSearchSummary: (htmlText, keywords) => { + const text = Search.htmlToText(htmlText); + if (text === "") return null; + + const textLower = text.toLowerCase(); + const actualStartPosition = [...keywords] + .map((k) => textLower.indexOf(k.toLowerCase())) + .filter((i) => i > -1) + .slice(-1)[0]; + const startWithContext = Math.max(actualStartPosition - 120, 0); + + const top = startWithContext === 0 ? "" : "..."; + const tail = startWithContext + 240 < text.length ? "..." : ""; + + let summary = document.createElement("p"); + summary.classList.add("context"); + summary.textContent = top + text.substr(startWithContext, 240).trim() + tail; + + return summary; + }, +}; + +_ready(Search.init); diff --git a/_static/sphinx_highlight.js b/_static/sphinx_highlight.js new file mode 100644 index 00000000..8a96c69a --- /dev/null +++ b/_static/sphinx_highlight.js @@ -0,0 +1,154 @@ +/* Highlighting utilities for Sphinx HTML documentation. */ +"use strict"; + +const SPHINX_HIGHLIGHT_ENABLED = true + +/** + * highlight a given string on a node by wrapping it in + * span elements with the given class name. + */ +const _highlight = (node, addItems, text, className) => { + if (node.nodeType === Node.TEXT_NODE) { + const val = node.nodeValue; + const parent = node.parentNode; + const pos = val.toLowerCase().indexOf(text); + if ( + pos >= 0 && + !parent.classList.contains(className) && + !parent.classList.contains("nohighlight") + ) { + let span; + + const closestNode = parent.closest("body, svg, foreignObject"); + const isInSVG = closestNode && closestNode.matches("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.classList.add(className); + } + + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + const rest = document.createTextNode(val.substr(pos + text.length)); + parent.insertBefore( + span, + parent.insertBefore( + rest, + node.nextSibling + ) + ); + node.nodeValue = val.substr(0, pos); + /* There may be more occurrences of search term in this node. So call this + * function recursively on the remaining fragment. + */ + _highlight(rest, addItems, text, className); + + if (isInSVG) { + const rect = document.createElementNS( + "http://www.w3.org/2000/svg", + "rect" + ); + const bbox = parent.getBBox(); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute("class", className); + addItems.push({ parent: parent, target: rect }); + } + } + } else if (node.matches && !node.matches("button, select, textarea")) { + node.childNodes.forEach((el) => _highlight(el, addItems, text, className)); + } +}; +const _highlightText = (thisNode, text, className) => { + let addItems = []; + _highlight(thisNode, addItems, text, className); + addItems.forEach((obj) => + obj.parent.insertAdjacentElement("beforebegin", obj.target) + ); +}; + +/** + * Small JavaScript module for the documentation. + */ +const SphinxHighlight = { + + /** + * highlight the search words provided in localstorage in the text + */ + highlightSearchWords: () => { + if (!SPHINX_HIGHLIGHT_ENABLED) return; // bail if no highlight + + // get and clear terms from localstorage + const url = new URL(window.location); + const highlight = + localStorage.getItem("sphinx_highlight_terms") + || url.searchParams.get("highlight") + || ""; + localStorage.removeItem("sphinx_highlight_terms") + url.searchParams.delete("highlight"); + window.history.replaceState({}, "", url); + + // get individual terms from highlight string + const terms = highlight.toLowerCase().split(/\s+/).filter(x => x); + if (terms.length === 0) return; // nothing to do + + // There should never be more than one element matching "div.body" + const divBody = document.querySelectorAll("div.body"); + const body = divBody.length ? divBody[0] : document.querySelector("body"); + window.setTimeout(() => { + terms.forEach((term) => _highlightText(body, term, "highlighted")); + }, 10); + + const searchBox = document.getElementById("searchbox"); + if (searchBox === null) return; + searchBox.appendChild( + document + .createRange() + .createContextualFragment( + '" + ) + ); + }, + + /** + * helper function to hide the search marks again + */ + hideSearchWords: () => { + document + .querySelectorAll("#searchbox .highlight-link") + .forEach((el) => el.remove()); + document + .querySelectorAll("span.highlighted") + .forEach((el) => el.classList.remove("highlighted")); + localStorage.removeItem("sphinx_highlight_terms") + }, + + initEscapeListener: () => { + // only install a listener if it is really needed + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.shiftKey || event.altKey || event.ctrlKey || event.metaKey) return; + if (DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS && (event.key === "Escape")) { + SphinxHighlight.hideSearchWords(); + event.preventDefault(); + } + }); + }, +}; + +_ready(() => { + /* Do not call highlightSearchWords() when we are on the search page. + * It will highlight words from the *previous* search query. + */ + if (typeof Search === "undefined") SphinxHighlight.highlightSearchWords(); + SphinxHighlight.initEscapeListener(); +}); diff --git a/api/astrodata.AstroData.html b/api/astrodata.AstroData.html new file mode 100644 index 00000000..b08a77aa --- /dev/null +++ b/api/astrodata.AstroData.html @@ -0,0 +1,700 @@ + + + + + + + + AstroData — astrodata 3.2.0 documentation + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

AstroData

+
+
+class astrodata.AstroData(nddata=None, tables=None, phu=None, indices=None, is_single=False)[source]
+

Bases: object

+

Base class for the AstroData software package. It provides an interface +to manipulate astronomical data sets.

+
+
Parameters:
+
    +
  • nddata (astrodata.NDAstroData or list of astrodata.NDAstroData) – List of NDAstroData objects.

  • +
  • tables (dict[name, astropy.table.Table]) – Dict of table objects.

  • +
  • phu (astropy.io.fits.Header) – Primary header.

  • +
  • indices (list of int) – List of indices mapping the astrodata.NDAstroData objects that this +object will access to. This is used when slicing an object, then the +sliced AstroData will have the .nddata list from its parent and +access the sliced NDAstroData through this list of indices.

  • +
+
+
+

Attributes Summary

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

data

A list of the arrays (or single array, if this is a single slice) corresponding to the science data attached to each extension.

descriptors

Returns a sequence of names for the methods that have been decorated as descriptors.

exposed

A collection of strings with the names of objects that can be accessed directly by name as attributes of this instance, and that are not part of its standard interface (i.e. data objects that have been added dynamically).

ext_tables

Return the names of the astropy.table.Table objects associated to an extension.

filename

Return the file name.

hdr

Return all headers, as a astrodata.fits.FitsHeaderCollection.

header

Deprecated header access.

id

Returns the extension identifier (1-based extension number) for sliced objects.

indices

Returns the extensions indices for sliced objects.

is_sliced

If this data provider instance represents the whole dataset, return False.

mask

A list of the mask arrays (or a single array, if this is a single slice) attached to the science data, for each extension.

nddata

Return the list of astrodata.NDAstroData objects.

orig_filename

Return the original file name (before it was modified).

path

Return the file path.

phu

Return the primary header.

shape

Return the shape of the data array for each extension as a list of shapes.

tables

Return the names of the astropy.table.Table objects associated to the top-level object.

tags

A set of strings that represent the tags defining this instance.

uncertainty

A list of the uncertainty objects (or a single object, if this is a single slice) attached to the science data, for each extension.

variance

A list of the variance arrays (or a single array, if this is a single slice) attached to the science data, for each extension.

wcs

Returns the list of WCS objects for each extension.

+

Methods Summary

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

add(oper)

Performs inplace addition by evaluating self += operand.

append(ext[, name, header])

Adds a new top-level extension.

crop(x1, y1, x2, y2)

Crop the NDData objects given indices.

divide(oper)

Performs inplace division by evaluating self /= operand.

info()

Prints out information about the contents of this instance.

instrument()

Returns the name of the instrument making the observation.

is_settable(attr)

Return True if the attribute is meant to be modified.

load(source[, extname_parser])

Read from a file, file object, HDUList, etc.

multiply(oper)

Performs inplace multiplication by evaluating self *= operand.

object()

Returns the name of the object being observed.

operate(operator, *args, **kwargs)

Applies a function to the main data array on each extension, replacing the data with the result.

read(source[, extname_parser])

Read from a file, file object, HDUList, etc.

reset(data[, mask, variance, check])

Sets the .data, and optionally .mask and .variance attributes of a single-extension AstroData slice.

subtract(oper)

Performs inplace subtraction by evaluating self -= operand.

table()

Return a dictionary of astropy.table.Table objects.

telescope()

Returns the name of the telescope.

update_filename([prefix, suffix, strip])

Update the "filename" attribute of the AstroData object.

write([filename, overwrite])

Write the object to disk.

+

Attributes Documentation

+
+
+data
+

A list of the arrays (or single array, if this is a single slice) +corresponding to the science data attached to each extension.

+
+ +
+
+descriptors
+

Returns a sequence of names for the methods that have been +decorated as descriptors.

+
+
Return type:
+

tuple of str

+
+
+
+ +
+
+exposed
+

A collection of strings with the names of objects that can be +accessed directly by name as attributes of this instance, and that are +not part of its standard interface (i.e. data objects that have been +added dynamically).

+

Examples

+
>>> ad[0].exposed  
+set(['OBJMASK', 'OBJCAT'])
+
+
+
+ +
+
+ext_tables
+

Return the names of the astropy.table.Table objects associated to +an extension.

+
+ +
+
+filename
+

Return the file name.

+
+ +
+
+hdr
+

Return all headers, as a astrodata.fits.FitsHeaderCollection.

+
+ +
+
+header
+

Deprecated header access. Use .hdr instead.

+
+ +
+
+id
+

Returns the extension identifier (1-based extension number) +for sliced objects.

+
+ +
+
+indices
+

Returns the extensions indices for sliced objects.

+
+ +
+
+is_sliced
+

If this data provider instance represents the whole dataset, return +False. If it represents a slice out of the whole, return True.

+
+ +
+
+mask
+

A list of the mask arrays (or a single array, if this is a single +slice) attached to the science data, for each extension.

+

For objects that miss a mask, None will be provided instead.

+
+ +
+
+nddata
+

Return the list of astrodata.NDAstroData objects.

+

If the AstroData object is sliced, this returns only the NDData +objects of the sliced extensions. And if this is a single extension +object, the NDData object is returned directly (i.e. not a list).

+
+ +
+
+orig_filename
+

Return the original file name (before it was modified).

+
+ +
+
+path
+

Return the file path.

+
+ +
+
+phu
+

Return the primary header.

+
+ +
+
+shape
+

Return the shape of the data array for each extension as a list of +shapes.

+
+ +
+
+tables
+

Return the names of the astropy.table.Table objects associated to +the top-level object.

+
+ +
+
+tags
+

A set of strings that represent the tags defining this instance.

+
+ +
+
+uncertainty
+

A list of the uncertainty objects (or a single object, if this is +a single slice) attached to the science data, for each extension.

+

The objects are instances of AstroPy’s astropy.nddata.NDUncertainty, +or None where no information is available.

+
+

See also

+
+
variance

The actual array supporting the uncertainty object.

+
+
+
+
+ +
+
+variance
+

A list of the variance arrays (or a single array, if this is a +single slice) attached to the science data, for each extension.

+

For objects that miss uncertainty information, None will be provided +instead.

+
+

See also

+
+
uncertainty

The uncertainty objects used under the hood.

+
+
+
+
+ +
+
+wcs
+

Returns the list of WCS objects for each extension.

+
+ +

Methods Documentation

+
+
+add(oper)
+

Performs inplace addition by evaluating self += operand.

+
+
Parameters:
+

oper (number or object) – The operand to perform the operation self += operand.

+
+
Return type:
+

AstroData instance

+
+
+
+ +
+
+append(ext, name=None, header=None)[source]
+

Adds a new top-level extension.

+
+
Parameters:
+
    +
  • ext (array, astropy.nddata.NDData, astropy.table.Table, other) – The contents for the new extension. The exact accepted types depend +on the class implementing this interface. Implementations specific +to certain data formats may accept specialized types (eg. a FITS +provider will accept an astropy.io.fits.ImageHDU and extract the +array out of it).

  • +
  • name (str, optional) – A name that may be used to access the new object, as an attribute +of the provider. The name is typically ignored for top-level +(global) objects, and required for the others. If the name cannot +be derived from the metadata associated to ext, you will +have to provider one. +It can consist in a combination of numbers and letters, with the +restriction that the letters have to be all capital, and the first +character cannot be a number (“[A-Z][A-Z0-9]*”).

  • +
+
+
Returns:
+

    +
  • The same object, or a new one, if it was necessary to convert it to

  • +
  • a more suitable format for internal use.

  • +
+

+
+
Raises:
+
    +
  • TypeError – If adding the object in an invalid situation (eg. name is + None when adding to a single slice).

  • +
  • ValueError – Raised if the extension is of a proper type, but its value is + illegal somehow.

  • +
+
+
+
+ +
+
+crop(x1, y1, x2, y2)[source]
+

Crop the NDData objects given indices.

+
+
Parameters:
+
    +
  • x1 (int) – Minimum and maximum indices for the x and y axis.

  • +
  • y1 (int) – Minimum and maximum indices for the x and y axis.

  • +
  • x2 (int) – Minimum and maximum indices for the x and y axis.

  • +
  • y2 (int) – Minimum and maximum indices for the x and y axis.

  • +
+
+
+
+ +
+
+divide(oper)
+

Performs inplace division by evaluating self /= operand.

+
+
Parameters:
+

oper (number or object) – The operand to perform the operation self /= operand.

+
+
Return type:
+

AstroData instance

+
+
+
+ +
+
+info()[source]
+

Prints out information about the contents of this instance.

+
+ +
+
+instrument()[source]
+

Returns the name of the instrument making the observation.

+
+ +
+
+is_settable(attr)[source]
+

Return True if the attribute is meant to be modified.

+
+ +
+
+classmethod load(source, extname_parser=None)
+

Read from a file, file object, HDUList, etc.

+
+ +
+
+multiply(oper)
+

Performs inplace multiplication by evaluating self *= operand.

+
+
Parameters:
+

oper (number or object) – The operand to perform the operation self *= operand.

+
+
Return type:
+

AstroData instance

+
+
+
+ +
+
+object()[source]
+

Returns the name of the object being observed.

+
+ +
+
+operate(operator, *args, **kwargs)[source]
+

Applies a function to the main data array on each extension, replacing +the data with the result. The data will be passed as the first argument +to the function.

+

It will be applied to the mask and variance of each extension, too, if +they exist.

+

This is a convenience method, which is equivalent to:

+
for ext in ad:
+    ext.data = operator(ext.data, *args, **kwargs)
+    if ext.mask is not None:
+        ext.mask = operator(ext.mask, *args, **kwargs)
+    if ext.variance is not None:
+        ext.variance = operator(ext.variance, *args, **kwargs)
+
+
+

with the additional advantage that it will work on single slices, too.

+
+
Parameters:
+
    +
  • operator (callable) – A function that takes an array (and, maybe, other arguments) +and returns an array.

  • +
  • args (optional) – Additional arguments to be passed to the operator.

  • +
  • kwargs (optional) – Additional arguments to be passed to the operator.

  • +
+
+
+

Examples

+
>>> import numpy as np
+>>> ad.operate(np.squeeze)  
+
+
+
+ +
+
+classmethod read(source, extname_parser=None)[source]
+

Read from a file, file object, HDUList, etc.

+
+ +
+
+reset(data, mask=<object object>, variance=<object object>, check=True)[source]
+

Sets the .data, and optionally .mask and .variance +attributes of a single-extension AstroData slice. This function will +optionally check whether these attributes have the same shape.

+
+
Parameters:
+
    +
  • data (ndarray) – The array to assign to the .data attribute (“SCI”).

  • +
  • mask (ndarray, optional) – The array to assign to the .mask attribute (“DQ”).

  • +
  • variance (ndarray, optional) – The array to assign to the .variance attribute (“VAR”).

  • +
  • check (bool) – If set, then the function will check that the mask and variance +arrays have the same shape as the data array.

  • +
+
+
Raises:
+
    +
  • TypeError – if an attempt is made to set the .mask or .variance attributes + with something other than an array

  • +
  • ValueError – if the .mask or .variance attributes don’t have the same shape as + .data, OR if this is called on an AD instance that isn’t a single + extension slice

  • +
+
+
+
+ +
+
+subtract(oper)
+

Performs inplace subtraction by evaluating self -= operand.

+
+
Parameters:
+

oper (number or object) – The operand to perform the operation self -= operand.

+
+
Return type:
+

AstroData instance

+
+
+
+ +
+
+table()[source]
+

Return a dictionary of astropy.table.Table objects.

+

Notes

+

This returns a _copy_ of the tables, so modifying them will not +affect the original ones.

+
+ +
+
+telescope()[source]
+

Returns the name of the telescope.

+
+ +
+
+update_filename(prefix=None, suffix=None, strip=False)[source]
+

Update the “filename” attribute of the AstroData object.

+

A prefix and/or suffix can be specified. If strip=True, these will +replace the existing prefix/suffix; if strip=False, they will +simply be prepended/appended.

+

The current filename is broken down into its existing prefix, root, and +suffix using the ORIGNAME phu keyword, if it exists and is +contained within the current filename. Otherwise, the filename is split +at the last underscore and the part before is assigned as the root and +the underscore and part after the suffix. No prefix is assigned.

+

Note that, if strip=True, a prefix or suffix will only be stripped +if ‘’ is specified.

+
+
Parameters:
+
    +
  • prefix (str, optional) – New prefix (None => leave alone)

  • +
  • suffix (str, optional) – New suffix (None => leave alone)

  • +
  • strip (bool, optional) – Strip existing prefixes and suffixes if new ones are given?

  • +
+
+
Raises:
+

ValueError – If the filename cannot be determined

+
+
+
+ +
+
+write(filename=None, overwrite=False)[source]
+

Write the object to disk.

+
+
Parameters:
+
    +
  • filename (str, optional) – If the filename is not given, self.path is used.

  • +
  • overwrite (bool) – If True, overwrites existing file.

  • +
+
+
+
+ + + + + + + + + + + +
+ + + + + + + + \ No newline at end of file diff --git a/api/astrodata.AstroDataError.html b/api/astrodata.AstroDataError.html new file mode 100644 index 00000000..7598d961 --- /dev/null +++ b/api/astrodata.AstroDataError.html @@ -0,0 +1,117 @@ + + + + + + + + AstroDataError — astrodata 3.2.0 documentation + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

AstroDataError

+
+
+exception astrodata.AstroDataError[source]
+

Exception raised when there is a problem with the AstroData class.

+
+ +
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/api/astrodata.AstroDataMixin.html b/api/astrodata.AstroDataMixin.html new file mode 100644 index 00000000..043c293b --- /dev/null +++ b/api/astrodata.AstroDataMixin.html @@ -0,0 +1,175 @@ + + + + + + + + AstroDataMixin — astrodata 3.2.0 documentation + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

AstroDataMixin

+
+
+class astrodata.AstroDataMixin[source]
+

Bases: object

+

A Mixin for NDData-like classes (such as Spectrum1D) to enable +them to behave similarly to AstroData objects.

+
+
These behaviors are:
    +
  1. mask attributes are combined with bitwise, not logical, or, +since the individual bits are important.

  2. +
  3. The WCS must be a gwcs.WCS object and slicing results in +the model being modified.

  4. +
  5. There is a settable variance attribute.

  6. +
  7. Additional attributes such as OBJMASK can be extracted from +the .meta[‘other’] dict

  8. +
+
+
+

Attributes Summary

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

shape

The shape of the data.

size

The size of the data.

variance

A convenience property to access the contents of uncertainty.

wcs

The WCS of the data.

+

Attributes Documentation

+
+
+shape
+

The shape of the data.

+
+ +
+
+size
+

The size of the data.

+
+ +
+
+variance
+

A convenience property to access the contents of uncertainty.

+
+ +
+
+wcs
+

The WCS of the data. This is a gWCS object, not a FITS WCS object.

+

This is returning wcs from an inhertited class, see NDData.wcs for more +details.

+
+ +
+ +
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/api/astrodata.NDAstroData.html b/api/astrodata.NDAstroData.html new file mode 100644 index 00000000..efef1745 --- /dev/null +++ b/api/astrodata.NDAstroData.html @@ -0,0 +1,313 @@ + + + + + + + + NDAstroData — astrodata 3.2.0 documentation + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

NDAstroData

+
+
+class astrodata.NDAstroData(data, uncertainty=None, mask=None, wcs=None, meta=None, unit=None, copy=False, variance=None)[source]
+

Bases: AstroDataMixin, NDArithmeticMixin, NDSlicingMixin, NDData

+

Implements NDData with all Mixins, plus some AstroData +specifics.

+

This class implements an NDData-like container that supports reading +and writing as implemented in the astropy.io.registry and also slicing +(indexing) and simple arithmetics (add, subtract, divide and multiply).

+

A very important difference between NDAstroData and NDData is that +the former attempts to load all its data lazily. There are also some +important differences in the interface (eg. .data lets you reset its +contents after initialization).

+

Documentation is provided where our class differs.

+
+

See also

+

NDData, NDArithmeticMixin, NDSlicingMixin

+
+

Examples

+

The mixins allow operation that are not possible with NDData or +NDDataBase, i.e. simple arithmetics:

+
>>> from astropy.nddata import StdDevUncertainty
+>>> import numpy as np
+>>> data = np.ones((3,3), dtype=float)
+>>> ndd1 = NDAstroData(data, uncertainty=StdDevUncertainty(data))
+>>> ndd2 = NDAstroData(data, uncertainty=StdDevUncertainty(data))
+>>> ndd3 = ndd1.add(ndd2)
+>>> ndd3.data
+array([[2., 2., 2.],
+    [2., 2., 2.],
+    [2., 2., 2.]])
+>>> ndd3.uncertainty.array
+array([[1.41421356, 1.41421356, 1.41421356],
+    [1.41421356, 1.41421356, 1.41421356],
+    [1.41421356, 1.41421356, 1.41421356]])
+
+
+

see NDArithmeticMixin for a complete list of all supported arithmetic +operations.

+

But also slicing (indexing) is possible:

+
>>> ndd4 = ndd3[1,:]
+>>> ndd4.data
+array([2., 2., 2.])
+>>> ndd4.uncertainty.array
+array([1.41421356, 1.41421356, 1.41421356])
+
+
+

See NDSlicingMixin for a description how slicing works (which +attributes) are sliced.

+

Initialize an NDAstroData instance.

+
+
Parameters:
+
    +
  • data (array-like) – The actual data. This can be a numpy array, a memmap, or a +fits.ImageHDU object.

  • +
  • uncertainty (NDUncertainty-like object, optional) – An object that represents the uncertainty of the data. If not +specified, the uncertainty will be set to None.

  • +
  • mask (array-like, optional) – An array that represents the mask of the data. If not specified, +the mask will be set to None.

  • +
  • wcs (gwcs.WCS object, optional) – The WCS of the data. If not specified, the WCS will be set to None.

  • +
  • meta (dict-like, optional) – A dictionary-like object that holds the meta data. If not +specified, the meta data will be set to None.

  • +
  • unit (astropy.units.Unit object, optional) – The unit of the data. If not specified, the unit will be set to +None.

  • +
  • copy (bool, optional) – If True, the data, uncertainty, mask, wcs, meta, and unit will be +copied. Otherwise, they will be referenced. Default is False.

  • +
  • variance (array-like, optional) – An array that represents the variance of the data. If not +specified, the variance will be set to None.

  • +
+
+
Raises:
+

ValueError – If uncertainty and variance are both specified.

+
+
+

Notes

+

The uncertainty and variance parameters are mutually exclusive.

+

Attributes Summary

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

T

Transpose the data.

data

An array representing the raw data stored in this instance.

mask

Get or set the mask of the data.

uncertainty

Uncertainty in the dataset, if any.

variance

A convenience property to access the contents of uncertainty, squared (as the uncertainty data is stored as standard deviation).

window

Interface to access a section of the data, using lazy access whenever possible.

+

Methods Summary

+ + + + + + + + + +

set_section(section, input_data)

Sets only a section of the data.

transpose()

Transpose the data.

+

Attributes Documentation

+
+
+T
+

Transpose the data. This is not a copy of the data.

+
+ +
+
+data
+

An array representing the raw data stored in this instance. It +implements a setter.

+
+ +
+
+mask
+

Get or set the mask of the data.

+
+ +
+
+uncertainty
+
+ +
+
+variance
+

A convenience property to access the contents of uncertainty, +squared (as the uncertainty data is stored as standard deviation).

+
+ +
+
+window
+

Interface to access a section of the data, using lazy access +whenever possible.

+
+
Returns:
+

    +
  • An instance of NDWindowing, which provides __getitem__,

  • +
  • to allow the use of square brackets when specifying the window.

  • +
  • Ultimately, an NDWindowingAstrodata instance is returned.

  • +
+

+
+
+

Examples

+
>>> ad[0].nddata.window[100:200, 100:200]  
+<NDWindowingAstrodata .....>
+
+
+
+ +

Methods Documentation

+
+
+set_section(section, input_data)[source]
+

Sets only a section of the data. This method is meant to prevent +fragmentation in the Python heap, by reusing the internal structures +instead of replacing them with new ones.

+
+
Parameters:
+
    +
  • section (slice) – The area that will be replaced

  • +
  • input_data (NDData-like instance) – This object needs to implement at least data, uncertainty, +and mask. Their entire contents will replace the data in the +area defined by section.

  • +
+
+
+

Examples

+
>>> def setup():
+...     sec = NDData(np.zeros((100,100)))
+...     ad[0].nddata.set_section(
+...         (slice(None,100),slice(None,100)),
+...         sec
+...     )
+...
+>>> setup()  
+
+
+
+ +
+
+transpose()[source]
+

Transpose the data. This is not a copy of the data.

+
+ +
+ +
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/api/astrodata.Section.html b/api/astrodata.Section.html new file mode 100644 index 00000000..ff573fc4 --- /dev/null +++ b/api/astrodata.Section.html @@ -0,0 +1,231 @@ + + + + + + + + Section — astrodata 3.2.0 documentation + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

Section

+
+
+class astrodata.Section(*args, **kwargs)[source]
+

Bases: tuple

+

A class to handle n-dimensional sections

+

Attributes Summary

+ + + + + + + + + +

axis_dict

ndim

The number of dimensions in the section.

+

Methods Summary

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

asIRAFsection()

Deprecated, see as_iraf_section

as_iraf_section()

Produce string of style '[x1:x2,y1:y2]' that is 1-indexed and end-inclusive

asslice([add_dims])

Return the Section object as a slice/list of slices.

contains(section)

Return True if the supplied section is entirely within self

from_shape(value)

Produce a Section object defining a given shape.

from_string(value)

The inverse of __str__, produce a Section object from a string.

is_same_size(section)

Return True if the Sections are the same size

overlap(section)

Determine whether the two sections overlap.

shift(*shifts)

Shift a section in each direction by the specified amount

+

Attributes Documentation

+
+
+axis_dict
+
+ +
+
+ndim
+

The number of dimensions in the section.

+
+ +

Methods Documentation

+
+
+asIRAFsection()[source]
+

Deprecated, see as_iraf_section

+
+ +
+
+as_iraf_section()[source]
+

Produce string of style ‘[x1:x2,y1:y2]’ that is 1-indexed +and end-inclusive

+
+ +
+
+asslice(add_dims=0)[source]
+

Return the Section object as a slice/list of slices. Higher +dimensionality can be achieved with the add_dims parameter.

+
+ +
+
+contains(section)[source]
+

Return True if the supplied section is entirely within self

+
+ +
+
+static from_shape(value)[source]
+

Produce a Section object defining a given shape.

+
+ +
+
+static from_string(value)[source]
+

The inverse of __str__, produce a Section object from a string.

+
+ +
+
+is_same_size(section)[source]
+

Return True if the Sections are the same size

+
+ +
+
+overlap(section)[source]
+

Determine whether the two sections overlap. If so, the Section +common to both is returned, otherwise None

+
+ +
+
+shift(*shifts)[source]
+

Shift a section in each direction by the specified amount

+
+ +
+ +
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/api/astrodata.TagSet.html b/api/astrodata.TagSet.html new file mode 100644 index 00000000..6c9f67cd --- /dev/null +++ b/api/astrodata.TagSet.html @@ -0,0 +1,207 @@ + + + + + + + + TagSet — astrodata 3.2.0 documentation + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

TagSet

+
+
+class astrodata.TagSet(add=None, remove=None, blocked_by=None, blocks=None, if_present=None)[source]
+

Bases: TagSet

+

Named tuple that is used by tag methods to return which actions should +be performed on a tag set.

+

All the attributes are optional, and any combination of them can be used, +allowing to create complex tag structures. Read the documentation on the +tag-generating algorithm if you want to better understand the interactions.

+

The simplest TagSet, though, tends to just add tags to the global set.

+

It can be initialized by position, like any other tuple (the order of the +arguments is the one in which the attributes are listed below). It can +also be initialized by name.

+
+
+add
+

Tags to be added to the global set

+
+
Type:
+

set of str, optional

+
+
+
+ +
+
+remove
+

Tags to be removed from the global set

+
+
Type:
+

set of str, optional

+
+
+
+ +
+
+blocked_by
+

Tags that will prevent this TagSet from being applied

+
+
Type:
+

set of str, optional

+
+
+
+ +
+
+blocks
+

Other TagSets containing these won’t be applied

+
+
Type:
+

set of str, optional

+
+
+
+ +
+
+if_present
+

This TagSet will be applied only all of these tags are present

+
+
Type:
+

set of str, optional

+
+
+
+ +

Examples

+
>>> TagSet()  
+TagSet(
+    add=set(),
+    remove=set(),
+    blocked_by=set(),
+    blocks=set(),
+    if_present=set()
+)
+>>> TagSet({'BIAS', 'CAL'})  
+TagSet(
+    add={'BIAS', 'CAL'},
+    remove=set(),
+    blocked_by=set(),
+    blocks=set(),
+    if_present=set()
+)
+>>> TagSet(remove={'BIAS', 'CAL'}) 
+TagSet(
+    add=set(),
+    remove={'BIAS', 'CAL'},
+    blocked_by=set(),
+    blocks=set(),
+    if_present=set()
+)
+
+
+

Create new instance of TagSet(add, remove, blocked_by, blocks, if_present)

+
+ +
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/api/astrodata.add_header_to_table.html b/api/astrodata.add_header_to_table.html new file mode 100644 index 00000000..17a04875 --- /dev/null +++ b/api/astrodata.add_header_to_table.html @@ -0,0 +1,117 @@ + + + + + + + + add_header_to_table — astrodata 3.2.0 documentation + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

add_header_to_table

+
+
+astrodata.add_header_to_table(table)[source]
+

Add a FITS header to a table.

+
+ +
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/api/astrodata.astro_data_descriptor.html b/api/astrodata.astro_data_descriptor.html new file mode 100644 index 00000000..57c5f756 --- /dev/null +++ b/api/astrodata.astro_data_descriptor.html @@ -0,0 +1,129 @@ + + + + + + + + astro_data_descriptor — astrodata 3.2.0 documentation + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

astro_data_descriptor

+
+
+astrodata.astro_data_descriptor(fn)[source]
+

Decorator that will mark a class method as an AstroData descriptor. +Useful to produce list of descriptors, for example.

+

If used in combination with other decorators, this one must be the +one on the top (ie. the last one applying). It doesn’t modify the +method in any other way.

+
+
Parameters:
+

fn (method) – The method to be decorated

+
+
Return type:
+

The tagged method (not a wrapper)

+
+
+
+ +
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/api/astrodata.astro_data_tag.html b/api/astrodata.astro_data_tag.html new file mode 100644 index 00000000..ae5b8869 --- /dev/null +++ b/api/astrodata.astro_data_tag.html @@ -0,0 +1,130 @@ + + + + + + + + astro_data_tag — astrodata 3.2.0 documentation + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

astro_data_tag

+
+
+astrodata.astro_data_tag(fn)[source]
+

Decorator that marks methods of an AstroData derived class as part of +the tag-producing system.

+

It wraps the method around a function that will ensure a consistent return +value: the wrapped method can return any sequence of sequences of strings, +and they will be converted to a TagSet. If the wrapped method +returns None, it will be turned into an empty TagSet.

+
+
Parameters:
+

fn (method) – The method to be decorated

+
+
Return type:
+

A wrapper function

+
+
+
+ +
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/api/astrodata.create.html b/api/astrodata.create.html new file mode 100644 index 00000000..a309159c --- /dev/null +++ b/api/astrodata.create.html @@ -0,0 +1,119 @@ + + + + + + + + create — astrodata 3.2.0 documentation + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

create

+
+
+astrodata.create(*args, **kwargs)[source]
+

Return an AstroData object from data.

+

For implementation details, see +create_from_scratch()

+
+ +
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/api/astrodata.from_file.html b/api/astrodata.from_file.html new file mode 100644 index 00000000..54d50a90 --- /dev/null +++ b/api/astrodata.from_file.html @@ -0,0 +1,119 @@ + + + + + + + + from_file — astrodata 3.2.0 documentation + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

from_file

+
+
+astrodata.from_file(*args, **kwargs)[source]
+

Return an AstroData object from a file.

+

For implementation details, see +get_astro_data().

+
+ +
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/api/astrodata.open.html b/api/astrodata.open.html new file mode 100644 index 00000000..a14d06ea --- /dev/null +++ b/api/astrodata.open.html @@ -0,0 +1,118 @@ + + + + + + + + open — astrodata 3.2.0 documentation + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

open

+
+
+astrodata.open(*args, **kwargs)[source]
+

Return an AstroData object from a file (deprecated, use +from_file()).

+
+ +
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/api/astrodata.returns_list.html b/api/astrodata.returns_list.html new file mode 100644 index 00000000..e0be8e27 --- /dev/null +++ b/api/astrodata.returns_list.html @@ -0,0 +1,129 @@ + + + + + + + + returns_list — astrodata 3.2.0 documentation + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

returns_list

+
+
+astrodata.returns_list(fn)[source]
+

Decorator to ensure that descriptors that should return a list (of one +value per extension) only returns single values when operating on single +slices; and vice versa.

+

This is a common case, and you can use the decorator to simplify the +logic of your descriptors.

+
+
Parameters:
+

fn (method) – The method to be decorated

+
+
Return type:
+

A function

+
+
+
+ +
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/api/astrodata.version.html b/api/astrodata.version.html new file mode 100644 index 00000000..b88c5d3d --- /dev/null +++ b/api/astrodata.version.html @@ -0,0 +1,126 @@ + + + + + + + + version — astrodata 3.2.0 documentation + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

version

+
+
+astrodata.version(short=False, tag='')[source]
+

Returns DRAGONS’s version based on the api, +feature and bug numbers.

+
+
Returns:
+

str

+
+
Return type:
+

formatted version

+
+
+
+ +
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/api_short.html b/api_short.html new file mode 100644 index 00000000..937d0dce --- /dev/null +++ b/api_short.html @@ -0,0 +1,178 @@ + + + + + + + + Common API for Users — astrodata 3.2.0 documentation + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

Common API for Users

+

This package contains the common API for users of the AstroData system. It +provides a single interface to the data, regardless of the format in which it +is stored.

+

If you would like a more extensive description of the astrodata package as a +user, see the User Guide. If you are interested in developing with AstroData, +see the Developer Guide.

+
+

astrodata Package

+

This package adds an abstraction layer to astronomical data by parsing the +information contained in the headers as attributes. To do so, one must subclass +astrodata.AstroData and add parse methods accordingly to the +TagSet received.

+
+

Functions

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

add_header_to_table(table)

Add a FITS header to a table.

astro_data_descriptor(fn)

Decorator that will mark a class method as an AstroData descriptor.

astro_data_tag(fn)

Decorator that marks methods of an AstroData derived class as part of the tag-producing system.

from_file(*args, **kwargs)

Return an AstroData object from a file.

create(*args, **kwargs)

Return an AstroData object from data.

returns_list(fn)

Decorator to ensure that descriptors that should return a list (of one value per extension) only returns single values when operating on single slices; and vice versa.

version([short, tag])

Returns DRAGONS's version based on the api, feature and bug numbers.

open(*args, **kwargs)

Return an AstroData object from a file (deprecated, use from_file()).

+
+
+

Classes

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

AstroData([nddata, tables, phu, indices, ...])

Base class for the AstroData software package.

AstroDataError

Exception raised when there is a problem with the AstroData class.

AstroDataMixin()

A Mixin for NDData-like classes (such as Spectrum1D) to enable them to behave similarly to AstroData objects.

NDAstroData(data[, uncertainty, mask, wcs, ...])

Implements NDData with all Mixins, plus some AstroData specifics.

Section(*args, **kwargs)

A class to handle n-dimensional sections

TagSet([add, remove, blocked_by, blocks, ...])

Named tuple that is used by tag methods to return which actions should be performed on a tag set.

+
+
+
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/genindex.html b/genindex.html new file mode 100644 index 00000000..a5aadf07 --- /dev/null +++ b/genindex.html @@ -0,0 +1,461 @@ + + + + + + + Index — astrodata 3.2.0 documentation + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ + +

Index

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

A

+ + + +
+ +

B

+ + + +
+ +

C

+ + + +
+ +

D

+ + + +
+ +

E

+ + + +
+ +

F

+ + + +
+ +

H

+ + + +
+ +

I

+ + + +
+ +

L

+ + +
+ +

M

+ + + +
+ +

N

+ + + +
+ +

O

+ + + +
+ +

P

+ + + +
+ +

R

+ + + +
+ +

S

+ + + +
+ +

T

+ + + +
+ +

U

+ + + +
+ +

V

+ + + +
+ +

W

+ + + +
+ + + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/index.html b/index.html new file mode 100644 index 00000000..3f7ce152 --- /dev/null +++ b/index.html @@ -0,0 +1,123 @@ + + + + + + + + astrodata Documentation — astrodata 3.2.0 documentation + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

astrodata Documentation

+

This is the documentation for astrodata.

+ +
+

Indices and tables

+ +
+
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/manuals/appendix_descriptors.html b/manuals/appendix_descriptors.html new file mode 100644 index 00000000..56ad6c2b --- /dev/null +++ b/manuals/appendix_descriptors.html @@ -0,0 +1,532 @@ + + + + + + + + List of Gemini Standard Descriptors — astrodata 3.2.0 documentation + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

List of Gemini Standard Descriptors

+

To run and re-use Gemini primitives and functions this list of Standard +Descriptors must be defined for input data. This also applies to data +that is to be served by the Gemini Observatory Archive (GOA).

+

For any AstroData objects, to get the list of the descriptors that are +defined use the AstroData.descriptors attribute:

+
>> import astrodata
+>> import gemini_instruments
+>> ad = astrodata.open('../playdata/N20170609S0154.fits')
+
+>> ad.descriptors
+('airmass', 'amp_read_area', 'ao_seeing', ..., 'well_depth_setting')
+
+
+

To get the values:

+
>> ad.airmass()
+
+>> for descriptor in ad.descriptors:
+...     print(descriptor, getattr(ad, descriptor)())
+
+
+

Note that not all of the descriptors below are defined for all of the +instruments. For example, shuffle_pixels is defined only for GMOS data +since only GMOS offers a Nod & Shuffle mode.

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

Descriptor

Short Definition

Python type

ad[0].desc()

ad.desc()

airmass

Airmass of the observation.

float

amp_read_area

Combination of amplifier name and 1-indexed section relative +to the detector.

str

list of str

ao_seeing

Estimate of the natural seeing as calculated from the +adaptive optics systems.

float

array_name

Name assigned to the array generated by a given amplifier, +one array per amplifier.

str

list of str

array_section

Section covered by the array(s), in 0-indexed pixels, relative +to the detector frame (e.g. position of multiple amps read +within a CCD). Uses namedtuple “Section” defined in +gemini_instruments.common.

Section

list of Section

azimuth

Pointing position in azimuth, in degrees.

float

calibration_key

Key used in the database that the getProcessed* primitives +use to store previous calibration association information.

str

camera

Name of the camera.

str

cass_rotator_pa

Position angle of the Cassegrain rotator, in degrees.

float

central_wavelength

Central wavelength, in meters.

float

coadds

Number of co-adds.

int

data_label

Gemini data label.

str

data_section

Section where the sky-exposed data falls, in 0-indexed pixels. +Uses namedtuple “Section” defined in +gemini_instruments.common

Section

list of Section

dec

Declination of the center of the field, in degrees.

float

decker

Name of the decker.

str

detector_name

Name assigned to the detector.

str

detector_roi_setting

Human readable Region of Interest (ROI) setting

str

detector_rois_requested

Section defining the Regions of Interest, in 0-indexed pixels. +Uses namedtuple “Section” defined in +gemini_instruments.common.

list of Section

detector_section

Section covered by the detector(s), in 0-indexed pixels, +relative to the whole mosaic of detectors. +Uses namedtuple “Section” defined in +gemini_instruments.common.

list

list of Section

detector_x_bin

X-axis binning.

int

detector_x_offset

Telescope offset along the detector X-axis, in pixels.

float

detector_y_bin

Y-axis binning.

int

detector_y_offset

Telescope offset along the detector Y-axis, in pixels.

float

disperser

Name of the disperser.

str

dispersion

Value for the dispersion, in meters per pixel.

float

list of float

dispersion_axis

Dispersion axis.

int

list of int

effective_wavelength

Wavelength representing the bandpass or the spectrum coverage.

float

elevation

Pointing position in elevation, in degrees.

float

exposure_time

Exposure time, in seconds.

float

filter_name

Name of the filter combination.

str

focal_plane_mask

Name of the mask in the focal plane.

str

gain

Gain in electrons per ADU

float

list of float

gain_setting

Human readable gain setting (eg. low, high)

str

gcal_lamp

Returns the name of the GCAL lamp being used, or “Off” if no +lamp is in use.

str

group_id

Gemini observation group ID that identifies compatible data.

str

instrument

Name of the instrument

str

is_ao

Whether or not the adaptive optics system was used.

bool

is_coadds_summed

Whether co-adds are summed or averaged.

bool

local_time

Local time.

datetime

lyot_stop

Name of the lyot stop.

str

mdf_row_id

Mask Definition File row ID of a cut MOS or XD spectrum.

int ??

nod_count

Number of nods to A and B positions.

tuple of int

nod_offsets

Nod offsets to A and B positions, in arcseconds

tuple of float

nominal_atmospheric_extinction

Nomimal atmospheric extinction, from model.

float

nominal_photometric_zeropoint

Nominal photometric zeropoint.

float

list of float

non_linear_level

Lower boundary of the non-linear regime.

float

list of int

object

Name of the target (as entered by the user).

str

observation_class

Gemini class name for the observation +(eg. ‘science’, ‘acq’, ‘dayCal’).

str

observation_epoch

Observation epoch.

float

observation_id

Gemini observation ID.

str

observation_type

Gemini observation type (eg. ‘OBJECT’, ‘FLAT’, ‘ARC’).

str

overscan_section

Section where the overscan data falls, in 0-indexed pixels. +Uses namedtuple “Section” defined in +gemini_instruments.common.

Section

list of Section

pixel_scale

Pixel scale in arcsec per pixel.

float

program_id

Gemini program ID.

str

pupil_mask

Name of the pupil mask.

str ??

qa_state

Gemini quality assessment state (eg. pass, usable, fail).

str

ra

Right ascension, in degrees.

float

raw_bg

Gemini sky background band.

int ??

raw_cc

Gemini cloud coverage band.

int

raw_iq

Gemini image quality band.

int

raw_wv

Gemini water vapor band.

int ??

read_mode

Gemini name for combination for gain setting and read setting.

str

read_noise

Read noise in electrons.

float

list of float

read_speed_setting

human readable read mode setting (eg. slow, fast).

str

requested_bg

PI requested Gemini sky background band.

int

requested_cc

PI requested Gemini cloud coverage band.

int

requested_iq

PI requested Gemini image quality band.

int

requested_wv

PI requested Gemini water vapor band.

int

saturation_level

Saturation level.

int

list of int

shuffle_pixels

Charge shuffle, in pixels. (nod and shuffle mode)

int

slit

Name of the slit.

str

target_dec

Declination of the target, in degrees.

float

target_ra

Right Ascension of the target, in degrees.

float

telescope

Name of the telescope.

str

telescope_x_offset

Offset along the telescope’s x-axis.

float

telescope_y_offset

Offset along the telescope’s y-axis.

float

ut_date

UT date of the observation.

datetime.date

ut_datetime

UT date and time of the observation.

datetime

ut_time

UT time of the observation.

datetime.time

wavefront_sensor

Wavefront sensor used for the observation.

str

wavelength_band

Band associated with the filter or the central wavelength.

str

wcs_dec

Declination of the center of field from the WCS keywords. +In degrees.

float

wcs_ra

Right Ascension of the center of field from the WCS keywords. +In degrees.

float

well_depth_setting

Human readable well depth setting (eg. shallow, deep)

str

+
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/manuals/cheatsheet.html b/manuals/cheatsheet.html new file mode 100644 index 00000000..4d0e0bd8 --- /dev/null +++ b/manuals/cheatsheet.html @@ -0,0 +1,535 @@ + + + + + + + + 1. Cheat Sheet — astrodata 3.2.0 documentation + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

1. Cheat Sheet

+
+

Document ID

+

PIPE-USER-105_AstrodataCheatSheet

+
+

A data package is available for download if you wish to run the examples +included in this cheat sheet. Download it at:

+
+
+

To unpack:

+
$ cd <somewhere_convenient>
+$ tar xvf ad_usermanual_datapkg-v1.tar
+$ bunzip2 ad_usermanual/playdata/*.bz2
+
+
+

Then go to the ad_usermanual/playground directory to run the examples.

+
+

1.1. Imports

+

Import astrodata and gemini_instruments:

+
>> import astrodata
+>> import gemini_instruments
+
+
+
+
+

1.2. Basic read and write operations

+

Open a file:

+
>> ad = astrodata.open('../playdata/N20170609S0154.fits')
+
+
+

Get path and filename:

+
>> ad.path
+'../playdata/N20170609S0154.fits'
+>> ad.filename
+'N20170609S0154.fits'
+
+
+

Write to a new file:

+
>> ad.write(filename='new154.fits')
+>> ad.filename
+N20170609S0154.fits
+
+
+

Overwrite the file:

+
>> adnew = astrodata.open('new154.fits')
+>> adnew.filename
+new154.fits
+>> adnew.write(overwrite=True)
+
+
+
+
+

1.3. Object structure

+
+

1.3.1. Description

+

The AstroData object is assigned by “tags” that describe the +type of data it contains. The tags are drawn from rules defined in +|gemini_instruments| and are based on header information.

+

When mapping a FITS file, each science pixel extension is loaded as a +NDAstroData object. The list is zero-indexed. So FITS +extension 1 becomes element 0 of the AstroData object. If a VAR +extension is present, it is loaded to the variance attribute of the +NDAstroData. If a DQ extension is present, it is loaded to the .mask +attribute of the NDAstroData. SCI, VAR and DQ are associated +through the EXTVER keyword value.

+

In the file below, each AstroData “extension” contains the pixel data, +then an error plane (.variance) and a bad pixel mask plane (.mask). +|Table| can be attached to an extension, like OBJCAT, or to the +AstroData object globally, like REFCAT. (In this case, OBJCAT is a +catalogue of the sources detected in the image, REFCAT is a reference catalog +for the area covered by the whole file.) If other 2D data needs to be +associated with an extension this can also be done, like here with OBJMASK, +a 2D mask matching the sources in the image.

+
>> ad = astrodata.open('../playdata/N20170609S0154_varAdded.fits')
+>> ad.info()
+Filename: ../playdata/N20170609S0154_varAdded.fits
+Tags: ACQUISITION GEMINI GMOS IMAGE NORTH OVERSCAN_SUBTRACTED OVERSCAN_TRIMMED
+    PREPARED SIDEREAL
+Pixels Extensions
+Index  Content                  Type              Dimensions     Format
+[ 0]   science                  NDAstroData       (2112, 256)    float32
+          .variance             ndarray           (2112, 256)    float32
+          .mask                 ndarray           (2112, 256)    int16
+          .OBJCAT               Table             (6, 43)        n/a
+          .OBJMASK              ndarray           (2112, 256)    uint8
+[ 1]   science                  NDAstroData       (2112, 256)    float32
+          .variance             ndarray           (2112, 256)    float32
+          .mask                 ndarray           (2112, 256)    int16
+          .OBJCAT               Table             (8, 43)        n/a
+          .OBJMASK              ndarray           (2112, 256)    uint8
+[ 2]   science                  NDAstroData       (2112, 256)    float32
+          .variance             ndarray           (2112, 256)    float32
+          .mask                 ndarray           (2112, 256)    int16
+          .OBJCAT               Table             (7, 43)        n/a
+          .OBJMASK              ndarray           (2112, 256)    uint8
+[ 3]   science                  NDAstroData       (2112, 256)    float32
+          .variance             ndarray           (2112, 256)    float32
+          .mask                 ndarray           (2112, 256)    int16
+          .OBJCAT               Table             (5, 43)        n/a
+          .OBJMASK              ndarray           (2112, 256)    uint8
+Other Extensions
+               Type        Dimensions
+.REFCAT        Table       (245, 16)
+
+
+
+
+

1.3.2. Modifying the structure

+

Let’s first get our play data loaded. You are encouraged to do a +info() before and after each structure-modification +step, to see how things change.

+
>> from copy import deepcopy
+>> ad = astrodata.open('../playdata/N20170609S0154.fits')
+>> adcopy = deepcopy(ad)
+>> advar = astrodata.open('../playdata/N20170609S0154_varAdded.fits')
+
+
+

Append an extension:

+
>> adcopy.append(advar[3])
+>> adcopy.append(advar[3].data)
+
+
+

Delete an extension:

+
>> del adcopy[5]
+
+
+

Delete and add variance and mask planes:

+
>> var = adcopy[4].variance
+>> adcopy[4].variance = None
+>> adcopy[4].variance = var
+
+
+

Attach a table to an extension:

+
>> adcopy[3].SMAUG = advar[0].OBJCAT.copy()
+
+
+

Attach a table to the AstroData object:

+
>> adcopy.DROGON = advar.REFCAT.copy()
+
+
+

Delete a table:

+
>> del adcopy[3].SMAUG
+>> del adcopy.DROGON
+
+
+
+
+
+

1.4. Astrodata tags

+
>> ad = astrodata.open('../playdata/N20170521S0925_forStack.fits')
+>> ad.tags
+{'GMOS', 'OVERSCAN_SUBTRACTED', 'SIDEREAL', 'NORTH', 'OVERSCAN_TRIMMED',
+'PREPARED', 'IMAGE', 'GEMINI'}
+
+>> type(ad.tags)
+<class 'set'>
+
+>> {'IMAGE', 'PREPARED'}.issubset(ad.tags)
+True
+>> 'PREPARED' in ad.tags
+True
+
+
+
+
+

1.5. Headers

+

The use of descriptors is favored over direct header access when retrieving +values already represented by descriptors, and when writing instrument agnostic +routines.

+
+

1.5.1. Descriptors

+
>> ad = astrodata.open('../playdata/N20170609S0154.fits')
+>> ad.filter_name()
+'open1-6&g_G0301'
+>> ad.filter_name(pretty=True)
+'g'
+>> ad.gain()   # uses a look-up table to get the correct values
+[2.03, 1.97, 1.96, 2.01]
+>> ad.hdr['GAIN']
+[1.0, 1.0, 1.0, 1.0]    # the wrong values contained in the raw data.
+>> ad[0].gain()
+2.03
+>> ad.gain()[0]
+2.03
+
+>> ad.descriptors
+('airmass', 'amp_read_area', 'ao_seeing', ...
+ ...)
+
+
+
+
+

1.5.2. Direct access to header keywords

+
>> ad = astrodata.open('../playdata/N20170609S0154_varAdded.fits')
+
+
+
+

1.5.2.1. Primary Header Unit

+

To see a print out of the full PHU:

+
+

>> ad.phu

+
+

Get value from PHU:

+
>> ad.phu['EXPTIME']
+1.0
+
+>> default = 5.
+>> ad.phu.get('BOGUSKEY', default)
+5.0
+
+
+

Set PHU keyword, with and without comment:

+
>> ad.phu['NEWKEY'] = 50.
+>> ad.phu['ANOTHER'] = (30., 'Some comment')
+
+
+

Delete PHU keyword:

+
>> del ad.phu['NEWKEY']
+
+
+
+
+

1.5.2.2. Pixel extension header

+

To see a print out of the full header for an extension or all the extensions:

+
+

>> ad[0].hdr +>> list(ad.hdr)

+
+

Get value from an extension header:

+
>> ad[0].hdr['OVERSCAN']
+469.7444308769482
+>> ad[0].hdr.get('OVERSCAN', default)
+
+
+

Get keyword value for all extensions:

+
>> ad.hdr['OVERSCAN']
+[469.7444308769482, 469.656175780001, 464.9815279808291, 467.5701178951787]
+>> ad.hdr.get('BOGUSKEY', 5.)
+[5.0, 5.0, 5.0, 5.0]
+
+
+

Set extension header keyword, with and without comment:

+
>> ad[0].hdr['NEWKEY'] = 50.
+>> ad[0].hdr['ANOTHER'] = (30., 'Some comment')
+
+
+

Delete an extension keyword:

+
>> del ad[0].hdr['NEWKEY']
+
+
+
+
+

1.5.2.3. Table header

+

See the Tables section.

+
+
+
+
+

1.6. Pixel data

+
+

1.6.1. Arithmetics

+

Arithmetics with variance and mask propagation is offered for ++, -, *, /, and **.

+
>> ad_hcont = astrodata.open('../playdata/N20170521S0925_forStack.fits')
+>> ad_halpha = astrodata.open('../playdata/N20170521S0926_forStack.fits')
+
+>> adsub = ad_halpha - ad_hcont
+
+>> ad_halpha[0].data.mean()
+646.11896
+>> ad_hcont[0].data.mean()
+581.81342
+>> adsub[0].data.mean()
+64.305862
+
+>> ad_halpha[0].variance.mean()
+669.80664
+>> ad_hcont[0].variance.mean()
+598.46667
+>> adsub[0].variance.mean()
+1268.274
+
+
+# In place multiplication
+>> ad_mult = deepcopy(ad)
+>> ad_mult.multiply(ad)
+>> ad_mult.multiply(5.)
+
+
+# Using descriptors to operate in-place on extensions.
+>> from copy import deepcopy
+>> ad = astrodata.open('../playdata/N20170609S0154_varAdded.fits')
+>> ad_gain = deepcopy(ad)
+>> for (ext, gain) in zip(ad_gain, ad_gain.gain()):
+...     ext.multiply(gain)
+>> ad_gain[0].data.mean()
+366.39545
+>> ad[0].data.mean()
+180.4904
+>> ad[0].gain()
+2.03
+
+
+
+
+

1.6.2. Other pixel data operations

+
>> import numpy as np
+>> ad_halpha[0].mask[300:350,300:350] = 1
+>> np.mean(ad_halpha[0].data[ad_halpha[0].mask==0])
+657.1994
+>> np.mean(ad_halpha[0].data)
+646.11896
+
+
+
+
+
+

1.7. Tables

+

Tables are stored as astropy.table.Table class. FITS tables are +represented in astrodata as |Table| and FITS headers are stored in the +NDAstroData meta attribute. Most table +access should be done through the |Table| interface. The best reference is the +|astropy| documentation itself. Below are just a few examples.

+
>> ad = astrodata.open('../playdata/N20170609S0154_varAdded.fits')
+
+
+

Get column names:

+
>> ad.REFCAT.colnames
+
+
+

Get column content:

+
>> ad.REFCAT['zmag']
+>> ad.REFCAT['zmag', 'zmag_err']
+
+
+

Get content of row:

+
>> ad.REFCAT[4]     # 5th row
+>> ad.REFCAT[4:6]   # 5th and 6th rows
+
+
+

Get content from specific row and column:

+
>> ad.REFCAT['zmag'][4]
+
+
+

Add a column:

+
>> new_column = [0] * len(ad.REFCAT)
+>> ad.REFCAT['new_column'] = new_column
+
+
+

Add a row:

+
>> new_row = [0] * len(ad.REFCAT.colnames)
+>> new_row[1] = ''   # Cat_Id column is of "str" type.
+>> ad.REFCAT.add_row(new_row)
+
+
+

Selecting value from criterion:

+
>> ad.REFCAT['zmag'][ad.REFCAT['Cat_Id'] == '1237662500002005475']
+>> ad.REFCAT['zmag'][ad.REFCAT['zmag'] < 18.]
+
+
+

Rejecting numpy.nan before doing something with the values:

+
>> t = ad.REFCAT   # to save typing.
+>> t['zmag'][np.where(np.isnan(t['zmag']), 99, t['zmag']) < 18.]
+
+>> t['zmag'].mean()
+nan
+>> t['zmag'][np.where(~np.isnan(t['zmag']))].mean()
+20.377306
+
+
+

If for some reason you need to access the FITS table headers, here is how to do it.

+

To see the FITS headers:

+
>> ad.REFCAT.meta
+>> ad[0].OBJCAT.meta
+
+
+

To retrieve a specific FITS table header:

+
>> ad.REFCAT.meta['header']['TTYPE3']
+'RAJ2000'
+>> ad[0].OBJCAT.meta['header']['TTYPE3']
+'Y_IMAGE'
+
+
+

To retrieve all the keyword names matching a selection:

+
>> keynames = [key for key in ad.REFCAT.meta['header'] if key.startswith('TTYPE')]
+
+
+
+
+

1.8. Create new AstroData object

+

Basic header and data array set to zeros:

+
>> from astropy.io import fits
+
+>> phu = fits.PrimaryHDU()
+>> pixel_data = np.zeros((100,100))
+
+>> hdu = fits.ImageHDU()
+>> hdu.data = pixel_data
+>> ad = astrodata.create(phu)
+>> ad.append(hdu, name='SCI')
+
+
+

or another way:

+
>> hdu = fits.ImageHDU(data=pixel_data, name='SCI')
+>> ad = astrodata.create(phu, [hdu])
+
+
+

A |Table| as an AstroData object:

+
>> from astropy.table import Table
+
+>> my_astropy_table = Table(list(np.random.rand(2,100)), names=['col1', 'col2'])
+>> phu = fits.PrimaryHDU()
+
+>> ad = astrodata.create(phu)
+>> ad.SMAUG = my_astropy_table
+
+>> phu = fits.PrimaryHDU()
+>> ad = astrodata.create(phu)
+>> ad.SMAUG = my_fits_table
+
+
+

WARNING: This last line will not run like the others as we have not defined +my_fits_table. This is nonetheless how it is done if you had a FITS table.

+
+
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/manuals/full_api.html b/manuals/full_api.html new file mode 100644 index 00000000..64ec89c4 --- /dev/null +++ b/manuals/full_api.html @@ -0,0 +1,111 @@ + + + + + + + + 4. Reference API — astrodata 3.2.0 documentation + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

4. Reference API

+
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/manuals/index.html b/manuals/index.html new file mode 100644 index 00000000..5a75032c --- /dev/null +++ b/manuals/index.html @@ -0,0 +1,128 @@ + + + + + + + + Astrodata Manual — astrodata 3.2.0 documentation + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

Astrodata Manual

+
+

Document ID

+

PIPE-USER-120_AstrodataMasterManual

+
+
+
+

This documentation provides different levels of information:

+ +

Appendix

+ +
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/manuals/progmanual/adclass.html b/manuals/progmanual/adclass.html new file mode 100644 index 00000000..c2df88ca --- /dev/null +++ b/manuals/progmanual/adclass.html @@ -0,0 +1,471 @@ + + + + + + + + 3.3. AstroData and Derivatives — astrodata 3.2.0 documentation + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

3.3. AstroData and Derivatives

+

The AstroData class is the main interface to the package. When opening files +or creating new objects, a derivative of this class is returned, as the +AstroData class is not intended to be used directly. It provides the logic to +calculate the tag set for an image, which is common to all +data products. Aside from that, it lacks any kind of specialized knowledge +about the different instruments that produce the FITS files. More importantly, +it defines two methods (info and load) as abstract, meaning that the +class cannot be instantiated directly: a derivative must implement those +methods in order to be useful. Such derivatives can also implement descriptors, +which provide processed metadata in a way that abstracts the user from the raw +information (e.g., the keywords in FITS headers).

+

AstroData does define a common interface, though. Much of it consists on +implementing semantic behavior (access to components through indices, like a +list; arithmetic using standard operators; etc), mostly by implementing +standard Python methods:

+
    +
  • Defines a common __init__ function.

  • +
  • Implements __deepcopy__.

  • +
  • Implements __iter__ to allow sequential iteration over the main set of +components (e.g., FITS science HDUs).

  • +
  • Implements __getitem__ to allow data slicing (e.g., ad[2:4] returns +a new AstroData instance that contains only the third and fourth main +components).

  • +
  • Implements __delitem__ to allow for data removal based on index. It does +not define __setitem__, though. The basic AstroData series of classes +only allows to append new data blocks, not to replace them in one sweeping +move.

  • +
  • Implements __iadd__, __isub__, __imul__, __itruediv__, and +their not-in-place versions, based on them.

  • +
+

There are a few other methods. For a detailed discussion, please refer to the +Reference API.

+
+

3.3.1. The tags Property

+

Additionally, and crucial to the package, AstroData offers a tags property, +that under the hood calculates textual tags that describe the object +represented by an instance, and returns a set of strings. Returning a set (as +opposed to a list, or other similar structure) is intentional, because it is +fast to compare sets, e.g., testing for membership; or calculating intersection, +etc., to figure out if a certain dataset belongs to an arbitrary category.

+

The implementation for the tags property is just a call to +AstroData._process_tags(). This function implements the actual logic behind +calculating the tag set (described below). A derivative class +could redefine the algorithm, or build upon it.

+
+
+

3.3.2. Writing an AstroData Derivative

+

The first step when creating new AstroData derivative hierarchy would be to +create a new class that knows how to deal with some kind of specific data in a +broad sense.

+

AstroData implements both .info() and .load() in ways that are +specific to FITS files. It also introduces a number of FITS-specific methods +and properties, e.g.:

+
    +
  • The properties phu and hdr, which return the primary header and +a list of headers for the science HDUs, respectively.

  • +
  • A write method, which will write the data back to a FITS file.

  • +
  • A _matches_data static method, which is very important, involved in +guiding for the automatic class choice algorithm during data loading. We’ll +talk more about this when dealing with registering our classes.

  • +
+

It also defines the first few descriptors, which are common to all Gemini data: +instrument, object, and telescope, which are good examples of simple +descriptors that just map a PHU keyword without applying any conversion.

+

A typical AstroData programmer will extend this class (AstroData). Any of +the classes under the gemini_instruments package can be used as examples, +but we’ll describe the important bits here.

+
+

3.3.2.1. Create a package for it

+

This is not strictly necessary, but simplifies many things, as we’ll see when +talking about registration. The package layout is up to the designer, so you +can decide how to do it. For DRAGONS we’ve settled on the following +recommendation for our internal process (just to keep things familiar):

+
gemini_instruments
+    __init__.py
+    instrument_name
+        __init__.py
+        adclass.py
+        lookup.py
+
+
+

Where instrument_name would be the package name (for Gemini we group all +our derivative packages under gemini_instruments, and we would import +gemini_instruments.gmos, for example). __init__.py and adclass.py +would be the only required modules under our recommended layout, with +lookup.py being there just to hold hard-coded values in a module separate +from the main logic.

+

adclass.py would contain the declaration of the derivative class, and +__init__.py will contain any code needed to register our class with the +AstroData system upon import.

+
+
+

3.3.2.2. Create your derivative class

+

This is an excerpt of a typical derivative module:

+
from astrodata import astro_data_tag, astro_data_descriptor, TagSet
+from astrodata import AstroData
+
+from . import lookup
+
+class AstroDataInstrument(AstroData):
+    __keyword_dict = dict(
+        array_name = 'AMPNAME',
+        array_section = 'CCDSECT'
+    )
+
+    @staticmethod
+    def _matches_data(source):
+        return source[0].header.get('INSTRUME', '').upper() == 'MYINSTRUMENT'
+
+    @astro_data_tag
+    def _tag_instrument(self):
+       return TagSet(['MYINSTRUMENT'])
+
+    @astro_data_tag
+    def _tag_image(self):
+        if self.phu.get('GRATING') == 'MIRROR':
+            return TagSet(['IMAGE'])
+
+    @astro_data_tag
+    def _tag_dark(self):
+        if self.phu.get('OBSTYPE') == 'DARK':
+            return TagSet(['DARK'], blocks=['IMAGE', 'SPECT'])
+
+    @astro_data_descriptor
+    def array_name(self):
+        return self.phu.get(self._keyword_for('array_name'))
+
+    @astro_data_descriptor
+    def amp_read_area(self):
+        ampname = self.array_name()
+        detector_section = self.detector_section()
+        return "'{}':{}".format(ampname, detector_section)
+
+
+
+

Note

+

An actual Gemini Facility Instrument class will derive from +gemini_instruments.AstroDataGemini, but this is irrelevant +for the example.

+
+

The class typically relies on functionality declared elsewhere, in some +ancestor, e.g., the tag set computation and the _keyword_for method are +defined at AstroData.

+

Some highlights:

+
    +
  • __keyword_dict[1] defines one-to-one mappings, assigning a more +readable moniker for an HDU header keyword. The idea here is to prevent +hard-coding the names of the keywords, in the actual code. While these are +typically quite stable and not prone to change, it’s better to be safe than +sorry, and this can come in useful during instrument development, which is +the more likely source of instability. The actual value can be extracted by +calling self._keyword_for('moniker').

  • +
  • _matches_data is a static method. It does not have any knowledge about +the class itself, and it does not work on an instance of the class: it’s +a member of the class just to make it easier for the AstroData registry to +find it. This method is passed some object containing cues of the internal +structure and contents of the data. This could be, for example, an instance +of HDUList. Using these data, _matches_data must return a boolean, +with True meaning “I know how to handle this data”.

    +

    Note that True does not mean “I have full knowledge of the data”. It +is acceptable for more than one class to claim compatibility. For a GMOS FITS +file, the classes that will return True are: AstroData (because it is +a FITS file that comply with certain minimum requirements), +~gemini_instruments.gemini.AstroDataGemini (the data contains Gemini +Facility common metadata), and ~gemini_instruments.gmos.AstroDataGmos (the +actual handler!).

    +

    But this does not mean that multiple classes can be valid “final” candidates. +If AstroData’s automatic class discovery finds more than one class claiming +matching with the data, it will start discarding them on the basis of +inheritance: any class that appears in the inheritance tree of another one is +dropped, because the more specialized one is preferred. If at some point the +algorithm cannot find more classes to drop, and there is more than one left +in the list, an exception will occur, as AstroData will have no way to choose +one over the other.

    +
  • +
  • A number of “tag methods” have been declared. Their naming is a convention, +at the end of the day (the “_tag_” prefix, and the related “_status_” +one, are just hints for the programmer): each team should establish +a convention that works for them. What is important here is to decorate +them using ~astrodata.astro_data_tag, which earmarks the method so that it +can be discovered later, and ensures that it returns an appropriate value.

    +

    A tag method will return either a ~astrodata.TagSet instance (which can be +empty), or None, which is the same as returning an empty +~astrodata.TagSet[2].

    +

    All these methods will be executed when looking up for tags, and it’s up +to the tag set construction algorithm (see Tags) to figure out the final +result. In theory, one could provide just one big method, but this is +feasible only when the logic behind deciding the tag set is simple. The +moment that there are a few competing alternatives, with some conditions +precluding other branches, one may end up with a rather complicated dozens of +lines of logic. Let the algorithm do the heavy work for you: split the tags +as needed to keep things simple, with an easy to understand logic.

    +

    Also, keeping the individual (or related) tags in separate methods lets you +exploit the inheritance, keeping common ones at a higher level, and +redefining them as needed later on, at derived classes.

    +

    Please, refer to ~gemini_instruments.gemini.AstroDataGemini, +~gemini_instruments.gmos.AstroDataGmos, and +~gemini_instruments.gnirs.AstroDataGnirs for examples using most of the +features.

    +
  • +
  • The astrodata.AstroData.read method calls the astrodata.fits.read_fits +function, which uses metadata in the FITS headers to determine how the data +should be stored in the AstroData object. In particular, the EXTNAME +and EXTVER keywords are used to assign individual FITS HDUs, using the +same names (SCI, DQ, and VAR) as Gemini-IRAF for the data, +mask, and variance planes. A SCI HDU must exist if there is +another HDU with the same EXTVER, or else an error will occur.

    +

    If the raw data do not conform to this format, the astrodata.AstroData.read +method can be overridden by your class, by having it call the +astrodata.fits.read_fits function with an additional parameter, +extname_parser, that provides a function to modify the header. This +function will be called on each HDU before further processing. As an example, +the SOAR Adaptive Module Imager (SAMI) instrument writes raw data as +a 4-extension MEF file, with the extensions having EXTNAME values +im1, im2, etc. These need to be modified to SCI, and an +appropriate EXTVER keyword added` [3]. This can be done by +writing a suitable read method for the AstroDataSami class:

    +
    @classmethod
    +def read(cls, source, extname_parser=None):
    +    def sami_parser(hdu):
    +        m = re.match('im(\d)', hdu.header.get('EXTNAME', ''))
    +        if m:
    +            hdu.header['EXTNAME'] = ('SCI', 'Added by AstroData')
    +            hdu.header['EXTVER'] = (int(m.group(1)), 'Added by AstroData')
    +
    +    return super().read(source, extname_parser=extname_parser)
    +
    +
    +
  • +
  • Descriptors will make the bulk of the class: again, the name is arbitrary, +and it should be descriptive. What may be important here is to use +~astrodata.astro_data_descriptor to decorate them. This is not required, +because unlike tag methods, descriptors are meant to be called explicitly by +the programmer, but they can still be marked (using this decorator) to be +listed when calling the descriptors property. The decorator does not +alter the descriptor input or output in any way, so it is always safe to use +it, and you probably should, unless there’s a good reason against it (e.g., +if a descriptor is deprecated and you don’t want it to show up in lookups).

    +

    More detailed information can be found in Descriptors.

    +
  • +
+
+
+

3.3.2.3. Register your class

+

Finally, you need to include your class in the AstroData Registry. This is +an internal structure with a list of all the AstroData-derived classes that +we want to make available for our programs. Including the classes in this +registry is an important step, because a file should be opened using +astrodata.open or astrodata.create, which uses the registry to identify +the appropriate class (via the _matches_data methods), instead of having +the user specify it explicitly.

+

The version of AstroData prior to DRAGONS had an auto-discovery mechanism, that +explored the source tree looking for the relevant classes and other related +information. This forced a fixed directory structure (because the code needed +to know where to look for files), and gave the names of files and classes +semantic meaning (to know which files to look into, for example). Aside from +the rigidness of the scheme, this introduced all sort of inefficiencies, +including an unacceptably high overhead when importing the AstroData package +for the first time during execution.

+

In this new version of AstroData we’ve introduced a more manageable scheme, +that places the discovery responsibility on the programmer. A typical +__init__.py file on an instrument package will look like this:

+
__all__ = ['AstroDataMyInstrument']
+
+from astrodata import factory
+from .adclass import AstroDataMyInstrument
+
+factory.addClass(AstroDataMyInstrument)
+
+
+

The call to factory.addClass is the one registering the class. This step +needs to be done before the class can be used effectively in the +AstroData system. Placing the registration step in the __init__.py file is +convenient, because importing the package will be enough!

+

Thus, a script making use of DRAGONS’ AstroData to manipulate GMOS data +could start like this:

+
import astrodata
+from gemini_instruments import gmos
+
+...
+
+ad = astrodata.open(some_file)
+
+
+

The first import line is not needed, technically, because the gmos package +will import it too, anyway, but we’ll probably need the astrodata package +in the namespace anyway, and it’s always better to be explicit. Our +typical DRAGONS scripts and modules start like this, instead:

+
import astrodata
+import gemini_instruments
+
+
+

gemini_instruments imports all the packages under it, making knowledge +about all Gemini instruments available for the script, which is perfect for a +multi-instrument pipeline, for example. Loading all the instrument classes is +not typically a burden on memory, though, so it’s easier for everyone to take +the more general approach. It also makes things easier on the end user, because +they won’t need to know internal details of our packages (like their naming +scheme). We suggest this “cascade import” scheme for all new source trees, +letting the user decide which level of detail they need.

+

As an additional step, the __init__.py file in a package may do extra +initialization. For example, for the Gemini modules, one piece of functionality +that is shared across instruments is a descriptor that translates a filter’s +name (say “u” or “FeII”) to its central wavelength (e.g., +0.35µm, 1.644µm). As it is a rather common function for us, it is implemented +by ~gemini_instruments.gemini.AstroDataGemini. This class does not know +about its daughter classes, though, meaning that it cannot know about the +filters offered by their instruments. Instead, we offer a function that can +be used to update the filter → wavelength mapping in +gemini_instruments.gemini.lookup so that it is accessible by the +~gemini_instruments.gemini.AstroDataGemini-level descriptor. So our +gmos/__init__.py looks like this:

+
__all__ = ['AstroDataGmos']
+
+from astrodata import factory
+from ..gemini import addInstrumentFilterWavelengths
+from .adclass import AstroDataGmos
+from .lookup import filter_wavelengths
+
+factory.addClass(AstroDataGmos)
+# Use the generic GMOS name for both GMOS-N and GMOS-S
+addInstrumentFilterWavelengths('GMOS', filter_wavelengths)
+
+
+

where ~gemini_instruments.gemini.addInstrumentFilterWavelengths is provided +by the gemini package to perform the update in a controlled way.

+

We encourage package maintainers and creators to follow such explicit +initialization methods, driven by the modules that add functionality +themselves, as opposed to active discovery methods on the core code. This +favors decoupling between modules, which is generally a good idea.

+

Footnotes

+ +
+
+
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/manuals/progmanual/containers.html b/manuals/progmanual/containers.html new file mode 100644 index 00000000..e302faf4 --- /dev/null +++ b/manuals/progmanual/containers.html @@ -0,0 +1,189 @@ + + + + + + + + 3.4. Data Containers — astrodata 3.2.0 documentation + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

3.4. Data Containers

+

A third, and very important part of the AstroData core package is the data +container. We have chosen to extend Astropy’s |NDData| with our own +requirements, particularly lazy-loading of data using by opening the FITS files +in read-only, memory-mapping mode, and exploiting the windowing capability of +astropy.io.fits (using section) to reduce our memory requirements, which +becomes important when reducing data (e.g., stacking).

+

We’ll describe here how we depart from |NDData|, and how do we integrate the +data containers with the rest of the package. Please refer to |NDData| for the +full interface.

+

Our main data container is astrodata.NDAstroData. Fundamentally, it is +a derivative of astropy.nddata.NDData, plus a number of mixins to add +functionality:

+
class NDAstroData(AstroDataMixin, NDArithmeticMixin, NDSlicingMixin, NDData):
+    ...
+
+
+

This allows us out of the box to have proper arithmetic with error +propagation, and slicing the data with the array syntax.

+

Our first customization is NDAstroData.__init__. It relies mostly on the +upstream initialization, but customizes it because our class is initialized +with lazy-loaded data wrapped around a custom class +(astrodata.fits.FitsLazyLoadable) that mimics a astropy.io.fits HDU +instance just enough to play along with |NDData|’s initialization code.

+

FitsLazyLoadable is an integral part of our memory-mapping scheme, and +among other things it will scale data on the fly, as memory-mapped FITS data +can only be read unscaled. Our NDAstroData redefines the properties data, +uncertainty, and mask, in two ways:

+
    +
  • To deal with the fact that our class is storing FitsLazyLoadable +instances, not arrays, as |NDData| would expect. This is to keep data out +of memory as long as possible.

  • +
  • To replace lazy-loaded data with a real in-memory array, under certain +conditions (e.g., if the data is modified, as we won’t apply the changes to the +original file!)

  • +
+

Our obsession with lazy-loading and discarding data is directed to reduce +memory fragmentation as much as possible. This is a real problem that can hit +applications dealing with large arrays, particularly when using Python. Given +the choice to optimize for speed or for memory consumption, we’ve chosen the +latter, which is the more pressing issue.

+

We’ve added another new property, window, that can be used to +explicitly exploit the astropy.io.fits’s section property, to (again) +avoid loading unneeded data to memory. This property returns an instance of +NDWindowing which, when sliced, in turn produces an instance of +NDWindowingAstroData, itself a proxy of NDAstroData. This scheme may +seem complex, but it was deemed the easiest and cleanest way to achieve the +result that we were looking for.

+

The base NDAstroData class provides the memory-mapping functionality, +with other important behaviors added by the AstroDataMixin, which can +be used with other |NDData|-like classes (such as Spectrum1D) to add +additional convenience.

+

One addition is the variance property, which allows direct access and +setting of the data’s uncertainty, without the user needing to explicitly wrap +it as an NDUncertainty object. Internally, the variance is stored as an +ADVarianceUncertainty object, which is subclassed from Astropy’s standard +VarianceUncertainty class with the addition of a check for negative values +whenever the array is accessed.

+

NDAstroDataMixin also changes the default method of combining the mask +attributes during arithmetic operations from logical_or to bitwise_or, +since the individual bits in the mask have separate meanings.

+

The way slicing affects the wcs is also changed since DRAGONS regularly +uses the callable nature of gWCS objects and this is broken by the standard +slicing method.

+

Finally, the additional image planes and tables stored in the meta dict +are exposed as attributes of the NDAstroData object, and any image planes +that have the same shape as the parent NDAstroData object will be handled +by NDWindowingAstroData. Sections will be ignored when accessing image +planes with a different shape, as well as tables.

+
+

Note

+

We expect to make changes to NDAstroData in future releases. In particular, +we plan to make use of the unit attribute provided by the +|NDData| class and increase the use of memory-mapping by default. These +changes mostly represent increased functionality and we anticipate a high +(and possibly full) degree of backward compatibility.

+
+
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/manuals/progmanual/descriptors.html b/manuals/progmanual/descriptors.html new file mode 100644 index 00000000..6a4eb413 --- /dev/null +++ b/manuals/progmanual/descriptors.html @@ -0,0 +1,168 @@ + + + + + + + + 3.6. Descriptors — astrodata 3.2.0 documentation + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

3.6. Descriptors

+

Descriptors are just regular methods that translate metadata from the raw +storage (e.g., cards from FITS headers) to values useful for the user, +potentially doing some processing in between. They exist to:

+
    +
  • Abstract the actual organization of the metadata; e.g. +~gemini_instruments.gemini.AstroDataGemini takes the detector gain from +a keyword in the FITS PHU, where ~gemini_instruments.niri.AstroDataNiri +overrides this to provide a hard-coded value.

    +

    More complex implementations also exist. In order to determine the gain of +a GMOS observation, ~gemini_instruments.gmos.AstroDataGmos uses the +observation date (provided by a descriptor) to select a particular lookup +table, and then uses the values of other descriptors to select the correct +entry in the table.

    +
  • +
  • Provide a common interface to a set of instruments. This simplifies user +training (no need to learn a different API for each instrument), and +facilitates the reuse of code for pipelines, etc.

  • +
  • Also, since FITS header keywords are limited to 8 characters, for simple +keyword → value mappings, they provide a more meaningful and readable name.

  • +
+

Descriptors should be decorated using ~astrodata.astro_data_descriptor. +The only function of this decorator is to ensure that the descriptor is marked +as such: it does not alter its input or output in any way. This lets the user +explore the API of an AstroData object via the +~astrodata.AstroData.descriptors property.

+

Descriptors can be decorated with ~astrodata.core.returns_list to +eliminate the need to code some logic. Some descriptors return single values, +while some return lists, one per extension. Typically, the former are +descriptors that refer to the entire observation (and, for MEF files, are +usually extracted from metadata in the PHU, such as airmass), while the +latter are descriptors where different extensions might return different values +(and typically come from metadata in the individual HDUs, such as gain). +A list is returned even if there is only one extension in the AstroData +object, as this allows code to be written generically to iterate over the +AstroData object and the descriptor return, without needing to know how many +extensions there are. The ~astrodata.core.returns_list decorator ensures that +the descriptor returns an appropriate object (value or list), using the +following rules:

+
    +
  • If the AstroData object is not a single slice:

    +
      +
    • If the undecorated descriptor returns a list, an exception is raised +if the list is not the same length as the number of extensions.

    • +
    • If the undecorated descriptor returns a single value, the decorator +will turn it into a list of the correct length by copying this value.

    • +
    +
  • +
  • If the AstroData object is a single slice and the undecorated +descriptor returns a list, only the first element is returned.

  • +
+

An example of the use of this decorator is the NIRI +~gemini_instruments.niri.AstroDataNiri.gain descriptor, which reads the +value from a lookup table and simply returns it. A single value is only +appropriate if the AstroData object is singly-sliced and the decorator ensures +that a list is returned otherwise.

+
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/manuals/progmanual/design.html b/manuals/progmanual/design.html new file mode 100644 index 00000000..30e1df4b --- /dev/null +++ b/manuals/progmanual/design.html @@ -0,0 +1,187 @@ + + + + + + + + 3.2. General Design — astrodata 3.2.0 documentation + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

3.2. General Design

+

As astronomical instruments have become more complex, there +has been an increasing need for bespoke reduction packages and pipelines to +deal with the specific needs of each instrument. Despite this +complexity, many of the reduction steps can be very similar and the overall +effort could be reduced significantly by sharing code. In practice, however, +there are often issues regarding the manner in which the data are stored +internally. The purpose of AstroData is to provide a uniform interface to the data +and metadata, in a manner that is independent both of the specific instrument +and the way the data are stored on disk, thereby facilitating this code-sharing. +It is not a new astronomical data format.

+

One of the main features of AstroData is the use of descriptors, which +provide a level of abstraction between the metadata and the code accessing it. +Somebody using the AstroData interface who wishes to know the exposure time +of a particular astronomical observation represented by the AstroData object +ad can simply write ad.exposure_time() without needing to concern +themselves about how that value is stored internally, for example, the name +of the FITS header keyword. These are discussed further in Descriptors.

+

AstroData also provides a clearer representation of the relationships +between different parts of the data produced from a single astronomical +observation. Modern astronomical instruments often contain multiple +detectors that are read out separately and the multi-extension FITS (MEF) +format used by many institutions, including Gemini Observatory, handles +the raw data well. In this format, each detector’s data and metadata is +assigned to its own extension, +while there is also a separate extension (the Primary Header Unit, +or PHU) containing additional metadata that applies to the entire +observation. However, as the data are processed, more data and/or +metadata may be added whose relationship is obscured by the limitations +of the MEF format. One example is the creation and propagation of information +describing the quality and uncertainty of the scientific data: while +this was a feature of +Gemini IRAF[1], the coding required to implement it was cumbersome +and AstroData uses the astropy.nddata.NDData class, +as discussed in Data Containers. This makes the relationship between these +data much clearer, and AstroData creates a syntax that makes readily apparent the +roles of other data and metadata that may be created during the reduction +process.

+

An AstroData object therefore consists of one or more self-contained +“extensions” (data and metadata) plus additional data and metadata that is +relevant to all the extensions. In many data reduction processes, the same +operation will be performed on each extension (e.g., subtracting an overscan +region from a CCD frame) and an axiom of AstroData is that iterating over +the extensions produces AstroData “slices” which retain knowledge of the +top-level data and metadata. Since a slice has one (or more) extensions +plus this top-level (meta)data, it too is an AstroData object and, +specifically, an instance of the same subclass as its parent.

+

A final feature of AstroData is the implementation of very high-level metadata. +These data, called tags, facilitate a key part of the Gemini data reduction +system, DRAGONS, by linking the astronomical data to the recipes +required to process them. They are explained in detail in Tags and the +Recipe System Programmers Manual[2].

+
+

Note

+

AstroData and DRAGONS have been developed for the reduction of data from +Gemini Observatory, which produces data in the FITS format that is still the +most widely-used format for astronomical data. In light of this, and the +limited resources in the Science User Support Department, we have only +developed support for FITS, even though the AstroData format is designed +to be independent of the file format. In some cases, this has led to +uncertainty and internal disagreement over where precisely to engage in +abstraction and, should AstroData support a different file format, we +may find alternative solutions that result in small, but possibly +significant, changes to the API.

+
+ +
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/manuals/progmanual/index.html b/manuals/progmanual/index.html new file mode 100644 index 00000000..7fa123e5 --- /dev/null +++ b/manuals/progmanual/index.html @@ -0,0 +1,129 @@ + + + + + + + + 3. Programmer’s Manual — astrodata 3.2.0 documentation + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/manuals/progmanual/intro.html b/manuals/progmanual/intro.html new file mode 100644 index 00000000..9fc05b0c --- /dev/null +++ b/manuals/progmanual/intro.html @@ -0,0 +1,155 @@ + + + + + + + + 3.1. Precedents and Motivation — astrodata 3.2.0 documentation + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

3.1. Precedents and Motivation

+

The Gemini Observatory has produced a number of tools for data processing. +Historically this has translated into a number of IRAF[1] packages but +the lack of long-term support for IRAF, coupled with the well-known +difficulty in creating robust reduction pipelines within the IRAF +environment, led to a decision +to adopt Python as a programming tool and a new +package was born: Gemini Python. Gemini Python provided tools to load and +manipulate Gemini-produced multi-extension FITS[2] (MEF) files, +along with a pipeline that +allowed the construction of reduction recipes. At the center of this package +was the AstroData subpackage, which supported the abstraction of the FITS +files.

+

Gemini Python reached version 1.0.1, released during November 2014. In 2015 +the Science User Support Department (SUSD) was created at Gemini, which took on the +responsibility of maintaining the software reduction tools, and started +planning future steps. With improved oversight and time and thought, it became +evident that the design of Gemini Python and, specially, of AstroData, made +further development a daunting task.

+

In 2016 a decision was reached to overhaul Gemini Python. While the +principles behind AstroData were sound, the coding involved unnecessary +layers of abstraction and eschewed features of the Python language in favor +of its own implementation. Thus, +|DRAGONS| was born, with a new, simplified (and backward incompatible) +AstroData v2.0 (which we will refer to simply as AstroData)

+

This manual documents both the high level design and some implementation +details of AstroData, together with an explanation of how to extend the +package to work for new environments.

+

Footnotes

+ +
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/manuals/progmanual/tags.html b/manuals/progmanual/tags.html new file mode 100644 index 00000000..7a2c1f4a --- /dev/null +++ b/manuals/progmanual/tags.html @@ -0,0 +1,267 @@ + + + + + + + + 3.5. Tags — astrodata 3.2.0 documentation + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

3.5. Tags

+

We described in previous section how to generate tags for an +AstroData derivative. In this section we’ll describe the algorithm that +generates the complete tag set out of the individual TagSet instances. The +algorithm collects all the tags in a list and then decides whether to apply +them or not following certain rules, but let’s talk about TagSet first.

+

TagSet is actually a standard named tuple customized to generate default +values (None) for its missing members. Its signature is:

+
TagSet(add=None, remove=None, blocked_by=None, blocks=None,
+       if_present=None)
+
+
+

The most common TagSet is an additive one: TagSet(['FOO', 'BAR']). +If all you need is to add tags, then you’re done here. But the real power of +our tag generating system is that you can specify some conditions to apply a +certain TagSet, or put restrictions on others. The different arguments to +TagSet all expect a list (or some others work in the following way):

+
    +
  • add: if this TagSet is selected, then add all these members to the tag +set.

  • +
  • remove: if this TagSet is selected, then prevent all these members +from joining the tag set.

  • +
  • blocked_by: if any of the tags listed in here exist in the tag set, then +discard this TagSet altogether.

  • +
  • blocks: discard from the list of unprocessed ones any TagSet that +would add any of the tags listed here.

  • +
  • if_present: process this tag only if all the tags listed in here exist in +the tag set at this point.

  • +
+

Note that blocked_by and blocks look like two sides of the same coin. +This is intentional: which one to use is up to the programmer, depending on +what will reduce the amount of typing and/or make the logic easier (sometimes one +wants to block a bunch of other tags from a single one; sometimes one wants a +tag to be blocked by a bunch of others). Furthermore, while blocks and +blocked_by prevent the entire TagSet from being added if it contains a +tag affected by these, remove only affects the specific tag.

+

Now, the algorithm works like this:

+
    +
  1. Collect all the TagSet generated by methods in the instance that are +decorated using astro_data_tag.

  2. +
  3. Then we sort them out:

    +
      +
    1. Those that subtract tags from the tag set go first (the ones with +non-empty remove or blocks), allowing them to act early on

    2. +
    3. Those with non-empty blocked_by are moved to the end of the list, to +ensure that other tags can be generated before them.

    4. +
    5. Those with non-empty if_present are moved behind those with +blocked_by.

    6. +
    +
  4. +
  5. Now that we’ve sorted the tags, process them sequentially and for each one:

    +
      +
    1. If they require other tags to be present, make sure that this is the case. +If the requirements are not met, drop the tagset. If not…

    2. +
    3. Figure out if any other tag is blocking the tagset. This will be the +case if any of the tags to be added is in the “blocked” list, or if +any of the tags added by previous tag sets are in the blocked_by +list of the one being processed. Then…

    4. +
    5. If all the previous hurdles have been passed, apply the changes declared +by this tag (add, remove, and/or block others).

    6. +
    +
  6. +
+

Note that Python’s sort algorithm is stable. This means, that if two elements +are indistinguishable from the point of view of the sorting algorithm, they are +guaranteed to stay in the same relative position. To better understand how this +affects our tags, and the algorithm itself, let’s follow up with an example taken +from real code (the Gemini-generic and GMOS modules):

+
# Simple tagset, with only a constant, additive content
+@astro_data_tag
+def _tag_instrument(self):
+    return TagSet(['GMOS'])
+
+# Simple tagset, also with additive content. This one will
+# check if the frame fits the requirements to be classified
+# as "GMOS imaging". It returns a value conditionally:
+# if this is not imaging, then it will return None, which
+# means the algorithm will ignore the value
+@astro_data_tag
+def _tag_image(self):
+    if self.phu.get('GRATING') == 'MIRROR':
+        return TagSet(['IMAGE'])
+
+# This is a slightly more complex TagSet (but fairly simple, anyway),
+# inherited by all Gemini instruments.
+@astro_data_tag
+def _type_gcal_lamp(self):
+    if self.phu.get('GCALLAMP') == 'IRhigh':
+        shut = self.phu.get('GCALSHUT')
+        if shut == 'OPEN':
+            return TagSet(['GCAL_IR_ON', 'LAMPON'],
+                          blocked_by=['PROCESSED'])
+        elif shut == 'CLOSED':
+            return TagSet(['GCAL_IR_OFF', 'LAMPOFF'],
+                          blocked_by=['PROCESSED'])
+
+# This tagset is only active when we detect that the frame is
+# a bias. In that case we want to prevent the frame from being
+# classified as "imaging" or "spectroscopy", which depend on the
+# configuration of the instrument
+@astro_data_tag
+def _tag_bias(self):
+    if self.phu.get('OBSTYPE') == 'BIAS':
+        return TagSet(['BIAS', 'CAL'], blocks=['IMAGE', 'SPECT'])
+
+
+

These four simple tag methods will serve to illustrate the algorithm. Let’s pretend +that the requirements for all four of them are somehow met, meaning that we get four +TagSet instances in our list, in some random order. After step 1 in the algorithm, +then, we may have collected the following list:

+
[ TagSet(['GMOS']),
+  TagSet(['GCAL_IR_OFF', 'LAMPOFF'], blocked_by=['PROCESSED']),
+  TagSet(['BIAS', 'CAL'], blocks=['IMAGE', 'SPECT']),
+  TagSet(['IMAGE']) ]
+
+
+

The algorithm then proceeds to sort them. First, it will promote the TagSet +with non-empty blocks or remove:

+
[ TagSet(['BIAS', 'CAL'], blocks=['IMAGE', 'SPECT']),
+  TagSet(['GMOS']),
+  TagSet(['GCAL_IR_OFF', 'LAMPOFF'], blocked_by=['PROCESSED']),
+  TagSet(['IMAGE']) ]
+
+
+

Note that the other three TagSet stay in exactly the same order. Now the +algorithm will sort the list again, moving the ones with non-empty +blocked_by to the end:

+
[ TagSet(['BIAS', 'CAL'], blocks=['IMAGE', 'SPECT']),
+  TagSet(['GMOS']), TagSet(['IMAGE']),
+  TagSet(['GCAL_IR_OFF', 'LAMPOFF'], blocked_by=['PROCESSED']) ]
+
+
+

Note that at each step, all the instances (except the ones “being moved”) have +kept the same position relative to each other -here’s where the “stability” of +the sorting comes into play,- ensuring that each step does not affect the previous +one. Finally, there are no if_present in our example, so no more instances are +moved around.

+

Now the algorithm prepares three empty sets (tags, removals, and blocked), +and starts iterating over the TagSet list.

+
+
    +
  1. For the first TagSet there are no blocks or removals, so we just add its +contents to the current sets: tags = {'BIAS', 'CAL'}, +blocked = {'IMAGE', 'SPECT'}.

  2. +
  3. Then comes TagSet(['GMOS']). Again, there are no removals in place, and +GMOS is not in the list of blocked tags. Thus, we just add it to the current +tag set: tags = {'BIAS', 'CAL', 'GMOS'}.

  4. +
  5. When processing TagSet(['IMAGE']), the algorithm observes that this IMAGE +is in the blocked set, and stops processing this tag set.

  6. +
  7. Finally, neither GCAL_IR_OFF nor LAMPOFF are in blocked, and +PROCESSED is not in tags, meaning that we can add this tag set to +the final one.

  8. +
+
+

Our result will look something like: {'BIAS', 'CAL', 'GMOS', 'GCAL_IR_OFF', 'LAMPOFF'}

+
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/manuals/usermanual/data.html b/manuals/usermanual/data.html new file mode 100644 index 00000000..d12c2fbb --- /dev/null +++ b/manuals/usermanual/data.html @@ -0,0 +1,964 @@ + + + + + + + + 2.6. Pixel Data — astrodata 3.2.0 documentation + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

2.6. Pixel Data

+

Try it yourself

+

Download the data package (Try it yourself) if you wish to follow along and run the +examples. Then

+
$ cd <path>/ad_usermanual/playground
+$ python
+
+
+

Then import core astrodata and the Gemini astrodata configurations.

+
>>> import astrodata
+>>> import gemini_instruments
+
+
+
+

2.6.1. Operate on Pixel Data

+

The pixel data are stored in the AstroData object as a list of +NDAstroData objects. The NDAstroData is a subclass of Astropy’s +NDData class which combines in one “package” the pixel values, the +variance, and the data quality plane or mask (as well as associated meta-data). +The data can be retrieved as a standard NumPy ndarray.

+

In the sections below, we will present several typical examples of data +manipulation. But first let’s start with a quick example on how to access +the pixel data.

+
>>> ad = astrodata.open('../playdata/N20170609S0154.fits')
+
+>>> the_data = ad[1].data
+>>> type(the_data)
+<class 'numpy.ndarray'>
+
+>>> # Loop through the extensions
+>>> for ext in ad:
+...     the_data = ext.data
+...     print(the_data.sum())
+333071030
+335104458
+333170484
+333055206
+
+
+

In this example, we first access the pixels for the second extensions. +Remember that in Python, list are zero-indexed, hence we access the second +extension as ad[1]. The .data attribute contains a NumPy ndarray. +In the for-loop, for each extension, we get the data and use the NumPy +.sum() method to sum the pixel values. Anything that can be done +with a ndarray can be done on AstroData pixel data.

+
+
+

2.6.2. Arithmetic on AstroData Objects

+

AstroData objects support basic in-place arithmetics with these methods:

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

addition

.add()

subtraction

.subtract()

multiplication

.multiply()

division

.divide()

+

Normal, not in-place, arithmetics is also possible using the standard +operators, +, -, *, and /.

+

The big advantage of using AstroData to do arithmetics is that the +variance and mask, if present, will be propagated through to the output +AstroData object. We will explore the variance propagation in the next +section and mask usage later in this chapter.

+
+

2.6.2.1. Simple operations

+

Here are a few examples of arithmetics on AstroData objects.:

+
>>> ad = astrodata.open('../playdata/N20170521S0925_forStack.fits')
+
+>>> # Addition
+>>> ad.add(50.)
+>>> ad = ad + 50.
+>>> ad += 50.
+
+>>> # Subtraction
+>>> ad.subtract(50.)
+>>> ad = ad - 50.
+>>> ad -= 50.
+
+>>> # Multiplication (Using a descriptor)
+>>> ad.multiply(ad.exposure_time())
+>>> ad = ad * ad.exposure_time()
+>>> ad *= ad.exposure_time()
+
+>>> # Division (Using a descriptor)
+>>> ad.divide(ad.exposure_time())
+>>> ad = ad / ad.exposure_time()
+>>> ad /= ad.exposure_time()
+
+
+

When the syntax adout = adin + 1 is used, the output variable is a copy +of the original. In the examples above we reassign the result back onto the +original. The two other forms, ad.add() and ad += are in-place +operations.

+

When a descriptor returns a list because the value changes for each +extension, a for-loop is needed:

+
>>> for (ext, gain) in zip(ad, ad.gain()):
+...     ext.multiply(gain)
+
+
+

If you want to do the above but on a new object, leaving the original unchanged, +use deepcopy first.

+
>>> from copy import deepcopy
+>>> adcopy = deepcopy(ad)
+>>> for (ext, gain) in zip(adcopy, adcopy.gain()):
+...     ext.multiply(gain)
+
+
+
+
+

2.6.2.2. Operator Precedence

+

The AstroData arithmetics methods can be stringed together but beware that +there is no operator precedence when that is done. For arithmetics that +involve more than one operation, it is probably safer to use the normal +Python operator syntax. Here is a little example to illustrate the difference.

+
>>> ad.add(5).multiply(10).subtract(5)
+
+>>> # means:  ad = ((ad + 5) * 10) - 5
+>>> # NOT: ad = ad + (5 * 10) - 5
+
+
+

This is because the methods modify the object in-place, one operation after +the other from left to right. This also means that the original is modified.

+

This example applies the expected operator precedence:

+
>>> ad = ad + ad * 3 - 40.
+>>> # means: ad = ad + (ad * 3) - 40.
+
+
+

If you need a copy, leaving the original untouched, which is sometimes useful +you can use deepcopy or just use the normal operator and assign to a new +variable.:

+
>>> adnew = ad + ad * 3 - 40.
+
+
+
+
+
+

2.6.3. Variance

+

When doing arithmetic on an AstroData object, if a variance is present +it will be propagated appropriately to the output no matter which syntax +you use (the methods or the Python operators).

+
+

2.6.3.1. Adding a Variance Plane

+

In this example, we will add the poisson noise to an AstroData dataset. +The data is still in ADU, therefore the poisson noise as variance is +signal / gain. We want to set the variance for each of the pixel +extensions.

+
>>> ad = astrodata.open('../playdata/N20170609S0154.fits')
+
+>>> for (extension, gain) in zip(ad, ad.gain()):
+...    extension.variance = extension.data / gain
+
+
+

Check ad.info(), you will see a variance plane for each of the four +extensions.

+
+
+

2.6.3.2. Automatic Variance Propagation

+

As mentioned before, if present, the variance plane will be propagated to the +resulting AstroData object when doing arithmetics. The variance +calculation assumes that the data are not correlated.

+

Let’s look into an example.

+
>>> #     output = x * x
+>>> # var_output = var * x^2 + var * x^2
+>>> ad = astrodata.open('../playdata/N20170609S0154_varAdded.fits')
+
+>>> ad[1].data[50,50]
+56.160931
+>>> ad[1].variance[50,50]
+96.356529
+>>> adout = ad * ad
+>>> adout[1].data[50,50]
+3154.05
+>>> adout[1].variance[50,50]
+607826.62
+
+
+
+
+
+

2.6.4. Data Quality Plane

+

The NDData mask stores the data quality plane. The simplest form is a +True/False array of the same size at the pixel array. In Astrodata we favor +a bit array that allows for additional information about why the pixel is being +masked. For example at Gemini here is our bit mapping for bad pixels.

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

Meaning

Value

Bad pixel

1

Non Linear

2

Saturated

4

Cosmic Ray

8

No Data

16

Overlap

32

Unilluminated

64

+

(These definitions are located in geminidr.gemini.lookups.DQ_definitions.)

+

So a pixel marked 10 in the mask, would be a “non-linear” “cosmic ray”. The +AstroData masks are propagated with bitwise-OR operation. For example, +let’s say that we are stacking frames. A pixel is set as bad (value 1) +in one frame, saturated in another (value 4), and fine in all the other +the frames (value 0). The mask of the resulting stack will be assigned +a value of 5 for that pixel.

+

These bitmasks will work like any other NumPy True/False mask. There is a +usage example below using the mask.

+

The mask can be accessed as follow:

+
>>> ad = astrodata.open('../playdata/N20170609S0154_varAdded.fits')
+>>> ad.info()
+
+>>> ad[2].mask
+
+
+
+
+

2.6.5. Display

+

Since the data is stored in the AstroData object as a NumPy ndarray +any tool that works on ndarray can be used. To display to DS9 there +is the imexam package. The numdisplay package is still available for +now but it is no longer supported by STScI. We will show +how to use imexam to display and read the cursor position. Read the +documentation on that tool to learn more about what else it has +to offer.

+
+

2.6.5.1. Displaying with imexam

+

Here is an example how to display pixel data to DS9 with imexam. You must +start ds9 before running this example.

+
>>> import imexam
+>>> ad = astrodata.open('../playdata/N20170521S0925_forStack.fits')
+
+# Connect to the DS9 window (should already be opened.)
+>>> ds9 = imexam.connect(list(imexam.list_active_ds9())[0])
+
+>>> ds9.view(ad[0].data)
+
+# To scale "a la IRAF"
+>>> ds9.view(ad[0].data)
+>>> ds9.scale('zscale')
+
+# To set the mininum and maximum scale values
+>>> ds9.view(ad[0].data)
+>>> ds9.scale('limits 0 2000')
+
+
+
+
+

2.6.5.2. Retrieving cursor position with imexam

+

The function readcursor() can be used to retrieve cursor +position in pixel coordinates. Note that it will not respond to +mouse clicks, only keyboard entries are acknowledged.

+

When invoked, readcursor() will stop the flow of the program and wait +for the user to put the cursor on top of the image and type a key. A +tuple with three values will be returned: the x and +y coordinates in 0-based system, and the value of the key the user +hit.

+
>>> import imexam
+>>> ad = astrodata.open('../playdata/N20170521S0925_forStack.fits')
+
+# Connect to the DS9 window (should already be opened.)
+# and display
+>>> ds9 = imexam.connect(list(imexam.list_active_ds9())[0])
+>>> ds9.view(ad[0].data)
+>>> ds9.scale('zscale')
+
+
+>>> cursor_coo = ds9.readcursor()
+>>> print(cursor_coo)
+
+# To extract only the x,y coordinates
+>>> (xcoo, ycoo) = cursor_coo[:2]
+>>> print(xcoo, ycoo)
+
+# If you are also interested in the keystroke
+>>> keystroke = cursor_coo[2]
+>>> print('You pressed this key: %s' % keystroke)
+
+
+
+
+
+

2.6.6. Useful tools from the NumPy, SciPy, and Astropy Packages

+

Like for the Display section, this section is not really specific to +Astrodata but is rather a quick show-and-tell of a few things that can +be done on the pixels with the big scientific packages NumPy, SciPy, +and Astropy.

+

Those three packages are very large and rich. They have their own +extensive documentation and it is highly recommend for the users to learn about what +they have to offer. It might save you from re-inventing the wheel.

+

The pixels, the variance, and the mask are stored as NumPy ndarray’s. +Let us go through some basic examples, just to get a feel for how the +data in an AstroData object can be manipulated.

+
+

2.6.6.1. ndarray

+

The data are contained in NumPy ndarray objects. Any tools that works +on an ndarray can be used with Astrodata.

+
>>> ad = astrodata.open('../playdata/N20170609S0154.fits')
+
+>>> data = ad[0].data
+
+>>> # Shape of the array.  (equivalent to NAXIS2, NAXIS1)
+>>> data.shape
+(2112, 288)
+
+>>> # Value of a pixel at "IRAF" or DS9 coordinates (100, 50)
+>>> data[49,99]
+455
+
+>>> # Data type
+>>> data.dtype
+dtype('uint16')
+
+
+

The two most important thing to remember for users coming from the IRAF +world or the Fortran world are that the array has the y-axis in the first +index, the x-axis in the second, and that the array indices are zero-indexed, +not one-indexed. The examples above illustrate those two critical +differences.

+

It is sometimes useful to know the data type of the values stored in the +array. Here, the file is a raw dataset, fresh off the telescope. No +operations has been done on the pixels yet. The data type of Gemini raw +datasets is always “Unsigned integer (0 to 65535)”, uint16.

+
+

Warning

+

Beware that doing arithmetic on uint16 can lead to unexpected +results. This is a NumPy behavior. If the result of an operation +is higher than the range allowed by uint16, the output value will +be “wrong”. The data type will not be modified to accommodate the large +value. A workaround, and a safety net, is to multiply the array by +1.0 to force the conversion to a float64.

+
>>> a = np.array([65535], dtype='uint16')
+>>> a + a
+array([65534], dtype=uint16)
+>>> 1.0*a + a
+array([ 131070.])
+
+
+
+
+
+

2.6.6.2. Simple Numpy Statistics

+

A lot of functions and methods are available in NumPy to probe the array, +too many to cover here, but here are a couple examples.

+
>>> import numpy as np
+
+>>> ad = astrodata.open('../playdata/N20170609S0154.fits')
+>>> data = ad[0].data
+
+>>> data.mean()
+>>> np.average(data)
+>>> np.median(data)
+
+
+

Note how mean() is called differently from the other two. mean() +is a ndarray method, the others are NumPy functions. The implementation +details are clearly well beyond the scope of this manual, but when looking +for the tool you need, keep in mind that there are two sets of functions to +look into. Duplications like .mean() and np.average() can happen, +but they are not the norm. The readers are strongly encouraged to refer to +the NumPy documentation to find the tool they need.

+
+
+

2.6.6.3. Clipped Statistics

+

It is common in astronomy to apply clipping to the statistics, a clipped +average, for example. The NumPy ma module can be used to create masks +of the values to reject. In the examples below, we calculated the clipped +average of the first pixel extension with a rejection threshold set to ++/- 3 times the standard deviation.

+

Before Astropy, it was possible to do something like that with only +NumPy tools, like in this example:

+
>>> import numpy as np
+
+>>> ad = astrodata.open('../playdata/N20170609S0154.fits')
+>>> data = ad[0].data
+
+>>> stddev = data.std()
+>>> mean = data.mean()
+
+>>> clipped_mean = np.ma.masked_outside(data, mean-3*stddev, mean+3*stddev).mean()
+
+
+

There is no iteration in that example. It is a straight one-time clipping.

+

For something more robust, there is an Astropy function that can help, in +particular by adding an iterative process to the calculation. Here is +how it is done:

+
>>> import numpy as np
+>>> from astropy.stats import sigma_clip
+
+>>> ad = astrodata.open('../playdata/N20170609S0154.fits')
+>>> data = ad[0].data
+
+>>> clipped_mean = np.ma.mean(sigma_clip(data, sigma=3))
+
+
+
+
+

2.6.6.4. Filters with SciPy

+

Another common operation is the filtering of an image, for example convolving +with a gaussian filter. The SciPy module ndimage.filters offers +several functions for image processing. See the SciPy documentation for +more information.

+

The example below applies a gaussian filter to the pixel array.

+
>>> from scipy.ndimage import filters
+>>> import imexam
+
+>>> ad = astrodata.open('../playdata/N20170521S0925_forStack.fits')
+>>> data = ad[0].data
+
+>>> # We need to prepare an array of the same size and shape as
+>>> # the data array.  The result will be put in there.
+>>> convolved_data = np.zeros(data.size).reshape(data.shape)
+
+>>> # We now apply the convolution filter.
+>>> sigma = 10.
+>>> filters.gaussian_filter(data, sigma, output=convolved_data)
+
+>>> # Let's visually compare the convolved image with the original
+>>> ds9 = imexam.connect(list(imexam.list_active_ds9())[0])
+>>> ds9.view(data)
+>>> ds9.scale('zscale')
+>>> ds9.frame(2)
+>>> ds9.view(convolved_data)
+>>> ds9.scale('zscale')
+>>> ds9.blink()
+>>> # When you are convinced it's been convolved, stop the blinking.
+>>> ds9.blink(blink=False)
+
+
+

Note that there is an Astropy way to do this convolution, with tools in +astropy.convolution package. Beware that for this particular kernel +we have found that the Astropy convolve function is extremely slow +compared to the SciPy solution. +This is because the SciPy function is optimized for a Gaussian convolution +while the generic convolve function in Astropy can take in any kernel. +Being able to take in any kernel is a very powerful feature, but the cost +is time. The lesson here is do your research, and find the best tool for +your needs.

+
+
+

2.6.6.5. Many other tools

+

There are many, many other tools available out there. Here are the links to +the three big projects we have featured in this section.

+ +
+
+
+

2.6.7. Using the Astrodata Data Quality Plane

+

Let us look at an example where the use of the Astrodata mask is +necessary to get correct statistics. A GMOS imaging frame has large sections +of unilluminated pixels; the edges are not illuminated and there are two +bands between the three CCDs that represent the physical gap between the +CCDs. Let us have a look at the pixels to have a better sense of the +data:

+
>>> ad = astrodata.open('../playdata/N20170521S0925_forStack.fits')
+>>> import imexam
+>>> ds9 = imexam.connect(list(imexam.list_active_ds9())[0])
+
+>>> ds9.view(ad[0].data)
+>>> ds9.scale('zscale')
+
+
+

See how the right and left portions of the frame are not exposed to the sky, +and the 45 degree angle cuts of the four corners. The chip gaps too. +If we wanted to do statistics on the whole frames, we certainly would not want +to include those unilluminated areas. We would want to mask them out.

+

Let us have a look at the mask associated with that image:

+
>>> ds9.view(ad[0].mask)
+>>> ds9.scale('zscale')
+
+
+

The bad sections are all white (pixel value > 0). There are even some +illuminated pixels that have been marked as bad for a reason or another.

+

Let us use that mask to reject the pixels with no or bad information and +do calculations only on the good pixels. For the sake of simplicity we will +just do an average. This is just illustrative. We show various ways to +accomplish the task; choose the one that best suits your need or that you +find most readable.

+
>>> import numpy as np
+
+>>> # For clarity...
+>>> data = ad[0].data
+>>> mask = ad[0].mask
+
+>>> # Reject all flagged pixels and calculate the mean
+>>> np.mean(data[mask == 0])
+>>> np.ma.masked_array(data, mask).mean()
+
+>>> # Reject only the pixels flagged "no_data" (bit 16)
+>>> np.mean(data[(mask & 16) == 0])
+>>> np.ma.masked_array(data, mask & 16).mean()
+>>> np.ma.masked_where(mask & 16, data).mean()
+
+
+

The “long” form with np.ma.masked_* is useful if you are planning to do +more than one operation on the masked array. For example:

+
>>> clean_data = np.ma.masked_array(data, mask)
+>>> clean_data.mean()
+>>> np.ma.median(clean_data)
+>>> clean_data.max()
+
+
+
+
+

2.6.8. Manipulate Data Sections

+

So far we have shown examples using the entire data array. It is possible +to work on sections of that array. If you are already familiar with +Python, you probably already know how to do most if not all of what is in +this section. For readers new to Python, and especially those coming +from IRAF, there are a few things that are worth explaining.

+

When indexing a NumPy ndarray, the left most number refers to the +highest dimension’s axis. For example, in a 2D array, the IRAF section +are in (x-axis, y-axis) format, while in Python they are in +(y-axis, x-axis) format. Also important to remember is that the ndarray +is 0-indexed, rather than 1-indexed like in Fortran or IRAF.

+

Putting it all together, a pixel position (x,y) = (50,75) in IRAF or from +the cursor on a DS9 frame, is accessed in Python as data[74,49]. +Similarly, the IRAF section [10:20, 30:40] translate in Python to +[9:20, 29:40]. Also remember that when slicing in Python, the upper limit +of the slice is not included in the slice. This is why here we request +20 and 40 rather 19 and 39.

+

Let’s put it in action.

+
+

2.6.8.1. Basic Statistics on Section

+

In this example, we do simple statistics on a section of the image.

+
>>> import numpy as np
+
+>>> ad = astrodata.open('../playdata/N20170521S0925_forStack.fits')
+>>> data = ad[0].data
+
+>>> # Get statistics for a 25x25 pixel-wide box centered on pixel
+>>> # (50,75)  (DS9 frame coordinate)
+>>> xc = 49
+>>> yc = 74
+>>> buffer = 25
+>>> (xlow, xhigh) = (xc - buffer//2, xc + buffer//2 + 1)
+>>> (ylow, yhigh) = (yc - buffer//2, yc + buffer//2 + 1)
+>>> # The section is [62:87, 37:62]
+>>> stamp = data[ylow:yhigh, xlow:xhigh]
+>>> mean = stamp.mean()
+>>> median = np.median(stamp)
+>>> stddev = stamp.std()
+>>> minimum = stamp.min()
+>>> maximum = stamp.max()
+
+>>> print(' Mean   Median  Stddev  Min   Max\n \
+... %.2f  %.2f   %.2f    %.2f  %.2f' % \
+... (mean, median, stddev, minimum, maximum))
+
+
+

Have you noticed that the median is calculated with a function rather +than a method? This is simply because the ndarray object does not +have a method to calculate the median.

+
+
+

2.6.8.2. Example - Overscan Subtraction with Trimming

+

Several concepts from previous sections and chapters are used in this +example. The Descriptors are used to retrieve the overscan section and +the data section information from the headers. Statistics are done on the +NumPy ndarray representing the pixel data. Astrodata arithmetics is +used to subtract the overscan level. Finally, the overscan section is +trimmed off and the modified AstroData object is written to a new file +on disk.

+

To make the example more complete, and to show that when the pixel data +array is trimmed, the variance (and mask) arrays are also trimmed, let us +add a variance plane to our raw data frame.

+
>>> ad = astrodata.open('../playdata/N20170609S0154.fits')
+
+>>> for (extension, gain) in zip(ad, ad.gain()):
+...    extension.variance = extension.data / gain
+...
+
+>>> # Here is how the data structure looks like before the trimming.
+>>> ad.info()
+Filename: ../playdata/N20170609S0154.fits
+Tags: ACQUISITION GEMINI GMOS IMAGE NORTH RAW SIDEREAL UNPREPARED
+
+Pixels Extensions
+Index  Content                  Type              Dimensions     Format
+[ 0]   science                  NDAstroData       (2112, 288)    uint16
+          .variance             ndarray           (2112, 288)    float64
+[ 1]   science                  NDAstroData       (2112, 288)    uint16
+          .variance             ndarray           (2112, 288)    float64
+[ 2]   science                  NDAstroData       (2112, 288)    uint16
+          .variance             ndarray           (2112, 288)    float64
+[ 3]   science                  NDAstroData       (2112, 288)    uint16
+          .variance             ndarray           (2112, 288)    float64
+
+>>> # Let's operate on the first extension.
+>>> #
+>>> # The section descriptors return the section in a Python format
+>>> # ready to use, 0-indexed.
+>>> oversec = ad[0].overscan_section()
+>>> datasec = ad[0].data_section()
+
+>>> # Measure the overscan level
+>>> mean_overscan = ad[0].data[oversec.y1: oversec.y2, oversec.x1: oversec.x2].mean()
+
+>>> # Subtract the overscan level.  The variance will be propagated.
+>>> ad[0].subtract(mean_overscan)
+
+>>> # Trim the data to remove the overscan section and keep only
+>>> # the data section.  Note that the WCS will be automatically
+>>> # adjusted when the trimming is done.
+>>> #
+>>> # Here we work on the NDAstroData object to have the variance
+>>> # trimmed automatically to the same size as the science array.
+>>> # To reassign the cropped NDAstroData, we use the reset() method.
+>>> ad[0].reset(ad[0].nddata[datasec.y1:datasec.y2, datasec.x1:datasec.x2]
+
+>>> # Now look at the dimensions of the first extension, science
+>>> # and variance.  That extension is smaller than the others.
+>>> ad.info()
+Filename: ../playdata/N20170609S0154.fits
+Tags: ACQUISITION GEMINI GMOS IMAGE NORTH RAW SIDEREAL UNPREPARED
+
+Pixels Extensions
+Index  Content                  Type              Dimensions     Format
+[ 0]   science                  NDAstroData       (2112, 256)    float64
+          .variance             ndarray           (2112, 256)    float64
+[ 1]   science                  NDAstroData       (2112, 288)    uint16
+          .variance             ndarray           (2112, 288)    float64
+[ 2]   science                  NDAstroData       (2112, 288)    uint16
+          .variance             ndarray           (2112, 288)    float64
+[ 3]   science                  NDAstroData       (2112, 288)    uint16
+          .variance             ndarray           (2112, 288)    float64
+
+>>> # We can write this to a new file
+>>> ad.write('partly_overscan_corrected.fits')
+
+
+

A new feature presented in this example is the ability to work on the +NDAstroData object directly. This is particularly useful when cropping +the science pixel array as one will want the variance and the mask arrays +cropped exactly the same way. Taking a section of the NDAstroData +object (ad[0].nddata[y1:y2, x1:x2]), instead of just the .data array, +does all that for us.

+

To reassign the cropped NDAstroData to the extension one uses the +.reset() method as shown in the example.

+

Of course to do the overscan correction correctly and completely, one would +loop over all four extensions. But that’s the only difference.

+
+
+
+

2.6.9. Data Cubes

+

Reduced Integral Field Unit (IFU) data is commonly represented as a cube, +a three-dimensional array. The data component of an AstroData +object extension can be such a cube, and it can be manipulated and explored +with NumPy, AstroPy, SciPy, imexam, like we did already in this section +with 2D arrays. We can use matplotlib to plot the 1D spectra represented +in the third dimension.

+

In Gemini IFU cubes, the first axis is the X-axis, the second, the Y-axis, +and the wavelength is in the third axis. Remember that in a ndarray +that order is reversed (wlen, y, x).

+

In the example below we “collapse” the cube along the wavelenth axis to +create a “white light” image and display it. Then we plot a 1D spectrum +from a given (x,y) position.

+
>>> import imexam
+>>> import matplotlib.pyplot as plt
+
+>>> ds9 = imexam.connect(list(imexam.list_active_ds9())[0])
+
+>>> adcube = astrodata.open('../playdata/gmosifu_cube.fits')
+>>> adcube.info()
+
+>>> # Sum along the wavelength axis to create a "white light" image
+>>> summed_image = adcube[0].data.sum(axis=0)
+>>> ds9.view(summed_image)
+>>> ds9.scale('minmax')
+
+>>> # Plot a 1-D spectrum from the spatial position (14,25).
+>>> plt.plot(adcube[0].data[:,24,13])
+>>> plt.show()   # might be needed, depends on matplotlibrc interactive setting
+
+
+

Now that is nice but it would be nicer if we could plot the x-axis in units +of Angstroms instead of pixels. We use the AstroData’s WCS handler, which is +based on gwcs.wcs.WCS to get the necessary information. A particularity +of gwcs.wcs.WCS is that it refers to the axes in the “natural” way, +(x, y, wlen) contrary to Python’s (wlen, y, x). It truly requires you to pay +attention.

+
>>> import matplotlib.pyplot as plt
+
+>>> adcube = astrodata.open('../playdata/gmosifu_cube.fits')
+
+# We get the wavelength axis in Angstroms at the position we want to
+# extract, x=13, y=24.
+# The wcs call returns a 3-element list, the third element ([2]) contains
+# the wavelength values for each pixel along the wavelength axis.
+
+>>> length_wlen_axis = adcube[0].shape[0]   # (wlen, y, x)
+>>> wavelengths = adcube[0].wcs(13, 24, range(length_wlen_axis))[2] # (x, y, wlen)
+
+# We get the intensity along that axis
+>>> intensity = adcube[0].data[:, 24, 13]   # (wlen, y, x)
+
+# We plot
+plt.clf()
+plt.plot(wavelengths, intensity)
+plt.show()
+
+
+
+
+

2.6.10. Plot Data

+

The main plotting package in Python is matplotlib. We have used it in the +previous section on data cubes to plot a spectrum. There is also the project +called imexam which provides astronomy-specific tools for the +exploration and measurement of data. We have also used that package above to +display images to DS9.

+

In this section we absolutely do not aim at covering all the features of +either package but rather to give a few examples that can get the readers +started in their exploration of the data and of the visualization packages.

+

Refer to the projects web pages for full documentation.

+ +
+

2.6.10.1. Matplotlib

+

With Matplotlib you have full control on your plot. You do have to do a bit +for work to get it perfect though. However it can produce publication +quality plots. Here we just scratch the surface of Matplotlib.

+
>>> import numpy as np
+>>> import matplotlib.pyplot as plt
+>>> from astropy import wcs
+
+>>> ad_image = astrodata.open('../playdata/N20170521S0925_forStack.fits')
+>>> ad_spectrum = astrodata.open('../playdata/estgsS20080220S0078.fits')
+
+>>> # Line plot from image.  Row #1044 (y-coordinate)
+>>> line_index = 1043
+>>> line = ad_image[0].data[line_index, :]
+>>> plt.clf()
+>>> plt.plot(line)
+>>> plt.show()
+
+>>> # Column plot from image, averaging across 11 pixels around colum #327
+>>> col_index = 326
+>>> width = 5
+>>> xlow = col_index - width
+>>> xhigh = col_index + width + 1
+>>> thick_column = ad_image[0].data[:, xlow:xhigh]
+>>> plt.clf()
+>>> plt.plot(thick_column.mean(axis=1))  # mean along the width.
+>>> plt.show()
+>>> plt.ylim(0, 50)     # Set the y-axis range
+>>> plt.plot(thick_column.mean(axis=1))
+>>> plt.show()
+
+>>> # Contour plot for a section of an image.
+>>> center = (1646, 2355)
+>>> width = 15
+>>> xrange = (center[1]-width//2, center[1] + width//2 + 1)
+>>> yrange = (center[0]-width//2, center[0] + width//2 + 1)
+>>> blob = ad_image[0].data[yrange[0]:yrange[1], xrange[0]:xrange[1]]
+>>> plt.clf()
+>>> plt.imshow(blob, cmap='gray', origin='lower')
+>>> plt.contour(blob)
+>>> plt.show()
+
+>>> # Spectrum in pixels
+>>> plt.clf()
+>>> plt.plot(ad_spectrum[0].data)
+>>> plt.show()
+
+>>> # Spectrum in Angstroms
+>>> spec_wcs = wcs.WCS(ad_spectrum[0].hdr)
+>>> pixcoords = np.array(range(ad_spectrum[0].data.shape[0]))
+>>> wlen = spec_wcs.wcs_pix2world(pixcoords, 0)[0]
+>>> plt.clf()
+>>> plt.plot(wlen, ad_spectrum[0].data)
+>>> plt.show()
+
+
+
+
+

2.6.10.2. imexam

+

For those who have used IRAF, imexam is a well-known tool. The Python +imexam reproduces many of of the features of its IRAF predecesor, the interactive mode of +course, but it also offers programmatic tools. One can even control DS9 +from Python. As for Matplotlib, here we really just scratch the surface of +what imexam has to offer.

+
 >>> import imexam
+ >>> from imexam.imexamine import Imexamine
+
+ >>> ad_image = astrodata.open('../playdata/N20170521S0925_forStack.fits')
+
+ # Display the image
+ >>> ds9 = imexam.connect(list(imexam.list_active_ds9())[0])
+ >>> ds9.view(ad_image[0].data)
+ >>> ds9.scale('zscale')
+
+ # Run in interactive mode.  Try the various commands.
+>>> ds9.imexam()
+
+ # Use the programmatic interface
+ # First initialize an Imexamine object.
+ >>> plot = Imexamine()
+
+ # Line plot from image.  Row #1044 (y-coordinate)
+ >>> line_index = 1043
+ >>> plot.plot_line(0, line_index, ad_image[0].data)
+
+ # Column plot from image, averaging across 11 pixels around colum #327
+ # There is no setting for this, so we have to do something similar
+ # to what we did with matplotlib.
+ >>> col_index = 326
+ >>> width = 5
+ >>> xlow = col_index - width
+ >>> xhigh = col_index + width + 1
+ >>> thick_column = ad_image[0].data[:, xlow:xhigh]
+ >>> mean_column = thick_column.mean(axis=1)
+ >>> plot.plot_column(0, 0, np.expand_dims(mean_column, 1))
+
+ >>> # Contour plot for a section of an image.
+ >>> center = (1646, 2355)  # in python coordinates
+ >>> width = 15
+ >>> plot.contour_pars['ncolumns'][0] = width
+ >>> plot.contour_pars['nlines'][0] = width
+ >>> plot.contour(center[1], center[0], ad_image[0].data)
+
+
+
+
+
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/manuals/usermanual/headers.html b/manuals/usermanual/headers.html new file mode 100644 index 00000000..47b9c106 --- /dev/null +++ b/manuals/usermanual/headers.html @@ -0,0 +1,379 @@ + + + + + + + + 2.5. Metadata and Headers — astrodata 3.2.0 documentation + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

2.5. Metadata and Headers

+

Try it yourself

+

Download the data package (Try it yourself) if you wish to follow along and run the +examples. Then

+
$ cd <path>/ad_usermanual/playground
+$ python
+
+
+

You need to import Astrodata and the Gemini instrument configuration package.

+
>>> import astrodata
+>>> import gemini_instruments
+
+
+
+

2.5.1. Astrodata Descriptors

+

We show in this chapter how to use the Astrodata Descriptors. But first +let’s explain what they are.

+

Astrodata Descriptors provide a “header-to-concept” mapping that allows the +user to access header information from a unique interface, regardless of +which instrument the dataset is from. Like for the Astrodata Tags, the +mapping is coded in a configuration package separate from core Astrodata. +For Gemini instruments, that package is named gemini_instruments.

+

For example, if the user is interested to know the effective filter used +for an observation, normally one needs to know which specific keyword or +set of keywords to look at for that instrument. However, once the concept +of “filter” is coded as a Descriptor, the user only needs to call the +filter_name() descriptor to retrieve the information.

+

The Descriptors are closely associated with the Astrodata Tags. In fact, +they are implemented in the same AstroData class as the tags. Once +the specific AstroData class is selected (upon opening the file), all +the tags and descriptors for that class are defined. For example, all the +descriptor functions of GMOS data, ie. the functions that map a descriptor +concept to the actual header content, are defined in the AstroDataGmos +class.

+

This is all completely transparent to the user. One simply opens the data +file and all the descriptors are ready to be used.

+
+

Note

+

Of course if the Descriptors have not been implemented for that specific +data, they will not work. They should all be defined for Gemini data. +For other sources, the headers can be accessed directly, one keyword at +a time. This type of access is discussed below. This is also useful +when the information needed is not associated with one of the standard +descriptors.

+
+

To get the list of descriptors available for an AstroData object:

+
>>> ad = astrodata.open('../playdata/N20170609S0154.fits')
+>>> ad.descriptors
+('airmass', 'amp_read_area', 'ao_seeing', ...
+  ...)
+
+
+

Most Descriptor names are readily understood, but one can get a short +description of what the Descriptor refers to by calling the Python help +function. For example:

+
>>> help(ad.airmass)
+>>> help(ad.filter_name)
+
+
+

The full list of standard descriptors is available in the Appendix +Implementing Descriptors.

+
+
+

2.5.2. Accessing Metadata

+
+

2.5.2.1. Accessing Metadata with Descriptors

+

Whenever possible the Descriptors should be used to get information from +headers. This allows for maximum re-usability of the code as it will then +work on any datasets with an AstroData class.

+

Here are a few examples using Descriptors:

+
>>> ad = astrodata.open('../playdata/N20170609S0154.fits')
+
+>>> #--- print a value
+>>> print('The airmass is : ', ad.airmass())
+The airmass is :  1.089
+
+>>> #--- use a value to control the flow
+>>> if ad.exposure_time() < 240.:
+...     print('This is a short exposure.')
+... else:
+...     print('This is a long exposure.')
+This is a short exposure.
+
+>>> #--- multiply all extensions by their respective gain
+>>> for ext, gain in zip(ad, ad.gain()):
+...     ext *= gain
+
+>>> #--- do arithmetics
+>>> fwhm_pixel = 3.5
+>>> fwhm_arcsec = fwhm_pixel * ad.pixel_scale()
+
+
+

The return values for Descriptors depend on the nature of the information +being requested and the number of extensions in the AstroData object. +When the value has words, it will be string, if it is a number +it will be a float or an integer. +The dataset used in this section has 4 extensions. When the descriptor +value can be different for each extension, the descriptor will return a +Python list.

+
>>> ad.airmass()
+1.089
+>>> ad.gain()
+[2.03, 1.97, 1.96, 2.01]
+>>> ad.filter_name()
+'open1-6&g_G0301'
+
+
+

Some descriptors accept arguments. For example:

+
>>> ad.filter_name(pretty=True)
+'g'
+
+
+

A full list of standard descriptors is available in the Appendix +Implementing Descriptors.

+
+
+

2.5.2.2. Accessing Metadata Directly

+

Not all header content is mapped to Descriptors, nor should it. Direct access +is available for header content falling outside the scope of the descriptors.

+

One important thing to keep in mind is that the PHU (Primary Header Unit) and +the extension headers are accessed slightly differently. The attribute +phu needs to be used for the PHU, and hdr for the extension headers.

+

Here are some examples of direct header access:

+
>>> ad = astrodata.open('../playdata/N20170609S0154.fits')
+
+>>> #--- Get keyword value from the PHU
+>>> ad.phu['AOFOLD']
+'park-pos.'
+
+>>> #--- Get keyword value from a specific extension
+>>> ad[0].hdr['CRPIX1']
+511.862999160781
+
+>>> #--- Get keyword value from all the extensions in one call.
+>>> ad.hdr['CRPIX1']
+[511.862999160781, 287.862999160781, -0.137000839218696, -224.137000839219]
+
+
+
+
+

2.5.2.3. Whole Headers

+

Entire headers can be retrieved as fits Header objects:

+
>>> ad = astrodata.open('../playdata/N20170609S0154.fits')
+>>> type(ad.phu)
+<class 'astropy.io.fits.header.Header'>
+>>> type(ad[0].hdr)
+<class 'astropy.io.fits.header.Header'>
+
+
+

In interactive mode, it is possible to print the headers on the screen as +follows:

+
>>> ad.phu
+SIMPLE  =                    T / file does conform to FITS standard
+BITPIX  =                   16 / number of bits per data pixel
+NAXIS   =                    0 / number of data axes
+....
+
+>>> ad[0].hdr
+XTENSION= 'IMAGE   '           / IMAGE extension
+BITPIX  =                   16 / number of bits per data pixel
+NAXIS   =                    2 / number of data axes
+....
+
+
+
+
+
+

2.5.3. Updating, Adding and Deleting Metadata

+

Header cards can be updated, added to, or deleted from the headers. The PHU +and the extensions headers are again accessed in a mostly identical way +with phu and hdr, respectively.

+
>>> ad = astrodata.open('../playdata/N20170609S0154.fits')
+
+
+

Add and update a keyword, without and with comment:

+
>>> ad.phu['NEWKEY'] = 50.
+>>> ad.phu['NEWKEY'] = (30., 'Updated PHU keyword')
+
+>>> ad[0].hdr['NEWKEY'] = 50.
+>>> ad[0].hdr['NEWKEY'] = (30., 'Updated extension keyword')
+
+
+

Delete a keyword:

+
>>> del ad.phu['NEWKEY']
+>>> del ad[0].hdr['NEWKEY']
+
+
+
+
+

2.5.4. World Co-ordinate System attribute

+

The wcs of an extension’s nddata attribute (eg. ad[0].nddata.wcs; +see Pixel Data) is stored as an instance of astropy.wcs.WCS (a +standard FITS WCS object) or gwcs.WCS (a “Generalized WCS” or gWCS object). This defines a transformation +between array indices and some other co-ordinate system such as “World” +co-ordinates (see APE 14). GWCS allows +multiple, almost arbitrary co-ordinate mappings from different calibration +steps (eg. CCD mosaicking, distortion correction & wavelength calibration) to +be combined in a single, reversible transformation chain — but this +information cannot always be represented as a FITS standard WCS. If a gWCS +object is too complex to be defined by the basic FITS keywords, it gets stored +as a table extension named ‘WCS’ when the AstroData instance is saved to a +file (with the same EXTVER as the corresponding ‘SCI’ array) and the FITS +header keywords are updated to provide an approximation to the true WCS and an +additional keyword FITS-WCS is added with the value ‘APPROXIMATE’. +The representation in the table is produced using +ASDF, with one line of text per row. Likewise, +when the file is re-opened, the gWCS object gets recreated in wcs from the +table. If the transformation defined by the gWCS object can be accurately +described by standard FITS keywords, then no WCS extension is created as the +gWCS object can be created from these keywords when the file is re-opened.

+

In future, it is intended to improve the quality of the FITS approximation +using the Simple Imaging Polynomial convention +(SIP) or +a discrete sampling of the World co-ordinate +values will be stored as part of the FITS WCS, following Greisen et al. (2006), S6 (in addition to the +definitive ‘WCS’ table), allowing standard FITS readers to report accurate +World co-ordinates for each pixel.

+
+
+

2.5.5. Adding Descriptors [Advanced Topic]

+

For proper and complete instructions on how to create Astrodata Descriptors, +the reader is invited to refer to the Astrodata Programmer Manual. Here we +provide a simple introduction that might help some readers better understand +Astrodata Descriptors, or serve as a quick reference for those who have +written Astrodata Descriptors in the past but need a little refresher.

+

The Astrodata Descriptors are defined in an AstroData class. The +AstroData class specific to an instrument is located in a separate +package, not in astrodata. For example, for Gemini instruments, all the +various AstroData classes are contained in the gemini_instruments +package.

+

An Astrodata Descriptor is a function within the instrument’s AstroData +class. The descriptor function is distinguished from normal functions by +applying the @astro_data_descriptor decorator to it. The descriptor +function returns the value(s) using a Python type, int, float, +string, list; it depends on the value being returned. There is no +special “descriptor” type.

+

Here is an example of code defining a descriptor:

+
class AstroDataGmos(AstroDataGemini):
+    ...
+    @astro_data_descriptor
+    def detector_x_bin(self):
+        def _get_xbin(b):
+            try:
+                return int(b.split()[0])
+            except (AttributeError, ValueError):
+                return None
+
+        binning = self.hdr.get('CCDSUM')
+        if self.is_single:
+            return _get_xbin(binning)
+        else:
+            xbin_list = [_get_xbin(b) for b in binning]
+            # Check list is single-valued
+            return xbin_list[0] if xbin_list == xbin_list[::-1] else None
+
+
+

This descriptor returns the X-axis binning as a integer when called on a +single extension, or an object with only one extension, for example after the +GMOS CCDs have been mosaiced. If there are more than one extensions, it +will return a Python list or an integer if the binning is the same for all +the extensions.

+

Gemini has defined a standard list of descriptors that should be defined +one way or another for each instrument to ensure the re-usability of our +algorithms. That list is provided in the Appendix Implementing Descriptors.

+

For more information on adding to Astrodata, see the Astrodata Programmer +Manual.

+
+
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/manuals/usermanual/index.html b/manuals/usermanual/index.html new file mode 100644 index 00000000..abd0b7b2 --- /dev/null +++ b/manuals/usermanual/index.html @@ -0,0 +1,176 @@ + + + + + + + + 2. User Manual — astrodata 3.2.0 documentation + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/manuals/usermanual/intro.html b/manuals/usermanual/intro.html new file mode 100644 index 00000000..9ab3ea3c --- /dev/null +++ b/manuals/usermanual/intro.html @@ -0,0 +1,331 @@ + + + + + + + + 2.1. Introduction — astrodata 3.2.0 documentation + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

2.1. Introduction

+

This is the AstroData User’s Manual. AstroData is a DRAGONS package. +The current chapter covers basic concepts +like what is the AstroData package and how to install it (together with the +other DRAGONS’ packages). Chapter 2 +explains with more details what is AstroData and how the data is represented +using it. Chapter 3 describes input and output operations and +how multi-extension (MEF) FITS files are represented. Chapter 4 +provides information regarding the TagSet class, its usage and a few advanced +topics. In Chapter 5 you will find information about the FITS +headers and how to access/modify the metadata. The last two chapters, +Chapter 6 and Chapter 7 cover more details +about how to read, manipulate and write pixel data and tables, respectively.

+

If you are looking for a quick reference, please, have a look on the +Cheat Sheet.

+
+

2.1.1. Reference Documents

+
+
+
+
+

2.1.2. What is AstroData?

+

AstroData is a package that wraps together tools to represent internally +astronomical datasets stored on disks and to properly parse their metadata +using the AstroData and the TagSet classes. AstroData provides uniform +interfaces for working on datasets from different +instruments. Once a dataset has been opened with AstroData, the object +“knows about itself”. Information like instrument, observation mode, and how +to access headers, is readily available through the uniform interface. All +the details are coded inside the class associated with the instrument, that +class then provides the interface. The appropriate class is selected +automatically when the file is opened and inspected by AstroData.

+

Currently AstroData implements a representation for Multi-Extension FITS +(MEF) files. (Other representations can be implemented.)

+
+
+

2.1.3. Installing Astrodata

+

The AstroData package has a few dependencies, |astropy|, |numpy| and others. +The best way to get everything you need is to install Anaconda_, and the +|dragons| stack from conda-forge and Gemini’s public conda channel.

+

AstroData itself is part of |DRAGONS|. It is available from the +repository, as a tar file, or as a conda package. The bare AstroData package +does not do much by itself, it needs a companion instrument definitions +package. For Gemini, this is gemini_instruments, also included in +|DRAGONS|.

+
+

2.1.3.1. Installing Anaconda and the DRAGONS stack

+

This is required whether you are installing |DRAGONS| from the +repository, the tar file or the conda package.

+
    +
  1. +
    Install Anaconda.

    Go to https://www.anaconda.com/download/ and install the latest 64-bit +Anaconda.

    +
    +
    +
  2. +
  3. +
    Open a bash session.

    Anaconda requires bash. If you are not familiar with bash, note that the +shell configuration files are named .bash_profile and .bashrc. +During the installation, a PATH setting has been added to your +.bash_profile or .bashrc to add the Anaconda bin directory to +the PATH.

    +
    +
    +
  4. +
  5. +
    Activate Anaconda.

    Normal Python 3 installation puts the software in ~/anaconda3/.:

    +
    $ conda init
    +
    +
    +
    +
    +
  6. +
  7. +
    Set up conda channels.

    Configure the conda package manager to look in conda-forge, and in the +GEMINI Conda Channel. This is a one-time step. It affects current and +future Anaconda installations belonging to the same user on the same +machine.:

    +
    $ conda config --add channels conda-forge
    +$ conda config --add channels http://astroconda.gemini.edu/public
    +
    +
    +
    +
    +
  8. +
  9. +
    Create an environment.

    To keep things clean, Anaconda offers virtual environments. Each project +can use its own environment. For example, if you do not want to modify +the software packages needed for a previous project, just create a new +environment for the new project.

    +

    Here we set up an environment where the DRAGONS dependencies can +be installed without affecting the rest of the system when not using that +virtual environement. The new virtual environment here is named +dragons. The software has been tested with Python 3.10 hence we +recommend that you use this specific version of Python with DRAGONS.

    +
    $ conda create -n dragons python=3.10 dragons ds9
    +
    +
    +
    +
    +
  10. +
  11. +
    Activate your new virtual environment.
    $ conda activate dragons
    +
    +
    +
    +
    +
  12. +
  13. +
    Configure DRAGONS.

    These configurations are not strictly required when using only AstroData. +It is however likely that if you are using AstroData you will be using +DRAGONS too at some point. So let’s configure it to have it ready to go.

    +

    DRAGONS requires a configuration file located in ~/.dragons/. The +dragonsrc file contains basic configuration for DRAGONS local calibration +manager used by reduce.

    +
    $ cd ~
    +$ mkdir .dragons
    +$ cd .dragons
    +$ touch dragonsrc
    +
    +
    +
    +
    Open dragonsrc with your favorite editor and add these lines::

    [interactive] +browser = one of “safari”, “chrome”, “firefox”

    +

    [calibs] +databases = ~/.dragons/dragons.db

    +
    +
    +

    Next time you start a DRAGONS project, set the databases to a path +of your liking, this is where the local calibration database will be written.

    +

    Then configure buffers for ds9:

    +
    $ cd ~/
    +$ cp $CONDA_PREFIX/lib/python3.10/site-packages/gempy/numdisplay/imtoolrc ~/.imtoolrc
    +$ vi .bash_profile (or use your favority editor)
    +     Add this line to the .bash_profile:
    +        export IMTOOLRC=~/.imtoolrc
    +
    +
    +
    +
    +
  14. +
+
+
+

2.1.3.2. Update an existing DRAGONS installation

+

To check which version of DRAGONS you have installed:

+
$ conda list dragons
+
+
+

To check for newer version:

+
$ conda search dragons
+
+
+

To update to the newest version:

+
$ conda update dragons
+
+
+
+
+

2.1.3.3. Smoke test the Astrodata installation

+

From the configured bash shell:

+
$ type python
+python is hashed (<home_path>/anaconda3/envs/dragons/python)
+
+Make sure that python is indeed pointing to the Anaconda environment you
+have just set up.
+
+
+
$ python
+>>> import astrodata
+>>> import gemini_instruments
+
+Expected result: Just a python prompt and no error messages.
+
+
+
+
+

2.1.3.4. Source code availability

+

The source code is available on Github:

+
+
+
+
+
+

2.1.4. Try it yourself

+

Try it yourself

+

Download the data package if you wish to follow along and run the +examples presented in this manual. It is available at:

+
+
+

Unpack it:

+
$ cd <somewhere_convenient>
+$ tar xvf ad_usermanual_datapkg-v1.tar
+$ bunzip2 ad_usermanual/playdata/*.bz2
+
+
+

Then

+
$ cd ad_usermanual/playground
+$ python
+
+
+
+
+

2.1.5. Astrodata Support

+

Astrodata is developed and supported by staff at the Gemini Observatory. +Questions about the reduction of Gemini data should be directed to the +Gemini Helpdesk system at +https://noirlab.atlassian.net/servicedesk/customer/portal/12 +The github issue tracker can be used to report software bugs in DRAGONS +(https://github.com/GeminiDRSoftware/DRAGONS).

+
+
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/manuals/usermanual/iomef.html b/manuals/usermanual/iomef.html new file mode 100644 index 00000000..b2ba0823 --- /dev/null +++ b/manuals/usermanual/iomef.html @@ -0,0 +1,606 @@ + + + + + + + + 2.3. Input and Output Operations and Extension Manipulation - MEF — astrodata 3.2.0 documentation + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

2.3. Input and Output Operations and Extension Manipulation - MEF

+

AstroData is not intended to be Multi-Extension FITS (MEF) centric. The core +is independent of the file format. At Gemini, our data model uses MEF. +Therefore we have implemented a FITS handler that maps a MEF to the +internal AstroData representation. A different handler can be implemented +for a different file format.

+

In this chapter, we present examples that will help the reader understand how +to access the information stored in a MEF with the AstroData object and +understand that mapping.

+

Try it yourself

+

Download the data package (Try it yourself) if you wish to follow along and run the +examples. Then

+
$ cd <path>/ad_usermanual/playground
+$ python
+
+
+
+

2.3.1. Imports

+

Before doing anything, you need to import AstroData and the Gemini instrument +configuration package |gemini_instruments|.

+
>>> import astrodata
+>>> import gemini_instruments
+
+
+
+
+

2.3.2. Open and access existing dataset

+
+

2.3.2.1. Read in the dataset

+

The file on disk is loaded into the AstroData class associated with the +instrument the data is from. This association is done automatically based on +header content.

+
>>> ad = astrodata.open('../playdata/N20170609S0154.fits')
+>>> type(ad)
+<class 'gemini_instruments.gmos.adclass.AstroDataGmos'>
+
+
+

From now on, ad knows it is GMOS data. It knows how to access its headers +and when using the Recipe System (|recipe_system|), it will trigger the +selection of the GMOS primitives and recipes.

+

The original path and filename are stored in the object. If you were to write +the AstroData object to disk without specifying anything, those path and +filename would be used.

+
>>> ad.path
+'../playdata/N20170609S0154.fits'
+>>> ad.filename
+'N20170609S0154.fits'
+
+
+
+
+

2.3.2.2. Accessing the content of a MEF file

+

Accessing pixel data, headers, and tables will be covered in detail in the +following chapters. Here we just introduce the basic content interface.

+

For details on the AstroData structure, please refer to the +previous chapter.

+

AstroData uses |NDData| as the core of its structure. Each FITS extension +becomes a NDAstroData object, subclassed from |NDData|, and is added to +a list.

+
+

2.3.2.2.1. Pixel data

+

To access pixel data, the list index and the .data attribute are used. That +returns a numpy.ndarray. The list of NDAstroData is zero-indexed. +Extension number 1 in a MEF is index 0 in an |AstroData| object.

+
>>> ad = astrodata.open('../playdata/N20170609S0154_varAdded.fits')
+>>> data = ad[0].data
+>>> type(data)
+<class 'numpy.ndarray'>
+>>> data.shape
+(2112, 256)
+
+
+

Remember that in a ndarray the y-axis is the first number.

+

The variance and data quality planes, the VAR and DQ planes in Gemini MEF +files, are represented by the .variance and .mask attributes, +respectively. They are not their own “extension”, they don’t have their +own index in the list, unlike in a MEF. They are attached to the pixel data, +packaged together by the NDAstroData object. They are represented as +numpy.ndarray just like the pixel data

+
>>> var = ad[0].variance
+>>> dq = ad[0].mask
+
+
+
+
+

2.3.2.2.2. Tables

+

Tables in the MEF file will also be loaded into the AstroData object. If a table +is associated with a specific science extension through the EXTVER header keyword, that +table will be packaged within the same AstroData extension as the pixel data. +The AstroData “extension” is the NDAstroData object plus any table or other pixel +array. If the table is not associated with a specific extension and applies +globally, it will be added to the AstroData object as a global addition. No +indexing will be required to access it. In the example below, one OBJCAT is +associated with each extension, while the REFCAT has a global scope

+
>>> ad.info()
+Filename: ../playdata/N20170609S0154_varAdded.fits
+Tags: ACQUISITION GEMINI GMOS IMAGE NORTH OVERSCAN_SUBTRACTED OVERSCAN_TRIMMED
+    PREPARED SIDEREAL
+
+Pixels Extensions
+Index  Content                  Type              Dimensions     Format
+[ 0]   science                  NDAstroData       (2112, 256)    float32
+          .variance             ndarray           (2112, 256)    float32
+          .mask                 ndarray           (2112, 256)    uint16
+          .OBJCAT               Table             (6, 43)        n/a
+          .OBJMASK              ndarray           (2112, 256)    uint8
+[ 1]   science                  NDAstroData       (2112, 256)    float32
+          .variance             ndarray           (2112, 256)    float32
+          .mask                 ndarray           (2112, 256)    uint16
+          .OBJCAT               Table             (8, 43)        n/a
+          .OBJMASK              ndarray           (2112, 256)    uint8
+[ 2]   science                  NDAstroData       (2112, 256)    float32
+          .variance             ndarray           (2112, 256)    float32
+          .mask                 ndarray           (2112, 256)    uint16
+          .OBJCAT               Table             (7, 43)        n/a
+          .OBJMASK              ndarray           (2112, 256)    uint8
+[ 3]   science                  NDAstroData       (2112, 256)    float32
+          .variance             ndarray           (2112, 256)    float32
+          .mask                 ndarray           (2112, 256)    uint16
+          .OBJCAT               Table             (5, 43)        n/a
+          .OBJMASK              ndarray           (2112, 256)    uint8
+
+Other Extensions
+               Type        Dimensions
+.REFCAT        Table       (245, 16)
+
+
+

The tables are stored internally as astropy.table.Table objects.

+
>>> ad[0].OBJCAT
+<Table length=6>
+NUMBER X_IMAGE Y_IMAGE ... REF_MAG_ERR PROFILE_FWHM PROFILE_EE50
+int32  float32 float32 ...   float32     float32      float32
+------ ------- ------- ... ----------- ------------ ------------
+     1 283.461 55.4393 ...     0.16895       -999.0       -999.0
+...
+>>> type(ad[0].OBJCAT)
+<class 'astropy.table.table.Table'>
+
+>>> refcat = ad.REFCAT
+>>> type(refcat)
+<class 'astropy.table.table.Table'>
+
+
+
+
+

2.3.2.2.3. Headers

+

Headers are stored in the NDAstroData .meta attribute as astropy.io.fits.Header objects, +which is a form of Python ordered dictionaries. Headers associated with extensions +are stored with the corresponding NDAstroData object. The MEF Primary Header +Unit (PHU) is stored “globally” in the AstroData object. Note that when slicing an AstroData object, +for example copying over just the first extension, the PHU will follow. The +slice of an AstroData object is an AstroData object. +Headers can be accessed directly, or for some predefined concepts, the use of +Descriptors is preferred. See the chapters on headers for details.

+

Using Descriptors:

+
>>> ad = astrodata.open('../playdata/N20170609S0154.fits')
+>>> ad.filter_name()
+'open1-6&g_G0301'
+>>> ad.filter_name(pretty=True)
+'g'
+
+
+

Using direct header access:

+
>>> ad.phu['FILTER1']
+'open1-6'
+>>> ad.phu['FILTER2']
+'g_G0301'
+
+
+

Accessing the extension headers:

+
>>> ad.hdr['CCDSEC']
+['[1:512,1:4224]', '[513:1024,1:4224]', '[1025:1536,1:4224]', '[1537:2048,1:4224]']
+>>> ad[0].hdr['CCDSEC']
+'[1:512,1:4224]'
+
+With descriptors:
+>>> ad.array_section(pretty=True)
+['[1:512,1:4224]', '[513:1024,1:4224]', '[1025:1536,1:4224]', '[1537:2048,1:4224]']
+
+
+
+
+
+
+

2.3.3. Modify Existing MEF Files

+

Before you start modify the structure of an AstroData object, you should be +familiar with it. Please make sure that you have read the previous chapter +on the structure of the AstroData object.

+
+

2.3.3.1. Appending an extension

+

In this section, we take an extension from one AstroData object and append it +to another.

+

Here is an example appending a whole AstroData extension, with pixel data, +variance, mask and tables.

+
>>> ad = astrodata.open('../playdata/N20170609S0154.fits')
+>>> advar = astrodata.open('../playdata/N20170609S0154_varAdded.fits')
+
+>>> ad.info()
+Filename: ../playdata/N20170609S0154.fits
+Tags: ACQUISITION GEMINI GMOS IMAGE NORTH RAW SIDEREAL UNPREPARED
+Pixels Extensions
+Index  Content                  Type              Dimensions     Format
+[ 0]   science                  NDAstroData       (2112, 288)    uint16
+[ 1]   science                  NDAstroData       (2112, 288)    uint16
+[ 2]   science                  NDAstroData       (2112, 288)    uint16
+[ 3]   science                  NDAstroData       (2112, 288)    uint16
+
+>>> ad.append(advar[3])
+>>> ad.info()
+Filename: ../playdata/N20170609S0154.fits
+Tags: ACQUISITION GEMINI GMOS IMAGE NORTH RAW SIDEREAL UNPREPARED
+Pixels Extensions
+Index  Content                  Type              Dimensions     Format
+[ 0]   science                  NDAstroData       (2112, 288)    uint16
+[ 1]   science                  NDAstroData       (2112, 288)    uint16
+[ 2]   science                  NDAstroData       (2112, 288)    uint16
+[ 3]   science                  NDAstroData       (2112, 288)    uint16
+[ 4]   science                  NDAstroData       (2112, 256)    float32
+          .variance             ndarray           (2112, 256)    float32
+          .mask                 ndarray           (2112, 256)    int16
+          .OBJCAT               Table             (5, 43)        n/a
+          .OBJMASK              ndarray           (2112, 256)    uint8
+
+>>> ad[4].hdr['EXTVER']
+4
+>>> advar[3].hdr['EXTVER']
+4
+
+
+

As you can see above, the fourth extension of advar, along with everything +it contains was appended at the end of the first AstroData object. However, +note that, because the EXTVER of the extension in advar was 4, there are +now two extensions in ad with this EXTVER. This is not a problem because +EXTVER is not used by AstroData (it uses the index instead) and it is handled +only when the file is written to disk.

+

In this next example, we are appending only the pixel data, leaving behind the other +associated data. One can attach the headers too, like we do here.

+
>>> ad = astrodata.open('../playdata/N20170609S0154.fits')
+>>> advar = astrodata.open('../playdata/N20170609S0154_varAdded.fits')
+
+>>> ad.append(advar[3].data, header=advar[3].hdr)
+>>> ad.info()
+Filename: ../playdata/N20170609S0154.fits
+Tags: ACQUISITION GEMINI GMOS IMAGE NORTH RAW SIDEREAL UNPREPARED
+Pixels Extensions
+Index  Content                  Type              Dimensions     Format
+[ 0]   science                  NDAstroData       (2112, 288)    uint16
+[ 1]   science                  NDAstroData       (2112, 288)    uint16
+[ 2]   science                  NDAstroData       (2112, 288)    uint16
+[ 3]   science                  NDAstroData       (2112, 288)    uint16
+[ 4]   science                  NDAstroData       (2112, 256)    float32
+
+
+

Notice how a new extension was created but variance, mask, the OBJCAT +table and OBJMASK image were not copied over. Only the science pixel data was +copied over.

+

Please note, there is no implementation for the “insertion” of an extension.

+
+
+

2.3.3.2. Removing an extension or part of one

+

Removing an extension or a part of an extension is straightforward. The +Python command del() is used on the item to remove. Below are a few +examples, but first let us load a file

+
>>> ad = astrodata.open('../playdata/N20170609S0154_varAdded.fits')
+>>> ad.info()
+
+
+

As you go through these examples, check the new structure with ad.info() +after every removal to see how the structure has changed.

+

Deleting a whole AstroData extension, the fourth one

+
>>> del ad[3]
+
+
+

Deleting only the variance array from the second extension

+
>>> ad[1].variance = None
+
+
+

Deleting a table associated with the first extension

+
>>> del ad[0].OBJCAT
+
+
+

Deleting a global table, not attached to a specific extension

+
>>> del ad.REFCAT
+
+
+
+
+
+

2.3.4. Writing back to disk

+

The AstroData layer takes care of converting +the AstroData object back to a MEF file on disk. When writing to disk, +one should be aware of the path and filename information associated +with the AstroData object.

+
>>> ad = astrodata.open('../playdata/N20170609S0154.fits')
+>>> ad.path
+'../playdata/N20170609S0154.fits'
+>>> ad.filename
+'N20170609S0154.fits'
+
+
+
+

2.3.4.1. Writing to a new file

+

There are various ways to define the destination for the new FITS file. +The most common and natural way is

+
>>> ad.write('new154.fits')
+
+>>> ad.write('new154.fits', overwrite=True)
+
+
+

This will write a FITS file named ‘new154.fits’ in the current directory. +With overwrite=True, it will overwrite the file if it already exists. +A path can be prepended to the filename if the current directory is not +the destination. +Note that ad.filename and ad.path have not changed, we have just +written to the new file, the AstroData object is in no way associated +with that new file.

+
>>> ad.path
+'../playdata/N20170609S0154.fits'
+>>> ad.filename
+'N20170609S0154.fits'
+
+
+

If you want to create that association, the ad.filename and ad.path +needs to be modified first. For example:

+
>>> ad.filename = 'new154.fits'
+>>> ad.write(overwrite=True)
+
+>>> ad.path
+'../playdata/new154.fits'
+>>> ad.filename
+'new154.fits'
+
+
+

Changing ad.filename also changes the filename in the ad.path. The +sequence above will write ‘new154.fits’ not in the current directory but +rather to the directory that is specified in ad.path.

+

WARNING: ad.write() has an argument named filename. Setting filename +in the call to ad.write(), as in ad.write(filename='new154.fits') will NOT +modify ad.filename or ad.path. The two “filenames”, one a method argument +the other a class attribute have no association to each other.

+
+
+

2.3.4.2. Updating an existing file on disk

+

Updating an existing file on disk requires explicitly allowing overwrite.

+

If you have not written ‘new154.fits’ to disk yet (from previous section)

+
>>> ad = astrodata.open('../playdata/N20170609S0154.fits')
+>>> ad.write('new154.fits', overwrite=True)
+
+
+

Now let’s open ‘new154.fits’, and write to it

+
>>> adnew = astrodata.open('new154.fits')
+>>> adnew.write(overwrite=True)
+
+
+
+
+

2.3.4.3. A note on FITS header keywords

+

When writing an AstroData object to disk as a FITS file, it is necessary to add or +update header keywords to represent some of the internally-stored information. Any +extensions that did not originally belong to this AstroData will be assigned new +EXTVER keywords to avoid conflicts with existing extensions, and the internal WCS is +converted to the appropriate FITS keywords. Note that in some cases it may not be +possible for standard FITS keywords to accurately represent the true WCS. In such +cases, the FITS keywords are written as an approximation to the true WCS, together +with an additional keyword

+
FITS-WCS= 'APPROXIMATE'        / FITS WCS is approximate
+
+
+

to indicate this. The accurate WCS is written as an additional FITS extension with +EXTNAME='WCS' that AstroData will recognize when the file is read back in. The +WCS extension will not be written to disk if there is an accurate FITS +representation of the WCS (e.g., for a simple image).

+
+
+
+

2.3.5. Create New MEF Files

+

A new MEF file can be created from an existing, maybe modified, file or it +can be created from scratch. We discuss both cases here.

+
+

2.3.5.1. Create New Copy of MEF Files

+

To create a new copy of a MEF file, modified or not, the user has already +been given most of the tools in the sections above. Yet, let’s throw a +couple examples for completeness.

+
+

2.3.5.1.1. Basic example

+

As seen above, a MEF file can be opened with AstroData, the AstroData +object can be modified (or not), and then written back to disk under a +new name.

+
>>> ad = astrodata.open('../playdata/N20170609S0154.fits')
+... optional modifications here ...
+>>> ad.write('newcopy.fits')
+
+
+
+
+

2.3.5.1.2. Needing true copies in memory

+

Sometimes it is a true copy in memory that is needed. This is not specific +to MEF. In Python, doing something like adnew = ad does not create a +new copy of the AstrodData object; it just gives it a new name. If you +modify adnew you will be modifying ad too. They point to the same +block of memory.

+

To create a true independent copy, the deepcopy utility needs to be used.

+
>>> from copy import deepcopy
+>>> ad = astrodata.open('../playdata/N20170609S0154.fits')
+>>> adcopy = deepcopy(ad)
+
+
+

Be careful using deepcopy, your memory could balloon really fast. Use it +only when truly needed.

+
+
+
+

2.3.5.2. Create New MEF Files from Scratch

+

Before one creates a new MEF file on disk, one has to create the AstroData +object that will be eventually written to disk. The AstroData object +created also needs to know that it will have to be written using the MEF +format. This is fortunately handled fairly transparently by AstroData.

+

The key to associating the FITS data to the AstroData object is simply to +create the AstroData object from astropy.io.fits header objects. Those +will be recognized by AstroData as FITS and the constructor for FITS will be +used. The user does not need to do anything else special. Here is how it is +done.

+
+

2.3.5.2.1. Create a MEF with basic header and data array set to zeros

+
>>> import numpy as np
+>>> from astropy.io import fits
+
+>>> phu = fits.PrimaryHDU()
+
+>>> pixel_data = np.zeros((100,100))
+
+>>> hdu = fits.ImageHDU()
+>>> hdu.data = pixel_data
+
+>>> ad = astrodata.create(phu)
+>>> ad.append(hdu, name='SCI')
+
+or another way to do the last two blocs:
+>>> hdu = fits.ImageHDU(data=pixel_data, name='SCI')
+>>> ad = astrodata.create(phu, [hdu])
+
+
+

Then it is just a matter of calling ad.write('somename.fits') on that +new Astrodata object.

+
+
+

2.3.5.2.2. Associate a pixel array with a science pixel array

+

Only main science (“SCI”) pixel arrays are added as slices to an astrodata +object. It not uncommon to have pixels information associated with those +main science pixels, for example an object mask where marked pixels in the mask +are directly associated with sources in the science array.

+

Such pixel arrays are added to specific slice of the astrodata object they are +associated with.

+

Building on the astrodata object we created in the previous subsection, one +would add a pixel array to the first slice of the astrodata object as +follows:

+
>>> extra_data = np.ones((100, 100))
+>>> ad[0].EXTRADATA = extra_data
+
+
+

When the file is written to disk as a MEF, an extension will be created with +EXTNAME = EXTRADATA and an EXTVER that matches the slice’s EXTVER, +in this case is would be 1.

+
+
+

2.3.5.2.3. Represent a table as a FITS binary table in an AstroData object

+

One first needs to create a table, either an astropy.table.Table +or a BinTableHDU. See the |astropy| documentation +on tables and this manual’s section dedicated to tables for +more information.

+

In the first example, we assume that my_astropy_table is +a Table ready to be attached to an AstroData +object. (Warning: we have not created my_astropy_table therefore the +example below will not run, though this is how it would be done.)

+
>>> phu = fits.PrimaryHDU()
+>>> ad = astrodata.create(phu)
+
+>>> astrodata.add_header_to_table(my_astropy_table)
+>>> ad.append(my_astropy_table, name='SMAUG')
+
+
+

In the second example, we start with a FITS BinTableHDU +and attach it to a new AstroData object. (Again, we have not created +my_fits_table so the example will not run.)

+
>>> phu = fits.PrimaryHDU()
+>>> ad = astrodata.create(phu)
+>>> ad.append(my_fits_table, name='DROGON')
+
+
+

As before, once the AstroData object is constructed, the ad.write() +method can be used to write it to disk as a MEF file.

+
+
+
+
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/manuals/usermanual/structure.html b/manuals/usermanual/structure.html new file mode 100644 index 00000000..84a42016 --- /dev/null +++ b/manuals/usermanual/structure.html @@ -0,0 +1,278 @@ + + + + + + + + 2.2. The AstroData Object — astrodata 3.2.0 documentation + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

2.2. The AstroData Object

+

The AstroData object is an internal representation of a file on disk. +As of this version, only a FITS layer has been written, but AstroData itself +is not limited to FITS.

+

The internal structure of the AstroData object makes uses of +astropy.nddata.NDData, astropy.table, and +astropy.io.fits.Header, the latter simply because it is a +convenient ordered dictionary.

+

Try it yourself

+

Download the data package (Try it yourself) if you wish to follow along and run the +examples. Then

+
$ cd <path>/ad_usermanual/playground
+$ python
+
+
+
+

2.2.1. Global vs Extension-specific

+

At the very top level, the structure is divided in two types of information. +In the first category, there is the information that applies to the data +globally, for example the information that would be stored in a FITS Primary +Header Unit, a table from a catalog that matches the RA and DEC of the field, +etc. In the second category, there is the information specific to individual +science pixel extensions, for example the gain of the amplifier, the data +themselves, the error on those data, etc.

+

Let us look at an example. The info() method shows +the content of the AstroData object and its organization, from the user’s +perspective.:

+
>>> import astrodata
+>>> import gemini_instruments
+
+>>> ad = astrodata.open('../playdata/N20170609S0154_varAdded.fits')
+>>> ad.info()
+Filename: N20170609S0154_varAdded.fits
+Tags: ACQUISITION GEMINI GMOS IMAGE NORTH OVERSCAN_SUBTRACTED OVERSCAN_TRIMMED
+    PREPARED SIDEREAL
+
+Pixels Extensions
+Index  Content                  Type              Dimensions     Format
+[ 0]   science                  NDAstroData       (2112, 256)    float32
+          .variance             ndarray           (2112, 256)    float32
+          .mask                 ndarray           (2112, 256)    uint16
+          .OBJCAT               Table             (6, 43)        n/a
+          .OBJMASK              ndarray           (2112, 256)    uint8
+[ 1]   science                  NDAstroData       (2112, 256)    float32
+          .variance             ndarray           (2112, 256)    float32
+          .mask                 ndarray           (2112, 256)    uint16
+          .OBJCAT               Table             (8, 43)        n/a
+          .OBJMASK              ndarray           (2112, 256)    uint8
+[ 2]   science                  NDAstroData       (2112, 256)    float32
+          .variance             ndarray           (2112, 256)    float32
+          .mask                 ndarray           (2112, 256)    uint16
+          .OBJCAT               Table             (7, 43)        n/a
+          .OBJMASK              ndarray           (2112, 256)    uint8
+[ 3]   science                  NDAstroData       (2112, 256)    float32
+          .variance             ndarray           (2112, 256)    float32
+          .mask                 ndarray           (2112, 256)    uint16
+          .OBJCAT               Table             (5, 43)        n/a
+          .OBJMASK              ndarray           (2112, 256)    uint8
+
+Other Extensions
+               Type        Dimensions
+.REFCAT        Table       (245, 16)
+
+
+

The “Pixel Extensions” contain the pixel data. Each extension is represented +individually in a list (0-indexed like all Python lists). The science pixel +data, its associated metadata (extension header), and any other pixel or table +extensions directly associated with that science pixel data are stored in +a NDAstroData object which is a subclass of astropy |NDData|. We will +return to this structure later. An AstroData extension is accessed like +any list: ad[0]. To access the science pixels, one uses ad[0].data; for +the object mask of the first extension, ad[0].OBJMASK.

+

In the example above, the “Other Extensions” at the bottom of the +info() display contains a REFCAT table which in +this case is a list of stars from a catalog that overlaps the field of view +covered by the pixel data. The “Other Extensions” are global extensions. They +are not attached to any pixel extension in particular. To access a global +extension one simply uses the name of that extension: ad.REFCAT.

+
+
+

2.2.2. Organization of the Global Information

+

All the global information is stored in attributes of the AstroData object. +The global headers, or Primary Header Unit (PHU), is stored in the phu +attribute as an astropy.io.fits.Header.

+

Any global tables, like REFCAT above, are stored in the private attribute +_tables as a Python dictionary with the name (eg. “REFCAT”) as the key. +All tables are stored as astropy.table.Table. Access to those table +is done using the key directly as if it were a normal attribute, eg. +ad.REFCAT. Header information for the table, if read in from a FITS table, +is stored in the meta attribute of the astropy.table.Table, eg. +ad.REFCAT.meta['header']. It is for information only, it is not used.

+
+
+

2.2.3. Organization of the Extension-specific Information

+

The pixel data are stored in the AstroData attribute nddata as a list +of NDAstroData object. The NDAstroData object is a subclass of astropy +|NDData| and it is fully compatible with any function expecting an |NDData| as +input. The pixel extensions are accessible through slicing, eg. ad[0] or +even ad[0:2]. A slice of an AstroData object is an AstroData object, and +all the global attributes are kept. For example:

+
>>> ad[0].info()
+Filename: N20170609S0154_varAdded.fits
+Tags: ACQUISITION GEMINI GMOS IMAGE NORTH OVERSCAN_SUBTRACTED OVERSCAN_TRIMMED
+    PREPARED SIDEREAL
+
+Pixels Extensions
+Index  Content                  Type              Dimensions     Format
+[ 0]   science                  NDAstroData       (2112, 256)    float32
+          .variance             ndarray           (2112, 256)    float32
+          .mask                 ndarray           (2112, 256)    uint16
+          .OBJCAT               Table             (6, 43)        n/a
+          .OBJMASK              ndarray           (2112, 256)    uint8
+
+Other Extensions
+               Type        Dimensions
+.REFCAT        Table       (245, 16)
+
+
+

Note how REFCAT is still present.

+

The science data is accessed as ad[0].data, the variance as ad[0].variance, +and the data quality plane as ad[0].mask. Those familiar with astropy +|NDData| will recognize the structure “data, error, mask”, and will notice +some differences. First AstroData uses the variance for the error plane, not +the standard deviation. Another difference will be evident only when one looks +at the content of the mask. |NDData| masks contain booleans, AstroData masks +are uint16 bit mask that contains information about the type of bad pixels +rather than just flagging them a bad or not. Since 0 is equivalent to +False (good pixel), the AstroData mask is fully compatible with the +|NDData| mask.

+

Header information for the extension is stored in the NDAstroData meta +attribute. All table and pixel extensions directly associated with the +science extension are also stored in the meta attribute.

+

Technically, an extension header is located in ad.nddata[0].meta['header']. +However, for obviously needed convenience, the normal way to access that header +is ad[0].hdr.

+

Tables and pixel arrays associated with a science extension are +stored in ad.nddata[0].meta['other'] as a dictionary keyed on the array +name, eg. OBJCAT, OBJMASK. As it is for global tables, astropy tables +are used for extension tables. The extension tables and extra pixel arrays are +accessed, like the global tables, by using the table name rather than the long +format, for example ad[0].OBJCAT and ad[0].OBJMASK.

+

When reading a FITS Table, the header information is stored in the +meta['header'] of the table, eg. ad[0].OBJCAT.meta['header']. That +information is not used, it is simply a place to store what was read from disk.

+

The header of a pixel extension directly associated with the science extension +should match that of the science extension. Therefore such headers are not +stored in AstroData. For example, the header of ad[0].OBJMASK is the +same as that of the science, ad[0].hdr.

+

The world coordinate system (WCS) is stored internally in the wcs attribute +of the NDAstroData object. It is constructed from the header keywords when +the FITS file is read from disk, or directly from the WCS extension if +present (see the next chapter). If the WCS is modified (for +example, by refining the pointing or attaching a more accurate wavelength +calibration), the FITS header keywords are not updated and therefore they should +never be used to determine the world coordinates of any pixel. These keywords are +only updated when the object is written to disk as a FITS file. The WCS is +retrieved as follows: ad[0].wcs.

+
+
+

2.2.4. A Note on Memory Usage

+

When an file is opened, the headers are loaded into memory, but the pixels +are not. The pixel data are loaded into memory only when they are first +needed. This is not real “memory mapping”, more of a delayed loading. This +is useful when someone is only interested in the metadata, especially when +the files are very large.

+
+
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/manuals/usermanual/tables.html b/manuals/usermanual/tables.html new file mode 100644 index 00000000..dd44a749 --- /dev/null +++ b/manuals/usermanual/tables.html @@ -0,0 +1,315 @@ + + + + + + + + 2.7. Table Data — astrodata 3.2.0 documentation + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

2.7. Table Data

+

Try it yourself

+

Download the data package (Try it yourself) if you wish to follow along and run the +examples. Then

+
$ cd <path>/ad_usermanual/playground
+$ python
+
+
+

Then import core astrodata and the Gemini astrodata configurations.

+
>>> import astrodata
+>>> import gemini_instruments
+
+
+
+

2.7.1. Tables and Astrodata

+

Tables are stored as astropy.table Table class. FITS tables too +are represented in Astrodata as Table and FITS headers are stored in +the NDAstroData .meta attribute. Most table access should be done +through the Table interface. The best reference on Table is the +Astropy documentation itself. In this chapter we covers some common +examples to get the reader started.

+

The astropy.table documentation can be found at: http://docs.astropy.org/en/stable/table/index.html

+
+
+

2.7.2. Operate on a Table

+

Let us open a file with tables. Some tables are associated with specific +extensions, and there is one table that is global to the AstroData object.

+
>>> ad = astrodata.open('../playdata/N20170609S0154_varAdded.fits')
+>>> ad.info()
+
+
+

To access the global table named REFCAT:

+
>>> ad.REFCAT
+
+
+

To access the OBJCAT table in the first extension

+
>>> ad[0].OBJCAT
+
+
+
+

2.7.2.1. Column and Row Operations

+

Columns are named. Those names are used to access the data as columns. +Rows are not names and are simply represented as a sequential list.

+
+

2.7.2.1.1. Read columns and rows

+

To get the names of the columns present in the table:

+
>>> ad.REFCAT.colnames
+['Id', 'Cat_Id', 'RAJ2000', 'DEJ2000', 'umag', 'umag_err', 'gmag',
+'gmag_err', 'rmag', 'rmag_err', 'imag', 'imag_err', 'zmag', 'zmag_err',
+'filtermag', 'filtermag_err']
+
+
+

Then it is easy to request the values for specific columns:

+
>>> ad.REFCAT['zmag']
+>>> ad.REFCAT['zmag', 'zmag_err']
+
+
+

To get the content of a specific row, row 10 in this case:

+
>>> ad.REFCAT[9]
+
+
+

To get the content of a specific row(s) from a specific column(s):

+
>>> ad.REFCAT['zmag'][4]
+>>> ad.REFCAT['zmag'][4:10]
+>>> ad.REFCAT['zmag', 'zmag_err'][4:10]
+
+
+
+
+

2.7.2.1.2. Change values

+

Assigning new values works in a similar way. When working on multiple elements +it is important to feed a list that matches in size with the number of elements +to replace.

+
>>> ad.REFCAT['imag'][4] = 20.999
+>>> ad.REFCAT['imag'][4:10] = [5, 6, 7, 8, 9, 10]
+
+>>> overwrite_col = [0] * len(ad.REFCAT)  # a list of zeros, size = nb of rows
+>>> ad.REFCAT['imag_err'] = overwrite_col
+
+
+
+
+

2.7.2.1.3. Add a row

+

To append a row, there is the add_row() method. The length of the row +should match the number of columns:

+
>>> new_row = [0] * len(ad.REFCAT.colnames)
+>>> new_row[1] = ''   # Cat_Id column is of "str" type.
+>>> ad.REFCAT.add_row(new_row)
+
+
+
+
+

2.7.2.1.4. Add a column

+

Adding a new column can be more involved. If you need full control, please +see the AstroPy Table documentation. For a quick addition, which might be +sufficient for your use case, we simply use the “dictionary” technique. Please +note that when adding a column, it is important to ensure that all the +elements are of the same type. Also, if you are planning to use that table +in IRAF/PyRAF, we recommend not using 64-bit types.

+
>>> import numpy as np
+
+>>> new_column = [0] * len(ad.REFCAT)
+>>> # Ensure that the type is int32, otherwise it will default to int64
+>>> # which generally not necessary.  Also, IRAF 32-bit does not like it.
+>>> new_column = np.array(new_column).astype(np.int32)
+>>> ad.REFCAT['my_column'] = new_column
+
+
+

If you are going to write that table back to disk as a FITS Bintable, then +some additional headers need to be set. Astrodata will take care of that +under the hood when the write method is invoked.

+
>>> ad.write('myfile_with_modified_table.fits')
+
+
+
+
+
+

2.7.2.2. Selection and Rejection Operations

+

Normally, one does not know exactly where the information needed is located +in a table. Rather some sort of selection needs to be done. This can also +be combined with various calculations. We show two such examples here.

+
+

2.7.2.2.1. Select a table element from criterion

+
>>> # Get the magnitude of a star selected by ID number
+>>> ad.REFCAT['zmag'][ad.REFCAT['Cat_Id'] == '1237662500002005475']
+
+>>> # Get the ID and magnitude of all the stars brighter than zmag 18.
+>>> ad.REFCAT['Cat_Id', 'zmag'][ad.REFCAT['zmag'] < 18.]
+
+
+
+
+

2.7.2.2.2. Rejection and selection before statistics

+
>>> t = ad.REFCAT   # to save typing
+
+>>> # The table has "NaN" values.  ("Not a number")  We need to ignore them.
+>>> t['zmag'].mean()
+nan
+>>> # applying rejection of NaN values:
+>>> t['zmag'][np.where(~np.isnan(t['zmag']))].mean()
+20.377306
+
+
+
+
+
+

2.7.2.3. Accessing FITS table headers directly

+

If for some reason you need to access the FITS table headers directly, here +is how to do it. It is very unlikely that you will need this.

+

To see the FITS headers:

+
>>> ad.REFCAT.meta['header']
+>>> ad[0].OBJCAT.meta['header']
+
+
+

To retrieve a specific FITS table header:

+
>>> ad.REFCAT.meta['header']['TTYPE3']
+'RAJ2000'
+>>> ad[0].OBJCAT.meta['header']['TTYPE3']
+'Y_IMAGE'
+
+
+

To retrieve all the keyword names matching a selection:

+
>>> keynames = [key for key in ad.REFCAT.meta['header'] if key.startswith('TTYPE')]
+
+
+
+
+
+

2.7.3. Create a Table

+

To create a table that can be added to an AstroData object and eventually +written to disk as a FITS file, the first step is to create an Astropy +Table.

+

Let us first add our data to NumPy arrays, one array per column:

+
>>> import numpy as np
+
+>>> snr_id = np.array(['S001', 'S002', 'S003'])
+>>> feii = np.array([780., 78., 179.])
+>>> pabeta = np.array([740., 307., 220.])
+>>> ratio = pabeta / feii
+
+
+

Then build the table from that data:

+
>>> from astropy.table import Table
+
+>>> my_astropy_table = Table([snr_id, feii, pabeta, ratio],
+...                          names=('SNR_ID', 'FeII', 'PaBeta', 'ratio'))
+
+
+

Now we append this Astropy Table to a new AstroData object.

+
>>> # Since we are going to write a FITS, we build the AstroData object
+>>> # from FITS objects.
+>>> from astropy.io import fits
+
+>>> phu = fits.PrimaryHDU()
+>>> ad = astrodata.create(phu)
+>>> ad.MYTABLE = my_astropy_table
+>>> ad.info()
+>>> ad.MYTABLE
+
+>>> ad.write('new_table.fits')
+
+
+
+
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/manuals/usermanual/tags.html b/manuals/usermanual/tags.html new file mode 100644 index 00000000..50d01549 --- /dev/null +++ b/manuals/usermanual/tags.html @@ -0,0 +1,264 @@ + + + + + + + + 2.4. Astrodata Tags — astrodata 3.2.0 documentation + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

2.4. Astrodata Tags

+
+

2.4.1. What are the Astrodata Tags?

+

The Astrodata Tags identify the data represented in the AstroData object. +When a file on disk is opened with AstroData, the headers are inspected to +identify which specific AstroData class needs to be loaded, +AstroDataGmos, +AstroDataNiri, etc. Based on the class the data is +associated with, a list of “tags” will be defined. The tags will tell whether the +file is a flatfield or a dark, if it is a raw dataset, or if it has been processed by the +recipe system, if it is imaging or spectroscopy. The tags will tell the +users and the system what that data is and also give some information about +the processing status.

+

As a side note, the tags are used by DRAGONS Recipe System to match recipes +and primitives to the data.

+
+
+

2.4.2. Using the Astrodata Tags

+

Try it yourself

+

Download the data package (Try it yourself) if you wish to follow along and run the +examples. Then

+
$ cd <path>/ad_usermanual/playground
+$ python
+
+
+

Before doing anything, you need to import AstroData and the Gemini instrument +configuration package (|gemini_instruments|).

+
>>> import astrodata
+>>> import gemini_instruments
+
+
+

Let us open a Gemini dataset and see what tags we get:

+
>>> ad = astrodata.open('../playdata/N20170609S0154.fits')
+>>> ad.tags
+{'RAW', 'GMOS', 'GEMINI', 'NORTH', 'SIDEREAL', 'UNPREPARED', 'IMAGE', 'ACQUISITION'}
+
+
+

The file we loaded is raw, GMOS North data. It is a 2D image and it is an +acquisition image, not a science observation. The “UNPREPARED” tag indicates +that the file has never been touched by the Recipe System which runs a +“prepare” primitive as the first step of each recipe.

+

Let’s try another

+
>>> ad = astrodata.open('../playdata/N20170521S0925_forStack.fits')
+>>> ad.tags
+{'GMOS', 'GEMINI', 'NORTH', 'SIDEREAL', 'OVERSCAN_TRIMMED', 'IMAGE',
+'OVERSCAN_SUBTRACTED', 'PREPARED'}
+
+
+

This file is a science GMOS North image. It has been processed by the +Recipe System. The overscan level has been subtracted and the overscan section +has been trimmed away. The tags do NOT include all the processing steps. Rather, +at least from the time being, it focuses on steps that matter when associating +calibrations.

+

The tags can be used when coding. For example:

+
>>> if 'GMOS' in ad.tags:
+...   print('I am GMOS')
+... else:
+...   print('I am these instead:', ad.tags)
+...
+
+
+

And:

+
>>> if {'IMAGE', 'GMOS'}.issubset(ad.tags):
+...   print('I am a GMOS Image.')
+...
+
+
+
+
+

2.4.3. Using typewalk

+

In DRAGONS, there is a convenience tool that will list the Astrodata tags +for all the FITS file in a directory.

+

To try it, from the shell, not Python, go to the “playdata” directory and +run typewalk:

+
% cd <path>/ad_usermanual/playdata
+% typewalk
+
+directory:  /data/workspace/ad_usermanual/playdata
+ N20170521S0925_forStack.fits ...... (GEMINI) (GMOS) (IMAGE) (NORTH) (OVERSCAN_SUBTRACTED) (OVERSCAN_TRIMMED) (PREPARED) (SIDEREAL)
+ N20170521S0926_forStack.fits ...... (GEMINI) (GMOS) (IMAGE) (NORTH) (OVERSCAN_SUBTRACTED) (OVERSCAN_TRIMMED) (PREPARED) (PROCESSED) (PROCESSED_SCIENCE) (SIDEREAL)
+ N20170609S0154.fits ............... (ACQUISITION) (GEMINI) (GMOS) (IMAGE) (NORTH) (RAW) (SIDEREAL) (UNPREPARED)
+ N20170609S0154_varAdded.fits ...... (ACQUISITION) (GEMINI) (GMOS) (IMAGE) (NORTH) (OVERSCAN_SUBTRACTED) (OVERSCAN_TRIMMED) (PREPARED) (SIDEREAL)
+ estgsS20080220S0078.fits .......... (GEMINI) (GMOS) (LONGSLIT) (LS) (PREPARED) (PROCESSED) (PROCESSED_SCIENCE) (SIDEREAL) (SOUTH) (SPECT)
+ gmosifu_cube.fits ................. (GEMINI) (GMOS) (IFU) (NORTH) (ONESLIT_RED) (PREPARED) (PROCESSED) (PROCESSED_SCIENCE) (SIDEREAL) (SPECT)
+ new154.fits ....................... (ACQUISITION) (GEMINI) (GMOS) (IMAGE) (NORTH) (RAW) (SIDEREAL) (UNPREPARED)
+Done DataSpider.typewalk(..)
+
+
+

typewalk can be used to select specific data based on tags, and even create +lists:

+
% typewalk --tags RAW
+directory:  /data/workspace/ad_usermanual/playdata
+ N20170609S0154.fits ............... (ACQUISITION) (GEMINI) (GMOS) (IMAGE) (NORTH) (RAW) (SIDEREAL) (UNPREPARED)
+ new154.fits ....................... (ACQUISITION) (GEMINI) (GMOS) (IMAGE) (NORTH) (RAW) (SIDEREAL) (UNPREPARED)
+Done DataSpider.typewalk(..)
+
+
+
% typewalk --tags RAW -o rawfiles.lis
+% cat rawfiles.lis
+# Auto-generated by typewalk, vv2.0 (beta)
+# Written: Tue Mar  6 13:06:06 2018
+# Qualifying types: RAW
+# Qualifying logic: AND
+# -----------------------
+/Users/klabrie/data/tutorials/ad_usermanual/playdata/N20170609S0154.fits
+/Users/klabrie/data/tutorials/ad_usermanual/playdata/new154.fits
+
+
+
+
+

2.4.4. Creating New Astrodata Tags [Advanced Topic]

+

For proper and complete instructions on how to create Astrodata Tags and +the AstroData class that hosts the tags, the reader is invited to refer to the +Astrodata Programmer Manual. Here we provide a simple introduction that +might help some readers better understand Astrodata Tags, or serve as a +quick reference for those who have written Astrodata Tags in the past but need +a little refresher.

+

The Astrodata Tags are defined in an AstroData class. The AstroData +class specific to an instrument is located in a separate package, not in +AstroData. For example, for Gemini instruments, all the various AstroData +classes are contained in the |gemini_instruments| package.

+

An Astrodata Tag is a function within the instrument’s AstroData class. +The tag function is distinguished from normal functions by applying the +astro_data_tag() decorator to it. +The tag function returns a astrodata.TagSet.

+

For example:

+
class AstroDataGmos(AstroDataGemini):
+    ...
+    @astro_data_tag
+    def _tag_arc(self):
+        if self.phu.get('OBSTYPE) == 'ARC':
+            return TagSet(['ARC', 'CAL'])
+
+
+

The tag function looks at the headers and if the keyword “OBSTYPE” is set +to “ARC”, the tags “ARC” and “CAL” (for calibration) will be assigned to the +AstroData object.

+

A whole suite of such tag functions is needed to fully characterize all +types of data an instrument can produce.

+

Tags are about what the dataset is, not it’s flavor. The Astrodata +“descriptors” (see the section on Metadata and Headers) will describe the flavor. +For example, tags will say that the data is an image, but the descriptor +will say whether it is B-band or R-band. Tags are used for recipe and +primitive selection. A way to understand the difference between a tag and +a descriptor is in terms of the recipe that will be selected: A GMOS image +will use the same recipe whether it’s a B-band or R-band image. However, +a GMOS longslit spectrum will need a very different recipe. A bias is +reduced differently from a science image, there should be a tag differentiating +a bias from a science image. (There is for GMOS.)

+

For more information on adding to Astrodata, see the Astrodata Programmer +Manual.

+
+
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/objects.inv b/objects.inv new file mode 100644 index 0000000000000000000000000000000000000000..8de029c7563e9bdc8615771d680e840354c2e95f GIT binary patch literal 1804 zcmV+n2lMzNAX9K?X>NERX>N99Zgg*Qc_4OWa&u{KZXhxWBOp+6Z)#;@bUGkmb98cV zWMOn+3L_v^WpZ8b#rNMXCQiPX<{x4c-pO+&2pqR5XbL&3RNXnyvcQMuJtByRh)ILoiimv zGou&~B?)^br@Tg9FHaJE@F5rp7^9OJ(fX-TxBhB@iIAM-L=xPbKUXYoOTa&2($G{K z8J9OlS(QK7_T)#LAky34-0G{lu4h&fA@I+-<0p@a#RU4_kUTe|gFLeQ!;q$dIszx- ztl3ZLXOu|E=}Rl&!yphDr;TJ>#Np95n#2AFgj2%=uG?awJ%tIM{6T1H@rRDd*D6$e(T$%-@aB_k1Zsv_bw ziaS+XO4^j?{VvscG}&V>e?b-@4Oj!5$OtLGI6b6Mm8Bu_7zcE0qi{IH$V(1t-R;MS zBWdEyvuIx=Coz&KlA1)^>LfWt0)cWVV@-s|YwHZSB(#?2D6X}QYJkbw+vngL;gl#R zqj>k8#RN$f5%2%nIBuR z+cPCd{NrxJq02E^Vca|~J9GtUedE6ZwqDv?0aLq?ssuB$7Q)Nx3ZU9dYM~E5ad4aE z@(Sj*488*Rt_}cjzx`!BnwwB5<)la>!OZbsC*-7#8R|$T zm#29HDPy%xD6!9y@$ zKZbZFhbLQU``44bAMV+|b_-9!D&eJM*(>Df%Q*%}?1a!FZS?7*mODWlDiz$1Le#XT z_H9opSvs5<3MKU3g3M#@#p zs^h6#o=I!sbE;71KgQ3Cg>tf`QV!PKlhL%|>GR5>w}X|>Vf!j2Sc)fGYR6zj?-|Hj zSthGnyuUPc`RYhnFHVCt@XY`R+45SXB^7cJ;2Qcst)!*6EI*P(slBXQE|GHqPL?#{ zLbqL>+DSy`T<|eF8|Ml0)crUhWd6A%FHmYfDpI$k6rUQ-4)*$!W7~O@CvN|{@mizJ zn}s!|HX2~2hk7{Gy`lcDMO&7sy4yd*cPM~^E>v$H?@=J54Jv2Znu6frCt6y^8*t-# z$I~{nwCFZ~$Hj@KZ78_T!qoX<#7+b9rgoU+=05IzAYU?v5l*sWdyQ82xiBrXDPqqJ zv|-y@7%8|*V(%@qv>|R9rr$X6v<>+-voO%v?6AE?f&C@Sm~KIM_=zqhIt&>E9P29- z7UwYHLc+1zg1kZ)rnyRqyB}!yqCM;9eCEbqSXC*o(jr`_l=)MD*23Wf`I;J%-0TCr zxQ$Dg)VY#ZPTz>6Zy->n5?G2Obj#_2Io|JCUvvw8(oIh9{-fz8$oMje$T*#H zIH;-SWYCGtPiiicN&oNW2XK65EyueuvLww{qvh?{4z8n9gpVq;3u^zZXJo% zDh55|nV&J0#wP(~fz+C&hkDD#smyxFub>ad7pg0*?VXlvReSoXk(t=vCMpgHL*ncqbw=Q>!$kN zcG5@w+n$SzMLN#x>dZSxbD21OA30=@D=&q4!UrbJ@-hzVVMfoc@!SsM^u5;&d22UB z6T|BweP1`NG#-9yrM~=TK1eE>_515dLT%*ifz-5VOS^y){P6V`)Whw+w$Rf>z1Kx? z$<7A%cP+oHP}y72n&Ky^#wI+U6n&S%;TvNnD-&g!mwCSalM--N0QNQ)X*#*#)K4Z| zAIwb@mMI@8AZ81qy{J!@y-0V ziVyEpXkoTB>N8EBi$X~fO4^ypTq14yvfNX0H0Pwh(Iu7rA5dF-G&*IIaP{lUbG7R^ zneOmc27WxtqYj%pz5v3ryN7D{v$a6nnrTT)oCnsW$26MQgQ7Mo+gdq3%^0} uMXNtBjPcU9bhXr^O3_s5dR0-bJL__(No;5RgvKGIy=uY8Gx{Gw>iw_a7KFb5 literal 0 HcmV?d00001 diff --git a/py-modindex.html b/py-modindex.html new file mode 100644 index 00000000..d090f6de --- /dev/null +++ b/py-modindex.html @@ -0,0 +1,122 @@ + + + + + + + Python Module Index — astrodata 3.2.0 documentation + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ + +

Python Module Index

+ +
+ a +
+ + + + + + + +
 
+ a
+ astrodata +
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/search.html b/search.html new file mode 100644 index 00000000..bce92d8d --- /dev/null +++ b/search.html @@ -0,0 +1,123 @@ + + + + + + + Search — astrodata 3.2.0 documentation + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +

Search

+ + + + +

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

+ + +
+ + + +
+ + + +
+ +
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/searchindex.js b/searchindex.js new file mode 100644 index 00000000..0187b58d --- /dev/null +++ b/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"docnames": ["api/astrodata.AstroData", "api/astrodata.AstroDataError", "api/astrodata.AstroDataMixin", "api/astrodata.NDAstroData", "api/astrodata.Section", "api/astrodata.TagSet", "api/astrodata.add_header_to_table", "api/astrodata.astro_data_descriptor", "api/astrodata.astro_data_tag", "api/astrodata.create", "api/astrodata.from_file", "api/astrodata.open", "api/astrodata.returns_list", "api/astrodata.version", "api_short", "index", "manuals/appendix_descriptors", "manuals/cheatsheet", "manuals/full_api", "manuals/index", "manuals/progmanual/adclass", "manuals/progmanual/containers", "manuals/progmanual/descriptors", "manuals/progmanual/design", "manuals/progmanual/index", "manuals/progmanual/intro", "manuals/progmanual/tags", "manuals/usermanual/data", "manuals/usermanual/headers", "manuals/usermanual/index", "manuals/usermanual/intro", "manuals/usermanual/iomef", "manuals/usermanual/structure", "manuals/usermanual/tables", "manuals/usermanual/tags"], "filenames": ["api/astrodata.AstroData.rst", "api/astrodata.AstroDataError.rst", "api/astrodata.AstroDataMixin.rst", "api/astrodata.NDAstroData.rst", "api/astrodata.Section.rst", "api/astrodata.TagSet.rst", "api/astrodata.add_header_to_table.rst", "api/astrodata.astro_data_descriptor.rst", "api/astrodata.astro_data_tag.rst", "api/astrodata.create.rst", "api/astrodata.from_file.rst", "api/astrodata.open.rst", "api/astrodata.returns_list.rst", "api/astrodata.version.rst", "api_short.rst", "index.rst", "manuals/appendix_descriptors.rst", "manuals/cheatsheet.rst", "manuals/full_api.rst", "manuals/index.rst", "manuals/progmanual/adclass.rst", "manuals/progmanual/containers.rst", "manuals/progmanual/descriptors.rst", "manuals/progmanual/design.rst", "manuals/progmanual/index.rst", "manuals/progmanual/intro.rst", "manuals/progmanual/tags.rst", "manuals/usermanual/data.rst", "manuals/usermanual/headers.rst", "manuals/usermanual/index.rst", "manuals/usermanual/intro.rst", "manuals/usermanual/iomef.rst", "manuals/usermanual/structure.rst", "manuals/usermanual/tables.rst", "manuals/usermanual/tags.rst"], "titles": ["AstroData", "AstroDataError", "AstroDataMixin", "NDAstroData", "Section", "TagSet", "add_header_to_table", "astro_data_descriptor", "astro_data_tag", "create", "from_file", "open", "returns_list", "version", "Common API for Users", "astrodata Documentation", "List of Gemini Standard Descriptors", "1. Cheat Sheet", "4. Reference API", "Astrodata Manual", "3.3. AstroData and Derivatives", "3.4. Data Containers", "3.6. Descriptors", "3.2. General Design", "3. Programmer\u2019s Manual", "3.1. Precedents and Motivation", "3.5. Tags", "2.6. Pixel Data", "2.5. Metadata and Headers", "2. User Manual", "2.1. Introduction", "2.3. Input and Output Operations and Extension Manipulation - MEF", "2.2. The AstroData Object", "2.7. Table Data", "2.4. Astrodata Tags"], "terms": {"astrodataerror": [0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34], "astrodatamixin": [0, 1, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34], "ndastrodata": [0, 1, 2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34], "section": [0, 1, 2, 3, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 28, 29, 30, 31, 32, 33, 34], "tagset": [0, 1, 2, 3, 4, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34], "astro_data_descriptor": [0, 1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34], "astro_data_tag": [0, 1, 2, 3, 4, 5, 6, 7, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34], "creat": [0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 11, 12, 13, 14, 15, 16, 18, 19, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 32], "open": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 32, 33, 34], "return_list": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34], "version": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34], "user": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 30, 31, 32, 33, 34], "guid": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34], "develop": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34], "class": [0, 1, 2, 3, 4, 5, 7, 8, 16, 17, 21, 23, 27, 28, 30, 31, 33, 34], "nddata": [0, 2, 3, 21, 23, 27, 28, 31, 32], "none": [0, 3, 4, 5, 8, 17, 20, 26, 28, 31], "tabl": [0, 6, 21, 22, 28, 29, 30, 32], "phu": [0, 17, 20, 22, 23, 26, 28, 31, 32, 33, 34], "indic": [0, 20, 27, 28, 31, 34], "is_singl": [0, 28], "fals": [0, 3, 13, 27, 32], "sourc": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 17, 20, 28, 31], "base": [0, 2, 3, 4, 5, 13, 17, 20, 21, 27, 31, 34], "object": [0, 2, 3, 4, 9, 10, 11, 16, 20, 21, 22, 23, 28, 29, 30, 33, 34], "softwar": [0, 17, 25, 30], "packag": [0, 17, 21, 23, 25, 28, 29, 30, 31, 32, 33, 34], "It": [0, 3, 5, 7, 8, 14, 20, 21, 23, 26, 27, 30, 31, 32, 33, 34], "provid": [0, 3, 14, 19, 20, 21, 22, 23, 25, 27, 28, 30, 34], "an": [0, 2, 3, 7, 8, 9, 10, 11, 14, 17, 21, 22, 23, 24, 25, 26, 27, 28, 32, 33, 34], "interfac": [0, 3, 14, 17, 20, 21, 22, 23, 27, 28, 30, 31, 33], "manipul": [0, 20, 25, 29, 30], "astronom": [0, 14, 23, 30], "data": [0, 2, 3, 9, 14, 16, 20, 23, 24, 25, 28, 29, 30, 32, 34], "set": [0, 3, 5, 16, 17, 20, 21, 22, 26, 27, 28, 30, 33, 34], "paramet": [0, 3, 4, 7, 8, 12, 20], "list": [0, 3, 4, 5, 7, 12, 17, 19, 20, 22, 26, 27, 28, 30, 31, 32, 33, 34], "dict": [0, 2, 3, 20, 21], "name": [0, 5, 16, 17, 20, 22, 23, 26, 28, 30, 31, 32, 33], "astropi": [0, 3, 17, 21, 23, 28, 29, 30, 31, 32, 33], "io": [0, 3, 17, 21, 28, 31, 32, 33], "fit": [0, 2, 3, 6, 16, 17, 20, 21, 22, 23, 25, 26, 27, 28, 30, 32, 34], "header": [0, 6, 14, 20, 22, 23, 27, 29, 30, 32, 34], "primari": [0, 20, 23, 28, 31, 32], "int": [0, 16, 20, 28], "map": [0, 17, 20, 21, 22, 27, 28, 31, 32], "thi": [0, 2, 3, 5, 7, 12, 14, 15, 16, 17, 19, 20, 21, 22, 23, 25, 26, 27, 28, 30, 31, 32, 33, 34], "access": [0, 2, 3, 20, 21, 23, 27, 29, 30, 32], "i": [0, 1, 2, 3, 4, 5, 12, 14, 15, 16, 17, 20, 21, 22, 23, 26, 27, 28, 29, 31, 32, 33, 34], "us": [0, 3, 5, 7, 11, 12, 16, 17, 20, 21, 22, 23, 26, 28, 29, 30, 31, 32, 33], "when": [0, 1, 3, 12, 17, 20, 21, 26, 27, 28, 30, 31, 32, 33, 34], "slice": [0, 2, 3, 4, 12, 20, 21, 22, 23, 27, 31, 32], "have": [0, 17, 20, 21, 23, 26, 27, 28, 30, 31, 34], "from": [0, 2, 3, 4, 5, 9, 10, 11, 16, 17, 20, 21, 22, 23, 25, 26, 28, 29, 30, 32, 34], "its": [0, 3, 20, 22, 23, 25, 26, 27, 30, 31, 32], "parent": [0, 21, 23], "through": [0, 17, 20, 27, 30, 31, 32, 33], "attribut": [0, 2, 3, 4, 5, 14, 16, 17, 21, 27, 29, 31, 32, 33], "summari": [0, 2, 3, 4], "method": [0, 3, 4, 5, 7, 8, 12, 14, 20, 21, 22, 26, 27, 31, 32, 33], "document": [0, 2, 3, 4, 5, 25, 27, 31, 33], "A": [0, 2, 3, 4, 8, 12, 16, 17, 19, 20, 21, 22, 23, 27, 28, 29, 34], "arrai": [0, 3, 16, 17, 21, 27, 28, 32, 33], "singl": [0, 12, 14, 22, 23, 26, 28], "correspond": [0, 28, 31], "scienc": [0, 16, 17, 20, 23, 25, 27, 32, 34], "attach": [0, 17, 31, 32], "each": [0, 4, 17, 20, 22, 23, 26, 27, 28, 30, 31, 32, 34], "extens": [0, 12, 14, 20, 22, 23, 25, 27, 28, 29, 30, 33], "descriptor": [0, 7, 12, 19, 20, 23, 24, 27, 29, 31, 34], "return": [0, 2, 3, 4, 5, 7, 8, 9, 10, 11, 12, 13, 16, 20, 21, 22, 26, 27, 28, 31, 32, 34], "sequenc": [0, 8, 31], "been": [0, 20, 23, 26, 27, 28, 30, 31, 32, 34], "decor": [0, 7, 8, 12, 20, 22, 26, 28, 34], "type": [0, 5, 7, 8, 12, 13, 16, 17, 26, 27, 28, 30, 31, 32, 33, 34], "tupl": [0, 4, 5, 16, 26, 27], "str": [0, 5, 13, 16, 17, 33], "expos": [0, 16, 21, 27], "collect": [0, 26], "string": [0, 4, 8, 20, 27, 28], "can": [0, 2, 3, 4, 5, 8, 12, 17, 20, 21, 22, 23, 26, 27, 28, 30, 31, 33, 34], "directli": [0, 20, 27, 31, 32], "instanc": [0, 3, 5, 20, 21, 23, 26, 28], "ar": [0, 2, 3, 4, 5, 14, 16, 17, 20, 21, 22, 23, 26, 27, 28, 29, 30, 31, 32, 33], "part": [0, 8, 21, 23, 28, 30], "standard": [0, 3, 19, 20, 21, 26, 27, 28, 31, 32], "e": [0, 3, 16, 20, 21, 22, 23, 31], "ad": [0, 3, 5, 16, 17, 20, 21, 23, 26, 29, 30, 31, 32, 33, 34], "dynam": 0, "exampl": [0, 3, 5, 7, 16, 17, 20, 22, 23, 26, 28, 30, 32, 33, 34], "0": [0, 3, 4, 16, 17, 20, 25, 27, 28, 31, 32, 33, 34], "objmask": [0, 2, 17, 31, 32], "objcat": [0, 17, 31, 32, 33], "ext_tabl": 0, "associ": [0, 16, 17, 27, 28, 30, 32, 33, 34], "filenam": [0, 17, 27, 31, 32], "file": [0, 10, 11, 16, 17, 20, 21, 22, 23, 25, 27, 28, 29, 30, 32, 33, 34], "hdr": [0, 17, 20, 27, 28, 31, 32], "all": [0, 3, 5, 16, 17, 20, 23, 26, 27, 28, 30, 32, 33, 34], "fitsheadercollect": 0, "deprec": [0, 4, 11, 20], "instead": [0, 3, 20, 27, 31, 34], "id": [0, 16, 33], "identifi": [0, 16, 20, 34], "1": [0, 3, 4, 16, 17, 20, 23, 25, 26, 27, 28, 31, 32, 33], "number": [0, 4, 13, 16, 20, 21, 22, 25, 27, 28, 31, 33], "is_slic": 0, "If": [0, 3, 4, 7, 8, 14, 17, 20, 22, 26, 27, 28, 30, 31, 32, 33], "repres": [0, 3, 16, 17, 20, 21, 23, 27, 28, 30, 32, 33, 34], "whole": [0, 16, 17, 27, 31, 34], "dataset": [0, 20, 27, 28, 29, 30, 34], "out": [0, 17, 20, 21, 23, 26, 27], "true": [0, 3, 4, 17, 20, 27, 28], "mask": [0, 2, 3, 16, 17, 20, 21, 27, 31, 32], "For": [0, 9, 10, 16, 20, 26, 27, 28, 30, 31, 32, 33, 34], "miss": [0, 26], "onli": [0, 3, 5, 12, 16, 20, 21, 22, 23, 26, 27, 28, 30, 31, 32], "And": [0, 34], "orig_filenam": 0, "origin": [0, 20, 21, 27, 31], "befor": [0, 17, 20, 26, 27, 31, 34], "wa": [0, 16, 21, 23, 25, 27, 31, 32], "modifi": [0, 2, 7, 20, 21, 27, 29, 30, 32], "path": [0, 17, 27, 28, 30, 31, 32, 33, 34], "shape": [0, 2, 4, 21, 27, 31], "top": [0, 7, 23, 27, 32], "level": [0, 16, 19, 20, 23, 25, 27, 32, 34], "tag": [0, 5, 7, 8, 13, 23, 24, 27, 28, 29, 31, 32], "defin": [0, 3, 4, 16, 17, 20, 28, 31, 34], "uncertainti": [0, 2, 3, 21, 23], "The": [0, 2, 3, 4, 5, 7, 8, 12, 17, 19, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 33, 34], "": [0, 13, 16, 17, 19, 20, 21, 23, 26, 27, 28, 30, 31, 32, 33, 34], "nduncertainti": [0, 3, 21], "where": [0, 3, 16, 17, 20, 22, 23, 26, 27, 30, 31, 33], "inform": [0, 14, 16, 17, 19, 20, 23, 27, 28, 29, 30, 31, 33, 34], "avail": [0, 17, 20, 27, 28], "varianc": [0, 2, 3, 17, 20, 21, 29, 31, 32], "actual": [0, 3, 20, 22, 26, 28], "support": [0, 3, 23, 25, 27, 29], "under": [0, 20, 21, 31, 33], "hood": [0, 20, 33], "wc": [0, 2, 3, 16, 21, 27, 28, 31, 32], "add": [0, 3, 5, 6, 14, 16, 17, 20, 21, 26, 27, 28, 30, 31], "oper": [0, 3, 12, 19, 20, 21, 23, 29, 30], "perform": [0, 5, 20, 23], "inplac": 0, "addit": [0, 2, 20, 21, 23, 26, 27, 28, 31, 33], "evalu": 0, "self": [0, 4, 20, 23, 26, 28, 34], "operand": 0, "append": [0, 17, 20, 33], "ext": [0, 17, 27, 28], "new": [0, 3, 5, 20, 21, 23, 25, 27, 29, 30, 33], "other": [0, 2, 5, 7, 20, 21, 22, 23, 26, 28, 30, 31, 32], "content": [0, 2, 3, 17, 20, 26, 27, 28, 32, 33], "exact": 0, "accept": [0, 20, 28], "depend": [0, 26, 27, 28, 30], "implement": [0, 3, 9, 10, 20, 22, 23, 25, 27, 28, 30, 31], "specif": [0, 3, 17, 20, 23, 26, 27, 28, 29, 30, 31, 33, 34], "certain": [0, 20, 21, 26], "format": [0, 13, 14, 17, 20, 23, 27, 31, 32], "mai": [0, 20, 21, 23, 26, 31], "special": [0, 20, 25, 28, 31], "eg": [0, 3, 16, 28, 32], "imagehdu": [0, 3, 17, 31], "extract": [0, 2, 20, 22, 27], "option": [0, 3, 5, 31], "typic": [0, 20, 22, 27], "ignor": [0, 21, 26, 33], "global": [0, 5, 17, 29, 31, 33], "requir": [0, 20, 21, 23, 26, 27, 30, 31], "cannot": [0, 20, 28], "deriv": [0, 8, 21, 24, 26], "metadata": [0, 20, 22, 23, 29, 30, 32, 34], "you": [0, 3, 5, 12, 14, 17, 20, 26, 27, 28, 30, 31, 32, 33, 34], "one": [0, 5, 7, 12, 14, 16, 20, 22, 23, 26, 27, 28, 30, 32, 33], "consist": [0, 8, 20, 23], "combin": [0, 2, 5, 7, 16, 21, 27, 28, 33], "letter": 0, "restrict": [0, 26], "capit": 0, "first": [0, 17, 20, 21, 22, 26, 27, 28, 31, 32, 33, 34], "charact": [0, 22], "z": 0, "z0": 0, "9": [0, 27, 33], "same": [0, 4, 20, 21, 22, 23, 26, 27, 28, 30, 31, 32, 33, 34], "necessari": [0, 20, 27, 31, 33], "convert": [0, 8, 31], "more": [0, 2, 14, 20, 21, 22, 23, 26, 27, 28, 30, 31, 32, 33, 34], "suitabl": [0, 20], "intern": [0, 3, 20, 21, 23, 30, 31, 32], "rais": [0, 1, 3, 22], "typeerror": 0, "invalid": 0, "situat": 0, "valueerror": [0, 3, 28], "proper": [0, 21, 28, 34], "valu": [0, 4, 8, 12, 16, 17, 20, 21, 22, 23, 26, 27, 28], "illeg": 0, "somehow": [0, 26], "crop": [0, 27], "x1": [0, 4, 27], "y1": [0, 4, 27], "x2": [0, 4, 27], "y2": [0, 4, 27], "given": [0, 4, 16, 21, 27, 31], "minimum": [0, 20, 27], "maximum": [0, 27, 28], "x": [0, 16, 27, 28], "y": [0, 16, 27, 31], "axi": [0, 16, 27, 28, 31], "divid": [0, 3, 27, 32], "divis": [0, 27], "info": [0, 17, 20, 27, 31, 32, 33], "print": [0, 16, 17, 27, 28, 34], "about": [0, 20, 23, 26, 27, 30, 32, 34], "instrument": [0, 16, 17, 20, 22, 23, 26, 28, 30, 31, 34], "make": [0, 20, 21, 23, 26, 27, 30, 31, 32], "observ": [0, 16, 22, 23, 26, 28, 30, 34], "is_sett": 0, "attr": 0, "meant": [0, 3, 20], "classmethod": [0, 20], "load": [0, 3, 17, 20, 21, 25, 31, 32, 34], "extname_pars": [0, 20], "read": [0, 3, 5, 16, 20, 21, 22, 23, 27, 30, 32], "hdulist": [0, 20], "etc": [0, 20, 22, 32, 34], "multipli": [0, 3, 17, 27, 28], "multipl": [0, 16, 17, 20, 23, 27, 28, 33], "being": [0, 2, 5, 16, 20, 26, 27, 28, 34], "arg": [0, 4, 9, 10, 11], "kwarg": [0, 4, 9, 10, 11], "appli": [0, 5, 7, 16, 20, 21, 23, 26, 27, 28, 31, 32, 33, 34], "function": [0, 8, 12, 16, 20, 21, 22, 27, 28, 32, 34], "main": [0, 20, 21, 23, 27, 31], "replac": [0, 3, 20, 21, 33], "result": [0, 2, 20, 21, 23, 26, 27, 30], "pass": [0, 16, 20, 26], "argument": [0, 5, 26, 28, 31], "too": [0, 20, 23, 27, 28, 30, 31, 33], "thei": [0, 3, 8, 20, 22, 23, 26, 27, 28, 31, 32], "exist": [0, 20, 22, 26, 29], "conveni": [0, 2, 3, 20, 21, 32, 34], "which": [0, 3, 5, 14, 20, 21, 22, 23, 25, 26, 27, 28, 30, 31, 32, 33, 34], "equival": [0, 27, 32], "advantag": [0, 27], "work": [0, 3, 20, 25, 26, 27, 28, 30, 33], "callabl": [0, 21], "take": [0, 20, 22, 27, 31, 33], "mayb": [0, 31], "import": [0, 2, 3, 16, 20, 21, 27, 28, 29, 30, 32, 33, 34], "numpi": [0, 3, 17, 29, 30, 31, 33], "np": [0, 3, 17, 27, 31, 33], "squeez": 0, "reset": [0, 3, 27], "check": [0, 21, 26, 27, 28, 30, 31], "whether": [0, 4, 16, 26, 30, 34], "ndarrai": [0, 17, 31, 32], "assign": [0, 16, 17, 20, 23, 27, 31, 33, 34], "sci": [0, 17, 20, 28, 31], "dq": [0, 17, 20, 31], "var": [0, 17, 20, 27, 31], "bool": [0, 3, 16], "attempt": [0, 3], "made": [0, 25], "someth": [0, 17, 26, 27, 31], "than": [0, 20, 27, 28, 32, 33], "don": [0, 20, 31], "t": [0, 3, 5, 7, 17, 20, 21, 28, 31, 33], "OR": [0, 27], "call": [0, 20, 23, 27, 28, 31], "isn": 0, "subtract": [0, 3, 23, 26, 34], "dictionari": [0, 3, 20, 31, 32, 33], "note": [0, 3, 16, 20, 26, 27, 29, 30, 33, 34], "_copy_": 0, "so": [0, 4, 14, 17, 20, 26, 27, 30, 31], "them": [0, 2, 3, 5, 20, 23, 26, 27, 32, 33], "affect": [0, 21, 26, 30], "ones": [0, 3, 20, 26, 31], "telescop": [0, 16, 20, 27], "update_filenam": 0, "prefix": [0, 20], "suffix": 0, "strip": 0, "updat": [0, 20, 29, 32], "specifi": [0, 3, 4, 20, 26, 31], "simpli": [0, 22, 23, 25, 27, 28, 31, 32, 33], "prepend": [0, 31], "current": [0, 26, 30, 31], "broken": [0, 21], "down": 0, "root": 0, "orignam": 0, "keyword": [0, 16, 20, 22, 23, 28, 32, 33, 34], "contain": [0, 3, 4, 5, 14, 17, 20, 23, 24, 26, 27, 28, 30, 31, 32, 34], "within": [0, 4, 16, 25, 28, 31, 34], "otherwis": [0, 3, 4, 20, 22, 33], "split": [0, 20, 28], "last": [0, 7, 17, 30, 31], "underscor": [0, 20], "after": [0, 3, 17, 26, 27, 28, 31], "No": [0, 27, 31], "leav": [0, 27, 31], "alon": 0, "determin": [0, 4, 20, 22, 32], "write": [0, 3, 23, 24, 27, 29, 30, 33], "overwrit": [0, 17, 31], "disk": [0, 23, 27, 29, 30, 32, 33, 34], "astrodata": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 16, 18, 21, 22, 23, 24, 25, 26, 29], "except": [1, 20, 22, 26, 28], "problem": [1, 21, 31], "mixin": [2, 3, 21], "like": [2, 3, 5, 14, 17, 20, 21, 26, 27, 28, 30, 31, 32, 33], "spectrum1d": [2, 21], "enabl": 2, "behav": 2, "similarli": [2, 27], "These": [2, 20, 21, 23, 26, 27, 30, 32], "behavior": [2, 20, 21, 27], "bitwis": [2, 27], "logic": [2, 12, 20, 22, 26, 34], "sinc": [2, 16, 21, 22, 23, 27, 32, 33], "individu": [2, 20, 21, 22, 26, 32], "bit": [2, 20, 21, 27, 28, 30, 32, 33], "must": [2, 7, 14, 16, 20, 27], "gwc": [2, 3, 21, 27, 28], "model": [2, 16, 31], "There": [2, 3, 20, 27, 28, 31, 34], "settabl": 2, "meta": [2, 3, 17, 21, 23, 27, 31, 32, 33], "size": [2, 4, 27, 33], "properti": [2, 3, 21, 22, 24], "inhertit": 2, "see": [2, 3, 4, 9, 10, 14, 16, 17, 20, 27, 28, 31, 32, 33, 34], "detail": [2, 9, 10, 20, 23, 25, 27, 30, 31], "unit": [3, 21, 23, 27, 28, 31, 32], "copi": [3, 17, 22, 27], "ndarithmeticmixin": [3, 21], "ndslicingmixin": [3, 21], "plu": [3, 21, 23, 31], "some": [3, 17, 20, 22, 23, 25, 26, 27, 28, 30, 31, 32, 33, 34], "registri": [3, 20], "also": [3, 5, 16, 17, 20, 21, 22, 23, 26, 27, 28, 30, 31, 32, 33, 34], "index": [3, 4, 15, 16, 17, 20, 27, 31, 32, 33], "simpl": [3, 20, 22, 26, 28, 31, 34], "arithmet": [3, 20, 21, 28, 29], "veri": [3, 20, 21, 23, 27, 32, 33, 34], "differ": [3, 19, 20, 21, 22, 23, 26, 27, 28, 30, 31, 32, 34], "between": [3, 20, 22, 23, 27, 28, 34], "former": [3, 22], "lazili": 3, "let": [3, 17, 20, 22, 26, 27, 28, 30, 31, 32, 33, 34], "initi": [3, 5, 20, 21, 27], "our": [3, 17, 20, 21, 26, 27, 28, 31, 33], "allow": [3, 5, 20, 21, 22, 25, 26, 27, 28, 31], "possibl": [3, 21, 27, 28, 31], "nddatabas": 3, "stddevuncertainti": 3, "3": [3, 17, 20, 25, 27, 28, 30, 31, 32], "dtype": [3, 27], "float": [3, 16, 28], "ndd1": 3, "ndd2": 3, "ndd3": 3, "2": [3, 17, 20, 23, 25, 27, 28, 30, 31, 32], "41421356": 3, "complet": [3, 26, 27, 28, 31, 34], "But": [3, 20, 26, 27, 28], "ndd4": 3, "descript": [3, 14, 20, 28], "how": [3, 17, 19, 20, 21, 22, 23, 25, 26, 27, 28, 30, 31, 32, 33, 34], "memmap": 3, "hold": [3, 20], "referenc": 3, "default": [3, 17, 21, 26, 33], "both": [3, 4, 20, 23, 25, 31], "mutual": 3, "exclus": 3, "transpos": 3, "raw": [3, 17, 20, 22, 23, 27, 31, 34], "store": [3, 14, 16, 17, 20, 21, 23, 27, 28, 30, 31, 32, 33], "setter": 3, "get": [3, 16, 17, 20, 26, 27, 28, 30, 33, 34], "squar": 3, "deviat": [3, 27, 32], "window": [3, 21, 27], "lazi": [3, 21], "whenev": [3, 21, 28], "ndwindow": [3, 21], "__getitem__": [3, 20], "bracket": 3, "ultim": 3, "ndwindowingastrodata": [3, 21], "100": [3, 17, 27, 31], "200": 3, "set_sect": 3, "input_data": 3, "prevent": [3, 5, 20, 26], "fragment": [3, 21], "python": [3, 16, 20, 21, 25, 26, 27, 28, 30, 31, 32, 33, 34], "heap": 3, "reus": [3, 22], "structur": [3, 5, 20, 27, 31, 32], "area": [3, 17, 27], "need": [3, 17, 20, 21, 22, 23, 26, 27, 28, 30, 32, 33, 34], "least": [3, 34], "Their": [3, 20], "entir": [3, 4, 22, 23, 26, 27, 28], "def": [3, 20, 26, 28, 34], "setup": 3, "sec": 3, "zero": [3, 17, 27, 33], "handl": [4, 20, 21, 23, 31], "n": [4, 17, 20, 27, 30, 31, 32], "dimension": [4, 27], "axis_dict": 4, "ndim": 4, "dimens": [4, 17, 27, 31, 32], "asirafsect": 4, "as_iraf_sect": 4, "produc": [4, 7, 8, 20, 21, 23, 25, 27, 28, 34], "style": 4, "end": [4, 20, 26, 31], "inclus": 4, "asslic": 4, "add_dim": 4, "higher": [4, 20, 27], "achiev": [4, 21], "suppli": 4, "static": [4, 20], "from_shap": 4, "from_str": 4, "invers": 4, "__str__": 4, "is_same_s": 4, "overlap": [4, 27, 32], "two": [4, 20, 21, 26, 27, 30, 31, 32, 33], "common": [4, 12, 15, 16, 19, 20, 22, 26, 27, 31, 33], "shift": 4, "direct": [4, 21, 28, 30, 31], "amount": [4, 26], "remov": [5, 20, 26, 27], "blocked_bi": [5, 26], "block": [5, 20, 26, 31], "if_pres": [5, 26], "action": [5, 27], "should": [5, 12, 17, 20, 22, 23, 27, 28, 30, 31, 32, 33, 34], "ani": [5, 7, 8, 16, 20, 21, 22, 26, 27, 28, 31, 32], "complex": [5, 21, 22, 23, 26, 28], "gener": [5, 16, 20, 22, 24, 26, 27, 28, 33, 34], "algorithm": [5, 20, 26, 28], "want": [5, 20, 26, 27, 30, 31], "better": [5, 20, 26, 27, 28, 34], "understand": [5, 20, 26, 28, 31, 34], "interact": [5, 27, 28, 30], "simplest": [5, 27], "though": [5, 20, 23, 27, 31], "tend": 5, "just": [5, 17, 20, 21, 22, 26, 27, 30, 31, 32], "posit": [5, 16, 26], "order": [5, 20, 22, 26, 27, 31, 32], "below": [5, 16, 17, 20, 27, 28, 31], "won": [5, 20, 21], "present": [5, 17, 26, 27, 30, 31, 32, 33], "bia": [5, 26, 34], "cal": [5, 26, 34], "fn": [7, 8, 12], "mark": [7, 8, 20, 22, 27, 31], "ie": [7, 28], "doesn": 7, "wai": [7, 17, 20, 21, 22, 23, 26, 27, 28, 30, 31, 32, 33, 34], "wrapper": [7, 8], "system": [8, 14, 16, 20, 23, 25, 26, 27, 29, 30, 31, 32, 34], "wrap": [8, 21, 30], "around": [8, 21, 26, 27], "ensur": [8, 12, 20, 22, 26, 28, 33], "turn": [8, 20, 21, 22], "empti": [8, 20, 26], "create_from_scratch": 9, "get_astro_data": 10, "from_fil": 11, "per": [12, 16, 22, 28, 33], "vice": 12, "versa": 12, "case": [12, 17, 23, 26, 31, 32, 33], "simplifi": [12, 20, 22, 25], "your": [12, 27, 30, 31, 33], "short": [13, 16, 28], "dragon": [13, 20, 21, 23, 25, 34], "api": [13, 15, 19, 20, 22, 23], "featur": [13, 20, 23, 25, 27], "bug": [13, 30], "regardless": [14, 28], "would": [14, 20, 21, 26, 27, 31, 32], "interest": [14, 16, 27, 28, 32], "abstract": [14, 20, 22, 23, 25], "layer": [14, 25, 31, 32], "pars": [14, 30], "To": [14, 16, 17, 21, 26, 27, 28, 30, 31, 32, 33, 34], "do": [14, 17, 20, 21, 22, 27, 28, 30, 31, 33, 34], "subclass": [14, 21, 23, 27, 31, 32], "accordingli": 14, "receiv": 14, "manual": [15, 23, 25, 27, 28, 30, 31, 34], "modul": [15, 20, 26, 27], "search": [15, 30], "page": [15, 27], "run": [16, 17, 27, 28, 30, 31, 32, 33, 34], "re": [16, 20, 26, 27, 28], "primit": [16, 31, 34], "input": [16, 20, 22, 29, 30, 32], "serv": [16, 26, 28, 34], "observatori": [16, 23, 25, 30], "archiv": 16, "goa": 16, "gemini_instru": [16, 17, 20, 22, 27, 28, 30, 31, 32, 33, 34], "playdata": [16, 17, 27, 28, 30, 31, 32, 33, 34], "n20170609s0154": [16, 17, 27, 28, 31, 34], "airmass": [16, 17, 22, 28], "amp_read_area": [16, 17, 20, 28], "ao_se": [16, 17, 28], "well_depth_set": 16, "getattr": 16, "shuffle_pixel": 16, "gmo": [16, 17, 20, 22, 26, 27, 28, 31, 32, 34], "offer": [16, 17, 20, 27, 30], "nod": 16, "shuffl": 16, "mode": [16, 21, 27, 28, 30], "definit": [16, 27, 28, 30], "desc": 16, "amplifi": [16, 32], "rel": [16, 26], "detector": [16, 22, 23], "estim": 16, "natur": [16, 21, 27, 28, 31], "calcul": [16, 20, 27, 33], "adapt": [16, 20], "optic": 16, "array_nam": [16, 20], "array_sect": [16, 20, 31], "cover": [16, 17, 27, 30, 31, 32, 33], "pixel": [16, 28, 29, 30, 32], "frame": [16, 23, 26, 27], "g": [16, 17, 20, 21, 22, 23, 28, 31], "amp": 16, "ccd": [16, 23, 27, 28], "namedtupl": 16, "azimuth": 16, "point": [16, 20, 26, 30, 31, 32], "degre": [16, 21, 27], "calibration_kei": 16, "kei": [16, 17, 23, 27, 31, 32, 33], "databas": [16, 30], "getprocess": 16, "previou": [16, 26, 27, 30, 31], "calibr": [16, 28, 30, 32, 34], "camera": 16, "cass_rotator_pa": 16, "angl": [16, 27], "cassegrain": 16, "rotat": 16, "central_wavelength": 16, "central": [16, 20], "wavelength": [16, 20, 27, 28, 32], "meter": 16, "coadd": 16, "co": [16, 29], "data_label": 16, "label": 16, "data_sect": [16, 27], "sky": [16, 27], "fall": [16, 28], "dec": [16, 32], "declin": 16, "center": [16, 25, 27], "field": [16, 27, 32], "decker": 16, "detector_nam": 16, "detector_roi_set": 16, "human": 16, "readabl": [16, 20, 22, 27], "region": [16, 23], "roi": 16, "detector_rois_request": 16, "detector_sect": [16, 20], "mosaic": [16, 28], "detector_x_bin": [16, 28], "bin": [16, 28, 30], "detector_x_offset": 16, "offset": 16, "along": [16, 21, 25, 27, 28, 30, 31, 32, 33, 34], "detector_y_bin": 16, "detector_y_offset": 16, "dispers": 16, "dispersion_axi": 16, "effective_wavelength": 16, "bandpass": 16, "spectrum": [16, 27, 34], "coverag": 16, "elev": 16, "exposure_tim": [16, 23, 27, 28], "exposur": [16, 23, 28], "time": [16, 20, 23, 25, 27, 28, 30, 34], "second": [16, 27, 31, 32], "filter_nam": [16, 17, 28, 31], "filter": [16, 20, 28], "focal_plane_mask": 16, "focal": 16, "plane": [16, 17, 20, 21, 29, 31, 32], "gain": [16, 17, 22, 27, 28, 32], "electron": 16, "adu": [16, 27], "gain_set": 16, "low": 16, "high": [16, 20, 21, 23, 25], "gcal_lamp": 16, "gcal": 16, "lamp": 16, "off": [16, 27], "group_id": 16, "group": [16, 20], "compat": [16, 20, 21, 32], "is_ao": 16, "is_coadds_sum": 16, "sum": [16, 27], "averag": [16, 27], "local_tim": 16, "local": [16, 30], "datetim": 16, "lyot_stop": 16, "lyot": 16, "stop": [16, 26, 27], "mdf_row_id": 16, "row": [16, 17, 27, 28], "cut": [16, 27], "mo": 16, "xd": 16, "nod_count": 16, "b": [16, 28, 34], "nod_offset": 16, "arcsecond": 16, "nominal_atmospheric_extinct": 16, "nomim": 16, "atmospher": 16, "extinct": 16, "nominal_photometric_zeropoint": 16, "nomin": 16, "photometr": 16, "zeropoint": 16, "non_linear_level": 16, "lower": [16, 27], "boundari": 16, "non": [16, 26, 27], "linear": [16, 27], "regim": 16, "target": 16, "enter": 16, "observation_class": 16, "acq": 16, "daycal": 16, "observation_epoch": 16, "epoch": 16, "observation_id": 16, "observation_typ": 16, "flat": 16, "arc": [16, 34], "overscan_sect": [16, 27], "overscan": [16, 17, 23, 34], "pixel_scal": [16, 28], "scale": [16, 21, 27], "arcsec": 16, "program_id": 16, "program": [16, 20, 25, 27], "pupil_mask": 16, "pupil": 16, "qa_stat": 16, "qualiti": [16, 23, 28, 29, 31, 32], "assess": 16, "state": 16, "usabl": [16, 28], "fail": 16, "ra": [16, 32], "right": [16, 27], "ascens": 16, "raw_bg": 16, "background": 16, "band": [16, 27, 34], "raw_cc": 16, "cloud": 16, "raw_iq": 16, "imag": [16, 17, 20, 21, 25, 26, 27, 28, 31, 32, 33, 34], "raw_wv": 16, "water": 16, "vapor": 16, "read_mod": 16, "read_nois": 16, "nois": [16, 27], "read_speed_set": 16, "slow": [16, 27], "fast": [16, 20, 31], "requested_bg": 16, "pi": 16, "request": [16, 27, 28, 33], "requested_cc": 16, "requested_iq": 16, "requested_wv": 16, "saturation_level": 16, "satur": [16, 27], "charg": 16, "slit": 16, "target_dec": 16, "target_ra": 16, "telescope_x_offset": 16, "telescope_y_offset": 16, "ut_dat": 16, "ut": 16, "date": [16, 22], "ut_datetim": 16, "ut_tim": 16, "wavefront_sensor": 16, "wavefront": 16, "sensor": 16, "wavelength_band": 16, "wcs_dec": 16, "In": [16, 17, 20, 21, 22, 23, 25, 26, 27, 28, 30, 31, 32, 33, 34], "wcs_ra": 16, "well": [16, 21, 23, 25, 27], "depth": 16, "shallow": 16, "deep": 16, "pipe": [17, 19, 24, 29], "105_astrodatacheatsheet": 17, "download": [17, 27, 28, 30, 31, 32, 33, 34], "wish": [17, 20, 23, 27, 28, 30, 31, 32, 33, 34], "includ": [17, 20, 23, 27, 30, 34], "http": [17, 23, 25, 27, 30, 33], "www": [17, 23, 27, 30], "gemini": [17, 19, 20, 22, 23, 25, 26, 27, 28, 30, 31, 32, 33, 34], "edu": [17, 23, 30], "sciop": [17, 30], "datapkg": [17, 30], "ad_usermanual_datapkg": [17, 30], "v1": [17, 30], "tar": [17, 30], "unpack": [17, 30], "cd": [17, 27, 28, 30, 31, 32, 33, 34], "somewhere_conveni": [17, 30], "xvf": [17, 30], "bunzip2": [17, 30], "ad_usermanu": [17, 27, 28, 30, 31, 32, 33, 34], "bz2": [17, 30], "Then": [17, 26, 27, 28, 30, 31, 32, 33, 34], "go": [17, 26, 27, 30, 31, 33, 34], "playground": [17, 27, 28, 30, 31, 32, 33, 34], "directori": [17, 20, 30, 31, 34], "new154": [17, 31, 34], "adnew": [17, 27, 31], "describ": [17, 20, 21, 23, 26, 28, 30, 34], "drawn": 17, "rule": [17, 22, 26], "becom": [17, 21, 23, 31], "element": [17, 22, 26, 27], "extver": [17, 20, 28, 31], "error": [17, 20, 21, 30, 32], "bad": [17, 27, 32], "refcat": [17, 31, 32, 33], "catalogu": 17, "detect": [17, 26], "refer": [17, 19, 20, 21, 22, 25, 27, 28, 29, 31, 33, 34], "catalog": [17, 32], "2d": [17, 27, 34], "done": [17, 20, 26, 27, 31, 32, 33, 34], "here": [17, 20, 21, 26, 27, 28, 30, 31, 33, 34], "match": [17, 20, 31, 32, 33, 34], "n20170609s0154_varad": [17, 27, 31, 32, 33, 34], "acquisit": [17, 27, 31, 32, 34], "north": [17, 25, 27, 31, 32, 34], "overscan_subtract": [17, 31, 32, 34], "overscan_trim": [17, 31, 32, 34], "prepar": [17, 26, 27, 31, 32, 34], "sider": [17, 27, 31, 32, 34], "2112": [17, 27, 31, 32], "256": [17, 27, 31, 32], "float32": [17, 31, 32], "int16": [17, 31], "6": [17, 28, 30, 31, 32, 33, 34], "43": [17, 31, 32], "uint8": [17, 31, 32], "8": [17, 22, 27, 31, 32, 33], "7": [17, 30, 31, 32, 33], "5": [17, 27, 28, 30, 31, 32, 33], "245": [17, 31, 32], "16": [17, 27, 28, 31, 32], "plai": [17, 21, 26], "encourag": [17, 20, 27], "modif": [17, 31], "step": [17, 20, 23, 25, 26, 28, 30, 33, 34], "thing": [17, 20, 21, 27, 28, 30], "chang": [17, 20, 21, 23, 26, 27, 31], "deepcopi": [17, 27, 31], "adcopi": [17, 27, 31], "advar": [17, 31], "delet": [17, 29, 31], "del": [17, 28, 31], "4": [17, 20, 27, 28, 30, 31, 33], "smaug": [17, 31], "drogon": [17, 31], "n20170521s0925_forstack": [17, 27, 34], "issubset": [17, 34], "favor": [17, 20, 25, 27, 30], "over": [17, 20, 22, 23, 26, 27, 31], "retriev": [17, 28, 32, 33], "alreadi": [17, 27, 31], "agnost": 17, "routin": 17, "open1": [17, 28, 31], "g_g0301": [17, 28, 31], "pretti": [17, 28, 31], "look": [17, 20, 21, 26, 27, 28, 30, 32, 34], "up": [17, 20, 26, 30], "correct": [17, 22, 27, 28], "03": [17, 28], "97": [17, 28], "96": [17, 27, 28], "01": [17, 28], "wrong": [17, 27], "full": [17, 19, 20, 21, 27, 28, 33], "exptim": 17, "boguskei": 17, "without": [17, 20, 21, 22, 23, 28, 30, 31], "comment": [17, 28], "newkei": [17, 28], "50": [17, 27, 28], "anoth": [17, 20, 21, 27, 28, 31, 32, 34], "30": [17, 27, 28], "469": 17, "7444308769482": 17, "656175780001": 17, "464": 17, "9815279808291": 17, "467": 17, "5701178951787": 17, "propag": [17, 21, 23], "ad_hcont": 17, "ad_halpha": 17, "n20170521s0926_forstack": [17, 34], "adsub": 17, "mean": [17, 20, 21, 26, 27, 33], "646": 17, "11896": 17, "581": 17, "81342": 17, "64": [17, 27, 30, 33], "305862": 17, "669": 17, "80664": 17, "598": 17, "46667": 17, "1268": 17, "274": 17, "place": [17, 20, 26, 27, 32], "ad_mult": 17, "ad_gain": 17, "zip": [17, 27, 28], "366": 17, "39545": 17, "180": 17, "4904": 17, "300": 17, "350": 17, "657": 17, "1994": 17, "most": [17, 20, 23, 26, 27, 28, 31, 33], "best": [17, 27, 30, 33], "itself": [17, 20, 21, 26, 30, 32, 33], "few": [17, 20, 27, 28, 30, 31], "column": [17, 27], "colnam": [17, 33], "zmag": [17, 33], "zmag_err": [17, 33], "5th": 17, "6th": 17, "new_column": [17, 33], "len": [17, 33], "new_row": [17, 33], "cat_id": [17, 33], "add_row": [17, 33], "select": [17, 22, 26, 28, 30, 31, 34], "criterion": 17, "1237662500002005475": [17, 33], "18": [17, 33], "reject": [17, 27], "nan": [17, 33], "save": [17, 27, 28, 33], "isnan": [17, 33], "99": [17, 27], "20": [17, 27, 33], "377306": [17, 33], "reason": [17, 20, 27, 33], "ttype3": [17, 33], "raj2000": [17, 33], "y_imag": [17, 31, 33], "keynam": [17, 33], "startswith": [17, 33], "ttype": [17, 33], "primaryhdu": [17, 31, 33], "pixel_data": [17, 31], "hdu": [17, 20, 21, 22, 31], "my_astropy_t": [17, 31, 33], "random": [17, 26], "rand": 17, "col1": 17, "col2": 17, "my_fits_t": [17, 31], "warn": [17, 31], "line": [17, 20, 27, 28, 30], "we": [17, 20, 21, 23, 25, 26, 27, 28, 30, 31, 32, 33, 34], "nonetheless": 17, "had": [17, 20], "120_astrodatamastermanu": 19, "cheat": [19, 30], "sheet": [19, 30], "refresh": [19, 28, 34], "code": [19, 20, 21, 22, 23, 25, 26, 28, 34], "programm": [19, 20, 23, 26, 28, 34], "appendix": [19, 28], "intend": [20, 28, 31], "product": 20, "asid": 20, "lack": [20, 25], "kind": 20, "knowledg": [20, 23], "importantli": 20, "instanti": 20, "those": [20, 26, 27, 28, 31, 32, 33, 34], "Such": [20, 31], "process": [20, 22, 23, 25, 26, 27, 34], "doe": [20, 22, 26, 27, 28, 30, 31, 33], "much": [20, 21, 23, 30], "semant": 20, "compon": [20, 27], "mostli": [20, 21, 28], "__init__": [20, 21], "__deepcopy__": 20, "__iter__": 20, "sequenti": [20, 26, 33], "iter": [20, 22, 23, 26, 27], "third": [20, 21, 27], "fourth": [20, 31], "__delitem__": 20, "__setitem__": 20, "basic": [20, 28, 30], "seri": 20, "sweep": 20, "move": [20, 26], "__iadd__": 20, "__isub__": 20, "__imul__": 20, "__itruediv__": 20, "discuss": [20, 23, 28, 31], "pleas": [20, 21, 30, 31, 33], "addition": 20, "crucial": 20, "textual": 20, "oppos": 20, "similar": [20, 23, 27, 33], "intent": [20, 26], "becaus": [20, 21, 27, 31, 32], "compar": [20, 27], "test": 20, "membership": 20, "intersect": 20, "figur": [20, 26], "belong": [20, 30, 31], "arbitrari": [20, 28], "categori": [20, 32], "_process_tag": 20, "behind": [20, 25, 26, 31], "could": [20, 23, 27, 31], "redefin": [20, 21], "build": [20, 31, 33], "upon": [20, 28], "hierarchi": 20, "know": [20, 22, 23, 27, 28, 30, 31, 33], "deal": [20, 21, 23], "broad": 20, "sens": [20, 27], "introduc": [20, 31], "respect": [20, 28, 30, 31], "back": [20, 27, 29, 33], "_matches_data": 20, "involv": [20, 25, 27, 33], "automat": [20, 30, 31], "choic": [20, 21], "dure": [20, 21, 23, 25, 30], "ll": [20, 21, 26], "talk": [20, 26], "good": [20, 27, 32], "convers": [20, 27], "extend": [20, 21, 25], "strictli": [20, 30], "mani": [20, 22, 23], "registr": 20, "layout": 20, "design": [20, 24, 25], "decid": [20, 26], "ve": [20, 21, 26], "settl": 20, "follow": [20, 22, 26, 27, 28, 30, 31, 32, 33, 34], "recommend": [20, 27, 30, 33], "keep": [20, 21, 27, 28, 30], "familiar": [20, 27, 30, 31, 32], "py": 20, "instrument_nam": 20, "adclass": [20, 31], "lookup": [20, 22, 27], "hard": [20, 22], "separ": [20, 21, 23, 28, 34], "declar": [20, 26], "excerpt": 20, "astrodatainstru": 20, "__keyword_dict": 20, "ampnam": 20, "ccdsect": 20, "staticmethod": 20, "instrum": 20, "upper": [20, 27], "myinstrument": 20, "_tag_instru": [20, 26], "_tag_imag": [20, 26], "grate": [20, 26], "mirror": [20, 26], "_tag_dark": 20, "obstyp": [20, 26, 34], "dark": [20, 34], "spect": [20, 26, 34], "_keyword_for": 20, "facil": 20, "astrodatagemini": [20, 22, 28, 34], "irrelev": 20, "reli": [20, 21], "elsewher": 20, "ancestor": 20, "comput": 20, "highlight": 20, "monik": 20, "idea": 20, "while": [20, 22, 23, 25, 26, 27, 31], "quit": 20, "stabl": [20, 26, 33], "prone": 20, "safe": 20, "sorri": 20, "come": [20, 22, 26, 27], "instabl": 20, "member": [20, 26], "easier": [20, 26], "find": [20, 23, 27, 30], "cue": 20, "boolean": [20, 32], "claim": 20, "compli": 20, "astrodatagmo": [20, 22, 28, 31, 34], "handler": [20, 27, 31], "valid": 20, "final": [20, 21, 23, 26, 27], "candid": 20, "discoveri": 20, "start": [20, 25, 26, 27, 30, 31, 33], "discard": [20, 21, 26], "basi": 20, "inherit": [20, 26], "appear": 20, "tree": 20, "drop": [20, 26], "prefer": [20, 31], "left": [20, 27], "occur": 20, "choos": [20, 27], "convent": [20, 28], "dai": 20, "_tag_": 20, "relat": 20, "_status_": 20, "hint": 20, "team": 20, "establish": 20, "what": [20, 26, 27, 28, 29, 32], "earmark": 20, "discov": 20, "later": [20, 27, 32], "appropri": [20, 22, 27, 30, 31], "either": [20, 27, 31], "execut": 20, "construct": [20, 25, 31, 32], "theori": 20, "big": [20, 27], "feasibl": 20, "moment": 20, "compet": 20, "altern": [20, 23], "condit": [20, 21, 26], "preclud": 20, "branch": 20, "rather": [20, 27, 31, 32, 33, 34], "complic": 20, "dozen": 20, "heavi": 20, "easi": [20, 33], "exploit": [20, 21], "gnir": 20, "astrodatagnir": 20, "read_fit": 20, "particular": [20, 21, 22, 23, 27, 32], "extnam": [20, 31], "iraf": [20, 23, 25, 27, 33], "els": [20, 27, 28, 31, 34], "conform": [20, 28], "overridden": 20, "further": [20, 23, 25], "As": [20, 23, 27, 31, 32, 34], "soar": 20, "sami": 20, "mef": [20, 22, 23, 25, 29, 30], "im1": 20, "im2": 20, "astrodatasami": 20, "cl": 20, "sami_pars": 20, "m": 20, "im": 20, "d": [20, 27], "super": 20, "bulk": 20, "again": [20, 21, 26, 28, 31], "unlik": [20, 31, 33], "explicitli": [20, 21, 31], "still": [20, 23, 27, 32], "alter": [20, 22], "output": [20, 22, 27, 29, 30], "alwai": [20, 27, 28], "probabl": [20, 27], "unless": 20, "against": 20, "show": [20, 27, 28, 32, 33], "found": [20, 27, 33], "via": [20, 22], "prior": 20, "auto": [20, 34], "mechan": 20, "explor": [20, 22, 27], "relev": [20, 23], "forc": [20, 27], "fix": 20, "gave": 20, "rigid": 20, "scheme": [20, 21], "sort": [20, 26, 33], "ineffici": 20, "unaccept": 20, "overhead": 20, "manag": [20, 30], "respons": [20, 25], "__all__": 20, "astrodatamyinstru": 20, "factori": 20, "addclass": 20, "effect": [20, 28], "enough": [20, 21], "thu": [20, 25, 26], "script": 20, "some_fil": 20, "technic": [20, 32], "anywai": [20, 26], "namespac": 20, "explicit": 20, "perfect": [20, 27], "multi": [20, 23, 25, 30, 31], "pipelin": [20, 22, 23, 25], "burden": 20, "memori": [20, 21, 29], "everyon": 20, "approach": 20, "suggest": 20, "cascad": 20, "extra": [20, 32], "piec": 20, "share": [20, 23], "across": [20, 27], "translat": [20, 22, 25, 27], "sai": [20, 27, 34], "u": [20, 21, 27, 31, 32, 33, 34], "feii": [20, 33], "35\u00b5m": 20, "644\u00b5m": 20, "daughter": 20, "addinstrumentfilterwavelength": 20, "filter_wavelength": 20, "control": [20, 27, 28, 33], "maintain": [20, 25], "creator": 20, "driven": 20, "themselv": [20, 23, 32], "activ": [20, 26, 30], "core": [20, 21, 22, 27, 28, 31, 33], "decoupl": 20, "footnot": [20, 25], "privat": [20, 32], "due": 20, "doubl": 20, "own": [20, 21, 23, 25, 27, 30, 31], "awar": [20, 31], "chain": [20, 28], "notic": [20, 27, 31, 32], "ok": 20, "rememb": [20, 27, 31], "everi": [20, 31], "implicitli": 20, "formal": 20, "lowest": 20, "integ": [20, 27, 28], "abl": [20, 27], "chosen": 21, "particularli": [21, 27], "capabl": 21, "reduc": [21, 23, 26, 27, 30, 34], "stack": [21, 27], "depart": [21, 23, 25], "integr": [21, 27], "rest": [21, 30], "fundament": 21, "box": [21, 27], "syntax": [21, 23, 27], "custom": [21, 26, 30], "upstream": 21, "fitslazyload": 21, "mimic": 21, "among": 21, "fly": 21, "unscal": 21, "fact": [21, 28], "expect": [21, 26, 27, 30, 32], "long": [21, 25, 27, 28, 32], "real": [21, 26, 32], "obsess": 21, "hit": [21, 27], "applic": 21, "larg": [21, 27, 32], "optim": [21, 27], "speed": 21, "consumpt": 21, "latter": [21, 22, 32], "press": [21, 27], "issu": [21, 23, 30], "avoid": [21, 31], "unneed": 21, "proxi": 21, "seem": 21, "deem": 21, "easiest": 21, "cleanest": 21, "were": [21, 25, 31, 32], "One": [21, 23, 27, 28, 31], "advarianceuncertainti": 21, "varianceuncertainti": 21, "neg": 21, "ndastrodatamixin": 21, "logical_or": 21, "bitwise_or": 21, "regularli": 21, "futur": [21, 25, 28, 30], "releas": [21, 25], "plan": [21, 25, 27, 33], "increas": [21, 23], "anticip": 21, "possibli": [21, 23], "backward": [21, 25], "regular": 22, "storag": 22, "card": [22, 28], "potenti": 22, "organ": [22, 29], "niri": 22, "astrodataniri": [22, 34], "overrid": 22, "entri": [22, 27], "train": 22, "learn": [22, 27], "facilit": [22, 23], "limit": [22, 23, 27, 32], "meaning": 22, "returns_list": 22, "elimin": 22, "usual": 22, "might": [22, 27, 28, 33, 34], "even": [22, 23, 27, 32, 34], "written": [22, 27, 28, 30, 31, 32, 33, 34], "undecor": 22, "length": [22, 31, 33], "singli": 22, "ha": [23, 25, 27, 28, 30, 31, 32, 33, 34], "bespok": 23, "reduct": [23, 25, 30], "despit": 23, "overal": 23, "effort": 23, "significantli": 23, "practic": 23, "howev": [23, 27, 28, 30, 31, 32, 34], "often": 23, "regard": [23, 30], "manner": 23, "purpos": 23, "uniform": [23, 30], "independ": [23, 31], "therebi": 23, "somebodi": 23, "who": [23, 27, 28, 34], "concern": 23, "clearer": 23, "represent": [23, 28, 30, 31, 32], "relationship": 23, "modern": 23, "institut": 23, "whose": 23, "obscur": 23, "creation": 23, "scientif": [23, 27], "cumbersom": 23, "readili": [23, 28, 30], "appar": 23, "role": 23, "therefor": [23, 27, 31, 32], "axiom": 23, "retain": 23, "link": [23, 27], "recip": [23, 25, 31, 34], "explain": [23, 27, 28, 30], "wide": [23, 27], "light": [23, 27], "resourc": 23, "led": [23, 25], "disagr": 23, "precis": 23, "engag": 23, "solut": [23, 27], "small": 23, "signific": 23, "phase": 23, "iii": 23, "rsprogmanu": [23, 30], "104_astrodataprogmanu": 24, "preced": 24, "motiv": 24, "tool": [25, 29, 30, 31, 34], "histor": 25, "term": [25, 34], "coupl": [25, 27, 31], "known": [25, 27], "difficulti": 25, "robust": [25, 27], "environ": [25, 30], "decis": 25, "adopt": 25, "born": 25, "At": [25, 31, 32], "subpackag": 25, "reach": 25, "novemb": 25, "2014": 25, "2015": 25, "susd": 25, "took": 25, "With": [25, 27, 31], "improv": [25, 28], "oversight": 25, "thought": 25, "becam": 25, "evid": [25, 32], "daunt": 25, "task": [25, 27], "2016": 25, "overhaul": 25, "principl": 25, "sound": 25, "unnecessari": 25, "eschew": 25, "languag": 25, "incompat": 25, "v2": 25, "togeth": [25, 27, 30, 31], "explan": 25, "net": [25, 27, 30], "flexibl": 25, "transport": 25, "astronomi": [25, 27], "south": [25, 34], "Its": 26, "signatur": 26, "foo": 26, "bar": 26, "power": [26, 27], "put": [26, 27, 30], "join": 26, "altogeth": 26, "unprocess": 26, "side": [26, 34], "coin": 26, "sometim": [26, 27, 31], "bunch": 26, "furthermor": 26, "now": [26, 27, 31, 33], "act": 26, "earli": 26, "sure": [26, 30, 31], "met": 26, "hurdl": 26, "indistinguish": 26, "view": [26, 27, 32], "guarante": 26, "stai": 26, "taken": 26, "constant": 26, "classifi": 26, "condition": 26, "slightli": [26, 28], "fairli": [26, 31], "_type_gcal_lamp": 26, "gcallamp": 26, "irhigh": 26, "shut": 26, "gcalshut": 26, "gcal_ir_on": 26, "lampon": 26, "elif": 26, "close": [26, 28], "gcal_ir_off": 26, "lampoff": 26, "spectroscopi": [26, 34], "configur": [26, 27, 28, 30, 31, 33, 34], "_tag_bia": 26, "four": [26, 27], "illustr": [26, 27], "pretend": 26, "proce": 26, "promot": 26, "three": [26, 27], "exactli": [26, 27, 33], "kept": [26, 32], "stabil": 26, "neither": 26, "nor": [26, 28], "try": [27, 28, 29, 31, 32, 33, 34], "yourself": [27, 28, 29, 31, 32, 33, 34], "sever": 27, "quick": [27, 28, 30, 33, 34], "the_data": 27, "loop": 27, "333071030": 27, "335104458": 27, "333170484": 27, "333055206": 27, "henc": [27, 30], "anyth": [27, 31, 34], "normal": [27, 28, 30, 32, 33, 34], "next": [27, 30, 31, 32], "usag": [27, 29, 30], "chapter": [27, 28, 30, 31, 32, 33], "adout": 27, "adin": 27, "variabl": 27, "abov": [27, 31, 32], "reassign": 27, "onto": 27, "form": [27, 31], "unchang": 27, "bewar": 27, "safer": 27, "littl": [27, 28, 34], "10": [27, 30, 33], "NOT": [27, 31, 34], "40": 27, "untouch": 27, "matter": [27, 31, 34], "poisson": 27, "signal": 27, "mention": 27, "assum": [27, 31], "correl": 27, "var_output": 27, "56": 27, "160931": 27, "356529": 27, "3154": 27, "05": 27, "607826": 27, "62": 27, "why": 27, "cosmic": 27, "rai": 27, "32": [27, 33], "unillumin": 27, "locat": [27, 28, 30, 32, 33, 34], "geminidr": 27, "dq_definit": 27, "fine": 27, "bitmask": 27, "ds9": [27, 30], "numdisplai": [27, 30], "longer": 27, "stsci": 27, "connect": 27, "list_active_ds9": 27, "la": 27, "zscale": 27, "mininum": 27, "2000": 27, "readcursor": 27, "coordin": [27, 32], "respond": 27, "mous": 27, "click": 27, "keyboard": 27, "acknowledg": 27, "invok": [27, 33], "flow": [27, 28], "wait": 27, "cursor_coo": 27, "xcoo": 27, "ycoo": 27, "keystrok": 27, "realli": [27, 31], "tell": [27, 34], "rich": 27, "highli": 27, "invent": 27, "wheel": 27, "feel": 27, "naxis2": 27, "naxis1": 27, "288": [27, 31], "49": 27, "455": 27, "uint16": [27, 31, 32], "world": [27, 29, 32], "fortran": 27, "critic": 27, "fresh": 27, "yet": [27, 31], "unsign": 27, "65535": 27, "lead": 27, "unexpect": 27, "rang": 27, "accommod": 27, "workaround": 27, "safeti": 27, "float64": 27, "65534": 27, "131070": 27, "lot": 27, "probe": 27, "median": 27, "clearli": 27, "beyond": 27, "scope": [27, 28, 31], "mind": [27, 28], "duplic": 27, "happen": 27, "norm": 27, "reader": [27, 28, 31, 33, 34], "strongli": 27, "ma": 27, "threshold": 27, "stddev": 27, "std": 27, "clipped_mean": 27, "masked_outsid": 27, "straight": 27, "help": [27, 28, 31, 34], "stat": 27, "sigma_clip": 27, "sigma": 27, "convolv": 27, "gaussian": 27, "ndimag": 27, "convolved_data": 27, "reshap": 27, "convolut": 27, "gaussian_filt": 27, "visual": 27, "blink": 27, "convinc": 27, "kernel": 27, "extrem": 27, "Being": 27, "cost": 27, "lesson": 27, "research": 27, "project": [27, 30], "org": [27, 33], "edg": 27, "illumin": 27, "physic": 27, "gap": 27, "portion": 27, "45": 27, "corner": 27, "chip": 27, "certainli": 27, "white": 27, "sake": 27, "simplic": 27, "variou": [27, 28, 31, 33, 34], "accomplish": 27, "suit": [27, 34], "clariti": 27, "flag": [27, 32], "masked_arrai": 27, "no_data": 27, "masked_wher": 27, "masked_": 27, "clean_data": 27, "max": 27, "far": 27, "shown": 27, "especi": [27, 32], "worth": 27, "highest": 27, "75": 27, "74": 27, "29": 27, "19": 27, "39": 27, "25x25": 27, "xc": 27, "yc": 27, "buffer": [27, 30], "25": 27, "xlow": 27, "xhigh": 27, "ylow": 27, "yhigh": 27, "87": 27, "37": 27, "stamp": 27, "min": 27, "2f": 27, "concept": [27, 28, 30, 31], "unprepar": [27, 31, 34], "readi": [27, 28, 30, 31], "oversec": 27, "datasec": 27, "measur": 27, "mean_overscan": 27, "adjust": 27, "That": [27, 28, 31, 32], "smaller": 27, "partly_overscan_correct": 27, "abil": 27, "Of": [27, 28], "cours": [27, 28], "correctli": 27, "ifu": [27, 34], "commonli": 27, "did": [27, 31], "1d": 27, "spectra": 27, "revers": [27, 28], "wlen": 27, "collaps": 27, "wavelenth": 27, "pyplot": 27, "plt": 27, "adcub": 27, "gmosifu_cub": [27, 34], "summed_imag": 27, "minmax": 27, "spatial": 27, "14": [27, 28], "24": 27, "13": [27, 34], "matplotlibrc": 27, "nice": 27, "nicer": 27, "angstrom": 27, "ax": [27, 28], "contrari": 27, "truli": [27, 31], "pai": 27, "attent": 27, "length_wlen_axi": 27, "intens": 27, "clf": 27, "absolut": 27, "aim": 27, "give": [27, 31, 34], "web": 27, "github": [27, 30], "com": [27, 30], "spacetelescop": 27, "public": [27, 30], "scratch": 27, "surfac": 27, "ad_imag": 27, "ad_spectrum": 27, "estgss20080220s0078": [27, 34], "1044": 27, "line_index": 27, "1043": 27, "11": 27, "colum": 27, "327": 27, "col_index": 27, "326": 27, "width": 27, "thick_column": 27, "ylim": 27, "contour": 27, "1646": 27, "2355": 27, "15": 27, "xrang": 27, "yrang": 27, "blob": 27, "imshow": 27, "cmap": 27, "grai": 27, "spec_wc": 27, "pixcoord": 27, "wcs_pix2world": 27, "reproduc": 27, "predecesor": 27, "programmat": 27, "imexamin": 27, "command": [27, 31], "plot_lin": 27, "mean_column": 27, "plot_column": 27, "expand_dim": 27, "contour_par": 27, "ncolumn": 27, "nline": 27, "uniqu": 28, "onc": [28, 30, 31], "transpar": [28, 31], "understood": 28, "089": 28, "240": 28, "fwhm_pixel": 28, "fwhm_arcsec": 28, "word": 28, "Not": [28, 33], "outsid": 28, "aofold": 28, "park": 28, "po": 28, "crpix1": 28, "511": 28, "862999160781": 28, "287": 28, "137000839218696": 28, "224": 28, "137000839219": 28, "screen": 28, "bitpix": 28, "naxi": 28, "xtension": 28, "ident": 28, "transform": 28, "ap": 28, "almost": 28, "mosaick": 28, "distort": 28, "approxim": [28, 31], "asdf": 28, "text": 28, "likewis": 28, "recreat": 28, "accur": [28, 31, 32], "polynomi": 28, "sip": 28, "discret": 28, "sampl": 28, "greisen": 28, "et": 28, "al": 28, "2006": 28, "s6": 28, "report": [28, 30], "instruct": [28, 34], "invit": [28, 34], "introduct": [28, 29, 34], "past": [28, 34], "distinguish": [28, 34], "_get_xbin": 28, "attributeerror": 28, "ccdsum": 28, "xbin_list": 28, "106_astrodatausermanu": 29, "instal": 29, "v": 29, "typewalk": 29, "advanc": [29, 30], "topic": [29, 30], "ordin": 29, "displai": [29, 32], "scipi": 29, "cube": 29, "plot": 29, "rsusermanu": 30, "properli": 30, "insid": 30, "inspect": [30, 34], "everyth": [30, 31], "anaconda_": 30, "conda": 30, "forg": 30, "channel": 30, "repositori": 30, "bare": 30, "companion": 30, "latest": 30, "bash": 30, "session": 30, "shell": [30, 34], "bash_profil": 30, "bashrc": 30, "anaconda3": 30, "init": 30, "machin": 30, "config": 30, "astroconda": 30, "clean": 30, "virtual": 30, "dragonsrc": 30, "mkdir": 30, "touch": [30, 34], "favorit": 30, "editor": 30, "browser": 30, "safari": 30, "chrome": 30, "firefox": 30, "calib": 30, "db": 30, "cp": 30, "conda_prefix": 30, "lib": 30, "python3": 30, "site": 30, "gempi": 30, "imtoolrc": 30, "vi": 30, "export": 30, "newer": 30, "newest": 30, "hash": 30, "home_path": 30, "env": 30, "inde": 30, "prompt": 30, "messag": 30, "geminidrsoftwar": 30, "staff": 30, "question": 30, "helpdesk": 30, "noirlab": 30, "atlassian": 30, "servicedesk": 30, "portal": 30, "12": 30, "tracker": 30, "centric": 31, "recipe_system": 31, "trigger": 31, "x_imag": 31, "ref_mag_err": 31, "profile_fwhm": 31, "profile_ee50": 31, "int32": [31, 33], "283": 31, "461": 31, "55": 31, "4393": 31, "16895": 31, "999": [31, 33], "predefin": 31, "filter1": 31, "filter2": 31, "ccdsec": 31, "512": 31, "4224": 31, "513": 31, "1024": 31, "1025": 31, "1536": 31, "1537": 31, "2048": 31, "insert": 31, "straightforward": 31, "item": 31, "care": [31, 33], "destin": 31, "conflict": 31, "recogn": [31, 32], "throw": 31, "seen": 31, "newcopi": 31, "astroddata": 31, "util": 31, "Be": 31, "balloon": 31, "eventu": [31, 33], "fortun": 31, "constructor": 31, "bloc": 31, "somenam": 31, "uncommon": 31, "subsect": 31, "extra_data": 31, "extradata": 31, "bintablehdu": 31, "dedic": 31, "add_header_to_t": 31, "perspect": 32, "bottom": 32, "star": [32, 33], "_tabl": 32, "fulli": [32, 34], "obvious": 32, "refin": 32, "never": [32, 34], "delai": 32, "someon": 32, "doc": 33, "en": 33, "html": 33, "dej2000": 33, "umag": 33, "umag_err": 33, "gmag": 33, "gmag_err": 33, "rmag": 33, "rmag_err": 33, "imag_err": 33, "filtermag": 33, "filtermag_err": 33, "feed": 33, "overwrite_col": 33, "nb": 33, "suffici": 33, "techniqu": 33, "pyraf": 33, "int64": 33, "astyp": 33, "my_column": 33, "bintabl": 33, "myfile_with_modified_t": 33, "magnitud": 33, "brighter": 33, "snr_id": 33, "s001": 33, "s002": 33, "s003": 33, "780": 33, "78": 33, "179": 33, "pabeta": 33, "740": 33, "307": 33, "220": 33, "ratio": 33, "mytabl": 33, "new_tabl": 33, "flatfield": 34, "statu": 34, "trim": 34, "awai": 34, "focus": 34, "am": 34, "workspac": 34, "processed_sci": 34, "longslit": 34, "l": 34, "oneslit_r": 34, "dataspid": 34, "o": 34, "rawfil": 34, "li": 34, "cat": 34, "vv2": 34, "beta": 34, "tue": 34, "mar": 34, "06": 34, "2018": 34, "qualifi": 34, "AND": 34, "klabri": 34, "tutori": 34, "host": 34, "_tag_arc": 34, "character": 34, "flavor": 34, "r": 34, "differenti": 34}, "objects": {"": [[14, 0, 0, "-", "astrodata"]], "astrodata": [[0, 1, 1, "", "AstroData"], [1, 4, 1, "", "AstroDataError"], [2, 1, 1, "", "AstroDataMixin"], [3, 1, 1, "", "NDAstroData"], [4, 1, 1, "", "Section"], [5, 1, 1, "", "TagSet"], [6, 5, 1, "", "add_header_to_table"], [7, 5, 1, "", "astro_data_descriptor"], [8, 5, 1, "", "astro_data_tag"], [9, 5, 1, "", "create"], [10, 5, 1, "", "from_file"], [11, 5, 1, "", "open"], [12, 5, 1, "", "returns_list"], [13, 5, 1, "", "version"]], "astrodata.AstroData": [[0, 2, 1, "", "add"], [0, 2, 1, "", "append"], [0, 2, 1, "", "crop"], [0, 3, 1, "", "data"], [0, 3, 1, "", "descriptors"], [0, 2, 1, "", "divide"], [0, 3, 1, "", "exposed"], [0, 3, 1, "", "ext_tables"], [0, 3, 1, "", "filename"], [0, 3, 1, "", "hdr"], [0, 3, 1, "", "header"], [0, 3, 1, "", "id"], [0, 3, 1, "", "indices"], [0, 2, 1, "", "info"], [0, 2, 1, "", "instrument"], [0, 2, 1, "", "is_settable"], [0, 3, 1, "", "is_sliced"], [0, 2, 1, "", "load"], [0, 3, 1, "", "mask"], [0, 2, 1, "", "multiply"], [0, 3, 1, "", "nddata"], [0, 2, 1, "", "object"], [0, 2, 1, "", "operate"], [0, 3, 1, "", "orig_filename"], [0, 3, 1, "", "path"], [0, 3, 1, "", "phu"], [0, 2, 1, "", "read"], [0, 2, 1, "", "reset"], [0, 3, 1, "", "shape"], [0, 2, 1, "", "subtract"], [0, 2, 1, "", "table"], [0, 3, 1, "", "tables"], [0, 3, 1, "", "tags"], [0, 2, 1, "", "telescope"], [0, 3, 1, "", "uncertainty"], [0, 2, 1, "", "update_filename"], [0, 3, 1, "", "variance"], [0, 3, 1, "", "wcs"], [0, 2, 1, "", "write"]], "astrodata.AstroDataMixin": [[2, 3, 1, "", "shape"], [2, 3, 1, "", "size"], [2, 3, 1, "", "variance"], [2, 3, 1, "", "wcs"]], "astrodata.NDAstroData": [[3, 3, 1, "", "T"], [3, 3, 1, "", "data"], [3, 3, 1, "", "mask"], [3, 2, 1, "", "set_section"], [3, 2, 1, "", "transpose"], [3, 3, 1, "", "uncertainty"], [3, 3, 1, "", "variance"], [3, 3, 1, "", "window"]], "astrodata.Section": [[4, 2, 1, "", "asIRAFsection"], [4, 2, 1, "", "as_iraf_section"], [4, 2, 1, "", "asslice"], [4, 3, 1, "", "axis_dict"], [4, 2, 1, "", "contains"], [4, 2, 1, "", "from_shape"], [4, 2, 1, "", "from_string"], [4, 2, 1, "", "is_same_size"], [4, 3, 1, "", "ndim"], [4, 2, 1, "", "overlap"], [4, 2, 1, "", "shift"]], "astrodata.TagSet": [[5, 3, 1, "", "add"], [5, 3, 1, "", "blocked_by"], [5, 3, 1, "", "blocks"], [5, 3, 1, "", "if_present"], [5, 3, 1, "", "remove"]]}, "objtypes": {"0": "py:module", "1": "py:class", "2": "py:method", "3": "py:attribute", "4": "py:exception", "5": "py:function"}, "objnames": {"0": ["py", "module", "Python module"], "1": ["py", "class", "Python class"], "2": ["py", "method", "Python method"], "3": ["py", "attribute", "Python attribute"], "4": ["py", "exception", "Python exception"], "5": ["py", "function", "Python function"]}, "titleterms": {"astrodata": [0, 14, 15, 17, 19, 20, 27, 28, 30, 31, 32, 33, 34], "astrodataerror": 1, "astrodatamixin": 2, "ndastrodata": 3, "section": [4, 27], "tagset": 5, "add_header_to_t": 6, "astro_data_descriptor": 7, "astro_data_tag": 8, "creat": [9, 17, 20, 31, 33, 34], "from_fil": 10, "open": [11, 31], "returns_list": 12, "version": 13, "common": 14, "api": [14, 18], "user": [14, 29], "packag": [14, 20, 27], "function": 14, "class": [14, 20], "document": [15, 17, 19, 24, 29, 30], "content": [15, 31], "indic": 15, "tabl": [15, 17, 31, 33], "list": 16, "gemini": 16, "standard": 16, "descriptor": [16, 17, 22, 28], "cheat": 17, "sheet": 17, "id": [17, 19, 24, 29], "import": [17, 31], "basic": [17, 27, 31], "read": [17, 31, 33], "write": [17, 20, 31], "oper": [17, 27, 31, 33], "object": [17, 27, 31, 32], "structur": 17, "descript": 17, "modifi": [17, 31], "tag": [17, 20, 26, 34], "header": [17, 28, 31, 33], "direct": 17, "access": [17, 28, 31, 33], "keyword": [17, 31], "primari": 17, "unit": 17, "pixel": [17, 27, 31], "extens": [17, 31, 32], "data": [17, 21, 27, 31, 33], "arithmet": [17, 27], "other": [17, 27], "new": [17, 31, 34], "refer": [18, 30], "manual": [19, 24, 29], "deriv": 20, "The": [20, 32], "properti": 20, "an": [20, 30, 31], "your": 20, "regist": 20, "contain": 21, "gener": 23, "design": 23, "programm": 24, "": 24, "preced": [25, 27], "motiv": 25, "simpl": 27, "varianc": 27, "ad": [27, 28], "plane": 27, "automat": 27, "propag": 27, "qualiti": 27, "displai": 27, "imexam": 27, "retriev": 27, "cursor": 27, "posit": 27, "us": [27, 34], "tool": 27, "from": [27, 31, 33], "numpi": 27, "scipi": 27, "astropi": 27, "ndarrai": 27, "statist": [27, 33], "clip": 27, "filter": 27, "mani": 27, "manipul": [27, 31], "exampl": [27, 31], "overscan": 27, "subtract": 27, "trim": 27, "cube": 27, "plot": 27, "matplotlib": 27, "metadata": 28, "directli": [28, 33], "whole": 28, "updat": [28, 30, 31], "delet": 28, "world": 28, "co": 28, "ordin": 28, "system": 28, "attribut": 28, "advanc": [28, 34], "topic": [28, 34], "introduct": 30, "what": [30, 34], "i": 30, "instal": 30, "anaconda": 30, "dragon": 30, "stack": 30, "exist": [30, 31], "smoke": 30, "test": 30, "sourc": 30, "code": 30, "avail": 30, "try": 30, "yourself": 30, "support": 30, "input": 31, "output": 31, "mef": 31, "dataset": 31, "file": 31, "append": 31, "remov": 31, "part": 31, "one": 31, "back": 31, "disk": 31, "A": [31, 32], "note": [31, 32], "fit": [31, 33], "copi": 31, "need": 31, "true": 31, "memori": [31, 32], "scratch": 31, "arrai": 31, "set": 31, "zero": 31, "associ": 31, "scienc": 31, "repres": 31, "binari": 31, "global": 32, "v": 32, "specif": 32, "organ": 32, "inform": 32, "usag": 32, "column": 33, "row": 33, "chang": 33, "valu": 33, "add": 33, "select": 33, "reject": 33, "element": 33, "criterion": 33, "befor": 33, "ar": 34, "typewalk": 34}, "envversion": {"sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.intersphinx": 1, "sphinx.ext.todo": 2, "sphinx.ext.viewcode": 1, "sphinx": 60}, "alltitles": {"AstroData": [[0, "astrodata"]], "AstroDataError": [[1, "astrodataerror"]], "AstroDataMixin": [[2, "astrodatamixin"]], "NDAstroData": [[3, "ndastrodata"]], "Section": [[4, "section"]], "TagSet": [[5, "tagset"]], "add_header_to_table": [[6, "add-header-to-table"]], "astro_data_descriptor": [[7, "astro-data-descriptor"]], "astro_data_tag": [[8, "astro-data-tag"]], "create": [[9, "create"]], "from_file": [[10, "from-file"]], "open": [[11, "open"]], "returns_list": [[12, "returns-list"]], "version": [[13, "version"]], "Common API for Users": [[14, "common-api-for-users"]], "astrodata Package": [[14, "module-astrodata"]], "Functions": [[14, "functions"]], "Classes": [[14, "classes"]], "astrodata Documentation": [[15, "astrodata-documentation"]], "Contents:": [[15, null]], "Indices and tables": [[15, "indices-and-tables"]], "List of Gemini Standard Descriptors": [[16, "list-of-gemini-standard-descriptors"]], "Cheat Sheet": [[17, "cheat-sheet"]], "Document ID": [[17, null], [19, null], [24, null], [29, null]], "Imports": [[17, "imports"], [31, "imports"]], "Basic read and write operations": [[17, "basic-read-and-write-operations"]], "Object structure": [[17, "object-structure"]], "Description": [[17, "description"]], "Modifying the structure": [[17, "modifying-the-structure"]], "Astrodata tags": [[17, "astrodata-tags"]], "Headers": [[17, "headers"], [31, "headers"]], "Descriptors": [[17, "descriptors"], [22, "descriptors"]], "Direct access to header keywords": [[17, "direct-access-to-header-keywords"]], "Primary Header Unit": [[17, "primary-header-unit"]], "Pixel extension header": [[17, "pixel-extension-header"]], "Table header": [[17, "table-header"]], "Pixel data": [[17, "pixel-data"], [31, "pixel-data"]], "Arithmetics": [[17, "arithmetics"]], "Other pixel data operations": [[17, "other-pixel-data-operations"]], "Tables": [[17, "tables"], [31, "tables"]], "Create new AstroData object": [[17, "create-new-astrodata-object"]], "Reference API": [[18, "reference-api"]], "Astrodata Manual": [[19, "astrodata-manual"]], "AstroData and Derivatives": [[20, "astrodata-and-derivatives"]], "The tags Property": [[20, "the-tags-property"]], "Writing an AstroData Derivative": [[20, "writing-an-astrodata-derivative"]], "Create a package for it": [[20, "create-a-package-for-it"]], "Create your derivative class": [[20, "create-your-derivative-class"]], "Register your class": [[20, "register-your-class"]], "Data Containers": [[21, "data-containers"]], "General Design": [[23, "general-design"]], "Programmer\u2019s Manual": [[24, "programmer-s-manual"]], "Precedents and Motivation": [[25, "precedents-and-motivation"]], "Tags": [[26, "tags"]], "Pixel Data": [[27, "pixel-data"]], "Operate on Pixel Data": [[27, "operate-on-pixel-data"]], "Arithmetic on AstroData Objects": [[27, "arithmetic-on-astrodata-objects"]], "Simple operations": [[27, "simple-operations"]], "Operator Precedence": [[27, "operator-precedence"]], "Variance": [[27, "variance"]], "Adding a Variance Plane": [[27, "adding-a-variance-plane"]], "Automatic Variance Propagation": [[27, "automatic-variance-propagation"]], "Data Quality Plane": [[27, "data-quality-plane"]], "Display": [[27, "display"]], "Displaying with imexam": [[27, "displaying-with-imexam"]], "Retrieving cursor position with imexam": [[27, "retrieving-cursor-position-with-imexam"]], "Useful tools from the NumPy, SciPy, and Astropy Packages": [[27, "useful-tools-from-the-numpy-scipy-and-astropy-packages"]], "ndarray": [[27, "ndarray"]], "Simple Numpy Statistics": [[27, "simple-numpy-statistics"]], "Clipped Statistics": [[27, "clipped-statistics"]], "Filters with SciPy": [[27, "filters-with-scipy"]], "Many other tools": [[27, "many-other-tools"]], "Using the Astrodata Data Quality Plane": [[27, "using-the-astrodata-data-quality-plane"]], "Manipulate Data Sections": [[27, "manipulate-data-sections"]], "Basic Statistics on Section": [[27, "basic-statistics-on-section"]], "Example - Overscan Subtraction with Trimming": [[27, "example-overscan-subtraction-with-trimming"]], "Data Cubes": [[27, "data-cubes"]], "Plot Data": [[27, "plot-data"]], "Matplotlib": [[27, "matplotlib"]], "imexam": [[27, "imexam"]], "Metadata and Headers": [[28, "metadata-and-headers"]], "Astrodata Descriptors": [[28, "astrodata-descriptors"]], "Accessing Metadata": [[28, "accessing-metadata"]], "Accessing Metadata with Descriptors": [[28, "accessing-metadata-with-descriptors"]], "Accessing Metadata Directly": [[28, "accessing-metadata-directly"]], "Whole Headers": [[28, "whole-headers"]], "Updating, Adding and Deleting Metadata": [[28, "updating-adding-and-deleting-metadata"]], "World Co-ordinate System attribute": [[28, "world-co-ordinate-system-attribute"]], "Adding Descriptors [Advanced Topic]": [[28, "adding-descriptors-advanced-topic"]], "User Manual": [[29, "user-manual"]], "Introduction": [[30, "introduction"]], "Reference Documents": [[30, "reference-documents"]], "What is AstroData?": [[30, "what-is-astrodata"]], "Installing Astrodata": [[30, "installing-astrodata"]], "Installing Anaconda and the DRAGONS stack": [[30, "installing-anaconda-and-the-dragons-stack"]], "Update an existing DRAGONS installation": [[30, "update-an-existing-dragons-installation"]], "Smoke test the Astrodata installation": [[30, "smoke-test-the-astrodata-installation"]], "Source code availability": [[30, "source-code-availability"]], "Try it yourself": [[30, "try-it-yourself"]], "Astrodata Support": [[30, "astrodata-support"]], "Input and Output Operations and Extension Manipulation - MEF": [[31, "input-and-output-operations-and-extension-manipulation-mef"]], "Open and access existing dataset": [[31, "open-and-access-existing-dataset"]], "Read in the dataset": [[31, "read-in-the-dataset"]], "Accessing the content of a MEF file": [[31, "accessing-the-content-of-a-mef-file"]], "Modify Existing MEF Files": [[31, "modify-existing-mef-files"]], "Appending an extension": [[31, "appending-an-extension"]], "Removing an extension or part of one": [[31, "removing-an-extension-or-part-of-one"]], "Writing back to disk": [[31, "writing-back-to-disk"]], "Writing to a new file": [[31, "writing-to-a-new-file"]], "Updating an existing file on disk": [[31, "updating-an-existing-file-on-disk"]], "A note on FITS header keywords": [[31, "a-note-on-fits-header-keywords"]], "Create New MEF Files": [[31, "create-new-mef-files"]], "Create New Copy of MEF Files": [[31, "create-new-copy-of-mef-files"]], "Basic example": [[31, "basic-example"]], "Needing true copies in memory": [[31, "needing-true-copies-in-memory"]], "Create New MEF Files from Scratch": [[31, "create-new-mef-files-from-scratch"]], "Create a MEF with basic header and data array set to zeros": [[31, "create-a-mef-with-basic-header-and-data-array-set-to-zeros"]], "Associate a pixel array with a science pixel array": [[31, "associate-a-pixel-array-with-a-science-pixel-array"]], "Represent a table as a FITS binary table in an AstroData object": [[31, "represent-a-table-as-a-fits-binary-table-in-an-astrodata-object"]], "The AstroData Object": [[32, "the-astrodata-object"]], "Global vs Extension-specific": [[32, "global-vs-extension-specific"]], "Organization of the Global Information": [[32, "organization-of-the-global-information"]], "Organization of the Extension-specific Information": [[32, "organization-of-the-extension-specific-information"]], "A Note on Memory Usage": [[32, "a-note-on-memory-usage"]], "Table Data": [[33, "table-data"]], "Tables and Astrodata": [[33, "tables-and-astrodata"]], "Operate on a Table": [[33, "operate-on-a-table"]], "Column and Row Operations": [[33, "column-and-row-operations"]], "Read columns and rows": [[33, "read-columns-and-rows"]], "Change values": [[33, "change-values"]], "Add a row": [[33, "add-a-row"]], "Add a column": [[33, "add-a-column"]], "Selection and Rejection Operations": [[33, "selection-and-rejection-operations"]], "Select a table element from criterion": [[33, "select-a-table-element-from-criterion"]], "Rejection and selection before statistics": [[33, "rejection-and-selection-before-statistics"]], "Accessing FITS table headers directly": [[33, "accessing-fits-table-headers-directly"]], "Create a Table": [[33, "create-a-table"]], "Astrodata Tags": [[34, "astrodata-tags"]], "What are the Astrodata Tags?": [[34, "what-are-the-astrodata-tags"]], "Using the Astrodata Tags": [[34, "using-the-astrodata-tags"]], "Using typewalk": [[34, "using-typewalk"]], "Creating New Astrodata Tags [Advanced Topic]": [[34, "creating-new-astrodata-tags-advanced-topic"]]}, "indexentries": {"astrodata (class in astrodata)": [[0, "astrodata.AstroData"]], "add() (astrodata.astrodata method)": [[0, "astrodata.AstroData.add"]], "append() (astrodata.astrodata method)": [[0, "astrodata.AstroData.append"]], "crop() (astrodata.astrodata method)": [[0, "astrodata.AstroData.crop"]], "data (astrodata.astrodata attribute)": [[0, "astrodata.AstroData.data"]], "descriptors (astrodata.astrodata attribute)": [[0, "astrodata.AstroData.descriptors"]], "divide() (astrodata.astrodata method)": [[0, "astrodata.AstroData.divide"]], "exposed (astrodata.astrodata attribute)": [[0, "astrodata.AstroData.exposed"]], "ext_tables (astrodata.astrodata attribute)": [[0, "astrodata.AstroData.ext_tables"]], "filename (astrodata.astrodata attribute)": [[0, "astrodata.AstroData.filename"]], "hdr (astrodata.astrodata attribute)": [[0, "astrodata.AstroData.hdr"]], "header (astrodata.astrodata attribute)": [[0, "astrodata.AstroData.header"]], "id (astrodata.astrodata attribute)": [[0, "astrodata.AstroData.id"]], "indices (astrodata.astrodata attribute)": [[0, "astrodata.AstroData.indices"]], "info() (astrodata.astrodata method)": [[0, "astrodata.AstroData.info"]], "instrument() (astrodata.astrodata method)": [[0, "astrodata.AstroData.instrument"]], "is_settable() (astrodata.astrodata method)": [[0, "astrodata.AstroData.is_settable"]], "is_sliced (astrodata.astrodata attribute)": [[0, "astrodata.AstroData.is_sliced"]], "load() (astrodata.astrodata class method)": [[0, "astrodata.AstroData.load"]], "mask (astrodata.astrodata attribute)": [[0, "astrodata.AstroData.mask"]], "multiply() (astrodata.astrodata method)": [[0, "astrodata.AstroData.multiply"]], "nddata (astrodata.astrodata attribute)": [[0, "astrodata.AstroData.nddata"]], "object() (astrodata.astrodata method)": [[0, "astrodata.AstroData.object"]], "operate() (astrodata.astrodata method)": [[0, "astrodata.AstroData.operate"]], "orig_filename (astrodata.astrodata attribute)": [[0, "astrodata.AstroData.orig_filename"]], "path (astrodata.astrodata attribute)": [[0, "astrodata.AstroData.path"]], "phu (astrodata.astrodata attribute)": [[0, "astrodata.AstroData.phu"]], "read() (astrodata.astrodata class method)": [[0, "astrodata.AstroData.read"]], "reset() (astrodata.astrodata method)": [[0, "astrodata.AstroData.reset"]], "shape (astrodata.astrodata attribute)": [[0, "astrodata.AstroData.shape"]], "subtract() (astrodata.astrodata method)": [[0, "astrodata.AstroData.subtract"]], "table() (astrodata.astrodata method)": [[0, "astrodata.AstroData.table"]], "tables (astrodata.astrodata attribute)": [[0, "astrodata.AstroData.tables"]], "tags (astrodata.astrodata attribute)": [[0, "astrodata.AstroData.tags"]], "telescope() (astrodata.astrodata method)": [[0, "astrodata.AstroData.telescope"]], "uncertainty (astrodata.astrodata attribute)": [[0, "astrodata.AstroData.uncertainty"]], "update_filename() (astrodata.astrodata method)": [[0, "astrodata.AstroData.update_filename"]], "variance (astrodata.astrodata attribute)": [[0, "astrodata.AstroData.variance"]], "wcs (astrodata.astrodata attribute)": [[0, "astrodata.AstroData.wcs"]], "write() (astrodata.astrodata method)": [[0, "astrodata.AstroData.write"]], "astrodataerror": [[1, "astrodata.AstroDataError"]], "astrodatamixin (class in astrodata)": [[2, "astrodata.AstroDataMixin"]], "shape (astrodata.astrodatamixin attribute)": [[2, "astrodata.AstroDataMixin.shape"]], "size (astrodata.astrodatamixin attribute)": [[2, "astrodata.AstroDataMixin.size"]], "variance (astrodata.astrodatamixin attribute)": [[2, "astrodata.AstroDataMixin.variance"]], "wcs (astrodata.astrodatamixin attribute)": [[2, "astrodata.AstroDataMixin.wcs"]], "ndastrodata (class in astrodata)": [[3, "astrodata.NDAstroData"]], "t (astrodata.ndastrodata attribute)": [[3, "astrodata.NDAstroData.T"]], "data (astrodata.ndastrodata attribute)": [[3, "astrodata.NDAstroData.data"]], "mask (astrodata.ndastrodata attribute)": [[3, "astrodata.NDAstroData.mask"]], "set_section() (astrodata.ndastrodata method)": [[3, "astrodata.NDAstroData.set_section"]], "transpose() (astrodata.ndastrodata method)": [[3, "astrodata.NDAstroData.transpose"]], "uncertainty (astrodata.ndastrodata attribute)": [[3, "astrodata.NDAstroData.uncertainty"]], "variance (astrodata.ndastrodata attribute)": [[3, "astrodata.NDAstroData.variance"]], "window (astrodata.ndastrodata attribute)": [[3, "astrodata.NDAstroData.window"]], "section (class in astrodata)": [[4, "astrodata.Section"]], "asirafsection() (astrodata.section method)": [[4, "astrodata.Section.asIRAFsection"]], "as_iraf_section() (astrodata.section method)": [[4, "astrodata.Section.as_iraf_section"]], "asslice() (astrodata.section method)": [[4, "astrodata.Section.asslice"]], "axis_dict (astrodata.section attribute)": [[4, "astrodata.Section.axis_dict"]], "contains() (astrodata.section method)": [[4, "astrodata.Section.contains"]], "from_shape() (astrodata.section static method)": [[4, "astrodata.Section.from_shape"]], "from_string() (astrodata.section static method)": [[4, "astrodata.Section.from_string"]], "is_same_size() (astrodata.section method)": [[4, "astrodata.Section.is_same_size"]], "ndim (astrodata.section attribute)": [[4, "astrodata.Section.ndim"]], "overlap() (astrodata.section method)": [[4, "astrodata.Section.overlap"]], "shift() (astrodata.section method)": [[4, "astrodata.Section.shift"]], "tagset (class in astrodata)": [[5, "astrodata.TagSet"]], "add (astrodata.tagset attribute)": [[5, "astrodata.TagSet.add"]], "blocked_by (astrodata.tagset attribute)": [[5, "astrodata.TagSet.blocked_by"]], "blocks (astrodata.tagset attribute)": [[5, "astrodata.TagSet.blocks"]], "if_present (astrodata.tagset attribute)": [[5, "astrodata.TagSet.if_present"]], "remove (astrodata.tagset attribute)": [[5, "astrodata.TagSet.remove"]], "add_header_to_table() (in module astrodata)": [[6, "astrodata.add_header_to_table"]], "astro_data_descriptor() (in module astrodata)": [[7, "astrodata.astro_data_descriptor"]], "astro_data_tag() (in module astrodata)": [[8, "astrodata.astro_data_tag"]], "create() (in module astrodata)": [[9, "astrodata.create"]], "from_file() (in module astrodata)": [[10, "astrodata.from_file"]], "open() (in module astrodata)": [[11, "astrodata.open"]], "returns_list() (in module astrodata)": [[12, "astrodata.returns_list"]], "version() (in module astrodata)": [[13, "astrodata.version"]], "astrodata": [[14, "module-astrodata"]], "module": [[14, "module-astrodata"]]}}) \ No newline at end of file
+
+
+ + +
+ +

Source code for astrodata

+"""This package adds an abstraction layer to astronomical data by parsing the
+information contained in the headers as attributes. To do so, one must subclass
+:class:`astrodata.AstroData` and add parse methods accordingly to the
+:class:`~astrodata.TagSet` received.
+
+"""
+from .core import AstroData
+from .factory import AstroDataFactory, AstroDataError
+from .fits import add_header_to_table
+from .nddata import NDAstroData, AstroDataMixin
+from .utils import (
+    Section,
+    TagSet,
+    astro_data_descriptor,
+    astro_data_tag,
+    returns_list,
+    deprecated,
+)
+from ._version import version
+
+__all__ = [
+    "AstroData",
+    "AstroDataError",
+    "AstroDataMixin",
+    "NDAstroData",
+    "Section",
+    "TagSet",
+    "__version__",
+    "add_header_to_table",
+    "astro_data_descriptor",
+    "astro_data_tag",
+    "from_file",
+    "create",
+    "returns_list",
+    "version",
+    # Below this are deprecated
+    "open",
+]
+
+# Make sure __all__does not have duplicates
+if len(__all__) != len(set(__all__)):
+    duplicates = [x for i, x in enumerate(__all__) if x in __all__[:i]]
+    raise ValueError(f"Duplicate entries in __all__: {', '.join(duplicates)}")
+
+__version__ = version()
+
+# TODO: This is pretty unacceptable, this makes it impossible to access the
+# factory classes, errors, and methods through any normal means. Which means
+# they are very difficult to write tests for, or to have users work on
+# themselves.
+factory = AstroDataFactory()
+# Let's make sure that there's at least one class that matches the data
+# (if we're dealing with a FITS file)
+factory.add_class(AstroData)
+
+
+
+
+
+
+
+[docs] +def create(*args, **kwargs): + """Return an |AstroData| object from data. + + For implementation details, see + :meth:`~astrodata.AstroDataFactory.create_from_scratch` + """ + return factory.create_from_scratch(*args, **kwargs)
+ + + +# TODO: Need to replace this with a name that doesn't override the builtin. +# This makes it so that the following will cause unexpected behavior: +# from astrodata import * +# file_stream = open("some_file.fits") +# Without raising a warning or error. +
+[docs] +@deprecated( + "Use 'astrodata.from_file'. astrodata.open is deprecated, " + "and will be removed in a future version." +) +def open(*args, **kwargs): # pylint: disable=redefined-builtin + """Return an |AstroData| object from a file (deprecated, use + :func:`~astrodata.from_file`). + """ + return from_file(*args, **kwargs)
+ +
+ +
+ +
+
+ +
+