ATLAS Offline Software
Loading...
Searching...
No Matches
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"
7#include <cmath>
8
9// --------------------------------------------------------------------------------
10// --------------------------------------------------------------------------------
11
13 const std::string& name,
14 const IInterface* parent):
15 AthAlgTool(type,name,parent)
16{
17}
18
19// --------------------------------------------------------------------------------
20// --------------------------------------------------------------------------------
21
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
47double 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
57double 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
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
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}
#define M_PI
Scalar phi() const
phi method
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_DEBUG(x)
#define y
#define x
#define z
const float ZERO_LIMIT
AthAlgTool(const std::string &type, const std::string &name, const IInterface *parent)
Constructor with parameters:
double aw[N_STATION][N_SECTOR]
Definition MuonRoad.h:83
double bw[N_STATION][N_SECTOR]
Definition MuonRoad.h:84
double phi[N_STATION][N_SECTOR]
Definition MuonRoad.h:85
double rWidth[N_STATION][N_LAYER]
Definition MuonRoad.h:86
StatusCode findPatterns(const TrigL2MuonSA::MuonRoad &muonRoad, TrigL2MuonSA::StgcHits &stgcHits, TrigL2MuonSA::MmHits &mmHits, TrigL2MuonSA::TrackPattern &trackPattern) const
StatusCode outlierStgc(const TrigL2MuonSA::MuonRoad &muonRoad, TrigL2MuonSA::TrackPattern &trackPattern, TrigL2MuonSA::StgcHits &stgcHits) const
double calc_dPhi(const double hitphi, const double roadphi) const
NswPatternFinder(const std::string &type, const std::string &name, const IInterface *parent)
StatusCode outlierMm(const TrigL2MuonSA::MuonRoad &muonRoad, TrigL2MuonSA::TrackPattern &trackPattern, TrigL2MuonSA::MmHits &mmHits) const
double calc_residualR(const double aw, const double bw, const double x, const double y) const
TrigL2MuonSA::MmHits mmSegment
Definition TrackData.h:58
TrigL2MuonSA::StgcHits stgcSegment
Definition TrackData.h:59
int r
Definition globals.cxx:22
std::vector< StgcHitData > StgcHits
Definition StgcData.h:49
std::vector< MmHitData > MmHits
Definition MmData.h:47
@ EndcapInner
Inner station in the endcap spectrometer.