60 Gaudi::svcLocator()->service(
"MessageSvc",
msgSvc );
61 MsgStream log(
msgSvc,
"PreT0MdcCalib" );
62 log << MSG::INFO <<
"PreT0MdcCalib::initialize()" << endmsg;
65 m_mdcGeomSvc = mdcGeomSvc;
66 m_mdcFunSvc = mdcFunSvc;
67 m_mdcUtilitySvc = mdcUtilitySvc;
76 m_fdTrec =
new TFolder(
"Trec",
"Trec" );
77 m_hlist->Add( m_fdTrec );
79 m_fdTrecZ =
new TFolder(
"TrecZ",
"TrecZ" );
80 m_hlist->Add( m_fdTrecZ );
86 if ( 0 == lr )
sprintf( hname,
"Trec%02d_L", lay );
87 else if ( 1 == lr )
sprintf( hname,
"Trec%02d_R", lay );
88 else sprintf( hname,
"Trec%02d_C", lay );
90 if ( lay < 8 ) m_hTrec[lay][lr] =
new TH1F( hname,
"", 100, 0, 400 );
91 else m_hTrec[lay][lr] =
new TH1F( hname,
"", 125, 0, 500 );
92 m_fdTrec->Add( m_hTrec[lay][lr] );
98 for (
int iud = 0; iud < 2; iud++ )
100 if ( 0 == iud )
sprintf( hname,
"TrecCosm%02d_Up", lay );
101 else sprintf( hname,
"TrecCosm%02d_Dw", lay );
102 if ( lay < 8 ) m_hTrecCosm[lay][iud] =
new TH1F( hname,
"", 100, 0, 400 );
103 else m_hTrecCosm[lay][iud] =
new TH1F( hname,
"", 125, 0, 500 );
104 m_fdTrec->Add( m_hTrecCosm[lay][iud] );
114 if ( 0 == lr )
sprintf( hname,
"Trec%02d_z%02d_L", lay,
bin );
115 else if ( 1 == lr )
sprintf( hname,
"Trec%02d_z%02d_R", lay,
bin );
116 else sprintf( hname,
"Trec%02d_z%02d_C", lay,
bin );
118 if ( lay < 8 ) m_hTrecZ[lay][lr][
bin] =
new TH1F( hname,
"", 100, 0, 400 );
119 else m_hTrecZ[lay][lr][
bin] =
new TH1F( hname,
"", 125, 0, 500 );
120 m_fdTrecZ->Add( m_hTrecZ[lay][lr][
bin] );
129 zwest = m_mdcGeomSvc->Wire( lay, 0 )->Forward().z();
130 zeast = m_mdcGeomSvc->Wire( lay, 0 )->Backward().z();
131 m_zwid[lay] = ( zeast - zwest ) / (
double)m_nzbin;
133 if ( lay < 8 ) m_vp[lay] = 220.0;
134 else m_vp[lay] = 240.0;
136 if ( 0 == ( lay % 2 ) )
149 Gaudi::svcLocator()->service(
"MessageSvc",
msgSvc );
150 MsgStream log(
msgSvc,
"PreT0MdcCalib" );
151 log << MSG::DEBUG <<
"PreT0MdcCalib::fillHist()" << endmsg;
175 IDataProviderSvc* eventSvc = NULL;
176 Gaudi::svcLocator()->service(
"EventDataSvc", eventSvc );
179 double tes =
event->getTes();
181 bool esCutFg =
event->getEsCutFlag();
182 if ( !esCutFg )
return -1;
185 int ntrk =
event->getNTrk();
186 for ( i = 0; i < ntrk; i++ )
188 rectrk =
event->getRecTrk( i );
191 double dr = rectrk->
getDr();
192 if ( fabs( dr ) > m_param.drCut )
continue;
195 double dz = rectrk->
getDz();
196 if ( fabs( dz ) > m_param.dzCut )
continue;
199 double p = rectrk->
getP();
200 if ( ( fabs( p ) < m_param.pCut[0] ) || ( fabs( p ) > m_param.pCut[1] ) )
continue;
203 double phi0 = rectrk->
getPhi0();
204 double phiTrk = phi0 + CLHEP::halfpi;
205 if ( phiTrk > CLHEP::twopi ) phiTrk -= CLHEP::twopi;
206 if ( m_param.cosmicDwTrk && ( phiTrk < CLHEP::pi ) )
continue;
211 for ( k = 0; k < nhit; k++ )
216 lr = rechit->
getLR();
224 zprop = fabs( zhit - m_zst[lay] );
225 bin = (int)( zprop / m_zwid[lay] );
226 tp = zprop / m_vp[lay];
227 t0 = m_mdcFunSvc->getT0( lay, cel );
230 double adc = rechit->
getQhit();
231 double tw = m_mdcFunSvc->getTimeWalk( lay, adc );
234 const MdcGeoWire* pWire = m_mdcGeomSvc->Wire( lay, cel );
236 double y2 = pWire->
Forward().y();
237 double ymid = ( y1 + y2 ) * 0.5;
244 trec = traw - tp - tof - tes + m_param.timeShift - tw;
246 m_hTrec[lay][lr]->Fill( trec );
247 m_hTrec[lay][2]->Fill( trec );
248 if ( ymid > 0 ) m_hTrecCosm[lay][0]->Fill( trec );
249 else m_hTrecCosm[lay][1]->Fill( trec );
253 m_hTrecZ[lay][lr][
bin]->Fill( trec );
254 m_hTrecZ[lay][2][
bin]->Fill( trec );
265 Gaudi::svcLocator()->service(
"MessageSvc",
msgSvc );
266 MsgStream log(
msgSvc,
"PreT0MdcCalib" );
267 log << MSG::DEBUG <<
"PreT0MdcCalib::updateConst()" << endmsg;
278 double initT0 = m_param.initT0;
299 fitTminFg[lay][lr] = 0;
300 chindfTmin[lay][lr] = -1;
301 sprintf( funname,
"ftmin%02d_%d", lay, lr );
302 ftmin[lay][lr] =
new TF1( funname, funTmin, 0, 150, 6 );
304 if ( 1 == m_param.fgCalib[lay] )
306 Stat_t nEntryTot = 0;
307 for (
int ibin = 1; ibin <= 25; ibin++ )
309 Stat_t entry = m_hTrec[lay][lr]->GetBinContent( ibin );
312 double c0Ini = (double)nEntryTot / 25.0;
313 double c1Ini = ( m_hTrec[lay][lr]->GetMaximum() ) - c0Ini;
315 ftmin[lay][lr]->SetParameter( 0, c0Ini );
316 ftmin[lay][lr]->SetParameter( 1, c1Ini );
317 ftmin[lay][lr]->SetParameter( 2, 0 );
318 ftmin[lay][lr]->SetParameter( 4, initT0 );
319 ftmin[lay][lr]->SetParameter( 5, 2 );
321 m_hTrec[lay][lr]->Fit( funname,
"Q",
"", m_param.tminFitRange[lay][0],
322 m_param.tminFitRange[lay][1] );
323 gStyle->SetOptFit( 11 );
326 chisq = ftmin[lay][lr]->GetChisquare();
327 ndf = ftmin[lay][lr]->GetNDF();
328 chindfTmin[lay][lr] = chisq / ndf;
330 if ( chindfTmin[lay][lr] < m_param.tminFitChindf )
332 fitTminFg[lay][lr] = 1;
333 t0Fit[lay][lr] = ftmin[lay][lr]->GetParameter( 4 );
335 t0Fit[lay][lr] += m_param.t0Shift;
336 t0Cal[lay][lr] = t0Fit[lay][lr] - m_param.timeShift;
340 if ( 0 == fitTminFg[lay][lr] )
342 wir = m_mdcGeomSvc->Wire( lay, 0 )->Id();
343 t0Cal[lay][lr] = calconst->
getT0( wir );
344 t0Fit[lay][lr] = t0Cal[lay][lr] + m_param.timeShift;
348 for (
int iud = 0; iud < 2; iud++ )
350 sprintf( funname,
"ftminCosm_%02d_%d", lay, iud );
351 ftminCosm[lay][iud] =
new TF1( funname, funTmin, 0, 150, 6 );
352 ftminCosm[lay][iud]->SetParameter( 0, 0 );
353 ftminCosm[lay][iud]->SetParameter( 4, initT0 );
354 ftminCosm[lay][iud]->SetParameter( 5, 1 );
355 m_hTrecCosm[lay][iud]->Fit( funname,
"Q",
"", m_param.tminFitRange[lay][0],
356 m_param.tminFitRange[lay][1] );
357 gStyle->SetOptFit( 11 );
358 t0FitCosm[lay][iud] += m_param.t0Shift;
359 t0FitCosm[lay][iud] = ftminCosm[lay][iud]->GetParameter( 4 );
369 fitTmaxFg[lay][lr] = 0;
370 chindfTmax[lay][lr] = -1;
371 sprintf( funname,
"ftmax%02d_%d", lay, lr );
372 ftmax[lay][lr] =
new TF1( funname, funTmax, 250, 500, 4 );
374 if ( 1 == m_param.fgCalib[lay] )
376 ftmax[lay][lr]->SetParameter( 2, m_param.initTm[lay] );
377 ftmax[lay][lr]->SetParameter( 3, 10 );
378 m_hTrec[lay][lr]->Fit( funname,
"Q+",
"", m_param.tmaxFitRange[lay][0],
379 m_param.tmaxFitRange[lay][1] );
380 gStyle->SetOptFit( 11 );
381 chisq = ftmax[lay][lr]->GetChisquare();
382 ndf = ftmax[lay][lr]->GetNDF();
383 chindfTmax[lay][lr] = chisq / ndf;
384 if ( chindfTmax[lay][lr] < m_param.tmaxFitChindf )
386 fitTmaxFg[lay][lr] = 1;
387 tmax[lay][lr] = ftmax[lay][lr]->GetParameter( 2 );
391 if ( 0 == fitTmaxFg[lay][lr] )
392 { tmax[lay][lr] = ( calconst->
getXtpar( lay, 0, lr, 6 ) ) + t0Fit[lay][2]; }
397 ofstream ft0(
"preT0.dat" );
400 ft0 << setw( 5 ) << lay << setw( 3 ) << fitTminFg[lay][2] << setw( 15 ) << t0Cal[lay][2]
401 << setw( 15 ) << t0Fit[lay][2] << setw( 15 ) << chindfTmin[lay][2] << endl;
406 ft0 << setw( 5 ) << lay << setw( 3 ) << fitTmaxFg[lay][0] << setw( 10 ) << tmax[lay][0]
407 << setw( 10 ) << chindfTmax[lay][0] << setw( 3 ) << fitTmaxFg[lay][1] << setw( 10 )
408 << tmax[lay][1] << setw( 10 ) << chindfTmax[lay][1] << setw( 3 ) << fitTmaxFg[lay][2]
409 << setw( 10 ) << tmax[lay][2] << setw( 10 ) << chindfTmax[lay][2] << setw( 10 )
410 << tmax[lay][0] - t0Fit[lay][2] << setw( 10 ) << tmax[lay][1] - t0Fit[lay][2]
411 << setw( 10 ) << tmax[lay][2] - t0Fit[lay][2] << endl;
414 cout <<
"preT0.dat was written." << endl;
417 ofstream ft0cosm(
"cosmicT0.dat" );
420 ft0cosm << setw( 5 ) << lay << setw( 15 ) << t0Fit[lay][2] << setw( 15 )
421 << t0FitCosm[lay][0] << setw( 15 ) << t0FitCosm[lay][1] << endl;
427 int nwire = m_mdcGeomSvc->getWireSize();
428 for ( i = 0; i < nwire; i++ )
430 lay = m_mdcGeomSvc->Wire( i )->Layer();
431 if ( 1 == m_param.fgCalib[lay] )
433 calconst->
resetT0( i, t0Cal[lay][2] );
439 if ( m_param.preT0SetTm )
445 if ( 1 != m_param.fgCalib[lay] )
continue;
451 tm = tmax[lay][lr] - t0Fit[lay][2];
452 if ( ( tmax[lay][lr] > m_param.tmaxFitRange[lay][0] ) &&
453 ( tmax[lay][lr] < m_param.tmaxFitRange[lay][1] ) )
454 { calconst->
resetXtpar( lay, iEntr, lr, 6, tm ); }
462 double sdpar = m_param.initSigma;
467 for ( lr = 0; lr < 2; lr++ )
480 delete ftmin[lay][lr];
481 delete ftmax[lay][lr];