24 m_chooseBroadestCluster(true)
26 declareInterface<Muon::IMuonCompetingClustersOnTrackCreator>(
this);
35 return StatusCode::SUCCESS;
38 std::unique_ptr<CompetingMuonClustersOnTrack>
40 ATH_MSG_VERBOSE(
"enter createBroadCluster: number of prds " << prds.size() );
47 if (!(*prds.begin())) {
63 for (std::list<const Trk::PrepRawData*>::const_iterator
p = prds.begin();
p != prds.end(); ++
p) {
73 if ((**p).detectorElement() != detectorElement) {
80 std::vector<const Muon::MuonClusterOnTrack*> rots =
createPrdRots(prds);
81 auto assocProbs = std::vector<double>(rots.size(), 0.);
85 std::list<int> limitingChannels;
86 std::list<const Muon::MuonClusterOnTrack*> limitingRots;
99 limitingChannels.clear();
103 return std::make_unique<CompetingMuonClustersOnTrack>(
104 std::move(
parameters), std::move(errorMatrix), surface, std::move(rots), std::move(assocProbs));
109 std::list<int>& limitingChannels,
110 std::list<const Muon::MuonClusterOnTrack*>& limitingRots)
const
113 int numClusters = limitingChannels.size()/2;
117 l != limitingChannels.end() &&
l != std::prev(limitingChannels.end());
120 int size = abs(*
l - *(++
l));
127 l != limitingChannels.end() &&
l != std::prev(limitingChannels.end());
131 int size = abs(*
l - *(++
l));
135 if (discard == limitingChannels.begin())
138 limitingRots.pop_front();
139 limitingRots.pop_front();
140 limitingChannels.pop_front();
141 limitingChannels.pop_front();
143 else if (discard != limitingChannels.end())
146 limitingRots.pop_back();
147 limitingRots.pop_back();
148 limitingChannels.pop_back();
149 limitingChannels.pop_back();
155 auto rots = std::vector<const Muon::MuonClusterOnTrack*>();
160 if (!(*prds.begin())) {
164 for (std::list<const Trk::PrepRawData*>::const_iterator
p = prds.begin();
p != prds.end(); ++
p) {
173 rots.push_back(cluster);
184 if (!(*prds.begin())) {
185 ATH_MSG_WARNING(
"makeClustersBySurface - first element of RPD list is nullptr");
188 std::vector<const Trk::PrepRawData*> usedPrd;
189 std::vector<const Muon::MuonClusterOnTrack*>::const_iterator
r = rots.begin();
190 for (std::list<const Trk::PrepRawData*>::const_iterator
p = prds.begin();
p != prds.end(); ++
p, ++
r) {
192 ATH_MSG_WARNING(
"makeClustersBySurface - current PrepRawData is nullptr, continuing");
195 if (
std::find(usedPrd.begin(),usedPrd.end(),*
p) != usedPrd.end())
continue;
196 usedPrd.push_back(*
p);
216 std::list<const Trk::PrepRawData*>::const_iterator
q =
p;
217 std::vector<const Muon::MuonClusterOnTrack*>::const_iterator
s =
r;
218 for (++
q, ++
s;
q != prds.end(); ++
q, ++
s) {
220 ATH_MSG_WARNING(
"makeClustersBySurface - current PrepRawData is nullptr, continuing");
226 usedPrd.push_back(*
q);
247 limitingChannels.push_back(channelMin);
248 limitingChannels.push_back(channelMax);
249 limitingRots.push_back(rotMin);
250 limitingRots.push_back(rotMax);
256 std::list<int>::const_iterator
l = limitingChannels.begin();
257 std::list<int>::const_iterator
m = limitingChannels.begin();
259 int size = abs(*
l - *(++
m));
260 for (std::vector<const Trk::PrepRawData*>::const_iterator
q = usedPrd.begin();
270 << std::setiosflags(std::ios::fixed)
272 << std::setw(8) << std::setprecision(1) << (**q).localPosition()[
Trk::locX]
273 << std::setw(8) << std::setprecision(1) << (**q).localPosition()[
Trk::locY]
279 <<
" station " <<
m_idHelperSvc->rpcIdHelper().stationNameString(stationIndex)
286 << std::setiosflags(std::ios::fixed)
288 << std::setw(8) << std::setprecision(1) << (**q).localPosition()[
Trk::locX]
289 << std::setw(8) << std::setprecision(1) << (**q).localPosition()[
Trk::locY]
292 <<
" station " <<
m_idHelperSvc->tgcIdHelper().stationNameString(stationIndex)
298 <<
" between channels " << *
l <<
" and " << *
m );
299 if (++
m != limitingChannels.end())
302 size = 1 + abs(*(++
l) - *(++
m));
314 std::list<int>& limitingChannels,
315 std::list<const Muon::MuonClusterOnTrack*>& limitingRots)
const
319 std::list<const Muon::MuonClusterOnTrack*>::const_iterator
r = limitingRots.begin();
328 r != limitingRots.end();
331 centre += (**r).associatedSurface().center();
332 covariance += (**r).localCovariance();
336 norm /=
static_cast<double>(limitingRots.size());
338 int firstChannel = *
l;
339 double width =
static_cast<double>(1 + abs(*(++
l) - firstChannel));
340 if (limitingRots.size() > 2)
342 int offset = abs(*(++
l) - firstChannel);
343 if (!isRpc &&
offset < 2) {
358 const Trk::Surface& surf = (**limitingRots.begin()).associatedSurface();
360 std::string shape =
"";
368 shape =
" RPC rectangle ";
373 shape =
" TGC trapezoid ";
380 shape =
" TGC rotatedTrapezoid ";
383 rottrapbds->
clone());
396 i != limitingChannels.end();