50{
52
53 auto meas_keep = DataVector<const Trk::MeasurementBase>();
54
55
60
61
63 std::vector<const Trk::MeasurementBase*>::const_iterator mit = meas.begin();
64 std::vector<const Trk::MeasurementBase*>::const_iterator mit_end = meas.end();
65
66 int nphirpc = 0;
67 int nphitgc = 0;
68 int nphicsc = 0;
69 int netamdt = 0;
70 int netarpc = 0;
71 int netatgc = 0;
72 int netacsc = 0;
73
74 std::vector<const Trk::RIO_OnTrack*> rots;
75 std::vector<const Trk::CompetingRIOsOnTrack*> crots;
76 rots.reserve(2*meas.size());
77 crots.reserve(2*meas.size());
78
79 for( ; mit!=mit_end;++mit ){
80
81
82 const Trk::RIO_OnTrack* rot = dynamic_cast<const Trk::RIO_OnTrack*>(*mit);
83 if (rot)
84 {
85 rots.push_back(rot);
86 crots.push_back(nullptr);
87 }
88
89 else
90 {
91 const Trk::CompetingRIOsOnTrack* crio = dynamic_cast<const Trk::CompetingRIOsOnTrack*>(*mit);
92 if (crio)
93 {
95 {
97 rots.push_back(rot);
98 crots.push_back(crio);
99 }
100 }
101 }
102 }
103
104 unsigned int nMeas = rots.size();
105 unsigned int nphi = 0;
106
107
108 std::vector <const Trk::RIO_OnTrack*> rots_phi(nMeas);
109 std::vector <const Trk::CompetingRIOsOnTrack*> crots_phi(nMeas);
110 std::vector <const Trk::MeasurementBase*> meas_phi(nMeas);
111 std::vector <double> dis_phi(nMeas);
112 std::vector <int> chambercode_phi(nMeas);
113 std::vector <int> stripcode_phi(nMeas);
114 std::vector <int> ok_phi(nMeas);
115 std::vector <int> det_phi(nMeas);
116 std::vector <Identifier> id_phi(nMeas);
117
118 if (
m_debug) std::cout <<
" MuonSegmentAmbiCleanerTool nMeas " << nMeas <<
" competing rios: " << crots.size() << std::endl;
119
120 for (
unsigned int i=0;
i<rots.size();
i++){
121
122 const Trk::RIO_OnTrack* rot = rots[
i];
126 meas_keep.push_back(rot->
clone());
127 netamdt++;
128 continue;
131 meas_keep.push_back(rot->
clone());
132 netarpc++;
133 continue ;
134 }
137 meas_keep.push_back(rot->
clone());
138 netatgc++;
139 continue;
140 }
142 meas_keep.push_back(rot->
clone());
144 netacsc++;
145 } else {
146 nphicsc++;
147 }
148 continue;
149 }
150
151
153 rots_phi[nphi] = rot;
154 crots_phi[nphi] = crots[
i];
155 chambercode_phi[nphi] = 0;
156 stripcode_phi[nphi] = 0;
157 ok_phi[nphi] = 0;
158 det_phi[nphi] = 0;
159 dis_phi[nphi] = 10000000;
161 nphirpc++;
164 chambercode_phi[nphi] =
code;
165 stripcode_phi[nphi] =
m_idHelperSvc->rpcIdHelper().strip(
id);
166 ok_phi[nphi] = 1;
167 det_phi[nphi] = 1;
168 const Muon::RpcClusterOnTrack* rrot = dynamic_cast<const Muon::RpcClusterOnTrack*>(rot);
169 if( !rrot ){
171 continue;
172 }
173 const Muon::RpcPrepData* rprd = rrot->
prepRawData();
176
177
178 double disRPC = lSegmentPos.z() - lHitPos.z() + lSegmentDir.z()*(lHitPos.y()-lSegmentPos.y())/lSegmentDir.y();
180 std::cout << " ghit pos x " << gHitPos.x() << " y " << gHitPos.y() << " z " << gHitPos.z() << std::endl;
181 std::cout << " dis RPC " << disRPC << std::endl;
182 }
183 dis_phi[nphi] = disRPC;
185 nphitgc++;
188 chambercode_phi[nphi] =
code;
189 stripcode_phi[nphi] =
m_idHelperSvc->tgcIdHelper().channel(
id);
190 ok_phi[nphi] = 1;
191 det_phi[nphi] = 2;
192
193 const Muon::TgcClusterOnTrack* rrot = dynamic_cast<const Muon::TgcClusterOnTrack*>(rot);
194 if( !rrot ){
196 continue;
197 }
198 const Muon::TgcPrepData* rprd = rrot->
prepRawData();
201
202 double disTGC = lSegmentPos.y() - lHitPos.y() + lSegmentDir.y()*(lHitPos.z()-lSegmentPos.z())/lSegmentDir.z();
204 std::cout << " ghit pos x " << gHitPos.x() << " y " << gHitPos.y() << " z " << gHitPos.z() << std::endl;
205 std::cout << " dis TGC " << disTGC << std::endl;
206 }
207 dis_phi[nphi] = disTGC;
208 } else {
209 dis_phi[nphi] = 0.;
210 }
211 if (
m_debug) std::cout <<
" Distance to segment " << dis_phi[nphi] << std::endl;
212 if (ok_phi[nphi] == 1 ) nphi++;
213 }
214
215
216 bool changeSegment = false;
217 int nphirpcn = 0;
218 int nphitgcn = 0;
219 if (nphi > 0) {
220 for(
unsigned int i = 0;
i < nphi-1 ; ++
i ) {
221 if (ok_phi[i] == 0) continue;
222 for(unsigned int j = i+1 ; j < nphi ; ++j ) {
223 if (ok_phi[j] == 0) continue;
224 bool ambi = false;
225 if ( stripcode_phi[i] == stripcode_phi[j] && chambercode_phi[i] == chambercode_phi[j] ) ambi = true;
226 if ( ambi ) {
227 Identifier id1 = id_phi[
i];
228 Identifier
id2 = id_phi[j];
229 if (det_phi[i] == 1 && det_phi[j] == 1 &&
m_debug) {
232 }
233 if (det_phi[i] == 2 && det_phi[j] == 2 &&
m_debug) {
236 }
237
238 if (
m_debug) {
ATH_MSG_DEBUG(
" Ambiguous " <<
" Distance1 " << dis_phi[i] <<
" Distance1 " << dis_phi[j]); }
239 if (dis_phi[i]!= 0.&& dis_phi[j]!=0) {
240 if ( fabs(dis_phi[i]) < fabs(dis_phi[j]) ) {
241 ok_phi[j] = 0;
242 } else {
244 }
245 }
249 ATH_MSG_DEBUG(
" index " << i <<
" strip " << stripcode_phi [i] <<
" chambercode " << chambercode_phi[i] <<
" selected " << ok_phi[i] <<
" segment distance " << dis_phi[i]);
250 ATH_MSG_DEBUG(
" index " << j <<
" strip " << stripcode_phi [j] <<
" chambercode " << chambercode_phi[j] <<
" selected " << ok_phi[j] <<
" segment distance " << dis_phi[j]);
251 }
252 }
253 }
254 }
255
256
257
258 for(
unsigned int i = 0;
i < nphi ;
i++ ) {
259 if (ok_phi[i] == 0)
260 {
261 for(unsigned int j = 0; j < nphi ; j++ ) {
262 if (crots_phi[j] == crots_phi[i] && j!=i)
263 {
264 crots_phi[j]=nullptr;
265 }
266 }
267 crots_phi[
i]=
nullptr;
268 }
269 }
270
271
272
273
274 std::set <const Trk::CompetingRIOsOnTrack*> selected_crots;
275
276 for (
unsigned int i=0;
i<nphi;++
i){
277 if (ok_phi[i] == 1) {
278 if (!crots_phi[i])
279 {
280 if (det_phi[i] == 1) nphirpcn++;
281 if (det_phi[i] == 2) nphitgcn++;
282 meas_keep.push_back(rots_phi[i]->
clone());
283 }
284 else if (selected_crots.count(crots_phi[i]) == 0)
285 {
286 meas_keep.push_back(crots_phi[i]->
clone());
287 selected_crots.insert(crots_phi[i]);
288 if (det_phi[i] == 1) nphirpcn++;
289 if (det_phi[i] == 2) nphitgcn++;
290 }
291 } if (ok_phi[i] == 0 && (det_phi[i] == 1||det_phi[i] == 2)) {
292 changeSegment = true;
293 }
294 }
295 }
296
298 std::cout << " Summary MuonSegmentAmbiCleaner (not accurate with competing rios!)" << std::endl;
299 std::cout << " Input Segment with " << netamdt << " MDT hits " << netacsc << " eta CSC hits " << netatgc << " eta TGC Hits " << netarpc << " eta RPC hits " << std::endl;
300 std::cout << " and " << nphicsc << " phi CSC hits " << nphitgc << " phi TGC Hits " << nphirpc << " phi RPC hits " << std::endl;
301 std::cout << " Output after Ambiguity removal " << nphitgcn << " phi TGC Hits " << nphirpcn << " phi RPC hits " << std::endl;
302 }
303
304
305
306
307
308
309
310
311
312
313 const Trk::LocalDirection locSegmentDir(segment->
localDirection());
314 Amg::Vector2D locSegmentPos(lSegmentPos.x(),lSegmentPos.y());
316 Muon::MuonSegment* newSegment = new Muon::MuonSegment(locSegmentPos,
317 locSegmentDir,
319 psf,
320 std::move(meas_keep),
321 fitQuality);
322
323 return newSegment;
324}
#define ATH_MSG_WARNING(x)
const Trk::LocalDirection & localDirection() const
local direction
const Amg::Vector3D & globalDirection() const
global direction
virtual const Amg::Vector3D & globalPosition() const override final
global position
virtual const Trk::PlaneSurface & associatedSurface() const override final
returns the surface for the local to global transformation
virtual const RpcPrepData * prepRawData() const override final
Returns the RpcPrepData - is a TRT_DriftCircle in this scope.
virtual const Amg::Vector3D & globalPosition() const override
Returns the global position.
virtual const TgcPrepData * prepRawData() const
Returns the TgcPrepData - is a TRT_DriftCircle in this scope.
virtual const Amg::Vector3D & globalPosition() const override final
Returns the global position.
virtual unsigned int numberOfContainedROTs() const =0
Number of RIO_OnTracks to be contained by this CompetingRIOsOnTrack.
virtual const RIO_OnTrack & rioOnTrack(unsigned int) const =0
returns the RIO_OnTrack (also known as ROT) objects depending on the integer.
virtual FitQuality * clone() const
Virtual constructor.
const Amg::MatrixX & localCovariance() const
Interface method to get the localError.
Identifier identify() const
return the identifier
virtual RIO_OnTrack * clone() const override=0
Pseudo-constructor, needed to avoid excessive RTTI.
virtual const Trk::PrepRawData * prepRawData() const =0
returns the PrepRawData (also known as RIO) object to which this RIO_OnTrack is associated.
Identifier identify() const
return the identifier -extends MeasurementBase
const FitQuality * fitQuality() const
return the FitQuality object, returns NULL if no FitQuality is defined
const std::vector< const Trk::MeasurementBase * > & containedMeasurements() const
returns the vector of Trk::MeasurementBase objects
const Amg::Transform3D & transform() const
Returns HepGeom::Transform3D by reference.
Eigen::Matrix< double, Eigen::Dynamic, Eigen::Dynamic > MatrixX
Dynamic Matrix - dynamic allocation.
Eigen::Affine3d Transform3D
Eigen::Matrix< double, 2, 1 > Vector2D
Eigen::Matrix< double, 3, 1 > Vector3D
constexpr uint8_t stationEta
1 to 3
FitQualityOnSurface fitQuality(const MultiComponentState &, const MeasurementBase &)
Method for determining the chi2 of the multi-component state and the number of degrees of freedom.