Jpp 19.3.0-rc.3
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 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 double p = (a ? 1 : 0);
84 double 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 double N = 1 + 2*p*q/(p+q) ;
99 const double s = sqrt( 2*p*q*(2*p*q-p-q)/(p+q)/(p+q)/(p+q-1) );
100 const double d = (n-N)/s;
101
102 const bool passed = (fabs(d) < threshold);
103
104 const JResultTitle title(testName, resultType , passed , fabs(d));
105
106 h3->SetTitle(title.getTitle().c_str());
107 h3->GetYaxis()->SetTitle(resultType.c_str());
108
109 const JTestResult r(testName,
110 JRootObjectID(MAKE_STRING(h1->GetDirectory()->GetPath() << h1->GetName())),
111 JRootObjectID(MAKE_STRING(h2->GetDirectory()->GetPath() << h1->GetName())),
112 resultType, fabs(d), threshold, h3, passed);
113
114 this->push_back(r);
115 }
116
117
118 /**
119 * Read test parameters from input.
120 *
121 * \param in input stream
122 * \return input stream
123 */
124 std::istream& read(std::istream& in) override
125 {
126 using namespace JPP;
127
128 in >> threshold;
129
130 if (threshold < 0.0) {
131 THROW(JValueOutOfRange, "JTestRuns_1D::read(): Invalid threshold value " << threshold);
132 }
133
134 return in;
135 }
136
137 private:
138
139 double threshold; //!< threshold value to decide if test is passed.
140 };
141}
142
143#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 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.
This name space includes all other name spaces (except KM3NETDAQ, KM3NET and ANTARES).
Structure containing the result of the test.