360 MsgStream log(
msgSvc,
"MucCalibMgr" );
361 log << MSG::INFO <<
"Initialize NTuples" << endmsg;
364 Gaudi::svcLocator()->service(
"NTupleSvc",
ntupleSvc );
369 NTuplePtr nt1(
ntupleSvc,
"FILE450/EventLog" );
370 if ( nt1 ) { m_eventLogTuple = nt1; }
374 ntupleSvc->book(
"FILE450/EventLog", CLID_RowWiseTuple,
"MucCalibConst N-Tuple" );
375 if ( m_eventLogTuple )
377 sc = m_eventLogTuple->addItem(
"event_id", m_ntEventId );
378 sc = m_eventLogTuple->addItem(
"event_tag", m_ntEventTag );
379 sc = m_eventLogTuple->addItem(
"start_time", m_ntEsTime );
380 sc = m_eventLogTuple->addItem(
"digi_num", m_ntDigiNum );
381 sc = m_eventLogTuple->addItem(
"track_num", m_ntTrackNum );
382 sc = m_eventLogTuple->addItem(
"exphit_num", m_ntExpHitNum );
383 sc = m_eventLogTuple->addItem(
"effhit_num", m_ntEffHitNum );
384 sc = m_eventLogTuple->addItem(
"noshit_num", m_ntNosHitNum );
385 sc = m_eventLogTuple->addItem(
"cluster_num", m_ntClusterNum );
386 sc = m_eventLogTuple->addItem(
"event_time", m_ntEventTime );
390 log << MSG::ERROR <<
"Cannot book N-tuple:" << long( m_eventLogTuple ) << endmsg;
391 return StatusCode::FAILURE;
397 NTuplePtr nt2(
ntupleSvc,
"FILE450/MdcTrkInfo" );
398 if ( nt2 ) { m_mdcTrkInfoTuple = nt2; }
402 ntupleSvc->book(
"FILE450/MdcTrkInfo", CLID_RowWiseTuple,
"MucCalibConst N-Tuple" );
403 if ( m_mdcTrkInfoTuple )
405 sc = m_mdcTrkInfoTuple->addItem(
"charge", m_charge );
406 sc = m_mdcTrkInfoTuple->addItem(
"mdcpx", m_mdcpx );
407 sc = m_mdcTrkInfoTuple->addItem(
"mdcpy", m_mdcpy );
408 sc = m_mdcTrkInfoTuple->addItem(
"mdcpz", m_mdcpz );
409 sc = m_mdcTrkInfoTuple->addItem(
"mdcpt", m_mdcpt );
410 sc = m_mdcTrkInfoTuple->addItem(
"mdcpp", m_mdcpp );
411 sc = m_mdcTrkInfoTuple->addItem(
"mdcphi", m_mdcphi );
412 sc = m_mdcTrkInfoTuple->addItem(
"mdctheta", m_mdctheta );
416 log << MSG::ERROR <<
"Cannot book N-tuple:" << long( m_mdcTrkInfoTuple ) << endmsg;
417 return StatusCode::FAILURE;
421 NTuplePtr nt3(
ntupleSvc,
"FILE450/TrackInfo" );
422 if ( nt3 ) { m_trackInfoTuple = nt3; }
426 ntupleSvc->book(
"FILE450/TrackInfo", CLID_RowWiseTuple,
"MucCalibConst N-Tuple" );
427 if ( m_trackInfoTuple )
429 sc = m_trackInfoTuple->addItem(
"track_event", m_ntTrackEvent );
430 sc = m_trackInfoTuple->addItem(
"track_tag", m_ntTrackTag );
431 sc = m_trackInfoTuple->addItem(
"track_hits", m_ntTrackHits );
432 sc = m_trackInfoTuple->addItem(
"segment_fly", m_ntTrackSegFly );
433 sc = m_trackInfoTuple->addItem(
"layer_fly_a", m_ntTrackLayFlyA );
434 sc = m_trackInfoTuple->addItem(
"layer_fly_b", m_ntTrackLayFlyB );
435 sc = m_trackInfoTuple->addItem(
"layer_fly_c", m_ntTrackLayFlyC );
436 sc = m_trackInfoTuple->addItem(
"rec_mode", m_trkRecMode );
437 sc = m_trackInfoTuple->addItem(
"chi2", m_chi2 );
438 sc = m_trackInfoTuple->addItem(
"px", m_px );
439 sc = m_trackInfoTuple->addItem(
"py", m_py );
440 sc = m_trackInfoTuple->addItem(
"pz", m_pz );
441 sc = m_trackInfoTuple->addItem(
"pt", m_pt );
442 sc = m_trackInfoTuple->addItem(
"pp", m_pp );
443 sc = m_trackInfoTuple->addItem(
"r", m_r );
444 sc = m_trackInfoTuple->addItem(
"costheta", m_cosTheta );
445 sc = m_trackInfoTuple->addItem(
"theta", m_theta );
446 sc = m_trackInfoTuple->addItem(
"phi", m_phi );
447 sc = m_trackInfoTuple->addItem(
"depth", m_depth );
448 sc = m_trackInfoTuple->addItem(
"br_last_lay", m_brLastLayer );
449 sc = m_trackInfoTuple->addItem(
"ec_last_lay", m_ecLastLayer );
450 sc = m_trackInfoTuple->addItem(
"total_hits", m_totalHits );
451 sc = m_trackInfoTuple->addItem(
"fired_layers", m_totalLayers );
452 sc = m_trackInfoTuple->addItem(
"maxhits_in_layer", m_maxHitsInLayer );
456 log << MSG::ERROR <<
"Cannot book N-tuple:" << long( m_trackInfoTuple ) << endmsg;
457 return StatusCode::FAILURE;
462 NTuplePtr nt4(
ntupleSvc,
"FILE450/TrackDiff" );
463 if ( nt4 ) { m_trackDiffTuple = nt4; }
467 ntupleSvc->book(
"FILE450/TrackDiff", CLID_RowWiseTuple,
"MucCalibConst N-Tuple" );
468 if ( m_trackDiffTuple )
470 sc = m_trackDiffTuple->addItem(
"dimu_tag", m_ntDimuTag );
471 sc = m_trackDiffTuple->addItem(
"pos_phi_diff", m_ntPosPhiDiff );
472 sc = m_trackDiffTuple->addItem(
"pos_theta_diff", m_ntPosThetaDiff );
473 sc = m_trackDiffTuple->addItem(
"mom_phi_diff", m_ntMomPhiDiff );
474 sc = m_trackDiffTuple->addItem(
"mom_theta_diff", m_ntMomThetaDiff );
478 log << MSG::ERROR <<
"Cannot book N-tuple:" << long( m_trackDiffTuple ) << endmsg;
479 return StatusCode::FAILURE;
484 NTuplePtr nt5(
ntupleSvc,
"FILE450/ClusterSize" );
485 if ( nt5 ) { m_clusterSizeTuple = nt5; }
489 ntupleSvc->book(
"FILE450/ClusterSize", CLID_RowWiseTuple,
"MucCalibConst N-Tuple" );
490 if ( m_clusterSizeTuple )
491 { sc = m_clusterSizeTuple->addItem(
"cluster_size", m_ntClusterSize ); }
494 log << MSG::ERROR <<
"Cannot book N-tuple:" << long( m_clusterSizeTuple ) << endmsg;
495 return StatusCode::FAILURE;
500 NTuplePtr nt6(
ntupleSvc,
"FILE450/EffWindow" );
501 if ( nt6 ) { m_effWindowTuple = nt6; }
505 ntupleSvc->book(
"FILE450/EffWindow", CLID_RowWiseTuple,
"MucCalibConst N-Tuple" );
506 if ( m_effWindowTuple ) { sc = m_effWindowTuple->addItem(
"hit_window", m_ntEffWindow ); }
509 log << MSG::ERROR <<
"Cannot book N-tuple:" << long( m_effWindowTuple ) << endmsg;
510 return StatusCode::FAILURE;
514 NTuplePtr nt7(
ntupleSvc,
"FILE450/ResInfo" );
515 if ( nt7 ) { m_resInfoTuple = nt7; }
519 ntupleSvc->book(
"FILE450/ResInfo", CLID_RowWiseTuple,
"MucCalibConst N-Tuple" );
520 if ( m_resInfoTuple )
522 sc = m_resInfoTuple->addItem(
"line_res", m_lineRes );
523 sc = m_resInfoTuple->addItem(
"quad_res", m_quadRes );
524 sc = m_resInfoTuple->addItem(
"extr_res", m_extrRes );
525 sc = m_resInfoTuple->addItem(
"res_part", m_resPart );
526 sc = m_resInfoTuple->addItem(
"res_segment", m_resSegment );
527 sc = m_resInfoTuple->addItem(
"res_layer", m_resLayer );
528 sc = m_resInfoTuple->addItem(
"res_fired", m_resFired );
529 sc = m_resInfoTuple->addItem(
"res_mode", m_resMode );
533 log << MSG::ERROR <<
"Cannot book N-tuple:" << long( m_resInfoTuple ) << endmsg;
534 return StatusCode::FAILURE;
567 return StatusCode::SUCCESS;
602 for (
int i = 0; i < B_LAY_NUM; i++ )
605 if ( i % 2 != 0 ) { stripMax = 96 * 7 + 112; }
606 else { stripMax = 48 * 8; }
607 sprintf( name,
"HitMapBarrel_Lay_L%d", i );
609 m_hHitMapBarrel_Lay[i] =
new TH1F( name,
title, stripMax, 0, stripMax );
614 sprintf( name,
"HitMapEastEndcap_L%d", i );
616 m_hHitMapEndcap_Lay[0][i] =
new TH1F( name,
title, stripMax, 0, stripMax );
618 sprintf( name,
"HitMapWestEndcap_L%d", i );
620 m_hHitMapEndcap_Lay[1][i] =
new TH1F( name,
title, stripMax, 0, stripMax );
624 for (
int i = 0; i < B_SEG_NUM; i++ )
627 sprintf( name,
"HitMapBarrel_Seg_S%d", i );
629 if ( i == 2 ) { stripMax = 48 * 5 + 112 * 4; }
630 else { stripMax = 48 * 5 + 96 * 4; }
631 m_hHitMapBarrel_Seg[i] =
new TH1F( name,
title, stripMax, 0, stripMax );
635 sprintf( name,
"HitMapEastEndcap_S%d", i );
636 sprintf(
title,
"Hit map in east-endcap segment %d", i );
638 m_hHitMapEndcap_Seg[0][i] =
new TH1F( name,
title, stripMax, 0, stripMax );
640 sprintf( name,
"HitMapWestEndcap_S%d", i );
641 sprintf(
title,
"Hit map in west-endcap segment %d", i );
642 m_hHitMapEndcap_Seg[1][i] =
new TH1F( name,
title, stripMax, 0, stripMax );
648 m_hHitVsEvent =
new TH1F(
"HitVsEvent",
"Hit VS event", 10000, 0, 10000 );
649 m_hHitVsEvent->GetXaxis()->SetTitle(
"Event NO." );
650 m_hHitVsEvent->GetXaxis()->CenterTitle();
651 m_hHitVsEvent->GetYaxis()->SetTitle(
"Hits" );
652 m_hHitVsEvent->GetYaxis()->CenterTitle();
654 m_hTrackDistance =
new TH1F(
"TrackDistance",
"Track distance", 1000, -500, 500 );
655 m_hTrackDistance->GetXaxis()->SetTitle(
656 "Distance of fit pos and hit pos on 1st layer [cm]" );
657 m_hTrackDistance->GetXaxis()->CenterTitle();
660 new TH1F(
"TrackPosPhiDiff",
"#Delta#phi of tracks pos", 720, -2 *
PI, 2 *
PI );
661 m_hTrackPosPhiDiff->GetXaxis()->SetTitle(
"#Delta#phi [rad]" );
662 m_hTrackPosPhiDiff->GetXaxis()->CenterTitle();
664 m_hTrackPosThetaDiff =
665 new TH1F(
"TrackPosThetaDiff",
"#Delta#theta of tracks pos", 720, -2 *
PI, 2 *
PI );
666 m_hTrackPosThetaDiff->GetXaxis()->SetTitle(
"#Delta#theta [rad]" );
667 m_hTrackPosThetaDiff->GetXaxis()->CenterTitle();
670 new TH1F(
"TrackMomPhiDiff",
"#Delta#phi of tracks mom", 720, -2 *
PI, 2 *
PI );
671 m_hTrackMomPhiDiff->GetXaxis()->SetTitle(
"#Delta#phi [rad]" );
672 m_hTrackMomPhiDiff->GetXaxis()->CenterTitle();
674 m_hTrackMomThetaDiff =
675 new TH1F(
"TrackMomThetaDiff",
"#Delta#theta of tracks mom", 720, -2 *
PI, 2 *
PI );
676 m_hTrackMomThetaDiff->GetXaxis()->SetTitle(
"#Delta#theta [rad]" );
677 m_hTrackMomThetaDiff->GetXaxis()->CenterTitle();
680 m_hDimuTracksPosDiff =
681 new TH2F(
"DimuTracksPosDiff",
"#Delta#phi VS #Delta#theta of dimu tracks pos", 720, -
PI,
683 m_hDimuTracksPosDiff->GetXaxis()->SetTitle(
"#Delta#theta" );
684 m_hDimuTracksPosDiff->GetXaxis()->CenterTitle();
685 m_hDimuTracksPosDiff->GetYaxis()->SetTitle(
"#Delta#phi" );
686 m_hDimuTracksPosDiff->GetYaxis()->CenterTitle();
688 m_hDimuTracksMomDiff =
689 new TH2F(
"DimuTracksMomDiff",
"#Delta#phi VS #Delta#theta of dimu tracks mom", 720, -
PI,
691 m_hDimuTracksMomDiff->GetXaxis()->SetTitle(
"#Delta#theta" );
692 m_hDimuTracksMomDiff->GetXaxis()->CenterTitle();
693 m_hDimuTracksMomDiff->GetYaxis()->SetTitle(
"#Delta#phi" );
694 m_hDimuTracksMomDiff->GetYaxis()->CenterTitle();
697 new TH2F(
"PhiVsCosTheta",
"#phi VS cos(#theta)", 720, -1, 1, 720, -
PI,
PI );
698 m_hPhiCosTheta->GetXaxis()->SetTitle(
"cos(#theta)" );
699 m_hPhiCosTheta->GetXaxis()->CenterTitle();
700 m_hPhiCosTheta->GetYaxis()->SetTitle(
"#phi" );
701 m_hPhiCosTheta->GetYaxis()->CenterTitle();
703 return StatusCode::SUCCESS;
752 int part, segment, layer, stripMax;
753 part = segment = layer = stripMax = 0;
755 for (
int i = 0; i < BOX_MAX; i++ )
757 m_ptrIdTr->SetBoxPos( i, &part, &segment, &layer );
758 stripMax = m_ptrIdTr->GetStripMax( part, segment, layer );
760 sprintf( name,
"StripFireMap_P%d_S%d_L%d_Box%d", part, segment, layer, i );
761 sprintf(
title,
"Fires per strip in P%d_S%d_L%d Box%d", part, segment, layer, i );
762 m_hStripFireMap[i] =
new TH1F( name,
title, stripMax, 0, stripMax );
764 sprintf( name,
"StripExpHitMap_P%d_S%d_L%d_Box%d", part, segment, layer, i );
765 sprintf(
title,
"Exp hits per strip in P%d_S%d_L%d Box%d", part, segment, layer, i );
766 m_hStripExpHitMap[i] =
new TH1F( name,
title, stripMax, 0, stripMax );
768 sprintf( name,
"StripEffHitMap_P%d_S%d_L%d_Box%d", part, segment, layer, i );
769 sprintf(
title,
"Eff hits per strip in P%d_S%d_L%d Box%d", part, segment, layer, i );
770 m_hStripEffHitMap[i] =
new TH1F( name,
title, stripMax, 0, stripMax );
772 sprintf( name,
"StripNosHitMap_P%d_S%d_L%d_Box%d", part, segment, layer, i );
773 sprintf(
title,
"Inc hits per strip in P%d_S%d_L%d Box%d", part, segment, layer, i );
774 m_hStripNosHitMap[i] =
new TH1F( name,
title, stripMax, 0, stripMax );
776 sprintf( name,
"StripEffMap_P%d_S%d_L%d_Box%d", part, segment, layer, i );
777 sprintf(
title,
"Strip efficiency in P%d_S%d_L%d Box%d", part, segment, layer, i );
778 m_hStripEffMap[i] =
new TH1F( name,
title, stripMax, 0, stripMax );
780 sprintf( name,
"StripNosRatioMap_P%d_S%d_L%d_Box%d", part, segment, layer, i );
781 sprintf(
title,
"Strip noise hit ratio in P%d_S%d_L%d Box%d", part, segment, layer, i );
782 m_hStripNosRatioMap[i] =
new TH1F( name,
title, stripMax, 0, stripMax );
786 new TH1F(
"StripFire",
"Fires per strip", STRIP_MAX + 1, -0.5, STRIP_MAX + 0.5 );
788 new TH1F(
"StripExpHit",
"Exp hit per strip", STRIP_MAX + 1, -0.5, STRIP_MAX + 0.5 );
790 new TH1F(
"StripEffHit",
"Eff hit per strip", STRIP_MAX + 1, -0.5, STRIP_MAX + 0.5 );
792 new TH1F(
"StripNoshit",
"Nos hit per strip", STRIP_MAX + 1, -0.5, STRIP_MAX + 0.5 );
794 new TH1F(
"StripEff",
"Strip efficiency", STRIP_MAX + 1, -0.5, STRIP_MAX + 0.5 );
795 m_hStripNosRatio =
new TH1F(
"StripNosRatio",
"Strip noise hit ratio", STRIP_MAX + 1, -0.5,
797 m_hStripArea =
new TH1F(
"StripArea",
"Strip area", STRIP_MAX + 1, -0.5, STRIP_MAX + 0.5 );
798 m_hStripNos =
new TH1F(
"StripNos",
"Strip noise", STRIP_MAX + 1, -0.5, STRIP_MAX + 0.5 );
799 m_hStripCnt =
new TH1F(
"StripCnt",
"Strip count", STRIP_MAX + 1, -0.5, STRIP_MAX + 0.5 );
801 return StatusCode::SUCCESS;
1194 MsgStream log(
msgSvc,
"MucCalibMgr" );
1195 log << MSG::INFO <<
"Read event" << endmsg;
1197 Gaudi::svcLocator()->service(
"EventDataSvc",
eventSvc );
1198 m_evtBegin = clock();
1201 SmartDataPtr<Event::EventHeader> eventHeader(
eventSvc,
"/Event/EventHeader" );
1204 log << MSG::FATAL <<
"Could not find event header" << endmsg;
1205 return ( StatusCode::FAILURE );
1208 m_currentRun = eventHeader->runNumber();
1209 m_currentEvent = eventHeader->eventNumber();
1210 if ( m_fStartRun == 0 ) m_fStartRun = m_currentRun;
1211 m_fEndRun = m_currentRun;
1214 log << MSG::INFO <<
"Run [ " << m_currentRun <<
" ]\tEvent [ " << m_currentEvent <<
" ]"
1216 if ( ( (
long)m_fTotalEvent ) % 2000 == 0 ) cout << m_fTotalEvent <<
"\tdone!" << endl;
1222 log << MSG::INFO <<
"Event tag:\t" << m_eventTag << endmsg;
1223 if ( m_dimuOnly && m_eventTag != 1 )
return ( StatusCode::FAILURE );
1227 log << MSG::INFO <<
"Retrieve digis" << endmsg;
1229 SmartDataPtr<MucDigiCol> mucDigiCol(
eventSvc,
"/Event/Digi/MucDigiCol" );
1232 log << MSG::FATAL <<
"Could not find MUC digi" << endmsg;
1233 return ( StatusCode::FAILURE );
1236 int part, segment, layer, strip, pad;
1237 part = segment = layer = strip = pad = 0;
1238 double padX, padY, padZ;
1239 padX = padY = padZ = 0.;
1243 MucDigiCol::iterator digiIter = mucDigiCol->begin();
1245 for (
int digiId = 0; digiIter != mucDigiCol->end(); digiIter++, digiId++ )
1247 mucId = ( *digiIter )->identify();
1253 log << MSG::DEBUG <<
"[" << part <<
"\t" << segment <<
"\t" << layer <<
"\t" << strip
1255 if ( ( digiId + 1 ) % 8 == 0 ) log << MSG::DEBUG << endmsg;
1259 if (
abs( part ) >= PART_MAX ||
abs( segment ) >= SEGMENT_MAX ||
1260 abs( layer ) >= LAYER_MAX ||
abs( strip ) >= STRIP_INBOX_MAX )
1262 log << MSG::ERROR << endmsg <<
"Digi IDs slop over!" << endmsg;
1268 m_digiCol.push_back( aMark );
1269 m_segDigiCol[part][segment].push_back( aMark );
1271 log << MSG::DEBUG << endmsg;
1272 log << MSG::INFO <<
"Total digits of this event: " << eventDigi << endmsg;
1273 if ( eventDigi > 200 )
1274 log << MSG::ERROR <<
"Event: " << m_currentEvent <<
"\tdigits sharply rise:\t" << eventDigi
1294 int clusterNum, bigClusterNum, clusterSize;
1295 clusterNum = bigClusterNum = clusterSize = 0;
1296 if ( m_clusterMode )
1298 log << MSG::INFO <<
"Searching clusters" << endmsg;
1299 m_clusterCol = ( *m_ptrMucMark ).CreateClusterCol( m_clusterMode, m_digiCol );
1302 for (
unsigned int i = 0; i < m_clusterCol.size(); i++ )
1304 clusterSize = m_clusterCol[i].size();
1306 if ( clusterSize > CLUSTER_ALARM )
1308 log << MSG::WARNING <<
"Big cluster:" << endmsg;
1309 part = ( *m_clusterCol[i][0] ).Part();
1310 segment = ( *m_clusterCol[i][0] ).
Segment();
1311 layer = ( *m_clusterCol[i][0] ).Layer();
1313 if ( m_clusterSave )
1314 ( *m_fdata ) <<
"Event:\t" << m_currentEvent <<
"\tbig cluster " << bigClusterNum
1317 for (
int j = 0; j < clusterSize; j++ )
1319 strip = ( *m_clusterCol[i][j] ).Strip();
1320 log << MSG::WARNING <<
"[" << part <<
"\t" << segment <<
"\t" << layer <<
"\t" << strip
1322 if ( ( j + 1 ) % 8 == 0 ) log << MSG::WARNING << endmsg;
1323 if ( m_clusterSave )
1324 ( *m_fdata ) << part <<
"\t" << segment <<
"\t" << layer <<
"\t" << strip << endl;
1326 log << MSG::WARNING << endmsg;
1329 else if ( clusterSize > 1 )
1331 log << MSG::DEBUG <<
"cluster: " << clusterNum << endmsg;
1332 clusterNum++, m_fTotalClstNum++;
1333 part = ( *m_clusterCol[i][0] ).Part();
1334 segment = ( *m_clusterCol[i][0] ).
Segment();
1335 layer = ( *m_clusterCol[i][0] ).Layer();
1336 for (
int j = 0; j < clusterSize; j++ )
1338 strip = ( *m_clusterCol[i][j] ).Strip();
1339 log << MSG::DEBUG <<
"[" << part <<
"\t" << segment <<
"\t" << layer <<
"\t" << strip
1341 if ( ( j + 1 ) % 8 == 0 ) log << MSG::DEBUG << endmsg;
1343 log << MSG::DEBUG << endmsg;
1347 if ( m_clusterMode )
1348 log << MSG::INFO <<
"Total clusters in this event: " << clusterNum << endmsg;
1349 else log << MSG::INFO <<
"Clusters not built" << endmsg;
1353 log << MSG::INFO <<
"Retrieve tracks" << endmsg;
1355 SmartDataPtr<RecMdcTrackCol> mdcTrackCol(
eventSvc,
"/Event/Recon/RecMdcTrackCol" );
1358 log << MSG::FATAL <<
"Could not find mdc tracks" << endmsg;
1359 return ( StatusCode::FAILURE );
1362 RecMdcTrackCol::iterator mdctrkIter = mdcTrackCol->begin();
1363 for ( ; mdctrkIter != mdcTrackCol->end(); mdctrkIter++ )
1365 m_charge = ( *mdctrkIter )->charge();
1366 m_mdcpx = ( *mdctrkIter )->px();
1367 m_mdcpy = ( *mdctrkIter )->py();
1368 m_mdcpz = ( *mdctrkIter )->pz();
1369 m_mdcpt = ( *mdctrkIter )->pxy();
1370 m_mdcpp = ( *mdctrkIter )->p();
1371 m_mdcphi = ( *mdctrkIter )->phi();
1372 m_mdctheta = ( *mdctrkIter )->theta();
1373 m_mdcTrkInfoTuple->write();
1377 SmartDataPtr<RecMucTrackCol> mucTrackCol(
eventSvc,
"/Event/Recon/RecMucTrackCol" );
1380 log << MSG::FATAL <<
"Could not find RecMucTrackCol" << endmsg;
1381 return ( StatusCode::FAILURE );
1385 if ( aRecMucTrackCol->size() < 1 )
1387 log << MSG::INFO <<
"No MUC tracks in this event" << endmsg;
1388 return StatusCode::SUCCESS;
1390 log << MSG::INFO <<
"Total tracks of this event: " << aRecMucTrackCol->size() << endmsg;
1397 SmartDataPtr<RecEsTimeCol> aRecEsTimeCol(
eventSvc,
"/Event/Recon/RecEsTimeCol" );
1398 if ( !aRecEsTimeCol )
1400 log << MSG::ERROR <<
"Could not find RecEsTimeCol" << endmsg;
1401 return StatusCode::FAILURE;
1405 RecEsTimeCol::iterator iter_evt = aRecEsTimeCol->begin();
1408 m_ntEsTime = ( *iter_evt )->getStat();
1409 if ( ( *iter_evt )->getStat() != 211 )
1411 log << MSG::WARNING <<
"Event time not by TOF, skip!" << endmsg;
1412 return StatusCode::SUCCESS;
1419 phiDiff = thetaDiff = 0.;
1420 if ( aRecMucTrackCol->size() == 2 && ( *aRecMucTrackCol )[0]->GetTotalHits() > 4 &&
1421 ( *aRecMucTrackCol )[1]->GetTotalHits() > 4 )
1424 phi1 = ( *aRecMucTrackCol )[0]->getMucPos().phi();
1425 phi2 = ( *aRecMucTrackCol )[1]->getMucPos().phi();
1430 theta1 = ( *aRecMucTrackCol )[0]->getMucPos().theta();
1431 theta2 = ( *aRecMucTrackCol )[1]->getMucPos().theta();
1433 m_hTrackPosPhiDiff->Fill( phiDiff );
1434 m_hTrackPosThetaDiff->Fill( thetaDiff );
1435 m_hDimuTracksPosDiff->Fill( thetaDiff, phiDiff );
1436 m_ntPosPhiDiff = phiDiff;
1437 m_ntPosThetaDiff = thetaDiff;
1439 log << MSG::INFO <<
"PosPhiDiff:\t" << phiDiff <<
"\tPosThetaDiff:\t" << thetaDiff
1443 phi1 = ( *aRecMucTrackCol )[0]->getMucMomentum().phi();
1444 phi2 = ( *aRecMucTrackCol )[1]->getMucMomentum().phi();
1449 theta1 = ( *aRecMucTrackCol )[0]->getMucMomentum().theta();
1450 theta2 = ( *aRecMucTrackCol )[1]->getMucMomentum().theta();
1453 m_hTrackMomPhiDiff->Fill( phiDiff );
1454 m_hTrackMomThetaDiff->Fill( thetaDiff );
1455 m_hDimuTracksMomDiff->Fill( thetaDiff, phiDiff );
1456 m_ntMomPhiDiff = phiDiff;
1457 m_ntMomThetaDiff = thetaDiff;
1459 log << MSG::INFO <<
"MomPhiDiff:\t" << phiDiff <<
"\tMomThetaDiff:\t" << thetaDiff
1461 m_ntDimuTag = m_eventTag;
1462 m_trackDiffTuple->write();
1466 RecMucTrackCol::iterator trackIter = mucTrackCol->begin();
1467 int trackHitNum, rawHitNum, expectedHitNum, segNum, trkRecMode, lastLayerBR, lastLayerEC;
1468 int layerPassNum[3], passMax[TRACK_SEG_MAX][2];
1469 bool firedLay[TRACK_SEG_MAX][LAYER_MAX];
1470 bool seedList[PART_MAX][LAYER_MAX];
1471 trackHitNum = rawHitNum = expectedHitNum = segNum = trkRecMode = lastLayerBR = lastLayerEC =
1473 layerPassNum[0] = layerPassNum[1] = layerPassNum[2] = 0;
1474 for (
int segi = 0; segi < TRACK_SEG_MAX; segi++ )
1476 passMax[segi][0] = passMax[segi][1] = 0;
1477 for (
int layi = 0; layi < LAYER_MAX; layi++ ) firedLay[segi][layi] = 0;
1484 vector<int> mucRawHitCol;
1485 vector<int> mucExpHitCol;
1487 for (
int trackId = 0; trackIter != mucTrackCol->end(); trackIter++, trackId++ )
1492 trackHitNum = ( *trackIter )->numHits();
1493 log << MSG::DEBUG <<
"Track: " << trackId <<
" Hits: " << trackHitNum << endmsg;
1495 if ( trackHitNum == 0 )
1497 log << MSG::INFO <<
"Track " << trackId <<
" no hits" << endmsg;
1501 m_ntTrackHits = trackHitNum;
1503 m_trkRecMode = trkRecMode = ( *trackIter )->GetRecMode();
1504 m_chi2 = ( *trackIter )->chi2();
1505 m_px = ( *trackIter )->getMucMomentum().x();
1506 m_py = ( *trackIter )->getMucMomentum().y();
1507 m_pz = ( *trackIter )->getMucMomentum().z();
1508 m_pt = sqrt( m_px * m_px + m_py * m_py );
1509 m_pp = sqrt( m_px * m_px + m_py * m_py + m_pz * m_pz );
1512 m_r = ( *trackIter )->getMucPos().mag();
1513 m_cosTheta = ( *trackIter )->getMucPos().cosTheta();
1514 m_theta = ( *trackIter )->getMucPos().theta();
1515 m_phi = ( *trackIter )->getMucPos().phi();
1516 m_depth = ( *trackIter )->depth();
1517 m_brLastLayer = lastLayerBR = ( *trackIter )->brLastLayer();
1518 m_ecLastLayer = lastLayerEC = ( *trackIter )->ecLastLayer();
1519 m_totalHits = ( *trackIter )->numHits();
1520 m_totalLayers = ( *trackIter )->numLayers();
1521 m_maxHitsInLayer = ( *trackIter )->maxHitsInLayer();
1523 m_hPhiCosTheta->Fill( m_cosTheta, m_phi );
1524 log << MSG::INFO <<
"Fill track info" << endmsg;
1528 if ( m_calHitCol.size() != 0 ) m_calHitCol.clear();
1531 log << MSG::DEBUG <<
"Reconstruction hits(digis in a track): " << endmsg;
1533 mucRawHitCol = ( *trackIter )->getVecHits();
1534 rawHitNum += mucRawHitCol.size();
1543 for (
unsigned int hitId = 0; hitId < mucRawHitCol.size(); hitId++ )
1551 mucId = mucRawHitCol[hitId];
1559 log << MSG::DEBUG <<
"[" << part <<
"\t" << segment <<
"\t" << layer <<
"\t" << strip
1565 m_calHitCol.push_back( aMark );
1574 trkSeg[segNum].push_back( aMark );
1579 log << MSG::DEBUG <<
"segNum: " << segNum << endmsg;
1580 bool notInSeg =
true;
1581 for (
int segi = 0; segi < segNum; segi++ )
1585 trkSeg[segi].push_back( aMark );
1591 if ( notInSeg ==
true )
1593 trkSeg[segNum].push_back( aMark );
1595 if ( segNum > TRACK_SEG_MAX )
1597 log << MSG::ERROR <<
"Track segment overflow: " << segNum << endmsg;
1603 log << MSG::DEBUG << endmsg;
1606 layerPassNum[0] = layerPassNum[1] = layerPassNum[2] = 0;
1607 for (
int segi = 0; segi < segNum; segi++ )
1610 passMax[segi][0] = passMax[segi][1] = trkSeg[segi][0]->Layer();
1611 for (
unsigned int hiti = 1; hiti < trkSeg[segi].size(); hiti++ )
1613 if ( trkSeg[segi][hiti]->Layer() < passMax[segi][0] )
1614 passMax[segi][0] = trkSeg[segi][hiti]->Layer();
1615 if ( trkSeg[segi][hiti]->Layer() > passMax[segi][1] )
1616 passMax[segi][1] = trkSeg[segi][hiti]->Layer();
1617 firedLay[segi][trkSeg[segi][hiti]->Layer()] = 1;
1620 for (
int layi = 0; layi < LAYER_MAX; layi++ )
1622 if ( firedLay[segi][layi] ) tmpLayNum++;
1625 if ( segi == 0 ) layerPassNum[0] += passMax[segi][1] + 1;
1626 else layerPassNum[0] += ( passMax[segi][1] - passMax[segi][0] + 1 );
1628 layerPassNum[1] += ( passMax[segi][1] - passMax[segi][0] + 1 );
1629 layerPassNum[2] += tmpLayNum;
1631 trkSeg[segi].clear();
1633 m_ntTrackEvent = m_currentEvent;
1634 m_ntTrackTag = m_eventTag;
1635 m_ntTrackSegFly = segNum;
1636 m_ntTrackLayFlyA = layerPassNum[0];
1637 m_ntTrackLayFlyB = layerPassNum[1];
1638 m_ntTrackLayFlyC = layerPassNum[2];
1639 m_trackInfoTuple->write();
1640 log << MSG::INFO <<
"Track\t" << trackId <<
"\tsegment(s):\t" << segNum
1641 <<
"\tlayer passed:\t" << layerPassNum[0] <<
"\t" << layerPassNum[1] <<
"\t"
1642 << layerPassNum[2] << endmsg;
1649 log << MSG::DEBUG <<
"Fitting hits(expected hits in a track): " << endmsg;
1651 mucExpHitCol = ( *trackIter )->getExpHits();
1653 expectedHitNum += mucExpHitCol.size();
1655 for (
unsigned int hitId = 0; hitId < mucExpHitCol.size(); hitId++ )
1661 mucId = mucExpHitCol[hitId];
1685 MucMark* currentMark =
new MucMark( part, segment, layer, strip );
1686 m_expHitCol.push_back( currentMark );
1692 bool isInEffWindow =
false;
1693 isInPos = currentMark->
IsInCol( m_segDigiCol[part][segment] );
1696 if ( part == BRID && ( layer - lastLayerBR > 1 ) )
continue;
1697 if ( part != BRID && ( layer - lastLayerEC > 1 ) )
continue;
1700 if ( part == BRID && layer == 0 && ( strip < 2 || strip > 45 ) )
1702 if ( isInPos != -1 )
1704 m_record[part][segment][layer][strip][2]++;
1705 m_record[part][segment][layer][strip][1]++;
1706 m_effHitCol.push_back( m_segDigiCol[part][segment][isInPos] );
1708 if ( m_usePad != 0 )
1710 m_h2DExpMap[part][segment][layer]->Fill( padX, padY );
1711 m_h2DHitMap[part][segment][layer]->Fill( padX, padY );
1716 m_record[part][segment][layer][strip][1]++;
1717 if ( m_usePad != 0 ) m_h2DExpMap[part][segment][layer]->Fill( padX, padY );
1723 if ( isInPos != -1 )
1725 m_record[part][segment][layer][strip][2]++;
1726 m_record[part][segment][layer][strip][1]++;
1727 m_effHitCol.push_back( m_segDigiCol[part][segment][isInPos] );
1729 if ( m_usePad != 0 )
1731 m_h2DExpMap[part][segment][layer]->Fill( padX, padY );
1732 m_h2DHitMap[part][segment][layer]->Fill( padX, padY );
1738 for (
int tempStrip = 0, hiti = -m_effWindow; hiti <= m_effWindow; hiti++ )
1740 if ( hiti == 0 )
continue;
1741 tempStrip = strip + hiti;
1742 if ( tempStrip < 0 || tempStrip > m_ptrIdTr->GetStripMax( part, segment, layer ) )
1745 isInPos = m_ptrMucMark->IsInCol( part, segment, layer, tempStrip,
1746 m_segDigiCol[part][segment] );
1747 if ( isInPos != -1 )
1749 m_record[part][segment][layer][tempStrip][2]++;
1750 m_record[part][segment][layer][tempStrip][1]++;
1751 m_effHitCol.push_back( m_segDigiCol[part][segment][isInPos] );
1753 if ( m_usePad != 0 )
1755 m_h2DExpMap[part][segment][layer]->Fill( padX, padY );
1756 m_h2DHitMap[part][segment][layer]->Fill( padX, padY );
1759 m_ntEffWindow = hiti;
1760 m_effWindowTuple->write();
1761 isInEffWindow =
true;
1766 if ( isInEffWindow ) {
continue; }
1769 m_record[part][segment][layer][strip][1]++;
1770 if ( m_usePad != 0 ) m_h2DExpMap[part][segment][layer]->Fill( padX, padY );
1776 log << MSG::INFO <<
"Fill residual" << endmsg;
1777 vector<float> m_lineResCol = ( *trackIter )->getDistHits();
1778 vector<float> m_quadResCol = ( *trackIter )->getQuadDistHits();
1779 vector<float> m_extrResCol = ( *trackIter )->getExtDistHits();
1780 int mode = ( *trackIter )->GetRecMode();
1782 for (
unsigned int nres = 0; nres < m_lineResCol.size(); nres++ )
1783 if ( fabs( m_lineResCol[nres] ) > resMax ) resMax = fabs( m_lineResCol[nres] );
1785 log << MSG::INFO <<
"Good track for res" << endmsg;
1786 if ( trackHitNum > 4 && m_lineResCol[0] != -99 )
1789 bool firedFlag[PART_MAX][LAYER_MAX][2];
1790 for (
int iprt = 0; iprt < PART_MAX; iprt++ )
1791 for (
int jlay = 0; jlay < LAYER_MAX; jlay++ )
1792 firedFlag[iprt][jlay][0] = firedFlag[iprt][jlay][1] =
false;
1794 for (
unsigned int hitId = 0; hitId < mucExpHitCol.size(); hitId++ )
1800 mucId = mucExpHitCol[hitId];
1806 firedFlag[part][layer][0] =
true;
1809 log << MSG::INFO <<
"Fit res" << endmsg;
1810 for (
unsigned int hitId = 0; hitId < mucRawHitCol.size(); hitId++ )
1816 mucId = mucRawHitCol[hitId];
1821 if ( part == BRID ) m_hBarrelResDist[layer]->Fill( m_lineResCol[hitId] );
1822 else m_hEndcapResDist[layer]->Fill( m_lineResCol[hitId] );
1825 if ( firedFlag[part][layer][0] ==
true && firedFlag[part][layer][1] ==
false )
1828 m_resSegment = segment;
1830 m_lineRes = m_lineResCol[hitId];
1837 m_resInfoTuple->write();
1841 firedFlag[part][layer][1] =
true;
1844 log << MSG::INFO <<
"Exp res" << endmsg;
1845 for (
unsigned int hitId = 0; hitId < mucExpHitCol.size(); hitId++ )
1851 mucId = mucExpHitCol[hitId];
1856 if ( firedFlag[part][layer][0] ==
true && firedFlag[part][layer][1] ==
false )
1859 m_resSegment = segment;
1866 m_resInfoTuple->write();
1872 mucRawHitCol.clear();
1873 mucExpHitCol.clear();
1880 m_ntTrackNum = mucTrackCol->size();
1882 m_fTotalEffHit += rawHitNum;
1883 log << MSG::INFO <<
"Total hits in this event, raw: " << rawHitNum
1884 <<
"\texpected: " << expectedHitNum << endmsg;
1888 log << MSG::INFO <<
"Searching inc/noise hits" << endmsg;
1891 for (
unsigned int i = 0; i < m_digiCol.size(); i++ )
1895 if ( m_digiCol[i]->IsInCol( m_effHitCol ) != -1 )
continue;
1898 for (
unsigned int j = 0; j < m_clusterCol.size(); j++ )
1901 for (
unsigned int k = 0; k < m_clusterCol[j].size(); k++ )
1903 if ( m_clusterCol[j][k]->IsInCol( m_effHitCol ) != -1 )
1911 if ( hasEffHit && ( m_digiCol[i]->IsInCol( m_clusterCol[j] ) != -1 ) )
1920 m_nosHitCol.push_back( m_digiCol[i] );
1926 return StatusCode::SUCCESS;
1986 MsgStream log(
msgSvc,
"MucCalibMgr" );
1987 log << MSG::INFO <<
"Fill event" << endmsg;
1989 int part, segment, layer, strip, size;
1990 part = segment = layer = strip = size = 0;
1993 log << MSG::INFO <<
"Fill digis" << endmsg;
1994 for (
unsigned int i = 0; i < m_digiCol.size(); i++ )
1996 part = ( *m_digiCol[i] ).Part();
1997 segment = ( *m_digiCol[i] ).
Segment();
1998 layer = ( *m_digiCol[i] ).Layer();
1999 strip = ( *m_digiCol[i] ).Strip();
2001 FillDigi( part, segment, layer, strip );
2002 m_record[part][segment][layer][strip][0]++;
2007 log << MSG::INFO <<
"Fill rec hits" << endmsg;
2008 for (
unsigned int i = 0; i < m_expHitCol.size(); i++ )
2010 part = ( *m_expHitCol[i] ).Part();
2011 segment = ( *m_expHitCol[i] ).
Segment();
2012 layer = ( *m_expHitCol[i] ).Layer();
2013 strip = ( *m_expHitCol[i] ).Strip();
2016 m_record[part][segment][layer][strip][4]++;
2021 log << MSG::INFO <<
"Fill eff hits" << endmsg;
2022 for (
unsigned int i = 0; i < m_effHitCol.size(); i++ )
2024 part = ( *m_effHitCol[i] ).Part();
2025 segment = ( *m_effHitCol[i] ).
Segment();
2026 layer = ( *m_effHitCol[i] ).Layer();
2027 strip = ( *m_effHitCol[i] ).Strip();
2034 log << MSG::INFO <<
"Fill clusters" << endmsg;
2035 for (
unsigned int i = 0; i < m_clusterCol.size(); i++ )
2037 size = m_clusterCol[i].size();
2039 if ( size > CLUSTER_CUT )
2041 part = ( *m_clusterCol[i][0] ).Part();
2042 segment = ( *m_clusterCol[i][0] ).
Segment();
2043 layer = ( *m_clusterCol[i][0] ).Layer();
2046 m_ntClusterSize = size;
2047 m_clusterSizeTuple->write();
2052 log << MSG::INFO <<
"Fill inc/noise hits" << endmsg;
2053 for (
unsigned int i = 0; i < m_nosHitCol.size(); i++ )
2055 part = ( *m_nosHitCol[i] ).Part();
2056 segment = ( *m_nosHitCol[i] ).
Segment();
2057 layer = ( *m_nosHitCol[i] ).Layer();
2058 strip = ( *m_nosHitCol[i] ).Strip();
2061 m_record[part][segment][layer][strip][3]++;
2065 m_ntEventId = m_currentEvent;
2066 m_ntEventTag = m_eventTag;
2067 m_ntDigiNum = m_digiCol.size();
2068 m_ntExpHitNum = m_expHitCol.size();
2069 m_ntEffHitNum = m_effHitCol.size();
2070 m_ntNosHitNum = m_nosHitCol.size();
2071 m_ntClusterNum = m_clusterCol.size();
2074 for (
unsigned int i = 0; i < m_digiCol.size(); i++ )
2076 if ( m_digiCol[i] != NULL )
delete m_digiCol[i];
2079 for (
unsigned int i = 0; i < m_expHitCol.size(); i++ )
2081 if ( m_expHitCol[i] != NULL )
delete m_expHitCol[i];
2089 for (
unsigned int i = 0; i < m_calHitCol.size(); i++ )
2091 if ( m_calHitCol[i] != NULL )
delete m_calHitCol[i];
2094 if ( m_digiCol.size() != 0 ) m_digiCol.clear();
2095 if ( m_expHitCol.size() != 0 ) m_expHitCol.clear();
2096 if ( m_calHitCol.size() != 0 ) m_calHitCol.clear();
2097 if ( m_effHitCol.size() != 0 ) m_effHitCol.clear();
2098 if ( m_nosHitCol.size() != 0 ) m_nosHitCol.clear();
2099 if ( m_clusterCol.size() != 0 ) m_clusterCol.clear();
2101 for (
int i = 0; i < PART_MAX; i++ )
2103 for (
int j = 0; j < SEGMENT_MAX; j++ )
2105 if ( m_segDigiCol[i][j].size() != 0 ) m_segDigiCol[i][j].clear();
2111 m_ntEventTime = ( double( m_evtEnd - m_evtBegin ) ) / CLOCKS_PER_SEC;
2112 log << MSG::INFO <<
"Event time:\t" << m_ntEventTime <<
"s" << endmsg;
2113 m_eventLogTuple->write();
2115 return StatusCode::SUCCESS;
2252 MsgStream log(
msgSvc,
"MucCalibMgr" );
2253 log << MSG::INFO <<
"Analyse layer efficiency and noise" << endmsg;
2255 int part, segment, layer, stripMax;
2256 part = segment = layer = stripMax = 0;
2258 double digi, effHit, trackNum, nosHit, recHit;
2259 double eff, effErr, noise, nosRatio, nosRatioErr, cnt, cluster;
2260 eff = effErr = noise = nosRatio = nosRatioErr = cnt = cluster = 0.;
2262 for (
int i = 0; i < LAYER_MAX; i++ )
2264 digi = effHit = trackNum = nosHit = recHit = 0;
2266 for (
int j = 0; j < PART_MAX; j++ )
2268 for (
int k = 0; k < SEGMENT_MAX; k++ )
2270 stripMax = m_ptrIdTr->GetStripMax( j, k, i );
2271 for (
int n = 0;
n < stripMax;
n++ )
2273 digi += m_record[j][k][i][
n][0];
2274 trackNum += m_record[j][k][i][
n][1];
2275 effHit += m_record[j][k][i][
n][2];
2276 nosHit += m_record[j][k][i][
n][3];
2277 recHit += m_record[j][k][i][
n][4];
2283 if ( trackNum == 0 )
2291 eff = ( (double)effHit ) / trackNum;
2292 effErr = sqrt( eff * ( 1 - eff ) / trackNum );
2297 if ( m_layerResults[3][i] < LIMIT_CUT || m_fTotalDAQTime < LIMIT_CUT )
2298 noise = DEFAULT_NOS_VALUE;
2301 if ( m_recMode == 2 )
2302 noise = (double)nosHit / ( m_fTotalEvent * TRIGGER_WINDOW * m_layerResults[3][i] );
2303 else noise = (double)nosHit / ( m_fTotalDAQTime * m_layerResults[3][i] );
2308 nosRatio = ( (double)nosHit ) / digi;
2309 nosRatioErr = sqrt( nosRatio * ( 1 - nosRatio ) / digi );
2313 nosRatio = DEFAULT_INC_VALUE;
2318 if ( m_recMode == 2 )
2319 cnt = (double)digi / ( m_fTotalEvent * TRIGGER_WINDOW * m_layerResults[3][i] );
2320 else cnt = (double)digi / ( m_fTotalDAQTime * m_layerResults[3][i] );
2323 cluster = m_hLayerCluster[i]->GetMean();
2325 m_layerResults[0][i] = eff;
2326 m_layerResults[1][i] = effErr;
2327 m_layerResults[2][i] = noise;
2328 m_layerResults[4][i] = cluster;
2329 m_layerResults[5][i] = trackNum;
2332 m_hLayerEff->Fill( i, eff );
2333 m_hLayerEff->SetBinError( i + 1, effErr );
2334 m_hLayerNosRatio->Fill( i, nosRatio );
2335 m_hLayerNosRatio->SetBinError( i + 1, nosRatioErr );
2336 m_hLayerNos->Fill( i, noise );
2337 m_hLayerCnt->Fill( i, cnt );
2340 m_hLayerClusterCmp->Fill( i, cluster );
2345 m_fLayerEffErr = effErr;
2346 m_fLayerTrkNum = trackNum;
2347 m_fLayerExpHit = recHit;
2348 m_fLayerEffHit = effHit;
2349 m_fLayerNosRatio = nosRatio;
2350 m_fLayerDigi = digi;
2351 m_fLayerNosHit = nosHit;
2352 m_fLayerNos = noise;
2354 m_tLayConst->Fill();
2357 m_fLayerCluster = cluster;
2361 return StatusCode::SUCCESS;
2365 MsgStream log(
msgSvc,
"MucCalibMgr" );
2366 log << MSG::INFO <<
"Analyse box efficiency and noise" << endmsg;
2368 int part, segment, layer, stripMax;
2369 part = segment = layer = stripMax = 0;
2371 double digi, effHit, trackNum, nosHit, recHit;
2372 double eff, effErr, noise, nosRatio, nosRatioErr, cnt, cluster;
2373 eff = effErr = noise = nosRatio = nosRatioErr = cnt = cluster = 0.;
2375 for (
int i = 0; i < BOX_MAX; i++ )
2377 m_ptrIdTr->SetBoxPos( i, &part, &segment, &layer );
2378 stripMax = m_ptrIdTr->GetStripMax( part, segment, layer );
2380 digi = effHit = trackNum = nosHit = recHit = 0;
2381 for (
int j = 0; j < stripMax; j++ )
2383 digi += m_record[part][segment][layer][j][0];
2384 trackNum += m_record[part][segment][layer][j][1];
2385 effHit += m_record[part][segment][layer][j][2];
2386 nosHit += m_record[part][segment][layer][j][3];
2387 recHit += m_record[part][segment][layer][j][4];
2391 if ( trackNum == 0 )
2399 eff = ( (double)effHit ) / trackNum;
2400 effErr = sqrt( eff * ( 1 - eff ) / trackNum );
2405 if ( m_boxResults[3][i] < LIMIT_CUT || m_fTotalDAQTime < LIMIT_CUT )
2406 noise = DEFAULT_NOS_VALUE;
2409 if ( m_recMode == 2 )
2410 noise = (double)nosHit / ( m_fTotalEvent * TRIGGER_WINDOW * m_boxResults[3][i] );
2411 else noise = (double)nosHit / ( m_fTotalDAQTime * m_boxResults[3][i] );
2416 nosRatio = ( (double)nosHit ) / digi;
2417 nosRatioErr = sqrt( nosRatio * ( 1 - nosRatio ) / digi );
2421 nosRatio = DEFAULT_INC_VALUE;
2426 if ( m_recMode == 2 )
2427 cnt = (double)digi / ( m_fTotalEvent * TRIGGER_WINDOW * m_boxResults[3][i] );
2428 else cnt = (double)digi / ( m_fTotalDAQTime * m_boxResults[3][i] );
2431 cluster = m_hBoxCluster[i]->GetMean();
2433 m_boxResults[0][i] = eff;
2434 m_boxResults[1][i] = effErr;
2435 m_boxResults[2][i] = noise;
2436 m_boxResults[4][i] = cluster;
2437 m_boxResults[5][i] = trackNum;
2440 m_hBoxEff->Fill( i, eff );
2441 m_hBoxEff->SetBinError( i + 1, effErr );
2442 m_hBoxNosRatio->Fill( i, nosRatio );
2443 m_hBoxNosRatio->SetBinError( i + 1, nosRatioErr );
2444 m_hBoxNos->Fill( i, noise );
2445 m_hBoxCnt->Fill( i, cnt );
2448 m_hBoxClusterCmp->Fill( i, cluster );
2453 m_fBoxSegment = segment;
2454 m_fBoxLayer = layer;
2456 m_fBoxEffErr = effErr;
2457 m_fBoxTrkNum = trackNum;
2458 m_fBoxExpHit = recHit;
2459 m_fBoxEffHit = effHit;
2460 m_fBoxNosRatio = nosRatio;
2462 m_fBoxNosHit = nosHit;
2465 m_tBoxConst->Fill();
2468 m_fBoxCluster = cluster;
2472 return StatusCode::SUCCESS;
2476 MsgStream log(
msgSvc,
"MucCalibMgr" );
2477 log << MSG::INFO <<
"Analyse strip efficiency and noise" << endmsg;
2479 int part, segment, layer, stripMax;
2480 part = segment = layer = stripMax = 0;
2482 double digi, effHit, trackNum, nosHit, recHit;
2483 double eff, effErr, noise, nosRatio, nosRatioErr, cnt, cluster;
2484 eff = effErr = noise = nosRatio = nosRatioErr = cnt = cluster = 0.;
2486 for (
int i = 0; i < BOX_MAX; i++ )
2488 m_ptrIdTr->SetBoxPos( i, &part, &segment, &layer );
2489 stripMax = m_ptrIdTr->GetStripMax( part, segment, layer );
2491 for (
int j = 0; j < stripMax; j++ )
2493 digi = m_record[part][segment][layer][j][0];
2494 trackNum = m_record[part][segment][layer][j][1];
2495 effHit = m_record[part][segment][layer][j][2];
2496 nosHit = m_record[part][segment][layer][j][3];
2497 recHit = m_record[part][segment][layer][j][4];
2499 int stripId = m_ptrIdTr->GetStripId( part, segment, layer, j );
2502 if ( trackNum == 0 )
2510 eff = ( (double)effHit ) / trackNum;
2511 effErr = sqrt( eff * ( 1 - eff ) / trackNum );
2516 if ( m_stripResults[3][stripId] < LIMIT_CUT || m_fTotalDAQTime < LIMIT_CUT )
2517 noise = DEFAULT_NOS_VALUE;
2520 if ( m_recMode == 2 )
2522 (double)nosHit / ( m_fTotalEvent * TRIGGER_WINDOW * m_stripResults[3][stripId] );
2523 else noise = (double)nosHit / ( m_fTotalDAQTime * m_stripResults[3][stripId] );
2528 nosRatio = ( (double)nosHit ) / digi;
2529 nosRatioErr = sqrt( nosRatio * ( 1 - nosRatio ) / digi );
2533 nosRatio = DEFAULT_INC_VALUE;
2538 if ( m_recMode == 2 )
2539 cnt = (double)digi / ( m_fTotalEvent * TRIGGER_WINDOW * m_stripResults[3][stripId] );
2540 else cnt = (double)digi / ( m_fTotalDAQTime * m_stripResults[3][stripId] );
2543 m_stripResults[0][stripId] = eff;
2544 m_stripResults[1][stripId] = effErr;
2545 m_stripResults[2][stripId] = noise;
2546 m_stripResults[5][stripId] = trackNum;
2549 m_hStripEffMap[i]->Fill( j, eff );
2550 m_hStripEffMap[i]->SetBinError( j + 1, effErr );
2551 m_hStripEff->Fill( stripId, eff );
2552 m_hStripEff->SetBinError( stripId + 1, effErr );
2553 m_hStripNosRatioMap[i]->Fill( j, nosRatio );
2554 m_hStripNosRatioMap[i]->SetBinError( j + 1, nosRatioErr );
2555 m_hStripNosRatio->Fill( stripId, nosRatio );
2556 m_hStripNosRatio->SetBinError( stripId + 1, nosRatioErr );
2557 m_hStripNos->Fill( stripId, noise );
2558 m_hStripCnt->Fill( stripId, cnt );
2561 m_fStripId = stripId;
2562 m_fStripPart = part;
2563 m_fStripSegment = segment;
2564 m_fStripLayer = layer;
2566 m_fStripEffErr = effErr;
2567 m_fStripNosRatio = nosRatio;
2568 m_fStripDigi = digi;
2569 m_fStripNos = noise;
2571 m_fStripEffHit = effHit;
2572 m_fStripExpHit = recHit;
2573 m_fStripNosHit = nosHit;
2574 m_fStripTrkNum = trackNum;
2575 m_tStrConst->Fill();
2580 return StatusCode::SUCCESS;
2663 MsgStream log(
msgSvc,
"MucCalibMgr" );
2664 log << MSG::INFO <<
"Save calibration constants" << endmsg;
2668 double layerXY[2][LAYER_MAX];
2669 double layerEXY[2][LAYER_MAX];
2670 for (
int i = 0; i < LAYER_MAX; i++ )
2674 if ( m_layerResults[5][i] >= 100 * TRACK_THRESHOLD )
2676 layerXY[1][i] = m_layerResults[0][i];
2677 layerEXY[1][i] = m_layerResults[1][i];
2686 new TGraphErrors( LAYER_MAX, layerXY[0], layerXY[1], layerEXY[0], layerEXY[1] );
2687 m_geLayerEff->SetMarkerStyle( 25 );
2688 m_geLayerEff->SetMarkerSize( 0.5 );
2689 m_cv[0] =
new TCanvas(
"GoodLayerEff",
"Layer efficiency", 50, 50, 800, 600 );
2690 m_cv[0]->SetFillColor( 0 );
2691 m_cv[0]->SetBorderMode( 0 );
2692 m_geLayerEff->Draw(
"AP" );
2696 double boxXY[2][BOX_MAX];
2697 double boxEXY[2][BOX_MAX];
2698 for (
int i = 0; i < BOX_MAX; i++ )
2702 if ( m_boxResults[5][i] >= 10 * TRACK_THRESHOLD )
2704 boxXY[1][i] = m_boxResults[0][i];
2705 boxEXY[1][i] = m_boxResults[1][i];
2713 m_geBoxEff =
new TGraphErrors( BOX_MAX, boxXY[0], boxXY[1], boxEXY[0], boxEXY[1] );
2714 m_geBoxEff->SetMarkerStyle( 25 );
2715 m_geBoxEff->SetMarkerSize( 0.5 );
2716 m_cv[1] =
new TCanvas(
"GoodBoxEff",
"Box efficiency", 75, 75, 800, 600 );
2717 m_cv[1]->SetFillColor( 0 );
2718 m_cv[1]->SetBorderMode( 0 );
2719 m_geBoxEff->Draw(
"AP" );
2723 double stripXY[2][STRIP_MAX];
2724 double stripEXY[2][STRIP_MAX];
2725 for (
int i = 0; i < STRIP_MAX; i++ )
2729 if ( m_stripResults[5][i] >= TRACK_THRESHOLD )
2731 stripXY[1][i] = m_stripResults[0][i];
2732 stripEXY[1][i] = m_stripResults[1][i];
2741 new TGraphErrors( STRIP_MAX, stripXY[0], stripXY[1], stripEXY[0], stripEXY[1] );
2742 m_geStripEff->SetMarkerStyle( 25 );
2743 m_geStripEff->SetMarkerSize( 0.5 );
2744 m_cv[2] =
new TCanvas(
"GoodStripEff",
"Strip efficiency", 100, 100, 800, 600 );
2745 m_cv[2]->SetFillColor( 0 );
2746 m_cv[2]->SetBorderMode( 0 );
2747 m_geStripEff->Draw(
"AP" );
2751 for (
int i = 0; i < B_LAY_NUM; i++ )
2753 m_hHitMapBarrel_Lay[i]->Write();
2755 if ( i < E_LAY_NUM )
2757 m_hHitMapEndcap_Lay[0][i]->Write();
2758 m_hHitMapEndcap_Lay[1][i]->Write();
2762 for (
int i = 0; i < B_SEG_NUM; i++ )
2764 m_hHitMapBarrel_Seg[i]->Write();
2766 if ( i < E_SEG_NUM )
2768 m_hHitMapEndcap_Seg[0][i]->Write();
2769 m_hHitMapEndcap_Seg[1][i]->Write();
2772 m_hTrackDistance->Fit(
"gaus" );
2773 m_hTrackPosPhiDiff->Fit(
"gaus" );
2774 m_hTrackPosThetaDiff->Fit(
"gaus" );
2775 m_hTrackMomPhiDiff->Fit(
"gaus" );
2776 m_hTrackMomThetaDiff->Fit(
"gaus" );
2778 m_hTrackDistance->Write();
2779 m_hTrackPosPhiDiff->Write();
2780 m_hTrackPosThetaDiff->Write();
2781 m_hTrackMomPhiDiff->Write();
2782 m_hTrackMomThetaDiff->Write();
2784 for (
int i = 0; i < B_LAY_NUM; i++ ) m_hBarrelResDist[i]->Write();
2785 for (
int i = 0; i < E_LAY_NUM; i++ ) m_hEndcapResDist[i]->Write();
2787 m_hBarrelResComp[0]->Write();
2788 m_hBarrelResComp[1]->Write();
2789 m_hEndcapResComp[0]->Write();
2790 m_hEndcapResComp[1]->Write();
2792 if ( m_usePad != 0 ) m_histArray->Write();
2794 for (
int i = 0; i < BOX_MAX; i++ )
2796 m_hStripFireMap[i]->Write();
2797 m_hStripExpHitMap[i]->Write();
2798 m_hStripEffHitMap[i]->Write();
2799 m_hStripNosHitMap[i]->Write();
2800 m_hStripEffMap[i]->Write();
2801 m_hStripNosRatioMap[i]->Write();
2803 m_hStripFire->Write();
2804 m_hStripExpHit->Write();
2805 m_hStripEffHit->Write();
2806 m_hStripNosHit->Write();
2807 m_hStripEff->Write();
2808 m_hStripArea->Write();
2809 m_hStripNos->Write();
2810 m_hStripNosRatio->Write();
2811 log << MSG::INFO <<
"Save LV2 histograms done!" << endmsg;
2813 m_hBoxFire->Write();
2814 m_hBoxExpHit->Write();
2815 m_hBoxEffHit->Write();
2816 m_hBoxNosHit->Write();
2818 m_hBoxArea->Write();
2820 m_hBoxNosRatio->Write();
2821 log << MSG::INFO <<
"Save LV1 histograms done!" << endmsg;
2823 m_hBrLayerFire->Write();
2824 m_hEcLayerFire->Write();
2825 m_hLayerFire->Write();
2826 m_hLayerExpHit->Write();
2827 m_hLayerEffHit->Write();
2828 m_hLayerNosHit->Write();
2829 m_hLayerEff->Write();
2830 m_hLayerArea->Write();
2831 m_hLayerNos->Write();
2832 m_hLayerNosRatio->Write();
2834 for (
int i = 0; i < LAYER_MAX; i++ ) m_hLayerCluster[i]->Write();
2835 for (
int i = 0; i < BOX_MAX; i++ ) m_hBoxCluster[i]->Write();
2836 m_hLayerClusterCmp->Write();
2837 m_hBoxClusterCmp->Write();
2839 log << MSG::INFO <<
"Save histograms done!" << endmsg;
2842 m_fLayerCoverage = 100 * (double)m_fCalibLayerNum / LAYER_MAX;
2843 m_fBoxCoverage = 100 * (double)m_fCalibBoxNum / BOX_MAX;
2844 m_fStripCoverage = 100 * (double)m_fCalibStripNum / STRIP_MAX;
2846 long digi_num, trk_num, eff_hit, nos_hit, exp_hit;
2847 m_tStatLog->Branch(
"digi_num", &digi_num,
"digi_num/I" );
2848 m_tStatLog->Branch(
"trk_num", &trk_num,
"trk_num/I" );
2849 m_tStatLog->Branch(
"eff_hit", &eff_hit,
"eff_hit/I" );
2850 m_tStatLog->Branch(
"nos_hit", &nos_hit,
"nos_hit/I" );
2851 m_tStatLog->Branch(
"exp_hit", &exp_hit,
"exp_hit/I" );
2854 for (
int i = 0; i < PART_MAX; i++ )
2855 for (
int j = 0; j < ( ( i == BRID ) ? B_SEG_NUM : E_SEG_NUM ); j++ )
2856 for (
int k = 0; k < ( ( i == BRID ) ? B_LAY_NUM : E_LAY_NUM ); k++ )
2858 stripMax = m_ptrIdTr->GetStripMax( i, j, k );
2859 for (
int n = 0;
n < stripMax;
n++ )
2861 digi_num = m_record[i][j][k][
n][0];
2862 trk_num = m_record[i][j][k][
n][1];
2863 eff_hit = m_record[i][j][k][
n][2];
2864 nos_hit = m_record[i][j][k][
n][3];
2865 exp_hit = m_record[i][j][k][
n][4];
2870 m_jobFinish = clock();
2871 m_fTotalJobTime = (double)( m_jobFinish - m_jobStart ) / CLOCKS_PER_SEC;
2875 m_tStatLog->Write();
2876 m_tLayConst->Write();
2877 m_tBoxConst->Write();
2878 m_tStrConst->Write();
2881 if ( m_fdata != NULL ) m_fdata->close();
2883 return StatusCode::SUCCESS;