Jpp  18.5.2
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::JTestRuns_Slice2D Class Reference

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

#include <JTestRuns_Slice2D.hh>

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

Public Member Functions

 JTestRuns_Slice2D ()
 Default constructor. More...
 
void test (const TObject *o1, const TObject *o2) override
 Tests the statistical compatibility of two ROOT TObjects. 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 value to decide if test is passed. More...
 
double failuresThreshold
 threshold value to decide if test is passed. More...
 
char slice
 Axis to slice. x or X for x-axis, y or Y for y-axis, n or N for None. More...
 

Detailed Description

Implementation of the Chi2 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.
The parameter slice can have the values x, X, y or Y. The histograms are sliced along the corresponding axis, and the runs test is applied to each slice.
This test uses the input parameter threshold to evaluate whether the test is passed or failed for each slice.
The evaluation is done by comparing the threshold value with the result of the runs test.
The results for each slice are stored in the results buffer (see JTest_t())

Definition at line 28 of file JTestRuns_Slice2D.hh.

Constructor & Destructor Documentation

JCOMPAREHISTOGRAMS::JTestRuns_Slice2D::JTestRuns_Slice2D ( )
inline

Default constructor.

Definition at line 36 of file JTestRuns_Slice2D.hh.

36  :
37  JTest_t("Runs_2D", "#sigma")
38  {}
JTest_t(const std::string &testName, const std::string &resultType)
Constructor.
Definition: JTest_t.hh:51

Member Function Documentation

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

Tests the statistical compatibility of two ROOT TObjects.

Parameters
o1First object
o2Second object

Implements JCOMPAREHISTOGRAMS::JTest_t.

Definition at line 47 of file JTestRuns_Slice2D.hh.

48  {
49  using namespace std;
50  using namespace JPP;
51 
52  const TH2* h1 = dynamic_cast<const TH2*>(o1);
53  const TH2* h2 = dynamic_cast<const TH2*>(o2);
54 
55  if (h1 == NULL || h2 == NULL) {
56  THROW(JValueOutOfRange, "JTestKolmogorov_Slice2D::test(): Could not cast given TObjects to TH2.");
57  }
58 
59  TH1* h3 = NULL;
60 
61  const char* const h3name = (h1->GetName() == h2->GetName() ?
62  MAKE_CSTRING(h1->GetName() << "_" << testName << "_" << slice) :
63  MAKE_CSTRING(h1->GetName() << "_VS_" << h2->GetName() << "_" << testName << "_" << slice));
64 
65  int nFailures = 0;
66  int nSlices = 0;
67 
68  if (slice == 'x' || slice == 'X') {
69 
70  const int nSlices1 = h1->GetNbinsX();
71  const int nSlices2 = h2->GetNbinsX();
72 
73  if (nSlices1 != nSlices2) {
74  THROW(JValueOutOfRange, "JTestRuns_Slice2D::test(): Histograms with different binning. The objects: " << h1->GetName() << " and " << h2->GetName() << " can not be compared." << endl);
75  }
76 
77  nSlices = nSlices1;
78 
79  h3 = h1->ProjectionX(h3name);
80 
81  for (int i=1 ; i<=nSlices1 ; ++i){
82 
83  const std::string sliceName = MAKE_STRING(h3->GetName() << "_" << to_string(i));
84 
85  const TH1* s1 = h1->ProjectionY (sliceName.c_str(),i,i);
86  const TH1* s2 = h2->ProjectionY (sliceName.c_str(),i,i);
87 
88  if (!(s1->GetSumOfWeights() > 0 && s2->GetSumOfWeights() > 0)) { continue; }
89 
90  const double R = s1->Integral();
91  const double T = s2->Integral();
92 
93  bool a = ((T/R)*s1->GetBinContent(1) - s2->GetBinContent(1)) < 0;
94 
95  int n = 1;
96  double p = (a ? 1 : 0);
97  double q = (a ? 0 : 1);
98 
99  for (int i = 2 ; i<s1->GetNbinsX() ; ++i){
100 
101  const bool b = ((T/R)*s1->GetBinContent(i) - s2->GetBinContent(i)) < 0;
102 
103  (b ? ++p : ++q);
104 
105  if (b != a){
106  ++n;
107  a=b;
108  }
109  }
110 
111  const double N = 1 + 2*p*q/(p+q) ;
112  const double s = sqrt( 2*p*q*(2*p*q-p-q)/(p+q)/(p+q)/(p+q-1) );
113  const double d = (n-N)/s;
114 
115  if (fabs(d) > threshold) nFailures++;
116 
117  h3->SetBinContent(i,fabs(d));
118  }
119 
120  } else if (slice == 'y' || slice == 'Y') {
121 
122  const int nSlices1 = h1->GetNbinsX();
123  const int nSlices2 = h2->GetNbinsX();
124 
125  if (nSlices1 != nSlices2) {
126  THROW(JValueOutOfRange, "JTestRuns_Slice2D::test(): Histograms with different binning. The objects: " << h1->GetName() << " and " << h2->GetName() << " can not be compared." << endl);
127  }
128 
129  nSlices = nSlices1;
130 
131  h3 = h1->ProjectionY(h3name);
132 
133  for (int i=1 ; i<=nSlices1 ; ++i){
134 
135  const std::string sliceName = MAKE_STRING(h3->GetName() << "_" << to_string(i));
136 
137  const TH1* s1 = h1->ProjectionX (sliceName.c_str(),i,i);
138  const TH1* s2 = h2->ProjectionX (sliceName.c_str(),i,i);
139 
140  if (!(s1->GetSumOfWeights() > 0 && s2->GetSumOfWeights() > 0)) { continue; }
141 
142  const double R = s1->Integral();
143  const double T = s2->Integral();
144 
145  bool a = ((T/R)*s1->GetBinContent(1) - s2->GetBinContent(1)) < 0;
146 
147  int n = 1;
148  double p = (a ? 1 : 0);
149  double q = (a ? 0 : 1);
150 
151  for (int i = 2 ; i<s1->GetNbinsX() ; ++i){
152 
153  const 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  const double N = 1 + 2*p*q/(p+q) ;
164  const double s = sqrt( 2*p*q*(2*p*q-p-q)/(p+q)/(p+q)/(p+q-1) );
165  const double d = (n-N)/s;
166 
167  if (fabs(d) > threshold) nFailures++;
168 
169  h3->SetBinContent(i,fabs(d));
170  }
171  }
172 
173  const bool passed = (nFailures/nSlices < failuresThreshold);
174 
175  const JResultTitle title(testName, resultType, passed , nFailures);
176 
177  h3->SetTitle(title.getTitle().c_str());
178  h3->GetYaxis()->SetTitle(resultType.c_str());
179 
180  const JTestResult r(testName,
181  JRootObjectID(MAKE_STRING(h1->GetDirectory()->GetPath() << h1->GetName())),
182  JRootObjectID(MAKE_STRING(h2->GetDirectory()->GetPath() << h1->GetName())),
183  resultType, nFailures, failuresThreshold, h3, passed);
184 
185  this->push_back(r);
186  }
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 int n
Definition: JPolint.hh:786
double failuresThreshold
threshold value to decide if test is passed.
char slice
Axis to slice. x or X for x-axis, y or Y for y-axis, n or N for None.
then JCalibrateToT a
Definition: JTuneHV.sh:113
do set_variable OUTPUT_DIRECTORY $WORKDIR T
then awk string
const std::string resultType
test result type
Definition: JTest_t.hh:181
const std::string testName
test name
Definition: JTest_t.hh:180
then JCookie sh JDataQuality D $DETECTOR_ID R
Definition: JDataQuality.sh:41
double threshold
threshold value to decide if test is passed.
then usage $script< input file >[option[primary[working directory]]] nWhere option can be N
Definition: JMuonPostfit.sh:40
then JMuonMCEvt f $INPUT_FILE o $INTERMEDIATE_FILE d
Definition: JMuonPath.sh:47
std::string to_string(const T &value)
Convert value to string.
Structure containing the result of the test.
Definition: JTestResult.hh:28
std::istream& JCOMPAREHISTOGRAMS::JTestRuns_Slice2D::read ( std::istream &  in)
inlineoverridevirtual

Read test parameters from input.

Parameters
ininput stream
Returns
input stream

Implements JCOMPAREHISTOGRAMS::JTest_t.

Definition at line 195 of file JTestRuns_Slice2D.hh.

196  {
197  using namespace JPP;
198 
200 
201  if (threshold < 0.0) {
202  THROW(JValueOutOfRange, "JTestRuns_Slice2D::read(): Invalid failuresThreshold value " << failuresThreshold);
203  }
204 
205  if (failuresThreshold < 0.0 || failuresThreshold > 1.0) {
206  THROW(JValueOutOfRange, "JTestRuns_Slice2D::read(): Invalid failuresThreshold value " << failuresThreshold);
207  }
208 
209  if (slice != 'x' && slice != 'X' && slice != 'y' && slice != 'Y') {
210  THROW(JValueOutOfRange, "JTestRuns_Slice2D::read(): Invalid slice option \'" << slice << "\'");
211  }
212 
213  return in;
214  };
#define THROW(JException_t, A)
Marco for throwing exception with std::ostream compatible message.
Definition: JException.hh:712
double failuresThreshold
threshold value to decide if test is passed.
char slice
Axis to slice. x or X for x-axis, y or Y for y-axis, n or N for None.
double threshold
threshold value to decide if test is passed.
then fatal Wrong number of arguments fi set_variable DETECTOR $argv[1] set_variable INPUT_FILE $argv[2] 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
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::JTestRuns_Slice2D::threshold
private

threshold value to decide if test is passed.

Definition at line 214 of file JTestRuns_Slice2D.hh.

double JCOMPAREHISTOGRAMS::JTestRuns_Slice2D::failuresThreshold
private

threshold value to decide if test is passed.

Definition at line 219 of file JTestRuns_Slice2D.hh.

char JCOMPAREHISTOGRAMS::JTestRuns_Slice2D::slice
private

Axis to slice. x or X for x-axis, y or Y for y-axis, n or N for None.

Definition at line 220 of file JTestRuns_Slice2D.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: