ATLAS Offline Software
Loading...
Searching...
No Matches
muCombUtil.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
3*/
4
5// *********************************************************************
6//
7// NAME: muCombUtil.cxx
8// PACKAGE: Trigger/TrigAlgorithms/TrigmuComb
9//
10// AUTHOR: S. Giagu <stefano.giagu@cern.ch>
11//
12// PURPOSE: Utility namespace for LVL2 Combined Muon Reco FEX Algorithm
13// *********************************************************************
14#include <iostream>
15#include <math.h>
16#include <utility>
17
18#include "muCombUtil.h"
19
20namespace muCombUtil {
21
22 void setMuFastRes(std::vector<double>& vec, double p1,double p2,
23 double p3,double p4,double p5,double p6) {
24 vec.clear();
25 vec.push_back(p1);
26 vec.push_back(p2);
27 vec.push_back(p3);
28 vec.push_back(p4);
29 vec.push_back(p5);
30 vec.push_back(p6);
31 }
32
33 void setIDSCANRes(std::vector<double>& vec, double p1,double p2) {
34 vec.clear();
35 vec.push_back(p1);
36 vec.push_back(p2);
37 }
38
39
40 int whichECRegion( const float eta, const float phi ) {
41 // 0: bulk
42 // 1: WeakBfield A
43 // 2: WeakBfield B
44
45 float absEta = fabs(eta);
46
47 if( ( 1.3 <= absEta && absEta < 1.45) &&
48 ( (0 <= fabs(phi) && fabs(phi) < M_PI/48. ) ||
49 (M_PI*11./48. <= fabs(phi) && fabs(phi) < M_PI*13./48. ) ||
50 (M_PI*23./48. <= fabs(phi) && fabs(phi) < M_PI*25./48. ) ||
51 (M_PI*35./48. <= fabs(phi) && fabs(phi) < M_PI*37./48. ) ||
52 (M_PI*47./48. <= fabs(phi) && fabs(phi) < M_PI )
53 )
54 ) return 1;
55
56 else if( ( 1.5 <= absEta && absEta < 1.65 ) &&
57 ( (M_PI*3./32. <= fabs(phi) && fabs(phi) < M_PI*5./32. ) ||
58 (M_PI*11./32. <= fabs(phi) && fabs(phi) < M_PI*13./32.) ||
59 (M_PI*19./32. <= fabs(phi) && fabs(phi) < M_PI*21./32.) ||
60 (M_PI*27./32. <= fabs(phi) && fabs(phi) < M_PI*29./32.)
61 )
62 ) return 2;
63
64 else return 0;
65 }
66
67
68 double getIDSCANRes(std::vector<double> barrelvec, std::vector<double> ec1vec,
69 std::vector<double> ec2vec, std::vector<double> ec3vec, std::vector<double> ec4vec,
70 double pt_id, double eta_id) {
71
72 double pt = pt_id;
73 if (pt == 0) return 1.0e33;
74
75 double AbsPtInv = fabs(1./pt);
76 double AbsEta = fabs(eta_id);
77
78 std::vector<double> vec;
79 if (AbsEta < 1.05) vec = std::move(barrelvec);
80 else if (AbsEta>=1.05 && AbsEta<1.35) vec = std::move(ec1vec);
81 else if (AbsEta>=1.35 && AbsEta<1.65) vec = std::move(ec2vec);
82 else if (AbsEta>=1.65 && AbsEta<2.0) vec = std::move(ec3vec);
83 else vec = std::move(ec4vec);
84
85 return vec[0]*AbsPtInv+vec[1]/1000.;
86 }
87
88
89 double getG4ExtEtaRes(double pt, double eta) {
90
91 //double pt = feature->pt();
92 //double eta = feature->eta();
93 if (pt < 4. ) pt = 4.;
94 if (pt > 40.) pt = 40.;
95 // bool ts = false;
96 // if (feature->radius() <= 10.) ts = true;
97
98 //G4 extrapolator eta resolution parametrized as A/pt^2 + B/pt + C + D*pt
99 // Resolution evaluated in regions of eta: 0.0,0.5,1.0,1.5,2.0,above...
100 if (fabs(eta) < 0.5) {
101 return 6.0e-3/(pt*pt) + 4.4e-2/pt + 1.2e-2 + (-3.2e-5*pt);
102 }
103 else if (fabs(eta) >= 0.5 && fabs(eta) < 1.0) {
104 return 5.6e-3/(pt*pt) + 3.9e-2/pt + 1.3e-2 + (-3.7e-5*pt);
105 }
106 else if (fabs(eta) >= 1.0 && fabs(eta) < 1.5) {
107 return 2.1e-1/(pt*pt) + 8.8e-2/pt + 7.1e-4 + (1.7e-4*pt);
108 }
109 else if (fabs(eta) >= 1.5 && fabs(eta) < 2.0) {
110 return 4.5e-3/(pt*pt) + 1.4e-2/pt + 1.1e-2 + (-5.7e-5*pt);
111 }
112 else { // if (fabs(eta) >= 2.0) {
113 return 3.1e-2/(pt*pt) + 4.9e-1/pt + (-2.6e-3) + (3.2e-5*pt);
114 }
115 }
116
117
118 double getG4ExtPhiRes(double pt, double eta) {
119
120 //double pt = feature->pt();
121 //double eta = feature->eta();
122 if (pt < 4. ) pt = 4.;
123 if (pt > 40.) pt = 40.;
124 // bool ts = false;
125 // if (feature->radius() <= 10.) ts = true;
126
127 //G4 extrapolator phi resolution parametrized as A/pt^2 + B/pt + C + D*pt
128 // Resolution evaluated in regions of eta: 0.0,0.5,1.0,1.5,2.0,above...
129 if (fabs(eta) < 0.5) {
130 return 4.1e-2/(pt*pt) + 1.5e-1/pt + 1.4e-3 + (5.8e-5*pt);
131 }
132 else if (fabs(eta) >= 0.5 && fabs(eta) < 1.0) {
133 return 9.4e-3/(pt*pt) + 8.8e-2/pt + 1.1e-2 + (-1.e-4*pt);
134 }
135 else if (fabs(eta) >= 1.0 && fabs(eta) < 1.5) {
136 return 3.5e-1/(pt*pt) + 9.4e-2/pt + 8.2e-3 + (-3.3e-7*pt);
137 }
138 else if (fabs(eta) >= 1.5 && fabs(eta) < 2.0) {
139 return 2.6e-2/(pt*pt) + 1.2e-1/pt + 3.8e-3 + (2.2e-5*pt);
140 }
141 else { // if (fabs(eta) >= 2.0) {
142 return 2.7e-1/(pt*pt) + 3.2e-2/pt + (9.0e-3) + (-2.6e-5*pt);
143 }
144 }
145
146 double getDeltaPhi(double phi1, double phi2) {
147 double dphi = phi1 - phi2;
148 if (dphi > M_PI) dphi -= 2*M_PI;
149 if (dphi < -M_PI) dphi += 2*M_PI;
150 return fabs(dphi);
151 }
152
153 double getDeltaEta(double eta1, double eta2) {
154 return fabs(eta1-eta2);
155 }
156
157 double getDeltaR(double eta1, double phi1, double eta2, double phi2) {
158 double deta = getDeltaEta(eta1,eta2);
159 double dphi = getDeltaPhi(phi1,phi2);
160 return sqrt(deta*deta + dphi*dphi);
161 }
162
163 double getCombinedAverage(double p1, double sp1, double p2, double sp2) {
164 if (sp1 != 0 && sp2 != 0) return (sp2*sp2*fabs(p1) + sp1*sp1*fabs(p2))/(sp1*sp1 + sp2*sp2);
165 else if (sp1 != 0 && sp2 == 0) return fabs(p2);
166 else if (sp1 == 0 && sp2 != 0) return fabs(p1);
167 else return (fabs(p1)+fabs(p2))*0.5;
168 }
169
170 double getCombinedAverageSigma(double sp1, double sp2) {
171 if (sp1 != 0 && sp2 != 0) return sqrt((sp1*sp1*sp2*sp2)/(sp1*sp1 + sp2*sp2));
172 else return 0.0;
173 }
174
175 double getChi2(int& ndof, double ipt,
176 double eta1, double seta1, double phi1, double sphi1, double ipt1, double sipt1,
177 double eta2, double seta2, double phi2, double sphi2, double ipt2, double sipt2, bool useAbsPt) {
178
179 double deta = getDeltaEta(eta1,eta2);
180 double sdeta = seta1*seta1+seta2*seta2;
181 double dphi = getDeltaPhi(phi1,phi2);
182 double sdphi = sphi1*sphi1+sphi2*sphi2;
183 double dipt_1 = ipt - ipt1;
184 if (useAbsPt) dipt_1 = fabs(ipt) - fabs(ipt1);
185 double sdipt_1 = sipt1*sipt1;
186 double dipt_2 = ipt - ipt2;
187 if (useAbsPt) dipt_2 = fabs(ipt) - fabs(ipt2);
188 double sdipt_2 = sipt2*sipt2;
189
190 double chi2 = 0.0;
191 ndof = 0;
192 if (sdeta != 0) { chi2 += deta*deta/sdeta; ndof++; }
193 if (sdphi != 0) { chi2 += dphi*dphi/sdphi; ndof++; }
194 if (sdipt_1 != 0) { chi2 += dipt_1*dipt_1/sdipt_1; ndof++; }
195 if (sdipt_2 != 0) { chi2 += dipt_2*dipt_2/sdipt_2; ndof++; }
196
197 if (ndof == 0) return 1.0e30;
198 else return chi2;
199 }
200
201
202 double getStdChi2(int& ndof,
203 double eta1, double seta1, double phi1, double sphi1, double qOvpt1, double sqOvpt1,
204 double eta2, double seta2, double phi2, double sphi2, double qOvpt2, double sqOvpt2, bool useAbsPt) {
205
206 double deta = getDeltaEta(eta1,eta2);
207 double sdeta = seta1*seta1+seta2*seta2;
208 double dphi = getDeltaPhi(phi1,phi2);
209 double sdphi = sphi1*sphi1+sphi2*sphi2;
210 double dipt = qOvpt1 - qOvpt2;
211 if (useAbsPt) dipt = fabs(qOvpt1) - fabs(qOvpt2);
212 double sdipt = sqOvpt1*sqOvpt1+sqOvpt2*sqOvpt2;
213
214 double chi2 = 0.0;
215 ndof = 0;
216 if (sdeta != 0) { chi2 += deta*deta/sdeta; ndof++; }
217 if (sdphi != 0) { chi2 += dphi*dphi/sdphi; ndof++; }
218 if (sdipt != 0) { chi2 += dipt*dipt/sdipt; ndof++; }
219
220 if (ndof == 0) return 1.0e30;
221 else return chi2;
222 }
223
224
225}//muCombUtil
#define M_PI
Scalar eta() const
pseudorapidity method
Scalar phi() const
phi method
std::vector< size_t > vec
double chi2(TH1 *h0, TH1 *h1)
int whichECRegion(const float eta, const float phi)
utility function for getMuFastRes
double getIDSCANRes(std::vector< double > barrelvec, std::vector< double > ec1vec, std::vector< double > ec2vec, std::vector< double > ec3vec, std::vector< double > ec4vec, double pt_id, double eta_id)
Get parametrized IDSCAN 1/pt resolution.
double getChi2(int &ndof, double ipt, double eta1, double seta1, double phi1, double sphi1, double ipt1, double sipt1, double eta2, double seta2, double phi2, double sphi2, double ipt2, double sipt2, bool useAbsPt)
Get OLD style (i.e. muFast time) Chi2.
double getCombinedAverage(double p1, double sp1, double p2, double sp2)
Get weighted mean.
double getG4ExtEtaRes(double pt, double eta)
Get parametrized Geant4 Eta resolution (extrapolated).
double getStdChi2(int &ndof, double eta1, double seta1, double phi1, double sphi1, double qOvpt1, double sqOvpt1, double eta2, double seta2, double phi2, double sphi2, double qOvpt2, double sqOvpt2, bool useAbsPt)
Get Std Chi2.
double getCombinedAverageSigma(double sp1, double sp2)
Get sigma of weighted mean.
double getDeltaEta(double eta1, double eta2)
Get DeltaEta.
double getDeltaR(double eta1, double phi1, double eta2, double phi2)
Get DeltaR.
void setMuFastRes(std::vector< double > &vec, double p1, double p2, double p3, double p4, double p5, double p6)
utility vector set
void setIDSCANRes(std::vector< double > &vec, double p1, double p2)
utility vector set
double getDeltaPhi(double phi1, double phi2)
Get DeltaPhi.
double getG4ExtPhiRes(double pt, double eta)
Get parametrized Geant4 Phi resolution (extrapolated).