diff --git a/cscripts/Makefile.am b/cscripts/Makefile.am index 2a0d4f8..e3bfde7 100644 --- a/cscripts/Makefile.am +++ b/cscripts/Makefile.am @@ -33,6 +33,7 @@ testscripts = tests/__init__.py \ ../test/test_csobs2caldb.py \ ../test/test_csobsdef.py \ ../test/test_csobsinfo.py \ + ../test/test_cspull.py \ ../test/test_csfindobs.py \ ../test/test_csiactcopy.py \ ../test/test_csiactdata.py \ diff --git a/cscripts/cspull.py b/cscripts/cspull.py index fe7d9da..ff8bbfe 100755 --- a/cscripts/cspull.py +++ b/cscripts/cspull.py @@ -82,10 +82,8 @@ class cspull(ctools.cscript): """ Get parameters from parfile. """ - # Get parameters - - # Set observation if not done before - if self._obs == None or self._obs.size() == 0: + # If there are no observations in container then get some ... + if self._obs.size() == 0: self._obs = self._get_observations() # Check for requested pattern and use above @@ -94,6 +92,11 @@ class cspull(ctools.cscript): if self._pattern == "four": self._obs = self._set_obs() + # ... otherwise add response information and energy boundaries + # in case they are missing. + else: + self._setup_observations(self._obs) + # Get number of energy bins self._enumbins = self["enumbins"].integer() diff --git a/test/data/obs_stacked.xml b/test/data/obs_stacked.xml new file mode 100644 index 0000000..151c335 --- /dev/null +++ b/test/data/obs_stacked.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/test/test_cspull.py b/test/test_cspull.py new file mode 100755 index 0000000..d1de25a --- /dev/null +++ b/test/test_cspull.py @@ -0,0 +1,251 @@ +#! /usr/bin/env python +# ========================================================================== +# This scripts performs unit tests for the cspull script. +# +# Copyright (C) 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 cscripts + + +# ============================ # +# Test class for cspull script # +# ============================ # +class Test(gammalib.GPythonTestSuite): + """ + Test class for cspull script. + + This test class makes unit tests for the cspull script by using it + from the command line and from Python. + """ + + # Constructor + def __init__(self): + """ + Constructor. + """ + # Call base class constructor + gammalib.GPythonTestSuite.__init__(self) + + # Return + return + + # Set test functions + def set(self): + """ + Set all test functions. + """ + # Set test name + self.name("cspull") + + # Append tests + self.append(self._test_cmd, "Test cspull on command line") + self.append(self._test_python, "Test cspull from Python") + + # Return + return + + # Test cspull on command line + def _test_cmd(self): + """ + Test cspull on the command line. + """ + # Kluge to set the command (installed version has no README file) + if os.path.isfile("README"): + cspull = "../cscripts/cspull.py" + else: + cspull = "cspull" + + # Setup cspull command + cmd = cspull+' inmodel="data/crab.xml"'+ \ + ' outfile="cspull_cmd1.dat"'+ \ + ' ntrials=3 caldb="prod2" irf="South_0.5h"'+ \ + ' ra=83.6331 dec=22.0145 emin=0.1 emax=100.0'+ \ + ' enumbins=0 tmax=1800.0 deadc=0.95 rad=5.0'+ \ + ' npix=200 binsz=0.05'+ \ + ' logfile="cspull_cmd1.log" chatter=1' + + # Execute cspull, make sure we catch any exception + try: + rc = os.system(cmd+" >/dev/null 2>&1") + except: + pass + + # Check if execution was successful + self.test_assert(rc == 0, + "Successful cspull execution on command line") + + # Check pull distribution file + self._check_pull_file("cspull_cmd1.dat") + + # Setup cspull command + cmd = cspull+' inmodel="model_that_does_not_exist.xml"'+ \ + ' outfile="cspull_cmd1.dat"'+ \ + ' ntrials=3 caldb="prod2" irf="South_0.5h"'+ \ + ' ra=83.6331 dec=22.0145 emin=0.1 emax=100.0'+ \ + ' enumbins=0 tmax=1800.0 deadc=0.95 rad=5.0'+ \ + ' npix=200 binsz=0.05'+ \ + ' logfile="cspull_cmd2.log"' + + # Execute cspull, make sure we catch any exception + try: + rc = os.system(cmd+" >/dev/null 2>&1") + except: + pass + + # Check if execution failed + self.test_assert(rc != 0, + "Failure of cspull execution on command line") + + # Return + return + + # Test cspull from Python + def _test_python(self): + """ + Test cspull from Python. + """ + # Set-up unbinned cspull + pull = cscripts.cspull() + pull["inmodel"] = "data/crab.xml" + pull["outfile"] = "cspull_py1.dat" + pull["ntrials"] = 3 + pull["caldb"] = "prod2" + pull["irf"] = "South_0.5h" + pull["ra"] = 83.6331 + pull["dec"] = 22.0145 + pull["emin"] = 0.1 + pull["emax"] = 100.0 + pull["enumbins"] = 0 + pull["tmax"] = 1800.0 + pull["deadc"] = 0.95 + pull["rad"] = 5.0 + pull["logfile"] = "cspull_py1.log" + pull["chatter"] = 2 + + # Run cspull script + pull.logFileOpen() # Make sure we get a log file + pull.run() + #pull.save() + + # Check pull distribution file + self._check_pull_file("cspull_py1.dat") + + # Set-up binned cspull + pull = cscripts.cspull() + pull["inmodel"] = "data/crab.xml" + pull["outfile"] = "cspull_py2.dat" + pull["ntrials"] = 3 + pull["caldb"] = "prod2" + pull["irf"] = "South_0.5h" + pull["ra"] = 83.6331 + pull["dec"] = 22.0145 + pull["emin"] = 0.1 + pull["emax"] = 100.0 + pull["enumbins"] = 10 + pull["tmax"] = 1800.0 + pull["deadc"] = 0.95 + pull["rad"] = 5.0 + pull["npix"] = 100 + pull["binsz"] = 0.02 + pull["coordsys"] = "CEL" + pull["proj"] = "TAN" + pull["logfile"] = "cspull_py2.log" + pull["chatter"] = 3 + + # Execute cspull script + pull.execute() + + # Check pull distribution file + self._check_pull_file("cspull_py2.dat") + + # Set-up cspull from event list + pull = cscripts.cspull() + pull["inobs"] = "data/crab_events.fits" + pull["inmodel"] = "data/crab.xml" + pull["outfile"] = "cspull_py3.dat" + pull["ntrials"] = 3 + pull["caldb"] = "prod2" + pull["irf"] = "South_0.5h" + pull["enumbins"] = 0 + pull["logfile"] = "cspull_py3.log" + pull["chatter"] = 4 + + # Execute cspull script + pull.execute() + + # Check pull distribution file + self._check_pull_file("cspull_py3.dat") + + # Build observation container with unbinned observation + cta = gammalib.GCTAObservation("data/crab_events.fits") + obs = gammalib.GObservations() + obs.append(cta) + + # Set-up cspull from observation container with unbinned observation + pull = cscripts.cspull(obs) + pull["inmodel"] = "data/crab.xml" + pull["outfile"] = "cspull_py4.dat" + pull["ntrials"] = 3 + pull["caldb"] = "prod2" + pull["irf"] = "South_0.5h" + pull["enumbins"] = 0 + pull["logfile"] = "cspull_py4.log" + pull["chatter"] = 4 + + # Execute cspull script + pull.execute() + + # Check pull distribution file + self._check_pull_file("cspull_py4.dat") + + # Set-up stacked cspull + pull = cscripts.cspull() + pull["inobs"] = "data/obs_stacked.xml" + pull["inmodel"] = "data/crab_bkgcube.xml" + pull["outfile"] = "cspull_py5.dat" + pull["ntrials"] = 3 + pull["caldb"] = "prod2" + pull["irf"] = "South_0.5h" + pull["enumbins"] = 0 + pull["logfile"] = "cspull_py5.log" + pull["chatter"] = 4 + + # Execute cspull script + pull.execute() + + # Check pull distribution file + self._check_pull_file("cspull_py5.dat") + + # Return + return + + # Check pull file + def _check_pull_file(self, filename): + """ + Check pull file. + """ + # Open pull file as CSV file + pulls = gammalib.GCsv(filename) + + # Check dimensions + self.test_value(pulls.nrows(), 4, + 'Check for 4 rows in pull file') + + # Return + return diff --git a/test/test_python_cscripts.py b/test/test_python_cscripts.py index 1e3d3de..2cd6a78 100755 --- a/test/test_python_cscripts.py +++ b/test/test_python_cscripts.py @@ -30,6 +30,7 @@ import test_csmodelmerge import test_csobs2caldb import test_csobsdef import test_csobsinfo +import test_cspull import test_csfindobs import test_csiactcopy import test_csiactdata @@ -89,6 +90,7 @@ def test(installed=False, debug=False): suite_csobs2caldb = test_csobs2caldb.Test() suite_csobsdef = test_csobsdef.Test() suite_csobsinfo = test_csobsinfo.Test() + suite_cspull = test_cspull.Test() # Setup unit tests suite_cscaldb.set() @@ -98,6 +100,7 @@ def test(installed=False, debug=False): suite_csobs2caldb.set() suite_csobsdef.set() suite_csobsinfo.set() + suite_cspull.set() # Append tests to container suites.append(suite_cscaldb) @@ -107,6 +110,7 @@ def test(installed=False, debug=False): suites.append(suite_csobs2caldb) suites.append(suite_csobsdef) suites.append(suite_csobsinfo) + suites.append(suite_cspull) # Append tests for Python 2.6+ (the IACT cscripts depend on the json # module which is only available since Python 2.6+