From 0d71ebd2afcb52ffbd5055187f6af91b9bd4db36 Mon Sep 17 00:00:00 2001 From: Bill Cleveland Date: Fri, 23 Feb 2024 20:24:38 -0600 Subject: [PATCH] Initial Release v1.0.0 --- .gitignore | 11 + .readthedocs.yaml | 26 + Manifest.in | 2 + PYPI-README.rst | 25 + README.rst | 63 ++ docs/Makefile | 20 + docs/_static/bootstrap-astropy.css | 658 ++++++++++++++++++ docs/_static/gdt_favicon.ico | Bin 0 -> 5764 bytes docs/_static/gdt_logo.png | Bin 0 -> 89351 bytes docs/_templates/layout.html | 6 + ...te2.fregate.detectors.FregateDetectors.rst | 23 + ...2.fregate.lightcurve.FregateLightCurve.rst | 59 ++ docs/conf.py | 89 +++ docs/images/Hete_om3.jpg | Bin 0 -> 18630 bytes docs/index.rst | 106 +++ docs/install.rst | 128 ++++ docs/license.rst | 181 +++++ docs/make.bat | 35 + docs/missions/hete2/fregate/detectors.rst | 58 ++ .../hete2/fregate/figures/lightcurve_plot.png | Bin 0 -> 39888 bytes .../hete2/fregate/figures/topview.gif | Bin 0 -> 9621 bytes docs/missions/hete2/fregate/lightcurve.rst | 109 +++ license.txt | 202 ++++++ requirements.txt | 14 + setup.py | 86 +++ src/gdt/data/hete2-fregate.urls | 3 + src/gdt/missions/hete2/__init__.py | 38 + src/gdt/missions/hete2/fregate/__init__.py | 36 + src/gdt/missions/hete2/fregate/detectors.py | 77 ++ src/gdt/missions/hete2/fregate/lightcurve.py | 305 ++++++++ tests/__init__.py | 40 ++ tests/missions/__init__.py | 0 tests/missions/hete2/__init__.py | 0 tests/missions/hete2/fregate/__init__.py | 36 + .../missions/hete2/fregate/test_lightcurve.py | 103 +++ 35 files changed, 2539 insertions(+) create mode 100644 .gitignore create mode 100644 .readthedocs.yaml create mode 100644 Manifest.in create mode 100644 PYPI-README.rst create mode 100644 README.rst create mode 100644 docs/Makefile create mode 100644 docs/_static/bootstrap-astropy.css create mode 100644 docs/_static/gdt_favicon.ico create mode 100644 docs/_static/gdt_logo.png create mode 100644 docs/_templates/layout.html create mode 100644 docs/api/gdt.missions.hete2.fregate.detectors.FregateDetectors.rst create mode 100644 docs/api/gdt.missions.hete2.fregate.lightcurve.FregateLightCurve.rst create mode 100644 docs/conf.py create mode 100644 docs/images/Hete_om3.jpg create mode 100644 docs/index.rst create mode 100644 docs/install.rst create mode 100644 docs/license.rst create mode 100644 docs/make.bat create mode 100644 docs/missions/hete2/fregate/detectors.rst create mode 100644 docs/missions/hete2/fregate/figures/lightcurve_plot.png create mode 100644 docs/missions/hete2/fregate/figures/topview.gif create mode 100644 docs/missions/hete2/fregate/lightcurve.rst create mode 100644 license.txt create mode 100644 requirements.txt create mode 100644 setup.py create mode 100644 src/gdt/data/hete2-fregate.urls create mode 100644 src/gdt/missions/hete2/__init__.py create mode 100644 src/gdt/missions/hete2/fregate/__init__.py create mode 100644 src/gdt/missions/hete2/fregate/detectors.py create mode 100644 src/gdt/missions/hete2/fregate/lightcurve.py create mode 100644 tests/__init__.py create mode 100644 tests/missions/__init__.py create mode 100644 tests/missions/hete2/__init__.py create mode 100644 tests/missions/hete2/fregate/__init__.py create mode 100644 tests/missions/hete2/fregate/test_lightcurve.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7042bd1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,11 @@ +.venv +.idea +*.egg-info +*.pyc +temp +dist +build +.pytest_cache +.DS_Store +docs/_build +.ipynb_checkpoints diff --git a/.readthedocs.yaml b/.readthedocs.yaml new file mode 100644 index 0000000..f7841fb --- /dev/null +++ b/.readthedocs.yaml @@ -0,0 +1,26 @@ +# .readthedocs.yaml +# Read the Docs configuration file +# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details + +# Required +version: 2 + +# Set the version of Python and other tools you might need +build: + os: ubuntu-22.04 + tools: + python: "3.11" + apt_packages: + - libproj-dev + - libgeos-dev + - graphviz + +# Build documentation in the docs/ directory with Sphinx +sphinx: + configuration: docs/conf.py + + +# Optionally declare the Python requirements required to build your docs +python: + install: + - requirements: requirements.txt diff --git a/Manifest.in b/Manifest.in new file mode 100644 index 0000000..e53b9cb --- /dev/null +++ b/Manifest.in @@ -0,0 +1,2 @@ +include PYPI-README.rst +include license.txt \ No newline at end of file diff --git a/PYPI-README.rst b/PYPI-README.rst new file mode 100644 index 0000000..25cac19 --- /dev/null +++ b/PYPI-README.rst @@ -0,0 +1,25 @@ +========= +GDT-HETE2 +========= + +The GDT-HETE2 is an extension to Gamma-ray Data Tools that adds functions specific to the hete2 mission. + +Normal Installation +------------------- + +If you don't plan to contribute code to the project, the recommended install method is installing from PyPI using: + +.. code-block:: sh + + pip install astro-gdt-hete2 + gdt-data init + +The ``gdt-data init`` is required to initialize the library after installation of astro-gdt. You do not need to +perform the initialization again if astro-gdt was already installed and initialized. There is no harm in running +it again "just in case". + +Contributing Code or Documentation +---------------------------------- + +If you plan to help with the development or documentation of astro-gdt-hete2, then please visit our github site at +https://github.com/USRA-STI/gdt-hete2. \ No newline at end of file diff --git a/README.rst b/README.rst new file mode 100644 index 0000000..09c3379 --- /dev/null +++ b/README.rst @@ -0,0 +1,63 @@ +========= +GDT-HETE2 +========= + +The GDT-HETE2 is an extension to Gamma-ray Data Tools that adds functions specific to the hete2 mission. + +Normal Installation +------------------- + +If you don't plan to contribute code to the project, the recommended install method is installing from PyPI using: + +.. code-block:: sh + + pip install astro-gdt-hete2 + gdt-data init + +The ``gdt-data init`` is required to initialize the library after installation of astro-gdt. You do not need to +perform the initialization again if astro-gdt was already installed and initialized. There is no harm in running +it again "just in case". + + +Writing Extensions using Namespace Packaging +-------------------------------------------- +This is an extension to astro-gdt and should should contain a directory 'gdt' with a subdirectory 'missions' which will hold the extension code +in a package directory named after the mission. + +For example, GDT-HETE2 has the following directory layout:: + + . + ├── config + ├── dist + ├── docs + ├── src + │   └── gdt + │      └── missions + │      └── hete2 + │      └── __init__.py + └── tests + └── missions + └── hete2 + + +Since GDT-HETE2 uses namespace packaging, both ``src/gdt`` and ``src/gdt/missions`` do not contain a file named +``__init__.py``. This is because they are Namespace packages. + +Notice that directory ``src/gdt/mission/hete2`` contains an `__init__.py` file +signalling to Python that those directories are regular packages. + +You can learn more about Namespace packages by reading `PEP-420 `_. + +Helping with Documentation +-------------------------- + +You can contribute additions and changes to the documentation. In order to use sphinx to compile the documentation +source files, we recommend that you install the packages contained within ``requirments.txt``. + +To compile the documentation, use the following commands: + +.. code-block:: sh + + cd $PROJ_ROOT/docs + make html + diff --git a/docs/Makefile b/docs/Makefile new file mode 100644 index 0000000..d4bb2cb --- /dev/null +++ b/docs/Makefile @@ -0,0 +1,20 @@ +# Minimal makefile for Sphinx documentation +# + +# You can set these variables from the command line, and also +# from the environment for the first two. +SPHINXOPTS ?= +SPHINXBUILD ?= sphinx-build +SOURCEDIR = . +BUILDDIR = _build + +# Put it first so that "make" without argument is like "make help". +help: + @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) + +.PHONY: help Makefile + +# Catch-all target: route all unknown targets to Sphinx using the new +# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). +%: Makefile + @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/docs/_static/bootstrap-astropy.css b/docs/_static/bootstrap-astropy.css new file mode 100644 index 0000000..7565fee --- /dev/null +++ b/docs/_static/bootstrap-astropy.css @@ -0,0 +1,658 @@ +/*! + * Bootstrap v1.4.0 + * + * Copyright 2011 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Heavily modified by Kyle Barbary for the AstroPy Project for use with Sphinx. + */ + +@import url("basic.css"); + +body { + background-color: #ffffff; + margin: 0; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 13px; + font-weight: normal; + line-height: 18px; + color: #404040; +} + +/* Hyperlinks ----------------------------------------------------------------*/ + +a { + color: #0069d6; + text-decoration: none; + line-height: inherit; + font-weight: inherit; +} + +a:hover { + color: #00438a; + text-decoration: underline; +} + +/* Typography ----------------------------------------------------------------*/ + +h1,h2,h3,h4,h5,h6 { + color: #404040; + margin: 0.7em 0 0 0; + line-height: 1.5em; +} +h1 { + font-size: 24px; + margin: 0; +} +h2 { + font-size: 21px; + line-height: 1.2em; + margin: 1em 0 0.5em 0; + border-bottom: 1px solid #404040; +} +h3 { + font-size: 18px; +} +h4 { + font-size: 16px; +} +h5 { + font-size: 14px; +} +h6 { + font-size: 13px; + text-transform: uppercase; +} + +p { + font-size: 13px; + font-weight: normal; + line-height: 18px; + margin-top: 0px; + margin-bottom: 9px; +} + +ul, ol { + margin-left: 0; + padding: 0 0 0 25px; +} +ul ul, ul ol, ol ol, ol ul { + margin-bottom: 0; +} +ul { + list-style: disc; +} +ol { + list-style: decimal; +} +li { + line-height: 18px; + color: #404040; +} +ul.unstyled { + list-style: none; + margin-left: 0; +} +dl { + margin-bottom: 18px; +} +dl dt, dl dd { + line-height: 18px; +} +dl dd { + margin-left: 9px; +} +hr { + margin: 20px 0 19px; + border: 0; + border-bottom: 1px solid #eee; +} +strong { + font-style: inherit; + font-weight: bold; +} +em { + font-style: italic; + font-weight: inherit; + line-height: inherit; +} +.muted { + color: #bfbfbf; +} + +address { + display: block; + line-height: 18px; + margin-bottom: 18px; +} +code, pre { + padding: 0 3px 2px; + font-family: monospace; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} +tt { + font-family: monospace; +} +code { + padding: 1px 3px; +} +pre { + display: block; + padding: 8.5px; + margin: 0 0 18px; + line-height: 18px; + border: 1px solid #ddd; + border: 1px solid rgba(0, 0, 0, 0.12); + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + white-space: pre; + word-wrap: break-word; +} + +img { + margin: 9px 0; +} + +/* format inline code with a rounded box */ +tt, code { + margin: 0 2px; + padding: 0 5px; + border: 1px solid #ddd; + border: 1px solid rgba(0, 0, 0, 0.12); + border-radius: 3px; +} + +code.xref, a code { + margin: 0; + padding: 0 1px 0 1px; + background-color: transparent; + border: none; +} + +/* all code has same box background color, even in headers */ +h1 tt, h2 tt, h3 tt, h4 tt, h5 tt, h6 tt, +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code, +pre, code, tt { + background-color: #f8f8f8; +} + +/* override box for links & other sphinx-specifc stuff */ +tt.xref, a tt, tt.descname, tt.descclassname { + padding: 0 1px 0 1px; + border: none; +} + +/* override box for related bar at the top of the page */ +.related tt { + border: none; + padding: 0 1px 0 1px; + background-color: transparent; + font-weight: bold; +} + +th { + background-color: #dddddd; +} + +.viewcode-back { + font-family: sans-serif; +} + +div.viewcode-block:target { + background-color: #f4debf; + border-top: 1px solid #ac9; + border-bottom: 1px solid #ac9; +} + +table.docutils { + border-spacing: 5px; + border-collapse: separate; +} + +/* Topbar --------------------------------------------------------------------*/ + +div.topbar { + height: 40px; + position: absolute; + top: 0; + left: 0; + right: 0; + z-index: 10000; + padding: 0px 10px; + background-color: #222; + background-color: #222222; + background-repeat: repeat-x; + background-image: -khtml-gradient(linear, left top, left bottom, from(#333333), to(#222222)); + background-image: -moz-linear-gradient(top, #333333, #222222); + background-image: -ms-linear-gradient(top, #333333, #222222); + background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #333333), color-stop(100%, #222222)); + background-image: -webkit-linear-gradient(top, #333333, #222222); + background-image: -o-linear-gradient(top, #333333, #222222); + background-image: linear-gradient(to top, #333333, #222222); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#333333', endColorstr='#222222', GradientType=0); + overflow-x: hidden; + overflow-y: hidden; + width: 100%; +} + +div.topbar a.brand { + font-family: 'Source Sans Pro', sans-serif; + font-size: 26px; + color: #ffffff; + font-weight: 600; + text-decoration: none; + float: left; + display: block; + height: 32px; + padding: 8px 12px 0px 45px; + margin-left: -10px; + background: transparent url("gdt_logo.png") no-repeat 10px 4px; + /* background-image: url("gdt_logo.png"), none; */ + background-size: 32px 32px; +} + +#logotext1 { +} + +#logotext2 { + font-weight:200; + color: #ee00ff; /* #ff5000 */ +} +#logotext3 { + font-weight:200; +} + +div.topbar .brand:hover, div.topbar ul li a.homelink:hover { + background-color: #333; +} + +div.topbar ul { + font-size: 110%; + list-style-type: none; + margin: 0; + padding: 0 0 0 10px; + float: right; + color: #bfbfbf; + text-align: center; + text-decoration: none; + height: 100%; +} +div.topbar ul li { + float: left; + display: inline-block; + height: 30px; + margin: 5px; + padding: 0px; +} + +div.topbar ul li a { + color: #bfbfbf; + text-decoration: none; + padding: 5px; + display: block; + height: auto; + text-align: center; + vertical-align: middle; + border-radius: 4px; +} + +div.topbar ul li a:hover { + color: #ffffff; + text-decoration: none; +} + +div.dropdown { + position: relative; /* Fixed this to relative */ + display: inline-block; + z-index: 999999; +} + +div.dropdown-content { + display: none; /* Fix this at none */ + background-color: DimGray; + color: White; + width: 235px; + height: 155px; + box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2); + padding-top: 3px; + padding-right: 15px; + position: fixed; +} + +div.dropdown:hover .dropdown-content { + display: block; +} + +div.dropdown-content a { + display: block; +} + +div.dropdown-content a:hover { + color: white; +} + +div.dropdown a:hover { + color: #FF5000; +} + +div.dropdown z:hover { + color: #FF5000; + width: 10px; + display: none; +} + +div.dropdown z { + color: white; +} + +div.dropdown:after { + content: ""; + position: absolute; + right: -13px; + top: 9px; + width: 0; + height: 0; + border-left: 5px solid transparent; + border-right: 5px solid transparent; + border-top: 5px solid white; + z-index: 999999; +} + +div.dropdown:hover { + cursor: pointer; +} + +div.topbar ul li a.homelink { + width: 0px; + height: 0px; +} + +div.topbar form { + text-align: left; + margin: 0 0 0 5px; + position: relative; + filter: alpha(opacity=100); + -khtml-opacity: 1; + -moz-opacity: 1; + opacity: 1; +} + +div.topbar input { + background-color: #444; + background-color: rgba(255, 255, 255, 0.3); + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: medium; + font-weight: 200; + line-height: 1; + padding: 4px 9px; + color: #ffffff; + color: rgba(255, 255, 255, 0.75); + border: 1px solid #111; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0px rgba(255, 255, 255, 0.25); + -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0px rgba(255, 255, 255, 0.25); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0px rgba(255, 255, 255, 0.25); + -webkit-transition: none; + -moz-transition: none; + -ms-transition: none; + -o-transition: none; + transition: none; +} +div.topbar input:-moz-placeholder { + color: #e6e6e6; +} +div.topbar input::-webkit-input-placeholder { + color: #e6e6e6; +} +div.topbar input:hover { + background-color: #bfbfbf; + background-color: rgba(255, 255, 255, 0.5); + color: #ffffff; +} +div.topbar input:focus, div.topbar input.focused { + outline: 0; + background-color: #ffffff; + color: #404040; + text-shadow: 0 1px 0 #ffffff; + border: 0; + padding: 5px 10px; + -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); + -moz-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); + box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); +} + + +/* Relation bar (breadcrumbs, prev, next) ------------------------------------*/ + +div.related { + height: 21px; + width: auto; + margin: 0 10px; + position: relative; + top: 42px; + clear: both; + left: 0; + right: 0; + z-index: 999; + font-size: 100%; + vertical-align: middle; + background-color: #fff; + border-bottom: 1px solid #bbb; +} +div.related ul { + padding: 0; + margin: 0; +} + + +/* Footer --------------------------------------------------------------------*/ + +footer { + display: block; + margin: 10px 10px 0px; + padding: 10px 0 0 0; + border-top: 1px solid #bbb; +} +.pull-right { + float: right; + width: 30em; + text-align: right; +} + + +/* Sphinx sidebar ------------------------------------------------------------*/ + +div.sphinxsidebar { + font-size: inherit; + border-radius: 3px; + background-color: #eee; + border: 1px solid #bbb; + word-wrap: break-word; + /* overflow-wrap is the canonical name for word-wrap in the CSS3 text draft. + We include it here mainly for future-proofing. */ + overflow-wrap: break-word; +} + +div.sphinxsidebarwrapper { + padding: 0px 0px 0px 5px; +} + +div.sphinxsidebar h3 { + font-family: 'Trebuchet MS', sans-serif; + font-size: 1.4em; + font-weight: normal; + margin: 5px 0px 0px 5px; + padding: 0; + line-height: 1.6em; +} +div.sphinxsidebar h4 { + font-family: 'Trebuchet MS', sans-serif; + font-size: 1.3em; + font-weight: normal; + margin: 5px 0 0 0; + padding: 0; +} +div.sphinxsidebar p { +} +div.sphinxsidebar p.topless { + margin: 5px 10px 10px 10px; +} +div.sphinxsidebar ul { + margin: 0px 0px 0px 5px; + padding: 0; +} + +div.sphinxsidebar ul ul { + margin-left: 15px; + list-style-type: disc; +} + +/* If showing the global TOC (toctree), + color the current page differently */ +div.sphinxsidebar a.current { + color: #404040; +} +div.sphinxsidebar a.current:hover { + color: #404040; +} + + +/* document, documentwrapper, body, bodywrapper ----------------------------- */ + +div.document { + margin-top: 72px; + margin-left: 10px; + margin-right: 10px; +} + +div.documentwrapper { + float: left; + width: 100%; +} + +div.body { + background-color: #ffffff; + padding: 0 0 0px 20px; +} + +div.bodywrapper { + margin: 0 0 0 230px; + max-width: 55em; +} + + +/* Header links ------------------------------------------------------------- */ + +a.headerlink { + font-size: 0.8em; + padding: 0 4px 0 4px; + text-decoration: none; +} + +a.headerlink:hover { + background-color: #0069d6; + color: white; + text-decoration: none; +} + + +/* Admonitions and warnings ------------------------------------------------- */ + +/* Shared by admonitions and warnings */ +div.admonition, +div.warning { + padding: 0px; + border-radius: 3px; + -moz-border-radius: 3px; + -webkit-border-radius: 3px; +} +div.admonition p, +div.warning p { + margin: 0.5em 1em 0.5em 1em; + padding: 0; +} +div.admonition pre, +div.warning pre { + margin: 0.4em 1em 0.4em 1em; +} +div.admonition p.admonition-title, +div.warning p.admonition-title { + margin: 0; + padding: 0.1em 0 0.1em 0.5em; + color: white; + font-weight: bold; + font-size: 1.1em; +} +div.admonition ul, div.admonition ol, +div.warning ul, div.warning ol { + margin: 0.1em 0.5em 0.5em 3em; + padding: 0; +} + +/* Admonitions only */ +div.admonition { + border: 1px solid #609060; + background-color: #e9ffe9; +} +div.admonition p.admonition-title { + background-color: #70A070; +} + +/* Warnings only */ +div.warning { + border: 1px solid #900000; + background-color: #ffe9e9; +} +div.warning p.admonition-title { + background-color: #b04040; +} + + +/* Figures ------------------------------------------------------------------ */ + +.figure.align-center { + clear: none; +} + +/* This is a div for containing multiple figures side-by-side, for use with + * .. container:: figures */ +div.figures { + border: 1px solid #CCCCCC; + background-color: #F8F8F8; + margin: 1em; + text-align: center; +} + +div.figures .figure { + clear: none; + float: none; + display: inline-block; + border: none; + margin-left: 0.5em; + margin-right: 0.5em; +} + +.field-list th { + white-space: nowrap; +} + +table.field-list { + border-spacing: 0px; + margin-left: 1px; + border-left: 5px solid rgb(238, 238, 238) !important; +} + +table.field-list th.field-name { + display: inline-block; + padding: 1px 8px 1px 5px; + white-space: nowrap; + background-color: rgb(238, 238, 238); + border-radius: 0 3px 3px 0; + -webkit-border-radius: 0 3px 3px 0; +} diff --git a/docs/_static/gdt_favicon.ico b/docs/_static/gdt_favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..93bc87f0342bfaa5a13be28248a43e66cfbf88f4 GIT binary patch literal 5764 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 literal 0 HcmV?d00001 diff --git a/docs/_static/gdt_logo.png b/docs/_static/gdt_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..7fcd1cf9ad50213aaba0a76cef693ddcda474c61 GIT binary patch literal 89351 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 Rt^5E0002ovPDHLkV1m7U-y{G4 literal 0 HcmV?d00001 diff --git a/docs/_templates/layout.html b/docs/_templates/layout.html new file mode 100644 index 0000000..c95a3ec --- /dev/null +++ b/docs/_templates/layout.html @@ -0,0 +1,6 @@ +{# layout.html #} +{# Import the layout of the theme. #} +{% extends "!layout.html" %} + +{% set css_files = css_files + ['_static/override.css'] %} +{{ super() }} diff --git a/docs/api/gdt.missions.hete2.fregate.detectors.FregateDetectors.rst b/docs/api/gdt.missions.hete2.fregate.detectors.FregateDetectors.rst new file mode 100644 index 0000000..4c2c449 --- /dev/null +++ b/docs/api/gdt.missions.hete2.fregate.detectors.FregateDetectors.rst @@ -0,0 +1,23 @@ +FregateDetectors +================ + +.. currentmodule:: gdt.missions.hete2.fregate.detectors + +.. autoclass:: FregateDetectors + :show-inheritance: + + .. rubric:: Attributes Summary + + .. autosummary:: + + ~FregateDetectors.A + ~FregateDetectors.B + ~FregateDetectors.C + ~FregateDetectors.D + + .. rubric:: Attributes Documentation + + .. autoattribute:: A + .. autoattribute:: B + .. autoattribute:: C + .. autoattribute:: D diff --git a/docs/api/gdt.missions.hete2.fregate.lightcurve.FregateLightCurve.rst b/docs/api/gdt.missions.hete2.fregate.lightcurve.FregateLightCurve.rst new file mode 100644 index 0000000..0a4ca63 --- /dev/null +++ b/docs/api/gdt.missions.hete2.fregate.lightcurve.FregateLightCurve.rst @@ -0,0 +1,59 @@ +FregateLightCurve +================= + +.. currentmodule:: gdt.missions.hete2.fregate.lightcurve + +.. autoclass:: FregateLightCurve + :show-inheritance: + + .. rubric:: Attributes Summary + + .. autosummary:: + + ~FregateLightCurve.detectors + ~FregateLightCurve.filename + ~FregateLightCurve.gti + ~FregateLightCurve.hdulist + ~FregateLightCurve.headers + ~FregateLightCurve.num_dets + ~FregateLightCurve.num_hdus + + .. rubric:: Methods Summary + + .. autosummary:: + + ~FregateLightCurve.close + ~FregateLightCurve.column + ~FregateLightCurve.columns_as_array + ~FregateLightCurve.energy_bands + ~FregateLightCurve.get_column_names + ~FregateLightCurve.num_energy_bands + ~FregateLightCurve.open + ~FregateLightCurve.phaii + ~FregateLightCurve.time_bins + ~FregateLightCurve.time_energy_bins + ~FregateLightCurve.write + + .. rubric:: Attributes Documentation + + .. autoattribute:: detectors + .. autoattribute:: filename + .. autoattribute:: gti + .. autoattribute:: hdulist + .. autoattribute:: headers + .. autoattribute:: num_dets + .. autoattribute:: num_hdus + + .. rubric:: Methods Documentation + + .. automethod:: close + .. automethod:: column + .. automethod:: columns_as_array + .. automethod:: energy_bands + .. automethod:: get_column_names + .. automethod:: num_energy_bands + .. automethod:: open + .. automethod:: phaii + .. automethod:: time_bins + .. automethod:: time_energy_bins + .. automethod:: write diff --git a/docs/conf.py b/docs/conf.py new file mode 100644 index 0000000..06419b4 --- /dev/null +++ b/docs/conf.py @@ -0,0 +1,89 @@ +# Configuration file for the Sphinx documentation builder. +# +# This file only contains a selection of the most common options. For a full +# list see the documentation: +# https://www.sphinx-doc.org/en/master/usage/configuration.html + +# -- Path setup -------------------------------------------------------------- + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +# +import os +import sys +sys.path.append(os.path.abspath('../src')) +from gdt.missions.hete2 import __version__ + + +# -- Project information ----------------------------------------------------- + +project = 'The Gamma-ray Data Tools: HETE-2' +license = 'Apache 2.0' +author = 'Cleveland, Goldstein, and Kocevski' + +# The full version, including alpha/beta/rc tags +version = __version__ +release = __version__ + + + +# -- General configuration --------------------------------------------------- + +# Add any Sphinx extension module names here, as strings. They can be +# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom +# ones. +extensions = ['sphinx.ext.viewcode', 'sphinx.ext.inheritance_diagram', + 'sphinx.ext.mathjax', 'sphinx.ext.napoleon', 'nbsphinx', + 'IPython.sphinxext.ipython_console_highlighting', + 'sphinx_automodapi.automodapi', 'sphinx.ext.intersphinx'] +# for external cross-references that are on the local machine, the relative +# path must be converted to an absolute path otherwise the intersphinx generates +# a broken link. +intersphinx_mapping = {'gdt-core': + ('https://astro-gdt.readthedocs.io/en/latest/', None)} + +napoleon_google_docstring = True +napoleon_use_ivar = False +napoleon_use_rtype = False +numpydoc_show_class_members = False + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['_templates'] +mathjax_path="https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML" + + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +# This pattern also affects html_static_path and html_extra_path. +exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] +source_suffix = '.rst' + +# The name of the Pygments (syntax highlighting) style to use. +#pygments_style = 'friendly'#'sphinx' + + +# -- Options for HTML output ------------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +# +html_theme = 'bootstrap-astropy' +html_theme_options = { + 'logotext1': 'gdt', # white, semi-bold + 'logotext2': '-hete2', # orange, light + 'logotext3': ':docs', # white, light + 'astropy_project_menubar': False + } + +html_favicon = '_static/gdt_favicon.ico' + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ['_static'] + + +# -- PDF options ------------------------------------------------------------- +latex_documents = [('index', 'hete2-gammaray-data-tools.tex', project, author, 'manual')] + diff --git a/docs/images/Hete_om3.jpg b/docs/images/Hete_om3.jpg new file mode 100644 index 0000000000000000000000000000000000000000..566f2da22c789acd42a5fbfeb0329bdcffbcca00 GIT binary patch literal 18630 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 DpYUe#Q*uOu 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 literal 0 HcmV?d00001 diff --git a/docs/index.rst b/docs/index.rst new file mode 100644 index 0000000..2c8b92e --- /dev/null +++ b/docs/index.rst @@ -0,0 +1,106 @@ +.. _gdt-hete2: + +**************************************************** +Welcome to HETE-2 Tools Documentation! +**************************************************** + +.. figure:: images/Hete_om3.jpg +(Image from NASA/MIT) + +The HETE-2 Gamma-ray Data Tools (GDT) is a toolkit for HETE-2 data built on the +:external:ref:`GDT Core Package`. + + +The HETE-2 Satellite was launched on October 9, 2000 and operated until March 2008. +HETE-2 had three instruments: The gamma-ray instrument (FREGATE) sensitive in the 6--400keV +energy range, the Wide-field X-ray Monitor (WXM) sensitive in the 2--25keV energy range, and +the Soft X-ray Camera (SXC) sensitive in the 0.5--10keV energy range. + +Currently the toolkit is limited to reading the publicly available lightcurve files from the +FREGATE instrument. Future versions may include decoding the raw telemetry files available +as 'ipp' files when more information describing the data format becomes available. + +.. rubric:: Citing + +If you use the HETE-2 Gamma-ray Data Tools in your research and publications, +we would definitely appreciate an appropriate acknowledgment and citation! We +suggest the following BibTex: + +:: + + @misc{GDT-HETE2, + author = {Adam Goldstein and William H. Cleveland and Daniel Kocevski}, + title = {HETE-2 Gamma-ray Data Tools: v1.0.0}, + year = 2024, + url = {https://github.com/USRA-STI/gdt-hete2} + } + + +.. rubric:: Acknowledgments + +The creation of the Compton Gamma-ray Data Tools were funded by the NASA's +Astrophysics Data Analysis Program (ADAP) via grant number 80NSSC21K0651. + +*************** +Getting Started +*************** +.. toctree:: + :maxdepth: 1 + + install + +****************** +User Documentation +****************** + +HETE-2 Definitions +================= +.. toctree:: + :maxdepth: 1 + + missions/hete2/time + +FREGATE +========= + +Instrument Definitions +---------------------- + +.. toctree:: + :maxdepth: 1 + + missions/hete2/fregate/detectors + +Data Types +---------- + +.. toctree:: + :maxdepth: 1 + + missions/hete2/fregate/lightcurve + +Data Finders and Catalogs +------------------------- + +.. toctree:: + :maxdepth: 1 + + missions/hete2/fregate/finders + +---- + +******* +License +******* +.. toctree:: + :maxdepth: 1 + + license + + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` diff --git a/docs/install.rst b/docs/install.rst new file mode 100644 index 0000000..cb9ff42 --- /dev/null +++ b/docs/install.rst @@ -0,0 +1,128 @@ +.. _install: + + +Installation +============ + +.. Note:: Requires: Python >=3.8 + + Tested on: + + * macOS Monterey (12.6.4) - Ventura (13.2.1) + +How to Install +-------------- + + +The GDT-HETE2 package can be installed from PyPI using: + +.. code-block:: sh + + pip install astro-gdt-hete2 + gdt-data init + + +.. _download_test_data: + + +Downloading Test/Tutorial Data +------------------------------ +To download the data files used in the documentation and for testing, you need +to run the ``gdt-data`` script after installation. The downloader +script is designed so that you can download data from specific missions, or +download all of the test/tutorial data. To see the list of available missions + +.. code-block:: sh + + gdt-data --help + +If you want to download the HETE-2 test/tutorial data only, for example: + +.. code-block:: sh + + gdt-data download hete2-fregate + +Or to download all of the data: + +.. code-block:: sh + + gdt-data download --all + +The data are downloaded to a default directory. To access the data from the GDT, +there is a variable at the main level that stores the path dictionary for each +mission. To access the HETE-2 test data directory: + + >>> from gdt.core import data_path + >>> hete2_path = data_path.joinpath('hete2-fregate') + +Once you are done using the data, you can delete the data files with the following command: + +.. code-block:: sh + + gdt-data clean hete2-fregate + +or delete all of the data with: + +.. code-block:: sh + + gdt-data clean --all + +---- + +Quickstart +---------- +To load the GDT-HETE2 package within your python environment, simply:: + + >>> import gdt.missions.hete2 as hete2 + + +How to Uninstall +---------------- + +To uninstall: + +.. code-block:: sh + + gdt-data clean hete2-fregate + pip uninstall astro-gdt-hete2 + +There are also a number of files for the tools that are copied into your +``$HOME/.gammaray_data_tools`` directory. You can delete these files if you +wish. + + +Known Issues +------------ +* **There appears to be some differences arising between installations on Mac ARM + processors (M1 and M2 chips) and other Mac or Linux processors.** As of now, + this only shows up when using some of the minimizers provided through + scipy.optimize.minimize for spectral fitting. Users can test for the presence + of these differences by running the unit tests. The known failures on Mac ARM + processors are: + + * test_fitting.py::TestSpectralFitterOne::test_hessian + * test_fitting.py::TestSpectralFitterOne::test_jacobian + * test_fitting.py::TestSpectralFitterOne::test_residuals + + The current understanding is that differences arise in spectral fit values + above machine precision, but represent < 1% relative errors on the fit values + themselves. The exact origin of these differences is unclear, but may be + related to the underlying C or FORTRAN libraries and compilers that are used + to compile scipy. Further investigation is ongoing. + +* **The virtual environment is using your system ipython (or other package) + install.** This can sometimes happen if you didn't install ipython (or other + package) in the virtual environment. Try installing ipython (or other package) + and restart your virtual environment. + +* **You observe the following error**:: + + ImportError: No module named '_tkinter' + + This is a situation where Matplotlib is using the ``tkinter`` backend for + plotting. You would see this error if you don't have ``tkinter`` installed. + You don't need to install ``tkinter`` if you don't want to; instead, you can + create a file named `matplotlibrc` in your working directory that contains the + following:: + + backend : Agg \ No newline at end of file diff --git a/docs/license.rst b/docs/license.rst new file mode 100644 index 0000000..4262aae --- /dev/null +++ b/docs/license.rst @@ -0,0 +1,181 @@ +.. _license: + +Apache License +============== +Version 2.0, January 2004 + +http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION +____________________________________________________________ + +1. **Definitions.** + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. **Grant of Copyright License.** Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. **Grant of Patent License.** Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. **Redistribution.** You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. **Submission of Contributions.** Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. **Trademarks.** This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. **Disclaimer of Warranty.** Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. **Limitation of Liability.** In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. **Accepting Warranty or Additional Liability.** While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +**END OF TERMS AND CONDITIONS** diff --git a/docs/make.bat b/docs/make.bat new file mode 100644 index 0000000..954237b --- /dev/null +++ b/docs/make.bat @@ -0,0 +1,35 @@ +@ECHO OFF + +pushd %~dp0 + +REM Command file for Sphinx documentation + +if "%SPHINXBUILD%" == "" ( + set SPHINXBUILD=sphinx-build +) +set SOURCEDIR=. +set BUILDDIR=_build + +%SPHINXBUILD% >NUL 2>NUL +if errorlevel 9009 ( + echo. + echo.The 'sphinx-build' command was not found. Make sure you have Sphinx + echo.installed, then set the SPHINXBUILD environment variable to point + echo.to the full path of the 'sphinx-build' executable. Alternatively you + echo.may add the Sphinx directory to PATH. + echo. + echo.If you don't have Sphinx installed, grab it from + echo.https://www.sphinx-doc.org/ + exit /b 1 +) + +if "%1" == "" goto help + +%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% +goto end + +:help +%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% + +:end +popd diff --git a/docs/missions/hete2/fregate/detectors.rst b/docs/missions/hete2/fregate/detectors.rst new file mode 100644 index 0000000..a21b2b5 --- /dev/null +++ b/docs/missions/hete2/fregate/detectors.rst @@ -0,0 +1,58 @@ +.. _fregate-detectors: +.. |FregateDetectors| replace:: :class:`~gdt.missions.hete2.fregate.detectors.FregateDetectors` +.. |Detectors| replace:: :class:`~gdt.core.detector.Detectors` + +************************************************************************ +Fregate Detector Definitions (:mod:`gdt.missions.hete2.fregate.detectors`) +************************************************************************ +The |FregateDetectors| class contains the naming and orientation definitions of the +FREGATE detectors. + +There are four FREGATE detectors ("A", "B", "C", and "D") that are aimed in the same +direction with two dectectors positioned on two sides of the Wide Field X-ray Monitor. +You can see the layout of the detectors below, the FREGATE detectors are the ones +marked with 'F' (image from MIT). + +.. figure:: figures/topview.gif + +We can easily retrieve a detector definition by using standard "dot" notation: + + >>> from gdt.missions.hete2.fregate.detectors import FregateDetectors + >>> FregateDetectors.A + + +We can retrieve the string name of the detector: + + >>> FregateDetectors.C.name + 'C' + +There is also a standard detector indexing scheme that is used for all FREGATE +detectors: + + >>> FregateDetectors.B.number + 1 + +Since the |FregateDetectors| class inherits from the |Detectors| base class, we +can also retrieve the pointing information of a FREGATE detector: + + >>> # detector azimuth, zenith + >>> FregateDetectors.from_str('A').pointing() + (, ) + + >>> # detector elevation + FregateDetectors.B.elevation + + +We can also iterate over all FREGATE detectors: + + >>> # the list of detector names + >>> print([det.name for det in FregateDetectors]) + ['A', 'B', 'C', 'D'] + + +Reference/API +============= + +.. automodapi:: gdt.missions.hete2.fregate.detectors + :inherited-members: + diff --git a/docs/missions/hete2/fregate/figures/lightcurve_plot.png b/docs/missions/hete2/fregate/figures/lightcurve_plot.png new file mode 100644 index 0000000000000000000000000000000000000000..803e6ecc01e3874d92cef8a15677581aa889fdf8 GIT binary patch literal 39888 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

06%TP;(grw5 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 literal 0 HcmV?d00001 diff --git a/docs/missions/hete2/fregate/figures/topview.gif b/docs/missions/hete2/fregate/figures/topview.gif new file mode 100644 index 0000000000000000000000000000000000000000..352c6ce6ba5833dd978bc377498c7d21d78a9897 GIT binary patch literal 9621 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 E0}SQcmjD0& literal 0 HcmV?d00001 diff --git a/docs/missions/hete2/fregate/lightcurve.rst b/docs/missions/hete2/fregate/lightcurve.rst new file mode 100644 index 0000000..9405348 --- /dev/null +++ b/docs/missions/hete2/fregate/lightcurve.rst @@ -0,0 +1,109 @@ +.. _fregate-lightcurve: +.. |FregateLightCurve| replace:: :class:`~gdt.missions.hete2.fregate.lightcurve.FregateLightCurve` +.. |FitsFileContextManager| replace:: :class:`~gdt.core.file.FitsFileContextManager` +.. |Phaii| replace:: :class:`~gdt.core.phaii.Phaii` +.. |TimeEnergyBins| replace:: :class:`~gdt.core.data_primitives.TimeEnergyBins` +.. |TimeBins| replace:: :class:`~gdt.core.data_primitives.TimeBins` +.. |Gti| replace:: :class:`~gdt.core.data_primitives.Gti` + +************************************************************************ +FregateLightCurve (:mod:`gdt.missions.hete2.fregate.lightcurve`) +************************************************************************ + +The |FregateLightCurve| class allows the user to load a FREGATE light curve +fits file from HEASARC and extract the |TimeBins|, |TimeEnergyBins|, |Phaii|, +and |Gti| data objects from it. + +The FREGATE light curve file is a FITS file that has 1 primary extension, 4 detector data +extensions, and a GTI extension. + +The 4 detector extensions contains counts in 4 energy ranges that overlap with each other. +Because of this, you must specify and energy band index (0 through 3) when extracting the +time bins, time energy bins, and PHA-II data from the file. + +Examples +-------- +First we will create a FregateLightCurve object using a sample file downloaded with gdt-data: + + +>>> from gdt.core import data_path +>>> lc_file = data_path / 'hete2-fregate' / 'GAMMA_sum_20020531.lc' +>>> lc_obj = FregateLightCurve.open(lc_file) + +Now let's retrieve some basic information about the file. + +The number of detectors in the file: + +>>> lc_obj.num_dets +4 + +The detectors values in the file: + +>>> lc_obj.detectors +[, + , + , + ] + +The time zero value and GTI contained in the file: + +>>> lc_obj.time_zero +706916972.2000004 +>>> lc_obj.gti + + +Because the file has overlapping energy ranges that are incompatible with some analysis functions, you have +to specify both the detector you are interested in and the energy band index. + +The energy band index has a range of 0 to 3 and the energy bounds can be found for each detector with: + +>>> lc_obj.energy_bands('A') +array([[ 8., 40.], + [ 8., 70.], + [ 32., 400.], + [ 400., 1000.]]) + +The above shows that 0 = 8 -- 40 keV, 1 = 8 -- 70 keV, 2 = 32 -- 400 keV and 3 = 400 -- 1000 keV + + +To retrieve the time bins for detector 'A' for the energy range of 8 -- 70keV: + +>>> lc_obj.time_bin('A', 1) + + +The counts for each bin can be retrieved with: + +>>> lc_obj.time_bins('A', 1).counts +array([250.2, 219.7, 265.5, ..., 256.3, 265.5, 253.3], dtype='>f4') + +The time_energy_bin can be retrieved in a similar manner with: + +>>> lc_obj.time_energy_bins('A', 1) + + + +To retrieve a PHA II object and use it to plot a light curve do the following: + +>>> import matplotlib.pyplot as plt +>>> from gdt.core.plot.lightcurve import Lightcurve +>>> pha = lc_file.phaii('A', 0) +>>> plot = Lightcurve(data=pha.to_lightcurve()) +>>> plt.show() + +.. figure:: figures/lightcurve_plot.png + + + +Reference/API +============= + +.. automodapi:: gdt.missions.hete2.fregate.lightcurve + :inherited-members: + diff --git a/license.txt b/license.txt new file mode 100644 index 0000000..7a4a3ea --- /dev/null +++ b/license.txt @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. \ No newline at end of file diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..301182d --- /dev/null +++ b/requirements.txt @@ -0,0 +1,14 @@ +astro-gdt +pyproj>=1.9.6 +numpy>=1.17.3 +scipy>=1.1.0 +matplotlib +astropy>=5.1 +healpy>=1.12.4 +pytest + +Sphinx +astropy-sphinx-theme +nbsphinx +ipython +sphinx-automodapi diff --git a/setup.py b/setup.py new file mode 100644 index 0000000..e7c593f --- /dev/null +++ b/setup.py @@ -0,0 +1,86 @@ +# CONTAINS TECHNICAL DATA/COMPUTER SOFTWARE DELIVERED TO THE U.S. GOVERNMENT WITH UNLIMITED RIGHTS +# +# Contract No.: CA 80MSFC17M0022 +# Contractor Name: Universities Space Research Association +# Contractor Address: 7178 Columbia Gateway Drive, Columbia, MD 21046 +# +# Copyright 2023 by Universities Space Research Association (USRA). All rights reserved. +# +# Developed by: Cori Fletcher +# Universities Space Research Association +# Science and Technology Institute +# https://sti.usra.edu +# +# Based on the work by: +# William Cleveland and Adam Goldstein +# Universities Space Research Association +# Science and Technology Institute +# https://sti.usra.edu +# and +# Daniel Kocevski +# National Aeronautics and Space Administration (NASA) +# Marshall Space Flight Center +# Astrophysics Branch (ST-12) +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except +# in compliance with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software distributed under the License +# is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or +# implied. See the License for the specific language governing permissions and limitations under the +# License. +# +import sys +from pathlib import Path + +from setuptools import setup, find_namespace_packages + +if __name__ == '__main__': + pwd = Path(__file__).parent + sys.path.append(str(pwd / 'src')) + import gdt.missions.hete2 as hete2 + + setup( + name="astro-gdt-hete2", + version=hete2.__version__, + description="Gamma-ray Data Tools: hete2 Mission", + long_description=(pwd / "PYPI-README.rst").read_text(), + author='C. Fletcher', + url='https://github.com/USRA-STI/gdt-hete2', + packages=find_namespace_packages(where='src', include=["*"]), + classifiers=[ + "Development Status :: 5 - Production/Stable", + "Programming Language :: Python :: 3", + "License :: OSI Approved :: Apache Software License", + "Operating System :: MacOS", + "Operating System :: POSIX :: Linux", + "Topic :: Scientific/Engineering :: Astronomy", + "Topic :: Software Development :: Libraries", + ], + license_files=['license.txt'], + keywords=['astronomy', 'gammaray', 'gamma-ray', 'usra'], + package_dir={"": "src"}, + package_data={ + 'gdt.data': ['hete2-fregate.urls'] + }, + include_package_data=True, + python_requires='>=3.8', + install_requires=[ + 'astro-gdt>=2.0.0', + 'pyproj>=1.9.6', + 'numpy>=1.17.3', + 'scipy>=1.1.0', + 'matplotlib>=3.7.1', + 'astropy>=3.1', + 'healpy>=1.12.4', + 'cartopy>=0.21.1', + ], + project_urls={ + 'Documentation': 'https://astro-gdt-hete2.readthedocs.io/en/latest/', + 'Source': 'https://github.com/USRA-STI/gdt-hete2', + 'Tracker': 'https://github.com/USRA-STI/gdt-hete2/issues', + } + + ) diff --git a/src/gdt/data/hete2-fregate.urls b/src/gdt/data/hete2-fregate.urls new file mode 100644 index 0000000..f86632d --- /dev/null +++ b/src/gdt/data/hete2-fregate.urls @@ -0,0 +1,3 @@ +https://heasarc.gsfc.nasa.gov/FTP/hete2/data/GRBS/lightcurves/GAMMA_sum_20020531.lc +https://heasarc.gsfc.nasa.gov/FTP/hete2/data/timeline/hete_sc_aspect.txt +https://heasarc.gsfc.nasa.gov/FTP/hete2/data/timeline/sc_aspect.dat diff --git a/src/gdt/missions/hete2/__init__.py b/src/gdt/missions/hete2/__init__.py new file mode 100644 index 0000000..a24c3f4 --- /dev/null +++ b/src/gdt/missions/hete2/__init__.py @@ -0,0 +1,38 @@ +# CONTAINS TECHNICAL DATA/COMPUTER SOFTWARE DELIVERED TO THE U.S. GOVERNMENT +# WITH UNLIMITED RIGHTS +# +# Grant No.: 80NSSC21K0651 +# Grantee Name: Universities Space Research Association +# Grantee Address: 425 3rd Street SW, Suite 950, Washington DC 20024 +# +# Copyright (c) 2024 by Universities Space Research Association (USRA). All rights reserved. +# +# Developed by: +# William Cleveland +# Universities Space Research Association +# Science and Technology Institute +# https://sti.usra.edu +# +# This work is a derivative of the Gamma-ray Data Tools (GDT), including the Core and Fermi packages, originally +# developed by the following: +# +# William Cleveland and Adam Goldstein +# Universities Space Research Association +# Science and Technology Institute +# https://sti.usra.edu +# +# Daniel Kocevski +# National Aeronautics and Space Administration (NASA) +# Marshall Space Flight Center +# Astrophysics Branch (ST-12) +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on +# an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations under the License. + +__version__ = '1.0.0' diff --git a/src/gdt/missions/hete2/fregate/__init__.py b/src/gdt/missions/hete2/fregate/__init__.py new file mode 100644 index 0000000..2532ee1 --- /dev/null +++ b/src/gdt/missions/hete2/fregate/__init__.py @@ -0,0 +1,36 @@ +# CONTAINS TECHNICAL DATA/COMPUTER SOFTWARE DELIVERED TO THE U.S. GOVERNMENT +# WITH UNLIMITED RIGHTS +# +# Grant No.: 80NSSC21K0651 +# Grantee Name: Universities Space Research Association +# Grantee Address: 425 3rd Street SW, Suite 950, Washington DC 20024 +# +# Copyright (c) 2024 by Universities Space Research Association (USRA). All rights reserved. +# +# Developed by: +# William Cleveland +# Universities Space Research Association +# Science and Technology Institute +# https://sti.usra.edu +# +# This work is a derivative of the Gamma-ray Data Tools (GDT), including the Core and Fermi packages, originally +# developed by the following: +# +# William Cleveland and Adam Goldstein +# Universities Space Research Association +# Science and Technology Institute +# https://sti.usra.edu +# +# Daniel Kocevski +# National Aeronautics and Space Administration (NASA) +# Marshall Space Flight Center +# Astrophysics Branch (ST-12) +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on +# an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations under the License. diff --git a/src/gdt/missions/hete2/fregate/detectors.py b/src/gdt/missions/hete2/fregate/detectors.py new file mode 100644 index 0000000..cb4ab59 --- /dev/null +++ b/src/gdt/missions/hete2/fregate/detectors.py @@ -0,0 +1,77 @@ +# CONTAINS TECHNICAL DATA/COMPUTER SOFTWARE DELIVERED TO THE U.S. GOVERNMENT +# WITH UNLIMITED RIGHTS +# +# Grant No.: 80NSSC21K0651 +# Grantee Name: Universities Space Research Association +# Grantee Address: 425 3rd Street SW, Suite 950, Washington DC 20024 +# +# Copyright (c) 2024 by Universities Space Research Association (USRA). All rights reserved. +# +# Developed by: +# William Cleveland +# Universities Space Research Association +# Science and Technology Institute +# https://sti.usra.edu +# +# This work is a derivative of the Gamma-ray Data Tools (GDT), including the Core and Fermi packages, originally +# developed by the following: +# +# William Cleveland and Adam Goldstein +# Universities Space Research Association +# Science and Technology Institute +# https://sti.usra.edu +# +# Daniel Kocevski +# National Aeronautics and Space Administration (NASA) +# Marshall Space Flight Center +# Astrophysics Branch (ST-12) +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on +# an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations under the License. +import astropy.units as u +from gdt.core.detector import Detectors + +__all__ = ['FregateDetectors'] + + +class FregateDetectors(Detectors): + """The FREGATE detector name and orientation definitions. + + .. rubric:: Attributes Summary + .. autosummary:: + + azimuth + elevation + full_name + number + zenith + + .. autosummary:: + + from_full_name + from_num + from_str + pointing + skycoord + + .. rubric:: Attributes Documentation + + .. autoattribute:: full_name + .. autoattribute:: number + + .. rubric:: Methods Documentation + + .. automethod:: from_full_name + .. automethod:: from_num + .. automethod:: from_str + """ + A = ('FREGATEA', 0, 0 * u.deg, 180 * u.deg) + B = ('FREGATEB', 1, 0 * u.deg, 180 * u.deg) + C = ('FREGATEC', 2, 0 * u.deg, 180 * u.deg) + D = ('FREGATED', 3, 0 * u.deg, 180 * u.deg) diff --git a/src/gdt/missions/hete2/fregate/lightcurve.py b/src/gdt/missions/hete2/fregate/lightcurve.py new file mode 100644 index 0000000..dba7b14 --- /dev/null +++ b/src/gdt/missions/hete2/fregate/lightcurve.py @@ -0,0 +1,305 @@ +# CONTAINS TECHNICAL DATA/COMPUTER SOFTWARE DELIVERED TO THE U.S. GOVERNMENT +# WITH UNLIMITED RIGHTS +# +# Grant No.: 80NSSC21K0651 +# Grantee Name: Universities Space Research Association +# Grantee Address: 425 3rd Street SW, Suite 950, Washington DC 20024 +# +# Copyright (c) 2024 by Universities Space Research Association (USRA). All rights reserved. +# +# Developed by: +# William Cleveland +# Universities Space Research Association +# Science and Technology Institute +# https://sti.usra.edu +# +# This work is a derivative of the Gamma-ray Data Tools (GDT), including the Core and Fermi packages, originally +# developed by the following: +# +# William Cleveland and Adam Goldstein +# Universities Space Research Association +# Science and Technology Institute +# https://sti.usra.edu +# +# Daniel Kocevski +# National Aeronautics and Space Administration (NASA) +# Marshall Space Flight Center +# Astrophysics Branch (ST-12) +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on +# an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations under the License. +# CONTAINS TECHNICAL DATA/COMPUTER SOFTWARE DELIVERED TO THE U.S. GOVERNMENT +# WITH UNLIMITED RIGHTS +# +# Grant No.: 80NSSC21K0651 +# Grantee Name: Universities Space Research Association +# Grantee Address: 425 3rd Street SW, Suite 950, Washington DC 20024 +# +# Copyright (c) 2024 by Universities Space Research Association (USRA). All rights reserved. +# +# Developed by: +# William Cleveland +# Universities Space Research Association +# Science and Technology Institute +# https://sti.usra.edu +# +# This work is a derivative of the Gamma-ray Data Tools (GDT), including the Core and Fermi packages, originally +# developed by the following: +# +# William Cleveland and Adam Goldstein +# Universities Space Research Association +# Science and Technology Institute +# https://sti.usra.edu +# +# Daniel Kocevski +# National Aeronautics and Space Administration (NASA) +# Marshall Space Flight Center +# Astrophysics Branch (ST-12) +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on +# an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations under the License. +import warnings +from dataclasses import dataclass +from typing import Optional, Union, List, Dict + +import astropy.io.fits as fits +import numpy as np +from astropy.time import Time + +from gdt.core.file import FitsFileContextManager +from gdt.core.phaii import Phaii +from gdt.core.data_primitives import Gti, TimeEnergyBins, TimeBins + +from .detectors import FregateDetectors + +__all__ = ['FregateLightCurve', 'FregatePhaii'] + + +@dataclass +class FregateLightCurveData: + tstart: np.ndarray + counts: np.ndarray + energy_bands: np.ndarray + time_delta: float + + +class FregatePhaii(Phaii): + """Subclass Phaii to provide default header definitions for the Phaii extracted + from the light curve files.""" + + def _build_hdulist(self): + """create FITS and primary header""" + hdulist = fits.HDUList() + primary_hdu = fits.PrimaryHDU() + hdulist.append(primary_hdu) + + """ create the ebounds extension""" + ebounds_hdu = self._ebounds_table() + hdulist.append(ebounds_hdu) + + """create the spectrum extension""" + spectrum_hdu = self._spectrum_table() + hdulist.append(spectrum_hdu) + + """ create the GTI extension""" + gti_hdu = self._gti_table() + hdulist.append(gti_hdu) + + return hdulist + + def _ebounds_table(self): + chan_col = fits.Column(name='CHANNEL', format='1I', + array=np.arange(self.num_chans, dtype=int)) + emin_col = fits.Column(name='E_MIN', format='1E', unit='keV', + array=self.ebounds.low_edges()) + emax_col = fits.Column(name='E_MAX', format='1E', unit='keV', + array=self.ebounds.high_edges()) + + hdu = fits.BinTableHDU.from_columns([chan_col, emin_col, emax_col]) + + return hdu + + def _spectrum_table(self): + tstart = np.copy(self.data.tstart) + tstop = np.copy(self.data.tstop) + if self.trigtime is not None: + tstart += self.trigtime + tstop += self.trigtime + + counts_col = fits.Column(name='COUNTS', + format='{}I'.format(self.num_chans), + bzero=32768, bscale=1, unit='count', + array=self.data.counts) + expos_col = fits.Column(name='EXPOSURE', format='1E', unit='s', + array=self.data.exposure) + time_col = fits.Column(name='TIME', format='1D', unit='s', + bzero=self.trigtime, array=tstart) + endtime_col = fits.Column(name='ENDTIME', format='1D', unit='s', + bzero=self.trigtime, array=tstop) + hdu = fits.BinTableHDU.from_columns([counts_col, expos_col, + time_col, endtime_col]) + + return hdu + + def _gti_table(self): + tstart = np.array(self.gti.low_edges()) + tstop = np.array(self.gti.high_edges()) + + start_col = fits.Column(name='START', format='1D', unit='s', + bzero=self.trigtime, array=tstart) + stop_col = fits.Column(name='STOP', format='1D', unit='s', + bzero=self.trigtime, array=tstop) + hdu = fits.BinTableHDU.from_columns([start_col, stop_col]) + + return hdu + + +class FregateLightCurve(FitsFileContextManager): + """FREGATE lightcurve file containing PHAII from multiple detectors. + """ + + def __init__(self): + super().__init__() + self._data: Dict[FregateDetectors, FregateLightCurveData] = {} + self.time_zero: Optional[float] = None + self._gti: Optional[Gti] = None + + def _data_from_hdu(self, hdu: fits.BinTableHDU): + + detector = FregateDetectors.from_full_name(hdu.header['INSTRUME']) + + # Retrieve the data from the HDU + self._data[detector] = FregateLightCurveData( + tstart=hdu.data['TIME'], # Start time of each bin + counts=hdu.data['RATE'], # 2D array containing counts by energy band + energy_bands=np.array( # The energy bands defined in the light curve file + [[hdu.header['E_MIN1'] if 'E_MIN1' in hdu.header else 8.0, + hdu.header['E_MIN2'] if 'E_MIN2' in hdu.header else 8.0, + hdu.header['E_MIN3'] if 'E_MIN3' in hdu.header else 32.0, + hdu.header['E_MIN4'] if 'E_MIN4' in hdu.header else 400.0], + [hdu.header['E_MAX1'] if 'E_MAX1' in hdu.header else 40.0, + hdu.header['E_MAX2'] if 'E_MAX2' in hdu.header else 70.0, + hdu.header['E_MAX3'] if 'E_MAX3' in hdu.header else 400.0, + hdu.header['E_MAX4'] if 'E_MAX4' in hdu.header else 1000.0]]).T, + time_delta=hdu.header['TIMEDEL'] # The size of each bin in seconds + ) + t0 = Time(hdu.header['TIMEZERO'], format='decimalyear').gps # Time of the detection + if self.time_zero is None: + self.time_zero = t0 + elif self.time_zero != t0: + warnings.warn(f'Time zero value for detector {detector} is different from previous read time zero') + + @property + def detectors(self) -> List[FregateDetectors]: + """(list): The detectors in the file""" + return list(self._data.keys()) + + @property + def num_dets(self) -> int: + """(int): Number of detectors in the file""" + return len(self.detectors) + + @staticmethod + def _detector_from_value(value: Union[str, int, FregateDetectors]) -> FregateDetectors: + if isinstance(value, FregateDetectors): + index = value + elif isinstance(value, str): + try: + index = FregateDetectors.from_str(value) + except ValueError: + index = FregateDetectors.from_full_name(value) + elif isinstance(value, int): + index = FregateDetectors.from_num(value) + else: + raise TypeError('value must be a str, int, or FregateDetectors object') + return index + + def energy_bands(self, detector: Union[FregateDetectors, str, int]): + data = self._data[self._detector_from_value(detector)] + return data.energy_bands + + def num_energy_bands(self, detector: Union[FregateDetectors, str, int]): + return self.energy_bands(detector).shape[1] + + def time_bins(self, detector: Union[FregateDetectors, str, int], energy_band: int) -> TimeBins: + data = self._data[self._detector_from_value(detector)] + return TimeBins(counts=data.counts[:, energy_band], lo_edges=data.tstart, + hi_edges=data.tstart + data.time_delta, exposure=[data.time_delta] * data.counts.shape[0]) + + def time_energy_bins(self, detector: Union[str, int, FregateDetectors], energy_band: int) -> TimeEnergyBins: + """Retrieve the TimeEnergyBins object for the given detector. + + Args: + detector (str, int, or :class:`FregateDetectors`) + energy_band (int) + + Returns: + (:class:`TimeEnergyBins`) + """ + data = self._data[self._detector_from_value(detector)] + return TimeEnergyBins(counts=data.counts[:, energy_band].reshape(-1, 1), + tstart=data.tstart, tstop=data.tstart + data.time_delta, + exposure=[data.time_delta] * data.counts.shape[0], + emin=data.energy_bands[energy_band, 0].reshape(-1, 1), + emax=data.energy_bands[energy_band, 1].reshape(-1, 1)) + + def phaii(self, detector: Union[str, int, FregateDetectors], energy_band: int) -> Phaii: + """Retrieve the Phaii object for the given detector. + + Args: + detector (str, int, or :class:`FregateDetectors`) + energy_band (int) + + Returns: + (:class:`Phaii`) + """ + data = self._data[self._detector_from_value(detector)] + return FregatePhaii.from_data(self.time_energy_bins(detector, energy_band), + gti=self._gti, trigger_time=self.time_zero) + + @property + def gti(self) -> Gti: + """Retrieve the GTI extension data. + + Returns: + (:class:`Gti`) + """ + return self._gti + + @classmethod + def open(cls, file_path, **kwargs): + """Open a FREGATE file containing PHA time series from multiple detectors. + + Args: + file_path (str): The file path + + Returns: + (:class:`FregateLightCurve`) + """ + obj = super().open(file_path, **kwargs) + + # Populate the EnergyTimeBins + for i in range(1, len(obj.hdulist) - 1): + hdu = obj.hdulist[i] + obj._data_from_hdu(hdu) + + # Retrieve the GTI + data = obj.hdulist[-1].data + obj._gti = Gti.from_bounds(data['START'], data['STOP']) + obj.close() + return obj + + def __repr__(self): + return f'<{self.__class__.__name__}: {self.num_dets} detectors>' diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 0000000..45f26f5 --- /dev/null +++ b/tests/__init__.py @@ -0,0 +1,40 @@ +# CONTAINS TECHNICAL DATA/COMPUTER SOFTWARE DELIVERED TO THE U.S. GOVERNMENT +# WITH UNLIMITED RIGHTS +# +# Grant No.: 80NSSC21K0651 +# Grantee Name: Universities Space Research Association +# Grantee Address: 425 3rd Street SW, Suite 950, Washington DC 20024 +# +# Copyright (c) 2024 by Universities Space Research Association (USRA). All rights reserved. +# +# Developed by: +# William Cleveland +# Universities Space Research Association +# Science and Technology Institute +# https://sti.usra.edu +# +# This work is a derivative of the Gamma-ray Data Tools (GDT), including the Core and Fermi packages, originally +# developed by the following: +# +# William Cleveland and Adam Goldstein +# Universities Space Research Association +# Science and Technology Institute +# https://sti.usra.edu +# +# Daniel Kocevski +# National Aeronautics and Space Administration (NASA) +# Marshall Space Flight Center +# Astrophysics Branch (ST-12) +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on +# an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations under the License. + +from pathlib import Path + +tests_path = Path(__file__).parent diff --git a/tests/missions/__init__.py b/tests/missions/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/missions/hete2/__init__.py b/tests/missions/hete2/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/missions/hete2/fregate/__init__.py b/tests/missions/hete2/fregate/__init__.py new file mode 100644 index 0000000..2532ee1 --- /dev/null +++ b/tests/missions/hete2/fregate/__init__.py @@ -0,0 +1,36 @@ +# CONTAINS TECHNICAL DATA/COMPUTER SOFTWARE DELIVERED TO THE U.S. GOVERNMENT +# WITH UNLIMITED RIGHTS +# +# Grant No.: 80NSSC21K0651 +# Grantee Name: Universities Space Research Association +# Grantee Address: 425 3rd Street SW, Suite 950, Washington DC 20024 +# +# Copyright (c) 2024 by Universities Space Research Association (USRA). All rights reserved. +# +# Developed by: +# William Cleveland +# Universities Space Research Association +# Science and Technology Institute +# https://sti.usra.edu +# +# This work is a derivative of the Gamma-ray Data Tools (GDT), including the Core and Fermi packages, originally +# developed by the following: +# +# William Cleveland and Adam Goldstein +# Universities Space Research Association +# Science and Technology Institute +# https://sti.usra.edu +# +# Daniel Kocevski +# National Aeronautics and Space Administration (NASA) +# Marshall Space Flight Center +# Astrophysics Branch (ST-12) +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on +# an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations under the License. diff --git a/tests/missions/hete2/fregate/test_lightcurve.py b/tests/missions/hete2/fregate/test_lightcurve.py new file mode 100644 index 0000000..8e37807 --- /dev/null +++ b/tests/missions/hete2/fregate/test_lightcurve.py @@ -0,0 +1,103 @@ +# CONTAINS TECHNICAL DATA/COMPUTER SOFTWARE DELIVERED TO THE U.S. GOVERNMENT +# WITH UNLIMITED RIGHTS +# +# Grant No.: 80NSSC21K0651 +# Grantee Name: Universities Space Research Association +# Grantee Address: 425 3rd Street SW, Suite 950, Washington DC 20024 +# +# Copyright (c) 2024 by Universities Space Research Association (USRA). All rights reserved. +# +# Developed by: +# William Cleveland +# Universities Space Research Association +# Science and Technology Institute +# https://sti.usra.edu +# +# This work is a derivative of the Gamma-ray Data Tools (GDT), including the Core and Fermi packages, originally +# developed by the following: +# +# William Cleveland and Adam Goldstein +# Universities Space Research Association +# Science and Technology Institute +# https://sti.usra.edu +# +# Daniel Kocevski +# National Aeronautics and Space Administration (NASA) +# Marshall Space Flight Center +# Astrophysics Branch (ST-12) +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on +# an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations under the License. + +import unittest +from gdt.core import data_path +from gdt.core.data_primitives import TimeBins, TimeEnergyBins, Gti + +from gdt.missions.hete2.fregate.detectors import FregateDetectors +from gdt.missions.hete2.fregate.lightcurve import FregateLightCurve, FregatePhaii + + +class TestFregateLightCurve(unittest.TestCase): + lc_file: FregateLightCurve + + @classmethod + def setUpClass(cls): + path = data_path / 'hete2-fregate' / 'GAMMA_sum_20020531.lc' + cls.lc_file = FregateLightCurve.open(path) + + @classmethod + def tearDownClass(cls): + cls.lc_file.close() + + def test_metadata(self): + self.assertEqual(self.lc_file.num_dets, 4) + self.assertEqual(self.lc_file.detectors, [FregateDetectors.A, FregateDetectors.B, + FregateDetectors.C, FregateDetectors.D]) + self.assertEqual(self.lc_file.time_zero, 706916972.2000004) + + def test_time_bins(self): + time_bin = self.lc_file.time_bins('A', 0) + self.assertEqual(type(time_bin), TimeBins) + self.assertAlmostEqual(time_bin.range[0], -403.381, places=3) + self.assertAlmostEqual(time_bin.range[1], 83885.53, places=2) + self.assertEqual(len(time_bin.counts), 73620) + + def test_time_energy_bins(self): + te_bins = self.lc_file.time_energy_bins('A', 0) + self.assertEqual(type(te_bins), TimeEnergyBins) + self.assertAlmostEqual(te_bins.tstart[0], -403.381, places=3) + self.assertAlmostEqual(te_bins.tstop[-1], 83885.53, places=2) + self.assertEqual(len(te_bins.counts), 73620) + self.assertEqual(te_bins.energy_range[0], 8.0) + self.assertEqual(te_bins.energy_range[1], 40.0) + + def test_phaii(self): + pha = self.lc_file.phaii('B', 2) + self.assertEqual(type(pha), FregatePhaii) + self.assertEqual(pha.ebounds.num_intervals, 1) + self.assertEqual(pha.ebounds.range[0], 32.0) + self.assertEqual(pha.ebounds.range[1], 400.0) + self.assertAlmostEqual(pha.time_range[0], -403.381, places=3) + self.assertAlmostEqual(pha.time_range[1], 83885.53, places=2) + self.assertAlmostEqual(pha.trigtime, 706916972.2000, places=4) + self.assertEqual(type(pha.gti), Gti) + self.assertEqual(pha.gti.num_intervals, 22) + self.assertAlmostEqual(pha.gti.range[0], -395.517, places=3) + self.assertAlmostEqual(pha.gti.range[1], 83884.219, places=3) + + def test_gti(self): + gti = self.lc_file.gti + self.assertEqual(type(gti), Gti) + self.assertEqual(gti.num_intervals, 22) + self.assertAlmostEqual(gti.range[0], -395.517, places=3) + self.assertAlmostEqual(gti.range[1], 83884.219, places=3) + + +if __name__ == '__main__': + unittest.main()