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+