20 #include "GaudiKernel/MsgStream.h"
21 #include "GaudiKernel/ITHistSvc.h"
38 const std::string &
name,
89 , m_fwdetatrkeffvsLumi(0)
90 , m_bkwdetatrkeffvsLumi(0)
91 , m_MS2ID_MuontrkeffvsPhi(0)
92 , m_ID2MS_MuontrkeffvsEta(0)
113 , m_UpsilonMassMuon(0)
114 , m_UpsilonMassDiff(0)
120 , m_JPsiMassID_broad(0)
121 , m_UpsilonMassID_broad(0)
122 , m_CombinedInDetTracksName(
"CombinedInDetTracks")
123 , m_MooreTracksName(
"MooreTracks")
124 , m_CombinedTracksName(
"CombinedTracks")
125 , m_extrapolator(
"Trk::Extrapolator/InDetExtrapolator")
128 , m_z0DiffCutMuon(200)
129 , m_d0DiffCutMuon(500)
134 , m_printedErrorID(false)
135 , m_printedErrorMuon(false)
136 , m_printedErrorCombined(false)
137 , m_printedErrorMuonColl(false)
156 declareInterface<IMonitorToolBase>(
this);
157 m_path =
"GLOBAL/DQTMuonIDTrack";
197 if (failure) {
return StatusCode::FAILURE;}
198 else {
return StatusCode::SUCCESS;}
218 std::string fullPathMuons=
m_path+
"/Trk";
273 failure = failure |
registerHist(fullPathMuons,
m_trkd0vsPhi0ID =
new TProfile(
"m_trk_d0vsPhi0ID",
"ID Trk d0 vs Phi0", 20, -TMath::Pi(), TMath::Pi(), -2000, 2000)).isFailure();
274 failure = failure |
registerHist(fullPathMuons,
m_trkeffvsphi =
new TProfile(
"m_trk_trkeffvsphi",
"Trk eff vs Phi0", 20, -TMath::Pi(), TMath::Pi(), 0, 1)).isFailure();
281 failure = failure |
registerHist(fullPathMuons,
m_MS2ID_MuontrkeffvsPhi =
new TProfile(
"m_trk_MS2ID_MuontrkeffvsPhi",
"Muon Trk #phi matching eff (MS to ID) vs #phi", 100, -TMath::Pi(), TMath::Pi(), 0, 1)).isFailure();
340 const EventContext& ctx = Gaudi::Hive::currentContext();
346 ATH_MSG_WARNING(
"No Container with name " <<
"Muons" <<
" found in evtStore" );
347 return StatusCode::SUCCESS;
355 std::vector<const xAOD::TrackParticle* > idtracks;
356 std::vector<const xAOD::TrackParticle* > muontracks;
357 std::vector<const xAOD::TrackParticle*>::const_iterator idtracksItr;
358 std::vector<const xAOD::TrackParticle*>::const_iterator muontracksItr;
360 std::vector<const xAOD::TrackParticle*>::const_iterator idtracksItr2;
361 std::vector<const xAOD::TrackParticle*>::const_iterator muontracksItr2;
364 std::vector<const xAOD::Muon* > MSMuons;
365 std::vector<const xAOD::Muon* >::const_iterator MSMuonsItr;
366 std::vector<const xAOD::Muon* > IDMuons;
367 std::vector<const xAOD::Muon* >::const_iterator IDMuonsItr;
376 for (muonItr=muons->
begin(); muonItr != muons->
end(); ++muonItr) {
378 ATH_MSG_DEBUG(
"Muons Container track pointers (primary, inDet, muonSpect, comb, calo) "
379 << (*muonItr)->primaryTrackParticleLink().isValid() <<
" "
380 << (*muonItr)->inDetTrackParticleLink().isValid() <<
" "
381 << (*muonItr)->muonSpectrometerTrackParticleLink().isValid() <<
" "
382 << (*muonItr)->combinedTrackParticleLink().isValid() <<
" "
383 << (*muonItr)->clusterLink().isValid() <<
" "
395 if ((*muonItr)->combinedTrackParticleLink().isValid() &&
396 (*muonItr)->inDetTrackParticleLink().isValid() &&
397 (*muonItr)->muonSpectrometerTrackParticleLink().isValid() &&
400 idtracks.push_back( *((*muonItr)->inDetTrackParticleLink()) );
401 muontracks.push_back( *((*muonItr)->muonSpectrometerTrackParticleLink()) );
405 if (((*muonItr)->inDetTrackParticleLink().isValid()) &&
413 if ((*muonItr)->muonSpectrometerTrackParticleLink().isValid()) {
424 if ( (*muonItr)->eta() >= 0 )
430 if ((*muonItr)->muonSpectrometerTrackParticleLink().isValid() && (*muonItr)->pt()>
m_minPtCut) nms++;
434 if ( ((*muonItr)->muonSpectrometerTrackParticleLink().isValid()) &&
437 ((*muonItr)->allAuthors() == 5 ))
438 MSMuons.push_back( *muonItr);
440 if ( (*muonItr)->inDetTrackParticleLink().isValid() )
441 IDMuons.push_back( *muonItr);
448 for (idtracksItr=idtracks.begin(), muontracksItr = muontracks.begin(); idtracksItr!=idtracks.end();
449 ++idtracksItr, ++muontracksItr) {
451 const Trk::Perigee *idPerigee = &((*idtracksItr)->perigeeParameters());
452 const Trk::Perigee *premeasPerigee = &((*muontracksItr)->perigeeParameters());
455 if (premeasPerigee) {
462 (*muontracksItr)->perigeeParameters(),
473 if (idPerigee!=0 && measPerigee!=0) {
475 float measEta = measPerigee->
eta();
476 float measPhi = measPerigee->parameters()[
Trk::phi0];
477 float measTheta = measPerigee->parameters()[
Trk::theta];
491 for (idtracksItr2=idtracksItr+1, muontracksItr2=muontracksItr+1; idtracksItr2!=idtracks.end();
492 ++idtracksItr2, ++muontracksItr2) {
495 const Trk::Perigee *idPerigee2 = &((*idtracksItr2)->perigeeParameters());
496 const Trk::Perigee *measPerigee2 = &((*muontracksItr2)->perigeeParameters());
512 if (idPerigee2!=0 && measPerigee2!=0) {
530 Float_t diffz0ID = TMath::Abs(idPerigee->parameters()[
Trk::z0]-idPerigee2->parameters()[
Trk::z0]);
531 Float_t diffz0Muon = TMath::Abs(measPerigee->parameters()[
Trk::z0]-measPerigee2->parameters()[
Trk::z0]);
533 Float_t diffd0ID = TMath::Abs(idPerigee->parameters()[
Trk::d0]-idPerigee2->parameters()[
Trk::d0]);
534 Float_t diffd0Muon = TMath::Abs(measPerigee->parameters()[
Trk::d0]-measPerigee2->parameters()[
Trk::d0]);
536 ATH_MSG_DEBUG(
" diffz0id = " << diffz0ID <<
" diffz0Muon = " << diffz0Muon );
537 ATH_MSG_DEBUG(
" diffd0id = " << diffz0ID <<
" diffd0Muon = " << diffz0Muon );
539 CLHEP::HepLorentzVector xvec;
542 CLHEP::HepLorentzVector muonid1(idPerigee->momentum().x(),idPerigee->momentum().y(),idPerigee->momentum().z(),
543 TMath::Sqrt(idPerigee->momentum().x()*idPerigee->momentum().x()+
544 idPerigee->momentum().y()*idPerigee->momentum().y()+
545 idPerigee->momentum().z()*idPerigee->momentum().z()+105.7*105.7));
547 CLHEP::HepLorentzVector muonid2(idPerigee2->momentum().x(),idPerigee2->momentum().y(),idPerigee2->momentum().z(),
548 TMath::Sqrt(idPerigee2->momentum().x()*idPerigee2->momentum().x()+
549 idPerigee2->momentum().y()*idPerigee2->momentum().y()+
550 idPerigee2->momentum().z()*idPerigee2->momentum().z()+105.7*105.7));
552 CLHEP::HepLorentzVector muonmuon1(measPerigee->
momentum().x(),measPerigee->
momentum().y(),measPerigee->
momentum().z(),
557 CLHEP::HepLorentzVector muonmuon2(measPerigee2->momentum().x(),measPerigee2->momentum().y(),measPerigee2->momentum().z(),
558 TMath::Sqrt(measPerigee2->momentum().x()*measPerigee2->momentum().x()+
559 measPerigee2->momentum().y()*measPerigee2->momentum().y()+
560 measPerigee2->momentum().z()*measPerigee2->momentum().z()+105.7*105.7));
563 if (muonid1.perp() > 1000 && muonid2.perp() > 1000 && muonmuon1.perp() > 1000 && muonmuon2.perp() > 1000) {
564 CLHEP::HepLorentzVector
idvec = muonid1+muonid2;
565 CLHEP::HepLorentzVector muonvec = muonmuon1+muonmuon2;
571 if (
idvec.m() > 2600 &&
idvec.m() < 3600 && muonvec.m() > 0 && muonvec.m() < 6300)
577 if (
idvec.m() > 8000 &&
idvec.m() < 11000 && muonvec.m() > 0 && muonvec.m() < 19000)
584 if (muonid1.perp() > 20000 && muonid2.perp() > 20000 && muonmuon1.perp() > 20000 && muonmuon2.perp() > 20000) {
589 if (
idvec.m() > 50000 &&
idvec.m() < 130000 && muonvec.m() > 50000 && muonvec.m() < 130000)
604 if (idPerigee2) idPerigee2 = NULL;
605 if (measPerigee2) measPerigee2 = NULL;
612 << idPerigee->parameters()[
Trk::phi0] <<
" "
615 << idPerigee->parameters()[
Trk::d0] <<
" "
616 << measPerigee->parameters()[
Trk::d0]
618 << idPerigee->parameters()[
Trk::z0] <<
" "
619 << measPerigee->parameters()[
Trk::z0]
624 << idPerigee->momentum().perp() <<
" "
686 if (measPerigee) measPerigee = NULL;
687 if (idPerigee) idPerigee = NULL;
691 std::vector<const xAOD::Muon* >::const_iterator MSMuonsItrE = MSMuons.end();
692 std::vector<const xAOD::Muon* >::const_iterator IDMuonsItrE = IDMuons.end();
695 for ( MSMuonsItr = MSMuons.begin(); MSMuonsItr != MSMuonsItrE; ++MSMuonsItr)
701 float muon_phi = (*MSMuonsItr)->phi();
705 ATH_MSG_DEBUG(
"Could not retrieve number of (RPC) Phi layers with a trigger phi hit" );
707 ATH_MSG_DEBUG(
"Could not retrieve number of MDT layers with at least 3 hits" );
709 for (IDMuonsItr = IDMuons.begin(); IDMuonsItr != IDMuonsItrE; ++IDMuonsItr)
712 float muon_ID_phi = (*IDMuonsItr)->phi();
713 float delta_phi = fabs(muon_phi - muon_ID_phi);
715 float delta_phi2 = fabs(2*TMath::Pi() -
delta_phi);
728 if (( RPCphiLayers > 2 ) && ( MDTLayers >= 3 ))
733 for (IDMuonsItr = IDMuons.begin(); IDMuonsItr != IDMuonsItrE; ++IDMuonsItr)
739 float muon_ID_eta = (*IDMuonsItr)->eta();
747 for ( MSMuonsItr = MSMuons.begin(); MSMuonsItr != MSMuonsItrE; ++MSMuonsItr)
750 float muon_eta = (*MSMuonsItr)->eta();
751 float delta_eta = fabs(muon_eta - muon_ID_eta);
753 if (( delta_eta < delta ) && (delta_eta <= 0.2))
763 if ((SCThits > 7) && (TRThits >= 10))
767 return StatusCode::SUCCESS;
781 return StatusCode::SUCCESS;
790 return StatusCode::SUCCESS;