Commit 02b0b1c2158e5031d00bf2844990e3532b84f1cf
1 parent
cd6bebbf
Added simulation part of the documentation
Showing
4 changed files
with
557 additions
and
22 deletions
doc/source/user_manual/iact_analysis/analysis.rst
| @@ -74,10 +74,10 @@ For this purpose one can simply pass an invalid coordinate to :ref:`csfindobs`. | @@ -74,10 +74,10 @@ For this purpose one can simply pass an invalid coordinate to :ref:`csfindobs`. | ||
| 74 | 74 | ||
| 75 | The selection by region will simply be omitted. | 75 | The selection by region will simply be omitted. |
| 76 | 76 | ||
| 77 | -Note | ||
| 78 | -^^^^ | ||
| 79 | -On default, :ref:`csfindobs` only select data of highest quality (i.e. QUALITY=0). Specifying the hidden parameter e.g. ``min_qual=1`` | ||
| 80 | -allows to select all data with looser quality criteria. | 77 | +.. note:: |
| 78 | + | ||
| 79 | + On default, :ref:`csfindobs` only select data of highest quality (i.e. QUALITY=0). Specifying the hidden parameter e.g. ``min_qual=1`` | ||
| 80 | + allows to select all data with looser quality criteria. | ||
| 81 | 81 | ||
| 82 | Create an observation list | 82 | Create an observation list |
| 83 | -------------------------- | 83 | -------------------------- |
doc/source/user_manual/iact_analysis/high_level.rst
| @@ -219,7 +219,7 @@ Example unbinned observation container | @@ -219,7 +219,7 @@ Example unbinned observation container | ||
| 219 | Size of the X axis in pixels [100] | 219 | Size of the X axis in pixels [100] |
| 220 | Size of the Y axis in pixels [100] | 220 | Size of the Y axis in pixels [100] |
| 221 | Pixel size (deg/pixel) [0.02] | 221 | Pixel size (deg/pixel) [0.02] |
| 222 | - Residual map computation algorithm (SUB|SUBDIV|SUBDIVSQRT) [SUB] | 222 | + Residual map computation algorithm (SUB|SUBDIV|SUBDIVSQRT) [SUBDIV] |
| 223 | Output residual map file [resmap.fits] | 223 | Output residual map file [resmap.fits] |
| 224 | 224 | ||
| 225 | Example binned/stacked observation container | 225 | Example binned/stacked observation container |
| @@ -235,7 +235,7 @@ The tool behaves differently if the input observation parameter is a count cube. | @@ -235,7 +235,7 @@ The tool behaves differently if the input observation parameter is a count cube. | ||
| 235 | Input PSF cube file (only needed for stacked analysis) [psfcube.fits] | 235 | Input PSF cube file (only needed for stacked analysis) [psfcube.fits] |
| 236 | Input background cube file (only needed for stacked analysis) [bkgcube.fits] | 236 | Input background cube file (only needed for stacked analysis) [bkgcube.fits] |
| 237 | Input model XML file [binned_results.xml] | 237 | Input model XML file [binned_results.xml] |
| 238 | - Residual map computation algorithm (SUB|SUBDIV|SUBDIVSQRT) [SUB] | 238 | + Residual map computation algorithm (SUB|SUBDIV|SUBDIVSQRT) [SUBDIV] |
| 239 | Output residual map file [resmap.fits] | 239 | Output residual map file [resmap.fits] |
| 240 | 240 | ||
| 241 | Note that the tool also queries for an input model cube file (which we set to ``NONE`` here). This is very convenient in case the model cube has already been precomputed | 241 | Note that the tool also queries for an input model cube file (which we set to ``NONE`` here). This is very convenient in case the model cube has already been precomputed |
doc/source/user_manual/iact_analysis/simulation.rst
| @@ -2,29 +2,299 @@ | @@ -2,29 +2,299 @@ | ||
| 2 | 2 | ||
| 3 | Simulating IACT data | 3 | Simulating IACT data |
| 4 | ==================== | 4 | ==================== |
| 5 | - | ||
| 6 | - | 5 | +This section describes how to run simulations with current IACT data. In particular, a guide how to simulate data for a given set of IRFs, or a given set of |
| 6 | +observations is provided. In addition, tools to compute sensitivity curves or pull distributions are presented. | ||
| 7 | +All tools are based on the event list simulator :ref:`ctobssim`. | ||
| 7 | 8 | ||
| 8 | Simulations for a specific observation container | 9 | Simulations for a specific observation container |
| 9 | ------------------------------------------------ | 10 | ------------------------------------------------ |
| 11 | +On default, :ref:`ctobssim` builds a new observation container by querying relevant user parameters. In case | ||
| 12 | +an observation XML container is already in place, the hidden parameter ``inobs`` can be specified (:ref:`see here how to create an | ||
| 13 | +observation container <sec_analysis>`). It might be useful to run :ref:`ctselect` beforehand to ensure that the simulation knows about | ||
| 14 | +energy thresholds, field of view, etc. If an unselected observation container is used, the simulation tool will query for global energy | ||
| 15 | +boundaries and a global RoI radius. The following example illustrates the usage of an already selected observation container. | ||
| 16 | + | ||
| 17 | +.. code-block:: bash | ||
| 18 | + | ||
| 19 | + $ ctobssim inobs=selected_obs.xml | ||
| 20 | + Input model XML file [crab_models.xml] | ||
| 21 | + Output event data file or observation definition XML file [sim_obs.xml] | ||
| 22 | + | ||
| 23 | +Note that :ref:`ctobssim` writes a new event list file per observation into the current directory. If the observation container | ||
| 24 | +is large, it might be convenient to create a new folder and specify the ``prefix`` keyword (similar to :ref:`ctselect`): | ||
| 25 | + | ||
| 26 | +.. code-block:: bash | ||
| 27 | + | ||
| 28 | + $ mkdir simulated | ||
| 29 | + $ ctobssim inobs=selected_obs.xml prefix=simulated/sim_events_ | ||
| 30 | + ... | ||
| 31 | + | ||
| 32 | +The newly created observation container can be used in the same way as a normal observation container, i.e. it can be analysed with | ||
| 33 | +:ref:`ctlike` etc. | ||
| 34 | + | ||
| 35 | +.. note:: | ||
| 36 | + | ||
| 37 | + On default, :ref:`ctobssim` uses the same seed in every execution, i.e. the tool will always return the same simulated event list, regardless | ||
| 38 | + when, where and how it was executed. To steer this the user can provide the hidden integer parameter ``seed``: | ||
| 39 | + | ||
| 40 | + .. code-block:: bash | ||
| 41 | + | ||
| 42 | + $ ctobssim inobs=selected_obs.xml seed=2 | ||
| 43 | + | ||
| 44 | + This might be important if simulations are run in parallel. | ||
| 10 | 45 | ||
| 11 | Simulating observation time for a given set of IRFs | 46 | Simulating observation time for a given set of IRFs |
| 12 | --------------------------------------------------- | 47 | --------------------------------------------------- |
| 48 | +There are other use cases to run simulations, for instance when there is no observation container available yet. This might be the case e.g | ||
| 49 | +for an observation proposal: one would want to use a certain set of IRFs to simulate e.g. 50 hours of data to check whether a source | ||
| 50 | +of interest can be detected. For this purpose it is necessary to first find a set of suitable IRFs to be used for | ||
| 51 | +simulations. This can be easily done using :ref:`csfindobs` and using the ``expression`` parameter. The following example extracts | ||
| 52 | +observations with at a certain zenith angle range (20-25 degrees) and azimuth angle range (90-100 degrees): | ||
| 53 | + | ||
| 54 | +.. code-block:: bash | ||
| 55 | + | ||
| 56 | + $ csfindobs expression="AZ_PNT>90.0&&AZ_PNT<100.0&&ZEN_PNT>20.0&&ZEN_PNT<25.0" | ||
| 57 | + Name of FITS production (Run csiactdata to view your options) [fits-prod-name] | ||
| 58 | + Right ascension [83.6331] NONE | ||
| 59 | + Runlist outfile [zen20_az90.lis] | ||
| 60 | + | ||
| 61 | +Of course, further details could be specified, e.g. one might want to check for a certain range of muon efficieny, or any other parameter which impacts IRFs. | ||
| 62 | +The output runlist subsequently has to be converted to an observation XML file using :ref:`csiactobs` (:ref:`see here how to execute this tool <sec_analysis>`). | ||
| 63 | +In the following it is assumed that the observation XML file of the selected representative observations is produced and called ``myobs.xml``. | ||
| 13 | 64 | ||
| 14 | Create caldb entry | 65 | Create caldb entry |
| 15 | ^^^^^^^^^^^^^^^^^^ | 66 | ^^^^^^^^^^^^^^^^^^ |
| 67 | +Now, one of the observations in this container have to be added to the local calibration database. This database is used | ||
| 68 | +by ctools to extract IRFs for simulations. | ||
| 69 | + | ||
| 70 | +.. code-block:: bash | ||
| 71 | + | ||
| 72 | + $ csobs2caldb | ||
| 73 | + Input observation definition file [myobs.xml] | ||
| 74 | + Response output name (e.g. Zenith50) [zen20_az90] | ||
| 75 | + | ||
| 76 | +Note that the response name has been specified to "zen20_az90". Any name can be chosen which represents the observation which was inserted into the database. | ||
| 77 | +On default, :ref:`csobs2caldb` uses the first observation in the provided XML file. This can be modifyied by specifying the hidden integer parameter index, e.g.: | ||
| 78 | + | ||
| 79 | +.. code-block:: bash | ||
| 80 | + | ||
| 81 | + $ csobs2caldb index=1 | ||
| 82 | + | ||
| 83 | +This would use the second entry instead of the first from the observation container to extract the IRFs. | ||
| 84 | + | ||
| 85 | +.. note:: | ||
| 86 | + | ||
| 87 | + The ``index`` parameter starts counting from zero. | ||
| 88 | + | ||
| 89 | +Check caldb entries | ||
| 90 | +^^^^^^^^^^^^^^^^^^^ | ||
| 91 | +In order to check if the calibration database has successfully been added, the tool :ref:`cscaldb` can be used to inspect the calibration database: | ||
| 92 | + | ||
| 93 | +.. code-block:: bash | ||
| 94 | + | ||
| 95 | + $ cscaldb debug=yes | ||
| 96 | + ... | ||
| 97 | + 2016-02-25T15:57:11: +==============+ | ||
| 98 | + 2016-02-25T15:57:11: | Mission: cta | | ||
| 99 | + 2016-02-25T15:57:11: +==============+ | ||
| 100 | + 2016-02-25T15:57:11: === Response functions in database "hess" === | ||
| 101 | + 2016-02-25T15:57:11: zen20_az90 | ||
| 102 | + 2016-02-25T15:57:11: | ||
| 103 | + 2016-02-25T15:57:11: === Response functions in database "prod2" === | ||
| 104 | + 2016-02-25T15:57:11: North_0.5h | ||
| 105 | + 2016-02-25T15:57:11: North_50h | ||
| 106 | + 2016-02-25T15:57:11: North_5h | ||
| 107 | + 2016-02-25T15:57:11: South_0.5h | ||
| 108 | + 2016-02-25T15:57:11: South_50h | ||
| 109 | + 2016-02-25T15:57:11: South_5h | ||
| 110 | + ... | ||
| 111 | + | ||
| 112 | +Note that the observation of the actual instrument ("hess" in this example) was added to the CTA mission. This is mainly for structural and simplicity reasons | ||
| 113 | +and might be improved eventually. Nevertheless, this caldb entry can now be used to simulate any observation duration. | ||
| 16 | 114 | ||
| 17 | Simulate | 115 | Simulate |
| 18 | ^^^^^^^^ | 116 | ^^^^^^^^ |
| 19 | 117 | ||
| 118 | +.. code-block:: bash | ||
| 119 | + | ||
| 120 | + $ ctobssim | ||
| 121 | + RA of pointing (degrees) (0-360) [83.63] | ||
| 122 | + Dec of pointing (degrees) (-90-90) [22.01] | ||
| 123 | + Radius of FOV (degrees) (0-180) [2.5] | ||
| 124 | + Start time (MET in s) [0.0] | ||
| 125 | + End time (MET in s) [18000.0] | ||
| 126 | + Lower energy limit (TeV) [0.5] | ||
| 127 | + Upper energy limit (TeV) [50] | ||
| 128 | + Calibration database [hess] | ||
| 129 | + Instrument response function [zen20_az90] | ||
| 130 | + Input model XML file [input_model.xml] | ||
| 131 | + Output event data file or observation definition XML file [simulated_events.fits] | ||
| 132 | + | ||
| 133 | +Here, a total duration of 5 hours at the crab position was simulated using the newly created caldb entry. Note that the choice of the energy range is up to the user. | ||
| 134 | +One should bear in mind that simulations only make sense in energy ranges where the IRFs are well-defined. The simulation | ||
| 135 | +assumes one observation of defined duration here. Accordingly, only one FITS event list is written as output. The input XML model | ||
| 136 | +must now contain only one background model and (of course) all sky models that are needed. Here is an example of an input model | ||
| 137 | +e.g. for the Crab Nebula: | ||
| 138 | + | ||
| 139 | +.. code-block:: xml | ||
| 140 | + | ||
| 141 | + <?xml version="1.0" standalone="no"?> | ||
| 142 | + <source_library title="source library"> | ||
| 143 | + <source name="Crab" type="PointSource"> | ||
| 144 | + <spectrum type="PowerLaw"> | ||
| 145 | + <parameter name="Prefactor" scale="1e-17" value="3.5" min="1e-07" max="1000.0" free="1"/> | ||
| 146 | + <parameter name="Index" scale="-1" value="2.5" min="0.0" max="+5.0" free="1"/> | ||
| 147 | + <parameter name="Scale" scale="1e6" value="1.0" min="0.01" max="1000.0" free="0"/> | ||
| 148 | + </spectrum> | ||
| 149 | + <spatialModel type="SkyDirFunction"> | ||
| 150 | + <parameter name="RA" scale="1.0" value="83.6331" min="-360" max="360" free="0"/> | ||
| 151 | + <parameter name="DEC" scale="1.0" value="22.0145" min="-90" max="90" free="0"/> | ||
| 152 | + </spatialModel> | ||
| 153 | + </source> | ||
| 154 | + <source name="CTABackgroundModel" type="CTAIrfBackground" instrument="CTA"> | ||
| 155 | + <spectrum type="PowerLaw"> | ||
| 156 | + <parameter name="Prefactor" scale="1.0" value="1.0" min="1e-3" max="1e+3" free="1"/> | ||
| 157 | + <parameter name="Index" scale="1.0" value="0.0" min="-5.0" max="+5.0" free="1"/> | ||
| 158 | + <parameter name="Scale" scale="1e6" value="1.0" min="0.01" max="1000.0" free="0"/> | ||
| 159 | + </spectrum> | ||
| 160 | + </source> | ||
| 161 | + </source_library> | ||
| 162 | + | ||
| 163 | +Note that since the caldb entry (:ref:`csobs2caldb`) has been produced under the mission "CTA", the event list is now considered a CTA observation (regardless of the input instrument). | ||
| 164 | +Therefore, it is important to have "CTA" specified in the instrument attribute of the background model XML component. Of course the addition of any sky model can be | ||
| 165 | +done without a problem. | ||
| 166 | + | ||
| 167 | +The output of this kind of simulation is a single FITS event list file that can be used for further analysis. | ||
| 168 | +For instance one could run :ref:`ctlike` in the following way: | ||
| 169 | + | ||
| 170 | +.. code-block:: bash | ||
| 171 | + | ||
| 172 | + $ ctlike | ||
| 173 | + Input event list, counts cube or observation definition XML file [simulated_events.fits] | ||
| 174 | + Calibration database [hess] | ||
| 175 | + Instrument response function [zen20_az90] | ||
| 176 | + Input model XML file [input_model.xml] | ||
| 177 | + Output model XML file [simulated_fit_results.xml] | ||
| 178 | + | ||
| 179 | +Note that :ref:`ctlike` automatically queries for the IRF database in case no full observation container is provided. Any other tool taking | ||
| 180 | +unbinned observations as input will behave the same way. Now all means to run simulations with current IACTs are at hand. | ||
| 181 | +The following sections will describe tools for running higher level simulation analysis. | ||
| 182 | + | ||
| 20 | Create pull distributions | 183 | Create pull distributions |
| 21 | ------------------------- | 184 | ------------------------- |
| 185 | +Pull distributions inspect the capability of the science tools to find source parameters in the data that were injected into the simulations. | ||
| 186 | +The tool :ref:`cspull` will run several times the sequence of simulating and fitting the data. After each sequence, the pull value of the | ||
| 187 | +fitted parameters is written into an ASCII file. The pull value ``p`` of parameter ``X`` is defined as follows: | ||
| 188 | + | ||
| 189 | +.. math:: | ||
| 190 | + p = \frac{X_{\rm fitted} - X_{\rm true}}{\Delta X_{\rm fitted}} | ||
| 191 | + | ||
| 192 | +Where :math:`\Delta X_{\rm fitted}` is the derived error of the fitted parameter :math:`X_{\rm fitted}`. After several trials, the pull value should follow | ||
| 193 | +a normal distribution. Knowing this, the tool may help to distinguish if a source is detectable and can be normally reconstructed. | ||
| 194 | +The tool can either work on an input observation container or on the caldb entry that was created above. The number of trials is queried by the tool, too. | ||
| 195 | + | ||
| 196 | +Example: observation container | ||
| 197 | +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | ||
| 198 | + | ||
| 199 | +.. code-block:: bash | ||
| 200 | + | ||
| 201 | + $ cspull inobs=selected_obs.xml | ||
| 202 | + Number of energy bins (0=unbinned) [0] | ||
| 203 | + Input model XML file [crab_results.xml] | ||
| 204 | + Output pull distribution file [pull.dat] | ||
| 205 | + Number of trials [100] | ||
| 206 | + | ||
| 207 | +Note that the tool asks for the energy binning. It will use an unbinned analysis if zero bins are provided. Otherwise | ||
| 208 | +it will query for binning parameters and will convert the simulated observations into a binned/stacked observation by running | ||
| 209 | +:ref:`ctbin`, :ref:`ctexpcube`, :ref:`ctpsfcube` and :ref:`ctbkgcube` in order before fitting the simulated data with :ref:`ctlike`. | ||
| 210 | + | ||
| 211 | +Example: caldb entry | ||
| 212 | +^^^^^^^^^^^^^^^^^^^^ | ||
| 213 | + | ||
| 214 | +.. code-block:: bash | ||
| 215 | + | ||
| 216 | + $ cspull | ||
| 217 | + RA of pointing (deg) (0-360) [83.6331] | ||
| 218 | + Dec of pointing (deg) (-90-90) [22.0145] | ||
| 219 | + Duration (in s) [18000.0] | ||
| 220 | + Lower energy limit (TeV) [0.5] | ||
| 221 | + Upper energy limit (TeV) [50] | ||
| 222 | + Calibration database [hess] | ||
| 223 | + Instrument response function [zen20_az90] | ||
| 224 | + Number of energy bins (0=unbinned) [0] | ||
| 225 | + Input model XML file [input_models.xml] | ||
| 226 | + Output pull distribution file [pull.dat] | ||
| 227 | + Number of trials [100] | ||
| 228 | + | ||
| 229 | +Again, the caldb entry ``zen20_az90`` which was created above is used to simulate 5 hours of data. The data is simulated and analysed 100 | ||
| 230 | +times in a row and the output is written into the file ``pull.dat``. | ||
| 22 | 231 | ||
| 23 | Visualise pull distributions | 232 | Visualise pull distributions |
| 24 | ---------------------------- | 233 | ---------------------------- |
| 234 | +The output ASCII file of :ref:`cspull` can be inspected by the user using own scripts. As a starting point, the ``example`` folder | ||
| 235 | +contains a script that can be used to visualise the pull distribution histogram: | ||
| 236 | + | ||
| 237 | +.. code-block:: bash | ||
| 238 | + | ||
| 239 | + $ python $CTOOLS/examples/show_pull_histogram.py pull.dat Pull_Crab_Prefactor 50 | ||
| 25 | 240 | ||
| 26 | -Create sensitiviy curve | ||
| 27 | ------------------------ | 241 | +Run the script without arguments to see the usage. In case a wrong parameter name was provided, the tool will print available parameters on the screen. |
| 242 | +The last integer parameter defines the binning of the histogram. In addition, the tool shows the standard normal distribution which should | ||
| 243 | +match the pull distribution for a high number of trials if everything went well. | ||
| 244 | + | ||
| 245 | +Create sensitivity curve | ||
| 246 | +------------------------ | ||
| 247 | +A very important means to illustrate if a source can be detected with a certain significance is a sensitivity curve. | ||
| 248 | +The tool :ref:`cssens` can be used to compute either an integral, or a differential sensitivity curve for a given observation container. | ||
| 249 | +Analogous to :ref:`cspull`, the tool works either on an unbinned observation container or using a caldb entry. | ||
| 250 | +The script :ref:`cssens` computes the differential or integrated CTA sensitivity using maximum likelihood fitting of a test source. | ||
| 251 | +The differential sensitivity is determined for a number of energy bins, the integral sensitivity is determined for a number | ||
| 252 | +of energy thresholds. The test source is fitted to simulated data using ctlike to determine itโs detection significance as a | ||
| 253 | +function of source flux. The source flux is then varied until the source significance achieves a given level, specified by the | ||
| 254 | +(hidden) significance parameter ``sigma``. To damp variations between individual Monte Carlo simulations, a sliding average is | ||
| 255 | +applied in the significance computation (controlled by hidden ``num_avg parameter``). Note that this procedure might take a while to compute. | ||
| 256 | +To switch from diffferential to integral sensitivity, the hidden parameter ``type="Integral"`` has to be specified. It should be noted that | ||
| 257 | +the results are written to a file ``sensitivity.dat``. To change the output file name, the hidden parameter ``outfile=mysensitivity.dat`` | ||
| 258 | +can be provided. | ||
| 259 | + | ||
| 260 | + | ||
| 261 | +Example: observation container | ||
| 262 | +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | ||
| 263 | + | ||
| 264 | +.. code-block:: bash | ||
| 265 | + | ||
| 266 | + $ cssens inobs=selected_obs.xml | ||
| 267 | + Input model XML file [crab_results.xml] | ||
| 268 | + Source name [Crab] | ||
| 269 | + Lower energy limit (TeV) [0.5] | ||
| 270 | + Upper energy limit (TeV) [50] | ||
| 271 | + Number of energy bins for differential sensitivity computation [21] | ||
| 272 | + | ||
| 273 | +Example: caldb entry | ||
| 274 | +^^^^^^^^^^^^^^^^^^^^ | ||
| 275 | + | ||
| 276 | +.. code-block:: bash | ||
| 277 | + | ||
| 278 | + $ cssens | ||
| 279 | + Calibration database [hess] | ||
| 280 | + Instrument response function [zen20_az90] | ||
| 281 | + Effective exposure time (s) [18000.0] | ||
| 282 | + Radius of ROI (deg) [2.5] | ||
| 283 | + Input model XML file [input_models.xml] | ||
| 284 | + Source name [Crab] | ||
| 285 | + Lower energy limit (TeV) [0.5] | ||
| 286 | + Upper energy limit (TeV) [50] | ||
| 287 | + Number of energy bins for differential sensitivity computation [21] | ||
| 288 | + | ||
| 289 | +Note that the input model in the latter case only requires to contain one background model (see section above). Using this setup, | ||
| 290 | +the user can specify the observation time for the sensitivity curve. In this example, again, 5 hours are used. | ||
| 28 | 291 | ||
| 29 | Visualise sensitivity curves | 292 | Visualise sensitivity curves |
| 30 | ----------------------------- | ||
| 31 | \ No newline at end of file | 293 | \ No newline at end of file |
| 294 | +---------------------------- | ||
| 295 | +In order to show a sensitivity curve, there is also a script in the example folder: | ||
| 296 | + | ||
| 297 | +.. code-block:: bash | ||
| 298 | + | ||
| 299 | + $ python $CTOOLS/examples/show_sensitivity.py sensitivity.dat | ||
| 300 | + | ||
| 301 | +This will display a sensitivity curve for the applied settings. |
doc/source/user_manual/iact_analysis/tips.rst
| @@ -2,39 +2,304 @@ | @@ -2,39 +2,304 @@ | ||
| 2 | 2 | ||
| 3 | Tips, Tricks and FAQs | 3 | Tips, Tricks and FAQs |
| 4 | ===================== | 4 | ===================== |
| 5 | +This section shows some of the wrinkles that could fascilitate the users' life when running analyses. | ||
| 5 | 6 | ||
| 6 | Visualise observations | 7 | Visualise observations |
| 7 | ---------------------- | 8 | ---------------------- |
| 9 | +A very common task is to inspect the observation container and visualise several quantities. | ||
| 10 | + | ||
| 11 | +Create a skymap of counts | ||
| 12 | +^^^^^^^^^^^^^^^^^^^^^^^^^ | ||
| 13 | +The tool :ref:`ctskymap` allows to create a single map of counts contained inside an observation container. | ||
| 14 | +In contrast to :ref:`ctbin`, ctskymap takes into account all events that fall into the skymap energy range and spatial range. | ||
| 15 | +Since :ref:`ctbin` is indended for binned/stacked analysis, it respects energy thresholds, RoI selections etc. | ||
| 16 | +Accordingly, :ref:`ctskymap` should be used for a simple visualisation of the counts. | ||
| 17 | + | ||
| 18 | + | ||
| 19 | +.. code-block:: bash | ||
| 20 | + | ||
| 21 | + $ ctskymap debug=yes | ||
| 22 | + Input event list or observation definition XML file [events.fits] obs.xml | ||
| 23 | + Lower energy limit (TeV) [0.1] | ||
| 24 | + Upper energy limit (TeV) [100.0] | ||
| 25 | + First coordinate of image center in degrees (RA or galactic l) (0-360) [83.63] | ||
| 26 | + Second coordinate of image center in degrees (DEC or galactic b) (-90-90) [22.01] | ||
| 27 | + Projection method (AIT|AZP|CAR|MER|MOL|STG|TAN) [CAR] | ||
| 28 | + Coordinate system (CEL - celestial, GAL - galactic) (CEL|GAL) [CEL] | ||
| 29 | + Image scale (in degrees/pixel) [0.02] | ||
| 30 | + Size of the X axis in pixels [200] | ||
| 31 | + Size of the Y axis in pixels [200] | ||
| 32 | + Output skymap file [skymap.fits] | ||
| 33 | + | ||
| 34 | +Create region file of pointings | ||
| 35 | +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | ||
| 36 | +In particular, one might want to know how the pointings of the observation container distribute across the sky. | ||
| 37 | +For this purpose, :ref:`csobsinfo` provides the hidden parameter ``ds9file`` which signals to produce a region file that | ||
| 38 | +contains these information: | ||
| 39 | + | ||
| 40 | +.. code-block:: bash | ||
| 41 | + | ||
| 42 | + $ csobsinfo ds9file=pointings.reg | ||
| 43 | + Parfile "csobsinfo.par" not found. Create default parfile. | ||
| 44 | + Event list, counts cube, or observation definition file [obs.xml] | ||
| 45 | + | ||
| 46 | +Together with the previously produced skymap, one can plot the pointings using e.g. ds9: | ||
| 47 | + | ||
| 48 | +.. code-block:: bash | ||
| 49 | + | ||
| 50 | + $ ds9 skymap.fits -regions pointings.reg | ||
| 8 | 51 | ||
| 9 | Plot zenith angle distribution of observations | 52 | Plot zenith angle distribution of observations |
| 10 | ---------------------------------------------- | 53 | ---------------------------------------------- |
| 54 | +The tool :ref:`csobsinfo` dumps more information into the log file that might be of interest to catch in a script. | ||
| 55 | +Therefore, one could simply use this tool via python and plot some distributions: | ||
| 56 | + | ||
| 57 | +.. code-block:: python | ||
| 58 | + | ||
| 59 | + # Run script | ||
| 60 | + import cscripts | ||
| 61 | + info = cscripts.csobsinfo() | ||
| 62 | + info["inobs"] = "selected_obs.xml" | ||
| 63 | + info.run() | ||
| 64 | + | ||
| 65 | + # Plot data | ||
| 66 | + import matplotlib.pyplot as plt | ||
| 67 | + plt.hist(info.zeniths(), bins=10, range=[0,90]) | ||
| 68 | + plt.show() | ||
| 69 | + | ||
| 70 | +This will plot a histogram showing the zenith angle distribution of the observation container. In addition there are more methods | ||
| 71 | +to access information in python: | ||
| 72 | + | ||
| 73 | +.. code-block:: python | ||
| 74 | + | ||
| 75 | + # csobsinfo can also return: | ||
| 76 | + info.azimuths() # list of azimuth values | ||
| 77 | + info.offsets() # list of offset values (only computed if hidden parameter offset=yes was specified) | ||
| 78 | + info.ebounds() # gammalib.GEbounds object of energy ranges | ||
| 79 | + info.gti() # gammalib.GGti object containing good time intervals | ||
| 80 | + | ||
| 11 | 81 | ||
| 12 | Visualise models | 82 | Visualise models |
| 13 | ---------------- | 83 | ---------------- |
| 84 | +Similar to :ref:`csobsinfo`, there is :ref:`csmodelinfo` to find out more about the content of a model XML file. In order to show the | ||
| 85 | +position and sizes of the model on top of a skymap, this tool has the hidden parameter ``ds9file``, too. | ||
| 86 | + | ||
| 87 | +.. code-block:: bash | ||
| 88 | + | ||
| 89 | + csmodelinfo ds9file=models.reg | ||
| 90 | + Input model XML file [$CTOOLS/share/models/crab.xml] | ||
| 91 | + | ||
| 92 | +There are several options regarding the color, text and other attributes of the region file. To see a full list, | ||
| 93 | +:ref:`visit the reference page <csmodelinfo>`. | ||
| 94 | +Analogous to the pointings of the observation container, the models can be visualised using e.g. ds9: | ||
| 95 | + | ||
| 96 | +.. code-block:: bash | ||
| 97 | + | ||
| 98 | + $ ds9 skymap.fits -regions models.reg | ||
| 99 | + | ||
| 100 | +Manipulating models in python | ||
| 101 | +----------------------------- | ||
| 102 | +This step will give some guidance how to work with model XML files in python and how to manipulate their content | ||
| 103 | + | ||
| 104 | +.. code-block:: python | ||
| 105 | + | ||
| 106 | + import gammalib | ||
| 107 | + | ||
| 108 | + # Open model file | ||
| 109 | + models = gammalib.GModels("$CTOOLS/share/models/crab.xml") | ||
| 110 | + | ||
| 111 | + # Access a model component | ||
| 112 | + src = models["Crab"] | ||
| 113 | + print(src) | ||
| 114 | + | ||
| 115 | + # Retrieve the spectral or spatial component | ||
| 116 | + print(src.spectral()) | ||
| 117 | + print(src.spatial()) | ||
| 118 | + | ||
| 119 | + # Print the spectral parameter "Prefactor" | ||
| 120 | + prefactor = src.spectral()["Prefactor"] | ||
| 121 | + print("Prefactor:",prefactor.value(),"+-",prefactor.error()) | ||
| 122 | + | ||
| 123 | + # Set the prefactor value | ||
| 124 | + prefactor.value(3.5e-17) | ||
| 125 | + | ||
| 126 | + # Loop over models and fix all parameters | ||
| 127 | + for model in models: | ||
| 128 | + | ||
| 129 | + # Loop over model parameters | ||
| 130 | + for par in model: | ||
| 131 | + | ||
| 132 | + # Fix parameter | ||
| 133 | + par.fix() | ||
| 134 | + | ||
| 135 | + # Release one specific parameter | ||
| 136 | + models["Crab"]["Prefactor"].free() | ||
| 137 | + | ||
| 138 | + # Set the parameter range | ||
| 139 | + models["Crab"]["Prefactor"].min(1e-18) | ||
| 140 | + models["Crab"]["Prefactor"].max(1e-16) | ||
| 141 | + | ||
| 142 | + # ... or in one step: | ||
| 143 | + models["Crab"]["Prefactor].range(1e-18, 1e-16) | ||
| 144 | + | ||
| 145 | + # Remove model from container | ||
| 146 | + models.remove("Crab") | ||
| 147 | + | ||
| 148 | + # Save model to another XML file | ||
| 149 | + models.save("mymodels.xml") | ||
| 150 | + | ||
| 151 | + | ||
| 152 | +Retrieve likelihood values from :ref:`ctlike` | ||
| 153 | +--------------------------------------------- | ||
| 154 | +For some purposes, it might be useful to retrieve the fitted likelihood value and other results of the fit with :ref:`ctlike`. | ||
| 155 | + | ||
| 156 | +.. code-block:: python | ||
| 157 | + | ||
| 158 | + import gammalib | ||
| 159 | + import ctools | ||
| 160 | + | ||
| 161 | + # Create ctlike | ||
| 162 | + like = ctools.ctlike() | ||
| 163 | + like["inobs"] = "selected_obs.xml" | ||
| 164 | + like["inmodel"] = "mymodels.xml" | ||
| 165 | + like.run() | ||
| 166 | + | ||
| 167 | + # Get optimizer from ctlike | ||
| 168 | + opt = like.opt() | ||
| 169 | + print(opt) | ||
| 170 | + | ||
| 171 | + # Get likelihood value from optimizer | ||
| 172 | + print(opt.value()) | ||
| 173 | + | ||
| 174 | + # Get fit status: | ||
| 175 | + print(opt.status()) | ||
| 176 | + # 0: converged | ||
| 177 | + # 1: stalled | ||
| 178 | + # 2: singular curvature matrix encountered | ||
| 179 | + # 3: curvature matrix not positive definite | ||
| 180 | + # 4: errors are inaccurate | ||
| 14 | 181 | ||
| 15 | Speed up analysis | 182 | Speed up analysis |
| 16 | ----------------- | 183 | ----------------- |
| 184 | +In some cases it may occur that the analysis takes very long. There are several reasons that can slow down the analysis quite severly. | ||
| 185 | +Not all issues can be tackled. Nevertheless, here is a list of actions that have proven to speed up the fit. | ||
| 17 | 186 | ||
| 18 | -Create count map with one energy bin | ||
| 19 | ------------------------------------- | 187 | +* Consider switching to binned analysis if the observation time exceeds 50-100 hours. |
| 188 | +* Diffuse and extended sources in the RoI are computational expensive. However, in unbinned analysis they impact the speed much more. | ||
| 189 | +* Usage of energy dispersion in unbinned analysis could also cause a long fit. Try switching it off if speed is important. | ||
| 190 | +* Switch to a machine that supports OpenMP. This allows to parallelise the fit onto several cores. | ||
| 20 | 191 | ||
| 21 | -Compute excess map | ||
| 22 | ------------------- | 192 | +Compute excess maps |
| 193 | +------------------- | ||
| 194 | +A very important means to visualise images of sources are excess maps. The tool :ref:`csresmap` can also be used to create such a map. | ||
| 195 | +The user, however, has to manually remove the source(s) of interest from the input model XML file. | ||
| 196 | + | ||
| 197 | +.. code-block:: python | ||
| 198 | + | ||
| 199 | + import gammalib | ||
| 200 | + models = gammalib.GModels("crab_models.xml") | ||
| 201 | + models.remove("Crab") | ||
| 202 | + models.save("models_without_crab.xml") | ||
| 203 | + | ||
| 204 | +Of course, this can also be done by editing the XML file with an editor. | ||
| 205 | + | ||
| 206 | +Subsequently, :ref:`csresmap` can be executed using the ``algorithm=SUB`` parameter: | ||
| 207 | + | ||
| 208 | +.. code-block:: bash | ||
| 209 | + | ||
| 210 | + $ csresmap | ||
| 211 | + Input event list, counts cube, or observation definition XML file [selected_obs.xml] | ||
| 212 | + Input model XML file [models_without_crab.xml] | ||
| 213 | + First coordinate of image center in degrees (RA or galactic l) (0-360) [83.63] | ||
| 214 | + Second coordinate of image center in degrees (DEC or galactic b) (-90-90) [22.01] | ||
| 215 | + Coordinate System (CEL|GAL) [CEL] | ||
| 216 | + Projection method (AIT|AZP|CAR|MER|MOL|STG|TAN) [CAR] | ||
| 217 | + Size of the X axis in pixels [100] | ||
| 218 | + Size of the Y axis in pixels [100] | ||
| 219 | + Pixel size (deg/pixel) [0.02] | ||
| 220 | + Residual map computation algorithm (SUB|SUBDIV|SUBDIVSQRT) [SUB] | ||
| 221 | + Output residual map file [excessmap.fits] | ||
| 23 | 222 | ||
| 24 | -Split TS map computation | ||
| 25 | ------------------------- | ||
| 26 | 223 | ||
| 27 | Compute flux maps | 224 | Compute flux maps |
| 28 | ----------------- | 225 | ----------------- |
| 226 | +The creation of a flux map is much more expensive in terms of computing than an excess map. In the section about | ||
| 227 | +:ref:`high level analysis tools <sec_high_level>`, the usage of :ref:`cttsmap` was demonstrated. This tool can also | ||
| 228 | +be used to generate flux maps. For this, the user has to incoorporate a test source in the XML model file. This source | ||
| 229 | +should consist of a spectral component using a PowerLaw2 model: | ||
| 230 | + | ||
| 231 | +.. code-block:: xml | ||
| 232 | + | ||
| 233 | + <source name="TestSource" type="PointSource"> | ||
| 234 | + <spectrum type="PowerLaw2"> | ||
| 235 | + <parameter scale="1e-07" name="Integral" min="1e-07" max="1000.0" value="1.0" free="1"/> | ||
| 236 | + <parameter scale="1.0" name="Index" min="-5.0" max="+5.0" value="-2.0" free="1"/> | ||
| 237 | + <parameter scale="1.0" name="LowerLimit" min="10.0" max="1000000.0" value="100.0" free="0"/> | ||
| 238 | + <parameter scale="1.0" name="UpperLimit" min="10.0" max="1000000.0" value="500000.0" free="0"/> | ||
| 239 | + </spectrum> | ||
| 240 | + <spatialModel type="SkyDirFunction"> | ||
| 241 | + <parameter free="0" max="360" min="-360" name="RA" scale="1" value="83.6331" /> | ||
| 242 | + <parameter free="0" max="90" min="-90" name="DEC" scale="1" value="22.0145" /> | ||
| 243 | + </spatialModel> | ||
| 244 | + </source> | ||
| 29 | 245 | ||
| 30 | -Accessing fit parameters in python | ||
| 31 | ----------------------------------- | 246 | +The further content of the rest of the XML model file depends on the user requirements: |
| 32 | 247 | ||
| 33 | -Accessing upper limits in python | ||
| 34 | --------------------------------- | 248 | +* For an absolute flux map, all other sky models should be removed |
| 249 | +* For a residual flux map, all other sky models should be kept | ||
| 35 | 250 | ||
| 36 | -Manipulate models in python | 251 | +The tool :ref:`cttsmap` will create one skymap per free spectral parameter in the model. In the result FITS file, |
| 252 | +there will be an extension called "Integral" that contains the flux map. For the above XML example, the source name | ||
| 253 | +"TestSource" should be specified to :ref:`cttsmap`. | ||
| 254 | + | ||
| 255 | +Speed up TS map computation | ||
| 37 | --------------------------- | 256 | --------------------------- |
| 257 | +Since the computation of a TS map can be extremely time consuming, the option of splitting the computation into several jobs | ||
| 258 | +is supported. This might be of particular interest if the user has access to a batch farm. | ||
| 259 | + | ||
| 260 | +Split TS map computation | ||
| 261 | +^^^^^^^^^^^^^^^^^^^^^^^^ | ||
| 262 | +For the purpose of job splitting, the hidden parameter ``binmin`` and ``binmax`` were included in the tool. These are integer parameter | ||
| 263 | +that specify which bins should be computed. For instance, if the map should consist of 30x30 =90 pixels, the use could e.g. execute | ||
| 264 | + | ||
| 265 | +.. code-block:: bash | ||
| 266 | + | ||
| 267 | + $ cttsmap binmin=0 binmax=299 | ||
| 268 | + ... | ||
| 269 | + $ cttsmap binmin=300 binmax=599 | ||
| 270 | + ... | ||
| 271 | + $ cttsmap binmin=600 binmax=899 | ||
| 272 | + ... | ||
| 273 | + | ||
| 274 | +on different machines. | ||
| 275 | + | ||
| 276 | +.. note:: | ||
| 277 | + | ||
| 278 | + The output file name of individual jobs can be the same. If the parameters are specified, the output file name will be appended by the suffix | ||
| 279 | + "_<binmin>_<binmax>" to distinguish between the sliced TS maps. | ||
| 280 | + | ||
| 281 | +Merge sliced TS maps | ||
| 282 | +^^^^^^^^^^^^^^^^^^^^ | ||
| 283 | +The tool :ref:`cstsmapmerge` is intended to take care of merging the files that were produced while splitting the TS map computation. | ||
| 284 | +There are several options to pass the files to be merged as arguments: | ||
| 285 | + | ||
| 286 | +* a space-separated list of file names (e.g. tsmap1.fits tsmap2.fits) | ||
| 287 | +* a comma-separated list of file names (e.g. tsmap1.fits,tsmap2.fits) | ||
| 288 | +* a wildcard string (e.g. tsmap*.xml) | ||
| 289 | +* an ASCII file containing the file names, one file per line (e.g. @mymaps.txt) | ||
| 290 | + | ||
| 291 | +In this example the ASCII file method is presented: | ||
| 292 | + | ||
| 293 | +.. code-block:: bash | ||
| 294 | + | ||
| 295 | + # Put slice files into an ascii file | ||
| 296 | + $ ls tsmap_*.fits > tsmapfiles.txt | ||
| 297 | + | ||
| 298 | + # Run cstsmapmerge | ||
| 299 | + $ cstsmapmerge | ||
| 300 | + Input TS map FITS files [@tsmapfiles.txt] | ||
| 301 | + Output TS map FITS file [mytsmap.fits] | ||
| 302 | + | ||
| 38 | 303 | ||
| 39 | Creating a python analysis pipeline | 304 | Creating a python analysis pipeline |
| 40 | ----------------------------------- | 305 | ----------------------------------- |
| 41 | \ No newline at end of file | 306 | \ No newline at end of file |