Commit 3c523aecad437f4c8dd4ac4efe6d736d64047dce

Authored by Jürgen Knödlseder
1 parent 28c54e74

Add comobsconv script (#4159)

.gitignore
... ... @@ -88,6 +88,7 @@ test/csroot2caldb_*
88 88 test/csiactcopy_*
89 89 test/comobsbin_*
90 90 test/comobsback_*
  91 +test/comobsconv_*
91 92 test/comobsadd_*
92 93 test/comobssim_*
93 94 test/comlixfit_*
... ...
ChangeLog
1   -2022-11-09
  1 +2022-11-18
2 2  
3 3 * Version 2.1.0 released
4 4 ========================
5 5  
  6 + Add comobsconv script (#4159)
6 7 Optionally write fitted null hypothesis model in cttsmap
7 8 Avoid NaN in ctbutterfly (#4069)
8 9  
... ...
1 1 New Features and Important Changes in ctools 2.1.0
2 2  
3   -9 November 2022
  3 +18 November 2022
4 4  
5 5  
6 6 Introduction
... ... @@ -349,6 +349,11 @@ comobsbin - Bin COMPTEL observations
349 349 None
350 350  
351 351  
  352 +comobsconv - Convolve models with COMPTEL response
  353 +--------------------------------------------------
  354 +New script that convolves celestial model with the COMPTEL response (#4159).
  355 +
  356 +
352 357 comobsmodel - Generate model for binned COMPTEL observations
353 358 ------------------------------------------------------------
354 359 None
... ...
README.md
1 1 ctools information
2 2 ==================
3   -* Version: 2.1.0.dev (9 November 2022)
  3 +* Version: 2.1.0.dev (18 November 2022)
4 4 * GammaLib dependency: 2.1.0.dev
5 5  
6 6 [![Build Status](https://cta-jenkins.irap.omp.eu/buildStatus/icon?job=ctools-integrate-os)](https://cta-jenkins.irap.omp.eu/job/ctools-integrate-os/)
... ...
doc/source/admin/release_history/2.1.rst
... ... @@ -16,6 +16,9 @@ In particular, this release provides:
16 16 Bug fixes
17 17 ---------
18 18  
  19 +* [`4159 <https://cta-redmine.irap.omp.eu/issues/4159>`_] -
  20 + Add :ref:`comobsconv` script
  21 +* Optionally write fitted null hypothesis model in cttsmap
19 22 * [`4096 <https://cta-redmine.irap.omp.eu/issues/4096>`_] -
20 23 Avoid Nan in :ref:`ctbutterfly`
21 24  
... ...
doc/source/users/reference_manual/comobsadd.rst
... ... @@ -93,3 +93,4 @@ Standard parameters
93 93 Related tools or scripts
94 94 ------------------------
95 95  
  96 +None
... ...
doc/source/users/reference_manual/comobsback.rst
... ... @@ -99,3 +99,4 @@ Standard parameters
99 99 Related tools or scripts
100 100 ------------------------
101 101  
  102 +None
... ...
doc/source/users/reference_manual/comobsbin.rst
... ... @@ -135,3 +135,4 @@ Standard parameters
135 135 Related tools or scripts
136 136 ------------------------
137 137  
  138 +None
... ...
doc/source/users/reference_manual/comobsconv.rst 0 → 100755
  1 +.. _comobsconv:
  2 +
  3 +comobsconv
  4 +==========
  5 +
  6 +Convolves models with COMPTEL reponse.
  7 +
  8 +
  9 +Synopsis
  10 +--------
  11 +
  12 +This script convolves celestial models of gamma-ray emission with the COMPTEL
  13 +response and stores the result in a FITS file. Only model component for which
  14 +all spatial parameters are fixed will be considered. The response will be
  15 +stored in FITS files using a compressed format that is also used internally by
  16 +the software to cache response computations. The convolved response information
  17 +is attached using a ``RSP`` tag to the output observation definition XML file
  18 +and will be automatically used for any further processing.
  19 +
  20 +The file names of the convolved response files will be constructed from the
  21 +background model file names by replacing the string ``drb`` with the string
  22 +specified using the hidden ``filetype`` parameter. The convolved response
  23 +files will be stored in the folder specified by the hidden ``outfolder``
  24 +parameter. Once written, a convolved response file will never be written again.
  25 +If a convolved response file should be rewritten, the ``filetype`` parameter
  26 +needs to modified so that a different filename will be used.
  27 +
  28 +
  29 +General parameters
  30 +------------------
  31 +
  32 +``inobs [file]``
  33 + Input observation definition XML file.
  34 +
  35 +``inmodel [file]``
  36 + Input model definition XML file.
  37 +
  38 +``(outfolder = dri) [string]``
  39 + Output folder for convolved response files.
  40 +
  41 +``outobs [file]``
  42 + Output observation definition XML file.
  43 +
  44 +``(filetype = rsp) [string]``
  45 + File type.
  46 +
  47 +
  48 +Standard parameters
  49 +-------------------
  50 +
  51 +``(chatter = 2) [integer]``
  52 + Verbosity of the executable:
  53 + ``chatter = 0``: no information will be logged
  54 +
  55 + ``chatter = 1``: only errors will be logged
  56 +
  57 + ``chatter = 2``: errors and actions will be logged
  58 +
  59 + ``chatter = 3``: report about the task execution
  60 +
  61 + ``chatter = 4``: detailed report about the task execution
  62 +
  63 +``(clobber = yes) [boolean]``
  64 + Specifies whether an existing energy boundaries output file should be overwritten.
  65 +
  66 +``(debug = no) [boolean]``
  67 + Enables debug mode. In debug mode the executable will dump any log file output to the console.
  68 +
  69 +``(mode = ql) [string]``
  70 + Mode of automatic parameters (default is ``ql``, i.e. "query and learn").
  71 +
  72 +``(logfile = comobsconv.log) [filename]``
  73 + Log filename.
  74 +
  75 +
  76 +Related tools or scripts
  77 +------------------------
  78 +
  79 +None
... ...
doc/source/users/reference_manual/comobsmodel.rst
... ... @@ -91,3 +91,4 @@ Standard parameters
91 91 Related tools or scripts
92 92 ------------------------
93 93  
  94 +None
... ...
doc/source/users/reference_manual/comobsres.rst
... ... @@ -90,3 +90,4 @@ Standard parameters
90 90 Related tools or scripts
91 91 ------------------------
92 92  
  93 +None
... ...
doc/source/users/reference_manual/comobsselect.rst
... ... @@ -91,3 +91,5 @@ Standard parameters
91 91 Related tools or scripts
92 92 ------------------------
93 93  
  94 +:ref:`comgendb`
  95 +
... ...
doc/source/users/reference_manual/comobssim.rst
... ... @@ -87,3 +87,4 @@ Standard parameters
87 87 Related tools or scripts
88 88 ------------------------
89 89  
  90 +None
... ...
doc/source/users/reference_manual/compulbin.rst
... ... @@ -103,3 +103,4 @@ Standard parameters
103 103 Related tools or scripts
104 104 ------------------------
105 105  
  106 +None
... ...
doc/source/users/reference_manual/comsrcdetect.rst
... ... @@ -68,3 +68,4 @@ Standard parameters
68 68 Related tools or scripts
69 69 ------------------------
70 70  
  71 +None
... ...
doc/source/users/reference_manual/index.rst
... ... @@ -104,6 +104,7 @@ COMPTEL analysis scripts
104 104 comobsadd --- Combine observations <comobsadd>
105 105 comobsback --- Generate background model for COMPTEL observations <comobsback>
106 106 comobsbin --- Bin COMPTEL observations <comobsbin>
  107 + comobsconv --- Convolve models with COMPTEL response <comobsconv>
107 108 comobsmodel --- Generate model for binned COMPTEL observations <comobsmodel>
108 109 comobsres --- Generate residuals of COMPTEL observations <comobsres>
109 110 comobsselect --- Select observations from COMPTEL database <comobsselect>
... ...
modules/comscripts/Makefile.am
... ... @@ -27,6 +27,7 @@ pythonscripts = $(top_builddir)/modules/comscripts/__init__.py \
27 27 $(srcdir)/comobsadd.py \
28 28 $(srcdir)/comobsback.py \
29 29 $(srcdir)/comobsbin.py \
  30 + $(srcdir)/comobsconv.py \
30 31 $(srcdir)/comobsmodel.py \
31 32 $(srcdir)/comobsres.py \
32 33 $(srcdir)/comobsselect.py \
... ... @@ -41,6 +42,7 @@ parfiles = $(srcdir)/comgendb.par \
41 42 $(srcdir)/comobsadd.par \
42 43 $(srcdir)/comobsback.par \
43 44 $(srcdir)/comobsbin.par \
  45 + $(srcdir)/comobsconv.par \
44 46 $(srcdir)/comobsmodel.par \
45 47 $(srcdir)/comobsres.par \
46 48 $(srcdir)/comobsselect.par \
... ... @@ -55,6 +57,7 @@ linkscripts = comgendb \
55 57 comobsadd \
56 58 comobsback \
57 59 comobsbin \
  60 + comobsconv \
58 61 comobsmodel \
59 62 comobsres \
60 63 comobsselect \
... ... @@ -71,6 +74,7 @@ testscripts = $(srcdir)/tests/__init__.py \
71 74 $(top_srcdir)/test/test_comobsadd.py \
72 75 $(top_srcdir)/test/test_comobsback.py \
73 76 $(top_srcdir)/test/test_comobsbin.py \
  77 + $(top_srcdir)/test/test_comobsconv.py \
74 78 $(top_srcdir)/test/test_comobsmodel.py \
75 79 $(top_srcdir)/test/test_comobsres.py \
76 80 $(top_srcdir)/test/test_comobsselect.py \
... ... @@ -82,6 +86,7 @@ testscripts = $(srcdir)/tests/__init__.py \
82 86 testdata = $(top_srcdir)/test/data/comptel/ebounds_std.fits.gz \
83 87 $(top_srcdir)/test/data/comptel/ebounds_std1.fits.gz \
84 88 $(top_srcdir)/test/data/comptel/models.xml \
  89 + $(top_srcdir)/test/data/comptel/models_fix.xml \
85 90 $(top_srcdir)/test/data/comptel/obs_binned.xml \
86 91 $(top_srcdir)/test/data/comptel/obs_binned1.xml \
87 92 $(top_srcdir)/test/data/comptel/obs_selected.xml \
... ...
modules/comscripts/__init__.py.in
... ... @@ -24,6 +24,7 @@ __all__ = [&#39;comgendb&#39;,
24 24 'comobsselect',
25 25 'comobsback',
26 26 'comobsbin',
  27 + 'comobsconv',
27 28 'comobsmodel',
28 29 'comobsres',
29 30 'comobssim',
... ... @@ -38,6 +39,7 @@ from comscripts.comobsadd import comobsadd
38 39 from comscripts.comobsselect import comobsselect
39 40 from comscripts.comobsback import comobsback
40 41 from comscripts.comobsbin import comobsbin
  42 +from comscripts.comobsconv import comobsconv
41 43 from comscripts.comobsmodel import comobsmodel
42 44 from comscripts.comobsres import comobsres
43 45 from comscripts.comobssim import comobssim
... ...
modules/comscripts/comobsconv.par 0 → 100644
  1 +#############################################################################
  2 +# #
  3 +# COMPTEL Science Analysis Tools #
  4 +# #
  5 +# ------------------------------------------------------------------------- #
  6 +# #
  7 +# File: comobsconv.par #
  8 +# #
  9 +# Author: Juergen Knoedlseder #
  10 +# Jurgen.Knodlseder@irap.omp.eu #
  11 +# IRAP #
  12 +# #
  13 +# Purpose: Parameter file for the comobsconv script #
  14 +# #
  15 +#############################################################################
  16 +#
  17 +# Input and output parameters
  18 +#============================
  19 +inobs, f, a, obs.xml,,, "Input observation definition file"
  20 +inmodel, f, a, models.xml,,, "Input model definition file"
  21 +outfolder, s, h, dri,,, "Output folder for convolved response files"
  22 +outobs, f, a, outobs,,, "Output observation definition file"
  23 +filetype, s, h, rsp,,, "File type"
  24 +
  25 +#
  26 +# Script parameters
  27 +#==================
  28 +
  29 +#
  30 +# Standard parameters
  31 +#====================
  32 +chatter, i, h, 2,0,4, "Chattiness of output"
  33 +clobber, b, h, yes,,, "Overwrite existing output files with new output files?"
  34 +debug, b, h, no,,, "Activate debugging mode?"
  35 +mode, s, h, ql,,, "Mode of automatic parameters"
  36 +logfile, f, h, comobsconv.log,,, "Log filename"
... ...
modules/comscripts/comobsconv.py 0 → 100755
  1 +#! /usr/bin/env python
  2 +# ==========================================================================
  3 +# Convolve models with response for COMPTEL observations
  4 +#
  5 +# Copyright (C) 2022 Juergen Knoedlseder
  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 sys
  22 +import glob
  23 +import os
  24 +import gammalib
  25 +import ctools
  26 +
  27 +
  28 +# ================ #
  29 +# comobsconv class #
  30 +# ================ #
  31 +class comobsconv(ctools.csobservation):
  32 + """
  33 + """
  34 + # Constructor
  35 + def __init__(self, *argv):
  36 + """
  37 + Constructor
  38 + """
  39 + # Initialise application by calling the base class constructor
  40 + self._init_csobservation(self.__class__.__name__, ctools.__version__, argv)
  41 +
  42 + # Return
  43 + return
  44 +
  45 + # Private methods
  46 + def _get_parameters(self):
  47 + """
  48 + Get parameters from parfile
  49 + """
  50 + # Set observation if not done before
  51 + if self.obs().is_empty():
  52 + self.obs().load(self['inobs'].filename())
  53 +
  54 + # Set models if we have none
  55 + if self.obs().models().is_empty():
  56 + self.obs().models(self['inmodel'].filename())
  57 +
  58 + # Query parameters
  59 + self['outfolder'].string()
  60 + self['filetype'].string()
  61 +
  62 + # Query ahead output model filename
  63 + if self._read_ahead():
  64 + self['outobs'].filename()
  65 +
  66 + # Write input parameters into logger
  67 + self._log_parameters(gammalib.TERSE)
  68 +
  69 + # Return
  70 + return
  71 +
  72 +
  73 + # Public methods
  74 + def process(self):
  75 + """
  76 + Process the script
  77 + """
  78 + # Get parameters
  79 + self._get_parameters()
  80 +
  81 + # Set parameters
  82 + outfolder = self['outfolder'].string()
  83 + filetype = self['filetype'].string()
  84 +
  85 + # Create cache file directory
  86 + try:
  87 + os.makedirs(gammalib.expand_env(outfolder))
  88 + except OSError:
  89 + pass
  90 +
  91 + # Write input observation container into logger
  92 + self._log_observations(gammalib.NORMAL, self.obs(), 'Input observation')
  93 +
  94 + # Write input models into logger
  95 + self._log_models(gammalib.VERBOSE, self.obs().models(), 'Input model')
  96 +
  97 + # Log header
  98 + self._log_header1(gammalib.NORMAL, 'Set response cache names')
  99 +
  100 + # Loop over all observations
  101 + for obs in self.obs():
  102 +
  103 + # Write header
  104 + self._log_header3(gammalib.NORMAL, self._get_obs_header(obs))
  105 +
  106 + # Get DRB name
  107 + drbname = obs.drbname().url()
  108 +
  109 + # Derive response cache name from DRB name
  110 + rspname = '%s/%s' % (outfolder, os.path.basename(drbname.replace('drb', filetype)))
  111 +
  112 + # Set response cache name
  113 + obs.rspname(rspname)
  114 +
  115 + # Log DRE and cache name
  116 + self._log_value(gammalib.NORMAL, 'DRB name', drbname)
  117 + self._log_value(gammalib.NORMAL, 'Response cache name', rspname)
  118 +
  119 + # Log header
  120 + self._log_header1(gammalib.NORMAL, 'Convolve models with response')
  121 +
  122 + # Compute response by calling evaluation method
  123 + self.obs().eval()
  124 +
  125 + # Return
  126 + return
  127 +
  128 + def save(self):
  129 + """
  130 + Save observation definition file
  131 + """
  132 + # Write header
  133 + self._log_header1(gammalib.TERSE, 'Save observations')
  134 +
  135 + # Get output filename
  136 + outobs = self['outobs'].filename()
  137 +
  138 + # If file exists and clobber flag is false then raise an exception
  139 + if outobs.exists() and not self['clobber'].boolean():
  140 + msg = ('Cannot save "'+outobs.url()+'": File already exists. '
  141 + 'Use parameter clobber=yes to allow overwriting of files.')
  142 + raise RuntimeError(msg)
  143 +
  144 + # Otherwise log filename and save file
  145 + else:
  146 +
  147 + # Save observation definition file
  148 + self.obs().save(outobs)
  149 + self._log_value(gammalib.NORMAL, 'Obs. definition XML file', outobs.url())
  150 +
  151 + # Return
  152 + return
  153 +
  154 +
  155 +# ======================== #
  156 +# Main routine entry point #
  157 +# ======================== #
  158 +if __name__ == '__main__':
  159 +
  160 + # Create instance of application
  161 + app = comobsconv(sys.argv)
  162 +
  163 + # Execute application
  164 + app.execute()
... ...
test/data/comptel/models_fix.xml 0 → 100644
  1 +<?xml version="1.0" encoding="UTF-8" standalone="no"?>
  2 +<source_library title="source library">
  3 + <source name="Crab" type="PointSource" tscalc="1">
  4 + <spectrum type="PowerLaw">
  5 + <parameter name="Prefactor" value="1" error="0" scale="0.002" min="5e-23" free="1" />
  6 + <parameter name="Index" value="1" error="-0" scale="-2" min="-5" max="5" free="1" />
  7 + <parameter name="PivotEnergy" value="1" scale="1" free="0" />
  8 + </spectrum>
  9 + <spatialModel type="PointSource">
  10 + <parameter name="RA" value="83.6331" error="0" scale="1" free="0" />
  11 + <parameter name="DEC" value="22.0145" error="0" scale="1" free="0" />
  12 + </spatialModel>
  13 + </source>
  14 + <source name="Background_vp0001_0_000750-001000keV" type="DRBPhibarNodes" instrument="COM" id="vp0001_0_000750-001000keV">
  15 + <node>
  16 + <parameter name="Phibar" value="15" scale="1" min="0" max="50" free="0" />
  17 + <parameter name="Normalization" value="1" error="0" scale="1" min="0" max="1000" free="1" />
  18 + </node>
  19 + <node>
  20 + <parameter name="Phibar" value="17" scale="1" min="0" max="50" free="0" />
  21 + <parameter name="Normalization" value="1" error="0" scale="1" min="0" max="1000" free="1" />
  22 + </node>
  23 + <node>
  24 + <parameter name="Phibar" value="19" scale="1" min="0" max="50" free="0" />
  25 + <parameter name="Normalization" value="1" error="0" scale="1" min="0" max="1000" free="1" />
  26 + </node>
  27 + <node>
  28 + <parameter name="Phibar" value="21" scale="1" min="0" max="50" free="0" />
  29 + <parameter name="Normalization" value="1" error="0" scale="1" min="0" max="1000" free="1" />
  30 + </node>
  31 + <node>
  32 + <parameter name="Phibar" value="23" scale="1" min="0" max="50" free="0" />
  33 + <parameter name="Normalization" value="1" error="0" scale="1" min="0" max="1000" free="1" />
  34 + </node>
  35 + <node>
  36 + <parameter name="Phibar" value="25" scale="1" min="0" max="50" free="0" />
  37 + <parameter name="Normalization" value="1" error="0" scale="1" min="0" max="1000" free="1" />
  38 + </node>
  39 + <node>
  40 + <parameter name="Phibar" value="27" scale="1" min="0" max="50" free="0" />
  41 + <parameter name="Normalization" value="1" error="0" scale="1" min="0" max="1000" free="1" />
  42 + </node>
  43 + <node>
  44 + <parameter name="Phibar" value="29" scale="1" min="0" max="50" free="0" />
  45 + <parameter name="Normalization" value="1" error="0" scale="1" min="0" max="1000" free="1" />
  46 + </node>
  47 + <node>
  48 + <parameter name="Phibar" value="31" scale="1" min="0" max="50" free="0" />
  49 + <parameter name="Normalization" value="1" error="0" scale="1" min="0" max="1000" free="1" />
  50 + </node>
  51 + <node>
  52 + <parameter name="Phibar" value="33" scale="1" min="0" max="50" free="0" />
  53 + <parameter name="Normalization" value="1" error="0" scale="1" min="0" max="1000" free="1" />
  54 + </node>
  55 + <node>
  56 + <parameter name="Phibar" value="35" scale="1" min="0" max="50" free="0" />
  57 + <parameter name="Normalization" value="1" error="0" scale="1" min="0" max="1000" free="1" />
  58 + </node>
  59 + <node>
  60 + <parameter name="Phibar" value="37" scale="1" min="0" max="50" free="0" />
  61 + <parameter name="Normalization" value="1" error="0" scale="1" min="0" max="1000" free="1" />
  62 + </node>
  63 + <node>
  64 + <parameter name="Phibar" value="39" scale="1" min="0" max="50" free="0" />
  65 + <parameter name="Normalization" value="1" error="0" scale="1" min="0" max="1000" free="1" />
  66 + </node>
  67 + <node>
  68 + <parameter name="Phibar" value="41" scale="1" min="0" max="50" free="0" />
  69 + <parameter name="Normalization" value="1" error="0" scale="1" min="0" max="1000" free="1" />
  70 + </node>
  71 + <node>
  72 + <parameter name="Phibar" value="43" scale="1" min="0" max="50" free="0" />
  73 + <parameter name="Normalization" value="1" error="0" scale="1" min="0" max="1000" free="1" />
  74 + </node>
  75 + </source>
  76 + <source name="Background_vp0001_0_001000-003000keV" type="DRBPhibarNodes" instrument="COM" id="vp0001_0_001000-003000keV">
  77 + <node>
  78 + <parameter name="Phibar" value="5" scale="1" min="0" max="50" free="0" />
  79 + <parameter name="Normalization" value="1" error="0" scale="1" min="0" max="1000" free="1" />
  80 + </node>
  81 + <node>
  82 + <parameter name="Phibar" value="7" scale="1" min="0" max="50" free="0" />
  83 + <parameter name="Normalization" value="1" error="0" scale="1" min="0" max="1000" free="1" />
  84 + </node>
  85 + <node>
  86 + <parameter name="Phibar" value="9" scale="1" min="0" max="50" free="0" />
  87 + <parameter name="Normalization" value="1" error="0" scale="1" min="0" max="1000" free="1" />
  88 + </node>
  89 + <node>
  90 + <parameter name="Phibar" value="11" scale="1" min="0" max="50" free="0" />
  91 + <parameter name="Normalization" value="1" error="0" scale="1" min="0" max="1000" free="1" />
  92 + </node>
  93 + <node>
  94 + <parameter name="Phibar" value="13" scale="1" min="0" max="50" free="0" />
  95 + <parameter name="Normalization" value="1" error="0" scale="1" min="0" max="1000" free="1" />
  96 + </node>
  97 + <node>
  98 + <parameter name="Phibar" value="15" scale="1" min="0" max="50" free="0" />
  99 + <parameter name="Normalization" value="1" error="0" scale="1" min="0" max="1000" free="1" />
  100 + </node>
  101 + <node>
  102 + <parameter name="Phibar" value="17" scale="1" min="0" max="50" free="0" />
  103 + <parameter name="Normalization" value="1" error="0" scale="1" min="0" max="1000" free="1" />
  104 + </node>
  105 + <node>
  106 + <parameter name="Phibar" value="19" scale="1" min="0" max="50" free="0" />
  107 + <parameter name="Normalization" value="1" error="0" scale="1" min="0" max="1000" free="1" />
  108 + </node>
  109 + <node>
  110 + <parameter name="Phibar" value="21" scale="1" min="0" max="50" free="0" />
  111 + <parameter name="Normalization" value="1" error="0" scale="1" min="0" max="1000" free="1" />
  112 + </node>
  113 + <node>
  114 + <parameter name="Phibar" value="23" scale="1" min="0" max="50" free="0" />
  115 + <parameter name="Normalization" value="1" error="0" scale="1" min="0" max="1000" free="1" />
  116 + </node>
  117 + <node>
  118 + <parameter name="Phibar" value="25" scale="1" min="0" max="50" free="0" />
  119 + <parameter name="Normalization" value="1" error="0" scale="1" min="0" max="1000" free="1" />
  120 + </node>
  121 + <node>
  122 + <parameter name="Phibar" value="27" scale="1" min="0" max="50" free="0" />
  123 + <parameter name="Normalization" value="1" error="0" scale="1" min="0" max="1000" free="1" />
  124 + </node>
  125 + <node>
  126 + <parameter name="Phibar" value="29" scale="1" min="0" max="50" free="0" />
  127 + <parameter name="Normalization" value="1" error="0" scale="1" min="0" max="1000" free="1" />
  128 + </node>
  129 + <node>
  130 + <parameter name="Phibar" value="31" scale="1" min="0" max="50" free="0" />
  131 + <parameter name="Normalization" value="1" error="0" scale="1" min="0" max="1000" free="1" />
  132 + </node>
  133 + <node>
  134 + <parameter name="Phibar" value="33" scale="1" min="0" max="50" free="0" />
  135 + <parameter name="Normalization" value="1" error="0" scale="1" min="0" max="1000" free="1" />
  136 + </node>
  137 + <node>
  138 + <parameter name="Phibar" value="35" scale="1" min="0" max="50" free="0" />
  139 + <parameter name="Normalization" value="1" error="0" scale="1" min="0" max="1000" free="1" />
  140 + </node>
  141 + <node>
  142 + <parameter name="Phibar" value="37" scale="1" min="0" max="50" free="0" />
  143 + <parameter name="Normalization" value="1" error="0" scale="1" min="0" max="1000" free="1" />
  144 + </node>
  145 + <node>
  146 + <parameter name="Phibar" value="39" scale="1" min="0" max="50" free="0" />
  147 + <parameter name="Normalization" value="1" error="0" scale="1" min="0" max="1000" free="1" />
  148 + </node>
  149 + <node>
  150 + <parameter name="Phibar" value="41" scale="1" min="0" max="50" free="0" />
  151 + <parameter name="Normalization" value="1" error="0" scale="1" min="0" max="1000" free="1" />
  152 + </node>
  153 + <node>
  154 + <parameter name="Phibar" value="43" scale="1" min="0" max="50" free="0" />
  155 + <parameter name="Normalization" value="1" error="0" scale="1" min="0" max="1000" free="1" />
  156 + </node>
  157 + <node>
  158 + <parameter name="Phibar" value="45" scale="1" min="0" max="50" free="0" />
  159 + <parameter name="Normalization" value="1" error="0" scale="1" min="0" max="1000" free="1" />
  160 + </node>
  161 + <node>
  162 + <parameter name="Phibar" value="47" scale="1" min="0" max="50" free="0" />
  163 + <parameter name="Normalization" value="1" error="0" scale="1" min="0" max="1000" free="1" />
  164 + </node>
  165 + <node>
  166 + <parameter name="Phibar" value="49" scale="1" min="0" max="50" free="0" />
  167 + <parameter name="Normalization" value="1" error="0" scale="1" min="0" max="1000" free="1" />
  168 + </node>
  169 + </source>
  170 + <source name="Background_vp0001_0_003000-010000keV" type="DRBPhibarNodes" instrument="COM" id="vp0001_0_003000-010000keV">
  171 + <node>
  172 + <parameter name="Phibar" value="1" scale="1" min="0" max="50" free="0" />
  173 + <parameter name="Normalization" value="1" error="0" scale="1" min="0" max="1000" free="1" />
  174 + </node>
  175 + <node>
  176 + <parameter name="Phibar" value="3" scale="1" min="0" max="50" free="0" />
  177 + <parameter name="Normalization" value="1" error="0" scale="1" min="0" max="1000" free="1" />
  178 + </node>
  179 + <node>
  180 + <parameter name="Phibar" value="5" scale="1" min="0" max="50" free="0" />
  181 + <parameter name="Normalization" value="1" error="0" scale="1" min="0" max="1000" free="1" />
  182 + </node>
  183 + <node>
  184 + <parameter name="Phibar" value="7" scale="1" min="0" max="50" free="0" />
  185 + <parameter name="Normalization" value="1" error="0" scale="1" min="0" max="1000" free="1" />
  186 + </node>
  187 + <node>
  188 + <parameter name="Phibar" value="9" scale="1" min="0" max="50" free="0" />
  189 + <parameter name="Normalization" value="1" error="0" scale="1" min="0" max="1000" free="1" />
  190 + </node>
  191 + <node>
  192 + <parameter name="Phibar" value="11" scale="1" min="0" max="50" free="0" />
  193 + <parameter name="Normalization" value="1" error="0" scale="1" min="0" max="1000" free="1" />
  194 + </node>
  195 + <node>
  196 + <parameter name="Phibar" value="13" scale="1" min="0" max="50" free="0" />
  197 + <parameter name="Normalization" value="1" error="0" scale="1" min="0" max="1000" free="1" />
  198 + </node>
  199 + <node>
  200 + <parameter name="Phibar" value="15" scale="1" min="0" max="50" free="0" />
  201 + <parameter name="Normalization" value="1" error="0" scale="1" min="0" max="1000" free="1" />
  202 + </node>
  203 + <node>
  204 + <parameter name="Phibar" value="17" scale="1" min="0" max="50" free="0" />
  205 + <parameter name="Normalization" value="1" error="0" scale="1" min="0" max="1000" free="1" />
  206 + </node>
  207 + <node>
  208 + <parameter name="Phibar" value="19" scale="1" min="0" max="50" free="0" />
  209 + <parameter name="Normalization" value="1" error="0" scale="1" min="0" max="1000" free="1" />
  210 + </node>
  211 + <node>
  212 + <parameter name="Phibar" value="21" scale="1" min="0" max="50" free="0" />
  213 + <parameter name="Normalization" value="1" error="0" scale="1" min="0" max="1000" free="1" />
  214 + </node>
  215 + <node>
  216 + <parameter name="Phibar" value="23" scale="1" min="0" max="50" free="0" />
  217 + <parameter name="Normalization" value="1" error="0" scale="1" min="0" max="1000" free="1" />
  218 + </node>
  219 + <node>
  220 + <parameter name="Phibar" value="25" scale="1" min="0" max="50" free="0" />
  221 + <parameter name="Normalization" value="1" error="0" scale="1" min="0" max="1000" free="1" />
  222 + </node>
  223 + <node>
  224 + <parameter name="Phibar" value="27" scale="1" min="0" max="50" free="0" />
  225 + <parameter name="Normalization" value="1" error="0" scale="1" min="0" max="1000" free="1" />
  226 + </node>
  227 + <node>
  228 + <parameter name="Phibar" value="29" scale="1" min="0" max="50" free="0" />
  229 + <parameter name="Normalization" value="1" error="0" scale="1" min="0" max="1000" free="1" />
  230 + </node>
  231 + <node>
  232 + <parameter name="Phibar" value="31" scale="1" min="0" max="50" free="0" />
  233 + <parameter name="Normalization" value="1" error="0" scale="1" min="0" max="1000" free="1" />
  234 + </node>
  235 + <node>
  236 + <parameter name="Phibar" value="33" scale="1" min="0" max="50" free="0" />
  237 + <parameter name="Normalization" value="1" error="0" scale="1" min="0" max="1000" free="1" />
  238 + </node>
  239 + <node>
  240 + <parameter name="Phibar" value="35" scale="1" min="0" max="50" free="0" />
  241 + <parameter name="Normalization" value="1" error="0" scale="1" min="0" max="1000" free="1" />
  242 + </node>
  243 + <node>
  244 + <parameter name="Phibar" value="37" scale="1" min="0" max="50" free="0" />
  245 + <parameter name="Normalization" value="1" error="0" scale="1" min="0" max="1000" free="1" />
  246 + </node>
  247 + <node>
  248 + <parameter name="Phibar" value="39" scale="1" min="0" max="50" free="0" />
  249 + <parameter name="Normalization" value="1" error="0" scale="1" min="0" max="1000" free="1" />
  250 + </node>
  251 + <node>
  252 + <parameter name="Phibar" value="41" scale="1" min="0" max="50" free="0" />
  253 + <parameter name="Normalization" value="1" error="0" scale="1" min="0" max="1000" free="1" />
  254 + </node>
  255 + <node>
  256 + <parameter name="Phibar" value="43" scale="1" min="0" max="50" free="0" />
  257 + <parameter name="Normalization" value="1" error="0" scale="1" min="0" max="1000" free="1" />
  258 + </node>
  259 + <node>
  260 + <parameter name="Phibar" value="45" scale="1" min="0" max="50" free="0" />
  261 + <parameter name="Normalization" value="1" error="0" scale="1" min="0" max="1000" free="1" />
  262 + </node>
  263 + <node>
  264 + <parameter name="Phibar" value="47" scale="1" min="0" max="50" free="0" />
  265 + <parameter name="Normalization" value="1" error="0" scale="1" min="0" max="1000" free="1" />
  266 + </node>
  267 + <node>
  268 + <parameter name="Phibar" value="49" scale="1" min="0" max="50" free="0" />
  269 + <parameter name="Normalization" value="1" error="0" scale="1" min="0" max="1000" free="1" />
  270 + </node>
  271 + </source>
  272 + <source name="Background_vp0001_0_010000-030000keV" type="DRBPhibarNodes" instrument="COM" id="vp0001_0_010000-030000keV">
  273 + <node>
  274 + <parameter name="Phibar" value="1" scale="1" min="0" max="50" free="0" />
  275 + <parameter name="Normalization" value="1" error="0" scale="1" min="0" max="1000" free="1" />
  276 + </node>
  277 + <node>
  278 + <parameter name="Phibar" value="3" scale="1" min="0" max="50" free="0" />
  279 + <parameter name="Normalization" value="1" error="0" scale="1" min="0" max="1000" free="1" />
  280 + </node>
  281 + <node>
  282 + <parameter name="Phibar" value="5" scale="1" min="0" max="50" free="0" />
  283 + <parameter name="Normalization" value="1" error="0" scale="1" min="0" max="1000" free="1" />
  284 + </node>
  285 + <node>
  286 + <parameter name="Phibar" value="7" scale="1" min="0" max="50" free="0" />
  287 + <parameter name="Normalization" value="1" error="0" scale="1" min="0" max="1000" free="1" />
  288 + </node>
  289 + <node>
  290 + <parameter name="Phibar" value="9" scale="1" min="0" max="50" free="0" />
  291 + <parameter name="Normalization" value="1" error="0" scale="1" min="0" max="1000" free="1" />
  292 + </node>
  293 + <node>
  294 + <parameter name="Phibar" value="11" scale="1" min="0" max="50" free="0" />
  295 + <parameter name="Normalization" value="1" error="0" scale="1" min="0" max="1000" free="1" />
  296 + </node>
  297 + <node>
  298 + <parameter name="Phibar" value="13" scale="1" min="0" max="50" free="0" />
  299 + <parameter name="Normalization" value="1" error="0" scale="1" min="0" max="1000" free="1" />
  300 + </node>
  301 + <node>
  302 + <parameter name="Phibar" value="15" scale="1" min="0" max="50" free="0" />
  303 + <parameter name="Normalization" value="1" error="0" scale="1" min="0" max="1000" free="1" />
  304 + </node>
  305 + <node>
  306 + <parameter name="Phibar" value="17" scale="1" min="0" max="50" free="0" />
  307 + <parameter name="Normalization" value="1" error="0" scale="1" min="0" max="1000" free="1" />
  308 + </node>
  309 + <node>
  310 + <parameter name="Phibar" value="19" scale="1" min="0" max="50" free="0" />
  311 + <parameter name="Normalization" value="1" error="0" scale="1" min="0" max="1000" free="1" />
  312 + </node>
  313 + <node>
  314 + <parameter name="Phibar" value="21" scale="1" min="0" max="50" free="0" />
  315 + <parameter name="Normalization" value="1" error="0" scale="1" min="0" max="1000" free="1" />
  316 + </node>
  317 + <node>
  318 + <parameter name="Phibar" value="23" scale="1" min="0" max="50" free="0" />
  319 + <parameter name="Normalization" value="1" error="0" scale="1" min="0" max="1000" free="1" />
  320 + </node>
  321 + <node>
  322 + <parameter name="Phibar" value="25" scale="1" min="0" max="50" free="0" />
  323 + <parameter name="Normalization" value="1" error="0" scale="1" min="0" max="1000" free="1" />
  324 + </node>
  325 + <node>
  326 + <parameter name="Phibar" value="27" scale="1" min="0" max="50" free="0" />
  327 + <parameter name="Normalization" value="1" error="0" scale="1" min="0" max="1000" free="1" />
  328 + </node>
  329 + <node>
  330 + <parameter name="Phibar" value="29" scale="1" min="0" max="50" free="0" />
  331 + <parameter name="Normalization" value="1" error="0" scale="1" min="0" max="1000" free="1" />
  332 + </node>
  333 + <node>
  334 + <parameter name="Phibar" value="31" scale="1" min="0" max="50" free="0" />
  335 + <parameter name="Normalization" value="1" error="0" scale="1" min="0" max="1000" free="1" />
  336 + </node>
  337 + <node>
  338 + <parameter name="Phibar" value="33" scale="1" min="0" max="50" free="0" />
  339 + <parameter name="Normalization" value="1" error="0" scale="1" min="0" max="1000" free="1" />
  340 + </node>
  341 + <node>
  342 + <parameter name="Phibar" value="35" scale="1" min="0" max="50" free="0" />
  343 + <parameter name="Normalization" value="1" error="0" scale="1" min="0" max="1000" free="1" />
  344 + </node>
  345 + <node>
  346 + <parameter name="Phibar" value="37" scale="1" min="0" max="50" free="0" />
  347 + <parameter name="Normalization" value="1" error="0" scale="1" min="0" max="1000" free="1" />
  348 + </node>
  349 + <node>
  350 + <parameter name="Phibar" value="39" scale="1" min="0" max="50" free="0" />
  351 + <parameter name="Normalization" value="1" error="0" scale="1" min="0" max="1000" free="1" />
  352 + </node>
  353 + <node>
  354 + <parameter name="Phibar" value="41" scale="1" min="0" max="50" free="0" />
  355 + <parameter name="Normalization" value="1" error="0" scale="1" min="0" max="1000" free="1" />
  356 + </node>
  357 + <node>
  358 + <parameter name="Phibar" value="43" scale="1" min="0" max="50" free="0" />
  359 + <parameter name="Normalization" value="1" error="0" scale="1" min="0" max="1000" free="1" />
  360 + </node>
  361 + <node>
  362 + <parameter name="Phibar" value="45" scale="1" min="0" max="50" free="0" />
  363 + <parameter name="Normalization" value="1" error="0" scale="1" min="0" max="1000" free="1" />
  364 + </node>
  365 + <node>
  366 + <parameter name="Phibar" value="47" scale="1" min="0" max="50" free="0" />
  367 + <parameter name="Normalization" value="1" error="0" scale="1" min="0" max="1000" free="1" />
  368 + </node>
  369 + <node>
  370 + <parameter name="Phibar" value="49" scale="1" min="0" max="50" free="0" />
  371 + <parameter name="Normalization" value="1" error="0" scale="1" min="0" max="1000" free="1" />
  372 + </node>
  373 + </source>
  374 +</source_library>
... ...
test/test_comobsconv.py 0 → 100755
  1 +#! /usr/bin/env python
  2 +# ==========================================================================
  3 +# This scripts performs unit tests for the comobsconv script.
  4 +#
  5 +# Copyright (C) 2022 Juergen Knoedlseder
  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 os
  22 +import gammalib
  23 +import comscripts
  24 +from testing import test
  25 +
  26 +
  27 +# =============================== #
  28 +# Test class for comobsconv script #
  29 +# =============================== #
  30 +class Test(test):
  31 + """
  32 + Test class for comobsconv script
  33 +
  34 + This test class makes unit tests for the comobsconv script by using it
  35 + from 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._obs = self._datadir + '/comptel/obs_binned.xml'
  48 + self._model = self._datadir + '/comptel/models_fix.xml'
  49 +
  50 + # Delete datastores
  51 + os.system('rm -rf comobsconv_cmd1')
  52 + os.system('rm -rf comobsconv_cmd2')
  53 + os.system('rm -rf comobsconv_py1')
  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('comobsconv')
  65 +
  66 + # Append tests
  67 + self.append(self._test_cmd, 'Test comobsconv on command line')
  68 + self.append(self._test_python, 'Test comobsconv from Python')
  69 +
  70 + # Return
  71 + return
  72 +
  73 + # Test command line use
  74 + def _test_cmd(self):
  75 + """
  76 + Test command line use.
  77 + """
  78 + # Set script name
  79 + comobsconv = self._comscript('comobsconv')
  80 +
  81 + # Setup command
  82 + cmd = comobsconv+' inobs="'+self._obs+'" inmodel="'+self._model+'" '+ \
  83 + 'outfolder="comobsconv_cmd1" outobs="comobsconv_cmd1.xml" '+ \
  84 + 'logfile="comobsconv_cmd1.log" chatter=1'
  85 +
  86 + # Check if execution was successful
  87 + self.test_assert(self._execute(cmd) == 0,
  88 + 'Check successful execution from command line')
  89 +
  90 + # Check result
  91 + self._check_result('comobsconv_cmd1.xml', 'comobsconv_cmd1')
  92 +
  93 + # Setup command
  94 + cmd = comobsconv+' inobs="file_that_does_not_exist.xml" inmodel="'+self._model+'" '+ \
  95 + 'outfolder="comobsconv_cmd2" outobs="comobsconv_cmd2.xml" '+ \
  96 + 'logfile="comobsconv_cmd2.log" chatter=1'
  97 +
  98 + # Check if execution was successful
  99 + self.test_assert(self._execute(cmd, success=False) != 0,
  100 + 'Check invalid input file when executed from command line')
  101 +
  102 + # Check --help option
  103 + self._check_help(comobsconv)
  104 +
  105 + # Return
  106 + return
  107 +
  108 + # Test from Python
  109 + def _test_python(self):
  110 + """
  111 + Test from Python
  112 + """
  113 + # Set-up script
  114 + add = comscripts.comobsconv()
  115 + add['inobs'] = self._obs
  116 + add['inmodel'] = self._model
  117 + add['outfolder'] = 'comobsconv_py1'
  118 + add['outobs'] = 'comobsconv_py1.xml'
  119 + add['logfile'] = 'comobsconv_py1.log'
  120 + add['chatter'] = 2
  121 +
  122 + # Run script and save result
  123 + add.logFileOpen() # Make sure we get a log file
  124 + add.run()
  125 + add.save()
  126 +
  127 + # Check result
  128 + self._check_result('comobsconv_py1.xml', 'comobsconv_py1')
  129 +
  130 + # Return
  131 + return
  132 +
  133 + # Check result file
  134 + def _check_result(self, filename, foldername, nobs=4):
  135 + """
  136 + Check result file
  137 + """
  138 + # Load observation definition file
  139 + obs = gammalib.GObservations(filename)
  140 +
  141 + # Load models and extract Crab
  142 + models = gammalib.GModels(self._model)
  143 + crab = models['Crab']
  144 +
  145 + # Check that there is one observation
  146 + self.test_value(obs.size(), nobs, 'Check for %d observations' % nobs)
  147 +
  148 + # Check response
  149 + self.test_value(obs[0].npred(crab), 2166.4808609, 'Check number of counts in 0.75-1 MeV bin')
  150 + self.test_value(obs[1].npred(crab), 8775.9042976, 'Check number of counts in 1-3 MeV bin')
  151 + self.test_value(obs[2].npred(crab), 3388.0663193, 'Check number of counts in 3-10 MeV bin')
  152 + self.test_value(obs[3].npred(crab), 608.6723513, 'Check number of counts in 10-30 MeV bin')
  153 +
  154 + # Return
  155 + return
... ...
test/test_python_comscripts.py
... ... @@ -27,6 +27,7 @@ import test_comgendb
27 27 import test_comobsselect
28 28 import test_comobsbin
29 29 import test_comobsback
  30 +import test_comobsconv
30 31 import test_comobsmodel
31 32 import test_comobsadd
32 33 import test_comobsres
... ... @@ -106,6 +107,7 @@ def test(installed=False, debug=False):
106 107 test_comobsback.Test(),
107 108 test_comobsmodel.Test(),
108 109 test_comobsadd.Test(),
  110 + test_comobsconv.Test(),
109 111 test_comobsres.Test(),
110 112 test_comobssim.Test(),
111 113 test_comlixfit.Test(),
... ...