26 return StatusCode::SUCCESS;
29std::unique_ptr<CompetingMuonClustersOnTrack>
31 const std::list<const Trk::PrepRawData*>& prdList,
const double)
const {
32 ATH_MSG_VERBOSE(
"enter createBroadCluster: number of prds " << prdList.size());
35 if (prdList.empty()) {
39 std::vector<const Trk::PrepRawData*> prds{prdList.begin(), prdList.end()};
41 Identifier channelId = (*prds.front()).identify();
44 if (!isRpc && !isTgc) {
49 const bool measuresPhi =
m_idHelperSvc->measuresPhi(channelId);
51 channelId = prd->identify();
56 if (prd->detectorElement() != detectorElement) {
62 <<
", nDim: " << prd->localCovariance().rows());
66 std::vector<std::unique_ptr<const Muon::MuonClusterOnTrack>> rots =
createPrdRots(prds);
67 auto assocProbs = std::vector<double>(rots.size(), 0.);
70 std::list<int> limitingChannels;
71 std::vector<std::unique_ptr<const Muon::MuonClusterOnTrack>> limitingRots;
80 std::unique_ptr<Trk::Surface> surface{};
85 limitingChannels.clear();
89 return std::make_unique<CompetingMuonClustersOnTrack>(
90 std::move(parameters), std::move(errorMatrix), surface.release(),
91 std::move(rots), std::move(assocProbs));
95 std::list<int>& limitingChannels,
96 std::vector<std::unique_ptr<const Muon::MuonClusterOnTrack>>& limitingRots)
const {
98 int numClusters = limitingChannels.size() / 2;
101 for (std::list<int>::iterator l = limitingChannels.begin();
102 l != limitingChannels.end() &&
103 l != std::prev(limitingChannels.end());) {
106 int size = std::abs(end - beg);
107 sizeMax = std::max(sizeMax,
size);
108 sizeMin = std::min(sizeMin,
size);
111 std::list<int>::iterator discard = limitingChannels.end();
112 for (std::list<int>::iterator l = limitingChannels.begin();
113 l != limitingChannels.end() &&
114 l != std::prev(limitingChannels.end());) {
115 std::list<int>::iterator first = l;
118 int size = std::abs(end - beg);
126 if (discard == limitingChannels.begin()) {
128 limitingRots.erase(limitingRots.begin());
129 limitingRots.erase(limitingRots.begin());
130 limitingChannels.pop_front();
131 limitingChannels.pop_front();
132 }
else if (discard != limitingChannels.end()) {
134 limitingRots.pop_back();
135 limitingRots.pop_back();
136 limitingChannels.pop_back();
137 limitingChannels.pop_back();
141std::vector<std::unique_ptr<const Muon::MuonClusterOnTrack>>
143 std::vector<const Trk::PrepRawData*>& prds)
const {
145 std::vector<std::unique_ptr<const Muon::MuonClusterOnTrack>> rots{};
150 std::optional<int> dim{};
155 std::unique_ptr<const Muon::MuonClusterOnTrack> cluster{
163 dim = cluster->localCovariance().cols();
164 }
else if ((*dim) != cluster->localCovariance().cols()) {
166 <<
" does not match "<<(*dim));
169 rots.push_back(std::move(cluster));
171 if (rots.size() != prds.size()) {
172 auto [begin, end] = std::ranges::remove_if(prds, [&](
const Trk::PrepRawData* prd){
173 return std::ranges::none_of(rots, [prd](
const std::unique_ptr<const Muon::MuonClusterOnTrack>& rot){
174 return rot->identify() == prd->
identify();
177 prds.erase(begin, end);
183 std::list<int>& limitingChannels,
184 std::vector<std::unique_ptr<const Muon::MuonClusterOnTrack>>& limitingRots,
185 const std::vector<const Trk::PrepRawData*>& prds,
186 const std::vector<std::unique_ptr<const Muon::MuonClusterOnTrack>>& rots)
const {
191 std::unordered_set<const Trk::PrepRawData*> usedPrd;
192 std::vector<std::unique_ptr<const Muon::MuonClusterOnTrack>>
::const_iterator r = rots.begin();
193 for (std::vector<const Trk::PrepRawData*>::const_iterator p = prds.begin();
194 p != prds.end(); ++p, ++
r) {
197 if (!usedPrd.insert(prd).second) {
211 int channelMax = channel;
212 int channelMin = channel;
214 std::vector<const Trk::PrepRawData*>::const_iterator q = p;
215 std::vector<std::unique_ptr<const Muon::MuonClusterOnTrack>>
::const_iterator s =
r;
216 for (++q, ++s; q != prds.end(); ++q, ++s) {
217 const Identifier channelId1 = (**q).identify();
218 if ((isRpc &&
m_idHelperSvc->rpcIdHelper().gasGap(channelId1) != gasGap) ||
219 (!isRpc &&
m_idHelperSvc->tgcIdHelper().gasGap(channelId1) != gasGap)) {
228 if (channel > channelMax) {
229 channelMax = channel;
232 if (channel < channelMin) {
233 channelMin = channel;
237 limitingChannels.push_back(channelMin);
238 limitingChannels.push_back(channelMax);
239 limitingRots.emplace_back(rotMin->clone());
240 limitingRots.emplace_back(rotMax->
clone());
243 <<
", " << limitingRots.size());
248 std::unique_ptr<Trk::Surface>& surface, std::list<int>& limitingChannels,
249 std::vector<std::unique_ptr<const Muon::MuonClusterOnTrack>>& limitingRots)
const {
251 std::vector<std::unique_ptr<const Muon::MuonClusterOnTrack>>
::const_iterator r = limitingRots.begin();
259 r != limitingRots.end();
262 centre += (**r).associatedSurface().center();
263 covariance += (**r).localCovariance();
264 parameters += (**r).localParameters();
266 const double norm = 1. /
static_cast<double>(limitingRots.size());
267 std::list<int>::iterator l = limitingChannels.begin();
268 int firstChannel = *l;
269 double width =
static_cast<double>(1 + std::abs(*(++l) - firstChannel));
270 if (limitingRots.size() > 2)
272 int offset = std::abs(*(++l) - firstChannel);
273 if (!isRpc && offset < 2) {
276 width +=
static_cast<double>(offset);
286 <<
", covariance: "<<covariance<<
", parameters: "<<parameters<<
" , limiting ROTs: "<<limitingRots.size());
290 const Trk::Surface& surf = (**limitingRots.begin()).associatedSurface();
292 if (
const auto* rectbds =
294 surface = std::make_unique<Trk::PlaneSurface>(
295 surf.
transform(), std::make_unique<Trk::RectangleBounds>(*rectbds));
296 }
else if (
const auto* trapbds =
298 surface = std::make_unique<Trk::PlaneSurface>(
299 surf.
transform(), std::make_unique<Trk::TrapezoidBounds>(*trapbds));
300 }
else if (
const auto* rottrapbds =
303 surface = std::make_unique<Trk::PlaneSurface>(
305 std::make_unique<Trk::RotatedTrapezoidBounds>(*rottrapbds));
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_VERBOSE(x)
#define ATH_MSG_WARNING(x)
size_t size() const
Number of registered mappings.
Base class for Muon cluster RIO_OnTracks.
virtual MuonClusterOnTrack * clone() const override=0
Clone this ROT.
void makeClustersBySurface(std::list< int > &limitingChannels, std::vector< std::unique_ptr< const Muon::MuonClusterOnTrack > > &limitingRots, const std::vector< const Trk::PrepRawData * > &prds, const std::vector< std::unique_ptr< const Muon::MuonClusterOnTrack > > &rots) const
Gaudi::Property< bool > m_chooseBroadestCluster
std::vector< std::unique_ptr< const Muon::MuonClusterOnTrack > > createPrdRots(std::vector< const Trk::PrepRawData * > &prds) const
std::unique_ptr< CompetingMuonClustersOnTrack > createBroadCluster(const std::list< const Trk::PrepRawData * > &, const double) const
method to create a CompetingMuonClustersOnTrack using the PrepRawData hits and a scaled factor for th...
void makeOverallParameters(Trk::LocalParameters ¶meters, Amg::MatrixX &errorMatrix, std::unique_ptr< Trk::Surface > &surface, std::list< int > &limitingChannels, std::vector< std::unique_ptr< const Muon::MuonClusterOnTrack > > &limitingRots) const
ServiceHandle< Muon::IMuonIdHelperSvc > m_idHelperSvc
ToolHandle< Muon::IMuonClusterOnTrackCreator > m_clusterCreator
void applyClusterConsistency(std::list< int > &limitingChannels, std::vector< std::unique_ptr< const Muon::MuonClusterOnTrack > > &limitingRots) const
Identifier identify() const
return the identifier
Bounds for a rectangular, planar surface.
Bounds for a rotated trapezoidal, planar Surface.
Abstract Base Class for tracking surfaces.
const Amg::Transform3D & transform() const
Returns HepGeom::Transform3D by reference.
virtual const SurfaceBounds & bounds() const =0
Surface Bounds method.
Bounds for a trapezoidal, planar Surface.
This is the base class for all tracking detector elements with read-out relevant information.
virtual const Amg::Vector3D & center() const =0
Return the center of the element.
std::string toString(const Translation3D &translation, int precision=4)
GeoPrimitvesToStringConverter.
Eigen::Matrix< double, Eigen::Dynamic, Eigen::Dynamic > MatrixX
Dynamic Matrix - dynamic allocation.
Eigen::Matrix< double, 3, 1 > Vector3D
NRpcCablingAlg reads raw condition data and writes derived condition data to the condition store.