12 for (
int lay = 0; lay <
NLAYER; lay++ )
14 m_tbinWid[lay][0] = 5.0;
15 m_tbinWid[lay][1] = 10.0;
16 m_tbinWid[lay][2] = 20.0;
18 m_tbinLim[lay][0] = -10.0;
19 m_tbinLim[lay][1] = 30.0;
20 if ( lay < 8 ) m_tbinLim[lay][2] = 210.0;
21 else m_tbinLim[lay][2] = 350.0;
22 m_tbinLim[lay][3] = 990.0;
24 cout <<
"Calibration type: XtInteCalib" << endl;
32 m_fdPf =
new TFolder(
"mfdProfile",
"fdProfile" );
35 m_haxis =
new TH2F(
"axis",
"", 200, -50, 1000, 50, 0, 10 );
36 m_haxis->SetStats( 0 );
37 m_fdPf->Add( m_haxis );
40 for (
int lay = 0; lay <
NLAYER; lay++ )
42 for (
int iEntr = 0; iEntr <
NENTRXT; iEntr++ )
44 for (
int lr = 0; lr < 2; lr++ )
46 sprintf( hname,
"mxt%02d_%02d_%d_gr", lay, iEntr, lr );
47 m_grXt[lay][iEntr][lr] =
new TGraph();
48 m_grXt[lay][iEntr][lr]->SetName( hname );
49 m_grXt[lay][iEntr][lr]->SetMarkerColor( 2 );
50 m_fdPf->Add( m_grXt[lay][iEntr][lr] );
53 (int)( ( m_tbinLim[lay][1] - m_tbinLim[lay][0] ) / m_tbinWid[lay][0] + 0.5 );
54 sprintf( hname,
"mxt%02d_%02d_%d_near", lay, iEntr, lr );
55 m_pfNear[lay][iEntr][lr] =
56 new TProfile( hname, hname, xbinN, m_tbinLim[lay][0], m_tbinLim[lay][1] );
57 m_fdPf->Add( m_pfNear[lay][iEntr][lr] );
60 (int)( ( m_tbinLim[lay][2] - m_tbinLim[lay][1] ) / m_tbinWid[lay][1] + 0.5 );
61 sprintf( hname,
"mxt%02d_%02d_%d_mid", lay, iEntr, lr );
62 m_pfMid[lay][iEntr][lr] =
63 new TProfile( hname, hname, xbinM, m_tbinLim[lay][1], m_tbinLim[lay][2] );
64 m_fdPf->Add( m_pfMid[lay][iEntr][lr] );
67 (int)( ( m_tbinLim[lay][3] - m_tbinLim[lay][2] ) / m_tbinWid[lay][2] + 0.5 );
68 sprintf( hname,
"mxt%02d_%02d_%d_far", lay, iEntr, lr );
69 m_pfFar[lay][iEntr][lr] =
70 new TProfile( hname, hname, xbinF, m_tbinLim[lay][2], m_tbinLim[lay][3] );
71 m_fdPf->Add( m_pfFar[lay][iEntr][lr] );
83 TFolder* fd = (TFolder*)fhist->Get(
"fdProfile" );
84 for (
int lay = 0; lay <
NLAYER; lay++ )
86 for (
int iEntr = 0; iEntr <
NENTRXT; iEntr++ )
88 for (
int lr = 0; lr < 2; lr++ )
90 if ( ( m_grXt[lay][iEntr][lr]->GetN() ) < m_nMaxGrPoint )
92 sprintf( hname,
"xt%02d_%02d_%d_gr", lay, iEntr, lr );
93 TGraph*
gr = (TGraph*)fd->FindObjectAny( hname );
94 int nPoint =
gr->GetN();
95 for (
int i = 0; i < nPoint; i++ )
97 gr->GetPoint( i, tdr, doca );
98 int np = m_grXt[lay][iEntr][lr]->GetN();
99 m_grXt[lay][iEntr][lr]->SetPoint( np, tdr, doca );
102 sprintf( hname,
"xt%02d_%02d_%d_near", lay, iEntr, lr );
103 pr = (TProfile*)fd->FindObjectAny( hname );
104 m_pfNear[lay][iEntr][lr]->Add( pr );
106 sprintf( hname,
"xt%02d_%02d_%d_mid", lay, iEntr, lr );
107 pr = (TProfile*)fd->FindObjectAny( hname );
108 m_pfMid[lay][iEntr][lr]->Add( pr );
110 sprintf( hname,
"xt%02d_%02d_%d_far", lay, iEntr, lr );
111 pr = (TProfile*)fd->FindObjectAny( hname );
112 m_pfFar[lay][iEntr][lr]->Add( pr );
120 bool fgOldXt = saveOldXt( newXtList );
125 for (
int lay = 0; lay <
NLAYER; lay++ )
127 for (
int iEntr = 0; iEntr <
NENTRXT; iEntr++ )
129 for (
int lr = 0; lr < 2; lr++ )
134 for (
int iPf = 0; iPf < 3; iPf++ )
137 if ( 0 == iPf ) pro = m_pfNear[lay][iEntr][lr];
138 else if ( 1 == iPf ) pro = m_pfMid[lay][iEntr][lr];
139 else pro = m_pfFar[lay][iEntr][lr];
141 int nbin = pro->GetNbinsX();
142 for (
int i = 0; i < nbin; i++ )
144 double tt = pro->GetBinCenter( i + 1 );
145 double dd = pro->GetBinContent( i + 1 );
146 double entries = pro->GetBinEntries( i + 1 );
149 m_vt.push_back( tt );
150 m_vd.push_back( dd );
151 m_entries.push_back( entries );
155 unsigned vsize = m_vt.size();
158 for (
int i = 0; i < 2; i++ )
161 ( m_vd[vsize - 1] - m_vd[vsize - 2] ) / ( m_vt[vsize - 1] - m_vt[vsize - 2] );
162 if ( fabs( slope ) > 0.04 )
166 m_entries.pop_back();
171 sprintf( hname,
"grXtFit%02d_%02d_%d", lay, iEntr, lr );
172 grXtfit[lay][iEntr][lr] =
new TGraph();
173 grXtfit[lay][iEntr][lr]->SetName( hname );
174 grXtfit[lay][iEntr][lr]->SetMarkerStyle( 20 );
175 m_fgFit[lay][iEntr][lr] = getXt( lay, iEntr, lr, grXtfit[lay][iEntr][lr] );
181 for (
int lay = 0; lay <
NLAYER; lay++ )
184 if ( lay < 8 ) tCut = 400.0;
185 for (
int iEntr = 0; iEntr <
NENTRXT; iEntr++ )
187 for (
int lr = 0; lr < 2; lr++ )
189 if ( !m_fgFit[lay][iEntr][lr] )
191 int iEntrNew = findXtEntr( lay, iEntr, lr );
192 if ( -1 != iEntrNew )
194 int npoint = grXtfit[lay][iEntrNew][lr]->GetN();
195 for (
int i = 0; i < npoint; i++ )
197 grXtfit[lay][iEntrNew][lr]->GetPoint( i, tdr, doca );
198 grXtfit[lay][iEntr][lr]->SetPoint( i, tdr, doca );
203 cout << grXtfit[lay][iEntr][lr]->GetName() <<
" use old x-t" << endl;
204 int npoint = m_grXtOld[lay][iEntr][lr]->GetN();
205 for (
int i = 0; i < npoint; i++ )
207 m_grXtOld[lay][iEntr][lr]->GetPoint( i, tdr, doca );
208 grXtfit[lay][iEntr][lr]->SetPoint( i, tdr, doca );
212 int nn = grXtfit[lay][iEntr][lr]->GetN();
214 grXtfit[lay][iEntr][lr]->GetPoint( nn - 1, tmax,
dmax );
215 if ( tmax > tCut ) m_fgEdge[lay][iEntr][lr] =
true;
216 else m_fgEdge[lay][iEntr][lr] =
false;
221 for (
int lay = 0; lay <
NLAYER; lay++ )
223 for (
int iEntr = 0; iEntr <
NENTRXT; iEntr++ )
225 for (
int lr = 0; lr < 2; lr++ )
227 if ( !m_fgEdge[lay][iEntr][lr] )
229 int iEntrNew = findXtEntrEdge( lay, iEntr, lr );
230 if ( -1 != iEntrNew )
233 int n1 = grXtfit[lay][iEntr][lr]->GetN();
234 grXtfit[lay][iEntr][lr]->GetPoint(
n1 - 1, t1, d1 );
236 int n2 = grXtfit[lay][iEntrNew][lr]->GetN();
237 for (
int i = 0; i <
n2; i++ )
239 grXtfit[lay][iEntrNew][lr]->GetPoint( i, t2, d2 );
242 grXtfit[lay][iEntr][lr]->SetPoint(
n1, t2, d2 );
253 for (
int lay = 0; lay <
NLAYER; lay++ )
255 for (
int iEntr = 0; iEntr <
NENTRXT; iEntr++ )
257 for (
int lr = 0; lr < 2; lr++ )
259 sprintf( hname,
"trNewXt%02d_%02d_%d", lay, iEntr, lr );
260 xttr[lay][iEntr][lr] =
new TTree( hname, hname );
261 xttr[lay][iEntr][lr]->Branch(
"t", &tdr,
"t/D" );
262 xttr[lay][iEntr][lr]->Branch(
"d", &doca,
"d/D" );
265 int npoint = m_grXtOld[lay][iEntr][lr]->GetN();
266 for (
int i = 0; i < npoint; i++ )
268 m_grXtOld[lay][iEntr][lr]->GetPoint( i, tdr, doca );
269 xttr[lay][iEntr][lr]->Fill();
274 int npoint = grXtfit[lay][iEntr][lr]->GetN();
275 for (
int i = 0; i < npoint; i++ )
277 grXtfit[lay][iEntr][lr]->GetPoint( i, tdr, doca );
278 xttr[lay][iEntr][lr]->Fill();
281 newXtList->Add( xttr[lay][iEntr][lr] );
286 for (
int lay = 0; lay <
NLAYER; lay++ )
288 for (
int iEntr = 0; iEntr <
NENTRXT; iEntr++ )
290 for (
int lr = 0; lr < 2; lr++ ) {
delete grXtfit[lay][iEntr][lr]; }
298void XtInteCalib::renameHist() {
300 m_fdPf->SetName(
"fdProfile" );
301 for (
int lay = 0; lay <
NLAYER; lay++ )
303 for (
int iEntr = 0; iEntr <
NENTRXT; iEntr++ )
305 for (
int lr = 0; lr < 2; lr++ )
307 sprintf( hname,
"xt%02d_%02d_%d_gr", lay, iEntr, lr );
308 m_grXt[lay][iEntr][lr]->SetName( hname );
309 sprintf( hname,
"xt%02d_%02d_%d_near", lay, iEntr, lr );
310 m_pfNear[lay][iEntr][lr]->SetName( hname );
311 sprintf( hname,
"xt%02d_%02d_%d_mid", lay, iEntr, lr );
312 m_pfMid[lay][iEntr][lr]->SetName( hname );
313 sprintf( hname,
"xt%02d_%02d_%d_far", lay, iEntr, lr );
314 m_pfFar[lay][iEntr][lr]->SetName( hname );
320bool XtInteCalib::saveOldXt( TObjArray* newXtList ) {
322 Int_t entries = newXtList->GetEntries();
323 cout <<
"entries of newXtList " << entries << endl;
324 if ( entries < 1548 )
326 cout <<
"can not get old x-t" << endl;
329 for (
int lay = 0; lay <
NLAYER; lay++ )
331 for (
int iEntr = 0; iEntr <
NENTRXT; iEntr++ )
333 for (
int lr = 0; lr < 2; lr++ )
335 sprintf( hname,
"grXtOld%02d_%02d_%d", lay, iEntr, lr );
336 m_grXtOld[lay][iEntr][lr] =
new TGraph();
337 m_grXtOld[lay][iEntr][lr]->SetName( hname );
340 sprintf( hname,
"trNewXt%02d_%02d_%d", lay, iEntr, lr );
341 TTree*
tr = (TTree*)( newXtList->FindObject( hname ) );
344 tr->SetBranchAddress(
"t", &
t );
345 tr->SetBranchAddress(
"d", &d );
346 int nPoint =
tr->GetEntries();
349 cout <<
"can not get old x-t: " << hname << endl;
352 for (
int i = 0; i < nPoint; i++ )
355 m_grXtOld[lay][iEntr][lr]->SetPoint( i,
t, d );
371bool XtInteCalib::getXt(
int lay,
int iEntr,
int lr, TGraph*
gr ) {
372 unsigned vsize = m_vt.size();
373 if ( vsize < 15 )
return false;
375 double tmax = m_vt[vsize - 1];
386 for (
unsigned i = 0; i < vsize; i++ )
388 if ( m_vt[i] < tm0 ) n0++;
392 if ( lay < 8 ) nCut = 20;
394 double entries1 = 0.0;
395 double entries2 = 0.0;
396 for (
unsigned i = 0; i < vsize; i++ )
398 entries1 += m_entries[i];
399 if ( m_vt[i] < 150. ) entries2 += m_entries[i];
401 if ( ( entries1 * 0.9 ) < entries2 )
return false;
403 if ( n0 < nCut )
return false;
404 if ( tmax < tm1 )
return funXt0( lay, iEntr, lr,
gr );
405 else return funXt1( lay, iEntr, lr,
gr );
408bool XtInteCalib::funXt0(
int lay,
int iEntr,
int lr, TGraph*
gr ) {
410 if ( lay < 8 ) tCut = 200.0;
415 gr->SetPoint( 0, 0, 0 );
418 for (
unsigned i = 0; i < m_vt.size(); i++ )
421 if ( i > 10 ) delt = m_vt[i] - m_vt[i - 1];
422 if ( ( i > 10 ) && ( ( delt > 100. ) || ( ( delt > 60. ) && ( m_vt[i - 1] < tCut ) ) ) )
425 if ( m_vt[i] < 0.0 )
gr->SetPoint( npoint, m_vt[i], 0.0 );
426 else gr->SetPoint( npoint, m_vt[i], m_vd[i] );
432bool XtInteCalib::funXt1(
int lay,
int iEntr,
int lr, TGraph*
gr ) {
433 unsigned vsize = m_vt.size();
434 double tmax = m_vt[vsize - 1];
438 if ( tmax < 540 ) t1 = 300.;
443 if ( tmax < 700 ) t1 = 500.;
451 TGraph* grPol1 =
new TGraph();
452 for (
unsigned i = 0; i < vsize; i++ )
456 grPol1->SetPoint( np, m_vt[i], m_vd[i] );
461 if ( np < 5 ) { t2 = t1; }
465 grPol1->GetPoint( 0, t2, x2 );
466 grPol1->Fit(
"pol1",
"Q",
"", t2, m_vt[vsize - 1] );
467 c0 = grPol1->GetFunction(
"pol1" )->GetParameter( 0 );
468 c1 = grPol1->GetFunction(
"pol1" )->GetParameter( 1 );
472 grPol1->Fit(
"pol0",
"Q",
"", t2, m_vt[vsize - 1] );
473 c0 = grPol1->GetFunction(
"pol0" )->GetParameter( 0 );
480 if ( lay < 8 ) tCut = 200.0;
485 gr->SetPoint( 0, 0, 0 );
488 for (
unsigned i = 0; i < vsize; i++ )
491 if ( i > 10 ) delt = m_vt[i] - m_vt[i - 1];
492 if ( ( i > 10 ) && ( ( delt > 100. ) || ( ( delt > 60. ) && ( m_vt[i - 1] < tCut ) ) ) )
497 if ( m_vt[i] < 0.0 )
gr->SetPoint( npoint, m_vt[i], 0.0 );
498 else gr->SetPoint( npoint, m_vt[i], m_vd[i] );
504 if ( !fgfit ) dist = m_vd[i];
505 else dist = c1 * m_vt[i] + c0;
506 gr->SetPoint( npoint, m_vt[i], dist );
513int XtInteCalib::findXtEntr(
int lay,
int iEntr,
int lr )
const {
521 for (
int i = iEntr; i <= id0; i++ )
523 if ( m_fgFit[lay][i][lr] )
529 if ( -1 !=
id ) entrId = id;
532 for (
int i = iEntr; i >= 0; i-- )
534 if ( m_fgFit[lay][i][lr] )
540 if ( -1 !=
id ) entrId = id;
543 for (
int i = id1; i <= idmax; i++ )
545 if ( m_fgFit[lay][i][lr] )
558 for (
int i = iEntr; i >= id1; i-- )
560 if ( m_fgFit[lay][i][lr] )
566 if ( -1 !=
id ) entrId = id;
569 for (
int i = iEntr; i < idmax; i++ )
571 if ( m_fgFit[lay][i][lr] )
577 if ( -1 !=
id ) entrId = id;
580 for (
int i = id1; i >= 0; i-- )
582 if ( m_fgFit[lay][i][lr] )
594 cout <<
"find EntrId error "
595 <<
"layer " << lay <<
" iEntr " << iEntr <<
" lr " << lr << endl;
601int XtInteCalib::findXtEntrEdge(
int lay,
int iEntr,
int lr )
const {
609 for (
int i = iEntr; i <= id0; i++ )
611 if ( m_fgEdge[lay][i][lr] )
617 if ( -1 !=
id ) entrId = id;
620 for (
int i = iEntr; i >= 0; i-- )
622 if ( m_fgEdge[lay][i][lr] )
628 if ( -1 !=
id ) entrId = id;
631 for (
int i = id1; i <= idmax; i++ )
633 if ( m_fgEdge[lay][i][lr] )
646 for (
int i = iEntr; i >= id1; i-- )
648 if ( m_fgEdge[lay][i][lr] )
654 if ( -1 !=
id ) entrId = id;
657 for (
int i = iEntr; i < idmax; i++ )
659 if ( m_fgEdge[lay][i][lr] )
665 if ( -1 !=
id ) entrId = id;
668 for (
int i = id1; i >= 0; i-- )
670 if ( m_fgEdge[lay][i][lr] )
682 cout <<
"find EntrId error for cell edge "
683 <<
"layer " << lay <<
" iEntr " << iEntr <<
" lr " << lr << endl;
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)
virtual void init(TObjArray *hlist, MdcCosGeom *pGeom)=0
virtual void mergeHist(TFile *fhist)=0
virtual void calib(MdcCalibConst *calconst, TObjArray *newXtList, TObjArray *r2tList)=0
void calib(MdcCalibConst *calconst, TObjArray *newXtList, TObjArray *r2tList)
void mergeHist(TFile *fhist)
void init(TObjArray *hlist, MdcCosGeom *pGeom)