ATLAS Offline Software
CombinatorialNSWSeedFinderAlg.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3 */
4 
6 
10 
16 
19 
21 
22 #include <ranges>
23 #include <vector>
24 #include <unordered_set>
25 #include <nlohmann/json.hpp>
26 #include <format>
27 #include <fstream>
28 
29 
30 namespace {
31  inline const MuonGMR4::StripDesign& getDesign(const MuonR4::SpacePoint& sp) {
33  const auto* prd = static_cast<const xAOD::MMCluster*>(sp.primaryMeasurement());
34  return prd->readoutElement()->stripLayer(prd->measurementHash()).design();
35  } else if (sp.type() == xAOD::UncalibMeasType::sTgcStripType) {
36  const auto* prd = static_cast<const xAOD::sTgcMeasurement*>(sp.primaryMeasurement());
37  const auto* re = prd->readoutElement();
38  switch(prd->channelType()) {
40  return re->stripDesign(prd->measurementHash());
41  case sTgcIdHelper::Wire:
42  return re->wireDesign(prd->measurementHash());
43  case sTgcIdHelper::Pad:
44  return re->padDesign(prd->measurementHash());
45 
46  }
47  }
48  THROW_EXCEPTION("Invalid space point for design retrival "<<sp.msSector()->idHelperSvc()->toString(sp.identify()));
49  }
50  inline double stripHalfLength(const MuonR4::SpacePoint& sp) {
51  const auto& design = getDesign(sp);
53  const auto* prd = static_cast<const xAOD::MMCluster*>(sp.primaryMeasurement());
54  return 0.5* design.stripLength(prd->channelNumber());
55  }
56  return 0.;
57  }
58 }
59 
60 namespace MuonR4 {
61 
62 using namespace SegmentFitHelpers;
63 constexpr unsigned int minLayers{4};
64 
66  ATH_CHECK(m_geoCtxKey.initialize());
67  ATH_CHECK(m_etaKey.initialize());
68  ATH_CHECK(m_writeKey.initialize());
69  ATH_CHECK(m_idHelperSvc.retrieve());
70  ATH_CHECK(m_visionTool.retrieve(DisableTool{m_visionTool.empty()}));
71 
72  if (!(m_idHelperSvc->hasMM() || m_idHelperSvc->hasSTGC())) {
73  ATH_MSG_ERROR("MM or STGC not part of initialized detector layout");
74  return StatusCode::FAILURE;
75  }
76 
77  return StatusCode::SUCCESS;
78 }
79 
82  UsedHitMarker_t emptyKeeper(sortedSp.size());
83  for (std::size_t l = 0; l < sortedSp.size(); ++l) {
84  emptyKeeper[l].resize(sortedSp[l].size(), 0);
85  }
86  return emptyKeeper;
87 }
88 
91 
93  const auto& design = getDesign(sp);
94  if (!design.hasStereoAngle()) {
95  return StripOrient::X;
96  }
97  return design.stereoAngle() > 0. ? StripOrient::U : StripOrient::V;
98  } else if (sp.type() == xAOD::UncalibMeasType::sTgcStripType) {
99  const auto* prd = static_cast<const xAOD::sTgcMeasurement*>(sp.primaryMeasurement());
100  if (sp.dimension() == 1 && prd->channelType() == sTgcIdHelper::Strip){
101  return StripOrient::X;
102  }
103  }
104  ATH_MSG_WARNING("Cannot classify orientation of "<<m_idHelperSvc->toString(sp.identify()));
105  return StripOrient::Unknown;
106 }
109  const Amg::Vector3D& beamSpotPos,
110  const Amg::Vector3D& dirEstUp,
111  const Amg::Vector3D& dirEstDn) const{
112 
113  const Amg::Vector3D estPlaneArrivalUp = extrapolateToPlane(beamSpotPos, dirEstUp, testHit);
114  const Amg::Vector3D estPlaneArrivalDn = extrapolateToPlane(beamSpotPos, dirEstDn, testHit);
115 
116  bool below{true}, above{true};
117  switch (classifyStrip(testHit)) {
118  using enum StripOrient;
119  case U:
120  case V:{
121  const double halfLength = 0.5* stripHalfLength(testHit);
123  const Amg::Vector3D leftEdge = testHit.positionInChamber() - halfLength * testHit.directionInChamber();
124  const Amg::Vector3D rightEdge = testHit.positionInChamber() + halfLength * testHit.directionInChamber();
125 
127  below = estPlaneArrivalDn.y() > std::max(leftEdge.y(), rightEdge.y());
129  above = estPlaneArrivalUp.y() < std::min(leftEdge.y(), rightEdge.y());
130  break;
131  } case X: {
133  const double hY = testHit.positionInChamber().y();
134  below = estPlaneArrivalDn.y() > hY;
136  above = estPlaneArrivalUp.y() < hY;
137  break;
138  }
139  case Unknown:{
140  break;
141  }
142 
143  }
144  ATH_MSG_VERBOSE("Hit " << m_idHelperSvc->toString(testHit.identify())
145  << (below || above ? " is outside the window" : " is inside the window"));
146  if(below) {
147  return HitWindow::tooLow;
148  }
149  if(above) {
150  return HitWindow::tooHigh;
151  }
152  return HitWindow::inside;
153 };
154 
156 #define TEST_HIT_CORRIDOR(LAYER, HIT_ITER, START_LAYER) \
157 { \
158  const SpacePoint* testMe = combinatoricLayers[LAYER].get()[HIT_ITER]; \
159  if (usedHits[LAYER].get()[HIT_ITER]) { \
160  ATH_MSG_VERBOSE(__func__<<":"<<__LINE__<<" - " \
161  <<m_idHelperSvc->toString(testMe->identify()) \
162  <<" already used in good seed." ); \
163  continue; \
164  } \
165  const HitWindow inWindow = hitFromIPCorridor(*testMe, beamSpot, dirEstUp, dirEstDn); \
166  if(inWindow == HitWindow::tooHigh) { \
167  ATH_MSG_VERBOSE(__func__<<":"<<__LINE__<<" - Hit " \
168  <<m_idHelperSvc->toString(testMe->identify()) \
169  <<" is beyond the corridor. Break loop"); \
170  break; \
171  } else if (inWindow == HitWindow::tooLow) { \
172  START_LAYER = HIT_ITER + 1; \
173  ATH_MSG_VERBOSE(__func__<<":"<<__LINE__<<" - Hit " \
174  <<m_idHelperSvc->toString(testMe->identify()) \
175  <<" is still below the corridor. Update start to " \
176  <<START_LAYER); \
177  continue; \
178  } \
179 }
180 
182  const HitLaySpan_t& combinatoricLayers,
183  const UsedHitSpan_t& usedHits,
184  InitialSeedVec_t& seedHitsFromLayers) const {
186  seedHitsFromLayers.clear();
187  std::size_t maxSize{1};
188  for (const HitVec& hitVec : combinatoricLayers) {
189  maxSize = maxSize * hitVec.size();
190  }
191  seedHitsFromLayers.reserve(maxSize);
192 
193 
194  unsigned int iterLay0{0}, iterLay1{0}, iterLay2{0}, iterLay3{0};
195  unsigned int startLay1{0}, startLay2{0}, startLay3{0};
196 
197  for( ; iterLay0 < combinatoricLayers[0].get().size() ; ++iterLay0){
199  if (usedHits[0].get()[iterLay0]) {
200  continue;
201  }
202  const SpacePoint* hit0 = combinatoricLayers[0].get()[iterLay0];
204  const Amg::Vector3D initSeedDir{(beamSpot - hit0->positionInChamber()).unit()};
205  const Amg::Vector3D dirEstUp = Amg::dirFromAngles(initSeedDir.phi(), initSeedDir.theta() - m_windowTheta);
206  const Amg::Vector3D dirEstDn = Amg::dirFromAngles(initSeedDir.phi(), initSeedDir.theta() + m_windowTheta);
207 
208  ATH_MSG_VERBOSE("Reference hit: "<<m_idHelperSvc->toString(hit0->identify())
209  <<", position: "<<Amg::toString(hit0->positionInChamber())
210  <<", seed dir: "<<Amg::toString(initSeedDir)
211  <<", seed plane: "<<Amg::toString(extrapolateToPlane(beamSpot, initSeedDir, *hit0)));
213  for( iterLay1 = startLay1; iterLay1 < combinatoricLayers[1].get().size() ; ++iterLay1){
214  TEST_HIT_CORRIDOR(1, iterLay1, startLay1);
215  for( iterLay2 = startLay2; iterLay2 < combinatoricLayers[2].get().size() ; ++iterLay2){
216  TEST_HIT_CORRIDOR(2, iterLay2, startLay2);
217  for( iterLay3 = startLay3; iterLay3 < combinatoricLayers[3].get().size(); ++iterLay3){
218  TEST_HIT_CORRIDOR(3, iterLay3, startLay3);
219  seedHitsFromLayers.emplace_back(std::array{hit0, combinatoricLayers[1].get()[iterLay1],
220  combinatoricLayers[2].get()[iterLay2],
221  combinatoricLayers[3].get()[iterLay3]});
222  }
223  }
224  }
225  }
226 }
227 #undef TEST_HIT_CORRIDOR
228 
231  const Amg::Vector3D& direction,
232  const HitLaySpan_t& extensionLayers,
233  const UsedHitSpan_t& usedHits) const {
234 
235  //the hits we need to return to extend the segment seed
236  HitVec combinatoricHits;
237 
238  //the stripHitsLayers are already the unused ones - only use for the extension
239  for (std::size_t i = 0; i < extensionLayers.size(); ++i) {
240  const HitVec& layer{extensionLayers[i].get()};
241  const Amg::Vector3D extrapPos = extrapolateToPlane(startPos, direction, *layer.front());
242 
243  unsigned int indexOfHit = layer.size() + 1;
244  unsigned int triedHit{0};
245  double minPull{std::numeric_limits<double>::max()};
246 
247  // loop over the hits on the same layer
248  for (unsigned int j = 0; j < layer.size(); ++j) {
249  if (usedHits[i].get().at(j)) {
250  continue;
251  }
252  auto hit = layer.at(j);
253  double pull = std::sqrt(SegmentFitHelpers::chiSqTermStrip(extrapPos, direction, *hit, msg()));
254  ATH_MSG_VERBOSE("Trying extension with hit " << m_idHelperSvc->toString(hit->identify()));
255 
256  //find the hit with the minimum pull (check at least one hit after we have increasing pulls)
257  if (pull > minPull) {
258  triedHit+=1;
259  continue;
260  }
261 
262  if(triedHit>1){
263  break;
264  }
265 
266  indexOfHit = j;
267  minPull = pull;
268  }
269 
270  // complete the seed with the extended hits
271  if (minPull < m_minPullThreshold) {
272  const auto* bestCand = layer.at(indexOfHit);
273  ATH_MSG_VERBOSE("Extension successfull - hit" << m_idHelperSvc->toString(bestCand->identify())
274  <<", pos: "<<Amg::toString(bestCand->positionInChamber())
275  <<", dir: "<<Amg::toString(bestCand->directionInChamber())<<" found with pull "<<minPull);
276  combinatoricHits.push_back(bestCand);
277  }
278  }
279  return combinatoricHits;
280 }
281 
282 std::unique_ptr<SegmentSeed>
284  const AmgSymMatrix(2)& bMatrix,
285  const HoughMaximum& max,
286  const HitLaySpan_t& extensionLayers,
287  const UsedHitSpan_t& usedHits) const {
288 
289  HitVec hits{initialSeed.begin(), initialSeed.end()};
290  std::array<double, 4> params = CombinatorialSeedSolver::defineParameters(bMatrix, hits);
291 
292  const auto [segPos, direction] = CombinatorialSeedSolver::seedSolution(hits, params);
293 
294  // check the consistency of the parameters - expected to lay in the strip's
295  // length
296  for (std::size_t i = 0; i < 4; ++i) {
297  const double halfLength = stripHalfLength(*hits[i]);
298 
299  if (std::abs(params[i]) > halfLength) {
300  ATH_MSG_VERBOSE("Seed Rejection: Invalid seed - outside of the strip's length");
301  return nullptr;
302  }
303  }
304  double tanPhi = houghTanPhi(direction);
305  double tanTheta = houghTanTheta(direction);
306 
307  double interceptX = segPos.x();
308  double interceptY = segPos.y();
309 
310 
311  // extend the seed to the segment -- include hits from the other layers too
312  auto extendedHits = extendHits(segPos, direction, extensionLayers, usedHits);
313  hits.insert(hits.end(), extendedHits.begin(), extendedHits.end());
314  return std::make_unique<SegmentSeed>(tanTheta, interceptY, tanPhi,
315  interceptX, hits.size(),
316  std::move(hits), max.parentBucket());
317 }
318 
319 
320 std::vector<std::unique_ptr<SegmentSeed>>
322  // first sort the hits per layer from the maximum
323  SpacePointPerLayerSplitter hitLayers{max.getHitsInMax()};
324 
325  const HitLayVec& stripHitsLayers{hitLayers.stripHits()};
326  const std::size_t layerSize = stripHitsLayers.size();
327 
328  std::vector<std::unique_ptr<SegmentSeed>> seeds{};
329 
330 
331  if (layerSize < minLayers) {
332  ATH_MSG_VERBOSE("Not enough layers to build a seed");
333  return seeds;
334  }
335 
336 
337  if (m_visionTool.isEnabled()) {
339  const auto truthHits = getMatchingSimHits(max.getHitsInMax());
340  constexpr double legX{0.2};
341  double legY{0.8};
342  for (const SpacePoint* sp : max.getHitsInMax()) {
343  const auto* mmClust = static_cast<const xAOD::MMCluster*>(sp->primaryMeasurement());
344  const xAOD::MuonSimHit* simHit = getTruthMatchedHit(*mmClust);
345  if (!simHit || !MC::isMuon(simHit)) continue;
346  const MuonGMR4::MmReadoutElement* reEle = mmClust->readoutElement();
347  const MuonGMR4::StripDesign& design = reEle->stripLayer(mmClust->measurementHash()).design();
348  const Amg::Transform3D toChamb = reEle->msSector()->globalToLocalTrans(gctx) *
349  reEle->localToGlobalTrans(gctx, simHit->identify());
350  const Amg::Vector3D hitPos = toChamb * xAOD::toEigen(simHit->localPosition());
351  const Amg::Vector3D hitDir = toChamb.linear() * xAOD::toEigen(simHit->localDirection());
352 
353  const double pull = std::sqrt(SegmentFitHelpers::chiSqTermStrip(hitPos,hitDir, *sp, msgStream()));
354  const double pull2 = (mmClust->localPosition<1>().x() - simHit->localPosition().x()) / std::sqrt(mmClust->localCovariance<1>().x());
355  primitives.push_back(MuonValR4::drawLabel(std::format("ml: {:1d}, gap: {:1d}, {:}, pull: {:.2f} / {:.2f}", reEle->multilayer(), mmClust->gasGap(),
356  !design.hasStereoAngle() ? "X" : design.stereoAngle() >0 ? "U": "V",pull, pull2),legX,legY,14));
357  legY-=0.05;
358  }
359  m_visionTool->visualizeBucket(Gaudi::Hive::currentContext(), *max.parentBucket(),
360  "truth", std::move(primitives));
361  }
362 
363  UsedHitMarker_t allUsedHits = emptyBookKeeper(stripHitsLayers);
364  const Amg::Transform3D globToLocal = max.msSector()->globalToLocalTrans(gctx);
365  std::array<const SpacePoint*, 4> seedHits{};
366 
367  InitialSeedVec_t preLimSeeds{};
368 
369  for (std::size_t i = 0; i < layerSize - 3; ++i) {
370  seedHits[0] = stripHitsLayers[i].front();
371  for (std::size_t j = i + 1; j < layerSize - 2; ++j) {
372  seedHits[1] = stripHitsLayers[j].front();
373  for (std::size_t k = j + 1; k < layerSize - 1; ++k) {
374  seedHits[2] = stripHitsLayers[k].front();
375  for (std::size_t l = k + 1; l < layerSize; ++l) {
376  seedHits[3] = stripHitsLayers[l].front();
377  AmgSymMatrix(2) bMatrix = CombinatorialSeedSolver::betaMatrix(seedHits);
378  if (std::abs(bMatrix.determinant()) < 1.e-6) {
379  continue;
380  }
381 
382  const HitLaySpan_t layers{stripHitsLayers[i], stripHitsLayers[j], stripHitsLayers[k], stripHitsLayers[l]};
383  UsedHitSpan_t usedHits{allUsedHits[i], allUsedHits[j], allUsedHits[k], allUsedHits[l]};
384  // each layer may have more than one hit - take the hit combinations
385  constructPrelimnarySeeds(globToLocal.translation(), layers, usedHits, preLimSeeds);
386 
387  //the layers not participated in the seed build - gonna be used for the extension
388  HitLaySpan_t extensionLayers{};
389  UsedHitSpan_t usedExtensionHits{};
390  usedExtensionHits.reserve(stripHitsLayers.size());
391  extensionLayers.reserve(stripHitsLayers.size());
392  for (std::size_t e = 0 ; e < stripHitsLayers.size(); ++e) {
393  if (!(e == i || e == j || e == k || e == l)){
394  extensionLayers.emplace_back(stripHitsLayers[e]);
395  usedExtensionHits.emplace_back(allUsedHits[e]);
396  }
397  }
398  // we have made sure to have hits from all the four layers -
399  // start by 4 hits for the seed and try to build the seed for the combinatorics found
400  for (auto &combinatoricHits : preLimSeeds) {
401  auto seed = buildSegmentSeed(combinatoricHits, bMatrix, max, extensionLayers, usedExtensionHits);
402  if (seed) {
403  markHitsAsUsed(*seed,stripHitsLayers, allUsedHits);
404  seeds.push_back(std::move(seed));
405  }
406  }
407  }
408  }
409  }
410  }
411 
412  return seeds;
413 }
415  const HitLayVec& allSortHits,
416  UsedHitMarker_t& usedHitMarker) const {
418  for (const auto* sp : seed.getHitsInMax()) {
419  bool found{false};
420  for (std::size_t lIdx = 0; !found && lIdx < allSortHits.size(); ++lIdx) {
421  const HitVec& hVec{allSortHits[lIdx]};
422  for (std::size_t hIdx = 0 ; hIdx < hVec.size(); ++hIdx) {
423  if (hVec[hIdx] == sp) {
424  usedHitMarker[lIdx][hIdx] = true;
425  found = true;
426  break;
427  }
428  }
429  }
430  }
431 }
432 StatusCode CombinatorialNSWSeedFinderAlg::execute(const EventContext &ctx) const {
433  // read the inputs
434  const EtaHoughMaxContainer *maxima{nullptr};
435  ATH_CHECK(SG::get( maxima, m_etaKey, ctx));
436 
437  const ActsGeometryContext *gctx{nullptr};
438  ATH_CHECK(SG::get(gctx, m_geoCtxKey, ctx));
439 
440  // prepare our output collection
441  SG::WriteHandle writeMaxima{m_writeKey, ctx};
442  ATH_CHECK(writeMaxima.record(std::make_unique<SegmentSeedContainer>()));
443 
444  // we use the information from the previous eta-hough transform
445  // to get the combined hits that belong in the same maxima
446  for (const HoughMaximum *max : *maxima) {
447  std::vector<std::unique_ptr<SegmentSeed>> seeds = findSeedsFromMaximum(*max, *gctx);
448  if (msgLvl(MSG::VERBOSE)) {
449  for(const auto& hitMax : max->getHitsInMax()){
450  ATH_MSG_VERBOSE("Hit "<<m_idHelperSvc->toString(hitMax->identify())<<", "
451  <<Amg::toString(hitMax->positionInChamber())<<", dir: "
452  <<Amg::toString(hitMax->directionInChamber()));
453  }
454  }
455  for (auto &seed : seeds) {
456  if (msgLvl(MSG::VERBOSE)){
457  std::stringstream sstr{};
458  sstr<<"Seed tanTheta = "<<seed->tanTheta()<<", y0 = "<<seed->interceptY()
459  <<", tanPhi = "<<seed->tanPhi()<<", x0 = "<<seed->interceptX()<<", hits in the seed "
460  <<seed->getHitsInMax().size()<<std::endl;
461 
462  for(const auto& hit : seed->getHitsInMax()){
463  sstr<<" *** Hit "<<m_idHelperSvc->toString(hit->identify())<<", "
464  << Amg::toString(hit->positionInChamber())<<", dir: "<<Amg::toString(hit->directionInChamber())<<std::endl;
465  }
466  ATH_MSG_VERBOSE(sstr.str());
467  }
468  if (m_visionTool.isEnabled()) {
469  m_visionTool->visualizeSeed(ctx, *seed, "#phi-combinatorialSeed");
470  }
471  writeMaxima->push_back(std::move(seed));
472  }
473  }
474  return StatusCode::SUCCESS;
475 }
476 
477 } // namespace MuonR4
MuonR4::minLayers
constexpr unsigned int minLayers
Definition: CombinatorialNSWSeedFinderAlg.cxx:63
AllowedVariables::e
e
Definition: AsgElectronSelectorTool.cxx:37
UncalibratedMeasurement.h
GetLCDefs::Unknown
@ Unknown
Definition: GetLCDefs.h:21
MuonSimHitHelpers.h
xAOD::MuonSimHit_v1
Definition: MuonSimHit_v1.h:18
MuonR4::SpacePoint::msSector
const MuonGMR4::SpectrometerSector * msSector() const
Definition: MuonSpectrometer/MuonPhaseII/Event/MuonSpacePoint/src/SpacePoint.cxx:56
MuonGMR4::StripDesign::stereoAngle
double stereoAngle() const
Returns the value of the stereo angle.
MuonGMR4::MmReadoutElement
Definition: MmReadoutElement.h:18
MuonGMR4::StripDesign
Definition: StripDesign.h:30
MuonR4::SpacePoint::type
xAOD::UncalibMeasType type() const
Definition: MuonSpectrometer/MuonPhaseII/Event/MuonSpacePoint/src/SpacePoint.cxx:71
TRTCalib_Extractor.hits
hits
Definition: TRTCalib_Extractor.py:35
MuonGMR4::MuonReadoutElement::msSector
const SpectrometerSector * msSector() const
Returns the pointer to the envelope volume enclosing all chambers in the sector.
MuonR4::SpacePointPerLayerSplitter
The SpacePointPerLayerSplitter takes a set of spacepoints already sorted by layer Identifier (see Muo...
Definition: SpacePointPerLayerSplitter.h:16
xAOD::MuonSimHit_v1::identify
Identifier identify() const
Returns the global ATLAS identifier of the SimHit.
Definition: xAODMuonSimHit_V1.cxx:42
MuonR4::CombinatorialNSWSeedFinderAlg::HitWindow
HitWindow
To fastly check whether a hit is roughly compatible with a muon trajectory a narrow corridor is opene...
Definition: CombinatorialNSWSeedFinderAlg.h:69
vtune_athena.format
format
Definition: vtune_athena.py:14
MuonR4::CombinatorialNSWSeedFinderAlg::extendHits
HitVec extendHits(const Amg::Vector3D &startPos, const Amg::Vector3D &direction, const HitLaySpan_t &extensionLayers, const UsedHitSpan_t &usedHits) const
Definition: CombinatorialNSWSeedFinderAlg.cxx:230
xAOD::MMCluster_v1
Definition: MMCluster_v1.h:20
MuonR4::CombinatorialNSWSeedFinderAlg::initialize
virtual StatusCode initialize() override
Definition: CombinatorialNSWSeedFinderAlg.cxx:65
MuonR4::CombinatorialNSWSeedFinderAlg::buildSegmentSeed
std::unique_ptr< SegmentSeed > buildSegmentSeed(const InitialSeed_t &initialSeed, const AmgSymMatrix(2)&bMatrix, const HoughMaximum &max, const HitLaySpan_t &extensionLayers, const UsedHitSpan_t &usedHits) const
Build the final seed from the initial seed hits and then attempt to append hits from the complementar...
Definition: CombinatorialNSWSeedFinderAlg.cxx:283
VisualizationHelpers.h
MuonR4::CombinatorialNSWSeedFinderAlg::hitFromIPCorridor
HitWindow hitFromIPCorridor(const SpacePoint &testHit, const Amg::Vector3D &beamSpotPos, const Amg::Vector3D &dirEstUp, const Amg::Vector3D &dirEstDn) const
The hit is above the predefined corridor.
Definition: CombinatorialNSWSeedFinderAlg.cxx:108
max
constexpr double max()
Definition: ap_fixedTest.cxx:33
min
constexpr double min()
Definition: ap_fixedTest.cxx:26
MuonR4::CombinatorialNSWSeedFinderAlg::constructPrelimnarySeeds
void constructPrelimnarySeeds(const Amg::Vector3D &beamSpot, const HitLaySpan_t &combinatoricLayers, const UsedHitSpan_t &usedHits, InitialSeedVec_t &outVec) const
Construct a set of prelimnary seeds from the selected combinatoric layers.
Definition: CombinatorialNSWSeedFinderAlg.cxx:181
xAOD::UncalibMeasType::MMClusterType
@ MMClusterType
module_driven_slicing.layers
layers
Definition: module_driven_slicing.py:113
xAOD::MMCluster_v1::readoutElement
const MuonGMR4::MmReadoutElement * readoutElement() const
Retrieve the associated MmReadoutElement.
sTgcIdHelper::Strip
@ Strip
Definition: sTgcIdHelper.h:190
UploadAMITag.l
list l
Definition: UploadAMITag.larcaf.py:157
ATH_MSG_VERBOSE
#define ATH_MSG_VERBOSE(x)
Definition: AthMsgStreamMacros.h:28
xAOD::UncalibMeasType::sTgcStripType
@ sTgcStripType
MuonR4::CombinatorialNSWSeedFinderAlg::classifyStrip
StripOrient classifyStrip(const SpacePoint &spacePoint) const
Determines the orientation of the strip space point.
Definition: CombinatorialNSWSeedFinderAlg.cxx:90
x
#define x
MuonValR4::drawLabel
std::unique_ptr< TLatex > drawLabel(const std::string &text, const double xPos, const double yPos, const unsigned int fontSize=18)
Create a TLatex label,.
Definition: VisualizationHelpers.cxx:32
Monitored::X
@ X
Definition: HistogramFillerUtils.h:24
MuonR4::SegmentFitHelpers::extrapolateToPlane
Amg::Vector3D extrapolateToPlane(const Amg::Vector3D &pos, const Amg::Vector3D &dir, const SpacePoint &hit)
Extrapolates the segment line onto the plane defined by the by the space-point's position & plane nor...
Definition: SegmentFitHelperFunctions.cxx:76
MuonR4::SpacePoint::primaryMeasurement
const xAOD::UncalibratedMeasurement * primaryMeasurement() const
Definition: MuonSpectrometer/MuonPhaseII/Event/MuonSpacePoint/src/SpacePoint.cxx:47
MuonR4::houghTanPhi
double houghTanPhi(const Amg::Vector3D &v)
: Returns the hough tanPhi [x] / [z]
Definition: SegmentFitterEventData.cxx:18
python.setupRTTAlg.size
int size
Definition: setupRTTAlg.py:39
MuonR4::CombinatorialNSWSeedFinderAlg::InitialSeedVec_t
std::vector< InitialSeed_t > InitialSeedVec_t
Vector of initial seeds.
Definition: CombinatorialNSWSeedFinderAlg.h:60
MuonR4::SegmentFitHelpers::chiSqTermStrip
double chiSqTermStrip(const Amg::Vector3D &posInChamber, const Amg::Vector3D &dirInChamber, const SpacePoint &measurement, MsgStream &msg)
Calculates the chi2 contribuation to a linear segment line from an uncalibrated strip measurement.
Definition: SegmentFitHelperFunctions.cxx:82
SpacePointPerLayerSplitter.h
Amg::toString
std::string toString(const Translation3D &translation, int precision=4)
GeoPrimitvesToStringConverter.
Definition: GeoPrimitivesToStringConverter.h:40
MuonGMR4::MmReadoutElement::multilayer
int multilayer() const
Returns the multi layer of the element [1-2].
MuonR4::CombinatorialNSWSeedFinderAlg::HitLayVec
SpacePointPerLayerSplitter::HitLayVec HitLayVec
Definition: CombinatorialNSWSeedFinderAlg.h:50
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
lumiFormat.i
int i
Definition: lumiFormat.py:85
SG::get
const T * get(const ReadCondHandleKey< T > &key, const EventContext &ctx)
Convenience function to retrieve an object given a ReadCondHandleKey.
Definition: ReadCondHandle.h:287
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
sTgcIdHelper::Wire
@ Wire
Definition: sTgcIdHelper.h:190
SegmentFitHelperFunctions.h
TRT::Hit::layer
@ layer
Definition: HitInfo.h:79
MuonGMR4::SpectrometerSector::globalToLocalTrans
Amg::Transform3D globalToLocalTrans(const ActsGeometryContext &gctx) const
Returns the global -> local transformation from the ATLAS global.
Definition: SpectrometerSector.cxx:78
Amg::Transform3D
Eigen::Affine3d Transform3D
Definition: GeoPrimitives.h:46
MuonR4::CombinatorialSeedSolver::seedSolution
requires acceptedContainer< spacePointContainer > &&hasPointerValues< spacePointContainer > std::pair< Amg::Vector3D, Amg::Vector3D > seedSolution(const spacePointContainer &spacePoints, const std::array< double, 4 > &parameters)
solves the equation system to calculate the seed
Definition: CombinatorialSeedSolver.h:127
TEST_HIT_CORRIDOR
#define TEST_HIT_CORRIDOR(LAYER, HIT_ITER, START_LAYER)
Macro to check whether a hit is compatible with the hit corridor.
Definition: CombinatorialNSWSeedFinderAlg.cxx:156
MmIdHelper.h
MuonR4::CombinatorialNSWSeedFinderAlg::emptyBookKeeper
UsedHitMarker_t emptyBookKeeper(const HitLayVec &sortedSp) const
Constructs an empty HitMarker from the split space points.
Definition: CombinatorialNSWSeedFinderAlg.cxx:81
python.StandardJetMods.pull
pull
Definition: StandardJetMods.py:304
xAOD::MuonSimHit_v1::localDirection
ConstVectorMap< 3 > localDirection() const
Returns the local direction of the traversing particle.
Definition: xAODMuonSimHit_V1.cxx:66
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
MuonR4::CombinatorialNSWSeedFinderAlg::InitialSeed_t
std::array< const SpacePoint *, 4 > InitialSeed_t
Abbrivation of the
Definition: CombinatorialNSWSeedFinderAlg.h:58
MuonR4::CombinatorialNSWSeedFinderAlg::UsedHitMarker_t
std::vector< std::vector< char > > UsedHitMarker_t
Abbrivation of the container book keeping whether a hit is used or not.
Definition: CombinatorialNSWSeedFinderAlg.h:54
DataVector
Derived DataVector<T>.
Definition: DataVector.h:794
ActsGeometryContext
Include the GeoPrimitives which need to be put first.
Definition: ActsGeometryContext.h:27
MuonGMR4::StripLayer::design
const StripDesign & design(bool phiView=false) const
Returns the underlying strip design.
MuonR4::SpacePoint
The muon space point is the combination of two uncalibrated measurements one of them measures the eta...
Definition: MuonSpectrometer/MuonPhaseII/Event/MuonSpacePoint/MuonSpacePoint/SpacePoint.h:19
lumiFormat.array
array
Definition: lumiFormat.py:91
MuonGMR4::MmReadoutElement::stripLayer
const StripLayer & stripLayer(const Identifier &measId) const
MuonR4::SpacePoint::directionInChamber
const Amg::Vector3D & directionInChamber() const
Definition: MuonSpectrometer/MuonPhaseII/Event/MuonSpacePoint/src/SpacePoint.cxx:62
MuonR4::CombinatorialNSWSeedFinderAlg::UsedHitSpan_t
std::vector< std::reference_wrapper< std::vector< char > >> UsedHitSpan_t
Abbrivation of the container to pass a subset of markers wtihout copy.
Definition: CombinatorialNSWSeedFinderAlg.h:56
MuonValR4::IPatternVisualizationTool::PrimitiveVec
std::vector< PrimitivePtr > PrimitiveVec
Definition: IPatternVisualizationTool.h:31
MuonGMR4::SpectrometerSector::idHelperSvc
const Muon::IMuonIdHelperSvc * idHelperSvc() const
Returns the IdHelpeSvc.
Definition: SpectrometerSector.cxx:61
CombinatorialNSWSeedFinderAlg.h
sTgcMeasurement.h
checkTriggerxAOD.found
found
Definition: checkTriggerxAOD.py:328
MuonR4::CombinatorialNSWSeedFinderAlg::execute
virtual StatusCode execute(const EventContext &ctx) const override
Definition: CombinatorialNSWSeedFinderAlg.cxx:432
Amg::Vector3D
Eigen::Matrix< double, 3, 1 > Vector3D
Definition: GeoPrimitives.h:47
THROW_EXCEPTION
#define THROW_EXCEPTION(MESSAGE)
Definition: throwExcept.h:10
MuonR4::CombinatorialNSWSeedFinderAlg::StripOrient
StripOrient
Enumeration to classify the orientation of a NSW strip
Definition: CombinatorialNSWSeedFinderAlg.h:39
Amg::dirFromAngles
Amg::Vector3D dirFromAngles(const double phi, const double theta)
Constructs a direction vector from the azimuthal & polar angles.
Definition: GeoPrimitivesHelpers.h:299
MuonR4
This header ties the generic definitions in this package.
Definition: HoughEventData.h:16
MuonR4::CombinatorialNSWSeedFinderAlg::markHitsAsUsed
void markHitsAsUsed(const SegmentSeed &seed, const HitLayVec &allSortHits, UsedHitMarker_t &usedHitMarker) const
Definition: CombinatorialNSWSeedFinderAlg.cxx:414
Trk::inside
@ inside
Definition: PropDirection.h:29
SG::WriteHandle
Definition: StoreGate/StoreGate/WriteHandle.h:73
MuonR4::SpacePoint::positionInChamber
const Amg::Vector3D & positionInChamber() const
Definition: MuonSpectrometer/MuonPhaseII/Event/MuonSpacePoint/src/SpacePoint.cxx:59
MuonR4::HoughMaximum
Data class to represent an eta maximum in hough space.
Definition: HoughMaximum.h:14
SegmentFitterEventData.h
Muon::IMuonIdHelperSvc::toString
virtual std::string toString(const Identifier &id) const =0
print all fields to string
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
MuonR4::CombinatorialSeedSolver::defineParameters
requires acceptedContainer< spacePointContainer > &&hasPointerValues< spacePointContainer > std::array< double, 4 > defineParameters(AmgSymMatrix(2) betaMatrix, const spacePointContainer &spacePoints)
calculates the parameters lamda,alpha,gamma,kappa of the system
Definition: CombinatorialSeedSolver.h:97
sTgcIdHelper::Pad
@ Pad
Definition: sTgcIdHelper.h:190
unit
const PlainObject unit() const
This is a plugin that makes Eigen look like CLHEP & defines some convenience methods.
Definition: AmgMatrixBasePlugin.h:21
MuonR4::SpacePoint::dimension
unsigned int dimension() const
Is the space point a 1D or combined 2D measurement.
Definition: MuonSpectrometer/MuonPhaseII/Event/MuonSpacePoint/src/SpacePoint.cxx:100
re
const boost::regex re(r_e)
MuonR4::CombinatorialNSWSeedFinderAlg::HitVec
SpacePointPerLayerSplitter::HitVec HitVec
Definition: CombinatorialNSWSeedFinderAlg.h:48
MuonR4::SegmentSeed
Representation of a segment seed (a fully processed hough maximum) produced by the hough transform.
Definition: SegmentSeed.h:14
xAOD::MuonSimHit_v1::localPosition
ConstVectorMap< 3 > localPosition() const
Returns the local postion of the traversing particle.
Definition: xAODMuonSimHit_V1.cxx:60
get
T * get(TKey *tobj)
get a TObject* from a TKey* (why can't a TObject be a TKey?)
Definition: hcg.cxx:127
MuonGMR4::MuonReadoutElement::localToGlobalTrans
const Amg::Transform3D & localToGlobalTrans(const ActsGeometryContext &ctx) const
Returns the local to global transformation into the ATLAS coordinate system.
Definition: MuonPhaseII/MuonDetDescr/MuonReadoutGeometryR4/src/MuonReadoutElement.cxx:81
MuonR4::getTruthMatchedHit
const xAOD::MuonSimHit * getTruthMatchedHit(const xAOD::UncalibratedMeasurement &prdHit)
Returns the MuonSimHit, if there's any, matched to the uncalibrated muon measurement.
Definition: MuonSimHitHelpers.cxx:16
MMCluster.h
python.BuildSignatureFlags.beamSpot
AthConfigFlags beamSpot(AthConfigFlags flags, str instanceName, str recoMode)
Definition: BuildSignatureFlags.py:475
MuonGMR4::StripDesign::hasStereoAngle
bool hasStereoAngle() const
Returns whether a stereo angle is defined.
CombinatorialSeedSolver.h
python.Constants.VERBOSE
int VERBOSE
Definition: Control/AthenaCommon/python/Constants.py:13
PowhegControl_ttFCNC_NLO.params
params
Definition: PowhegControl_ttFCNC_NLO.py:226
MuonR4::AmgSymMatrix
const AmgSymMatrix(2) &SpacePoint
Definition: MuonSpectrometer/MuonPhaseII/Event/MuonSpacePoint/src/SpacePoint.cxx:90
MuonR4::CombinatorialNSWSeedFinderAlg::HitLaySpan_t
std::vector< std::reference_wrapper< const HitVec > > HitLaySpan_t
Abbrivation of the space comprising multiple hit vectors without copy.
Definition: CombinatorialNSWSeedFinderAlg.h:52
python.AutoConfigFlags.msg
msg
Definition: AutoConfigFlags.py:7
MuonR4::houghTanTheta
double houghTanTheta(const Amg::Vector3D &v)
Returns the hough tanTheta [y] / [z].
Definition: SegmentFitterEventData.cxx:14
MuonR4::CombinatorialNSWSeedFinderAlg::findSeedsFromMaximum
std::vector< std::unique_ptr< SegmentSeed > > findSeedsFromMaximum(const HoughMaximum &max, const ActsGeometryContext &gctx) const
Definition: CombinatorialNSWSeedFinderAlg.cxx:321
MuonR4::getMatchingSimHits
std::unordered_set< const xAOD::MuonSimHit * > getMatchingSimHits(const xAOD::MuonSegment &segment)
: Returns all sim hits matched to a xAOD::MuonSegment
Definition: MuonSimHitHelpers.cxx:27
HepMCHelpers.h
MuonR4::SpacePoint::identify
const Identifier & identify() const
: Identifier of the primary measurement
Definition: MuonSpectrometer/MuonPhaseII/Event/MuonSpacePoint/src/SpacePoint.cxx:80
fitman.k
k
Definition: fitman.py:528
xAOD::sTgcMeasurement_v1
Definition: sTgcMeasurement_v1.h:21
isMuon
bool isMuon(const T &p)
Definition: AtlasPID.h:202