#! /usr/bin/env python # ========================================================================== # This scripts performs unit tests for the ctbin tool. # # Copyright (C) 2014-2016 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 . # # ========================================================================== import os import gammalib import ctools # ========================= # # Test class for ctbin tool # # ========================= # class Test(gammalib.GPythonTestSuite): """ Test class for ctbin tool. This test class makes unit tests for the ctbin tool by using it from the command line and from Python. """ # Constructor def __init__(self): """ Constructor. """ # Call base class constructor gammalib.GPythonTestSuite.__init__(self) # Set members self._events_name = "data/crab_events.fits" # Return return # Set test functions def set(self): """ Set all test functions. """ # Set test name self.name("ctbin") # Append tests self.append(self._test_ctbin_cmd, "Test ctbin on command line") self.append(self._test_ctbin_python, "Test ctbin from Python") # Return return # Test ctbin on command line def _test_ctbin_cmd(self): """ Test ctbin on the command line. """ # Set ctbin tool ctbin = "../src/ctbin/ctbin" if os.system("type "+ctbin) != 0: ctbin = "ctbin" # Setup ctbin command cmd = ctbin+' inobs="'+self._events_name+'"'+ \ ' outcube="cntmap_cmd1.fits"'+\ ' emin=0.1 emax=100.0 enumbins=20 ebinalg="LOG"'+ \ ' nxpix=200 nypix=200 binsz=0.02 coordsys="CEL"'+ \ ' xref=83.63 yref=22.01 proj="CAR"'+noout # Execute ctbin, make sure we catch any exception try: rc = os.system(cmd) except: pass # Check if execution was successful self.test_assert(rc == 0, "Successful ctbin execution on command line") # Load counts cube and check content. evt = gammalib.GCTAEventCube("cntmap_cmd1.fits") self._test_cube(evt, 5542) # Setup ctbin command cmd = ctbin+' inobs="events_that_do_not_exist.fits"'+ \ ' outcube="cntmap_cmd2.fits"'+\ ' emin=0.1 emax=100.0 enumbins=20 ebinalg="LOG"'+ \ ' nxpix=200 nypix=200 binsz=0.02 coordsys="CEL"'+ \ ' xref=83.63 yref=22.01 proj="CAR"'+noout # Execute ctbin, make sure we catch any exception try: rc = os.system(cmd) except: pass # Check if execution failed self.test_assert(rc != 0, "Failure of ctbin execution on command line") # Return return # Test ctbin from Python def _test_ctbin_python(self): """ Test ctbin from Python. """ # Set-up ctbin bin = ctools.ctbin() bin["inobs"] = self._events_name bin["outcube"] = "cntmap.fits" bin["ebinalg"] = "LOG" bin["emin"] = 0.1 bin["emax"] = 100.0 bin["enumbins"] = 20 bin["nxpix"] = 200 bin["nypix"] = 200 bin["binsz"] = 0.02 bin["coordsys"] = "CEL" bin["proj"] = "CAR" bin["xref"] = 83.63 bin["yref"] = 22.01 # Run ctbin tool bin.run() # Check content of observation and cube self._test_observation(bin, 5542) self._test_cube(bin.cube(), 5542) # Test copy constructor cpy_bin = bin.copy() # Check content of observation and cube self._test_observation(cpy_bin, 5542) self._test_cube(cpy_bin.cube(), 5542) # Run copy of ctbin tool again cpy_bin.run() # Check content of observation and cube. We expect now an empty # event cube as on input the observation is binned, and any binned # observation will be skipped, hence the counts cube should be # empty. self._test_observation(cpy_bin, 0) self._test_cube(cpy_bin.cube(), 0) # Clear and run copy of ctbin again #cpy_bin.clear() #cpy_bin.run() #RuntimeError: *** ERROR in GXmlAttribute::value(std::string): Invalid XML attribute value: *** ERROR in GPythonTestSuite::test: #*** ERROR in GApplicationPars::operator[](std::string&): Invalid argument. Parameter "debug" has not been found in parameter file. #Please specify a valid parameter name. # Save counts cube bin.save() # Load counts cube and check content. evt = gammalib.GCTAEventCube("cntmap.fits") self._test_cube(evt, 5542) # Prepare observation container for stacked analysis cta = gammalib.GCTAObservation(self._events_name) obs = gammalib.GObservations() cta.id("0001") obs.append(cta) cta.id("0002") obs.append(cta) cta.id("0003") obs.append(cta) # Set-up ctbin using an observation container bin = ctools.ctbin(obs) bin["outcube"] = "cntmap.fits" bin["ebinalg"] = "LOG" bin["emin"] = 0.1 bin["emax"] = 100.0 bin["enumbins"] = 20 bin["nxpix"] = 200 bin["nypix"] = 200 bin["binsz"] = 0.02 bin["coordsys"] = "CEL" bin["proj"] = "CAR" bin["xref"] = 83.63 bin["yref"] = 22.01 # Run ctbin tool bin.run() # Check content of observation and cube (need multiplier=3 since # three identical observations have been appended) self._test_observation(bin, 5542, multiplier=3) self._test_cube(bin.cube(), 5542, multiplier=3) # Set-up ctbin using an observation container bin = ctools.ctbin(obs) bin["outcube"] = "cntmap2.fits" bin["ebinalg"] = "LOG" bin["emin"] = 0.1 bin["emax"] = 100.0 bin["enumbins"] = 20 bin["nxpix"] = 200 bin["nypix"] = 200 bin["binsz"] = 0.02 bin["coordsys"] = "CEL" bin["proj"] = "CAR" bin["xref"] = 83.63 bin["yref"] = 22.01 # Execute ctbin tool bin.execute() # Load counts cube and check content. evt = gammalib.GCTAEventCube("cntmap2.fits") self._test_cube(evt, 5542, multiplier=3) # Clear tool #bin.clear() #what(): *** ERROR in GApplicationPars::write(std::string&): Unable to open parameter file "pfiles/". # Check content of observation and cube #self.test_value(bin.obs().size(), 0, "There is no observation") #self.test_value(bin.cube().size(), 0, "0 event bins") #self.test_value(bin.cube().number(), 0, "0 events") # Return return # Check observation def _test_observation(self, ctbin, nevents, multiplier=1): """ Test content of an observation. Args: ctbin: ctbin instance nevents: Expected number of events Kwargs: multiplier: Observation multiplier """ # Test observation container obs = gammalib.GCTAObservation(ctbin.obs()[0]) pnt = obs.pointing() self.test_value(ctbin.obs().size(), 1, "There is one observation") self.test_assert(obs.instrument() == "CTA", "Observation is CTA observation") self.test_value(obs.ontime(), 1800.0*multiplier, 1.0e-6, "Ontime is 1800 sec") self.test_value(obs.livetime(), 1710.0*multiplier, 1.0e-6, "Livetime is 1710 sec") self.test_value(pnt.dir().ra_deg(), 83.63, 1.0e-6, "Pointing Right Ascension is 83.63 deg") self.test_value(pnt.dir().dec_deg(), 22.01, 1.0e-6, "Pointing Declination is 22.01 deg") # Test event cube self._test_cube(obs.events(), nevents, multiplier=multiplier) # Return return # Check event cube def _test_cube(self, cube, nevents, multiplier=1): """ Test content of event cube." Args: cube: Event cube nevents: Expected number of events. Kwargs: multiplier: Event number multiplier """ # Test event cube self.test_value(cube.size(), 800000, "800000 event bins") self.test_value(cube.number(), nevents*multiplier, str(nevents*multiplier)+" events") # Return return