26 return StatusCode::SUCCESS;
29std::unique_ptr<CompetingMuonClustersOnTrack>
31 const std::list<const Trk::PrepRawData*>& prds,
const double)
const {
32 ATH_MSG_VERBOSE(
"enter createBroadCluster: number of prds " << prds.size());
40 Identifier channelId = (*prds.front()).identify();
43 if (!isRpc && !isTgc) {
48 const bool measuresPhi =
m_idHelperSvc->measuresPhi(channelId);
50 channelId = prd->identify();
55 if (prd->detectorElement() != detectorElement) {
61 <<
", nDim: " << prd->localCovariance().rows());
65 std::vector<std::unique_ptr<const Muon::MuonClusterOnTrack>> rots =
createPrdRots(prds);
66 auto assocProbs = std::vector<double>(rots.size(), 0.);
69 std::list<int> limitingChannels;
70 std::vector<std::unique_ptr<const Muon::MuonClusterOnTrack>> limitingRots;
79 std::unique_ptr<Trk::Surface> surface{};
84 limitingChannels.clear();
88 return std::make_unique<CompetingMuonClustersOnTrack>(
89 std::move(parameters), std::move(errorMatrix), surface.release(),
90 std::move(rots), std::move(assocProbs));
94 std::list<int>& limitingChannels,
95 std::vector<std::unique_ptr<const Muon::MuonClusterOnTrack>>& limitingRots)
const {
97 int numClusters = limitingChannels.size() / 2;
100 for (std::list<int>::iterator l = limitingChannels.begin();
101 l != limitingChannels.end() &&
102 l != std::prev(limitingChannels.end());) {
105 int size = std::abs(end - beg);
106 sizeMax = std::max(sizeMax,
size);
107 sizeMin = std::min(sizeMin,
size);
110 std::list<int>::iterator discard = limitingChannels.end();
111 for (std::list<int>::iterator l = limitingChannels.begin();
112 l != limitingChannels.end() &&
113 l != std::prev(limitingChannels.end());) {
114 std::list<int>::iterator first = l;
117 int size = std::abs(end - beg);
125 if (discard == limitingChannels.begin()) {
127 limitingRots.erase(limitingRots.begin());
128 limitingRots.erase(limitingRots.begin());
129 limitingChannels.pop_front();
130 limitingChannels.pop_front();
131 }
else if (discard != limitingChannels.end()) {
133 limitingRots.pop_back();
134 limitingRots.pop_back();
135 limitingChannels.pop_back();
136 limitingChannels.pop_back();
140std::vector<std::unique_ptr<const Muon::MuonClusterOnTrack>>
142 const std::list<const Trk::PrepRawData*>& prds)
const {
144 std::vector<std::unique_ptr<const Muon::MuonClusterOnTrack>> rots{};
149 std::optional<int> dim{};
154 std::unique_ptr<const Muon::MuonClusterOnTrack> cluster{
162 dim = cluster->localCovariance().cols();
163 }
else if ((*dim) != cluster->localCovariance().cols()) {
165 <<
" does not match "<<(*dim));
168 rots.push_back(std::move(cluster));
174 std::list<int>& limitingChannels,
175 std::vector<std::unique_ptr<const Muon::MuonClusterOnTrack>>& limitingRots,
176 const std::list<const Trk::PrepRawData*>& prds,
177 const std::vector<std::unique_ptr<const Muon::MuonClusterOnTrack>>& rots)
const {
182 std::unordered_set<const Trk::PrepRawData*> usedPrd;
183 std::vector<std::unique_ptr<const Muon::MuonClusterOnTrack>>
::const_iterator r = rots.begin();
184 for (std::list<const Trk::PrepRawData*>::const_iterator p = prds.begin();
185 p != prds.end(); ++p, ++
r) {
188 if (!usedPrd.insert(prd).second) {
202 int channelMax = channel;
203 int channelMin = channel;
205 std::list<const Trk::PrepRawData*>::const_iterator q = p;
206 std::vector<std::unique_ptr<const Muon::MuonClusterOnTrack>>
::const_iterator s =
r;
207 for (++q, ++s; q != prds.end(); ++q, ++s) {
208 const Identifier channelId1 = (**q).identify();
209 if ((isRpc &&
m_idHelperSvc->rpcIdHelper().gasGap(channelId1) != gasGap) ||
210 (!isRpc &&
m_idHelperSvc->tgcIdHelper().gasGap(channelId1) != gasGap)) {
219 if (channel > channelMax) {
220 channelMax = channel;
223 if (channel < channelMin) {
224 channelMin = channel;
228 limitingChannels.push_back(channelMin);
229 limitingChannels.push_back(channelMax);
230 limitingRots.emplace_back(rotMin->clone());
231 limitingRots.emplace_back(rotMax->
clone());
234 <<
", " << limitingRots.size());
239 std::unique_ptr<Trk::Surface>& surface, std::list<int>& limitingChannels,
240 std::vector<std::unique_ptr<const Muon::MuonClusterOnTrack>>& limitingRots)
const {
242 std::vector<std::unique_ptr<const Muon::MuonClusterOnTrack>>
::const_iterator r = limitingRots.begin();
250 r != limitingRots.end();
253 centre += (**r).associatedSurface().center();
254 covariance += (**r).localCovariance();
255 parameters += (**r).localParameters();
257 const double norm = 1. /
static_cast<double>(limitingRots.size());
258 std::list<int>::iterator l = limitingChannels.begin();
259 int firstChannel = *l;
260 double width =
static_cast<double>(1 + std::abs(*(++l) - firstChannel));
261 if (limitingRots.size() > 2)
263 int offset = std::abs(*(++l) - firstChannel);
264 if (!isRpc && offset < 2) {
267 width +=
static_cast<double>(offset);
277 <<
", covariance: "<<covariance<<
", parameters: "<<parameters<<
" , limiting ROTs: "<<limitingRots.size());
281 const Trk::Surface& surf = (**limitingRots.begin()).associatedSurface();
283 if (
const auto* rectbds =
285 surface = std::make_unique<Trk::PlaneSurface>(
286 surf.
transform(), std::make_unique<Trk::RectangleBounds>(*rectbds));
287 }
else if (
const auto* trapbds =
289 surface = std::make_unique<Trk::PlaneSurface>(
290 surf.
transform(), std::make_unique<Trk::TrapezoidBounds>(*trapbds));
291 }
else if (
const auto* rottrapbds =
294 surface = std::make_unique<Trk::PlaneSurface>(
296 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.
Gaudi::Property< bool > m_chooseBroadestCluster
void makeClustersBySurface(std::list< int > &limitingChannels, std::vector< std::unique_ptr< const Muon::MuonClusterOnTrack > > &limitingRots, const std::list< const Trk::PrepRawData * > &prds, const std::vector< std::unique_ptr< const Muon::MuonClusterOnTrack > > &rots) 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
std::vector< std::unique_ptr< const Muon::MuonClusterOnTrack > > createPrdRots(const std::list< const Trk::PrepRawData * > &prds) 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.