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 //m_commonTree cannot be null here
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");
1304 auto muonTrks = std::make_unique<TrackCollection>(SG::OWN_ELEMENTS);
1305 auto muonTrksRefit1 = std::make_unique<TrackCollection>(SG::OWN_ELEMENTS);
1306 auto muonTrksRefit2 = std::make_unique<TrackCollection>(SG::OWN_ELEMENTS);
1307
1308 ATH_MSG_DEBUG("** IDPerfMonZmumu::execute ** Going to refit and store the track parameters ");
1309 std::unique_ptr<Trk::Track> defaultMuonTrk1;
1310 std::unique_ptr<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 = std::make_unique<Trk::Track>(*ppos_comb->track());
1321 fitStatus = m_TrackRefitter1->refitTrack( ctx, ppos_comb->track(), fitResult );
1322 if (fitStatus.isFailure()) {
1323 ATH_MSG_DEBUG("** IDPerfMonZmumu::execute ** Track Refit1 Failed for ppos_comb->track(). Skipping Event");
1324 return StatusCode::SUCCESS;
1325 } else {
1326 refit1MuonTrk1 = fitResult.refittedTrack.release();
1327 muonTrksRefit1->push_back(refit1MuonTrk1);
1328 ATH_MSG_DEBUG("** IDPerfMonZmumu::execute ** Track Refit1 Success of ppos_comb->track()."
1329 << " Original pt: " << ppos_comb->track()->perigeeParameters()->pT()
1330 << " track refit pt: " << refit1MuonTrk1->perigeeParameters()->pT() );
1331 }
1332 fitStatus = m_TrackRefitter2->refitTrack( ctx, ppos_comb->track(), fitResult );
1333 if (fitStatus.isFailure()) {
1334 ATH_MSG_DEBUG("** IDPerfMonZmumu::execute ** Track Refit2 Failed for ppos_comb->track(). Skipping Event");
1335 return StatusCode::SUCCESS;
1336 } else {
1337 refit2MuonTrk1 = fitResult.refittedTrack.release();
1338 muonTrksRefit2->push_back(refit2MuonTrk1);
1339 ATH_MSG_DEBUG("** IDPerfMonZmumu::execute ** Track Refit2 Success of ppos_comb->track()."
1340 << " Original pt: " << ppos_comb->track()->perigeeParameters()->pT()
1341 << " track refit pt: " << refit1MuonTrk1->perigeeParameters()->pT() );
1342 }
1343 }
1344
1345 if( pneg_comb->track() ) {
1346 defaultMuonTrk2 = std::make_unique<Trk::Track>(*pneg_comb->track());
1347
1348 IegammaTrkRefitterTool::Cache fitResult {};
1349 fitStatus = m_TrackRefitter1->refitTrack( ctx, pneg_comb->track(), fitResult);
1350 if (fitStatus.isFailure()) {
1351 ATH_MSG_DEBUG("** IDPerfMonZmumu::execute ** Track Refit1 Failed. Skipping Event");
1352 return StatusCode::SUCCESS;
1353 } else {
1354 refit1MuonTrk2 = fitResult.refittedTrack.release();
1355 muonTrksRefit1->push_back(refit1MuonTrk2);
1356 ATH_MSG_DEBUG("** IDPerfMonZmumu::execute ** Track Refit1 Success of pneg_comb->track()."
1357 << " Original pt: " << pneg_comb->track()->perigeeParameters()->pT()
1358 << " track refit pt: " << refit1MuonTrk2->perigeeParameters()->pT() );
1359 }
1360
1361
1362 fitStatus = m_TrackRefitter2->refitTrack( ctx, pneg_comb->track(), fitResult );
1363 if (fitStatus.isFailure()) {
1364 ATH_MSG_DEBUG("Track Refit2 Failed. Skipping Event");
1365 return StatusCode::SUCCESS;
1366 } else {
1367 refit2MuonTrk2 = fitResult.refittedTrack.release();
1368 muonTrksRefit2->push_back(refit2MuonTrk2);
1369 ATH_MSG_DEBUG("** IDPerfMonZmumu::execute ** Track Refit2 Success of pneg_comb->track()."
1370 << " Original pt: " << pneg_comb->track()->perigeeParameters()->pT()
1371 << " track refit pt: " << refit2MuonTrk2->perigeeParameters()->pT() );
1372 }
1373 if (muonTrksRefit1->size() != 2) ATH_MSG_WARNING("** IDPerfMonZmumu::execute ** WARNING ** size of muonTrksRefit1: " << muonTrksRefit1->size());
1374 if (muonTrksRefit2->size() != 2) ATH_MSG_WARNING("** IDPerfMonZmumu::execute ** WARNING ** size of muonTrksRefit2: " << muonTrksRefit2->size());
1375 }
1376
1377 //save tracks to storegrate, they can be used by InDetAlignmentMonitoring
1378 muonTrks->push_back(defaultMuonTrk1.release());
1379 muonTrks->push_back(defaultMuonTrk2.release());
1380 auto nMuonTracks = muonTrks->size();
1381 StatusCode sc = evtStore()->record(std::move(muonTrks), m_outputTracksName);
1382 if (sc.isSuccess()) {
1383 ATH_MSG_DEBUG ("Stored "<< nMuonTracks << " " << m_outputTracksName <<" into StoreGate");
1384 } else{
1385 ATH_MSG_WARNING ("Failed storing " << m_outputTracksName);
1386 }
1387 auto nMuonTracks1 = muonTrksRefit1->size();
1388 if (nMuonTracks1 > 1) { // keep track collection if at least 2 muons were found
1389 sc = evtStore()->record(std::move(muonTrksRefit1), m_outputTracksName + "Refit1");
1390 if (sc.isSuccess()) {
1391 ATH_MSG_DEBUG ("Stored "<< nMuonTracks1 << " " << m_outputTracksName + "Refit1" << " into StoreGate");
1392 } else {
1393 ATH_MSG_WARNING ("Failed storing " << m_outputTracksName + "Refit1");
1394 }
1395 }
1396 auto nMuonTracks2 = muonTrksRefit2->size();
1397 if (nMuonTracks2 > 1) { // keep track collection if at least 2 muons were found
1398 sc = evtStore()->record(std::move(muonTrksRefit2), m_outputTracksName + "Refit2");
1399 if (sc.isSuccess()) {
1400 ATH_MSG_DEBUG ("Stored "<< nMuonTracks2 << " " << m_outputTracksName + "Refit2" << " into StoreGate");
1401 } else {
1402 ATH_MSG_WARNING ("Failed storing " << m_outputTracksName + "Refit2");
1403 }
1404 }
1405
1406 //fill refit1 ID parameters
1407 if (nMuonTracks1<2) {
1408 ATH_MSG_WARNING("** IDPerfMonZmumu::execute ** Refit1 muon tracks are missing!");
1409 } else {
1410 ATH_MSG_DEBUG("** IDPerfMonZmumu::execute ** going to fill refit1tree ");
1411 success_pos = FillRecParametersSimple (refit1MuonTrk1, ppos_comb->charge(), ppos_comb_v, ctx);
1412 success_neg = FillRecParametersSimple (refit1MuonTrk2, pneg_comb->charge(), pneg_comb_v, ctx);
1413
1414 if (m_storeZmumuNtuple) {
1415 if (success_pos && success_neg) {
1416 if (m_refit1Tree) {
1417 ATH_MSG_DEBUG("-- Filling ntuple " << m_refit1Tree->GetName() << " entry " << m_refit1Tree->GetEntries()
1418 << " for run: " << m_runNumber
1419 << " event: " << m_evtNumber
1420 << " Lumiblock: " << m_lumi_block
1421 << " Invariant mass = " << m_xZmm.GetInvMass() << " GeV ");
1422 }
1423 ATH_MSG_DEBUG("Negative p: (" << m_negative_px << ", "
1424 << m_negative_py << ", "
1425 << m_negative_pz << ") "
1426 << " d0: " << m_negative_d0
1427 << " z0: " << m_negative_z0
1428 << " sigma_pt: " << m_positive_sigma_pt);
1429 ATH_MSG_DEBUG("Positive p: (" << m_positive_px << ","
1430 << m_positive_py << ","
1431 << m_positive_pz << ") "
1432 << " d0: " << m_positive_d0
1433 << " z0: " << m_positive_z0
1434 << " sigma_pt: " << m_negative_sigma_pt);
1435 if (m_refit1Tree) {
1436 m_refit1Tree->Fill();
1437 }
1438 // Fill vectors for common ntuple
1439 m_Refit1_pt.push_back(m_positive_pt);
1440 m_Refit1_pt.push_back(m_negative_pt);
1441 m_Refit1_eta.push_back(m_positive_eta);
1442 m_Refit1_eta.push_back(m_negative_eta);
1443 m_Refit1_phi.push_back(m_positive_phi);
1444 m_Refit1_phi.push_back(m_negative_phi);
1445 m_Refit1_d0.push_back(m_positive_d0);
1446 m_Refit1_d0.push_back(m_negative_d0);
1447 m_Refit1_z0.push_back(m_positive_z0);
1448 m_Refit1_z0.push_back(m_negative_z0);
1449
1456 } // if (success_pos && success_neg)
1457 } // if (m_storeZmumuNtuple)
1458 } // enough refit1 tracks
1459
1460 //fill refit2 ID parameters
1461 if (muonTrksRefit2->size()<2) {
1462 ATH_MSG_WARNING("** IDPerfMonZmumu::execute ** Refit2 muon tracks are missing!");
1463 } else{
1464 ATH_MSG_DEBUG("-- >> going to fill refit2params << --");
1465 success_pos = FillRecParametersSimple (refit2MuonTrk1, ppos_comb->charge(), ppos_comb_v, ctx);
1466 success_neg = FillRecParametersSimple (refit2MuonTrk2, pneg_comb->charge(), pneg_comb_v, ctx);
1467
1468 if (m_storeZmumuNtuple) {
1469 if (success_pos && success_neg) {
1470 if (m_refit2Tree) {
1471 ATH_MSG_DEBUG("-- Filling " << m_refit2Tree->GetName() << " entry " << m_refit2Tree->GetEntries()
1472 << " run: " << m_runNumber
1473 << " event: " << m_evtNumber
1474 << " Lumiblock: " << m_lumi_block
1475 << " Invariant mass = " << m_xZmm.GetInvMass() << " GeV ");
1476 }
1477 ATH_MSG_DEBUG("Negative p: (" << m_negative_px << ", "
1478 << m_negative_py << ", "
1479 << m_negative_pz << ") "
1480 << " d0: " << m_negative_d0
1481 << " z0: " << m_negative_z0
1482 << " sigma_pt: " << m_positive_sigma_pt);
1483 ATH_MSG_DEBUG("Positive p: (" << m_positive_px << ","
1484 << m_positive_py << ","
1485 << m_positive_pz << ") "
1486 << " d0: " << m_positive_d0
1487 << " z0: " << m_positive_z0
1488 << " sigma_pt: " << m_negative_sigma_pt);
1489 if (m_refit2Tree) {
1490 m_refit2Tree->Fill();
1491 }
1492 // Fill vectors for common ntuple
1493 m_Refit2_pt.push_back(m_positive_pt);
1494 m_Refit2_pt.push_back(m_negative_pt);
1495 m_Refit2_eta.push_back(m_positive_eta);
1496 m_Refit2_eta.push_back(m_negative_eta);
1497 m_Refit2_phi.push_back(m_positive_phi);
1498 m_Refit2_phi.push_back(m_negative_phi);
1499 m_Refit2_d0.push_back(m_positive_d0);
1500 m_Refit2_d0.push_back(m_negative_d0);
1501 m_Refit2_z0.push_back(m_positive_z0);
1502 m_Refit2_z0.push_back(m_negative_z0);
1503
1510 } // if (success_pos && success_neg)
1511 } // if (m_storeZmumuNtuple)
1512 } // enough refit2 tracks
1513
1514 ATH_MSG_DEBUG("Execute() All NTUPLES filled Run: " << m_runNumber << " event: " << m_evtNumber << " mass: " << m_xZmm.GetInvMass() << " GeV ");
1515 }
1516 } // closing -> if ( m_xZmm.AcceptEvent() )
1517
1518 if ( !m_xZmm.AcceptEvent() ) {
1519 // no good muon pair found
1520 //failed cuts, continue to next event
1521 ATH_MSG_DEBUG ("** IDPerfMonZmumu::execute ** No good muon pair found. Leaving Execute(). Run: " << m_runNumber << " event: " << m_evtNumber);
1522 return StatusCode::SUCCESS;
1523 }
1524
1525 //
1526 // fill truth event iformation even when the reco event has not passed
1527 //
1528 if (m_isMC) {
1529 bool truthStatusIsGood = true;
1530 if (FillTruthParameters(ppos_comb, ctx).isFailure()){
1531 truthStatusIsGood = false;
1532 ATH_MSG_WARNING("Failed to fill truth parameters - skipping event");
1533 }
1534 if (FillTruthParameters(pneg_comb, ctx).isFailure()){
1535 truthStatusIsGood = false;
1536 ATH_MSG_WARNING("Failed to fill truth parameters - skipping event");
1537 }
1538 if (truthStatusIsGood) {
1539 ATH_MSG_DEBUG ("-- Filling " << m_truthTree->GetName() << " entry " << m_truthTree->GetEntries()
1540 << " run: " << m_runNumber
1541 << " event: " << m_evtNumber
1542 << " Lumiblock: " << m_lumi_block
1543 << " Invariant mass = " << m_xZmm.GetInvMass() << " GeV ");
1544 ATH_MSG_DEBUG ("Negative p: (" << m_negative_px << ", "
1545 << m_negative_py << ", "
1546 << m_negative_pz << ") "
1547 << " d0: " << m_negative_d0
1548 << " z0: " << m_negative_z0
1549 << " parent: " << m_negative_parent);
1550 ATH_MSG_DEBUG ("Positive p: (" << m_positive_px << ","
1551 << m_positive_py << ","
1552 << m_positive_pz << ") "
1553 << " d0: " << m_positive_d0
1554 << " z0: " << m_positive_z0
1555 << " parent: " << m_positive_parent);
1556
1558 m_Truth_pt.push_back(m_positive_pt);
1559 m_Truth_pt.push_back(m_negative_pt);
1560 m_Truth_eta.push_back(m_positive_eta);
1561 m_Truth_eta.push_back(m_negative_eta);
1562 m_Truth_phi.push_back(m_positive_phi);
1563 m_Truth_phi.push_back(m_negative_phi);
1564 m_Truth_d0.push_back(m_positive_d0);
1565 m_Truth_d0.push_back(m_negative_d0);
1566 m_Truth_z0.push_back(m_positive_z0);
1567 m_Truth_z0.push_back(m_negative_z0);
1572
1573 } // truth info properly filled
1574 else {
1575 ATH_MSG_DEBUG("FAILED filling m_truthTree "
1576 << " for run: " << m_runNumber
1577 << " event: " << m_evtNumber
1578 << " Lumiblock: " << m_lumi_block);
1579 }
1580 } // if (m_isMC)
1581
1582 // fill common tree
1583 if (m_commonTree ) {
1584 // fill ntuple if some of the collections is filled
1585 bool dofill = false;
1586 if (m_IDTrack_pt.size() >= 2) dofill = true;
1587 if (m_CBTrack_pt.size() >= 2) dofill = true;
1588 if (m_Refit1_pt.size() >= 2) dofill = true;
1589 if (m_Refit2_pt.size() >= 2) dofill = true;
1590 if (m_Truth_pt.size() >= 2) dofill = true;
1591
1592 if (dofill) {
1593 ATH_MSG_DEBUG("-- Filling m_commonTree " << m_commonTree->GetName() << " entry " << m_commonTree->GetEntries()
1594 << " run: " << m_runNumber
1595 << " event: " << m_evtNumber
1596 << " Lumiblock: " << m_lumi_block
1597 << " Invariant mass = " << m_xZmm.GetInvMass() << " GeV ");
1598 m_commonTree->Fill();
1599 }
1600 else {
1601 ATH_MSG_DEBUG("-- Filling m_commonTree " << m_commonTree->GetName() << " FAILED for "
1602 << " run: " << m_runNumber
1603 << " event: " << m_evtNumber
1604 << " Lumiblock: " << m_lumi_block);
1605 }
1606 }
1607
1608 ATH_MSG_DEBUG(" --IDPerfMonZmumu::execute-- event completed -- Run: " << m_runNumber << " event: " << m_evtNumber);
1609
1610 /* ***********************************************************
1611 * after all, let's make the collection for ALL MUON ID Tracks
1612 * ***********************************************************/
1613
1614 ATH_MSG_DEBUG("IDTracks monitoring..");
1615 int nTracks = 0;
1617
1618 // DIFFERENT RETRIEVAL
1620 if(muons){
1621 for (auto muon : *muons) {
1622 const xAOD::TrackParticle* tp = muon->trackParticle(xAOD::Muon::TrackParticleType::InnerDetectorTrackParticle);
1623 if(!tp) {
1624 ATH_MSG_DEBUG(" - tpb = "<< tp << " -> is null? " << (!tp));
1625 continue;
1626 }
1627 const Trk::Track* t = tp->track();
1628 if ( !t ) {
1629 ATH_MSG_DEBUG(" - tpb does not have track ");
1630 continue;
1631 }
1632 const Trk::Perigee* tPerigee = t->perigeeParameters() ;
1633 if ( !tPerigee ) {
1634 ATH_MSG_DEBUG(" - t does not have perigree ");
1635 continue;
1636 }
1637 IDTracks->push_back ( new Trk::Track (*t));
1638 nTracks++;
1639 }
1640 }
1641 else ATH_MSG_WARNING ("Could not retrieve Muon container");
1642
1643 ATH_MSG_DEBUG(" --> nTracks = " << nTracks);
1644
1645 StatusCode scid = evtStore()->record(IDTracks, "IDTracks");
1646 if (scid.isSuccess()) {
1647 ATH_MSG_DEBUG ("Stored "<< IDTracks->size() << " IDTracks into StoreGate");
1648 }
1649 else{
1650 ATH_MSG_WARNING ("Failed storing IDTracks");
1651 }
1652
1653 /*********************************************************
1654 * ..finish
1655 ********************************************************/
1656
1657 return StatusCode::SUCCESS;
1658}
1659
1660//==================================================================================
1662 const xAOD::TrackParticle* trackp_for_unbias,
1663 double charge,
1664 const xAOD::Vertex* vertex,
1665 const EventContext& ctx)
1666{
1667 if (!trackp){
1668 //ATH_MSG_WARNING("Empty Trackparticle. Skipping.");
1669 return StatusCode::FAILURE;
1670 }
1671
1672 if (m_doRemoval && !trackp_for_unbias && !m_skipMS){
1673 return StatusCode::FAILURE;
1674 }
1675
1676 double px = 0;
1677 double py = 0;
1678 double pt = 0;
1679 double pz = 0;
1680 double phi= 0;
1681 double eta= 0;
1682 double d0 = 0;
1683 double z0 = 0;
1684 double d0res = 0;
1685 double z0res = 0;
1686 double PVd0res = 0;
1687 double PVz0res = 0;
1688 double PVd0 = 0;
1689 double PVz0 = 0;
1690 double sigma_pt = 0;
1691 double qoverp = 0;
1692 double sigma_qOverP = 1.; // use a large value by default as 0 is meaningless
1693
1694
1695 px = trackp->p4().Px();
1696 py = trackp->p4().Py();
1697 pt = trackp->p4().Pt();
1698 pz = trackp->p4().Pz();
1699 phi= trackp->p4().Phi();
1700 eta= trackp->p4().Eta();
1701 d0 = trackp->d0();
1702 z0 = trackp->z0();
1703 qoverp = trackp->qOverP();
1704
1705 d0res = std::sqrt(trackp->definingParametersCovMatrix()(Trk::d0,Trk::d0));
1706 z0res = std::sqrt(trackp->definingParametersCovMatrix()(Trk::z0,Trk::z0));
1707 sigma_qOverP = std::sqrt(trackp->definingParametersCovMatrix()(Trk::qOverP,Trk::qOverP));
1708 double sigma_theta = std::sqrt(trackp->definingParametersCovMatrix()(Trk::theta,Trk::theta));
1709
1710 // computing sigma_pt
1711 // pt = sin(theta) / qOverP --> sigma(pt) = (sin(theta)/ qOverP^2) x sigma(qOverP) // neglecting sigma(sin(theta))
1712 double sigma_pt_term1 = (sin(trackp->theta()) / pow(qoverp,2)) * sigma_qOverP;
1713 double sigma_pt_term2 = (1./qoverp) * cos(trackp->theta()) * sigma_theta;
1714 double sigma_pt_term3 = (cos(trackp->theta()) / pow(qoverp,2)) * sigma_theta * sigma_qOverP;
1715 sigma_pt = sqrt( pow(sigma_pt_term1,2) + pow(sigma_pt_term2,2) + 2 * sigma_pt_term3 * trackp->definingParametersCovMatrix()(Trk::qOverP,Trk::theta));
1716
1717 //
1718 if (vertex == nullptr) {
1719 ATH_MSG_WARNING("in FillRecParametersTP. WARNING: Vertex is NULL");
1720 return StatusCode::FAILURE;
1721 }
1723 ATH_MSG_WARNING("in FillRecParametersTP. WARNING: m_trackToVertexIPEstimator is NULL");
1724 return StatusCode::FAILURE;
1725 }
1726
1727 if (m_doIP && vertex != nullptr && m_trackToVertexIPEstimator){
1728 std::unique_ptr<Trk::ImpactParametersAndSigma> iPandSigma(nullptr);
1729 ATH_MSG_DEBUG("-- using the trackToVertexIPEstimator --");
1730 //Calling the estimate(trackp,newtrackp,vertex,doRemoval)
1731 //The first track is used to unbias the vertex, the second to get the extrapolation
1732 if (!m_skipMS) iPandSigma = m_trackToVertexIPEstimator->estimate(ctx, trackp_for_unbias, trackp, vertex, m_doRemoval);
1733 else iPandSigma = m_trackToVertexIPEstimator->estimate(ctx, trackp, vertex);
1734 ATH_MSG_DEBUG("return from the trackToVertexIPEstimator->estimate()");
1735
1736 if( !iPandSigma ){
1737 ATH_MSG_WARNING ("FillRecParametersTP::trackToVertexIPEstimator failed !");
1738 return StatusCode::FAILURE;
1739 }
1740 else{
1741 ATH_MSG_DEBUG("FillRecParametersTP::trackToVertexIPEstimator success !");
1742 PVd0 = iPandSigma->IPd0;
1743 PVd0res = iPandSigma->PVsigmad0;
1744 d0res = iPandSigma->sigmad0;
1745 PVz0 = iPandSigma->IPz0;
1746 PVz0res = iPandSigma->PVsigmaz0;
1747 z0res = iPandSigma->sigmaz0;
1748 }
1749 }
1750
1751 if (charge == 1) {
1752 m_positive_px = px;
1753 m_positive_py = py;
1754 m_positive_pt = pt;
1755 m_positive_pz = pz;
1758 m_positive_z0 = z0;
1759 m_positive_z0_err = z0res;
1760 m_positive_d0 = d0;
1761 m_positive_d0_err = d0res;
1762 m_positive_sigma_pt = sigma_pt;
1763 m_positive_qoverp = qoverp;
1764 m_positive_sigma_qoverp = sigma_qOverP;
1765 if(m_doIP){
1766 m_positive_z0_PV = PVz0;
1767 m_positive_d0_PV = PVd0;
1768 m_positive_z0_PVerr = PVz0res;
1769 m_positive_d0_PVerr = PVd0res;
1770 }
1771 ATH_MSG_DEBUG("(Filled charge == 1 ) (reco)-> px : "<< px <<" py: "<<py <<" pt: "<<pt <<" pz: "<<pz
1772 <<" d0: "<<m_positive_d0 << " d0res : "<< d0res << " PVd0res : "<< PVd0res <<" z0: "<< m_positive_z0 << " z0res : " << z0res << " PVz0res : "<< PVz0res );
1773
1774 } else if (charge == -1) {
1775 m_negative_px = px;
1776 m_negative_py = py;
1777 m_negative_pt = pt;
1778 m_negative_pz = pz;
1781 m_negative_z0 = z0;
1782 m_negative_z0_err = z0res;
1783 m_negative_d0 = d0;
1784 m_negative_d0_err = d0res;
1785 m_negative_sigma_pt = sigma_pt;
1786 m_negative_qoverp = qoverp;
1787 m_negative_sigma_qoverp = sigma_qOverP;
1788 if(m_doIP){
1789 m_negative_z0_PV = PVz0;
1790 m_negative_d0_PV = PVd0;
1791 m_negative_z0_PVerr = PVz0res;
1792 m_negative_d0_PVerr = PVd0res;
1793 }
1794 ATH_MSG_DEBUG("(Filled charge == -1 ) (reco)-> px : "<< px <<" py: "<< py <<" pt: " << pt <<" pz: "<<pz
1795 <<" d0: "<<m_negative_d0 << " d0res : "<< d0res << " PVd0res : "<< PVd0res <<" z0: "<< m_negative_z0 << " z0res : " << z0res << " PVz0res : "<< PVz0res );
1796 }
1797
1798 return StatusCode::SUCCESS;
1799}
1800
1801
1802//==================================================================================
1803StatusCode IDPerfMonZmumu::FillRecParameters (const Trk::Track* track, const xAOD::TrackParticle* trackp_for_unbias, double charge,const xAOD::Vertex* vertex, const EventContext& ctx)
1804{
1805 if (!track){
1806 ATH_MSG_DEBUG("* FillRecParameters * Empty Track: track. Skipping.");
1807 return StatusCode::FAILURE;
1808 }
1809
1810 if (m_doRemoval && !trackp_for_unbias && !m_skipMS) {
1811 ATH_MSG_DEBUG("* FillRecParameters * Empty Track: trackp_for_unbias. Skipping.");
1812 return StatusCode::FAILURE;
1813 }
1814
1815 const Trk::Perigee* trkPerigee = track->perigeeParameters();
1816 const Trk::Perigee* trk_for_unbiasPerigee = nullptr;
1817 if (!m_skipMS) trk_for_unbiasPerigee = &(trackp_for_unbias->perigeeParameters());
1818
1819 double px = 0;
1820 double py = 0;
1821 double pt = 0;
1822 double pz = 0;
1823 double phi= 0;
1824 double eta= 0;
1825 double d0 = 0;
1826 double z0 = 0;
1827
1828 double d0_err = 999.;
1829 double z0_err = 999.;
1830
1831 double PVd0 = 0;
1832 double PVz0 = 0;
1833 double PVd0res = 0;
1834 double PVz0res = 0;
1835
1836
1837 if (trkPerigee != nullptr){
1838 double qOverP = trkPerigee->parameters()[Trk::qOverP];
1839 if (qOverP) {
1840 px = trkPerigee->momentum().x();
1841 py = trkPerigee->momentum().y();
1842 pt = std::abs(trkPerigee->pT());
1843 pz = trkPerigee->momentum().z();
1844 phi= trkPerigee->parameters()[Trk::phi];
1845 eta= trkPerigee->eta();
1846 d0 = trkPerigee->parameters()[Trk::d0];
1847 z0 = trkPerigee->parameters()[Trk::z0];
1848 d0_err = Amg::error(*trkPerigee->covariance(),Trk::d0);
1849 z0_err = Amg::error(*trkPerigee->covariance(),Trk::z0);
1850 }
1851 }
1852
1853 // access beam spot and extrapolate track till there
1854 SG::ReadCondHandle<InDet::BeamSpotData> beamSpotHandleRec { m_beamSpotKey, ctx };
1855 auto beamline = m_trackToVertexTool->GetBeamLine(beamSpotHandleRec.cptr());
1856
1857 auto trackBLtemp = m_trackToVertexTool->trackAtBeamline(ctx, *track , beamline.get() );
1858 const Trk::AtaStraightLine* atBL = dynamic_cast<const Trk::AtaStraightLine*>(trackBLtemp.get());
1859
1860 if (atBL){
1861 double qOverP = atBL->parameters()[Trk::qOverP];
1862 if(qOverP){
1863 px = atBL->momentum().x();
1864 py = atBL->momentum().y();
1865 pt = std::abs(atBL->pT());
1866 pz = atBL->momentum().z();
1867 eta= trkPerigee->eta();
1868 phi= trkPerigee->parameters()[Trk::phi];
1869 d0 = atBL->parameters()[Trk::d0];
1870 z0 = atBL->parameters()[Trk::z0];
1871 }
1872 delete atBL;
1873 }
1874 else {
1875 ATH_MSG_WARNING("FillRecParameters::Failed extrapolation to the BeamLine");
1876 }
1877
1878
1879 // Amg::Vector3D position = beamSpotHandleRec->beamPos();
1880 TLorentzVector vtrack = TLorentzVector (trkPerigee->momentum().x(),
1881 trkPerigee->momentum().y(),
1882 trkPerigee->momentum().z(),
1883 trkPerigee->momentum().mag());
1884
1885 if(m_doIP && vertex){ //I assume that the vertex is the same of the original track
1886 std::unique_ptr<Trk::ImpactParametersAndSigma> iPandSigma(nullptr);
1887 if (!m_skipMS) iPandSigma = m_trackToVertexIPEstimator->estimate(ctx, trk_for_unbiasPerigee,trkPerigee,vertex,m_doRemoval);
1888 else iPandSigma = m_trackToVertexIPEstimator->estimate(ctx, trkPerigee,vertex);
1889 if( iPandSigma==0 ){
1890 ATH_MSG_WARNING ("FillRecParameters::trackToVertexIPEstimator failed !");
1891 return StatusCode::FAILURE;
1892 }
1893 else{
1894 ATH_MSG_DEBUG("FillRecParameters::trackToVertexIPEstimator success !");
1895 PVd0 = iPandSigma->IPd0;
1896 PVd0res = iPandSigma->PVsigmad0;
1897 //d0res = iPandSigma->sigmad0; //-> ?
1898 PVz0 = iPandSigma->IPz0;
1899 PVz0res = iPandSigma->PVsigmaz0;
1900 //z0res = iPandSigma->sigmaz0; //-> ?
1901
1902 if (vertex) {
1903 ATH_MSG_INFO(" FillRecParameters::trackToVertexIPEstimator vertex does exist ");
1904 m_pv_x = vertex->x();
1905 m_pv_y = vertex->y();
1906 m_pv_z = vertex->z();
1907 m_nTrkInVtx = vertex->nTrackParticles();
1908 }
1909
1910 }
1911 }
1912
1913 if (charge == 1) {
1914 m_positive_px = px;
1915 m_positive_py = py;
1916 m_positive_pt = pt;
1917 m_positive_pz = pz;
1920 m_positive_z0 = z0;
1921 m_positive_d0 = d0;
1922 m_positive_d0_err = d0_err;
1923 m_positive_z0_err = z0_err;
1924 if(m_doIP){
1925 m_positive_z0_PV = PVz0;
1926 m_positive_d0_PV = PVd0;
1927 m_positive_z0_PVerr = PVz0res;
1928 m_positive_d0_PVerr = PVd0res;
1929 }
1930 ATH_MSG_DEBUG("(Filled charge == 1 ) (reco)-> px : "<< px <<" py: "<<py <<" pz: "<<pz <<" d0: "<<d0<<" z0: "<< z0);
1931 }
1932 if (charge == -1) {
1933 m_negative_px = px;
1934 m_negative_py = py;
1935 m_negative_pt = pt;
1936 m_negative_pz = pz;
1939 m_negative_z0 = z0;
1940 m_negative_d0 = d0;
1941 m_negative_d0_err = d0_err;
1942 m_negative_z0_err = z0_err;
1943 if(m_doIP){
1944 m_negative_z0_PV = PVz0;
1945 m_negative_d0_PV = PVd0;
1946 m_negative_z0_PVerr = PVz0res;
1947 m_negative_d0_PVerr = PVd0res;
1948 }
1949 ATH_MSG_DEBUG("(Filled charge == -1 ) (reco)-> px : "<< px <<" py: "<<py <<" pz: "<<pz <<" d0: "<<d0<<" z0: "<<z0 );
1950 }
1951
1952 return StatusCode::SUCCESS;
1953}
1954//==================================================================================
1955StatusCode IDPerfMonZmumu::FillRecParametersSimple (const Trk::Track* track, float charge, const xAOD::Vertex* vertex, const EventContext& ctx)
1956{
1957 if (!track){
1958 ATH_MSG_DEBUG("* FillRecParametersSimple * Empty Track: track. Skipping.");
1959 return StatusCode::FAILURE;
1960 }
1961
1962 const Trk::Perigee* trkPerigee = track->perigeeParameters();
1963 if (not trkPerigee) {
1964 ATH_MSG_ERROR("trkPerigee pointer is null in IDPerfMonZmumu::FillRecParametersSimple");
1965 return StatusCode::FAILURE;
1966 }
1967 double px = 0;
1968 double py = 0;
1969 double pt = 0;
1970 double pz = 0;
1971 double phi= 0;
1972 double eta= 0;
1973
1974 double d0 = 0;
1975 double z0 = 0;
1976 double d0_err = 999.;
1977 double z0_err = 999.;
1978
1979 //
1980 double qOverP = trkPerigee->parameters()[Trk::qOverP];
1981 if (qOverP) {
1982 px = trkPerigee->momentum().x();
1983 py = trkPerigee->momentum().y();
1984 pt = std::abs(trkPerigee->pT());
1985 pz = trkPerigee->momentum().z();
1986 phi= trkPerigee->parameters()[Trk::phi];
1987 eta= trkPerigee->eta();
1988 d0 = trkPerigee->parameters()[Trk::d0];
1989 z0 = trkPerigee->parameters()[Trk::z0];
1990 d0_err = Amg::error(*trkPerigee->covariance(),Trk::d0);
1991 z0_err = Amg::error(*trkPerigee->covariance(),Trk::z0);
1992 }
1993
1994
1996 Amg::Vector3D position (eventInfo->beamPosX(), eventInfo->beamPosY(), eventInfo->beamPosZ());
1997 TLorentzVector vtrack = TLorentzVector (trkPerigee->momentum().x(),
1998 trkPerigee->momentum().y(),
1999 trkPerigee->momentum().z(),
2000 trkPerigee->momentum().mag());
2001
2002 SG::ReadCondHandle<InDet::BeamSpotData> beamSpotHandleRec { m_beamSpotKey, ctx }; // This method loads the proper beam spot conditions
2003
2004
2005 // access beam spot and extrapolate track till there
2006 auto beamline = m_trackToVertexTool->GetBeamLine(beamSpotHandleRec.cptr());
2007
2008 auto trackBLtemp = m_trackToVertexTool->trackAtBeamline(ctx, *track , beamline.get() );
2009 const Trk::AtaStraightLine* atBL = dynamic_cast<const Trk::AtaStraightLine*>(trackBLtemp.get());
2010
2011 if (atBL){
2012 double qOverP = atBL->parameters()[Trk::qOverP];
2013 if(qOverP){
2014 px = atBL->momentum().x();
2015 py = atBL->momentum().y();
2016 pt = std::abs(atBL->pT());
2017 pz = atBL->momentum().z();
2018 eta= trkPerigee->eta();
2019 phi= trkPerigee->parameters()[Trk::phi];
2020 d0 = atBL->parameters()[Trk::d0];
2021 z0 = atBL->parameters()[Trk::z0] - vertex->z(); // correct also for the vertex position along the beam line
2022 }
2023 ATH_MSG_DEBUG("* FillRecParametersSimple *"
2024 << " charge " << charge
2025 << " ** trackToVertexTool->trackAtBeamline ** "
2026 << "( " << beamSpotHandleRec->beamPos().x()
2027 << ", " << beamSpotHandleRec->beamPos().y()
2028 << ", " << beamSpotHandleRec->beamPos().z()
2029 << ") pt: " << pt
2030 << " d0: " << d0
2031 << " z0: " << z0);
2032 }
2033 else {
2034 ATH_MSG_WARNING("FillRecParametersSimple::Failed extrapolation to the BeamLine --> extrapolate using line approximation");
2035 float trkd0 = trkPerigee->parameters()[Trk::d0];
2036 float trkz0 = trkPerigee->parameters()[Trk::z0];
2037 float bsX = beamSpotHandleRec->beamPos().x();
2038 float bsY = beamSpotHandleRec->beamPos().y();
2039 float bsZ = beamSpotHandleRec->beamPos().z();
2040 float btiltX = beamSpotHandleRec->beamTilt(0);
2041 float btiltY = beamSpotHandleRec->beamTilt(1);
2042 // compute the corrections for the track parameters considering the beamspot position
2043 float beamX = bsX + std::tan(btiltX) * (trkz0-bsZ);
2044 float beamY = bsY + std::tan(btiltY) * (trkz0-bsZ);
2045 float beamD0 = ( -std::sin(vtrack.Phi())*beamX + std::cos(vtrack.Phi())*beamY );
2046
2047 // correct d0 and z0
2048 d0 = trkd0 - beamD0;
2049 z0 = trkz0 - bsZ - vertex->z(); // correct also for the vertex position along the beam line
2050
2051 ATH_MSG_DEBUG("* FillRecParametersSimple *"
2052 << " charge " << charge
2053 << " ** beamSpotHandleRec " << m_beamSpotKey
2054 << "( " << beamSpotHandleRec->beamPos().x()
2055 << ", " << beamSpotHandleRec->beamPos().y()
2056 << ", " << beamSpotHandleRec->beamPos().z()
2057 << ") pt: " << pt
2058 << " d0: " << d0
2059 << " z0: " << z0);
2060 }
2061
2062 // store the values
2063 if (charge == 1) { // positive particle
2064 m_positive_px = px;
2065 m_positive_py = py;
2066 m_positive_pt = pt;
2067 m_positive_pz = pz;
2070 m_positive_z0 = z0;
2071 m_positive_d0 = d0;
2072 m_positive_d0_err = d0_err;
2073 m_positive_z0_err = z0_err;
2074 }
2075 if (charge == -1) { // negative particle
2076 m_negative_px = px;
2077 m_negative_py = py;
2078 m_negative_pt = pt;
2079 m_negative_pz = pz;
2082 m_negative_z0 = z0;
2083 m_negative_d0 = d0;
2084 m_negative_d0_err = d0_err;
2085 m_negative_z0_err = z0_err;
2086 }
2087
2088 ATH_MSG_DEBUG("* FillRecParametersSimple * completed * charge " << charge << " pt: " << pt << " d0: " << d0 << " z0: " << z0);
2089 return StatusCode::SUCCESS;
2090}
2091
2092//==================================================================================
2093StatusCode IDPerfMonZmumu::FillTruthParameters(const xAOD::TrackParticle* trackParticle, const EventContext& ctx)
2094{
2095
2096 if (!trackParticle ){//|| !trackParticle->vertex()){
2097 ATH_MSG_WARNING("-- FillTruthParameters -- Empty Trackparticle. Skipping.");
2098 return StatusCode::FAILURE;
2099 }
2100
2101 const xAOD::TruthParticle* particle = getTruthParticle( *trackParticle );
2102 double charge = 0;
2103 if (!particle) {
2104 ATH_MSG_DEBUG(" -- FillTruthParameters -- Failure while retrieving the truth particle. Returning FAILURE.");
2105 return StatusCode::FAILURE;
2106 }
2107
2108 if ( particle->pdgId() == 13) charge = -1.; // muon-
2109 if ( particle->pdgId() == -13) charge = 1.; // muon+
2110 if ( particle->isNeutral() ) {
2111 ATH_MSG_DEBUG(" -- FillTruthParameters -- reco muon associated to a truth neutral!! Returning FAILURE.");
2112 return StatusCode::FAILURE;
2113 }
2114 if ( charge == 0 ) {
2115 ATH_MSG_DEBUG(" -- FillTruthParameters -- reco muon associated to a non true muon!! Returning FAILURE.");
2116 return StatusCode::FAILURE;
2117 }
2118
2119 const Amg::Vector3D momentum(particle->px(), particle->py(), particle->pz());
2120 const xAOD::TruthVertex * ptruthVertex(0);
2121 ptruthVertex=particle->prodVtx();
2122 if (!ptruthVertex){
2123 ATH_MSG_DEBUG("A production vertex pointer was retrieved, but it is NULL");
2124 return StatusCode::FAILURE;
2125 }
2126
2127
2128 if (particle->parent(0) != nullptr) {
2129 static const SG::ConstAccessor<int> truthTypeAcc("truthType");
2130 static const SG::ConstAccessor<int> truthOriginAcc("truthOrigin");
2131 if (truthTypeAcc.isAvailable(*particle)) {
2132 ATH_MSG_DEBUG(" -- FillTruthParameters -- truth particle is good. pdg: " << particle->pdgId()
2133 << " type: " << particle->type()
2134 << " nparents " << particle->nParents()
2135 << " parent->pdg: " << particle->parent(0)->pdgId()
2136 << " truthType: " << truthTypeAcc(*particle)
2137 << " truthOrigin: " << truthOriginAcc(*particle)
2138 );
2139
2140 }
2141 else {
2142 ATH_MSG_DEBUG(" -- FillTruthParameters -- truth particle is good. pdg: " << particle->pdgId()
2143 << " type: " << particle->type()
2144 << " nparents " << particle->nParents()
2145 << " parent->pdg: " << particle->parent(0)->pdgId()
2146 << " truthType & truthOrigin: " << " NOT AVAILABLE "
2147 );
2148 }
2149 }
2150
2151 const auto xPos=ptruthVertex->x();
2152 const auto yPos=ptruthVertex->y();
2153 const auto z_truth=ptruthVertex->z();
2154
2155 const Amg::Vector3D position(xPos, yPos, z_truth);
2156 const Trk::CurvilinearParameters cParameters(position, momentum, charge);
2157
2158 SG::ReadCondHandle<InDet::BeamSpotData> beamSpotHandleTruth { m_beamSpotKey, ctx };
2159 Trk::PerigeeSurface persf( beamSpotHandleTruth->beamPos() );
2160
2161 std::unique_ptr<const Trk::TrackParameters> tP = m_extrapolator->extrapolate(ctx, cParameters,persf, Trk::anyDirection, false);
2162
2163 double px = 0;
2164 double py = 0;
2165 double pt = 0;
2166 double pz = 0;
2167 double phi= 0;
2168 double eta= 0;
2169 double d0 = 0;
2170 double d0res = 0;
2171 double PVd0res = 0;
2172 double z0 = 0;
2173 double z0res = 0;
2174 double PVz0res = 0;
2175
2176 double d0recoPos = m_positive_d0;
2177 double z0recoPos = m_positive_z0;
2178 double d0recoNeg = m_negative_d0;
2179 double z0recoNeg = m_negative_z0;
2180
2181 ATH_MSG_DEBUG("reco IPs (pos): > d0 : "<<d0recoPos << " z0: " << z0recoPos << " trackp z0 : " << trackParticle->z0() << " trackp d0 : " << trackParticle->d0());
2182 ATH_MSG_DEBUG("reco IPs (neg): > d0 : "<<d0recoNeg << " z0: " << z0recoNeg << " trackp z0 : " << trackParticle->z0() <<" trackp d0 : " << trackParticle->d0() );
2183
2184 double qOverP_truth = 0.;
2185 if (tP){
2186 qOverP_truth = tP->parameters()[Trk::qOverP];
2187 if( qOverP_truth ){
2188
2189 px = tP->momentum().x();
2190 py = tP->momentum().y();
2191 pt = tP->pT();
2192 pz = tP->momentum().z();
2193 phi= tP->parameters()[Trk::phi];
2194 eta= tP->eta();
2195 d0 = tP->parameters()[Trk::d0];
2196 z0 = tP->parameters()[Trk::z0];
2197
2198 ATH_MSG_DEBUG("cand perig HEP particle (truth) px : "<< tP->momentum().x());
2199 ATH_MSG_DEBUG("cand perig HEP particle (truth) py : "<< tP->momentum().y());
2200 ATH_MSG_DEBUG("cand perig HEP particle (truth) pz : "<< tP->momentum().z());
2201 ATH_MSG_DEBUG("cand perig HEP particle (truth) d0 : "<< tP->parameters()[Trk::d0]);
2202 ATH_MSG_DEBUG("cand perig HEP particle (truth) z0 : "<< tP->parameters()[Trk::z0]);
2203
2204 }
2205 }
2206
2207
2208 if (charge == 1) {
2209 m_positive_px = px;
2210 m_positive_py = py;
2211 m_positive_pt = pt;
2212 m_positive_pz = pz;
2215 m_positive_z0 = z0recoPos -z0;
2216 m_positive_z0_err = z0res;
2217 m_positive_z0_PVerr = PVz0res;
2218 m_positive_d0 = d0recoPos -d0;
2219 m_positive_d0_err = d0res;
2220 m_positive_d0_PVerr = PVd0res;
2221 m_positive_qoverp = qOverP_truth;
2222
2223 bool parentfound = false;
2224 if (particle->nParents()>0) {
2225 if (particle->parent(0) != nullptr) {
2226 m_positive_parent = particle->parent(0)->pdgId();
2227 parentfound = true;
2228 }
2229 }
2230 if (!parentfound) m_positive_parent = 0;
2231
2232 ATH_MSG_DEBUG(" -- FillTruthParameters -- charge = 1 (truth)-> px : "<< m_positive_px
2233 <<" py: "<<m_positive_py
2234 <<" pz: "<<m_positive_pz
2235 <<" d0: "<<m_positive_d0
2236 <<" z0: "<< m_positive_z0
2237 <<" qoverp: " << m_positive_qoverp
2238 << " parent: " << m_positive_parent);
2239
2240 } else if (charge == -1) {
2241 m_negative_px = px;
2242 m_negative_py = py;
2243 m_negative_pt = pt;
2244 m_negative_pz = pz;
2247 m_negative_z0 = z0recoNeg-z0;
2248 m_negative_z0_err = z0res;
2249 m_negative_z0_PVerr = PVz0res;
2250 m_negative_d0 = d0recoNeg-d0;
2251 m_negative_d0_err = d0res;
2252 m_negative_d0_PVerr = PVd0res;
2253 m_negative_qoverp = qOverP_truth;
2254
2255 bool parentfound = false;
2256 if (particle->nParents()>0) {
2257 if (particle->parent(0) != nullptr) {
2258 m_negative_parent = particle->parent(0)->pdgId();
2259 parentfound = true;
2260 }
2261 }
2262 if (!parentfound) m_negative_parent = 0;
2263
2264 ATH_MSG_DEBUG(" -- FillTruthParameters-- charge = -1 (truth)-> px : "<< m_negative_px
2265 << " py: "<<m_negative_py
2266 << " pz: "<<m_negative_pz
2267 << " d0: "<<m_negative_d0
2268 << " z0: "<< m_negative_z0
2269 <<" qoverp: " << m_negative_qoverp
2270 << " parent:" << m_negative_parent);
2271 }
2272 return StatusCode::SUCCESS;
2273}
2274
2275
2276//==================================================================================
2281 static const SG::ConstAccessor< Link_t > acc( "truthParticleLink" );
2282 // Check if such a link exists on the object:
2283 if( ! acc.isAvailable( p ) ) {
2284 return nullptr;
2285 }
2286 // Get the link:
2287 const Link_t& link = acc( p );
2288 // Check if the link is valid:
2289 if( ! link.isValid() ) {
2290 return nullptr;
2291 }
2292 // Everything has passed, let's return the pointer:
2293 return *link;
2294}
2295
2296//==================================================================================
2298{
2299 m_xZmm.finalize();
2300 return StatusCode::SUCCESS;
2301}
2302
2303//==================================================================================
2305{
2306 m_triggerPrescale = 1; // default value
2307
2308 // check trigger status
2309 if(m_triggerDecision.retrieve().isFailure()) {
2310 ATH_MSG_FATAL("CheckTriggerStatusAndPrescale -- Unable to retrieve " << m_triggerDecision << " turn it off");
2311 return StatusCode::FAILURE;
2312 }
2313 else {
2314 ATH_MSG_DEBUG("CheckTriggerStatusAndPrescale -- retrieved tool: " << m_triggerDecision );
2315 }
2316
2317 float thisEventTriggerPrescale = 999999.9;
2318 float thisHLTTriggerPrescale = 999999.9;
2319 bool thisHLTIsPassed = false;
2320 std::string thisHLTTriggerName;
2321 std::string thisEventTriggerName;
2322
2323 // HLT triggers
2324 const std::vector<std::string> myHLTtriglist = m_triggerDecision->getChainGroup("HLT_mu.*, HLT_2mu.*")->getListOfTriggers();
2325 for (int i=0; i < (int) myHLTtriglist.size(); i++) {
2326 if ( m_triggerDecision->isPassed(myHLTtriglist.at(i)) ) {
2327 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() );
2328 }
2329 if ( m_triggerDecision->isPassed(myHLTtriglist.at(i)) ) { // trigger is passed
2330 thisHLTIsPassed = true;
2331 float thisprescale = m_triggerDecision->getChainGroup(myHLTtriglist.at(i))->getPrescale();
2332 if (thisprescale < thisHLTTriggerPrescale) {
2333 thisHLTTriggerPrescale = thisprescale;
2334 thisHLTTriggerName = myHLTtriglist.at(i);
2335 }
2336 }
2337 }
2338 if (thisHLTTriggerPrescale < 1) thisHLTTriggerPrescale = 1;
2339 ATH_MSG_DEBUG("Event HLT trigger prescale = " << thisHLTTriggerPrescale);
2340
2341 //if (thisL1IsPassed && thisHLTIsPassed) {
2342 if (thisHLTIsPassed) {
2343 ATH_MSG_DEBUG("Trigger passed -> accept event");
2344 }
2345 else{
2346 ATH_MSG_DEBUG("Trigger Failed -> reject event");
2347 return StatusCode::FAILURE;
2348 }
2349
2350 // event prescale
2351 thisEventTriggerPrescale = std::move(thisHLTTriggerPrescale);
2352 thisEventTriggerName = thisHLTTriggerName;
2353 ATH_MSG_DEBUG("CheckTriggerStatusAndPrescale -- Event trigger prescale = " << thisEventTriggerPrescale);
2354 ATH_MSG_DEBUG("CheckTriggerStatusAndPrescale -- Event trigger name = " << thisEventTriggerName);
2355
2356 m_triggerPrescale = thisEventTriggerPrescale;
2357 m_triggerName = std::move(thisEventTriggerName);
2358
2359
2360 return StatusCode::SUCCESS;
2361}
2362
2363
2364//==================================================================================
2366
2367 const xAOD::VertexContainer* vxContainer(0);
2368 const xAOD::Vertex* myVtx(0);
2370 if (!vxContainer) {
2371 return myVtx;
2372 }
2373
2374 for (int ivtx=0; ivtx< (int) vxContainer->size();ivtx++) {
2375 myVtx = (*vxContainer)[ivtx];
2376 if ((myVtx->vertexType() == xAOD::VxType::PriVtx)) {
2377 if (m_Trk2VtxAssociationTool->isCompatible(*muon1,*myVtx) && (m_Trk2VtxAssociationTool->isCompatible(*muon2,*myVtx)))
2378 return myVtx;
2379 }
2380 }
2381 return myVtx;
2382}
2383
2384//==================================================================================
2386{
2387 m_IDTrack_pt.clear();
2388 m_CBTrack_pt.clear();
2389 m_Refit1_pt.clear();
2390 m_Refit2_pt.clear();
2391 m_Truth_pt.clear();
2392
2393 m_IDTrack_eta.clear();
2394 m_CBTrack_eta.clear();
2395 m_Refit1_eta.clear();
2396 m_Refit2_eta.clear();
2397 m_Truth_eta.clear();
2398
2399 m_IDTrack_phi.clear();
2400 m_CBTrack_phi.clear();
2401 m_Refit1_phi.clear();
2402 m_Refit2_phi.clear();
2403 m_Truth_phi.clear();
2404
2405 m_IDTrack_d0.clear();
2406 m_CBTrack_d0.clear();
2407 m_Refit1_d0.clear();
2408 m_Refit2_d0.clear();
2409 m_Truth_d0.clear();
2410
2411 m_IDTrack_z0.clear();
2412 m_CBTrack_z0.clear();
2413 m_Refit1_z0.clear();
2414 m_Refit2_z0.clear();
2415 m_Truth_z0.clear();
2416
2417 m_IDTrack_qoverp.clear();
2418 m_CBTrack_qoverp.clear();
2419 m_Refit1_qoverp.clear();
2420 m_Refit2_qoverp.clear();
2421 m_Truth_qoverp.clear();
2422
2423 m_Truth_parent.clear();
2424
2425 m_IDTrack_sigma_pt.clear();
2426 m_CBTrack_sigma_pt.clear();
2427 m_Refit1_sigma_pt.clear();
2428 m_Refit2_sigma_pt.clear();
2429
2430 m_IDTrack_sigma_d0.clear();
2431 m_CBTrack_sigma_d0.clear();
2432 m_Refit1_sigma_d0.clear();
2433 m_Refit2_sigma_d0.clear();
2434
2435 m_IDTrack_sigma_z0.clear();
2436 m_CBTrack_sigma_z0.clear();
2437 m_Refit1_sigma_z0.clear();
2438 m_Refit2_sigma_z0.clear();
2439
2440 m_IDTrack_sigma_qoverp.clear();
2441 m_CBTrack_sigma_qoverp.clear();
2442 m_Refit1_sigma_qoverp.clear();
2443 m_Refit2_sigma_qoverp.clear();
2444
2445 m_nBLhits.clear();
2446 m_nPIXhits.clear();
2447 m_nSCThits.clear();
2448 m_nTRThits.clear();
2449
2450 return;
2451}
2452
2453//==================================================================================
2455{
2456 m_positive_px = 0.;
2457 m_positive_py = 0.;
2458 m_positive_pz = 0.;
2459 m_positive_d0 = 0.;
2460 m_positive_z0 = 0.;
2461 m_positive_d0_err = 0.;
2462 m_positive_z0_err = 0.;
2464 m_positive_1_vtx = 0;
2466
2467 m_negative_px = 0.;
2468 m_negative_py = 0.;
2469 m_negative_pz = 0.;
2470 m_negative_d0 = 0.;
2471 m_negative_z0 = 0.;
2472 m_negative_d0_err = 0.;
2473 m_negative_z0_err = 0.;
2475 m_negative_1_vtx = 0;
2477
2478 m_positive_2_px = 0.;
2479 m_positive_2_py = 0.;
2480 m_positive_2_pz = 0.;
2481 m_positive_2_d0 = 0.;
2482 m_positive_2_z0 = 0.;
2485 m_positive_2_vtx = 0;
2486
2487 m_negative_2_px = 0.;
2488 m_negative_2_py = 0.;
2489 m_negative_2_pz = 0.;
2490 m_negative_2_d0 = 0.;
2491 m_negative_2_z0 = 0.;
2494 m_negative_2_vtx = 0;
2495
2496 // electrons
2497 m_el_negative1_px = 0.;
2498 m_el_negative1_py = 0.;
2499 m_el_negative1_pz = 0.;
2500 m_el_negative1_d0 = 0.;
2501 m_el_negative1_z0 = 0.;
2505
2506 m_el_negative2_px = 0.;
2507 m_el_negative2_py = 0.;
2508 m_el_negative2_pz = 0.;
2509 m_el_negative2_d0 = 0.;
2510 m_el_negative2_z0 = 0.;
2514
2515 m_el_positive1_px = 0.;
2516 m_el_positive1_py = 0.;
2517 m_el_positive1_pz = 0.;
2518 m_el_positive1_d0 = 0.;
2519 m_el_positive1_z0 = 0.;
2523
2524 m_el_positive2_px = 0.;
2525 m_el_positive2_py = 0.;
2526 m_el_positive2_pz = 0.;
2527 m_el_positive2_d0 = 0.;
2528 m_el_positive2_z0 = 0.;
2532
2533 // other quantities
2534 m_nVertex = 0;
2535 m_pv_x = 0; m_pv_y = 0; m_pv_z = 0;
2536 m_4mu_minv = 0.;
2537
2538 return;
2539}
2540//==================================================================================
2542{
2543 StatusCode thisStatus = StatusCode::SUCCESS;
2544
2545 if (m_doFourMuAnalysis) {
2546 ATH_MSG_DEBUG ("** RunFourLeptonAnalysis ** START ** run: " << m_runNumber << " event: " << m_evtNumber << " lumiblock:" << m_lumi_block);
2547
2548 // Four lepton event
2550 m_4mu.doIsoSelection (m_doIsoSelection);
2551 m_4mu.doIPSelection (m_doIPSelection);
2552 m_4mu.doMCPSelection (m_doMCPSelection);
2553 m_4mu.SetMassWindowLow (m_MassWindowLow);
2554 m_4mu.SetMassWindowHigh (m_MassWindowHigh);
2555 m_4mu.SetLeadingMuonPtCut(m_LeadingMuonPtCut);
2556 m_4mu.SetSecondMuonPtCut (m_SecondMuonPtCut);
2557 m_4mu.SetOpeningAngleCut (m_OpeningAngleCut);
2558 m_4mu.SetZ0GapCut (m_Z0GapCut);
2559 m_4mu.setDebugMode (m_doDebug);
2560
2561 // This is a report of the number of true electrons in the event
2562 if (false) {
2563 const xAOD::TruthParticleContainer* electronTruth = evtStore()->retrieve< const xAOD::TruthParticleContainer >( "egammaTruthParticles" );
2564 if( electronTruth) {
2565 ATH_MSG_DEBUG ( "retrieving electron Truth container with key: \"egammaTruthParticles\" SUCCESS ");
2566 // Check that the auxiliary store association was made successfully:
2567 if( electronTruth->hasStore() ) {
2568 ATH_MSG_DEBUG ( "Size of Truth gamma-electrons: " << electronTruth->size() );
2569 auto tr_itr = electronTruth->begin();
2570 auto tr_end = electronTruth->end();
2571 int electronCount = 0;
2572 for( int i = 0; tr_itr != tr_end; ++tr_itr, ++i ) {
2573 ATH_MSG_DEBUG( "Truth : Investigating truth electron #" << i << " pdgID= " << ( *tr_itr )->pdgId());
2574 if (fabs(( *tr_itr )->pdgId()) == 11) {
2575 if (( *tr_itr )->pt() > 10000 && fabs(( *tr_itr )->eta()) < 2.47) {
2576 ATH_MSG_INFO( " central electron found --> pt: " << ( *tr_itr )->charge()*( *tr_itr )->pt() << " eta " <<( *tr_itr )->eta() );
2577 electronCount++;
2578 }
2579 }
2580 }
2581 ATH_MSG_INFO( "#central electrons: " << electronCount );
2582 }
2583 else {
2584 ATH_MSG_WARNING ( "electronTruth container has no Store !!! FAILURE");
2585 }
2586 }
2587 else {
2588 ATH_MSG_WARNING ( "retrieve electron Truth container with key: \"egammaTruthParticles\" FAILURE");
2589 }
2590 }
2591
2592 if (m_doDebug) std::cout << " ** RunFourLeptonAnalysis ** calling m_4mu.Reco() .... " << std::endl;
2593 bool statusOf4LeptReco = m_4mu.Reco();
2594
2595 // print message
2596 if(statusOf4LeptReco) {
2597 thisStatus = StatusCode::SUCCESS;
2598 ATH_MSG_INFO ("4-lepton reconstruction SUCCESS. # accepted events " << m_4mu.getAcceptedEvents() << " Invariant mass = " << m_4mu.GetInvMass() << " GeV ");
2599 if (m_doDebug) std::cout << " ** RunFourLeptonAnalysis ** 4-lepton reconstruction SUCCESS. # accepted events " << m_4mu.getAcceptedEvents() << " Invariant mass = " << m_4mu.GetInvMass() << " GeV " << std::endl;
2600 }
2601 else {
2602 thisStatus = StatusCode::FAILURE;
2603 ATH_MSG_DEBUG ("4-lepton reconstruction FAILURE. m_4mu.Reco() returned FALSE --> event failed selection");
2604 if (m_doDebug) std::cout << " ** RunFourLeptonAnalysis ** 4-lepton reconstruction FAILURE. m_4mu.Reco() returned FALSE --> event failed selection" << std::endl;
2605 }
2606
2607 if(statusOf4LeptReco) {
2608 if ( m_4mu.EventPassed() ) {
2609
2610 this->Clear4MuNtupleVariables();
2611
2612 const xAOD::TrackParticle* muon1_pos = m_4mu.getIDTrack(m_4mu.getPosMuon(1));
2613 const xAOD::TrackParticle* muon2_pos = m_4mu.getIDTrack(m_4mu.getPosMuon(2));
2614 const xAOD::TrackParticle* muon1_neg = m_4mu.getIDTrack(m_4mu.getNegMuon(1));
2615 const xAOD::TrackParticle* muon2_neg = m_4mu.getIDTrack(m_4mu.getNegMuon(2));
2616
2617 // muons
2618 if (muon1_pos) {
2619 m_positive_px = muon1_pos->p4().Px();
2620 m_positive_py = muon1_pos->p4().Py();
2621 m_positive_pz = muon1_pos->p4().Pz();
2622 m_positive_d0 = muon1_pos->d0();
2623 m_positive_z0 = muon1_pos->z0();
2624 // m_positive_d0_err = muon1_pos->definingParametersCovMatrix()(0,0);
2627 }
2628 if (muon1_neg) {
2629 m_negative_px = muon1_neg->p4().Px();
2630 m_negative_py = muon1_neg->p4().Py();
2631 m_negative_pz = muon1_neg->p4().Pz();
2632 m_negative_d0 = muon1_neg->d0();
2633 m_negative_z0 = muon1_neg->z0();
2636 }
2637 if (muon2_pos) {
2638 m_positive_2_px = muon2_pos->p4().Px();
2639 m_positive_2_py = muon2_pos->p4().Py();
2640 m_positive_2_pz = muon2_pos->p4().Pz();
2641 m_positive_2_d0 = muon2_pos->d0();
2642 m_positive_2_z0 = muon2_pos->z0();
2645 }
2646 if (muon2_neg) {
2647 m_negative_2_px = muon2_neg->p4().Px();
2648 m_negative_2_py = muon2_neg->p4().Py();
2649 m_negative_2_pz = muon2_neg->p4().Pz();
2650 m_negative_2_d0 = muon2_neg->d0();
2651 m_negative_2_z0 = muon2_neg->z0();
2654 }
2655
2656 // electrons
2657 const xAOD::TrackParticle* elec1_neg = m_4mu.getELTrack(0);
2658 const xAOD::TrackParticle* elec2_neg = m_4mu.getELTrack(1);
2659 const xAOD::TrackParticle* elec1_pos = m_4mu.getELTrack(2);
2660 const xAOD::TrackParticle* elec2_pos = m_4mu.getELTrack(3);
2661 if (elec1_neg) {
2662 m_el_negative1_px = elec1_neg->p4().Px();
2663 m_el_negative1_py = elec1_neg->p4().Py();
2664 m_el_negative1_pz = elec1_neg->p4().Pz();
2665 m_el_negative1_d0 = elec1_neg->d0();
2666 m_el_negative1_z0 = elec1_neg->z0();
2669 }
2670 if (elec2_neg) {
2671 m_el_negative2_px = elec2_neg->p4().Px();
2672 m_el_negative2_py = elec2_neg->p4().Py();
2673 m_el_negative2_pz = elec2_neg->p4().Pz();
2674 m_el_negative2_d0 = elec2_neg->d0();
2675 m_el_negative2_z0 = elec2_neg->z0();
2678 }
2679 if (elec1_pos) {
2680 m_el_positive1_px = elec1_pos->p4().Px();
2681 m_el_positive1_py = elec1_pos->p4().Py();
2682 m_el_positive1_pz = elec1_pos->p4().Pz();
2683 m_el_positive1_d0 = elec1_pos->d0();
2684 m_el_positive1_z0 = elec1_pos->z0();
2687 }
2688 if (elec2_pos) {
2689 m_el_positive2_px = elec2_pos->p4().Px();
2690 m_el_positive2_py = elec2_pos->p4().Py();
2691 m_el_positive2_pz = elec2_pos->p4().Pz();
2692 m_el_positive2_d0 = elec2_pos->d0();
2693 m_el_positive2_z0 = elec2_pos->z0();
2696 }
2697
2698 // other quantities
2699 m_nVertex = m_4mu.GetNVertex ();
2700 m_negative_1_vtx = m_4mu.GetVertexMuNeg1();
2701 m_negative_2_vtx = m_4mu.GetVertexMuNeg2();
2702 m_positive_1_vtx = m_4mu.GetVertexMuPos1();
2703 m_positive_2_vtx = m_4mu.GetVertexMuPos2();
2704
2705 m_el_negative1_vtx = m_4mu.GetVertexElec(0);
2706 m_el_negative2_vtx = m_4mu.GetVertexElec(1);
2707 m_el_positive1_vtx = m_4mu.GetVertexElec(2);
2708 m_el_positive2_vtx = m_4mu.GetVertexElec(3);
2709
2710 m_pv_x = 0; m_pv_y = 0; m_pv_z = 0;
2711
2712 m_4mu_minv = m_4mu.GetInvMass();
2713
2714 // Obtain MET
2715 std::string metName = "MET_Reference_AntiKt4LCTopo";
2716 std::string metRefFinalName = "FinalClus";
2717 const xAOD::MissingETContainer* final_met = nullptr;
2718
2719 m_met = -1; // default value
2720 m_metphi = -1;
2721
2723 ATH_MSG_WARNING ( "No Collection with name " << metName << " found in StoreGate");
2724 // return StatusCode::SUCCESS;
2725 }
2726 else {
2727 StatusCode sc = evtStore()->retrieve(final_met, metName);
2728 if (sc.isFailure()) {
2729 ATH_MSG_DEBUG ( "Could not retrieve Collection " << metName << " from StoreGate");
2730 // return StatusCode::SUCCESS;
2731 }
2732 }
2733 const xAOD::MissingET *met = nullptr;
2734 if (final_met) met = (*final_met)[metRefFinalName];
2735 if (met) { // load MET values
2736 m_met = met->met();
2737 m_metphi = met->phi();
2738 }
2739 ATH_MSG_DEBUG (" Zmumu event with MET = " << m_met);
2740
2741 ATH_MSG_INFO (" -- IDPerfMonZmumu::execute -- Accepted event " << m_4mu.getAcceptedEvents() << " with m_4mu.GetInvMass= " << m_4mu_minv);
2742 ATH_MSG_DEBUG ("**** Filling m_FourMuTree ntuple " << m_FourMuTree->GetName() << " entry " << m_FourMuTree->GetEntries()
2743 << " for run: " << m_runNumber
2744 << " event: " << m_evtNumber
2745 << " Lumiblock: " << m_lumi_block
2746 << " Invariant mass = " << m_4mu_minv << " GeV ");
2747 if (muon1_pos != nullptr) ATH_MSG_DEBUG("mu1+ --> pxyz " << muon1_pos->p4().Px()
2748 << ", " << muon1_pos->p4().Py()
2749 << ", " << muon1_pos->p4().Pz()
2750 << " pt: " << muon1_pos->pt()
2751 << " d0: " << muon1_pos->d0()
2752 << " z0: " << muon1_pos->z0()
2753 << " d0unc: " << muon1_pos->definingParametersCovMatrixVec()[0]
2754 );
2755 if (muon1_neg != nullptr) ATH_MSG_DEBUG("mu1- --> pxyz " << muon1_neg->p4().Px()
2756 << ", " << muon1_neg->p4().Py()
2757 << ", " << muon1_neg->p4().Pz()
2758 << " pt: " << muon1_neg->pt()
2759 << " d0: " << muon1_neg->d0()
2760 << " z0: " << muon1_neg->z0()
2761 << " d0unc: " << muon1_neg->definingParametersCovMatrixVec()[0]
2762 );
2763 if (elec1_pos != nullptr) ATH_MSG_DEBUG("el1+ --> pxyz " << elec1_pos->p4().Px()
2764 << ", " << elec1_pos->p4().Py()
2765 << ", " << elec1_pos->p4().Pz()
2766 << " pt: " << elec1_pos->pt()
2767 << " d0: " << elec1_pos->d0()
2768 << " z0: " << elec1_pos->z0()
2769 << " d0unc: " << elec1_pos->definingParametersCovMatrixVec()[0]
2770 );
2771 // ntuple variables have been filled in FillRecParametersTP
2772 m_FourMuTree->Fill();
2773 }
2774 } // succesful 4mu reco
2775
2776 } // end of fourMuon Analysis
2777
2778 return thisStatus;
2779}
2780
2781//==================================================================================
2783{
2784 // hits info
2785 // positive Muon
2786 const xAOD::TrackParticle* IDTrkMuPos = muon_pos->trackParticle(xAOD::Muon::TrackParticleType::InnerDetectorTrackParticle);
2787 const xAOD::TrackParticle* IDTrkMuNeg = muon_neg->trackParticle(xAOD::Muon::TrackParticleType::InnerDetectorTrackParticle);
2788
2789 int nBLhits, nhitsPIX, nhitsSCT, nhitsTRT, nContribPixLayers;
2790 int nPIXholes, nSCTholes;
2791 if (IDTrkMuPos && IDTrkMuNeg) { // make sure both summaries are available
2792 uint8_t dummy(-1);
2793 nBLhits = IDTrkMuPos->summaryValue( dummy, xAOD::numberOfBLayerHits ) ? dummy :-1;
2794 nhitsPIX = IDTrkMuPos->summaryValue( dummy, xAOD::numberOfPixelHits ) ? dummy :-1;
2795 nhitsSCT = IDTrkMuPos->summaryValue( dummy, xAOD::numberOfSCTHits ) ? dummy :-1;
2796 nhitsTRT = IDTrkMuPos->summaryValue( dummy, xAOD::numberOfTRTHits ) ? dummy :-1;
2797 nContribPixLayers = IDTrkMuPos->summaryValue( dummy, xAOD::numberOfContribPixelLayers )? dummy :-1;
2798
2799 nPIXholes = IDTrkMuPos->summaryValue( dummy, xAOD::numberOfPixelHoles )? dummy :-1;
2800 nSCTholes = IDTrkMuPos->summaryValue( dummy, xAOD::numberOfSCTHoles )? dummy :-1;
2801
2802
2803 m_nBLhits.push_back(nBLhits);
2804 m_nPIXhits.push_back(nhitsPIX);
2805 m_nSCThits.push_back(nhitsSCT);
2806 m_nTRThits.push_back(nhitsTRT);
2807
2808 ATH_MSG_DEBUG (" -- mu_pos -- HITS --"
2809 << " nBLhits: " << nBLhits
2810 << " nhitsPIX: " << nhitsPIX
2811 << " nPIXLayers: " << nContribPixLayers
2812 << " nhitsSCT: " << nhitsSCT
2813 << " Silicon holes: " << nPIXholes + nSCTholes
2814 << " nhitsTRT: " << nhitsTRT);
2815
2816 nBLhits = IDTrkMuNeg->summaryValue( dummy, xAOD::numberOfBLayerHits ) ? dummy :-1;
2817 nhitsPIX = IDTrkMuNeg->summaryValue( dummy, xAOD::numberOfPixelHits ) ? dummy :-1;
2818 nhitsSCT = IDTrkMuNeg->summaryValue( dummy, xAOD::numberOfSCTHits ) ? dummy :-1;
2819 nhitsTRT = IDTrkMuNeg->summaryValue( dummy, xAOD::numberOfTRTHits ) ? dummy :-1;
2820 nContribPixLayers = IDTrkMuNeg->summaryValue( dummy, xAOD::numberOfContribPixelLayers )? dummy :-1;
2821 nPIXholes = IDTrkMuNeg->summaryValue( dummy, xAOD::numberOfPixelHoles )? dummy :-1;
2822 nSCTholes = IDTrkMuNeg->summaryValue( dummy, xAOD::numberOfSCTHoles )? dummy :-1;
2823
2824 m_nBLhits.push_back(nBLhits);
2825 m_nPIXhits.push_back(nhitsPIX);
2826 m_nSCThits.push_back(nhitsSCT);
2827 m_nTRThits.push_back(nhitsTRT);
2828
2829 ATH_MSG_DEBUG (" -- mu_neg -- HITS --"
2830 << " nBLhits: " << nBLhits
2831 << " nhitsPIX: " << nhitsPIX
2832 << " nPIXLayers: " << nContribPixLayers
2833 << " nhitsSCT: " << nhitsSCT
2834 << " Silicon holes: " << nPIXholes + nSCTholes
2835 << " nhitsTRT: " << nhitsTRT);
2836
2837 }
2838 return;
2839}
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:422
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.