Jpp  master_rocky-43-ge265d140c
the software that should make you happy
JVariance1D.cc
Go to the documentation of this file.
1 
2 #include <string>
3 #include <iostream>
4 #include <iomanip>
5 #include <vector>
6 #include <cmath>
7 
8 #include "TROOT.h"
9 #include "TFile.h"
10 #include "TKey.h"
11 #include "TH1D.h"
12 #include "TH1.h"
13 #include "TString.h"
14 #include "TRegexp.h"
15 
17 #include "JGizmo/JRootObjectID.hh"
18 #include "JGizmo/JGizmoToolkit.hh"
19 
20 #include "Jeep/JParser.hh"
21 #include "Jeep/JMessage.hh"
22 
23 namespace {
24  /**
25  * Additional options for formula.
26  */
27  static const char* const first_t = "first";
28 }
29 
30 
31 /**
32  * \file
33  * Auxiliary program to histogram bin-by-bin deviations of the contents of one (or more) 1D histogram(s).
34  * The option <tt>-f</tt> corresponds to <tt><file name>:<object name></tt>.
35  *
36  * The formula (option <tt>-F <formula></tt>) refers to a ROOT TFormula.
37  * The expression may contain member methods of the corresponding object.
38  *
39  * In case of multiple histograms, the formula is evaluated stand alone (i.e. without ROOT histogram).
40  * If formula equals "first", the bin-by-bin deviations of the contents of the histograms are
41  * evaluated with respect to the first histogram.
42  * \author mdejong
43  */
44 int main(int argc, char **argv)
45 {
46  using namespace std;
47  using namespace JPP;
48 
50 
51  vector<JRootObjectID> inputFile;
52  string outputFile;
53  bool reuse;
54  JHistogram_t X;
55  TString formula;
56  bool reverse;
57  int debug;
58 
59  try {
60 
61  JParser<> zap("Auxiliary program to histogram bin-by-bin deviations of a set of 1D histograms.");
62 
63  zap['f'] = make_field(inputFile, "<input file>:<object name>");
64  zap['o'] = make_field(outputFile, "ROOT file with histogram (possibly I/O, option -r)") = "variance.root";
65  zap['r'] = make_field(reuse, "reuse histogram from existing output file");
66  zap['x'] = make_field(X, "histogram binning");
67  zap['F'] = make_field(formula, "ROOT TFormula (may contain method names of object)") = "0";
68  zap['R'] = make_field(reverse, "reverse sign");
69  zap['d'] = make_field(debug) = 1;
70 
71  zap(argc, argv);
72  }
73  catch(const exception &error) {
74  FATAL(error.what() << endl);
75  }
76 
77 
78  vector<TH1*> listOfHistograms;
79 
80  for (vector<JRootObjectID>::const_iterator input = inputFile.begin(); input != inputFile.end(); ++input) {
81 
82  TH1* h1 = dynamic_cast<TH1*>(getObject(*input));
83 
84  if (h1 != NULL) {
85  listOfHistograms.push_back(h1);
86  }
87  }
88 
89  if (listOfHistograms.empty()) {
90  FATAL("No histograms." << endl);
91  }
92 
93  if (formula == "") {
94  FATAL("Empty formula." << endl);
95  }
96 
97  TH1* h0 = NULL;
98 
99  if (reuse) {
100  h0 = dynamic_cast<TH1*>(getObject(JRootObjectID(outputFile, "h0")));
101  }
102 
103  if (h0 == NULL) {
104  h0 = new TH1D("h0", NULL,
106  }
107 
108 
109  TH1* h1 = listOfHistograms[0];
110 
111  if (listOfHistograms.size() == 1) {
112 
113  const double y1 = getResult(formula, h1);
114 
115  DEBUG(h1->GetName() << ' ' << formula << ' ' << y1 << endl);
116 
117  for (Int_t i = 1; i <= h1->GetNbinsX(); ++i) {
118 
119  const Double_t yp = h1->GetBinContent(i);
120 
121  h0->Fill(reverse ? y1 - yp : yp - y1);
122  }
123 
124  } else {
125 
126  if (formula == first_t) {
127 
128  for (Int_t i = 1; i <= h1->GetNbinsX(); ++i) {
129 
130  const double y1 = h1->GetBinContent(i);
131 
132  for (vector<TH1*>::const_iterator p = listOfHistograms.begin(); ++p != listOfHistograms.end(); ) {
133 
134  const Double_t yp = (*p)->GetBinContent(i);
135 
136  h0->Fill(reverse ? y1 - yp : yp - y1);
137  }
138  }
139 
140  } else {
141 
142  const double y1 = getResult(formula);
143 
144  for (Int_t i = 1; i <= h1->GetNbinsX(); ++i) {
145 
146  for (vector<TH1*>::const_iterator p = listOfHistograms.begin(); p != listOfHistograms.end(); ++p) {
147 
148  const Double_t yp = (*p)->GetBinContent(i);
149 
150  h0->Fill(reverse ? y1 - yp : yp - y1);
151  }
152  }
153  }
154  }
155 
156 
157  TFile out(outputFile.c_str(), "recreate");
158 
159  h0->Write();
160 
161  out.Write();
162  out.Close();
163 }
string outputFile
General purpose messaging.
#define DEBUG(A)
Message macros.
Definition: JMessage.hh:62
#define FATAL(A)
Definition: JMessage.hh:67
int debug
debug level
Definition: JSirene.cc:69
Utility class to parse command line options.
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
Definition: JParser.hh:2142
int main(int argc, char **argv)
Definition: JVariance1D.cc:44
Auxiliary class to handle file name, ROOT directory and object name.
Utility class to parse command line options.
Definition: JParser.hh:1698
T getLowerLimit() const
Get lower limit.
Definition: JRange.hh:202
T getUpperLimit() const
Get upper limit.
Definition: JRange.hh:213
JAbstractHistogram< double > JHistogram_t
Type definition for scan along axis.
Definition: JBillabong.cc:61
TObject * getObject(const JRootObjectID &id)
Get first TObject with given identifier.
Double_t getResult(const TString &text, TObject *object=NULL)
Get result of given textual formula.
This name space includes all other name spaces (except KM3NETDAQ, KM3NET and ANTARES).
Definition: JSTDTypes.hh:14
Simple data structure for histogram binning.
int getNumberOfBins() const
Get number of bins.