ATLAS Offline Software
Loading...
Searching...
No Matches
FourMuonEvent Class Reference

#include <FourMuonEvent.h>

Inheritance diagram for FourMuonEvent:
Collaboration diagram for FourMuonEvent:

Public Types

enum  {
  MUON1 , MUON2 , MUON3 , MUON4 ,
  NUM_MUONS
}
enum  { CENTRAL , FORWARD , BACKWARD , UNDEF }
enum  ZTYPE {
  MS , ME , ID , CB ,
  NUM_TYPES
}

Public Member Functions

 FourMuonEvent ()
virtual ~FourMuonEvent ()
 FourMuonEvent (const FourMuonEvent &)=delete
FourMuonEvent & operator= (const FourMuonEvent &)=delete
void Init ()
bool Reco ()
void doIsoSelection (bool doIso)
void doIPSelection (bool doIPsel)
void doMCPSelection (bool doMCP)
bool EventPassed ()
const float & get4MuInvMass (ZTYPE eType)
int getAcceptedEvents ()
const xAOD::Muon * getCombMuon (unsigned int uPart)
const xAOD::TrackParticle * getELTrack (unsigned int uPart)
const xAOD::TrackParticle * getIDTrack (unsigned int uPart)
double GetInvMass ()
const xAOD::TrackParticle * getMSTrack (unsigned int uPart)
const xAOD::TrackParticle * getLooseIDTk (unsigned int uPart)
const float & getLeptonOpeningAngle (ZTYPE eType)
unsigned int getNegMuon (int eType)
unsigned int getNumberOfTaggedMuons ()
int GetNVertex ()
float getPtImbalance (ZTYPE eType)
const std::string getRegion () const
unsigned int getPosMuon (int eType)
int GetVertexElec (unsigned int uPart)
int GetVertexElNeg1 ()
int GetVertexElNeg2 ()
int GetVertexElPos1 ()
int GetVertexElPos2 ()
int GetVertexMuNeg1 ()
int GetVertexMuNeg2 ()
int GetVertexMuPos1 ()
int GetVertexMuPos2 ()
int getZCharge (ZTYPE eType)
const float & getZEta (ZTYPE eType)
const float & getZMass (ZTYPE eType)
const float & getZPhi (ZTYPE eType)
const float & getZPt (ZTYPE eType)
void OrderMuonList ()
void setContainer (PerfMonServices::CONTAINERS container)
void setDebugMode (bool debug)
void SetLeadingMuonPtCut (double newvalue)
void SetMassWindowLow (double newvalue)
void SetMassWindowHigh (double newvalue)
void SetMuonPtCut (double newvalue)
void SetMuonSelectionTool (const ToolHandle< CP::IMuonSelectionTool > &mst)
void SetSecondMuonPtCut (double newvalue)
void SetOpeningAngleCut (double newvalue)
void SetZ0GapCut (double newvalue)

Static Public Member Functions

template<class T>
static CLHEP::Hep3Vector calculateMomentum (const T *pP)
template<class T>
static float EvalInvMass (const T *pxP1, const T *pxP2, float fMass1, float fMass2=invalidAnswer)
template<class T>
static float EvalInvMass (const T *pxP1, const T *pxP2, const T *pxp3, const T *pxP4, float fMass1, float fMass2=-999.9, float fMass3=-999.9, float fMass4=invalidAnswer)
template<class T>
static float EvalDiMuInvMass (const T *pxP1, const T *pxP2)
template<class T>
static float EvalFourMuInvMass (const T *pxP1, const T *pxP2, const T *pxP3, const T *pxP4)
template<class T>
static float EvaluateAngle (const T *pxP1, const T *pxP2)
template<class T>
static float EvalPtDiff (const T *pxP1, const T *pxP2)
template<class T>
static float EvalPhiDiff (const T *pxP1, const T *pxP2)
template<class T>
static float EvalEtaDiff (const T *pxP1, const T *pxP2)
template<class T>
static float EvalPt (const T *pxP1, const T *pxP2)
template<class T>
static float EvalPhi (const T *pxP1, const T *pxP2)
template<class T>
static float EvalEta (const T *pxP1, const T *pxP2)
template<class T>
static float EvalCharge (const T *pxP1, const T *pxP2)
template<class T>
static float EvalTransverseMass (const T *pxP1, float fMETx, float fMETy, float fMass1, float fMass2=invalidAnswer)
template<class T>
static float EvalTransverseMass (const T *pxP1, float fMETx, float fMETy)
template<class T>
static float EvalTransverseMass (const T *pxP1, const T *pxP2, float fMETx, float fMETy, float fMass1, float fMass2=invalidAnswer)
template<class T>
static float EvalTransverseMass (const T *pxP1, const T *pxP2, float fMETx, float fMETy)

Static Public Attributes

static constexpr float invalidAnswer {-999.9f}

Protected Member Functions

void BookHistograms ()

Protected Attributes

unsigned int m_uPassedEvents
std::map< unsigned int, TH1F * > m_x1DHistograms
std::map< unsigned int, TH2F * > m_x2DHistograms
std::map< unsigned int, TProfile * > m_x1DProfHistograms
std::map< unsigned int, TProfile2D * > m_x2DProfHistograms
std::string m_xSampleName

Private Types

enum  HISTOS_1D {
  ZMASS_MUON , ZMASS_MUONADJ , ZMASS_TRACK , ZMASS_COMB ,
  NUM_1HISTOS
}
typedef EventAnalysis PARENT
using Arrayf = std::array<float, NUM_TYPES>

Private Member Functions

bool CheckMuonVertices ()
void Clear ()
bool EventSelection (ZTYPE eType)
bool EventSelectionNew (ZTYPE eType)
bool ReconstructKinematicsNew ()
bool ReconstructKinematics ()
bool ReconstructKinematics4Elec ()
void RecordMuon (const xAOD::Muon *pxMuon)
void Register ()

Private Attributes

MsgStream * m_msgStream {}
MuonSelector m_xMuonID
ElectronSelector m_xElecID
PerfMonServices::CONTAINERS m_container
unsigned int m_uMuonTags {}
double m_FourMuonInvMass {}
double m_LeadingMuonPtCut {}
double m_SecondMuonPtCut {}
double m_MassWindowLow {}
double m_MassWindowHigh {}
double m_OpeningAngleCut {}
double m_deltaXYcut {}
double m_Z0GapCut {}
bool m_doDebug {}
bool m_workAsFourMuons {}
bool m_workAsFourElectrons {}
bool m_workAsFourLeptons {}
unsigned int m_numberOfFullPassMuons {}
unsigned int m_numberOfFullPassElectrons {}
bool m_passedSelectionCuts = false
bool m_passedFourMuonSelection = false
bool m_passedFourElectronSelection = false
bool m_passedFourLeptonSelection = false
const xAOD::Muon * m_pxRecMuon [NUM_MUONS] {}
const xAOD::TrackParticle * m_pxMETrack [NUM_MUONS] {}
const xAOD::TrackParticle * m_pxMSTrack [NUM_MUONS] {}
const xAOD::TrackParticle * m_pxIDTrack [NUM_MUONS] {}
const xAOD::TrackParticle * m_pxELTrack [NUM_MUONS] {}
const xAOD::TrackParticle * m_pxMUTrack [NUM_MUONS] {}
Arrayf m_fZPt {}
Arrayf m_fZEtaDir {}
Arrayf m_fZPhiDir {}
Arrayf m_fInvariantMass {}
Arrayf m_fMuonDispersion {}
bool m_SelectMuonByIso {}
bool m_SelectMuonByIP {}
int m_eventCount {}
int m_acceptedEventCount {}
int m_acceptedMuonCount {}
int m_acceptedElecCount {}
int m_muon1 = 0
int m_muon2 = 0
int m_muonpos1 = 0
int m_muonpos2 = 0
int m_muonneg1 = 0
int m_muonneg2 = 0
int m_nVertex = 0
int m_muonneg1_vtx = 0
int m_muonneg2_vtx = 0
int m_muonpos1_vtx = 0
int m_muonpos2_vtx = 0
int m_muon_vtx [NUM_MUONS] {}
int m_elec_vtx [NUM_MUONS] {}

Detailed Description

Definition at line 35 of file FourMuonEvent.h.

Member Typedef Documentation

◆ Arrayf

using FourMuonEvent::Arrayf = std::array<float, NUM_TYPES>
private

Definition at line 178 of file FourMuonEvent.h.

◆ PARENT

Definition at line 124 of file FourMuonEvent.h.

Member Enumeration Documentation

◆ anonymous enum

anonymous enum
Enumerator
CENTRAL 
FORWARD 
BACKWARD 
UNDEF 

Definition at line 53 of file FourMuonEvent.h.

◆ anonymous enum

anonymous enum
Enumerator
MUON1 
MUON2 
MUON3 
MUON4 
NUM_MUONS 

Definition at line 44 of file FourMuonEvent.h.

◆ HISTOS_1D

Enumerator
ZMASS_MUON 
ZMASS_MUONADJ 
ZMASS_TRACK 
ZMASS_COMB 
NUM_1HISTOS 

Definition at line 186 of file FourMuonEvent.h.

◆ ZTYPE

Enumerator
MS 
ME 
ID 
CB 
NUM_TYPES 

Definition at line 61 of file FourMuonEvent.h.

62 {
63 MS, // Just the muon system ( uncorrected )
64 ME, // The adjusted muon system properties ( corr. for cal. )
65 ID, // Using the ID system.
66 CB, // Using both the muon & ID system.
68 };

Constructor & Destructor Documentation

◆ FourMuonEvent() [1/2]

FourMuonEvent::FourMuonEvent ( )

Definition at line 22 of file FourMuonEvent.cxx.

23{
24 m_xSampleName = "FourMuon";
25
26 m_container = PerfMonServices::MUON_COLLECTION; //PerfMonServices::ELECTRON_COLLECTION
27
28 m_doDebug = false;
29 m_workAsFourMuons = false;
32
33 // Setup the muon tags
34 m_uMuonTags = 4;
35 m_LeadingMuonPtCut = 20.;
37 m_MassWindowLow = 10.0;
38 m_MassWindowHigh = 125.0;
39 m_deltaXYcut = 0.1; // in mm
40 m_Z0GapCut = 5.0; // in mm
41 m_SelectMuonByIso = true;
42 m_SelectMuonByIP = true;
43 m_eventCount = 0;
47
48 m_msgStream = new MsgStream(Athena::getMessageSvc(), "InDetPerformanceMonitoring" );
49}
std::string m_xSampleName
double m_MassWindowLow
PerfMonServices::CONTAINERS m_container
bool m_workAsFourElectrons
double m_SecondMuonPtCut
double m_MassWindowHigh
MsgStream * m_msgStream
double m_LeadingMuonPtCut
unsigned int m_uMuonTags
IMessageSvc * getMessageSvc(bool quiet=false)

◆ ~FourMuonEvent()

FourMuonEvent::~FourMuonEvent ( )
virtual

Definition at line 52 of file FourMuonEvent.cxx.

53{
54 delete m_msgStream;
55}

◆ FourMuonEvent() [2/2]

FourMuonEvent::FourMuonEvent ( const FourMuonEvent & )
delete

Member Function Documentation

◆ BookHistograms()

void FourMuonEvent::BookHistograms ( )
protectedvirtual

Reimplemented from EventAnalysis.

Definition at line 248 of file FourMuonEvent.cxx.

249{
250}

◆ calculateMomentum()

template<class T>
CLHEP::Hep3Vector EventAnalysis::calculateMomentum ( const T * pP)
staticinherited

Definition at line 92 of file EventAnalysis.h.

92 {
93 const auto & p4(pP->p4());
94 return CLHEP::Hep3Vector(p4.Px() * EAna::CGeV , p4.Py() * EAna::CGeV, p4.Pz() * EAna::CGeV);
95}
const float CGeV

◆ CheckMuonVertices()

bool FourMuonEvent::CheckMuonVertices ( )
private

Definition at line 1182 of file FourMuonEvent.cxx.

1183{
1184 (*m_msgStream) << MSG::DEBUG << " * FourMuonsEvents::CheckMuonVertices * -- START --" << endmsg;
1185
1186 if (m_doDebug) std::cout << " -- FourMuonEvent::CheckMuonVertices -- WARNING -- MUONS DO NOT COME FROM SAME VERTEX \n" ;
1187
1188 (*m_msgStream) << MSG::DEBUG << " * FourMuonsEvents::CheckMuonVertices * -- COMPLETED -- status: " << true << endmsg;
1189 return true;
1190}
#define endmsg

◆ Clear()

void FourMuonEvent::Clear ( )
private

Definition at line 588 of file FourMuonEvent.cxx.

589{
592 m_passedSelectionCuts = false;
596
597
598 m_FourMuonInvMass = -1.; // flag as no reconstructed inv mass yet
599 m_muon1 = MUON1; // point to the first two
600 m_muon2 = MUON2;
601 m_muonneg1 = -1;
602 m_muonneg2 = -1;
603 m_muonpos1 = -1;
604 m_muonpos2 = -1;
605
606
607 for ( unsigned int u = 0; u < NUM_MUONS; ++u ) {
608 m_pxRecMuon[u] = nullptr;
609 m_pxMSTrack[u] = nullptr;
610 m_pxMETrack[u] = nullptr;
611 m_pxIDTrack[u] = nullptr;
612 m_pxMUTrack[u] = nullptr;
613 m_pxELTrack[u] = nullptr;
614 }
615 for ( unsigned int v = 0; v < NUM_TYPES; ++v ) {
616 m_fZPt[v] = -999.9f;
617 m_fZEtaDir[v] = -999.9f;
618 m_fZPhiDir[v] = -999.9f;
619 m_fInvariantMass[v] = -999.9f;
620 m_fMuonDispersion[v] = -999.9f;
621 }
622
623 // tell us to which vertex the muons are associated
624 m_nVertex = 0; // reset vertex count
625 m_muonneg1_vtx = 0;
626 m_muonneg2_vtx = 0;
627 m_muonpos1_vtx = 0;
628 m_muonpos2_vtx = 0;
629
630 for (size_t i=0; i < NUM_MUONS; i++) m_muon_vtx[i] = 0; // reset the vertex ID to which the electrons are associated
631 for (size_t i=0; i < NUM_MUONS; i++) m_elec_vtx[i] = 0; // reset the vertex ID to which the electrons are associated
632 return;
633}
const xAOD::TrackParticle * m_pxMETrack[NUM_MUONS]
double m_FourMuonInvMass
Arrayf m_fInvariantMass
bool m_passedFourLeptonSelection
int m_muon_vtx[NUM_MUONS]
bool m_passedFourElectronSelection
int m_elec_vtx[NUM_MUONS]
const xAOD::TrackParticle * m_pxIDTrack[NUM_MUONS]
const xAOD::TrackParticle * m_pxMUTrack[NUM_MUONS]
bool m_passedFourMuonSelection
bool m_passedSelectionCuts
const xAOD::TrackParticle * m_pxELTrack[NUM_MUONS]
Arrayf m_fMuonDispersion
unsigned int m_numberOfFullPassElectrons
const xAOD::Muon * m_pxRecMuon[NUM_MUONS]
const xAOD::TrackParticle * m_pxMSTrack[NUM_MUONS]
unsigned int m_numberOfFullPassMuons
@ u
Enums for curvilinear frames.
Definition ParamDefs.h:77

◆ doIPSelection()

void FourMuonEvent::doIPSelection ( bool doIPsel)
inline

Definition at line 75 of file FourMuonEvent.h.

75{ m_xMuonID.doIPSelection(doIPsel); }
MuonSelector m_xMuonID

◆ doIsoSelection()

void FourMuonEvent::doIsoSelection ( bool doIso)
inline

Definition at line 74 of file FourMuonEvent.h.

74{ m_xMuonID.doIsoSelection(doIso); }

◆ doMCPSelection()

void FourMuonEvent::doMCPSelection ( bool doMCP)
inline

Definition at line 76 of file FourMuonEvent.h.

76{ m_xMuonID.doMCPSelection(doMCP); }

◆ EvalCharge()

template<class T>
float EventAnalysis::EvalCharge ( const T * pxP1,
const T * pxP2 )
staticinherited

Definition at line 239 of file EventAnalysis.h.

240{
241 // Check integrity of inputs.
242 if ( !pxP1 || !pxP2 ) return invalidAnswer;
243 return static_cast<float>( pxP1->charge() + pxP2->charge() );
244}
static constexpr float invalidAnswer

◆ EvalDiMuInvMass()

template<class T>
float EventAnalysis::EvalDiMuInvMass ( const T * pxP1,
const T * pxP2 )
staticinherited

Definition at line 98 of file EventAnalysis.h.

99{
100 // Check integrity of inputs.
101 if ( !pxP1 || !pxP2 ) return invalidAnswer;
102
103 // Evaluate Di-mu invariant mass.
104 return EvalInvMass( pxP1, pxP2, EAna::g_fMuonMass );
105}
static float EvalInvMass(const T *pxP1, const T *pxP2, float fMass1, float fMass2=invalidAnswer)
const float g_fMuonMass

◆ EvalEta()

template<class T>
float EventAnalysis::EvalEta ( const T * pxP1,
const T * pxP2 )
staticinherited

Definition at line 230 of file EventAnalysis.h.

231{
232 // Check integrity of inputs.
233 if ( !pxP1 || !pxP2 ) return invalidAnswer;
234 CLHEP::Hep3Vector xTmp1 = calculateMomentum(pxP1);
235 CLHEP::Hep3Vector xTmp2 = calculateMomentum(pxP2);
236 return static_cast<float>( (xTmp1 + xTmp2).pseudoRapidity() );
237}
static CLHEP::Hep3Vector calculateMomentum(const T *pP)

◆ EvalEtaDiff()

template<class T>
float EventAnalysis::EvalEtaDiff ( const T * pxP1,
const T * pxP2 )
staticinherited

Definition at line 202 of file EventAnalysis.h.

203{
204 // Check integrity of inputs.
205 if ( !pxP1 || !pxP2 ) return invalidAnswer;
206 // Evaluate the angle.
207 CLHEP::Hep3Vector xTmp1 = calculateMomentum(pxP1);
208 CLHEP::Hep3Vector xTmp2 = calculateMomentum(pxP2);
209 return static_cast<float>( xTmp1.polarAngle(xTmp2) );
210}

◆ EvalFourMuInvMass()

template<class T>
float EventAnalysis::EvalFourMuInvMass ( const T * pxP1,
const T * pxP2,
const T * pxP3,
const T * pxP4 )
staticinherited

Definition at line 124 of file EventAnalysis.h.

125{
126 // Check integrity of inputs.
127 if ( !pxP1 || !pxP2 || !pxP3 || !pxP4) return invalidAnswer;
128
129 // Evaluate invariant mass.
130 return EvalInvMass( pxP1, pxP2, pxP3, pxP4, EAna::g_fMuonMass );
131}

◆ EvalInvMass() [1/2]

template<class T>
float EventAnalysis::EvalInvMass ( const T * pxP1,
const T * pxP2,
const T * pxp3,
const T * pxP4,
float fMass1,
float fMass2 = -999.9,
float fMass3 = -999.9,
float fMass4 = invalidAnswer )
staticinherited

Definition at line 133 of file EventAnalysis.h.

135{
136 // Check integrity of inputs.No tachyons.
137 if ( fMass1 < 0.0f ) return invalidAnswer;
138 if ( !pxP1 || !pxP2 || !pxP3 || !pxP4) return invalidAnswer;
139
140 // Set masses equal if required by user
141 fMass2 = ( fMass2 < 0.0f ) ? fMass1 : fMass2;
142 fMass3 = ( fMass3 < 0.0f ) ? fMass1 : fMass3;
143 fMass4 = ( fMass4 < 0.0f ) ? fMass1 : fMass4;
144
145 // Evaluate invariant mass.
146 CLHEP::Hep3Vector xTmp1 = CLHEP::Hep3Vector( pxP1->p4().Px() * EAna::CGeV, pxP1->p4().Py() * EAna::CGeV, pxP1->p4().Pz() * EAna::CGeV );
147 CLHEP::Hep3Vector xTmp2 = CLHEP::Hep3Vector( pxP2->p4().Px() * EAna::CGeV, pxP2->p4().Py() * EAna::CGeV, pxP2->p4().Pz() * EAna::CGeV );
148 CLHEP::Hep3Vector xTmp3 = CLHEP::Hep3Vector( pxP3->p4().Px() * EAna::CGeV, pxP3->p4().Py() * EAna::CGeV, pxP3->p4().Pz() * EAna::CGeV );
149 CLHEP::Hep3Vector xTmp4 = CLHEP::Hep3Vector( pxP4->p4().Px() * EAna::CGeV, pxP4->p4().Py() * EAna::CGeV, pxP4->p4().Pz() * EAna::CGeV );
150
151 CLHEP::HepLorentzVector xLVec; xLVec.setVectM ( xTmp1, fMass1 );
152 CLHEP::HepLorentzVector xLVec2; xLVec2.setVectM( xTmp2, fMass2 );
153 CLHEP::HepLorentzVector xLVec3; xLVec3.setVectM( xTmp3, fMass3 );
154 CLHEP::HepLorentzVector xLVec4; xLVec4.setVectM( xTmp4, fMass4 );
155
156 xLVec += xLVec2;
157 xLVec += xLVec3;
158 xLVec += xLVec4;
159
160 return static_cast<float>( xLVec.m() );
161}

◆ EvalInvMass() [2/2]

template<class T>
float EventAnalysis::EvalInvMass ( const T * pxP1,
const T * pxP2,
float fMass1,
float fMass2 = invalidAnswer )
staticinherited

Definition at line 107 of file EventAnalysis.h.

109{
110 // Check integrity of inputs.No tachyons.
111 if ( fMass1 < 0.0f ) return invalidAnswer;
112 if ( !pxP1 || !pxP2 ) return invalidAnswer;
113 // Set masses equal if required by user
114 fMass2 = ( fMass2 < 0.0f ) ? fMass1 : fMass2;
115 // Evaluate invariant mass.
116 CLHEP::Hep3Vector xTmp1 = calculateMomentum(pxP1);
117 CLHEP::Hep3Vector xTmp2 = calculateMomentum(pxP2);
118 CLHEP::HepLorentzVector xLVec1; xLVec1.setVectM( xTmp1, fMass1 );
119 CLHEP::HepLorentzVector xLVec2; xLVec2.setVectM( xTmp2, fMass2 );
120 return static_cast<float>( xLVec1.invariantMass( xLVec2 ) );
121}

◆ EvalPhi()

template<class T>
float EventAnalysis::EvalPhi ( const T * pxP1,
const T * pxP2 )
staticinherited

Definition at line 221 of file EventAnalysis.h.

222{
223 // Check integrity of inputs.
224 if ( !pxP1 || !pxP2 ) return invalidAnswer;
225 CLHEP::Hep3Vector xTmp1 = calculateMomentum(pxP1);
226 CLHEP::Hep3Vector xTmp2 = calculateMomentum(pxP2);
227 return static_cast<float>( (xTmp1 + xTmp2).phi() );
228}

◆ EvalPhiDiff()

template<class T>
float EventAnalysis::EvalPhiDiff ( const T * pxP1,
const T * pxP2 )
staticinherited

Definition at line 191 of file EventAnalysis.h.

192{
193 // Check integrity of inputs.
194 if ( !pxP1 || !pxP2 ) return invalidAnswer;
195 // Evaluate the angle.
196 CLHEP::Hep3Vector xTmp1 = calculateMomentum(pxP1);
197 CLHEP::Hep3Vector xTmp2 = calculateMomentum(pxP2);
198 return static_cast<float>( xTmp1.deltaPhi(xTmp2) );
199}

◆ EvalPt()

template<class T>
float EventAnalysis::EvalPt ( const T * pxP1,
const T * pxP2 )
staticinherited

Definition at line 212 of file EventAnalysis.h.

213{
214 // Check integrity of inputs.
215 if ( !pxP1 || !pxP2 ) return invalidAnswer;
216 CLHEP::Hep3Vector xTmp1 = calculateMomentum(pxP1);
217 CLHEP::Hep3Vector xTmp2 = calculateMomentum(pxP2);
218 return static_cast<float>( (xTmp1 + xTmp2).perp() );
219}

◆ EvalPtDiff()

template<class T>
float EventAnalysis::EvalPtDiff ( const T * pxP1,
const T * pxP2 )
staticinherited

Definition at line 174 of file EventAnalysis.h.

175{
176 // Check integrity of inputs.
177 if ( !pxP1 || !pxP2 ) return invalidAnswer;
178 // Evaluate the difference between the momenta. Signed using positive - negative if appropriate.
179 if ( pxP1->charge() > 0.5f )
180 {
181 return static_cast<float>( pxP1->pt() * EAna::CGeV - pxP2->pt() * EAna::CGeV );
182 }
183 else
184 {
185 return static_cast<float>( pxP2->pt() * EAna::CGeV - pxP1->pt() * EAna::CGeV );
186 }
187}

◆ EvalTransverseMass() [1/4]

template<class T>
float EventAnalysis::EvalTransverseMass ( const T * pxP1,
const T * pxP2,
float fMETx,
float fMETy )
staticinherited

Definition at line 272 of file EventAnalysis.h.

273{
274 // Check integrity of inputs.
275 if ( !pxP1 || !pxP2 ) return invalidAnswer;
276 // Evaluate Di-mu invariant mass.
277 return EvalTransverseMass( pxP1, pxP2, fMETx, fMETy, EAna::g_fMuonMass );
278}
static float EvalTransverseMass(const T *pxP1, float fMETx, float fMETy, float fMass1, float fMass2=invalidAnswer)

◆ EvalTransverseMass() [2/4]

template<class T>
float EventAnalysis::EvalTransverseMass ( const T * pxP1,
const T * pxP2,
float fMETx,
float fMETy,
float fMass1,
float fMass2 = invalidAnswer )
staticinherited

Definition at line 280 of file EventAnalysis.h.

282{
283 // Check integrity of inputs.No tachyons.
284 if ( fMass1 < 0.0f ) return invalidAnswer;
285 if ( !pxP1 || !pxP2 ) return invalidAnswer;
286 // Set masses equal if required by user.
287 fMass2 = ( fMass2 < 0.0f ) ? fMass1 : fMass2;
288 // Evaluate invariant mass.
289 CLHEP::Hep3Vector xTmp1 = CLHEP::Hep3Vector( pxP1->p4().Px() * EAna::CGeV, pxP1->p4().Py() * EAna::CGeV, 0.0f );
290 CLHEP::Hep3Vector xTmp2 = CLHEP::Hep3Vector( pxP2->p4().Px() * EAna::CGeV, pxP2->p4().Py() * EAna::CGeV, 0.0f );
291 CLHEP::Hep3Vector xTmp12 = xTmp1 + xTmp2;
292 CLHEP::Hep3Vector xTmp3 = CLHEP::Hep3Vector( fMETx, fMETy, 0.0f );
293 CLHEP::HepLorentzVector xLVec1; xLVec1.setVectM( xTmp12, fMass1 );
294 CLHEP::HepLorentzVector xLVec2; xLVec2.setVectM( xTmp3, 0.0f );
295 return static_cast<float>( xLVec1.invariantMass( xLVec2 ) );
296}

◆ EvalTransverseMass() [3/4]

template<class T>
float EventAnalysis::EvalTransverseMass ( const T * pxP1,
float fMETx,
float fMETy )
staticinherited

Definition at line 247 of file EventAnalysis.h.

248{
249 // Check integrity of inputs.
250 if ( !pxP1 ) return invalidAnswer;
251 // Evaluate Di-mu invariant mass.
252 return EvalInvMass( pxP1, fMETx, fMETy, EAna::g_fMuonMass );
253}

◆ EvalTransverseMass() [4/4]

template<class T>
float EventAnalysis::EvalTransverseMass ( const T * pxP1,
float fMETx,
float fMETy,
float fMass1,
float fMass2 = invalidAnswer )
staticinherited

Definition at line 255 of file EventAnalysis.h.

257{
258 // Check integrity of inputs.No tachyons.
259 if ( fMass1 < 0.0f ) return invalidAnswer;
260 if ( !pxP1 ) return invalidAnswer;
261 // Set masses equal if required by user.
262 fMass2 = ( fMass2 < 0.0f ) ? fMass1 : fMass2;
263 // Evaluate invariant mass.
264 CLHEP::Hep3Vector xTmp1 = CLHEP::Hep3Vector( pxP1->p4().Px() * EAna::CGeV, pxP1->p4().Py() * EAna::CGeV, 0.0f );
265 CLHEP::Hep3Vector xTmp2 = CLHEP::Hep3Vector( fMETx, fMETy, 0.0f );
266 CLHEP::HepLorentzVector xLVec1; xLVec1.setVectM( xTmp1, fMass1 );
267 CLHEP::HepLorentzVector xLVec2; xLVec2.setVectM( xTmp2, 0.0f );
268 return static_cast<float>( xLVec1.invariantMass( xLVec2 ) );
269}

◆ EvaluateAngle()

template<class T>
float EventAnalysis::EvaluateAngle ( const T * pxP1,
const T * pxP2 )
staticinherited

Definition at line 164 of file EventAnalysis.h.

165{
166 // Check integrity of inputs.
167 if ( !pxP1 || !pxP2 ) return invalidAnswer;
168 // Evaluate the angle.
169 CLHEP::Hep3Vector xTmp1 = calculateMomentum(pxP1);
170 CLHEP::Hep3Vector xTmp2 = calculateMomentum(pxP2);
171 return static_cast<float>( xTmp1.angle(xTmp2) );
172}

◆ EventPassed()

bool FourMuonEvent::EventPassed ( )
inline

Definition at line 77 of file FourMuonEvent.h.

77{ return m_passedSelectionCuts; }

◆ EventSelection()

bool FourMuonEvent::EventSelection ( ZTYPE eType)
private

Definition at line 453 of file FourMuonEvent.cxx.

454{
455 if(m_doDebug){ std::cout <<" * FourMuonEvent::EventSelection(" << eType << ") ** started ** " << std::endl
456 << " event count: " << m_eventCount << std::endl
457 << " m_NumberOfFullPassMuons: " << m_numberOfFullPassMuons << std::endl
458 << " m_NumberOfFullPassElectrons: " << m_numberOfFullPassElectrons
459 << std::endl;
460 }
461
462 // First require two muon-id's with cuts pre-applied.
464 if(m_doDebug) {std::cout <<" * FourMuonEvent::EventSelection(" << eType << ") * Failing number of good muons and electrons == 4 :( "
466 << " = " << m_numberOfFullPassMuons << " + " << m_numberOfFullPassElectrons << std::endl;}
467 return false;
468 }
469
470 if ( m_numberOfFullPassMuons > 4 ) {
471 if(m_doDebug) {std::cout <<" * FourMuonEvent::EventSelection(" << eType << ") * Too many muons !! Failing number of good muons == 4 :( "
472 << m_numberOfFullPassMuons << std::endl;}
473 return false;
474 }
475
476 if ( m_numberOfFullPassElectrons > 4 ) {
477 if(m_doDebug) {std::cout <<" * FourMuonEvent::EventSelection(" << eType << ") * Too many electrons !! Failing number of good electrons == 4 :( "
478 << m_numberOfFullPassElectrons << std::endl;}
479 return false;
480 }
481
482 // momentum of the muons
483 double leadingMuonPt = -1., secondMuonPt=-1., thirdMuonPt=-1, fourthMuonPt=-1.; // negative pt, means not computed yet
484 switch ( eType ) {
485 case MS :
486 {
487 if (m_muonpos1 >= 0) leadingMuonPt = m_pxMSTrack[m_muonpos1]->pt();
488 if (m_muonpos2 >= 0) secondMuonPt = m_pxMSTrack[m_muonpos2]->pt();
489 if (m_muonneg1 >= 0) thirdMuonPt = m_pxMSTrack[m_muonneg1]->pt();
490 if (m_muonneg2 >= 0) fourthMuonPt = m_pxMSTrack[m_muonneg2]->pt();
491 break;
492 }
493 case ME:
494 {
495 if (m_muonpos1 >= 0) leadingMuonPt = m_pxMETrack[m_muonpos1]->pt();
496 if (m_muonpos2 >= 0) secondMuonPt = m_pxMETrack[m_muonpos2]->pt();
497 if (m_muonneg1 >= 0) thirdMuonPt = m_pxMETrack[m_muonneg1]->pt();
498 if (m_muonneg2 >= 0) fourthMuonPt = m_pxMETrack[m_muonneg2]->pt();
499 break;
500 }
501 case CB:
502 {
503 if (m_muonpos1 >= 0) leadingMuonPt = m_pxRecMuon[m_muonpos1]->pt();
504 if (m_muonpos2 >= 0) secondMuonPt = m_pxRecMuon[m_muonpos2]->pt();
505 if (m_muonneg1 >= 0) thirdMuonPt = m_pxRecMuon[m_muonneg1]->pt();
506 if (m_muonneg2 >= 0) fourthMuonPt = m_pxRecMuon[m_muonneg2]->pt();
507 break;
508 }
509 case ID:
510 {
511 if (m_muonpos1 >= 0) leadingMuonPt = m_pxIDTrack[m_muonpos1]->pt();
512 if (m_muonpos2 >= 0) secondMuonPt = m_pxIDTrack[m_muonpos2]->pt();
513 if (m_muonneg1 >= 0) thirdMuonPt = m_pxIDTrack[m_muonneg1]->pt();
514 if (m_muonneg2 >= 0) fourthMuonPt = m_pxIDTrack[m_muonneg2]->pt();
515 break;
516 }
517
518 default:
519 if (m_muonpos1 >= 0) leadingMuonPt = m_pxIDTrack[m_muonpos1]->pt();
520 if (m_muonpos2 >= 0) secondMuonPt = m_pxIDTrack[m_muonpos2]->pt();
521 if (m_muonneg1 >= 0) thirdMuonPt = m_pxIDTrack[m_muonneg1]->pt();
522 if (m_muonneg2 >= 0) fourthMuonPt = m_pxIDTrack[m_muonneg2]->pt();
523 } // end switch
524
525 // up to here the leading and second pt are not really in the right order.
526 // order the muon pt:
527 double theLeadingPt = leadingMuonPt;
528 if (secondMuonPt > theLeadingPt) { theLeadingPt = secondMuonPt;}
529 if (thirdMuonPt > theLeadingPt) { theLeadingPt = thirdMuonPt;}
530 if (fourthMuonPt > theLeadingPt) { theLeadingPt = fourthMuonPt;}
531
532 double theTrailingPt = leadingMuonPt;
533 if (secondMuonPt < theTrailingPt && secondMuonPt > 0) { theTrailingPt = secondMuonPt;}
534 if (thirdMuonPt < theTrailingPt && thirdMuonPt > 0) { theTrailingPt = thirdMuonPt;}
535 if (fourthMuonPt < theTrailingPt && fourthMuonPt > 0) { theTrailingPt = fourthMuonPt;}
536
537 if (m_doDebug || true) {
538 std::cout << " * FourMuonEvent::EventSelection * muon pt selection -- cuts: Leading: " << m_LeadingMuonPtCut*CLHEP::GeV << std::endl
539 << " 2nd: " << m_SecondMuonPtCut*CLHEP::GeV << std::endl;
540 std::cout << " Pt of muons in this event 1: " << leadingMuonPt << std::endl
541 << " 2: " << secondMuonPt << std::endl
542 << " 3: " << thirdMuonPt << std::endl
543 << " 4: " << fourthMuonPt << std::endl
544 << " leading Pt: " << theLeadingPt << std::endl
545 << " trailing Pt: " << theTrailingPt << std::endl;
546 }
547
548 // muon pt cut
549 if ( !(theLeadingPt > m_LeadingMuonPtCut*CLHEP::GeV && theTrailingPt > m_SecondMuonPtCut*CLHEP::GeV ) ) {
550 if(m_doDebug){
551 std::cout <<" * FourMuonEvent::EventSelection * Failing pt cut * Reco Pt: leading " << theLeadingPt << " --> trailing " << theTrailingPt << std::endl;
552 }
553 return false;
554 }
555 if(m_doDebug){
556 std::cout << " * FourMuonEvent::EventSelection * Event passed the pt cuts: leading muon pt: " << leadingMuonPt << std::endl;
557 std::cout << " trailing muon pt: " << theTrailingPt << std::endl;
558 }
559
560 const auto invariantMass = m_fInvariantMass.at(eType);
561 // Invariant mass window
562 if ( invariantMass < m_MassWindowLow ) {
563 if(m_doDebug) {
564 std::cout <<" * FourMuonEvent::EventSelection * Failing mass window low cut: reco m= " << invariantMass << " > " << m_MassWindowLow << std::endl;
565 }
566 return false;
567 }
568 if ( invariantMass > m_MassWindowHigh ) {
569 if(m_doDebug) {
570 std::cout <<" * FourMuonEvent * Failing mass window high cut: reco m= " << invariantMass << " > " << m_MassWindowHigh << std::endl;
571 }
572 return false;
573 }
574 if(m_doDebug){
575 std::cout <<" * FourMuonEvent::EventSelection * Event passed the mass window: " << invariantMass << std::endl;
576 }
577
578 if(m_doDebug) {
579 std::cout << " * FourMuonEvent::EventSelection( type= " << eType << ")* Good 4-muon set: pt range from " << leadingMuonPt/1000
580 << " to " << secondMuonPt/1000
581 << " GeV 4-muon invariant mass = " << m_fInvariantMass.at(eType) << " GeV \n";
582 std::cout << " * FourMuonEvent::EventSelection( type= " << eType << ")* completed * \n";
583 }
584 return true;
585}

◆ EventSelectionNew()

bool FourMuonEvent::EventSelectionNew ( ZTYPE eType)
private

Definition at line 255 of file FourMuonEvent.cxx.

256{
257 bool inputdebug = m_doDebug;
258 //m_doDebug = true;
259
260 bool eventisgood = true;
261 (*m_msgStream) << MSG::DEBUG << " * FourMuonEvent::EventSelection( type= " << eType << ") ** started ** " << std::endl
262 << " event count: " << m_eventCount << std::endl
263 << " m_NumberOfFullPassMuons: " << m_numberOfFullPassMuons << std::endl
264 << " m_NumberOfFullPassElectrons: " << m_numberOfFullPassElectrons
265 << endmsg;
266
267
268 // Depending on mode: require a minimum of electrons or muons
269 if ( eventisgood && m_workAsFourMuons) {
270 if (m_numberOfFullPassMuons < 4) {
271 eventisgood = false;
272 if(m_doDebug) {std::cout <<" * FourMuonEvent::EventSelection(" << eType << ") * Failing number of good muons == 4 :( "
273 <<" m_numberOfFullPassMuons= " << m_numberOfFullPassMuons << std::endl;
274 }
275 }
276 }
277
278 if ( eventisgood && m_workAsFourElectrons) {
280 eventisgood = false;
281 if(m_doDebug) {std::cout <<" * FourMuonEvent::EventSelection(" << eType << ") * Failing number of good electrons == 4 :( "
282 <<" m_numberOfFullPassElectrons= " << m_numberOfFullPassElectrons << std::endl;
283 }
284 }
285 }
286
287 if ( eventisgood && m_workAsFourLeptons) {
288 bool thisselection = false;
289 if (m_numberOfFullPassMuons == 4) thisselection = true;
290 if (m_numberOfFullPassElectrons == 4) thisselection = true;
291 if (m_numberOfFullPassMuons >= 2 && m_numberOfFullPassElectrons >= 2) thisselection = true;
292 if (!thisselection) {
293 if(m_doDebug) {std::cout <<" * FourMuonEvent::EventSelection(" << eType << ") * Failing number of good muons >= 2 && electrons >= 2 :( "
294 <<" m_numberOfFullPassMuons= " << m_numberOfFullPassMuons
295 <<" m_numberOfFullPassElectrons= " << m_numberOfFullPassElectrons << std::endl;
296 }
297 }
298 eventisgood = thisselection;
299 }
300
301 //
302 // momentum of the leptons
303 // loop over the muons and electrons and count how many pass the leadingPt and secondPt cut
304 unsigned int npassleadingpt = 0;
305 unsigned int npasssecondpt = 0;
306 if ( eventisgood && (m_workAsFourMuons || m_workAsFourLeptons) ) {
307 if (m_numberOfFullPassMuons >= 2) { // electrons pt cuts if there are some electrons
308 //for (unsigned int i=0; i < m_numberOfFullPassMuons; i++) {
309 for (unsigned int i=0; i < NUM_MUONS; i++) {
310 if (m_pxIDTrack[i] == nullptr) continue;
311 if(m_doDebug) {std::cout <<" * FourMuonEvent::EventSelection(" << eType << ") * using muon " << i << " with pt: " << m_pxIDTrack[i]->pt() << std::endl;}
312 if (m_pxIDTrack[i]->pt() > m_LeadingMuonPtCut*CLHEP::GeV) npassleadingpt++;
313 if (m_pxIDTrack[i]->pt() > m_SecondMuonPtCut*CLHEP::GeV) npasssecondpt++;
314 }
315 if(m_doDebug) {std::cout <<" * FourMuonEvent::EventSelection(" << eType << ") * #muons with pt > leading pt: " << m_LeadingMuonPtCut*CLHEP::GeV << " = " << npassleadingpt << std::endl;}
316 if(m_doDebug) {std::cout <<" * FourMuonEvent::EventSelection(" << eType << ") * #muons with pt > second pt: " << m_SecondMuonPtCut*CLHEP::GeV << " = " << npasssecondpt << std::endl;}
317 if (npassleadingpt == 0) { // at least 1 muon must pass the leading pt cut
318 eventisgood = false;
319 if(m_doDebug) {std::cout <<" * FourMuonEvent::EventSelection(" << eType << ") * Failing leading muon pt cut " << m_LeadingMuonPtCut*CLHEP::GeV << std::endl;}
320 }
321 if (npasssecondpt < m_numberOfFullPassMuons) { // all muons must pass the second pt cut
322 eventisgood = false;
323 if(m_doDebug) {std::cout <<" * FourMuonEvent::EventSelection(" << eType << ") * Failing second muon pt cut " << m_LeadingMuonPtCut*CLHEP::GeV << std::endl;}
324 }
325 }
326 }
327
328 // four electrons case
329 if ( eventisgood && (m_workAsFourElectrons || m_workAsFourLeptons) ) {
330 npassleadingpt = 0;
331 npasssecondpt = 0;
332 if (m_numberOfFullPassElectrons >= 2) { // electrons pt cuts if there are some electrons
333 for (unsigned int i=0; i < NUM_MUONS; i++) {
334 if (m_pxELTrack[i] == nullptr) continue;
335 if (m_doDebug) {std::cout <<" * FourMuonEvent::EventSelection(" << eType << ") * using electron " << i << " with pt: " << m_pxELTrack[i]->pt() << std::endl;}
336 if (m_pxELTrack[i]->pt() > m_LeadingMuonPtCut*CLHEP::GeV) npassleadingpt++;
337 if (m_pxELTrack[i]->pt() > m_SecondMuonPtCut*CLHEP::GeV) npasssecondpt++;
338 }
339 if(m_doDebug) {std::cout <<" * FourMuonEvent::EventSelection(" << eType << ") * #elecs with pt > leading pt: " << m_LeadingMuonPtCut*CLHEP::GeV << " = " << npassleadingpt << std::endl;}
340 if(m_doDebug) {std::cout <<" * FourMuonEvent::EventSelection(" << eType << ") * #elecs with pt > second pt: " << m_SecondMuonPtCut*CLHEP::GeV << " = " << npasssecondpt << std::endl;}
341 if (npassleadingpt == 0) { // at least 1 electron must pass the leading pt cut
342 eventisgood = false;
343 if(m_doDebug) {std::cout <<" * FourMuonEvent::EventSelection(" << eType << ") * Failing leading electron pt cut " << m_LeadingMuonPtCut*CLHEP::GeV << std::endl;}
344 }
345 if (npasssecondpt < m_numberOfFullPassElectrons) { // all electrons must pass the second pt cut
346 eventisgood = false;
347 if(m_doDebug) {std::cout <<" * FourMuonEvent::EventSelection(" << eType << ") * Failing second electrons pt cut " << m_LeadingMuonPtCut*CLHEP::GeV << std::endl;}
348 }
349 } // electron pt cuts apply if there are some electrons
350 }
351
352 // Invariant mass window
353 if (eventisgood) {
354 if ( m_fInvariantMass[eType] < m_MassWindowLow ) {
355 if(m_doDebug) {
356 std::cout <<" * FourMuonEvent::EventSelection * Failing mass window low cut: reco m= " << m_fInvariantMass[eType] << " > " << m_MassWindowLow << std::endl;
357 }
358 eventisgood = false;
359 }
360 if ( m_fInvariantMass[eType] > m_MassWindowHigh ) {
361 if(m_doDebug) {
362 std::cout <<" * FourMuonEvent::EventSelection * Failing mass window high cut: reco m= " << m_fInvariantMass[eType] << " > " << m_MassWindowHigh << std::endl;
363 }
364 eventisgood = false;
365 }
366 }
367
368 // check on vertices
369 if (eventisgood) {
370 bool vertexstatus = false;
371
372 std::vector <float> vtxListX; // coordinates of the vertex
373 std::vector <float> vtxListY;
374 std::vector <float> vtxListZ;
375 std::vector <int> vtxNpart; // count how many particles are in vertex
376
377 int noVertexCountMuon = 0;
378 int noVertexCountElec = 0;
379 //
380 if ( m_workAsFourMuons ) { // till here we have the muon vertices list
381 m_nVertex = vtxListX.size();
382 // no point setting vertexstatus here, it will be overwritten before use
383 // check that the muons are not split into too many vertices is therefore redundant
384 // no point setting vertexstatus here, it will be overwritten before use
385 // noVertexCountMuon is zero here
386 if (m_doDebug || true) {
387 std::cout << " * FourMuonEvent::EventSelection(" << eType <<") * vertices ID of the muons = " << std::endl
388 << " mu- 1 " << m_muon_vtx[0] << " pt: " << m_pxMUTrack[0]->pt() << std::endl
389 << " mu- 2 " << m_muon_vtx[1] << " pt: " << m_pxMUTrack[1]->pt() << std::endl
390 << " mu+ 1 " << m_muon_vtx[2] << " pt: " << m_pxMUTrack[2]->pt() << std::endl
391 << " mu+ 2 " << m_muon_vtx[3] << " pt: " << m_pxMUTrack[3]->pt()
392 << std::endl;
393 } // end debug
394 } // end m_workAsFourMuons
395
396 if ( m_workAsFourElectrons ) { // till here we have the electrons vertices list
397 m_nVertex = vtxListX.size();
398 if (vtxListX.size()>0) vertexstatus = true;
399 // vertexstatus value is overwritten before use if it is set here
400
401 std::cout << " * FourMuonEvent::EventSelection(" << eType <<") * vertices ID of the electrons = "
402 << "\n el- 1 " << m_elec_vtx[0] << " pt: " << m_pxELTrack[0]->pt() << std::endl
403 << "\n el- 2 " << m_elec_vtx[1] << " pt: " << m_pxELTrack[1]->pt() << std::endl
404 << "\n el+ 1 " << m_elec_vtx[2] << " pt: " << m_pxELTrack[2]->pt() << std::endl
405 << "\n el+ 2 " << m_elec_vtx[3] << " pt: " << m_pxELTrack[3]->pt() <<"\n";
406 }
407
408 if ( m_workAsFourLeptons ) { // till here we have the muons and electrons vertices list
409 m_nVertex = vtxListX.size();
410 if (vtxListX.size()>0) vertexstatus = true;
411 // check that the electrons are not split into too many vertices
412 // if (vtxListX.size() >= m_numberOfFullPassElectrons - 1) vertexstatus = false;
413 // and allow no electron without vertex
414 if (m_doDebug) {
415 std::cout << " * FourMuonEvent::EventSelection(" << eType <<") * vertices in event = " << vtxListX.size() << std::endl;
416 for (size_t imu=0; imu < NUM_MUONS; imu++) {
417 if (m_pxMUTrack[imu]) std::cout << " mu " << m_muon_vtx[imu] << " pt: " << m_pxMUTrack[imu]->pt() << std::endl;
418 }
419 for (size_t iel=0; iel < NUM_MUONS; iel++) {
420 if (m_pxELTrack[iel]) std::cout << " el " << m_elec_vtx[iel] << " pt: " << m_pxELTrack[iel]->pt() << std::endl;
421 }
422 }
423 }
424 //how temporary was this?
425 vertexstatus = true; // Temporary fix to work on R22
426
427 if(m_doDebug) {
428 std::cout <<" * FourMuonEvent::EventSelection(" << eType <<") * Number of vertex found = " << vtxListX.size()
429 << " and mu without vertex: " << noVertexCountMuon
430 << " and elec without vertex: " << noVertexCountElec << std::endl;
431 for (unsigned int ivtx=0; ivtx < vtxListX.size(); ivtx++) {
432 std::cout << " vtx[" << ivtx << "]= "
433 << "( " << vtxListX.at(ivtx)
434 << ", " << vtxListY.at(ivtx)
435 << ", " << vtxListZ.at(ivtx)
436 << ") nparticles: " << vtxNpart.at(ivtx)
437 << std::endl;
438 }
439 }
440
441
442 eventisgood = vertexstatus;
443 }
444
445 //
446 if(m_doDebug){ std::cout <<" * FourMuonEvent::EventSelection(" << eType << ") ** completed ** result= " << eventisgood << std::endl;}
447
448 m_doDebug = inputdebug;
449
450 return eventisgood;
451}

◆ get4MuInvMass()

const float & FourMuonEvent::get4MuInvMass ( ZTYPE eType)
inline

Definition at line 78 of file FourMuonEvent.h.

78{ return m_fInvariantMass[eType]; }

◆ getAcceptedEvents()

int FourMuonEvent::getAcceptedEvents ( )
inline

Definition at line 79 of file FourMuonEvent.h.

79{ return m_acceptedEventCount; }

◆ getCombMuon()

const xAOD::Muon * FourMuonEvent::getCombMuon ( unsigned int uPart)
inline

Definition at line 80 of file FourMuonEvent.h.

80{ return (uPart < NUM_MUONS) ? m_pxRecMuon[uPart] : nullptr; }

◆ getELTrack()

const xAOD::TrackParticle * FourMuonEvent::getELTrack ( unsigned int uPart)
inline

Definition at line 81 of file FourMuonEvent.h.

81{ return (uPart < NUM_MUONS) ? m_pxELTrack[uPart] : nullptr; }

◆ getIDTrack()

const xAOD::TrackParticle * FourMuonEvent::getIDTrack ( unsigned int uPart)
inline

Definition at line 82 of file FourMuonEvent.h.

82{ return (uPart < NUM_MUONS) ? m_pxIDTrack[uPart] : nullptr; }

◆ GetInvMass()

double FourMuonEvent::GetInvMass ( )
inline

Definition at line 83 of file FourMuonEvent.h.

83{ return m_FourMuonInvMass; }

◆ getLeptonOpeningAngle()

const float & FourMuonEvent::getLeptonOpeningAngle ( ZTYPE eType)
inline

Definition at line 86 of file FourMuonEvent.h.

86{ return m_fMuonDispersion[eType]; }

◆ getLooseIDTk()

const xAOD::TrackParticle * FourMuonEvent::getLooseIDTk ( unsigned int uPart)
inline

Definition at line 998 of file FourMuonEvent.cxx.

999{
1000 const xAOD::TrackParticleContainer* pxTrackContainer =
1002
1003 if ( pxTrackContainer )
1004 {
1005 xAOD::TrackParticleContainer::const_iterator xTrkItr = pxTrackContainer->begin();
1006 xAOD::TrackParticleContainer::const_iterator xTrkItrE = pxTrackContainer->end();
1007 while ( xTrkItr != xTrkItrE )
1008 {
1009 const xAOD::TrackParticle* pxTrack = *xTrkItr;
1010 if ( !pxTrack ) continue;
1011 const Trk::Track* pxTrkTrack = pxTrack->track();
1012 if(!pxTrkTrack) continue;
1013 const Trk::Perigee* pxPerigee = pxTrkTrack->perigeeParameters() ;
1014 if ( !pxPerigee ) continue;
1015 const float fTrkPhi = pxPerigee->parameters()[Trk::phi];
1016 const float fTrkEta = pxPerigee->eta();
1017
1018 float fDPhi = fabs( fTrkPhi - m_pxMETrack[m_muon1]->phi() );
1019 float fDEta = fabs( fTrkEta - m_pxMETrack[m_muon2]->eta() );
1020 float fDR = sqrt( fDPhi*fDPhi + fDEta*fDEta );
1021
1022 if ( fDR < 0.3f )
1023 {
1024 return pxTrack;
1025 }
1026
1027 ++xTrkItr;
1028 }
1029 }
1030 // if ()
1031 return nullptr;
1032}
Scalar eta() const
pseudorapidity method
Scalar phi() const
phi method
DataModel_detail::const_iterator< DataVector > const_iterator
Definition DataVector.h:861
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.
static const T * getContainer(CONTAINERS eContainer)
double eta() const
Access method for pseudorapidity - from momentum.
const Perigee * perigeeParameters() const
return Perigee.
const Trk::Track * track() const
Returns a pointer (which can be NULL) to the Trk::Track which was used to make this TrackParticle.
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".

◆ getMSTrack()

const xAOD::TrackParticle * FourMuonEvent::getMSTrack ( unsigned int uPart)
inline

Definition at line 84 of file FourMuonEvent.h.

84{ return (uPart < NUM_MUONS) ? m_pxMSTrack[uPart] : nullptr; }

◆ getNegMuon()

unsigned int FourMuonEvent::getNegMuon ( int eType)

Definition at line 990 of file FourMuonEvent.cxx.

991{
992 unsigned int muid = m_muonneg1;
993 if (eType==2) muid = m_muonneg2;
994 return muid;
995}

◆ getNumberOfTaggedMuons()

unsigned int FourMuonEvent::getNumberOfTaggedMuons ( )
inline

Definition at line 88 of file FourMuonEvent.h.

◆ GetNVertex()

int FourMuonEvent::GetNVertex ( )
inline

Definition at line 89 of file FourMuonEvent.h.

89{ return m_nVertex; }

◆ getPosMuon()

unsigned int FourMuonEvent::getPosMuon ( int eType)

Definition at line 979 of file FourMuonEvent.cxx.

980{
981 //if ( getNumberOfTaggedMuons() != 2 ) return 999;
982 //if ( getZCharge(eType) != 0 ) return 999;
983
984 unsigned int muid = m_muonpos1;
985 if (eType==2) muid = m_muonpos2;
986 return muid;
987}

◆ getPtImbalance()

float FourMuonEvent::getPtImbalance ( ZTYPE eType)

Definition at line 919 of file FourMuonEvent.cxx.

920{
921 // First determine what's positive
922 if ( m_numberOfFullPassMuons == 2 )
923 {
924 switch ( eType )
925 {
926 case MS :
927 {
929 }
930 case ME:
931 {
933 }
934 case CB:
935 {
937 }
938 case ID:
939 {
941 }
942 default:
943 return -999.0;
944 }
945 }
946 else
947 {
948 return -999.0;
949 }
950}
static float EvalPtDiff(const T *pxP1, const T *pxP2)

◆ getRegion()

const std::string FourMuonEvent::getRegion ( ) const

◆ GetVertexElec()

int FourMuonEvent::GetVertexElec ( unsigned int uPart)
inline

Definition at line 93 of file FourMuonEvent.h.

93{ return (uPart < NUM_MUONS) ? m_elec_vtx[uPart] : 0;}

◆ GetVertexElNeg1()

int FourMuonEvent::GetVertexElNeg1 ( )
inline

Definition at line 94 of file FourMuonEvent.h.

94{ return m_elec_vtx[0];}

◆ GetVertexElNeg2()

int FourMuonEvent::GetVertexElNeg2 ( )
inline

Definition at line 95 of file FourMuonEvent.h.

95{ return m_elec_vtx[1];}

◆ GetVertexElPos1()

int FourMuonEvent::GetVertexElPos1 ( )
inline

Definition at line 96 of file FourMuonEvent.h.

96{ return m_elec_vtx[2];}

◆ GetVertexElPos2()

int FourMuonEvent::GetVertexElPos2 ( )
inline

Definition at line 97 of file FourMuonEvent.h.

97{ return m_elec_vtx[3];}

◆ GetVertexMuNeg1()

int FourMuonEvent::GetVertexMuNeg1 ( )
inline

Definition at line 98 of file FourMuonEvent.h.

98{ return m_muon_vtx[0];}

◆ GetVertexMuNeg2()

int FourMuonEvent::GetVertexMuNeg2 ( )
inline

Definition at line 99 of file FourMuonEvent.h.

99{ return m_muon_vtx[1];}

◆ GetVertexMuPos1()

int FourMuonEvent::GetVertexMuPos1 ( )
inline

Definition at line 100 of file FourMuonEvent.h.

100{ return m_muon_vtx[2];}

◆ GetVertexMuPos2()

int FourMuonEvent::GetVertexMuPos2 ( )
inline

Definition at line 101 of file FourMuonEvent.h.

101{ return m_muon_vtx[3];}

◆ getZCharge()

int FourMuonEvent::getZCharge ( ZTYPE eType)

Definition at line 953 of file FourMuonEvent.cxx.

954{
955 switch ( eType )
956 {
957 case MS :
958 {
959 return ( static_cast<int>( EvalCharge( m_pxMSTrack[m_muon1], m_pxMSTrack[m_muon2] ) ) );
960 }
961 case ME:
962 {
963 return ( static_cast<int>( EvalCharge( m_pxMETrack[m_muon1], m_pxMETrack[m_muon2] ) ) );
964 }
965 case CB:
966 {
967 return ( static_cast<int>( EvalCharge( m_pxRecMuon[m_muon1], m_pxRecMuon[m_muon2] ) ) );
968 }
969 case ID:
970 {
971 return ( static_cast<int>( EvalCharge( m_pxIDTrack[m_muon1], m_pxIDTrack[m_muon2] ) ) );
972 }
973 default:
974 return -999;
975 }
976}
static float EvalCharge(const T *pxP1, const T *pxP2)

◆ getZEta()

const float & FourMuonEvent::getZEta ( ZTYPE eType)
inline

Definition at line 103 of file FourMuonEvent.h.

103{ return m_fZEtaDir[eType]; }

◆ getZMass()

const float & FourMuonEvent::getZMass ( ZTYPE eType)
inline

Definition at line 104 of file FourMuonEvent.h.

104{ return m_fInvariantMass[eType];}

◆ getZPhi()

const float & FourMuonEvent::getZPhi ( ZTYPE eType)
inline

Definition at line 105 of file FourMuonEvent.h.

105{ return m_fZPhiDir[eType]; }

◆ getZPt()

const float & FourMuonEvent::getZPt ( ZTYPE eType)
inline

Definition at line 106 of file FourMuonEvent.h.

106{ return m_fZPt[eType]; }

◆ Init()

void FourMuonEvent::Init ( )
virtual

Reimplemented from EventAnalysis.

Definition at line 58 of file FourMuonEvent.cxx.

59{
60 (*m_msgStream) << MSG::DEBUG << " * FourMuonEvent::Init * START *" << endmsg;
61
62 (*m_msgStream) << MSG::DEBUG << " * FourMuonEvent::Init * initializing muon selector *" << endmsg;
63 m_xMuonID.Init();
64 (*m_msgStream) << MSG::DEBUG << " * FourMuonEvent::Init * initializing electron selector *" << endmsg;
65 m_xElecID.Init();
66
67 if (m_workAsFourMuons) {(*m_msgStream) << MSG::INFO << " * FourMuonEvent::Init * working mode: 4 muons" << endmsg; }
68 if (m_workAsFourElectrons) {(*m_msgStream) << MSG::INFO << " * FourMuonEvent::Init * working mode: 4 electrons" << endmsg; }
69 if (m_workAsFourLeptons) {(*m_msgStream) << MSG::INFO << " * FourMuonEvent::Init * working mode: 4 leptons" << endmsg; }
70
72 (*m_msgStream) << MSG::DEBUG << " * FourMuonEvent::Init * Completed * " << endmsg;
73
74 return;
75}
virtual void Init()
ElectronSelector m_xElecID

◆ operator=()

FourMuonEvent & FourMuonEvent::operator= ( const FourMuonEvent & )
delete

◆ OrderMuonList()

void FourMuonEvent::OrderMuonList ( )

Definition at line 1078 of file FourMuonEvent.cxx.

1079{
1080 // Salva: 20/January/2020 RecMuon -> IDTrack
1081 constexpr bool thisdebug = false;
1082
1083 if (m_doDebug || thisdebug) {std::cout << " * FourMuonEvent::OrderMuonList * -- start -- " << std::endl
1084 << " #muons: " << m_numberOfFullPassMuons<< std::endl;}
1085
1086 int muPlus1Id = -9;
1087 int muPlus2Id = -9;
1088 int muMinus1Id = -9;
1089 int muMinus2Id = -9;
1090 double muPlus1Pt = 0.;
1091 double muPlus2Pt = 0.;
1092 double muMinus1Pt = 0.;
1093 double muMinus2Pt = 0.;
1094
1095 int muposcount = 0;
1096 int munegcount = 0;
1097
1098 int nMuonsAtEntry = m_numberOfFullPassMuons;
1099 m_numberOfFullPassMuons = 0; // reset the number of full pass muons
1100
1101 if (nMuonsAtEntry >= 2) { // we need at least 2 muons
1102 for (int imuon=0; imuon < (int) nMuonsAtEntry; imuon++) {
1103 if(m_doDebug && false ){ std::cout << " * FourMuonEvent::OrderMuonList * testing imuon= " << imuon
1104 << " with charge= " << m_pxRecMuon[imuon]->charge()
1105 << " and pt= " << m_pxRecMuon[imuon]->pt()
1106 << std::endl;
1107 }
1108 if (m_pxIDTrack[imuon] != nullptr) {
1109
1110 if (m_pxIDTrack[imuon]->charge()==1) { // positive muon
1111 muposcount++;
1112 if (m_pxIDTrack[imuon]->pt()> muPlus1Pt) {
1113 // store 1st in 2nd
1114 muPlus2Pt = muPlus1Pt;
1115 muPlus2Id = muPlus1Id;
1116 // now store the new one in 1st place
1117 muPlus1Pt = m_pxIDTrack[imuon]->pt();
1118 muPlus1Id = imuon;
1119 }
1120 else if (m_pxIDTrack[imuon]->pt()> muPlus2Pt) {
1121 // store the new one in 2nd place
1122 muPlus2Pt = m_pxIDTrack[imuon]->pt();
1123 muPlus2Id = imuon;
1124 }
1125 }
1126 // Negative muons
1127 if (m_pxIDTrack[imuon]->charge()==-1) {
1128 munegcount++;
1129 if(m_pxIDTrack[imuon]->pt()> muMinus1Pt) {
1130 // store 1st in 2nd
1131 muMinus2Pt = muMinus1Pt;
1132 muMinus2Id = muMinus1Id;
1133 muMinus1Pt = m_pxIDTrack[imuon]->pt();
1134 muMinus1Id = imuon;
1135 }
1136 else if(m_pxRecMuon[imuon]->pt()> muMinus2Pt) {
1137 muMinus2Pt = m_pxIDTrack[imuon]->pt();
1138 muMinus2Id = imuon;
1139 }
1140 }
1141 } // muon exist
1142 } // for (int imuon)
1143 } // if (nMuonsAtEntry >= 2)
1144
1145 // require at least one opposite charge muon pair
1146 if (nMuonsAtEntry >= 2 && (muposcount == 0 || munegcount == 0)) {
1147 if (m_doDebug) std::cout << " -- FourMuonEvent::OrderMuonList -- No opposite charge muons in the " << nMuonsAtEntry << " input muons"
1148 << " #mu+ " << muposcount
1149 << " #mu- " << munegcount
1150 << " --> DISCARD ALL MUONS -- \n";
1151 muPlus1Id = -9;
1152 muPlus2Id = -9;
1153 muMinus1Id = -9;
1154 muMinus2Id = -9;
1155 }
1156
1157
1158 if (muPlus1Id>=0) {m_muonpos1 = muPlus1Id; m_numberOfFullPassMuons++;}
1159 if (muPlus2Id>=0) {m_muonpos2 = muPlus2Id; m_numberOfFullPassMuons++;}
1160 if (muMinus1Id>=0) {m_muonneg1 = muMinus1Id; m_numberOfFullPassMuons++;}
1161 if (muMinus2Id>=0) {m_muonneg2 = muMinus2Id; m_numberOfFullPassMuons++;}
1162
1163 m_muon1 = m_muonpos1; // to be deleted when no more m_muon is left
1164 m_muon2 = m_muonneg1; // to be deleted when no more m_muon is left
1165
1166 if ((m_doDebug || thisdebug) && m_numberOfFullPassMuons >= 2){
1167 std::cout << " * FourMuonEvent::OrderMuonList * taking " << m_numberOfFullPassMuons << " muons from the input list of " << nMuonsAtEntry << " muons: " << std::endl;
1168 if (muMinus1Id >= 0) std::cout << " leading mu-: " << muMinus1Id << " Pt = " << muMinus1Pt << std::endl;
1169 if (muMinus2Id >= 0) std::cout << " second mu-: " << muMinus2Id << " Pt = " << muMinus2Pt << std::endl;
1170 if (muPlus1Id >= 0) std::cout << " leading mu+: " << muPlus1Id << " Pt = " << muPlus1Pt << std::endl;
1171 if (muPlus2Id >= 0) std::cout << " second mu+: " << muPlus2Id << " Pt = " << muPlus2Pt << std::endl;
1172 }
1173 else {
1174 if (m_doDebug) std::cout << " * FourMuonEvent::OrderMuonList * This event has less than 2 muons :(" << std::endl;
1175 }
1176
1177 if (m_doDebug || thisdebug) std::cout << " * FourMuonEvent::OrderMuonList * completed * m_numberOfFullPassMuons= " << m_numberOfFullPassMuons << std::endl;
1178 return;
1179}
double charge(const T &p)
Definition AtlasPID.h:1003

◆ Reco()

bool FourMuonEvent::Reco ( )

Definition at line 78 of file FourMuonEvent.cxx.

79{
81 (*m_msgStream) << MSG::DEBUG << " * FourMuonEvent::Reco * STARTING ** New event ** eventCount " << m_eventCount << endmsg;
82
83 // Clear out the previous events record.
84 this->Clear();
85
86 // if muons are requested
88 (*m_msgStream) << MSG::DEBUG << " * FourMuonEvent::Reco * retrieving xAOD::MuonContainer " << m_container << " of eventCount " << m_eventCount << std::endl;
89
91
92 // check if muon container does exist
93 if (pxMuonContainer != nullptr) {
94 (*m_msgStream) << MSG::DEBUG << " * FourMuonEvent::Reco * eventCount " << m_eventCount
95 << " track list has "<< pxMuonContainer->size()
96 << " combined muons in container " << m_container
97 << " container name: " << PerfMonServices::getContainerName ( m_container )
98 << endmsg;
99
100 xAOD::MuonContainer::const_iterator xMuonItr = pxMuonContainer->begin();
101 xAOD::MuonContainer::const_iterator xMuonItrE = pxMuonContainer->end();
102 int theCount = 0;
103 while ( xMuonItr != xMuonItrE ){ // start loop on muons
104 const xAOD::Muon* pxCMuon = *xMuonItr;
105 theCount++;
106 // Apply muon cuts
107 if ( m_xMuonID.passSelection( pxCMuon)) {
108 RecordMuon( pxCMuon );
109 (*m_msgStream) << MSG::DEBUG << " * FourMuonEvent::Reco ** muon " << theCount << " is accepted " << endmsg;
110 }
111 ++xMuonItr;
112 } // end loop on muons
113
114 // ordering of muons
115 this->OrderMuonList();
116 } // end muon container exists
117 if (!pxMuonContainer) {
118 std::cout << " * FourMuonEvent::Reco * Can't retrieve combined muon collection (container: " << m_container <<") " << std::endl;
119 return false;
120 } // end muon container does not exist
121 } // end requesting muons
122
123 //
124 // Electron selection (in case electrons are requested)
126 // Get the electron AOD container
127 const xAOD::ElectronContainer* pxElecContainer = nullptr;
128 if (m_doDebug){ std::cout << " * FourMuonEvent::Reco * retrieving xAOD::ElectronContainer " << PerfMonServices::ELECTRON_COLLECTION << std::endl; }
130
131 //pxElecContainer = evtStore()->retrieve( pxElecContainer, "Electrons" );
132
133 if (pxElecContainer != nullptr) {
134 (*m_msgStream) << MSG::DEBUG << " * FourMuonEvent::Reco * retrieving xAOD::ElectronContainer SUCCESS. "
136 << " size: " << pxElecContainer->size()
137 << endmsg;
138 if (pxElecContainer->size() > 0 ){
139 m_xElecID.PrepareElectronList (pxElecContainer);
140 m_numberOfFullPassElectrons = m_xElecID.GetElectronCollectionSize();
142 }
143 }
144 else { // no pxElecContainer
145 (*m_msgStream) << MSG::DEBUG << " * FourMuonEvent::Reco * retrieving xAOD::ElectronContainer -- FAILED -- eventcount: " << m_eventCount << endmsg;
146 }
147 }
148
150 // reached this point one has the list of muons and electrons in this event
152
153 // now check if the particles in the event make them to satisfy the event selection
154 if (m_workAsFourMuons) {
155 m_passedFourMuonSelection = false; // unless the event has 4 muons, assume it is not good
156
157 if (m_numberOfFullPassMuons == 4) {
161
163 m_FourMuonInvMass = m_fInvariantMass[ID]; // store invariant mass
164 if (m_doDebug) std::cout << " * FourMuonEvent::Reco * === Event " << m_eventCount << " is a GOOD 4-muon event " << std::endl;
165 }
166 else {
167 if (m_doDebug) std::cout << " * FourMuonEvent::Reco * === Event " << m_eventCount << " FAILS the 4-muon event selection " << std::endl;
168 }
169 }
170 } // end of workAsFourMuons
171
173 if (m_doDebug) std::cout << " * FourMuonEvent::Reco * applying 4 electron selection " << std::endl;
174 m_passedFourElectronSelection = false; // unless the event has 4 muons, assume it is not good
175
179
181 m_FourMuonInvMass = m_fInvariantMass[ID]; // store invariant mass
182 if (m_doDebug) std::cout << " * FourMuonEvent::Reco * === Event " << m_eventCount << " is a GOOD 4-electrom event " << std::endl;
183 }
184 else {
185 if (m_doDebug) std::cout << " * FourMuonEvent::Reco * === Event " << m_eventCount << " FAILS the 4-electron event selection " << std::endl;
186 }
187 }
188 else {
189 if (m_doDebug) std::cout << " * FourMuonEvent::Reco * === Event " << m_eventCount << " is not a 4-electron event " << std::endl;
190 }
191 } // end of workAsFourElectrons
192
193
195 if (m_doDebug) std::cout << " * FourMuonEvent::Reco * applying 4 lepton selection " << std::endl;
197
198 bool enoughleptons = false;
199 if (m_numberOfFullPassMuons == 4) enoughleptons = true;
200 if (m_numberOfFullPassElectrons == 4) enoughleptons = true;
201 if (m_numberOfFullPassMuons >= 2 && m_numberOfFullPassElectrons >= 2) enoughleptons = true;
202
203 if ( enoughleptons) {
204 if (m_doDebug) {
205 std::cout << " * FourMuonEvent::Reco * Global statistics: Total number of accepted muons so far: " << m_acceptedMuonCount
206 << " & electrons: " << m_acceptedElecCount << " integrated over all events "
207 << std::endl;
208 std::cout << " * FourMuonEvent::Reco * This event has " << m_numberOfFullPassMuons
209 << " muons & " << m_numberOfFullPassElectrons << " electrons --> try kinematics, vertex and event selection"
210 << std::endl;
211 }
215
217 m_FourMuonInvMass = m_fInvariantMass[ID]; // store invariant mass
218 (*m_msgStream) << MSG::INFO << " * FourMuonEvent::Reco * === Event " << m_eventCount << " is a GOOD 4-lepton event with inv mass: " << m_FourMuonInvMass << endmsg;
219 }
220 else {
221 (*m_msgStream) << MSG::DEBUG << " * FourMuonEvent::Reco * === Event " << m_eventCount << " -- FAILS -- the 4-lepton event selection " << endmsg;
222 }
223 }
224 else {
225 (*m_msgStream) << MSG::DEBUG << " * FourMuonEvent::Reco * 4lepton selection FAILURE. Not enough muons or electrons. Event has " << m_numberOfFullPassMuons
226 << " muons & " << m_numberOfFullPassElectrons << " electrons"
227 << endmsg;
228 }
229 }
230
231 m_passedSelectionCuts = false; // assume event is not good, but check the selection according to the use case
235
237
238 (*m_msgStream) << MSG::DEBUG << " * FourMuonEvent::Reco * COMPLETED * Event has " << m_numberOfFullPassMuons << " muons & "
239 << m_numberOfFullPassElectrons << " electrons. "
240 << " So far: " << m_acceptedEventCount << " events were accepted out of " << m_eventCount << " tested" << endmsg;
241
243}
size_type size() const noexcept
Returns the number of elements in the collection.
bool ReconstructKinematicsNew()
void RecordMuon(const xAOD::Muon *pxMuon)
bool EventSelectionNew(ZTYPE eType)
static const std::string & getContainerName(CONTAINERS eContainer)
ElectronContainer_v1 ElectronContainer
Definition of the current "electron container version".
Muon_v1 Muon
Reference the current persistent version:
MuonContainer_v1 MuonContainer
Definition of the current "Muon container version".

◆ ReconstructKinematics()

bool FourMuonEvent::ReconstructKinematics ( )
private

Definition at line 688 of file FourMuonEvent.cxx.

689{
690 if(m_doDebug){ std::cout << " * FourMuonEvent * ReconstructKinematics * -- start -- " << std::endl; }
691 bool kinematicscomputed = false;
692
693 // Three ways. No checks here. Thus make sure the pointers are ok before this.
694 if ( m_numberOfFullPassMuons == 4 ) {
695 // crosscheck identifiers are good:
696 bool goodidentifiers = true;
697 if (m_muonneg1 < 0) goodidentifiers = false;
698 if (m_muonneg2 < 0) goodidentifiers = false;
699 if (m_muonpos1 < 0) goodidentifiers = false;
700 if (m_muonpos2 < 0) goodidentifiers = false;
701
702 if (goodidentifiers) {
703 // before computing the kinematic parameters check track particles are ok
704 bool goodtracks = true;
705 if (m_pxIDTrack[m_muonneg1] == nullptr) goodtracks = false;
706 if (m_pxIDTrack[m_muonneg2] == nullptr) goodtracks = false;
707 if (m_pxIDTrack[m_muonpos1] == nullptr) goodtracks = false;
708 if (m_pxIDTrack[m_muonpos2] == nullptr) goodtracks = false;
709
714
715 if (goodtracks) { // Everything is ready
717 m_fMuonDispersion[ID] = EvaluateAngle( m_pxMUTrack[0], m_pxMUTrack[2]); // leading mu- and leading mu+
718 m_fZPt[ID] = EvalPt( m_pxMUTrack[0], m_pxMUTrack[2]); // leading mu- and leading mu+
719 m_fZEtaDir[ID] = EvalEta( m_pxMUTrack[0], m_pxMUTrack[2]); // leading mu- and leading mu+
720 m_fZPhiDir[ID] = EvalPhi( m_pxMUTrack[0], m_pxMUTrack[2]); // leading mu- and leading mu+
721
722 kinematicscomputed = true;
723
724 if(m_doDebug){
725 std::cout << " * FourMuonEvent * ReconstructKinematics4Elec * -- Muon ID Tracks -- new -- " << std::endl
726 << " Pt(mu1-)= " << m_pxMUTrack[0]->pt() << std::endl
727 << " Pt(mu2-)= " << m_pxMUTrack[1]->pt() << std::endl
728 << " Pt(mu1+)= " << m_pxMUTrack[2]->pt() << std::endl
729 << " Pt(mu2+)= " << m_pxMUTrack[3]->pt() << std::endl
730 << " invariant mass (4mu) = " << m_fInvariantMass[ID] << std::endl
731 << std::endl;
732 }
733
734 } // good tracks
735 } // goodidentifiers
736 } // goodmuons == 4
737
738 if (!kinematicscomputed) {
739 if(m_doDebug){ std::cout <<" * FourMuonEvent * ReconstructKinematics * -- FAILED -- " << std::endl; }
740 }
741
742 if(m_doDebug){ std::cout <<" * FourMuonEvent * ReconstructKinematics * -- completed -- status: " << kinematicscomputed << std::endl; }
743 return kinematicscomputed;
744}
static float EvaluateAngle(const T *pxP1, const T *pxP2)
static float EvalPhi(const T *pxP1, const T *pxP2)
static float EvalPt(const T *pxP1, const T *pxP2)
static float EvalFourMuInvMass(const T *pxP1, const T *pxP2, const T *pxP3, const T *pxP4)
static float EvalEta(const T *pxP1, const T *pxP2)

◆ ReconstructKinematics4Elec()

bool FourMuonEvent::ReconstructKinematics4Elec ( )
private

Definition at line 747 of file FourMuonEvent.cxx.

748{
749 if(m_doDebug){ std::cout << " * FourMuonEvent * ReconstructKinematics4Elec * -- start -- " << std::endl; }
750 bool kinematicscomputed = false;
751
752 // Three ways. No checks here. Thus make sure the pointers are ok before this.
753 if ( m_numberOfFullPassElectrons == 4 ) {
754 // before computing the kinematic parameters check track particles are ok
755 bool goodtracks = true;
756 m_pxELTrack[0] = m_xElecID.GetElecNegTrackParticle(0);
757 m_pxELTrack[1] = m_xElecID.GetElecNegTrackParticle(1);
758 m_pxELTrack[2] = m_xElecID.GetElecPosTrackParticle(0);
759 m_pxELTrack[3] = m_xElecID.GetElecPosTrackParticle(1);
760 if (m_pxELTrack[0] == nullptr) goodtracks = false;
761 if (m_pxELTrack[1] == nullptr) goodtracks = false;
762 if (m_pxELTrack[2] == nullptr) goodtracks = false;
763 if (m_pxELTrack[3] == nullptr) goodtracks = false;
764
765 if (goodtracks) { // Everything is ready
766 // For the time being analysis is performed only with ID tracks
768 m_fMuonDispersion[ID] = EvaluateAngle( m_pxELTrack[0], m_pxELTrack[2]); // leading e- and leading e+
769 m_fZPt[ID] = EvalPt( m_pxELTrack[0], m_pxELTrack[2]); // leading e- and leading e+
770 m_fZEtaDir[ID] = EvalEta( m_pxELTrack[0], m_pxELTrack[2]); // leading e- and leading e+
771 m_fZPhiDir[ID] = EvalPhi( m_pxELTrack[0], m_pxELTrack[2]); // leading e- and leading e+
772 kinematicscomputed = true;
773
774 if(m_doDebug){
775 std::cout << " * FourMuonEvent * ReconstructKinematics4Elec * -- Electron Tracks -- " << std::endl
776 << " Pt(e1-)= " << m_pxELTrack[0]->pt() << std::endl
777 << " Pt(e2-)= " << m_pxELTrack[1]->pt() << std::endl
778 << " Pt(e1+)= " << m_pxELTrack[2]->pt() << std::endl
779 << " Pt(e2+)= " << m_pxELTrack[3]->pt() << std::endl
780 << " invariant mass (4e) = " << m_fInvariantMass[ID] << std::endl
781 << std::endl;
782 }
783 } // good tracks
784 } // goodidentifiers
785
786 if (!kinematicscomputed) {
787 if(m_doDebug){ std::cout <<" * FourMuonEvent * ReconstructKinematics4Elec * -- FAILED -- " << std::endl; }
788 }
789
790 if(m_doDebug){ std::cout <<" * FourMuonEvent * ReconstructKinematics4Elec * -- completed -- status: " << kinematicscomputed << std::endl; }
791 return kinematicscomputed;
792}

◆ ReconstructKinematicsNew()

bool FourMuonEvent::ReconstructKinematicsNew ( )
private

Definition at line 795 of file FourMuonEvent.cxx.

796{
797 (*m_msgStream) << MSG::DEBUG << " * FourMuonEvent * ReconstructKinematicsNew * -- START -- " << endmsg;
798
799 bool kinematicscomputed = false;
800
801 // first step get the list of TrackParticles for muons and electrons
802 // -- muons (a bit more complex than for electrons)
807 // add an extra proteccion
808 if (m_numberOfFullPassMuons < 2) {
809 for (int i=0; i<4; i++) m_pxMUTrack[i] = nullptr;
810 }
811
812 // -- electrons
813 m_pxELTrack[0] = m_xElecID.GetElecNegTrackParticle(0);
814 m_pxELTrack[1] = m_xElecID.GetElecNegTrackParticle(1);
815 m_pxELTrack[2] = m_xElecID.GetElecPosTrackParticle(0);
816 m_pxELTrack[3] = m_xElecID.GetElecPosTrackParticle(1);
817 // add an extra proteccion
819 for (int i=0; i<4; i++) m_pxELTrack[i] = nullptr;
820 }
821
822 if ( m_numberOfFullPassMuons == 4 ) {
823 bool goodtracks = true;
824 if (m_pxMUTrack[0] == nullptr) goodtracks = false;
825 if (m_pxMUTrack[1] == nullptr) goodtracks = false;
826 if (m_pxMUTrack[2] == nullptr) goodtracks = false;
827 if (m_pxMUTrack[3] == nullptr) goodtracks = false;
828
829 if (goodtracks) { // Everything is ready
831 m_fMuonDispersion[ID] = EvaluateAngle ( m_pxMUTrack[0], m_pxMUTrack[2]); // leading mu- and leading mu+
832 m_fZPt[ID] = EvalPt ( m_pxMUTrack[0], m_pxMUTrack[2]); // leading mu- and leading mu+
833 m_fZEtaDir[ID] = EvalEta ( m_pxMUTrack[0], m_pxMUTrack[2]); // leading mu- and leading mu+
834 m_fZPhiDir[ID] = EvalPhi ( m_pxMUTrack[0], m_pxMUTrack[2]); // leading mu- and leading mu+
835 kinematicscomputed = true;
836 }
837 }
838
839 if(m_doDebug){
840 std::cout << " * FourMuonEvent * ReconstructKinematicsNew * -- Muon ID Tracks -- new -- " << std::endl;
841 if (m_pxMUTrack[0] != nullptr) std::cout << " Pt(mu1-)= " << m_pxMUTrack[0]->pt() << std::endl;
842 if (m_pxMUTrack[1] != nullptr) std::cout << " Pt(mu2-)= " << m_pxMUTrack[1]->pt() << std::endl;
843 if (m_pxMUTrack[2] != nullptr) std::cout << " Pt(mu1+)= " << m_pxMUTrack[2]->pt() << std::endl;
844 if (m_pxMUTrack[3] != nullptr) std::cout << " Pt(mu2+)= " << m_pxMUTrack[3]->pt() << std::endl;
845 if (kinematicscomputed) std::cout << " invariant mass (4mu) = " << m_fInvariantMass[ID] << std::endl;
846 }
847
848 double invmass_test = -1.; // default value
849 if ( m_numberOfFullPassElectrons == 4) {
850 // before computing the kinematic parameters check track particles are ok
851 bool goodtracks = true;
852 if (m_pxELTrack[0] == nullptr) goodtracks = false;
853 if (m_pxELTrack[1] == nullptr) goodtracks = false;
854 if (m_pxELTrack[2] == nullptr) goodtracks = false;
855 if (m_pxELTrack[3] == nullptr) goodtracks = false;
856
857 if (goodtracks && !kinematicscomputed) { // Everything is ready
858 // For the time being analysis is performed only with ID tracks
860 invmass_test = m_fInvariantMass[ID];
861 m_fMuonDispersion[ID] = EvaluateAngle( m_pxELTrack[0], m_pxELTrack[2]); // leading e- and leading e+
862 m_fZPt[ID] = EvalPt( m_pxELTrack[0], m_pxELTrack[2]); // leading e- and leading e+
863 m_fZEtaDir[ID] = EvalEta( m_pxELTrack[0], m_pxELTrack[2]); // leading e- and leading e+
864 m_fZPhiDir[ID] = EvalPhi( m_pxELTrack[0], m_pxELTrack[2]); // leading e- and leading e+
865 kinematicscomputed = true;
866 } // good tracks
867 }
868 if(m_doDebug){
869 std::cout << " * FourMuonEvent * ReconstructKinematicsNew * -- Electron Tracks -- " << std::endl;
870 if (m_pxELTrack[0] != nullptr) std::cout << " Pt(e1-)= " << m_pxELTrack[0]->pt() << std::endl;
871 if (m_pxELTrack[1] != nullptr) std::cout << " Pt(e2-)= " << m_pxELTrack[1]->pt() << std::endl;
872 if (m_pxELTrack[2] != nullptr) std::cout << " Pt(e1+)= " << m_pxELTrack[2]->pt() << std::endl;
873 if (m_pxELTrack[3] != nullptr) std::cout << " Pt(e2+)= " << m_pxELTrack[3]->pt() << std::endl;
874 std::cout << " invariant mass (4e) = " << invmass_test << std::endl;
875 }
876
877 if ( m_numberOfFullPassMuons >= 2 && m_numberOfFullPassElectrons >= 2 && !kinematicscomputed) {
878 // before computing the kinematic parameters check track particles are ok
879 bool goodtracks = true;
880 if (m_pxMUTrack[0] == nullptr) goodtracks = false; // leading mu-
881 if (m_pxMUTrack[2] == nullptr) goodtracks = false; // leading mu+
882 if (m_pxELTrack[0] == nullptr) goodtracks = false; // leading e-
883 if (m_pxELTrack[2] == nullptr) goodtracks = false; // leading e+
884
885 if (goodtracks && !kinematicscomputed) { // Everything is ready
886 // For the time being analysis is performed only with ID tracks
888 invmass_test = m_fInvariantMass[ID];
889 m_fMuonDispersion[ID] = EvaluateAngle ( m_pxMUTrack[0], m_pxELTrack[0]); // leading mu- and leading e-
890 m_fZPt[ID] = EvalPt ( m_pxMUTrack[0], m_pxELTrack[0]); // leading mu- and leading e-
891 m_fZEtaDir[ID] = EvalEta ( m_pxMUTrack[0], m_pxELTrack[0]); // leading mu- and leading e-
892 m_fZPhiDir[ID] = EvalPhi ( m_pxMUTrack[0], m_pxELTrack[0]); // leading mu- and leading e-
893 kinematicscomputed = true;
894 } // good tracks
895 }
896 if(m_doDebug){
897 std::cout << " * FourMuonEvent * ReconstructKinematicsNew * -- Muon and Electron Tracks -- " << std::endl;
898 if (m_pxMUTrack[0] != nullptr) std::cout << " Pt(mu1-)= " << m_pxMUTrack[0]->pt() << std::endl;
899 if (m_pxMUTrack[1] != nullptr) std::cout << " Pt(mu2-)= " << m_pxMUTrack[1]->pt() << std::endl;
900 if (m_pxMUTrack[2] != nullptr) std::cout << " Pt(mu1+)= " << m_pxMUTrack[2]->pt() << std::endl;
901 if (m_pxMUTrack[3] != nullptr) std::cout << " Pt(mu2+)= " << m_pxMUTrack[3]->pt() << std::endl;
902 if (m_pxELTrack[0] != nullptr) std::cout << " Pt(e1-)= " << m_pxELTrack[0]->pt() << std::endl;
903 if (m_pxELTrack[1] != nullptr) std::cout << " Pt(e2-)= " << m_pxELTrack[1]->pt() << std::endl;
904 if (m_pxELTrack[2] != nullptr) std::cout << " Pt(e1+)= " << m_pxELTrack[2]->pt() << std::endl;
905 if (m_pxELTrack[3] != nullptr) std::cout << " Pt(e2+)= " << m_pxELTrack[3]->pt() << std::endl;
906 std::cout << " invariant mass used = " << m_fInvariantMass[ID] << std::endl;
907 std::cout << " invariant mass test = " << invmass_test << std::endl;
908 }
909
910 if (!kinematicscomputed) {
911 if(m_doDebug){ std::cout <<" * FourMuonEvent * ReconstructKinematicsNew * -- FAILED -- " << std::endl; }
912 }
913
914 (*m_msgStream) << MSG::DEBUG << " * FourMuonEvent * ReconstructKinematicsNew * -- COMPLETED -- status " << kinematicscomputed << endmsg;
915 return kinematicscomputed;
916}

◆ RecordMuon()

void FourMuonEvent::RecordMuon ( const xAOD::Muon * pxMuon)
private

Definition at line 636 of file FourMuonEvent.cxx.

637{
638 constexpr bool thisdebug = false;
639 // This shouldn't really ever happen but just in case.
640 if ( !pxMuon ) {
641 if(m_doDebug){ std::cout <<" * FourMuonEvent * RecordMuon * bad pxMuon --> EXIT "<< std::endl;}
642 return;
643 }
644
646 // The main Muon
648 if (thisdebug) {
649 std::cout <<" * FourMuonEvent * RecordMuon * m_pxRecMuon for this muon--> pt "<< m_pxRecMuon[m_numberOfFullPassMuons]->pt() << std::endl;
650 std::cout <<" d0 "<< m_pxRecMuon[m_numberOfFullPassMuons]->trackParticle(xAOD::Muon::TrackParticleType::Primary)->d0() << std::endl;
651 std::cout <<" sigma_d0 "<< m_pxRecMuon[m_numberOfFullPassMuons]->trackParticle(xAOD::Muon::TrackParticleType::Primary)->definingParametersCovMatrixVec()[0] << std::endl;
652 }
653
654 const xAOD::TrackParticle* pxMSTrack = pxMuon->trackParticle(xAOD::Muon::TrackParticleType::MuonSpectrometerTrackParticle);
655 if (!pxMSTrack) {
656 if (m_doDebug){ std::cout <<" * FourMuonEvent * RecordMuon * bad pxMSmuon --> EXIT "<< std::endl;}
657 return;
658 }
660 if (thisdebug) {
661 std::cout <<" * FourMuonEvent * RecordMuon * m_pxMSTrack for this muon--> pt "<< m_pxMSTrack[m_numberOfFullPassMuons]->pt() << std::endl;
662 std::cout <<" d0 "<< m_pxMSTrack[m_numberOfFullPassMuons]->d0() << std::endl;
663 std::cout <<" sigma_d0 "<< m_pxMSTrack[m_numberOfFullPassMuons]->definingParametersCovMatrixVec()[0] << std::endl;
664 }
665
666 // ID muon
667 const xAOD::TrackParticle* pxIDTrack = pxMuon->trackParticle(xAOD::Muon::TrackParticleType::InnerDetectorTrackParticle);
668 if (!pxIDTrack) {
669 if (m_doDebug){ std::cout <<" * FourMuonEvent * RecordMuon * bad pxIDTrack for this muon--> EXIT "<< std::endl;}
670 return;
671 }
673 if (thisdebug) {
674 std::cout <<" * FourMuonEvent * RecordMuon * m_pxIDTrack for this muon--> pt "<< m_pxIDTrack[m_numberOfFullPassMuons]->pt() << std::endl;
675 std::cout <<" d0 "<< m_pxIDTrack[m_numberOfFullPassMuons]->d0() << std::endl;
676 std::cout <<" sigma_d0 "<< m_pxIDTrack[m_numberOfFullPassMuons]->definingParametersCovMatrixVec()[0] << std::endl;
677 }
678 //
681 }
682 // if(m_doDebug){ std::cout <<" * FourMuonEvent * RecordMuon * completed -- return with a total of " << m_numberOfFullPassMuons << std::endl;}
683 return;
684}
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

◆ Register()

void EventAnalysis::Register ( )
privateinherited

Definition at line 62 of file EventAnalysis.cxx.

63{
64 ServiceHandle<ITHistSvc> histSvc ("THistSvc", "EventAnalysis");
65
66 // Register histograms in monitoring tool
67 registerHistogramType(*histSvc, m_x1DHistograms, m_xSampleName, "/1dhisto_");
68 registerHistogramType(*histSvc, m_x2DHistograms, m_xSampleName, "/2dhisto_");
69
70 registerHistogramType(*histSvc, m_x1DProfHistograms, m_xSampleName, "/1dprof_");
71 registerHistogramType(*histSvc, m_x2DProfHistograms, m_xSampleName, "/2dprof_");
72}
std::map< unsigned int, TProfile2D * > m_x2DProfHistograms
std::map< unsigned int, TH2F * > m_x2DHistograms
std::map< unsigned int, TH1F * > m_x1DHistograms
std::map< unsigned int, TProfile * > m_x1DProfHistograms

◆ setContainer()

void FourMuonEvent::setContainer ( PerfMonServices::CONTAINERS container)
inline

Definition at line 108 of file FourMuonEvent.h.

const SG::AuxVectorData * container() const
Return the container holding this element.

◆ setDebugMode()

void FourMuonEvent::setDebugMode ( bool debug)
inline

Definition at line 109 of file FourMuonEvent.h.

109{ m_doDebug=debug; }
const bool debug

◆ SetLeadingMuonPtCut()

void FourMuonEvent::SetLeadingMuonPtCut ( double newvalue)

Definition at line 1035 of file FourMuonEvent.cxx.

1036{
1037 // first set the new pt cut value
1038 m_LeadingMuonPtCut = newvalue;
1039
1040 // the second muon pt cut can not be higher than the leading muon pt cut:
1042
1043 // this has to be translated to the MuonSelector
1044 // but there one has to use the minimum momentum --> second muon
1045 //this->SetMuonPtCut(m_SecondMuonPtCut);
1046 if(m_doDebug){
1047 std::cout <<" * FourMuonEvent * SetLeadingMuonPtCut * new Pt cuts: " << m_LeadingMuonPtCut << " & "
1049 << " MuonSelector: " << m_xMuonID.GetPtCut() << std::endl;
1050 }
1051 return;
1052}
void SetSecondMuonPtCut(double newvalue)

◆ SetMassWindowHigh()

void FourMuonEvent::SetMassWindowHigh ( double newvalue)
inline

Definition at line 112 of file FourMuonEvent.h.

112{ m_MassWindowHigh = newvalue; }

◆ SetMassWindowLow()

void FourMuonEvent::SetMassWindowLow ( double newvalue)
inline

Definition at line 111 of file FourMuonEvent.h.

111{ m_MassWindowLow = newvalue; }

◆ SetMuonPtCut()

void FourMuonEvent::SetMuonPtCut ( double newvalue)
inline

Definition at line 113 of file FourMuonEvent.h.

113{ m_xMuonID.SetPtCut(newvalue); }

◆ SetMuonSelectionTool()

void FourMuonEvent::SetMuonSelectionTool ( const ToolHandle< CP::IMuonSelectionTool > & mst)
inline

Definition at line 114 of file FourMuonEvent.h.

114{ m_xMuonID.SetCustomMuonSelectionTool (mst); };

◆ SetOpeningAngleCut()

void FourMuonEvent::SetOpeningAngleCut ( double newvalue)
inline

Definition at line 116 of file FourMuonEvent.h.

116{ m_OpeningAngleCut = newvalue; }
double m_OpeningAngleCut

◆ SetSecondMuonPtCut()

void FourMuonEvent::SetSecondMuonPtCut ( double newvalue)

Definition at line 1055 of file FourMuonEvent.cxx.

1056{
1057 m_SecondMuonPtCut = newvalue;
1058
1059 // use same for electrons
1060 m_xElecID.SetPtCut(m_SecondMuonPtCut);
1061
1062 // second muon pt shouldn't be higher than the leading muon pt
1064
1065 // this has to be translated to the MuonSelector
1067
1068 if(m_doDebug) {
1069 std::cout <<" * FourMuonEvent * SetSecondMuonPtCut * new Pt cuts: " << m_LeadingMuonPtCut
1070 << " & " << m_SecondMuonPtCut
1071 << " MuonSelector: " << m_xMuonID.GetPtCut() << std::endl;
1072 }
1073
1074 return;
1075}
void SetLeadingMuonPtCut(double newvalue)
void SetMuonPtCut(double newvalue)

◆ SetZ0GapCut()

void FourMuonEvent::SetZ0GapCut ( double newvalue)
inline

Definition at line 117 of file FourMuonEvent.h.

117{ m_Z0GapCut = newvalue; }

Member Data Documentation

◆ invalidAnswer

float EventAnalysis::invalidAnswer {-999.9f}
staticconstexprinherited

Definition at line 40 of file EventAnalysis.h.

40{-999.9f};

◆ m_acceptedElecCount

int FourMuonEvent::m_acceptedElecCount {}
private

Definition at line 201 of file FourMuonEvent.h.

201{};

◆ m_acceptedEventCount

int FourMuonEvent::m_acceptedEventCount {}
private

Definition at line 198 of file FourMuonEvent.h.

198{};

◆ m_acceptedMuonCount

int FourMuonEvent::m_acceptedMuonCount {}
private

Definition at line 200 of file FourMuonEvent.h.

200{};

◆ m_container

PerfMonServices::CONTAINERS FourMuonEvent::m_container
private

Definition at line 142 of file FourMuonEvent.h.

◆ m_deltaXYcut

double FourMuonEvent::m_deltaXYcut {}
private

Definition at line 153 of file FourMuonEvent.h.

153{};

◆ m_doDebug

bool FourMuonEvent::m_doDebug {}
private

Definition at line 156 of file FourMuonEvent.h.

156{};

◆ m_elec_vtx

int FourMuonEvent::m_elec_vtx[NUM_MUONS] {}
private

Definition at line 221 of file FourMuonEvent.h.

221{};

◆ m_eventCount

int FourMuonEvent::m_eventCount {}
private

Definition at line 197 of file FourMuonEvent.h.

197{};

◆ m_fInvariantMass

Arrayf FourMuonEvent::m_fInvariantMass {}
private

Definition at line 182 of file FourMuonEvent.h.

182{};

◆ m_fMuonDispersion

Arrayf FourMuonEvent::m_fMuonDispersion {}
private

Definition at line 183 of file FourMuonEvent.h.

183{};

◆ m_FourMuonInvMass

double FourMuonEvent::m_FourMuonInvMass {}
private

Definition at line 146 of file FourMuonEvent.h.

146{};

◆ m_fZEtaDir

Arrayf FourMuonEvent::m_fZEtaDir {}
private

Definition at line 180 of file FourMuonEvent.h.

180{};

◆ m_fZPhiDir

Arrayf FourMuonEvent::m_fZPhiDir {}
private

Definition at line 181 of file FourMuonEvent.h.

181{};

◆ m_fZPt

Arrayf FourMuonEvent::m_fZPt {}
private

Definition at line 179 of file FourMuonEvent.h.

179{};

◆ m_LeadingMuonPtCut

double FourMuonEvent::m_LeadingMuonPtCut {}
private

Definition at line 148 of file FourMuonEvent.h.

148{};

◆ m_MassWindowHigh

double FourMuonEvent::m_MassWindowHigh {}
private

Definition at line 151 of file FourMuonEvent.h.

151{};

◆ m_MassWindowLow

double FourMuonEvent::m_MassWindowLow {}
private

Definition at line 150 of file FourMuonEvent.h.

150{};

◆ m_msgStream

MsgStream* FourMuonEvent::m_msgStream {}
private

Definition at line 137 of file FourMuonEvent.h.

137{};

◆ m_muon1

int FourMuonEvent::m_muon1 = 0
private

Definition at line 205 of file FourMuonEvent.h.

◆ m_muon2

int FourMuonEvent::m_muon2 = 0
private

Definition at line 206 of file FourMuonEvent.h.

◆ m_muon_vtx

int FourMuonEvent::m_muon_vtx[NUM_MUONS] {}
private

Definition at line 220 of file FourMuonEvent.h.

220{};

◆ m_muonneg1

int FourMuonEvent::m_muonneg1 = 0
private

Definition at line 210 of file FourMuonEvent.h.

◆ m_muonneg1_vtx

int FourMuonEvent::m_muonneg1_vtx = 0
private

Definition at line 215 of file FourMuonEvent.h.

◆ m_muonneg2

int FourMuonEvent::m_muonneg2 = 0
private

Definition at line 211 of file FourMuonEvent.h.

◆ m_muonneg2_vtx

int FourMuonEvent::m_muonneg2_vtx = 0
private

Definition at line 216 of file FourMuonEvent.h.

◆ m_muonpos1

int FourMuonEvent::m_muonpos1 = 0
private

Definition at line 208 of file FourMuonEvent.h.

◆ m_muonpos1_vtx

int FourMuonEvent::m_muonpos1_vtx = 0
private

Definition at line 217 of file FourMuonEvent.h.

◆ m_muonpos2

int FourMuonEvent::m_muonpos2 = 0
private

Definition at line 209 of file FourMuonEvent.h.

◆ m_muonpos2_vtx

int FourMuonEvent::m_muonpos2_vtx = 0
private

Definition at line 218 of file FourMuonEvent.h.

◆ m_numberOfFullPassElectrons

unsigned int FourMuonEvent::m_numberOfFullPassElectrons {}
private

Definition at line 163 of file FourMuonEvent.h.

163{};

◆ m_numberOfFullPassMuons

unsigned int FourMuonEvent::m_numberOfFullPassMuons {}
private

Definition at line 162 of file FourMuonEvent.h.

162{};

◆ m_nVertex

int FourMuonEvent::m_nVertex = 0
private

Definition at line 214 of file FourMuonEvent.h.

◆ m_OpeningAngleCut

double FourMuonEvent::m_OpeningAngleCut {}
private

Definition at line 152 of file FourMuonEvent.h.

152{};

◆ m_passedFourElectronSelection

bool FourMuonEvent::m_passedFourElectronSelection = false
private

Definition at line 166 of file FourMuonEvent.h.

◆ m_passedFourLeptonSelection

bool FourMuonEvent::m_passedFourLeptonSelection = false
private

Definition at line 167 of file FourMuonEvent.h.

◆ m_passedFourMuonSelection

bool FourMuonEvent::m_passedFourMuonSelection = false
private

Definition at line 165 of file FourMuonEvent.h.

◆ m_passedSelectionCuts

bool FourMuonEvent::m_passedSelectionCuts = false
private

Definition at line 164 of file FourMuonEvent.h.

◆ m_pxELTrack

const xAOD::TrackParticle* FourMuonEvent::m_pxELTrack[NUM_MUONS] {}
private

Definition at line 174 of file FourMuonEvent.h.

174{}; // pointer to Track particle of the electrons

◆ m_pxIDTrack

const xAOD::TrackParticle* FourMuonEvent::m_pxIDTrack[NUM_MUONS] {}
private

Definition at line 172 of file FourMuonEvent.h.

172{}; // Pointer to ID track

◆ m_pxMETrack

const xAOD::TrackParticle* FourMuonEvent::m_pxMETrack[NUM_MUONS] {}
private

Definition at line 170 of file FourMuonEvent.h.

170{}; // Pointer to muon spectro ( corr. )

◆ m_pxMSTrack

const xAOD::TrackParticle* FourMuonEvent::m_pxMSTrack[NUM_MUONS] {}
private

Definition at line 171 of file FourMuonEvent.h.

171{}; // Pointer to muon spectro

◆ m_pxMUTrack

const xAOD::TrackParticle* FourMuonEvent::m_pxMUTrack[NUM_MUONS] {}
private

Definition at line 175 of file FourMuonEvent.h.

175{}; // pointer to Track particle of the muons

◆ m_pxRecMuon

const xAOD::Muon* FourMuonEvent::m_pxRecMuon[NUM_MUONS] {}
private

Definition at line 169 of file FourMuonEvent.h.

169{};

◆ m_SecondMuonPtCut

double FourMuonEvent::m_SecondMuonPtCut {}
private

Definition at line 149 of file FourMuonEvent.h.

149{};

◆ m_SelectMuonByIP

bool FourMuonEvent::m_SelectMuonByIP {}
private

Definition at line 194 of file FourMuonEvent.h.

194{};

◆ m_SelectMuonByIso

bool FourMuonEvent::m_SelectMuonByIso {}
private

Definition at line 193 of file FourMuonEvent.h.

193{};

◆ m_uMuonTags

unsigned int FourMuonEvent::m_uMuonTags {}
private

Definition at line 145 of file FourMuonEvent.h.

145{};

◆ m_uPassedEvents

unsigned int EventAnalysis::m_uPassedEvents
protectedinherited

Definition at line 75 of file EventAnalysis.h.

◆ m_workAsFourElectrons

bool FourMuonEvent::m_workAsFourElectrons {}
private

Definition at line 158 of file FourMuonEvent.h.

158{};

◆ m_workAsFourLeptons

bool FourMuonEvent::m_workAsFourLeptons {}
private

Definition at line 159 of file FourMuonEvent.h.

159{};

◆ m_workAsFourMuons

bool FourMuonEvent::m_workAsFourMuons {}
private

Definition at line 157 of file FourMuonEvent.h.

157{};

◆ m_x1DHistograms

std::map<unsigned int, TH1F*> EventAnalysis::m_x1DHistograms
protectedinherited

Definition at line 76 of file EventAnalysis.h.

◆ m_x1DProfHistograms

std::map<unsigned int, TProfile*> EventAnalysis::m_x1DProfHistograms
protectedinherited

Definition at line 78 of file EventAnalysis.h.

◆ m_x2DHistograms

std::map<unsigned int, TH2F*> EventAnalysis::m_x2DHistograms
protectedinherited

Definition at line 77 of file EventAnalysis.h.

◆ m_x2DProfHistograms

std::map<unsigned int, TProfile2D*> EventAnalysis::m_x2DProfHistograms
protectedinherited

Definition at line 79 of file EventAnalysis.h.

◆ m_xElecID

ElectronSelector FourMuonEvent::m_xElecID
private

Definition at line 141 of file FourMuonEvent.h.

◆ m_xMuonID

MuonSelector FourMuonEvent::m_xMuonID
private

Definition at line 140 of file FourMuonEvent.h.

◆ m_xSampleName

std::string EventAnalysis::m_xSampleName
protectedinherited

Definition at line 81 of file EventAnalysis.h.

◆ m_Z0GapCut

double FourMuonEvent::m_Z0GapCut {}
private

Definition at line 154 of file FourMuonEvent.h.

154{};

The documentation for this class was generated from the following files: