|
ATLAS Offline Software
|
Go to the documentation of this file.
12 #include "TLorentzVector.h"
22 #include "GaudiKernel/IInterface.h"
48 ISvcLocator* pSvcLocator):
54 m_trackToVertexTool(
"Reco::TrackToVertex"),
55 m_triggerDecision(
"Trig::TrigDecisionTool/TrigDecisionTool"),
56 m_triggerMatching(
"Trig::MatchingTool/MatchingTool"),
57 m_selTool(
"InDet::InDetTrackSelectionTool/TrackSelectionTool"),
58 m_trackToVertexIPEstimator(
"Trk::TrackToVertexIPEstimator"),
59 m_extrapolator(
"Trk::Extrapolator/AtlasExtrapolator"),
60 m_muonSelector(
"CP::MuonSelectionTool/MuonSelectionTool"),
61 m_validationMode(true),
63 m_commonTreeName (
"commonTree"),
64 m_defaultTreeName(
"Default_Particle"),
65 m_IDTreeName (
"ID_InDetTrackParticle"),
66 m_refit1TreeName (
"Refit1_SiAndTRT"),
67 m_refit2TreeName (
"Refit2_SiOnly"),
68 m_truthTreeName (
"TruthParams"),
69 m_combTreeName (
"CombinedTrackParticle"),
70 m_MSTreeName (
"MS_TrackParticle"),
71 m_FourMuTreeName (
"FourMu"),
73 m_ValidationTreeDescription(
"Small Tree for Zmumu fits"),
75 m_commonTreeFolder (
"/ZmumuValidation/common"),
76 m_defaultTreeFolder(
"/ZmumuValidation/default"),
77 m_IDTreeFolder (
"/ZmumuValidation/ID"),
78 m_refit1TreeFolder (
"/ZmumuValidation/refit1"),
79 m_refit2TreeFolder (
"/ZmumuValidation/refit2"),
80 m_truthTreeFolder (
"/ZmumuValidation/truth"),
81 m_combTreeFolder (
"/ZmumuValidation/comb"),
82 m_MSTreeFolder (
"/ZmumuValidation/ms"),
83 m_FourMuTreeFolder (
"/ZmumuValidation/fourmu"),
85 m_commonTree (nullptr),
86 m_defaultTree(nullptr),
88 m_refit1Tree(nullptr),
89 m_refit2Tree(nullptr),
93 m_FourMuTree(nullptr),
96 m_Trk2VtxAssociationTool(
"CP::TrackVertexAssociationTool", this)
174 ISvcLocator* pxServiceLocator = serviceLocator();
175 if ( pxServiceLocator !=
nullptr ) {
177 if ( xSC == StatusCode::FAILURE ) {
179 return StatusCode::FAILURE;
182 ATH_MSG_DEBUG(
"PerfMonServices::InitialiseServices( pxServiceLocator ); SUCCESS ");
193 return StatusCode::FAILURE;
202 return StatusCode::FAILURE;
210 return StatusCode::FAILURE;
221 return StatusCode::FAILURE;
244 ATH_MSG_INFO(
" -- IDPerfMonZmumu::initialize() -- init m_beamSpotKey ");
282 return StatusCode::FAILURE;
290 return StatusCode::FAILURE;
298 return StatusCode::FAILURE;
305 ATH_MSG_DEBUG(
"** IDPerfMonZmumu::Initialize ** Completed **");
306 return StatusCode::SUCCESS;
314 m_h_cutflow =
new TH1F(
"h_cutflow",
"cut flow histogram",11, -0.5, 9.5);
432 bool isTreeNone =
false;
433 if (
m_IDTreeName.find(
"none") != std::string::npos) isTreeNone =
true;
607 if (
m_combTreeName.find(
"none") != std::string::npos) isTreeNone =
true;
663 if (
m_MSTreeName.find(
"none") != std::string::npos) isTreeNone =
true;
665 ATH_MSG_INFO(
"initialize() ** defining IDPerfMon MSTree ");
828 ATH_MSG_INFO(
"initialize() Going to register the mu+mu- trees");
829 ITHistSvc* tHistSvc =
nullptr;
830 if (service(
"THistSvc",tHistSvc).isFailure()){
831 ATH_MSG_ERROR(
"initialize() Could not find Hist Service -> Switching ValidationMode Off !");
837 ATH_MSG_INFO(
"initialize() commonTree succesfully registered!");
840 ATH_MSG_ERROR(
"initialize() Could not register the validation commonTree -> Switching ValidationMode Off !");
848 ATH_MSG_INFO(
"initialize() IDTree succesfully registered!");
851 ATH_MSG_ERROR(
"initialize() Could not register the validation IDTree -> Switching ValidationMode Off !");
864 ATH_MSG_INFO(
"initialize() CBTree succesfully registered!");
867 ATH_MSG_ERROR(
"initialize() Could not register the validation CBTree -> Switching ValidationMode Off !");
881 ATH_MSG_INFO(
"initialize() MSTree succesfully registered!");
884 ATH_MSG_ERROR(
"initialize() Could not register the validation MSTree -> Switching ValidationMode Off !");
894 ATH_MSG_INFO(
"initialize() Refit1 Tree succesfully registered!");
897 ATH_MSG_ERROR(
"initialize() Could not register the validation Tree -> Switching ValidationMode Off !");
905 ATH_MSG_INFO(
"initialize() Refit2 Tree succesfully registered!");
908 ATH_MSG_ERROR(
"initialize() Could not register the validation Tree -> Switching ValidationMode Off !");
917 ATH_MSG_INFO(
"initialize() truthTree Tree succesfully registered!");
920 ATH_MSG_ERROR(
"initialize() Could not register the validation truth Tree -> Switching ValidationMode Off !");
928 ATH_MSG_INFO(
"initialize() FourMu Tree succesfully registered!");
931 ATH_MSG_ERROR(
"initialize() Could not register the validation FourMu Tree -> Switching ValidationMode Off !");
937 return StatusCode::SUCCESS;
962 ATH_MSG_DEBUG(
" IDPerfMonZmumu::execute evtStore->retrieve (eventInfo) failed .. trying another strategy.. ");
973 ATH_MSG_ERROR(
"** IDPerfMonZmumu::execute ** Could not retrieve event info.");
979 ATH_MSG_DEBUG(
" ** IDPerfMonZmumu::execute ** calling FourLeptonAnalysis()...");
981 if (fourLeptAnaStatus.isSuccess())
ATH_MSG_INFO (
" ** IDPerfMonZmumu::execute ** RunFourLeptonAnalysis() SUCCESS -> found a new event");
987 ATH_MSG_DEBUG(
" ** IDPerfMonZmumu::execute ** calling dimuon analysis m_xZmm.Reco()...");
998 <<
" Failed dimuon reconstruction. m_xZmm.Reco() returned FALSE ");
999 return StatusCode::SUCCESS;
1008 if (isTriggerPassed == StatusCode::SUCCESS) {
1012 ATH_MSG_DEBUG(
"Trigger Failed -> reject event --> leave event");
1013 return StatusCode::SUCCESS;
1025 StatusCode success_pos = StatusCode::FAILURE;
1026 StatusCode success_neg = StatusCode::FAILURE;
1028 if (muon_pos && muon_neg) {
1032 ATH_MSG_INFO(
"** IDPerfMonZmumu::execute ** Retrieving InnerDetectorTrackParticles of the accepted muons");
1033 ppos_comb = muon_pos->
trackParticle(xAOD::Muon::InnerDetectorTrackParticle);
1034 pneg_comb = muon_neg->
trackParticle(xAOD::Muon::InnerDetectorTrackParticle);
1036 if (!ppos_comb || !pneg_comb) {
1037 ATH_MSG_WARNING(
"** IDPerfMonZmumu::execute ** InnerDetectorTrackParticles are requested but they are not present. Exiting event.");
1038 return StatusCode::SUCCESS;
1043 ATH_MSG_DEBUG(
"** IDPerfMonZmumu::execute ** Retrieving CombinedTrackParticles of the accepted muons");
1044 ppos_comb = muon_pos->
trackParticle(xAOD::Muon::CombinedTrackParticle);
1045 pneg_comb = muon_neg->
trackParticle(xAOD::Muon::CombinedTrackParticle);
1047 if (!ppos_comb || !pneg_comb){
1048 ATH_MSG_WARNING(
"** IDPerfMonZmumu::execute ** CombinedTrackParticles are requested but they are not present. Exiting event.");
1049 return StatusCode::SUCCESS;
1055 if (ppos_comb && pneg_comb) {
1064 const EventContext& ctx = Gaudi::Hive::currentContext();
1066 for (
const auto V : *vertices) {
1076 if (!ppos_comb_v || !pneg_comb_v){
1077 ATH_MSG_WARNING(
"Some or all of the requested particles have no vertex. Exiting event");
1078 return StatusCode::SUCCESS;
1082 ATH_MSG_WARNING(
"** IDPerfMonZmumu::execute ** Could not find CombinedMuon pos/neg in event"
1086 return StatusCode::SUCCESS;
1097 <<
" Invariant mass = " <<
m_xZmm.
GetInvMass() <<
" GeV ** some preliminaries are due though...");
1102 ATH_MSG_DEBUG(
"Exiting because the ID segment of muon_pos do not pass the TrackSelection");
1103 return StatusCode::SUCCESS;
1106 ATH_MSG_DEBUG(
"Exiting because the ID segment of muon_neg do not pass the TrackSelection");
1107 return StatusCode::SUCCESS;
1109 ATH_MSG_DEBUG(
"** IDPerfMonZmumu::execute ** Good news ** pos and neg muon->trackParticle(xAOD::Muon::InnerDetectorTrackParticle) pass the trackSelection :)");
1112 ATH_MSG_DEBUG(
"** IDPerfMonZmumu::execute ** Track selection is not in use ");
1124 muon_pos->
trackParticle(xAOD::Muon::InnerDetectorTrackParticle),
1128 muon_neg->
trackParticle(xAOD::Muon::InnerDetectorTrackParticle),
1132 if (success_pos && success_neg) {
1147 <<
" pt: " << muon_pos->
trackParticle(xAOD::Muon::InnerDetectorTrackParticle)->
pt()
1155 <<
" pt: " << muon_neg->
trackParticle(xAOD::Muon::InnerDetectorTrackParticle)->
pt()
1187 ATH_MSG_DEBUG(
"** IDPerfMonZmumu::execute ** not filling IDTracks in combTree due to problems with muon_xxx->trackParticle(xAOD::Muon::InnerDetectorTrackParticle)");
1195 muon_pos->
trackParticle(xAOD::Muon::InnerDetectorTrackParticle),
1200 muon_neg->
trackParticle(xAOD::Muon::InnerDetectorTrackParticle),
1205 if (success_pos && success_neg) {
1260 muon_pos->
trackParticle(xAOD::Muon::InnerDetectorTrackParticle),
1265 muon_neg->
trackParticle(xAOD::Muon::InnerDetectorTrackParticle),
1268 if (success_pos && success_neg) {
1301 ATH_MSG_DEBUG(
"** IDPerfMonZmumu::execute ** Going to build TrackCollections: muonTrks, muonTrksRefit1 and muonTrksRefit2");
1306 ATH_MSG_DEBUG(
"** IDPerfMonZmumu::execute ** Going to refit and store the track parameters ");
1316 const EventContext& ctx = Gaudi::Hive::currentContext();
1317 if( ppos_comb->
track() ) {
1322 if (fitStatus.isFailure()) {
1323 ATH_MSG_DEBUG(
"** IDPerfMonZmumu::execute ** Track Refit1 Failed for ppos_comb->track(). Skipping Event");
1324 return StatusCode::SUCCESS;
1326 refit1MuonTrk1 = fitResult.refittedTrack.release();
1327 muonTrksRefit1->
push_back(refit1MuonTrk1);
1328 ATH_MSG_DEBUG(
"** IDPerfMonZmumu::execute ** Track Refit1 Success of ppos_comb->track()."
1330 <<
" track refit pt: " << refit1MuonTrk1->perigeeParameters()->pT() );
1335 if (fitStatus.isFailure()) {
1336 ATH_MSG_DEBUG(
"** IDPerfMonZmumu::execute ** Track Refit2 Failed for ppos_comb->track(). Skipping Event");
1337 return StatusCode::SUCCESS;
1339 refit2MuonTrk1 = fitResult.refittedTrack.release();
1340 muonTrksRefit2->
push_back(refit2MuonTrk1);
1341 ATH_MSG_DEBUG(
"** IDPerfMonZmumu::execute ** Track Refit2 Success of ppos_comb->track()."
1343 <<
" track refit pt: " << refit1MuonTrk1->perigeeParameters()->pT() );
1347 if( pneg_comb->
track() ) {
1352 if (fitStatus.isFailure()) {
1353 ATH_MSG_DEBUG(
"** IDPerfMonZmumu::execute ** Track Refit1 Failed. Skipping Event");
1354 return StatusCode::SUCCESS;
1356 refit1MuonTrk2 = fitResult.refittedTrack.release();
1357 muonTrksRefit1->
push_back(refit1MuonTrk2);
1358 ATH_MSG_DEBUG(
"** IDPerfMonZmumu::execute ** Track Refit1 Success of pneg_comb->track()."
1360 <<
" track refit pt: " << refit1MuonTrk2->perigeeParameters()->pT() );
1365 if (fitStatus.isFailure()) {
1367 return StatusCode::SUCCESS;
1369 refit2MuonTrk2 = fitResult.refittedTrack.release();
1370 muonTrksRefit2->
push_back(refit2MuonTrk2);
1371 ATH_MSG_DEBUG(
"** IDPerfMonZmumu::execute ** Track Refit2 Success of pneg_comb->track()."
1373 <<
" track refit pt: " << refit2MuonTrk2->perigeeParameters()->pT() );
1376 if (muonTrksRefit1->
size() != 2)
ATH_MSG_WARNING(
"** IDPerfMonZmumu::execute ** WARNING ** size of muonTrksRefit1: " << muonTrksRefit1->
size());
1377 if (muonTrksRefit2->
size() != 2)
ATH_MSG_WARNING(
"** IDPerfMonZmumu::execute ** WARNING ** size of muonTrksRefit2: " << muonTrksRefit2->
size());
1385 if (
sc.isSuccess()) {
1392 if (muonTrksRefit1->
size() > 1) {
1394 if (
sc.isSuccess()) {
1401 if (muonTrksRefit2->
size() > 1) {
1403 if (
sc.isSuccess()) {
1412 if (muonTrksRefit1->
size()<2) {
1413 ATH_MSG_WARNING(
"** IDPerfMonZmumu::execute ** Refit1 muon tracks are missing!");
1416 ATH_MSG_DEBUG(
"** IDPerfMonZmumu::execute ** going to fill refit1tree ");
1421 if (success_pos && success_neg) {
1467 if (muonTrksRefit2->
size()<2) {
1468 ATH_MSG_WARNING(
"** IDPerfMonZmumu::execute ** Refit2 muon tracks are missing!");
1476 if (success_pos && success_neg) {
1529 return StatusCode::SUCCESS;
1536 bool truthStatusIsGood =
true;
1538 truthStatusIsGood =
false;
1542 truthStatusIsGood =
false;
1545 if (truthStatusIsGood) {
1592 bool dofill =
false;
1628 for (
auto muon : *muons) {
1653 if (scid.isSuccess()) {
1664 return StatusCode::SUCCESS;
1675 return StatusCode::FAILURE;
1679 return StatusCode::FAILURE;
1696 double sigma_pt = 0;
1698 double sigma_qOverP = 1.;
1701 px = trackp->
p4().Px();
1702 py = trackp->
p4().Py();
1703 pt = trackp->
p4().Pt();
1704 pz = trackp->
p4().Pz();
1705 phi= trackp->
p4().Phi();
1706 eta= trackp->
p4().Eta();
1709 qoverp = trackp->
qOverP();
1718 double sigma_pt_term1 = (
sin(trackp->
theta()) /
pow(qoverp,2)) * sigma_qOverP;
1719 double sigma_pt_term2 = (1./qoverp) *
cos(trackp->
theta()) * sigma_theta;
1720 double sigma_pt_term3 = (
cos(trackp->
theta()) /
pow(qoverp,2)) * sigma_theta * sigma_qOverP;
1726 return StatusCode::FAILURE;
1729 ATH_MSG_WARNING(
"in FillRecParametersTP. WARNING: m_trackToVertexIPEstimator is NULL");
1730 return StatusCode::FAILURE;
1734 std::unique_ptr<Trk::ImpactParametersAndSigma> iPandSigma(
nullptr);
1741 ATH_MSG_DEBUG(
"return from the trackToVertexIPEstimator->estimate()");
1744 ATH_MSG_WARNING (
"FillRecParametersTP::trackToVertexIPEstimator failed !");
1745 return StatusCode::FAILURE;
1748 ATH_MSG_DEBUG(
"FillRecParametersTP::trackToVertexIPEstimator success !");
1749 PVd0 = iPandSigma->
IPd0;
1752 PVz0 = iPandSigma->
IPz0;
1779 <<
" d0: "<<
m_positive_d0 <<
" d0res : "<< d0res <<
" PVd0res : "<< PVd0res <<
" z0: "<<
m_positive_z0 <<
" z0res : " << z0res <<
" PVz0res : "<< PVz0res );
1781 }
else if (
charge == -1) {
1801 ATH_MSG_DEBUG(
"(Filled charge == -1 ) (reco)-> px : "<<
px <<
" py: "<<
py <<
" pt: " <<
pt <<
" pz: "<<
pz
1802 <<
" d0: "<<
m_negative_d0 <<
" d0res : "<< d0res <<
" PVd0res : "<< PVd0res <<
" z0: "<<
m_negative_z0 <<
" z0res : " << z0res <<
" PVz0res : "<< PVz0res );
1805 return StatusCode::SUCCESS;
1813 ATH_MSG_DEBUG(
"* FillRecParameters * Empty Track: track. Skipping.");
1814 return StatusCode::FAILURE;
1818 ATH_MSG_DEBUG(
"* FillRecParameters * Empty Track: trackp_for_unbias. Skipping.");
1819 return StatusCode::FAILURE;
1835 double d0_err = 999.;
1836 double z0_err = 999.;
1844 if (trkPerigee !=
nullptr){
1847 px = trkPerigee->momentum().x();
1848 py = trkPerigee->momentum().y();
1849 pt = std::abs(trkPerigee->pT());
1850 pz = trkPerigee->momentum().z();
1852 eta= trkPerigee->eta();
1870 px = atBL->momentum().x();
1871 py = atBL->momentum().y();
1872 pt = std::abs(atBL->pT());
1873 pz = atBL->momentum().z();
1874 eta= trkPerigee->eta();
1884 ATH_MSG_WARNING(
"FillRecParameters::Failed extrapolation to the BeamLine");
1888 TLorentzVector vtrack = TLorentzVector (trkPerigee->momentum().x(),
1889 trkPerigee->momentum().y(),
1890 trkPerigee->momentum().z(),
1891 trkPerigee->momentum().mag());
1892 float trkd0 = trkPerigee->parameters()[
Trk::d0];
1893 float trkz0 = trkPerigee->parameters()[
Trk::z0];
1894 float bsX = position.x();
1895 float bsY = position.y();
1896 float bsZ = position.z();
1897 float btiltX = beamSpotHandleRec->beamTilt(0);
1898 float btiltY = beamSpotHandleRec->beamTilt(1);
1900 float beamX = bsX +
std::tan(btiltX) * (trkz0-bsZ);
1901 float beamY = bsY +
std::tan(btiltY) * (trkz0-bsZ);
1902 float beamD0 = ( -
std::sin(vtrack.Phi())*beamX +
std::cos(vtrack.Phi())*beamY );
1903 float d0bscorr = trkd0 - beamD0;
1904 float z0bscorr = trkz0 - bsZ;
1907 std::unique_ptr<Trk::ImpactParametersAndSigma> iPandSigma(
nullptr);
1910 if( iPandSigma==0 ){
1911 ATH_MSG_WARNING (
"FillRecParameters::trackToVertexIPEstimator failed !");
1912 return StatusCode::FAILURE;
1915 ATH_MSG_DEBUG(
"FillRecParameters::trackToVertexIPEstimator success !");
1916 PVd0 = iPandSigma->
IPd0;
1919 PVz0 = iPandSigma->
IPz0;
1924 ATH_MSG_INFO(
" FillRecParameters::trackToVertexIPEstimator vertex does exist ");
1953 ATH_MSG_DEBUG(
"(Filled charge == 1 ) (reco)-> px : "<<
px <<
" py: "<<
py <<
" pz: "<<
pz <<
" d0: "<<
d0<<
" z0: "<<
z0);
1974 ATH_MSG_DEBUG(
"(Filled charge == -1 ) (reco)-> px : "<<
px <<
" py: "<<
py <<
" pz: "<<
pz <<
" d0: "<<
d0<<
" z0: "<<
z0 );
1977 return StatusCode::SUCCESS;
1983 ATH_MSG_DEBUG(
"* FillRecParametersSimple * Empty Track: track. Skipping.");
1984 return StatusCode::FAILURE;
1988 if (not trkPerigee) {
1989 ATH_MSG_ERROR(
"trkPerigee pointer is null in IDPerfMonZmumu::FillRecParametersSimple");
1990 return StatusCode::FAILURE;
2001 double d0_err = 999.;
2002 double z0_err = 999.;
2007 px = trkPerigee->momentum().x();
2008 py = trkPerigee->momentum().y();
2009 pt = std::abs(trkPerigee->pT());
2010 pz = trkPerigee->momentum().z();
2012 eta= trkPerigee->eta();
2021 TLorentzVector vtrack = TLorentzVector (trkPerigee->momentum().x(),
2022 trkPerigee->momentum().y(),
2023 trkPerigee->momentum().z(),
2024 trkPerigee->momentum().mag());
2025 float trkd0 = trkPerigee->parameters()[
Trk::d0];
2026 float trkz0 = trkPerigee->parameters()[
Trk::z0];
2027 float bsX = position.x();
2028 float bsY = position.y();
2029 float bsZ = position.z();
2033 float beamX = bsX +
std::tan(btiltX) * (trkz0-bsZ);
2034 float beamY = bsY +
std::tan(btiltY) * (trkz0-bsZ);
2035 float beamD0 = ( -
std::sin(vtrack.Phi())*beamX +
std::cos(vtrack.Phi())*beamY );
2036 float d0bscorr = trkd0 - beamD0;
2037 float z0bscorr = trkz0 - bsZ -
vertex->z();
2070 return StatusCode::SUCCESS;
2077 if (!trackParticle ){
2078 ATH_MSG_WARNING(
"-- FillTruthParameters -- Empty Trackparticle. Skipping.");
2079 return StatusCode::FAILURE;
2084 std::numeric_limits<float>::quiet_NaN());
2085 ATH_MSG_DEBUG(
" -- FillTruthParameters -- TruthMatchProbablity of trackpartile : > " <<
result);
2091 ATH_MSG_DEBUG(
" -- FillTruthParameters -- Failure while retrieving the truth particle. Returning FAILURE.");
2092 return StatusCode::FAILURE;
2098 ATH_MSG_DEBUG(
" -- FillTruthParameters -- reco muon associated to a truth neutral!! Returning FAILURE.");
2099 return StatusCode::FAILURE;
2102 ATH_MSG_DEBUG(
" -- FillTruthParameters -- reco muon associated to a non true muon!! Returning FAILURE.");
2103 return StatusCode::FAILURE;
2110 ATH_MSG_DEBUG(
"A production vertex pointer was retrieved, but it is NULL");
2111 return StatusCode::FAILURE;
2115 if (
particle->parent(0) !=
nullptr) {
2121 <<
" nparents " <<
particle->nParents()
2122 <<
" parent->pdg: " <<
particle->parent(0)->pdgId()
2123 <<
" truthType: " << truthTypeAcc(*
particle)
2124 <<
" truthOrigin: " << truthOriginAcc(*
particle)
2131 <<
" nparents " <<
particle->nParents()
2132 <<
" parent->pdg: " <<
particle->parent(0)->pdgId()
2133 <<
" truthType & truthOrigin: " <<
" NOT AVAILABLE "
2138 const auto xPos=ptruthVertex->
x();
2139 const auto yPos=ptruthVertex->
y();
2140 const auto z_truth=ptruthVertex->
z();
2148 const EventContext& ctx = Gaudi::Hive::currentContext();
2169 ATH_MSG_DEBUG(
"reco IPs (pos): > d0 : "<<d0recoPos <<
" z0: " << z0recoPos <<
" trackp z0 : " << trackParticle->
z0() <<
" trackp d0 : " << trackParticle->
d0());
2170 ATH_MSG_DEBUG(
"reco IPs (neg): > d0 : "<<d0recoNeg <<
" z0: " << z0recoNeg <<
" trackp z0 : " << trackParticle->
z0() <<
" trackp d0 : " << trackParticle->
d0() );
2172 double qOverP_truth = 0.;
2211 bool parentfound =
false;
2213 if (
particle->parent(0) !=
nullptr) {
2228 }
else if (
charge == -1) {
2243 bool parentfound =
false;
2245 if (
particle->parent(0) !=
nullptr) {
2260 return StatusCode::SUCCESS;
2271 if( !
acc.isAvailable(
p ) ) {
2275 const Link_t& link =
acc(
p );
2277 if( ! link.isValid() ) {
2288 return StatusCode::SUCCESS;
2299 return StatusCode::FAILURE;
2305 float thisEventTriggerPrescale = 999999.9;
2306 float thisHLTTriggerPrescale = 999999.9;
2307 bool thisHLTIsPassed =
false;
2308 std::string thisHLTTriggerName;
2309 std::string thisEventTriggerName;
2312 const std::vector<std::string> myHLTtriglist =
m_triggerDecision->getChainGroup(
"HLT_mu.*, HLT_2mu.*")->getListOfTriggers();
2313 for (
int i=0;
i < (
int) myHLTtriglist.size();
i++) {
2315 ATH_MSG_DEBUG(
"HLT trigger = " <<
i <<
" out of " << myHLTtriglist.size() <<
" --> " << myHLTtriglist.at(
i) <<
" isPassed? " <<
m_triggerDecision->isPassed(myHLTtriglist.at(
i)) <<
" prescale: " <<
m_triggerDecision->getChainGroup(myHLTtriglist.at(
i))->getPrescale() );
2318 thisHLTIsPassed =
true;
2319 float thisprescale =
m_triggerDecision->getChainGroup(myHLTtriglist.at(
i))->getPrescale();
2320 if (thisprescale < thisHLTTriggerPrescale) {
2321 thisHLTTriggerPrescale = thisprescale;
2322 thisHLTTriggerName = myHLTtriglist.at(
i);
2326 if (thisHLTTriggerPrescale < 1) thisHLTTriggerPrescale = 1;
2327 ATH_MSG_DEBUG(
"Event HLT trigger prescale = " << thisHLTTriggerPrescale);
2330 if (thisHLTIsPassed) {
2335 return StatusCode::FAILURE;
2339 thisEventTriggerPrescale = thisHLTTriggerPrescale;
2340 thisEventTriggerName = thisHLTTriggerName;
2341 ATH_MSG_DEBUG(
"Event trigger prescale = " << thisEventTriggerPrescale);
2342 ATH_MSG_DEBUG(
"Event trigger name = " << thisEventTriggerName);
2347 return StatusCode::SUCCESS;
2361 for (
int ivtx=0; ivtx< (
int) vxContainer->
size();ivtx++) {
2362 myVtx = (*vxContainer)[ivtx];
2555 if( electronTruth) {
2556 ATH_MSG_DEBUG (
"retrieving electron Truth container with key: \"egammaTruthParticles\" SUCCESS ");
2558 if( electronTruth->hasStore() ) {
2560 auto tr_itr = electronTruth->
begin();
2561 auto tr_end = electronTruth->
end();
2562 int electronCount = 0;
2563 for(
int i = 0; tr_itr != tr_end; ++tr_itr, ++
i ) {
2564 ATH_MSG_DEBUG(
"Truth : Investigating truth electron #" <<
i <<
" pdgID= " << ( *tr_itr )->pdgId());
2565 if (fabs(( *tr_itr )->pdgId()) == 11) {
2566 if (( *tr_itr )->pt() > 10000 && fabs(( *tr_itr )->eta()) < 2.47) {
2567 ATH_MSG_INFO(
" central electron found --> pt: " << ( *tr_itr )->charge()*( *tr_itr )->pt() <<
" eta " <<( *tr_itr )->eta() );
2572 ATH_MSG_INFO(
"#central electrons: " << electronCount );
2575 ATH_MSG_WARNING (
"electronTruth container has no Store !!! FAILURE");
2579 ATH_MSG_WARNING (
"retrieve electron Truth container with key: \"egammaTruthParticles\" FAILURE");
2583 if (
m_doDebug) std::cout <<
" ** RunFourLeptonAnalysis ** calling m_4mu.Reco() .... " << std::endl;
2587 if(statusOf4LeptReco) {
2588 thisStatus = StatusCode::SUCCESS;
2593 thisStatus = StatusCode::FAILURE;
2594 ATH_MSG_DEBUG (
"4-lepton reconstruction FAILURE. m_4mu.Reco() returned FALSE --> event failed selection");
2595 if (
m_doDebug) std::cout <<
" ** RunFourLeptonAnalysis ** 4-lepton reconstruction FAILURE. m_4mu.Reco() returned FALSE --> event failed selection" << std::endl;
2598 if(statusOf4LeptReco) {
2706 std::string metName =
"MET_Reference_AntiKt4LCTopo";
2707 std::string metRefFinalName =
"FinalClus";
2714 ATH_MSG_WARNING (
"No Collection with name " << metName <<
" found in StoreGate");
2719 if (
sc.isFailure()) {
2720 ATH_MSG_DEBUG (
"Could not retrieve Collection " << metName <<
" from StoreGate");
2725 if (final_met)
met = (*final_met)[metRefFinalName];
2737 <<
" Invariant mass = " <<
m_4mu_minv <<
" GeV ");
2738 if (muon1_pos !=
nullptr)
ATH_MSG_DEBUG(
"mu1+ --> pxyz " << muon1_pos->
p4().Px()
2739 <<
", " << muon1_pos->
p4().Py()
2740 <<
", " << muon1_pos->
p4().Pz()
2741 <<
" pt: " << muon1_pos->
pt()
2742 <<
" d0: " << muon1_pos->
d0()
2743 <<
" z0: " << muon1_pos->
z0()
2746 if (muon1_neg !=
nullptr)
ATH_MSG_DEBUG(
"mu1- --> pxyz " << muon1_neg->
p4().Px()
2747 <<
", " << muon1_neg->
p4().Py()
2748 <<
", " << muon1_neg->
p4().Pz()
2749 <<
" pt: " << muon1_neg->
pt()
2750 <<
" d0: " << muon1_neg->
d0()
2751 <<
" z0: " << muon1_neg->
z0()
2754 if (elec1_pos !=
nullptr)
ATH_MSG_DEBUG(
"el1+ --> pxyz " << elec1_pos->
p4().Px()
2755 <<
", " << elec1_pos->
p4().Py()
2756 <<
", " << elec1_pos->
p4().Pz()
2757 <<
" pt: " << elec1_pos->
pt()
2758 <<
" d0: " << elec1_pos->
d0()
2759 <<
" z0: " << elec1_pos->
z0()
2780 int nBLhits, nhitsPIX, nhitsSCT, nhitsTRT, nContribPixLayers;
2781 int nPIXholes, nSCTholes;
2782 if (IDTrkMuPos && IDTrkMuNeg) {
2800 <<
" nBLhits: " << nBLhits
2801 <<
" nhitsPIX: " << nhitsPIX
2802 <<
" nPIXLayers: " << nContribPixLayers
2803 <<
" nhitsSCT: " << nhitsSCT
2804 <<
" Silicon holes: " << nPIXholes + nSCTholes
2805 <<
" nhitsTRT: " << nhitsTRT);
2821 <<
" nBLhits: " << nBLhits
2822 <<
" nhitsPIX: " << nhitsPIX
2823 <<
" nPIXLayers: " << nContribPixLayers
2824 <<
" nhitsSCT: " << nhitsSCT
2825 <<
" Silicon holes: " << nPIXholes + nSCTholes
2826 <<
" nhitsTRT: " << nhitsTRT);
double m_positive_sigma_qoverp
double m_negative_d0_manualBS
std::vector< float > m_IDTrack_sigma_z0
ToolHandle< InDet::IInDetTrackSelectionTool > m_selTool
The track selection Tool.
virtual double pt() const override final
The transverse momentum ( ) of the particle.
@ numberOfPixelHoles
number of pixel layers on track with absence of hits [unit8_t].
double m_el_positive1_z0_err
std::string m_IDTreeFolder
std::string m_defaultTreeName
std::string m_combTreeName
std::vector< int > m_nSCThits
std::vector< float > m_Refit1_qoverp
constexpr ParticleHypothesis particle[PARTICLEHYPOTHESES]
the array of masses
ToolHandle< Reco::ITrackToVertex > m_trackToVertexTool
tool to extrapolate tracks to BL
std::vector< int > m_nBLhits
ToolHandle< Trig::IMatchingTool > m_triggerMatching
std::string m_truthTreeFolder
std::vector< float > m_Refit1_phi
std::string m_truthLinkVecName
TrackParticle input name.
ToolHandle< CP::ITrackVertexAssociationTool > m_Trk2VtxAssociationTool
const xAOD::TrackParticle * getELTrack(unsigned int uPart)
std::vector< int > m_nPIXhits
Scalar phi() const
phi method
uint64_t eventNumber() const
The current event's event number.
float beamTiltXZ() const
The beam's tilt in radians in XZ.
const TrackParticle * trackParticle(TrackParticleType type) const
Returns a pointer (which can be NULL) to the TrackParticle used in identification of this muon.
std::vector< float > m_Refit1_sigma_pt
void SetZ0GapCut(double newvalue)
std::vector< float > m_Truth_d0
std::vector< float > m_CBTrack_d0
float charge() const
Returns the charge.
void SetMuonSelectionTool(ToolHandle< CP::IMuonSelectionTool > mst)
std::vector< float > m_Refit2_z0
Scalar eta() const
pseudorapidity method
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T > &t)
ToolHandle< IegammaTrkRefitterTool > m_TrackRefitter2
The track refitter.
std::vector< float > m_CBTrack_phi
Dummy class used to allow special convertors to be called for surfaces owned by a detector element.
std::vector< float > m_Truth_qoverp
SG::ReadHandleKey< xAOD::EventInfo > m_EventInfoKey
bool summaryValue(uint8_t &value, const SummaryType &information) const
Accessor for TrackSummary values.
std::string m_FourMuTreeName
std::vector< float > m_IDTrack_sigma_qoverp
std::vector< float > m_CBTrack_eta
const xAOD::TrackParticle * getMSTrack(unsigned int uPart)
SG::ReadHandleKey< xAOD::TrackParticleContainer > m_trackContainerName
IDTtacks.
float beamTiltYZ() const
The beam's tilt in radians in YZ.
float z0() const
Returns the parameter.
std::vector< float > definingParametersCovMatrixVec() const
Returns the length 6 vector containing the elements of defining parameters covariance matrix.
void SetMassWindowHigh(double newvalue)
StatusCode CheckTriggerStatusAndPrescale()
@ numberOfPixelHits
these are the pixel hits, including the b-layer [unit8_t].
@ numberOfTRTHits
number of TRT hits [unit8_t].
double m_el_positive1_d0_err
std::vector< float > m_CBTrack_sigma_qoverp
std::vector< float > m_CBTrack_pt
Class providing the definition of the 4-vector interface.
unsigned int getNegMuon(ZTYPE eType)
std::vector< float > m_Truth_pt
VxType::VertexType vertexType() const
The type of the vertex.
float beamPosX() const
X coordinate of the beam spot position.
std::string m_refit1TreeFolder
std::vector< float > m_Refit2_eta
double m_LeadingMuonPtCut
@ numberOfBLayerHits
these are the hits in the first pixel layer, i.e.
float y() const
Vertex y displacement.
SG::ReadCondHandleKey< InDet::BeamSpotData > m_beamSpotKey
used for truth parameters
double m_positive_d0_manualBS
float d0() const
Returns the parameter.
uint32_t runNumber() const
The current event's run number.
virtual StatusCode finalize()
double m_positive_z0_manualBS
ToolHandle< IegammaTrkRefitterTool > m_TrackRefitter1
The track refitter.
void SetMaxLumiBlock(int newlumiblock)
std::vector< float > m_Refit1_z0
void doIPSelection(bool doIPsel)
std::vector< float > m_IDTrack_d0
virtual FourMom_t p4() const override final
The full 4-momentum of the particle.
bool m_validationMode
< boolean to switch to validation mode
std::string m_trackParticleName
Track(Particle)TruthCollection input name.
ServiceHandle< StoreGateSvc > & evtStore()
The standard StoreGateSvc (event store) Returns (kind of) a pointer to the StoreGateSvc.
float beamPosY() const
Y coordinate of the beam spot position.
unsigned int getNegMuon(int eType)
const Trk::Perigee & perigeeParameters() const
Returns the Trk::MeasuredPerigee track parameters.
std::string m_ValidationTreeDescription
< validation tree description - second argument in TTree
std::string m_refit2TreeFolder
StatusCode FillTruthParameters(const xAOD::TrackParticle *track)
double m_el_negative1_z0_err
std::vector< float > m_Refit1_sigma_z0
std::vector< float > m_Refit2_qoverp
std::vector< float > m_CBTrack_sigma_pt
unsigned int getPosMuon(int eType)
void RegisterHistograms()
std::vector< float > m_IDTrack_phi
@ OWN_ELEMENTS
this data object owns its elements
DataVector< Trk::Track > TrackCollection
This typedef represents a collection of Trk::Track objects.
double m_positive_2_z0_err
double m_el_positive2_d0_err
std::vector< float > m_CBTrack_sigma_z0
std::string m_combTreeFolder
::StatusCode StatusCode
StatusCode definition for legacy code.
Class describing a truth particle in the MC record.
std::vector< float > m_Refit1_sigma_qoverp
std::vector< float > m_IDTrack_eta
Principal data object for Missing ET.
void SetLeadingMuonPtCut(double newvalue)
std::vector< float > m_IDTrack_z0
std::string m_MuonQualityName
std::vector< float > m_Refit1_eta
std::vector< float > m_IDTrack_sigma_d0
double m_negative_d0_PVerr
std::vector< float > m_IDTrack_sigma_pt
std::vector< float > m_CBTrack_sigma_d0
std::vector< int > m_nTRThits
unsigned int m_lumi_block
std::vector< float > m_Refit1_pt
StatusCode initialize(bool used=true)
If this object is used as a property, then this should be called during the initialize phase.
@ numberOfSCTHoles
number of SCT holes [unit8_t].
std::string m_outputTracksName
std::vector< float > m_Refit2_phi
void doMCPSelection(bool doMCP)
const xAOD::Muon * getCombMuon(unsigned int uPart)
double m_el_negative2_z0_err
uint32_t lumiBlock() const
The current event's luminosity block number.
virtual bool isValid() override final
Can the handle be successfully dereferenced?
std::vector< float > m_Refit2_d0
double m_positive_2_d0_err
StatusCode FillRecParametersSimple(const Trk::Track *track, float charge, const xAOD::Vertex *vertex)
const xAOD::TruthParticle * getTruthParticle(const xAOD::IParticle &p)
StatusCode FillRecParameters(const Trk::Track *track, const xAOD::TrackParticle *trackp_for_unbias, double charge, const xAOD::Vertex *vertex, const EventContext &ctx)
ElementLink implementation for ROOT usage.
void ResetCommonNtupleVectors()
double m_negative_2_d0_err
const Perigee * perigeeParameters() const
return Perigee.
Class describing a truth vertex in the MC record.
Container for xAOD::MissingET_v1 objects.
void doIPSelection(bool doIPsel)
double pT() const
Access method for transverse momentum.
std::vector< float > m_Truth_z0
float beamPosZ() const
Z coordinate of the beam spot position.
float qOverP() const
Returns the parameter.
double m_negative_z0_PVerr
const ParametersCovMatrix_t definingParametersCovMatrix() const
Returns the 5x5 symmetric matrix containing the defining parameters covariance matrix.
void setDebugMode(bool debug)
bool m_useCustomMuonSelector
void SetMuonSelectionTool(ToolHandle< CP::IMuonSelectionTool > mst)
double error(const Amg::MatrixX &mat, int index)
return diagonal error of the matrix caller should ensure the matrix is symmetric and the index is in ...
SG::ReadHandleKey< xAOD::VertexContainer > m_vertexKey
void setDebugMode(bool debug)
void doIsoSelection(bool doIso)
std::vector< float > m_Truth_phi
double charge(const T &p)
std::string m_MSTreeFolder
std::vector< float > m_Refit2_sigma_pt
void setContainer(PerfMonServices::CONTAINERS container)
value_type push_back(value_type pElem)
Add an element to the end of the collection.
StatusCode initialize(bool used=true)
std::vector< float > m_Refit1_sigma_d0
Eigen::Matrix< double, 3, 1 > Vector3D
ToolHandle< CP::IMuonSelectionTool > m_muonSelector
used to pass a custom muon selector
std::string m_sTriggerChainName
ToolHandle< Trk::ITrackToVertexIPEstimator > m_trackToVertexIPEstimator
Needed for IP resolution studies.
std::string m_refit1TreeName
void SetSecondMuonPtCut(double newvalue)
void SetMuonQuality(const std::string &newname)
float x() const
Vertex x displacement.
virtual StatusCode initialize()
const_iterator end() const noexcept
Return a const_iterator pointing past the end of the collection.
std::string m_commonTreeFolder
void SetLeadingMuonPtCut(double newvalue)
const Amg::Vector3D & momentum() const
Access method for the momentum.
double m_positive_d0_PVerr
void SetMinLumiBlock(int newlumiblock)
double m_el_positive2_z0_err
StatusCode FillRecParametersTP(const xAOD::TrackParticle *trackp, const xAOD::TrackParticle *trackp_for_unbias, double charge, const xAOD::Vertex *vertex=nullptr)
void Clear4MuNtupleVariables()
virtual StatusCode execute()
bool m_useTrackSelectionTool
Class describing a Vertex.
#define ATH_MSG_WARNING(x)
double m_el_negative1_d0_err
std::vector< float > m_CBTrack_z0
StatusCode RunFourLeptonAnalysis()
std::string m_triggerName
float z() const
Vertex longitudinal distance along the beam line form the origin.
void SetOpeningAngleCut(double newvalue)
void doMCPSelection(bool doMCP)
double m_negative_sigma_qoverp
int GetVertexElec(unsigned int uPart)
std::vector< float > m_Refit1_d0
@ numberOfContribPixelLayers
number of contributing layers of the pixel detector [unit8_t].
@ numberOfSCTHits
number of hits in SCT [unit8_t].
std::vector< float > m_Truth_eta
std::vector< float > m_Refit2_sigma_qoverp
bool isAvailable(const ELT &e) const
Test to see if this variable exists in the store.
double eta() const
Access method for pseudorapidity - from momentum.
ToolHandle< Trk::IExtrapolator > m_extrapolator
void SetMassWindowLow(double newvalue)
def TH1F(name, title, nxbins, bins_par2, bins_par3=None, path='', **kwargs)
Class describing a TrackParticle.
void ExtractIDHitsInformation(const xAOD::Muon *muon_pos, const xAOD::Muon *muon_neg)
const Trk::Track * track() const
Returns a pointer (which can be NULL) to the Trk::Track which was used to make this TrackParticle.
Helper class to provide constant type-safe access to aux data.
ToolHandle< Trig::TrigDecisionTool > m_triggerDecision
TH1F * m_h_cutflow
link vector to map HepMC onto xAOD truth
void SetSkipMSCheck(bool value)
double m_negative_2_z0_err
double m_positive_z0_PVerr
static StatusCode InitialiseServices(ISvcLocator *pxSvcLocator)
const xAOD::Vertex * GetDiMuonVertex(const xAOD::TrackParticle *, const xAOD::TrackParticle *)
void SetOpeningAngleCut(double newvalue)
void SetMassWindowHigh(double newvalue)
std::vector< float > m_Refit2_pt
std::vector< int > m_Truth_parent
std::vector< float > m_Refit2_sigma_d0
void SetZ0GapCut(double newvalue)
std::string m_commonTreeName
float theta() const
Returns the parameter, which has range 0 to .
size_type size() const noexcept
Returns the number of elements in the collection.
std::string m_truthTreeName
unsigned int getPosMuon(ZTYPE eType)
std::vector< float > m_Refit2_sigma_z0
double m_negative_z0_manualBS
std::vector< float > m_IDTrack_qoverp
std::string m_refit2TreeName
void SetSecondMuonPtCut(double newvalue)
void setContainer(PerfMonServices::CONTAINERS container)
void SetMassWindowLow(double newvalue)
std::vector< float > m_CBTrack_qoverp
IDPerfMonZmumu(const std::string &name, ISvcLocator *pSvcLocator)
needed for IP resolution studies
void doIsoSelection(bool doIso)
const_iterator begin() const noexcept
Return a const_iterator pointing at the beginning of the collection.
std::string m_defaultTreeFolder
const xAOD::TrackParticle * getIDTrack(unsigned int uPart)
std::vector< float > m_IDTrack_pt
float actualInteractionsPerCrossing() const
Average interactions per crossing for the current BCID - for in-time pile-up.
virtual bool Reco(int theLumiBlock=0)
double m_el_negative2_d0_err
double m_negative_sigma_pt
const_reference_type withDefault(const ELT &e, const T &deflt) const
Fetch the variable for one element, as a const reference, with a default.
std::string m_FourMuTreeFolder
Root Validation Tree.
double m_positive_sigma_pt