Jpp - the software that should make you happy
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
JTestRuns_t.hh
Go to the documentation of this file.
1 #ifndef __JTESTRUNS_T__
2 #define __JTESTRUNS_T__
3 
4 #include <iostream>
6 
7 /**
8  * \author rgruiz
9  */
10 
11 /**
12  * Implementation of the different Runs-related tests.
13  */
15 {
16 public:
17  /**
18  * Default constructor.
19  */
21 
22  /**
23  * Implements the Wald-Wolfowitx runs test: <https://en.wikipedia.org/wiki/Wald%E2%80%93Wolfowitz_runs_test>
24  * In this, an expected number of runs and a standard deviation are computed from the number of bins and the number of "aboves" and "belows".
25  * The test returns the difference between the observed number of runs and the expected number of runs, expressed in standard deviations.
26  * This is compared to the threshold input parameter.
27  *
28  * \param h1 First histogram
29  * \param h2 Second histogram
30  * \param threshold
31  * \param parameterName Name of the parameter used to test the histograms
32  * \param testName Name of the test used to compare the histograms
33  */
34  JTestResult JRunsTest(TH1* h1, TH1* h2, double threshold, std::string testName, std::string parameterName) {
35 
36  using namespace std;
37  using namespace JPP;
38 
39  if(h1 -> GetNbinsX() != h2 -> GetNbinsX())
40  ERROR("Histograms with different bining. The objects: " << h1 -> GetName() << " can not be compared." << endl);
41 
42  double R = h1->Integral();
43  double T = h2->Integral();
44 
45  TH2D* h3 = (TH2D*)h1->Clone(h1->GetName()==h2->GetName() ?
46  MAKE_CSTRING(to_string(h1->GetName())) :
47  MAKE_CSTRING(to_string(h1->GetName()) + "_VS_" + to_string(h2->GetName())));
48 
49  for (int i=1 ; i<h1->GetNbinsX() ; ++i) {
50  h3->SetBinContent(i , (T/R)*h1->GetBinContent(i) - h2->GetBinContent(i));
51  }
52 
53  int n = 1;
54  double p = 0;
55  double q = 0;
56 
57  bool a = ((T/R)*h1->GetBinContent(1) - h2->GetBinContent(1)) < 0;
58 
59  (a ? p++ : q++);
60 
61  for (int i = 2 ; i<h1->GetNbinsX() ; ++i){
62 
63  bool b = ((T/R)*h1->GetBinContent(i) - h2->GetBinContent(i)) < 0;
64 
65  (b ? p++ : q++);
66 
67  if (b != a){
68  n++;
69  a=b;
70  }
71  }
72 
73  double N = 1 + 2*p*q/(p+q) ;
74  double s = sqrt( 2*p*q*(2*p*q-p-q)/(p+q)/(p+q)/(p+q-1) );
75  double d = (n-N)/s;
76 
77  bool passed;
78 
79  (fabs(d) > threshold ? passed = false : passed = true);
80 
81  JResultTitle title(testName, parameterName , passed , fabs(d));
82 
83  h3->SetTitle(title.getTitle().c_str());
84 
85  JTestResult r (testName,
86  string (h1->GetDirectory()->GetPath()).append(h1->GetName()),
87  string (h2->GetDirectory()->GetPath()).append(h2->GetName()),
88  h1->GetDirectory()->GetFile()->GetName(),
89  h2->GetDirectory()->GetFile()->GetName(),
90  parameterName, fabs(d), threshold, h3, passed);
91 
92  return r;
93  };
94 
95  /**
96  * Runs test for sliced 2D histograms.\n
97  * The histograms are sliced along the axis specified by the slice parameter. A slice per bin is made.\n
98  * For each of the slices, the input parameter threshold, is used to evaluate whether the test is passed or failed.\n
99  * The evaluation is done by comparing the threshold value with the result of the Runs test.\n
100  * The fraction of failed tests is compared to the input parameter failuresThreshold. If this fraction is larger than failuresThreshold, the test fails.
101  *
102  * \param h1 First histogram
103  * \param h2 Second histogram
104  * \param threshold Threshold value for the test result
105  * \param failuresThreshold Threshold value for the fraction of failed tests.
106  * \param testName Name of the test used to compare the histograms
107  * \param parameterName Name of the parameter used to test the histograms
108  * \param slice The axis along which the histogram is sliced.
109  *
110  * \return Test result.
111  */
112  JTestResult JRunsTestSlice(TH2* h1, TH2* h2, double threshold, double failuresThreshold, std::string testName, std::string parameterName, char slice) {
113 
114  using namespace std;
115  using namespace JPP;
116 
117  int nFailures = 0;
118 
119  JTestResult r;
120 
121  if(slice == 'x' || slice == 'X'){
122 
123  int nSlices1 = h1->GetNbinsX();
124  int nSlices2 = h2->GetNbinsX();
125 
126  TH1* h3 = h1->ProjectionX(h1->GetName()==h2->GetName() ?
127  MAKE_CSTRING(to_string(h1->GetName())) :
128  MAKE_CSTRING(to_string(h1->GetName()) + "_VS_" + to_string(h2->GetName())));
129 
130  if(nSlices1 != nSlices2)
131  ERROR("Histograms with different binning. The objects: " << h1->GetName() << " and " << h2->GetName() << " can not be compared." << endl);
132 
133  for (int i=1 ; i<=nSlices1 ; ++i){
134 
135  std::string sliceName = MAKE_STRING(h1->GetName() + to_string("_") + to_string(i));
136 
137  TH1D* s1 = h1->ProjectionY (sliceName.c_str(),i,i);
138  TH1D* s2 = h2->ProjectionY (sliceName.c_str(),i,i);
139 
140  double R = s1->Integral();
141  double T = s2->Integral();
142 
143  int n = 1;
144  double p = 0;
145  double q = 0;
146 
147  bool a = ((T/R)*s1->GetBinContent(1) - s2->GetBinContent(1)) < 0;
148 
149  (a ? p++ : q++);
150 
151  for (int i = 2 ; i<s1->GetNbinsX() ; ++i){
152 
153  bool b = ((T/R)*s1->GetBinContent(i) - s2->GetBinContent(i)) < 0;
154 
155  (b ? p++ : q++);
156 
157  if (b != a){
158  n++;
159  a=b;
160  }
161  }
162 
163  double N = 1 + 2*p*q/(p+q) ;
164  double s = sqrt( 2*p*q*(2*p*q-p-q)/(p+q)/(p+q)/(p+q-1) );
165  double d = (n-N)/s;
166 
167  bool passed;
168 
169  (fabs(d) > threshold ? passed = false : passed = true);
170 
171  if (!passed) nFailures++;
172 
173  h3->SetBinContent(i,fabs(d));
174 
175  }
176 
177  bool passed;
178 
179  (nFailures/nSlices1 > failuresThreshold ? passed = false : passed = true);
180 
181  JResultTitle title(testName, parameterName, passed , nFailures);
182 
183  h3->SetTitle(title.getTitle().c_str());
184 
185  r = JTestResult (testName,
186  string (h1->GetDirectory()->GetPath()).append(h1->GetName()),
187  string (h2->GetDirectory()->GetPath()).append(h2->GetName()),
188  h1->GetDirectory()->GetFile()->GetName(),
189  h2->GetDirectory()->GetFile()->GetName(),
190  parameterName, nFailures, failuresThreshold, h3, passed);
191 
192  }else if (slice == 'y' || slice == 'Y'){
193 
194  int nSlices1 = h1->GetNbinsX();
195  int nSlices2 = h2->GetNbinsX();
196 
197  TH1* h3 = h1->ProjectionY(h1->GetName()==h2->GetName() ?
198  MAKE_CSTRING(to_string(h1->GetName())) :
199  MAKE_CSTRING(to_string(h1->GetName()) + "_VS_" + to_string(h2->GetName())));
200 
201  if(nSlices1 != nSlices2)
202  ERROR("Histograms with different binning. The objects: " << h1->GetName() << " and " << h2->GetName() << " can not be compared." << endl);
203 
204  for (int i=1 ; i<=nSlices1 ; ++i){
205 
206  std::string sliceName = MAKE_STRING(h1->GetName() + to_string("_") + to_string(i));
207 
208  TH1D* s1 = h1->ProjectionX (sliceName.c_str(),i,i);
209  TH1D* s2 = h2->ProjectionX (sliceName.c_str(),i,i);
210 
211  double R = s1->Integral();
212  double T = s2->Integral();
213 
214  int n = 1;
215  double p = 0;
216  double q = 0;
217 
218  bool a = ((T/R)*s1->GetBinContent(1) - s2->GetBinContent(1)) < 0;
219 
220  (a ? p++ : q++);
221 
222  for (int i = 2 ; i<s1->GetNbinsX() ; ++i){
223 
224  bool b = ((T/R)*s1->GetBinContent(i) - s2->GetBinContent(i)) < 0;
225 
226  (b ? p++ : q++);
227 
228  if (b != a){
229  n++;
230  a=b;
231  }
232  }
233 
234  double N = 1 + 2*p*q/(p+q) ;
235  double s = sqrt( 2*p*q*(2*p*q-p-q)/(p+q)/(p+q)/(p+q-1) );
236  double d = (n-N)/s;
237 
238  bool passed;
239 
240  (fabs(d) > threshold ? passed = false : passed = true);
241 
242  if (!passed) nFailures++;
243 
244  h3->SetBinContent(i,fabs(d));
245 
246  }
247 
248  bool passed;
249 
250  (nFailures/nSlices1 > failuresThreshold ? passed = false : passed = true);
251 
252  JResultTitle title(testName, parameterName, passed , nFailures);
253 
254  h3->SetTitle(title.getTitle().c_str());
255 
256  r = JTestResult (testName,
257  string (h1->GetDirectory()->GetPath()).append(h1->GetName()),
258  string (h2->GetDirectory()->GetPath()).append(h2->GetName()),
259  h1->GetDirectory()->GetFile()->GetName(),
260  h2->GetDirectory()->GetFile()->GetName(),
261  parameterName, nFailures, failuresThreshold, h3, passed);
262 
263  }
264 
265  return r;
266  };
267 };
268 
269 #endif
Class dedicated to standardize the title of the graphical objects produced by the JTest_t() derived c...
Definition: JTest_t.hh:22
JTestResult JRunsTestSlice(TH2 *h1, TH2 *h2, double threshold, double failuresThreshold, std::string testName, std::string parameterName, char slice)
Runs test for sliced 2D histograms.
Definition: JTestRuns_t.hh:112
#define MAKE_CSTRING(A)
Make C-string.
Definition: JPrint.hh:151
then for HISTOGRAM in h0 h1
Definition: JMatrixNZ.sh:69
data_type r[M+1]
Definition: JPolint.hh:742
Structure containing the result of the test.
Definition: JTest_t.hh:164
#define MAKE_STRING(A)
Make string.
Definition: JPrint.hh:142
do set_variable OUTPUT_DIRECTORY $WORKDIR T
#define ERROR(A)
Definition: JMessage.hh:66
std::string getTitle()
Returns a standard string to be used as title of a graphical root object.
Definition: JTest_t.hh:67
JTestRuns_t()
Default constructor.
Definition: JTestRuns_t.hh:20
then echo Variable JPP_DIR undefined exit fi source $JPP_DIR setenv sh $JPP_DIR set_variable NORTH set_variable EAST set_variable SOUTH set_variable WEST set_variable WORKDIR tmp set_variable R set_variable CT set_variable YMAX set_variable YMIN if do_usage *then usage $script[distance] fi case set_variable R
Definition: JDrawLED.sh:35
then JMuonMCEvt f $INPUT_FILE o $INTERMEDIATE_FILE d
Definition: JMuonPath.sh:45
then JCalibrateToT a
Definition: JTuneHV.sh:116
alias put_queue eval echo n
Definition: qlib.csh:19
Implementation of the different Runs-related tests.
Definition: JTestRuns_t.hh:14
std::string to_string(const T &value)
Convert value to string.
then usage $script[input file[working directory[option]]] nWhere option can be N
Definition: JMuonPostfit.sh:35
JTestResult JRunsTest(TH1 *h1, TH1 *h2, double threshold, std::string testName, std::string parameterName)
Implements the Wald-Wolfowitx runs test: https://en.wikipedia.org/wiki/Wald%E2%80%93Wolfowitz_runs_te...
Definition: JTestRuns_t.hh:34