Commit a0c2cfae64191e7761d2f1a66a65f389dad374b6
1 parent
48524efb
Finished the tips section and expanded section about expcube
Showing
2 changed files
with
152 additions
and
28 deletions
doc/source/user_manual/iact_analysis/analysis.rst
| @@ -301,8 +301,15 @@ After binning the events into a three-dimensional cube, an exposure cube has to | @@ -301,8 +301,15 @@ After binning the events into a three-dimensional cube, an exposure cube has to | ||
| 301 | The exposure is defined as the effective area times the dead-time corrected observation time. | 301 | The exposure is defined as the effective area times the dead-time corrected observation time. |
| 302 | Each observation from the input container gets stacked in the resulting cube. The exposure is stored | 302 | Each observation from the input container gets stacked in the resulting cube. The exposure is stored |
| 303 | in units of cm^2 s. The exposure cube does not have to contain the same binning as the event cube | 303 | in units of cm^2 s. The exposure cube does not have to contain the same binning as the event cube |
| 304 | -but for simplicity, the event cube can be passed to adopt the binning parameters. This task is performed by | ||
| 305 | -:ref:`ctexpcube`. | 304 | +but for simplicity, the event cube can be passed to adopt the binning parameters. Note, however, that the |
| 305 | +exposure cube is defined in true sky coordinates and energy while the counts cube is defined in reconstructed | ||
| 306 | +sky coordinates and energy. Consequently, the sky area and energy range covered by the exposure cube should be | ||
| 307 | +slightly larger than that of the counts cube to accommodate for spill over of events due to the point spread function | ||
| 308 | +and energy dispersion. By computing the exposure cube on the same grid as the counts cube, the spill over of events | ||
| 309 | +from sources at the edge of cube will not be handled correctly. In the example below, however, no source at the edge of the | ||
| 310 | +field of view is present. Therefore, for simplicity, the count cube is used as input cube to extract the binning. | ||
| 311 | + | ||
| 312 | +This task of computing the exposure cube is is performed by:ref:`ctexpcube`. | ||
| 306 | 313 | ||
| 307 | .. code-block:: bash | 314 | .. code-block:: bash |
| 308 | 315 |
doc/source/user_manual/iact_analysis/tips.rst
| @@ -2,7 +2,7 @@ | @@ -2,7 +2,7 @@ | ||
| 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 | +This section shows some of the wrinkles that could fascilitate the users' life when running IACT analyses. |
| 6 | 6 | ||
| 7 | Visualise observations | 7 | Visualise observations |
| 8 | ---------------------- | 8 | ---------------------- |
| @@ -12,7 +12,7 @@ Create a skymap of counts | @@ -12,7 +12,7 @@ Create a skymap of counts | ||
| 12 | ^^^^^^^^^^^^^^^^^^^^^^^^^ | 12 | ^^^^^^^^^^^^^^^^^^^^^^^^^ |
| 13 | The tool :ref:`ctskymap` allows to create a single map of counts contained inside an observation container. | 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. | 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. | 15 | +Since :ref:`ctbin` is intended 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. | 16 | Accordingly, :ref:`ctskymap` should be used for a simple visualisation of the counts. |
| 17 | 17 | ||
| 18 | 18 | ||
| @@ -39,8 +39,7 @@ contains these information: | @@ -39,8 +39,7 @@ contains these information: | ||
| 39 | 39 | ||
| 40 | .. code-block:: bash | 40 | .. code-block:: bash |
| 41 | 41 | ||
| 42 | - $ csobsinfo ds9file=pointings.reg | ||
| 43 | - Parfile "csobsinfo.par" not found. Create default parfile. | 42 | + $ csobsinfo ds9file=pointings.reg debug=yes |
| 44 | Event list, counts cube, or observation definition file [obs.xml] | 43 | Event list, counts cube, or observation definition file [obs.xml] |
| 45 | 44 | ||
| 46 | Together with the previously produced skymap, one can plot the pointings using e.g. ds9: | 45 | Together with the previously produced skymap, one can plot the pointings using e.g. ds9: |
| @@ -51,7 +50,7 @@ Together with the previously produced skymap, one can plot the pointings using e | @@ -51,7 +50,7 @@ Together with the previously produced skymap, one can plot the pointings using e | ||
| 51 | 50 | ||
| 52 | Plot zenith angle distribution of observations | 51 | Plot zenith angle distribution of observations |
| 53 | ---------------------------------------------- | 52 | ---------------------------------------------- |
| 54 | -The tool :ref:`csobsinfo` dumps more information into the log file that might be of interest to catch in a script. | 53 | +The tool :ref:`csobsinfo` dumps more information into the log file. Some of them might be of interest to catch in a script. |
| 55 | Therefore, one could simply use this tool via python and plot some distributions: | 54 | Therefore, one could simply use this tool via python and plot some distributions: |
| 56 | 55 | ||
| 57 | .. code-block:: python | 56 | .. code-block:: python |
| @@ -86,7 +85,7 @@ position and sizes of the model on top of a skymap, this tool has the hidden par | @@ -86,7 +85,7 @@ position and sizes of the model on top of a skymap, this tool has the hidden par | ||
| 86 | 85 | ||
| 87 | .. code-block:: bash | 86 | .. code-block:: bash |
| 88 | 87 | ||
| 89 | - csmodelinfo ds9file=models.reg | 88 | + csmodelinfo ds9file=models.reg debug=yes |
| 90 | Input model XML file [$CTOOLS/share/models/crab.xml] | 89 | Input model XML file [$CTOOLS/share/models/crab.xml] |
| 91 | 90 | ||
| 92 | There are several options regarding the color, text and other attributes of the region file. To see a full list, | 91 | There are several options regarding the color, text and other attributes of the region file. To see a full list, |
| @@ -118,7 +117,7 @@ This step will give some guidance how to work with model XML files in python and | @@ -118,7 +117,7 @@ This step will give some guidance how to work with model XML files in python and | ||
| 118 | 117 | ||
| 119 | # Print the spectral parameter "Prefactor" | 118 | # Print the spectral parameter "Prefactor" |
| 120 | prefactor = src.spectral()["Prefactor"] | 119 | prefactor = src.spectral()["Prefactor"] |
| 121 | - print("Prefactor:",prefactor.value(),"+-",prefactor.error()) | 120 | + print("Prefactor: "+str(prefactor.value())+" +- "+str(prefactor.error())) |
| 122 | 121 | ||
| 123 | # Set the prefactor value | 122 | # Set the prefactor value |
| 124 | prefactor.value(3.5e-17) | 123 | prefactor.value(3.5e-17) |
| @@ -140,7 +139,7 @@ This step will give some guidance how to work with model XML files in python and | @@ -140,7 +139,7 @@ This step will give some guidance how to work with model XML files in python and | ||
| 140 | models["Crab"]["Prefactor"].max(1e-16) | 139 | models["Crab"]["Prefactor"].max(1e-16) |
| 141 | 140 | ||
| 142 | # ... or in one step: | 141 | # ... or in one step: |
| 143 | - models["Crab"]["Prefactor].range(1e-18, 1e-16) | 142 | + models["Crab"]["Prefactor"].range(1e-18, 1e-16) |
| 144 | 143 | ||
| 145 | # Remove model from container | 144 | # Remove model from container |
| 146 | models.remove("Crab") | 145 | models.remove("Crab") |
| @@ -231,16 +230,16 @@ should consist of a spectral component using a PowerLaw2 model: | @@ -231,16 +230,16 @@ should consist of a spectral component using a PowerLaw2 model: | ||
| 231 | .. code-block:: xml | 230 | .. code-block:: xml |
| 232 | 231 | ||
| 233 | <source name="TestSource" type="PointSource"> | 232 | <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> | 233 | + <spectrum type="PowerLaw2"> |
| 234 | + <parameter scale="1e-07" name="Integral" min="1e-07" max="1000.0" value="1.0" free="1"/> | ||
| 235 | + <parameter scale="1.0" name="Index" min="-5.0" max="+5.0" value="-2.0" free="1"/> | ||
| 236 | + <parameter scale="1.0" name="LowerLimit" min="10.0" max="1000000.0" value="100.0" free="0"/> | ||
| 237 | + <parameter scale="1.0" name="UpperLimit" min="10.0" max="1000000.0" value="500000.0" free="0"/> | ||
| 238 | + </spectrum> | ||
| 239 | + <spatialModel type="SkyDirFunction"> | ||
| 240 | + <parameter free="0" max="360" min="-360" name="RA" scale="1" value="83.6331" /> | ||
| 241 | + <parameter free="0" max="90" min="-90" name="DEC" scale="1" value="22.0145" /> | ||
| 242 | + </spatialModel> | ||
| 244 | </source> | 243 | </source> |
| 245 | 244 | ||
| 246 | The further content of the rest of the XML model file depends on the user requirements: | 245 | The further content of the rest of the XML model file depends on the user requirements: |
| @@ -260,23 +259,23 @@ is supported. This might be of particular interest if the user has access to a b | @@ -260,23 +259,23 @@ is supported. This might be of particular interest if the user has access to a b | ||
| 260 | Split TS map computation | 259 | Split TS map computation |
| 261 | ^^^^^^^^^^^^^^^^^^^^^^^^ | 260 | ^^^^^^^^^^^^^^^^^^^^^^^^ |
| 262 | For the purpose of job splitting, the hidden parameter ``binmin`` and ``binmax`` were included in the tool. These are integer parameter | 261 | 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 | 262 | +that specify which bins should be computed. For instance, if the map should consist of 30x30(=900) pixels, the user could e.g. execute |
| 264 | 263 | ||
| 265 | .. code-block:: bash | 264 | .. code-block:: bash |
| 266 | 265 | ||
| 267 | - $ cttsmap binmin=0 binmax=299 | 266 | + $ cttsmap binmin=0 binmax=299 outmap=tsmap_0_299.fits |
| 268 | ... | 267 | ... |
| 269 | - $ cttsmap binmin=300 binmax=599 | 268 | + $ cttsmap binmin=300 binmax=599 outmap=tsmap_300_599.fits |
| 270 | ... | 269 | ... |
| 271 | - $ cttsmap binmin=600 binmax=899 | 270 | + $ cttsmap binmin=600 binmax=899 outmap=tsmap_600_899.fits |
| 272 | ... | 271 | ... |
| 273 | 272 | ||
| 274 | -on different machines. | 273 | +Each command could run on a different machine. |
| 275 | 274 | ||
| 276 | .. note:: | 275 | .. note:: |
| 277 | 276 | ||
| 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. | 277 | + The output file name of individual jobs should be different. Otherwise files could overwrite each other. The naming of the individual slices |
| 278 | + is up to the user. | ||
| 280 | 279 | ||
| 281 | Merge sliced TS maps | 280 | Merge sliced TS maps |
| 282 | ^^^^^^^^^^^^^^^^^^^^ | 281 | ^^^^^^^^^^^^^^^^^^^^ |
| @@ -302,4 +301,122 @@ In this example the ASCII file method is presented: | @@ -302,4 +301,122 @@ In this example the ASCII file method is presented: | ||
| 302 | 301 | ||
| 303 | 302 | ||
| 304 | Creating a python analysis pipeline | 303 | Creating a python analysis pipeline |
| 305 | ------------------------------------ | ||
| 306 | \ No newline at end of file | 304 | \ No newline at end of file |
| 305 | +----------------------------------- | ||
| 306 | +It is easily possible to build an own analysis workflow with a simple python script. The following source code example shows a python script | ||
| 307 | +running from gathering observations until fitting spectral points without storing intermediate data products on disk. It assumes that the | ||
| 308 | +environment variable ``$VHEFITS`` is set to the path where IACT FITS data is located. | ||
| 309 | + | ||
| 310 | +.. code-block:: python | ||
| 311 | + | ||
| 312 | + import gammalib | ||
| 313 | + import ctools | ||
| 314 | + import cscripts | ||
| 315 | + | ||
| 316 | + # Set debug flag | ||
| 317 | + debug = True | ||
| 318 | + | ||
| 319 | + # Set flag to use energy dispersion | ||
| 320 | + edisp = False | ||
| 321 | + | ||
| 322 | + # Set inmodel file name | ||
| 323 | + inmodel = "$GAMMALIB/test/data/model_point_plaw.xml" | ||
| 324 | + | ||
| 325 | + # Expand environment variable | ||
| 326 | + inmodel = gammalib.expand_env(inmodel) | ||
| 327 | + | ||
| 328 | + # Extract coordinates and model properties | ||
| 329 | + models = gammalib.GModels(inmodel) | ||
| 330 | + srcname = models[0].name() | ||
| 331 | + ra = models[0]["RA"].value() | ||
| 332 | + dec = models[0]["DEC"].value() | ||
| 333 | + | ||
| 334 | + # Find FITS production name | ||
| 335 | + iactdata = cscripts.csiactdata() | ||
| 336 | + iactdata["debug"] = debug | ||
| 337 | + iactdata.run() | ||
| 338 | + | ||
| 339 | + # Use first available production | ||
| 340 | + prodname = iactdata.names()[0] | ||
| 341 | + | ||
| 342 | + # Run csfindobs | ||
| 343 | + findobs = cscripts.csfindobs() | ||
| 344 | + findobs["ra"] = ra | ||
| 345 | + findobs["dec"] = dec | ||
| 346 | + findobs["rad"] = 2.5 | ||
| 347 | + findobs["prodname"] = prodname | ||
| 348 | + findobs["debug"] = debug | ||
| 349 | + findobs["outfile"] = "NONE" | ||
| 350 | + findobs.run() | ||
| 351 | + | ||
| 352 | + # Retrieve obervation IDs (runlist) | ||
| 353 | + obs_ids = findobs.obs_ids() | ||
| 354 | + | ||
| 355 | + # Build observation container | ||
| 356 | + iactobs = cscripts.csiactobs() | ||
| 357 | + iactobs["prodname"] = prodname | ||
| 358 | + iactobs["inmodel"] = inmodel | ||
| 359 | + iactobs["bkgpars"] = 1 | ||
| 360 | + iactobs["outobs"] = "NONE" | ||
| 361 | + iactobs["outmodel"] = "NONE" | ||
| 362 | + iactobs["debug"] = debug | ||
| 363 | + iactobs.runlist(obs_ids) | ||
| 364 | + iactobs.run() | ||
| 365 | + | ||
| 366 | + # Retrieve observation container and energy boundaries | ||
| 367 | + obs = iactobs.obs() | ||
| 368 | + ebounds = iactobs.ebounds() | ||
| 369 | + | ||
| 370 | + # Run ctselect | ||
| 371 | + select = ctools.ctselect(obs) | ||
| 372 | + select["usepnt"] = True | ||
| 373 | + select["rad"] = 2.5 | ||
| 374 | + select["usethres"] = "DEFAULT" | ||
| 375 | + select["tmin"] = 0.0 | ||
| 376 | + select["tmax"] = 0.0 | ||
| 377 | + select["emin"] = 0.1 | ||
| 378 | + select["emax"] = 100.0 | ||
| 379 | + select["debug"] = debug | ||
| 380 | + select.run() | ||
| 381 | + | ||
| 382 | + # Pass selected observations to ctlike | ||
| 383 | + like = ctools.ctlike(select.obs()) | ||
| 384 | + like["debug"] = debug | ||
| 385 | + like["edisp"] = edisp | ||
| 386 | + like.run() | ||
| 387 | + | ||
| 388 | + # Compute a spectrum and save | ||
| 389 | + spec = cscripts.csspec(like.obs()) | ||
| 390 | + spec["srcname"] = srcname | ||
| 391 | + spec["emin"] = ebounds.emin().TeV() | ||
| 392 | + spec["emax"] = ebounds.emax().TeV() | ||
| 393 | + spec["enumbins"] = 10 | ||
| 394 | + spec["edisp"] = edisp | ||
| 395 | + spec["ebinalg"] = "LOG" | ||
| 396 | + spec["debug"] = debug | ||
| 397 | + spec["outfile"] = "spectrum.fits" | ||
| 398 | + spec.execute() | ||
| 399 | + | ||
| 400 | + # Remove model for excess map computation | ||
| 401 | + like.obs().models().remove(srcname) | ||
| 402 | + | ||
| 403 | + # Compute an excess map | ||
| 404 | + resmap = cscripts.csresmap(like.obs()) | ||
| 405 | + resmap["xref"] = ra | ||
| 406 | + resmap["yref"] = dec | ||
| 407 | + resmap["proj"] = "CAR" | ||
| 408 | + resmap["coordsys"] = "CEL" | ||
| 409 | + resmap["emin"] = ebounds.emin().TeV() | ||
| 410 | + resmap["emax"] = ebounds.emax().TeV() | ||
| 411 | + resmap["nxpix"] = 100 | ||
| 412 | + resmap["nypix"] = 100 | ||
| 413 | + resmap["binsz"] = 0.02 | ||
| 414 | + resmap["outmap"] = "excessmap.fits" | ||
| 415 | + resmap.execute() | ||
| 416 | + | ||
| 417 | +The results of this analysis workflow can be inspected using an example python script and e.g. ds9: | ||
| 418 | + | ||
| 419 | +.. code-block:: bash | ||
| 420 | + | ||
| 421 | + $ python $CTOOLS/examples/show_spectrum.py spectrum.fits | ||
| 422 | + $ ds9 excessmap.fits | ||
| 423 | + | ||
| 307 | \ No newline at end of file | 424 | \ No newline at end of file |