Commit 3c6c07a170128ba6acb7981e2eb98ce7b9a1a8fc

Authored by Jürgen Knödlseder
1 parent 24f5f1c6

Enhance show_irf.py script

Showing 1 changed file with 96 additions and 28 deletions
examples/show_irf.py
@@ -24,6 +24,8 @@ import gammalib @@ -24,6 +24,8 @@ import gammalib
24 import cscripts 24 import cscripts
25 try: 25 try:
26 import matplotlib.pyplot as plt 26 import matplotlib.pyplot as plt
  27 + from matplotlib import ticker
  28 + from matplotlib.colors import LogNorm
27 plt.figure() 29 plt.figure()
28 plt.close() 30 plt.close()
29 except (ImportError, RuntimeError): 31 except (ImportError, RuntimeError):
@@ -106,7 +108,9 @@ def plot_aeff(sub, aeff, emin=None, emax=None, tmin=None, tmax=None, @@ -106,7 +108,9 @@ def plot_aeff(sub, aeff, emin=None, emax=None, tmin=None, tmax=None,
106 image.append(row) 108 image.append(row)
107 109
108 # Plot image 110 # Plot image
109 - sub.imshow(image, extent=[emin,emax,tmin,tmax], aspect=0.5) 111 + c = sub.imshow(image, extent=[emin,emax,tmin,tmax], aspect=0.5, vmin=1e6, norm=LogNorm())
  112 + cbar = plt.colorbar(c, orientation='horizontal', shrink=0.8)
  113 + cbar.set_label('cm$^2$')
110 114
111 # Show boundary contours 115 # Show boundary contours
112 contours = sub.contour(logenergies, thetas, image, [0.0], colors=('white')) 116 contours = sub.contour(logenergies, thetas, image, [0.0], colors=('white'))
@@ -188,7 +192,7 @@ def plot_psf(sub, psf, emin=None, emax=None, tmin=None, tmax=None, @@ -188,7 +192,7 @@ def plot_psf(sub, psf, emin=None, emax=None, tmin=None, tmax=None,
188 192
189 # Get containment radius value 193 # Get containment radius value
190 value = psf.containment_radius(0.68, logenergy, theta*gammalib.deg2rad) * \ 194 value = psf.containment_radius(0.68, logenergy, theta*gammalib.deg2rad) * \
191 - gammalib.rad2deg 195 + gammalib.rad2deg * 60.0
192 196
193 # Append value 197 # Append value
194 row.append(value) 198 row.append(value)
@@ -197,7 +201,12 @@ def plot_psf(sub, psf, emin=None, emax=None, tmin=None, tmax=None, @@ -197,7 +201,12 @@ def plot_psf(sub, psf, emin=None, emax=None, tmin=None, tmax=None,
197 image.append(row) 201 image.append(row)
198 202
199 # Plot image 203 # Plot image
200 - sub.imshow(image, extent=[emin,emax,tmin,tmax], aspect=0.5, vmin=0.0, vmax=0.5) 204 + c = sub.imshow(image, extent=[emin,emax,tmin,tmax], aspect=0.5, vmin=0.0, vmax=18.0)
  205 + cbar = plt.colorbar(c, orientation='horizontal', shrink=0.8)
  206 + tick_locator = ticker.MaxNLocator(nbins=5)
  207 + cbar.locator = tick_locator
  208 + cbar.update_ticks()
  209 + cbar.set_label('arcmin')
201 210
202 # Show boundary contours 211 # Show boundary contours
203 contours = sub.contour(logenergies, thetas, image, [0.0], colors=('white')) 212 contours = sub.contour(logenergies, thetas, image, [0.0], colors=('white'))
@@ -250,6 +259,12 @@ def plot_edisp(sub, edisp, emin=None, emax=None, tmin=None, tmax=None, @@ -250,6 +259,12 @@ def plot_edisp(sub, edisp, emin=None, emax=None, tmin=None, tmax=None,
250 if emax == None: 259 if emax == None:
251 emax = edisp.table().axis_hi(ieng, neng-1) 260 emax = edisp.table().axis_hi(ieng, neng-1)
252 261
  262 + # Determine migration range
  263 + imigra = edisp.table().axis('MIGRA')
  264 + nmigra = edisp.table().axis_bins(imigra)
  265 + migramin = edisp.table().axis_lo(imigra, 0)
  266 + migramax = edisp.table().axis_hi(imigra, nmigra-1)
  267 +
253 # Determine offset angle range 268 # Determine offset angle range
254 itheta = edisp.table().axis('THETA') 269 itheta = edisp.table().axis('THETA')
255 ntheta = edisp.table().axis_bins(itheta) 270 ntheta = edisp.table().axis_bins(itheta)
@@ -264,18 +279,22 @@ def plot_edisp(sub, edisp, emin=None, emax=None, tmin=None, tmax=None, @@ -264,18 +279,22 @@ def plot_edisp(sub, edisp, emin=None, emax=None, tmin=None, tmax=None,
264 279
265 # Set axes 280 # Set axes
266 denergy = (emax - emin)/(nengs-1) 281 denergy = (emax - emin)/(nengs-1)
  282 + dmigra = (migramax - migramin)/(nmigra-1)
267 dtheta = (tmax - tmin)/(nthetas-1) 283 dtheta = (tmax - tmin)/(nthetas-1)
268 logenergies = [emin+i*denergy for i in range(nengs)] 284 logenergies = [emin+i*denergy for i in range(nengs)]
  285 + migras = [migramin+i*dmigra for i in range(nmigra)]
269 thetas = [tmax-i*dtheta for i in range(nthetas)] 286 thetas = [tmax-i*dtheta for i in range(nthetas)]
270 287
271 - # Initialise image  
272 - image = [] 288 + # Initialise images
  289 + image_mean = []
  290 + image_std = []
273 291
274 # Loop over offset angles 292 # Loop over offset angles
275 for theta in thetas: 293 for theta in thetas:
276 294
277 - # Initialise row  
278 - row = [] 295 + # Initialise rows
  296 + row_mean = []
  297 + row_std = []
279 298
280 # Compute detx and dety 299 # Compute detx and dety
281 detx = theta*gammalib.deg2rad 300 detx = theta*gammalib.deg2rad
@@ -284,26 +303,73 @@ def plot_edisp(sub, edisp, emin=None, emax=None, tmin=None, tmax=None, @@ -284,26 +303,73 @@ def plot_edisp(sub, edisp, emin=None, emax=None, tmin=None, tmax=None,
284 # Loop over energies 303 # Loop over energies
285 for logenergy in logenergies: 304 for logenergy in logenergies:
286 305
287 - # Get no migration energy dispersion value  
288 - value = edisp(logenergy, logenergy, theta*gammalib.deg2rad) 306 + # Compute mean migration
  307 + mean = 0.0
  308 + std = 0.0
  309 + num = 0.0
  310 + for migra in migras:
  311 + if migra > 0.0:
  312 + logobs = math.log10(migra) + logenergy
  313 + value = edisp(logobs, logenergy, theta*gammalib.deg2rad)
  314 + mean += migra * value
  315 + std += migra * migra * value
  316 + num += value
  317 + if num > 0.0:
  318 + mean /= num
  319 + std /= num
  320 + arg = std - mean * mean
  321 + if arg > 0.0:
  322 + std = math.sqrt(arg)
  323 + else:
  324 + std = 0.0
289 325
290 # Append value 326 # Append value
291 - row.append(value) 327 + row_mean.append(mean)
  328 + row_std.append(std)
292 329
293 - # Append row  
294 - image.append(row) 330 + # Append rows
  331 + image_mean.append(row_mean)
  332 + image_std.append(row_std)
  333 +
  334 + # First subplot
  335 + f1 = plt.subplot(223)
295 336
296 # Plot image 337 # Plot image
297 - sub.imshow(image, extent=[emin,emax,tmin,tmax], aspect=0.5) 338 + c1 = f1.imshow(image_mean, extent=[emin,emax,tmin,tmax], aspect=0.5)
  339 + cbar1 = plt.colorbar(c1, orientation='horizontal', shrink=0.8)
  340 + tick_locator = ticker.MaxNLocator(nbins=5)
  341 + cbar1.locator = tick_locator
  342 + cbar1.update_ticks()
  343 + cbar1.set_label('E$_{reco}$ / E$_{true}$')
298 344
299 # Show boundary contours 345 # Show boundary contours
300 - contours = sub.contour(logenergies, thetas, image, [0.0], colors=('white'))  
301 - sub.clabel(contours, inline=1, fontsize=8) 346 + contours = f1.contour(logenergies, thetas, image_mean, [0.0], colors=('white'))
  347 + f1.clabel(contours, inline=1, fontsize=8)
302 348
303 # Plot title and axis 349 # Plot title and axis
304 - sub.set_title('No migration energy dispersion')  
305 - sub.set_xlabel('log10(E/TeV)')  
306 - sub.set_ylabel('Offset angle (deg)') 350 + f1.set_title('Mean of energy dispersion')
  351 + f1.set_xlabel('log10(E/TeV)')
  352 + f1.set_ylabel('Offset angle (deg)')
  353 +
  354 + # Second subplot
  355 + f2 = plt.subplot(224)
  356 +
  357 + # Plot image
  358 + c2 = f2.imshow(image_std, extent=[emin,emax,tmin,tmax], aspect=0.5)
  359 + cbar2 = plt.colorbar(c2, orientation='horizontal', shrink=0.8)
  360 + tick_locator = ticker.MaxNLocator(nbins=5)
  361 + cbar2.locator = tick_locator
  362 + cbar2.update_ticks()
  363 + cbar2.set_label('E$_{reco}$ / E$_{true}$')
  364 +
  365 + # Show boundary contours
  366 + contours = f2.contour(logenergies, thetas, image_std, [0.0], colors=('white'))
  367 + f2.clabel(contours, inline=1, fontsize=8)
  368 +
  369 + # Plot title and axis
  370 + f2.set_title('Standard deviation of energy dispersion')
  371 + f2.set_xlabel('log10(E/TeV)')
  372 + f2.set_ylabel('Offset angle (deg)')
307 373
308 # Return 374 # Return
309 return 375 return
@@ -386,7 +452,9 @@ def plot_bkg(sub, bkg, emin=None, emax=None, tmin=None, tmax=None, @@ -386,7 +452,9 @@ def plot_bkg(sub, bkg, emin=None, emax=None, tmin=None, tmax=None,
386 image.append(row) 452 image.append(row)
387 453
388 # Plot image 454 # Plot image
389 - sub.imshow(image, extent=[emin,emax,tmin,tmax], aspect=0.5) 455 + c = sub.imshow(image, extent=[emin,emax,tmin,tmax], aspect=0.5, norm=LogNorm())
  456 + cbar = plt.colorbar(c, orientation='horizontal', shrink=0.8)
  457 + cbar.set_label('s$^{-1}$ MeV$^{-1}$ sr$^{-1}$')
390 458
391 # Show boundary contours 459 # Show boundary contours
392 contours = sub.contour(logenergies, thetas, image, [0.0], colors=('white')) 460 contours = sub.contour(logenergies, thetas, image, [0.0], colors=('white'))
@@ -454,26 +522,26 @@ def plot_irf(irf, emin, emax, tmin, tmax, plotfile): @@ -454,26 +522,26 @@ def plot_irf(irf, emin, emax, tmin, tmax, plotfile):
454 (gammalib.toupper(mission), instrument, response, selection) 522 (gammalib.toupper(mission), instrument, response, selection)
455 523
456 # Create figure 524 # Create figure
457 - fig = plt.figure(figsize=(12,8)) 525 + fig = plt.figure(figsize=(16,8))
458 526
459 # Add title 527 # Add title
460 fig.suptitle(title, fontsize=16) 528 fig.suptitle(title, fontsize=16)
461 529
462 # Plot Aeff 530 # Plot Aeff
463 - ax1 = fig.add_subplot(221) 531 + ax1 = fig.add_subplot(231)
464 plot_aeff(ax1, irf.aeff(), emin=emin, emax=emax, tmin=tmin, tmax=tmax) 532 plot_aeff(ax1, irf.aeff(), emin=emin, emax=emax, tmin=tmin, tmax=tmax)
465 533
466 # Plot Psf 534 # Plot Psf
467 - ax2 = fig.add_subplot(222) 535 + ax2 = fig.add_subplot(232)
468 plot_psf(ax2, irf.psf(), emin=emin, emax=emax, tmin=tmin, tmax=tmax) 536 plot_psf(ax2, irf.psf(), emin=emin, emax=emax, tmin=tmin, tmax=tmax)
469 537
470 - # Plot Edisp  
471 - ax3 = fig.add_subplot(223)  
472 - plot_edisp(ax3, irf.edisp(), emin=emin, emax=emax, tmin=tmin, tmax=tmax)  
473 -  
474 # Plot Background 538 # Plot Background
475 - ax4 = fig.add_subplot(224)  
476 - plot_bkg(ax4, irf.background(), emin=emin, emax=emax, tmin=tmin, tmax=tmax) 539 + ax3 = fig.add_subplot(233)
  540 + plot_bkg(ax3, irf.background(), emin=emin, emax=emax, tmin=tmin, tmax=tmax)
  541 +
  542 + # Plot Edisp
  543 + ax4 = fig.add_subplot(234)
  544 + plot_edisp(ax4, irf.edisp(), emin=emin, emax=emax, tmin=tmin, tmax=tmax)
477 545
478 # Show plots or save it into file 546 # Show plots or save it into file
479 if len(plotfile) > 0: 547 if len(plotfile) > 0: