Commit e0519a38d0694bb9e74214fef79e004507cb9377

Authored by Jürgen Knödlseder
2 parents 44ed5835 110dc279

Merge branch '2961-scs' into integration

# Conflicts:
#	doc/source/users/tutorials/notebooks.rst
cscripts/Makefile.am
@@ -19,7 +19,10 @@ @@ -19,7 +19,10 @@
19 # # 19 # #
20 ############################################################################# 20 #############################################################################
21 21
  22 +
  23 +
22 # Scripts to be distributed in $(pyexecdir)/cscripts 24 # Scripts to be distributed in $(pyexecdir)/cscripts
  25 +
23 pythonscripts = $(top_builddir)/cscripts/__init__.py \ 26 pythonscripts = $(top_builddir)/cscripts/__init__.py \
24 $(srcdir)/csbkgmodel.py \ 27 $(srcdir)/csbkgmodel.py \
25 $(srcdir)/cscaldb.py \ 28 $(srcdir)/cscaldb.py \
@@ -47,6 +50,7 @@ pythonscripts = $(top_builddir)/cscripts/__init__.py \ @@ -47,6 +50,7 @@ pythonscripts = $(top_builddir)/cscripts/__init__.py \
47 $(srcdir)/cstsmapmerge.py \ 50 $(srcdir)/cstsmapmerge.py \
48 $(srcdir)/cstsmapsplit.py \ 51 $(srcdir)/cstsmapsplit.py \
49 $(srcdir)/csviscube.py \ 52 $(srcdir)/csviscube.py \
  53 + $(srcdir)/csscs.py \
50 $(srcdir)/csworkflow.py \ 54 $(srcdir)/csworkflow.py \
51 $(srcdir)/csfindobs.py \ 55 $(srcdir)/csfindobs.py \
52 $(srcdir)/csiactcopy.py \ 56 $(srcdir)/csiactcopy.py \
@@ -58,7 +62,10 @@ pythonscripts = $(top_builddir)/cscripts/__init__.py \ @@ -58,7 +62,10 @@ pythonscripts = $(top_builddir)/cscripts/__init__.py \
58 $(srcdir)/ioutils.py \ 62 $(srcdir)/ioutils.py \
59 $(srcdir)/mputils.py 63 $(srcdir)/mputils.py
60 64
  65 +
  66 +
61 # Parfiles to be distributed in $(prefix)/syspfiles 67 # Parfiles to be distributed in $(prefix)/syspfiles
  68 +
62 parfiles = $(srcdir)/csbkgmodel.par \ 69 parfiles = $(srcdir)/csbkgmodel.par \
63 $(srcdir)/cscaldb.par \ 70 $(srcdir)/cscaldb.par \
64 $(srcdir)/csebins.par \ 71 $(srcdir)/csebins.par \
@@ -84,13 +91,17 @@ parfiles = $(srcdir)/csbkgmodel.par \ @@ -84,13 +91,17 @@ parfiles = $(srcdir)/csbkgmodel.par \
84 $(srcdir)/cstsmapmerge.par \ 91 $(srcdir)/cstsmapmerge.par \
85 $(srcdir)/cstsmapsplit.par \ 92 $(srcdir)/cstsmapsplit.par \
86 $(srcdir)/csviscube.par \ 93 $(srcdir)/csviscube.par \
  94 + $(srcdir)/csscs.par \
87 $(srcdir)/csworkflow.par \ 95 $(srcdir)/csworkflow.par \
88 $(srcdir)/csfindobs.par \ 96 $(srcdir)/csfindobs.par \
89 $(srcdir)/csiactcopy.par \ 97 $(srcdir)/csiactcopy.par \
90 $(srcdir)/csiactdata.par \ 98 $(srcdir)/csiactdata.par \
91 $(srcdir)/csiactobs.par 99 $(srcdir)/csiactobs.par
92 100
  101 +
  102 +
93 # Scripts for which symbolic links will be created in bindir 103 # Scripts for which symbolic links will be created in bindir
  104 +
94 linkscripts = csbkgmodel \ 105 linkscripts = csbkgmodel \
95 cscaldb \ 106 cscaldb \
96 csebins \ 107 csebins \
@@ -117,13 +128,17 @@ linkscripts = csbkgmodel \ @@ -117,13 +128,17 @@ linkscripts = csbkgmodel \
117 cstsmapmerge \ 128 cstsmapmerge \
118 cstsmapsplit \ 129 cstsmapsplit \
119 csviscube \ 130 csviscube \
  131 + csscs \
120 csworkflow \ 132 csworkflow \
121 csfindobs \ 133 csfindobs \
122 csiactcopy \ 134 csiactcopy \
123 csiactdata \ 135 csiactdata \
124 csiactobs 136 csiactobs
125 137
  138 +
  139 +
126 # Test scripts to be distributed in $(pyexecdir)/cscripts/tests 140 # Test scripts to be distributed in $(pyexecdir)/cscripts/tests
  141 +
127 testscripts = $(srcdir)/tests/__init__.py \ 142 testscripts = $(srcdir)/tests/__init__.py \
128 $(top_srcdir)/test/testing.py \ 143 $(top_srcdir)/test/testing.py \
129 $(top_srcdir)/test/test_python_cscripts.py \ 144 $(top_srcdir)/test/test_python_cscripts.py \
@@ -155,6 +170,7 @@ testscripts = $(srcdir)/tests/__init__.py \ @@ -155,6 +170,7 @@ testscripts = $(srcdir)/tests/__init__.py \
155 $(top_srcdir)/test/test_cstsmapmerge.py \ 170 $(top_srcdir)/test/test_cstsmapmerge.py \
156 $(top_srcdir)/test/test_cstsmapsplit.py \ 171 $(top_srcdir)/test/test_cstsmapsplit.py \
157 $(top_srcdir)/test/test_csviscube.py \ 172 $(top_srcdir)/test/test_csviscube.py \
  173 + $(top_srcdir)/test/test_csscs.py \
158 $(top_srcdir)/test/test_csworkflow.py \ 174 $(top_srcdir)/test/test_csworkflow.py \
159 $(top_srcdir)/test/test_obsutils.py \ 175 $(top_srcdir)/test/test_obsutils.py \
160 $(top_srcdir)/test/test_mputils.py \ 176 $(top_srcdir)/test/test_mputils.py \
@@ -162,7 +178,10 @@ testscripts = $(srcdir)/tests/__init__.py \ @@ -162,7 +178,10 @@ testscripts = $(srcdir)/tests/__init__.py \
162 $(top_srcdir)/test/test_csiactdata.py \ 178 $(top_srcdir)/test/test_csiactdata.py \
163 $(top_srcdir)/test/test_csiactobs.py 179 $(top_srcdir)/test/test_csiactobs.py
164 180
  181 +
  182 +
165 # Test data to be distributed in $(pyexecdir)/cscripts/tests/data 183 # Test data to be distributed in $(pyexecdir)/cscripts/tests/data
  184 +
166 testdata = $(top_srcdir)/test/data/crab.xml \ 185 testdata = $(top_srcdir)/test/data/crab.xml \
167 $(top_srcdir)/test/data/obs_unbinned.xml \ 186 $(top_srcdir)/test/data/obs_unbinned.xml \
168 $(top_srcdir)/test/data/obs_unbinned_two.xml \ 187 $(top_srcdir)/test/data/obs_unbinned_two.xml \
@@ -239,12 +258,18 @@ testdata = $(top_srcdir)/test/data/crab.xml \ @@ -239,12 +258,18 @@ testdata = $(top_srcdir)/test/data/crab.xml \
239 $(top_srcdir)/test/data/viscube.fits.gz \ 258 $(top_srcdir)/test/data/viscube.fits.gz \
240 $(top_srcdir)/test/data/hess_bkg_lookup.fits 259 $(top_srcdir)/test/data/hess_bkg_lookup.fits
241 260
  261 +
  262 +
242 # Test data to be distributed in $(pyexecdir)/cscripts/tests/data/iactdata 263 # Test data to be distributed in $(pyexecdir)/cscripts/tests/data/iactdata
  264 +
243 testiactdata = $(top_srcdir)/test/data/iactdata/hdu-index.fits.gz \ 265 testiactdata = $(top_srcdir)/test/data/iactdata/hdu-index.fits.gz \
244 $(top_srcdir)/test/data/iactdata/master.json \ 266 $(top_srcdir)/test/data/iactdata/master.json \
245 $(top_srcdir)/test/data/iactdata/obs-index.fits.gz 267 $(top_srcdir)/test/data/iactdata/obs-index.fits.gz
246 268
  269 +
  270 +
247 # Test data to be distributed in $(pyexecdir)/cscripts/tests/data/iactdata/events 271 # Test data to be distributed in $(pyexecdir)/cscripts/tests/data/iactdata/events
  272 +
248 testiactevents = $(top_srcdir)/test/data/iactdata/events/irf_file.fits.gz \ 273 testiactevents = $(top_srcdir)/test/data/iactdata/events/irf_file.fits.gz \
249 $(top_srcdir)/test/data/iactdata/events/events_0.fits.gz \ 274 $(top_srcdir)/test/data/iactdata/events/events_0.fits.gz \
250 $(top_srcdir)/test/data/iactdata/events/events_1.fits.gz \ 275 $(top_srcdir)/test/data/iactdata/events/events_1.fits.gz \
@@ -256,9 +281,11 @@ testiactevents = $(top_srcdir)/test/data/iactdata/events/irf_file.fits.gz \ @@ -256,9 +281,11 @@ testiactevents = $(top_srcdir)/test/data/iactdata/events/irf_file.fits.gz \
256 $(top_srcdir)/test/data/iactdata/events/events_7.fits.gz \ 281 $(top_srcdir)/test/data/iactdata/events/events_7.fits.gz \
257 $(top_srcdir)/test/data/iactdata/events/events_8.fits.gz 282 $(top_srcdir)/test/data/iactdata/events/events_8.fits.gz
258 283
  284 +
259 # Install scripts, parfiles, test scripts and test data. Note that we don't 285 # Install scripts, parfiles, test scripts and test data. Note that we don't
260 # need to prepend $(DESTDIR) here (not fully clear why, but that's the way 286 # need to prepend $(DESTDIR) here (not fully clear why, but that's the way
261 # it is) 287 # it is)
  288 +
262 binscriptsdir = $(bindir) 289 binscriptsdir = $(bindir)
263 binscripts_DATA = $(binscripts) 290 binscripts_DATA = $(binscripts)
264 pythonscriptsdir = $(pyexecdir)/cscripts 291 pythonscriptsdir = $(pyexecdir)/cscripts
@@ -274,17 +301,23 @@ testiactdata_DATA = $(testiactdata) @@ -274,17 +301,23 @@ testiactdata_DATA = $(testiactdata)
274 testiacteventsdir = $(pyexecdir)/cscripts/tests/data/iactdata/events 301 testiacteventsdir = $(pyexecdir)/cscripts/tests/data/iactdata/events
275 testiactevents_DATA = $(testiactevents) 302 testiactevents_DATA = $(testiactevents)
276 303
  304 +
277 # Files to be distributed in the tar file 305 # Files to be distributed in the tar file
278 EXTRA_DIST = $(binscripts) $(pythonscripts) $(parfiles) \ 306 EXTRA_DIST = $(binscripts) $(pythonscripts) $(parfiles) \
279 $(testscripts) $(testdata) $(testiactdata) \ 307 $(testscripts) $(testdata) $(testiactdata) \
280 $(testiactevents) 308 $(testiactevents)
281 309
  310 +
  311 +
282 # Add install hook rule to copy cscripts without .py into the bindir 312 # Add install hook rule to copy cscripts without .py into the bindir
  313 +
283 install-data-hook: 314 install-data-hook:
  315 +
284 @binlist='$(binscripts)';\ 316 @binlist='$(binscripts)';\
285 for p in $$binlist; do \ 317 for p in $$binlist; do \
286 chmod +x "$(DESTDIR)$(bindir)/$$p"; \ 318 chmod +x "$(DESTDIR)$(bindir)/$$p"; \
287 done 319 done
  320 +
288 @linklist='$(linkscripts)';\ 321 @linklist='$(linkscripts)';\
289 for p in $$linklist; do \ 322 for p in $$linklist; do \
290 rm -rf "$(DESTDIR)$(bindir)/$$p"; \ 323 rm -rf "$(DESTDIR)$(bindir)/$$p"; \
@@ -292,15 +325,23 @@ install-data-hook: @@ -292,15 +325,23 @@ install-data-hook:
292 chmod +x "$(DESTDIR)$(bindir)/$$p"; \ 325 chmod +x "$(DESTDIR)$(bindir)/$$p"; \
293 done 326 done
294 327
  328 +
  329 +
295 # Uninstall hook rule to remove the cscripts from the bindir 330 # Uninstall hook rule to remove the cscripts from the bindir
  331 +
296 uninstall-hook: 332 uninstall-hook:
  333 +
297 @linklist='$(linkscripts)';\ 334 @linklist='$(linkscripts)';\
298 for p in $$linklist; do \ 335 for p in $$linklist; do \
299 rm -rf "$(DESTDIR)$(bindir)/$$p"; \ 336 rm -rf "$(DESTDIR)$(bindir)/$$p"; \
300 done 337 done
301 338
  339 +
  340 +
302 # Files to be removed in build directory 341 # Files to be removed in build directory
  342 +
303 clean-local: 343 clean-local:
  344 +
304 @if ! [ '@top_srcdir@' -ef '@top_builddir@' ]; then \ 345 @if ! [ '@top_srcdir@' -ef '@top_builddir@' ]; then \
305 rm -rf $(top_builddir)/cscripts/cs*.py; \ 346 rm -rf $(top_builddir)/cscripts/cs*.py; \
306 rm -rf $(top_builddir)/cscripts/obsutils.py; \ 347 rm -rf $(top_builddir)/cscripts/obsutils.py; \
@@ -310,13 +351,19 @@ clean-local: @@ -310,13 +351,19 @@ clean-local:
310 rm -rf $(top_builddir)/cscripts/mputils.py; \ 351 rm -rf $(top_builddir)/cscripts/mputils.py; \
311 rm -rf $(top_builddir)/cscripts/*.par; \ 352 rm -rf $(top_builddir)/cscripts/*.par; \
312 fi 353 fi
  354 +
313 rm -rf $(top_builddir)/cscripts/*.pyc 355 rm -rf $(top_builddir)/cscripts/*.pyc
314 rm -rf $(top_builddir)/cscripts/__pycache__ 356 rm -rf $(top_builddir)/cscripts/__pycache__
315 357
  358 +
  359 +
316 # Uninstall the cscripts Python module 360 # Uninstall the cscripts Python module
  361 +
317 uninstall-local: 362 uninstall-local:
  363 +
318 rm -rf $(DESTDIR)$(pyexecdir)/cscripts/*.pyc 364 rm -rf $(DESTDIR)$(pyexecdir)/cscripts/*.pyc
319 rm -rf $(DESTDIR)$(pyexecdir)/cscripts/*.pyc 365 rm -rf $(DESTDIR)$(pyexecdir)/cscripts/*.pyc
320 rm -rf $(DESTDIR)$(pyexecdir)/cscripts/__pycache__ 366 rm -rf $(DESTDIR)$(pyexecdir)/cscripts/__pycache__
321 rm -rf $(DESTDIR)$(pyexecdir)/cscripts/tests/*.pyc 367 rm -rf $(DESTDIR)$(pyexecdir)/cscripts/tests/*.pyc
322 rm -rf $(DESTDIR)$(pyexecdir)/cscripts/tests/__pycache__ 368 rm -rf $(DESTDIR)$(pyexecdir)/cscripts/tests/__pycache__
  369 +
cscripts/__init__.py.in
1 # ========================================================================== 1 # ==========================================================================
2 # cscripts Python module 2 # cscripts Python module
3 # 3 #
4 -# Copyright (C) 2015-2018 Juergen Knoedlseder 4 +# Copyright (C) 2015-2020 Juergen Knoedlseder
5 # 5 #
6 # This program is free software: you can redistribute it and/or modify 6 # This program is free software: you can redistribute it and/or modify
7 # it under the terms of the GNU General Public License as published by 7 # it under the terms of the GNU General Public License as published by
@@ -50,6 +50,7 @@ __all__ = [ @@ -50,6 +50,7 @@ __all__ = [
50 "cstsmapmerge", 50 "cstsmapmerge",
51 "cstsmapsplit", 51 "cstsmapsplit",
52 "csviscube", 52 "csviscube",
  53 + "csscs",
53 "csworkflow", 54 "csworkflow",
54 "obsutils", 55 "obsutils",
55 "modutils", 56 "modutils",
@@ -90,6 +91,7 @@ from cscripts.cstsdist import cstsdist @@ -90,6 +91,7 @@ from cscripts.cstsdist import cstsdist
90 from cscripts.cstsmapmerge import cstsmapmerge 91 from cscripts.cstsmapmerge import cstsmapmerge
91 from cscripts.cstsmapsplit import cstsmapsplit 92 from cscripts.cstsmapsplit import cstsmapsplit
92 from cscripts.csviscube import csviscube 93 from cscripts.csviscube import csviscube
  94 +from cscripts.csscs import csscs
93 from cscripts.csworkflow import csworkflow 95 from cscripts.csworkflow import csworkflow
94 from cscripts import obsutils 96 from cscripts import obsutils
95 from cscripts import modutils 97 from cscripts import modutils
@@ -116,3 +118,4 @@ def test(): @@ -116,3 +118,4 @@ def test():
116 118
117 # Add version 119 # Add version
118 __version__ = '@PACKAGE_VERSION@' 120 __version__ = '@PACKAGE_VERSION@'
  121 +
cscripts/csphagen.py
@@ -287,6 +287,15 @@ class csphagen(ctools.csobservation): @@ -287,6 +287,15 @@ class csphagen(ctools.csobservation):
287 self._has_exclusion = True 287 self._has_exclusion = True
288 elif self['inexclusion'].is_valid(): 288 elif self['inexclusion'].is_valid():
289 inexclusion = self['inexclusion'].filename() 289 inexclusion = self['inexclusion'].filename()
  290 + # If the user has not specified the extension to use
  291 + # and there is an extension called 'EXCLUSION' ...
  292 + if not inexclusion.has_extname()\
  293 + and not inexclusion.has_extno()\
  294 + and gammalib.GFits(inexclusion).contains('EXCLUSION'):
  295 + # ... choose it for the exclusion map
  296 + extname = inexclusion.url() + '[EXCLUSION]'
  297 + inexclusion = gammalib.GFilename(extname)
  298 + # Otherwise will pick the default (primary) HDU
290 self._excl_reg = gammalib.GSkyRegionMap(inexclusion) 299 self._excl_reg = gammalib.GSkyRegionMap(inexclusion)
291 self._has_exclusion = True 300 self._has_exclusion = True
292 else: 301 else:
cscripts/csscs.par 0 → 100644
  1 +#############################################################################
  2 +# #
  3 +# CTA Science Analysis Tools #
  4 +# #
  5 +# ------------------------------------------------------------------------- #
  6 +# #
  7 +# File: csscs.par #
  8 +# #
  9 +# Author: Luigi Tibaldo #
  10 +# luigi.tibaldo@irap.omp.eu #
  11 +# IRAP #
  12 +# #
  13 +# Purpose: Parameter file for the csscs script #
  14 +# #
  15 +#############################################################################
  16 +#
  17 +# Input and output parameters
  18 +#============================
  19 +inobs, f, a, events.fits,,, "Input event list, counts cube, or observation definition XML file"
  20 +inmodel, f, a, $CTOOLS/share/models/crab.xml,,, "Input model definition XML file"
  21 +srcnames, s, a, Crab,,, "Semicolon-separated list of sources"
  22 +expcube, f, a, NONE,,, "Input exposure cube file"
  23 +psfcube, f, a, NONE,,, "Input PSF cube file"
  24 +edispcube, f, a, NONE,,, "Input energy dispersion cube file"
  25 +bkgcube, f, a, NONE,,, "Input background cube file"
  26 +caldb, s, a, prod2,,, "Calibration database"
  27 +irf, s, a, South_0.5h,,, "Instrument response function"
  28 +inexclusion, f, a, skymap.fits,,, "Exclusion regions file"
  29 +edisp, b, h, no,,, "Apply energy dispersion?"
  30 +outfile, f, a, maps.fits,,, "Output maps"
  31 +
  32 +#
  33 +# Script parameters
  34 +#==================
  35 +nxpix, i, a, 20,,, "Size of the X axis in pixels"
  36 +nypix, i, a, 20,,, "Size of the Y axis in pixels"
  37 +binsz, r, a, 0.1,,, "Pixel size (deg/pixel)"
  38 +coordsys, s, a, CEL,CEL|GAL,, "Coordinate System"
  39 +proj, s, a, CAR,AIT|AZP|CAR|GLS|MER|MOL|SFL|SIN|STG|TAN,, "Projection method"
  40 +xref, r, a, 83.63,0,360, "First coordinate of image center in degrees (RA or galactic l)"
  41 +yref, r, a, 22.51,-90,90, "Second coordinate of image center in degrees (DEC or galactic b)"
  42 +rad, r, a, 0.2,,, "Radius of the region for component separation (deg)"
  43 +emin, r, a, 0.1,,, "Lower energy limit (TeV)"
  44 +emax, r, a, 100.0,,, "Upper energy limit (TeV)"
  45 +method, s, a, UNBINNED, UNBINNED|ONOFF,, "Analysis method"
  46 +enumbins, i, a, 20,,, "Number of energy bins"
  47 +bkgmethod, s, h, REFLECTED,REFLECTED,, "Method for background estimation"
  48 +srcshape, s, h, CIRCLE,CIRCLE,, "Shape of the source region"
  49 +bkgregmin, i, h, 2,1,1000, "Minimum number of background regions"
  50 +bkgregskip, i, h, 1,0,10, "Number of background regions to skip next to On region"
  51 +use_model_bkg, b, h, yes,,, "Use background model?"
  52 +maxoffset, r, h, 4.0,,, "Maximum offset of source from camera center to accept observation"
  53 +etruemin, r, h, 0.01,,, "Minimum true energy (TeV)"
  54 +etruemax, r, h, 300.0,,, "Maximum true energy (TeV)"
  55 +etruebins, i, h, 30,,, "Number of bins per decade for true energy bins"
  56 +statistic, s, h, DEFAULT,DEFAULT|CSTAT|WSTAT|CHI2,, "Optimization statistic"
  57 +calc_ts, b, h, yes,,, "Compute TS value for each map bin"
  58 +calc_ulim, b, h, no,,, "Compute upper limit for each map bin"
  59 +fix_srcs, b, h, yes,,, "Fix normalisations of other skymodels"
  60 +fix_bkg, b, h, no,,, "Fix background normalisation"
  61 +
  62 +#
  63 +# Standard parameters
  64 +#====================
  65 +nthreads, i, h, 0,0,1000, "Number of parallel processes (0=use all available CPUs)"
  66 +chatter, i, h, 2,0,4, "Chattiness of output"
  67 +clobber, b, h, yes,,, "Overwrite existing output files with new output files?"
  68 +debug, b, h, no,,, "Activate debugging mode?"
  69 +mode, s, h, ql,,, "Mode of automatic parameters"
  70 +logfile, f, h, csscs.log,,, "Log filename"
cscripts/csscs.py 0 → 100755
  1 +#! /usr/bin/env python
  2 +# ==========================================================================
  3 +# Spectral component separation script
  4 +#
  5 +# Copyright (C) 2020 Luigi Tibaldo
  6 +#
  7 +# This program is free software: you can redistribute it and/or modify
  8 +# it under the terms of the GNU General Public License as published by
  9 +# the Free Software Foundation, either version 3 of the License, or
  10 +# (at your option) any later version.
  11 +#
  12 +# This program is distributed in the hope that it will be useful,
  13 +# but WITHOUT ANY WARRANTY; without even the implied warranty of
  14 +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  15 +# GNU General Public License for more details.
  16 +#
  17 +# You should have received a copy of the GNU General Public License
  18 +# along with this program. If not, see <http://www.gnu.org/licenses/>.
  19 +#
  20 +# ==========================================================================
  21 +import ctools
  22 +import gammalib
  23 +import math
  24 +import sys
  25 +from cscripts import mputils
  26 +from cscripts import obsutils
  27 +
  28 +
  29 +# =========== #
  30 +# csscs class #
  31 +# =========== #
  32 +class csscs(ctools.csobservation):
  33 + """
  34 + Spectral component separation script
  35 + """
  36 +
  37 + # Constructor
  38 + def __init__(self, *argv):
  39 + """
  40 + Constructor
  41 +
  42 + Parameters
  43 + ----------
  44 + argv : list of str
  45 + List of IRAF command line parameter strings of the form
  46 + ``parameter=3``.
  47 + """
  48 + # Initialise application by calling the base class constructor
  49 + self._init_csobservation(self.__class__.__name__, ctools.__version__, argv)
  50 +
  51 + # Initialise data members
  52 + self._nthreads = 0
  53 + self._srcnames = []
  54 + self._method = None
  55 + self._fits = None
  56 + self._excl_reg_map = None # Exclusion region map for on/off analysis
  57 + self._excl_reg_name = None
  58 +
  59 + # Return
  60 + return
  61 +
  62 + # State methods for pickling
  63 + def __getstate__(self):
  64 + """
  65 + Extend ctools.csobservation __getstate__ method
  66 +
  67 + Returns
  68 + -------
  69 + state : dict
  70 + Pickled instance
  71 + """
  72 + # Set pickled dictionary
  73 + state = {'base': ctools.csobservation.__getstate__(self),
  74 + 'nthreads': self._nthreads,
  75 + 'srcnames': self._srcnames,
  76 + 'method': self._method,
  77 + 'fits': self._fits,
  78 + 'excl_reg_map': self._excl_reg_map,
  79 + 'excl_reg_name' : self._excl_reg_name}
  80 +
  81 + # Return pickled dictionary
  82 + return state
  83 +
  84 + def __setstate__(self, state):
  85 + """
  86 + Extend ctools.csobservation __setstate__ method
  87 +
  88 + Parameters
  89 + ----------
  90 + state : dict
  91 + Pickled instance
  92 + """
  93 + # Set state
  94 + ctools.csobservation.__setstate__(self, state['base'])
  95 + self._nthreads = state['nthreads']
  96 + self._srcnames = state['srcnames']
  97 + self._method = state['method']
  98 + self._fits = state['fits']
  99 + self._excl_reg_map = state['excl_reg_map']
  100 + self._excl_reg_name = state['excl_reg_name']
  101 +
  102 + # Return
  103 + return
  104 +
  105 + # Private methods
  106 + def _get_onoff_parameters(self):
  107 + """
  108 + Get On/Off analysis parameters.
  109 +
  110 + This is done here rather then in ctools.is_onoff because the exclusion
  111 + map needs to be handled differently as an automatic parameter but
  112 + queried only if not already set and we need to verify is not empty.
  113 + Also many parameters are already queried for all methods
  114 +
  115 + TODO: verify if this can be made more uniform with other scripts
  116 + """
  117 + # Exclusion map
  118 + if (self._excl_reg_map is not None) and (self._excl_reg_map.map().npix() > 0):
  119 + # Exclusion map set and is not empty
  120 + pass
  121 + elif self['inexclusion'].is_valid():
  122 + self._excl_reg_name = self['inexclusion'].filename()
  123 + self._excl_reg_map = gammalib.GSkyRegionMap(self._excl_reg_name)
  124 + else:
  125 + msg = 'csscs in On/Off mode requires input exclusion region.'
  126 + raise RuntimeError(msg)
  127 +
  128 + # Other csphagen parameters
  129 + self['enumbins'].integer()
  130 + if self['bkgmethod'].string() == 'REFLECTED':
  131 + self['bkgregmin'].integer()
  132 + self['bkgregskip'].integer()
  133 + self['maxoffset'].real()
  134 + self['etruemin'].real()
  135 + self['etruemax'].real()
  136 + self['etruebins'].integer()
  137 +
  138 + # Return
  139 + return
  140 +
  141 + def _get_parameters(self):
  142 + """
  143 + Get parameters from parfile
  144 + """
  145 + # Set observation if not done before
  146 + if self.obs().is_empty():
  147 + self.obs(self._get_observations())
  148 +
  149 + # Set observation statistic
  150 + self._set_obs_statistic(gammalib.toupper(self['statistic'].string()))
  151 +
  152 + # Collect number of unbinned, binned and On/Off observations in
  153 + # observation container
  154 + n_unbinned = 0
  155 + n_binned = 0
  156 + n_onoff = 0
  157 + for obs in self.obs():
  158 + if obs.classname() == 'GCTAObservation':
  159 + if obs.eventtype() == 'CountsCube':
  160 + n_binned += 1
  161 + else:
  162 + n_unbinned += 1
  163 + elif obs.classname() == 'GCTAOnOffObservation':
  164 + n_onoff += 1
  165 + n_cta = n_unbinned + n_binned + n_onoff
  166 + n_other = self.obs().size() - n_cta
  167 +
  168 + # Check if there are On/Off or non-IACT observations
  169 + if n_onoff > 0 or n_other > 0:
  170 + msg = 'On/Off or non-CTA observations found. ' \
  171 + 'csscs does not support this type of observations.'
  172 + raise RuntimeError(msg)
  173 +
  174 + # ... otherwise check if there is a mix of binned and unbinned
  175 + elif n_unbinned > 0 and n_binned > 0:
  176 + msg = 'Mix of unbinned and binned CTA observations ' \
  177 + 'found in observation container. csscs does not ' \
  178 + 'support this mix.'
  179 + raise RuntimeError(msg)
  180 +
  181 + # Set models if there are none in the container
  182 + if self.obs().models().size() == 0:
  183 + self.obs().models(self['inmodel'].filename())
  184 +
  185 + # Query the map definition parameters
  186 + self['xref'].real()
  187 + self['yref'].real()
  188 + self['coordsys'].string()
  189 + self['proj'].string()
  190 + self['nxpix'].integer()
  191 + self['nypix'].integer()
  192 + self['binsz'].real()
  193 +
  194 + # Query radius of ROI for component separation
  195 + self['rad'].real()
  196 +
  197 + # Query energy boundaries
  198 + self['emin'].real()
  199 + self['emax'].real()
  200 +
  201 + # If we have unbinned observations query analysis method
  202 + if n_unbinned > 0:
  203 + self._method = self['method'].string()
  204 + # If method is Onoff query csphagen parameters
  205 + if self._method == 'ONOFF':
  206 + self._get_onoff_parameters()
  207 + # Otherwise set method to binned
  208 + else:
  209 + self._method = 'BINNED'
  210 +
  211 + # Query target source names
  212 + srcnames = self['srcnames'].string()
  213 +
  214 + # Fashion target sources into Python list. Strip leading and trailing
  215 + # spaces from names.
  216 + self._srcnames = srcnames.split(';')
  217 + for s, name in enumerate(self._srcnames):
  218 + self._srcnames[s] = name.strip()
  219 +
  220 + # Verify that the target sources are in the model
  221 + src_in_model = True
  222 + for name in self._srcnames:
  223 + src_in_model = src_in_model and self.obs().models().contains(name)
  224 + if src_in_model == False:
  225 + msg = 'Not all target sources are present in input model.'
  226 + raise RuntimeError(msg)
  227 +
  228 + # For On/Off analysis check the number of gamma-ray sources in the model
  229 + if self._method == 'ONOFF':
  230 +
  231 + # Initialise number of sources
  232 + nsources = 0
  233 +
  234 + # Loop over models and verify if model is of type GModelSky
  235 + for model in self.obs().models():
  236 + if model.classname() == 'GModelSky':
  237 + nsources += 1
  238 +
  239 + # If there are background gamma-ray sources in the model
  240 + # throw runtime error
  241 + if nsources > len(self._srcnames):
  242 + msg = 'Background gamma-ray sources found in the model. ' \
  243 + 'On/Off analysis does not support this feature.'
  244 + raise RuntimeError(msg)
  245 +
  246 + # ... otherwise continue
  247 + else:
  248 + pass
  249 +
  250 + # Query other hidden parameters, just in case
  251 + self['edisp'].boolean()
  252 + self['calc_ulim'].boolean()
  253 + self['calc_ts'].boolean()
  254 + self['fix_bkg'].boolean()
  255 + self['fix_srcs'].boolean()
  256 +
  257 + # Read ahead output parameters
  258 + if self._read_ahead():
  259 + self['outfile'].query()
  260 +
  261 + # Write input parameters into logger
  262 + self._log_parameters(gammalib.TERSE)
  263 +
  264 + # Set number of processes for multiprocessing
  265 + self._nthreads = mputils.nthreads(self)
  266 +
  267 + # Return
  268 + return
  269 +
  270 + def _create_map(self):
  271 + """
  272 + Create a gammalib.GSkyMap object to store the output
  273 +
  274 + Returns
  275 + -------
  276 + skymap : `~gammalib.GSkyMap`
  277 + Sky map
  278 + """
  279 + # Create sky map
  280 + skymap = gammalib.GSkyMap(self['proj'].string(), self['coordsys'].string(),
  281 + self['xref'].real(), self['yref'].real(),
  282 + -self['binsz'].real(), self['binsz'].real(),
  283 + self['nxpix'].integer(), self['nypix'].integer(),
  284 + 1)
  285 +
  286 + # Return sky map
  287 + return skymap
  288 +
  289 + def _adjust_model_pars(self):
  290 + """
  291 + Adjust model parameters
  292 + """
  293 + # Write header
  294 + self._log_header1(gammalib.TERSE, 'Adjust model parameters')
  295 +
  296 + # Adjust model parameters based on input user parameters
  297 + for model in self.obs().models():
  298 +
  299 + # Initialise TS flag for all models to false
  300 + model.tscalc(False)
  301 +
  302 + # Log model name
  303 + self._log_header3(gammalib.EXPLICIT, model.name())
  304 +
  305 + # In On/Off mode we cannot support multiple source morphologies
  306 + # Thus, if we have more than one target we will set them all
  307 + # to isotropic
  308 + if self._method == 'ONOFF' and len(self._srcnames) > 1:
  309 +
  310 + # Check if it is a source
  311 + try:
  312 + gammalib.GModelSky(model)
  313 + # In this case check if the spatial model is already isotropic
  314 + if model.spatial() == 'DiffuseIsotropic':
  315 + pass
  316 +
  317 + # ... otherwise change it to isotropic
  318 + else:
  319 + msg = ' Setting spatial model to diffuse isotropic'
  320 + self._log_string(gammalib.EXPLICIT, msg)
  321 + model.spatial(gammalib.GModelSpatialDiffuseConst())
  322 + except:
  323 + pass
  324 +
  325 + # Freeze all parameters except the normalization
  326 + # which is assumed to be the first spectral parameter
  327 + normpar = model.spectral()[0]
  328 + for par in model:
  329 + if par.name() == normpar.name():
  330 + pass
  331 + else:
  332 + if par.is_free():
  333 + self._log_string(gammalib.EXPLICIT, ' Fixing "' + par.name() + '"')
  334 + par.fix()
  335 +
  336 + # Deal with the target sources
  337 + if model.name() in self._srcnames:
  338 +
  339 + # Free the normalisation parameter which is assumed to be
  340 + # the first spectral parameter
  341 + if normpar.is_fixed():
  342 + self._log_string(gammalib.EXPLICIT, ' Freeing "' + normpar.name() + '"')
  343 + normpar.free()
  344 +
  345 + # Optionally compute Test Statistic value
  346 + if self['calc_ts'].boolean():
  347 + model.tscalc(True)
  348 +
  349 + # Deal with background models
  350 + elif self['fix_bkg'].boolean() and not model.classname() == 'GModelSky':
  351 +
  352 + if normpar.is_free():
  353 + self._log_string(gammalib.EXPLICIT, ' Fixing "' + normpar.name() + '"')
  354 + normpar.fix()
  355 +
  356 +
  357 + # Deal with background sources
  358 + elif self['fix_srcs'].boolean() and model.classname() == 'GModelSky':
  359 +
  360 + if normpar.is_free():
  361 + self._log_string(gammalib.EXPLICIT, ' Fixing "' + normpar.name() + '"')
  362 + normpar.fix()
  363 +
  364 + # Return
  365 + return
  366 +
  367 + def _mask_cube(self, obs, ra, dec, rad):
  368 + """
  369 + Mask cube observation
  370 +
  371 + Parameters
  372 + ----------
  373 + obs : `gammalib.GCTAObservation`
  374 + Input observation of type cube
  375 + ra : float
  376 + Right Ascension (deg)
  377 + dec : float
  378 + Declination (deg)
  379 + rad : float
  380 + Radius (deg)
  381 +
  382 + Returns
  383 + -------
  384 + new_obs : `gammalib.GCTAObservations`
  385 + Output observations with masked cubes
  386 + """
  387 + # Filter cube according to ROI and user energy range
  388 + cubemask = ctools.ctcubemask(obs)
  389 + cubemask['ra'] = ra
  390 + cubemask['dec'] = dec
  391 + cubemask['rad'] = rad
  392 + cubemask['regfile'] = 'NONE'
  393 + cubemask['emin'] = self['emin'].real()
  394 + cubemask['emax'] = self['emax'].real()
  395 +
  396 + # If chatter level is verbose and debugging is requested then
  397 + # switch also on the debug model in ctcubemask
  398 + if self._logVerbose() and self._logDebug():
  399 + cubemask['debug'] = True
  400 +
  401 + # Mask cube
  402 + cubemask.run()
  403 +
  404 + # Get deep copy of filtered observations
  405 + new_obs = cubemask.obs().copy()
  406 +
  407 + # Return
  408 + return new_obs
  409 +
  410 + def _mask_evlist(self, obs, ra, dec, rad):
  411 + """
  412 + Mask event list
  413 +
  414 + Parameters
  415 + ----------
  416 + obs : `gammalib.GCTAObservations`
  417 + Input observations of type event list
  418 + ra : float
  419 + Right Ascension (deg)
  420 + dec : float
  421 + Declination (deg)
  422 + rad : float
  423 + Radius (deg)
  424 +
  425 + Returns
  426 + -------
  427 + new_obs : `gammalib.GCTAObservations`
  428 + Output observations with masked event lists
  429 + """
  430 + # Filter event list according to ROI and user energy range
  431 + select = ctools.ctselect(obs)
  432 + select['usepnt'] = False
  433 + select['ra'] = ra
  434 + select['dec'] = dec
  435 + select['rad'] = rad
  436 + select['emin'] = self['emin'].real()
  437 + select['emax'] = self['emax'].real()
  438 + select['tmin'] = 'INDEF'
  439 + select['tmax'] = 'INDEF'
  440 +
  441 + # If chatter level is verbose and debugging is requested then
  442 + # switch also on the debug model in ctcubemask
  443 + if self._logVerbose() and self._logDebug():
  444 + select['debug'] = True
  445 +
  446 + # Select event list
  447 + select.run()
  448 +
  449 + # Get deep copy of filtered observation
  450 + new_obs = select.obs().copy()
  451 +
  452 + # Return
  453 + return new_obs
  454 +
  455 + def _mask_observations(self, ra, dec, rad):
  456 + """
  457 + Create observations restricted to circular ROI
  458 +
  459 + Parameters
  460 + ----------
  461 + ra : float
  462 + Right Ascension (deg)
  463 + dec : float
  464 + Declination (deg)
  465 + rad : float
  466 + Radius (deg)
  467 +
  468 + Returns
  469 + -------
  470 + new_obs : `~gammalib.GObservations`
  471 + Observations in circular ROI
  472 + """
  473 + # Determine type of masking according
  474 + # to observation type and analysis method
  475 + if self._method == 'UNBINNED':
  476 + new_obs = self._mask_evlist(self.obs(), ra, dec, rad)
  477 + elif self._method == 'BINNED':
  478 + new_obs = self._mask_cube(self.obs(), ra, dec, rad)
  479 + elif self._method == 'ONOFF':
  480 + new_obs = obsutils.get_onoff_obs(self, self.obs(), nthreads=1,
  481 + ra=ra, dec=dec,
  482 + srcname=self._srcnames[0])
  483 +
  484 + # Return
  485 + return new_obs
  486 +
  487 + def _pixel_analysis(self, inx):
  488 + """
  489 + Performs analysis over the region of interest corresponding to a
  490 + single pixel of output map
  491 +
  492 + Parameters
  493 + ----------
  494 + inx : int
  495 + Pixel index
  496 +
  497 + Returns
  498 + -------
  499 + result : dict
  500 + Results
  501 + """
  502 +
  503 + # Create template for output map to extract pixel coordinates
  504 + outmap = self._create_map()
  505 +
  506 + # Determine pixel centre coordinates
  507 + pixdir = outmap.inx2dir(inx)
  508 + ra = pixdir.ra_deg()
  509 + dec = pixdir.dec_deg()
  510 +
  511 + # Write header for spatial bin
  512 + msg = 'Spatial bin (%d) centred on (R.A.,Dec) = (%f,%f) deg' % (inx, ra, dec)
  513 + self._log_header2(gammalib.TERSE, msg)
  514 +
  515 + # Initialize results
  516 + result = {}
  517 + for name in self._srcnames:
  518 + result[name] = {'flux': 0.0,
  519 + 'flux_err': 0.0,
  520 + 'TS': 0.0,
  521 + 'ulimit': -1.0}
  522 +
  523 + # Mask observations
  524 + self._log_header3(gammalib.NORMAL, 'Masking observations')
  525 + masked_obs = self._mask_observations(ra, dec, self['rad'].real())
  526 +
  527 + # Continue only if we have at least one observation
  528 + if masked_obs.size() > 0:
  529 +
  530 + # Set up likelihood analysis
  531 + self._log_header3(gammalib.NORMAL, 'Performing fit in region')
  532 + like = ctools.ctlike(masked_obs)
  533 + like['edisp'] = self['edisp'].boolean()
  534 + like['nthreads'] = 1 # Avoids OpenMP conflict
  535 +
  536 + # If chatter level is verbose and debugging is requested then
  537 + # switch also on the debug model in ctlike
  538 + if self._logVerbose() and self._logDebug():
  539 + like['debug'] = True
  540 +
  541 + # Perform maximum likelihood fit
  542 + like.run()
  543 +
  544 + # Write model results for explicit chatter level
  545 + self._log_string(gammalib.EXPLICIT, str(like.obs().models()))
  546 +
  547 + # Continue only if log-likelihood is non-zero
  548 + if like.obs().logL() != 0.0:
  549 +
  550 + # Prepare objects for flux extraction
  551 + # ROI
  552 + centre = gammalib.GSkyDir()
  553 + centre.radec_deg(ra, dec)
  554 + roi = gammalib.GSkyRegionCircle(centre, self['rad'].real())
  555 +
  556 + # Energy boundaries
  557 + emin = gammalib.GEnergy(self['emin'].real(), 'TeV')
  558 + emax = gammalib.GEnergy(self['emax'].real(), 'TeV')
  559 +
  560 + # Loop over target sources
  561 + for name in self._srcnames:
  562 +
  563 + # Get source
  564 + source = like.obs().models()[name]
  565 +
  566 + # Get flux
  567 + # Integrate spectral model between emin and emax
  568 + flux = source.spectral().flux(emin, emax)
  569 +
  570 + # Calculate correction factor
  571 + # Spatial model flux over ROI divided by ROI solid angle
  572 + corr_factor = source.spatial().flux(roi)
  573 + corr_factor /= gammalib.twopi * (1 - math.cos(math.radians(self['rad'].real())))
  574 +
  575 + # Multiply flux by correction factor
  576 + flux *= corr_factor
  577 + result[name]['flux'] = flux
  578 +
  579 + # Get flux error
  580 + # Normalization parameter
  581 + normpar = source.spectral()[0]
  582 +
  583 + # Only normalization parameter free
  584 + # Relative error on flux is same as on normalization
  585 + # Avoid zero division error
  586 + if normpar.value() > 0.:
  587 + flux_error = flux * normpar.error() / normpar.value()
  588 + else:
  589 + flux_error = 0.
  590 + result[name]['flux_error'] = flux_error
  591 +
  592 + # If requested get TS
  593 + if self['calc_ts'].boolean():
  594 + result[name]['TS'] = source.ts()
  595 +
  596 + # If requested compute upper flux limit
  597 + if self['calc_ulim'].boolean():
  598 +
  599 + # Logging information
  600 + self._log_header3(gammalib.NORMAL,
  601 + 'Computing upper limit for source ' + name)
  602 +
  603 + # Create upper limit object
  604 + ulimit = ctools.ctulimit(like.obs())
  605 + ulimit['srcname'] = name
  606 + ulimit['emin'] = self['emin'].real()
  607 + ulimit['emax'] = self['emax'].real()
  608 +
  609 + # If chatter level is verbose and debugging is requested
  610 + # then switch also on the debug model in ctulimit
  611 + if self._logVerbose() and self._logDebug():
  612 + ulimit['debug'] = True
  613 +
  614 + # Try to run upper limit and catch exceptions
  615 + try:
  616 + ulimit.run()
  617 + ulimit_value = ulimit.flux_ulimit()
  618 + # Multiply by correction factor to get flux per solid angle in ROI
  619 + ulimit_value *= corr_factor
  620 + result[name]['ulimit'] = ulimit_value
  621 + except:
  622 + self._log_string(gammalib.NORMAL, 'Upper limit '
  623 + 'calculation failed.')
  624 +
  625 + # if likelihood is zero
  626 + else:
  627 + value = 'Likelihood is zero. Bin is skipped.'
  628 + self._log_value(gammalib.TERSE, '(R.A.,Dec) = (%f,%f) deg' % (ra, dec), value)
  629 +
  630 + # if observation size = 0
  631 + else:
  632 + value = 'Size of masked observations is zero. Bin is skipped.'
  633 + self._log_value(gammalib.TERSE, '(R.A.,Dec) = (%f,%f) deg' % (ra, dec), value)
  634 +
  635 + # Return result
  636 + return result
  637 +
  638 + def _write_hdu_keywords(self, hdu, is_flux=False):
  639 + """
  640 + Append cards to HDU
  641 +
  642 + Parameters
  643 + ----------
  644 + hdu : `~gammalib.GFitsHDU`
  645 + HDU
  646 + """
  647 + # Flux units
  648 + if is_flux:
  649 + hdu.card('BUNIT', 'ph/cm2/s/sr', 'Photon flux')
  650 +
  651 + # Minimum and maximum energy
  652 + hdu.card('E_MIN', self['emin'].real(), '[TeV] Lower energy boundary')
  653 + hdu.card('E_MAX', self['emax'].real(), '[TeV] Upper energy boundary')
  654 + hdu.card('EUNIT', 'TeV', 'Units for E_MIN and E_MAX')
  655 +
  656 + # ROI size
  657 + hdu.card('ROISZ', self['rad'].real(),
  658 + '[deg] Size of ROI used for component separation')
  659 +
  660 + # Analysis method
  661 + hdu.card('METHOD', self._method, 'Analysis method')
  662 +
  663 + # For On/Off log information
  664 + if self._method == 'ONOFF':
  665 +
  666 + # Exclusion map
  667 + if self._excl_reg_name is not None:
  668 + hdu.card('EXCLMAP', self._excl_reg_name.url(), 'Exclusion map name')
  669 +
  670 + # Model background?
  671 + hdu.card('BKGMODEL', self['use_model_bkg'].boolean(), 'Use background model?')
  672 +
  673 + # Fit statistic
  674 + hdu.card('STAT', self['statistic'].string(), 'Fit statistic')
  675 +
  676 + # Return
  677 + return
  678 +
  679 + def _fill_fits(self, results):
  680 + """
  681 + Fill FITS object to store the results
  682 +
  683 + Parameters
  684 + ----------
  685 + result : `dict`
  686 + Results
  687 +
  688 + Returns
  689 + -------
  690 + fits : `~gammalib.GFits`
  691 + FITS object
  692 + """
  693 + # Create new Fits object
  694 + fits = gammalib.GFits()
  695 +
  696 + # Append empty primary HDU
  697 + fits.append(gammalib.GFitsImageDouble())
  698 +
  699 + # Loop over target sources
  700 + for s, name in enumerate(self._srcnames):
  701 +
  702 + # Create skymaps to store results
  703 + # Maps for TS and upper limits created and filled to avoid if statements
  704 + # Will not be saved in the end if not requested
  705 + fmap = self._create_map()
  706 + errmap = self._create_map()
  707 + tsmap = self._create_map()
  708 + ulmap = self._create_map()
  709 +
  710 + # Loop over pixels and fill maps
  711 + for inx in range(fmap.npix()):
  712 + fmap[inx, 0] = results[inx][name]['flux']
  713 + errmap[inx, 0] = results[inx][name]['flux_error']
  714 + tsmap[inx, 0] = results[inx][name]['TS']
  715 + ulmap[inx, 0] = results[inx][name]['ulimit']
  716 +
  717 + # Uppercase name to adhere to gammalib convention
  718 + Name = gammalib.toupper(name)
  719 +
  720 + # Write maps to Fits
  721 + fhdu = fmap.write(fits, Name + ' FLUX')
  722 + self._write_hdu_keywords(fhdu, is_flux=True)
  723 + errhdu = errmap.write(fits, Name + ' FLUX ERROR')
  724 + self._write_hdu_keywords(errhdu, is_flux=True)
  725 +
  726 + # If requested write TS map to fits
  727 + if self['calc_ts'].boolean():
  728 + tshdu = tsmap.write(fits, Name + ' TS')
  729 + self._write_hdu_keywords(tshdu)
  730 +
  731 + # If requested write upper limit map to fits
  732 + if self['calc_ulim'].boolean():
  733 + ulhdu = ulmap.write(fits, Name + ' FLUX UPPER LIMIT')
  734 + self._write_hdu_keywords(ulhdu, is_flux=True)
  735 +
  736 + # Return
  737 + return fits
  738 +
  739 + def _get_skymap(self, name, quantity):
  740 + """
  741 + Fetches skymap from FITS container
  742 +
  743 + Parameters
  744 + ----------
  745 + name : str
  746 + Source name
  747 + quantity : str
  748 + Quantity
  749 +
  750 + Returns
  751 + -------
  752 + skymap : `~gammalib.GSkyMap`
  753 + Skymap
  754 +
  755 + Raises
  756 + ------
  757 + NameError
  758 + """
  759 +
  760 + # Initialise skymap object
  761 + skymap = None
  762 +
  763 + # Proceed only if fits has been filled
  764 + if self._fits != None:
  765 +
  766 + # Check that the name is in the list of target sources
  767 + if name in self._srcnames:
  768 +
  769 + # Uppercase name
  770 + Name = gammalib.toupper(name)
  771 +
  772 + # Assemble HDU name
  773 + hduname = Name + ' ' + quantity
  774 +
  775 + # Try to fetch HDU
  776 + try:
  777 + hdu = self._fits[hduname]
  778 + # Convert to GSkyMap
  779 + skymap = gammalib.GSkyMap(hdu)
  780 + # Catch exception if HDU does not exist
  781 + except:
  782 + msg = 'HDU "' + hduname + '" not found in FITS container.'
  783 + raise RuntimeError(msg)
  784 +
  785 + # ... otherwise throw name error
  786 + else:
  787 + print('ERROR: Source "' + name + '" not found in list of target sources.')
  788 + raise NameError(name)
  789 +
  790 + # Return
  791 + return skymap
  792 +
  793 + # Public methods
  794 + def run(self):
  795 + """
  796 + Run the script
  797 + """
  798 + # Switch screen logging on in debug mode
  799 + if self._logDebug():
  800 + self._log.cout(True)
  801 +
  802 + # Get parameters
  803 + self._get_parameters()
  804 +
  805 + # Write input observation container into logger
  806 + self._log_observations(gammalib.NORMAL, self.obs(), 'Input observation')
  807 +
  808 + # Adjust model parameters based on input user parameters
  809 + self._adjust_model_pars()
  810 +
  811 + # Compute number of pixels of output map
  812 + npix = self._create_map().npix()
  813 +
  814 + # If more than a single thread is requested then use multiprocessing
  815 + if self._nthreads > 1:
  816 +
  817 + # Compute values in pixels
  818 + args = [(self, '_pixel_analysis', i)
  819 + for i in range(npix)]
  820 + poolresults = mputils.process(self._nthreads, mputils.mpfunc, args)
  821 +
  822 + # Construct results
  823 + results = []
  824 + for i in range(npix):
  825 + results.append(poolresults[i][0])
  826 + self._log_string(gammalib.TERSE, poolresults[i][1]['log'], False)
  827 +
  828 + # Otherwise loop over pixels and run the pixel analysis
  829 + else:
  830 + results = []
  831 + for i in range(npix):
  832 + results.append(self._pixel_analysis(i))
  833 +
  834 + # Fill output Fits
  835 + self._fits = self._fill_fits(results)
  836 +
  837 + # Return
  838 + return
  839 +
  840 + def save(self):
  841 + """
  842 + Save maps to Fits flie
  843 + """
  844 + # Write header
  845 + self._log_header1(gammalib.TERSE, 'Save maps')
  846 +
  847 + # Continue only if FITS file is valid
  848 + if self._fits != None:
  849 + # Get outmap parameter
  850 + outfile = self['outfile'].filename()
  851 +
  852 + # Log file name
  853 + self._log_value(gammalib.NORMAL, 'Output file', outfile.url())
  854 +
  855 + # Save spectrum
  856 + self._fits.saveto(outfile, self['clobber'].boolean())
  857 +
  858 + # Return
  859 + return
  860 +
  861 + def exclusion_map(self, object=None):
  862 + """
  863 + Return and optionally set the exclusion regions map
  864 +
  865 + Parameters
  866 + ----------
  867 + object : `~gammalib.GSkyRegion` or `~gammalib.GSkyMap` or `~gammalib.GFilename`
  868 + Exclusion regions object
  869 +
  870 + Returns
  871 + -------
  872 + region : `~gammalib.GSkyRegionMap`
  873 + Exclusion regions map
  874 + """
  875 + # If a regions object is provided then set the regions
  876 + if object is not None:
  877 + self._excl_reg_map = gammalib.GSkyRegionMap(object)
  878 +
  879 + # Return
  880 + return self._excl_reg_map
  881 +
  882 + def fits(self):
  883 + """
  884 + Return copy of the fits container
  885 +
  886 + Returns
  887 + -------
  888 + fits : `~gammalib.GFits`
  889 + FITS file containing the maps
  890 + """
  891 + # Return
  892 + return self._fits.copy()
  893 +
  894 + def flux(self, name):
  895 + """
  896 + Return flux skymap
  897 +
  898 + Parameters
  899 + ----------
  900 + name : str
  901 + Source name
  902 +
  903 + Returns
  904 + -------
  905 + skymap : `~gammalib.GSkyMap`
  906 + Flux skymap
  907 + """
  908 + # Get flux skymap
  909 + skymap = self._get_skymap(name, 'FLUX')
  910 +
  911 + # Return flux sky map
  912 + return skymap
  913 +
  914 + def flux_error(self, name):
  915 + """
  916 + Return flux error skymap
  917 +
  918 + Parameters
  919 + ----------
  920 + name : str
  921 + Source name
  922 +
  923 + Returns
  924 + -------
  925 + skymap : `~gammalib.GSkyMap`
  926 + Flux error skymap
  927 + """
  928 + # Get flux error sky map
  929 + skymap = self._get_skymap(name, 'FLUX ERROR')
  930 +
  931 + # Return flux error sky map
  932 + return skymap
  933 +
  934 + def ts(self, name):
  935 + """
  936 + Return TS skymap
  937 +
  938 + Parameters
  939 + ----------
  940 + name : str
  941 + Source name
  942 +
  943 + Returns
  944 + -------
  945 + skymap : `~gammalib.GSkyMap`
  946 + TS skymap
  947 + """
  948 + # Check that TS computation is requested
  949 + if self['calc_ts'].boolean():
  950 + skymap = self._get_skymap(name, 'TS')
  951 +
  952 + # ... otherwise raise error
  953 + else:
  954 + msg = 'TS computation not requested. Change user parameter ' \
  955 + '"calc_ts" to True to obtain TS.'
  956 + raise RuntimeError(msg)
  957 +
  958 + # Return TS map
  959 + return skymap
  960 +
  961 + def ulimit(self, name):
  962 + """
  963 + Return flux upper limit skymap
  964 +
  965 + Parameters
  966 + ----------
  967 + name : str
  968 + Source name
  969 +
  970 + Returns
  971 + -------
  972 + skymap : `~gammalib.GSkyMap`
  973 + Flux upper limit skymap
  974 + """
  975 + # Check that upper limit computation is requested
  976 + if self['calc_ulim'].boolean():
  977 + skymap = self._get_skymap(name, 'FLUX UPPER LIMIT')
  978 +
  979 + # ... otherwise raise error
  980 + else:
  981 + msg = 'Upper limit computation not requested. Change user parameter ' \
  982 + '"calc_ulimit" to True to obtain upper limit.'
  983 + raise RuntimeError(msg)
  984 +
  985 + # Return upper limit map
  986 + return skymap
  987 +
  988 +
  989 +# ======================== #
  990 +# Main routine entry point #
  991 +# ======================== #
  992 +if __name__ == '__main__':
  993 +
  994 + # Create instance of application
  995 + app = csscs(sys.argv)
  996 +
  997 + # Execute application
  998 + app.execute()
cscripts/obsutils.py
@@ -745,7 +745,7 @@ def get_stacked_obs(cls, obs, nthreads=0): @@ -745,7 +745,7 @@ def get_stacked_obs(cls, obs, nthreads=0):
745 # ================================ # 745 # ================================ #
746 # Get On/Off observation container # 746 # Get On/Off observation container #
747 # ================================ # 747 # ================================ #
748 -def get_onoff_obs(cls, obs, nthreads=0): 748 +def get_onoff_obs(cls, obs, nthreads=0, ra = None, dec = None, srcname = ''):
749 """ 749 """
750 Create On/Off observations container from given observations 750 Create On/Off observations container from given observations
751 751
@@ -757,6 +757,12 @@ def get_onoff_obs(cls, obs, nthreads=0): @@ -757,6 +757,12 @@ def get_onoff_obs(cls, obs, nthreads=0):
757 Observation container 757 Observation container
758 nthreads : str, optional 758 nthreads : str, optional
759 Number of parallel processes for On/Off spectra computation (0=all available CPUs) 759 Number of parallel processes for On/Off spectra computation (0=all available CPUs)
  760 + ra : float, optional
  761 + R.A. of source region centre
  762 + dec : float, optional
  763 + Dec. of source region centre
  764 + srcname : str, optional
  765 + Source name
760 766
761 Returns 767 Returns
762 ------- 768 -------
@@ -767,21 +773,16 @@ def get_onoff_obs(cls, obs, nthreads=0): @@ -767,21 +773,16 @@ def get_onoff_obs(cls, obs, nthreads=0):
767 if cls._logExplicit(): 773 if cls._logExplicit():
768 cls._log.header3('Creating On/Off observations') 774 cls._log.header3('Creating On/Off observations')
769 775
770 - # Initialise inmodel, srcname, inexclusion and use_model_bkg 776 + # Initialise inmodel and use_model_bkg
771 inmodel = 'NONE' 777 inmodel = 'NONE'
772 - srcname = ''  
773 - inexclusion = 'NONE'  
774 use_model_bkg = True 778 use_model_bkg = True
775 779
776 - # Set inmodel, srcname, inexclusion and use_model_bkg if they are available 780 + # Set inmodel, srcname, and use_model_bkg if they are available
777 if cls.has_par('inmodel') and obs.models().size() == 0: 781 if cls.has_par('inmodel') and obs.models().size() == 0:
778 if cls['inmodel'].is_valid(): 782 if cls['inmodel'].is_valid():
779 inmodel = cls['inmodel'].value() 783 inmodel = cls['inmodel'].value()
780 - if cls.has_par('srcname'): 784 + if srcname == '' and cls.has_par('srcname'):
781 srcname = cls['srcname'].value() 785 srcname = cls['srcname'].value()
782 - if cls.has_par('inexclusion'):  
783 - if cls['inexclusion'].is_valid():  
784 - inexclusion = cls['inexclusion'].value()  
785 if cls.has_par('use_model_bkg'): 786 if cls.has_par('use_model_bkg'):
786 use_model_bkg = cls['use_model_bkg'].boolean() 787 use_model_bkg = cls['use_model_bkg'].boolean()
787 788
@@ -789,19 +790,25 @@ def get_onoff_obs(cls, obs, nthreads=0): @@ -789,19 +790,25 @@ def get_onoff_obs(cls, obs, nthreads=0):
789 phagen = cscripts.csphagen(obs) 790 phagen = cscripts.csphagen(obs)
790 phagen['inmodel'] = inmodel 791 phagen['inmodel'] = inmodel
791 phagen['srcname'] = srcname 792 phagen['srcname'] = srcname
792 - phagen['inexclusion'] = inexclusion  
793 phagen['emin'] = cls['emin'].real() 793 phagen['emin'] = cls['emin'].real()
794 phagen['emax'] = cls['emax'].real() 794 phagen['emax'] = cls['emax'].real()
795 phagen['enumbins'] = cls['enumbins'].integer() 795 phagen['enumbins'] = cls['enumbins'].integer()
796 phagen['ebinalg'] = 'LOG' 796 phagen['ebinalg'] = 'LOG'
797 phagen['srcshape'] = cls['srcshape'].string() 797 phagen['srcshape'] = cls['srcshape'].string()
798 - phagen['coordsys'] = cls['coordsys'].string()  
799 - if cls['coordsys'].string() == 'CEL':  
800 - phagen['ra'] = cls['xref'].real()  
801 - phagen['dec'] = cls['yref'].real()  
802 - elif cls['coordsys'].string() == 'GAL':  
803 - phagen['glon'] = cls['xref'].real()  
804 - phagen['glat'] = cls['yref'].real() 798 + # User has specified custom centre for the source region
  799 + if ra != None and dec != None:
  800 + phagen['coordsys'] = 'CEL'
  801 + phagen['ra'] = ra
  802 + phagen['dec'] = dec
  803 + # Otherwise use default in class
  804 + else:
  805 + phagen['coordsys'] = cls['coordsys'].string()
  806 + if cls['coordsys'].string() == 'CEL':
  807 + phagen['ra'] = cls['xref'].real()
  808 + phagen['dec'] = cls['yref'].real()
  809 + elif cls['coordsys'].string() == 'GAL':
  810 + phagen['glon'] = cls['xref'].real()
  811 + phagen['glat'] = cls['yref'].real()
805 if cls['srcshape'].string() == 'CIRCLE': 812 if cls['srcshape'].string() == 'CIRCLE':
806 phagen['rad'] = cls['rad'].real() 813 phagen['rad'] = cls['rad'].real()
807 phagen['bkgmethod'] = cls['bkgmethod'].string() 814 phagen['bkgmethod'] = cls['bkgmethod'].string()
@@ -818,13 +825,37 @@ def get_onoff_obs(cls, obs, nthreads=0): @@ -818,13 +825,37 @@ def get_onoff_obs(cls, obs, nthreads=0):
818 phagen['debug'] = cls['debug'].boolean() 825 phagen['debug'] = cls['debug'].boolean()
819 phagen['nthreads'] = nthreads 826 phagen['nthreads'] = nthreads
820 827
821 - # Pipe exclusion map 828 + # Set exclusion map
  829 + # Initialise exclusion map flag to False
  830 + use_excl_map = False
  831 + # Initialise inexclusion par flag to False
  832 + use_inexclusion = False
  833 + # Do we have valid exclusion map in memory?
822 if hasattr(cls, 'exclusion_map'): 834 if hasattr(cls, 'exclusion_map'):
823 exclusion_map = cls.exclusion_map() 835 exclusion_map = cls.exclusion_map()
824 if exclusion_map is not None: 836 if exclusion_map is not None:
  837 + # Set use exclusion map flag to True
  838 + use_excl_map = True
  839 + # Set exclusion map
825 phagen.exclusion_map(exclusion_map) 840 phagen.exclusion_map(exclusion_map)
826 -  
827 - # Run csphagen 841 + # If we do not have valid exclusion map in memory ...
  842 + if not use_excl_map:
  843 + # ... do we have an inxeclusion parameter?
  844 + if cls.has_par('inexclusion'):
  845 + # If the inexclusion parameter is valid
  846 + if cls['inexclusion'].is_valid():
  847 + # Set use inexclusion flag to True
  848 + use_inexclusion = True
  849 + # Set inexclusion parameter
  850 + inexclusion = cls['inexclusion'].value()
  851 + phagen['inexclusion'] = inexclusion
  852 + # If there is no valid exclusion map in memory
  853 + # nor valid inexclusion parameter
  854 + if not use_excl_map and not use_inexclusion:
  855 + # Set inexclusion for csphagen to None
  856 + phagen['inexclusion'] = 'NONE'
  857 +
  858 + # Run csphagen
828 phagen.run() 859 phagen.run()
829 860
830 # Clone resulting observation container 861 # Clone resulting observation container
dev/codegen.py
@@ -18,12 +18,12 @@ @@ -18,12 +18,12 @@
18 # along with this program. If not, see <http://www.gnu.org/licenses/>. 18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 # 19 #
20 # ========================================================================== 20 # ==========================================================================
  21 +from __future__ import print_function
21 import os 22 import os
22 import sys 23 import sys
23 -import glob  
24 -import commands  
25 import fileinput 24 import fileinput
26 from datetime import date 25 from datetime import date
  26 +from builtins import input
27 import gammalib 27 import gammalib
28 28
29 29
@@ -47,7 +47,7 @@ def confirm(text): @@ -47,7 +47,7 @@ def confirm(text):
47 # Confirmation loop 47 # Confirmation loop
48 waiting = True 48 waiting = True
49 while waiting: 49 while waiting:
50 - confirmation = str(raw_input(text+' (y/n): ')) 50 + confirmation = str(input(text+' (y/n): '))
51 if confirmation == 'q': 51 if confirmation == 'q':
52 sys.exit() 52 sys.exit()
53 elif confirmation == 'y': 53 elif confirmation == 'y':
@@ -87,7 +87,7 @@ def response(text, confirm_response=False): @@ -87,7 +87,7 @@ def response(text, confirm_response=False):
87 # Get response from input 87 # Get response from input
88 waiting = True 88 waiting = True
89 while waiting: 89 while waiting:
90 - response = str(raw_input('%s: ' % text)) 90 + response = str(input('%s: ' % text))
91 if response == 'q': 91 if response == 'q':
92 sys.exit() 92 sys.exit()
93 else: 93 else:
@@ -275,13 +275,13 @@ def add_ctool(name, tokens, baseclass): @@ -275,13 +275,13 @@ def add_ctool(name, tokens, baseclass):
275 if 'libctools_la_LIBADD' in line.replace(' ', ''): 275 if 'libctools_la_LIBADD' in line.replace(' ', ''):
276 last = line[-2] 276 last = line[-2]
277 line = line.replace(line, line+insertline2+last+'\n') 277 line = line.replace(line, line+insertline2+last+'\n')
278 - print line, 278 + print(line,end=''),
279 279
280 # Update Python module 280 # Update Python module
281 for line in fileinput.FileInput('pyext/ctools/tools.i',inplace=1): 281 for line in fileinput.FileInput('pyext/ctools/tools.i',inplace=1):
282 if '%include "ctbin.i"' in line: 282 if '%include "ctbin.i"' in line:
283 print('%%include "%s.i"' % (name)) 283 print('%%include "%s.i"' % (name))
284 - print line, 284 + print(line,end=''),
285 285
286 # Update unit test 286 # Update unit test
287 for line in fileinput.FileInput('test/test_python_ctools.py',inplace=1): 287 for line in fileinput.FileInput('test/test_python_ctools.py',inplace=1):
@@ -289,25 +289,25 @@ def add_ctool(name, tokens, baseclass): @@ -289,25 +289,25 @@ def add_ctool(name, tokens, baseclass):
289 print('import test_%s' % (name)) 289 print('import test_%s' % (name))
290 elif 'test_ctbin.Test()' in line: 290 elif 'test_ctbin.Test()' in line:
291 print(' test_%s.Test(),' % (name)) 291 print(' test_%s.Test(),' % (name))
292 - print line, 292 + print(line,end=''),
293 293
294 # Update export of unit test 294 # Update export of unit test
295 for line in fileinput.FileInput('pyext/Makefile.am',inplace=1): 295 for line in fileinput.FileInput('pyext/Makefile.am',inplace=1):
296 if '$(top_srcdir)/test/test_ctbin.py' in line: 296 if '$(top_srcdir)/test/test_ctbin.py' in line:
297 print(' $(top_srcdir)/test/test_%s.py \\' % (name)) 297 print(' $(top_srcdir)/test/test_%s.py \\' % (name))
298 - print line, 298 + print(line,end=''),
299 299
300 # Update configure.ac 300 # Update configure.ac
301 for line in fileinput.FileInput('configure.ac',inplace=1): 301 for line in fileinput.FileInput('configure.ac',inplace=1):
302 if 'src/ctbin/Makefile' in line: 302 if 'src/ctbin/Makefile' in line:
303 print(' src/%s/Makefile' % (name)) 303 print(' src/%s/Makefile' % (name))
304 - print line, 304 + print(line,end=''),
305 305
306 # Update reference manual index file 306 # Update reference manual index file
307 for line in fileinput.FileInput('doc/source/users/reference_manual/index.rst',inplace=1): 307 for line in fileinput.FileInput('doc/source/users/reference_manual/index.rst',inplace=1):
308 if 'ctbin --- Generates counts cube <ctbin>' in line: 308 if 'ctbin --- Generates counts cube <ctbin>' in line:
309 print(' %s --- ToDo: Describe what tool is doing <%s>' % (name, name)) 309 print(' %s --- ToDo: Describe what tool is doing <%s>' % (name, name))
310 - print line, 310 + print(line,end=''),
311 311
312 # Return 312 # Return
313 return 313 return
@@ -356,7 +356,7 @@ def add_cscript(name, tokens, baseclass): @@ -356,7 +356,7 @@ def add_cscript(name, tokens, baseclass):
356 print(' "%s",' % (name)) 356 print(' "%s",' % (name))
357 elif 'from cscripts.csworkflow import csworkflow' in line: 357 elif 'from cscripts.csworkflow import csworkflow' in line:
358 print('from cscripts.%s import %s' % (name, name)) 358 print('from cscripts.%s import %s' % (name, name))
359 - print line, 359 + print(line,end=''),
360 360
361 # Update cscripts/Makefile.am file 361 # Update cscripts/Makefile.am file
362 for line in fileinput.FileInput('cscripts/Makefile.am',inplace=1): 362 for line in fileinput.FileInput('cscripts/Makefile.am',inplace=1):
@@ -368,7 +368,7 @@ def add_cscript(name, tokens, baseclass): @@ -368,7 +368,7 @@ def add_cscript(name, tokens, baseclass):
368 print(' %s \\' % (name)) 368 print(' %s \\' % (name))
369 elif '$(top_srcdir)/test/test_csworkflow.py' in line: 369 elif '$(top_srcdir)/test/test_csworkflow.py' in line:
370 print(' $(top_srcdir)/test/test_%s.py \\' % (name)) 370 print(' $(top_srcdir)/test/test_%s.py \\' % (name))
371 - print line, 371 + print(line,end=''),
372 372
373 # Update test/test_python_cscripts.py file 373 # Update test/test_python_cscripts.py file
374 for line in fileinput.FileInput('test/test_python_cscripts.py',inplace=1): 374 for line in fileinput.FileInput('test/test_python_cscripts.py',inplace=1):
@@ -376,13 +376,13 @@ def add_cscript(name, tokens, baseclass): @@ -376,13 +376,13 @@ def add_cscript(name, tokens, baseclass):
376 print('import test_%s' % (name)) 376 print('import test_%s' % (name))
377 elif 'test_csworkflow.Test()' in line: 377 elif 'test_csworkflow.Test()' in line:
378 print(' test_%s.Test(),' % (name)) 378 print(' test_%s.Test(),' % (name))
379 - print line, 379 + print(line,end=''),
380 380
381 # Update reference manual index file 381 # Update reference manual index file
382 for line in fileinput.FileInput('doc/source/users/reference_manual/index.rst',inplace=1): 382 for line in fileinput.FileInput('doc/source/users/reference_manual/index.rst',inplace=1):
383 if 'csbkgmodel --- Generates background model for 3D analysis <csbkgmodel>' in line: 383 if 'csbkgmodel --- Generates background model for 3D analysis <csbkgmodel>' in line:
384 print(' %s --- ToDo: Describe what script is doing <%s>' % (name, name)) 384 print(' %s --- ToDo: Describe what script is doing <%s>' % (name, name))
385 - print line, 385 + print(line,end=''),
386 386
387 # Return 387 # Return
388 return 388 return
@@ -414,7 +414,7 @@ def ctool_menu(): @@ -414,7 +414,7 @@ def ctool_menu():
414 waiting = True 414 waiting = True
415 choice = 1 415 choice = 1
416 while waiting: 416 while waiting:
417 - choice = str(raw_input('Enter your choice: ')) 417 + choice = str(input('Enter your choice: '))
418 if choice == '1' or choice == '2' or choice == '3': 418 if choice == '1' or choice == '2' or choice == '3':
419 waiting = False 419 waiting = False
420 if choice == '1': 420 if choice == '1':
@@ -480,7 +480,7 @@ def cscript_menu(): @@ -480,7 +480,7 @@ def cscript_menu():
480 waiting = True 480 waiting = True
481 choice = 1 481 choice = 1
482 while waiting: 482 while waiting:
483 - choice = str(raw_input('Enter your choice: ')) 483 + choice = str(input('Enter your choice: '))
484 if choice == '1' or choice == '2' or choice == '3': 484 if choice == '1' or choice == '2' or choice == '3':
485 waiting = False 485 waiting = False
486 if choice == '1': 486 if choice == '1':
@@ -535,7 +535,7 @@ def main_menu(): @@ -535,7 +535,7 @@ def main_menu():
535 # Wait for the input 535 # Wait for the input
536 waiting = True 536 waiting = True
537 while waiting: 537 while waiting:
538 - choice = str(raw_input('Enter your choice: ')) 538 + choice = str(input('Enter your choice: '))
539 if choice == '1' or choice == '2' or choice == 'q': 539 if choice == '1' or choice == '2' or choice == 'q':
540 waiting = False 540 waiting = False
541 541
doc/source/conf.py
@@ -38,6 +38,8 @@ except: @@ -38,6 +38,8 @@ except:
38 try: 38 try:
39 import nbsphinx 39 import nbsphinx
40 extensions += ['nbsphinx','IPython.sphinxext.ipython_console_highlighting'] 40 extensions += ['nbsphinx','IPython.sphinxext.ipython_console_highlighting']
  41 + # Disable execution of notebooks at make doc step
  42 + nbsphinx_execute = 'never'
41 except: 43 except:
42 print('WARNING: Python package `nbsphinx` not found.\n' 44 print('WARNING: Python package `nbsphinx` not found.\n'
43 'WARNING: Please install it to get fully-functional Sphinx docs.\n' 45 'WARNING: Please install it to get fully-functional Sphinx docs.\n'
doc/source/users/reference_manual/cslightcrv.rst
@@ -62,9 +62,11 @@ General parameters @@ -62,9 +62,11 @@ General parameters
62 Instrumental response function. 62 Instrumental response function.
63 63
64 ``(inexclusion = NONE) [file]`` 64 ``(inexclusion = NONE) [file]``
65 - Optional FITS file containing a WCS map in the first hdu that defines sky  
66 - regions not to be used for background estimation in On/Off analysis (where  
67 - map value != 0). 65 + Optional FITS file containing a WCS map that defines sky regions
  66 + not to be used for background estimation (where map value !=
  67 + 0). If the file contains multiple extensions the user may specify
  68 + which one to use. Otherwise, the extention ``EXCLUSION`` will be
  69 + used if available, or else the primary extension will be used.
68 70
69 ``(edisp = no) [boolean]`` 71 ``(edisp = no) [boolean]``
70 Applies energy dispersion to response computation (for ``3D`` analysis only, 72 Applies energy dispersion to response computation (for ``3D`` analysis only,
doc/source/users/reference_manual/csphagen.rst
@@ -25,9 +25,13 @@ respect to the pointing direction that are smaller than the value specified by @@ -25,9 +25,13 @@ respect to the pointing direction that are smaller than the value specified by
25 the ``maxoffset`` parameter. If less than ``bkgregmin`` reflected regions can be 25 the ``maxoffset`` parameter. If less than ``bkgregmin`` reflected regions can be
26 found because the offset angle between source and pointing direction is too small, 26 found because the offset angle between source and pointing direction is too small,
27 the observation will be skipped. Regions to be excluded for background 27 the observation will be skipped. Regions to be excluded for background
28 -determination can be specified using a mask file that is specified using the  
29 -``inexclusion`` parameter. A mask file is a sky map where all pixel values that  
30 -differ from zero will be used as exclusion region. 28 +determination can be specified using a FITS mask file that is specified using the
  29 +``inexclusion`` parameter. A mask is a sky map where all pixel values that
  30 +differ from zero will be used as exclusion region. If the FITS file
  31 +contains multiple extensions and the user does not specify which one
  32 +to use, the extention ``EXCLUSION`` will be used if available (e.g.,
  33 +if you use a skymap generated by :ref:`ctskymap`).
  34 +Otherwise the primary extension will be used.
31 35
32 Alternatively, if ``bkgmethod=CUSTOM`` is specified, the source and background 36 Alternatively, if ``bkgmethod=CUSTOM`` is specified, the source and background
33 regions will be specified using the ``srcregfile`` and ``bkgregfile`` parameters, 37 regions will be specified using the ``srcregfile`` and ``bkgregfile`` parameters,
@@ -84,8 +88,11 @@ General parameters @@ -84,8 +88,11 @@ General parameters
84 Instrument response function. 88 Instrument response function.
85 89
86 ``(inexclusion = NONE) [file]`` 90 ``(inexclusion = NONE) [file]``
87 - Optional FITS file containing a WCS map in the first extension that defines  
88 - sky regions not to be used for background estimation (where map value != 0). 91 + Optional FITS file containing a WCS map that defines sky regions
  92 + not to be used for background estimation (where map value !=
  93 + 0). If the file contains multiple extensions the user may specify
  94 + which one to use. Otherwise, the extention ``EXCLUSION`` will be
  95 + used if available, or else the primary extension will be used.
89 96
90 ``outobs [file]`` 97 ``outobs [file]``
91 Output observation definition XML file. 98 Output observation definition XML file.
@@ -240,4 +247,7 @@ Standard parameters @@ -240,4 +247,7 @@ Standard parameters
240 Related tools or scripts 247 Related tools or scripts
241 ------------------------ 248 ------------------------
242 249
243 -None 250 +:doc:`ctskymap`
  251 +:doc:`csphasecrv`
  252 +:doc:`cslightcrv`
  253 +
doc/source/users/reference_manual/csphasecrv.rst
@@ -59,9 +59,11 @@ General parameters @@ -59,9 +59,11 @@ General parameters
59 Instrumental response function. 59 Instrumental response function.
60 60
61 ``(inexclusion = NONE) [file]`` 61 ``(inexclusion = NONE) [file]``
62 - Optional FITS file containing a WCS map in the first hdu that defines sky  
63 - regions not to be used for background estimation in On/Off analysis (where  
64 - map value != 0). 62 + Optional FITS file containing a WCS map that defines sky regions
  63 + not to be used for background estimation (where map value !=
  64 + 0). If the file contains multiple extensions the user may specify
  65 + which one to use. Otherwise, the extention ``EXCLUSION`` will be
  66 + used if available, or else the primary extension will be used.
65 67
66 ``(edisp = no) [boolean]`` 68 ``(edisp = no) [boolean]``
67 Applies energy dispersion to response computation (for ``3D`` analysis only, 69 Applies energy dispersion to response computation (for ``3D`` analysis only,
doc/source/users/reference_manual/csscs.rst 0 → 100644
  1 +.. _csscs:
  2 +
  3 +csscs
  4 +=====
  5 +
  6 +Performs spectral component separation.
  7 +
  8 +
  9 +Synopsis
  10 +--------
  11 +
  12 +This script performs a spectral component separation, that is, produces a flux
  13 +skymap of one or multiple sources by running a likelihood analysis over multiple
  14 +adjacent circular regions of interest (ROI) based on prior knowledge of the
  15 +sources' spectra. The centre of the ROIs is displaced to coincide with the
  16 +centre of each pixel in the output flux map, while the radius is set through
  17 +the user parameter ``rad``.
  18 +
  19 +The model fit per ROI is performed using :doc:`ctlike`, and only the normalisations
  20 +of the model components are treated as free parameters. The script provides the
  21 +possibility to fix sources other than the source(s) of interest (hidden
  22 +parameter ``fix_srcs``) or to fix the normalisation of the background model
  23 +component(s) (hidden parameter ``fix_bkg``).
  24 +
  25 +The script computes the source flux and its uncertainty in each ROI/map pixel,
  26 +as well as the significance of the source detection (for faster execution the
  27 +significance computation can be deactivated using the hidden parameter
  28 +``calc_ts``). Optionally, the script also computes an upper flux limit that is
  29 +particularly useful in case that the source is not significantly detected within
  30 +an ROI (hidden parameter ``calc_ulim``).
  31 +
  32 +The script accepts in input event lists, binned data, or observation definition
  33 +XML files. Only data within an energy interval spanned by ``emin`` and ``emax`` are
  34 +considered. For event lists two analysis methods are proposed: unbinned or
  35 +On/Off.
  36 +
  37 +For the On/Off method :doc:`csphagen` is used to prepare On/Off observations for
  38 +every ROI analysed. In On/Off mode the user is required to provide an exclusion
  39 +map to avoid using regions of significant gamma-ray emission in the evaluation
  40 +of the background (exclusion maps can be generate using :doc:`ctskymap`). Furthemore,
  41 +On/Off analysis including sources other than the source(s) of interest is not
  42 +supported, and if more than one source of interest is present the response will
  43 +be calculated based on the hypothesis that emission from the sources of interest
  44 +is uniform over each ROI.
  45 +
  46 +:ref:`csscs` generates a FITS file with empty primary extension. Additional
  47 +extensions provide for every source of interest a skymap of flux, flux error,
  48 +and, if requested, detection signficance and flux upper limits.
  49 +
  50 +General parameters
  51 +------------------
  52 +
  53 +``inobs [file]``
  54 + Input event list, counts cube or observation definition XML file.
  55 +
  56 +``inmodel [file]``
  57 + Input model XML file.
  58 +
  59 +``srcnames [string]``
  60 + Semicolon-separated list of names of the sources in the source model XML
  61 + file which should be considered for the spectral component separation.
  62 +
  63 +``expcube [file]``
  64 + Input exposure cube file.
  65 +
  66 +``psfcube [file]``
  67 + Input PSF cube file.
  68 +
  69 +``edispcube [file]``
  70 + Input energy dispersion cube file.
  71 +
  72 +``bkgcube [file]``
  73 + Input background cube file.
  74 +
  75 +``caldb [string]``
  76 + Calibration database.
  77 +
  78 +``irf [string]``
  79 + Instrument response function.
  80 +
  81 +``inexclusion [file]``
  82 + FITS file containing a WCS map that defines sky regions not to be used for
  83 + background estimation (where map value != 0). If the file contains multiple
  84 + extensions the user may specify which one to use. Otherwise, the extention
  85 + ``EXCLUSION`` will be used if available, or else the primary extension will
  86 + be used.
  87 +
  88 +``(edisp = no) [boolean]``
  89 + Apply energy dispersion to response computation?
  90 +
  91 +``outfile [file]``
  92 + Output file.
  93 +
  94 +``nxpix [integer]``
  95 + Size of the Right Ascension / Galactic longitude axis (in pixels).
  96 +
  97 +``nypix [integer]``
  98 + Size of the Declination / Galactic latitude axis (in pixels).
  99 +
  100 +``binsz [real]``
  101 + Pixel size (in degrees/pixel).
  102 +
  103 +``coordsys <CEL|GAL> [string]``
  104 + Coordinate system (CEL - celestial, GAL - galactic).
  105 +
  106 +``proj <AIT|AZP|CAR|GLS|MER|MOL|SFL|SIN|STG|TAN> [string]``
  107 + Projection method.
  108 +
  109 +``xref [real]``
  110 + Right Ascension / Galactic longitude of image centre (J2000, in degrees).
  111 +
  112 +``yref [real]``
  113 + Declination / Galactic latitude of image centre (J2000, in
  114 + degrees).
  115 +
  116 +``rad [real]``
  117 + Radius of region of interest for component separation (deg). Sets the
  118 + correlation scale between neighbour pixels in the output maps. Must be at
  119 + least sqrt(2) times ``binsz`` for full coverage of input data.
  120 +
  121 +``emin [real]``
  122 + Minimum energy (in TeV).
  123 +
  124 +``emax [real]``
  125 + Maximum energy (in TeV).
  126 +
  127 +``method <UNBINNED|ONOFF> [string]``
  128 + For input event lists selects between ``UNBINNED`` analysis (3D spatial/energy
  129 + likelihood without binning) and ``ONOFF`` analysis (1D likelihood with
  130 + background from Off regions).
  131 +
  132 +``(statistic = DEFAULT) <DEFAULT|CSTAT|WSTAT|CHI2> [string]``
  133 + Optimization statistic. ``DEFAULT`` uses the default statistic for all
  134 + observations, which is ``CSTAT`` or the statistic specified in the
  135 + observation definition XML file. ``CSTAT`` uses the C statistic for all
  136 + observations, ``WSTAT`` uses the W statistic for On/Off observations, and
  137 + ``CHI2`` uses the Chi squared statistic for binned or stacked observations.
  138 +
  139 +``(calc_ts = yes) [boolean]``
  140 + Compute TS value for each map bin?
  141 +
  142 +``(calc_ulim = no) [boolean]``
  143 + Compute upper limit for each map bin?
  144 +
  145 +``(fix_srcs = yes) [boolean]``
  146 + Fix other sky model parameters?
  147 +
  148 +``(fix_bkg = no) [boolean]``
  149 + Fix background model parameters?
  150 +
  151 +On/Off parameters
  152 +-------------------
  153 +
  154 +``enumbins [integer]``
  155 + Number of energy bins.
  156 +
  157 +``(bkgmethod = REFLECTED) [string]``
  158 + Method for background estimation. ``REFLECTED:`` background evaluated in regions
  159 + with the same shape as source region reflected w.r.t. pointing direction for
  160 + each observation.
  161 +
  162 +``(srcshape = CIRCLE) [string]``
  163 + Shape of the source region.
  164 + ``CIRCLE``: circular region around given position.
  165 +
  166 +``(bkgregmin = 2) [integer]``
  167 + Minimum number of background regions that are required for an
  168 + observation. If this number of background regions is not available the
  169 + observation is skipped.
  170 +
  171 +``(bkgregskip = 1) [integer]``
  172 + Number of background regions that should be skipped next to the On regions.
  173 + Typically, one region is skipped so that the Off regions are taken sufficiently
  174 + distant from the On region, but in some cases it may be useful to keep the
  175 + background regions next to the On region.
  176 +
  177 +``(use_model_bkg = yes) [boolean]``
  178 + Specifies whether the background model should be used for the computation
  179 + of the ``alpha`` parameter and the predicted background rate in the Off
  180 + region that is stored in the ``BACKRESP`` column of the Off spectrum when
  181 + using the ``ONOFF`` method.
  182 +
  183 + If the parameter is set to ``no`` the background model is not used and the
  184 + background rate is assumed identical within the On and Off regions. This
  185 + is the classical IACT analysis method that is used when using reflected Off
  186 + regions. In that case the ``alpha`` parameter becomes independent of energy
  187 + and only reflects the ratio between the solid angles of the On and Off
  188 + regions. The ``BACKRESP`` column in the Off spectrum will be filled with
  189 + the solid angle of the On region. The data need to be fitted with the ``wstat``
  190 + statistic, fitting with ``cstat`` will not work.
  191 +
  192 +``(maxoffset = 4.0) [real]``
  193 + Maximum offset in degrees of source from camera center to accept the
  194 + observation for On/Off analysis.
  195 +
  196 +``(etruemin = 0.01) [real]``
  197 + Minimum true energy to evaluate instrumental response in On/Off analysis (TeV).
  198 +
  199 +``(etruemax = 0.01) [real]``
  200 + Maximum true energy to evaluate instrumental response in On/Off analysis (TeV).
  201 +
  202 +``(etruebins = 30) [integer]``
  203 + Number of bins per decade for true energy bins to evaluate instrumental
  204 + response in On/Off analysis.
  205 +
  206 +Standard parameters
  207 +-------------------
  208 +
  209 +``(nthreads = 0) [integer]``
  210 + Number of parallel processes (0=use all available CPUs).
  211 +
  212 +``(chatter = 2) [integer]``
  213 + Verbosity of the executable:
  214 + ``chatter = 0``: no information will be logged
  215 +
  216 + ``chatter = 1``: only errors will be logged
  217 +
  218 + ``chatter = 2``: errors and actions will be logged
  219 +
  220 + ``chatter = 3``: report about the task execution
  221 +
  222 + ``chatter = 4``: detailed report about the task execution
  223 +
  224 +``(clobber = yes) [boolean]``
  225 + Specifies whether an existing output file should be overwritten.
  226 +
  227 +``(debug = no) [boolean]``
  228 + Enables debug mode. In debug mode the executable will dump any log file
  229 + output to the console.
  230 +
  231 +``(mode = ql) [string]``
  232 + Mode of automatic parameters (default is ``ql``, i.e. "query and learn").
  233 +
  234 +``(logfile = csscs.log) [string]``
  235 + Name of log file.
  236 +
  237 +
  238 +Related tools or scripts
  239 +------------------------
  240 +
  241 +:doc:`ctlike`
  242 +:doc:`ctskymap`
  243 +:doc:`csphagen`
doc/source/users/reference_manual/index.rst
@@ -61,6 +61,7 @@ cscripts @@ -61,6 +61,7 @@ cscripts
61 csresmap --- Generates residual map <csresmap> 61 csresmap --- Generates residual map <csresmap>
62 csresspec --- Generates residual spectrum <csresspec> 62 csresspec --- Generates residual spectrum <csresspec>
63 csroot2caldb --- Creates a caldb entry from a ROOT file <csroot2caldb> 63 csroot2caldb --- Creates a caldb entry from a ROOT file <csroot2caldb>
  64 + csscs --- Performs spectral component separation <csscs>
64 cssens --- Computes CTA sensitivity <cssens> 65 cssens --- Computes CTA sensitivity <cssens>
65 csspec --- Computes spectral points <csspec> 66 csspec --- Computes spectral points <csspec>
66 cssrcdetect --- Detects sources in sky map <cssrcdetect> 67 cssrcdetect --- Detects sources in sky map <cssrcdetect>
@@ -87,3 +88,4 @@ Scripts to manage an IACT database @@ -87,3 +88,4 @@ Scripts to manage an IACT database
87 csiactobs --- Generates observation definition file for IACT data from observation IDs <csiactobs> 88 csiactobs --- Generates observation definition file for IACT data from observation IDs <csiactobs>
88 csfindobs --- Generates a list of IACT observation IDs <csfindobs> 89 csfindobs --- Generates a list of IACT observation IDs <csfindobs>
89 csiactcopy --- Copies IACT data from one location to another <csiactcopy> 90 csiactcopy --- Copies IACT data from one location to another <csiactcopy>
  91 +
doc/source/users/tutorials/howto/howto_scs.ipynb 0 → 100644
  1 +{
  2 + "cells": [
  3 + {
  4 + "cell_type": "markdown",
  5 + "metadata": {},
  6 + "source": [
  7 + "# How to perform spectral component separation?"
  8 + ]
  9 + },
  10 + {
  11 + "cell_type": "raw",
  12 + "metadata": {},
  13 + "source": [
  14 + "<div align=\"right\"><a href=\"../../../_downloads/howto_scs.ipynb\" download=\"howto_scs.ipynb\"><img src=\"../../../_static/download-notebook.jpg\" alt=\"Download Notebook\" height=\"40\"></a></div>"
  15 + ]
  16 + },
  17 + {
  18 + "cell_type": "markdown",
  19 + "metadata": {},
  20 + "source": [
  21 + "In this tutorial you will learn how to use spectral component separation to disentangle the morphological properties of overlapping sources.\n",
  22 + "\n",
  23 + "As usual we start by importing the gammalib, ctools, and cscripts Python modules."
  24 + ]
  25 + },
  26 + {
  27 + "cell_type": "code",
  28 + "execution_count": 1,
  29 + "metadata": {},
  30 + "outputs": [],
  31 + "source": [
  32 + "import gammalib\n",
  33 + "import ctools\n",
  34 + "import cscripts"
  35 + ]
  36 + },
  37 + {
  38 + "cell_type": "markdown",
  39 + "metadata": {},
  40 + "source": [
  41 + "We also import the matplotlib package for plotting."
  42 + ]
  43 + },
  44 + {
  45 + "cell_type": "code",
  46 + "execution_count": 2,
  47 + "metadata": {},
  48 + "outputs": [],
  49 + "source": [
  50 + "%matplotlib inline\n",
  51 + "import matplotlib.pyplot as plt"
  52 + ]
  53 + },
  54 + {
  55 + "cell_type": "markdown",
  56 + "metadata": {},
  57 + "source": [
  58 + "## Simulated dataset\n",
  59 + "\n",
  60 + "For the tutorial we will simulate a small CTA dataset. We start by defining the Instrument Response Functions and energy range that will be used all along."
  61 + ]
  62 + },
  63 + {
  64 + "cell_type": "code",
  65 + "execution_count": 3,
  66 + "metadata": {},
  67 + "outputs": [],
  68 + "source": [
  69 + "caldb = 'prod2'\n",
  70 + "irf = 'South_5h'\n",
  71 + "emin = 0.1 # TeV\n",
  72 + "emax = 160.0 # TeV"
  73 + ]
  74 + },
  75 + {
  76 + "cell_type": "markdown",
  77 + "metadata": {},
  78 + "source": [
  79 + "We will simulate an observation of the region around the famous sources HESS J1825-137 and HESS J1826-130 based on a very simple sky model. We will consider two pointings of a few hours wobbling around the sources' position.\n",
  80 + "\n",
  81 + "We start by writing the pointing directions and times to an ASCII file."
  82 + ]
  83 + },
  84 + {
  85 + "cell_type": "code",
  86 + "execution_count": 4,
  87 + "metadata": {},
  88 + "outputs": [],
  89 + "source": [
  90 + "pointing_file = 'pointings.txt'\n",
  91 + "\n",
  92 + "# open file\n",
  93 + "f = open(pointing_file, 'w')\n",
  94 + "# header\n",
  95 + "f.write('id,ra,dec,tmin,tmax\\n')\n",
  96 + "# pointings\n",
  97 + "f.write('0001,275.65,-13.78,0.,10800.\\n')\n",
  98 + "f.write('0002,277.25,-13.78,11000.,21800.\\n')\n",
  99 + "\n",
  100 + "# close file\n",
  101 + "f.close()"
  102 + ]
  103 + },
  104 + {
  105 + "cell_type": "markdown",
  106 + "metadata": {},
  107 + "source": [
  108 + "Then we use the csobsdef script to convert the list of pointings into an observation definition XML file."
  109 + ]
  110 + },
  111 + {
  112 + "cell_type": "code",
  113 + "execution_count": 5,
  114 + "metadata": {},
  115 + "outputs": [],
  116 + "source": [
  117 + "obsdef = cscripts.csobsdef()\n",
  118 + "obsdef['inpnt'] = pointing_file\n",
  119 + "obsdef['caldb'] = caldb\n",
  120 + "obsdef['irf'] = irf\n",
  121 + "obsdef['emin'] = emin\n",
  122 + "obsdef['emax'] = emax\n",
  123 + "obsdef['rad'] = 5.\n",
  124 + "obsdef.run()"
  125 + ]
  126 + },
  127 + {
  128 + "cell_type": "markdown",
  129 + "metadata": {},
  130 + "source": [
  131 + "Finally we use ctobssim to perform the observation simulation."
  132 + ]
  133 + },
  134 + {
  135 + "cell_type": "code",
  136 + "execution_count": 6,
  137 + "metadata": {},
  138 + "outputs": [],
  139 + "source": [
  140 + "obssim = ctools.ctobssim(obsdef.obs())\n",
  141 + "obssim['inmodel'] = '$CTOOLS/share/models/hess1825_26.xml'\n",
  142 + "\n",
  143 + "obssim.run()"
  144 + ]
  145 + },
  146 + {
  147 + "cell_type": "markdown",
  148 + "metadata": {},
  149 + "source": [
  150 + "## Skymap inspection and preliminary likelihood fit\n",
  151 + "\n",
  152 + "*This section showcases a possible path to get to perform a spectral component separation. If you are here because you have an application in which you know the spectrum of your sources of interest, and you want just to learn how to perform the spectral component separation, please jump to the next section.*\n",
  153 + "\n",
  154 + "As usual a great way to inspect the data is making a skymap using ctskymap."
  155 + ]
  156 + },
  157 + {
  158 + "cell_type": "code",
  159 + "execution_count": 7,
  160 + "metadata": {},
  161 + "outputs": [],
  162 + "source": [
  163 + "skymap = ctools.ctskymap(obssim.obs())\n",
  164 + "skymap['emin'] = emin\n",
  165 + "skymap['emax'] = emax\n",
  166 + "skymap['nxpix'] = 200\n",
  167 + "skymap['nypix'] = 200\n",
  168 + "skymap['binsz'] = 0.02\n",
  169 + "skymap['proj'] = 'TAN'\n",
  170 + "skymap['coordsys'] = 'CEL'\n",
  171 + "skymap['xref'] = 276.45\n",
  172 + "skymap['yref'] = -13.78\n",
  173 + "skymap['bkgsubtract'] = 'NONE'\n",
  174 + "skymap.run()"
  175 + ]
  176 + },
  177 + {
  178 + "cell_type": "markdown",
  179 + "metadata": {},
  180 + "source": [
  181 + "Below we inspect the skymap by using matpltolib."
  182 + ]
  183 + },
  184 + {
  185 + "cell_type": "code",
  186 + "execution_count": 8,
  187 + "metadata": {},
  188 + "outputs": [
  189 + {
  190 + "data": {
  191 + "image/png": "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\n",
  192 + "text/plain": [
  193 + "<matplotlib.figure.Figure at 0x107850cc0>"
  194 + ]
  195 + },
  196 + "metadata": {},
  197 + "output_type": "display_data"
  198 + }
  199 + ],
  200 + "source": [
  201 + "# Slightly smooth the map for display to suppress statistical fluctuations\n",
  202 + "skymap.skymap().smooth('GAUSSIAN',0.1)\n",
  203 + "\n",
  204 + "fig = plt.figure()\n",
  205 + "ax = plt.subplot()\n",
  206 + "plt.imshow(skymap.skymap().array(),origin='lower',\n",
  207 + " extent=[276.45+0.02*100,276.45-0.02*100,-13.78-0.02*100,-13.78+0.02*100])\n",
  208 + " # boundaries of the coord grid\n",
  209 + "ax.set_xlabel('R.A. (deg)')\n",
  210 + "ax.set_ylabel('Dec (deg)')\n",
  211 + "cbar = plt.colorbar()\n",
  212 + "cbar.set_label('Counts')"
  213 + ]
  214 + },
  215 + {
  216 + "cell_type": "markdown",
  217 + "metadata": {},
  218 + "source": [
  219 + "A large blob of emission appears at the center of the map. It coincides with the source HESS J1825-137. Past observations have indicated that HESS J1826-130 has a harder spectrum than HESS J1825-137. Let's peek at a skymap above 10 TeV."
  220 + ]
  221 + },
  222 + {
  223 + "cell_type": "code",
  224 + "execution_count": 9,
  225 + "metadata": {},
  226 + "outputs": [],
  227 + "source": [
  228 + "skymap = ctools.ctskymap(obssim.obs())\n",
  229 + "skymap['emin'] = 10. #TeV\n",
  230 + "skymap['emax'] = emax\n",
  231 + "skymap['nxpix'] = 200\n",
  232 + "skymap['nypix'] = 200\n",
  233 + "skymap['binsz'] = 0.02\n",
  234 + "skymap['proj'] = 'TAN'\n",
  235 + "skymap['coordsys'] = 'CEL'\n",
  236 + "skymap['xref'] = 276.45\n",
  237 + "skymap['yref'] = -13.78\n",
  238 + "skymap['bkgsubtract'] = 'NONE'\n",
  239 + "skymap.run()"
  240 + ]
  241 + },
  242 + {
  243 + "cell_type": "code",
  244 + "execution_count": 10,
  245 + "metadata": {},
  246 + "outputs": [
  247 + {
  248 + "data": {
  249 + "image/png": "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\n",
  250 + "text/plain": [
  251 + "<matplotlib.figure.Figure at 0x11299c898>"
  252 + ]
  253 + },
  254 + "metadata": {},
  255 + "output_type": "display_data"
  256 + }
  257 + ],
  258 + "source": [
  259 + "# Slightly smooth the map for display to suppress statistical fluctuations\n",
  260 + "skymap.skymap().smooth('GAUSSIAN',0.1)\n",
  261 + "\n",
  262 + "fig = plt.figure()\n",
  263 + "ax = plt.subplot()\n",
  264 + "plt.imshow(skymap.skymap().array(),origin='lower',\n",
  265 + " extent=[276.45+0.02*100,276.45-0.02*100,-13.78-0.02*100,-13.78+0.02*100])\n",
  266 + " # boundaries of the coord grid\n",
  267 + "ax.set_xlabel('R.A. (deg)')\n",
  268 + "ax.set_ylabel('Dec (deg)')\n",
  269 + "cbar = plt.colorbar()\n",
  270 + "cbar.set_label('Counts')"
  271 + ]
  272 + },
  273 + {
  274 + "cell_type": "markdown",
  275 + "metadata": {},
  276 + "source": [
  277 + "Indeed, emission above 10 TeV is concentrated on a spot North of the low-energy blob coincident with the position of HESS J1826-130. How can we disentangle the morphology of the two sources based on our observations?\n",
  278 + "\n",
  279 + "One of the traditional techniques to disentangle multiple overlapping sources is using a 3D likelihood analysis based on some guess of the sources' morphology and spectra. However, this often implies to choose a simplistic (analytical) model for the sources' morphology. Below we will test another approach, that consists in determining the morphology from the data using some knowledge of their spectra.\n",
  280 + "\n",
  281 + "For our exercise we guess the spectra of the two components via a preliminary likelihood analysis. For this we use a tentative sky model inspired by the skymaps we have inspected. We include in the model two disks with centre and extension eye-balled from the low-energy blob and high-energy spot. Their parameters are not fit to the data here for the sake of a shorter execution time. The morphology will be determined from the data later. However, at a cost of a longer computing time you could fit the spatial model parameters in this step.\n",
  282 + "\n",
  283 + "For both components we will assume a power-law spectrum, with and index of 2.5 for the soft component and an index of 1.5 for the hard component, and a flux at 1 TeV approximately 10% and 1% of the Crab nebula, respectively. These spectral parameters are going to be fit to the data."
  284 + ]
  285 + },
  286 + {
  287 + "cell_type": "code",
  288 + "execution_count": 11,
  289 + "metadata": {},
  290 + "outputs": [
  291 + {
  292 + "data": {
  293 + "text/plain": [
  294 + "<gammalib.cta.GCTAModelIrfBackground; proxy of <Swig Object of type 'GCTAModelIrfBackground *' at 0x1129b32a0> >"
  295 + ]
  296 + },
  297 + "execution_count": 11,
  298 + "metadata": {},
  299 + "output_type": "execute_result"
  300 + }
  301 + ],
  302 + "source": [
  303 + "# model container\n",
  304 + "models = gammalib.GModels()\n",
  305 + "\n",
  306 + "# low-energy blob\n",
  307 + "centre = gammalib.GSkyDir()\n",
  308 + "centre.radec_deg(276.5,-13.75)\n",
  309 + "spatial = gammalib.GModelSpatialRadialDisk(centre,0.5)\n",
  310 + "# free source centre\n",
  311 + "spatial['RA'].fix()\n",
  312 + "spatial['DEC'].fix()\n",
  313 + "spatial['Radius'].fix()\n",
  314 + "spectral = gammalib.GModelSpectralPlaw(4.e-18,-2.5,gammalib.GEnergy(1.,'TeV'))\n",
  315 + "source = gammalib.GModelSky(spatial,spectral)\n",
  316 + "source.name('HESS J1825-137')\n",
  317 + "models.append(source)\n",
  318 + "\n",
  319 + "# high-energy spot\n",
  320 + "centre = gammalib.GSkyDir()\n",
  321 + "centre.radec_deg(276.5,-13)\n",
  322 + "spatial = gammalib.GModelSpatialRadialDisk(centre,0.1)\n",
  323 + "# free source centre\n",
  324 + "spatial['RA'].fix()\n",
  325 + "spatial['DEC'].fix()\n",
  326 + "spatial['Radius'].fix()\n",
  327 + "spectral = gammalib.GModelSpectralPlaw(4.e-19,-1.5,gammalib.GEnergy(1.,'TeV'))\n",
  328 + "source = gammalib.GModelSky(spatial,spectral)\n",
  329 + "source.name('HESS J1826-130')\n",
  330 + "models.append(source)\n",
  331 + "\n",
  332 + "# instrumental background\n",
  333 + "# power law spectral correction with pivot energy at 1 TeV\n",
  334 + "spectral = gammalib.GModelSpectralPlaw(1, 0, gammalib.GEnergy(1, 'TeV'))\n",
  335 + "bkgmodel = gammalib.GCTAModelIrfBackground(spectral)\n",
  336 + "bkgmodel.name('Background')\n",
  337 + "bkgmodel.instruments('CTA')\n",
  338 + "# append to models\n",
  339 + "models.append(bkgmodel)"
  340 + ]
  341 + },
  342 + {
  343 + "cell_type": "markdown",
  344 + "metadata": {},
  345 + "source": [
  346 + "We copy the simulated observations and append to them our initial sky model."
  347 + ]
  348 + },
  349 + {
  350 + "cell_type": "code",
  351 + "execution_count": 12,
  352 + "metadata": {},
  353 + "outputs": [],
  354 + "source": [
  355 + "obs = obssim.obs().copy()\n",
  356 + "obs.models(models)"
  357 + ]
  358 + },
  359 + {
  360 + "cell_type": "markdown",
  361 + "metadata": {},
  362 + "source": [
  363 + "We are going to start with a stacked analysis. We bin the events, and then attach to the stacked observations the stacked response. Note that if the dataset is small it may be convenient to use an unbinned analysis in lieu of the stacked analysis for this step."
  364 + ]
  365 + },
  366 + {
  367 + "cell_type": "code",
  368 + "execution_count": 13,
  369 + "metadata": {},
  370 + "outputs": [],
  371 + "source": [
  372 + "# Bin events\n",
  373 + "cntcube = ctools.ctbin(obs)\n",
  374 + "cntcube['usepnt'] = False\n",
  375 + "cntcube['ebinalg'] = 'LOG'\n",
  376 + "cntcube['xref'] = 276.45\n",
  377 + "cntcube['yref'] = -13.78\n",
  378 + "cntcube['binsz'] = 0.02\n",
  379 + "cntcube['nxpix'] = 200\n",
  380 + "cntcube['nypix'] = 200\n",
  381 + "cntcube['enumbins'] = 40\n",
  382 + "cntcube['emin'] = emin\n",
  383 + "cntcube['emax'] = emax\n",
  384 + "cntcube['coordsys'] = 'CEL'\n",
  385 + "cntcube['proj'] = 'TAN'\n",
  386 + "cntcube.run()\n",
  387 + "\n",
  388 + "# Extract counts cube\n",
  389 + "cube = cntcube.cube()\n",
  390 + "\n",
  391 + "# Compute stacked response\n",
  392 + "response = cscripts.obsutils.get_stacked_response(obs,cube)\n",
  393 + "\n",
  394 + "# Copy stacked observations\n",
  395 + "stacked_obs = cntcube.obs().copy()\n",
  396 + "\n",
  397 + "# Append stacked response\n",
  398 + "stacked_obs[0].response(response['expcube'], response['psfcube'],response['bkgcube'])\n",
  399 + "\n",
  400 + "# Set stacked models\n",
  401 + "stacked_obs.models(response['models'])"
  402 + ]
  403 + },
  404 + {
  405 + "cell_type": "markdown",
  406 + "metadata": {},
  407 + "source": [
  408 + "Now we can run the preliminary likelihood analysis in which the spectral parameters for the two sources are fit to the data."
  409 + ]
  410 + },
  411 + {
  412 + "cell_type": "code",
  413 + "execution_count": 14,
  414 + "metadata": {},
  415 + "outputs": [],
  416 + "source": [
  417 + "like = ctools.ctlike(stacked_obs)\n",
  418 + "like.run()"
  419 + ]
  420 + },
  421 + {
  422 + "cell_type": "markdown",
  423 + "metadata": {},
  424 + "source": [
  425 + "Let's check that the fit was successful."
  426 + ]
  427 + },
  428 + {
  429 + "cell_type": "code",
  430 + "execution_count": 15,
  431 + "metadata": {},
  432 + "outputs": [
  433 + {
  434 + "name": "stdout",
  435 + "output_type": "stream",
  436 + "text": [
  437 + "=== GOptimizerLM ===\n",
  438 + " Optimized function value ..: 122722.355\n",
  439 + " Absolute precision ........: 0.005\n",
  440 + " Acceptable value decrease .: 2\n",
  441 + " Optimization status .......: converged\n",
  442 + " Number of parameters ......: 18\n",
  443 + " Number of free parameters .: 6\n",
  444 + " Number of iterations ......: 6\n",
  445 + " Lambda ....................: 1e-09\n"
  446 + ]
  447 + }
  448 + ],
  449 + "source": [
  450 + "print(like.opt())"
  451 + ]
  452 + },
  453 + {
  454 + "cell_type": "markdown",
  455 + "metadata": {},
  456 + "source": [
  457 + "We also check the fitted models."
  458 + ]
  459 + },
  460 + {
  461 + "cell_type": "code",
  462 + "execution_count": 16,
  463 + "metadata": {},
  464 + "outputs": [
  465 + {
  466 + "name": "stdout",
  467 + "output_type": "stream",
  468 + "text": [
  469 + "=== GModels ===\n",
  470 + " Number of models ..........: 3\n",
  471 + " Number of parameters ......: 18\n",
  472 + "=== GModelSky ===\n",
  473 + " Name ......................: HESS J1825-137\n",
  474 + " Instruments ...............: all\n",
  475 + " Observation identifiers ...: all\n",
  476 + " Model type ................: ExtendedSource\n",
  477 + " Model components ..........: \"RadialDisk\" * \"PowerLaw\" * \"Constant\"\n",
  478 + " Number of parameters ......: 7\n",
  479 + " Number of spatial par's ...: 3\n",
  480 + " RA .......................: 276.5 deg (fixed,scale=1)\n",
  481 + " DEC ......................: -13.75 deg (fixed,scale=1)\n",
  482 + " Radius ...................: 0.5 [0.0002778,infty[ deg (fixed,scale=1)\n",
  483 + " Number of spectral par's ..: 3\n",
  484 + " Prefactor ................: 6.34330444443657e-18 +/- 3.01336043884925e-19 [0,infty[ ph/cm2/s/MeV (free,scale=4e-18,gradient)\n",
  485 + " Index ....................: -2.344118164095 +/- 0.0376367951224068 [10,-10] (free,scale=-2.5,gradient)\n",
  486 + " PivotEnergy ..............: 1000000 MeV (fixed,scale=1000000,gradient)\n",
  487 + " Number of temporal par's ..: 1\n",
  488 + " Normalization ............: 1 (relative value) (fixed,scale=1,gradient)\n",
  489 + " Number of scale par's .....: 0\n",
  490 + "=== GModelSky ===\n",
  491 + " Name ......................: HESS J1826-130\n",
  492 + " Instruments ...............: all\n",
  493 + " Observation identifiers ...: all\n",
  494 + " Model type ................: ExtendedSource\n",
  495 + " Model components ..........: \"RadialDisk\" * \"PowerLaw\" * \"Constant\"\n",
  496 + " Number of parameters ......: 7\n",
  497 + " Number of spatial par's ...: 3\n",
  498 + " RA .......................: 276.5 deg (fixed,scale=1)\n",
  499 + " DEC ......................: -13 deg (fixed,scale=1)\n",
  500 + " Radius ...................: 0.1 [0.0002778,infty[ deg (fixed,scale=1)\n",
  501 + " Number of spectral par's ..: 3\n",
  502 + " Prefactor ................: 2.36040613319893e-19 +/- 9.2386146949274e-20 [0,infty[ ph/cm2/s/MeV (free,scale=4e-19,gradient)\n",
  503 + " Index ....................: -1.6532558684395 +/- 0.144999501997818 [10,-10] (free,scale=-1.5,gradient)\n",
  504 + " PivotEnergy ..............: 1000000 MeV (fixed,scale=1000000,gradient)\n",
  505 + " Number of temporal par's ..: 1\n",
  506 + " Normalization ............: 1 (relative value) (fixed,scale=1,gradient)\n",
  507 + " Number of scale par's .....: 0\n",
  508 + "=== GCTAModelCubeBackground ===\n",
  509 + " Name ......................: BackgroundModel\n",
  510 + " Instruments ...............: CTA, HESS, MAGIC, VERITAS\n",
  511 + " Observation identifiers ...: all\n",
  512 + " Model type ................: \"PowerLaw\" * \"Constant\"\n",
  513 + " Number of parameters ......: 4\n",
  514 + " Number of spectral par's ..: 3\n",
  515 + " Prefactor ................: 1.24199768427314 +/- 0.0147414039983284 [0.01,100] ph/cm2/s/MeV (free,scale=1,gradient)\n",
  516 + " Index ....................: 0.103013198377256 +/- 0.00683960305372905 [-5,5] (free,scale=1,gradient)\n",
  517 + " PivotEnergy ..............: 1000000 MeV (fixed,scale=1000000,gradient)\n",
  518 + " Number of temporal par's ..: 1\n",
  519 + " Normalization ............: 1 (relative value) (fixed,scale=1,gradient)\n"
  520 + ]
  521 + }
  522 + ],
  523 + "source": [
  524 + "print(like.obs().models())"
  525 + ]
  526 + },
  527 + {
  528 + "cell_type": "markdown",
  529 + "metadata": {},
  530 + "source": [
  531 + "As guessed from the skymaps HESS J1826-130 is fainter than HESS J1825-137, but its spectrum is rather harder. We will use the values of the spectral indices obtained from this likelihood analysis to derive the source morphology below.\n",
  532 + "\n",
  533 + "However, we first check the fit residuals. Let's start by inspecting the spectral residuals using csresspec."
  534 + ]
  535 + },
  536 + {
  537 + "cell_type": "code",
  538 + "execution_count": 17,
  539 + "metadata": {},
  540 + "outputs": [],
  541 + "source": [
  542 + "resspec = cscripts.csresspec(like.obs())\n",
  543 + "resspec['algorithm'] = 'SIGNIFICANCE'\n",
  544 + "resspec['components'] = True\n",
  545 + "resspec['outfile'] = 'resspec.fits'\n",
  546 + "resspec.execute()"
  547 + ]
  548 + },
  549 + {
  550 + "cell_type": "markdown",
  551 + "metadata": {},
  552 + "source": [
  553 + "We can use an example script to display the residuals."
  554 + ]
  555 + },
  556 + {
  557 + "cell_type": "code",
  558 + "execution_count": 18,
  559 + "metadata": {},
  560 + "outputs": [
  561 + {
  562 + "data": {
  563 + "image/png": "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eXfeeSe7d+9m2rRpHDp0iJtuuomlS5fSsWPHautMACxfvpz33nuPxo0b8+CDDwLw+eefs3r1avr378/atWt96r5//3769OnDlClTuPPOO/nnP//JhAkT+M1vfsPNN9/MqFGjePzx2p0f1113Hc8++yytW7cmNTWVtm3b8v33jnfiW2+9lVGjRjF69GiefvppbrvtNl566SWvMhcvXszXX3/NRx99hKoyePBgli5dSr9+/XzqHirRHuY6G1gGnC4im0TkF6p6BLgVeB34CnhOVb+Mph5G4HjyMKZNezrsRZJmzZpl3oXh6mJavXo1ixYtYtSoUa7lLf/whz+Ql5fHxRdfzObNm9m6dStLlizhmmuuISsrC4AWLVq4ZP3pT39i165dPPnkk4gIq1evplOnTnTs2BGgloEYPHgwjRs3BqqnFT/jjDPIzs72ayDS09NdHkmvXr3YsGEDAO+//76rLU8ezoABA3jjjTeYPXs2w4cPr1a2bNkyRowY4ar73nvv+ZS5ePFiFi9ezFlnncXZZ5/N6tWriWa6oWiPYrrey/GF+AhEByA3IdJ911W8eRjeUpifd+lVLHzuGZ8yX3jhBRYtWmTeRYLg700/FvTt25ft27dTXl7OwoULKS8vZ/ny5aSlpZGTk8PBgwdRVY9pvgF69+7N8uXL2bFjBy1atPCYKtydJk2auP73dm6DBg04duyYa//gwYOu/9PS0ly6pKamVotleNMRHIalV69ePPjgg3z55ZfMnz/f67nucrylN7/rrru46aabvMqIJAkzkzoYEmHBoPqIr/kX/kZIzZs3z+ZfGNVYvXo1R48epWXLluzevZuTTjqJtLQ03n77bddQ7YKCAp577jnXmhHuXUwDBgxg3LhxDBw4kL1793LGGWewbt0615v9nDlzvLbtnj587dq1bNy4kdNPP52cnBxWrFjBsWPH+O677/joo4/8fo7zzjuPZ599FsDrPfu///u/3H///bRs2bLa8Z/85CfV6p5//vk+ZV566aU8/fTT7Nu3D4DNmze7Up1Hg6Q0EKo6X1WLMjMz461KvcNTAHzEuR18jpA679KrfMoMdIa3GZDkxxmD6NmzJ8OHD+eZZ54hNTWVwsJCSktLyc/Pp6SkhDPOOAOA7t27M378eC644AJ69OjBb3/722ryrr32Wm688UYGDx4MwN///ncGDBjA+eef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\n",
  564 + "text/plain": [
  565 + "<matplotlib.figure.Figure at 0x11299c978>"
  566 + ]
  567 + },
  568 + "metadata": {},
  569 + "output_type": "display_data"
  570 + }
  571 + ],
  572 + "source": [
  573 + "import sys\n",
  574 + "import os\n",
  575 + "sys.path.append(os.environ['CTOOLS']+'/share/examples/python/')\n",
  576 + "\n",
  577 + "from show_residuals import plot_residuals\n",
  578 + "plot_residuals('resspec.fits','',0)"
  579 + ]
  580 + },
  581 + {
  582 + "cell_type": "markdown",
  583 + "metadata": {},
  584 + "source": [
  585 + "The model reproduces reasonably well the data spectrally (although not perfectly). We will also check the spatial residuals using csresmap."
  586 + ]
  587 + },
  588 + {
  589 + "cell_type": "code",
  590 + "execution_count": 19,
  591 + "metadata": {},
  592 + "outputs": [],
  593 + "source": [
  594 + "resmap = cscripts.csresmap(like.obs())\n",
  595 + "resmap['algorithm'] = 'SIGNIFICANCE'\n",
  596 + "resmap.run()"
  597 + ]
  598 + },
  599 + {
  600 + "cell_type": "markdown",
  601 + "metadata": {},
  602 + "source": [
  603 + "We inspect the map to check the spatial residuals."
  604 + ]
  605 + },
  606 + {
  607 + "cell_type": "code",
  608 + "execution_count": 20,
  609 + "metadata": {},
  610 + "outputs": [
  611 + {
  612 + "data": {
  613 + "image/png": "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\n",
  614 + "text/plain": [
  615 + "<matplotlib.figure.Figure at 0x1137bf6d8>"
  616 + ]
  617 + },
  618 + "metadata": {},
  619 + "output_type": "display_data"
  620 + }
  621 + ],
  622 + "source": [
  623 + "# Slightly smooth the map for display to suppress statistical fluctuations\n",
  624 + "resid = resmap._resmap.copy()\n",
  625 + "resid.smooth('GAUSSIAN',0.1)\n",
  626 + "# Plotting\n",
  627 + "fig = plt.figure()\n",
  628 + "ax = plt.subplot()\n",
  629 + "plt.imshow(resid.array(),origin='lower', cmap='bwr',\n",
  630 + " extent=[276.45+0.02*100,276.45-0.02*100,-13.78-0.02*100,-13.78+0.02*100])\n",
  631 + " # Boundaries of the coord grid\n",
  632 + "ax.set_xlabel('R.A. (deg)')\n",
  633 + "ax.set_ylabel('Dec (deg)')\n",
  634 + "cbar = plt.colorbar()\n",
  635 + "cbar.set_label('Significance ($\\sigma$)')"
  636 + ]
  637 + },
  638 + {
  639 + "cell_type": "markdown",
  640 + "metadata": {},
  641 + "source": [
  642 + "The spatial residuals are small, indicating that the model is close enough to the data. However, the structures in the residuals indicate that the morphological models adopted may not accurately represent the data.\n",
  643 + "\n",
  644 + "## Stacked spectral component separation\n",
  645 + "\n",
  646 + "If we are confident that the spectral models we have at hand represent the data well, we can use this information to determine the morphology of the emission associated with each spectral component from the data by using csscs. First of all we will perform the spectral component separation using the stacked dataset. **A stacked analysis is usually the fastest option for csscs**. However, an unbinned analysis is also possible. \n",
  647 + "\n",
  648 + "As a preliminary step we will change the spatial models for the two components to be separated. The script uses the spatial model provided as prior, so for a disk the flux outside the disk radius would always be null. If you have a reasonable prior you can use it in the component separation, but **it is recommended to use a spatial model without sharp boundaries (e.g., Gaussian)**. Since in this case we do not know what the morphology of the two sources is, we will start with an isotropic distribution. "
  649 + ]
  650 + },
  651 + {
  652 + "cell_type": "code",
  653 + "execution_count": 21,
  654 + "metadata": {},
  655 + "outputs": [],
  656 + "source": [
  657 + "# copy the fitted models\n",
  658 + "fit_obs = like.obs().copy()\n",
  659 + "\n",
  660 + "# replace disks with isotropic model\n",
  661 + "for model in fit_obs.models():\n",
  662 + " if model.name() == 'HESS J1825-137' or model.name() == 'HESS J1826-130': \n",
  663 + " model.spatial(gammalib.GModelSpatialDiffuseConst())"
  664 + ]
  665 + },
  666 + {
  667 + "cell_type": "markdown",
  668 + "metadata": {},
  669 + "source": [
  670 + "The essential information to be provided to csscs is:\n",
  671 + "\n",
  672 + "- the geometry of the output maps; for every bin in the output map a dedicated likelhood analysis will be used to determine the fluxes of the sources of interest; **make sure to have a region just big enough and a grid step just fine enough for your purposes** since increasing the number of bins will proportionally increase the computation time; \n",
  673 + "\n",
  674 + "- the list of the sources of interest;\n",
  675 + "\n",
  676 + "- the energy range for the analysis;\n",
  677 + "\n",
  678 + "- the radius (``rad``) of the region of interest to be used for the spectral component separation centred on each bin of the output maps; note that the value of this parameter sets the correlation scale between neighbour pixels in the output maps, and it must be at least sqrt(2) times ``binsz`` to fully cover the input dataset; furthemore, **``rad`` must be large enough to ensure that you have enough statististics to perform a likelihood fit**.\n",
  679 + "\n",
  680 + "You can decide if you want to leave free in the fit the background model (true by default) and other background gamma-ray sources (false by default, we have none in the exemple we are considering)."
  681 + ]
  682 + },
  683 + {
  684 + "cell_type": "code",
  685 + "execution_count": 22,
  686 + "metadata": {},
  687 + "outputs": [],
  688 + "source": [
  689 + "scs1 = cscripts.csscs(fit_obs)\n",
  690 + "scs1['srcnames'] = 'HESS J1825-137;HESS J1826-130'\n",
  691 + "scs1['emin'] = emin\n",
  692 + "scs1['emax'] = emax\n",
  693 + "scs1['nxpix'] = 20\n",
  694 + "scs1['nypix'] = 20\n",
  695 + "scs1['binsz'] = 0.1\n",
  696 + "scs1['rad'] = 0.2\n",
  697 + "scs1['proj'] = 'TAN'\n",
  698 + "scs1['coordsys'] = 'CEL'\n",
  699 + "scs1['xref'] = 276.45\n",
  700 + "scs1['yref'] = -13.78\n",
  701 + "scs1.run()"
  702 + ]
  703 + },
  704 + {
  705 + "cell_type": "markdown",
  706 + "metadata": {},
  707 + "source": [
  708 + "Now we can inspect the maps of the fluxes from the two sources. We will set a minimum flux for display to avoid being confused by noisy bins. In fact the script has calculated also the flux uncertainty in each bin (accessible through the ``flux_error`` method) and the detection significance (accessible through the ``ts`` method), that you can use to filter more intelligently the maps. We did not request this, but one could also have flux upper limits computed (``calc_ulimit`` parameter)."
  709 + ]
  710 + },
  711 + {
  712 + "cell_type": "code",
  713 + "execution_count": 23,
  714 + "metadata": {},
  715 + "outputs": [
  716 + {
  717 + "data": {
  718 + "image/png": "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\n",
  719 + "text/plain": [
  720 + "<matplotlib.figure.Figure at 0x1129ba9b0>"
  721 + ]
  722 + },
  723 + "metadata": {},
  724 + "output_type": "display_data"
  725 + }
  726 + ],
  727 + "source": [
  728 + "flux_1826 = scs1.flux('HESS J1826-130')\n",
  729 + "\n",
  730 + "# Plotting\n",
  731 + "fig = plt.figure()\n",
  732 + "ax = plt.subplot()\n",
  733 + "plt.imshow(flux_1826.array(),origin='lower', vmin = 1.e-8,\n",
  734 + " extent=[276.45+0.1*10,276.45-0.1*10,-13.78-0.1*10,-13.78+0.1*10])\n",
  735 + " # Boundaries of the coord grid\n",
  736 + "ax.set_xlabel('R.A. (deg)')\n",
  737 + "ax.set_ylabel('Dec (deg)')\n",
  738 + "cbar = plt.colorbar()\n",
  739 + "cbar.set_label('Flux (photons/cm$^2$/s/sr)')"
  740 + ]
  741 + },
  742 + {
  743 + "cell_type": "code",
  744 + "execution_count": 24,
  745 + "metadata": {},
  746 + "outputs": [
  747 + {
  748 + "data": {
  749 + "image/png": "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\n",
  750 + "text/plain": [
  751 + "<matplotlib.figure.Figure at 0x108313400>"
  752 + ]
  753 + },
  754 + "metadata": {},
  755 + "output_type": "display_data"
  756 + }
  757 + ],
  758 + "source": [
  759 + "flux_1825 = scs1.flux('HESS J1825-137')\n",
  760 + "\n",
  761 + "# Plotting\n",
  762 + "fig = plt.figure()\n",
  763 + "ax = plt.subplot()\n",
  764 + "plt.imshow(flux_1825.array(),origin='lower', vmin = 1.e-8,\n",
  765 + " extent=[276.45+0.1*10,276.45-0.1*10,-13.78-0.1*10,-13.78+0.1*10])\n",
  766 + " # Boundaries of the coord grid\n",
  767 + "ax.set_xlabel('R.A. (deg)')\n",
  768 + "ax.set_ylabel('Dec (deg)')\n",
  769 + "cbar = plt.colorbar()\n",
  770 + "cbar.set_label('Flux (photons/cm$^2$/s/sr)')"
  771 + ]
  772 + },
  773 + {
  774 + "cell_type": "markdown",
  775 + "metadata": {},
  776 + "source": [
  777 + "As you can see the hard emission is confined in the North. The soft emission blob seems to have an elongated shape.\n",
  778 + "\n",
  779 + "## On/Off spectral component separation\n",
  780 + "\n",
  781 + "What if you don't have a reliable background model to perform a 3D analysis? You can still perform a spectral component separation using the On/Off technique as long as you have a prior on the source's spectra.\n",
  782 + "\n",
  783 + "For this **we need first of all to compute an exclusion map**, i.e., a map of the region where there is significant gamma-ray emission, so that we can exclude it from background computation. We can do this by using ctskymap with the ``RING`` background subtraction method. Since we are dealing with a large source we will use rather large ROI and ring regions."
  784 + ]
  785 + },
  786 + {
  787 + "cell_type": "code",
  788 + "execution_count": 25,
  789 + "metadata": {},
  790 + "outputs": [],
  791 + "source": [
  792 + "skymap = ctools.ctskymap(obssim.obs())\n",
  793 + "skymap['emin'] = emin\n",
  794 + "skymap['emax'] = emax\n",
  795 + "skymap['nxpix'] = 200\n",
  796 + "skymap['nypix'] = 200\n",
  797 + "skymap['binsz'] = 0.02\n",
  798 + "skymap['proj'] = 'TAN'\n",
  799 + "skymap['coordsys'] = 'CEL'\n",
  800 + "skymap['xref'] = 276.45\n",
  801 + "skymap['yref'] = -13.78\n",
  802 + "skymap['bkgsubtract'] = 'RING'\n",
  803 + "skymap['roiradius'] = 0.5\n",
  804 + "skymap['inradius'] = 1.0\n",
  805 + "skymap['outradius'] = 1.5\n",
  806 + "skymap['iterations'] = 3\n",
  807 + "skymap['threshold'] = 5 # sigma\n",
  808 + "skymap.run()"
  809 + ]
  810 + },
  811 + {
  812 + "cell_type": "markdown",
  813 + "metadata": {},
  814 + "source": [
  815 + "Let's inspect the exclusion map."
  816 + ]
  817 + },
  818 + {
  819 + "cell_type": "code",
  820 + "execution_count": 26,
  821 + "metadata": {},
  822 + "outputs": [
  823 + {
  824 + "data": {
  825 + "text/plain": [
  826 + "Text(0,0.5,'Dec (deg)')"
  827 + ]
  828 + },
  829 + "execution_count": 26,
  830 + "metadata": {},
  831 + "output_type": "execute_result"
  832 + },
  833 + {
  834 + "data": {
  835 + "image/png": "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\n",
  836 + "text/plain": [
  837 + "<matplotlib.figure.Figure at 0x178724f60>"
  838 + ]
  839 + },
  840 + "metadata": {},
  841 + "output_type": "display_data"
  842 + }
  843 + ],
  844 + "source": [
  845 + "fig = plt.figure()\n",
  846 + "ax = plt.subplot()\n",
  847 + "plt.imshow(skymap.exclusion_map().map().array(), origin='lower', cmap = 'binary',\n",
  848 + " extent=[276.45+0.02*100,276.45-0.02*100,-13.48-0.02*100,-13.48+0.02*100])\n",
  849 + " # boundaries of the coord grid\n",
  850 + "ax.set_xlabel('R.A. (deg)')\n",
  851 + "ax.set_ylabel('Dec (deg)')"
  852 + ]
  853 + },
  854 + {
  855 + "cell_type": "markdown",
  856 + "metadata": {},
  857 + "source": [
  858 + "To use csscs in On/Off mode we need to go back to using the event lists. We modify the associated models to the latest version obtained from the global likelihood fit."
  859 + ]
  860 + },
  861 + {
  862 + "cell_type": "code",
  863 + "execution_count": 27,
  864 + "metadata": {},
  865 + "outputs": [],
  866 + "source": [
  867 + "obs.models(like.obs().models())"
  868 + ]
  869 + },
  870 + {
  871 + "cell_type": "markdown",
  872 + "metadata": {},
  873 + "source": [
  874 + "Note that **in On/Off mode if there are multiple sources csscs will use only the spectral models for the sources, and their emission within each ROI for component separation will be assumed by default to be isotropic**. We will not use the background model, we'll just assume that the background rate of the reflected background regions is the same as in the ROI.\n",
  875 + "\n",
  876 + "*This step is rather time consuming, and should take at least a couple of hours to complete on a normal laptop. This is a good time for you to grab lunch or to read that review paper you always meant to.*"
  877 + ]
  878 + },
  879 + {
  880 + "cell_type": "code",
  881 + "execution_count": 28,
  882 + "metadata": {},
  883 + "outputs": [],
  884 + "source": [
  885 + "scs2 = cscripts.csscs(obs)\n",
  886 + "scs2['srcnames'] = 'HESS J1825-137;HESS J1826-130'\n",
  887 + "scs2['emin'] = emin\n",
  888 + "scs2['emax'] = emax\n",
  889 + "scs2['nxpix'] = 20\n",
  890 + "scs2['nypix'] = 20\n",
  891 + "scs2['binsz'] = 0.1\n",
  892 + "scs2['rad'] = 0.2\n",
  893 + "scs2['proj'] = 'TAN'\n",
  894 + "scs2['coordsys'] = 'CEL'\n",
  895 + "scs2['xref'] = 276.45\n",
  896 + "scs2['yref'] = -13.78\n",
  897 + "scs2['method'] = 'ONOFF'\n",
  898 + "scs2['use_model_bkg'] = False\n",
  899 + "scs2['enumbins'] = 30\n",
  900 + "scs2.exclusion_map(skymap.exclusion_map())\n",
  901 + "scs2.run()"
  902 + ]
  903 + },
  904 + {
  905 + "cell_type": "markdown",
  906 + "metadata": {},
  907 + "source": [
  908 + "We visualize below the flux maps, which are quite consistent with those obtained using the stacked analysis."
  909 + ]
  910 + },
  911 + {
  912 + "cell_type": "code",
  913 + "execution_count": 29,
  914 + "metadata": {},
  915 + "outputs": [
  916 + {
  917 + "data": {
  918 + "image/png": "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\n",
  919 + "text/plain": [
  920 + "<matplotlib.figure.Figure at 0x1636f8e10>"
  921 + ]
  922 + },
  923 + "metadata": {},
  924 + "output_type": "display_data"
  925 + }
  926 + ],
  927 + "source": [
  928 + "flux_1826 = scs2.flux('HESS J1826-130')\n",
  929 + "\n",
  930 + "# Plotting\n",
  931 + "fig = plt.figure()\n",
  932 + "ax = plt.subplot()\n",
  933 + "plt.imshow(flux_1826.array(),origin='lower', vmin = 1.e-8,\n",
  934 + " extent=[276.45+0.1*10,276.45-0.1*10,-13.78-0.1*10,-13.78+0.1*10])\n",
  935 + " # Boundaries of the coord grid\n",
  936 + "ax.set_xlabel('R.A. (deg)')\n",
  937 + "ax.set_ylabel('Dec (deg)')\n",
  938 + "cbar = plt.colorbar()\n",
  939 + "cbar.set_label('Flux (photons/cm$^2$/s/sr)')"
  940 + ]
  941 + },
  942 + {
  943 + "cell_type": "code",
  944 + "execution_count": 30,
  945 + "metadata": {},
  946 + "outputs": [
  947 + {
  948 + "data": {
  949 + "image/png": "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\n",
  950 + "text/plain": [
  951 + "<matplotlib.figure.Figure at 0x1082fdc50>"
  952 + ]
  953 + },
  954 + "metadata": {},
  955 + "output_type": "display_data"
  956 + }
  957 + ],
  958 + "source": [
  959 + "flux_1825 = scs1.flux('HESS J1825-137')\n",
  960 + "\n",
  961 + "# Plotting\n",
  962 + "fig = plt.figure()\n",
  963 + "ax = plt.subplot()\n",
  964 + "plt.imshow(flux_1825.array(),origin='lower', vmin = 1.e-8,\n",
  965 + " extent=[276.45+0.1*10,276.45-0.1*10,-13.78-0.1*10,-13.78+0.1*10])\n",
  966 + " # Boundaries of the coord grid\n",
  967 + "ax.set_xlabel('R.A. (deg)')\n",
  968 + "ax.set_ylabel('Dec (deg)')\n",
  969 + "cbar = plt.colorbar()\n",
  970 + "cbar.set_label('Flux (photons/cm$^2$/s/sr)')"
  971 + ]
  972 + }
  973 + ],
  974 + "metadata": {
  975 + "kernelspec": {
  976 + "display_name": "Python 3",
  977 + "language": "python",
  978 + "name": "python3"
  979 + },
  980 + "language_info": {
  981 + "codemirror_mode": {
  982 + "name": "ipython",
  983 + "version": 3
  984 + },
  985 + "file_extension": ".py",
  986 + "mimetype": "text/x-python",
  987 + "name": "python",
  988 + "nbconvert_exporter": "python",
  989 + "pygments_lexer": "ipython3",
  990 + "version": "3.5.4"
  991 + }
  992 + },
  993 + "nbformat": 4,
  994 + "nbformat_minor": 2
  995 +}
doc/source/users/tutorials/howto/index.rst
@@ -16,6 +16,7 @@ CTA data analysis @@ -16,6 +16,7 @@ CTA data analysis
16 howto_stacked_analysis 16 howto_stacked_analysis
17 howto_model_handling_python 17 howto_model_handling_python
18 howto_advanced_python_fitting 18 howto_advanced_python_fitting
  19 + howto_scs
19 howto_connect_irfs 20 howto_connect_irfs
20 howto_connect_models 21 howto_connect_models
21 howto_xspec 22 howto_xspec
doc/source/users/tutorials/notebooks.rst
@@ -21,10 +21,10 @@ this page. @@ -21,10 +21,10 @@ this page.
21 * :download:`How to handle models from Python? <howto/howto_model_handling_python.ipynb>` 21 * :download:`How to handle models from Python? <howto/howto_model_handling_python.ipynb>`
22 * :download:`How to do advanced model manipulation and fitting in Python? <howto/howto_advanced_python_fitting.ipynb>` 22 * :download:`How to do advanced model manipulation and fitting in Python? <howto/howto_advanced_python_fitting.ipynb>`
23 * :download:`How to generate likelihood profiles for a fitted spectrum? <howto/howto_likelihood_profiles.ipynb>` 23 * :download:`How to generate likelihood profiles for a fitted spectrum? <howto/howto_likelihood_profiles.ipynb>`
  24 +* :download:`How to perform spectral component separation? <howto/howto_scs.ipynb>`
24 * :download:`Data preparation for 1DC How-to <howto/howto_prepare_1dc.ipynb>` 25 * :download:`Data preparation for 1DC How-to <howto/howto_prepare_1dc.ipynb>`
25 * :download:`Selecting events for H.E.S.S. public data <hess_dr1/selecting_events.ipynb>` 26 * :download:`Selecting events for H.E.S.S. public data <hess_dr1/selecting_events.ipynb>`
26 * :download:`Generating a sky map and finding sources for H.E.S.S. public data <hess_dr1/skymap.ipynb>` 27 * :download:`Generating a sky map and finding sources for H.E.S.S. public data <hess_dr1/skymap.ipynb>`
27 * :download:`Generating a background model from H.E.S.S. public data <hess_dr1/bkgmodel.ipynb>` 28 * :download:`Generating a background model from H.E.S.S. public data <hess_dr1/bkgmodel.ipynb>`
28 * :download:`Performing an unbinned analysis of H.E.S.S. public data <hess_dr1/unbinned.ipynb>` 29 * :download:`Performing an unbinned analysis of H.E.S.S. public data <hess_dr1/unbinned.ipynb>`
29 * :download:`Classical analysis of H.E.S.S. public data <hess_dr1/classical.ipynb>` 30 * :download:`Classical analysis of H.E.S.S. public data <hess_dr1/classical.ipynb>`
30 -  
models/Makefile.am
@@ -38,6 +38,7 @@ models = 1dc_howto.xml \ @@ -38,6 +38,7 @@ models = 1dc_howto.xml \
38 disk.xml \ 38 disk.xml \
39 gauss.xml \ 39 gauss.xml \
40 shell.xml \ 40 shell.xml \
  41 + hess1825_26.xml \
41 hess_bkg_lookup.fits 42 hess_bkg_lookup.fits
42 43
43 # Install models 44 # Install models
models/hess1825_26.xml 0 → 100644
  1 +<?xml version="1.0" encoding="UTF-8" standalone="no"?>
  2 +<source_library title="source library">
  3 + <source name="HESS J1826-130" type="ExtendedSource">
  4 + <spectrum type="PowerLaw">
  5 + <parameter name="Prefactor" value="1" error="0" scale="8.6e-19" min="0" free="1" />
  6 + <parameter name="Index" value="1.66" error="0" scale="-1" min="1" max="5" free="1" />
  7 + <parameter name="PivotEnergy" value="1" scale="1000000" free="0" />
  8 + </spectrum>
  9 + <spatialModel type="RadialGaussian">
  10 + <parameter name="RA" value="276.500823974609" scale="1" free="1" />
  11 + <parameter name="DEC" value="-13.0333337783813" scale="1" free="1" />
  12 + <parameter name="Sigma" value="0.17" error="0" scale="1" min="0.0002778" free="1" />
  13 + </spatialModel>
  14 + </source>
  15 + <source name="HESS J1825-137" type="ExtendedSource">
  16 + <spectrum type="ExponentialCutoffPowerLaw">
  17 + <parameter name="Prefactor" value="1" error="0" scale="2.1e-17" min="0" free="1" />
  18 + <parameter name="Index" value="2.18" error="0" scale="-1" min="1" max="5" free="1" />
  19 + <parameter name="CutoffEnergy" value="19" error="0" scale="1000000" min="0.1" max = "1000" free="1" />
  20 + <parameter name="PivotEnergy" value="1" scale="1000000" free="0" />
  21 + </spectrum>
  22 + <spatialModel type="EllipticalGaussian">
  23 + <parameter name="RA" scale="1.0" value="276.454167" min="-360" max="360" free="1"/>
  24 + <parameter name="DEC" scale="1.0" value="-13.776389" min="-90" max="90" free="1"/>
  25 + <parameter name="PA" scale="17.0" value="45.0" min="-360" max="360" free="1"/>
  26 + <parameter name="MinorRadius" scale="1.0" value="0.512" min="0.001" max="10" free="1"/>
  27 + <parameter name="MajorRadius" scale="1.0" value="0.554" min="0.001" max="10" free="1"/>
  28 + </spatialModel>
  29 + </source>
  30 + <source name="CTABackgroundModel" type="CTAIrfBackground" instrument="CTA">
  31 + <spectrum type="PowerLaw">
  32 + <parameter name="Prefactor" scale="1.0" value="1.0" min="1e-3" max="1e+3" free="1"/>
  33 + <parameter name="Index" scale="1.0" value="0.0" min="-5.0" max="+5.0" free="1"/>
  34 + <parameter name="PivotEnergy" scale="1e6" value="1.0" min="0.01" max="1000.0" free="0"/>
  35 + </spectrum>
  36 + </source>
  37 +</source_library>
test/test_csscs.py 0 → 100644
  1 +#! /usr/bin/env python
  2 +# ==========================================================================
  3 +# This scripts performs unit tests for the csscs script.
  4 +#
  5 +# Copyright (C) 2020 Luigi Tibaldo
  6 +#
  7 +# This program is free software: you can redistribute it and/or modify
  8 +# it under the terms of the GNU General Public License as published by
  9 +# the Free Software Foundation, either version 3 of the License, or
  10 +# (at your option) any later version.
  11 +#
  12 +# This program is distributed in the hope that it will be useful,
  13 +# but WITHOUT ANY WARRANTY; without even the implied warranty of
  14 +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  15 +# GNU General Public License for more details.
  16 +#
  17 +# You should have received a copy of the GNU General Public License
  18 +# along with this program. If not, see <http://www.gnu.org/licenses/>.
  19 +#
  20 +# ==========================================================================
  21 +import cscripts
  22 +import gammalib
  23 +import os
  24 +from testing import test
  25 +
  26 +
  27 +# ========================= #
  28 +# Test class for csscs script #
  29 +# ========================= #
  30 +class Test(test):
  31 + """
  32 + Test class for csscs script
  33 +
  34 + This test class makes unit tests for the csscs script by using it from
  35 + the command line and from Python.
  36 + """
  37 +
  38 + # Constructor
  39 + def __init__(self):
  40 + """
  41 + Constructor
  42 + """
  43 + # Call base class constructor
  44 + test.__init__(self)
  45 +
  46 + # Set test datasets and parameters
  47 + self._evs_offaxis = self._datadir + '/crab_offaxis1.fits'
  48 + self._exclusion = self._datadir + '/crab_exclusion.fits'
  49 + self._expcube = self._datadir + '/crab_expcube.fits'
  50 + self._psfcube = self._datadir + '/crab_psfcube.fits'
  51 + self._bkgcube = self._datadir + '/crab_bkgcube.fits'
  52 + self._bkgmodel = self._datadir + '/crab_bkgcube.xml'
  53 + self._edispcube = self._datadir + '/crab_edispcube.fits'
  54 +
  55 + # Return
  56 + return
  57 +
  58 + # Set test functions
  59 + def set(self):
  60 + """
  61 + Set all test functions
  62 + """
  63 + # Set test name
  64 + self.name('csscs')
  65 +
  66 + # Append tests
  67 + self.append(self._test_cmd, 'Test csscs on command line')
  68 + self.append(self._test_python, 'Test csscs from Python')
  69 + self.append(self._test_pickeling, 'Test csscs pickeling')
  70 +
  71 + # Return
  72 + return
  73 +
  74 + # Test csscs on command line
  75 + def _test_cmd(self):
  76 + """
  77 + Test csscs on the command line
  78 + """
  79 + # Set script name
  80 + csscs = self._script('csscs')
  81 +
  82 + # Setup csscs command
  83 + cmd = csscs + ' inobs="' + self._cntcube + '"' + \
  84 + ' expcube="' + self._expcube + '"' + \
  85 + ' psfcube="' + self._psfcube + '"' + \
  86 + ' bkgcube="' + self._bkgcube + '"' + \
  87 + ' inmodel="' + self._bkgmodel + '"' + \
  88 + ' srcnames="Crab"' + \
  89 + ' emin=1. emax=100.0 nxpix=2 nypix=2' + \
  90 + ' binsz=0.1 coordsys="CEL" proj="CAR"' + \
  91 + ' xref=83.63 yref=22.01 rad=0.2' + \
  92 + ' outfile="csscs_cmd1.fits"' + \
  93 + ' logfile="csscs_cmd1.log" chatter=1'
  94 +
  95 + # Check if execution was successful
  96 + self.test_value(self._execute(cmd), 0,
  97 + 'Check successful execution from command line')
  98 +
  99 + # Setup csscs command
  100 + cmd = csscs + ' inobs="' + self._cntcube + '"' + \
  101 + ' expcube="' + self._expcube + '"' + \
  102 + ' psfcube="' + self._psfcube + '"' + \
  103 + ' bkgcube="' + self._bkgcube + '"' + \
  104 + ' inmodel="' + self._bkgmodel + '"' + \
  105 + ' srcnames="Crab;source_that_is_not_in_the_model"' + \
  106 + ' emin=1. emax=100.0 nxpix=2 nypix=2' + \
  107 + ' binsz=0.1 coordsys="CEL" proj="CAR"' + \
  108 + ' xref=83.63 yref=22.01 rad=0.2' + \
  109 + ' outfile="csscs_cmd1.fits"' + \
  110 + ' logfile="csscs_cmd1.log" chatter=1'
  111 +
  112 + # Check if execution failed
  113 + self.test_assert(self._execute(cmd, success=False) != 0,
  114 + 'Check invalid source name when executed from command line')
  115 +
  116 + # Check csscs --help
  117 + self._check_help(csscs)
  118 +
  119 + # Return
  120 + return
  121 +
  122 + # Test csscs from Python
  123 + def _test_python(self):
  124 + """
  125 + Test csscs from Python
  126 + """
  127 + # Allocate csscs
  128 + script = cscripts.csscs()
  129 +
  130 + # Check that saving does not nothing
  131 + script['logfile'] = 'csscs_py0.log'
  132 + script['outfile'] = 'csscs_py0.fits'
  133 + script.logFileOpen()
  134 + script.save()
  135 + self.test_assert(not os.path.isfile('csscs_py0.fits'),
  136 + 'Check that no FITS file has been created')
  137 +
  138 + # Check that clearing does not lead to an exception or segfault
  139 + script.clear()
  140 +
  141 + # Set up csscs for simple binned analysis
  142 + script['logfile'] = 'csscs_py1.log'
  143 + script['inobs'] = self._cntcube
  144 + script['expcube'] = self._expcube
  145 + script['psfcube'] = self._psfcube
  146 + script['bkgcube'] = self._bkgcube
  147 + script['inmodel'] = self._bkgmodel
  148 + script['srcnames'] = 'Crab'
  149 + script['emin'] = 1.
  150 + script['emax'] = 100.
  151 + script['nxpix'] = 2
  152 + script['nypix'] = 2
  153 + script['binsz'] = 0.1
  154 + script['coordsys'] = 'CEL'
  155 + script['proj'] = 'CAR'
  156 + script['xref'] = 83.63
  157 + script['yref'] = 22.01
  158 + script['rad'] = 0.2
  159 + script['outfile'] = 'csscs_py1.fits'
  160 + script['chatter'] = 4
  161 +
  162 + # Run csscs script and save results
  163 + script.logFileOpen()
  164 + script.execute()
  165 +
  166 + # Check result
  167 + self._check_result_file('csscs_py1.fits')
  168 +
  169 + # Set up for same test without TS computation
  170 + script = cscripts.csscs()
  171 + script['logfile'] = 'csscs_py2.log'
  172 + script['inobs'] = self._cntcube
  173 + script['expcube'] = self._expcube
  174 + script['psfcube'] = self._psfcube
  175 + script['bkgcube'] = self._bkgcube
  176 + script['inmodel'] = self._bkgmodel
  177 + script['srcnames'] = 'Crab'
  178 + script['emin'] = 1.
  179 + script['emax'] = 100.
  180 + script['nxpix'] = 2
  181 + script['nypix'] = 2
  182 + script['binsz'] = 0.1
  183 + script['coordsys'] = 'CEL'
  184 + script['proj'] = 'CAR'
  185 + script['xref'] = 83.63
  186 + script['yref'] = 22.01
  187 + script['rad'] = 0.2
  188 + script['calc_ts'] = False
  189 + script['outfile'] = 'csscs_py2.fits'
  190 + script['chatter'] = 2
  191 +
  192 + # Run csscs script and save results
  193 + script.logFileOpen()
  194 + script.execute()
  195 +
  196 + # Check result
  197 + self._check_result_file('csscs_py2.fits', calc_ts=False)
  198 +
  199 + # # Set up for same test with upper limit computation
  200 + script = cscripts.csscs()
  201 + script['logfile'] = 'csscs_py3.log'
  202 + script['inobs'] = self._cntcube
  203 + script['expcube'] = self._expcube
  204 + script['psfcube'] = self._psfcube
  205 + script['bkgcube'] = self._bkgcube
  206 + script['inmodel'] = self._bkgmodel
  207 + script['srcnames'] = 'Crab'
  208 + script['emin'] = 1.
  209 + script['emax'] = 100.
  210 + script['nxpix'] = 2
  211 + script['nypix'] = 2
  212 + script['binsz'] = 0.1
  213 + script['coordsys'] = 'CEL'
  214 + script['proj'] = 'CAR'
  215 + script['xref'] = 83.63
  216 + script['yref'] = 22.01
  217 + script['rad'] = 0.2
  218 + script['calc_ts'] = True
  219 + script['calc_ulim'] = True
  220 + script['outfile'] = 'csscs_py3.fits'
  221 + script['chatter'] = 2
  222 +
  223 + # Run csscs script and save results
  224 + script.logFileOpen()
  225 + script.execute()
  226 +
  227 + # Check result
  228 + self._check_result_file('csscs_py3.fits', calc_ulim=True)
  229 +
  230 + # # Check that results can be piped in memory
  231 + self._check_results_mem(script, calc_ulim=True)
  232 +
  233 + # Set up for test without multiprocessing
  234 + script = cscripts.csscs()
  235 + script['logfile'] = 'csscs_py4.log'
  236 + script['inobs'] = self._cntcube
  237 + script['expcube'] = self._expcube
  238 + script['psfcube'] = self._psfcube
  239 + script['bkgcube'] = self._bkgcube
  240 + script['inmodel'] = self._bkgmodel
  241 + script['srcnames'] = 'Crab'
  242 + script['emin'] = 1.
  243 + script['emax'] = 100.
  244 + script['nxpix'] = 2
  245 + script['nypix'] = 2
  246 + script['binsz'] = 0.1
  247 + script['coordsys'] = 'CEL'
  248 + script['proj'] = 'CAR'
  249 + script['xref'] = 83.63
  250 + script['yref'] = 22.01
  251 + script['rad'] = 0.2
  252 + script['outfile'] = 'csscs_py4.fits'
  253 + script['nthreads'] = 1
  254 + script['chatter'] = 2
  255 +
  256 + # Run csscs script and save results
  257 + script.logFileOpen()
  258 + script.execute()
  259 +
  260 + # Check result
  261 + self._check_result_file('csscs_py4.fits')
  262 +
  263 + # Set up for test with energy dispersion
  264 + script = cscripts.csscs()
  265 + script['logfile'] = 'csscs_py5.log'
  266 + script['inobs'] = self._cntcube
  267 + script['expcube'] = self._expcube
  268 + script['psfcube'] = self._psfcube
  269 + script['bkgcube'] = self._bkgcube
  270 + script['edisp'] = True
  271 + script['edispcube'] = self._edispcube
  272 + script['inmodel'] = self._bkgmodel
  273 + script['srcnames'] = 'Crab'
  274 + script['emin'] = 1.
  275 + script['emax'] = 100.
  276 + script['nxpix'] = 2
  277 + script['nypix'] = 2
  278 + script['binsz'] = 0.1
  279 + script['coordsys'] = 'CEL'
  280 + script['proj'] = 'CAR'
  281 + script['xref'] = 83.63
  282 + script['yref'] = 22.01
  283 + script['rad'] = 0.2
  284 + script['outfile'] = 'csscs_py5.fits'
  285 + script['chatter'] = 2
  286 +
  287 + # Run csscs script and save results
  288 + script.logFileOpen()
  289 + script.execute()
  290 +
  291 + # Check result
  292 + self._check_result_file('csscs_py5.fits')
  293 +
  294 + # Set up for test in On/Off mode with background model
  295 + script = cscripts.csscs()
  296 + script['logfile'] = 'csscs_py6.log'
  297 + script['inobs'] = self._evs_offaxis
  298 + script['caldb'] = self._caldb
  299 + script['irf'] = self._irf
  300 + script['inmodel'] = self._model
  301 + script['srcnames'] = 'Crab'
  302 + script['emin'] = 1.
  303 + script['emax'] = 100.
  304 + script['nxpix'] = 2
  305 + script['nypix'] = 2
  306 + script['binsz'] = 0.1
  307 + script['coordsys'] = 'CEL'
  308 + script['proj'] = 'CAR'
  309 + script['xref'] = 83.63
  310 + script['yref'] = 22.01
  311 + script['rad'] = 0.2
  312 + script['method'] = 'ONOFF'
  313 + script['inexclusion'] = self._exclusion
  314 + script['enumbins'] = 2
  315 + script['outfile'] = 'csscs_py6.fits'
  316 + script['chatter'] = 2
  317 +
  318 + # Run csscs script and save results
  319 + script.logFileOpen()
  320 + script.execute()
  321 +
  322 + # Check result
  323 + self._check_result_file('csscs_py6.fits')
  324 +
  325 + # Same test with exclusion map piped in memory
  326 + script = cscripts.csscs()
  327 + script['logfile'] = 'csscs_py7.log'
  328 + script['inobs'] = self._evs_offaxis
  329 + script['caldb'] = self._caldb
  330 + script['irf'] = self._irf
  331 + script['inmodel'] = self._model
  332 + script['srcnames'] = 'Crab'
  333 + script['emin'] = 1.
  334 + script['emax'] = 100.
  335 + script['nxpix'] = 2
  336 + script['nypix'] = 2
  337 + script['binsz'] = 0.1
  338 + script['coordsys'] = 'CEL'
  339 + script['proj'] = 'CAR'
  340 + script['xref'] = 83.63
  341 + script['yref'] = 22.01
  342 + script['rad'] = 0.2
  343 + script['method'] = 'ONOFF'
  344 + script['enumbins'] = 2
  345 + script['outfile'] = 'csscs_py7.fits'
  346 + script['chatter'] = 2
  347 +
  348 + # Set exclusion map
  349 + exclmap = gammalib.GSkyRegionMap(self._exclusion)
  350 + script.exclusion_map(exclmap)
  351 +
  352 + # Run csscs script and save results
  353 + script.logFileOpen()
  354 + script.execute()
  355 +
  356 + # Check result
  357 + self._check_result_file('csscs_py7.fits')
  358 +
  359 + # Set up for test in On/Off mode without background model
  360 + script = cscripts.csscs()
  361 + script['logfile'] = 'csscs_py8.log'
  362 + script['inobs'] = self._evs_offaxis
  363 + script['caldb'] = self._caldb
  364 + script['irf'] = self._irf
  365 + script['inmodel'] = self._model
  366 + script['srcnames'] = 'Crab'
  367 + script['emin'] = 1.
  368 + script['emax'] = 100.
  369 + script['nxpix'] = 2
  370 + script['nypix'] = 2
  371 + script['binsz'] = 0.1
  372 + script['coordsys'] = 'CEL'
  373 + script['proj'] = 'CAR'
  374 + script['xref'] = 83.63
  375 + script['yref'] = 22.01
  376 + script['rad'] = 0.2
  377 + script['method'] = 'ONOFF'
  378 + script['use_model_bkg'] = False
  379 + script['inexclusion'] = self._exclusion
  380 + script['enumbins'] = 2
  381 + script['outfile'] = 'csscs_py8.fits'
  382 + script['chatter'] = 2
  383 +
  384 + # Run csscs script and save results
  385 + script.logFileOpen()
  386 + script.execute()
  387 +
  388 + # Check result
  389 + self._check_result_file('csscs_py8.fits')
  390 +
  391 + # Set up for test in unbinned mode
  392 + script = cscripts.csscs()
  393 + script['logfile'] = 'csscs_py9.log'
  394 + script['inobs'] = self._evs_offaxis
  395 + script['caldb'] = self._caldb
  396 + script['irf'] = self._irf
  397 + script['inmodel'] = self._model
  398 + script['srcnames'] = 'Crab'
  399 + script['emin'] = 1.
  400 + script['emax'] = 100.
  401 + script['nxpix'] = 2
  402 + script['nypix'] = 2
  403 + script['binsz'] = 0.1
  404 + script['coordsys'] = 'CEL'
  405 + script['proj'] = 'CAR'
  406 + script['xref'] = 83.63
  407 + script['yref'] = 22.01
  408 + script['rad'] = 0.2
  409 + script['method'] = 'UNBINNED'
  410 + script['enumbins'] = 2
  411 + script['outfile'] = 'csscs_py9.fits'
  412 + script['chatter'] = 2
  413 +
  414 + # Run csscs script and save results
  415 + script.logFileOpen()
  416 + script.execute()
  417 +
  418 + # Check result
  419 + self._check_result_file('csscs_py9.fits')
  420 +
  421 + # Return
  422 + return
  423 +
  424 + # Test csscs pickeling
  425 + def _test_pickeling(self):
  426 + """
  427 + Test csscs pickeling
  428 + """
  429 + # Perform pickeling test of empty class
  430 + self._pickeling(cscripts.csscs())
  431 +
  432 + # Setup script for pickling text
  433 + script = cscripts.csscs()
  434 + script['logfile'] = 'csscs_py1_pickle.log'
  435 + script['inobs'] = self._cntcube
  436 + script['expcube'] = self._expcube
  437 + script['psfcube'] = self._psfcube
  438 + script['bkgcube'] = self._bkgcube
  439 + script['inmodel'] = self._bkgmodel
  440 + script['srcnames'] = 'Crab'
  441 + script['emin'] = 1.
  442 + script['emax'] = 100.
  443 + script['nxpix'] = 2
  444 + script['nypix'] = 2
  445 + script['binsz'] = 0.1
  446 + script['coordsys'] = 'CEL'
  447 + script['proj'] = 'CAR'
  448 + script['xref'] = 83.63
  449 + script['yref'] = 22.01
  450 + script['rad'] = 0.2
  451 + script['outfile'] = 'csscs_py1_pickle.fits'
  452 + script['chatter'] = 2
  453 +
  454 + # Perform pickeling tests of filled class
  455 + obj = self._pickeling(script)
  456 +
  457 + # Run csscs script and save result
  458 + obj.logFileOpen() # Make sure we get a log file
  459 + obj.execute()
  460 +
  461 + # Check result file
  462 + self._check_result_file('csscs_py1_pickle.fits')
  463 +
  464 + # Return
  465 + return
  466 +
  467 + # Check access to results in memory'
  468 + def _check_results_mem(self, script, srcnames=['Crab'], nx=2, ny=2, calc_ts=True,
  469 + calc_ulim=False):
  470 + """
  471 + Check results in memory
  472 +
  473 + Parameters
  474 + ----------
  475 + script : `~cscripts.csscs`
  476 + csscs object
  477 + srcnames : list, optional
  478 + Source names
  479 + nx : int, optional
  480 + Number of X pixels
  481 + ny : int, optional
  482 + Number of Y pixels
  483 + calc_ts : bool, optional
  484 + Check TS HDU
  485 + calc_ulim : bool, optional
  486 + Check upper limit HDU
  487 + """
  488 +
  489 + # Check that the entire fits container can be extracted
  490 + fits = script.fits()
  491 + # Dump to disk and verify
  492 + fits.saveto('csscs_py3_mem.fits', True)
  493 + self._check_result_file('csscs_py3_mem.fits', srcnames=srcnames, nx=nx, ny=ny,
  494 + calc_ts=calc_ts, calc_ulim=calc_ulim)
  495 +
  496 + # Now check direct access in memory for skymaps
  497 + # Loop over sources
  498 + for name in srcnames:
  499 + # Check flux map
  500 + skymap = script.flux(name)
  501 + self._check_map(skymap, nx=nx, ny=ny)
  502 + # Check flux error map
  503 + skymap = script.flux_error(name)
  504 + self._check_map(skymap, nx=nx, ny=ny)
  505 + # If requested check TS map
  506 + if calc_ts:
  507 + skymap = script.ts(name)
  508 + self._check_map(skymap, nx=nx, ny=ny)
  509 + # If requested check upper limit map
  510 + if calc_ulim:
  511 + skymap = script.ulimit(name)
  512 + self._check_map(skymap, nx=nx, ny=ny)
  513 +
  514 + return
  515 +
  516 + # Check result file
  517 + def _check_result_file(self, filename, srcnames=['Crab'], nx=2, ny=2,
  518 + calc_ts=True, calc_ulim=False):
  519 + """
  520 + Check result file
  521 +
  522 + Parameters
  523 + ----------
  524 + filename : str
  525 + Sky map file name
  526 + srcnames : list, optional
  527 + Source names
  528 + nx : int, optional
  529 + Number of X pixels
  530 + ny : int, optional
  531 + Number of Y pixels
  532 + calc_ts : bool, optional
  533 + Check TS HDU
  534 + calc_ulim : bool, optional
  535 + Check upper limit HDU
  536 + """
  537 +
  538 + print('ho', calc_ts)
  539 + # Loop over source names
  540 + for name in srcnames:
  541 + # Check flux map
  542 + skymap = gammalib.GSkyMap(filename + '[' + name + ' FLUX]')
  543 + self._check_map(skymap, nx=nx, ny=ny)
  544 + # Check flux error map
  545 + skymap = gammalib.GSkyMap(filename + '[' + name + ' FLUX ERROR]')
  546 + self._check_map(skymap, nx=nx, ny=ny)
  547 + # If requested check TS map
  548 + if calc_ts:
  549 + print('hoho')
  550 + skymap = gammalib.GSkyMap(filename + '[' + name + ' TS]')
  551 + self._check_map(skymap, nx=nx, ny=ny)
  552 + # If requested check upper limit map
  553 + if calc_ulim:
  554 + skymap = gammalib.GSkyMap(filename + '[' + name + ' FLUX UPPER LIMIT]')
  555 + self._check_map(skymap, nx=nx, ny=ny)
  556 +
  557 + # Return
  558 + return
  559 +
  560 + # Check sky map
  561 + def _check_map(self, skymap, nx=2, ny=2):
  562 + """
  563 + Check sky map
  564 +
  565 + Parameters
  566 + ----------
  567 + skymap : `~gammalib.GSkyMap`
  568 + Sky map
  569 + nx : int, optional
  570 + Number of X pixels
  571 + ny : int, optional
  572 + Number of Y pixels
  573 + """
  574 +
  575 + # Check dimensions
  576 + self.test_value(skymap.nmaps(), 1, 'Check number of maps')
  577 + self.test_value(skymap.nx(), nx, 'Check for number of X pixels')
  578 + self.test_value(skymap.ny(), ny, 'Check for number of Y pixels')
  579 +
  580 + # Return
  581 + return
test/test_python_cscripts.py
@@ -18,11 +18,14 @@ @@ -18,11 +18,14 @@
18 # along with this program. If not, see <http://www.gnu.org/licenses/>. 18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 # 19 #
20 # ========================================================================== 20 # ==========================================================================
  21 +
  22 +import cscripts
  23 +import gammalib
21 import os 24 import os
22 import sys 25 import sys
23 -import gammalib  
24 -import cscripts 26 +
25 sys.path.append(os.path.dirname(os.path.abspath(__file__))) 27 sys.path.append(os.path.dirname(os.path.abspath(__file__)))
  28 +
26 import test_cscript 29 import test_cscript
27 import test_cscaldb 30 import test_cscaldb
28 import test_csbkgmodel 31 import test_csbkgmodel
@@ -51,6 +54,7 @@ import test_cstsdist @@ -51,6 +54,7 @@ import test_cstsdist
51 import test_cstsmapmerge 54 import test_cstsmapmerge
52 import test_cstsmapsplit 55 import test_cstsmapsplit
53 import test_csviscube 56 import test_csviscube
  57 +import test_csscs
54 import test_csworkflow 58 import test_csworkflow
55 import test_obsutils 59 import test_obsutils
56 import test_mputils 60 import test_mputils
@@ -60,8 +64,11 @@ import test_csiactobs @@ -60,8 +64,11 @@ import test_csiactobs
60 64
61 65
62 # ================== # 66 # ================== #
  67 +
63 # Perform unit tests # 68 # Perform unit tests #
  69 +
64 # ================== # 70 # ================== #
  71 +
65 def test(installed=False, debug=False): 72 def test(installed=False, debug=False):
66 """ 73 """
67 Perform cscripts unit testing. 74 Perform cscripts unit testing.
@@ -73,37 +80,34 @@ def test(installed=False, debug=False): @@ -73,37 +80,34 @@ def test(installed=False, debug=False):
73 debug : bool, optional 80 debug : bool, optional
74 Enables debugging 81 Enables debugging
75 """ 82 """
  83 +
76 # If we have an installed version then create a temporary directory and 84 # If we have an installed version then create a temporary directory and
77 # copy over all information that is needed 85 # copy over all information that is needed
78 if installed: 86 if installed:
79 -  
80 # Create temporary working directory 87 # Create temporary working directory
81 import tempfile 88 import tempfile
82 path = tempfile.mkdtemp() 89 path = tempfile.mkdtemp()
83 os.chdir(path) 90 os.chdir(path)
84 -  
85 # Get test directory 91 # Get test directory
86 import inspect 92 import inspect
87 testdir = inspect.getfile(cscripts.tests) 93 testdir = inspect.getfile(cscripts.tests)
88 dirname = os.path.dirname(testdir) 94 dirname = os.path.dirname(testdir)
89 -  
90 # Copy test data in "data" directory 95 # Copy test data in "data" directory
91 - os.system('cp -r %s %s' % (dirname+'/data', 'data'))  
92 - 96 + os.system('cp -r %s %s' % (dirname + '/data', 'data'))
93 # Set test data environment variable 97 # Set test data environment variable
94 os.environ['TEST_DATA'] = 'data' 98 os.environ['TEST_DATA'] = 'data'
95 -  
96 # ... otherwise set the calibration database to the one shipped with the 99 # ... otherwise set the calibration database to the one shipped with the
97 # package; we don't need to set the 'TEST_DATA', this is done by the 100 # package; we don't need to set the 'TEST_DATA', this is done by the
98 # test environment 101 # test environment
99 else: 102 else:
100 os.environ['CALDB'] = '%s/caldb' % (os.environ['TEST_SRCDIR']) 103 os.environ['CALDB'] = '%s/caldb' % (os.environ['TEST_SRCDIR'])
101 -  
102 # Create a local "pfiles" directory and set PFILES environment variable 104 # Create a local "pfiles" directory and set PFILES environment variable
  105 +
103 try: 106 try:
104 os.mkdir('pfiles') 107 os.mkdir('pfiles')
105 except: 108 except:
106 pass 109 pass
  110 +
107 os.environ['PFILES'] = 'pfiles' 111 os.environ['PFILES'] = 'pfiles'
108 112
109 # Copy the cscripts parameter files into the "pfiles" directory. For a 113 # Copy the cscripts parameter files into the "pfiles" directory. For a
@@ -111,8 +115,9 @@ def test(installed=False, debug=False): @@ -111,8 +115,9 @@ def test(installed=False, debug=False):
111 # source directory into the "pfiles" directory, for an installed version 115 # source directory into the "pfiles" directory, for an installed version
112 # we get all parameter files from the "syspfiles" directory. Also make 116 # we get all parameter files from the "syspfiles" directory. Also make
113 # sure that all parameter files are writable. 117 # sure that all parameter files are writable.
  118 +
114 if not installed: 119 if not installed:
115 - os.system('cp -r %s/cscripts/*.par pfiles/'% (os.environ['TEST_SRCDIR'])) 120 + os.system('cp -r %s/cscripts/*.par pfiles/' % (os.environ['TEST_SRCDIR']))
116 os.system('chmod u+w pfiles/*') 121 os.system('chmod u+w pfiles/*')
117 else: 122 else:
118 os.system('cp -r %s/syspfiles/*.par pfiles/' % (os.environ['CTOOLS'])) 123 os.system('cp -r %s/syspfiles/*.par pfiles/' % (os.environ['CTOOLS']))
@@ -146,6 +151,7 @@ def test(installed=False, debug=False): @@ -146,6 +151,7 @@ def test(installed=False, debug=False):
146 test_cstsmapmerge.Test(), 151 test_cstsmapmerge.Test(),
147 test_cstsmapsplit.Test(), 152 test_cstsmapsplit.Test(),
148 test_csviscube.Test(), 153 test_csviscube.Test(),
  154 + test_csscs.Test(),
149 test_csworkflow.Test(), 155 test_csworkflow.Test(),
150 test_obsutils.Test(), 156 test_obsutils.Test(),
151 test_mputils.Test()] 157 test_mputils.Test()]
@@ -154,10 +160,8 @@ def test(installed=False, debug=False): @@ -154,10 +160,8 @@ def test(installed=False, debug=False):
154 # module which is only available since Python 2.6+) 160 # module which is only available since Python 2.6+)
155 ver = sys.version.split()[0] 161 ver = sys.version.split()[0]
156 if ver >= '2.6.0': 162 if ver >= '2.6.0':
157 -  
158 # Check for VHEFITS environment variable 163 # Check for VHEFITS environment variable
159 if 'VHEFITS' in os.environ: 164 if 'VHEFITS' in os.environ:
160 -  
161 # If the environment variable exists then unset it for the test 165 # If the environment variable exists then unset it for the test
162 # cases. Since Python is executed in a subprocess this will not 166 # cases. Since Python is executed in a subprocess this will not
163 # impact the environment variable in the parent shell. 167 # impact the environment variable in the parent shell.
@@ -203,9 +207,12 @@ def test(installed=False, debug=False): @@ -203,9 +207,12 @@ def test(installed=False, debug=False):
203 207
204 208
205 # ======================== # 209 # ======================== #
  210 +
206 # Main routine entry point # 211 # Main routine entry point #
  212 +
207 # ======================== # 213 # ======================== #
208 -if __name__ == '__main__':  
209 214
  215 +if __name__ == '__main__':
210 # Run tests 216 # Run tests
  217 +
211 test() 218 test()