Jpp  18.3.0-209-g56ce19a
the software that should make you happy
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
Public Member Functions | Protected Attributes | Private Attributes | List of all members
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. More...
 
void test (const TObject *o1, const TObject *o2) override
 Applies Kolmogorov test for two ROOT TH2 histograms. More...
 
std::istream & read (std::istream &in) override
 Read test parameters from input. More...
 
virtual std::ostream & write (std::ostream &out, const char delimiter= ' ', const bool onlyFailures=false) const
 Write test result to output. More...
 
virtual void save (TFile *f, const std::string &path, const bool onlyFailures=false) const
 Writes the test result to root file. More...
 
const std::stringgetTestName () const
 Get test name. More...
 
const std::stringgetResultType () const
 Get result type. More...
 

Protected Attributes

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

Private Attributes

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

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 29 of file JTestKolmogorov_2D.hh.

Constructor & Destructor Documentation

JCOMPAREHISTOGRAMS::JTestKolmogorov_2D::JTestKolmogorov_2D ( )
inline

Default constructor.

Definition at line 37 of file JTestKolmogorov_2D.hh.

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

Member Function Documentation

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 48 of file JTestKolmogorov_2D.hh.

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

192  {
193  using namespace JPP;
194 
195  in >> threshold;
196 
197  if (threshold < 0.0 || threshold > 1.0) {
198  THROW(JValueOutOfRange, "JTestKolmogorov_2D::read(): Invalid threshold value " << threshold);
199  }
200 
201  return in >> threshold;
202  }
#define THROW(JException_t, A)
Marco for throwing exception with std::ostream compatible message.
Definition: JException.hh:712
then fatal The output file must have the wildcard in the e g root fi eval JPrintDetector a $DETECTOR O IDENTIFIER eval JPrintDetector a $DETECTOR O SUMMARY JAcoustics sh $DETECTOR_ID source JAcousticsToolkit sh CHECK_EXIT_CODE typeset A EMITTERS get_tripods $WORKDIR tripod txt EMITTERS get_transmitters $WORKDIR transmitter txt EMITTERS for EMITTER in
Definition: JCanberra.sh:48
double threshold
threshold p-value to decide if test is passed.
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.
data_type r[M+1]
Definition: JPolint.hh:868
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  }
o $QUALITY_ROOT d $DEBUG!CHECK_EXIT_CODE JPlot1D f
Definition: JDataQuality.sh:76
data_type r[M+1]
Definition: JPolint.hh:868
$WORKDIR driver txt done cat $WORKDIR driver txt<< EOFprocess ${DATAFILTER}$FILTER_HOST csh-c '(setenv ROOTSYS $ROOTSYS &&source $JPP_DIR/setenv.csh $JPP_DIR &&(JDataFilter-H\$SERVER\$-M\$LOGGER\$-d $DEBUG-u ${DATAFILTER}-P $PORT</dev/null > &/dev/null &))';process ${DATAWRITER}$WRITER_HOST csh-c '(setenv ROOTSYS $ROOTSYS &&source $JPP_DIR/setenv.csh $JPP_DIR &&(JDataWriter-H\$SERVER\$-M\$LOGGER\$-d $DEBUG-u ${DATAWRITER}</dev/null > &/dev/null &))';print enterevent ev_init{RC_CMD}event ev_reset{RC_CMD}event ev_init{RC_CMD}event ev_configure{RC_DFLTR%<$WORKDIR/ev_configure_datafilter.txt > RC_DQSIM<$WORKDIR/ev_configure_dqsimulator.txt > RC_DWRT path
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  }
const std::string testName
test name
Definition: JTest_t.hh:180
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  }
const std::string resultType
test result type
Definition: JTest_t.hh:181

Member Data Documentation

double JCOMPAREHISTOGRAMS::JTestKolmogorov_2D::threshold
private

threshold p-value to decide if test is passed.

Definition at line 207 of file JTestKolmogorov_2D.hh.

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

test name

Definition at line 180 of file JTest_t.hh.

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: