Jpp 20.0.0-rc.1
the software that should make you happy
Loading...
Searching...
No Matches
JTestRuns_1D.hh
Go to the documentation of this file.
1#ifndef __JCOMPAREHISTOGRAMS__JTESTRUNS_1D__
2#define __JCOMPAREHISTOGRAMS__JTESTRUNS_1D__
3
4#include <istream>
5#include <ostream>
6
7#include "JLang/JException.hh"
8
11
12#include "TH1.h"
13
14
15/**
16 * \author rgruiz, bjung
17 */
18namespace JCOMPAREHISTOGRAMS {}
19namespace JPP { using namespace JCOMPAREHISTOGRAMS; }
20
21namespace JCOMPAREHISTOGRAMS {
22
23 /**
24 * Implementation of the Wald-Wolfowitz runs test for 1D histograms.\n
25 * This class is derived from the abstract class JTest_t(). For a general description of the implementation of this and other tests derived from JTest_t(), see its documentation.\n
26 * This test uses the input parameter `threshold` to evaluate whether the test is passed or failed.\n
27 * The evaluation is done by comparing the threshold value with the result of the runs test.
28 */
30 public JTest_t
31 {
32 public:
33
34 /**
35 * Default constructor.
36 */
38 JTest_t("Runs_1D", "#sigma")
39 {}
40
41
42 /**
43 * Tests the statistical compatibility of two ROOT TObjects
44 *
45 * \param o1 First object
46 * \param o2 Second object
47 */
48 void test(const TObject* o1, const TObject* o2) override
49 {
50 using namespace std;
51 using namespace JPP;
52
53 const TH1* h1 = dynamic_cast<const TH1*>(o1);
54 const TH1* h2 = dynamic_cast<const TH1*>(o2);
55
56 if (h1 == NULL || h2 == NULL) {
57 THROW(JValueOutOfRange, "JTestRuns_1D::test(): Could not cast given TObjects to TH1.");
58 }
59
60 if (h1->GetDimension() != 1 || h2->GetDimension() != 1) {
61 THROW(JValueOutOfRange, "JTestRuns_1D::test(): Given histograms must be 1-D.");
62 }
63
64 if(h1->GetNbinsX() != h2->GetNbinsX()) {
65 THROW(JValueOutOfRange, "JTestIdentical::test(): Histograms with different bining. The objects: " <<
66 h1->GetName() << " and " << h2->GetName() << " can not be compared." << endl);
67 }
68
69 const double R = h1->Integral();
70 const double T = h2->Integral();
71
72 TH1* h3 = (TH1*) h1->Clone(h1->GetName() == h2->GetName() ?
73 MAKE_CSTRING(h1->GetName() << "_" << testName) :
74 MAKE_CSTRING(h1->GetName() << "_VS_" << h2->GetName() << "_" << testName));
75
76 for (int i=1 ; i<h1->GetNbinsX() ; ++i) {
77 h3->SetBinContent(i, (T/R)*h1->GetBinContent(i) - h2->GetBinContent(i));
78 }
79
80 bool a = ((T/R)*h1->GetBinContent(1) - h2->GetBinContent(1)) < 0;
81
82 int n = 1;
83 int p = (a ? 1 : 0);
84 int q = (a ? 0 : 1);
85
86 for (int i = 2 ; i<h1->GetNbinsX() ; ++i){
87
88 const bool b = ((T/R)*h1->GetBinContent(i) - h2->GetBinContent(i)) < 0;
89
90 (b ? ++p : ++q);
91
92 if (b != a){
93 ++n;
94 a=b;
95 }
96 }
97
98 const int N = 1 + 2*p*q/(p+q);
99
100 const double S1 = 2*p*q*(2*p*q-p-q);
101 const double S2 = (p+q)*(p+q)*(p+q-1);
102 const double s = sqrt(S1/S2);
103
104 const double d = (N == n ? 0.0 : (n-N)/s);
105
106 const bool passed = (fabs(d) < threshold);
107
108 const JResultTitle title(testName, resultType , passed , fabs(d));
109
110 h3->SetTitle(title.getTitle().c_str());
111 h3->GetYaxis()->SetTitle(resultType.c_str());
112
113 const JTestResult r(testName,
114 JRootObjectID(MAKE_STRING(h1->GetDirectory()->GetPath() << h1->GetName())),
115 JRootObjectID(MAKE_STRING(h2->GetDirectory()->GetPath() << h1->GetName())),
116 resultType, fabs(d), threshold, h3, passed);
117
118 this->push_back(r);
119 }
120
121
122 /**
123 * Read test parameters from input.
124 *
125 * \param in input stream
126 * \return input stream
127 */
128 std::istream& read(std::istream& in) override
129 {
130 using namespace JPP;
131
132 in >> threshold;
133
134 if (threshold < 0.0) {
135 THROW(JValueOutOfRange, "JTestRuns_1D::read(): Invalid threshold value " << threshold);
136 }
137
138 return in;
139 }
140
141 private:
142
143 double threshold; //!< threshold value to decide if test is passed.
144 };
145}
146
147#endif
Exceptions.
#define THROW(JException_t, A)
Marco for throwing exception with std::ostream compatible message.
#define MAKE_CSTRING(A)
Make C-string.
Definition JPrint.hh:72
#define MAKE_STRING(A)
Make string.
Definition JPrint.hh:63
Class dedicated to standardize the title of the graphical objects produced by the JTest_t() derived c...
std::string getTitle() const
Returns a standard string to be used as title of a graphical root object.
Implementation of the Wald-Wolfowitz runs test for 1D histograms.
std::istream & read(std::istream &in) override
Read test parameters from input.
JTestRuns_1D()
Default constructor.
void test(const TObject *o1, const TObject *o2) override
Tests the statistical compatibility of two ROOT TObjects.
double threshold
threshold value to decide if test is passed.
Interface to read input and write output for TObject tests.
Definition JTest_t.hh:42
const std::string resultType
test result type
Definition JTest_t.hh:181
const std::string testName
test name
Definition JTest_t.hh:180
Auxiliary class to handle file name, ROOT directory and object name.
Exception for accessing a value in a collection that is outside of its range.
#define S1(x)
This name space includes all other name spaces (except KM3NETDAQ, KM3NET and ANTARES).
Structure containing the result of the test.