ATLAS Offline Software
Loading...
Searching...
No Matches
ZmumuEvent.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
3*/
4
5//==================================================================================
6// Include files...
7//==================================================================================
8
9// This files header
11
12// Standard headers
13
14// Package Headers
16
17// ATLAS headers
19
20//#include "muonEvent/MuonParamDefs.h"
21
22#include "CLHEP/Random/RandFlat.h"
23
24#include "xAODMuon/Muon.h"
27
28#include "CLHEP/Units/SystemOfUnits.h"
29#include "CLHEP/Units/PhysicalConstants.h"
30using CLHEP::GeV;
31
32//==================================================================================
33// Public Methods
34//==================================================================================
35
78
79//==================================================================================
83
84//==================================================================================
86{
87 m_xMuonID.Init();
88
90}
91
92
93
94//==================================================================================
95const std::string ZmumuEvent::getRegion() const{
96
97 const double eta1 = std::abs(m_pxRecMuon[m_muon1]->eta());
98 const double eta2 = std::abs(m_pxRecMuon[m_muon2]->eta());
99
100 if ( eta1 < m_etaCut && eta2 < m_etaCut )
101 return "BB";
102
103 else if( (eta1 < m_etaCut && eta2 > m_etaCut) || (eta1 > m_etaCut && eta2 < m_etaCut) )
104 return "BE";
105
106 else return "EE";
107}
108
109
110//==================================================================================
111bool ZmumuEvent::Reco (int theLumiBlock)
112{
113 if (m_doDebug) { std::cout << " * ZmumuEvent * ZmumuEvent::Reco() starting " << std::endl; }
115
116 // Clear out the previous events record.
117 this->Clear();
118
119 // before getting into business, check lumiblock is in requested range
121 // lumiblock range is requested
122 if ( theLumiBlock < m_minGoodLumiBlock) return false;
123 if ( theLumiBlock > m_maxGoodLumiBlock) return false;
124 }
126
127 // retrieve muons
129
130 // START patch by Anthony to avoid crash when MuonSpetrometer::Pt was not defined mainly for data16
131 // WARNING thus is necessary for data16 !!
132 if (false) {
133 for( auto muon : *pxMuonContainer ){
134 const xAOD::TrackParticle* idtrk(nullptr);
135 const xAOD::TrackParticle* metrk(nullptr);
136 using enum xAOD::Muon::TrackParticleType;
137 idtrk = muon->trackParticle(InnerDetectorTrackParticle);
138 metrk = muon->trackParticle(ExtrapolatedMuonSpectrometerTrackParticle);
139 if (idtrk && metrk) {
140 static const SG::Decorator<float> InnerDetectorPtAcc("InnerDetectorPt");
141 static const SG::Decorator<float> MuonSpectrometerPtAcc("MuonSpectrometerPt");
142 InnerDetectorPtAcc(*muon) = idtrk->pt();
143 MuonSpectrometerPtAcc(*muon) = metrk->pt();
144 }
145 }
146 }
147 // END patch
148
149 if (pxMuonContainer != nullptr) {
150 if (m_doDebug) {std::cout << " * ZmumuEvent * track list has "<< pxMuonContainer->size() << " muon in xAOD::MuonContainer " << m_container <<std::endl; }
151 xAOD::MuonContainer::const_iterator xMuonItr = pxMuonContainer->begin();
152 xAOD::MuonContainer::const_iterator xMuonItrE = pxMuonContainer->end();
153
154 int attemptedMuonCount = 0;
155 int acceptedMuonCount = 0;
156
157 while ( xMuonItr != xMuonItrE ){ // this loops on the muons in the pxMuonContainer
158 const xAOD::Muon* pxCMuon = *xMuonItr;
159 attemptedMuonCount++;
161 if(m_doDebug){std::cout << " * ZmumuEvent * Reco() ** attempt on xMuonItr number "<< attemptedMuonCount << " (pointer: "<< *xMuonItr <<")" << std::endl; }
162 // Apply muon cuts
163 if ( m_xMuonID.passSelection( pxCMuon) ) {
164 if (RecordMuon( pxCMuon )) {
165 acceptedMuonCount++;
167 if (m_doDebug) {std::cout << " This muon is accepeted !! this is muon number " << acceptedMuonCount << " & full pass" << m_numberOfFullPassMuons << std::endl; }
168 }
169 }
170 ++xMuonItr;
171 } // end loop on muons
172 if (m_doDebug) {std::cout << " * ZmumuEvent * accepted " << acceptedMuonCount << " muons from the input list of "<< pxMuonContainer->size() <<std::endl; }
173
174 if (acceptedMuonCount < 2) m_eventsWithoutEnoughMuonsCount++;
175 if (acceptedMuonCount >= 2) m_eventsWithEnoughMuonsCount++;
176 } // muon container exist
177 else {
178 std::cout << " * ZmumuEvent * Can't retrieve combined muon collection (container: " << m_container <<") " << std::endl;
179 return false;
180 }
181
182 // Ordering of muons
183 this->OrderMuonList();
184
185 // Reconstruct the invariant mass ( based on mu-sys pt ).
187
190
192
193 if(m_doDebug) {
194 if ( m_passedSelectionCuts) std::cout << " * ZmumuEvent * Reco() * result of analyzed event " << m_analyzedEventCount << " --> Selected event :) " << std::endl;
195 if (!m_passedSelectionCuts) std::cout << " * ZmumuEvent * Reco() * result of analyzed event " << m_analyzedEventCount << " --> Rejected event :( " << std::endl;
196 }
197 if (m_doDebug) {
198 std::cout << " * ZmumuEvent::Reco * COMPLETED * Event has " << m_numberOfFullPassMuons
199 << " muons. " << m_acceptedEventCount
200 << " events accpeted out of " << m_analyzedEventCount
201 << " tested ";
202 if (m_passedSelectionCuts) std::cout << " This m= " << m_DiMuonPairInvMass;
203 std::cout << " * return " << m_passedSelectionCuts << std::endl;
204 }
206}
207
208
209//==================================================================================
210// Protected Methods
211//==================================================================================
215
216//==================================================================================
217// Private Methods
218//==================================================================================
220{
221 if(m_doDebug) {std::cout <<" * ZmumuEvent * Event selection ** START ** for type: " << eType << " m_NumberOfFullPassMuons: " << m_numberOfFullPassMuons << std::endl;}
222
223 // First require two muon-id's with cuts pre-applied.
224 if ( m_numberOfFullPassMuons < 2 ) {
225 if (m_doDebug) {std::cout <<" * ZmumuEvent * Failing number of good muons == 2 :( " << m_numberOfFullPassMuons << std::endl;}
226 return false;
227 }
229
230 // crosscheck all muons have been properly filled
231 bool allMuonsGood = true;
232 for (unsigned int muonid=0; muonid < m_numberOfFullPassMuons; muonid++) {
233 if (!m_pxMSTrack[muonid]) {
234 allMuonsGood = false;
235 }
236 }
237 if (!allMuonsGood){
238 return false;
239 }
241
242 if ( m_numberOfFullPassMuons > 2 ) {
243 if (m_doDebug) {std::cout <<" * ZmumuEvent * Failing number of good muons == 2 :( " << m_numberOfFullPassMuons << std::endl;}
244 return false;
245 }
247
248 // momentum of the muons
249 double leadingMuonPt, secondMuonPt;
250 switch ( eType )
251 {
252 case MS :
253 {
254 leadingMuonPt = m_pxMSTrack[m_muon1]->pt();
255 secondMuonPt = m_pxMSTrack[m_muon2]->pt();
256 break;
257 }
258 case ME:
259 {
260 leadingMuonPt = m_pxMETrack[m_muon1]->pt();
261 secondMuonPt = m_pxMETrack[m_muon2]->pt();
262 break;
263 }
264 case CB:
265 {
266 leadingMuonPt = m_pxRecMuon[m_muon1]->pt();
267 secondMuonPt = m_pxRecMuon[m_muon2]->pt();
268 break;
269 }
270 case ID:
271 {
272 leadingMuonPt = m_pxIDTrack[m_muon1]->pt();
273 secondMuonPt = m_pxIDTrack[m_muon2]->pt();
274 break;
275 }
276
277 default:
278 leadingMuonPt = m_pxRecMuon[m_muon1]->pt();
279 secondMuonPt = m_pxRecMuon[m_muon2]->pt();
280 }
281 // up to here the leading and second pt are not really in the right order.
282 // order the muon pt:
283 if (secondMuonPt > leadingMuonPt) {
284 double tempPt = leadingMuonPt;
285 leadingMuonPt = secondMuonPt;
286 secondMuonPt = tempPt;
287 }
288
289 // muon pt cut
290 // if ( !(leadingMuonPt > m_LeadingMuonPtCut*CLHEP::GeV && secondMuonPt > m_SecondMuonPtCut*CLHEP::GeV ) ) {
291 if ( leadingMuonPt < m_LeadingMuonPtCut*CLHEP::GeV ) {
292 if(m_doDebug){ std::cout <<" * ZmumuEvent * Failing 1st muon pt cut * Reco Pt: " << leadingMuonPt << " < " << m_LeadingMuonPtCut*CLHEP::GeV << std::endl;}
293 return false;
294 }
296
297 if ( secondMuonPt < m_SecondMuonPtCut*CLHEP::GeV ) {
298 if(m_doDebug){ std::cout <<" * ZmumuEvent * Failing 2nd muon pt cut * Reco Pt: " << secondMuonPt << " < " << m_SecondMuonPtCut*CLHEP::GeV << std::endl;}
299 return false;
300 }
302
303 // Invariant mass window
304 if ( m_fInvariantMass[eType] < m_MassWindowLow ) {
305 if(m_doDebug) {std::cout <<" * ZmumuEvent * Failing mass window low cut: reco m= " << m_fInvariantMass[eType] << " > " << m_MassWindowLow << std::endl;}
306 return false;
307 }
308 if ( m_fInvariantMass[eType] > m_MassWindowHigh ) {
309 if(m_doDebug) {std::cout <<" * ZmumuEvent * Failing mass window high cut: reco m= " << m_fInvariantMass[eType] << " > " << m_MassWindowHigh << std::endl;}
310 return false;
311 }
313
314 // opening angle
315 if ( m_fMuonDispersion[eType] < m_OpeningAngleCut ) {
316 if(m_doDebug) {std::cout <<" * ZmumuEvent * Failing opening angle cut. Opening angle " << m_fMuonDispersion[eType] << " < " << m_OpeningAngleCut << std::endl;}
317 return false;
318 }
320
321 // opposite charge
322 if ( getZCharge(eType) != 0 ) {
323 if(m_doDebug) {
324 std::cout <<" * ZmumuEvent * Failing get ZCharge != 0 cut * Reco q1= " << m_pxRecMuon[m_muon1]->charge()*m_pxRecMuon[m_muon1]->pt() <<std::endl;
325 //<< " q2= " << m_pxRecMuon[m_muon2]->charge()*m_pxRecMuon[m_muon2]->pt() << std::endl; //This might not exist!
326 std::cout <<" * ID q1= " << m_pxIDTrack[m_muon1]->charge()*m_pxIDTrack[m_muon1]->pt() << std::endl;
327 // << " q2= " << m_pxIDTrack[m_muon2]->charge()*m_pxIDTrack[m_muon2]->pt() << std::endl; //This might not exist!
328 }
329 return false;
330 }
332
333 //
334 // both muons should come from the same vertex
335 // if the vertex information is used, that is already guaranteed, but if not, one has to check the z0
336 if (eType == ID) {
337 double z0_muon1 = m_pxIDTrack[m_muon1]->vz() + m_pxIDTrack[m_muon1]->z0();
338 double z0_muon2 = m_pxIDTrack[m_muon2]->vz() + m_pxIDTrack[m_muon2]->z0();
339 if(m_doDebug) {
340 std::cout << " * ZmumuEvent * z0_muon1= " << z0_muon1 << " z0_muon2= " << z0_muon2 << " delta= " << z0_muon1-z0_muon2 << std::endl;
341 }
342 if ( std::abs(z0_muon1 - z0_muon2) > m_Z0GapCut) {
343 if(m_doDebug) {
344 std::cout << " * ZmumuEvent * Failing common vertex cut. z.vtx1= " << m_pxIDTrack[m_muon1]->vz() << " z.vtx2= " << m_pxIDTrack[m_muon2]->vz() << std::endl;
345 std::cout << " * ZmumuEvent * Failing common vertex cut. IDTrk.z0_1= " << m_pxIDTrack[m_muon1]->z0() << " IDTrk.z0_2= " << m_pxIDTrack[m_muon2]->z0() << std::endl;
346 std::cout << " * ZmumuEvent * z0_muon1= " << z0_muon1 << " z0_muon2= " << z0_muon2 << " delta= " << z0_muon1-z0_muon2 << " > " << m_Z0GapCut << " (cut)" << std::endl;
347 }
348 return false;
349 }
350 }
351
352
353 if(m_doDebug) {
354 std::cout <<" * ZmumuEvent * Good muon pair: pt= " << leadingMuonPt/1000
355 << " & " << secondMuonPt/1000
356 << " GeV dimuon invariant mass = " << m_fInvariantMass[eType] << " GeV " << std::endl;
357 }
358 return true;
359}
360
361//==================================================================================
363{
365 m_passedSelectionCuts = false;
366 m_DiMuonPairInvMass = -1.; // flag as no reconstructed inv mass yet
367 m_muon1 = MUON1; // point to the first two
368 m_muon2 = MUON2;
369
370 for ( unsigned int u = 0; u < NUM_MUONS; ++u ) {
371 m_pxRecMuon[u] = nullptr;
372 m_pxMSTrack[u] = nullptr;
373 m_pxMETrack[u] = nullptr;
374 m_pxIDTrack[u] = nullptr;
375 }
376 for ( unsigned int v = 0; v < NUM_TYPES; ++v ) {
377 m_fZPt[v] = -999.9f;
378 m_fZEtaDir[v] = -999.9f;
379 m_fZPhiDir[v] = -999.9f;
380 m_fInvariantMass[v] = -999.9f;
381 m_fMuonDispersion[v] = -999.9f;
382 }
383 return;
384}
385
386//==================================================================================
388{
389 if(m_doDebug) { std::cout <<" * ZmumuEvent * RecordMuon * START ** muons recorded so far "<< m_numberOfFullPassMuons << " up to a maximum of " << NUM_MUONS << std::endl;}
390
391 // This shouldn't really ever happen but just in case.
392 if ( !pxMuon ) {
393 if(m_doDebug) { std::cout <<" * ZmumuEvent * RecordMuon * bad pxMuon --> EXIT "<< std::endl;}
394 return false;
395 }
396
398 // The main Muon
400 // Tracking Muon Spectrometer ( raw )
401 const xAOD::TrackParticle* pxMSTrack = pxMuon->trackParticle(xAOD::Muon::TrackParticleType::MuonSpectrometerTrackParticle);
402 if (!pxMSTrack) {
403 if(m_doDebug){ std::cout <<" * ZmumuEvent * RecordMuon * bad pxMSmuon --> EXIT "<< std::endl;}
404 return false;
405 }
407
408 // Tracking ID ( fix later to include loose match track conditions )
409 const xAOD::TrackParticle* pxIDTrack = pxMuon->trackParticle(xAOD::Muon::TrackParticleType::InnerDetectorTrackParticle);
410 if (!pxIDTrack) {
411 return false;
412 }
414 //
415 if(m_doDebug){ std::cout <<" m_pxRecMuon[" << m_numberOfFullPassMuons <<"]"
416 << " pt= " << m_pxRecMuon[m_numberOfFullPassMuons]->pt() << " q= "<< m_pxRecMuon[m_numberOfFullPassMuons]->charge() << std::endl;}
417 if(m_doDebug){ std::cout <<" m_pxMSTrack[" << m_numberOfFullPassMuons <<"]"
418 <<" pt= " << m_pxMSTrack[m_numberOfFullPassMuons]->pt() << " q= " << m_pxMSTrack[m_numberOfFullPassMuons]->charge() << std::endl;}
419 if(m_doDebug){ std::cout <<" m_pxIDTrack[" << m_numberOfFullPassMuons <<"]"
420 <<" pt= " << m_pxIDTrack[m_numberOfFullPassMuons]->pt() << " q= " << m_pxIDTrack[m_numberOfFullPassMuons]->charge() << std::endl;}
421 // update count
423 }
424 if(m_doDebug){ std::cout <<" * ZmumuEvent * RecordMuon * return with a total of " << m_numberOfFullPassMuons << std::endl;}
425 return true;
426}
427
428
429//==================================================================================
455
456//==================================================================================
458{
459 // First determine what's positive
460 if ( m_numberOfFullPassMuons == 2 )
461 {
462 switch ( eType )
463 {
464 case MS :
465 {
467 }
468 case ME:
469 {
471 }
472 case CB:
473 {
475 }
476 case ID:
477 {
479 }
480 default:
481 return -999.0;
482 }
483 }
484 else
485 {
486 return -999.0;
487 }
488}
489
490//==================================================================================
492{
493 switch ( eType )
494 {
495 case MS :
496 {
497 return ( static_cast<int>( EvalCharge( m_pxMSTrack[m_muon1], m_pxMSTrack[m_muon2] ) ) );
498 }
499 case ME:
500 {
501 return ( static_cast<int>( EvalCharge( m_pxMETrack[m_muon1], m_pxMETrack[m_muon2] ) ) );
502 }
503 case CB:
504 {
505 return ( static_cast<int>( EvalCharge( m_pxRecMuon[m_muon1], m_pxRecMuon[m_muon2] ) ) );
506 }
507 case ID:
508 {
509 return ( static_cast<int>( EvalCharge( m_pxIDTrack[m_muon1], m_pxIDTrack[m_muon2] ) ) );
510 }
511 default:
512 return -999;
513 }
514}
515
516//==================================================================================
517unsigned int ZmumuEvent::getPosMuon( ZTYPE eType )
518{
519 if ( getNumberOfTaggedMuons() != 2 ) return 999;
520 if ( getZCharge(eType) != 0 ) return 999;
521
522 switch ( eType )
523 {
524 case MS :
525 {
526 if ( !m_pxMSTrack[m_muon1] || !m_pxMSTrack[m_muon2] ) return 999;
527 return ( static_cast<int>( m_pxMSTrack[m_muon1]->charge() ) == 1 ? m_muon1 : m_muon2 );
528 }
529 case ME:
530 {
531 if ( !m_pxMETrack[m_muon1] || !m_pxMETrack[m_muon2] ) return 999;
532 return ( static_cast<int>( m_pxMETrack[m_muon1]->charge() ) == 1 ? m_muon1 : m_muon2 );
533 }
534 case CB:
535 {
536 if ( !m_pxRecMuon[m_muon1] || !m_pxRecMuon[m_muon2] ) return 999;
537 return ( static_cast<int>( m_pxRecMuon[m_muon1]->charge() ) == 1 ? m_muon1 : m_muon2 );
538 }
539 case ID:
540 {
541 if ( !m_pxIDTrack[m_muon1] || !m_pxIDTrack[m_muon2] ) return 999;
542 return ( static_cast<int>( m_pxIDTrack[m_muon1]->charge() ) == 1 ? m_muon1 : m_muon2 );
543 }
544 default:
545 return 999;
546 }
547}
548
549//==================================================================================
550unsigned int ZmumuEvent::getNegMuon( ZTYPE eType )
551{
552 int uTmp = getPosMuon( eType );
553 if ( uTmp == 999 )
554 {
555 return 999;
556 }
557 else
558 {
559 return ( ( uTmp == m_muon1 ) ? m_muon2 : m_muon1 );
560 }
561}
562
563//==================================================================================
564const xAOD::TrackParticle* ZmumuEvent::getLooseIDTk( unsigned int /*uPart*/ )
565{
566 const xAOD::TrackParticleContainer* pxTrackContainer =
568
569 if ( pxTrackContainer )
570 {
571 xAOD::TrackParticleContainer::const_iterator xTrkItr = pxTrackContainer->begin();
572 xAOD::TrackParticleContainer::const_iterator xTrkItrE = pxTrackContainer->end();
573 while ( xTrkItr != xTrkItrE )
574 {
575 const xAOD::TrackParticle* pxTrack = *xTrkItr;
576 if ( !pxTrack ) continue;
577 const Trk::Track* pxTrkTrack = pxTrack->track();
578 if(!pxTrkTrack) continue;
579 const Trk::Perigee* pxPerigee = pxTrkTrack->perigeeParameters() ;
580 if ( !pxPerigee ) continue;
581 const float fTrkPhi = pxPerigee->parameters()[Trk::phi];
582 const float fTrkEta = pxPerigee->eta();
583
584 float fDPhi = std::abs( fTrkPhi - m_pxMETrack[m_muon1]->phi() );
585 float fDEta = std::abs( fTrkEta - m_pxMETrack[m_muon2]->eta() );
586 float fDR = sqrt( fDPhi*fDPhi + fDEta*fDEta );
587
588 if ( fDR < 0.3f )
589 {
590 return pxTrack;
591 }
592
593 ++xTrkItr;
594 }
595 }
596 // if ()
597 return nullptr;
598}
599
600//==================================================================================
602{
603 // first set the new pt cut value
604 m_LeadingMuonPtCut = newvalue;
605
606
607 // the second muon pt cut can not be higher than the leading muon pt cut:
609
610 // this has to be translated to the MuonSelector
611 // but there one has to use the minimum momentum --> second muon
612 //this->SetMuonPtCut(m_SecondMuonPtCut);
613 if(m_doDebug && false){std::cout <<" * ZmumuEvent * SetLeadingMuonPtCut * new Pt cuts: " << m_LeadingMuonPtCut << " & " << m_SecondMuonPtCut << " MuonSelector: " << m_xMuonID.GetPtCut() << std::endl;}
614 return;
615}
616
617//==================================================================================
618void ZmumuEvent::SetSecondMuonPtCut (double newvalue)
619{
620 m_SecondMuonPtCut = newvalue;
621
622 // second muon pt shouldn't be higher than the leading muon pt
624
625 // this has to be translated to the MuonSelector
627
628 if(m_doDebug && false){std::cout <<" * ZmumuEvent * SetSecondMuonPtCut * new Pt cuts: " << m_LeadingMuonPtCut << " & " << m_SecondMuonPtCut << " MuonSelector: " << m_xMuonID.GetPtCut() << std::endl;}
629
630 return;
631}
632
633//==================================================================================
635{
636 int muPlusId = -9;
637 int muMinusId = -9;
638 double muPlusPt = 0.;
639 double muMinusPt = 0.;
640
641 if (m_doDebug) {std::cout <<" * ZmumuEvent * OrderMuonList * START * input number of muons: " << m_numberOfFullPassMuons << std::endl;}
642
643 if (m_numberOfFullPassMuons >= 2) {
644 for (int imuon=0; imuon < (int) m_numberOfFullPassMuons; imuon++) {
645 if (m_pxRecMuon[imuon] != nullptr) {
646
647 if (m_pxRecMuon[imuon]->charge()== 1 && m_pxRecMuon[imuon]->pt()> muPlusPt) {
648 muPlusPt = m_pxRecMuon[imuon]->pt();
649 muPlusId = imuon;
650 }
651 if (m_pxRecMuon[imuon]->charge()==-1 && m_pxRecMuon[imuon]->pt()> muMinusPt) {
652 muMinusPt = m_pxRecMuon[imuon]->pt();
653 muMinusId = imuon;
654 }
655 } // muon exist
656 } // for (int imuon
657 } // if (m_numberOfFullPassMuons >= 2)
658 if (muPlusId>=0 && muMinusId>=0) {
659 m_muon1 = muPlusId;
660 m_muon2 = muMinusId;
661 m_numberOfFullPassMuons = 2; // the two muons have been selected. Let's pretend we have only two muons then.
662 }
663 if (m_doDebug) {std::cout <<" * ZmumuEvent * OrderMuonList * COMPLETED ** numberOfFullPassMuons: " << m_numberOfFullPassMuons
664 << " mu+: " << muPlusId << " mu-: " << muMinusId << std::endl;}
665 return;
666}
667
668
669//==================================================================================
671{
672 m_xMuonID.finalize();
673
674 std::cout << " ** ZmumuEvent ** -- STATS -- " << std::endl
675 << " Analyzed events : " << m_analyzedEventCount << std::endl
676 << " Events passing LumiBlock : " << m_eventselectioncount_goodlumiblock << std::endl
677 << " Tested muons : " << m_testedMuonCount << std::endl
678 << " Accepted muons : " << m_acceptedMuonCount << std::endl
679 << " Events without enough muon: " << m_eventsWithoutEnoughMuonsCount << std::endl
680 << " Events with enough muons : " << m_eventsWithEnoughMuonsCount << std::endl
681 << " pass few muons : " << m_eventselectioncount_toofewmuons << std::endl
682 << " pass not filled muons : " << m_eventselectioncount_notallmuonsfilled << std::endl
683 << " pass more than 2 muons : " << m_eventselectioncount_morethantwomuons << std::endl
684 << " pass pt lead : " << m_eventselectioncount_ptofleadingmuon << std::endl
685 << " pass pt 2nd : " << m_eventselectioncount_ptofsecondmuon << std::endl
686 << " pass mass window : " << m_eventselectioncount_masswindow << std::endl
687 << " pass opening angle : " << m_eventselectioncount_openingangle << std::endl
688 << " pass dimuon charge : " << m_eventselectioncount_dimuoncharge << std::endl
689 << " Accepted events : " << m_acceptedEventCount << std::endl
690 << std::endl;
691 return;
692}
693
Scalar eta() const
pseudorapidity method
Scalar phi() const
phi method
double charge(const T &p)
Definition AtlasPID.h:997
Helper class to provide type-safe access to aux data.
DataModel_detail::const_iterator< DataVector > const_iterator
Definition DataVector.h:838
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.
static float EvaluateAngle(const T *pxP1, const T *pxP2)
static float EvalDiMuInvMass(const T *pxP1, const T *pxP2)
static float EvalCharge(const T *pxP1, const T *pxP2)
static float EvalPhi(const T *pxP1, const T *pxP2)
static float EvalPtDiff(const T *pxP1, const T *pxP2)
virtual void Init()
static float EvalPt(const T *pxP1, const T *pxP2)
static float EvalEta(const T *pxP1, const T *pxP2)
std::string m_xSampleName
static const T * getContainer(CONTAINERS eContainer)
double eta() const
Access method for pseudorapidity - from momentum.
const Perigee * perigeeParameters() const
return Perigee.
double m_LeadingMuonPtCut
Definition ZmumuEvent.h:129
bool m_doDebug
Definition ZmumuEvent.h:139
void OrderMuonList()
int m_analyzedEventCount
Definition ZmumuEvent.h:143
float getPtImbalance(ZTYPE eType)
double m_Z0GapCut
Definition ZmumuEvent.h:134
unsigned int m_testedMuonCount
Definition ZmumuEvent.h:147
unsigned int m_eventselectioncount_masswindow
Definition ZmumuEvent.h:154
bool m_skipMScheck
Definition ZmumuEvent.h:135
int getZCharge(ZTYPE eType)
virtual void Init()
unsigned int m_acceptedEventCount
Definition ZmumuEvent.h:146
bool m_SelectMuonByIP
Definition ZmumuEvent.h:181
float m_fZEtaDir[NUM_TYPES]
Definition ZmumuEvent.h:167
double m_etaCut
Definition ZmumuEvent.h:126
const xAOD::TrackParticle * m_pxMSTrack[NUM_MUONS]
Definition ZmumuEvent.h:162
bool m_SelectMuonByIso
Definition ZmumuEvent.h:180
unsigned int m_eventsWithEnoughMuonsCount
Definition ZmumuEvent.h:145
void ReconstructKinematics()
unsigned int m_eventselectioncount_toofewmuons
Definition ZmumuEvent.h:149
unsigned int m_eventselectioncount_goodlumiblock
Definition ZmumuEvent.h:157
int m_maxGoodLumiBlock
Definition ZmumuEvent.h:137
unsigned int m_eventselectioncount_ptofsecondmuon
Definition ZmumuEvent.h:153
float m_fZPhiDir[NUM_TYPES]
Definition ZmumuEvent.h:168
int m_minGoodLumiBlock
Definition ZmumuEvent.h:136
bool EventSelection(ZTYPE eType)
double m_MassWindowHigh
Definition ZmumuEvent.h:132
MuonSelector m_xMuonID
Definition ZmumuEvent.h:118
unsigned int m_eventsWithoutEnoughMuonsCount
Definition ZmumuEvent.h:144
unsigned int m_uTrackMatch
Definition ZmumuEvent.h:124
unsigned int m_eventselectioncount_notallmuonsfilled
Definition ZmumuEvent.h:150
unsigned int m_uMuonTags
Definition ZmumuEvent.h:123
float m_fZPt[NUM_TYPES]
Definition ZmumuEvent.h:166
unsigned int m_eventselectioncount_openingangle
Definition ZmumuEvent.h:155
const xAOD::TrackParticle * m_pxIDTrack[NUM_MUONS]
Definition ZmumuEvent.h:163
const xAOD::Muon * m_pxRecMuon[NUM_MUONS]
Definition ZmumuEvent.h:160
unsigned int getNumberOfTaggedMuons()
Definition ZmumuEvent.h:77
unsigned int getPosMuon(ZTYPE eType)
double m_SecondMuonPtCut
Definition ZmumuEvent.h:130
float m_fInvariantMass[NUM_TYPES]
Definition ZmumuEvent.h:169
float m_fMuonDispersion[NUM_TYPES]
Definition ZmumuEvent.h:170
unsigned int m_numberOfFullPassMuons
Definition ZmumuEvent.h:141
unsigned int m_acceptedMuonCount
Definition ZmumuEvent.h:148
double m_MassWindowLow
Definition ZmumuEvent.h:131
bool m_bLooseMatch
Definition ZmumuEvent.h:125
bool m_passedSelectionCuts
Definition ZmumuEvent.h:142
unsigned int m_eventselectioncount_morethantwomuons
Definition ZmumuEvent.h:151
void SetSecondMuonPtCut(double newvalue)
const std::string getRegion() const
double m_OpeningAngleCut
Definition ZmumuEvent.h:133
void finalize()
void SetLeadingMuonPtCut(double newvalue)
void SetMuonPtCut(double newvalue)
Definition ZmumuEvent.h:91
const xAOD::TrackParticle * m_pxMETrack[NUM_MUONS]
Definition ZmumuEvent.h:161
virtual ~ZmumuEvent()
unsigned int m_eventselectioncount_dimuoncharge
Definition ZmumuEvent.h:156
unsigned int m_eventselectioncount_ptofleadingmuon
Definition ZmumuEvent.h:152
virtual bool Reco(int theLumiBlock=0)
PerfMonServices::CONTAINERS m_container
Definition ZmumuEvent.h:119
bool RecordMuon(const xAOD::Muon *pxMuon)
unsigned int getNegMuon(ZTYPE eType)
double m_DiMuonPairInvMass
Definition ZmumuEvent.h:127
virtual void BookHistograms()
const TrackParticle * trackParticle(TrackParticleType type) const
Returns a pointer (which can be NULL) to the TrackParticle used in identification of this muon.
Definition Muon_v1.cxx:482
const Trk::Track * track() const
Returns a pointer (which can be NULL) to the Trk::Track which was used to make this TrackParticle.
virtual double pt() const override final
The transverse momentum ( ) of the particle.
SG::Decorator< T, ALLOC > Decorator
Helper class to provide type-safe access to aux data, specialized for JaggedVecElt.
Definition AuxElement.h:576
ParametersT< TrackParametersDim, Charged, PerigeeSurface > Perigee
@ phi
Definition ParamDefs.h:75
TrackParticle_v1 TrackParticle
Reference the current persistent version:
TrackParticleContainer_v1 TrackParticleContainer
Definition of the current "TrackParticle container version".
Muon_v1 Muon
Reference the current persistent version:
MuonContainer_v1 MuonContainer
Definition of the current "Muon container version".