ATLAS Offline Software
Loading...
Searching...
No Matches
IDPerfMonZmumu.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
3*/
4
5//==================================================================================
6// Include files...
7//==================================================================================
8// This files header
10// Standard headers
11#include "TTree.h"
12#include "TLorentzVector.h"
13
17
20
21// ATLAS headers
22#include "GaudiKernel/IInterface.h"
24
27
30
35
38
43
44//==================================================================================
45// Public Methods
46//==================================================================================
47IDPerfMonZmumu::IDPerfMonZmumu(const std::string& name,
48 ISvcLocator* pSvcLocator):
49 AthAlgorithm(name, pSvcLocator),
50 m_isMC(false),
51 m_doRefit(false),
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),
62
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"),
72
73 m_ValidationTreeDescription("Small Tree for Zmumu fits"),
74
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"),
84
85 m_commonTree (nullptr),
86 m_defaultTree(nullptr),
87 m_IDTree(nullptr),
88 m_refit1Tree(nullptr),
89 m_refit2Tree(nullptr),
90 m_truthTree(nullptr),
91 m_combTree(nullptr),
92 m_MSTree(nullptr),
93 m_FourMuTree(nullptr),
94 m_doRemoval(true),
95 m_doDebug(false),
96 m_Trk2VtxAssociationTool("CP::TrackVertexAssociationTool", this)
97{
98 // Properties that are set from the python scripts.
99
100 declareProperty("UseTrigger" , m_UseTrigger = true);
101 declareProperty("doIsoSelection", m_doIsoSelection = true );
102 declareProperty("doIPSelection", m_doIPSelection = true );
103 declareProperty("doMCPSelection", m_doMCPSelection = true );
104 declareProperty("isMC", m_isMC = false);
105 declareProperty("doRefit", m_doRefit = false);
106 declareProperty("doIPextrToPV", m_doIP = false);
107 declareProperty("Extrapolator", m_extrapolator );
108 declareProperty("MassWindowLow", m_MassWindowLow = 60.0, "Lower cut in mu+mu- invariant mass" );
109 declareProperty("MassWindowHigh", m_MassWindowHigh = 120.0, "Upper cut in mu+mu- invariant mass" );
110 declareProperty("OpeningAngle", m_OpeningAngleCut = 0.2, "Opening angle between the two muons (in radians)");
111 declareProperty("OutputTracksName", m_outputTracksName = "ZmumuTracks");
112 declareProperty("PtLeadingMuon", m_LeadingMuonPtCut = 20., "Pt cut on the leading muon");
113 declareProperty("PtSecondMuon", m_SecondMuonPtCut = 15., "Pt cut on the second muon");
114 declareProperty("ReFitterTool1", m_TrackRefitter1, "ToolHandle for track fitter implementation");
115 declareProperty("ReFitterTool2", m_TrackRefitter2, "ToolHandle for track fitter implementation");
116 declareProperty("TrackToVertexTool", m_trackToVertexTool);
117 declareProperty("TrackTruthName", m_truthName="TrackTruthCollection");
118 declareProperty("TrackParticleName", m_trackParticleName="CombinedTrackParticle");
119 declareProperty("triggerChainName", m_sTriggerChainName);
120 declareProperty("ValidationMode", m_validationMode);
121 declareProperty("xAODTruthLinkVector", m_truthLinkVecName="xAODTruthLinks");
122 declareProperty("Z0Gap", m_Z0GapCut = 5.0, "maximum gap between the z0 of both muons (in mm)");
123 declareProperty("TrackSelectionTool", m_selTool );
124 declareProperty("UseTrackSelectionTool", m_useTrackSelectionTool = false);
125 declareProperty("TrackToVertexIPEstimator", m_trackToVertexIPEstimator);
126
127
128 declareProperty("commonTreeFolder", m_commonTreeFolder, "/ZmumuValidationUserSel/common" );
129 declareProperty("defaultTreeFolder", m_defaultTreeFolder );
130 declareProperty("IDTreeFolder", m_IDTreeFolder );
131 declareProperty("refit1TreeFolder", m_refit1TreeFolder );
132 declareProperty("refit2TreeFolder", m_refit2TreeFolder );
133 declareProperty("truthTreeFolder", m_truthTreeFolder );
134 declareProperty("combTreeFolder", m_combTreeFolder );
135 declareProperty("MSTreeFolder", m_MSTreeFolder, "/ZmumuValidationUserSel/ms" );
136
137 declareProperty("UnbiasVertex", m_doRemoval);
138
139 declareProperty("commonTree", m_commonTreeName, "CommonTree" );
140 declareProperty("DefaultTree", m_defaultTreeName );
141 declareProperty("IDTree", m_IDTreeName );
143 declareProperty("Refit1Tree", m_refit1TreeName );
144 declareProperty("Refit2Tree", m_refit2TreeName );
145 declareProperty("MSTree", m_MSTreeName );
146
147 declareProperty("doFourMuAnalysis", m_doFourMuAnalysis = false);
148 declareProperty("FourMuTreeFolder", m_FourMuTreeFolder);
149
150 declareProperty("StoreZmumuNtuple", m_storeZmumuNtuple = true);
151 declareProperty("doZmumuEventDebug", m_doDebug);
152 declareProperty("MuonQuality", m_MuonQualityName = "Medium");
153 declareProperty("skipMS", m_skipMS = false);
154 declareProperty("useCustomMuonSelector", m_useCustomMuonSelector = false );
155 declareProperty("MuonSelector", m_muonSelector );
156
157 declareProperty( "MinLumiBlock", m_minGoodLumiBlock = 0, "minimum lumiblock number to be accepted");
158 declareProperty( "MaxLumiBlock", m_maxGoodLumiBlock = 0, "maximum lumiblock number to be accepted");
159
160 return;
161}
162
163
164//==================================================================================
167
168
169//==================================================================================
171{
172 ATH_MSG_DEBUG ("** IDPerfMonZmumu::Initialize ** START **");
173 // Setup the services
174
175 // Retrieve Track fitter and track to vertex
176 if (m_doRefit) { // only if track refit is requested
177 if (m_TrackRefitter1.retrieve().isSuccess()) {
178 ATH_MSG_INFO("Retrieved tool m_TrackRefitter1: " << m_TrackRefitter1 << " SUCCESS ");
179 }
180 else {
181 ATH_MSG_FATAL("Unable to retrieve m_TrackRefitter1 " << m_TrackRefitter1 << " FAILURE ");
182 return StatusCode::FAILURE;
183 }
184
185 // Retrieve the second fitter
186 if (m_TrackRefitter2.retrieve().isSuccess()) {
187 ATH_MSG_INFO("Retrieved tool m_TrackRefitter2: " << m_TrackRefitter2 << " SUCCESS ");
188 }
189 else {
190 ATH_MSG_FATAL("Unable to retrieve m_TrackRefitter2 " << m_TrackRefitter2 << " FAILURE ");
191 return StatusCode::FAILURE;
192 }
193
194 if (m_trackToVertexTool.retrieve().isSuccess()) {
195 ATH_MSG_INFO("Retrieved tool m_trackToVertexTool " << m_trackToVertexTool << " SUCCESS ");
196 }
197 else {
198 ATH_MSG_FATAL("Unable to retrieve m_trackToVertexTool " << m_trackToVertexTool << " FAILURE ");
199 return StatusCode::FAILURE;
200 }
201 }
202
204 // ATH_CHECK( m_selTool.retrieve() );
205 if (m_selTool.retrieve().isSuccess()){
206 ATH_MSG_INFO("Retrieved tool (track selection tool) m_selTool " << m_selTool << " SUCCESS ");
207 }
208 else {
209 ATH_MSG_FATAL("Unable to retrieve (track selection tool) m_selTool " << m_selTool << " FAILURE ");
210 return StatusCode::FAILURE;
211 }
212 }
213
214 // initializing the eventInfo "accessor"
215 ATH_CHECK( m_EventInfoKey.initialize() );
216
217 if (m_doIP) {
218 ATH_MSG_DEBUG("Retrieving tool (trackToVertexIPEstimator)");
220 }
221
222
223 ATH_CHECK (m_EventInfoKey.initialize()); // initializing the eventInfo "accessor"
224
225 if (m_isMC) ATH_CHECK (m_extrapolator.retrieve()); // this is only used for the truth particles
226
227 ATH_CHECK (m_vertexKey.initialize());
228
229 ATH_CHECK (m_trackContainerName.initialize());
230
231 ATH_MSG_INFO(" -- IDPerfMonZmumu::initialize() -- m_vertexKey: " << m_vertexKey);
232
233 ATH_MSG_INFO(" -- IDPerfMonZmumu::initialize() -- init m_beamSpotKey ");
234 ATH_CHECK(m_beamSpotKey.initialize());
235
236 // START new place for initilization of params
238 m_xZmm.doIsoSelection (m_doIsoSelection);
239 m_xZmm.doIPSelection (m_doIPSelection);
240 m_xZmm.doMCPSelection (m_doMCPSelection);
241 m_xZmm.SetMassWindowLow (m_MassWindowLow);
242 m_xZmm.SetMassWindowHigh (m_MassWindowHigh);
243 m_xZmm.SetLeadingMuonPtCut(m_LeadingMuonPtCut);
244 m_xZmm.SetSecondMuonPtCut (m_SecondMuonPtCut);
245 m_xZmm.SetOpeningAngleCut (m_OpeningAngleCut);
246 m_xZmm.SetZ0GapCut (m_Z0GapCut);
247 m_xZmm.setDebugMode (m_doDebug);
248 m_xZmm.SetMuonQuality (m_MuonQualityName);
249 m_xZmm.SetSkipMSCheck (m_skipMS);
250 m_xZmm.SetMinLumiBlock (m_minGoodLumiBlock);
251 m_xZmm.SetMaxLumiBlock (m_maxGoodLumiBlock);
252
254 m_xZmm.SetMuonSelectionTool (m_muonSelector);
255 }
256 // END new place for initialization of params
257
258 if (m_doFourMuAnalysis) {
259 m_4mu.Init();
260 m_4mu.setDebugMode(true);
261 if (m_useCustomMuonSelector) m_4mu.SetMuonSelectionTool (m_muonSelector);
262 ATH_MSG_DEBUG(" IDPerfMonZmumu FourMuonAnalysis initialization completed " << m_Trk2VtxAssociationTool);
263 }
264
265 // m_Trk2VtxAssociationTool = std::make_unique<CP::TrackVertexAssociationTool>("Loose");
266 if ( m_Trk2VtxAssociationTool.retrieve().isSuccess() ) {
267 ATH_MSG_DEBUG(" IDPerfMonZmumu Success retrieving tool " << m_Trk2VtxAssociationTool);
268 }
269 else { // is Failure
270 ATH_MSG_FATAL("IDPerfMonZmumu Failed to retrieve tool m_Trk2VtxAssociationTool " << m_Trk2VtxAssociationTool);
271 return StatusCode::FAILURE;
272 }
273
274 ATH_CHECK ( this->bookTrees() );
275
276 if (m_UseTrigger) { // load trigger decission and matching under user request
277 if (m_triggerDecision.retrieve().isFailure()) {
278 ATH_MSG_FATAL("Unable to retrieve " << m_triggerDecision << " turn it off");
279 return StatusCode::FAILURE;
280 }
281 else {
282 ATH_MSG_DEBUG("retrieved tool: " << m_triggerDecision );
283 }
284
285 if(m_triggerMatching.retrieve().isFailure()) {
286 ATH_MSG_FATAL("Unable to retrieve " << m_triggerMatching << " turn it off");
287 return StatusCode::FAILURE;
288 }
289 else {
290 ATH_MSG_INFO("retrieved tool: " << m_triggerDecision );
291 }
292 }
293
294 ATH_MSG_DEBUG("** IDPerfMonZmumu::Initialize ** Completed **");
295 return StatusCode::SUCCESS;
296}
297
298
299
300//==================================================================================
302{
303 m_h_cutflow = new TH1F("h_cutflow","cut flow histogram",11, -0.5, 9.5);
304
305 ATH_MSG_DEBUG("initialize() ** bookTrees() ** m_commonTree name: " << m_commonTreeName.c_str());
306 ATH_MSG_DEBUG(" m_defaultTree name: " << m_defaultTreeName.c_str());
307 ATH_MSG_DEBUG(" m_IDTree name: " << m_IDTreeName.c_str());
308
309 if (!m_commonTree) {
310 ATH_MSG_INFO("initialize() ** defining m_commonTree with name: " << m_commonTreeName.c_str());
311 m_commonTree = new TTree((m_commonTreeName).c_str(), m_ValidationTreeDescription.c_str());
312
313 m_commonTree->Branch("runNumber" , &m_runNumber, "runNumber/I");
314 m_commonTree->Branch("eventNumber" , &m_evtNumber, "eventNumber/I");
315 m_commonTree->Branch("lumi_block" , &m_lumi_block, "lumi_block/I");
316 m_commonTree->Branch("beamposX" , &m_beamposX, "beamposX/F");
317 m_commonTree->Branch("beamposY" , &m_beamposY, "beamposY/F");
318 m_commonTree->Branch("mu" , &m_event_mu, "mu/I");
319 m_commonTree->Branch("preScale" , &m_triggerPrescale, "preScale/I");
320 m_commonTree->Branch("mcEventWeight" , &m_event_weight, "mcEventWeight/F");
321 m_commonTree->Branch("IDTrack_pt" , &m_IDTrack_pt);
322 m_commonTree->Branch("IDTrack_eta" , &m_IDTrack_eta);
323 m_commonTree->Branch("IDTrack_phi" , &m_IDTrack_phi);
324 m_commonTree->Branch("IDTrack_d0" , &m_IDTrack_d0);
325 m_commonTree->Branch("IDTrack_z0" , &m_IDTrack_z0);
326 m_commonTree->Branch("IDTrack_qoverp" , &m_IDTrack_qoverp);
327 m_commonTree->Branch("IDTrack_sigma_pt" , &m_IDTrack_sigma_pt);
328 m_commonTree->Branch("IDTrack_sigma_d0" , &m_IDTrack_sigma_d0);
329 m_commonTree->Branch("IDTrack_sigma_z0" , &m_IDTrack_sigma_z0);
330 m_commonTree->Branch("IDTrack_sigma_qoverp", &m_IDTrack_sigma_qoverp);
331 m_commonTree->Branch("CBTrack_pt" , &m_CBTrack_pt);
332 m_commonTree->Branch("CBTrack_eta" , &m_CBTrack_eta);
333 m_commonTree->Branch("CBTrack_phi" , &m_CBTrack_phi);
334 m_commonTree->Branch("CBTrack_d0" , &m_CBTrack_d0);
335 m_commonTree->Branch("CBTrack_z0" , &m_CBTrack_z0);
336 m_commonTree->Branch("CBTrack_qoverp" , &m_CBTrack_qoverp);
337 m_commonTree->Branch("CBTrack_sigma_pt" , &m_CBTrack_sigma_pt);
338 m_commonTree->Branch("CBTrack_sigma_d0" , &m_CBTrack_sigma_d0);
339 m_commonTree->Branch("CBTrack_sigma_z0" , &m_CBTrack_sigma_z0);
340 m_commonTree->Branch("CBTrack_sigma_qoverp", &m_CBTrack_sigma_qoverp);
341 m_commonTree->Branch("Refit1_pt" , &m_Refit1_pt);
342 m_commonTree->Branch("Refit1_eta" , &m_Refit1_eta);
343 m_commonTree->Branch("Refit1_phi" , &m_Refit1_phi);
344 m_commonTree->Branch("Refit1_d0" , &m_Refit1_d0);
345 m_commonTree->Branch("Refit1_z0" , &m_Refit1_z0);
346 m_commonTree->Branch("Refit1_qoverp" , &m_Refit1_qoverp);
347 m_commonTree->Branch("Refit1_sigma_pt" , &m_Refit1_sigma_pt);
348 m_commonTree->Branch("Refit1_sigma_d0" , &m_Refit1_sigma_d0);
349 m_commonTree->Branch("Refit1_sigma_z0" , &m_Refit1_sigma_z0);
350 m_commonTree->Branch("Refit1_sigma_qoverp" , &m_Refit1_sigma_qoverp);
351 m_commonTree->Branch("Refit2_pt" , &m_Refit2_pt);
352 m_commonTree->Branch("Refit2_eta" , &m_Refit2_eta);
353 m_commonTree->Branch("Refit2_phi" , &m_Refit2_phi);
354 m_commonTree->Branch("Refit2_d0" , &m_Refit2_d0);
355 m_commonTree->Branch("Refit2_z0" , &m_Refit2_z0);
356 m_commonTree->Branch("Refit2_qoverp" , &m_Refit2_qoverp);
357 m_commonTree->Branch("Refit2_sigma_pt" , &m_Refit2_sigma_pt);
358 m_commonTree->Branch("Refit2_sigma_d0" , &m_Refit2_sigma_d0);
359 m_commonTree->Branch("Refit2_sigma_z0" , &m_Refit2_sigma_z0);
360 m_commonTree->Branch("Refit2_sigma_qoverp" , &m_Refit2_sigma_qoverp);
361 m_commonTree->Branch("Truth_pt" , &m_Truth_pt);
362 m_commonTree->Branch("Truth_eta" , &m_Truth_eta);
363 m_commonTree->Branch("Truth_phi" , &m_Truth_phi);
364 m_commonTree->Branch("Truth_d0" , &m_Truth_d0);
365 m_commonTree->Branch("Truth_z0" , &m_Truth_z0);
366 m_commonTree->Branch("Truth_qoverp" , &m_Truth_qoverp);
367 m_commonTree->Branch("Truth_parent" , &m_Truth_parent);
368 m_commonTree->Branch("numberOfBLayerHits" , &m_nBLhits);
369 m_commonTree->Branch("numberOfPixelHits" , &m_nPIXhits);
370 m_commonTree->Branch("numberOfSCTHits" , &m_nSCThits);
371 m_commonTree->Branch("numberOfTRTHits" , &m_nTRThits);
372 }
373
374 if ( !m_defaultTree){
375 ATH_MSG_INFO("initialize() ** defining m_defaultTree with name: " << m_defaultTreeName.c_str());
376 m_defaultTree = new TTree((m_defaultTreeName).c_str(), m_ValidationTreeDescription.c_str());
377
378 m_defaultTree->Branch("runNumber" , &m_runNumber, "runNumber/I");
379 m_defaultTree->Branch("eventNumber" , &m_evtNumber, "eventNumber/I");
380 m_defaultTree->Branch("lumi_block" , &m_lumi_block, "lumi_block/I");
381 m_defaultTree->Branch("mu" , &m_event_mu, "mu/I");
382
383 m_defaultTree->Branch("Negative_Px", &m_negative_px, "Negative_Px/D");
384 m_defaultTree->Branch("Negative_Py", &m_negative_py, "Negative_Py/D");
385 m_defaultTree->Branch("Negative_Pt", &m_negative_pt, "Negative_Pt/D");
386 m_defaultTree->Branch("Negative_Pz", &m_negative_pz, "Negative_Pz/D");
387 m_defaultTree->Branch("Negative_Phi", &m_negative_phi, "Negative_Phi/D");
388 m_defaultTree->Branch("Negative_eta", &m_negative_eta, "Negative_Eta/D");
389 m_defaultTree->Branch("Negative_z0", &m_negative_z0, "Negative_z0/D");
390 m_defaultTree->Branch("Negative_d0", &m_negative_d0, "Negative_d0/D");
391 m_defaultTree->Branch("Negative_z0_err", &m_negative_z0_err, "Negative_z0_err/D");
392 m_defaultTree->Branch("Negative_d0_err", &m_negative_d0_err, "Negative_d0_err/D");
393 m_defaultTree->Branch("Negative_sigma_pt", &m_negative_sigma_pt, "Negative_sigma_pt/D");
394
395 m_defaultTree->Branch("Positive_Px", &m_positive_px, "Positive_Px/D");
396 m_defaultTree->Branch("Positive_Py", &m_positive_py, "Positive_Py/D");
397 m_defaultTree->Branch("Positive_Pt", &m_positive_pt, "Positive_Pt/D");
398 m_defaultTree->Branch("Positive_Pz", &m_positive_pz, "Positive_Pz/D");
399 m_defaultTree->Branch("Positive_Phi", &m_positive_phi, "Positive_Phi/D");
400 m_defaultTree->Branch("Positive_eta", &m_positive_eta, "Positive_Eta/D");
401 m_defaultTree->Branch("Positive_z0", &m_positive_z0, "Positive_z0/D");
402 m_defaultTree->Branch("Positive_d0", &m_positive_d0, "Positive_d0/D");
403 m_defaultTree->Branch("Positive_z0_err", &m_positive_z0_err, "Positive_z0_err/D");
404 m_defaultTree->Branch("Positive_d0_err", &m_positive_d0_err, "Positive_d0_err/D");
405 m_defaultTree->Branch("Positive_sigma_pt", &m_positive_sigma_pt, "Positive_sigma_pt/D");
406
407 if (m_doIP) {
408 m_defaultTree->Branch("Negative_d0_PV", &m_negative_d0_PV , "Negative_d0_PV/D");
409 m_defaultTree->Branch("Negative_z0_PV", &m_negative_z0_PV , "Negative_z0_PV/D");
410 m_defaultTree->Branch("Positive_z0_PV", &m_positive_z0_PV, "Positive_z0_PV/D");
411 m_defaultTree->Branch("Positive_d0_PV", &m_positive_d0_PV, "Positive_d0_PV/D");
412
413 m_defaultTree->Branch("Negative_d0_PVerr", &m_negative_d0_PVerr, "Negative_d0_PVerr/D");
414 m_defaultTree->Branch("Negative_z0_PVerr", &m_negative_z0_PVerr, "Negative_z0_PVerr/D");
415 m_defaultTree->Branch("Positive_z0_PVerr", &m_positive_z0_PVerr, "Positive_z0_PVerr/D");
416 m_defaultTree->Branch("Positive_d0_PVerr", &m_positive_d0_PVerr, "Positive_d0_PVerr/D");
417
418 m_defaultTree->Branch("pv_x", &m_pv_x , "pv_x/D");
419 m_defaultTree->Branch("pv_y", &m_pv_y , "pv_y/D");
420 m_defaultTree->Branch("pv_z", &m_pv_z , "pv_z/D");
421 m_defaultTree->Branch("nTrkInVtx", &m_nTrkInVtx, "nTrkInVtx/I");
422 }
423 }
424
425 bool isTreeNone = false;
426 if (m_IDTreeName.find("none") != std::string::npos) isTreeNone = true;
427 if ( !m_IDTree and !isTreeNone ){
428 ATH_MSG_INFO("initialize() ** defining IDPerfMonZmumu m_IDTree with name: " << m_IDTreeName.c_str());
429 m_IDTree = new TTree((m_IDTreeName).c_str(), m_ValidationTreeDescription.c_str());
430
431 m_IDTree->Branch("runNumber" , &m_runNumber, "runNumber/I");
432 m_IDTree->Branch("eventNumber" , &m_evtNumber, "eventNumber/I");
433 m_IDTree->Branch("lumi_bLock" , &m_lumi_block, "lumi_block/I");
434 m_IDTree->Branch("mu" , &m_event_mu, "mu/I");
435
436 m_IDTree->Branch("Negative_Px", &m_negative_px, "Negative_Px/D");
437 m_IDTree->Branch("Negative_Py", &m_negative_py, "Negative_Py/D");
438 m_IDTree->Branch("Negative_Pt", &m_negative_pt, "Negative_Pt/D");
439 m_IDTree->Branch("Negative_Pz", &m_negative_pz, "Negative_Pz/D");
440 m_IDTree->Branch("Negative_Phi", &m_negative_phi, "Negative_Phi/D");
441 m_IDTree->Branch("Negative_Eta", &m_negative_eta, "Negative_Eta/D");
442 m_IDTree->Branch("Negative_z0", &m_negative_z0, "Negative_z0/D");
443 m_IDTree->Branch("Negative_d0", &m_negative_d0, "Negative_d0/D");
444 m_IDTree->Branch("Negative_z0_err", &m_negative_z0_err, "Negative_z0_err/D");
445 m_IDTree->Branch("Negative_d0_err", &m_negative_d0_err, "Negative_d0_err/D");
446 m_IDTree->Branch("Negative_sigma_pt", &m_negative_sigma_pt, "Negative_sigma_pt/D");
447
448 m_IDTree->Branch("Positive_Px", &m_positive_px, "Positive_Px/D");
449 m_IDTree->Branch("Positive_Py", &m_positive_py, "Positive_Py/D");
450 m_IDTree->Branch("Positive_Pt", &m_positive_pt, "Positive_Pt/D");
451 m_IDTree->Branch("Positive_Pz", &m_positive_pz, "Positive_Pz/D");
452 m_IDTree->Branch("Positive_Phi", &m_positive_phi, "Positive_Phi/D");
453 m_IDTree->Branch("Positive_Eta", &m_positive_eta, "Positive_Eta/D");
454 m_IDTree->Branch("Positive_z0", &m_positive_z0, "Positive_z0/D");
455 m_IDTree->Branch("Positive_d0", &m_positive_d0, "Positive_d0/D");
456 m_IDTree->Branch("Positive_z0_err", &m_positive_z0_err, "Positive_z0_err/D");
457 m_IDTree->Branch("Positive_d0_err", &m_positive_d0_err, "Positive_d0_err/D");
458 m_IDTree->Branch("Positive_sigma_pt", &m_positive_sigma_pt, "Positive_sigma_pt/D");
459
460 if(m_doIP){
461 m_IDTree->Branch("Negative_d0_PV", &m_negative_d0_PV , "Negative_d0_PV/D");
462 m_IDTree->Branch("Negative_z0_PV", &m_negative_z0_PV , "Negative_z0_PV/D");
463 m_IDTree->Branch("Positive_z0_PV", &m_positive_z0_PV, "Positive_z0_PV/D");
464 m_IDTree->Branch("Positive_d0_PV", &m_positive_d0_PV, "Positive_d0_PV/D");
465
466 m_IDTree->Branch("Negative_d0_PVerr", &m_negative_d0_PVerr, "Negative_d0_PVerr/D");
467 m_IDTree->Branch("Negative_z0_PVerr", &m_negative_z0_PVerr, "Negative_z0_PVerr/D");
468 m_IDTree->Branch("Positive_z0_PVerr", &m_positive_z0_PVerr, "Positive_z0_PVerr/D");
469 m_IDTree->Branch("Positive_d0_PVerr", &m_positive_d0_PVerr, "Positive_d0_PVerr/D");
470
471 m_IDTree->Branch("pv_x", &m_pv_x , "pv_x/D");
472 m_IDTree->Branch("pv_y", &m_pv_y , "pv_y/D");
473 m_IDTree->Branch("pv_z", &m_pv_z , "pv_z/D");
474 m_IDTree->Branch("nTrkInVtx", &m_nTrkInVtx, "nTrkInVtx/I");
475 }
476 }
477
478 // dealing with tree for Refit1 tracks
479 isTreeNone = false;
480 if (m_refit1TreeName.find("none") != std::string::npos) isTreeNone = true;
481 if ( m_doRefit && !m_refit1Tree && !isTreeNone ){
482 ATH_MSG_INFO("initialize() ** defining IDPerfMonZmumu m_refit1Tree with name: " << m_refit1TreeName.c_str());
483 m_refit1Tree = new TTree((m_refit1TreeName).c_str(), m_ValidationTreeDescription.c_str());
484
485 m_refit1Tree->Branch("runNumber" , &m_runNumber, "runNumber/I");
486 m_refit1Tree->Branch("eventNumber" , &m_evtNumber, "eventNumber/I");
487 m_refit1Tree->Branch("lumi_block" , &m_lumi_block, "lumi_block/I");
488 m_refit1Tree->Branch("mu" , &m_event_mu, "mu/I");
489 m_refit1Tree->Branch("preScale" , &m_triggerPrescale, "preScale/I");
490
491 m_refit1Tree->Branch("Negative_Px", &m_negative_px, "Negative_Px/D");
492 m_refit1Tree->Branch("Negative_Py", &m_negative_py, "Negative_Py/D");
493 m_refit1Tree->Branch("Negative_Pt", &m_negative_pt, "Negative_Pt/D");
494 m_refit1Tree->Branch("Negative_Pz", &m_negative_pz, "Negative_Pz/D");
495 m_refit1Tree->Branch("Negative_Phi", &m_negative_phi, "Negative_Phi/D");
496 m_refit1Tree->Branch("Negative_Eta", &m_negative_eta, "Negative_Eta/D");
497 m_refit1Tree->Branch("Negative_z0", &m_negative_z0, "Negative_z0/D");
498 m_refit1Tree->Branch("Negative_d0", &m_negative_d0, "Negative_d0/D");
499 m_refit1Tree->Branch("Negative_z0_err", &m_negative_z0_err, "Negative_z0_err/D");
500 m_refit1Tree->Branch("Negative_d0_err", &m_negative_d0_err, "Negative_d0_err/D");
501 m_refit1Tree->Branch("Negative_sigma_pt", &m_negative_sigma_pt, "Negative_sigma_pt/D");
502
503 m_refit1Tree->Branch("Positive_Px", &m_positive_px, "Positive_Px/D");
504 m_refit1Tree->Branch("Positive_Py", &m_positive_py, "Positive_Py/D");
505 m_refit1Tree->Branch("Positive_Pt", &m_positive_pt, "Positive_Pt/D");
506 m_refit1Tree->Branch("Positive_Pz", &m_positive_pz, "Positive_Pz/D");
507 m_refit1Tree->Branch("Positive_Phi", &m_positive_phi, "Positive_Phi/D");
508 m_refit1Tree->Branch("Positive_eta", &m_positive_eta, "Positive_Eta/D");
509 m_refit1Tree->Branch("Positive_z0", &m_positive_z0, "Positive_z0/D");
510 m_refit1Tree->Branch("Positive_d0", &m_positive_d0, "Positive_d0/D");
511 m_refit1Tree->Branch("Positive_z0_err", &m_positive_z0_err, "Positive_z0_err/D");
512 m_refit1Tree->Branch("Positive_d0_err", &m_positive_d0_err, "Positive_d0_err/D");
513 m_refit1Tree->Branch("Positive_sigma_pt", &m_positive_sigma_pt, "Positive_sigma_pt/D");
514
515 if(m_doIP){
516 m_refit1Tree->Branch("Negative_d0_PV", &m_negative_d0_PV , "Negative_d0_PV/D");
517 m_refit1Tree->Branch("Negative_z0_PV", &m_negative_z0_PV , "Negative_z0_PV/D");
518 m_refit1Tree->Branch("Positive_z0_PV", &m_positive_z0_PV, "Positive_z0_PV/D");
519 m_refit1Tree->Branch("Positive_d0_PV", &m_positive_d0_PV, "Positive_d0_PV/D");
520
521 m_refit1Tree->Branch("Negative_d0_PVerr", &m_negative_d0_PVerr , "Negative_d0_PVerr/D");
522 m_refit1Tree->Branch("Negative_z0_PVerr", &m_negative_z0_PVerr , "Negative_z0_PVerr/D");
523 m_refit1Tree->Branch("Positive_z0_PVerr", &m_positive_z0_PVerr, "Positive_z0_PVerr/D");
524 m_refit1Tree->Branch("Positive_d0_PVerr", &m_positive_d0_PVerr, "Positive_d0_PVerr/D");
525
526 m_refit1Tree->Branch("pv_x", &m_pv_x , "pv_x/D");
527 m_refit1Tree->Branch("pv_y", &m_pv_y , "pv_y/D");
528 m_refit1Tree->Branch("pv_z", &m_pv_z , "pv_z/D");
529 m_refit1Tree->Branch("nTrkInVtx", &m_nTrkInVtx, "nTrkInVtx/I");
530 }
531 }
532
533 // dealing with tree for Refit2 tracks
534 isTreeNone = false;
535 if (m_refit2TreeName.find("none") != std::string::npos) isTreeNone = true;
536 if ( m_doRefit && !m_refit2Tree && !isTreeNone){
537 ATH_MSG_INFO("initialize() ** defining m_refit2Tree with name: " << m_refit2TreeName.c_str());
538 m_refit2Tree = new TTree((m_refit2TreeName).c_str(), m_ValidationTreeDescription.c_str());
539
540 m_refit2Tree->Branch("runNumber" , &m_runNumber, "runNumber/I");
541 m_refit2Tree->Branch("eventNumber" , &m_evtNumber, "eventNumber/I");
542 m_refit2Tree->Branch("lumi_block" , &m_lumi_block, "lumi_block/I");
543 m_refit2Tree->Branch("mu" , &m_event_mu, "mu/I");
544 m_refit2Tree->Branch("preScale" , &m_triggerPrescale, "preScale/I");
545
546 m_refit2Tree->Branch("Negative_Px", &m_negative_px, "Negative_Px/D");
547 m_refit2Tree->Branch("Negative_Py", &m_negative_py, "Negative_Py/D");
548 m_refit2Tree->Branch("Negative_Pt", &m_negative_pt, "Negative_Pt/D");
549 m_refit2Tree->Branch("Negative_Pz", &m_negative_pz, "Negative_Pz/D");
550 m_refit2Tree->Branch("Negative_Phi", &m_negative_phi, "Negative_Phi/D");
551 m_refit2Tree->Branch("Negative_Eta", &m_negative_eta, "Negative_Eta/D");
552 m_refit2Tree->Branch("Negative_z0", &m_negative_z0, "Negative_z0/D");
553 m_refit2Tree->Branch("Negative_d0", &m_negative_d0, "Negative_d0/D");
554 m_refit2Tree->Branch("Negative_z0_err", &m_negative_z0_err, "Negative_z0_err/D");
555 m_refit2Tree->Branch("Negative_d0_err", &m_negative_d0_err, "Negative_d0_err/D");
556 m_refit2Tree->Branch("Negative_sigma_pt", &m_negative_sigma_pt, "Negative_sigma_pt/D");
557
558 m_refit2Tree->Branch("Positive_Px", &m_positive_px, "Positive_Px/D");
559 m_refit2Tree->Branch("Positive_Py", &m_positive_py, "Positive_Py/D");
560 m_refit2Tree->Branch("Positive_Pt", &m_positive_pt, "Positive_Pt/D");
561 m_refit2Tree->Branch("Positive_Pz", &m_positive_pz, "Positive_Pz/D");
562 m_refit2Tree->Branch("Positive_Phi", &m_positive_phi, "Positive_Phi/D");
563 m_refit2Tree->Branch("Positive_Eta", &m_positive_eta, "Positive_Eta/D");
564 m_refit2Tree->Branch("Positive_z0", &m_positive_z0, "Positive_z0/D");
565 m_refit2Tree->Branch("Positive_d0", &m_positive_d0, "Positive_d0/D");
566 m_refit2Tree->Branch("Positive_z0_err", &m_positive_z0_err, "Positive_z0_err/D");
567 m_refit2Tree->Branch("Positive_d0_err", &m_positive_d0_err, "Positive_d0_err/D");
568 m_refit2Tree->Branch("Positive_sigma_pt", &m_positive_sigma_pt, "Positive_sigma_pt/D");
569
570
571 if(m_doIP){
572 m_refit2Tree->Branch("Negative_d0_PV", &m_negative_d0_PV , "Negative_d0_PV/D");
573 m_refit2Tree->Branch("Negative_z0_PV", &m_negative_z0_PV , "Negative_z0_PV/D");
574 m_refit2Tree->Branch("Positive_d0_PV", &m_positive_d0_PV , "Positive_d0_PV/D");
575 m_refit2Tree->Branch("Positive_z0_PV", &m_positive_z0_PV , "Positive_z0_PV/D");
576
577
578 m_refit2Tree->Branch("Negative_z0_PVerr", &m_negative_z0_PVerr, "Negative_z0_PVerr/D");
579 m_refit2Tree->Branch("Negative_d0_PVerr", &m_negative_d0_PVerr, "Negative_d0_PVerr/D");
580 m_refit2Tree->Branch("Positive_z0_PVerr", &m_positive_z0_PVerr, "Positive_z0_PVerr/D");
581 m_refit2Tree->Branch("Positive_d0_PVerr", &m_positive_d0_PVerr, "Positive_d0_PVerr/D");
582
583 m_refit2Tree->Branch("pv_x", &m_pv_x , "pv_x/D");
584 m_refit2Tree->Branch("pv_y", &m_pv_y , "pv_y/D");
585 m_refit2Tree->Branch("pv_z", &m_pv_z , "pv_z/D");
586
587 m_refit2Tree->Branch("nTrkInVtx", &m_nTrkInVtx, "nTrkInVtx/I");
588 }
589 }
590
591 isTreeNone = false;
592 if (m_combTreeName.find("none") != std::string::npos) isTreeNone = true;
593 if( !m_combTree && !m_skipMS && !isTreeNone){
594 ATH_MSG_INFO("initialize() ** defining IDPerfMonZmumu m_combTree with name: " << m_combTreeName.c_str());
595 m_combTree = new TTree((m_combTreeName).c_str(), m_ValidationTreeDescription.c_str());
596
597 m_combTree->Branch("runNumber", &m_runNumber, "runNumber/I");
598 m_combTree->Branch("eventNumber", &m_evtNumber, "eventNumber/I");
599 m_combTree->Branch("lumi_block", &m_lumi_block, "lumi_block/I");
600 m_combTree->Branch("mu", &m_event_mu, "mu/I");
601 m_combTree->Branch("preScale", &m_triggerPrescale, "preScale/I");
602
603 m_combTree->Branch("Negative_Px", &m_negative_px, "Negative_Px/D");
604 m_combTree->Branch("Negative_Py", &m_negative_py, "Negative_Py/D");
605 m_combTree->Branch("Negative_Pt", &m_negative_pt, "Negative_Pt/D");
606 m_combTree->Branch("Negative_Pz", &m_negative_pz, "Negative_Pz/D");
607 m_combTree->Branch("Negative_Phi", &m_negative_phi, "Negative_Phi/D");
608 m_combTree->Branch("Negative_eta", &m_negative_eta, "Negative_eta/D");
609 m_combTree->Branch("Negative_z0", &m_negative_z0, "Negative_z0/D");
610 m_combTree->Branch("Negative_d0", &m_negative_d0, "Negative_d0/D");
611 m_combTree->Branch("Negative_z0_err", &m_negative_z0_err, "Negative_z0_err/D");
612 m_combTree->Branch("Negative_d0_err", &m_negative_d0_err, "Negative_d0_err/D");
613 m_combTree->Branch("Negative_sigma_pt", &m_negative_sigma_pt, "Negative_sigma_pt/D");
614
615 m_combTree->Branch("Positive_Px", &m_positive_px, "Positive_Px/D");
616 m_combTree->Branch("Positive_Py", &m_positive_py, "Positive_Py/D");
617 m_combTree->Branch("Positive_Pt", &m_positive_pt, "Positive_Pt/D");
618 m_combTree->Branch("Positive_Pz", &m_positive_pz, "Positive_Pz/D");
619 m_combTree->Branch("Positive_Phi", &m_positive_phi, "Positive_Phi/D");
620 m_combTree->Branch("Positive_eta", &m_positive_eta, "Positive_Eta/D");
621 m_combTree->Branch("Positive_z0", &m_positive_z0, "Positive_z0/D");
622 m_combTree->Branch("Positive_d0", &m_positive_d0, "Positive_d0/D");
623 m_combTree->Branch("Positive_z0_err", &m_positive_z0_err, "Positive_z0_err/D");
624 m_combTree->Branch("Positive_d0_err", &m_positive_d0_err, "Positive_d0_err/D");
625 m_combTree->Branch("Positive_sigma_pt", &m_positive_sigma_pt, "Positive_sigma_pt/D");
626
627 if(m_doIP){
628 m_combTree->Branch("Negative_z0_PV", &m_negative_z0_PV, "Negative_z0_PV/D");
629 m_combTree->Branch("Negative_d0_PV", &m_negative_d0_PV, "Negative_d0_PV/D");
630 m_combTree->Branch("Positive_z0_PV", &m_positive_z0_PV, "Positive_z0_PV/D");
631 m_combTree->Branch("Positive_d0_PV", &m_positive_d0_PV, "Positive_d0_PV/D");
632
633 m_combTree->Branch("Negative_z0_PVerr", &m_negative_z0_PVerr, "Negative_z0_PVerr/D");
634 m_combTree->Branch("Negative_d0_PVerr", &m_negative_d0_PVerr, "Negative_d0_PVerr/D");
635 m_combTree->Branch("Positive_z0_PVerr", &m_positive_z0_PVerr, "Positive_z0_PVerr/D");
636 m_combTree->Branch("Positive_d0_PVerr", &m_positive_d0_PVerr, "Positive_d0_PVerr/D");
637
638 m_combTree->Branch("pv_x", &m_pv_x , "pv_x/D");
639 m_combTree->Branch("pv_y", &m_pv_y , "pv_y/D");
640 m_combTree->Branch("pv_z", &m_pv_z , "pv_z/D");
641
642 m_combTree->Branch("nTrkInVtx", &m_nTrkInVtx, "nTrkInVtx/I");
643 }
644 }
645
646
647 isTreeNone = false;
648 if (m_MSTreeName.find("none") != std::string::npos) isTreeNone = true;
649 if( !m_MSTree && !m_skipMS && !isTreeNone){
650 ATH_MSG_INFO("initialize() ** defining IDPerfMon MSTree ");
651
652 m_MSTree = new TTree(m_MSTreeName.c_str(), m_ValidationTreeDescription.c_str());
653
654 m_MSTree->Branch("runNumber" , &m_runNumber, "runNumber/I");
655 m_MSTree->Branch("eventNumber" , &m_evtNumber, "eventNumber/I");
656 m_MSTree->Branch("lumi_block" , &m_lumi_block, "lumi_block/I");
657 m_MSTree->Branch("preScale" , &m_triggerPrescale, "preScale/I");
658
659 m_MSTree->Branch("Negative_Px", &m_negative_px, "Negative_Px/D");
660 m_MSTree->Branch("Negative_Py", &m_negative_py, "Negative_Py/D");
661 m_MSTree->Branch("Negative_Pt", &m_negative_pt, "Negative_Pt/D");
662 m_MSTree->Branch("Negative_Pz", &m_negative_pz, "Negative_Pz/D");
663 m_MSTree->Branch("Negative_Phi", &m_negative_phi, "Negative_Phi/D");
664 m_MSTree->Branch("Negative_Eta", &m_negative_eta, "Negative_Eta/D");
665 m_MSTree->Branch("Negative_z0", &m_negative_z0, "Negative_z0/D");
666 m_MSTree->Branch("Negative_d0", &m_negative_d0, "Negative_d0/D");
667 m_MSTree->Branch("Negative_z0_err", &m_negative_z0_err, "Negative_z0_err/D");
668 m_MSTree->Branch("Negative_d0_err", &m_negative_d0_err, "Negative_d0_err/D");
669 m_MSTree->Branch("Negative_sigma_pt", &m_negative_sigma_pt, "Negative_sigma_pt/D");
670
671 m_MSTree->Branch("Positive_Px", &m_positive_px, "Positive_Px/D");
672 m_MSTree->Branch("Positive_Py", &m_positive_py, "Positive_Py/D");
673 m_MSTree->Branch("Positive_Pt", &m_positive_pt, "Positive_Pt/D");
674 m_MSTree->Branch("Positive_Pz", &m_positive_pz, "Positive_Pz/D");
675 m_MSTree->Branch("Positive_Phi", &m_positive_phi, "Positive_Phi/D");
676 m_MSTree->Branch("Positive_Eta", &m_positive_eta, "Positive_Eta/D");
677 m_MSTree->Branch("Positive_z0", &m_positive_z0, "Positive_z0/D");
678 m_MSTree->Branch("Positive_d0", &m_positive_d0, "Positive_d0/D");
679 m_MSTree->Branch("Positive_z0_err", &m_positive_z0_err, "Positive_z0_err/D");
680 m_MSTree->Branch("Positive_d0_err", &m_positive_d0_err, "Positive_d0_err/D");
681 m_MSTree->Branch("Positive_sigma_pt", &m_positive_sigma_pt, "Positive_sigma_pt/D");
682 }
683
684 if( m_isMC && !m_truthTree ){
685 m_truthTree = new TTree(m_truthTreeName.c_str(), m_ValidationTreeDescription.c_str());
686
687 m_truthTree->Branch("runNumber" , &m_runNumber, "runNumber/I");
688 m_truthTree->Branch("eventNumber" , &m_evtNumber, "eventNumber/I");
689 m_truthTree->Branch("lumi_block" , &m_lumi_block, "lumi_block/I");
690 m_truthTree->Branch("preScale" , &m_triggerPrescale, "preScale/I");
691
692 m_truthTree->Branch("Negative_Px", &m_negative_px, "Negative_Px/D");
693 m_truthTree->Branch("Negative_Py", &m_negative_py, "Negative_Py/D");
694 m_truthTree->Branch("Negative_Pt", &m_negative_pt, "Negative_Pt/D");
695 m_truthTree->Branch("Negative_Pz", &m_negative_pz, "Negative_Pz/D");
696 m_truthTree->Branch("Negative_Phi", &m_negative_phi, "Negative_Phi/D");
697 m_truthTree->Branch("Negative_Eta", &m_negative_eta, "Negative_Eta/D");
698 m_truthTree->Branch("Negative_z0", &m_negative_z0, "Negative_z0/D");
699 m_truthTree->Branch("Negative_d0", &m_negative_d0, "Negative_d0/D");
700 m_truthTree->Branch("Negative_z0_err", &m_negative_z0_err, "Negative_z0_err/D");
701 m_truthTree->Branch("Negative_d0_err", &m_negative_d0_err, "Negative_d0_err/D");
702 m_truthTree->Branch("Negative_parent", &m_negative_parent, "Negative_parent/I");
703
704 m_truthTree->Branch("Positive_Px", &m_positive_px, "Positive_Px/D");
705 m_truthTree->Branch("Positive_Py", &m_positive_py, "Positive_Py/D");
706 m_truthTree->Branch("Positive_Pt", &m_positive_pt, "Positive_Pt/D");
707 m_truthTree->Branch("Positive_Pz", &m_positive_pz, "Positive_Pz/D");
708 m_truthTree->Branch("Positive_Phi", &m_positive_phi, "Positive_Phi/D");
709 m_truthTree->Branch("Positive_Eta", &m_positive_eta, "Positive_Eta/D");
710 m_truthTree->Branch("Positive_z0", &m_positive_z0, "Positive_z0/D");
711 m_truthTree->Branch("Positive_d0", &m_positive_d0, "Positive_d0/D");
712 m_truthTree->Branch("Positive_z0_err", &m_positive_z0_err, "Positive_z0_err/D");
713 m_truthTree->Branch("Positive_d0_err", &m_positive_d0_err, "Positive_d0_err/D");
714 m_truthTree->Branch("Positive_parent", &m_positive_parent, "Positive_parent/I");
715 }
716
718 ATH_MSG_INFO("initialize() ** defining m_FourMuTree ");
719 m_FourMuTree = new TTree((m_FourMuTreeName).c_str(), "Four Muon monitoring");
720
721 m_FourMuTree->Branch("runNumber" , &m_runNumber, "runNumber/I");
722 m_FourMuTree->Branch("eventNumber", &m_evtNumber, "eventNumber/I");
723 m_FourMuTree->Branch("lumi_block" , &m_lumi_block, "lumi_block/I");
724 m_FourMuTree->Branch("mu" , &m_event_mu, "mu/I");
725 m_FourMuTree->Branch("preScale" , &m_triggerPrescale, "preScale/I");
726 m_FourMuTree->Branch("nVertex" , &m_nVertex, "nVertex/I");
727
728 m_FourMuTree->Branch("Negative_1_Px", &m_negative_px, "Negative_1_Px/D");
729 m_FourMuTree->Branch("Negative_1_Py", &m_negative_py, "Negative_1_Py/D");
730 m_FourMuTree->Branch("Negative_1_Pz", &m_negative_pz, "Negative_1_Pz/D");
731 m_FourMuTree->Branch("Negative_1_z0", &m_negative_z0, "Negative_1_z0/D");
732 m_FourMuTree->Branch("Negative_1_d0", &m_negative_d0, "Negative_1_d0/D");
733 m_FourMuTree->Branch("Negative_1_z0_err", &m_negative_z0_err, "Negative_1_z0_err/D");
734 m_FourMuTree->Branch("Negative_1_d0_err", &m_negative_d0_err, "Negative_1_d0_err/D");
735 m_FourMuTree->Branch("Negative_1_vtx", &m_negative_1_vtx, "Negative_1_vtx/I"); // vertex identifier
736
737 m_FourMuTree->Branch("Negative_2_Px", &m_negative_2_px, "Negative_2_Px/D");
738 m_FourMuTree->Branch("Negative_2_Py", &m_negative_2_py, "Negative_2_Py/D");
739 m_FourMuTree->Branch("Negative_2_Pz", &m_negative_2_pz, "Negative_2_Pz/D");
740 m_FourMuTree->Branch("Negative_2_z0", &m_negative_2_z0, "Negative_2_z0/D");
741 m_FourMuTree->Branch("Negative_2_d0", &m_negative_2_d0, "Negative_2_d0/D");
742 m_FourMuTree->Branch("Negative_2_z0_err", &m_negative_2_z0_err, "Negative_2_z0_err/D");
743 m_FourMuTree->Branch("Negative_2_d0_err", &m_negative_2_d0_err, "Negative_2_d0_err/D");
744 m_FourMuTree->Branch("Negative_2_vtx", &m_negative_2_vtx, "Negative_2_vtx/I");
745
746 m_FourMuTree->Branch("Positive_1_Px", &m_positive_px, "Positive_1_Px/D");
747 m_FourMuTree->Branch("Positive_1_Py", &m_positive_py, "Positive_1_Py/D");
748 m_FourMuTree->Branch("Positive_1_Pz", &m_positive_pz, "Positive_1_Pz/D");
749 m_FourMuTree->Branch("Positive_1_z0", &m_positive_z0, "Positive_1_z0/D");
750 m_FourMuTree->Branch("Positive_1_d0", &m_positive_d0, "Positive_1_d0/D");
751 m_FourMuTree->Branch("Positive_1_z0_err", &m_positive_z0_err, "Positive_1_z0_err/D");
752 m_FourMuTree->Branch("Positive_1_d0_err", &m_positive_d0_err, "Positive_1_d0_err/D");
753 m_FourMuTree->Branch("Positive_1_vtx", &m_positive_1_vtx, "Positive_1_vtx/I");
754
755 m_FourMuTree->Branch("Positive_2_Px", &m_positive_2_px, "Positive_1_Px/D");
756 m_FourMuTree->Branch("Positive_2_Py", &m_positive_2_py, "Positive_1_Py/D");
757 m_FourMuTree->Branch("Positive_2_Pz", &m_positive_2_pz, "Positive_1_Pz/D");
758 m_FourMuTree->Branch("Positive_2_z0", &m_positive_2_z0, "Positive_1_z0/D");
759 m_FourMuTree->Branch("Positive_2_d0", &m_positive_2_d0, "Positive_1_d0/D");
760 m_FourMuTree->Branch("Positive_2_z0_err", &m_positive_2_z0_err,"Positive_1_z0_err/D");
761 m_FourMuTree->Branch("Positive_2_d0_err", &m_positive_2_d0_err,"Positive_1_d0_err/D");
762 m_FourMuTree->Branch("Positive_2_vtx", &m_positive_2_vtx, "Positive_2_vtx/I");
763
764 // electrons
765 m_FourMuTree->Branch("ElNegative_1_Px", &m_el_negative1_px, "ElNegative_1_Px/D");
766 m_FourMuTree->Branch("ElNegative_1_Py", &m_el_negative1_py, "ElNegative_1_Py/D");
767 m_FourMuTree->Branch("ElNegative_1_Pz", &m_el_negative1_pz, "ElNegative_1_Pz/D");
768 m_FourMuTree->Branch("ElNegative_1_z0", &m_el_negative1_z0, "ElNegative_1_z0/D");
769 m_FourMuTree->Branch("ElNegative_1_d0", &m_el_negative1_d0, "ElNegative_1_d0/D");
770 m_FourMuTree->Branch("ElNegative_1_z0_err", &m_el_negative1_z0_err, "ElNegative_1_z0_err/D");
771 m_FourMuTree->Branch("ElNegative_1_d0_err", &m_el_negative1_d0_err, "ElNegative_1_d0_err/D");
772 m_FourMuTree->Branch("ElNegative_1_vtx", &m_el_negative1_vtx, "ElNegative_1_vtx/I"); // vertex identifier
773
774 m_FourMuTree->Branch("ElNegative_2_Px", &m_el_negative2_px, "ElNegative_2_Px/D");
775 m_FourMuTree->Branch("ElNegative_2_Py", &m_el_negative2_py, "ElNegative_2_Py/D");
776 m_FourMuTree->Branch("ElNegative_2_Pz", &m_el_negative2_pz, "ElNegative_2_Pz/D");
777 m_FourMuTree->Branch("ElNegative_2_z0", &m_el_negative2_z0, "ElNegative_2_z0/D");
778 m_FourMuTree->Branch("ElNegative_2_d0", &m_el_negative2_d0, "ElNegative_2_d0/D");
779 m_FourMuTree->Branch("ElNegative_2_z0_err", &m_el_negative2_z0_err, "ElNegative_2_z0_err/D");
780 m_FourMuTree->Branch("ElNegative_2_d0_err", &m_el_negative2_d0_err, "ElNegative_2_d0_err/D");
781 m_FourMuTree->Branch("ElNegative_2_vtx", &m_el_negative2_vtx, "ElNegative_2_vtx/I"); // vertex identifier
782
783 m_FourMuTree->Branch("ElPositive_1_Px", &m_el_positive1_px, "ElPositive_1_Px/D");
784 m_FourMuTree->Branch("ElPositive_1_Py", &m_el_positive1_py, "ElPositive_1_Py/D");
785 m_FourMuTree->Branch("ElPositive_1_Pz", &m_el_positive1_pz, "ElPositive_1_Pz/D");
786 m_FourMuTree->Branch("ElPositive_1_z0", &m_el_positive1_z0, "ElPositive_1_z0/D");
787 m_FourMuTree->Branch("ElPositive_1_d0", &m_el_positive1_d0, "ElPositive_1_d0/D");
788 m_FourMuTree->Branch("ElPositive_1_z0_err", &m_el_positive1_z0_err, "ElPositive_1_z0_err/D");
789 m_FourMuTree->Branch("ElPositive_1_d0_err", &m_el_positive1_d0_err, "ElPositive_1_d0_err/D");
790 m_FourMuTree->Branch("ElPositive_1_vtx", &m_el_positive1_vtx, "ElPositive_1_vtx/I"); // vertex identifier
791
792 m_FourMuTree->Branch("ElPositive_2_Px", &m_el_positive2_px, "ElPositive_2_Px/D");
793 m_FourMuTree->Branch("ElPositive_2_Py", &m_el_positive2_py, "ElPositive_2_Py/D");
794 m_FourMuTree->Branch("ElPositive_2_Pz", &m_el_positive2_pz, "ElPositive_2_Pz/D");
795 m_FourMuTree->Branch("ElPositive_2_z0", &m_el_positive2_z0, "ElPositive_2_z0/D");
796 m_FourMuTree->Branch("ElPositive_2_d0", &m_el_positive2_d0, "ElPositive_2_d0/D");
797 m_FourMuTree->Branch("ElPositive_2_z0_err", &m_el_positive2_z0_err, "ElPositive_2_z0_err/D");
798 m_FourMuTree->Branch("ElPositive_2_d0_err", &m_el_positive2_d0_err, "ElPositive_2_d0_err/D");
799 m_FourMuTree->Branch("ElPositive_2_vtx", &m_el_positive2_vtx, "ElPositive_2_vtx/I"); // vertex identifier
800
801 // other quantities
802 m_FourMuTree->Branch("minv4mu", &m_4mu_minv, "minv4mu/D");
803 m_FourMuTree->Branch("pv_x", &m_pv_x , "pv_x/D");
804 m_FourMuTree->Branch("pv_y", &m_pv_y , "pv_y/D");
805 m_FourMuTree->Branch("pv_z", &m_pv_z , "pv_z/D");
806 m_FourMuTree->Branch("nTrkInVtx", &m_nTrkInVtx, "nTrkInVtx/I");
807
808 m_FourMuTree->Branch("met", &m_met, "met/D");
809 m_FourMuTree->Branch("metphi", &m_metphi, "metphi/D");
810 }
811
812 // now register the Trees
813 ATH_MSG_INFO("initialize() Going to register the mu+mu- trees");
814 ServiceHandle<ITHistSvc> tHistSvc("THistSvc", name());
815 if (tHistSvc.retrieve().isFailure()){
816 ATH_MSG_ERROR("initialize() Could not find Hist Service -> Switching ValidationMode Off !");
817 m_validationMode = false;
818 }
819
820 if (m_commonTree) {
821 if ((tHistSvc->regTree(m_commonTreeFolder, m_commonTree)).isSuccess() ) {
822 ATH_MSG_INFO("initialize() commonTree succesfully registered!");
823 }
824 else {
825 ATH_MSG_ERROR("initialize() Could not register the validation commonTree -> Switching ValidationMode Off !");
826 delete m_commonTree; m_commonTree = nullptr;
827 m_validationMode = false;
828 }
829 }
830
831 if (m_IDTree) {
832 if ((tHistSvc->regTree(m_IDTreeFolder, m_IDTree)).isSuccess() ) {
833 ATH_MSG_INFO("initialize() IDTree succesfully registered!");
834 }
835 else {
836 ATH_MSG_ERROR("initialize() Could not register the validation IDTree -> Switching ValidationMode Off !");
837 delete m_IDTree; m_IDTree = nullptr;
838 m_validationMode = false;
839 }
840 }
841
842 if ( m_skipMS ) {
843 ATH_MSG_INFO("CBtree has to be skipped: flag ON");
844 delete m_combTree; m_combTree = nullptr;
845 }
846 else {
847 if (m_combTree) {
848 if ((tHistSvc->regTree(m_combTreeFolder, m_combTree)).isSuccess() ) {
849 ATH_MSG_INFO("initialize() CBTree succesfully registered!");
850 }
851 else {
852 ATH_MSG_ERROR("initialize() Could not register the validation CBTree -> Switching ValidationMode Off !");
853 delete m_combTree; m_combTree = nullptr;
854 m_validationMode = false;
855 }
856 }
857 }
858
859 if ( m_skipMS ) {
860 ATH_MSG_INFO("MStree has to be skipped: flag ON");
861 delete m_MSTree; m_MSTree = nullptr;
862 }
863 else {
864 if (m_MSTree) {
865 if ( (tHistSvc->regTree(m_MSTreeFolder, m_MSTree)).isSuccess() ){
866 ATH_MSG_INFO("initialize() MSTree succesfully registered!");
867 }
868 else {
869 ATH_MSG_ERROR("initialize() Could not register the validation MSTree -> Switching ValidationMode Off !");
870 delete m_MSTree; m_MSTree = nullptr;
871 m_validationMode = false;
872 }
873 }
874 }
875
876 if( m_doRefit ){
877 if (m_refit1Tree) {
878 if ((tHistSvc->regTree(m_refit1TreeFolder, m_refit1Tree)).isSuccess() ) {
879 ATH_MSG_INFO("initialize() Refit1 Tree succesfully registered!");
880 }
881 else{
882 ATH_MSG_ERROR("initialize() Could not register the validation Tree -> Switching ValidationMode Off !");
883 delete m_refit1Tree; m_refit1Tree = nullptr;
884 m_validationMode = false;
885 }
886 }
887
888 if (m_refit2Tree) {
889 if ((tHistSvc->regTree(m_refit2TreeFolder, m_refit2Tree)).isSuccess() ) {
890 ATH_MSG_INFO("initialize() Refit2 Tree succesfully registered!");
891 }
892 else {
893 ATH_MSG_ERROR("initialize() Could not register the validation Tree -> Switching ValidationMode Off !");
894 delete m_refit2Tree; m_refit2Tree = nullptr;
895 m_validationMode = false;
896 }
897 }
898 }
899
900 if (m_isMC) {
901 if ((tHistSvc->regTree(m_truthTreeFolder, m_truthTree)).isSuccess() ) {
902 ATH_MSG_INFO("initialize() truthTree Tree succesfully registered!");
903 }
904 else {
905 ATH_MSG_ERROR("initialize() Could not register the validation truth Tree -> Switching ValidationMode Off !");
906 delete m_truthTree; m_truthTree = nullptr;
907 m_validationMode = false;
908 }
909 }
910
911 if (m_doFourMuAnalysis) {
912 if ((tHistSvc->regTree(m_FourMuTreeFolder, m_FourMuTree)).isSuccess() ) {
913 ATH_MSG_INFO("initialize() FourMu Tree succesfully registered!");
914 }
915 else {
916 ATH_MSG_ERROR("initialize() Could not register the validation FourMu Tree -> Switching ValidationMode Off !");
917 delete m_FourMuTree; m_FourMuTree = nullptr;
918 m_validationMode = false;
919 }
920 }
921
922 return StatusCode::SUCCESS;
923}
924
925
926//==================================================================================
928{
929 return;
930}
931
932
933//==================================================================================
934StatusCode IDPerfMonZmumu::execute(const EventContext& ctx)
935{
936 ATH_MSG_DEBUG("** IDPerfMonZmumu::execute ** START **");
937
940
941 if(eventInfo.isValid()) {
942 m_runNumber = eventInfo->runNumber();
943 m_evtNumber = eventInfo->eventNumber();
944 m_lumi_block = eventInfo->lumiBlock();
945 m_event_mu = eventInfo->actualInteractionsPerCrossing();
946 m_beamposX = beamSpotHandleRec->beamPos().x();
947 m_beamposY = beamSpotHandleRec->beamPos().y();
948
949 if (eventInfo->mcEventWeights().size()>0) {
950 m_event_weight = eventInfo->mcEventWeights()[0];
951 }
952 else {
953 m_event_weight = 1.; // default
954 }
955 ATH_MSG_DEBUG(" Execute() starting on --> Run: " << m_runNumber << " event: " << m_evtNumber << " Lumiblock: " << m_lumi_block << " weight:" << m_event_weight);
956 }
957 else {
958 ATH_MSG_DEBUG(" IDPerfMonZmumu::execute evtStore->retrieve (eventInfo) failed .. trying another strategy.. ");
960 if (eventInfo2.isValid()) {
961 m_runNumber = eventInfo2->runNumber();
962 m_evtNumber = eventInfo2->eventNumber();
963 m_lumi_block = eventInfo2->lumiBlock();
964 m_event_mu = eventInfo2->actualInteractionsPerCrossing();
965 if (eventInfo->mcEventWeights().size()>0) {
966 m_event_weight = eventInfo->mcEventWeights()[0];
967 }
968 else {
969 m_event_weight = 1.; // default
970 }
971 ATH_MSG_DEBUG(" Execute() starting on --> Run: " << m_runNumber << " event: " << m_evtNumber << " Lumiblock: " << m_lumi_block << " weight:" << m_event_weight);
972 }
973 else{
974 ATH_MSG_ERROR("** IDPerfMonZmumu::execute ** Could not retrieve event info.");
975 }
976 }
977
979 if (m_doFourMuAnalysis) {
980 ATH_MSG_DEBUG(" ** IDPerfMonZmumu::execute ** calling FourLeptonAnalysis()...");
981 StatusCode fourLeptAnaStatus = this->RunFourLeptonAnalysis();
982 if (fourLeptAnaStatus.isSuccess()) ATH_MSG_INFO (" ** IDPerfMonZmumu::execute ** RunFourLeptonAnalysis() SUCCESS -> found a new event");
983 }
985
986
987 // check if the muon-pair passed the resonance selection cuts:
988 ATH_MSG_DEBUG(" ** IDPerfMonZmumu::execute ** calling dimuon analysis m_xZmm.Reco()...");
989 if( m_xZmm.Reco( m_lumi_block ) ){
990 ATH_MSG_INFO( " Run: " << m_runNumber
991 << " event: " << m_evtNumber
992 << " Lumiblock: " << m_lumi_block
993 << " Invariant mass = " << m_xZmm.GetInvMass() << " GeV "
994 << " weight: " << m_event_weight
995 << " ** SUCCESS **");
996 }
997 else {
998 ATH_MSG_DEBUG( " Run: " << m_runNumber
999 << " event: " << m_evtNumber
1000 << " Lumiblock: " << m_lumi_block
1001 << " Failed dimuon reconstruction. m_xZmm.Reco() returned FALSE ");
1002 return StatusCode::SUCCESS;
1003 }
1004
1005 //
1006 // If this point is reached -> there is a good mu+mu- pair that stisfies all selection cuts
1007 //
1008
1009 if (m_UseTrigger) {
1010 StatusCode isTriggerPassed = CheckTriggerStatusAndPrescale ();
1011 if (isTriggerPassed == StatusCode::SUCCESS) {
1012 ATH_MSG_DEBUG("Trigger passed -> accept event");
1013 }
1014 else{
1015 ATH_MSG_DEBUG("Trigger Failed -> reject event --> leave event");
1016 return StatusCode::SUCCESS;
1017 }
1018 }
1019
1020 // std::cout << " ** IDPerfMonZmumu ** extracting muon_pos and muon_neg... " << std::endl;
1021 const xAOD::Muon* muon_pos = m_xZmm.getCombMuon(m_xZmm.getPosMuon(ZmumuEvent::CB));
1022 const xAOD::Muon* muon_neg = m_xZmm.getCombMuon(m_xZmm.getNegMuon(ZmumuEvent::CB));
1023
1024 const xAOD::TrackParticle* ppos_comb = nullptr; const xAOD::Vertex* ppos_comb_v = nullptr;
1025 const xAOD::TrackParticle* pneg_comb = nullptr; const xAOD::Vertex* pneg_comb_v = nullptr;
1026
1027 //To protect against failures of the estimation
1028 StatusCode success_pos = StatusCode::FAILURE;
1029 StatusCode success_neg = StatusCode::FAILURE;
1030
1031 if (muon_pos && muon_neg) { // if both combined muons exist and were sucessfully retrieved
1032 ATH_MSG_DEBUG("** IDPerfMonZmumu::execute ** combined muons exist ** retrieving their m_trackparticleName: " << m_trackParticleName.c_str());
1033 using enum xAOD::Muon::TrackParticleType;
1034 if (m_trackParticleName.find("InnerDetectorTrackParticles") != std::string::npos) {
1035 ATH_MSG_INFO("** IDPerfMonZmumu::execute ** Retrieving InnerDetectorTrackParticles of the accepted muons");
1036 ppos_comb = muon_pos->trackParticle(InnerDetectorTrackParticle);
1037 pneg_comb = muon_neg->trackParticle(InnerDetectorTrackParticle);
1038
1039 if (!ppos_comb || !pneg_comb) {
1040 ATH_MSG_WARNING("** IDPerfMonZmumu::execute ** InnerDetectorTrackParticles are requested but they are not present. Exiting event.");
1041 return StatusCode::SUCCESS;
1042 }
1043 } // InnerDetectorTrackParticles
1044 if (m_trackParticleName.find("CombinedTrackParticle") != std::string::npos) {
1045 //
1046 ATH_MSG_DEBUG("** IDPerfMonZmumu::execute ** Retrieving CombinedTrackParticles of the accepted muons");
1047 ppos_comb = muon_pos->trackParticle(CombinedTrackParticle);
1048 pneg_comb = muon_neg->trackParticle(CombinedTrackParticle);
1049
1050 if (!ppos_comb || !pneg_comb){
1051 ATH_MSG_WARNING( "** IDPerfMonZmumu::execute ** CombinedTrackParticles are requested but they are not present. Exiting event.");
1052 return StatusCode::SUCCESS;
1053 }
1054 } // combined tracks
1055
1056
1057 // double check
1058 if (ppos_comb && pneg_comb) {
1059 ATH_MSG_DEBUG("** IDPerfMonZmumu::execute ** successfull retrieval of muons as " << m_trackParticleName << ". ppos_comb & pneg_comb both exist");
1060 }
1061 else {
1062 ATH_MSG_WARNING("** IDPerfMonZmumu::execute ** problems retrieving muons as " << m_trackParticleName <<". ppos_comb or pneg_comb are not available");
1063 }
1064
1065
1066 // vertex
1068 for (const auto V : *vertices) {
1069 if (V->vertexType() == xAOD::VxType::VertexType::PriVtx) {
1070 // primaryVertex =V;
1071 ppos_comb_v = V;
1072 pneg_comb_v = V;
1073 break;
1074 }
1075 } // vertex
1076
1077 // before continuing check both particles have vertex
1078 if (!ppos_comb_v || !pneg_comb_v){
1079 ATH_MSG_WARNING( "Some or all of the requested particles have no vertex. Exiting event");
1080 return StatusCode::SUCCESS;
1081 }
1082 } // if (muon_pos && muon_neg)
1083 else { // this is the else of --> if (muon_pos && muon_neg)
1084 ATH_MSG_WARNING("** IDPerfMonZmumu::execute ** Could not find CombinedMuon pos/neg in event"
1085 << " Run: " << m_runNumber
1086 << " event: " << m_evtNumber
1087 << " Lumiblock: " << m_lumi_block );
1088 return StatusCode::SUCCESS;
1089 }
1090
1091 //
1092 // If this point is reached -> there is a good mu+mu- pair and the muons have been associated to a vertex
1093 // So, ntuple can be filled
1094 //
1095 if ( m_xZmm.AcceptEvent() ) {
1096 ATH_MSG_DEBUG("** IDPerfMonZmumu::execute ** Going to fill ntuples for Run: " << m_runNumber
1097 << " event: " << m_evtNumber
1098 << " Lumiblock: " << m_lumi_block
1099 << " Invariant mass = " << m_xZmm.GetInvMass() << " GeV ** some preliminaries are due though...");
1100
1102 // The track selection is applied to the InnerDetectorTrackParticle of the muons
1103 if ( !m_selTool->accept(muon_pos->trackParticle(xAOD::Muon::TrackParticleType::InnerDetectorTrackParticle)) ) {
1104 ATH_MSG_DEBUG("Exiting because the ID segment of muon_pos do not pass the TrackSelection");
1105 return StatusCode::SUCCESS;
1106 }
1107 if ( !m_selTool->accept(muon_neg->trackParticle(xAOD::Muon::TrackParticleType::InnerDetectorTrackParticle)) ) {
1108 ATH_MSG_DEBUG("Exiting because the ID segment of muon_neg do not pass the TrackSelection");
1109 return StatusCode::SUCCESS;
1110 }
1111 ATH_MSG_DEBUG("** IDPerfMonZmumu::execute ** Good news ** pos and neg muon->trackParticle(xAOD::Muon::TrackParticleType::InnerDetectorTrackParticle) pass the trackSelection :)");
1112 }
1113 else {
1114 ATH_MSG_DEBUG("** IDPerfMonZmumu::execute ** Track selection is not in use ");
1115 }
1116
1117 ATH_MSG_DEBUG("** IDPerfMonZmumu::execute ** >> before fill rec with default: " << m_trackParticleName << " tracks << ");
1118
1119 if (m_storeZmumuNtuple) {
1120 // reset vectors
1122
1123 // Fill Inner Detector Tree
1124 ATH_MSG_DEBUG("-- >> going to fill ID muons params << --");
1125 success_pos = FillRecParametersTP (muon_pos->trackParticle(xAOD::Muon::TrackParticleType::InnerDetectorTrackParticle),
1126 muon_pos->trackParticle(xAOD::Muon::TrackParticleType::InnerDetectorTrackParticle),
1127 muon_pos->trackParticle(xAOD::Muon::TrackParticleType::InnerDetectorTrackParticle)->charge(),
1128 ppos_comb_v, ctx);
1129 success_neg = FillRecParametersTP (muon_neg->trackParticle(xAOD::Muon::TrackParticleType::InnerDetectorTrackParticle),
1130 muon_neg->trackParticle(xAOD::Muon::TrackParticleType::InnerDetectorTrackParticle),
1131 muon_neg->trackParticle(xAOD::Muon::TrackParticleType::InnerDetectorTrackParticle)->charge(),
1132 pneg_comb_v, ctx);
1133
1134 if (success_pos && success_neg) {
1135 // before filling the ntuple, extract the hits information. This is filled once and it is used for all track collections
1136 this->ExtractIDHitsInformation(muon_pos, muon_neg);
1137
1138 // Fill ntuple
1139 if (m_IDTree != nullptr) {
1140 ATH_MSG_DEBUG("-- Filling m_IDTree ntuple " << m_IDTree->GetName() << " entry " << m_IDTree->GetEntries()
1141 << " for run: " << m_runNumber
1142 << " event: " << m_evtNumber
1143 << " Lumiblock: " << m_lumi_block
1144 << " Invariant mass = " << m_xZmm.GetInvMass() << " GeV ");
1145 }
1146 ATH_MSG_DEBUG("mu+ --> pxyz " << m_positive_px
1147 << ", " << m_positive_py
1148 << ", " << m_positive_pz
1149 << " pt: " << muon_pos->trackParticle(xAOD::Muon::TrackParticleType::InnerDetectorTrackParticle)->pt()
1150 << " d0: " << m_positive_d0
1151 << " z0: " << m_positive_z0
1152 << " d0unc: " << m_positive_d0_err
1153 << " sigma_pt: " << m_positive_sigma_pt);
1154 ATH_MSG_DEBUG("mu- --> pxyz: " << m_negative_px
1155 << ", " << m_negative_py
1156 << ", " << m_negative_pz
1157 << " pt: " << muon_neg->trackParticle(xAOD::Muon::TrackParticleType::InnerDetectorTrackParticle)->pt()
1158 << " d0: " << m_negative_d0
1159 << " z0: " << m_negative_z0
1160 << " d0unc: " << m_negative_d0_err
1161 << " sigma_pt: " << m_negative_sigma_pt);
1162 // ntuple variables have been filled in FillRecParametersTP
1163 if (m_IDTree) m_IDTree->Fill();
1164
1165 // Fill vectors for common ntuple
1166 m_IDTrack_pt.push_back(m_positive_pt);
1167 m_IDTrack_pt.push_back(m_negative_pt);
1168 m_IDTrack_eta.push_back(m_positive_eta);
1169 m_IDTrack_eta.push_back(m_negative_eta);
1170 m_IDTrack_phi.push_back(m_positive_phi);
1171 m_IDTrack_phi.push_back(m_negative_phi);
1172 m_IDTrack_d0.push_back(m_positive_d0);
1173 m_IDTrack_d0.push_back(m_negative_d0);
1174 m_IDTrack_z0.push_back(m_positive_z0);
1175 m_IDTrack_z0.push_back(m_negative_z0);
1178
1187 }
1188 else {
1189 ATH_MSG_DEBUG("** IDPerfMonZmumu::execute ** not filling IDTracks in combTree due to problems with muon_xxx->trackParticle(xAOD::Muon::TrackParticleType::InnerDetectorTrackParticle)");
1190 }
1191 // End of fill ID Tree
1192
1193 //
1194 // combined muons ntuple
1195 if ((!m_skipMS && m_combTree) || m_commonTree ) { // if skipMS -> no combined muons
1196 success_pos = FillRecParametersTP(muon_pos->trackParticle(xAOD::Muon::TrackParticleType::CombinedTrackParticle),
1197 muon_pos->trackParticle(xAOD::Muon::TrackParticleType::InnerDetectorTrackParticle),
1198 ppos_comb->charge(),
1199 ppos_comb_v, ctx);
1200 ATH_MSG_DEBUG("** IDPerfMonZmumu::execute ** success_pos TP pt: " << m_positive_pt << " GeV");
1201 success_neg = FillRecParametersTP(muon_neg->trackParticle(xAOD::Muon::TrackParticleType::CombinedTrackParticle),
1202 muon_neg->trackParticle(xAOD::Muon::TrackParticleType::InnerDetectorTrackParticle),
1203 pneg_comb->charge(),
1204 pneg_comb_v, ctx);
1205 ATH_MSG_DEBUG("** IDPerfMonZmumu::excute ** success_neg TP pt: " << m_negative_pt << " GeV");
1206
1207 if (success_pos && success_neg) {
1208 if (m_combTree != nullptr) {
1209 ATH_MSG_DEBUG("-- Filling m_combTree ntuple " << m_combTree->GetName() << " entry " << m_combTree->GetEntries()
1210 << " run: " << m_runNumber
1211 << " event: " << m_evtNumber
1212 << " Lumiblock: " << m_lumi_block
1213 << " Invariant mass = " << m_xZmm.GetInvMass() << " GeV ");
1214 }
1215 ATH_MSG_DEBUG("mu+ --> pxyz " << m_positive_px
1216 << ", " << m_positive_py
1217 << ", " << m_positive_pz
1218 << " pt: " << m_positive_pt
1219 << " d0: " << m_positive_d0
1220 << " z0: " << m_positive_z0
1221 << " d0unc: " << m_positive_d0_err);
1222 ATH_MSG_DEBUG("mu- --> pxyz: " << m_negative_px
1223 << ", " << m_negative_py
1224 << ", " << m_negative_pz
1225 << " pt: " << m_negative_pt
1226 << " d0: " << m_negative_d0
1227 << " z0: " << m_negative_z0
1228 << " d0unc: " << m_negative_d0_err);
1229 // ntuple variables have been filled in FillRecParameters
1230 if (m_combTree) m_combTree->Fill();
1231 }
1232 // Fill vectors for common ntuple
1233 m_CBTrack_pt.push_back(m_positive_pt);
1234 m_CBTrack_pt.push_back(m_negative_pt);
1235 m_CBTrack_eta.push_back(m_positive_eta);
1236 m_CBTrack_eta.push_back(m_negative_eta);
1237 m_CBTrack_phi.push_back(m_positive_phi);
1238 m_CBTrack_phi.push_back(m_negative_phi);
1239 m_CBTrack_d0.push_back(m_positive_d0);
1240 m_CBTrack_d0.push_back(m_negative_d0);
1241 m_CBTrack_z0.push_back(m_positive_z0);
1242 m_CBTrack_z0.push_back(m_negative_z0);
1245
1254 } // if skipMS -> no combined muons
1255
1256
1257
1258 // MS ntuple
1259 if (!m_skipMS && m_MSTree) { // if skipMS -> no MS tracks
1260 ATH_MSG_DEBUG("-- >> going to fill MS muons params << --");
1261 success_pos = FillRecParametersTP(m_xZmm.getMSTrack(m_xZmm.getPosMuon(ZmumuEvent::CB)),
1262 muon_pos->trackParticle(xAOD::Muon::TrackParticleType::InnerDetectorTrackParticle),
1263 ppos_comb->charge(),
1264 ppos_comb_v, ctx);
1265
1266 success_neg = FillRecParametersTP(m_xZmm.getMSTrack(m_xZmm.getNegMuon(ZmumuEvent::CB)),
1267 muon_neg->trackParticle(xAOD::Muon::TrackParticleType::InnerDetectorTrackParticle),
1268 pneg_comb->charge(),
1269 pneg_comb_v, ctx);
1270 if (success_pos && success_neg) {
1271 if (m_MSTree != nullptr) ATH_MSG_DEBUG("-- Filling m_MSTree " << m_MSTree->GetName() << " entry " << m_MSTree->GetEntries()
1272 << " run: " << m_runNumber
1273 << " event: " << m_evtNumber
1274 << " Lumiblock: " << m_lumi_block
1275 << " Invariant mass = " << m_xZmm.GetInvMass() << " GeV ");
1276 ATH_MSG_DEBUG("mu+ --> pxyz " << m_positive_px
1277 << ", " << m_positive_py
1278 << " pt: " << m_xZmm.getMSTrack(m_xZmm.getPosMuon(ZmumuEvent::CB))->pt()
1279 << " d0: " << m_positive_d0
1280 << " z0: " << m_positive_z0
1281 << " d0unc: " << m_positive_d0_err);
1282 ATH_MSG_DEBUG("mu- --> pxyz: " << m_negative_px
1283 << ", " << m_negative_py
1284 << " pt: " << m_xZmm.getMSTrack(m_xZmm.getNegMuon(ZmumuEvent::CB))->pt()
1285 << " d0: " << m_negative_d0
1286 << " z0: " << m_negative_z0
1287 << " d0unc: " << m_negative_d0_err);
1288 // ntuple variables have been filled in FillRecParametersTP
1289 if (m_MSTree) m_MSTree->Fill();
1290 }
1291 else {
1292 ATH_MSG_INFO("FAILED filling m_MSTree "
1293 << " for run: " << m_runNumber
1294 << " event: " << m_evtNumber
1295 << " Lumiblock: " << m_lumi_block);
1296 }
1297 // MS ntuple
1298 }
1299 } // if store Zmumu ntuple
1300
1301 // changed refitting to combined particles since run II DESDM_ZMUMU did not store InDetTrackParticles
1302 if( m_doRefit ) {
1303 ATH_MSG_DEBUG("** IDPerfMonZmumu::execute ** Going to build TrackCollections: muonTrks, muonTrksRefit1 and muonTrksRefit2");
1305 TrackCollection* muonTrksRefit1 = new TrackCollection(SG::OWN_ELEMENTS);
1306 TrackCollection* muonTrksRefit2 = new TrackCollection(SG::OWN_ELEMENTS);
1307
1308 ATH_MSG_DEBUG("** IDPerfMonZmumu::execute ** Going to refit and store the track parameters ");
1309 Trk::Track* defaultMuonTrk1{};
1310 Trk::Track* defaultMuonTrk2{};
1311 Trk::Track* refit1MuonTrk1{};
1312 Trk::Track* refit2MuonTrk1{};
1313 Trk::Track* refit1MuonTrk2{};
1314 Trk::Track* refit2MuonTrk2{};
1315
1316 StatusCode fitStatus;
1317 //save default and refit track parameters
1318 if( ppos_comb->track() ) {
1319 defaultMuonTrk1 = new Trk::Track(*ppos_comb->track());
1320
1322 fitStatus = m_TrackRefitter1->refitTrack( ctx, ppos_comb->track(), fitResult );
1323 if (fitStatus.isFailure()) {
1324 ATH_MSG_DEBUG("** IDPerfMonZmumu::execute ** Track Refit1 Failed for ppos_comb->track(). Skipping Event");
1325 return StatusCode::SUCCESS;
1326 } else {
1327 refit1MuonTrk1 = fitResult.refittedTrack.release();
1328 muonTrksRefit1->push_back(refit1MuonTrk1);
1329 ATH_MSG_DEBUG("** IDPerfMonZmumu::execute ** Track Refit1 Success of ppos_comb->track()."
1330 << " Original pt: " << ppos_comb->track()->perigeeParameters()->pT()
1331 << " track refit pt: " << refit1MuonTrk1->perigeeParameters()->pT() );
1332 }
1333
1334
1335 fitStatus = m_TrackRefitter2->refitTrack( ctx, ppos_comb->track(), fitResult );
1336 if (fitStatus.isFailure()) {
1337 ATH_MSG_DEBUG("** IDPerfMonZmumu::execute ** Track Refit2 Failed for ppos_comb->track(). Skipping Event");
1338 return StatusCode::SUCCESS;
1339 } else {
1340 refit2MuonTrk1 = fitResult.refittedTrack.release();
1341 muonTrksRefit2->push_back(refit2MuonTrk1);
1342 ATH_MSG_DEBUG("** IDPerfMonZmumu::execute ** Track Refit2 Success of ppos_comb->track()."
1343 << " Original pt: " << ppos_comb->track()->perigeeParameters()->pT()
1344 << " track refit pt: " << refit1MuonTrk1->perigeeParameters()->pT() );
1345 }
1346 }
1347
1348 if( pneg_comb->track() ) {
1349 defaultMuonTrk2 = new Trk::Track(*pneg_comb->track());
1350
1351 IegammaTrkRefitterTool::Cache fitResult {};
1352 fitStatus = m_TrackRefitter1->refitTrack( ctx, pneg_comb->track(), fitResult);
1353 if (fitStatus.isFailure()) {
1354 ATH_MSG_DEBUG("** IDPerfMonZmumu::execute ** Track Refit1 Failed. Skipping Event");
1355 return StatusCode::SUCCESS;
1356 } else {
1357 refit1MuonTrk2 = fitResult.refittedTrack.release();
1358 muonTrksRefit1->push_back(refit1MuonTrk2);
1359 ATH_MSG_DEBUG("** IDPerfMonZmumu::execute ** Track Refit1 Success of pneg_comb->track()."
1360 << " Original pt: " << pneg_comb->track()->perigeeParameters()->pT()
1361 << " track refit pt: " << refit1MuonTrk2->perigeeParameters()->pT() );
1362 }
1363
1364
1365 fitStatus = m_TrackRefitter2->refitTrack( ctx, pneg_comb->track(), fitResult );
1366 if (fitStatus.isFailure()) {
1367 ATH_MSG_DEBUG("Track Refit2 Failed. Skipping Event");
1368 return StatusCode::SUCCESS;
1369 } else {
1370 refit2MuonTrk2 = fitResult.refittedTrack.release();
1371 muonTrksRefit2->push_back(refit2MuonTrk2);
1372 ATH_MSG_DEBUG("** IDPerfMonZmumu::execute ** Track Refit2 Success of pneg_comb->track()."
1373 << " Original pt: " << pneg_comb->track()->perigeeParameters()->pT()
1374 << " track refit pt: " << refit2MuonTrk2->perigeeParameters()->pT() );
1375 }
1376
1377 if (muonTrksRefit1->size() != 2) ATH_MSG_WARNING("** IDPerfMonZmumu::execute ** WARNING ** size of muonTrksRefit1: " << muonTrksRefit1->size());
1378 if (muonTrksRefit2->size() != 2) ATH_MSG_WARNING("** IDPerfMonZmumu::execute ** WARNING ** size of muonTrksRefit2: " << muonTrksRefit2->size());
1379 }
1380
1381 //save tracks to storegrate, they can be used by InDetAlignmentMonitoring
1382 muonTrks->push_back(defaultMuonTrk1);
1383 muonTrks->push_back(defaultMuonTrk2);
1384
1385 StatusCode sc = evtStore()->record(muonTrks, m_outputTracksName);
1386 if (sc.isSuccess()) {
1387 ATH_MSG_DEBUG ("Stored "<< muonTrks->size() << " " << m_outputTracksName <<" into StoreGate");
1388 }
1389 else{
1390 ATH_MSG_WARNING ("Failed storing " << m_outputTracksName);
1391 }
1392
1393 if (muonTrksRefit1->size() > 1) { // keep track collection if at least 2 muons were found
1394 sc = evtStore()->record(muonTrksRefit1, m_outputTracksName + "Refit1");
1395 if (sc.isSuccess()) {
1396 ATH_MSG_DEBUG ("Stored "<< muonTrksRefit1->size() << " " << m_outputTracksName + "Refit1" << " into StoreGate");
1397 } else {
1398 ATH_MSG_WARNING ("Failed storing " << m_outputTracksName + "Refit1");
1399 }
1400 }
1401
1402 if (muonTrksRefit2->size() > 1) { // keep track collection if at least 2 muons were found
1403 sc = evtStore()->record(muonTrksRefit2, m_outputTracksName + "Refit2");
1404 if (sc.isSuccess()) {
1405 ATH_MSG_DEBUG ("Stored "<< muonTrksRefit2->size() << " " << m_outputTracksName + "Refit2" << " into StoreGate");
1406 } else {
1407 ATH_MSG_WARNING ("Failed storing " << m_outputTracksName + "Refit2");
1408 }
1409 }
1410
1411
1412 //fill refit1 ID parameters
1413 if (muonTrksRefit1->size()<2) {
1414 ATH_MSG_WARNING("** IDPerfMonZmumu::execute ** Refit1 muon tracks are missing!");
1415 }
1416 else {
1417 ATH_MSG_DEBUG("** IDPerfMonZmumu::execute ** going to fill refit1tree ");
1418 success_pos = FillRecParametersSimple (refit1MuonTrk1, ppos_comb->charge(), ppos_comb_v, ctx);
1419 success_neg = FillRecParametersSimple (refit1MuonTrk2, pneg_comb->charge(), pneg_comb_v, ctx);
1420
1421 if (m_storeZmumuNtuple) {
1422 if (success_pos && success_neg) {
1423 if (m_refit1Tree) {
1424 ATH_MSG_DEBUG("-- Filling ntuple " << m_refit1Tree->GetName() << " entry " << m_refit1Tree->GetEntries()
1425 << " for run: " << m_runNumber
1426 << " event: " << m_evtNumber
1427 << " Lumiblock: " << m_lumi_block
1428 << " Invariant mass = " << m_xZmm.GetInvMass() << " GeV ");
1429 }
1430 ATH_MSG_DEBUG("Negative p: (" << m_negative_px << ", "
1431 << m_negative_py << ", "
1432 << m_negative_pz << ") "
1433 << " d0: " << m_negative_d0
1434 << " z0: " << m_negative_z0
1435 << " sigma_pt: " << m_positive_sigma_pt);
1436 ATH_MSG_DEBUG("Positive p: (" << m_positive_px << ","
1437 << m_positive_py << ","
1438 << m_positive_pz << ") "
1439 << " d0: " << m_positive_d0
1440 << " z0: " << m_positive_z0
1441 << " sigma_pt: " << m_negative_sigma_pt);
1442 if (m_refit1Tree) {
1443 m_refit1Tree->Fill();
1444 }
1445 // Fill vectors for common ntuple
1446 m_Refit1_pt.push_back(m_positive_pt);
1447 m_Refit1_pt.push_back(m_negative_pt);
1448 m_Refit1_eta.push_back(m_positive_eta);
1449 m_Refit1_eta.push_back(m_negative_eta);
1450 m_Refit1_phi.push_back(m_positive_phi);
1451 m_Refit1_phi.push_back(m_negative_phi);
1452 m_Refit1_d0.push_back(m_positive_d0);
1453 m_Refit1_d0.push_back(m_negative_d0);
1454 m_Refit1_z0.push_back(m_positive_z0);
1455 m_Refit1_z0.push_back(m_negative_z0);
1456
1463 } // if (success_pos && success_neg)
1464 } // if (m_storeZmumuNtuple)
1465 } // enough refit1 tracks
1466
1467 //fill refit2 ID parameters
1468 if (muonTrksRefit2->size()<2) {
1469 ATH_MSG_WARNING("** IDPerfMonZmumu::execute ** Refit2 muon tracks are missing!");
1470 }
1471 else{
1472 ATH_MSG_DEBUG("-- >> going to fill refit2params << --");
1473 success_pos = FillRecParametersSimple (refit2MuonTrk1, ppos_comb->charge(), ppos_comb_v, ctx);
1474 success_neg = FillRecParametersSimple (refit2MuonTrk2, pneg_comb->charge(), pneg_comb_v, ctx);
1475
1476 if (m_storeZmumuNtuple) {
1477 if (success_pos && success_neg) {
1478 if (m_refit2Tree) {
1479 ATH_MSG_DEBUG("-- Filling " << m_refit2Tree->GetName() << " entry " << m_refit2Tree->GetEntries()
1480 << " run: " << m_runNumber
1481 << " event: " << m_evtNumber
1482 << " Lumiblock: " << m_lumi_block
1483 << " Invariant mass = " << m_xZmm.GetInvMass() << " GeV ");
1484 }
1485 ATH_MSG_DEBUG("Negative p: (" << m_negative_px << ", "
1486 << m_negative_py << ", "
1487 << m_negative_pz << ") "
1488 << " d0: " << m_negative_d0
1489 << " z0: " << m_negative_z0
1490 << " sigma_pt: " << m_positive_sigma_pt);
1491 ATH_MSG_DEBUG("Positive p: (" << m_positive_px << ","
1492 << m_positive_py << ","
1493 << m_positive_pz << ") "
1494 << " d0: " << m_positive_d0
1495 << " z0: " << m_positive_z0
1496 << " sigma_pt: " << m_negative_sigma_pt);
1497 if (m_refit2Tree) {
1498 m_refit2Tree->Fill();
1499 }
1500 // Fill vectors for common ntuple
1501 m_Refit2_pt.push_back(m_positive_pt);
1502 m_Refit2_pt.push_back(m_negative_pt);
1503 m_Refit2_eta.push_back(m_positive_eta);
1504 m_Refit2_eta.push_back(m_negative_eta);
1505 m_Refit2_phi.push_back(m_positive_phi);
1506 m_Refit2_phi.push_back(m_negative_phi);
1507 m_Refit2_d0.push_back(m_positive_d0);
1508 m_Refit2_d0.push_back(m_negative_d0);
1509 m_Refit2_z0.push_back(m_positive_z0);
1510 m_Refit2_z0.push_back(m_negative_z0);
1511
1518 } // if (success_pos && success_neg)
1519 } // if (m_storeZmumuNtuple)
1520 } // enough refit2 tracks
1521
1522 ATH_MSG_DEBUG("Execute() All NTUPLES filled Run: " << m_runNumber << " event: " << m_evtNumber << " mass: " << m_xZmm.GetInvMass() << " GeV ");
1523 }
1524 } // closing -> if ( m_xZmm.AcceptEvent() )
1525
1526 if ( !m_xZmm.AcceptEvent() ) {
1527 // no good muon pair found
1528 //failed cuts, continue to next event
1529 ATH_MSG_DEBUG ("** IDPerfMonZmumu::execute ** No good muon pair found. Leaving Execute(). Run: " << m_runNumber << " event: " << m_evtNumber);
1530 return StatusCode::SUCCESS;
1531 }
1532
1533 //
1534 // fill truth event iformation even when the reco event has not passed
1535 //
1536 if (m_isMC) {
1537 bool truthStatusIsGood = true;
1538 if (FillTruthParameters(ppos_comb, ctx).isFailure()){
1539 truthStatusIsGood = false;
1540 ATH_MSG_WARNING("Failed to fill truth parameters - skipping event");
1541 }
1542 if (FillTruthParameters(pneg_comb, ctx).isFailure()){
1543 truthStatusIsGood = false;
1544 ATH_MSG_WARNING("Failed to fill truth parameters - skipping event");
1545 }
1546 if (truthStatusIsGood) {
1547 ATH_MSG_DEBUG ("-- Filling " << m_truthTree->GetName() << " entry " << m_truthTree->GetEntries()
1548 << " run: " << m_runNumber
1549 << " event: " << m_evtNumber
1550 << " Lumiblock: " << m_lumi_block
1551 << " Invariant mass = " << m_xZmm.GetInvMass() << " GeV ");
1552 ATH_MSG_DEBUG ("Negative p: (" << m_negative_px << ", "
1553 << m_negative_py << ", "
1554 << m_negative_pz << ") "
1555 << " d0: " << m_negative_d0
1556 << " z0: " << m_negative_z0
1557 << " parent: " << m_negative_parent);
1558 ATH_MSG_DEBUG ("Positive p: (" << m_positive_px << ","
1559 << m_positive_py << ","
1560 << m_positive_pz << ") "
1561 << " d0: " << m_positive_d0
1562 << " z0: " << m_positive_z0
1563 << " parent: " << m_positive_parent);
1564
1566 m_Truth_pt.push_back(m_positive_pt);
1567 m_Truth_pt.push_back(m_negative_pt);
1568 m_Truth_eta.push_back(m_positive_eta);
1569 m_Truth_eta.push_back(m_negative_eta);
1570 m_Truth_phi.push_back(m_positive_phi);
1571 m_Truth_phi.push_back(m_negative_phi);
1572 m_Truth_d0.push_back(m_positive_d0);
1573 m_Truth_d0.push_back(m_negative_d0);
1574 m_Truth_z0.push_back(m_positive_z0);
1575 m_Truth_z0.push_back(m_negative_z0);
1580
1581 } // truth info properly filled
1582 else {
1583 ATH_MSG_DEBUG("FAILED filling m_truthTree "
1584 << " for run: " << m_runNumber
1585 << " event: " << m_evtNumber
1586 << " Lumiblock: " << m_lumi_block);
1587 }
1588 } // if (m_isMC)
1589
1590 // fill common tree
1591 if (m_commonTree ) {
1592 // fill ntuple if some of the collections is filled
1593 bool dofill = false;
1594 if (m_IDTrack_pt.size() >= 2) dofill = true;
1595 if (m_CBTrack_pt.size() >= 2) dofill = true;
1596 if (m_Refit1_pt.size() >= 2) dofill = true;
1597 if (m_Refit2_pt.size() >= 2) dofill = true;
1598 if (m_Truth_pt.size() >= 2) dofill = true;
1599
1600 if (dofill) {
1601 ATH_MSG_DEBUG("-- Filling m_commonTree " << m_commonTree->GetName() << " entry " << m_commonTree->GetEntries()
1602 << " run: " << m_runNumber
1603 << " event: " << m_evtNumber
1604 << " Lumiblock: " << m_lumi_block
1605 << " Invariant mass = " << m_xZmm.GetInvMass() << " GeV ");
1606 m_commonTree->Fill();
1607 }
1608 else {
1609 ATH_MSG_DEBUG("-- Filling m_commonTree " << m_commonTree->GetName() << " FAILED for "
1610 << " run: " << m_runNumber
1611 << " event: " << m_evtNumber
1612 << " Lumiblock: " << m_lumi_block);
1613 }
1614 }
1615
1616 ATH_MSG_DEBUG(" --IDPerfMonZmumu::execute-- event completed -- Run: " << m_runNumber << " event: " << m_evtNumber);
1617
1618 /* ***********************************************************
1619 * after all, let's make the collection for ALL MUON ID Tracks
1620 * ***********************************************************/
1621
1622 ATH_MSG_DEBUG("IDTracks monitoring..");
1623 int nTracks = 0;
1625
1626 // DIFFERENT RETRIEVAL
1628 if(muons){
1629 for (auto muon : *muons) {
1630 const xAOD::TrackParticle* tp = muon->trackParticle(xAOD::Muon::TrackParticleType::InnerDetectorTrackParticle);
1631 if(!tp) {
1632 ATH_MSG_DEBUG(" - tpb = "<< tp << " -> is null? " << (!tp));
1633 continue;
1634 }
1635 const Trk::Track* t = tp->track();
1636 if ( !t ) {
1637 ATH_MSG_DEBUG(" - tpb does not have track ");
1638 continue;
1639 }
1640 const Trk::Perigee* tPerigee = t->perigeeParameters() ;
1641 if ( !tPerigee ) {
1642 ATH_MSG_DEBUG(" - t does not have perigree ");
1643 continue;
1644 }
1645 IDTracks->push_back ( new Trk::Track (*t));
1646 nTracks++;
1647 }
1648 }
1649 else ATH_MSG_WARNING ("Could not retrieve Muon container");
1650
1651 ATH_MSG_DEBUG(" --> nTracks = " << nTracks);
1652
1653 StatusCode scid = evtStore()->record(IDTracks, "IDTracks");
1654 if (scid.isSuccess()) {
1655 ATH_MSG_DEBUG ("Stored "<< IDTracks->size() << " IDTracks into StoreGate");
1656 }
1657 else{
1658 ATH_MSG_WARNING ("Failed storing IDTracks");
1659 }
1660
1661 /*********************************************************
1662 * ..finish
1663 ********************************************************/
1664
1665 return StatusCode::SUCCESS;
1666}
1667
1668//==================================================================================
1670 const xAOD::TrackParticle* trackp_for_unbias,
1671 double charge,
1672 const xAOD::Vertex* vertex,
1673 const EventContext& ctx)
1674{
1675 if (!trackp){
1676 //ATH_MSG_WARNING("Empty Trackparticle. Skipping.");
1677 return StatusCode::FAILURE;
1678 }
1679
1680 if (m_doRemoval && !trackp_for_unbias && !m_skipMS){
1681 return StatusCode::FAILURE;
1682 }
1683
1684 double px = 0;
1685 double py = 0;
1686 double pt = 0;
1687 double pz = 0;
1688 double phi= 0;
1689 double eta= 0;
1690 double d0 = 0;
1691 double z0 = 0;
1692 double d0res = 0;
1693 double z0res = 0;
1694 double PVd0res = 0;
1695 double PVz0res = 0;
1696 double PVd0 = 0;
1697 double PVz0 = 0;
1698 double sigma_pt = 0;
1699 double qoverp = 0;
1700 double sigma_qOverP = 1.; // use a large value by default as 0 is meaningless
1701
1702
1703 px = trackp->p4().Px();
1704 py = trackp->p4().Py();
1705 pt = trackp->p4().Pt();
1706 pz = trackp->p4().Pz();
1707 phi= trackp->p4().Phi();
1708 eta= trackp->p4().Eta();
1709 d0 = trackp->d0();
1710 z0 = trackp->z0();
1711 qoverp = trackp->qOverP();
1712
1713 d0res = std::sqrt(trackp->definingParametersCovMatrix()(Trk::d0,Trk::d0));
1714 z0res = std::sqrt(trackp->definingParametersCovMatrix()(Trk::z0,Trk::z0));
1715 sigma_qOverP = std::sqrt(trackp->definingParametersCovMatrix()(Trk::qOverP,Trk::qOverP));
1716 double sigma_theta = std::sqrt(trackp->definingParametersCovMatrix()(Trk::theta,Trk::theta));
1717
1718 // computing sigma_pt
1719 // pt = sin(theta) / qOverP --> sigma(pt) = (sin(theta)/ qOverP^2) x sigma(qOverP) // neglecting sigma(sin(theta))
1720 double sigma_pt_term1 = (sin(trackp->theta()) / pow(qoverp,2)) * sigma_qOverP;
1721 double sigma_pt_term2 = (1./qoverp) * cos(trackp->theta()) * sigma_theta;
1722 double sigma_pt_term3 = (cos(trackp->theta()) / pow(qoverp,2)) * sigma_theta * sigma_qOverP;
1723 sigma_pt = sqrt( pow(sigma_pt_term1,2) + pow(sigma_pt_term2,2) + 2 * sigma_pt_term3 * trackp->definingParametersCovMatrix()(Trk::qOverP,Trk::theta));
1724
1725 //
1726 if (vertex == nullptr) {
1727 ATH_MSG_WARNING("in FillRecParametersTP. WARNING: Vertex is NULL");
1728 return StatusCode::FAILURE;
1729 }
1731 ATH_MSG_WARNING("in FillRecParametersTP. WARNING: m_trackToVertexIPEstimator is NULL");
1732 return StatusCode::FAILURE;
1733 }
1734
1735 if (m_doIP && vertex != nullptr && m_trackToVertexIPEstimator){
1736 std::unique_ptr<Trk::ImpactParametersAndSigma> iPandSigma(nullptr);
1737 ATH_MSG_DEBUG("-- using the trackToVertexIPEstimator --");
1738 //Calling the estimate(trackp,newtrackp,vertex,doRemoval)
1739 //The first track is used to unbias the vertex, the second to get the extrapolation
1740 if (!m_skipMS) iPandSigma = m_trackToVertexIPEstimator->estimate(ctx, trackp_for_unbias, trackp, vertex, m_doRemoval);
1741 else iPandSigma = m_trackToVertexIPEstimator->estimate(ctx, trackp, vertex);
1742 ATH_MSG_DEBUG("return from the trackToVertexIPEstimator->estimate()");
1743
1744 if( !iPandSigma ){
1745 ATH_MSG_WARNING ("FillRecParametersTP::trackToVertexIPEstimator failed !");
1746 return StatusCode::FAILURE;
1747 }
1748 else{
1749 ATH_MSG_DEBUG("FillRecParametersTP::trackToVertexIPEstimator success !");
1750 PVd0 = iPandSigma->IPd0;
1751 PVd0res = iPandSigma->PVsigmad0;
1752 d0res = iPandSigma->sigmad0;
1753 PVz0 = iPandSigma->IPz0;
1754 PVz0res = iPandSigma->PVsigmaz0;
1755 z0res = iPandSigma->sigmaz0;
1756 }
1757 }
1758
1759 if (charge == 1) {
1760 m_positive_px = px;
1761 m_positive_py = py;
1762 m_positive_pt = pt;
1763 m_positive_pz = pz;
1766 m_positive_z0 = z0;
1767 m_positive_z0_err = z0res;
1768 m_positive_d0 = d0;
1769 m_positive_d0_err = d0res;
1770 m_positive_sigma_pt = sigma_pt;
1771 m_positive_qoverp = qoverp;
1772 m_positive_sigma_qoverp = sigma_qOverP;
1773 if(m_doIP){
1774 m_positive_z0_PV = PVz0;
1775 m_positive_d0_PV = PVd0;
1776 m_positive_z0_PVerr = PVz0res;
1777 m_positive_d0_PVerr = PVd0res;
1778 }
1779 ATH_MSG_DEBUG("(Filled charge == 1 ) (reco)-> px : "<< px <<" py: "<<py <<" pt: "<<pt <<" pz: "<<pz
1780 <<" d0: "<<m_positive_d0 << " d0res : "<< d0res << " PVd0res : "<< PVd0res <<" z0: "<< m_positive_z0 << " z0res : " << z0res << " PVz0res : "<< PVz0res );
1781
1782 } else if (charge == -1) {
1783 m_negative_px = px;
1784 m_negative_py = py;
1785 m_negative_pt = pt;
1786 m_negative_pz = pz;
1789 m_negative_z0 = z0;
1790 m_negative_z0_err = z0res;
1791 m_negative_d0 = d0;
1792 m_negative_d0_err = d0res;
1793 m_negative_sigma_pt = sigma_pt;
1794 m_negative_qoverp = qoverp;
1795 m_negative_sigma_qoverp = sigma_qOverP;
1796 if(m_doIP){
1797 m_negative_z0_PV = PVz0;
1798 m_negative_d0_PV = PVd0;
1799 m_negative_z0_PVerr = PVz0res;
1800 m_negative_d0_PVerr = PVd0res;
1801 }
1802 ATH_MSG_DEBUG("(Filled charge == -1 ) (reco)-> px : "<< px <<" py: "<< py <<" pt: " << pt <<" pz: "<<pz
1803 <<" d0: "<<m_negative_d0 << " d0res : "<< d0res << " PVd0res : "<< PVd0res <<" z0: "<< m_negative_z0 << " z0res : " << z0res << " PVz0res : "<< PVz0res );
1804 }
1805
1806 return StatusCode::SUCCESS;
1807}
1808
1809
1810//==================================================================================
1811StatusCode IDPerfMonZmumu::FillRecParameters (const Trk::Track* track, const xAOD::TrackParticle* trackp_for_unbias, double charge,const xAOD::Vertex* vertex, const EventContext& ctx)
1812{
1813 if (!track){
1814 ATH_MSG_DEBUG("* FillRecParameters * Empty Track: track. Skipping.");
1815 return StatusCode::FAILURE;
1816 }
1817
1818 if (m_doRemoval && !trackp_for_unbias && !m_skipMS) {
1819 ATH_MSG_DEBUG("* FillRecParameters * Empty Track: trackp_for_unbias. Skipping.");
1820 return StatusCode::FAILURE;
1821 }
1822
1823 const Trk::Perigee* trkPerigee = track->perigeeParameters();
1824 const Trk::Perigee* trk_for_unbiasPerigee = nullptr;
1825 if (!m_skipMS) trk_for_unbiasPerigee = &(trackp_for_unbias->perigeeParameters());
1826
1827 double px = 0;
1828 double py = 0;
1829 double pt = 0;
1830 double pz = 0;
1831 double phi= 0;
1832 double eta= 0;
1833 double d0 = 0;
1834 double z0 = 0;
1835
1836 double d0_err = 999.;
1837 double z0_err = 999.;
1838
1839 double PVd0 = 0;
1840 double PVz0 = 0;
1841 double PVd0res = 0;
1842 double PVz0res = 0;
1843
1844
1845 if (trkPerigee != nullptr){
1846 double qOverP = trkPerigee->parameters()[Trk::qOverP];
1847 if (qOverP) {
1848 px = trkPerigee->momentum().x();
1849 py = trkPerigee->momentum().y();
1850 pt = std::abs(trkPerigee->pT());
1851 pz = trkPerigee->momentum().z();
1852 phi= trkPerigee->parameters()[Trk::phi];
1853 eta= trkPerigee->eta();
1854 d0 = trkPerigee->parameters()[Trk::d0];
1855 z0 = trkPerigee->parameters()[Trk::z0];
1856 d0_err = Amg::error(*trkPerigee->covariance(),Trk::d0);
1857 z0_err = Amg::error(*trkPerigee->covariance(),Trk::z0);
1858 }
1859 }
1860
1861 // access beam spot and extrapolate track till there
1862 SG::ReadCondHandle<InDet::BeamSpotData> beamSpotHandleRec { m_beamSpotKey, ctx };
1863 auto beamline = m_trackToVertexTool->GetBeamLine(beamSpotHandleRec.cptr());
1864
1865 auto trackBLtemp = m_trackToVertexTool->trackAtBeamline(ctx, *track , beamline.get() );
1866 const Trk::AtaStraightLine* atBL = dynamic_cast<const Trk::AtaStraightLine*>(trackBLtemp.get());
1867
1868 if (atBL){
1869 double qOverP = atBL->parameters()[Trk::qOverP];
1870 if(qOverP){
1871 px = atBL->momentum().x();
1872 py = atBL->momentum().y();
1873 pt = std::abs(atBL->pT());
1874 pz = atBL->momentum().z();
1875 eta= trkPerigee->eta();
1876 phi= trkPerigee->parameters()[Trk::phi];
1877 d0 = atBL->parameters()[Trk::d0];
1878 z0 = atBL->parameters()[Trk::z0];
1879 }
1880 delete atBL;
1881 }
1882 else {
1883 ATH_MSG_WARNING("FillRecParameters::Failed extrapolation to the BeamLine");
1884 }
1885
1886
1887 // Amg::Vector3D position = beamSpotHandleRec->beamPos();
1888 TLorentzVector vtrack = TLorentzVector (trkPerigee->momentum().x(),
1889 trkPerigee->momentum().y(),
1890 trkPerigee->momentum().z(),
1891 trkPerigee->momentum().mag());
1892
1893 if(m_doIP && vertex){ //I assume that the vertex is the same of the original track
1894 std::unique_ptr<Trk::ImpactParametersAndSigma> iPandSigma(nullptr);
1895 if (!m_skipMS) iPandSigma = m_trackToVertexIPEstimator->estimate(ctx, trk_for_unbiasPerigee,trkPerigee,vertex,m_doRemoval);
1896 else iPandSigma = m_trackToVertexIPEstimator->estimate(ctx, trkPerigee,vertex);
1897 if( iPandSigma==0 ){
1898 ATH_MSG_WARNING ("FillRecParameters::trackToVertexIPEstimator failed !");
1899 return StatusCode::FAILURE;
1900 }
1901 else{
1902 ATH_MSG_DEBUG("FillRecParameters::trackToVertexIPEstimator success !");
1903 PVd0 = iPandSigma->IPd0;
1904 PVd0res = iPandSigma->PVsigmad0;
1905 //d0res = iPandSigma->sigmad0; //-> ?
1906 PVz0 = iPandSigma->IPz0;
1907 PVz0res = iPandSigma->PVsigmaz0;
1908 //z0res = iPandSigma->sigmaz0; //-> ?
1909
1910 if (vertex) {
1911 ATH_MSG_INFO(" FillRecParameters::trackToVertexIPEstimator vertex does exist ");
1912 m_pv_x = vertex->x();
1913 m_pv_y = vertex->y();
1914 m_pv_z = vertex->z();
1915 m_nTrkInVtx = vertex->nTrackParticles();
1916 }
1917
1918 }
1919 }
1920
1921 if (charge == 1) {
1922 m_positive_px = px;
1923 m_positive_py = py;
1924 m_positive_pt = pt;
1925 m_positive_pz = pz;
1928 m_positive_z0 = z0;
1929 m_positive_d0 = d0;
1930 m_positive_d0_err = d0_err;
1931 m_positive_z0_err = z0_err;
1932 if(m_doIP){
1933 m_positive_z0_PV = PVz0;
1934 m_positive_d0_PV = PVd0;
1935 m_positive_z0_PVerr = PVz0res;
1936 m_positive_d0_PVerr = PVd0res;
1937 }
1938 ATH_MSG_DEBUG("(Filled charge == 1 ) (reco)-> px : "<< px <<" py: "<<py <<" pz: "<<pz <<" d0: "<<d0<<" z0: "<< z0);
1939 }
1940 if (charge == -1) {
1941 m_negative_px = px;
1942 m_negative_py = py;
1943 m_negative_pt = pt;
1944 m_negative_pz = pz;
1947 m_negative_z0 = z0;
1948 m_negative_d0 = d0;
1949 m_negative_d0_err = d0_err;
1950 m_negative_z0_err = z0_err;
1951 if(m_doIP){
1952 m_negative_z0_PV = PVz0;
1953 m_negative_d0_PV = PVd0;
1954 m_negative_z0_PVerr = PVz0res;
1955 m_negative_d0_PVerr = PVd0res;
1956 }
1957 ATH_MSG_DEBUG("(Filled charge == -1 ) (reco)-> px : "<< px <<" py: "<<py <<" pz: "<<pz <<" d0: "<<d0<<" z0: "<<z0 );
1958 }
1959
1960 return StatusCode::SUCCESS;
1961}
1962//==================================================================================
1963StatusCode IDPerfMonZmumu::FillRecParametersSimple (const Trk::Track* track, float charge, const xAOD::Vertex* vertex, const EventContext& ctx)
1964{
1965 if (!track){
1966 ATH_MSG_DEBUG("* FillRecParametersSimple * Empty Track: track. Skipping.");
1967 return StatusCode::FAILURE;
1968 }
1969
1970 const Trk::Perigee* trkPerigee = track->perigeeParameters();
1971 if (not trkPerigee) {
1972 ATH_MSG_ERROR("trkPerigee pointer is null in IDPerfMonZmumu::FillRecParametersSimple");
1973 return StatusCode::FAILURE;
1974 }
1975 double px = 0;
1976 double py = 0;
1977 double pt = 0;
1978 double pz = 0;
1979 double phi= 0;
1980 double eta= 0;
1981
1982 double d0 = 0;
1983 double z0 = 0;
1984 double d0_err = 999.;
1985 double z0_err = 999.;
1986
1987 //
1988 double qOverP = trkPerigee->parameters()[Trk::qOverP];
1989 if (qOverP) {
1990 px = trkPerigee->momentum().x();
1991 py = trkPerigee->momentum().y();
1992 pt = std::abs(trkPerigee->pT());
1993 pz = trkPerigee->momentum().z();
1994 phi= trkPerigee->parameters()[Trk::phi];
1995 eta= trkPerigee->eta();
1996 d0 = trkPerigee->parameters()[Trk::d0];
1997 z0 = trkPerigee->parameters()[Trk::z0];
1998 d0_err = Amg::error(*trkPerigee->covariance(),Trk::d0);
1999 z0_err = Amg::error(*trkPerigee->covariance(),Trk::z0);
2000 }
2001
2002
2004 Amg::Vector3D position (eventInfo->beamPosX(), eventInfo->beamPosY(), eventInfo->beamPosZ());
2005 TLorentzVector vtrack = TLorentzVector (trkPerigee->momentum().x(),
2006 trkPerigee->momentum().y(),
2007 trkPerigee->momentum().z(),
2008 trkPerigee->momentum().mag());
2009
2010 SG::ReadCondHandle<InDet::BeamSpotData> beamSpotHandleRec { m_beamSpotKey, ctx }; // This method loads the proper beam spot conditions
2011
2012
2013 // access beam spot and extrapolate track till there
2014 auto beamline = m_trackToVertexTool->GetBeamLine(beamSpotHandleRec.cptr());
2015
2016 auto trackBLtemp = m_trackToVertexTool->trackAtBeamline(ctx, *track , beamline.get() );
2017 const Trk::AtaStraightLine* atBL = dynamic_cast<const Trk::AtaStraightLine*>(trackBLtemp.get());
2018
2019 if (atBL){
2020 double qOverP = atBL->parameters()[Trk::qOverP];
2021 if(qOverP){
2022 px = atBL->momentum().x();
2023 py = atBL->momentum().y();
2024 pt = std::abs(atBL->pT());
2025 pz = atBL->momentum().z();
2026 eta= trkPerigee->eta();
2027 phi= trkPerigee->parameters()[Trk::phi];
2028 d0 = atBL->parameters()[Trk::d0];
2029 z0 = atBL->parameters()[Trk::z0] - vertex->z(); // correct also for the vertex position along the beam line
2030 }
2031 ATH_MSG_DEBUG("* FillRecParametersSimple *"
2032 << " charge " << charge
2033 << " ** trackToVertexTool->trackAtBeamline ** "
2034 << "( " << beamSpotHandleRec->beamPos().x()
2035 << ", " << beamSpotHandleRec->beamPos().y()
2036 << ", " << beamSpotHandleRec->beamPos().z()
2037 << ") pt: " << pt
2038 << " d0: " << d0
2039 << " z0: " << z0);
2040 }
2041 else {
2042 ATH_MSG_WARNING("FillRecParametersSimple::Failed extrapolation to the BeamLine --> extrapolate using line approximation");
2043 float trkd0 = trkPerigee->parameters()[Trk::d0];
2044 float trkz0 = trkPerigee->parameters()[Trk::z0];
2045 float bsX = beamSpotHandleRec->beamPos().x();
2046 float bsY = beamSpotHandleRec->beamPos().y();
2047 float bsZ = beamSpotHandleRec->beamPos().z();
2048 float btiltX = beamSpotHandleRec->beamTilt(0);
2049 float btiltY = beamSpotHandleRec->beamTilt(1);
2050 // compute the corrections for the track parameters considering the beamspot position
2051 float beamX = bsX + std::tan(btiltX) * (trkz0-bsZ);
2052 float beamY = bsY + std::tan(btiltY) * (trkz0-bsZ);
2053 float beamD0 = ( -std::sin(vtrack.Phi())*beamX + std::cos(vtrack.Phi())*beamY );
2054
2055 // correct d0 and z0
2056 d0 = trkd0 - beamD0;
2057 z0 = trkz0 - bsZ - vertex->z(); // correct also for the vertex position along the beam line
2058
2059 ATH_MSG_DEBUG("* FillRecParametersSimple *"
2060 << " charge " << charge
2061 << " ** beamSpotHandleRec " << m_beamSpotKey
2062 << "( " << beamSpotHandleRec->beamPos().x()
2063 << ", " << beamSpotHandleRec->beamPos().y()
2064 << ", " << beamSpotHandleRec->beamPos().z()
2065 << ") pt: " << pt
2066 << " d0: " << d0
2067 << " z0: " << z0);
2068 }
2069
2070 // store the values
2071 if (charge == 1) { // positive particle
2072 m_positive_px = px;
2073 m_positive_py = py;
2074 m_positive_pt = pt;
2075 m_positive_pz = pz;
2078 m_positive_z0 = z0;
2079 m_positive_d0 = d0;
2080 m_positive_d0_err = d0_err;
2081 m_positive_z0_err = z0_err;
2082 }
2083 if (charge == -1) { // negative particle
2084 m_negative_px = px;
2085 m_negative_py = py;
2086 m_negative_pt = pt;
2087 m_negative_pz = pz;
2090 m_negative_z0 = z0;
2091 m_negative_d0 = d0;
2092 m_negative_d0_err = d0_err;
2093 m_negative_z0_err = z0_err;
2094 }
2095
2096 ATH_MSG_DEBUG("* FillRecParametersSimple * completed * charge " << charge << " pt: " << pt << " d0: " << d0 << " z0: " << z0);
2097 return StatusCode::SUCCESS;
2098}
2099
2100//==================================================================================
2101StatusCode IDPerfMonZmumu::FillTruthParameters(const xAOD::TrackParticle* trackParticle, const EventContext& ctx)
2102{
2103
2104 if (!trackParticle ){//|| !trackParticle->vertex()){
2105 ATH_MSG_WARNING("-- FillTruthParameters -- Empty Trackparticle. Skipping.");
2106 return StatusCode::FAILURE;
2107 }
2108
2109 const xAOD::TruthParticle* particle = getTruthParticle( *trackParticle );
2110 double charge = 0;
2111 if (!particle) {
2112 ATH_MSG_DEBUG(" -- FillTruthParameters -- Failure while retrieving the truth particle. Returning FAILURE.");
2113 return StatusCode::FAILURE;
2114 }
2115
2116 if ( particle->pdgId() == 13) charge = -1.; // muon-
2117 if ( particle->pdgId() == -13) charge = 1.; // muon+
2118 if ( particle->isNeutral() ) {
2119 ATH_MSG_DEBUG(" -- FillTruthParameters -- reco muon associated to a truth neutral!! Returning FAILURE.");
2120 return StatusCode::FAILURE;
2121 }
2122 if ( charge == 0 ) {
2123 ATH_MSG_DEBUG(" -- FillTruthParameters -- reco muon associated to a non true muon!! Returning FAILURE.");
2124 return StatusCode::FAILURE;
2125 }
2126
2127 const Amg::Vector3D momentum(particle->px(), particle->py(), particle->pz());
2128 const xAOD::TruthVertex * ptruthVertex(0);
2129 ptruthVertex=particle->prodVtx();
2130 if (!ptruthVertex){
2131 ATH_MSG_DEBUG("A production vertex pointer was retrieved, but it is NULL");
2132 return StatusCode::FAILURE;
2133 }
2134
2135
2136 if (particle->parent(0) != nullptr) {
2137 static const SG::ConstAccessor<int> truthTypeAcc("truthType");
2138 static const SG::ConstAccessor<int> truthOriginAcc("truthOrigin");
2139 if (truthTypeAcc.isAvailable(*particle)) {
2140 ATH_MSG_DEBUG(" -- FillTruthParameters -- truth particle is good. pdg: " << particle->pdgId()
2141 << " type: " << particle->type()
2142 << " nparents " << particle->nParents()
2143 << " parent->pdg: " << particle->parent(0)->pdgId()
2144 << " truthType: " << truthTypeAcc(*particle)
2145 << " truthOrigin: " << truthOriginAcc(*particle)
2146 );
2147
2148 }
2149 else {
2150 ATH_MSG_DEBUG(" -- FillTruthParameters -- truth particle is good. pdg: " << particle->pdgId()
2151 << " type: " << particle->type()
2152 << " nparents " << particle->nParents()
2153 << " parent->pdg: " << particle->parent(0)->pdgId()
2154 << " truthType & truthOrigin: " << " NOT AVAILABLE "
2155 );
2156 }
2157 }
2158
2159 const auto xPos=ptruthVertex->x();
2160 const auto yPos=ptruthVertex->y();
2161 const auto z_truth=ptruthVertex->z();
2162
2163 const Amg::Vector3D position(xPos, yPos, z_truth);
2164 const Trk::CurvilinearParameters cParameters(position, momentum, charge);
2165
2166 SG::ReadCondHandle<InDet::BeamSpotData> beamSpotHandleTruth { m_beamSpotKey, ctx };
2167 Trk::PerigeeSurface persf( beamSpotHandleTruth->beamPos() );
2168
2169 std::unique_ptr<const Trk::TrackParameters> tP = m_extrapolator->extrapolate(ctx, cParameters,persf, Trk::anyDirection, false);
2170
2171 double px = 0;
2172 double py = 0;
2173 double pt = 0;
2174 double pz = 0;
2175 double phi= 0;
2176 double eta= 0;
2177 double d0 = 0;
2178 double d0res = 0;
2179 double PVd0res = 0;
2180 double z0 = 0;
2181 double z0res = 0;
2182 double PVz0res = 0;
2183
2184 double d0recoPos = m_positive_d0;
2185 double z0recoPos = m_positive_z0;
2186 double d0recoNeg = m_negative_d0;
2187 double z0recoNeg = m_negative_z0;
2188
2189 ATH_MSG_DEBUG("reco IPs (pos): > d0 : "<<d0recoPos << " z0: " << z0recoPos << " trackp z0 : " << trackParticle->z0() << " trackp d0 : " << trackParticle->d0());
2190 ATH_MSG_DEBUG("reco IPs (neg): > d0 : "<<d0recoNeg << " z0: " << z0recoNeg << " trackp z0 : " << trackParticle->z0() <<" trackp d0 : " << trackParticle->d0() );
2191
2192 double qOverP_truth = 0.;
2193 if (tP){
2194 qOverP_truth = tP->parameters()[Trk::qOverP];
2195 if( qOverP_truth ){
2196
2197 px = tP->momentum().x();
2198 py = tP->momentum().y();
2199 pt = tP->pT();
2200 pz = tP->momentum().z();
2201 phi= tP->parameters()[Trk::phi];
2202 eta= tP->eta();
2203 d0 = tP->parameters()[Trk::d0];
2204 z0 = tP->parameters()[Trk::z0];
2205
2206 ATH_MSG_DEBUG("cand perig HEP particle (truth) px : "<< tP->momentum().x());
2207 ATH_MSG_DEBUG("cand perig HEP particle (truth) py : "<< tP->momentum().y());
2208 ATH_MSG_DEBUG("cand perig HEP particle (truth) pz : "<< tP->momentum().z());
2209 ATH_MSG_DEBUG("cand perig HEP particle (truth) d0 : "<< tP->parameters()[Trk::d0]);
2210 ATH_MSG_DEBUG("cand perig HEP particle (truth) z0 : "<< tP->parameters()[Trk::z0]);
2211
2212 }
2213 }
2214
2215
2216 if (charge == 1) {
2217 m_positive_px = px;
2218 m_positive_py = py;
2219 m_positive_pt = pt;
2220 m_positive_pz = pz;
2223 m_positive_z0 = z0recoPos -z0;
2224 m_positive_z0_err = z0res;
2225 m_positive_z0_PVerr = PVz0res;
2226 m_positive_d0 = d0recoPos -d0;
2227 m_positive_d0_err = d0res;
2228 m_positive_d0_PVerr = PVd0res;
2229 m_positive_qoverp = qOverP_truth;
2230
2231 bool parentfound = false;
2232 if (particle->nParents()>0) {
2233 if (particle->parent(0) != nullptr) {
2234 m_positive_parent = particle->parent(0)->pdgId();
2235 parentfound = true;
2236 }
2237 }
2238 if (!parentfound) m_positive_parent = 0;
2239
2240 ATH_MSG_DEBUG(" -- FillTruthParameters -- charge = 1 (truth)-> px : "<< m_positive_px
2241 <<" py: "<<m_positive_py
2242 <<" pz: "<<m_positive_pz
2243 <<" d0: "<<m_positive_d0
2244 <<" z0: "<< m_positive_z0
2245 <<" qoverp: " << m_positive_qoverp
2246 << " parent: " << m_positive_parent);
2247
2248 } else if (charge == -1) {
2249 m_negative_px = px;
2250 m_negative_py = py;
2251 m_negative_pt = pt;
2252 m_negative_pz = pz;
2255 m_negative_z0 = z0recoNeg-z0;
2256 m_negative_z0_err = z0res;
2257 m_negative_z0_PVerr = PVz0res;
2258 m_negative_d0 = d0recoNeg-d0;
2259 m_negative_d0_err = d0res;
2260 m_negative_d0_PVerr = PVd0res;
2261 m_negative_qoverp = qOverP_truth;
2262
2263 bool parentfound = false;
2264 if (particle->nParents()>0) {
2265 if (particle->parent(0) != nullptr) {
2266 m_negative_parent = particle->parent(0)->pdgId();
2267 parentfound = true;
2268 }
2269 }
2270 if (!parentfound) m_negative_parent = 0;
2271
2272 ATH_MSG_DEBUG(" -- FillTruthParameters-- charge = -1 (truth)-> px : "<< m_negative_px
2273 << " py: "<<m_negative_py
2274 << " pz: "<<m_negative_pz
2275 << " d0: "<<m_negative_d0
2276 << " z0: "<< m_negative_z0
2277 <<" qoverp: " << m_negative_qoverp
2278 << " parent:" << m_negative_parent);
2279 }
2280 return StatusCode::SUCCESS;
2281}
2282
2283
2284//==================================================================================
2289 static const SG::ConstAccessor< Link_t > acc( "truthParticleLink" );
2290 // Check if such a link exists on the object:
2291 if( ! acc.isAvailable( p ) ) {
2292 return nullptr;
2293 }
2294 // Get the link:
2295 const Link_t& link = acc( p );
2296 // Check if the link is valid:
2297 if( ! link.isValid() ) {
2298 return nullptr;
2299 }
2300 // Everything has passed, let's return the pointer:
2301 return *link;
2302}
2303
2304//==================================================================================
2306{
2307 m_xZmm.finalize();
2308 return StatusCode::SUCCESS;
2309}
2310
2311//==================================================================================
2313{
2314 m_triggerPrescale = 1; // default value
2315
2316 // check trigger status
2317 if(m_triggerDecision.retrieve().isFailure()) {
2318 ATH_MSG_FATAL("CheckTriggerStatusAndPrescale -- Unable to retrieve " << m_triggerDecision << " turn it off");
2319 return StatusCode::FAILURE;
2320 }
2321 else {
2322 ATH_MSG_DEBUG("CheckTriggerStatusAndPrescale -- retrieved tool: " << m_triggerDecision );
2323 }
2324
2325 float thisEventTriggerPrescale = 999999.9;
2326 float thisHLTTriggerPrescale = 999999.9;
2327 bool thisHLTIsPassed = false;
2328 std::string thisHLTTriggerName;
2329 std::string thisEventTriggerName;
2330
2331 // HLT triggers
2332 const std::vector<std::string> myHLTtriglist = m_triggerDecision->getChainGroup("HLT_mu.*, HLT_2mu.*")->getListOfTriggers();
2333 for (int i=0; i < (int) myHLTtriglist.size(); i++) {
2334 if ( m_triggerDecision->isPassed(myHLTtriglist.at(i)) ) {
2335 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() );
2336 }
2337 if ( m_triggerDecision->isPassed(myHLTtriglist.at(i)) ) { // trigger is passed
2338 thisHLTIsPassed = true;
2339 float thisprescale = m_triggerDecision->getChainGroup(myHLTtriglist.at(i))->getPrescale();
2340 if (thisprescale < thisHLTTriggerPrescale) {
2341 thisHLTTriggerPrescale = thisprescale;
2342 thisHLTTriggerName = myHLTtriglist.at(i);
2343 }
2344 }
2345 }
2346 if (thisHLTTriggerPrescale < 1) thisHLTTriggerPrescale = 1;
2347 ATH_MSG_DEBUG("Event HLT trigger prescale = " << thisHLTTriggerPrescale);
2348
2349 //if (thisL1IsPassed && thisHLTIsPassed) {
2350 if (thisHLTIsPassed) {
2351 ATH_MSG_DEBUG("Trigger passed -> accept event");
2352 }
2353 else{
2354 ATH_MSG_DEBUG("Trigger Failed -> reject event");
2355 return StatusCode::FAILURE;
2356 }
2357
2358 // event prescale
2359 thisEventTriggerPrescale = thisHLTTriggerPrescale;
2360 thisEventTriggerName = thisHLTTriggerName;
2361 ATH_MSG_DEBUG("CheckTriggerStatusAndPrescale -- Event trigger prescale = " << thisEventTriggerPrescale);
2362 ATH_MSG_DEBUG("CheckTriggerStatusAndPrescale -- Event trigger name = " << thisEventTriggerName);
2363
2364 m_triggerPrescale = thisEventTriggerPrescale;
2365 m_triggerName = thisEventTriggerName;
2366
2367
2368 return StatusCode::SUCCESS;
2369}
2370
2371
2372//==================================================================================
2374
2375 const xAOD::VertexContainer* vxContainer(0);
2376 const xAOD::Vertex* myVtx(0);
2378 if (!vxContainer) {
2379 return myVtx;
2380 }
2381
2382 for (int ivtx=0; ivtx< (int) vxContainer->size();ivtx++) {
2383 myVtx = (*vxContainer)[ivtx];
2384 if ((myVtx->vertexType() == xAOD::VxType::PriVtx)) {
2385 if (m_Trk2VtxAssociationTool->isCompatible(*muon1,*myVtx) && (m_Trk2VtxAssociationTool->isCompatible(*muon2,*myVtx)))
2386 return myVtx;
2387 }
2388 }
2389 return myVtx;
2390}
2391
2392//==================================================================================
2394{
2395 m_IDTrack_pt.clear();
2396 m_CBTrack_pt.clear();
2397 m_Refit1_pt.clear();
2398 m_Refit2_pt.clear();
2399 m_Truth_pt.clear();
2400
2401 m_IDTrack_eta.clear();
2402 m_CBTrack_eta.clear();
2403 m_Refit1_eta.clear();
2404 m_Refit2_eta.clear();
2405 m_Truth_eta.clear();
2406
2407 m_IDTrack_phi.clear();
2408 m_CBTrack_phi.clear();
2409 m_Refit1_phi.clear();
2410 m_Refit2_phi.clear();
2411 m_Truth_phi.clear();
2412
2413 m_IDTrack_d0.clear();
2414 m_CBTrack_d0.clear();
2415 m_Refit1_d0.clear();
2416 m_Refit2_d0.clear();
2417 m_Truth_d0.clear();
2418
2419 m_IDTrack_z0.clear();
2420 m_CBTrack_z0.clear();
2421 m_Refit1_z0.clear();
2422 m_Refit2_z0.clear();
2423 m_Truth_z0.clear();
2424
2425 m_IDTrack_qoverp.clear();
2426 m_CBTrack_qoverp.clear();
2427 m_Refit1_qoverp.clear();
2428 m_Refit2_qoverp.clear();
2429 m_Truth_qoverp.clear();
2430
2431 m_Truth_parent.clear();
2432
2433 m_IDTrack_sigma_pt.clear();
2434 m_CBTrack_sigma_pt.clear();
2435 m_Refit1_sigma_pt.clear();
2436 m_Refit2_sigma_pt.clear();
2437
2438 m_IDTrack_sigma_d0.clear();
2439 m_CBTrack_sigma_d0.clear();
2440 m_Refit1_sigma_d0.clear();
2441 m_Refit2_sigma_d0.clear();
2442
2443 m_IDTrack_sigma_z0.clear();
2444 m_CBTrack_sigma_z0.clear();
2445 m_Refit1_sigma_z0.clear();
2446 m_Refit2_sigma_z0.clear();
2447
2448 m_IDTrack_sigma_qoverp.clear();
2449 m_CBTrack_sigma_qoverp.clear();
2450 m_Refit1_sigma_qoverp.clear();
2451 m_Refit2_sigma_qoverp.clear();
2452
2453 m_nBLhits.clear();
2454 m_nPIXhits.clear();
2455 m_nSCThits.clear();
2456 m_nTRThits.clear();
2457
2458 return;
2459}
2460
2461//==================================================================================
2463{
2464 m_positive_px = 0.;
2465 m_positive_py = 0.;
2466 m_positive_pz = 0.;
2467 m_positive_d0 = 0.;
2468 m_positive_z0 = 0.;
2469 m_positive_d0_err = 0.;
2470 m_positive_z0_err = 0.;
2472 m_positive_1_vtx = 0;
2474
2475 m_negative_px = 0.;
2476 m_negative_py = 0.;
2477 m_negative_pz = 0.;
2478 m_negative_d0 = 0.;
2479 m_negative_z0 = 0.;
2480 m_negative_d0_err = 0.;
2481 m_negative_z0_err = 0.;
2483 m_negative_1_vtx = 0;
2485
2486 m_positive_2_px = 0.;
2487 m_positive_2_py = 0.;
2488 m_positive_2_pz = 0.;
2489 m_positive_2_d0 = 0.;
2490 m_positive_2_z0 = 0.;
2493 m_positive_2_vtx = 0;
2494
2495 m_negative_2_px = 0.;
2496 m_negative_2_py = 0.;
2497 m_negative_2_pz = 0.;
2498 m_negative_2_d0 = 0.;
2499 m_negative_2_z0 = 0.;
2502 m_negative_2_vtx = 0;
2503
2504 // electrons
2505 m_el_negative1_px = 0.;
2506 m_el_negative1_py = 0.;
2507 m_el_negative1_pz = 0.;
2508 m_el_negative1_d0 = 0.;
2509 m_el_negative1_z0 = 0.;
2513
2514 m_el_negative2_px = 0.;
2515 m_el_negative2_py = 0.;
2516 m_el_negative2_pz = 0.;
2517 m_el_negative2_d0 = 0.;
2518 m_el_negative2_z0 = 0.;
2522
2523 m_el_positive1_px = 0.;
2524 m_el_positive1_py = 0.;
2525 m_el_positive1_pz = 0.;
2526 m_el_positive1_d0 = 0.;
2527 m_el_positive1_z0 = 0.;
2531
2532 m_el_positive2_px = 0.;
2533 m_el_positive2_py = 0.;
2534 m_el_positive2_pz = 0.;
2535 m_el_positive2_d0 = 0.;
2536 m_el_positive2_z0 = 0.;
2540
2541 // other quantities
2542 m_nVertex = 0;
2543 m_pv_x = 0; m_pv_y = 0; m_pv_z = 0;
2544 m_4mu_minv = 0.;
2545
2546 return;
2547}
2548//==================================================================================
2550{
2551 StatusCode thisStatus = StatusCode::SUCCESS;
2552
2553 if (m_doFourMuAnalysis) {
2554 ATH_MSG_DEBUG ("** RunFourLeptonAnalysis ** START ** run: " << m_runNumber << " event: " << m_evtNumber << " lumiblock:" << m_lumi_block);
2555
2556 // Four lepton event
2558 m_4mu.doIsoSelection (m_doIsoSelection);
2559 m_4mu.doIPSelection (m_doIPSelection);
2560 m_4mu.doMCPSelection (m_doMCPSelection);
2561 m_4mu.SetMassWindowLow (m_MassWindowLow);
2562 m_4mu.SetMassWindowHigh (m_MassWindowHigh);
2563 m_4mu.SetLeadingMuonPtCut(m_LeadingMuonPtCut);
2564 m_4mu.SetSecondMuonPtCut (m_SecondMuonPtCut);
2565 m_4mu.SetOpeningAngleCut (m_OpeningAngleCut);
2566 m_4mu.SetZ0GapCut (m_Z0GapCut);
2567 m_4mu.setDebugMode (m_doDebug);
2568
2569 // This is a report of the number of true electrons in the event
2570 if (false) {
2571 const xAOD::TruthParticleContainer* electronTruth = evtStore()->retrieve< const xAOD::TruthParticleContainer >( "egammaTruthParticles" );
2572 if( electronTruth) {
2573 ATH_MSG_DEBUG ( "retrieving electron Truth container with key: \"egammaTruthParticles\" SUCCESS ");
2574 // Check that the auxiliary store association was made successfully:
2575 if( electronTruth->hasStore() ) {
2576 ATH_MSG_DEBUG ( "Size of Truth gamma-electrons: " << electronTruth->size() );
2577 auto tr_itr = electronTruth->begin();
2578 auto tr_end = electronTruth->end();
2579 int electronCount = 0;
2580 for( int i = 0; tr_itr != tr_end; ++tr_itr, ++i ) {
2581 ATH_MSG_DEBUG( "Truth : Investigating truth electron #" << i << " pdgID= " << ( *tr_itr )->pdgId());
2582 if (fabs(( *tr_itr )->pdgId()) == 11) {
2583 if (( *tr_itr )->pt() > 10000 && fabs(( *tr_itr )->eta()) < 2.47) {
2584 ATH_MSG_INFO( " central electron found --> pt: " << ( *tr_itr )->charge()*( *tr_itr )->pt() << " eta " <<( *tr_itr )->eta() );
2585 electronCount++;
2586 }
2587 }
2588 }
2589 ATH_MSG_INFO( "#central electrons: " << electronCount );
2590 }
2591 else {
2592 ATH_MSG_WARNING ( "electronTruth container has no Store !!! FAILURE");
2593 }
2594 }
2595 else {
2596 ATH_MSG_WARNING ( "retrieve electron Truth container with key: \"egammaTruthParticles\" FAILURE");
2597 }
2598 }
2599
2600 if (m_doDebug) std::cout << " ** RunFourLeptonAnalysis ** calling m_4mu.Reco() .... " << std::endl;
2601 bool statusOf4LeptReco = m_4mu.Reco();
2602
2603 // print message
2604 if(statusOf4LeptReco) {
2605 thisStatus = StatusCode::SUCCESS;
2606 ATH_MSG_INFO ("4-lepton reconstruction SUCCESS. # accepted events " << m_4mu.getAcceptedEvents() << " Invariant mass = " << m_4mu.GetInvMass() << " GeV ");
2607 if (m_doDebug) std::cout << " ** RunFourLeptonAnalysis ** 4-lepton reconstruction SUCCESS. # accepted events " << m_4mu.getAcceptedEvents() << " Invariant mass = " << m_4mu.GetInvMass() << " GeV " << std::endl;
2608 }
2609 else {
2610 thisStatus = StatusCode::FAILURE;
2611 ATH_MSG_DEBUG ("4-lepton reconstruction FAILURE. m_4mu.Reco() returned FALSE --> event failed selection");
2612 if (m_doDebug) std::cout << " ** RunFourLeptonAnalysis ** 4-lepton reconstruction FAILURE. m_4mu.Reco() returned FALSE --> event failed selection" << std::endl;
2613 }
2614
2615 if(statusOf4LeptReco) {
2616 if ( m_4mu.EventPassed() ) {
2617
2618 this->Clear4MuNtupleVariables();
2619
2620 const xAOD::TrackParticle* muon1_pos = m_4mu.getIDTrack(m_4mu.getPosMuon(1));
2621 const xAOD::TrackParticle* muon2_pos = m_4mu.getIDTrack(m_4mu.getPosMuon(2));
2622 const xAOD::TrackParticle* muon1_neg = m_4mu.getIDTrack(m_4mu.getNegMuon(1));
2623 const xAOD::TrackParticle* muon2_neg = m_4mu.getIDTrack(m_4mu.getNegMuon(2));
2624
2625 // muons
2626 if (muon1_pos) {
2627 m_positive_px = muon1_pos->p4().Px();
2628 m_positive_py = muon1_pos->p4().Py();
2629 m_positive_pz = muon1_pos->p4().Pz();
2630 m_positive_d0 = muon1_pos->d0();
2631 m_positive_z0 = muon1_pos->z0();
2632 // m_positive_d0_err = muon1_pos->definingParametersCovMatrix()(0,0);
2635 }
2636 if (muon1_neg) {
2637 m_negative_px = muon1_neg->p4().Px();
2638 m_negative_py = muon1_neg->p4().Py();
2639 m_negative_pz = muon1_neg->p4().Pz();
2640 m_negative_d0 = muon1_neg->d0();
2641 m_negative_z0 = muon1_neg->z0();
2644 }
2645 if (muon2_pos) {
2646 m_positive_2_px = muon2_pos->p4().Px();
2647 m_positive_2_py = muon2_pos->p4().Py();
2648 m_positive_2_pz = muon2_pos->p4().Pz();
2649 m_positive_2_d0 = muon2_pos->d0();
2650 m_positive_2_z0 = muon2_pos->z0();
2653 }
2654 if (muon2_neg) {
2655 m_negative_2_px = muon2_neg->p4().Px();
2656 m_negative_2_py = muon2_neg->p4().Py();
2657 m_negative_2_pz = muon2_neg->p4().Pz();
2658 m_negative_2_d0 = muon2_neg->d0();
2659 m_negative_2_z0 = muon2_neg->z0();
2662 }
2663
2664 // electrons
2665 const xAOD::TrackParticle* elec1_neg = m_4mu.getELTrack(0);
2666 const xAOD::TrackParticle* elec2_neg = m_4mu.getELTrack(1);
2667 const xAOD::TrackParticle* elec1_pos = m_4mu.getELTrack(2);
2668 const xAOD::TrackParticle* elec2_pos = m_4mu.getELTrack(3);
2669 if (elec1_neg) {
2670 m_el_negative1_px = elec1_neg->p4().Px();
2671 m_el_negative1_py = elec1_neg->p4().Py();
2672 m_el_negative1_pz = elec1_neg->p4().Pz();
2673 m_el_negative1_d0 = elec1_neg->d0();
2674 m_el_negative1_z0 = elec1_neg->z0();
2677 }
2678 if (elec2_neg) {
2679 m_el_negative2_px = elec2_neg->p4().Px();
2680 m_el_negative2_py = elec2_neg->p4().Py();
2681 m_el_negative2_pz = elec2_neg->p4().Pz();
2682 m_el_negative2_d0 = elec2_neg->d0();
2683 m_el_negative2_z0 = elec2_neg->z0();
2686 }
2687 if (elec1_pos) {
2688 m_el_positive1_px = elec1_pos->p4().Px();
2689 m_el_positive1_py = elec1_pos->p4().Py();
2690 m_el_positive1_pz = elec1_pos->p4().Pz();
2691 m_el_positive1_d0 = elec1_pos->d0();
2692 m_el_positive1_z0 = elec1_pos->z0();
2695 }
2696 if (elec2_pos) {
2697 m_el_positive2_px = elec2_pos->p4().Px();
2698 m_el_positive2_py = elec2_pos->p4().Py();
2699 m_el_positive2_pz = elec2_pos->p4().Pz();
2700 m_el_positive2_d0 = elec2_pos->d0();
2701 m_el_positive2_z0 = elec2_pos->z0();
2704 }
2705
2706 // other quantities
2707 m_nVertex = m_4mu.GetNVertex ();
2708 m_negative_1_vtx = m_4mu.GetVertexMuNeg1();
2709 m_negative_2_vtx = m_4mu.GetVertexMuNeg2();
2710 m_positive_1_vtx = m_4mu.GetVertexMuPos1();
2711 m_positive_2_vtx = m_4mu.GetVertexMuPos2();
2712
2713 m_el_negative1_vtx = m_4mu.GetVertexElec(0);
2714 m_el_negative2_vtx = m_4mu.GetVertexElec(1);
2715 m_el_positive1_vtx = m_4mu.GetVertexElec(2);
2716 m_el_positive2_vtx = m_4mu.GetVertexElec(3);
2717
2718 m_pv_x = 0; m_pv_y = 0; m_pv_z = 0;
2719
2720 m_4mu_minv = m_4mu.GetInvMass();
2721
2722 // Obtain MET
2723 std::string metName = "MET_Reference_AntiKt4LCTopo";
2724 std::string metRefFinalName = "FinalClus";
2725 const xAOD::MissingETContainer* final_met = nullptr;
2726
2727 m_met = -1; // default value
2728 m_metphi = -1;
2729
2731 ATH_MSG_WARNING ( "No Collection with name " << metName << " found in StoreGate");
2732 // return StatusCode::SUCCESS;
2733 }
2734 else {
2735 StatusCode sc = evtStore()->retrieve(final_met, metName);
2736 if (sc.isFailure()) {
2737 ATH_MSG_DEBUG ( "Could not retrieve Collection " << metName << " from StoreGate");
2738 // return StatusCode::SUCCESS;
2739 }
2740 }
2741 const xAOD::MissingET *met = nullptr;
2742 if (final_met) met = (*final_met)[metRefFinalName];
2743 if (met) { // load MET values
2744 m_met = met->met();
2745 m_metphi = met->phi();
2746 }
2747 ATH_MSG_DEBUG (" Zmumu event with MET = " << m_met);
2748
2749 ATH_MSG_INFO (" -- IDPerfMonZmumu::execute -- Accepted event " << m_4mu.getAcceptedEvents() << " with m_4mu.GetInvMass= " << m_4mu_minv);
2750 ATH_MSG_DEBUG ("**** Filling m_FourMuTree ntuple " << m_FourMuTree->GetName() << " entry " << m_FourMuTree->GetEntries()
2751 << " for run: " << m_runNumber
2752 << " event: " << m_evtNumber
2753 << " Lumiblock: " << m_lumi_block
2754 << " Invariant mass = " << m_4mu_minv << " GeV ");
2755 if (muon1_pos != nullptr) ATH_MSG_DEBUG("mu1+ --> pxyz " << muon1_pos->p4().Px()
2756 << ", " << muon1_pos->p4().Py()
2757 << ", " << muon1_pos->p4().Pz()
2758 << " pt: " << muon1_pos->pt()
2759 << " d0: " << muon1_pos->d0()
2760 << " z0: " << muon1_pos->z0()
2761 << " d0unc: " << muon1_pos->definingParametersCovMatrixVec()[0]
2762 );
2763 if (muon1_neg != nullptr) ATH_MSG_DEBUG("mu1- --> pxyz " << muon1_neg->p4().Px()
2764 << ", " << muon1_neg->p4().Py()
2765 << ", " << muon1_neg->p4().Pz()
2766 << " pt: " << muon1_neg->pt()
2767 << " d0: " << muon1_neg->d0()
2768 << " z0: " << muon1_neg->z0()
2769 << " d0unc: " << muon1_neg->definingParametersCovMatrixVec()[0]
2770 );
2771 if (elec1_pos != nullptr) ATH_MSG_DEBUG("el1+ --> pxyz " << elec1_pos->p4().Px()
2772 << ", " << elec1_pos->p4().Py()
2773 << ", " << elec1_pos->p4().Pz()
2774 << " pt: " << elec1_pos->pt()
2775 << " d0: " << elec1_pos->d0()
2776 << " z0: " << elec1_pos->z0()
2777 << " d0unc: " << elec1_pos->definingParametersCovMatrixVec()[0]
2778 );
2779 // ntuple variables have been filled in FillRecParametersTP
2780 m_FourMuTree->Fill();
2781 }
2782 } // succesful 4mu reco
2783
2784 } // end of fourMuon Analysis
2785
2786 return thisStatus;
2787}
2788
2789//==================================================================================
2791{
2792 // hits info
2793 // positive Muon
2794 const xAOD::TrackParticle* IDTrkMuPos = muon_pos->trackParticle(xAOD::Muon::TrackParticleType::InnerDetectorTrackParticle);
2795 const xAOD::TrackParticle* IDTrkMuNeg = muon_neg->trackParticle(xAOD::Muon::TrackParticleType::InnerDetectorTrackParticle);
2796
2797 int nBLhits, nhitsPIX, nhitsSCT, nhitsTRT, nContribPixLayers;
2798 int nPIXholes, nSCTholes;
2799 if (IDTrkMuPos && IDTrkMuNeg) { // make sure both summaries are available
2800 uint8_t dummy(-1);
2801 nBLhits = IDTrkMuPos->summaryValue( dummy, xAOD::numberOfBLayerHits ) ? dummy :-1;
2802 nhitsPIX = IDTrkMuPos->summaryValue( dummy, xAOD::numberOfPixelHits ) ? dummy :-1;
2803 nhitsSCT = IDTrkMuPos->summaryValue( dummy, xAOD::numberOfSCTHits ) ? dummy :-1;
2804 nhitsTRT = IDTrkMuPos->summaryValue( dummy, xAOD::numberOfTRTHits ) ? dummy :-1;
2805 nContribPixLayers = IDTrkMuPos->summaryValue( dummy, xAOD::numberOfContribPixelLayers )? dummy :-1;
2806
2807 nPIXholes = IDTrkMuPos->summaryValue( dummy, xAOD::numberOfPixelHoles )? dummy :-1;
2808 nSCTholes = IDTrkMuPos->summaryValue( dummy, xAOD::numberOfSCTHoles )? dummy :-1;
2809
2810
2811 m_nBLhits.push_back(nBLhits);
2812 m_nPIXhits.push_back(nhitsPIX);
2813 m_nSCThits.push_back(nhitsSCT);
2814 m_nTRThits.push_back(nhitsTRT);
2815
2816 ATH_MSG_DEBUG (" -- mu_pos -- HITS --"
2817 << " nBLhits: " << nBLhits
2818 << " nhitsPIX: " << nhitsPIX
2819 << " nPIXLayers: " << nContribPixLayers
2820 << " nhitsSCT: " << nhitsSCT
2821 << " Silicon holes: " << nPIXholes + nSCTholes
2822 << " nhitsTRT: " << nhitsTRT);
2823
2824 nBLhits = IDTrkMuNeg->summaryValue( dummy, xAOD::numberOfBLayerHits ) ? dummy :-1;
2825 nhitsPIX = IDTrkMuNeg->summaryValue( dummy, xAOD::numberOfPixelHits ) ? dummy :-1;
2826 nhitsSCT = IDTrkMuNeg->summaryValue( dummy, xAOD::numberOfSCTHits ) ? dummy :-1;
2827 nhitsTRT = IDTrkMuNeg->summaryValue( dummy, xAOD::numberOfTRTHits ) ? dummy :-1;
2828 nContribPixLayers = IDTrkMuNeg->summaryValue( dummy, xAOD::numberOfContribPixelLayers )? dummy :-1;
2829 nPIXholes = IDTrkMuNeg->summaryValue( dummy, xAOD::numberOfPixelHoles )? dummy :-1;
2830 nSCTholes = IDTrkMuNeg->summaryValue( dummy, xAOD::numberOfSCTHoles )? dummy :-1;
2831
2832 m_nBLhits.push_back(nBLhits);
2833 m_nPIXhits.push_back(nhitsPIX);
2834 m_nSCThits.push_back(nhitsSCT);
2835 m_nTRThits.push_back(nhitsTRT);
2836
2837 ATH_MSG_DEBUG (" -- mu_neg -- HITS --"
2838 << " nBLhits: " << nBLhits
2839 << " nhitsPIX: " << nhitsPIX
2840 << " nPIXLayers: " << nContribPixLayers
2841 << " nhitsSCT: " << nhitsSCT
2842 << " Silicon holes: " << nPIXholes + nSCTholes
2843 << " nhitsTRT: " << nhitsTRT);
2844
2845 }
2846 return;
2847}
Scalar eta() const
pseudorapidity method
Scalar phi() const
phi method
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
#define ATH_MSG_FATAL(x)
#define ATH_MSG_INFO(x)
#define ATH_MSG_WARNING(x)
#define ATH_MSG_DEBUG(x)
double charge(const T &p)
Definition AtlasPID.h:997
Helper class to provide constant type-safe access to aux data.
static Double_t sc
ElementLink< xAOD::TruthParticleContainer > Link_t
DataVector< Trk::Track > TrackCollection
This typedef represents a collection of Trk::Track objects.
AthAlgorithm(const std::string &name, ISvcLocator *pSvcLocator)
Constructor.
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T, V, H > &t)
ServiceHandle< StoreGateSvc > & evtStore()
value_type push_back(value_type pElem)
Add an element to the end of the collection.
const_iterator end() const noexcept
Return a const_iterator pointing past the end of the collection.
const_iterator begin() const noexcept
Return a const_iterator pointing at the beginning of the collection.
size_type size() const noexcept
Returns the number of elements in the collection.
double m_el_negative1_z0_err
ToolHandle< Trig::TrigDecisionTool > m_triggerDecision
std::vector< float > m_Refit1_qoverp
StatusCode CheckTriggerStatusAndPrescale()
virtual StatusCode finalize()
FourMuonEvent m_4mu
StatusCode RunFourLeptonAnalysis()
unsigned int m_event_mu
std::vector< float > m_Refit1_sigma_qoverp
double m_el_positive1_d0_err
double m_el_positive2_z0_err
double m_positive_d0_PVerr
std::string m_truthTreeFolder
double m_negative_2_z0_err
unsigned int m_nVertex
double m_positive_sigma_qoverp
double m_negative_sigma_qoverp
const xAOD::Vertex * GetDiMuonVertex(const xAOD::TrackParticle *, const xAOD::TrackParticle *)
double m_positive_2_d0_err
void ResetCommonNtupleVectors()
std::vector< float > m_Refit2_sigma_d0
std::vector< float > m_CBTrack_sigma_z0
TH1F * m_h_cutflow
link vector to map HepMC onto xAOD truth
ToolHandle< Reco::ITrackToVertex > m_trackToVertexTool
tool to extrapolate tracks to BL
std::vector< float > m_Refit1_sigma_d0
std::vector< float > m_CBTrack_d0
std::string m_refit1TreeFolder
std::string m_ValidationTreeDescription
< validation tree description - second argument in TTree
std::vector< float > m_Refit2_qoverp
std::string m_outputTracksName
SG::ReadHandleKey< xAOD::TrackParticleContainer > m_trackContainerName
IDTtacks.
std::vector< float > m_Refit1_eta
ToolHandle< Trig::IMatchingTool > m_triggerMatching
std::string m_truthName
std::vector< float > m_CBTrack_sigma_d0
unsigned int m_lumi_block
std::vector< float > m_IDTrack_d0
std::string m_MSTreeFolder
std::string m_trackParticleName
Track(Particle)TruthCollection input name.
std::string m_combTreeFolder
ToolHandle< IegammaTrkRefitterTool > m_TrackRefitter1
The track refitter.
StatusCode FillRecParametersSimple(const Trk::Track *track, float charge, const xAOD::Vertex *vertex, const EventContext &ctx)
double m_negative_2_d0_err
double m_positive_z0_PVerr
std::vector< float > m_Truth_phi
StatusCode FillRecParametersTP(const xAOD::TrackParticle *trackp, const xAOD::TrackParticle *trackp_for_unbias, double charge, const xAOD::Vertex *vertex, const EventContext &ctx)
std::vector< float > m_Truth_pt
ToolHandle< Trk::ITrackToVertexIPEstimator > m_trackToVertexIPEstimator
Needed for IP resolution studies.
std::vector< float > m_Refit2_d0
std::string m_MuonQualityName
double m_el_positive1_z0_err
ToolHandle< Trk::IExtrapolator > m_extrapolator
bool m_validationMode
< boolean to switch to validation mode
std::vector< float > m_Refit1_phi
std::vector< float > m_Refit2_eta
std::string m_FourMuTreeFolder
Root Validation Tree.
std::vector< float > m_IDTrack_pt
std::vector< float > m_CBTrack_sigma_pt
std::vector< float > m_Truth_z0
double m_negative_z0_PVerr
ToolHandle< IegammaTrkRefitterTool > m_TrackRefitter2
The track refitter.
std::vector< float > m_IDTrack_sigma_d0
std::vector< float > m_Refit2_pt
unsigned int m_evtNumber
double m_positive_sigma_pt
unsigned int m_runNumber
std::string m_truthTreeName
StatusCode FillTruthParameters(const xAOD::TrackParticle *track, const EventContext &ctx)
std::string m_refit1TreeName
double m_el_negative2_z0_err
std::vector< float > m_CBTrack_z0
std::string m_FourMuTreeName
std::vector< float > m_CBTrack_pt
std::vector< float > m_Refit1_sigma_pt
std::string m_triggerName
std::string m_refit2TreeName
virtual StatusCode initialize()
std::vector< float > m_Refit1_d0
std::vector< float > m_Truth_eta
ToolHandle< CP::ITrackVertexAssociationTool > m_Trk2VtxAssociationTool
std::string m_defaultTreeName
double m_negative_d0_PVerr
double m_positive_2_z0_err
std::vector< float > m_CBTrack_sigma_qoverp
std::vector< int > m_nSCThits
std::vector< int > m_nTRThits
std::vector< float > m_IDTrack_qoverp
std::vector< float > m_Refit2_z0
std::string m_truthLinkVecName
TrackParticle input name.
std::vector< float > m_Truth_d0
std::vector< int > m_nBLhits
std::vector< float > m_Refit1_pt
double m_LeadingMuonPtCut
std::string m_defaultTreeFolder
std::string m_IDTreeFolder
double m_el_positive2_d0_err
SG::ReadCondHandleKey< InDet::BeamSpotData > m_beamSpotKey
used for truth parameters
std::vector< float > m_IDTrack_phi
virtual StatusCode execute(const EventContext &ctx)
Execute method.
std::vector< float > m_Refit2_sigma_pt
std::string m_sTriggerChainName
std::string m_MSTreeName
SG::ReadHandleKey< xAOD::VertexContainer > m_vertexKey
std::string m_commonTreeFolder
std::vector< float > m_IDTrack_sigma_z0
double m_negative_sigma_pt
std::string m_combTreeName
void ExtractIDHitsInformation(const xAOD::Muon *muon_pos, const xAOD::Muon *muon_neg)
const xAOD::TruthParticle * getTruthParticle(const xAOD::IParticle &p)
ToolHandle< CP::IMuonSelectionTool > m_muonSelector
used to pass a custom muon selector
std::vector< float > m_Refit2_sigma_qoverp
std::string m_commonTreeName
std::vector< float > m_Refit1_z0
std::vector< float > m_Truth_qoverp
std::vector< float > m_IDTrack_z0
StatusCode FillRecParameters(const Trk::Track *track, const xAOD::TrackParticle *trackp_for_unbias, double charge, const xAOD::Vertex *vertex, const EventContext &ctx)
std::vector< float > m_Refit2_phi
double m_el_negative2_d0_err
std::vector< int > m_nPIXhits
std::vector< float > m_IDTrack_sigma_pt
unsigned int m_nTrkInVtx
StatusCode bookTrees()
ZmumuEvent m_xZmm
std::vector< float > m_CBTrack_eta
std::string m_refit2TreeFolder
std::vector< int > m_Truth_parent
std::vector< float > m_IDTrack_sigma_qoverp
std::string m_IDTreeName
SG::ReadHandleKey< xAOD::EventInfo > m_EventInfoKey
ToolHandle< InDet::IInDetTrackSelectionTool > m_selTool
The track selection Tool.
std::vector< float > m_Refit1_sigma_z0
std::vector< float > m_CBTrack_qoverp
double m_el_negative1_d0_err
std::vector< float > m_Refit2_sigma_z0
std::vector< float > m_IDTrack_eta
std::vector< float > m_CBTrack_phi
IDPerfMonZmumu(const std::string &name, ISvcLocator *pSvcLocator)
needed for IP resolution studies
static const T * getContainer(CONTAINERS eContainer)
Helper class to provide constant type-safe access to aux data.
bool isAvailable(const ELT &e) const
Test to see if this variable exists in the store.
const_pointer_type cptr()
virtual bool isValid() override final
Can the handle be successfully dereferenced?
double eta() const
Access method for pseudorapidity - from momentum.
const Amg::Vector3D & momentum() const
Access method for the momentum.
double pT() const
Access method for transverse momentum.
Class describing the Line to which the Perigee refers to.
const Perigee * perigeeParameters() const
return Perigee.
Class providing the definition of the 4-vector interface.
const TrackParticle * trackParticle(TrackParticleType type) const
Returns a pointer (which can be a nullptr) to the TrackParticle used in identification of this muon.
Definition Muon_v1.cxx:423
float z0() const
Returns the parameter.
float theta() const
Returns the parameter, which has range 0 to .
virtual FourMom_t p4() const override final
The full 4-momentum of the particle.
const Trk::Perigee & perigeeParameters() const
Returns the Trk::MeasuredPerigee track parameters.
const Trk::Track * track() const
Returns a pointer (which can be NULL) to the Trk::Track which was used to make this TrackParticle.
const ParametersCovMatrix_t definingParametersCovMatrix() const
Returns the 5x5 symmetric matrix containing the defining parameters covariance matrix.
float d0() const
Returns the parameter.
bool summaryValue(uint8_t &value, const SummaryType &information) const
Accessor for TrackSummary values.
float qOverP() const
Returns the parameter.
std::vector< float > definingParametersCovMatrixVec() const
Returns the length 6 vector containing the elements of defining parameters covariance matrix.
virtual double pt() const override final
The transverse momentum ( ) of the particle.
float charge() const
Returns the charge.
float z() const
Vertex longitudinal distance along the beam line form the origin.
float y() const
Vertex y displacement.
float x() const
Vertex x displacement.
VxType::VertexType vertexType() const
The type of the vertex.
bool contains(const std::string &s, const std::string &regx)
does a string contain the substring
Definition hcg.cxx:116
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 ...
Eigen::Matrix< double, 3, 1 > Vector3D
@ OWN_ELEMENTS
this data object owns its elements
@ anyDirection
ParametersT< TrackParametersDim, Charged, PerigeeSurface > Perigee
ParametersT< TrackParametersDim, Charged, StraightLineSurface > AtaStraightLine
CurvilinearParametersT< TrackParametersDim, Charged, PlaneSurface > CurvilinearParameters
@ theta
Definition ParamDefs.h:66
@ qOverP
perigee
Definition ParamDefs.h:67
@ phi
Definition ParamDefs.h:75
@ d0
Definition ParamDefs.h:63
@ z0
Definition ParamDefs.h:64
@ PriVtx
Primary vertex.
MissingET_v1 MissingET
Version control by type defintion.
TruthVertex_v1 TruthVertex
Typedef to implementation.
Definition TruthVertex.h:15
TrackParticle_v1 TrackParticle
Reference the current persistent version:
VertexContainer_v1 VertexContainer
Definition of the current "Vertex container version".
Vertex_v1 Vertex
Define the latest version of the vertex class.
TruthParticle_v1 TruthParticle
Typedef to implementation.
Muon_v1 Muon
Reference the current persistent version:
MuonContainer_v1 MuonContainer
Definition of the current "Muon container version".
@ numberOfPixelHoles
number of pixel layers on track with absence of hits [unit8_t].
@ numberOfContribPixelLayers
number of contributing layers of the pixel detector [unit8_t].
@ numberOfTRTHits
number of TRT hits [unit8_t].
@ numberOfBLayerHits
these are the hits in the first pixel layer, i.e.
@ numberOfSCTHits
number of hits in SCT [unit8_t].
@ numberOfPixelHits
these are the pixel hits, including the b-layer [unit8_t].
@ numberOfSCTHoles
number of SCT holes [unit8_t].
TruthParticleContainer_v1 TruthParticleContainer
Declare the latest version of the truth particle container.
Struct Holding the result to return and intermediate objects Things are owned by the EDM or the uniqu...
std::unique_ptr< Trk::Track > refittedTrack
Pointer to the refitted track.