Commit e0519a38d0694bb9e74214fef79e004507cb9377
Merge branch '2961-scs' into integration
# Conflicts: # doc/source/users/tutorials/notebooks.rst
Showing
20 changed files
with
3105 additions
and
64 deletions
cscripts/Makefile.am
| ... | ... | @@ -19,7 +19,10 @@ |
| 19 | 19 | # # |
| 20 | 20 | ############################################################################# |
| 21 | 21 | |
| 22 | + | |
| 23 | + | |
| 22 | 24 | # Scripts to be distributed in $(pyexecdir)/cscripts |
| 25 | + | |
| 23 | 26 | pythonscripts = $(top_builddir)/cscripts/__init__.py \ |
| 24 | 27 | $(srcdir)/csbkgmodel.py \ |
| 25 | 28 | $(srcdir)/cscaldb.py \ |
| ... | ... | @@ -47,6 +50,7 @@ pythonscripts = $(top_builddir)/cscripts/__init__.py \ |
| 47 | 50 | $(srcdir)/cstsmapmerge.py \ |
| 48 | 51 | $(srcdir)/cstsmapsplit.py \ |
| 49 | 52 | $(srcdir)/csviscube.py \ |
| 53 | + $(srcdir)/csscs.py \ | |
| 50 | 54 | $(srcdir)/csworkflow.py \ |
| 51 | 55 | $(srcdir)/csfindobs.py \ |
| 52 | 56 | $(srcdir)/csiactcopy.py \ |
| ... | ... | @@ -58,7 +62,10 @@ pythonscripts = $(top_builddir)/cscripts/__init__.py \ |
| 58 | 62 | $(srcdir)/ioutils.py \ |
| 59 | 63 | $(srcdir)/mputils.py |
| 60 | 64 | |
| 65 | + | |
| 66 | + | |
| 61 | 67 | # Parfiles to be distributed in $(prefix)/syspfiles |
| 68 | + | |
| 62 | 69 | parfiles = $(srcdir)/csbkgmodel.par \ |
| 63 | 70 | $(srcdir)/cscaldb.par \ |
| 64 | 71 | $(srcdir)/csebins.par \ |
| ... | ... | @@ -84,13 +91,17 @@ parfiles = $(srcdir)/csbkgmodel.par \ |
| 84 | 91 | $(srcdir)/cstsmapmerge.par \ |
| 85 | 92 | $(srcdir)/cstsmapsplit.par \ |
| 86 | 93 | $(srcdir)/csviscube.par \ |
| 94 | + $(srcdir)/csscs.par \ | |
| 87 | 95 | $(srcdir)/csworkflow.par \ |
| 88 | 96 | $(srcdir)/csfindobs.par \ |
| 89 | 97 | $(srcdir)/csiactcopy.par \ |
| 90 | 98 | $(srcdir)/csiactdata.par \ |
| 91 | 99 | $(srcdir)/csiactobs.par |
| 92 | 100 | |
| 101 | + | |
| 102 | + | |
| 93 | 103 | # Scripts for which symbolic links will be created in bindir |
| 104 | + | |
| 94 | 105 | linkscripts = csbkgmodel \ |
| 95 | 106 | cscaldb \ |
| 96 | 107 | csebins \ |
| ... | ... | @@ -117,13 +128,17 @@ linkscripts = csbkgmodel \ |
| 117 | 128 | cstsmapmerge \ |
| 118 | 129 | cstsmapsplit \ |
| 119 | 130 | csviscube \ |
| 131 | + csscs \ | |
| 120 | 132 | csworkflow \ |
| 121 | 133 | csfindobs \ |
| 122 | 134 | csiactcopy \ |
| 123 | 135 | csiactdata \ |
| 124 | 136 | csiactobs |
| 125 | 137 | |
| 138 | + | |
| 139 | + | |
| 126 | 140 | # Test scripts to be distributed in $(pyexecdir)/cscripts/tests |
| 141 | + | |
| 127 | 142 | testscripts = $(srcdir)/tests/__init__.py \ |
| 128 | 143 | $(top_srcdir)/test/testing.py \ |
| 129 | 144 | $(top_srcdir)/test/test_python_cscripts.py \ |
| ... | ... | @@ -155,6 +170,7 @@ testscripts = $(srcdir)/tests/__init__.py \ |
| 155 | 170 | $(top_srcdir)/test/test_cstsmapmerge.py \ |
| 156 | 171 | $(top_srcdir)/test/test_cstsmapsplit.py \ |
| 157 | 172 | $(top_srcdir)/test/test_csviscube.py \ |
| 173 | + $(top_srcdir)/test/test_csscs.py \ | |
| 158 | 174 | $(top_srcdir)/test/test_csworkflow.py \ |
| 159 | 175 | $(top_srcdir)/test/test_obsutils.py \ |
| 160 | 176 | $(top_srcdir)/test/test_mputils.py \ |
| ... | ... | @@ -162,7 +178,10 @@ testscripts = $(srcdir)/tests/__init__.py \ |
| 162 | 178 | $(top_srcdir)/test/test_csiactdata.py \ |
| 163 | 179 | $(top_srcdir)/test/test_csiactobs.py |
| 164 | 180 | |
| 181 | + | |
| 182 | + | |
| 165 | 183 | # Test data to be distributed in $(pyexecdir)/cscripts/tests/data |
| 184 | + | |
| 166 | 185 | testdata = $(top_srcdir)/test/data/crab.xml \ |
| 167 | 186 | $(top_srcdir)/test/data/obs_unbinned.xml \ |
| 168 | 187 | $(top_srcdir)/test/data/obs_unbinned_two.xml \ |
| ... | ... | @@ -239,12 +258,18 @@ testdata = $(top_srcdir)/test/data/crab.xml \ |
| 239 | 258 | $(top_srcdir)/test/data/viscube.fits.gz \ |
| 240 | 259 | $(top_srcdir)/test/data/hess_bkg_lookup.fits |
| 241 | 260 | |
| 261 | + | |
| 262 | + | |
| 242 | 263 | # Test data to be distributed in $(pyexecdir)/cscripts/tests/data/iactdata |
| 264 | + | |
| 243 | 265 | testiactdata = $(top_srcdir)/test/data/iactdata/hdu-index.fits.gz \ |
| 244 | 266 | $(top_srcdir)/test/data/iactdata/master.json \ |
| 245 | 267 | $(top_srcdir)/test/data/iactdata/obs-index.fits.gz |
| 246 | 268 | |
| 269 | + | |
| 270 | + | |
| 247 | 271 | # Test data to be distributed in $(pyexecdir)/cscripts/tests/data/iactdata/events |
| 272 | + | |
| 248 | 273 | testiactevents = $(top_srcdir)/test/data/iactdata/events/irf_file.fits.gz \ |
| 249 | 274 | $(top_srcdir)/test/data/iactdata/events/events_0.fits.gz \ |
| 250 | 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 | 281 | $(top_srcdir)/test/data/iactdata/events/events_7.fits.gz \ |
| 257 | 282 | $(top_srcdir)/test/data/iactdata/events/events_8.fits.gz |
| 258 | 283 | |
| 284 | + | |
| 259 | 285 | # Install scripts, parfiles, test scripts and test data. Note that we don't |
| 260 | 286 | # need to prepend $(DESTDIR) here (not fully clear why, but that's the way |
| 261 | 287 | # it is) |
| 288 | + | |
| 262 | 289 | binscriptsdir = $(bindir) |
| 263 | 290 | binscripts_DATA = $(binscripts) |
| 264 | 291 | pythonscriptsdir = $(pyexecdir)/cscripts |
| ... | ... | @@ -274,17 +301,23 @@ testiactdata_DATA = $(testiactdata) |
| 274 | 301 | testiacteventsdir = $(pyexecdir)/cscripts/tests/data/iactdata/events |
| 275 | 302 | testiactevents_DATA = $(testiactevents) |
| 276 | 303 | |
| 304 | + | |
| 277 | 305 | # Files to be distributed in the tar file |
| 278 | 306 | EXTRA_DIST = $(binscripts) $(pythonscripts) $(parfiles) \ |
| 279 | 307 | $(testscripts) $(testdata) $(testiactdata) \ |
| 280 | 308 | $(testiactevents) |
| 281 | 309 | |
| 310 | + | |
| 311 | + | |
| 282 | 312 | # Add install hook rule to copy cscripts without .py into the bindir |
| 313 | + | |
| 283 | 314 | install-data-hook: |
| 315 | + | |
| 284 | 316 | @binlist='$(binscripts)';\ |
| 285 | 317 | for p in $$binlist; do \ |
| 286 | 318 | chmod +x "$(DESTDIR)$(bindir)/$$p"; \ |
| 287 | 319 | done |
| 320 | + | |
| 288 | 321 | @linklist='$(linkscripts)';\ |
| 289 | 322 | for p in $$linklist; do \ |
| 290 | 323 | rm -rf "$(DESTDIR)$(bindir)/$$p"; \ |
| ... | ... | @@ -292,15 +325,23 @@ install-data-hook: |
| 292 | 325 | chmod +x "$(DESTDIR)$(bindir)/$$p"; \ |
| 293 | 326 | done |
| 294 | 327 | |
| 328 | + | |
| 329 | + | |
| 295 | 330 | # Uninstall hook rule to remove the cscripts from the bindir |
| 331 | + | |
| 296 | 332 | uninstall-hook: |
| 333 | + | |
| 297 | 334 | @linklist='$(linkscripts)';\ |
| 298 | 335 | for p in $$linklist; do \ |
| 299 | 336 | rm -rf "$(DESTDIR)$(bindir)/$$p"; \ |
| 300 | 337 | done |
| 301 | 338 | |
| 339 | + | |
| 340 | + | |
| 302 | 341 | # Files to be removed in build directory |
| 342 | + | |
| 303 | 343 | clean-local: |
| 344 | + | |
| 304 | 345 | @if ! [ '@top_srcdir@' -ef '@top_builddir@' ]; then \ |
| 305 | 346 | rm -rf $(top_builddir)/cscripts/cs*.py; \ |
| 306 | 347 | rm -rf $(top_builddir)/cscripts/obsutils.py; \ |
| ... | ... | @@ -310,13 +351,19 @@ clean-local: |
| 310 | 351 | rm -rf $(top_builddir)/cscripts/mputils.py; \ |
| 311 | 352 | rm -rf $(top_builddir)/cscripts/*.par; \ |
| 312 | 353 | fi |
| 354 | + | |
| 313 | 355 | rm -rf $(top_builddir)/cscripts/*.pyc |
| 314 | 356 | rm -rf $(top_builddir)/cscripts/__pycache__ |
| 315 | 357 | |
| 358 | + | |
| 359 | + | |
| 316 | 360 | # Uninstall the cscripts Python module |
| 361 | + | |
| 317 | 362 | uninstall-local: |
| 363 | + | |
| 318 | 364 | rm -rf $(DESTDIR)$(pyexecdir)/cscripts/*.pyc |
| 319 | 365 | rm -rf $(DESTDIR)$(pyexecdir)/cscripts/*.pyc |
| 320 | 366 | rm -rf $(DESTDIR)$(pyexecdir)/cscripts/__pycache__ |
| 321 | 367 | rm -rf $(DESTDIR)$(pyexecdir)/cscripts/tests/*.pyc |
| 322 | 368 | rm -rf $(DESTDIR)$(pyexecdir)/cscripts/tests/__pycache__ |
| 369 | + | ... | ... |
cscripts/__init__.py.in
| 1 | 1 | # ========================================================================== |
| 2 | 2 | # cscripts Python module |
| 3 | 3 | # |
| 4 | -# Copyright (C) 2015-2018 Juergen Knoedlseder | |
| 4 | +# Copyright (C) 2015-2020 Juergen Knoedlseder | |
| 5 | 5 | # |
| 6 | 6 | # This program is free software: you can redistribute it and/or modify |
| 7 | 7 | # it under the terms of the GNU General Public License as published by |
| ... | ... | @@ -50,6 +50,7 @@ __all__ = [ |
| 50 | 50 | "cstsmapmerge", |
| 51 | 51 | "cstsmapsplit", |
| 52 | 52 | "csviscube", |
| 53 | + "csscs", | |
| 53 | 54 | "csworkflow", |
| 54 | 55 | "obsutils", |
| 55 | 56 | "modutils", |
| ... | ... | @@ -90,6 +91,7 @@ from cscripts.cstsdist import cstsdist |
| 90 | 91 | from cscripts.cstsmapmerge import cstsmapmerge |
| 91 | 92 | from cscripts.cstsmapsplit import cstsmapsplit |
| 92 | 93 | from cscripts.csviscube import csviscube |
| 94 | +from cscripts.csscs import csscs | |
| 93 | 95 | from cscripts.csworkflow import csworkflow |
| 94 | 96 | from cscripts import obsutils |
| 95 | 97 | from cscripts import modutils |
| ... | ... | @@ -116,3 +118,4 @@ def test(): |
| 116 | 118 | |
| 117 | 119 | # Add version |
| 118 | 120 | __version__ = '@PACKAGE_VERSION@' |
| 121 | + | ... | ... |
cscripts/csphagen.py
| ... | ... | @@ -287,6 +287,15 @@ class csphagen(ctools.csobservation): |
| 287 | 287 | self._has_exclusion = True |
| 288 | 288 | elif self['inexclusion'].is_valid(): |
| 289 | 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 | 299 | self._excl_reg = gammalib.GSkyRegionMap(inexclusion) |
| 291 | 300 | self._has_exclusion = True |
| 292 | 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 | 745 | # ================================ # |
| 746 | 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 | 750 | Create On/Off observations container from given observations |
| 751 | 751 | |
| ... | ... | @@ -757,6 +757,12 @@ def get_onoff_obs(cls, obs, nthreads=0): |
| 757 | 757 | Observation container |
| 758 | 758 | nthreads : str, optional |
| 759 | 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 | 767 | Returns |
| 762 | 768 | ------- |
| ... | ... | @@ -767,21 +773,16 @@ def get_onoff_obs(cls, obs, nthreads=0): |
| 767 | 773 | if cls._logExplicit(): |
| 768 | 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 | 777 | inmodel = 'NONE' |
| 772 | - srcname = '' | |
| 773 | - inexclusion = 'NONE' | |
| 774 | 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 | 781 | if cls.has_par('inmodel') and obs.models().size() == 0: |
| 778 | 782 | if cls['inmodel'].is_valid(): |
| 779 | 783 | inmodel = cls['inmodel'].value() |
| 780 | - if cls.has_par('srcname'): | |
| 784 | + if srcname == '' and cls.has_par('srcname'): | |
| 781 | 785 | srcname = cls['srcname'].value() |
| 782 | - if cls.has_par('inexclusion'): | |
| 783 | - if cls['inexclusion'].is_valid(): | |
| 784 | - inexclusion = cls['inexclusion'].value() | |
| 785 | 786 | if cls.has_par('use_model_bkg'): |
| 786 | 787 | use_model_bkg = cls['use_model_bkg'].boolean() |
| 787 | 788 | |
| ... | ... | @@ -789,19 +790,25 @@ def get_onoff_obs(cls, obs, nthreads=0): |
| 789 | 790 | phagen = cscripts.csphagen(obs) |
| 790 | 791 | phagen['inmodel'] = inmodel |
| 791 | 792 | phagen['srcname'] = srcname |
| 792 | - phagen['inexclusion'] = inexclusion | |
| 793 | 793 | phagen['emin'] = cls['emin'].real() |
| 794 | 794 | phagen['emax'] = cls['emax'].real() |
| 795 | 795 | phagen['enumbins'] = cls['enumbins'].integer() |
| 796 | 796 | phagen['ebinalg'] = 'LOG' |
| 797 | 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 | 812 | if cls['srcshape'].string() == 'CIRCLE': |
| 806 | 813 | phagen['rad'] = cls['rad'].real() |
| 807 | 814 | phagen['bkgmethod'] = cls['bkgmethod'].string() |
| ... | ... | @@ -818,13 +825,37 @@ def get_onoff_obs(cls, obs, nthreads=0): |
| 818 | 825 | phagen['debug'] = cls['debug'].boolean() |
| 819 | 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 | 834 | if hasattr(cls, 'exclusion_map'): |
| 823 | 835 | exclusion_map = cls.exclusion_map() |
| 824 | 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 | 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 | 859 | phagen.run() |
| 829 | 860 | |
| 830 | 861 | # Clone resulting observation container | ... | ... |
dev/codegen.py
| ... | ... | @@ -18,12 +18,12 @@ |
| 18 | 18 | # along with this program. If not, see <http://www.gnu.org/licenses/>. |
| 19 | 19 | # |
| 20 | 20 | # ========================================================================== |
| 21 | +from __future__ import print_function | |
| 21 | 22 | import os |
| 22 | 23 | import sys |
| 23 | -import glob | |
| 24 | -import commands | |
| 25 | 24 | import fileinput |
| 26 | 25 | from datetime import date |
| 26 | +from builtins import input | |
| 27 | 27 | import gammalib |
| 28 | 28 | |
| 29 | 29 | |
| ... | ... | @@ -47,7 +47,7 @@ def confirm(text): |
| 47 | 47 | # Confirmation loop |
| 48 | 48 | waiting = True |
| 49 | 49 | while waiting: |
| 50 | - confirmation = str(raw_input(text+' (y/n): ')) | |
| 50 | + confirmation = str(input(text+' (y/n): ')) | |
| 51 | 51 | if confirmation == 'q': |
| 52 | 52 | sys.exit() |
| 53 | 53 | elif confirmation == 'y': |
| ... | ... | @@ -87,7 +87,7 @@ def response(text, confirm_response=False): |
| 87 | 87 | # Get response from input |
| 88 | 88 | waiting = True |
| 89 | 89 | while waiting: |
| 90 | - response = str(raw_input('%s: ' % text)) | |
| 90 | + response = str(input('%s: ' % text)) | |
| 91 | 91 | if response == 'q': |
| 92 | 92 | sys.exit() |
| 93 | 93 | else: |
| ... | ... | @@ -275,13 +275,13 @@ def add_ctool(name, tokens, baseclass): |
| 275 | 275 | if 'libctools_la_LIBADD' in line.replace(' ', ''): |
| 276 | 276 | last = line[-2] |
| 277 | 277 | line = line.replace(line, line+insertline2+last+'\n') |
| 278 | - print line, | |
| 278 | + print(line,end=''), | |
| 279 | 279 | |
| 280 | 280 | # Update Python module |
| 281 | 281 | for line in fileinput.FileInput('pyext/ctools/tools.i',inplace=1): |
| 282 | 282 | if '%include "ctbin.i"' in line: |
| 283 | 283 | print('%%include "%s.i"' % (name)) |
| 284 | - print line, | |
| 284 | + print(line,end=''), | |
| 285 | 285 | |
| 286 | 286 | # Update unit test |
| 287 | 287 | for line in fileinput.FileInput('test/test_python_ctools.py',inplace=1): |
| ... | ... | @@ -289,25 +289,25 @@ def add_ctool(name, tokens, baseclass): |
| 289 | 289 | print('import test_%s' % (name)) |
| 290 | 290 | elif 'test_ctbin.Test()' in line: |
| 291 | 291 | print(' test_%s.Test(),' % (name)) |
| 292 | - print line, | |
| 292 | + print(line,end=''), | |
| 293 | 293 | |
| 294 | 294 | # Update export of unit test |
| 295 | 295 | for line in fileinput.FileInput('pyext/Makefile.am',inplace=1): |
| 296 | 296 | if '$(top_srcdir)/test/test_ctbin.py' in line: |
| 297 | 297 | print(' $(top_srcdir)/test/test_%s.py \\' % (name)) |
| 298 | - print line, | |
| 298 | + print(line,end=''), | |
| 299 | 299 | |
| 300 | 300 | # Update configure.ac |
| 301 | 301 | for line in fileinput.FileInput('configure.ac',inplace=1): |
| 302 | 302 | if 'src/ctbin/Makefile' in line: |
| 303 | 303 | print(' src/%s/Makefile' % (name)) |
| 304 | - print line, | |
| 304 | + print(line,end=''), | |
| 305 | 305 | |
| 306 | 306 | # Update reference manual index file |
| 307 | 307 | for line in fileinput.FileInput('doc/source/users/reference_manual/index.rst',inplace=1): |
| 308 | 308 | if 'ctbin --- Generates counts cube <ctbin>' in line: |
| 309 | 309 | print(' %s --- ToDo: Describe what tool is doing <%s>' % (name, name)) |
| 310 | - print line, | |
| 310 | + print(line,end=''), | |
| 311 | 311 | |
| 312 | 312 | # Return |
| 313 | 313 | return |
| ... | ... | @@ -356,7 +356,7 @@ def add_cscript(name, tokens, baseclass): |
| 356 | 356 | print(' "%s",' % (name)) |
| 357 | 357 | elif 'from cscripts.csworkflow import csworkflow' in line: |
| 358 | 358 | print('from cscripts.%s import %s' % (name, name)) |
| 359 | - print line, | |
| 359 | + print(line,end=''), | |
| 360 | 360 | |
| 361 | 361 | # Update cscripts/Makefile.am file |
| 362 | 362 | for line in fileinput.FileInput('cscripts/Makefile.am',inplace=1): |
| ... | ... | @@ -368,7 +368,7 @@ def add_cscript(name, tokens, baseclass): |
| 368 | 368 | print(' %s \\' % (name)) |
| 369 | 369 | elif '$(top_srcdir)/test/test_csworkflow.py' in line: |
| 370 | 370 | print(' $(top_srcdir)/test/test_%s.py \\' % (name)) |
| 371 | - print line, | |
| 371 | + print(line,end=''), | |
| 372 | 372 | |
| 373 | 373 | # Update test/test_python_cscripts.py file |
| 374 | 374 | for line in fileinput.FileInput('test/test_python_cscripts.py',inplace=1): |
| ... | ... | @@ -376,13 +376,13 @@ def add_cscript(name, tokens, baseclass): |
| 376 | 376 | print('import test_%s' % (name)) |
| 377 | 377 | elif 'test_csworkflow.Test()' in line: |
| 378 | 378 | print(' test_%s.Test(),' % (name)) |
| 379 | - print line, | |
| 379 | + print(line,end=''), | |
| 380 | 380 | |
| 381 | 381 | # Update reference manual index file |
| 382 | 382 | for line in fileinput.FileInput('doc/source/users/reference_manual/index.rst',inplace=1): |
| 383 | 383 | if 'csbkgmodel --- Generates background model for 3D analysis <csbkgmodel>' in line: |
| 384 | 384 | print(' %s --- ToDo: Describe what script is doing <%s>' % (name, name)) |
| 385 | - print line, | |
| 385 | + print(line,end=''), | |
| 386 | 386 | |
| 387 | 387 | # Return |
| 388 | 388 | return |
| ... | ... | @@ -414,7 +414,7 @@ def ctool_menu(): |
| 414 | 414 | waiting = True |
| 415 | 415 | choice = 1 |
| 416 | 416 | while waiting: |
| 417 | - choice = str(raw_input('Enter your choice: ')) | |
| 417 | + choice = str(input('Enter your choice: ')) | |
| 418 | 418 | if choice == '1' or choice == '2' or choice == '3': |
| 419 | 419 | waiting = False |
| 420 | 420 | if choice == '1': |
| ... | ... | @@ -480,7 +480,7 @@ def cscript_menu(): |
| 480 | 480 | waiting = True |
| 481 | 481 | choice = 1 |
| 482 | 482 | while waiting: |
| 483 | - choice = str(raw_input('Enter your choice: ')) | |
| 483 | + choice = str(input('Enter your choice: ')) | |
| 484 | 484 | if choice == '1' or choice == '2' or choice == '3': |
| 485 | 485 | waiting = False |
| 486 | 486 | if choice == '1': |
| ... | ... | @@ -535,7 +535,7 @@ def main_menu(): |
| 535 | 535 | # Wait for the input |
| 536 | 536 | waiting = True |
| 537 | 537 | while waiting: |
| 538 | - choice = str(raw_input('Enter your choice: ')) | |
| 538 | + choice = str(input('Enter your choice: ')) | |
| 539 | 539 | if choice == '1' or choice == '2' or choice == 'q': |
| 540 | 540 | waiting = False |
| 541 | 541 | ... | ... |
doc/source/conf.py
| ... | ... | @@ -38,6 +38,8 @@ except: |
| 38 | 38 | try: |
| 39 | 39 | import nbsphinx |
| 40 | 40 | extensions += ['nbsphinx','IPython.sphinxext.ipython_console_highlighting'] |
| 41 | + # Disable execution of notebooks at make doc step | |
| 42 | + nbsphinx_execute = 'never' | |
| 41 | 43 | except: |
| 42 | 44 | print('WARNING: Python package `nbsphinx` not found.\n' |
| 43 | 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 | 62 | Instrumental response function. |
| 63 | 63 | |
| 64 | 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 | 71 | ``(edisp = no) [boolean]`` |
| 70 | 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 | 25 | the ``maxoffset`` parameter. If less than ``bkgregmin`` reflected regions can be |
| 26 | 26 | found because the offset angle between source and pointing direction is too small, |
| 27 | 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 | 36 | Alternatively, if ``bkgmethod=CUSTOM`` is specified, the source and background |
| 33 | 37 | regions will be specified using the ``srcregfile`` and ``bkgregfile`` parameters, |
| ... | ... | @@ -84,8 +88,11 @@ General parameters |
| 84 | 88 | Instrument response function. |
| 85 | 89 | |
| 86 | 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 | 97 | ``outobs [file]`` |
| 91 | 98 | Output observation definition XML file. |
| ... | ... | @@ -240,4 +247,7 @@ Standard parameters |
| 240 | 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 | 59 | Instrumental response function. |
| 60 | 60 | |
| 61 | 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 | 68 | ``(edisp = no) [boolean]`` |
| 67 | 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 | 61 | csresmap --- Generates residual map <csresmap> |
| 62 | 62 | csresspec --- Generates residual spectrum <csresspec> |
| 63 | 63 | csroot2caldb --- Creates a caldb entry from a ROOT file <csroot2caldb> |
| 64 | + csscs --- Performs spectral component separation <csscs> | |
| 64 | 65 | cssens --- Computes CTA sensitivity <cssens> |
| 65 | 66 | csspec --- Computes spectral points <csspec> |
| 66 | 67 | cssrcdetect --- Detects sources in sky map <cssrcdetect> |
| ... | ... | @@ -87,3 +88,4 @@ Scripts to manage an IACT database |
| 87 | 88 | csiactobs --- Generates observation definition file for IACT data from observation IDs <csiactobs> |
| 88 | 89 | csfindobs --- Generates a list of IACT observation IDs <csfindobs> |
| 89 | 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
doc/source/users/tutorials/notebooks.rst
| ... | ... | @@ -21,10 +21,10 @@ this page. |
| 21 | 21 | * :download:`How to handle models from Python? <howto/howto_model_handling_python.ipynb>` |
| 22 | 22 | * :download:`How to do advanced model manipulation and fitting in Python? <howto/howto_advanced_python_fitting.ipynb>` |
| 23 | 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 | 25 | * :download:`Data preparation for 1DC How-to <howto/howto_prepare_1dc.ipynb>` |
| 25 | 26 | * :download:`Selecting events for H.E.S.S. public data <hess_dr1/selecting_events.ipynb>` |
| 26 | 27 | * :download:`Generating a sky map and finding sources for H.E.S.S. public data <hess_dr1/skymap.ipynb>` |
| 27 | 28 | * :download:`Generating a background model from H.E.S.S. public data <hess_dr1/bkgmodel.ipynb>` |
| 28 | 29 | * :download:`Performing an unbinned analysis of H.E.S.S. public data <hess_dr1/unbinned.ipynb>` |
| 29 | 30 | * :download:`Classical analysis of H.E.S.S. public data <hess_dr1/classical.ipynb>` |
| 30 | - | ... | ... |
models/Makefile.am
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 | 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 | 24 | import os |
| 22 | 25 | import sys |
| 23 | -import gammalib | |
| 24 | -import cscripts | |
| 26 | + | |
| 25 | 27 | sys.path.append(os.path.dirname(os.path.abspath(__file__))) |
| 28 | + | |
| 26 | 29 | import test_cscript |
| 27 | 30 | import test_cscaldb |
| 28 | 31 | import test_csbkgmodel |
| ... | ... | @@ -51,6 +54,7 @@ import test_cstsdist |
| 51 | 54 | import test_cstsmapmerge |
| 52 | 55 | import test_cstsmapsplit |
| 53 | 56 | import test_csviscube |
| 57 | +import test_csscs | |
| 54 | 58 | import test_csworkflow |
| 55 | 59 | import test_obsutils |
| 56 | 60 | import test_mputils |
| ... | ... | @@ -60,8 +64,11 @@ import test_csiactobs |
| 60 | 64 | |
| 61 | 65 | |
| 62 | 66 | # ================== # |
| 67 | + | |
| 63 | 68 | # Perform unit tests # |
| 69 | + | |
| 64 | 70 | # ================== # |
| 71 | + | |
| 65 | 72 | def test(installed=False, debug=False): |
| 66 | 73 | """ |
| 67 | 74 | Perform cscripts unit testing. |
| ... | ... | @@ -73,37 +80,34 @@ def test(installed=False, debug=False): |
| 73 | 80 | debug : bool, optional |
| 74 | 81 | Enables debugging |
| 75 | 82 | """ |
| 83 | + | |
| 76 | 84 | # If we have an installed version then create a temporary directory and |
| 77 | 85 | # copy over all information that is needed |
| 78 | 86 | if installed: |
| 79 | - | |
| 80 | 87 | # Create temporary working directory |
| 81 | 88 | import tempfile |
| 82 | 89 | path = tempfile.mkdtemp() |
| 83 | 90 | os.chdir(path) |
| 84 | - | |
| 85 | 91 | # Get test directory |
| 86 | 92 | import inspect |
| 87 | 93 | testdir = inspect.getfile(cscripts.tests) |
| 88 | 94 | dirname = os.path.dirname(testdir) |
| 89 | - | |
| 90 | 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 | 97 | # Set test data environment variable |
| 94 | 98 | os.environ['TEST_DATA'] = 'data' |
| 95 | - | |
| 96 | 99 | # ... otherwise set the calibration database to the one shipped with the |
| 97 | 100 | # package; we don't need to set the 'TEST_DATA', this is done by the |
| 98 | 101 | # test environment |
| 99 | 102 | else: |
| 100 | 103 | os.environ['CALDB'] = '%s/caldb' % (os.environ['TEST_SRCDIR']) |
| 101 | - | |
| 102 | 104 | # Create a local "pfiles" directory and set PFILES environment variable |
| 105 | + | |
| 103 | 106 | try: |
| 104 | 107 | os.mkdir('pfiles') |
| 105 | 108 | except: |
| 106 | 109 | pass |
| 110 | + | |
| 107 | 111 | os.environ['PFILES'] = 'pfiles' |
| 108 | 112 | |
| 109 | 113 | # Copy the cscripts parameter files into the "pfiles" directory. For a |
| ... | ... | @@ -111,8 +115,9 @@ def test(installed=False, debug=False): |
| 111 | 115 | # source directory into the "pfiles" directory, for an installed version |
| 112 | 116 | # we get all parameter files from the "syspfiles" directory. Also make |
| 113 | 117 | # sure that all parameter files are writable. |
| 118 | + | |
| 114 | 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 | 121 | os.system('chmod u+w pfiles/*') |
| 117 | 122 | else: |
| 118 | 123 | os.system('cp -r %s/syspfiles/*.par pfiles/' % (os.environ['CTOOLS'])) |
| ... | ... | @@ -146,6 +151,7 @@ def test(installed=False, debug=False): |
| 146 | 151 | test_cstsmapmerge.Test(), |
| 147 | 152 | test_cstsmapsplit.Test(), |
| 148 | 153 | test_csviscube.Test(), |
| 154 | + test_csscs.Test(), | |
| 149 | 155 | test_csworkflow.Test(), |
| 150 | 156 | test_obsutils.Test(), |
| 151 | 157 | test_mputils.Test()] |
| ... | ... | @@ -154,10 +160,8 @@ def test(installed=False, debug=False): |
| 154 | 160 | # module which is only available since Python 2.6+) |
| 155 | 161 | ver = sys.version.split()[0] |
| 156 | 162 | if ver >= '2.6.0': |
| 157 | - | |
| 158 | 163 | # Check for VHEFITS environment variable |
| 159 | 164 | if 'VHEFITS' in os.environ: |
| 160 | - | |
| 161 | 165 | # If the environment variable exists then unset it for the test |
| 162 | 166 | # cases. Since Python is executed in a subprocess this will not |
| 163 | 167 | # impact the environment variable in the parent shell. |
| ... | ... | @@ -203,9 +207,12 @@ def test(installed=False, debug=False): |
| 203 | 207 | |
| 204 | 208 | |
| 205 | 209 | # ======================== # |
| 210 | + | |
| 206 | 211 | # Main routine entry point # |
| 212 | + | |
| 207 | 213 | # ======================== # |
| 208 | -if __name__ == '__main__': | |
| 209 | 214 | |
| 215 | +if __name__ == '__main__': | |
| 210 | 216 | # Run tests |
| 217 | + | |
| 211 | 218 | test() | ... | ... |