ATLAS Offline Software
Toggle main menu visibility
Loading...
Searching...
No Matches
Trigger
TrigAlgorithms
TrigL2MuonSA
src
NswPatternFinder.cxx
Go to the documentation of this file.
1
/*
2
Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration
3
*/
4
5
#include "
NswPatternFinder.h
"
6
#include "
xAODTrigMuon/TrigMuonDefs.h
"
7
#include <cmath>
8
9
// --------------------------------------------------------------------------------
10
// --------------------------------------------------------------------------------
11
12
TrigL2MuonSA::NswPatternFinder::NswPatternFinder
(
const
std::string&
type
,
13
const
std::string& name,
14
const
IInterface* parent):
15
AthAlgTool
(
type
,name,parent)
16
{
17
}
18
19
// --------------------------------------------------------------------------------
20
// --------------------------------------------------------------------------------
21
22
StatusCode
TrigL2MuonSA::NswPatternFinder::findPatterns
(
const
TrigL2MuonSA::MuonRoad
& muonRoad,
23
std::vector<StgcHitData>& stgcHits,
24
std::vector<MmHitData>& mmHits,
25
TrigL2MuonSA::TrackPattern
& trackPattern)
const
26
{
27
28
ATH_MSG_DEBUG
(
"Start NSW Pattern Finder"
);
29
30
trackPattern.
mmSegment
.clear();
31
trackPattern.
stgcSegment
.clear();
32
33
// const int chamber = xAOD::L2MuonParameters::Chamber::EndcapInner; // NSW is located at endcap inner station
34
35
ATH_CHECK
(
outlierMm
(muonRoad, trackPattern, mmHits) );
36
ATH_CHECK
(
outlierStgc
(muonRoad, trackPattern, stgcHits) );
37
38
ATH_MSG_DEBUG
(
"nr of MM hits in segment="
<< trackPattern.
mmSegment
.size());
39
ATH_MSG_DEBUG
(
"nr of sTGC hits in segment="
<< trackPattern.
stgcSegment
.size());
40
41
return
StatusCode::SUCCESS;
42
}
43
44
// --------------------------------------------------------------------------------
45
// --------------------------------------------------------------------------------
46
47
double
TrigL2MuonSA::NswPatternFinder::calc_residualR
(
const
double
aw,
const
double
bw,
const
double
x
,
const
double
y
)
const
48
{
49
const
double
ZERO_LIMIT
= 1e-4;
50
if
( std::abs(aw) <
ZERO_LIMIT
)
return
y
-bw;
51
double
ia = 1/aw;
52
double
iaq = ia*ia;
53
double
dz =
x
- (
y
-bw)*ia;
54
return
dz/std::sqrt(1.+iaq);
55
}
56
57
double
TrigL2MuonSA::NswPatternFinder::calc_dPhi
(
const
double
hitphi,
const
double
roadphi)
const
58
{
59
60
double
dphi = std::abs(hitphi - roadphi);
61
if
( dphi >
M_PI
*2 ) dphi = dphi -
M_PI
*2;
62
if
( dphi >
M_PI
) dphi =
M_PI
*2 - dphi;
63
64
return
dphi;
65
}
66
67
68
StatusCode
TrigL2MuonSA::NswPatternFinder::outlierMm
(
const
TrigL2MuonSA::MuonRoad
& muonRoad,
TrigL2MuonSA::TrackPattern
& trackPattern,
TrigL2MuonSA::MmHits
& mmHits)
const
69
{
70
TrigL2MuonSA::MmHits
mmSegment;
71
mmSegment.clear();
72
73
const
int
chamber =
xAOD::L2MuonParameters::Chamber::EndcapInner
;
// NSW is located at endcap inner station
74
75
const
double
aw = muonRoad.
aw
[chamber][0];
76
const
double
bw = muonRoad.
bw
[chamber][0];
77
const
double
roadphi = muonRoad.
phi
[chamber][0];
78
79
double
z
= -1;
80
double
r
= -1;
81
double
phi
= -1;
82
double
residualR = -1;
83
double
residualPhi = -1;
84
unsigned
int
i_layer = 999;
85
double
rWidth = -1;
86
87
for
(
unsigned
int
i_hit=0; i_hit<mmHits.size(); i_hit++) {
88
89
z
= mmHits[i_hit].z;
90
r
= mmHits[i_hit].r;
91
phi
= mmHits[i_hit].phi;
92
i_layer = mmHits[i_hit].layerNumber;
93
residualR =
calc_residualR
(aw,bw,
z
,
r
);
94
residualPhi =
calc_dPhi
(
phi
, roadphi);
95
mmHits[i_hit].ResidualR = residualR;
96
mmHits[i_hit].ResidualPhi = residualPhi;
97
rWidth = muonRoad.
rWidth
[chamber][i_layer];
98
99
ATH_MSG_DEBUG
(
"Mm .../z/r/aw/bw/residualR/residualPhi/rWidth="
100
<<
z
<<
"/"
<<
r
<<
"/"
<< aw <<
"/"
<< bw <<
"/"
<< residualR <<
"/"
<< residualPhi <<
"/"
<< rWidth);
101
102
if
( std::abs(residualR) > rWidth ) {
// outside Road
103
mmHits[i_hit].isOutlier = 2;
104
continue
;
105
}
106
107
mmSegment.push_back(mmHits[i_hit]);
108
}
109
110
trackPattern.
mmSegment
= mmSegment;
111
112
return
StatusCode::SUCCESS;
113
}
114
115
StatusCode
TrigL2MuonSA::NswPatternFinder::outlierStgc
(
const
TrigL2MuonSA::MuonRoad
& muonRoad,
TrigL2MuonSA::TrackPattern
& trackPattern,
TrigL2MuonSA::StgcHits
& stgcHits)
const
116
{
117
TrigL2MuonSA::StgcHits
stgcSegment;
118
stgcSegment.clear();
119
120
const
int
chamber =
xAOD::L2MuonParameters::Chamber::EndcapInner
;
// NSW is located at endcap inner station
121
122
const
double
aw = muonRoad.
aw
[chamber][0];
123
const
double
bw = muonRoad.
bw
[chamber][0];
124
const
double
roadphi = muonRoad.
phi
[chamber][0];
125
126
double
z
= -1;
127
double
r
= -1;
128
double
phi
= -1;
129
double
residualR = -1;
130
double
residualPhi = -1;
131
unsigned
int
i_layer = 999;
132
double
rWidth = -1;
133
const
double
phiWidth = 0.1;
134
int
channelType = -1;
135
136
for
(
unsigned
int
i_hit=0; i_hit<stgcHits.size(); i_hit++) {
137
138
z
= stgcHits[i_hit].z;
139
r
= stgcHits[i_hit].r;
140
phi
= stgcHits[i_hit].phi;
141
i_layer = stgcHits[i_hit].layerNumber;
142
channelType = stgcHits[i_hit].channelType;
143
144
residualR =
calc_residualR
(aw,bw,
z
,
r
);
145
residualPhi =
calc_dPhi
(
phi
, roadphi);
146
147
stgcHits[i_hit].ResidualR = residualR;
148
stgcHits[i_hit].ResidualPhi = residualPhi;
149
150
if
(channelType==0) {
// pad
151
rWidth = muonRoad.
rWidth
[chamber][i_layer];
152
153
ATH_MSG_DEBUG
(
"Stgc pad .../z/r/aw/bw/residualR/residualPhi/rWidth="
154
<<
z
<<
"/"
<<
r
<<
"/"
<< aw <<
"/"
<< bw <<
"/"
<< residualR <<
"/"
<< residualPhi <<
"/"
<< rWidth);
155
156
157
if
( std::abs(residualPhi) > phiWidth ) {
// outside Road
158
stgcHits[i_hit].isOutlier = 3;
159
continue
;
160
}
161
if
( std::abs(residualR) > rWidth ) {
// outside Road
162
stgcHits[i_hit].isOutlier = 2;
163
continue
;
164
}
165
166
}
167
else
if
(channelType==1) {
// strip
168
rWidth = muonRoad.
rWidth
[chamber][i_layer];
169
170
ATH_MSG_DEBUG
(
"Stgc strip .../z/r/aw/bw/residualR/residualPhi/rWidth="
171
<<
z
<<
"/"
<<
r
<<
"/"
<< aw <<
"/"
<< bw <<
"/"
<< residualR <<
"/"
<< residualPhi <<
"/"
<< rWidth);
172
173
if
( std::abs(residualR) > rWidth ) {
// outside Road
174
stgcHits[i_hit].isOutlier = 2;
175
continue
;
176
}
177
178
}
179
else
if
(channelType==2) {
// wire
180
ATH_MSG_DEBUG
(
"Stgc wire .../z/r/aw/bw/residualR/residualPhi/rWidth="
181
<<
z
<<
"/"
<<
r
<<
"/"
<< aw <<
"/"
<< bw <<
"/"
<< residualR <<
"/"
<< residualPhi <<
"/"
<< rWidth);
182
183
if
( std::abs(residualPhi) > phiWidth ) {
// outside Road
184
stgcHits[i_hit].isOutlier = 3;
185
continue
;
186
}
187
188
}
189
190
191
stgcSegment.push_back(stgcHits[i_hit]);
192
}
193
194
trackPattern.
stgcSegment
= stgcSegment;
195
196
return
StatusCode::SUCCESS;
197
}
M_PI
#define M_PI
Definition
ActiveFraction.h:14
phi
Scalar phi() const
phi method
Definition
AmgMatrixBasePlugin.h:67
ATH_CHECK
#define ATH_CHECK
Evaluate an expression and check for errors.
Definition
AthCheckMacros.h:40
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition
AthMsgStreamMacros.h:29
ZERO_LIMIT
static const double ZERO_LIMIT
Definition
MuonMatchingTool.cxx:26
NswPatternFinder.h
TrigMuonDefs.h
y
#define y
x
#define x
z
#define z
AthAlgTool::AthAlgTool
AthAlgTool(const std::string &type, const std::string &name, const IInterface *parent)
Constructor with parameters:
Definition
AthAlgTool.cxx:16
TrigL2MuonSA::MuonRoad
Definition
MuonRoad.h:20
TrigL2MuonSA::MuonRoad::aw
double aw[N_STATION][N_SECTOR]
Definition
MuonRoad.h:83
TrigL2MuonSA::MuonRoad::bw
double bw[N_STATION][N_SECTOR]
Definition
MuonRoad.h:84
TrigL2MuonSA::MuonRoad::phi
double phi[N_STATION][N_SECTOR]
Definition
MuonRoad.h:85
TrigL2MuonSA::MuonRoad::rWidth
double rWidth[N_STATION][N_LAYER]
Definition
MuonRoad.h:86
TrigL2MuonSA::NswPatternFinder::findPatterns
StatusCode findPatterns(const TrigL2MuonSA::MuonRoad &muonRoad, TrigL2MuonSA::StgcHits &stgcHits, TrigL2MuonSA::MmHits &mmHits, TrigL2MuonSA::TrackPattern &trackPattern) const
Definition
NswPatternFinder.cxx:22
TrigL2MuonSA::NswPatternFinder::outlierStgc
StatusCode outlierStgc(const TrigL2MuonSA::MuonRoad &muonRoad, TrigL2MuonSA::TrackPattern &trackPattern, TrigL2MuonSA::StgcHits &stgcHits) const
Definition
NswPatternFinder.cxx:115
TrigL2MuonSA::NswPatternFinder::calc_dPhi
double calc_dPhi(const double hitphi, const double roadphi) const
Definition
NswPatternFinder.cxx:57
TrigL2MuonSA::NswPatternFinder::NswPatternFinder
NswPatternFinder(const std::string &type, const std::string &name, const IInterface *parent)
Definition
NswPatternFinder.cxx:12
TrigL2MuonSA::NswPatternFinder::outlierMm
StatusCode outlierMm(const TrigL2MuonSA::MuonRoad &muonRoad, TrigL2MuonSA::TrackPattern &trackPattern, TrigL2MuonSA::MmHits &mmHits) const
Definition
NswPatternFinder.cxx:68
TrigL2MuonSA::NswPatternFinder::calc_residualR
double calc_residualR(const double aw, const double bw, const double x, const double y) const
Definition
NswPatternFinder.cxx:47
TrigL2MuonSA::TrackPattern
Definition
TrackData.h:16
TrigL2MuonSA::TrackPattern::mmSegment
TrigL2MuonSA::MmHits mmSegment
Definition
TrackData.h:58
TrigL2MuonSA::TrackPattern::stgcSegment
TrigL2MuonSA::StgcHits stgcSegment
Definition
TrackData.h:59
r
int r
Definition
globals.cxx:22
TrigL2MuonSA::StgcHits
std::vector< StgcHitData > StgcHits
Definition
StgcData.h:49
TrigL2MuonSA::MmHits
std::vector< MmHitData > MmHits
Definition
MmData.h:47
xAOD::L2MuonParameters::EndcapInner
@ EndcapInner
Inner station in the endcap spectrometer.
Definition
TrigMuonDefs.h:19
type
Generated on
for ATLAS Offline Software by
1.17.0