/[PAMELA software]/PamCut/CollectionActions/Histo1DActions/Histo1DAction/Histo1DAction.h
ViewVC logotype

Contents of /PamCut/CollectionActions/Histo1DActions/Histo1DAction/Histo1DAction.h

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.5 - (show annotations) (download)
Thu Mar 11 19:14:03 2010 UTC (14 years, 10 months ago) by pam-fi
Branch: MAIN
Changes since 1.4: +5 -6 lines
File MIME type: text/plain
Some bugs fixed.

1 /*
2 * Histo1DAction.h
3 *
4 * Created on: 25/ago/2009
5 * Author: Nicola Mori
6 */
7
8 /*! @file Histo1DAction.h The Histo1DAction class declaration file. */
9
10 #ifndef HISTO1DACTION_H_
11 #define HISTO1DACTION_H_
12
13 #include "../../CollectionAction/CollectionAction.h"
14
15 #include <TH1I.h>
16 #include <TH1F.h>
17 #include <TH1D.h>
18
19 /*! @brief An abstract action that fills a 1-dimensional histogram.
20 *
21 * This abstract class provides all the common methods needed to produce 1-dimensional histograms,
22 * like reading the bins from a file, setting up the root histogram and so on. It handles histograms
23 * both as a ROOT histogram and as a vector. The OnGood() method has to be implemented in children
24 * classes, with the specific physical variable to fill the histogram. Eg., a rigidity histogram class
25 * derived from Histo1DAction could have this OnGood() implementation:
26 *
27 * Fill(event->GetTrack(0)->GetTrkTrack()->GetRigidity());
28 *
29 * Fill() automatically fills the ROOT and the vector histogram.
30 * The template argument HistoType is the type of histogram (Int_t, Double_t,...). In current
31 * implementation, ROOT histograms are only supported for Int_t, Float_t and Double_t. For all the
32 * other types, only the the vector histogram with text file output will be produced. If you want to
33 * implement some new types of ROOT histograms, please specialize the template definitions of _CreateHisto()
34 * and ~Histo1DAction() (see the specializations in the .cpp file).
35 *
36 * */
37 template<class HistoType>
38 class Histo1DAction: public CollectionAction {
39 public:
40
41 /*! @brief Constructor.
42 *
43 * Binning is read from a text file.
44 *
45 * @param actionName The action's name.
46 * @param title The ROOT histogram title.
47 * @param outFileBase The file base name for the histogram output. If "", no output file will be produced.
48 * @param mode The mode of ROOT file creation (see documentation of TFile constructor
49 * in ROOT's reference guide).
50 * @param outRoot If true, an output ROOT file named outFileBase + ".root" will be produced.
51 * @param outText If true, an output text file named outFileBase + ".txt" will be produced. It will overwrite an
52 * eventually existing file with the same name.
53 */
54 Histo1DAction(const char *actionName, TString title, TString outFileBase = "", TString mode = "UPDATE", bool outRoot =
55 false, bool outText = false);
56
57 /*! @brief Destructor
58 *
59 * This has to be specialized for each kind of ROOT histogram.
60 *
61 * */
62 ~Histo1DAction();
63
64 /*! @brief Sets the X axis using a binning read from a a vector.
65 *
66 * @param label The axis' label.
67 * @param bins A vector containing the histogram binning (with sign, eventually; from lowest to highest).
68 */
69 void SetXAxis(TString label, vector<float> &bins);
70 /*! @brief Sets the X axis reading the binning from a file.
71 *
72 * @param label The axis' label.
73 * @param binsFile The file containing the bins (with sign, eventually; from lowest to highest).
74 */
75 void SetXAxis(TString label, TString binsFile);
76 /*! @brief Sets the X axis specifying the binning parameters.
77 *
78 * @param label The axis' label.
79 * @param nBins The number of bins.
80 * @param min The lower limit of the axis.
81 * @param max The upper limit of the axis.
82 * @param logBinning If true, bins will be logarithmically spaced.
83 */
84 void SetXAxis(TString label, unsigned int nBins, float min, float max, bool logBinning = false);
85
86 /*! @brief Sets up the histogram
87 *
88 * This routine effectively prepares the histogram, after the desired parameters has been set by #SetXAxis().
89 *
90 * @param events Pointer to PamLevel2 events (unused).
91 */
92 void Setup(PamLevel2 *events) {
93 CollectionAction::Setup(events);
94 _InitHistos();
95
96 }
97 /*! @ brief Post-analysis tasks.
98 *
99 * This method writes the output on a ROOT file if the proper option was set in the constructor.
100 */
101 void Finalize();
102
103 /*! @brief Returns the histogram.
104 *
105 * @return A reference to a vector containing the values of the bins of the histogram.
106 */
107 vector<HistoType> &GetHisto() {
108 return _histo;
109 }
110
111 /*! Fills the ROOT and the vector histogram.
112 *
113 * @param value The value of the X coordinate associated to the event.
114 * @param weight The weight which will be applied to the event.
115 */
116 void Fill(double value, double weight = 1.);
117
118 /*! @brief The number of events which fell below the lower histogram limit. */
119 HistoType GetOverflow() {
120 return _overflow;
121 }
122
123 /*! @brief The number of events which fell above the upper histogram limit. */
124 HistoType GetUnderflow() {
125 return _underflow;
126 }
127
128 protected:
129
130 /*! @brief The vector containing the limits of the bins(from lower to higher). */
131 std::vector<float> _bins;
132 /*! @brief A vector containing the value of the histogram for each bin. */
133 vector<HistoType> _histo;
134 /*! @brief The ROOT histogram. */
135 TH1 *_rootHisto;
136
137 TString _outFileBase;
138 TString _mode;
139 TString _title, _xLabel;
140
141 private:
142
143 HistoType _underflow, _overflow;
144 bool _outRoot;
145 bool _outText;
146 void _CreateHisto();
147 void _InitHistos();
148 };
149
150 template<class HistoType>
151 void Histo1DAction<HistoType>::_CreateHisto() {
152
153 // No ROOT histogram for generic type; see template specializations in .cpp file.
154 _rootHisto = NULL;
155 }
156 // Specializations for _CreateHistos(). See Histo1DAction.cpp
157 template<>
158 void Histo1DAction<Int_t>::_CreateHisto();
159
160 template<>
161 void Histo1DAction<Float_t>::_CreateHisto();
162
163 template<>
164 void Histo1DAction<Double_t>::_CreateHisto();
165
166 template<class HistoType>
167 void Histo1DAction<HistoType>::_InitHistos() {
168
169 _CreateHisto();
170 if (_bins.size() < 2) // SetXAxis not called by the main program, or wrongly filled (only 1 bin limit)
171 SetXAxis("Default X", 10, 0., 1.);
172
173 if (_rootHisto) {
174 Double_t *auxArray = new Double_t[_bins.size()];
175
176 for (unsigned int i = 0; i < _bins.size(); i++) {
177 auxArray[i] = _bins[i];
178 }
179
180 _rootHisto->SetBins(_bins.size() - 1, auxArray);
181 _rootHisto->SetName(GetName());
182 _rootHisto->SetTitle(_title);
183 _rootHisto->SetXTitle(_xLabel);
184 _rootHisto->SetYTitle("Events");
185
186 delete[] auxArray;
187
188 }
189
190 _histo.resize(_bins.size() - 1);
191
192 }
193
194 template<class HistoType>
195 Histo1DAction<HistoType>::~Histo1DAction() {
196
197 delete _rootHisto;
198 _rootHisto = NULL;
199
200 }
201
202 template<class HistoType>
203 Histo1DAction<HistoType>::Histo1DAction(const char *actionName, TString title, TString outFileBase, TString mode,
204 bool outRoot, bool outText) :
205 CollectionAction(actionName), _bins(0), _histo(0), _rootHisto(NULL), _outFileBase(outFileBase), _mode(mode), _title(
206 title), _xLabel(""), _underflow(0), _overflow(0), _outRoot(outRoot), _outText(outText) {
207
208 }
209
210 template<class HistoType>
211 void Histo1DAction<HistoType>::SetXAxis(TString label, vector<float> &bins) {
212
213 _bins = bins;
214 _xLabel = label;
215
216 }
217
218 template<class HistoType>
219 void Histo1DAction<HistoType>::SetXAxis(TString label, TString binsFile) {
220
221 // Reading the bins from file
222 ifstream binListFile;
223 binListFile.open(binsFile);
224
225 TString auxString;
226 _bins.resize(0);
227 while (!binListFile.eof()) {
228 binListFile >> auxString;
229 if (auxString != "") {
230 _bins.push_back(auxString.Atof());
231 }
232 }
233 binListFile.close();
234
235 _xLabel = label;
236
237 }
238
239 template<class HistoType>
240 void Histo1DAction<HistoType>::SetXAxis(TString label, unsigned int nBins, float min, float max, bool logBinning) {
241
242 _bins.resize(nBins + 1);
243
244 if (!logBinning || (logBinning && min <= 0.)) {
245
246 #ifdef DEBUGPAMCUT
247 if (logbinning && rigMin <= 0.)
248 cout << "Warning: logarithmic binning was chosen for X axis but min <= 0. Using linear binning."
249 #endif
250
251 float step = (max - min) / nBins;
252 for (unsigned int i = 0; i < nBins + 1; i++) {
253 _bins[i] = min + i * step;
254 }
255
256 }
257 else {
258
259 double maxExp = log10(max / min);
260 for (unsigned int i = 0; i < nBins + 1; i++) {
261 _bins[i] = min * pow(10., (double) i / ((double) nBins) * maxExp);
262 }
263
264 }
265
266 _xLabel = label;
267 }
268
269 template<class HistoType>
270 inline void Histo1DAction<HistoType>::Fill(double value, double weight) {
271
272 _rootHisto->Fill(value, weight);
273
274 if (value < _bins[0]) {
275 _underflow += (HistoType) weight;
276 return;
277 }
278
279 if (value > _bins[_bins.size() - 1]) {
280 _overflow += (HistoType) weight;
281 return;
282 }
283
284 int xBin = 1;
285 while (value >= _bins[xBin]) {
286 xBin++;
287 }
288 xBin--;
289
290 _histo[xBin] += (HistoType) weight;
291 }
292
293 template<class HistoType>
294 void Histo1DAction<HistoType>::Finalize() {
295
296 if (_outFileBase != "") {
297 // Write the ROOT file
298 if (_rootHisto && _outRoot) {
299 TFile outRootFile((_outFileBase + ".root"), _mode);
300 outRootFile.cd();
301 _rootHisto->Write();
302 outRootFile.Close();
303 }
304
305 //Write the text file
306 if (_outText) {
307 ofstream outTextFile((_outFileBase + ".txt").Data(), ios_base::out);
308 for (unsigned int i = 0; i < _histo.size(); i++) {
309 outTextFile << _histo[i] << "\n";
310 }
311 outTextFile << endl;
312 outTextFile.close();
313 }
314 }
315
316 }
317 #endif /* HISTO1DACTION_H_ */

  ViewVC Help
Powered by ViewVC 1.1.23