Jpp test-rotations-new
the software that should make you happy
Loading...
Searching...
No Matches
JCOMPAREHISTOGRAMS::JTestKolmogorov_2D Class Reference

Implementation of the Kolmogorov test for 2D histograms. More...

#include <JTestKolmogorov_2D.hh>

Inheritance diagram for JCOMPAREHISTOGRAMS::JTestKolmogorov_2D:
JCOMPAREHISTOGRAMS::JTest_t std::vector< JTestResult >

Public Member Functions

 JTestKolmogorov_2D ()
 Default constructor.
 
void test (const TObject *o1, const TObject *o2) override
 Applies Kolmogorov test for two ROOT TH2 histograms.
 
std::istream & read (std::istream &in) override
 Read test parameters from input.
 
virtual std::ostream & write (std::ostream &out, const char delimiter=' ', const bool onlyFailures=false) const
 Write test result to output.
 
virtual void save (TFile *f, const std::string &path, const bool onlyFailures=false) const
 Writes the test result to root file.
 
const std::string & getTestName () const
 Get test name.
 
const std::string & getResultType () const
 Get result type.
 

Protected Attributes

const std::string testName
 test name
 
const std::string resultType
 test result type
 

Private Attributes

double threshold
 threshold p-value to decide if test is passed.
 

Detailed Description

Implementation of the Kolmogorov test for 2D histograms.


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.
This test compares two 2D histograms. If the parameter slice equals x, X y or Y, the histograms are sliced along the corresponding axis, and the Kolmogorov test is applied to each slice.
If slice equals n or N, the histograms are not sliced, and JKolmogorovTest_2D() is applied.
The input parameter threshold, is used to evaluate whether the test is passed or failed for each slice or for the full 2D distribution.
The parameter threshold should therefore be a real value between 0 and 1.

Definition at line 30 of file JTestKolmogorov_2D.hh.

Constructor & Destructor Documentation

◆ JTestKolmogorov_2D()

JCOMPAREHISTOGRAMS::JTestKolmogorov_2D::JTestKolmogorov_2D ( )
inline

Default constructor.

Definition at line 38 of file JTestKolmogorov_2D.hh.

38 :
39 JTest_t("KS_2D", "p-Value(KS)")
40 {}
JTest_t(const std::string &testName, const std::string &resultType)
Constructor.
Definition JTest_t.hh:51

Member Function Documentation

◆ test()

void JCOMPAREHISTOGRAMS::JTestKolmogorov_2D::test ( const TObject * o1,
const TObject * o2 )
inlineoverridevirtual

Applies Kolmogorov test for two ROOT TH2 histograms.

Parameters
o1First histogram
o2Second histogram

Implements JCOMPAREHISTOGRAMS::JTest_t.

Definition at line 49 of file JTestKolmogorov_2D.hh.

50 {
51 using namespace std;
52 using namespace JPP;
53
54 const TH2* h1 = dynamic_cast<const TH2*>(o1);
55 const TH2* h2 = dynamic_cast<const TH2*>(o2);
56
57 if (h1 == NULL || h2 == NULL) {
58 THROW(JValueOutOfRange, "JTestKolmogorov_2D::test(): Could not cast given TObjects to TH2.");
59 }
60
61 const int n1x = h1->GetNbinsX();
62 const int n2x = h2->GetNbinsX();
63 const int n1y = h1->GetNbinsY();
64 const int n2y = h2->GetNbinsY();
65
66 if(n1x != n2x || n1y != n2y)
67 THROW(JValueOutOfRange, "JTestKolmogorov_2D::test(): Histograms with different bining. The objects: " <<
68 h1->GetName() << " and " << h2->GetName() << " can not be compared." << endl);
69
70 if(h1->Integral() == 0 || h2->Integral() == 0) {
71 THROW(JValueOutOfRange, "JTestKolmogorov_2D::test(): Empty histogram: " <<
72 h1->GetName() << " and " << h2->GetName() << " can not be compared." << endl);
73 }
74
75 const double s1 = 1./h1->Integral();
76 const double s2 = 1./h2->Integral();
77
78 TH2* h3 = (TH2*) h1->Clone(h1->GetName() == h2->GetName() ?
79 MAKE_CSTRING(h1->GetName() << "_" << testName) :
80 MAKE_CSTRING(h1->GetName() << "_VS_" << h2->GetName() << "_" << testName));
81
82 double ew1, ew2, w1 = 0, w2 = 0;
83
84 for (int i = 1; i <= n1x; ++i) {
85 for (int j = 1; j <= n1y; ++j) {
86 ew1 = h1->GetBinError(i,j);
87 ew2 = h2->GetBinError(i,j);
88 w1 += ew1*ew1;
89 w2 += ew2*ew2;
90 }
91 }
92
93 bool afunc1 = false;
94 bool afunc2 = false;
95
96 double esum1 = 0, esum2 = 0;
97
98 if (w1 > 0) {
99 esum1 = 1./s1/s1/w1;
100 } else {
101 afunc1 = true;
102 }
103
104 if (w2 > 0) {
105 esum2 = 1./s2/s2/w2;
106 } else {
107 afunc2 = true;
108 }
109
110 if (afunc2 && afunc1) {
111 THROW(JValueOutOfRange, "JTestKolmogorov_2D::test(): Errors are zero for both histograms");
112 }
113
114 double c1 = 0, c2 = 0;
115
116 double dmax1 = 0;
117
118 for (int i=1 ; i<=n1x ; ++i){
119 for (int j=1 ; j<=n1y ; ++j){
120
121 c1 += s1*h1->GetBinContent(i,j);
122 c2 += s2*h2->GetBinContent(i,j);
123
124 double d = TMath::Abs(c1-c2)*TMath::Sqrt(esum1*esum2/(esum1+esum2));
125
126 dmax1 = TMath::Max(dmax1,TMath::Abs(c1-c2));
127
128 h3->Fill(i,j,d);
129 }
130 }
131
132 c1 = 0, c2 = 0;
133
134 double dmax2 = 0;
135
136 for (int j=1 ; j<=n1y ; ++j){
137 for (int i=1 ; i<=n1x ; ++i){
138
139 c1 += s1*h1->GetBinContent(i,j);
140 c2 += s2*h2->GetBinContent(i,j);
141
142 double d = TMath::Abs(c1-c2)*TMath::Sqrt(esum1*esum2/(esum1+esum2));
143
144 dmax2 = TMath::Max(dmax2,TMath::Abs(c1-c2));
145
146 h3->Fill(i,j,d);
147 }
148 }
149
150 double dmax = 0.5*(dmax1+dmax2);
151
152 double z;
153
154 if (afunc1) {
155 z = dmax*TMath::Sqrt(esum2);
156 } else if (afunc2) {
157 z = dmax*TMath::Sqrt(esum1);
158 } else {
159 z = dmax*TMath::Sqrt(esum1*esum2/(esum1+esum2));
160 }
161
162 const double pValue = TMath::KolmogorovProb(z);
163
164 for (int i=1 ; i<=n1x ; ++i) {
165 for (int j=1 ; j<=n1y ; ++j) {
166 h3->SetBinContent(i,j,TMath::KolmogorovProb(0.5 * h3->GetBinContent(i,j)));
167 }
168 }
169
170 const bool passed = (pValue > threshold);
171
172 const JResultTitle title(testName, resultType, passed, pValue);
173
174 h3->SetTitle(title.getTitle().c_str());
175 h3->GetZaxis()->SetTitle(resultType.c_str());
176
177 const JTestResult r (testName,
178 JRootObjectID(MAKE_STRING(h1->GetDirectory()->GetPath() << h1->GetName())),
179 JRootObjectID(MAKE_STRING(h2->GetDirectory()->GetPath() << h1->GetName())),
180 resultType, pValue, threshold, h3, passed);
181
182 this->push_back(r);
183 }
TCanvas * c1
Global variables to handle mouse events.
#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...
double threshold
threshold p-value to decide if test is passed.
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).
int j
Definition JPolint.hh:801
Structure containing the result of the test.

◆ read()

std::istream & JCOMPAREHISTOGRAMS::JTestKolmogorov_2D::read ( std::istream & in)
inlineoverridevirtual

Read test parameters from input.

Parameters
ininput stream
Returns
input stream

Implements JCOMPAREHISTOGRAMS::JTest_t.

Definition at line 192 of file JTestKolmogorov_2D.hh.

193 {
194 using namespace JPP;
195
196 in >> threshold;
197
199 THROW(JValueOutOfRange, "JTestKolmogorov_2D::read(): Invalid threshold value " << threshold);
200 }
201
202 return in >> threshold;
203 }

◆ write()

virtual std::ostream & JCOMPAREHISTOGRAMS::JTest_t::write ( std::ostream & out,
const char delimiter = ' ',
const bool onlyFailures = false ) const
inlinevirtualinherited

Write test result to output.

Parameters
outoutput stream
delimiterfield delimiter
onlyFailuresif true, write only failures.
Returns
output stream

Definition at line 84 of file JTest_t.hh.

87 {
88 using namespace std;
89 using namespace JPP;
90
91 for (vector<JTestResult>::const_iterator r = this->begin() ; r != this->end() ; ++r) {
92
93 if (onlyFailures && r->passed) { continue; }
94
95 print(out, *r, delimiter, true);
96 }
97
98 return out;
99 }
std::ostream & print(std::ostream &out, const JTestSummary &summary, const char delimiter=' ', const bool useColors=true)
Print test summary.

◆ save()

virtual void JCOMPAREHISTOGRAMS::JTest_t::save ( TFile * f,
const std::string & path,
const bool onlyFailures = false ) const
inlinevirtualinherited

Writes the test result to root file.

Parameters
fA ROOT file
pathPath in root file.
onlyFailuresIf true, write only failures.

Definition at line 108 of file JTest_t.hh.

111 {
112 using namespace std;
113 using namespace JPP;
114
115 if (f->GetDirectory(path.c_str())==0) {
116 f->mkdir(path.c_str());
117 }
118
119 f->cd(path.c_str());
120
121 for (vector<JTestResult>::const_iterator r = this->begin() ; r != this->end() ; ++r) {
122
123 if (onlyFailures && r->passed) { continue; }
124
125 r->obj->Write();
126 }
127 }

◆ getTestName()

const std::string & JCOMPAREHISTOGRAMS::JTest_t::getTestName ( ) const
inlineinherited

Get test name.

Returns
test name

Definition at line 135 of file JTest_t.hh.

136 {
137 return testName;
138 }

◆ getResultType()

const std::string & JCOMPAREHISTOGRAMS::JTest_t::getResultType ( ) const
inlineinherited

Get result type.

Returns
result type

Definition at line 146 of file JTest_t.hh.

147 {
148 return resultType;
149 }

Member Data Documentation

◆ threshold

double JCOMPAREHISTOGRAMS::JTestKolmogorov_2D::threshold
private

threshold p-value to decide if test is passed.

Definition at line 208 of file JTestKolmogorov_2D.hh.

◆ testName

const std::string JCOMPAREHISTOGRAMS::JTest_t::testName
protectedinherited

test name

Definition at line 180 of file JTest_t.hh.

◆ resultType

const std::string JCOMPAREHISTOGRAMS::JTest_t::resultType
protectedinherited

test result type

Definition at line 181 of file JTest_t.hh.


The documentation for this class was generated from the following file: