Commit 7ecbd97fa13ec983c088b1da51a2ea82b405131b

Authored by Jürgen Knödlseder
1 parent 3e80f463

Add How-to for joint analysis (#1868)

cscripts/csspec.py
@@ -2,7 +2,7 @@ @@ -2,7 +2,7 @@
2 # ========================================================================== 2 # ==========================================================================
3 # Generates a spectrum. 3 # Generates a spectrum.
4 # 4 #
5 -# Copyright (C) 2014-2017 Michael Mayer 5 +# Copyright (C) 2014-2018 Michael Mayer
6 # 6 #
7 # This program is free software: you can redistribute it and/or modify 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 8 # it under the terms of the GNU General Public License as published by
@@ -100,26 +100,29 @@ class csspec(ctools.csobservation): @@ -100,26 +100,29 @@ class csspec(ctools.csobservation):
100 n_other = self.obs().size() - n_cta 100 n_other = self.obs().size() - n_cta
101 101
102 # If spectrum method is not "NODES" then set spectrum method and 102 # If spectrum method is not "NODES" then set spectrum method and
103 - # script mode according to type of CTA observations 103 + # script mode according to type of observations
104 if self._method != 'NODES': 104 if self._method != 'NODES':
105 - if n_unbinned == 0 and n_binned != 0 and n_onoff == 0:  
106 - self._binned_mode = True  
107 - self._method = 'SLICE'  
108 - elif n_unbinned == 0 and n_binned == 0 and n_onoff != 0:  
109 - self._onoff_mode = True  
110 - self._method = 'SLICE'  
111 - elif n_unbinned == 0 and n_binned != 0 and n_onoff != 0:  
112 - msg = 'Mix of binned and On/Off CTA observations found in ' \  
113 - 'observation container. csscript does not support this ' \  
114 - 'mix.'  
115 - raise RuntimeError(msg)  
116 - elif n_unbinned != 0 and (n_binned != 0 or n_onoff != 0):  
117 - msg = 'Mix of unbinned and binned or On/Off CTA observations ' \  
118 - 'found in observation container. csscript does not support ' \  
119 - 'this mix.'  
120 - raise RuntimeError(msg)  
121 - elif n_unbinned != 0:  
122 - self._method = 'SLICE' 105 + if n_other > 0:
  106 + self._method = 'NODES'
  107 + else:
  108 + if n_unbinned == 0 and n_binned != 0 and n_onoff == 0:
  109 + self._binned_mode = True
  110 + self._method = 'SLICE'
  111 + elif n_unbinned == 0 and n_binned == 0 and n_onoff != 0:
  112 + self._onoff_mode = True
  113 + self._method = 'SLICE'
  114 + elif n_unbinned == 0 and n_binned != 0 and n_onoff != 0:
  115 + msg = 'Mix of binned and On/Off CTA observations found ' \
  116 + 'in observation container. csscript does not support ' \
  117 + 'this mix.'
  118 + raise RuntimeError(msg)
  119 + elif n_unbinned != 0 and (n_binned != 0 or n_onoff != 0):
  120 + msg = 'Mix of unbinned and binned or On/Off CTA observations ' \
  121 + 'found in observation container. csscript does not ' \
  122 + 'support this mix.'
  123 + raise RuntimeError(msg)
  124 + elif n_unbinned != 0:
  125 + self._method = 'SLICE'
123 126
124 # Set ebounds 127 # Set ebounds
125 self._set_ebounds() 128 self._set_ebounds()
@@ -148,10 +151,9 @@ class csspec(ctools.csobservation): @@ -148,10 +151,9 @@ class csspec(ctools.csobservation):
148 # If there are a mix of CTA and non-CTA observations and the method 151 # If there are a mix of CTA and non-CTA observations and the method
149 # is 'SLICE' then log a warning that non-CTA observations will be 152 # is 'SLICE' then log a warning that non-CTA observations will be
150 # ignored 153 # ignored
  154 + warning = False
151 if n_cta > 0 and n_other > 0 and self._method == 'SLICE': 155 if n_cta > 0 and n_other > 0 and self._method == 'SLICE':
152 - self._log_string(gammalib.TERSE, '\nWARNING: Only CTA observation '  
153 - 'can be handled with the "SLICE" method, all '  
154 - 'non-CTA observation will be ignored.') 156 + warning = True
155 157
156 # If there are only non-CTA observations and the method is 'SLICE' 158 # If there are only non-CTA observations and the method is 'SLICE'
157 # then stop now 159 # then stop now
@@ -167,6 +169,12 @@ class csspec(ctools.csobservation): @@ -167,6 +169,12 @@ class csspec(ctools.csobservation):
167 # Log selected spectrum method 169 # Log selected spectrum method
168 self._log_value(gammalib.TERSE, 'Selected spectrum method', self._method) 170 self._log_value(gammalib.TERSE, 'Selected spectrum method', self._method)
169 171
  172 + # Signal warning
  173 + if warning:
  174 + self._log_string(gammalib.TERSE, ' WARNING: Only CTA observation '
  175 + 'can be handled with the "SLICE" method, all '
  176 + 'non-CTA observation will be ignored.')
  177 +
170 # Return 178 # Return
171 return 179 return
172 180
doc/source/users/tutorials/howto/howto_combine_instruments.png 0 → 100644

29.8 KB

doc/source/users/tutorials/howto/howto_combine_instruments.rst 0 → 100644
  1 +.. _howto_combine_instrument:
  2 +
  3 +How to jointly analyse data from different instruments?
  4 +-------------------------------------------------------
  5 +
  6 + .. admonition:: What you will learn
  7 +
  8 + You will learn how to **jointly analyse data from different instruments**.
  9 +
  10 +In this tutorial you will learn how to jointly analyse data observed with
  11 +Fermi-LAT and simulated data for CTA for the Vela pulsar and pulsar wind
  12 +nebula.
  13 +
  14 +Prepare Fermi-LAT data
  15 +^^^^^^^^^^^^^^^^^^^^^^
  16 +
  17 +The preparation of Fermi-LAT data will follow the one
  18 +`described in this section <howto_fermi_prepare>`_.
  19 +
  20 +
  21 +Prepare CTA data
  22 +^^^^^^^^^^^^^^^^
  23 +
  24 +For CTA the simulations of the Galactic Plane Scan from the first Data Challenge
  25 +will be used, but if you do not have these data at hand you can create your own
  26 +simulated CTA dataset by
  27 +`following the description here <start_simulating>`_.
  28 +
  29 +First, bin the simulated data into a counts cube
  30 +
  31 +.. code-block:: bash
  32 +
  33 + $ ctbin
  34 + Input event list or observation definition XML file [events.fits] obs.xml
  35 + First coordinate of image center in degrees (RA or galactic l) (0-360) [83.63] 128.838
  36 + Second coordinate of image center in degrees (DEC or galactic b) (-90-90) [22.51] -45.178
  37 + Projection method (AIT|AZP|CAR|GLS|MER|MOL|SFL|SIN|STG|TAN) [CAR]
  38 + Coordinate system (CEL - celestial, GAL - galactic) (CEL|GAL) [CEL]
  39 + Image scale (in degrees/pixel) [0.02]
  40 + Size of the X axis in pixels [200]
  41 + Size of the Y axis in pixels [200]
  42 + Algorithm for defining energy bins (FILE|LIN|LOG) [LOG]
  43 + Lower energy limit (TeV) [0.1] 0.03
  44 + Upper energy limit (TeV) [100.0] 150.0
  45 + Number of energy bins (1-200) [20] 40
  46 + Output counts cube file [cntcube.fits]
  47 +
  48 +Then compute the response cubes as follows
  49 +
  50 +.. code-block:: bash
  51 +
  52 + $ ctexpcube
  53 + Input event list or observation definition XML file [NONE] obs.xml
  54 + Input counts cube file to extract exposure cube definition [NONE] cntcube.fits
  55 + Output exposure cube file [expcube.fits]
  56 +
  57 +.. code-block:: bash
  58 +
  59 + $ ctpsfcube
  60 + Input event list or observation definition XML file [NONE] obs.xml
  61 + Input counts cube file to extract PSF cube definition [NONE]
  62 + First coordinate of image center in degrees (RA or galactic l) (0-360) [83.63] 128.838
  63 + Second coordinate of image center in degrees (DEC or galactic b) (-90-90) [22.51] -45.178
  64 + Projection method (AIT|AZP|CAR|GLS|MER|MOL|SFL|SIN|STG|TAN) [CAR]
  65 + Coordinate system (CEL - celestial, GAL - galactic) (CEL|GAL) [CEL]
  66 + Image scale (in degrees/pixel) [1.0]
  67 + Size of the X axis in pixels [10]
  68 + Size of the Y axis in pixels [10]
  69 + Algorithm for defining energy bins (FILE|LIN|LOG) [LOG]
  70 + Lower energy limit (TeV) [0.1] 0.03
  71 + Upper energy limit (TeV) [100.0] 150.0
  72 + Number of energy bins (1-200) [20] 40
  73 + Output PSF cube file [psfcube.fits]
  74 +
  75 +.. code-block:: bash
  76 +
  77 + $ ctbkgcube
  78 + Input event list or observation definition XML file [NONE] obs.xml
  79 + Input counts cube file to extract background cube definition [NONE] cntcube.fits
  80 + Input model definition XML file [NONE] $CTOOLS/share/models/bkg_irf.xml
  81 + Output background cube file [bkgcube.fits]
  82 + Output model definition XML file [NONE] bkgcube.xml
  83 +
  84 +
  85 +Combining the observations
  86 +^^^^^^^^^^^^^^^^^^^^^^^^^^
  87 +
  88 +Now you have all the data and hand. You have to create an
  89 +:ref:`observation definition file <glossary_obsdef>`
  90 +to combine the data for an analysis:
  91 +
  92 +.. code-block:: xml
  93 +
  94 + <?xml version="1.0" standalone="no"?>
  95 + <observation_list title="observation library">
  96 + <observation name="Vela" id="000001" instrument="CTA">
  97 + <parameter name="CountsCube" file="cntcube.fits"/>
  98 + <parameter name="ExposureCube" file="expcube.fits"/>
  99 + <parameter name="PsfCube" file="psfcube.fits"/>
  100 + <parameter name="BkgCube" file="bkgcube.fits"/>
  101 + </observation>
  102 + <observation name="Vela" id="000001" instrument="LAT">
  103 + <parameter name="CountsMap" file="srcmaps.fits"/>
  104 + <parameter name="ExposureMap" file="expmap.fits"/>
  105 + <parameter name="LiveTimeCube" file="ltcube.fits"/>
  106 + <parameter name="IRF" value="P8R2_SOURCE_V6"/>
  107 + </observation>
  108 + </observation_list>
  109 +
  110 +The
  111 +:ref:`observation definition file <glossary_obsdef>`
  112 +contains two observations of the Vela pulsar, a first done with CTA and a
  113 +second done with Fermi-LAT. The ``instrument`` attribute distinguishes between
  114 +both instruments.
  115 +
  116 +
  117 +Generate a spectral energy distribution
  118 +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  119 +
  120 +Before being able to generate a spectral energy distribution (SED) you have
  121 +to define a
  122 +:ref:`model definition file <glossary_moddef>`
  123 +that will be used to model the events for both observations.
  124 +The model that will be used in this analysis is shown below:
  125 +
  126 +.. code-block:: xml
  127 +
  128 + <?xml version="1.0" standalone="no"?>
  129 + <source_library title="source library">
  130 + <source type="PointSource" name="Vela">
  131 + <spectrum type="PowerLaw">
  132 + <parameter name="Prefactor" scale="1e-16" value="5.7" min="1e-07" max="1000.0" free="1"/>
  133 + <parameter name="Index" scale="-1" value="2.48" min="0.0" max="+5.0" free="1"/>
  134 + <parameter name="PivotEnergy" scale="1e6" value="0.3" min="0.01" max="1000.0" free="0"/>
  135 + </spectrum>
  136 + <spatialModel type="PointSource">
  137 + <parameter name="RA" scale="1.0" value="128.84" min="-360" max="360" free="1"/>
  138 + <parameter name="DEC" scale="1.0" value="-45.18" min="-90" max="90" free="1"/>
  139 + </spatialModel>
  140 + </source>
  141 + <source type="DiffuseSource" name="Galactic_diffuse" instrument="LAT">
  142 + <spectrum type="Constant">
  143 + <parameter name="Normalization" scale="1.0" value="1.0" min="0.1" max="1000.0" free="1"/>
  144 + </spectrum>
  145 + <spatialModel type="DiffuseMapCube" file="gll_iem_v06.fits">
  146 + <parameter name="Normalization" scale="1.0" value="1.0" min="0.1" max="10.0" free="0"/>
  147 + </spatialModel>
  148 + </source>
  149 + <source type="DiffuseSource" name="Extragalactic_diffuse" instrument="LAT">
  150 + <spectrum type="FileFunction" file="iso_P8R2_SOURCE_V6_v06.txt">
  151 + <parameter name="Normalization" scale="1.0" value="1.0" min="0.0" max="1000.0" free="0"/>
  152 + </spectrum>
  153 + <spatialModel type="DiffuseIsotropic">
  154 + <parameter name="Value" scale="1.0" value="1.0" min="0.0" max="10.0" free="0"/>
  155 + </spatialModel>
  156 + </source>
  157 + <source name="Background" type="CTACubeBackground" instrument="CTA">
  158 + <spectrum type="PowerLaw">
  159 + <parameter name="Prefactor" scale="1.0" value="1.0" min="1e-3" max="1e+3" free="1"/>
  160 + <parameter name="Index" scale="1.0" value="0.0" min="-5.0" max="+5.0" free="1"/>
  161 + <parameter name="PivotEnergy" scale="1e6" value="1.0" min="0.01" max="1000.0" free="0"/>
  162 + </spectrum>
  163 + </source>
  164 + </source_library>
  165 +
  166 +The model contains a point source located at the position of the Vela pulsar
  167 +with a power law spectrum. In addition, it contains two ``DiffuseSource``
  168 +components that are only applied for Fermi-LAT observations, which is indicated
  169 +by their ``instrument="LAT"`` attribute. Both components model the diffuse
  170 +background that prevails at GeV energies. Finally, the model contains a
  171 +``CTACubeBackground`` component that applies to CTA. You may have noticed that
  172 +the point source is the only component that has no ``instrument`` attribute,
  173 +meaning that this component applies to both instruments.
  174 +
  175 +Now you are ready to generate the spectral energy distribution for the
  176 +combined data set. You do this using the :ref:`csspec` script as follows
  177 +
  178 +.. code-block:: bash
  179 +
  180 + $ csspec
  181 + Input event list, counts cube, or observation definition XML file [events.fits] obs.xml
  182 + Input model definition XML file [$CTOOLS/share/models/crab.xml] models.xml
  183 + Source name [Crab] Vela
  184 + Spectrum generation method (SLICE|NODES|AUTO) [AUTO]
  185 + Algorithm for defining energy bins (FILE|LIN|LOG) [LOG]
  186 + Start value for first energy bin in TeV [0.1] 0.0001
  187 + Stop value for last energy bin in TeV [100.0] 150.0
  188 + Number of energy bins (1-200) [20]
  189 + Output spectrum file [spectrum.fits]
  190 +
  191 +This will generate a logarithmically spaced spectrum composed of 20 energy bins
  192 +comprised within 100 MeV and 150 TeV. The :ref:`csspec` tool is run in the ``AUTO``
  193 +mode, which for different instruments corresponds to the ``NODES`` method.
  194 +The resulting spectral energy distribution is shown below:
  195 +
  196 +.. figure:: howto_combine_instruments.png
  197 + :width: 600px
  198 + :align: center
  199 +
  200 + *Vela spectrum derived using csspec from real Fermi-LAT and simulated CTA data*
  201 +
  202 +.. note::
  203 + The figure was created using the ``show_spectrum.py`` script that is
  204 + located in the ctools example folder. The example script requires the
  205 + `matplotlib <http://matplotlib.org>`_ Python module for display.
  206 + You may reproduce the plot by typing
  207 +
  208 + .. code-block:: bash
  209 +
  210 + $ $CTOOLS/share/examples/python/show_spectrum.py spectrum.fits
doc/source/users/tutorials/howto/index.rst
@@ -46,3 +46,4 @@ Analysis of data from other instruments @@ -46,3 +46,4 @@ Analysis of data from other instruments
46 How to analyse Fermi-LAT data with ctools? <fermi/index> 46 How to analyse Fermi-LAT data with ctools? <fermi/index>
47 How to analyse COMPTEL data with ctools? <comptel/index> 47 How to analyse COMPTEL data with ctools? <comptel/index>
48 How to analyse H.E.S.S. data with ctools? <iact/index> 48 How to analyse H.E.S.S. data with ctools? <iact/index>
  49 + howto_combine_instruments