Commit 8e6b49b812e99590b90d6b1eaf0b0fd8e67220dd

Authored by knodlseder
1 parent ce9cf8b3

rename to make_unbinned_analysis.py

Showing 1 changed file with 0 additions and 427 deletions
examples/unbinned_analysis.py deleted
1   -#! /usr/bin/env python
2   -# ==========================================================================
3   -# This script illustrates how to build an unbinned analysis pipeline with
4   -# the ctatools. If matplotlib is installed, the spectrum will be displayed
5   -# on the screen.
6   -#
7   -# Required 3rd party modules:
8   -# None
9   -#
10   -# Copyright (C) 2011 Jurgen Knodlseder
11   -#
12   -# This program is free software: you can redistribute it and/or modify
13   -# it under the terms of the GNU General Public License as published by
14   -# the Free Software Foundation, either version 3 of the License, or
15   -# (at your option) any later version.
16   -#
17   -# This program is distributed in the hope that it will be useful,
18   -# but WITHOUT ANY WARRANTY; without even the implied warranty of
19   -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20   -# GNU General Public License for more details.
21   -#
22   -# You should have received a copy of the GNU General Public License
23   -# along with this program. If not, see <http://www.gnu.org/licenses/>.
24   -#
25   -# ==========================================================================
26   -from ctatools import *
27   -from gammalib import *
28   -from math import *
29   -import os
30   -import glob
31   -import sys
32   -
33   -
34   -# ============================= #
35   -# Analysis pipeline - version 1 #
36   -# ============================= #
37   -def pipeline_v1():
38   - """
39   - Unbinned analysis pipeline - save intermediate results.
40   -
41   - This function implements an analysis pipeline that successively calls
42   - ctobssim, ctselect and ctlike by saving the intermediate results as FITS
43   - files on disk. This replicates the way how the analysis would be done
44   - in a ftools-like approach.
45   - """
46   - # Set script parameters
47   - model_name = "${GAMMALIB}/share/models/crab.xml"
48   - events_name = "events.fits"
49   - selected_events_name = "selected_events.fits"
50   - result_name = "results.xml"
51   - caldb = "${GAMMALIB}/share/caldb/cta"
52   - irf = "kb_E_50h_v3"
53   - ra = 83.63
54   - dec = 22.01
55   - rad_sim = 10.0
56   - tstart = 0.0
57   - tstop = 1800.0
58   - emin = 0.1
59   - emax = 100.0
60   - rad_select = 3.0
61   -
62   - # Initialise timing
63   - wall_seconds = 0.0
64   - cpu_seconds = 0.0
65   -
66   - # Simulate events
67   - sim = ctobssim()
68   - sim.logFileOpen()
69   - sim["infile"].filename(model_name)
70   - sim["outfile"].filename(events_name)
71   - sim["caldb"].string(caldb)
72   - sim["irf"].string(irf)
73   - sim["ra"].real(ra)
74   - sim["dec"].real(dec)
75   - sim["rad"].real(rad_sim)
76   - sim["tmin"].real(tstart)
77   - sim["tmax"].real(tstop)
78   - sim["emin"].real(emin)
79   - sim["emax"].real(emax)
80   - sim.execute()
81   - print "Simulated events ("+str(sim.celapse())+" CPU seconds)"
82   -
83   - # Update timing
84   - wall_seconds += sim.telapse()
85   - cpu_seconds += sim.celapse()
86   -
87   - # Select events
88   - select = ctselect()
89   - select.logFileOpen()
90   - select["infile"].filename(events_name)
91   - select["outfile"].filename(selected_events_name)
92   - select["ra"].real(ra)
93   - select["dec"].real(dec)
94   - select["rad"].real(rad_select)
95   - select["tmin"].real(tstart)
96   - select["tmax"].real(tstop)
97   - select["emin"].real(emin)
98   - select["emax"].real(emax)
99   - select.execute()
100   - print "Select event ("+str(select.celapse())+" CPU seconds)"
101   -
102   - # Update timing
103   - wall_seconds += select.telapse()
104   - cpu_seconds += select.celapse()
105   -
106   - # Perform maximum likelihood fitting
107   - like = ctlike()
108   - like.logFileOpen()
109   - like["evfile"].filename(selected_events_name)
110   - like["srcmdl"].filename(model_name)
111   - like["outmdl"].filename(result_name)
112   - like["method"].string("UNBINNED")
113   - like["caldb"].string(caldb)
114   - like["irf"].string(irf)
115   - like.execute()
116   - print "Maximum likelihood fitting ("+str(like.celapse())+" CPU seconds)"
117   -
118   - # Update timing
119   - wall_seconds += like.telapse()
120   - cpu_seconds += like.celapse()
121   -
122   - # Show total times
123   - print "Total wall time elapsed: "+str(wall_seconds)+" seconds"
124   - print "Total CPU time used ...: "+str(cpu_seconds)+" seconds"
125   -
126   - # Return
127   - return
128   -
129   -
130   -# ============================= #
131   -# Analysis pipeline - version 2 #
132   -# ============================= #
133   -def pipeline_v2(show_data):
134   - """
135   - Unbinned analysis pipeline - keep intermediate results in memory.
136   -
137   - This function implements an analysis pipeline that successively calls
138   - ctobssim, ctselect and ctlike without saving the intermediate results as
139   - FITS files on disk. All data is only hold in memory.
140   - """
141   - # Set script parameters
142   - model_name = "${GAMMALIB}/share/models/crab.xml"
143   - caldb = "${GAMMALIB}/share/caldb/cta"
144   - irf = "kb_E_50h_v3"
145   - ra = 83.63
146   - dec = 22.01
147   - rad_sim = 10.0
148   - tstart = 0.0
149   - tstop = 1800.0
150   - emin = 0.1
151   - emax = 100.0
152   - rad_select = 3.0
153   -
154   - # Initialise timing
155   - wall_seconds = 0.0
156   - cpu_seconds = 0.0
157   -
158   - # Simulate events
159   - sim = ctobssim()
160   - sim["infile"].filename(model_name)
161   - sim["caldb"].string(caldb)
162   - sim["irf"].string(irf)
163   - sim["ra"].real(ra)
164   - sim["dec"].real(dec)
165   - sim["rad"].real(rad_sim)
166   - sim["tmin"].real(tstart)
167   - sim["tmax"].real(tstop)
168   - sim["emin"].real(emin)
169   - sim["emax"].real(emax)
170   - sim.run()
171   - print "Simulated events ("+str(sim.celapse())+" CPU seconds)"
172   -
173   - # Update timing
174   - wall_seconds += sim.telapse()
175   - cpu_seconds += sim.celapse()
176   -
177   - # Select events
178   - select = ctselect(sim.obs())
179   - select["ra"].real(ra)
180   - select["dec"].real(dec)
181   - select["rad"].real(rad_select)
182   - select["tmin"].real(tstart)
183   - select["tmax"].real(tstop)
184   - select["emin"].real(emin)
185   - select["emax"].real(emax)
186   - select.run()
187   - print "Select event ("+str(select.celapse())+" CPU seconds)"
188   -
189   - # Update timing
190   - wall_seconds += select.telapse()
191   - cpu_seconds += select.celapse()
192   -
193   - # Perform maximum likelihood fitting
194   - like = ctlike(select.obs())
195   - like.run()
196   - print "Maximum likelihood fitting ("+str(like.celapse())+" CPU seconds)"
197   -
198   - # Update timing
199   - wall_seconds += like.telapse()
200   - cpu_seconds += like.celapse()
201   -
202   - # Show total times
203   - print "Total wall time elapsed: "+str(wall_seconds)+" seconds"
204   - print "Total CPU time used ...: "+str(cpu_seconds)+" seconds"
205   -
206   - # Show model fitting results
207   - #print like.obs().models()
208   -
209   - # Optionally plot counts
210   - if show_data:
211   - plot_counts(like.obs())
212   -
213   - # Return
214   - return
215   -
216   -
217   -# =========== #
218   -# Plot counts #
219   -# =========== #
220   -def plot_counts(observations):
221   - """
222   - Plot counts.
223   - """
224   - # Only proceed if matplotlib is available
225   - try:
226   - # Import matplotlib
227   - import matplotlib.pyplot as plt
228   -
229   - # Set legend fontsize
230   - params = {'legend.fontsize': 10}
231   - plt.rcParams.update(params)
232   -
233   - # Set plot styles
234   - styles = ['b-', 'g-', 'y-', 'n-']
235   -
236   - # Dump header
237   - print ""
238   - print "Make plots (using matplotlib):"
239   - print "=============================="
240   -
241   - # Create figure 1
242   - plt.figure(1,figsize=(12,6))
243   - plt.subplots_adjust(hspace=.7)
244   -
245   - # Create subplot 1
246   - plt.subplot(121)
247   - plt.title("Spectrum (summed over all pixels)")
248   -
249   - # Loop over observations
250   - for obs in observations:
251   -
252   - # Get event list
253   - list = cast_GCTAEventList(obs.events())
254   -
255   - # Create energy axis
256   - ebounds = GEbounds()
257   - emin = GEnergy()
258   - emax = GEnergy()
259   - emin.TeV(0.1)
260   - emax.TeV(100.0)
261   - ebounds.setlog(emin, emax, 10)
262   - energy = [ebounds.elogmean(i).TeV() for i in range(ebounds.size())]
263   -
264   - # Create spectrum
265   - print "Extract data:"
266   - counts = [0.0 for i in range(ebounds.size())]
267   - print list.size()
268   - for atom in list:
269   - index = ebounds.index(atom.energy())
270   - counts[index] = counts[index] + 1.0
271   -
272   - # Create error bars
273   - error = [sqrt(c) for c in counts]
274   -
275   - # Plot spectrum
276   - plt.loglog(energy, counts, 'ro', label='data')
277   - #plt.errorbar(energy, counts, error, fmt=None, ecolor='r')
278   -
279   - # Extract models
280   - print "Extract models:"
281   - sum_model = [0.0 for i in range(ebounds.size())]
282   - for k, m in enumerate(observations.models()):
283   - print "- "+m.name()
284   - model = [0.0 for i in range(ebounds.size())]
285   - for atom in list:
286   - index = ebounds.index(atom.energy())
287   - prob = m.eval(atom, obs)
288   - model[index] = model[index] + prob * atom.size()
289   - for i in range(ebounds.size()):
290   - sum_model[i] = sum_model[i] + model[i]
291   - #plt.loglog(energy, model, styles[k], label=m.name())
292   - #plt.loglog(energy, sum_model, 'r-', label='total')
293   -
294   - # Put labels
295   - plt.xlabel("Energy (TeV)")
296   - plt.ylabel("Counts")
297   - plt.legend(loc="lower left")
298   -
299   - # Create subplot 2
300   - plt.subplot(122)
301   - plt.title("Offset (summed over all energies)")
302   -
303   - # Set Crab direction
304   - crab = GSkyDir()
305   - crab.radec_deg(83.63, 22.01)
306   -
307   - # Loop over observations
308   - for obs in observations:
309   -
310   - # Get event cube
311   - list = cast_GCTAEventList(obs.events())
312   -
313   - # Create offset histogram
314   - print "Extract data:"
315   - nx = 30
316   - doffset2 = 0.01
317   - offset2 = [(i+0.5)*doffset2 for i in range(nx)]
318   - counts = [0.0 for i in range(nx)]
319   - for atom in list:
320   - off = atom.dir().dist_deg(crab)
321   - off2 = off*off
322   - index = int(off2/doffset2)
323   - if index < nx:
324   - counts[index] = counts[index] + 1.0
325   -
326   - # Create error bars
327   - error = [sqrt(c) for c in counts]
328   -
329   - # Plot distribution
330   - plt.semilogy(offset2, counts, 'ro', label='data')
331   -
332   - # Extract models
333   - print "Extract models:"
334   - sum_model = [0.0 for i in range(nx)]
335   - for k, m in enumerate(observations.models()):
336   - print "- "+m.name()
337   - model = [0.0 for i in range(nx)]
338   - for atom in list:
339   - off = atom.dir().dist_deg(crab)
340   - off2 = off*off
341   - index = int(off2/doffset2)
342   - if index < nx:
343   - prob = m.eval(atom, obs)
344   - model[index] = model[index] + prob * atom.size()
345   - for i in range(nx):
346   - sum_model[i] = sum_model[i] + model[i]
347   - #plt.plot(offset2, model, styles[k], label=m.name())
348   - #plt.plot(offset2, sum_model, 'r-', label='total')
349   - #plt.ylim(ymin=0.1)
350   -
351   - # Put labels
352   - plt.xlabel("Offset (deg^2)")
353   - plt.ylabel("Counts")
354   - plt.legend(loc="upper right")
355   -
356   - # Show counts spectra
357   - plt.show()
358   -
359   - except ImportError:
360   - print "Matplotlib is not (correctly) installed on your system. No counts spectra are shown."
361   -
362   - # Return
363   - return
364   -
365   -
366   -#==========================#
367   -# Main routine entry point #
368   -#==========================#
369   -if __name__ == '__main__':
370   - """
371   - CTA unbinned analysis script.
372   -
373   - This script implements the analysis steps to perform an unbinned analysis.
374   - The steps include:
375   - - Event simulation
376   - - Event selection
377   - - Binned maximum likelihood fitting
378   -
379   - Two variations of the script are implemented. One that calls the classes
380   - like executables, storing the intermediate results on disk, and a second
381   - that uses the results of the precedent class directly without storing
382   - any data on disk.
383   - """
384   - # Initialise flags
385   - need_help = False
386   - show_data = True
387   -
388   - # Test for command line arguments
389   - print sys.argv[0]
390   - if (len(sys.argv) > 1):
391   - if sys.argv[1] == "-h":
392   - need_help = True
393   - elif sys.argv[1] == "-noshow":
394   - show_data = False
395   - else:
396   - need_help = True
397   -
398   - # Print help if needed and exit
399   - if need_help:
400   - print "Usage: example_binned.py [OPTIONS]"
401   - print " -h Display this usage message"
402   - print " -noshow Do not show data using matplotlib"
403   - sys.exit()
404   -
405   - # Dump header
406   - print "*********************************"
407   - print "* CTA unbinned analysis scripts *"
408   - print "*********************************"
409   -
410   - # Remove any existing result files
411   - list = [glob.glob("*.fits"), glob.glob("*.log"), glob.glob("*.xml")]
412   - for files in list:
413   - for file in files:
414   - os.remove(file)
415   -
416   - # Save intermediate results on disk
417   - print ""
418   - print "Executable analysis pipeline:"
419   - print "============================="
420   - pipeline_v1()
421   -
422   - # Do analysis in memory
423   - print ""
424   - print "In memory analysis pipeline:"
425   - print "============================"
426   - pipeline_v2(show_data)
427   - print ""