BOSS 8.0.0
BESIII Offline Software System
Loading...
Searching...
No Matches
AutoHistoCompare.cpp
Go to the documentation of this file.
1//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
2// A class for automatically detect objects in root files and automatically match them between
3// reference files and new sample root files,finally perform comparison by using Ks Test or
4// Chi2-test.
5
6// input : package name
7// reference histogram file
8// new sample histogram file
9//
10// output:Pv distribution
11// comparison plots
12//
13// Created by Xingtao Huang <huangxt@sdu.edu.cn>
14// Date: 2007-07-27
15// Modified By Xingtao Huang
16// Date: 2007-08-20
17// Re-Design: combination of root macros inside this class in order to support different root
18// files. Data: 2008-07-30
19//
20///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
21
22#include <iostream>
23#include <sstream>
24
25#include <TCanvas.h>
26#include <TKey.h>
27#include <TPaveStats.h>
28
29#include "AutoHistoCompare.h"
30
31AutoHistoCompare::AutoHistoCompare( TH1F* h1, const char* oldfn, const char* newfn, int method, bool norm )
32 : method( method )
33 , norm( norm )
34 , PvHisto( h1 )
35 , oldlistfolder( 0 )
36 , newlistfolder( 0 )
37 , olddir( 0 )
38 , newdir( 0 ) {
39
40 oldfile = new TFile( oldfn );
41 oldlist = oldfile->GetListOfKeys();
42
43 newfile = new TFile( newfn );
44 newlist = newfile->GetListOfKeys();
45
46 te = new TText();
47 te->SetTextSize( 0.1 );
48
49 leg = new TLegend( 0.6, 0.83, 0.75, 0.90 );
50 // std::cout << "AutoHistoCompare initialized." << std::endl;
51}
52
54 delete oldfile;
55 delete newfile;
56 delete te;
57 delete leg;
58}
59
61 TIter key_iter( oldlist );
62 TKey* key;
63 TObject* obj;
64 while ( ( key = (TKey*)key_iter() ) )
65 {
66 obj = key->ReadObj();
67 if ( obj->InheritsFrom( "TH1" ) ) { MatchH1( obj ); }
68 if ( key->IsFolder() )
69 {
70 olddir = oldfile->GetDirectory( obj->GetName() );
71 oldlistfolder = olddir->GetListOfKeys();
72 newdir = newfile->GetDirectory( obj->GetName() );
73 newlistfolder = newdir->GetListOfKeys();
75 }
76 }
77}
78
80 TIter next( oldlistfolder );
81 TKey* key;
82 TObject* obj;
83 while ( ( key = (TKey*)next() ) )
84 {
85 obj = key->ReadObj();
86 if ( obj->InheritsFrom( "TH1" ) ) { FolderMatchH1( obj ); }
87 if ( key->IsFolder() ) { std::cout << " It's a 3rd-level Folder!" << std::endl; }
88 }
89 return;
90}
91
92void AutoHistoCompare::MatchH1( TObject* obj ) {
93 char hname[50];
94 sprintf( hname, "%s%s", obj->GetName(), ";1" );
95 oldfile->GetObject( hname, myoldHisto1 );
96 if ( !myoldHisto1 )
97 {
98 std::cout << "==> Failed when converting to TH1." << std::endl;
99 exit( 1 );
100 }
101 newfile->GetObject( hname, mynewHisto1 );
102 if ( !mynewHisto1 )
103 {
104 std::cout << "==> Failed when converting to TH1." << std::endl;
105 exit( 1 );
106 }
107 if ( mynewHisto1->GetEntries() != 0 && myoldHisto1->GetEntries() != 0 ) { ComparisonH1(); }
108}
109
111
112 olddir->GetObject( obj->GetName(), myoldHisto1 );
113 if ( !myoldHisto1 )
114 {
115 std::cout << "==> Failed when converting to TH1." << std::endl;
116 exit( 1 );
117 }
118 newdir->GetObject( obj->GetName(), mynewHisto1 );
119 if ( !mynewHisto1 )
120 {
121 std::cout << "==> Failed when converting to TH1." << std::endl;
122 exit( 1 );
123 }
124 if ( mynewHisto1->GetEntries() != 0 && myoldHisto1->GetEntries() != 0 ) { ComparisonH1(); }
125 return;
126}
127
129
130 char title[50];
131 TCanvas c1;
132
133 myoldHisto1->SetLineColor( 2 );
134 mynewHisto1->SetLineColor( 4 );
135 myoldHisto1->SetLineStyle( 3 );
136 mynewHisto1->SetLineStyle( 5 );
137 myoldHisto1->Draw();
138 if ( norm )
139 {
140 mynewHisto1->Sumw2();
141 mynewHisto1->Scale( myoldHisto1->Integral() / mynewHisto1->Integral() );
142 }
143 mynewHisto1->Draw( "Sames" );
144 c1.Update();
145 // statistics display
146 TPaveStats* p1 = (TPaveStats*)myoldHisto1->GetListOfFunctions()->FindObject( "stats" );
147 myoldHisto1->GetListOfFunctions()->Remove( p1 );
148 myoldHisto1->SetStats( 0 );
149 p1->SetLineColor( 2 );
150 p1->SetX1NDC( 0.76 );
151 p1->SetX2NDC( 0.95 );
152 p1->SetY1NDC( 0.8 );
153 p1->SetY2NDC( 0.95 );
154 p1->Draw();
155
156 TPaveStats* p2 = (TPaveStats*)mynewHisto1->GetListOfFunctions()->FindObject( "stats" );
157 mynewHisto1->GetListOfFunctions()->Remove( p2 );
158 mynewHisto1->SetStats( 0 );
159 p2->SetLineColor( 4 );
160 p2->SetX1NDC( 0.76 );
161 p2->SetX2NDC( 0.95 );
162 p2->SetY1NDC( 0.65 );
163 p2->SetY2NDC( 0.8 );
164 p2->Draw();
165
166 leg->Clear();
167 leg->AddEntry( myoldHisto1, "Reference", "l" );
168 leg->AddEntry( mynewHisto1, "New ", "l" );
169 leg->Draw();
170
171 Double_t res;
172 mypv = 0.000001;
173 if ( method == 1 ) { mypv = myoldHisto1->Chi2Test( mynewHisto1, "UU", &res ); }
174 else { mypv = myoldHisto1->KolmogorovTest( mynewHisto1, "UO" ); }
175 if ( mypv < 0.01 ) { sprintf( title, "%s%s%s", "LT_", myoldHisto1->GetName(), ".eps" ); }
176 else
177 {
178 // sprintf(title,"%s%s", olddir->GetName(), ".eps");
179 sprintf( title, "%s%s", myoldHisto1->GetName(), ".eps" );
180 }
181 // c1.Print(title);
182 PvHisto->Fill( mypv );
183
184 std::stringstream buf;
185 std::string value;
186 buf << "PV=" << mypv << std::endl;
187 buf >> value;
188
189 te->DrawTextNDC( 0.2, 0.2, value.c_str() );
190 c1.Print( title );
191 std::cout << "[OVAL] " << myoldHisto1->GetName() << " PV = " << mypv << std::endl;
192
193 return;
194}
195
197
198 mypv = 0.000001;
199 if ( method == 1 )
200 {
201 mypv = myoldHisto2->Chi2Test( mynewHisto2, "OU" ); // ,res);
202 }
203 else { mypv = myoldHisto2->KolmogorovTest( mynewHisto2, "UO" ); }
204
205 PvHisto->Fill( mypv );
206
207 std::stringstream buf;
208 std::string value;
209 buf << "PV=" << mypv << std::endl;
210 buf >> value;
211
212 te->DrawTextNDC( 0.43, 0.82, value.c_str() );
213
214 std::cout << "[OVAL] " << myoldHisto2->GetName() << " PV = " << mypv << std::endl;
215 return;
216}
217
219
220 mypv = 0.000001;
221 if ( method == 1 )
222 {
223 mypv = myoldProfile->Chi2Test( mynewProfile, "OU" ); //,res);
224 }
225 else { mypv = myoldProfile->KolmogorovTest( mynewProfile, "UO" ); }
226
227 PvHisto->Fill( mypv );
228
229 std::stringstream buf;
230 std::string value;
231 buf << "PV=" << mypv << std::endl;
232 buf >> value;
233
234 te->DrawTextNDC( 0.43, 0.82, value.c_str() );
235
236 std::cout << "[OVAL] " << myoldProfile->GetName() << " PV = " << mypv << std::endl;
237 return;
238}
double p2[4]
double p1[4]
sprintf(cut, "kal_costheta0_em>-0.93&&kal_costheta0_em<0.93&&kal_pxy0_em>=0.05+%d*0.1&&kal_" "pxy0_em<0.15+%d*0.1&&NGch>=2", j, j)
titledef title[20]
*************DOUBLE PRECISION m_pi *DOUBLE PRECISION m_HvecTau2 DOUBLE PRECISION m_HvClone2 DOUBLE PRECISION m_gamma1 DOUBLE PRECISION m_gamma2 DOUBLE PRECISION m_thet1 DOUBLE PRECISION m_thet2 INTEGER m_IFPHOT *COMMON c_Taupair $ !Spin Polarimeter vector first Tau $ !Spin Polarimeter vector second Tau $ !Clone Spin Polarimeter vector first Tau $ !Clone Spin Polarimeter vector second Tau $ !Random Euler angle for cloning st tau $ !Random Euler angle for cloning st tau $ !Random Euler angle for cloning st tau $ !Random Euler angle for cloning nd tau $ !Random Euler angle for cloning nd tau $ !Random Euler angle for cloning nd tau $ !phi of HvecTau1 $ !theta of HvecTau1 $ !phi of HvecTau2 $ !theta of HvecTau2 $ !super key
Definition Taupair.h:42
void MatchH1(TObject *obj)
AutoHistoCompare(TH1F *h1, const char *oldfn, const char *newfn, int method=2, bool norm=false)
void FolderMatchH1(TObject *obj)