39 bool oppositeCharge,
unsigned short vertexState):
m_roiWord(roiWord),
66 ss <<
"ElectronMuonTopoInfo at address: " << &d
67 <<
" RoIWord: " << d.RoiWord()
68 <<
" Delta Phi: " << d.DeltaPhi()
69 <<
" Delta R: " << d.DeltaR()
70 <<
" Invariant mass: " << d.InvMass()
71 <<
" electron valid: " << d.ElecValid()
72 <<
" opposite charge: " << d.OppositeCharge()
73 <<
" vertex state: " << d.VertexState();
79 return( m <<
str ( d ) );
84 return(d1.DeltaPhi()==d2.DeltaPhi() && d1.DeltaR()==d2.DeltaR() && d1.InvMass()==d2.InvMass()
85 && d1.OppositeCharge()==d2.OppositeCharge() && d1.VertexState() == d2.VertexState() );
94 double trk_e1_z0error = electron1->
err_Zvtx();
95 double trk_e2_z0error = muon1->
IDTrack()->
param()->ez0();
98 if ( trk_e1_z0error > 0 && trk_e2_z0error > 0 ) {
99 double z0_distance = fabs(electron1->
Zvtx()
102 double z0_error = sqrt(trk_e1_z0error * trk_e1_z0error
103 + trk_e2_z0error * trk_e2_z0error);
111 if (z0_distance > 3*z0_error) {
127 double& pull,
bool debug) {
129 if(
debug) std::cout <<
"Now checking electron perigee at " << perigeeEL <<
" and muon perigee at " << perigeeMU <<
"." << std::endl;
132 double electron_z0=0.;
133 double electron_z0_error=0.;
136 double muon_z0_error=0.;
140 electron_z0 = perigeeEL->parameters()[
Trk::z0];
151 muon_z0 = perigeeMU->parameters()[
Trk::z0];
158 if(
debug) std::cout <<
"Electron z0 = " << electron_z0 <<
"+-" << electron_z0_error <<
"; muon_z0 = " << muon_z0 <<
"+-" << muon_z0_error << std::endl;
162 if ( electron_z0_error > 0 && muon_z0_error > 0 ) {
163 double z0_distance = fabs(electron_z0
166 double z0_error = sqrt(electron_z0_error * electron_z0_error
167 + muon_z0_error * muon_z0_error);
169 pull = z0_distance/z0_error;
171 if(
debug) std::cout <<
"z-distance is " << z0_distance <<
"+-" << z0_error <<
". And the pull is " << pull <<
"." << std::endl;
178 if (z0_distance > 3*z0_error) {
194 if ( electron1->
charge() * muon1->
ptq() > 0 )
212 double distEmu = fabs(dPhi);
220 double dPhi = tau1->
phi()-tau2->
phi();
223 double distEmu = fabs(dPhi);
231 double dPhi = tau1->
phi()-electron1->
phi();
234 double distEmu = fabs(dPhi);
245 double distEmu = fabs(dPhi);
260 double distEmu = sqrt(dPhi*dPhi+dEta*dEta);
268 double dPhi = tau1->
phi()-tau2->
phi();
271 double dEta = tau1->
eta() - tau2->
eta();
272 double distEmu = sqrt(dPhi*dPhi+dEta*dEta);
280 double dPhi = tau1->
phi()-electron1->
phi();
283 double dEta = tau1->
eta() - electron1->
eta();
284 double distEmu = sqrt(dPhi*dPhi+dEta*dEta);
296 double distEmu = sqrt(dPhi*dPhi+dEta*dEta);
304 float mu_phi = muon1->parameters()[
Trk::phi];
309 double distEmu = fabs(dPhi);
316 double dPhi = tau1->
phi()-tau2->
phi();
319 double distEmu = fabs(dPhi);
326 const egamma* electron1) {
330 double distEmu = fabs(dPhi);
338 float mu_phi = muon1->parameters()[
Trk::phi];
340 double dPhi = tau1->
phi()-mu_phi;
343 double distEmu = fabs(dPhi);
352 float mu_phi =muon1->parameters()[
Trk::phi];
358 double distEmu = sqrt(dPhi*dPhi+dEta*dEta);
366 double dPhi = tau1->
phi()-tau2->
phi();
369 double dEta = tau1->
eta() - tau2->
eta();
370 double distEmu = sqrt(dPhi*dPhi+dEta*dEta);
377 const egamma* electron1) {
382 double distEmu = sqrt(dPhi*dPhi+dEta*dEta);
390 float mu_phi =muon1->parameters()[
Trk::phi];
392 double dPhi = tau1->
phi()-mu_phi;
395 double dEta = tau1->
eta() - muon1->
eta();
396 double distEmu = sqrt(dPhi*dPhi+dEta*dEta);
406 double eta1 = electron1->
eta();
410 double Pt1 = electron1->
pt() ;
411 double Pt2 = muon1->
pt();
413 double phi1 = electron1->
phi();
423 double eta1 = tau1->
eta();
424 double eta2 = tau2->
eta();
427 double Pt1 = tau1->
pt() ;
428 double Pt2 = tau2->
pt();
430 double phi1 = tau1->
phi();
431 double phi2 = tau2->
phi();
440 double eta1 = tau1->
eta();
441 double eta2 = electron1->
eta();
444 double Pt1 = tau1->
pt() ;
445 double Pt2 = electron1->
pt();
447 double phi1 = tau1->
phi();
448 double phi2 = electron1->
phi();
457 double eta1 = tau1->
eta();
461 double Pt1 = tau1->
pt() ;
462 double Pt2 = muon1->
pt();
464 double phi1 = tau1->
phi();
474 double eta1 = tau1->
eta();
475 double eta2 = tau2->
eta();
478 double Pt1 = tau1->
pt() ;
479 double Pt2 = tau2->
pt();
481 double phi1 = tau1->
phi();
482 double phi2 = tau2->
phi();
490 const egamma* electron1) {
492 double eta1 = tau1->
eta();
496 double Pt1 = tau1->
pt() ;
499 double phi1 = tau1->
phi();
508 double eta1 = tau1->
eta();
509 double eta2 = muon1->
eta();
512 double Pt1 = tau1->
pt() ;
513 double Pt2 = muon1->
pT() ;
515 double phi1 = tau1->
phi();
516 double phi2 = muon1->parameters()[
Trk::phi];
522 double Pt2,
double eta2,
double phi2,
double m2 )
const {
528 double theta1 = 2*atan2((
double)exp(-eta1),1.);
529 double theta2 = 2*atan2((
double)exp(-eta2),1.);
530 double P1 = Pt1/sin(theta1);
531 double P2 = Pt2/sin(theta2);
539 sincos(phi1,&p1[1],&p1[0]);
544 p1[0] = Pt1*scphi1.
cs;
545 p1[1] = Pt1*scphi1.
sn;
552 sincos(phi2,&p2[1],&p2[0]);
557 p2[0] = Pt2*scphi2.
cs;
558 p2[1] = Pt2*scphi2.
sn;
561 p1[2] = P1*cos(theta1);
562 p2[2] = P2*cos(theta2);
565 double Ptot1 = sqrt(std::pow(p1[0],2)+std::pow(p1[1],2)+std::pow(p1[2],2));
566 double Ptot2 = sqrt(std::pow(p2[0],2)+std::pow(p2[1],2)+std::pow(p2[2],2));
567 double e1 = sqrt(Ptot1*Ptot1 + m1*m1);
568 double e2 = sqrt(Ptot2*Ptot2 + m2*m2);
569 double mass = sqrt(m1*m1+m2*m2+ 2*e1*e2 - 2*p1[0]*p2[0] - 2*p1[1]*p2[1] - 2*p1[2]*p2[2]);
579 double eta2 = muon1->
eta();
583 double Pt2 = muon1->
pT();
586 double phi2 = muon1->parameters()[
Trk::phi];
bool operator==(const ElectronMuonTopoInfo &d1, const ElectronMuonTopoInfo &d2)
MsgStream & operator<<(MsgStream &m, const ElectronMuonTopoInfo &d)
Object for taus common for ESD and AOD.
virtual double e() const
Retrieve energy independent of signal state.
double pt(void) const
transverse momentum
const TrigInDetTrack * IDTrack(void) const
ElectronMuonTopoInfo is a class for storing information about combuned electron-muon object.
bool opositeCharge(const TrigElectron *electron1, const CombinedMuonFeature *muon1)
Opposite charge @ L2.
float m_DeltaR
Delta R between electron and muon.
double deltaR(const TrigElectron *electron1, const CombinedMuonFeature *muon1)
Delta R @ L2.
void SetOppositeCharge(bool OppositeCharge)
unsigned short m_vertexState
3 bit description of vertex: 0=common, 1=not common, 3= not applicable
float m_DeltaPhi
Delta Phi between electron and muon.
void SetElecValid(bool ElecValid)
void SetDeltaR(float DeltaR)
int m_roiWord
Identifier of the RoI.
void SetVertexState(unsigned short vextexState)
bool m_electronValid
boolean flag showing the validity of electron
void SetInvMass(float InvMass)
double invariantMass(const TrigElectron *electron1, const CombinedMuonFeature *muon1)
Invariant mass calculation @ L2.
double deltaPhi(const TrigElectron *electron1, const CombinedMuonFeature *muon1)
Delta phi @ L2.
void SetRoiWord(int RoiWord)
set methods
bool OppositeCharge() const
int RoiWord() const
accessor methods
float m_InvMass
Invariant mass of electron and muon.
Vertex commonVertex(const TrigElectron *electron1, const CombinedMuonFeature *muon1)
checking Vertex compatibility @ L2
void SetDeltaPhi(float DeltaPhi)
bool m_oppositeCharge
True if electron and muon have opposite charged.
virtual double phi() const =0
phi in [-pi,pi[
virtual double eta() const =0
pseudo rapidity
virtual double pt() const
get pt data member
virtual double eta() const
get eta data member
virtual double phi() const
get phi data member
virtual double pt() const
transverse momentum
virtual double phi() const
phi in [-pi,pi[
virtual double eta() const
pseudo rapidity
virtual ChargeType charge() const
returns charge as a typedef ChargeType currently Charge Type is a double for jets this may be changed...
int charge() const
accessor to return the track charge (sign of TrigInDetTrack pT)
void param(const TrigInDetTrackFitPar *param)
double eta() const
Access method for pseudorapidity - from momentum.
double charge() const
Returns the charge.
double pT() const
Access method for transverse momentum.
const Rec::TrackParticle * trackParticle(unsigned int index=0) const
pointer to TrackParticle
const CaloCluster * cluster() const
pointer to CaloCluster
double error(const Amg::MatrixX &mat, int index)
return diagonal error of the matrix caller should ensure the matrix is symmetric and the index is in ...
constexpr double muonMassInMeV
the mass of the muon (in MeV)
constexpr double tauMassInMeV
the mass of the tau (in MeV)
constexpr double electronMassInMeV
the mass of the electron (in MeV)
ParametersT< TrackParametersDim, Charged, PerigeeSurface > Perigee
Helper to simultaneously calculate sin and cos of the same angle.
Helper to simultaneously calculate sin and cos of the same angle.