#!/usr/bin/env python
from BurstCube.LocSim.Detector import Detector
import numpy as np
[docs]class Spacecraft(object):
'''The pointings are just key,item pairs of the pointing directions of
the detectors on the spacecraft (respect to 0,0 at zenith).
The default are 12 detectors pointing every 30 degrees in
azimuth and 15 degrees in zenith (offset a bit).'''
def __init__(self, pointings={'01': ('0:0:0', '5:0:0'),
'02': ('30:0:0', '20:0:0'),
'03': ('60:0:0', '35:0:0'),
'04': ('90:0:0', '10:0:0'),
'05': ('120:0:0', '25:0:0'),
'06': ('150:0:0', '40:0:0'),
'07': ('180:0:0', '15:0:0'),
'08': ('210:0:0', '30:0:0'),
'09': ('240:0:0', '45:0:0'),
'10': ('270:0:0', '20:0:0'),
'11': ('300:0:0', '35:0:0'),
'12': ('330:0:0', '50:0:0')},
lat="37:56:24.7",
lon="75:27:59",
elev=550e3,
window=4.,
background_rate=10.,
noise=True):
self.lon = lon
self.lat = lat
self.elev = elev
self.pointings = pointings
self.detectors = [Detector(
name=pointing,
azimuth_angle=pointings[pointing][0],
zenith_angle=pointings[pointing][1],
noise=noise,
background_rate=background_rate,
window=window,
lon=self.lon,
lat=self.lat,
elev=self.elev) for pointing in pointings]
self._dummyDet = Detector(name='dummy',
lon=self.lon,
lat=self.lat,
elev=self.elev)
@property
def detnum(self):
return len(self.detectors)
[docs] def throw_grb(self, grb):
return [detector.throw_grb(grb) for detector in self.detectors]
[docs] def throw_grbs(self, grbs, scaled=False, save=False,
filename='grbs.pkl'):
grb_sample = [[detector.throw_grb(grb)
for detector in self.detectors]
for grb in grbs]
grb_rec = np.zeros((len(grb_sample),
self.detnum), dtype=float)
grb_rec_err = np.zeros((len(grb_sample),
self.detnum), dtype=float)
[[grb_rec.itemset((i, int(det['name']) - 1), det['counts'])
for det in sample]
for i, sample in enumerate(grb_sample)]
[[grb_rec_err.itemset((i, int(det['name']) - 1),
det['counts_err'])
for det in sample]
for i, sample in enumerate(grb_sample)]
grb_rec_err[grb_rec < 0.] = 0.
grb_rec[grb_rec < 0.] = 0.
if scaled:
# mask = grb_rec > 0.
scaled_rec = np.array([rec/rec.max()
for rec in grb_rec])
# Here we set the error to just be the
# scaled error on the max if the
# measurement is 0 so we can get around
# the divide by zero in the
# error propagation.
np.seterr(divide='ignore')
scaled_rec_err = scaled_rec*[np.sqrt(
(np.nan_to_num(np.divide(
grb_rec_err[idx], rec)))**2 +
(np.nan_to_num(np.divide(
grb_rec_err[idx][rec.argmax()],
rec.max())))**2)
for idx, rec in enumerate(
grb_rec)]
# grb_rec = np.round(100.*scaled_rec).astype('int32')
# grb_rec_err =
# np.round(100.*scaled_rec_err).astype('int32')
grb_rec = 100.*scaled_rec
grb_rec_err = 100.*scaled_rec_err
return np.array(list(zip(grb_rec, grb_rec_err)))