/*************************************************************************** * test_SPI.cpp - Test INTEGRAL/SPI classes * * ----------------------------------------------------------------------- * * copyright (C) 2020 by Juergen Knoedlseder * * ----------------------------------------------------------------------- * * * * 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 . * * * ***************************************************************************/ /** * @file test_SPI.cpp * @brief INTEGRAL/SPI test class implementation * @author Juergen Knoedlseder */ /* __ Includes ___________________________________________________________ */ #ifdef HAVE_CONFIG_H #include #endif #include // getenv #include "GTools.hpp" #include "test_SPI.hpp" /* __ Namespaces _________________________________________________________ */ /* __ Globals ____________________________________________________________ */ /* __ Constants __________________________________________________________ */ const std::string datadir = std::getenv("TEST_SPI_DATA"); const std::string spi_caldb = datadir + "/../../caldb"; const std::string og_dol = datadir+"/obs/og_spi.fits"; /***********************************************************************//** * @brief Set INTEGRAL/SPI test methods ***************************************************************************/ void TestGSPI::set(void) { // Set test name name("GSPI"); // Append tests to test suite append(static_cast(&TestGSPI::test_instdir), "Test GSPIInstDir"); append(static_cast(&TestGSPI::test_eventbin), "Test GSPIEventBin"); append(static_cast(&TestGSPI::test_eventcube), "Test GSPIEventCube"); append(static_cast(&TestGSPI::test_modeldataspace), "Test GSPIModelDataSpace"); append(static_cast(&TestGSPI::test_obs), "Test GSPIObservation"); append(static_cast(&TestGSPI::test_response), "Test GSPIResponse"); append(static_cast(&TestGSPI::test_tools), "Test GSPITools"); // Return return; } /***********************************************************************//** * @brief Clone test suite * * @return Pointer to deep copy of test suite. ***************************************************************************/ TestGSPI* TestGSPI::clone(void) const { // Clone test suite return new TestGSPI(*this); } /***********************************************************************//** * @brief Test GSPIInstDir class ***************************************************************************/ void TestGSPI::test_instdir(void) { // Test content of void class GSPIInstDir dir1; test_value(dir1.classname(), "GSPIInstDir", "Void instance classname"); test_value(dir1.dir().ra_deg(), 0.0, "Void instance Right Ascension"); test_value(dir1.dir().dec_deg(), 0.0, "Void instance Declination"); test_value(dir1.detid(), 0, "Void instance detector identifier"); // Test content of filled class GSkyDir dir; dir.radec_deg(83.6331, 22.0145); GSPIInstDir dir2(dir, 13); test_value(dir2.dir().ra_deg(), 83.6331, "Filled instance Right Ascension"); test_value(dir2.dir().dec_deg(), 22.0145, "Filled instance Declination"); test_value(dir2.detid(), 13, "Filled instance detector identifier"); // Test content of copied class GSPIInstDir dir3 = dir2; test_value(dir3.dir().ra_deg(), 83.6331, "Copied instance Right Ascension"); test_value(dir3.dir().dec_deg(), 22.0145, "Copied instance Declination"); test_value(dir3.detid(), 13, "Copied instance detector identifier"); // Test content of copy-constructed class GSPIInstDir dir4(dir3); test_value(dir4.dir().ra_deg(), 83.6331, "Copied instance Right Ascension"); test_value(dir4.dir().dec_deg(), 22.0145, "Copied instance Declination"); test_value(dir4.detid(), 13, "Copied instance detector identifier"); // Test setters and getters dir.radec_deg(299.5903, 35.2016); dir4.dir(dir); dir4.detid(1); test_value(dir4.dir().ra_deg(), 299.5903, "Get Right Ascension"); test_value(dir4.dir().dec_deg(), 35.2016, "Get Declination"); test_value(dir4.detid(), 1, "Get detector identifier"); // Return return; } /***********************************************************************//** * @brief Test GSPIEventBin class ***************************************************************************/ void TestGSPI::test_eventbin(void) { // Test content of void bin GSPIEventBin bin1; test_value(bin1.classname(), "GSPIEventBin", "Void instance classname"); test_value(bin1.dir().dir().ra_deg(), 0.0, "Void instance Right Ascension"); test_value(bin1.dir().dir().dec_deg(), 0.0, "Void instance Declination"); test_value(bin1.dir().detid(), 0, "Void instance detector identifier"); test_value(bin1.energy().keV(), 0.0, "Void instance energy"); test_value(bin1.time().secs(), 0.0, "Void instance time"); test_value(bin1.counts(), 0.0, "Void instance counts"); test_value(bin1.error(), 0.0, "Void instance error"); test_value(bin1.ontime(), 0.0, "Void instance ontime"); test_value(bin1.livetime(), 0.0, "Void instance livetime"); test_value(bin1.index(), -1, "Void instance index"); test_value(bin1.ipt(), -1, "Void instance pointing index"); test_value(bin1.idir(), -1, "Void instance direction index"); test_value(bin1.iebin(), -1, "Void instance energy bin index"); // Test counts setter and getter bin1.counts(41.0); test_value(bin1.counts(), 41.0, "Counts getter"); // Return return; } /***********************************************************************//** * @brief Test GSPIEventCube class ***************************************************************************/ void TestGSPI::test_eventcube(void) { // Test content of void cube GSPIEventCube cube1; test_value(cube1.classname(), "GSPIEventCube", "Void instance classname"); test_value(cube1.size(), 0, "Void instance size"); test_value(cube1.dim(), 3, "Void instance dimensions"); test_value(cube1.naxis(0), 0, "Void instance pointings"); test_value(cube1.naxis(1), 0, "Void instance detectors"); test_value(cube1.naxis(2), 0, "Void instance energy bins"); test_value(cube1.number(), 0, "Void instance number of events"); test_value(cube1.ontime(), 0.0, "Void instance ontime"); test_value(cube1.livetime(), 0.0, "Void instance livetime"); test_value(cube1.models(), 0, "Void instance models"); // Test loading of Observation Group cube1.load(og_dol); test_value(cube1.size(), 16720, "Loaded instance size"); test_value(cube1.dim(), 3, "Loaded instance dimensions"); test_value(cube1.naxis(0), 88, "Loaded instance pointings"); test_value(cube1.naxis(1), 19, "Loaded instance detectors"); test_value(cube1.naxis(2), 10, "Loaded instance energy bins"); test_value(cube1.number(), 101269457, "Loaded instance number of events"); test_value(cube1.ontime(), 193966.8178673, "Loaded instance ontime"); test_value(cube1.livetime(), 170657.5371606, "Loaded instance livetime"); test_value(cube1.models(), 1, "Loaded instance models"); test_value(cube1.model_counts(0), 101269456.964783, "Loaded instance model counts"); test_value(cube1.ptid(7), "00440010.000000", "Loaded instance ptid(7)"); test_value(cube1.dir(11,9).dir().ra_deg(), 83.77876, "Loaded instance RA"); test_value(cube1.dir(11,9).dir().dec_deg(), 22.03696, "Loaded instance RA"); test_value(cube1.spi_x(11).ra_deg(), 83.77876, "Loaded instance RA_X"); test_value(cube1.spi_x(11).dec_deg(), 22.03696, "Loaded instance DEC_X"); test_value(cube1.spi_z(11).ra_deg(), 354.8671, "Loaded instance RA_Z"); test_value(cube1.spi_z(11).dec_deg(), -2.686594, "Loaded instance DEC_Z"); // Test one event bin const GSPIEventBin* bin1 = cube1[45]; test_value(bin1->dir().dir().ra_deg(), 87.98045, "Bin[45] RA"); test_value(bin1->dir().dir().dec_deg(), 17.98266, "Bin[45] DEC"); test_value(bin1->dir().detid(), 4, "Bin[45] detector identifier"); test_value(bin1->energy().keV(), 262.5, "Bin[45] energy"); test_value(bin1->time().secs(), -216415756.731, "Bin[45] time"); test_value(bin1->counts(), 4766.0, "Bin[45] counts"); test_value(bin1->error(), 69.03622, "Bin[45] error"); test_value(bin1->ontime(), 2928.9207878, "Bin[45] ontime"); test_value(bin1->livetime(), 2578.60894906, "Bin[45] livetime"); test_value(bin1->index(), 45, "Bin[45] index"); test_value(bin1->ipt(), 0, "Bin[45] pointing index"); test_value(bin1->idir(), 4, "Bin[45] direction index"); test_value(bin1->iebin(), 5, "Bin[45] energy bin index"); // Return return; } /***********************************************************************//** * @brief Test GSPIModelDataSpace class ***************************************************************************/ void TestGSPI::test_modeldataspace(void) { // Test content of void model GSPIModelDataSpace model1; test_value(model1.classname(), "GSPIModelDataSpace", "Void instance classname"); test_value(model1.type(), "DataSpace", "Void instance type"); test_value(model1.size(), 0, "Void instance size"); test_value(model1.instruments(), "SPI", "Void instance instruments"); test_assert(model1.is_constant(), "Void instance is_constant"); GXmlElement xml; model1.write(xml); model1.read(*xml.element(0)); test_value(model1.type(), "DataSpace", "Void instance type"); test_value(model1.size(), 0, "Void instance size"); test_value(model1.instruments(), "SPI", "Void instance instruments"); test_assert(model1.is_constant(), "Void instance is_constant"); // Construct "orbit" model from OG GSPIObservation obs(og_dol); GSPIModelDataSpace model2(obs, "GEDSAT", "orbit", 0); test_value(model2.type(), "DataSpace", "ORBIT instance type"); test_value(model2.size(), 1, "ORBIT instance size"); test_value(model2.instruments(), "SPI", "ORBIT instance instruments"); test_value(model2.name(), "GEDSAT", "ORBIT instance name"); test_value(model2[0].name(), "GEDSAT Rev0044", "ORBIT instance parameter"); xml.clear(); model2.write(xml); // Construct "orbit" model from XML GSPIModelDataSpace model3(*xml.element(0)); test_value(model3.type(), "DataSpace", "XML constructed instance type"); test_value(model3.size(), 1, "XML constructed ORBIT instance size"); test_value(model3.instruments(), "SPI", "XML constructed ORBIT instance instruments"); test_value(model3.name(), "GEDSAT", "ORBIT instance name"); test_value(model3[0].name(), "GEDSAT Rev0044", "XML constructed ORBIT instance parameter"); // Construct "orbit,dete" model from OG GSPIModelDataSpace model4(obs, "GEDSAT", "orbit,dete", 0); test_value(model4.type(), "DataSpace", "ORBIT,DETE instance type"); test_value(model4.size(), 19, "ORBIT,DETE instance size"); test_value(model4[1].name(), "GEDSAT D001 Rev0044", "ORBIT,DETE instance parameter"); // Construct "orbit,dete,ebin" model from OG GSPIModelDataSpace model5(obs, "GEDSAT", "orbit,dete,ebin", 0); test_value(model5.type(), "DataSpace", "ORBIT,DETE,EBIN instance type"); test_value(model5.size(), 190, "ORBIT,DETE,EBIN instance size"); test_value(model5[35].name(), "GEDSAT E005 D003 Rev0044", "ORBIT,DETE,EBIN instance parameter"); // Return return; } /***********************************************************************//** * @brief Test GSPIObservation class ***************************************************************************/ void TestGSPI::test_obs(void) { // Test content of void observation GSPIObservation obs1; test_value(obs1.classname(), "GSPIObservation", "Void instance classname"); test_value(obs1.instrument(), "SPI", "Void instance instrument"); test_value(obs1.ontime(), 0.0, "Void instance ontime"); test_value(obs1.livetime(), 0.0, "Void instance livetime"); test_value(obs1.deadc(), 0.0, "Void instance deadc"); // Test content of OG GSPIObservation obs2(og_dol); test_value(obs2.instrument(), "SPI", "Void instance instrument"); test_value(obs2.ontime(), 193966.8178673, "Void instance ontime"); test_value(obs2.livetime(), 170657.5371606, "Void instance livetime"); test_value(obs2.deadc(), 0.87982851416, "Void instance deadc"); // Return return; } /***********************************************************************//** * @brief Test GSPIResponse class ***************************************************************************/ void TestGSPI::test_response(void) { // Set energy GEnergy obsEnergy; // Test content of void response GSPIResponse rsp1; test_value(rsp1.classname(), "GSPIResponse", "Void instance classname"); test_assert(!rsp1.use_edisp(), "Void instance use_edisp"); test_assert(!rsp1.use_tdisp(), "Void instance use_edisp"); test_assert(!rsp1.is_precomputed(), "Void instance is_precomputed"); // Return return; } /***********************************************************************//** * @brief Test GSPITools module ***************************************************************************/ void TestGSPI::test_tools(void) { // Test methods test_value(gammalib::spi_ijd2time(1500.0).utc(), "2004-02-08T23:58:56", "spi_ijd2time"); // Return return; } /*************************************************************************** * @brief Main entry point for test executable ***************************************************************************/ int main(void) { // Allocate test suit container GTestSuites testsuites("INTEGRAL/SPI instrument specific class testing"); // Set CALDB environment variable std::string caldb = "CALDB="+spi_caldb; putenv((char*)caldb.c_str()); // Initially assume that we pass all tests bool success = true; // Create test suites and append them to the container TestGSPI suite; testsuites.append(suite); // Run the testsuites success = testsuites.run(); // Save test report testsuites.save("reports/GSPI.xml"); // Return success status return (success ? 0 : 1); }