/[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.2 - (show annotations) (download)
Tue Oct 27 10:17:46 2009 UTC (15 years, 2 months ago) by pam-fi
Branch: MAIN
Changes since 1.1: +9 -2 lines
File MIME type: text/plain
Updates in the Doxygen documentation.

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 private:
138
139 unsigned int _underflow, _overflow;
140
141 TString _outFileBase;
142 TString _mode;
143 TString _title, _xLabel;
144 bool _outRoot;
145 bool _outText;
146
147 void _CreateHisto();
148 void _InitHistos();
149 };
150
151 template<class HistoType>
152 void Histo1DAction<HistoType>::_CreateHisto() {
153
154 // No ROOT histogram for generic type; see template specializations in .cpp file.
155 _rootHisto = NULL;
156 }
157
158 template<class HistoType>
159 void Histo1DAction<HistoType>::_InitHistos() {
160
161 _CreateHisto();
162
163 if (_rootHisto) {
164 Double_t *auxArray = new Double_t[_bins.size()];
165
166 for (unsigned int i = 0; i < _bins.size(); i++) {
167 auxArray[i] = _bins[i];
168 }
169
170 _rootHisto->SetBins(_bins.size() - 1, auxArray);
171 _rootHisto->SetName(GetName());
172 _rootHisto->SetTitle(_title);
173 _rootHisto->SetXTitle(_xLabel);
174 _rootHisto->SetYTitle("Events");
175
176 delete[] auxArray;
177
178 }
179
180 _histo.resize(_bins.size() - 1);
181
182 }
183
184 template<class HistoType>
185 Histo1DAction<HistoType>::~Histo1DAction() {
186 }
187
188 template<class HistoType>
189 Histo1DAction<HistoType>::Histo1DAction(const char *actionName, TString title, TString outFileBase, TString mode,
190 bool outRoot, bool outText) :
191 CollectionAction(actionName), _bins(0), _histo(0), _rootHisto(NULL), _outFileBase(outFileBase), _mode(mode), _title(
192 title), _xLabel(""), _outRoot(outRoot), _outText(outText) {
193
194 }
195
196 template<class HistoType>
197 void Histo1DAction<HistoType>::SetXAxis(TString label, vector<float> &bins) {
198
199 _bins = bins;
200 _xLabel = label;
201
202 }
203
204 template<class HistoType>
205 void Histo1DAction<HistoType>::SetXAxis(TString label, TString binsFile) {
206
207 // Reading the bins from file
208 ifstream binListFile;
209 binListFile.open(binsFile);
210
211 TString auxString;
212 _bins.resize(0);
213 while (!binListFile.eof()) {
214 binListFile >> auxString;
215 if (auxString != "") {
216 _bins.push_back(auxString.Atof());
217 }
218 }
219 binListFile.close();
220
221 _xLabel = label;
222
223 }
224
225 template<class HistoType>
226 void Histo1DAction<HistoType>::SetXAxis(TString label, unsigned int nBins, float min, float max, bool logBinning) {
227
228 _bins.resize(nBins + 1);
229
230 if (!logBinning || (logBinning && min <= 0.)) {
231
232 #ifdef DEBUGPAMCUT
233 if (logbinning && rigMin <= 0.)
234 cout << "Warning: logarithmic binning was chosen for X axis but min <= 0. Using linear binning."
235 #endif
236
237 float step = (max - min) / nBins;
238 for (unsigned int i = 0; i < nBins + 1; i++) {
239 _bins[i] = min + i * step;
240 }
241
242 }
243 else {
244
245 double maxExp = log10(max / min);
246 for (unsigned int i = 0; i < nBins + 1; i++) {
247 _bins[i] = min * pow(10., (double) i / ((double) nBins) * maxExp);
248 }
249
250 }
251
252 _xLabel = label;
253 }
254
255 template<class HistoType>
256 inline void Histo1DAction<HistoType>::Fill(double value, double weight) {
257
258 _rootHisto->Fill(value, weight);
259
260 if (value < _bins[0]) {
261 _underflow += (HistoType) weight;
262 return;
263 }
264
265 if (value > _bins[_bins.size() - 1]) {
266 _overflow += (HistoType) weight;
267 return;
268 }
269
270 int xBin = 1;
271 while (value >= _bins[xBin]) {
272 xBin++;
273 }
274 xBin--;
275
276 _histo[xBin] += (HistoType) weight;
277 }
278
279 template<class HistoType>
280 void Histo1DAction<HistoType>::Finalize() {
281
282 if (_outFileBase != "") {
283 // Write the ROOT file
284 if (_rootHisto && _outRoot) {
285 TFile outRootFile((_outFileBase + ".root"), _mode);
286 outRootFile.cd();
287 _rootHisto->Write();
288 outRootFile.Close();
289 }
290
291 //Write the text file
292 if (_outText) {
293 ofstream outTextFile((_outFileBase + ".txt").Data(), ios_base::out);
294 for (unsigned int i = 0; i < _histo.size(); i++) {
295 outTextFile << _histo[i] << "\n";
296 }
297 outTextFile << endl;
298 outTextFile.close();
299 }
300 }
301
302 }
303 #endif /* HISTO1DACTION_H_ */

  ViewVC Help
Powered by ViewVC 1.1.23