source: trunk/MagicSoft/Mars/mhist/MH.cc@ 1211

Last change on this file since 1211 was 1211, checked in by tbretz, 23 years ago
*** empty log message ***
File size: 7.8 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 07/2001 <mailto:tbretz@uni-sw.gwdg.de>
19!
20! Copyright: MAGIC Software Development, 2000-2002
21!
22!
23\* ======================================================================== */
24
25//////////////////////////////////////////////////////////////////////////////
26// //
27// MH //
28// //
29// This is a base tasks for mars histograms. It defines a common interface //
30// for filling the histograms with events (MH::Fill) which is used by a //
31// common 'filler' And a SetupFill member function which may be used //
32// by MFillH. The idea is: //
33// 1) If your Histogram can become filled by one single container //
34// (like MHHillas) you overload MH::Fill and it gets called with //
35// a pointer to the container with which it should be filled. //
36// //
37// 2) You histogram needs several containers to get filled. Than you //
38// have to overload MH::SetupFill and get the necessary objects from //
39// the parameter list. Use this objects in Fill to fill your //
40// histogram. //
41// //
42// If you want to create your own histogram class the new class must be //
43// derived from MH (instead of the base MParContainer) and you must //
44// the fill function of MH. This is the function which is called to fill //
45// the histogram(s) by the data of a corresponding parameter container. //
46// //
47//////////////////////////////////////////////////////////////////////////////
48
49#include "MH.h"
50
51#include <TH1.h>
52#include <TCanvas.h>
53
54#include "MBinning.h"
55
56ClassImp(MH);
57
58// --------------------------------------------------------------------------
59//
60// Default Constructor. It sets name and title only. Typically you won't
61// need to change this.
62//
63MH::MH(const char *name, const char *title)
64{
65 //
66 // set the name and title of this object
67 //
68 fName = name ? name : "MH" ;
69 fTitle = title ? title : "Base class for Mars histograms" ;
70}
71
72// --------------------------------------------------------------------------
73//
74// This is a function which should replace the creation of default
75// canvases like root does. Because this is inconvinient in some aspects.
76// need to change this.
77// You can specify a name for the default canvas and a title. Also
78// width and height can be given.
79// MakeDefCanvas looks for a canvas with the given name. If now name is
80// given the DefCanvasName of root is used. If no such canvas is existing
81// it is created and returned. If such a canvas already exists a new canvas
82// with a name plus anumber is created (the number is calculated by the
83// number of all existing canvases plus one)
84//
85TCanvas *MH::MakeDefCanvas(const char *name, const char *title,
86 const UInt_t w, const UInt_t h)
87{
88 const TList *list = (TList*)gROOT->GetListOfCanvases();
89
90 const char *def = name ? name : gROOT->GetDefCanvasName();
91
92 TCanvas *c;
93 if (list->FindObject(def))
94 {
95 const char *n = StrDup(Form("%s <%d>", def, list->GetSize()+1));
96 c = new TCanvas(n, title, w, h);
97 delete [] n;
98 }
99 else
100 c = new TCanvas(def, title, w, h);
101
102 return c;
103}
104
105// --------------------------------------------------------------------------
106//
107// This function works like MakeDefCanvas(name, title, w, h) but name
108// and title are retrieved from the given TObject.
109//
110TCanvas *MH::MakeDefCanvas(const TObject *obj,
111 const UInt_t w, const UInt_t h)
112{
113 return MakeDefCanvas(obj->GetName(), obj->GetTitle(), w, h);
114}
115
116void MH::SetBinning(TH1 *h, const MBinning *binsx)
117{
118 //
119 // This is a necessary workaround if one wants to set
120 // non-equidistant bins after the initialization
121 // TH1D::fNcells must be set correctly.
122 //
123 h->SetBins(binsx->GetNumBins(), 0, 1);
124
125 //
126 // Set the binning of the current histogram to the binning
127 // in one of the two given histograms
128 //
129 h->GetXaxis()->Set(binsx->GetNumBins(), binsx->GetEdges());
130}
131
132void MH::SetBinning(TH1 *h, const MBinning *binsx, const MBinning *binsy)
133{
134 //
135 // This is a necessary workaround if one wants to set
136 // non-equidistant bins after the initialization
137 // TH1D::fNcells must be set correctly.
138 //
139 h->SetBins(binsx->GetNumBins(), 0, 1,
140 binsy->GetNumBins(), 0, 1);
141
142 //
143 // Set the binning of the current histogram to the binning
144 // in one of the two given histograms
145 //
146 h->GetXaxis()->Set(binsx->GetNumBins(), binsx->GetEdges());
147 h->GetYaxis()->Set(binsy->GetNumBins(), binsy->GetEdges());
148}
149
150void MH::SetBinning(TH1 *h, const MBinning *binsx, const MBinning *binsy, const MBinning *binsz)
151{
152 //
153 // This is a necessary workaround if one wants to set
154 // non-equidistant bins after the initialization
155 // TH1D::fNcells must be set correctly.
156 //
157 h->SetBins(binsx->GetNumBins(), 0, 1,
158 binsy->GetNumBins(), 0, 1,
159 binsz->GetNumBins(), 0, 1);
160
161 //
162 // Set the binning of the current histogram to the binning
163 // in one of the two given histograms
164 //
165 h->GetXaxis()->Set(binsx->GetNumBins(), binsx->GetEdges());
166 h->GetYaxis()->Set(binsy->GetNumBins(), binsy->GetEdges());
167 h->GetZaxis()->Set(binsz->GetNumBins(), binsz->GetEdges());
168}
169
170void MH::SetBinning(TH1 *h, const TArrayD *binsx)
171{
172 MBinning bx;
173 bx.SetEdges(*binsx);
174 SetBinning(h, &bx);
175}
176
177void MH::SetBinning(TH1 *h, const TArrayD *binsx, const TArrayD *binsy)
178{
179 MBinning bx;
180 MBinning by;
181 bx.SetEdges(*binsx);
182 by.SetEdges(*binsy);
183 SetBinning(h, &bx, &by);
184}
185
186void MH::SetBinning(TH1 *h, const TArrayD *binsx, const TArrayD *binsy, const TArrayD *binsz)
187{
188 MBinning bx;
189 MBinning by;
190 MBinning bz;
191 bx.SetEdges(*binsx);
192 by.SetEdges(*binsy);
193 bz.SetEdges(*binsz);
194 SetBinning(h, &bx, &by, &bz);
195}
196
197void MH::SetBinning(TH1 *h, const TAxis *binsx)
198{
199 MBinning bx;
200 bx.SetEdges(*((TAxis*)binsx)->GetXbins()); // FIXME: Root!
201 SetBinning(h, &bx);
202}
203
204void MH::SetBinning(TH1 *h, const TAxis *binsx, const TAxis *binsy)
205{
206 MBinning bx;
207 MBinning by;
208 bx.SetEdges(*((TAxis*)binsx)->GetXbins()); // FIXME: Root!
209 by.SetEdges(*((TAxis*)binsy)->GetXbins()); // FIXME: Root!
210 SetBinning(h, &bx, &by);
211}
212
213void MH::SetBinning(TH1 *h, const TAxis *binsx, const TAxis *binsy, const TAxis *binsz)
214{
215 MBinning bx;
216 MBinning by;
217 MBinning bz;
218 bx.SetEdges(*((TAxis*)binsx)->GetXbins()); // FIXME: Root!
219 by.SetEdges(*((TAxis*)binsy)->GetXbins()); // FIXME: Root!
220 bz.SetEdges(*((TAxis*)binsz)->GetXbins()); // FIXME: Root!
221 SetBinning(h, &bx, &by, &bz);
222}
223
224void MH::SetBinning(TH1 *h, TH1 *x)
225{
226 SetBinning(h, x->GetXaxis(), x->GetYaxis(), x->GetZaxis());
227}
Note: See TracBrowser for help on using the repository browser.