BOSS 8.0.0
BESIII Offline Software System
Loading...
Searching...
No Matches
calib_endcap_atten.cxx
Go to the documentation of this file.
2#include "TF1.h"
3
4// Q fit function
5static double endcapQFunc( double* x, double* par ) {
6 double xx = x[0];
7 double f = par[0] + par[1] * ( xx - 44.5 ) + par[2] * ( xx - 44.5 ) * ( xx - 44.5 );
8
9 return f;
10}
11
12calib_endcap_atten::calib_endcap_atten( const unsigned int nrbin )
13 : TofCalibFit( false, nEndcapAtten ) {
14
15 nKind = 1; // pulse height
16 nBinPerCounter = nrbin + 1;
17
20 CanvasPerCounterName.push_back( static_cast<string>( "Pulse Height Most Probable Value" ) );
21 CanvasPerCounterName.push_back( static_cast<string>( "Pulse Height Sigma" ) );
22 nGraphPerCanvasPerCounter.push_back( 1 );
23 nGraphPerCanvasPerCounter.push_back( 1 );
24
25 nHistogram = 0;
26 nCanvas = 2;
27 CanvasName.push_back(
28 static_cast<string>( "Pulse Height Most Probable Value vs TOF Counter Number" ) );
29 CanvasName.push_back( static_cast<string>( "Pulse Height Sigma vs TOF Counter Number" ) );
30 nGraphPerCanvas.push_back( 1 );
31 nGraphPerCanvas.push_back( 1 );
32
33 int numGraphs1 = 0;
34 std::vector<unsigned int>::iterator iter = nGraphPerCanvasPerCounter.begin();
35 for ( ; iter != nGraphPerCanvasPerCounter.end(); iter++ )
36 { numGraphs1 = numGraphs1 + ( *iter ); }
37 if ( numGraphs1 != nGraphEcAtten )
38 {
39 cout << "tofcalgsec::calib_endcap_atten: the number of Graphs is NOT reasonable!!!"
40 << endl;
41 exit( 0 );
42 }
43 int numGraphs2 = 0;
44 iter = nGraphPerCanvas.begin();
45 for ( ; iter != nGraphPerCanvas.end(); iter++ ) { numGraphs2 = numGraphs2 + ( *iter ); }
46 if ( numGraphs2 != nGraphEcAtten )
47 {
48 cout << "tofcalgsec::calib_endcap_atten: the number of Graphs is NOT reasonable!!!"
49 << endl;
50 exit( 0 );
51 }
52
53 m_name = string( "calib_endcap_atten" );
54
55 const int qbin = 100;
56 const double qbegin = 0.0;
57 const double qend = 5000.0;
58
59 // histograms per counter
60 char hname[256];
61 for ( unsigned int i = 0; i < NEndcap; i++ )
62 {
63 m_result.push_back( HepVector( nEndcapAtten, 0 ) );
64 for ( unsigned int k = 0; k < nrbin; k++ )
65 {
66 sprintf( hname, "Q-id%i-r%i", i, k );
67 m_histograms.push_back( new TH1F( hname, hname, qbin, qbegin, qend ) );
68 m_fitresult.push_back( HepVector( nParEcAtten, 0 ) );
69 }
70 sprintf( hname, "Q0-id%i", i );
71 m_histograms.push_back( new TH1F( hname, hname, qbin, qbegin, qend ) );
72 m_fitresult.push_back( HepVector( nParEcAtten, 0 ) );
73 }
74
75 rpos.resize( nrbin );
76 rposerr.resize( nrbin );
77 rstep = ( rtofend - rtofbegin ) / nrbin;
78 for ( unsigned int i = 0; i < nrbin; i++ )
79 {
80 rpos[i] = rtofbegin + ( i + 0.5 ) * rstep;
81 rposerr[i] = 0.5 * rstep;
82 }
83 itofid.resize( NEndcap );
84 itofiderr.resize( NEndcap );
85 itofidstep = 1.0;
86 for ( unsigned int i = 0; i < NEndcap; i++ )
87 {
88 itofid[i] = i * 1.0;
89 itofiderr[i] = 0.5;
90 }
91}
92
94 m_fitresult.clear();
95 rpos.clear();
96 rposerr.clear();
97 itofid.clear();
98 itofiderr.clear();
99}
100
101void calib_endcap_atten::calculate( RecordSet*& data, unsigned int icounter ) {
102
103 std::cout << setiosflags( ios::left ) << setw( 10 ) << icounter << setw( 8 ) << data->size()
104 << setw( 30 ) << name() << std::endl;
105
106 if ( data->size() > 0 )
107 {
108 std::vector<Record*>::iterator iter = data->begin();
109 for ( ; iter != data->end(); iter++ ) { fillRecord( ( *iter ), icounter ); }
110 fitHistogram( icounter );
111 fillGraph( icounter );
112 fitGraph( icounter );
113 }
114 else
115 {
116 fillGraph( icounter ); // keep the m_graphs is not empty()
117 }
118
119 if ( data->size() > 0 )
120 {
121 std::vector<Record*>::iterator iter = data->begin();
122 for ( ; iter != data->end(); iter++ )
123 {
124 updateData( ( *iter ), icounter );
125 fillRecordQ0( ( *iter ), icounter );
126 }
127 fitHistogramQ0( icounter );
128 }
129
130 if ( icounter == ( NEndcap - 1 ) ) { fillGraphQ0(); }
131
132 return;
133}
134
135void calib_endcap_atten::fillRecord( const Record* r, unsigned int icounter ) {
136
137 double rhit = r->zrhit();
138 if ( rhit < rtofbegin || rhit > rtofend ) return;
139 int rbin = static_cast<int>( ( rhit - rtofbegin ) / rstep );
140 if ( rbin < 0 ) { rbin = 0; }
141 else if ( rbin > static_cast<int>( nBinPerCounter - 1 - 1 ) )
142 {
143 cout << "tofcalgsec::calib_endcap_atten:fillRecord: rhit is out of range, rhit=" << rhit
144 << " rbin=" << rbin << endl;
145 return;
146 }
147
148 std::vector<TH1F*>::iterator iter =
149 m_histograms.begin() + icounter * nKind * nBinPerCounter + rbin;
150 ( *iter )->Fill( r->qleft() * abs( r->theta() ) );
151
152 return;
153}
154
155void calib_endcap_atten::fitHistogram( unsigned int icounter ) {
156 TF1* ld = new TF1( "ld", "landau" );
157 ld->SetLineColor( 2 );
158 ld->SetLineWidth( 1 );
159
160 std::vector<TH1F*>::iterator iter1 =
161 m_histograms.begin() + icounter * nKind * nBinPerCounter;
162 std::vector<HepVector>::iterator iter2 =
163 m_fitresult.begin() + icounter * nKind * nBinPerCounter;
164 for ( unsigned int j = 0; j < nBinPerCounter - 1; j++, iter1++, iter2++ )
165 {
166 ( *iter1 )->Fit( ld, "Q" );
167 ( *iter2 )[0] = ld->GetParameter( 1 );
168 ( *iter2 )[1] = ld->GetParError( 1 );
169 ( *iter2 )[2] = ld->GetParameter( 2 );
170 ( *iter2 )[3] = ld->GetParError( 2 );
171 }
172
173 return;
174}
175
176void calib_endcap_atten::fillGraph( unsigned int icounter ) {
177
178 char gname1[256], gname2[256];
179
180 // fill graphs
181 // 2 canvas per counter,
182 // 1. Q MPV vs z
183 // 2. Q sigma vs z
184 std::vector<double> toffset, toffseterr;
185 std::vector<double> tsigma, tsigmaerr;
186 toffset.resize( nBinPerCounter - 1 );
187 toffseterr.resize( nBinPerCounter - 1 );
188 tsigma.resize( nBinPerCounter - 1 );
189 tsigmaerr.resize( nBinPerCounter - 1 );
190
191 std::vector<HepVector>::iterator iter =
192 m_fitresult.begin() + icounter * nKind * nBinPerCounter;
193 for ( unsigned int k = 0; k < nBinPerCounter - 1; k++ )
194 {
195 toffset[k] = log( ( *( iter + k ) )[0] );
196 toffseterr[k] =
197 log( ( *( iter + k ) )[0] ) * ( ( *( iter + k ) )[1] ) / ( ( *( iter + k ) )[0] );
198 tsigma[k] = ( *( iter + k ) )[2];
199 tsigmaerr[k] = ( *( iter + k ) )[3];
200 }
201
202 sprintf( gname1, "Q MPV-tofid-%i", icounter );
203 m_graphs.push_back( new TH1F( gname1, gname1, nBinPerCounter - 1, rtofbegin, rtofend ) );
204 std::vector<TH1F*>::iterator itgraph = m_graphs.end() - 1;
205 ( *itgraph )->SetMarkerSize( 1.5 );
206 ( *itgraph )->SetMarkerStyle( 20 );
207 ( *itgraph )->SetMarkerColor( 2 );
208 for ( unsigned int k = 0; k < nBinPerCounter - 1; k++ )
209 {
210 ( *itgraph )->SetBinContent( k + 1, toffset[k] );
211 ( *itgraph )->SetBinError( k + 1, toffseterr[k] );
212 }
213
214 sprintf( gname2, "Q sigma-tofid-%i", icounter );
215 m_graphs.push_back( new TH1F( gname2, gname2, nBinPerCounter - 1, rtofbegin, rtofend ) );
216 itgraph = m_graphs.end() - 1;
217 ( *itgraph )->SetMarkerSize( 1.5 );
218 ( *itgraph )->SetMarkerStyle( 21 );
219 ( *itgraph )->SetMarkerColor( 4 );
220 for ( unsigned int k = 0; k < nBinPerCounter - 1; k++ )
221 {
222 ( *itgraph )->SetBinContent( k + 1, tsigma[k] );
223 ( *itgraph )->SetBinError( k + 1, tsigmaerr[k] );
224 }
225
226 return;
227}
228
229void calib_endcap_atten::fitGraph( unsigned int icounter ) {
230
231 TF1* fsingleq = new TF1( "fsingleq", endcapQFunc, rtofbegin, rtofend, 3 );
232 fsingleq->SetLineColor( 1 );
233 fsingleq->SetLineWidth( 1 );
234 fsingleq->SetParameters( 6.5, 0.0, 0.0 );
235
236 std::vector<TH1F*>::iterator itgraph = m_graphs.begin() + icounter * nGraphEcAtten;
237
238 ( *itgraph )->Fit( "fsingleq", "Q", "", rtofbegin, rtofend );
239 X = HepVector( m_npar, 0 );
240 X[0] = fsingleq->GetParameter( 0 );
241 X[1] = fsingleq->GetParameter( 1 );
242 X[2] = fsingleq->GetParameter( 2 );
243 X[3] = 0.;
244 X[4] = 0.;
245 X[5] = 0.;
246
247 std::vector<HepVector>::iterator iter = m_result.begin() + icounter;
248 ( *iter ) = X;
249
250 return;
251}
252
253void calib_endcap_atten::updateData( Record* r, unsigned int icounter ) {
254 double rhit = r->zrhit();
255 double q = r->qleft();
256 double costheta = abs( r->theta() );
257
258 double par[3];
259 std::vector<HepVector>::iterator iter = m_result.begin() + icounter;
260 for ( unsigned int i = 0; i < 3; i++ ) { par[i] = ( *iter )[i]; }
261
262 par[0] = 0.;
263 double q0 = q * costheta / exp( endcapQFunc( &rhit, par ) );
264 r->setQ0( q0 );
265
266 return;
267}
268
269void calib_endcap_atten::fillRecordQ0( const Record* r, unsigned int icounter ) {
270 std::vector<TH1F*>::iterator iter =
271 m_histograms.begin() + icounter * nKind * nBinPerCounter + nBinPerCounter - 1;
272 ( *iter )->Fill( r->q0() );
273
274 return;
275}
276
277void calib_endcap_atten::fitHistogramQ0( unsigned int icounter ) {
278 TF1* ld = new TF1( "ld", "landau" );
279 ld->SetLineColor( 2 );
280 ld->SetLineWidth( 1 );
281
282 std::vector<TH1F*>::iterator iter1 =
283 m_histograms.begin() + icounter * nKind * nBinPerCounter + nBinPerCounter - 1;
284 std::vector<HepVector>::iterator iter2 =
285 m_fitresult.begin() + icounter * nKind * nBinPerCounter + nBinPerCounter - 1;
286 ( *iter1 )->Fit( ld, "Q" );
287 ( *iter2 )[0] = ld->GetParameter( 1 );
288 ( *iter2 )[1] = ld->GetParError( 1 );
289 ( *iter2 )[2] = ld->GetParameter( 2 );
290 ( *iter2 )[3] = ld->GetParError( 2 );
291
292 return;
293}
294
295void calib_endcap_atten::fillGraphQ0() {
296 char gname1[256], gname2[256];
297
298 // fill graphs
299 // 2 canvas per counter,
300 // 1. Q0 MPV vs z
301 // 2. Q0 sigma vs z
302 std::vector<double> toffset, toffseterr;
303 std::vector<double> tsigma, tsigmaerr;
304 toffset.resize( NEndcap );
305 toffseterr.resize( NEndcap );
306 tsigma.resize( NEndcap );
307 tsigmaerr.resize( NEndcap );
308
309 unsigned int number = 0;
310 std::vector<HepVector>::iterator iter1 = m_fitresult.begin() + nBinPerCounter - 1;
311 std::vector<HepVector>::iterator iter2 = m_result.begin();
312 for ( unsigned int i = 0; i < NEndcap; i++ )
313 {
314 number = i * nBinPerCounter;
315 toffset[i] = ( *( iter1 + number ) )[0];
316 toffseterr[i] = ( *( iter1 + number ) )[1];
317 tsigma[i] = ( *( iter1 + number ) )[2];
318 tsigmaerr[i] = ( *( iter1 + number ) )[3];
319
320 ( *( iter2 + i ) )[3] = toffset[i] / toffset[0];
321 ( *( iter2 + i ) )[4] = toffset[i];
322 }
323
324 sprintf( gname1, "Q0 MPV vs TOF Counter Number" );
325 m_graphs.push_back( new TH1F( gname1, gname1, NEndcap, -0.5, NEndcap - 0.5 ) );
326 std::vector<TH1F*>::iterator itgraph = m_graphs.end() - 1;
327 ( *itgraph )->SetMarkerSize( 1.5 );
328 ( *itgraph )->SetMarkerStyle( 20 );
329 ( *itgraph )->SetMarkerColor( 2 );
330 for ( unsigned int k = 0; k < nBinPerCounter - 1; k++ )
331 {
332 ( *itgraph )->SetBinContent( k + 1, tsigma[k] );
333 ( *itgraph )->SetBinError( k + 1, tsigmaerr[k] );
334 }
335 for ( unsigned int i = 0; i < NEndcap; i++ )
336 {
337 ( *itgraph )->SetBinContent( i + 1, toffset[i] );
338 ( *itgraph )->SetBinError( i + 1, toffseterr[i] );
339 }
340
341 sprintf( gname2, "Q0 Sigma vs TOF Counter Number" );
342 m_graphs.push_back( new TH1F( gname2, gname2, NEndcap, -0.5, NEndcap - 0.5 ) );
343 itgraph = m_graphs.end() - 1;
344 ( *itgraph )->SetTitle( gname2 );
345 ( *itgraph )->SetMarkerSize( 1.5 );
346 ( *itgraph )->SetMarkerStyle( 21 );
347 ( *itgraph )->SetMarkerColor( 4 );
348 for ( unsigned int i = 0; i < NEndcap; i++ )
349 {
350 ( *itgraph )->SetBinContent( i + 1, tsigma[i] );
351 ( *itgraph )->SetBinError( i + 1, tsigmaerr[i] );
352 }
353
354 return;
355}
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)
TFile f("ana_bhabha660a_dqa_mcPat_zy_old.root")
TTree * data
EvtComplex exp(const EvtComplex &c)
EvtStreamInputIterator< typename Generator::result_type > iter(Generator gen, int N=0)
****INTEGER imax DOUBLE PRECISION m_pi *DOUBLE PRECISION m_amfin DOUBLE PRECISION m_Chfin DOUBLE PRECISION m_Xenph DOUBLE PRECISION m_sinw2 DOUBLE PRECISION m_GFermi DOUBLE PRECISION m_MfinMin DOUBLE PRECISION m_ta2 INTEGER m_out INTEGER m_KeyFSR INTEGER m_KeyQCD *COMMON c_Semalib $ !copy of input $ !CMS energy $ !beam mass $ !final mass $ !beam charge $ !final charge $ !smallest final mass $ !Z mass $ !Z width $ !EW mixing angle $ !Gmu Fermi $ alphaQED at q
Definition KKsem.h:33
const double rtofend
Definition TofCalibFit.h:17
const double rtofbegin
Definition TofCalibFit.h:16
std::vector< Record * > RecordSet
Definition TofDataSet.h:97
const unsigned int NEndcap
Definition TofDataSet.h:13
const int nEndcapAtten
const int nGraphEcAtten
const int nParEcAtten
double qleft() const
Definition TofDataSet.h:57
double q0() const
Definition TofDataSet.h:69
void setQ0(double q0)
Definition TofDataSet.h:75
double theta() const
Definition TofDataSet.h:66
double zrhit() const
Definition TofDataSet.h:61
string m_name
Definition TofCalibFit.h:50
std::vector< HepVector > m_result
Definition TofCalibFit.h:55
unsigned int nCanvas
Definition TofCalibFit.h:47
const std::string & name() const
Definition TofCalibFit.h:27
std::vector< TH1F * > m_histograms
Definition TofCalibFit.h:53
unsigned int nBinPerCounter
Definition TofCalibFit.h:41
unsigned int nKind
Definition TofCalibFit.h:40
std::vector< unsigned int > nGraphPerCanvasPerCounter
Definition TofCalibFit.h:45
unsigned int nCanvasPerCounter
Definition TofCalibFit.h:44
unsigned int nHistPerCounter
Definition TofCalibFit.h:43
HepVector X
Definition TofCalibFit.h:51
std::vector< unsigned int > nGraphPerCanvas
Definition TofCalibFit.h:48
std::vector< string > CanvasName
Definition TofCalibFit.h:58
unsigned int nHistogram
Definition TofCalibFit.h:46
std::vector< TH1F * > m_graphs
Definition TofCalibFit.h:54
TofCalibFit(bool isbarrel, const int npar)
std::vector< string > CanvasPerCounterName
Definition TofCalibFit.h:57
calib_endcap_atten(const unsigned int nrbin)
void calculate(RecordSet *&data, unsigned int icounter)