Commit dd4efb4666383c0dbbb51fa371c30c18dcf595c4

Authored by knodlseder
1 parent d8a27288

move to examples directory

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