source: trunk/MagicSoft/Mars/mhist/MHAlphaEnergyTime.cc@ 1330

Last change on this file since 1330 was 1330, checked in by tbretz, 23 years ago
*** empty log message ***
File size: 8.9 KB
Line 
1/* ======================================================================== *\
2!
3! *
4! * This file is part of MARS, the MAGIC Analysis and Reconstruction
5! * Software. It is distributed to you in the hope that it can be a useful
6! * and timesaving tool in analysing Data of imaging Cerenkov telescopes.
7! * It is distributed WITHOUT ANY WARRANTY.
8! *
9! * Permission to use, copy, modify and distribute this software and its
10! * documentation for any purpose is hereby granted without fee,
11! * provided that the above copyright notice appear in all copies and
12! * that both that copyright notice and this permission notice appear
13! * in supporting documentation. It is provided "as is" without express
14! * or implied warranty.
15! *
16!
17!
18! Author(s): Thomas Bretz 1/2002 <mailto:tbretz@astro.uni-wuerzburg.de>
19! Author(s): Wolfgang Wittek 1/2002 <mailto:wittek@mppmu.mpg.de>
20!
21! Copyright: MAGIC Software Development, 2000-2002
22!
23!
24\* ======================================================================== */
25
26//////////////////////////////////////////////////////////////////////////////
27// //
28// MHAlphaEnergyTime //
29// //
30// 3D-histogram in alpha, E-est and time //
31// //
32//////////////////////////////////////////////////////////////////////////////
33
34#include "MHAlphaEnergyTime.h"
35
36#include <TCanvas.h>
37
38#include <math.h>
39
40#include "MHillasSrc.h"
41#include "MEnergyEst.h"
42#include "MTime.h"
43
44#include "MBinning.h"
45#include "MParList.h"
46
47#include "MLog.h"
48#include "MLogManip.h"
49
50ClassImp(MHAlphaEnergyTime);
51
52
53// --------------------------------------------------------------------------
54//
55// Default Constructor. It sets name and title of the histogram.
56//
57MHAlphaEnergyTime::MHAlphaEnergyTime(const char *name, const char *title)
58 : fHist()
59{
60 //
61 // set the name and title of this object
62 //
63 fName = name ? name : "MHAlphaEnergyTime";
64 fTitle = title ? title : "3-D histogram in alpha, energy and time";
65
66 fHist.SetDirectory(NULL);
67
68 fHist.SetTitle("3D-plot of alpha, E-est, time");
69 fHist.SetXTitle("\\alpha [\\circ]");
70 fHist.SetYTitle("E_{est} [GeV]");
71 fHist.SetZTitle("time [s]");
72}
73
74// --------------------------------------------------------------------------
75//
76// Set binnings and prepare filling of the histogram
77//
78Bool_t MHAlphaEnergyTime::SetupFill(const MParList *plist)
79{
80 fEnergy = (MEnergyEst*)plist->FindObject("MEnergyEst");
81 if (!fEnergy)
82 {
83 *fLog << err << dbginf << "MEnergyEst not found... aborting." << endl;
84 return kFALSE;
85 }
86
87 fTime = (MTime*)plist->FindObject("MTime");
88 if (!fTime)
89 {
90 *fLog << err << dbginf << "MTime not found... aborting." << endl;
91 return kFALSE;
92 }
93
94 MBinning* binsenergy = (MBinning*)plist->FindObject("BinningE");
95 MBinning* binsalpha = (MBinning*)plist->FindObject("BinningAlpha");
96 MBinning* binstime = (MBinning*)plist->FindObject("BinningTime");
97 if (!binsenergy || !binsalpha || !binstime)
98 {
99 *fLog << err << dbginf << "At least one MBinning not found... aborting." << endl;
100 return kFALSE;
101 }
102
103 SetBinning(&fHist, binsalpha, binsenergy, binstime);
104
105 fHist.Sumw2();
106
107 return kTRUE;
108}
109
110// --------------------------------------------------------------------------
111//
112// Fill the histogram
113//
114Bool_t MHAlphaEnergyTime::Fill(const MParContainer *par)
115{
116 MHillasSrc &hil = *(MHillasSrc*)par;
117
118 fHist.Fill(hil.GetAlpha(), fEnergy->GetEnergy(), 0.0001*fTime->GetTimeLo());
119 return kTRUE;
120}
121
122// --------------------------------------------------------------------------
123//
124// Draw the histogram
125//
126void MHAlphaEnergyTime::Draw(Option_t *opt)
127{
128 if (!gPad)
129 MakeDefCanvas("AlphaEnergyTime", fTitle);
130
131 gPad->Divide(2,2);
132
133 TH1 *h;
134
135 gPad->cd(1);
136 h = fHist.Project3D("ex");
137
138 h->SetTitle("Distribution of \\alpha [\\circ]");
139 h->SetXTitle("\\alpha [\\circ]");
140 h->SetYTitle("Counts");
141
142 h->Draw(opt);
143 h->SetBit(kCanDelete);
144
145 gPad->cd(2);
146 h = fHist.Project3D("ey");
147
148 h->SetTitle("Distribution of E-est [GeV]");
149 h->SetXTitle("E_{est} [GeV]");
150 h->SetYTitle("Counts");
151
152 h->Draw(opt);
153 h->SetBit(kCanDelete);
154 gPad->SetLogx();
155
156 gPad->cd(3);
157 h = fHist.Project3D("ez");
158
159 h->SetTitle("Distribution of time [s]");
160 h->SetXTitle("time [s]");
161 h->SetYTitle("Counts");
162
163 h->Draw(opt);
164 h->SetBit(kCanDelete);
165
166 gPad->cd(4);
167 fHist.Draw(opt);
168
169 gPad->Modified();
170 gPad->Update();
171
172}
173
174// --------------------------------------------------------------------------
175//
176// Draw copies of the histogram
177//
178TObject *MHAlphaEnergyTime::DrawClone(Option_t *opt) const
179{
180 TCanvas &c = *MakeDefCanvas("AlphaEnergyTime", fTitle);
181
182 c.Divide(2, 2);
183
184 gROOT->SetSelectedPad(NULL);
185
186 TH1 *h;
187
188 c.cd(1);
189 h = ((TH3D*)(&fHist))->Project3D("ex");
190
191 h->SetTitle("Distribution of \\alpha [\\circ]");
192 h->SetXTitle("\\alpha [\\circ]");
193 h->SetYTitle("Counts");
194
195 h->Draw(opt);
196 h->SetBit(kCanDelete);
197
198 c.cd(2);
199 h = ((TH3D*)(&fHist))->Project3D("ey");
200
201 h->SetTitle("Distribution of E-est [GeV]");
202 h->SetXTitle("E-est [GeV] ");
203 h->SetYTitle("Counts");
204
205 h->Draw(opt);
206 h->SetBit(kCanDelete);
207 gPad->SetLogx();
208
209 c.cd(3);
210 h = ((TH3D*)(&fHist))->Project3D("ez");
211
212 h->SetTitle("Distribution of time [s]");
213 h->SetXTitle("time [s]");
214 h->SetYTitle("Counts");
215
216 h->Draw(opt);
217 h->SetBit(kCanDelete);
218
219 c.cd(4);
220 ((TH3D&)fHist).DrawCopy(opt);
221
222 c.Modified();
223 c.Update();
224
225 return &c;
226}
227
228// --------------------------------------------------------------------------
229//
230// Calculate the histogram as the difference of two histograms :
231// fHist(gamma) = h1(source) - h2(antisource)
232//
233void MHAlphaEnergyTime::Subtract(const TH3D *h1, const TH3D *h2)
234{
235 // MH::SetBinning(&fHist, (TH1*)h1);
236
237 // fHist.Sumw2();
238 fHist.Add((TH1*)h1, (TH1*)h2, 1, -1); // ROOT: FIXME!
239}
240
241// --------------------------------------------------------------------------
242//
243// Integrate fHist(gamma) in the alpha range (lo, up)
244//
245TH2D *MHAlphaEnergyTime::GetAlphaProjection(Axis_t lo, Axis_t up)
246{
247 if (up < lo)
248 {
249 *fLog << err << fName << ": Alpha projection not possible: lo=" << lo << " up=" << up << endl;
250 return NULL;
251 }
252
253 TAxis &axe = *fHist.GetXaxis();
254
255 Int_t ilo = axe.FindFixBin(lo);
256 Int_t iup = axe.FindFixBin(up);
257
258 const Double_t epslo1 = lo-axe.GetBinLowEdge(ilo);
259 const Double_t epslo2 = axe.GetBinUpEdge(ilo)-lo;
260
261 const Double_t epsup1 = up-axe.GetBinLowEdge(iup);
262 const Double_t epsup2 = axe.GetBinUpEdge(iup)-up;
263
264 const Double_t epslo = epslo1<epslo2 ? epslo1 : epslo2;
265 const Double_t epsup = epsup1<epsup2 ? epsup1 : epsup2;
266
267 if (epslo1>epslo2)
268 ilo++;
269
270 if (epsup1<epsup2)
271 iup--;
272
273 if (epslo>0.01*axe.GetBinWidth(ilo) || epsup>0.01*axe.GetBinWidth(iup))
274 {
275 *fLog << err << fName << ": binning is not adequate for the requested projection:" << endl;
276 *fLog << "Please specify a lower or upper limit which is not more than 1% away from a bin edge" << endl;
277 *fLog << " epslo = " << epslo << endl;
278 *fLog << " epsup = " << epsup << endl;
279 *fLog << " dwl = " << axe.GetBinWidth(ilo) << endl;
280 *fLog << " dwu = " << axe.GetBinWidth(iup) << endl;
281 return NULL;
282 }
283
284 axe.SetRange(ilo, iup);
285
286 TH2D &h2D = *(TH2D *)fHist.Project3D("ezy");
287
288 h2D.SetTitle("2D-plot of time vs. E-est");
289 h2D.SetXTitle("E-est [GeV] ");
290 h2D.SetYTitle("time [s]");
291
292 return &h2D;
293}
294
295//---------------------------------------------------------
296//
297// Draw the projected histogram
298//
299TH2D *MHAlphaEnergyTime::DrawAlphaProjection(Axis_t lo, Axis_t up, Option_t *opt)
300{
301 TH2D *h2D = GetAlphaProjection(lo, up);
302
303 if (!h2D)
304 return NULL;
305
306 char txt[100];
307 sprintf(txt, "No.of Gammas vs. E-est and Time (%.1f < alpha < %.1f deg)", lo, up);
308
309 // TCanvas *c = MakeDefCanvas("AlphaEnergyTime", "2D histogram of gamma signal in energy and time");
310 TCanvas &c = *MakeDefCanvas("AlphaEnergyTime", txt);
311
312 c.Divide(2, 2);
313
314 gROOT->SetSelectedPad(NULL);
315
316 TH1 *h;
317
318 c.cd(1);
319 h = h2D->ProjectionX("Eest", -1, 9999, "E");
320 h->SetTitle("Distribution of E-est [GeV]");
321 h->SetXTitle("E-est [GeV] ");
322 h->SetYTitle("Counts");
323
324 h->Draw(opt);
325 h->SetBit(kCanDelete);
326 gPad->SetLogx();
327
328 c.cd(2);
329 h = h2D->ProjectionY("time", -1, 9999, "E");
330 h->SetTitle("Distribution of time [s]");
331 h->SetXTitle("time [s]");
332 h->SetYTitle("Counts");
333
334 h->Draw(opt);
335 h->SetBit(kCanDelete);
336
337 c.cd(3);
338
339 h2D->DrawCopy(opt);
340 gPad->SetLogx();
341
342 c.Modified();
343 c.Update();
344
345 return h2D;
346}
347
Note: See TracBrowser for help on using the repository browser.