136 lines
4.0 KiB
Python
136 lines
4.0 KiB
Python
# detectors.py: Module containing the GBM detector definitions
|
|
#
|
|
# Authors: William Cleveland (USRA),
|
|
# Adam Goldstein (USRA) and
|
|
# Daniel Kocevski (NASA)
|
|
#
|
|
# Portions of the code are Copyright 2020 William Cleveland and
|
|
# Adam Goldstein, Universities Space Research Association
|
|
# All rights reserved.
|
|
#
|
|
# Written for the Fermi Gamma-ray Burst Monitor (Fermi-GBM)
|
|
#
|
|
# This program is free software: you can redistribute it and/or modify
|
|
# it under the terms of the GNU General Public License as published by
|
|
# the Free Software Foundation, either version 3 of the License, or
|
|
# (at your option) any later version.
|
|
#
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
#
|
|
from enum import Enum
|
|
|
|
|
|
class Detector(Enum):
|
|
"""The GBM detector names and pointings.
|
|
|
|
Attributes:
|
|
pointing (float, float): The spacecraft Azimuth/Zenith pointing
|
|
short_name (str): The short name of the detector (e.g. NaI 0 -> 'n0')
|
|
"""
|
|
N0 = ('NAI_00', 0, 45.89, 20.58)
|
|
N1 = ('NAI_01', 1, 45.11, 45.31)
|
|
N2 = ('NAI_02', 2, 58.44, 90.21)
|
|
N3 = ('NAI_03', 3, 314.87, 45.24)
|
|
N4 = ('NAI_04', 4, 303.15, 90.27)
|
|
N5 = ('NAI_05', 5, 3.35, 89.79)
|
|
N6 = ('NAI_06', 6, 224.93, 20.43)
|
|
N7 = ('NAI_07', 7, 224.62, 46.18)
|
|
N8 = ('NAI_08', 8, 236.61, 89.97)
|
|
N9 = ('NAI_09', 9, 135.19, 45.55)
|
|
NA = ('NAI_10', 10, 123.73, 90.42)
|
|
NB = ('NAI_11', 11, 183.74, 90.32)
|
|
B0 = ('BGO_00', 12, 0.00, 90.00)
|
|
B1 = ('BGO_01', 13, 180.00, 90.00)
|
|
|
|
def __init__(self, long_name, number, azimuth, zenith):
|
|
self.long_name = long_name
|
|
self.number = number
|
|
self.azimuth = azimuth
|
|
self.zenith = zenith
|
|
|
|
def __repr__(self):
|
|
return "Detector(\"{}\", \"{}\", {})".format(self.name, self.long_name,
|
|
self.number)
|
|
|
|
def __str__(self):
|
|
return str.lower(self.name)
|
|
|
|
@property
|
|
def short_name(self):
|
|
return self.__str__()
|
|
|
|
@property
|
|
def pointing(self):
|
|
return self.azimuth, self.zenith
|
|
|
|
def is_nai(self):
|
|
"""Check if detector is an NaI
|
|
|
|
Returns:
|
|
bool: True if detector is NaI, False otherwise.
|
|
"""
|
|
return self.name[0] == 'N'
|
|
|
|
def is_bgo(self):
|
|
"""Check if detector is a BGO
|
|
|
|
Returns:
|
|
bool: True if detector is BGO, False otherwise.
|
|
"""
|
|
return self.name[0] == 'B'
|
|
|
|
@classmethod
|
|
def from_str(cls, value):
|
|
"""Create a Detector from a short string name (e.g. 'n0')
|
|
|
|
Args:
|
|
value (str): The short name
|
|
|
|
Returns:
|
|
:class:`Detector`: The detector enum
|
|
"""
|
|
if value.upper() in cls.__members__:
|
|
return cls[value.upper()]
|
|
# TODO: Reconsider returning None
|
|
return None
|
|
|
|
@classmethod
|
|
def from_num(cls, num):
|
|
"""Create a Detector from an index number
|
|
|
|
Args:
|
|
num (int): The index number
|
|
|
|
Returns:
|
|
:class:`Detector`: The detector enum
|
|
"""
|
|
for d in cls:
|
|
if d.number == num:
|
|
return d
|
|
# TODO: Reconsider returning None
|
|
return None
|
|
|
|
@classmethod
|
|
def nai(cls):
|
|
"""Get all detectors that are NaIs
|
|
|
|
Returns:
|
|
list of :class:`Detector`: The NaI detectors
|
|
"""
|
|
return [x for x in cls if x.is_nai()]
|
|
|
|
@classmethod
|
|
def bgo(cls):
|
|
"""Get all detectors that are BGOs
|
|
|
|
Returns:
|
|
list of :class:`Detector`: The BGO detectors
|
|
"""
|
|
return [x for x in Detector if x.is_bgo()]
|