GBM-data-tools/test/test_specfitter.py

118 lines
5.6 KiB
Python

#
# 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/>.
#
import unittest
import os
import numpy as np
from gbm.spectra.fitting import SpectralFitterPgstat, SpectralFitterChisq
from gbm.spectra.fitting import SpectralFitterPstat, SpectralFitterCstat
from gbm.spectra.functions import Comptonized
from gbm.data import PHA, RSP
data_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'data')
class TestSpectralFitter(unittest.TestCase):
pha = PHA.open(os.path.join(data_dir, 'sim_pha.pha'))
bkgd = np.load(os.path.join(data_dir, 'sim_bkgd.npy'), allow_pickle=True)[0]
rsp = RSP.open(os.path.join(data_dir, 'glg_cspec_n9_bn090131090_v00.rsp2'))
def test_pgstat(self):
fitter = SpectralFitterPgstat([self.pha], [self.bkgd], [self.rsp],
method='TNC')
fitter.fit(Comptonized(), options={'maxiter': 10000})
self.assertEqual(fitter.dof, 117)
self.assertEqual(fitter.function_name, 'Comptonized')
self.assertEqual(fitter.num_components, 1)
self.assertEqual(fitter.detectors, ['n9'])
self.assertAlmostEqual(fitter.energy_range[0], 8.0, places=0)
self.assertAlmostEqual(fitter.energy_range[1], 908.0, places=0)
self.assertEqual(fitter.num_sets, 1)
self.assertEqual(fitter.success, True)
self.assertAlmostEqual(fitter.parameters[0], 1.0, delta=0.2)
self.assertAlmostEqual(fitter.parameters[1], 220., delta=100.)
self.assertAlmostEqual(fitter.parameters[2], -1.2, delta=0.2)
self.assertEqual(fitter.jacobian.size, 3)
self.assertEqual(fitter.hessian.size, 9)
self.assertEqual(fitter.covariance.size, 9)
def test_chisq(self):
fitter = SpectralFitterChisq([self.pha], [self.bkgd], [self.rsp],
method='TNC')
fitter.fit(Comptonized(), options={'maxiter': 10000})
self.assertEqual(fitter.dof, 117)
self.assertEqual(fitter.function_name, 'Comptonized')
self.assertEqual(fitter.num_components, 1)
self.assertEqual(fitter.detectors, ['n9'])
self.assertAlmostEqual(fitter.energy_range[0], 8.0, places=0)
self.assertAlmostEqual(fitter.energy_range[1], 908.0, places=0)
self.assertEqual(fitter.num_sets, 1)
self.assertEqual(fitter.success, True)
self.assertAlmostEqual(fitter.parameters[0], 1.0, delta=0.1)
self.assertAlmostEqual(fitter.parameters[1], 220.0, delta=10.)
self.assertAlmostEqual(fitter.parameters[2], -1.2, delta=0.1)
self.assertEqual(fitter.jacobian.size, 3)
self.assertEqual(fitter.hessian.size, 9)
self.assertEqual(fitter.covariance.size, 9)
def test_cstat(self):
fitter = SpectralFitterCstat([self.pha], [self.bkgd], [self.rsp],
method='TNC')
fitter.fit(Comptonized(), options={'maxiter': 10000})
self.assertEqual(fitter.dof, 117)
self.assertEqual(fitter.function_name, 'Comptonized')
self.assertEqual(fitter.num_components, 1)
self.assertEqual(fitter.detectors, ['n9'])
self.assertAlmostEqual(fitter.energy_range[0], 8.0, places=0)
self.assertAlmostEqual(fitter.energy_range[1], 908.0, places=0)
self.assertEqual(fitter.num_sets, 1)
self.assertEqual(fitter.success, True)
self.assertAlmostEqual(fitter.parameters[0], 1.0, delta=0.1)
self.assertAlmostEqual(fitter.parameters[1], 220.0, delta=30.)
self.assertAlmostEqual(fitter.parameters[2], -1.2, delta=0.1)
self.assertEqual(fitter.jacobian.size, 3)
self.assertEqual(fitter.hessian.size, 9)
self.assertEqual(fitter.covariance.size, 9)
def test_pstat(self):
fitter = SpectralFitterPstat([self.pha], [self.bkgd], [self.rsp],
method='TNC')
fitter.fit(Comptonized(), options={'maxiter': 10000})
self.assertEqual(fitter.dof, 117)
self.assertEqual(fitter.function_name, 'Comptonized')
self.assertEqual(fitter.num_components, 1)
self.assertEqual(fitter.detectors, ['n9'])
self.assertAlmostEqual(fitter.energy_range[0], 8.0, places=0)
self.assertAlmostEqual(fitter.energy_range[1], 908.0, places=0)
self.assertEqual(fitter.num_sets, 1)
self.assertEqual(fitter.success, True)
self.assertAlmostEqual(fitter.parameters[0], 1.0, delta=0.1)
self.assertAlmostEqual(fitter.parameters[1], 220.0, delta=30.)
self.assertAlmostEqual(fitter.parameters[2], -1.2, delta=0.1)
self.assertEqual(fitter.jacobian.size, 3)
self.assertEqual(fitter.hessian.size, 9)
self.assertEqual(fitter.covariance.size, 9)