|
ATLAS Offline Software
|
Tool to fit a trajectory using a set of two segments or a track and a segment as input.
More...
#include <MooTrackFitter.h>
|
| MooTrackFitter (const std::string &, const std::string &, const IInterface *) |
| default AlgTool constructor More...
|
|
| ~MooTrackFitter ()=default |
| destructor More...
|
|
StatusCode | initialize () |
| initialize method, method taken from bass-class AlgTool More...
|
|
StatusCode | finalize () |
| finialize method, method taken from bass-class AlgTool More...
|
|
std::unique_ptr< Trk::Track > | fit (const EventContext &ctx, const MuPatCandidateBase &firstEntry, const MuPatCandidateBase &secondEntry, const PrepVec &externalPhiHits) const |
| fit the hits of two MuPatCandidateBase More...
|
|
std::unique_ptr< Trk::Track > | refit (const EventContext &ctx, const MuPatTrack &trkCan) const |
| refit a MuPatTrack More...
|
|
std::unique_ptr< Trk::Track > | refit (const EventContext &ctx, const Trk::Track &track) const |
| refit a track More...
|
|
std::unique_ptr< Trk::Perigee > | createPerigee (const EventContext &ctx, const Trk::TrackParameters &firstPars, const Trk::MeasurementBase &firstMeas) const |
| create perigee parameter to initialize fit More...
|
|
std::unique_ptr< Trk::Track > | fit (const EventContext &ctx, const Trk::Perigee &startPars, MeasVec &hits, Trk::ParticleHypothesis partHypo, bool prefit) const |
| fit track More...
|
|
std::unique_ptr< Trk::Track > | fitWithRefit (const EventContext &ctx, const Trk::Perigee &startPars, MeasVec &hits) const |
| fit track, refit if needed More...
|
|
std::pair< std::unique_ptr< Trk::Track >, std::unique_ptr< Trk::Track > > | splitTrack (const EventContext &ctx, const Trk::Track &track) const |
| split given track if it crosses the calorimeter volume, code assumes that the track was already extrapolated to the muon entry record using the MuonTrackExtrapolationTool. More...
|
|
std::unique_ptr< Trk::Track > | fitSplitTrack (const EventContext &ctx, const Trk::TrackParameters &startPars, const std::vector< const Trk::TrackStateOnSurface * > &tsos) const |
| construct a track from a list of TSOS and a start parameters More...
|
|
ServiceHandle< StoreGateSvc > & | evtStore () |
| The standard StoreGateSvc (event store) Returns (kind of) a pointer to the StoreGateSvc . More...
|
|
const ServiceHandle< StoreGateSvc > & | evtStore () const |
| The standard StoreGateSvc (event store) Returns (kind of) a pointer to the StoreGateSvc . More...
|
|
const ServiceHandle< StoreGateSvc > & | detStore () const |
| The standard StoreGateSvc/DetectorStore Returns (kind of) a pointer to the StoreGateSvc . More...
|
|
virtual StatusCode | sysInitialize () override |
| Perform system initialization for an algorithm. More...
|
|
virtual StatusCode | sysStart () override |
| Handle START transition. More...
|
|
virtual std::vector< Gaudi::DataHandle * > | inputHandles () const override |
| Return this algorithm's input handles. More...
|
|
virtual std::vector< Gaudi::DataHandle * > | outputHandles () const override |
| Return this algorithm's output handles. More...
|
|
Gaudi::Details::PropertyBase & | declareProperty (Gaudi::Property< T > &t) |
|
Gaudi::Details::PropertyBase * | declareProperty (const std::string &name, SG::VarHandleKey &hndl, const std::string &doc, const SG::VarHandleKeyType &) |
| Declare a new Gaudi property. More...
|
|
Gaudi::Details::PropertyBase * | declareProperty (const std::string &name, SG::VarHandleBase &hndl, const std::string &doc, const SG::VarHandleType &) |
| Declare a new Gaudi property. More...
|
|
Gaudi::Details::PropertyBase * | declareProperty (const std::string &name, SG::VarHandleKeyArray &hndArr, const std::string &doc, const SG::VarHandleKeyArrayType &) |
|
Gaudi::Details::PropertyBase * | declareProperty (const std::string &name, T &property, const std::string &doc, const SG::NotHandleType &) |
| Declare a new Gaudi property. More...
|
|
Gaudi::Details::PropertyBase * | declareProperty (const std::string &name, T &property, const std::string &doc="none") |
| Declare a new Gaudi property. More...
|
|
void | updateVHKA (Gaudi::Details::PropertyBase &) |
|
MsgStream & | msg () const |
|
MsgStream & | msg (const MSG::Level lvl) const |
|
bool | msgLvl (const MSG::Level lvl) const |
|
|
std::unique_ptr< Trk::Track > | cleanAndEvaluateTrack (const EventContext &ctx, Trk::Track &track, const std::set< Identifier > &excludedChambers) const |
| clean and evaluate the track, More...
|
|
bool | extractData (const MuPatCandidateBase &entry1, const MuPatCandidateBase &entry2, FitterData &fitterData) const |
| extract all information needed for the fit from the track More...
|
|
bool | extractData (FitterData &fitterData, bool usePreciseHits) const |
| extract all information from the HitList of a FitterData object More...
|
|
bool | addFakePhiHits (const EventContext &ctx, FitterData &fitterData, const Trk::TrackParameters &referenceParameter) const |
| check fitterData, add fake phi hits if needed. More...
|
|
bool | corruptEntry (const MuPatCandidateBase &entry) const |
| sanity check for entries More...
|
|
bool | getMaterial (const Trk::TrackParameters &pars, FitterData &fitterData) const |
| get material More...
|
|
void | createStartParameters (const EventContext &ctx, FitterData &inputData) const |
| create a perigee parameter give the input data More...
|
|
std::shared_ptr< const MuonSegment > | segmentFromEntry (const EventContext &ctx, const MuPatCandidateBase &entry) const |
| get segment from entry More...
|
|
unsigned int | hasPhiConstrain (FitterData &inputData) const |
| check whether data has sufficient phi constraints More...
|
|
unsigned int | hasPhiConstrain (Trk::Track *track) const |
| check whether data has sufficient phi constraints More...
|
|
std::unique_ptr< Trk::MeasurementBase > | createFakePhiForMeasurement (const Trk::MeasurementBase &measurement, const Amg::Vector3D *overlapPos, const Amg::Vector3D *phiPos, double error) const |
| create fake phi hit on the surface of the give measurement More...
|
|
double | qOverPFromEntries (const EventContext &ctx, const MuPatCandidateBase &firstEntry, const MuPatCandidateBase &secondEntry) const |
| get q/p using angle + position of the two entries More...
|
|
double | phiSeeding (const EventContext &ctx, FitterData &fitterData) const |
| calculate phi used to for seeding the fit More...
|
|
double | thetaSeeding (const MuPatCandidateBase &entry, MeasVec &etaHits) const |
| calculate theta used for seeding the fit More...
|
|
bool | cleanPhiHits (const EventContext &ctx, double momentum, FitterData &phiHits, const PrepVec &patternPhiHits) const |
| clean phi hits, returns true if anything happened during the cleaning More...
|
|
bool | validMomentum (const Trk::TrackParameters &pars) const |
| check whether mometum of start parameter is ok More...
|
|
bool | getMinMaxPhi (FitterData &fitterData) const |
| calculate the minimum and maximum phi value a track could have to pass all eta channels More...
|
|
void | removeSegmentOutliers (FitterData &fitterData) const |
|
void | cleanEntry (const MuPatCandidateBase &entry, std::set< Identifier > &removedIdentifiers) const |
|
void | cleanSegment (const MuonSegment &seg, std::set< Identifier > &removedIdentifiers) const |
|
std::pair< double, double > | getElementHalfLengths (const Identifier &id, const Trk::TrkDetElementBase *ele) const |
|
Gaudi::Details::PropertyBase & | declareGaudiProperty (Gaudi::Property< T > &hndl, const SG::VarHandleKeyType &) |
| specialization for handling Gaudi::Property<SG::VarHandleKey> More...
|
|
Gaudi::Details::PropertyBase & | declareGaudiProperty (Gaudi::Property< T > &hndl, const SG::VarHandleKeyArrayType &) |
| specialization for handling Gaudi::Property<SG::VarHandleKeyArray> More...
|
|
Gaudi::Details::PropertyBase & | declareGaudiProperty (Gaudi::Property< T > &hndl, const SG::VarHandleType &) |
| specialization for handling Gaudi::Property<SG::VarHandleBase> More...
|
|
Gaudi::Details::PropertyBase & | declareGaudiProperty (Gaudi::Property< T > &t, const SG::NotHandleType &) |
| specialization for handling everything that's not a Gaudi::Property<SG::VarHandleKey> or a <SG::VarHandleKeyArray> More...
|
|
|
ToolHandle< Trk::IPropagator > | m_propagator |
| propagator More...
|
|
ToolHandle< Trk::ITrackFitter > | m_trackFitter {this, "Fitter", "Trk::GlobalChi2Fitter/MCTBFitter"} |
| fitter More...
|
|
PublicToolHandle< MuPatHitTool > | m_hitHandler {this, "HitTool", "Muon::MuPatHitTool/MuPatHitTool"} |
| hit handler More...
|
|
ToolHandle< IMuonSegmentMomentumEstimator > | m_momentumEstimator |
| tool to estimate track momentum More...
|
|
Gaudi::Property< Trk::RunOutlierRemoval > | m_runOutlier {this, "RunOutlier", false, "Switch whether to run outlier logics or not"} |
|
Gaudi::Property< int > | m_matEffects {this, "MatEffects", 2, "type of material interaction in extrapolation"} |
|
Trk::ParticleHypothesis | m_ParticleHypothesis |
| nomen est omen More...
|
|
Trk::TrackInfo::TrackPatternRecoInfo | m_patRecInfo {Trk::TrackInfo::Moore} |
|
Trk::MagneticFieldProperties | m_magFieldProperties {Trk::FullField} |
| magnetic field properties More...
|
|
ServiceHandle< Muon::IMuonIdHelperSvc > | m_idHelperSvc {this, "MuonIdHelperSvc", "Muon::MuonIdHelperSvc/MuonIdHelperSvc"} |
|
ServiceHandle< IMuonEDMHelperSvc > | m_edmHelperSvc |
| multi purpose helper tool More...
|
|
PublicToolHandle< MuonEDMPrinterTool > | m_printer |
| tool to print out EDM objects More...
|
|
ToolHandle< IMuonTrackToSegmentTool > | m_trackToSegmentTool |
| helper tool to convert tracks into segments More...
|
|
ToolHandle< IMuonHitSelector > | m_phiHitSelector |
| tool to clean phi hits More...
|
|
ToolHandle< IMuonTrackCleaner > | m_cleaner {this, "TrackCleaner", "Muon::MuonTrackCleaner/MuonTrackCleaner"} |
|
ToolHandle< IMuonSegmentInOverlapResolvingTool > | m_overlapResolver |
|
ToolHandle< Trk::ITrackSummaryHelperTool > | m_trackSummaryTool |
|
Gaudi::Property< bool > | m_slFit {this, "SLFit", true, "Perform sl fit"} |
|
Gaudi::Property< bool > | m_slProp {this, "SLProp", false, "Enable straight line propagation"} |
|
Gaudi::Property< bool > | m_seedWithSegmentTheta {this, "SeedWithSegmentTheta", true, "Seed with theta connecting first + last eta hit"} |
|
Gaudi::Property< bool > | m_seedWithAvePhi {this, "SeedWithAvePhi", true, "Seed with average phi of all phi hits"} |
|
Gaudi::Property< bool > | m_seedPhiWithEtaHits {this, "SeedPhiWithEtaHits", false, "Seed phi from positions first last eta hit"} |
|
Gaudi::Property< bool > | m_usePreciseHits {this, "UsePreciseHits", false, "Use actual measurement error"} |
|
Gaudi::Property< bool > | m_usePrefit {this, "UsePrefit", true, "Use prefit"} |
|
Gaudi::Property< bool > | m_allowFirstFit {this, "AllowFirstFitResult", false, "Return the result of the prefit is final fit fails"} |
|
Gaudi::Property< double > | m_pThreshold |
|
Gaudi::Property< bool > | m_cosmics {this, "Cosmics", false, "Special treatment for cosmics"} |
|
Gaudi::Property< bool > | m_cleanPhiHits {this, "CleanPhiHits", true, "Special flag to switch off phi hit cleaning"} |
|
Gaudi::Property< unsigned int > | m_phiHitsMax |
|
Gaudi::Property< bool > | m_seedAtStartOfTrack {this, "SeedAtStartOfTrack", true, "Provide seed parameters at the start of the track"} |
|
Gaudi::Property< bool > | m_preciseFirstStation |
|
Gaudi::Property< double > | m_openingAngleCut |
|
Gaudi::Property< double > | m_preCleanChi2Cut |
|
Gaudi::Property< double > | m_chi2Cut {this, "ReducedChi2Cut", 100., "minimum chi2/ndof for a track to be accepted"} |
|
std::atomic_uint | m_nfits {0} |
|
std::atomic_uint | m_nfailedExtractInital {0} |
|
std::atomic_uint | m_nfailedMinMaxPhi {0} |
|
std::atomic_uint | m_nfailedParsInital {0} |
|
std::atomic_uint | m_nfailedExtractCleaning {0} |
|
std::atomic_uint | m_nfailedFakeInitial {0} |
|
std::atomic_uint | m_nfailedTubeFit {0} |
|
std::atomic_uint | m_noPerigee {0} |
|
std::atomic_uint | m_nlowMomentum {0} |
|
std::atomic_uint | m_nfailedExtractPrecise {0} |
|
std::atomic_uint | m_nfailedFakePrecise {0} |
|
std::atomic_uint | m_nfailedFitPrecise {0} |
|
std::atomic_uint | m_nsuccess {0} |
|
StoreGateSvc_t | m_evtStore |
| Pointer to StoreGate (event store by default) More...
|
|
StoreGateSvc_t | m_detStore |
| Pointer to StoreGate (detector store by default) More...
|
|
std::vector< SG::VarHandleKeyArray * > | m_vhka |
|
bool | m_varHandleArraysDeclared |
|
Tool to fit a trajectory using a set of two segments or a track and a segment as input.
The tool can be configured to fit either a straight line or all 5 parameters of the track.
For more details look at the mainpage of this package.
Definition at line 59 of file MooTrackFitter.h.
◆ MaterialLayers
◆ MeasCit
◆ MeasIt
◆ MeasVec
◆ PrepCit
◆ PrepIt
◆ PrepVec
◆ SLStationMap
◆ SmallLargeChambers
◆ StoreGateSvc_t
◆ MooTrackFitter()
Muon::MooTrackFitter::MooTrackFitter |
( |
const std::string & |
t, |
|
|
const std::string & |
n, |
|
|
const IInterface * |
p |
|
) |
| |
default AlgTool constructor
Definition at line 52 of file MooTrackFitter.cxx.
53 declareInterface<MooTrackFitter>(
this);
◆ ~MooTrackFitter()
Muon::MooTrackFitter::~MooTrackFitter |
( |
| ) |
|
|
default |
◆ addFakePhiHits()
check fitterData, add fake phi hits if needed.
If provided the reference parameter will be used to calcualte the fake hits
A small hack putting James last onto the actual stage and not let him fall into the orchestra pit...
Definition at line 512 of file MooTrackFitter.cxx.
518 if (nphiConstraints >= 2) {
519 if (fitterData.firstEntry->stations().size() == 1 && fitterData.firstEntry->containsStation(
MuonStationIndex::EI) &&
520 (fitterData.firstEntry->phiHits().empty() || (fitterData.firstEntry->containsChamber(
MuonStationIndex::CSS) ||
522 ATH_MSG_VERBOSE(
" Special treatment of the forward region: adding fake at ip ");
529 std::unique_ptr<Amg::Vector3D> overlapPos;
530 std::unique_ptr<const Amg::Vector3D> phiPos;
531 if (fitterData.numberOfSLOverlaps() > 0 || (fitterData.numberOfSmallChambers() > 0 && fitterData.numberOfLargeChambers() > 0)) {
535 overlapPos = std::make_unique<Amg::Vector3D>(1., 1., 1.);
536 double phi = fitterData.avePhi;
537 double theta = fitterData.secondEntry->etaHits().front()->globalPosition().theta();
539 if (fitterData.firstEntry->hasSLOverlap()) {
540 theta = fitterData.firstEntry->entryPars().momentum().theta();
541 phi = fitterData.firstEntry->entryPars().momentum().phi();
543 theta = fitterData.secondEntry->entryPars().momentum().theta();
544 phi = fitterData.secondEntry->entryPars().momentum().phi();
549 if (fitterData.startPars) {
550 phiPos = std::make_unique<Amg::Vector3D>(fitterData.startPars->momentum());
552 phiPos = std::make_unique<Amg::Vector3D>(*overlapPos);
556 if (fitterData.numberOfSLOverlaps() > 0) {
557 if (fitterData.stations.size() == 1)
560 msg(
MSG::VERBOSE) <<
" multi station fit with SL overlap, using overlapPos " << *overlapPos <<
endmsg;
561 }
else if (fitterData.numberOfSmallChambers() > 0 && fitterData.numberOfLargeChambers() > 0) {
562 msg(
MSG::VERBOSE) <<
" multi station fit, SL overlap not in same station, using overlapPos " << *overlapPos <<
endmsg;
568 if (fitterData.phiHits.empty()) {
569 const MuPatSegment* segInfo1 =
dynamic_cast<const MuPatSegment*
>(fitterData.firstEntry);
570 const MuPatSegment* segInfo2 =
dynamic_cast<const MuPatSegment*
>(fitterData.secondEntry);
571 if (segInfo1 && segInfo2 && fitterData.stations.size() == 1 && fitterData.numberOfSLOverlaps() == 1) {
576 ATH_MSG_VERBOSE(
" Special treatment for tracks with one station, a SL overlap and no phi hits ");
578 IMuonSegmentInOverlapResolvingTool::SegmentMatchResult
result =
581 if (!
result.goodMatch()) {
586 double locx1 =
result.segmentResult1.positionInTube1;
588 segInfo1->segment->localParameters().contains(
Trk::locY) ? segInfo1->segment->localParameters()[
Trk::locY] : 0.;
589 Trk::AtaPlane segPars1(locx1, locy1,
result.phiResult.segmentDirection1.phi(),
result.phiResult.segmentDirection1.theta(),
590 0., segInfo1->segment->associatedSurface());
592 std::unique_ptr<Trk::TrackParameters> exPars1 =
m_propagator->propagate(ctx,
593 segPars1, fitterData.measurements.front()->associatedSurface(),
Trk::anyDirection,
597 std::unique_ptr<Trk::MeasurementBase> fake =
600 fitterData.phiHits.push_back(fake.get());
601 fitterData.measurements.insert(fitterData.measurements.begin(), fake.get());
602 fitterData.firstLastMeasurements.insert(fitterData.firstLastMeasurements.begin(), fake.get());
603 fitterData.garbage.push_back(std::move(fake));
609 double locx2 =
result.segmentResult2.positionInTube1;
611 segInfo2->segment->localParameters().contains(
Trk::locY) ? segInfo2->segment->localParameters()[
Trk::locY] : 0.;
612 Trk::AtaPlane segPars2(locx2, locy2,
result.phiResult.segmentDirection2.phi(),
result.phiResult.segmentDirection2.theta(),
613 0., segInfo2->segment->associatedSurface());
616 segPars2, fitterData.measurements.back()->associatedSurface(),
Trk::anyDirection,
620 std::unique_ptr<Trk::MeasurementBase> fake =
623 fitterData.phiHits.push_back(fake.get());
624 fitterData.measurements.push_back(fake.get());
625 fitterData.firstLastMeasurements.push_back(fake.get());
626 fitterData.garbage.push_back(std::move(fake));
632 }
else if (nphiConstraints == 0 || (fitterData.stations.size() == 1) ||
633 (nphiConstraints == 1 && fitterData.numberOfSLOverlaps() == 0 && fitterData.numberOfSmallChambers() > 0 &&
634 fitterData.numberOfLargeChambers() > 0)) {
637 overlapPos.get(), phiPos.get(), 100.);
639 fitterData.phiHits.push_back(fake.get());
640 fitterData.measurements.insert(fitterData.measurements.begin(), fake.get());
641 fitterData.firstLastMeasurements.insert(fitterData.firstLastMeasurements.begin(), fake.get());
642 fitterData.garbage.push_back(std::move(fake));
648 overlapPos.get(), phiPos.get(), 100.);
650 fitterData.phiHits.push_back(fake.get());
651 fitterData.measurements.push_back(fake.get());
652 fitterData.firstLastMeasurements.push_back(fake.get());
653 fitterData.garbage.push_back(std::move(fake));
657 }
else if (fitterData.numberOfSLOverlaps() == 1) {
659 ATH_MSG_VERBOSE(
" Special treatment for tracks with one SL overlap and no phi hits ");
664 for (;
it != it_end; ++
it) {
665 if (
it->second.first &&
it->second.second) {
666 overlapStation =
it->first;
677 ATH_MSG_WARNING(
" unexpected condition, first measurement has no identifier ");
681 if (overlapStation == firstSt) {
686 overlapPos.get(), phiPos.get(), 100.);
688 fitterData.phiHits.push_back(fake.get());
689 fitterData.measurements.push_back(fake.get());
690 fitterData.firstLastMeasurements.push_back(fake.get());
691 fitterData.garbage.push_back(std::move(fake));
697 overlapPos.get(), phiPos.get(), 100.);
699 fitterData.phiHits.push_back(fake.get());
700 fitterData.measurements.insert(fitterData.measurements.begin(), fake.get());
701 fitterData.firstLastMeasurements.insert(fitterData.firstLastMeasurements.begin(), fake.get());
702 fitterData.garbage.push_back(std::move(fake));
712 double distFirstEtaPhi =
713 (fitterData.measurements.front()->globalPosition() - fitterData.phiHits.front()->globalPosition()).
mag();
714 double distLastEtaPhi = (fitterData.measurements.back()->globalPosition() - fitterData.phiHits.back()->globalPosition()).
mag();
718 phiPos = std::make_unique<Amg::Vector3D>(fitterData.phiHits.back()->globalPosition());
719 ATH_MSG_VERBOSE(
" using pointing constraint to calculate fake phi hit ");
723 const Trk::Surface *firstmdtsurf =
nullptr, *lastmdtsurf =
nullptr;
725 int indexfirst = 0, indexlast = (
int)fitterData.measurements.size();
727 for (; hitit != fitterData.hitList.end(); hitit++) {
728 if ((**hitit).info().measuresPhi)
break;
730 firstmdtsurf = &(**hitit).measurement().associatedSurface();
735 hitit = fitterData.hitList.end();
737 for (; hitit != fitterData.hitList.begin(); hitit--) {
738 if ((**hitit).info().measuresPhi)
break;
740 lastmdtsurf = &(**hitit).measurement().associatedSurface();
741 lastmdtpar = &(**hitit).parameters();
749 bool phifromextrapolation =
false;
750 if (!fitterData.secondEntry->phiHits().empty() || !fitterData.firstEntry->phiHits().empty()) phifromextrapolation =
true;
752 const Trk::Surface *firstphisurf =
nullptr, *lastphisurf =
nullptr;
754 if (!fitterData.phiHits.empty()) {
755 firstphisurf = &fitterData.phiHits.front()->associatedSurface();
756 lastphisurf = &fitterData.phiHits.back()->associatedSurface();
757 firstphinormal = firstphisurf->
normal();
758 lastphinormal = lastphisurf->normal();
759 if (firstphinormal.dot(startpar.momentum()) < 0) firstphinormal = -firstphinormal;
760 if (lastphinormal.dot(startpar.momentum()) < 0) lastphinormal = -lastphinormal;
762 if (lastmdtsurf && (!firstphisurf || (lastmdtsurf->center() - lastphisurf->center()).dot(lastphinormal) > 1000)) {
763 ATH_MSG_VERBOSE(
" Adding fake at last hit: dist first phi/first eta " << distFirstEtaPhi <<
" dist last phi/last eta "
765 std::unique_ptr<Trk::MeasurementBase> fake{};
766 if (fitterData.secondEntry->hasSLOverlap() || phifromextrapolation) {
768 std::unique_ptr<Trk::TrackParameters> mdtpar{};
769 if (fitterData.secondEntry->hasSLOverlap()){
772 mdtpar =
m_propagator->propagateParameters(ctx, startpar, *lastmdtsurf,
778 fake = std::make_unique<Trk::PseudoMeasurementOnTrack>(
781 mdtpar->associatedSurface());
788 fitterData.phiHits.push_back(fake.get());
789 fitterData.measurements.insert(fitterData.measurements.begin() + indexlast, fake.get());
790 fitterData.firstLastMeasurements.push_back(fake.get());
791 fitterData.garbage.push_back(std::move(fake));
795 if (firstmdtsurf && (!firstphisurf || (firstmdtsurf->
center() - firstphisurf->
center()).dot(firstphinormal) < -1000)) {
796 ATH_MSG_VERBOSE(
" Adding fake at first hit: dist first phi/first eta " << distFirstEtaPhi <<
" dist last phi/last eta "
798 std::unique_ptr<Trk::MeasurementBase> fake{};
799 if (phifromextrapolation) {
801 auto mdtpar =
m_propagator->propagateParameters(ctx, startpar,
806 fake = std::make_unique<Trk::PseudoMeasurementOnTrack>(
809 mdtpar->associatedSurface());
815 fitterData.phiHits.insert(fitterData.phiHits.begin(), fake.get());
816 fitterData.measurements.insert(fitterData.measurements.begin() + indexfirst, fake.get());
817 fitterData.firstLastMeasurements.insert(fitterData.firstLastMeasurements.begin(), fake.get());
818 fitterData.garbage.push_back(std::move(fake));
◆ cleanAndEvaluateTrack()
clean and evaluate the track,
- Returns
- 0 if Track does not forfill criteria, a unique_ptr otherwise (could be to a track which is the same as the current)
Definition at line 1839 of file MooTrackFitter.cxx.
1848 std::unique_ptr<Trk::Track> cleanTrack;
1849 if (excludedChambers.empty())
1852 ATH_MSG_DEBUG(
" Cleaning with exclusion list " << excludedChambers.size());
1856 ATH_MSG_DEBUG(
" Cleaner returned a zero pointer, reject track ");
◆ cleanEntry()
Definition at line 1879 of file MooTrackFitter.cxx.
1881 const MuPatSegment* segEntry =
dynamic_cast<const MuPatSegment*
>(&
entry);
1882 if (segEntry && segEntry->segment) {
1883 if (
entry.hasSmallChamber() &&
entry.hasLargeChamber()) {
1884 ATH_MSG_DEBUG(
" Segment with SL overlap, cannot perform cleaning ");
◆ cleanPhiHits()
bool Muon::MooTrackFitter::cleanPhiHits |
( |
const EventContext & |
ctx, |
|
|
double |
momentum, |
|
|
FitterData & |
phiHits, |
|
|
const PrepVec & |
patternPhiHits |
|
) |
| const |
|
private |
clean phi hits, returns true if anything happened during the cleaning
do not add CSCs as they really should be on a segment
Definition at line 1686 of file MooTrackFitter.cxx.
1690 MeasVec& phiHits = fitterData.phiHits;
1693 std::vector<const Trk::RIO_OnTrack*> rots;
1694 std::vector<std::unique_ptr<const Trk::RIO_OnTrack>> rotsNSW;
1695 std::set<Identifier>
ids;
1696 std::set<MuonStationIndex::StIndex> stations;
1697 rots.reserve(phiHits.size() + 5);
1706 rots.push_back(rot);
1710 const CompetingMuonClustersOnTrack* crot =
dynamic_cast<const CompetingMuonClustersOnTrack*
>(hit);
1712 for (
const MuonClusterOnTrack* mit : crot->containedROTs()) {
1713 rots.push_back(mit);
1714 ids.insert(mit->identify());
1716 stations.insert(stIndex);
1719 ATH_MSG_WARNING(
" phi hits should be ROTs or competing ROTs! Dropping hit ");
1723 if (rots.empty())
return false;
1726 ATH_MSG_DEBUG(
" too many phi hits, not running cleaning " << rots.size());
1737 std::vector<const Trk::PrepRawData*> roadPhiHits;
1739 return !(ids.count(prd->identify()) ||
1741 m_idHelperSvc->isCsc(prd->identify()) || m_idHelperSvc->issTgc(prd->identify()));
1746 ATH_MSG_VERBOSE(
" too many pattern phi hits, not adding any " << roadPhiHits.size());
1747 roadPhiHits.clear();
1750 if (!roadPhiHits.empty()) {
1752 std::vector<const Trk::PrepRawData*>::const_iterator pit = roadPhiHits.begin();
1753 std::vector<const Trk::PrepRawData*>::const_iterator pit_end = roadPhiHits.end();
1754 for (; pit != pit_end; ++pit) {
1756 if (pit + 1 != pit_end)
1764 std::vector<std::unique_ptr<const Trk::MeasurementBase>> newMeasurements{
m_phiHitSelector->select_rio(
momentum, rots, roadPhiHits)};
1766 newMeasurements.insert(newMeasurements.end(),
1767 std::make_move_iterator(rotsNSW.begin()),
1768 std::make_move_iterator(rotsNSW.end()));
1772 if (newMeasurements.empty()) {
1773 ATH_MSG_DEBUG(
" empty list of phi hits return from phi hit selector: input size " << phiHits.size());
1778 DistanceAlongParameters distAlongPars;
1779 constexpr
double maxDistCut = 800.;
1780 std::vector<const Trk::MeasurementBase*> measurementsToBeAdded{};
1781 measurementsToBeAdded.reserve(newMeasurements.size());
1782 for (std::unique_ptr<const Trk::MeasurementBase>& meas : newMeasurements) {
1784 if (!
id.is_valid()) {
1791 if (fitterData.hitList.empty()) {
1798 double dist = distAlongPars(fitterData.hitList.front()->parameters(), *meas);
1799 if (dist < -maxDistCut) {
1800 ATH_MSG_VERBOSE(
" discarded phi hit, distance to first hit too large " << dist);
1806 double distBack = distAlongPars(fitterData.hitList.back()->parameters(), *meas);
1807 if (distBack > maxDistCut) {
1808 ATH_MSG_VERBOSE(
" discarded phi hit, distance to last hit too large " << distBack);
1812 ATH_MSG_VERBOSE(
" new phi hit, distance from start pars " << dist <<
" distance to last pars " << distBack);
1814 measurementsToBeAdded.push_back(meas.get());
1815 fitterData.garbage.push_back(std::move(meas));
1827 if (!measurementsToBeAdded.empty()) {
1830 m_hitHandler->create(ctx, fitterData.firstEntry->entryPars(), measurementsToBeAdded, newHitList);
1831 fitterData.hitList =
m_hitHandler->merge(newHitList, fitterData.hitList);
◆ cleanSegment()
Definition at line 1891 of file MooTrackFitter.cxx.
1900 float tubeRadius = 14.6;
1904 const MdtDriftCircleOnTrack* mdt =
dynamic_cast<const MdtDriftCircleOnTrack*
>(meas);
1906 if (!mdt) {
continue; }
1909 detEl = mdt->prepRawData()->detectorElement();
1921 Amg::Vector3D LocVec2D = gToStation * mdt->prepRawData()->globalPosition();
1924 double r = mdt->localParameters()[
Trk::locR];
1936 dcs.push_back(dcOnTrack);
1940 double angleYZ = seg.localDirection().angleYZ();
1941 const Amg::Vector3D lpos = gToStation * seg.globalPosition();
1944 <<
" local parameters " << lpos.y() <<
" " << lpos.z() <<
" phi " << angleYZ <<
" with "
1945 << dcs.size() <<
" hits ");
1953 segment.hitsOnTrack(dcs.size());
1955 <<
" " <<
segment.line().y0() <<
" phi " <<
segment.line().phi());
1957 bool hasDroppedHit =
false;
1958 unsigned int dropDepth = 0;
1960 bool success =
finder.dropHits(
segment, hasDroppedHit, dropDepth);
1966 if (dcs.size() ==
segment.ndof() + 2) {
1968 }
else if (dcs.size() !=
segment.ndof() + 3) {
1969 ATH_MSG_DEBUG(
" more than one hit removed, keeping old segment ");
1978 removedIdentifiers.insert(dcit.rot()->identify());
◆ corruptEntry()
◆ createFakePhiForMeasurement()
create fake phi hit on the surface of the give measurement
Definition at line 825 of file MooTrackFitter.cxx.
831 ATH_MSG_WARNING(
" Cannot create fake phi hit from a measurement without Identifier ");
844 const CompetingMuonClustersOnTrack* crot =
dynamic_cast<const CompetingMuonClustersOnTrack*
>(&meas);
846 if (!crot || crot->containedROTs().empty())
return nullptr;
847 rot = &crot->rioOnTrack(0);
861 std::optional<Amg::Vector2D> lpos = std::nullopt;
876 <<
" theta " <<
dir.theta() <<
" seed: phi " << phiPos->phi() <<
" theta "
880 lpos = meas.associatedSurface().globalToLocal(
intersect.position, 3000.);
885 lpos = meas.associatedSurface().globalToLocal(detEl->
center(), 3000.);
887 lpos = meas.associatedSurface().globalToLocal(meas.associatedSurface().center(), 3000.);
898 double halfLength = ly < 0 ? halfLengthL : halfLengthR;
899 bool shiftedPos =
false;
901 if (std::abs(ly) > halfLength) {
903 ly = ly < 0 ? -halfLength : halfLength;
904 ATH_MSG_DEBUG(
" extrapolated position outside detector, shifting it back: " << lyold <<
" size " << halfLength <<
" new pos "
906 if (phiPos && std::abs(lyold) - halfLength > 1000.) {
922 std::optional<Amg::Vector2D> loverlapPos = surf.
globalToLocal(*overlapPos, 3000.);
926 double lyfake = halfLength - 50.;
927 if (ly < 0.) lyfake *= -1.;
929 errPos = FiftyOverSqrt12;
933 const Amg::Vector3D fakePos_plus = meas.associatedSurface().localToGlobal(LocVec2D_plus);
935 const Amg::Vector3D fakePos_min = meas.associatedSurface().localToGlobal(LocVec2D_min);
937 double phi_min = fakePos_min.phi();
938 double phi_plus = fakePos_plus.phi();
939 double phi_overlap = phiPos->phi();
940 ATH_MSG_VERBOSE(
" fake lpos " << lyfake <<
" ch half length " << halfLength <<
" phi+ " << phi_plus <<
" phi- " << phi_min
941 <<
" phi overlap " << phi_overlap <<
" err " << errPos);
946 halfLength = ly < 0 ? halfLengthL : halfLengthR;
947 if (std::abs(ly) > halfLength) { ly = ly < 0 ? -halfLength : halfLength; }
948 ATH_MSG_VERBOSE(
" fake from overlap: lpos " << ly <<
" ch half length " << halfLength <<
" overlapPos " << *overlapPos);
955 cov(0, 0) = errPos * errPos;
956 std::unique_ptr<Trk::PseudoMeasurementOnTrack> fake = std::make_unique<Trk::PseudoMeasurementOnTrack>(std::move(locPars),
957 std::move(
cov), surf);
961 const Amg::Vector3D fakePos = meas.associatedSurface().localToGlobal(LocVec2D);
964 <<
" errpr " << errPos <<
" phi " << fakePos.phi() <<
endmsg;
966 if (!shiftedPos && !overlapPos && phiPos && std::abs(phiPos->phi() - fakePos.phi()) > 0.01) {
969 ATH_MSG_WARNING(
" Problem calculating fake from IP seed: phi fake " << fakePos.phi() <<
" IP phi " << phiPos->phi()
970 <<
" local meas pos " << locMeas);
◆ createPerigee()
create perigee parameter to initialize fit
Definition at line 1543 of file MooTrackFitter.cxx.
1549 std::unique_ptr<Trk::TrackParameters> garbage;
1559 exPars = garbage.get();
1580 std::unique_ptr<Trk::Perigee> perigee = std::make_unique<Trk::Perigee>(0, 0, phi, theta, qoverp, persurf);
1582 ATH_MSG_DEBUG( std::setprecision(5) <<
" creating perigee: phi " << phi <<
" theta " << theta <<
" q*mom "
1583 << perigee->charge() * perigee->momentum().mag() <<
" r " << perigee->position().perp() <<
" z "
1584 << perigee->position().z() <<
" input q*mom " << firstPars.
charge() * firstPars.
momentum().mag());
◆ createStartParameters()
create a perigee parameter give the input data
Definition at line 1438 of file MooTrackFitter.cxx.
1441 std::unique_ptr<Trk::Perigee> startPars{
nullptr};
1442 const MuPatCandidateBase *entry1 = fitterData.firstEntry, *entry2 = fitterData.secondEntry;
1444 const MuPatTrack* trkEntry1 =
dynamic_cast<const MuPatTrack*
>(entry1);
1445 const MuPatTrack* trkEntry2 =
dynamic_cast<const MuPatTrack*
>(entry2);
1446 const MuPatSegment* seg1 =
dynamic_cast<const MuPatSegment*
>(entry1);
1447 const MuPatSegment* seg2 =
dynamic_cast<const MuPatSegment*
>(entry2);
1452 dir1 = seg1->segment->globalDirection();
1453 point1 = seg1->segment->globalPosition();
1455 if (trkEntry1->track().perigeeParameters()) {
1456 dir1 = trkEntry1->track().perigeeParameters()->momentum().unit();
1457 point1 = trkEntry1->track().perigeeParameters()->position();
1463 dir2 = seg2->segment->globalDirection();
1464 point2 = seg2->segment->globalPosition();
1466 if (trkEntry2->track().perigeeParameters()) {
1467 dir2 = trkEntry2->track().perigeeParameters()->momentum().unit();
1468 point2 = trkEntry2->track().perigeeParameters()->position();
1473 if (dir1.dot(point2 - point1) < 0) {
1476 entry1 = fitterData.secondEntry;
1477 entry2 = fitterData.firstEntry;
1478 trkEntry1 =
dynamic_cast<const MuPatTrack*
>(entry1);
1479 trkEntry2 =
dynamic_cast<const MuPatTrack*
>(entry2);
1480 seg1 =
dynamic_cast<const MuPatSegment*
>(entry1);
1481 seg2 =
dynamic_cast<const MuPatSegment*
>(entry2);
1484 const MuPatCandidateBase* bestentry = entry1;
1485 double dist1 = -1, dist2 = -1;
1486 MuPatHitPtr firstphi1{
nullptr}, lastphi1{
nullptr}, firstphi2{
nullptr}, lastphi2{
nullptr};
1488 for (
const MuPatHitPtr& hit : entry1->hitList()) {
1490 if (!firstphi1) firstphi1 = hit;
1494 for (
const MuPatHitPtr& hit : entry2->hitList()) {
1496 if (!firstphi2) firstphi2 = hit;
1500 if (firstphi1) dist1 = std::abs((firstphi1->measurement().globalPosition() - lastphi1->measurement().globalPosition()).dot(dir1));
1501 if (firstphi2) dist2 = std::abs((firstphi2->measurement().globalPosition() - lastphi2->measurement().globalPosition()).dot(dir2));
1502 if (dist2 > dist1) { bestentry = entry2; }
1503 const MuPatTrack* besttrkEntry =
dynamic_cast<const MuPatTrack*
>(bestentry);
1504 const MuPatSegment* bestseg =
dynamic_cast<const MuPatSegment*
>(bestentry);
1508 parit != besttrkEntry->track().trackParameters()->end(); ++parit) {
1525 double phi = bestseg->segment->globalDirection().phi();
1528 fitterData.secondEntry->hasSLOverlap())
1529 phi = (fitterData.hitList.back()->parameters().position() - bestseg->segment->globalPosition()).
phi();
1531 double theta = bestseg->segment->globalDirection().theta();
1533 startPars = std::make_unique<Trk::Perigee>(0, 0, phi, theta,
qOverP, persurf);
1540 fitterData.startPars = std::move(startPars);
◆ declareGaudiProperty() [1/4]
specialization for handling Gaudi::Property<SG::VarHandleKeyArray>
Definition at line 170 of file AthCommonDataStore.h.
175 hndl.documentation());
◆ declareGaudiProperty() [2/4]
specialization for handling Gaudi::Property<SG::VarHandleKey>
Definition at line 156 of file AthCommonDataStore.h.
161 hndl.documentation());
◆ declareGaudiProperty() [3/4]
specialization for handling Gaudi::Property<SG::VarHandleBase>
Definition at line 184 of file AthCommonDataStore.h.
189 hndl.documentation());
◆ declareGaudiProperty() [4/4]
◆ declareProperty() [1/6]
Declare a new Gaudi property.
- Parameters
-
name | Name of the property. |
hndl | Object holding the property value. |
doc | Documentation string for the property. |
This is the version for types that derive from SG::VarHandleBase
. The property value object is put on the input and output lists as appropriate; then we forward to the base class.
Definition at line 245 of file AthCommonDataStore.h.
250 this->declare(hndl.
vhKey());
251 hndl.
vhKey().setOwner(
this);
253 return PBASE::declareProperty(
name,hndl,
doc);
◆ declareProperty() [2/6]
Declare a new Gaudi property.
- Parameters
-
name | Name of the property. |
hndl | Object holding the property value. |
doc | Documentation string for the property. |
This is the version for types that derive from SG::VarHandleKey
. The property value object is put on the input and output lists as appropriate; then we forward to the base class.
Definition at line 221 of file AthCommonDataStore.h.
229 return PBASE::declareProperty(
name,hndl,
doc);
◆ declareProperty() [3/6]
◆ declareProperty() [4/6]
Declare a new Gaudi property.
- Parameters
-
name | Name of the property. |
property | Object holding the property value. |
doc | Documentation string for the property. |
This is the generic version, for types that do not derive from SG::VarHandleKey
. It just forwards to the base class version of declareProperty
.
Definition at line 333 of file AthCommonDataStore.h.
338 return PBASE::declareProperty(
name, property,
doc);
◆ declareProperty() [5/6]
Declare a new Gaudi property.
- Parameters
-
name | Name of the property. |
property | Object holding the property value. |
doc | Documentation string for the property. |
This dispatches to either the generic declareProperty
or the one for VarHandle/Key/KeyArray.
Definition at line 352 of file AthCommonDataStore.h.
◆ declareProperty() [6/6]
◆ detStore()
◆ evtStore() [1/2]
◆ evtStore() [2/2]
◆ extractData() [1/2]
extract all information needed for the fit from the track
Definition at line 326 of file MooTrackFitter.cxx.
330 ATH_MSG_DEBUG(
" corrupt first entry, cannot perform fit: eta hits " << entry1.etaHits().size());
334 ATH_MSG_DEBUG(
" corrupt second entry, cannot perform fit: eta hits " << entry2.etaHits().size());
338 bool isEndcap = entry1.hasEndcap() || entry2.hasEndcap();
342 SortMeasurementsByPosition sortMeasurements(isEndcap);
344 bool entry1IsFirst = sortMeasurements(entry1.hits().front(), entry2.hits().front());
346 DistanceToPars distToPars(&entry1.entryPars());
347 double distToSecond = distToPars(entry2.entryPars().position());
348 if (distToSecond < 0) entry1IsFirst =
false;
350 <<
" pos " <<
Amg::toString(entry1.entryPars().position()) <<
" second "
351 <<
Amg::toString(entry2.entryPars().position()) <<
" dist " << distToSecond);
353 const MuPatCandidateBase& firstEntry = entry1IsFirst ? entry1 : entry2;
354 const MuPatCandidateBase& secondEntry = entry1IsFirst ? entry2 : entry1;
356 fitterData.firstEntry = &firstEntry;
357 fitterData.secondEntry = &secondEntry;
360 if (
dynamic_cast<const MuPatTrack*
>(fitterData.firstEntry)) {
361 fitterData.firstIsTrack =
true;
362 fitterData.firstHasMomentum = fitterData.firstEntry->hasMomentum();
364 if (
dynamic_cast<const MuPatTrack*
>(fitterData.secondEntry)) {
365 fitterData.secondIsTrack =
true;
366 fitterData.secondHasMomentum = fitterData.secondEntry->hasMomentum();
369 fitterData.hitList =
m_hitHandler->merge(entry1.hitList(), entry2.hitList());
371 bool usePrecise =
m_usePreciseHits || (fitterData.firstHasMomentum || fitterData.secondHasMomentum);
374 if (fitterData.firstIsTrack)
378 msg(
MSG::DEBUG) << fitterData.firstEntry->etaHits().size() << std::endl
379 <<
m_hitHandler->print(fitterData.firstEntry->hitList()) << std::endl
380 <<
" second entry: ";
381 if (fitterData.secondIsTrack)
385 msg(
MSG::DEBUG) << fitterData.secondEntry->etaHits().size() << std::endl
◆ extractData() [2/2]
extract all information from the HitList of a FitterData object
Definition at line 399 of file MooTrackFitter.cxx.
400 ATH_MSG_DEBUG(
" extracting hits from hit list, using " << (usePreciseHits ?
"precise measurements" :
"broad measurements"));
404 unsigned int nhits = hitList.size();
406 fitterData.measurements.clear();
407 fitterData.firstLastMeasurements.clear();
408 fitterData.etaHits.clear();
409 fitterData.phiHits.clear();
410 fitterData.measurements.reserve(nhits);
411 fitterData.firstLastMeasurements.reserve(nhits);
417 bool currentMeasPhi =
false;
430 <<
") is not a muon Identifier, continuing");
436 fitterData.stations.insert(stIndex);
439 firstStation = stIndex;
442 const bool measuresPhi = hit->info().measuresPhi;
447 stCount.first += isSmall;
448 stCount.second += !isSmall;
452 fitterData.hasEndcap |= isEndcap;
453 fitterData.hasBarrel |= !isEndcap;
455 const Trk::MeasurementBase* meas = usePreciseHits ? &hit->preciseMeasurement() : &hit->broadMeasurement();
461 fitterData.phiHits.push_back(meas);
463 fitterData.etaHits.push_back(meas);
468 if (usePreciseHits &&
m_idHelperSvc->isMdt(
id) && std::abs(rDrift) < 0.01 && rError > 4.) {
473 fitterData.measurements.push_back(meas);
478 currentChIndex = chIndex;
479 currentMeasPhi = measuresPhi;
480 fitterData.firstLastMeasurements.push_back(&hit->broadMeasurement());
481 }
else if (currentChIndex == chIndex && currentMeasPhi == measuresPhi) {
484 currentChIndex = chIndex;
485 currentMeasPhi = measuresPhi;
487 fitterData.firstLastMeasurements.push_back(&hit->broadMeasurement());
492 if (previousHit && &previousHit->broadMeasurement() != fitterData.firstLastMeasurements.back())
493 fitterData.firstLastMeasurements.push_back(&previousHit->broadMeasurement());
496 if (fitterData.measurements.size() < 7) {
497 ATH_MSG_VERBOSE(
" Too few measurements, cannot perform fit " << fitterData.measurements.size());
502 if (fitterData.etaHits.size() < 7) {
503 ATH_MSG_VERBOSE(
" Too few eta measurements, cannot perform fit " << fitterData.etaHits.size());
507 ATH_MSG_VERBOSE(
" Extracted measurements: total " << fitterData.measurements.size() <<
" eta "
508 << fitterData.etaHits.size() <<
" phi " << fitterData.phiHits.size()<< std::endl <<
m_printer->print(fitterData.measurements));
◆ extraDeps_update_handler()
Add StoreName to extra input/output deps as needed.
use the logic of the VarHandleKey to parse the DataObjID keys supplied via the ExtraInputs and ExtraOuputs Properties to add the StoreName if it's not explicitly given
◆ finalize()
StatusCode Muon::MooTrackFitter::finalize |
( |
| ) |
|
finialize method, method taken from bass-class AlgTool
Definition at line 78 of file MooTrackFitter.cxx.
94 <<
"| extract | phi range | startPars | clean phi | add fake | fit | no perigee | low mom | extract | "
95 "add fake | final fit | passed |"
97 << std::setprecision(2) << std::setw(12) << nfailedExtractInital << std::setw(12) << nfailedMinMaxPhi << std::setw(12)
98 << nfailedParsInital << std::setw(12) << nfailedExtractCleaning << std::setw(12) << nfailedFakeInitial << std::setw(12)
99 << nfailedTubeFit << std::setw(13) << noPerigee << std::setw(12) << nlowMomentum << std::setw(12)
100 << nfailedExtractPrecise << std::setw(12) << nfailedFakePrecise << std::setw(12) << nfailedFitPrecise << std::setw(12)
103 return StatusCode::SUCCESS;
◆ fit() [1/2]
fit the hits of two MuPatCandidateBase
- Parameters
-
firstEntry | the first entry |
secondEntry | the second entry |
externalPhiHits | if provided, the external phi hits will be used instead of the phi hits on the segment |
- Returns
- a pointer to the resulting track, will return zero if the fit failed.
Definition at line 175 of file MooTrackFitter.cxx.
179 FitterData fitterData;
190 ATH_MSG_DEBUG(
" Phi range check failed, candidate stations not pointing. Will not fit track");
198 std::unique_ptr<Trk::Perigee>& startPars = fitterData.startPars;
210 bool usePrecise =
m_usePreciseHits || (fitterData.firstHasMomentum || fitterData.secondHasMomentum);
213 ATH_MSG_DEBUG(
" Failed to extract data after phi hit cleaning");
221 ATH_MSG_DEBUG(
" Failed to add fake phi hits for precise fit");
229 if (fitterData.firstHasMomentum || fitterData.secondHasMomentum) doPreFit =
false;
232 std::unique_ptr<Trk::Track>
track =
fit(ctx, *startPars, fitterData.measurements,
particleType, doPreFit);
254 if (!fitterData.firstHasMomentum && !fitterData.secondHasMomentum && doPreFit) {
258 FitterData fitterDataRefit{};
259 fitterDataRefit.startPars.reset(pp->
clone());
260 fitterDataRefit.firstIsTrack = fitterData.firstIsTrack;
261 fitterDataRefit.secondIsTrack = fitterData.secondIsTrack;
262 fitterDataRefit.firstHasMomentum = fitterData.firstHasMomentum;
263 fitterDataRefit.secondHasMomentum = fitterData.secondHasMomentum;
264 fitterDataRefit.avePhi = fitterData.avePhi;
265 fitterDataRefit.phiMin = fitterData.phiMin;
266 fitterDataRefit.phiMax = fitterData.phiMax;
267 fitterDataRefit.firstEntry = fitterData.firstEntry;
268 fitterDataRefit.secondEntry = fitterData.secondEntry;
269 fitterDataRefit.hitList = fitterData.hitList;
280 ATH_MSG_DEBUG(
" Failed to add fake phi hits for precise fit");
286 std::unique_ptr<Trk::Track> newTrack =
fit(ctx, *pp, fitterDataRefit.measurements,
Trk::muon,
false);
288 track.swap(newTrack);
293 ATH_MSG_DEBUG(
" Precise fit failed, keep fit with broad errors");
297 fitterData.garbage.insert(fitterData.garbage.end(), std::make_move_iterator(fitterDataRefit.garbage.begin()),
298 std::make_move_iterator(fitterDataRefit.garbage.end()));
299 fitterDataRefit.garbage.clear();
304 std::set<Identifier> excludedChambers;
305 if (fitterData.firstIsTrack && !fitterData.secondIsTrack) {
306 excludedChambers = fitterData.secondEntry->chamberIds();
308 }
else if (!fitterData.firstIsTrack && fitterData.secondIsTrack) {
309 excludedChambers = fitterData.firstEntry->chamberIds();
312 if (!excludedChambers.empty()) {
ATH_MSG_DEBUG(
" Using exclusion list for cleaning"); }
◆ fit() [2/2]
fit track
Definition at line 1605 of file MooTrackFitter.cxx.
1607 if (
hits.empty())
return nullptr;
1608 std::unique_ptr<Trk::Perigee> perigee{};
1609 ATH_MSG_VERBOSE(std::setprecision(5) <<
" track start parameter: phi " << startPars.momentum().phi() <<
" theta "
1610 << startPars.momentum().theta() <<
" q*mom " << startPars.charge() * startPars.momentum().mag()
1611 <<
" r " << startPars.position().perp() <<
" z " << startPars.position().z() << std::endl
1612 <<
" start par is a perigee "
1613 <<
" partHypo " << partHypo << std::endl
1618 DistanceAlongParameters distAlongPars;
1619 double dist = distAlongPars(startPars, *
hits.front());
1622 ATH_MSG_DEBUG(
" start parameters after first hit, shifting them.... ");
1625 pars = perigee.get();
1635 ATH_MSG_VERBOSE(
"fit: " << (prefit ?
"prefit" :
"fit") <<
"track with hits: " <<
hits.size() << std::endl
◆ fitSplitTrack()
construct a track from a list of TSOS and a start parameters
Definition at line 2149 of file MooTrackFitter.cxx.
2157 std::unique_ptr<Trk::Perigee> perigee = std::make_unique<Trk::Perigee>(0, 0, phi, theta, qoverp, persurf);
2159 auto trackStateOnSurfaces = std::make_unique<Trk::TrackStates>();
2160 trackStateOnSurfaces->reserve(tsos.size() + 1);
2165 std::unique_ptr<Trk::Track>
track = std::make_unique<Trk::Track>(
trackInfo, std::move(trackStateOnSurfaces),
nullptr);
2170 ATH_MSG_DEBUG(
"Track has sufficient phi constraints, fitting ");
2178 std::vector<const Trk::TrackStateOnSurface*>::const_iterator
tit = tsos.begin();
2179 std::vector<const Trk::TrackStateOnSurface*>::const_iterator tit_end = tsos.end();
2180 for (;
tit != tit_end; ++
tit) {
2182 if (!(*tit)->trackParameters())
continue;
2185 if (!meas)
continue;
2191 if (!firstMeas) firstMeas = *
tit;
2199 ATH_MSG_WARNING(
" failed to find first MDT measurement with track parameters");
2204 ATH_MSG_WARNING(
" failed to find second MDT measurement with track parameters");
2208 if (firstMeas == lastMeas) {
2209 ATH_MSG_WARNING(
" first MDT measurement with track parameters equals to second");
2219 ATH_MSG_DEBUG(
"Track has one phi constraints, adding second: dist to first " << distFirst <<
" dist to second "
2222 if (distFirst < distSecond) {
2223 positionFirstFake = lastMeas;
2225 positionFirstFake = firstMeas;
2229 ATH_MSG_DEBUG(
"Track has no phi constraints, adding one at beginning and one at the end of the track ");
2231 positionFirstFake = firstMeas;
2232 positionSecondFake = lastMeas;
2236 auto uniquePerigee = std::make_unique<Trk::Perigee>(0, 0, phi, theta, qoverp, persurf);
2237 auto trackStateOnSurfaces = std::make_unique<Trk::TrackStates>();
2238 trackStateOnSurfaces->reserve(tsos.size() + 3);
2242 tit_end = tsos.end();
2243 for (;
tit != tit_end; ++
tit) {
2251 trackStateOnSurfaces->push_back((*tit)->clone());
2252 if (*
tit == positionFirstFake) {
2253 double fakeError = 100.;
2260 std::unique_ptr<Trk::MeasurementBase> fake =
2270 if (*
tit == positionSecondFake && positionSecondFake) {
2271 double fakeError = 100.;
2278 std::unique_ptr<Trk::MeasurementBase> fake =
2291 track = std::make_unique<Trk::Track>(
trackInfo, std::move(trackStateOnSurfaces),
nullptr);
2295 std::unique_ptr<Trk::Track> refittedTrack =
refit(ctx, *
track);
2298 return refittedTrack;
◆ fitWithRefit()
fit track, refit if needed
Definition at line 1650 of file MooTrackFitter.cxx.
1664 double difMom = startPars.momentum().mag() - pp->momentum().mag();
1665 if (std::abs(difMom) > 5000.) {
1666 ATH_MSG_DEBUG(
" absolute difference in momentum too large, refitting track. Dif momentum= " << difMom);
1669 if (refittedTrack) {
1670 track.swap(refittedTrack);
1675 ATH_MSG_DEBUG(
" refitted track fit perigee: r " << pp->position().perp() <<
" z " << pp->position().z());
◆ getElementHalfLengths()
Definition at line 1092 of file MooTrackFitter.cxx.
1095 if (!mdtDetEl){
return std::make_pair(0., 0.); }
1098 return std::make_pair(halfLength, halfLength);
1102 if (!cscDetEl) {
return std::make_pair(0., 0.);}
1103 const double halfLenghth = 0.5 * cscDetEl->
stripLength(
id);
1104 return std::make_pair(halfLenghth, halfLenghth);
1107 if (!rpcDetEl) {
return std::make_pair(0, 0);}
1108 const double halfLength = 0.5 * rpcDetEl->
StripLength(
false);
1109 return std::make_pair(halfLength, halfLength);
1112 if (!tgcDetEl) {
return std::make_pair(0.,0.);}
1114 return std::make_pair(halfLength, halfLength);
1117 if (!stgcDetEl || !stgcDetEl->
getDesign(
id)) {
return std::make_pair(0.,0.);}
1119 return std::make_pair(halfLength, halfLength);
1128 return std::make_pair(0.,0.);
◆ getMaterial()
◆ getMinMaxPhi()
bool Muon::MooTrackFitter::getMinMaxPhi |
( |
FitterData & |
fitterData | ) |
const |
|
private |
calculate the minimum and maximum phi value a track could have to pass all eta channels
Definition at line 1130 of file MooTrackFitter.cxx.
1131 double phiStart = fitterData.etaHits.front()->globalPosition().phi();
1132 double phiOffset = 0.;
1134 double phiRange2 = 0.25 *
M_PI;
1136 phiOffset = 2 *
M_PI;
1137 else if (phiStart > -phiRange2 && phiStart < phiRange2)
1140 double phiMin = -999.;
1141 double phiMax = 999.;
1147 const CompetingMuonClustersOnTrack* crot =
dynamic_cast<const CompetingMuonClustersOnTrack*
>(meas);
1149 if (!crot || crot->containedROTs().empty())
continue;
1150 rot = crot->containedROTs().front();
1168 double phiLeft = gposLeft.phi();
1172 double phiRight = gposRight.phi();
1174 if (phiOffset > 1.5 *
M_PI) {
1175 if (phiLeft < 0) phiLeft = phiOffset + phiLeft;
1176 if (phiRight < 0) phiRight = phiOffset + phiRight;
1177 }
else if (phiOffset > 0.) {
1178 phiLeft = phiLeft + phiOffset;
1179 phiRight = phiRight + phiOffset;
1182 bool leftSmaller = phiLeft < phiRight;
1184 double phiMinMeas = leftSmaller ? phiLeft : phiRight;
1185 double phiMaxMeas = leftSmaller ? phiRight : phiLeft;
1186 double orgPhiMin = phiMinMeas;
1187 double orgPhiMax = phiMaxMeas;
1189 if (phiOffset > 1.5 *
M_PI) {
1190 if (orgPhiMin >
M_PI) orgPhiMin = orgPhiMin - phiOffset;
1191 if (orgPhiMax >
M_PI) orgPhiMax = orgPhiMax - phiOffset;
1192 }
else if (phiOffset > 0.) {
1193 orgPhiMin = orgPhiMin - phiOffset;
1194 orgPhiMax = orgPhiMax - phiOffset;
1197 if (phiMinMeas > phiMin) { phiMin = phiMinMeas; }
1198 if (phiMaxMeas < phiMax) { phiMax = phiMaxMeas; }
1200 if (phiMin < -998 || phiMax > 998) {
1205 double diffPhi = phiMax - phiMin;
1206 double avePhi = phiMin + 0.5 * diffPhi;
1208 ATH_MSG_VERBOSE(
"Phi ranges: min " << phiMin <<
" max " << phiMax <<
" average phi " << avePhi);
1217 if (!fitterData.phiHits.empty()) {
1219 const double minPhi =
std::min(phiMin, phiMax);
1220 const double maxPhi =
std::max(phiMin, phiMax);
1222 if (phiOffset > 1.5 *
M_PI) {
1223 if (phiMeas < 0.) phiMeas = phiOffset + phiMeas;
1224 }
else if (phiOffset > 0.) {
1225 phiMeas = phiMeas + phiOffset;
1227 double diffMin = phiMeas - minPhi;
1228 double diffMax = phiMeas - maxPhi;
1229 if (diffMin < 0. || diffMax > 0.) {
1231 ATH_MSG_VERBOSE(
" Phi hits inconsistent with min/max, rejecting track: phi meas " << phiMeas);
1238 if (phiOffset > 1.5 *
M_PI) {
1239 if (phiMax >
M_PI) phiMax = phiMax - phiOffset;
1240 if (phiMin >
M_PI) phiMin = phiMin - phiOffset;
1241 if (avePhi >
M_PI) avePhi = avePhi - phiOffset;
1242 }
else if (phiOffset > 0.) {
1243 phiMax = phiMax - phiOffset;
1244 phiMin = phiMin - phiOffset;
1245 avePhi = avePhi - phiOffset;
1248 fitterData.avePhi = avePhi;
1249 fitterData.phiMin = phiMin;
1250 fitterData.phiMax = phiMax;
◆ hasPhiConstrain() [1/2]
check whether data has sufficient phi constraints
Definition at line 976 of file MooTrackFitter.cxx.
981 !fitterData.secondEntry->phiHits().empty())
984 unsigned int nphiConstraints = fitterData.phiHits.size();
994 double distanceMin = 400.;
997 if (fitterData.phiHits.size() > 1) {
999 const Amg::Vector3D& gposFirstPhi = fitterData.phiHits.front()->globalPosition();
1000 const Amg::Vector3D& gposLastPhi = fitterData.phiHits.back()->globalPosition();
1001 double distFirstEtaPhi =
1002 (fitterData.measurements.front()->globalPosition() - fitterData.phiHits.front()->globalPosition()).
mag();
1003 double distLastEtaPhi = (fitterData.measurements.back()->globalPosition() - fitterData.phiHits.back()->globalPosition()).
mag();
1009 distance = fitterData.hasEndcap ? std::abs(globalDistance.z()) : globalDistance.
perp();
1012 if (distance < distanceMin || distFirstEtaPhi > 1000 || distLastEtaPhi > 1000) {
1013 nphiConstraints -= fitterData.phiHits.size();
1014 nphiConstraints += 1;
1015 ATH_MSG_VERBOSE(
" distance between phi hits too small, updating phi constraints ");
1017 ATH_MSG_VERBOSE(
" distance between phi hits sufficient, no fake hits needed ");
1022 <<
" | nphi hits | distance | SL station overlaps | small ch | large ch | nphiConstraints " << std::endl
1023 << std::setw(12) << fitterData.phiHits.size() << std::setw(11) << (
int)
distance << std::setw(22)
1024 << fitterData.numberOfSLOverlaps() << std::setw(11) << fitterData.numberOfSmallChambers() << std::setw(11)
1025 << fitterData.numberOfLargeChambers() << std::setw(18) << nphiConstraints <<
endmsg;
1028 return nphiConstraints;
◆ hasPhiConstrain() [2/2]
unsigned int Muon::MooTrackFitter::hasPhiConstrain |
( |
Trk::Track * |
track | ) |
const |
|
private |
check whether data has sufficient phi constraints
Definition at line 1031 of file MooTrackFitter.cxx.
1032 std::map<MuonStationIndex::StIndex, StationPhiData> stationDataMap;
1038 if (
summary->muonTrackSummary()) {
1039 muonSummary = *
summary->muonTrackSummary();
1043 if (tmpSum.muonTrackSummary()) muonSummary = *(tmpSum.muonTrackSummary());
1051 std::vector<Trk::MuonTrackSummary::ChamberHitSummary>::const_iterator chit = muonSummary.
chamberHitSummary().begin();
1052 std::vector<Trk::MuonTrackSummary::ChamberHitSummary>::const_iterator chit_end = muonSummary.
chamberHitSummary().end();
1053 for (; chit != chit_end; ++chit) {
1057 StationPhiData& stData = stationDataMap[stIndex];
1058 if (chit->isMdt()) {
1060 ++stData.nSmallChambers;
1062 ++stData.nLargeChambers;
1064 if (chit->phiProjection().nhits) ++stData.nphiHits;
1068 unsigned int phiConstraints = 0;
1069 unsigned int stationsWithSmall = 0;
1070 unsigned int stationsWithLarge = 0;
1074 for (; sit != sit_end; ++sit) {
1075 StationPhiData& stData = sit->second;
1078 phiConstraints += stData.nphiHits;
1080 if (stData.nSmallChambers > 0 && stData.nLargeChambers > 0)
1082 else if (stData.nSmallChambers > 0)
1083 ++stationsWithSmall;
1084 else if (stData.nLargeChambers > 0)
1085 ++stationsWithLarge;
1088 if (stationsWithSmall > 0 && stationsWithLarge > 0) { ++phiConstraints; }
1090 return phiConstraints;
◆ initialize()
StatusCode Muon::MooTrackFitter::initialize |
( |
| ) |
|
initialize method, method taken from bass-class AlgTool
Definition at line 56 of file MooTrackFitter.cxx.
75 return StatusCode::SUCCESS;
◆ inputHandles()
Return this algorithm's input handles.
We override this to include handle instances from key arrays if they have not yet been declared. See comments on updateVHKA.
◆ interfaceID()
static const InterfaceID& Muon::MooTrackFitter::interfaceID |
( |
| ) |
|
|
inlinestatic |
access to tool interface
Definition at line 90 of file MooTrackFitter.h.
91 static const InterfaceID IID_MooTrackFitter(
"Muon::MooTrackFitter", 1, 0);
92 return IID_MooTrackFitter;
◆ msg() [1/2]
◆ msg() [2/2]
◆ msgLvl()
◆ outputHandles()
Return this algorithm's output handles.
We override this to include handle instances from key arrays if they have not yet been declared. See comments on updateVHKA.
◆ phiSeeding()
calculate phi used to for seeding the fit
Definition at line 1311 of file MooTrackFitter.cxx.
1314 if (!
dynamic_cast<const MuPatTrack*
>(fitterData.firstEntry)) {
1316 if (
dynamic_cast<const MuPatTrack*
>(fitterData.secondEntry)) {
1317 ATH_MSG_DEBUG(
"Using phi of second entry " << fitterData.secondEntry->entryPars().momentum().phi());
1318 return fitterData.secondEntry->entryPars().momentum().phi();
1323 const MuPatSegment* segInfo1 =
dynamic_cast<const MuPatSegment*
>(fitterData.firstEntry);
1324 const MuPatSegment* segInfo2 =
dynamic_cast<const MuPatSegment*
>(fitterData.secondEntry);
1325 if (segInfo1 && segInfo2 && fitterData.stations.size() == 1 && fitterData.numberOfSLOverlaps() == 1) {
1329 IMuonSegmentInOverlapResolvingTool::SegmentMatchResult
result =
1332 if (!
result.goodMatch()) {
1336 double overlapPhi =
result.phiResult.segmentDirection1.phi();
1343 Amg::Vector3D difPos = fitterData.firstEntry->entryPars().position() - fitterData.secondEntry->entryPars().position();
1345 if (difPos.y() > 0) difPos *= -1.;
1348 const double dphi = fitterData.firstEntry->entryPars().momentum().deltaPhi(difPos);
1349 if (std::abs(dphi) > 0.2) {
1350 ATH_MSG_DEBUG(
"Large diff between phi of segment direction and of position "
1351 << fitterData.firstEntry->entryPars().momentum().phi() <<
" from pos " << difPos.phi() <<
" dphi " << dphi);
1352 return difPos.phi();
1355 ATH_MSG_DEBUG(
"Using phi of first entry " << fitterData.firstEntry->entryPars().momentum().phi() <<
" phi from position "
1358 return fitterData.firstEntry->entryPars().momentum().phi();
1366 Amg::Vector3D difPos = etaHits.back()->globalPosition() - etaHits.front()->globalPosition();
1367 if (difPos.mag() > 3000) {
1368 ATH_MSG_DEBUG(
"Seeding phi using average phi of eta hits ");
1377 if (phiHits.empty()) {
1380 return fitterData.avePhi;
1384 if (phiHits.size() == 1) {
return phiHits.front()->globalPosition().phi(); }
1387 const MuPatSegment* segInfo1 =
dynamic_cast<const MuPatSegment*
>(fitterData.firstEntry);
1388 if (segInfo1 && segInfo1->containsStation(
MuonStationIndex::EI) && !segInfo1->phiHits().empty()) {
1389 return segInfo1->segment->globalDirection().phi();
1393 if (segInfo1 && segInfo1->containsStation(
MuonStationIndex::EM) && !segInfo1->phiHits().empty()) {
1394 return segInfo1->segment->globalDirection().phi();
1399 MeasCit hit = phiHits.begin();
1400 MeasCit hit_end = phiHits.end();
1402 for (; hit != hit_end; ++hit) avePos += (*hit)->globalPosition();
1403 avePos /= phiHits.size();
1407 Amg::Vector3D difPos = phiHits.back()->globalPosition() - phiHits.front()->globalPosition();
◆ qOverPFromEntries()
get q/p using angle + position of the two entries
Definition at line 1276 of file MooTrackFitter.cxx.
1281 if (firstEntry.hasMomentum())
1283 else if (secondEntry.hasMomentum())
1287 std::shared_ptr<const MuonSegment> segFirst =
segmentFromEntry(ctx, firstEntry);
1289 ATH_MSG_WARNING(
" failed to get segment for first entry, this should not happen ");
1293 std::shared_ptr<const MuonSegment> segSecond =
segmentFromEntry(ctx, secondEntry);
1295 ATH_MSG_WARNING(
" failed to get segment for second entry, this should not happen ");
1299 std::vector<const MuonSegment*> segments{segFirst.get(), segSecond.get()};
◆ qOverPFromEntry()
◆ refit() [1/2]
refit a MuPatTrack
Definition at line 115 of file MooTrackFitter.cxx.
118 FitterData fitterData;
121 fitterData.hitList = trkCan.hitList();
124 if (!
extractData(fitterData,
true))
return nullptr;
127 const Trk::Perigee* pp = trkCan.track().perigeeParameters();
128 if (!pp)
return nullptr;
131 std::unique_ptr<Trk::Track>
track =
fit(ctx, *pp, fitterData.measurements,
Trk::muon,
false);
135 std::set<Identifier> excludedChambers;
◆ refit() [2/2]
refit a track
Definition at line 144 of file MooTrackFitter.cxx.
158 std::set<Identifier> excludedChambers;
◆ removeSegmentOutliers()
void Muon::MooTrackFitter::removeSegmentOutliers |
( |
FitterData & |
fitterData | ) |
const |
|
private |
Definition at line 1984 of file MooTrackFitter.cxx.
1985 if (fitterData.startPars->momentum().mag() < 4000.)
return;
1987 std::set<Identifier> removedIdentifiers;
1988 if (fitterData.firstEntry)
cleanEntry(*fitterData.firstEntry, removedIdentifiers);
1989 if (fitterData.secondEntry)
cleanEntry(*fitterData.secondEntry, removedIdentifiers);
1991 ATH_MSG_DEBUG(
" removing hits " << removedIdentifiers.size());
1993 for (
const Identifier&
id : removedIdentifiers) {
◆ renounce()
◆ renounceArray()
◆ restrictedMomentum()
double Muon::MooTrackFitter::restrictedMomentum |
( |
double |
momentum | ) |
|
|
static |
◆ segmentFromEntry()
get segment from entry
Definition at line 1255 of file MooTrackFitter.cxx.
1257 const MuPatTrack* trkEntry =
dynamic_cast<const MuPatTrack*
>(&
entry);
1264 const MuPatSegment* segEntry =
dynamic_cast<const MuPatSegment*
>(&
entry);
1266 return std::shared_ptr<const MuonSegment> {segEntry->segment, Unowned()};
◆ splitTrack()
split given track if it crosses the calorimeter volume, code assumes that the track was already extrapolated to the muon entry record using the MuonTrackExtrapolationTool.
It uses the double perigee to spot the tracks to be split.
Definition at line 1999 of file MooTrackFitter.cxx.
2003 if (!oldTSOT)
return std::make_pair<std::unique_ptr<Trk::Track>, std::unique_ptr<Trk::Track>>(
nullptr,
nullptr);
2008 bool atIP = std::abs(perigee->position().dot(perigee->momentum().unit())) < 10;
2010 ATH_MSG_DEBUG(
" track extressed at perigee, cannot split it ");
2011 return std::make_pair<std::unique_ptr<Trk::Track>, std::unique_ptr<Trk::Track>>(
nullptr,
nullptr);
2016 unsigned int nperigees(0);
2019 for (;
tit != tit_end; ++
tit) {
2024 if (nperigees != 2) {
2025 ATH_MSG_DEBUG(
" Number of perigees is not one, cannot split it " << nperigees);
2026 return std::make_pair<std::unique_ptr<Trk::Track>, std::unique_ptr<Trk::Track>>(
nullptr,
nullptr);
2029 struct TrackContent {
2030 TrackContent() : firstParameters(nullptr), tsos(),
track() {}
2032 std::vector<const Trk::TrackStateOnSurface*> tsos;
2033 std::unique_ptr<Trk::Track>
track;
2034 std::set<MuonStationIndex::StIndex> stations;
2038 TrackContent firstTrack;
2039 firstTrack.tsos.reserve(oldTSOT->
size());
2041 TrackContent secondTrack;
2042 secondTrack.tsos.reserve(oldTSOT->
size());
2045 TrackContent* currentTrack = &firstTrack;
2052 tit_end = oldTSOT->
end();
2053 for (;
tit != tit_end; ++
tit) {
2063 if (nperigees == 2) {
2064 ATH_MSG_DEBUG(
" found second perigee, switch to second track");
2065 currentTrack = &secondTrack;
2067 }
else if (nperigees > 2) {
2073 if (nperigees == 1) {
ATH_MSG_VERBOSE(
" state between the two perigees "); }
2076 if (!currentTrack->firstParameters) {
2078 currentTrack->firstParameters =
pars;
2084 currentTrack->tsos.push_back(*
tit);
2092 currentTrack->tsos.push_back(*
tit);
2100 currentTrack->tsos.push_back(*
tit);
2104 if (nperigees == 1)
ATH_MSG_WARNING(
" found muon measurement inbetween the two perigees, this should not happen ");
2111 currentTrack->tsos.push_back(*
tit);
2114 if (firstTrack.firstParameters)
2115 ATH_MSG_DEBUG(
" first track content: states " << firstTrack.tsos.size() <<
" stations " << firstTrack.stations.size() <<
endmsg
2116 <<
" first pars " <<
m_printer->print(*firstTrack.firstParameters));
2118 else if (secondTrack.firstParameters)
2119 ATH_MSG_DEBUG(
" second track content: states " << secondTrack.tsos.size() <<
" stations " << secondTrack.stations.size()
2120 <<
endmsg <<
" first pars " <<
m_printer->print(*secondTrack.firstParameters));
2123 if ((firstTrack.firstParameters && firstTrack.stations.size() > 1) &&
2124 (secondTrack.firstParameters && secondTrack.stations.size() > 1)) {
2125 ATH_MSG_DEBUG(
" track candidate can be split, trying to fit split tracks ");
2127 firstTrack.track =
fitSplitTrack(ctx, *firstTrack.firstParameters, firstTrack.tsos);
2128 if (firstTrack.track) {
2131 secondTrack.track =
fitSplitTrack(ctx, *secondTrack.firstParameters, secondTrack.tsos);
2133 if (secondTrack.track) {
2138 firstTrack.track.reset();
2145 return std::make_pair<std::unique_ptr<Trk::Track>, std::unique_ptr<Trk::Track>>(std::move(firstTrack.track),
2146 std::move(secondTrack.track));
◆ sysInitialize()
◆ sysStart()
Handle START transition.
We override this in order to make sure that conditions handle keys can cache a pointer to the conditions container.
◆ thetaSeeding()
calculate theta used for seeding the fit
Definition at line 1414 of file MooTrackFitter.cxx.
1416 if (etaHits.empty()) {
1423 theta =
entry.entryPars().momentum().theta();
1426 if (etaHits.size() == 1) {
1427 theta = etaHits.front()->globalPosition().theta();
1430 Amg::Vector3D difPos = etaHits.back()->globalPosition() - etaHits.front()->globalPosition();
1431 theta = difPos.theta();
◆ updateVHKA()
◆ validMomentum()
check whether mometum of start parameter is ok
Definition at line 1870 of file MooTrackFitter.cxx.
1871 const double p =
pars.momentum().mag();
1873 ATH_MSG_DEBUG(
" momentum below threshold: momentum " <<
pars.momentum().mag() <<
" p " <<
pars.momentum().perp());
◆ m_allowFirstFit
Gaudi::Property<bool> Muon::MooTrackFitter::m_allowFirstFit {this, "AllowFirstFitResult", false, "Return the result of the prefit is final fit fails"} |
|
private |
◆ m_chi2Cut
Gaudi::Property<double> Muon::MooTrackFitter::m_chi2Cut {this, "ReducedChi2Cut", 100., "minimum chi2/ndof for a track to be accepted"} |
|
private |
◆ m_cleaner
◆ m_cleanPhiHits
Gaudi::Property<bool> Muon::MooTrackFitter::m_cleanPhiHits {this, "CleanPhiHits", true, "Special flag to switch off phi hit cleaning"} |
|
private |
◆ m_cosmics
Gaudi::Property<bool> Muon::MooTrackFitter::m_cosmics {this, "Cosmics", false, "Special treatment for cosmics"} |
|
private |
◆ m_detStore
◆ m_edmHelperSvc
Initial value:{
this, "edmHelper", "Muon::MuonEDMHelperSvc/MuonEDMHelperSvc",
"Handle to the service providing the IMuonEDMHelperSvc interface"}
multi purpose helper tool
Definition at line 273 of file MooTrackFitter.h.
◆ m_evtStore
◆ m_hitHandler
◆ m_idHelperSvc
◆ m_magFieldProperties
◆ m_matEffects
Gaudi::Property<int> Muon::MooTrackFitter::m_matEffects {this, "MatEffects", 2, "type of material interaction in extrapolation"} |
|
private |
◆ m_momentumEstimator
Initial value:{
this, "SegmentMomentum", "MuonSegmentMomentum/MuonSegmentMomentum"}
tool to estimate track momentum
Definition at line 264 of file MooTrackFitter.h.
◆ m_nfailedExtractCleaning
std::atomic_uint Muon::MooTrackFitter::m_nfailedExtractCleaning {0} |
|
mutableprivate |
◆ m_nfailedExtractInital
std::atomic_uint Muon::MooTrackFitter::m_nfailedExtractInital {0} |
|
mutableprivate |
◆ m_nfailedExtractPrecise
std::atomic_uint Muon::MooTrackFitter::m_nfailedExtractPrecise {0} |
|
mutableprivate |
◆ m_nfailedFakeInitial
std::atomic_uint Muon::MooTrackFitter::m_nfailedFakeInitial {0} |
|
mutableprivate |
◆ m_nfailedFakePrecise
std::atomic_uint Muon::MooTrackFitter::m_nfailedFakePrecise {0} |
|
mutableprivate |
◆ m_nfailedFitPrecise
std::atomic_uint Muon::MooTrackFitter::m_nfailedFitPrecise {0} |
|
mutableprivate |
◆ m_nfailedMinMaxPhi
std::atomic_uint Muon::MooTrackFitter::m_nfailedMinMaxPhi {0} |
|
mutableprivate |
◆ m_nfailedParsInital
std::atomic_uint Muon::MooTrackFitter::m_nfailedParsInital {0} |
|
mutableprivate |
◆ m_nfailedTubeFit
std::atomic_uint Muon::MooTrackFitter::m_nfailedTubeFit {0} |
|
mutableprivate |
◆ m_nfits
std::atomic_uint Muon::MooTrackFitter::m_nfits {0} |
|
mutableprivate |
◆ m_nlowMomentum
std::atomic_uint Muon::MooTrackFitter::m_nlowMomentum {0} |
|
mutableprivate |
◆ m_noPerigee
std::atomic_uint Muon::MooTrackFitter::m_noPerigee {0} |
|
mutableprivate |
◆ m_nsuccess
std::atomic_uint Muon::MooTrackFitter::m_nsuccess {0} |
|
mutableprivate |
◆ m_openingAngleCut
Gaudi::Property<double> Muon::MooTrackFitter::m_openingAngleCut |
|
private |
Initial value:{this, "OpeningAngleCut", 0.3,
"cut on the maximum difference in phi between measurements on the track"}
Definition at line 308 of file MooTrackFitter.h.
◆ m_overlapResolver
Initial value:{
this, "SegmentInOverlapTool", "Muon::MuonSegmentInOverlapResolvingTool/MuonSegmentInOverlapResolvingTool"}
Definition at line 285 of file MooTrackFitter.h.
◆ m_ParticleHypothesis
◆ m_patRecInfo
◆ m_phiHitSelector
Initial value:{this, "PhiHitSelector",
"MuonPhiHitSelector/MuonPhiHitSelector"}
tool to clean phi hits
Definition at line 282 of file MooTrackFitter.h.
◆ m_phiHitsMax
Gaudi::Property<unsigned int> Muon::MooTrackFitter::m_phiHitsMax |
|
private |
Initial value:{this, "MaxPatternPhiHits", 40,
"If more than maximum number of phi hits on pattern, no hits will be added"}
Definition at line 302 of file MooTrackFitter.h.
◆ m_preciseFirstStation
Gaudi::Property<bool> Muon::MooTrackFitter::m_preciseFirstStation |
|
private |
Initial value:{this, "UsePreciseHitsInFirstStation", false,
"use precise hits in first station to stabalise the fit"}
Definition at line 305 of file MooTrackFitter.h.
◆ m_preCleanChi2Cut
Gaudi::Property<double> Muon::MooTrackFitter::m_preCleanChi2Cut |
|
private |
Initial value:{this, "PreCleaningReducedChi2Cut", 500.,
"minimum chi2/ndof for a track to be passed to cleaner"}
Definition at line 310 of file MooTrackFitter.h.
◆ m_printer
Initial value:{this, "MuonPrinterTool",
"Muon::MuonEDMPrinterTool/MuonEDMPrinterTool"}
tool to print out EDM objects
Definition at line 276 of file MooTrackFitter.h.
◆ m_propagator
Initial value:{this, "Propagator",
"Trk::RungeKuttaPropagator/AtlasRungeKuttaPropagator"}
propagator
Definition at line 260 of file MooTrackFitter.h.
◆ m_pThreshold
Gaudi::Property<double> Muon::MooTrackFitter::m_pThreshold |
|
private |
Initial value:{this, "PThreshold", 500.,
"Momentum cut-off. Seeds below the threshold will not be fitted"}
Definition at line 298 of file MooTrackFitter.h.
◆ m_runOutlier
Gaudi::Property<Trk::RunOutlierRemoval> Muon::MooTrackFitter::m_runOutlier {this, "RunOutlier", false, "Switch whether to run outlier logics or not"} |
|
private |
◆ m_seedAtStartOfTrack
Gaudi::Property<bool> Muon::MooTrackFitter::m_seedAtStartOfTrack {this, "SeedAtStartOfTrack", true, "Provide seed parameters at the start of the track"} |
|
private |
◆ m_seedPhiWithEtaHits
Gaudi::Property<bool> Muon::MooTrackFitter::m_seedPhiWithEtaHits {this, "SeedPhiWithEtaHits", false, "Seed phi from positions first last eta hit"} |
|
private |
◆ m_seedWithAvePhi
Gaudi::Property<bool> Muon::MooTrackFitter::m_seedWithAvePhi {this, "SeedWithAvePhi", true, "Seed with average phi of all phi hits"} |
|
private |
◆ m_seedWithSegmentTheta
Gaudi::Property<bool> Muon::MooTrackFitter::m_seedWithSegmentTheta {this, "SeedWithSegmentTheta", true, "Seed with theta connecting first + last eta hit"} |
|
private |
◆ m_slFit
Gaudi::Property<bool> Muon::MooTrackFitter::m_slFit {this, "SLFit", true, "Perform sl fit"} |
|
private |
◆ m_slProp
Gaudi::Property<bool> Muon::MooTrackFitter::m_slProp {this, "SLProp", false, "Enable straight line propagation"} |
|
private |
◆ m_trackFitter
◆ m_trackSummaryTool
Initial value:{
this, "TrackSummaryTool", "Muon::MuonTrackSummaryHelperTool/MuonTrackSummaryHelperTool"}
Definition at line 287 of file MooTrackFitter.h.
◆ m_trackToSegmentTool
Initial value:{
this, "TrackToSegmentTool",
"Muon::MuonTrackToSegmentTool/MuonTrackToSegmentTool"}
helper tool to convert tracks into segments
Definition at line 278 of file MooTrackFitter.h.
◆ m_usePreciseHits
Gaudi::Property<bool> Muon::MooTrackFitter::m_usePreciseHits {this, "UsePreciseHits", false, "Use actual measurement error"} |
|
private |
◆ m_usePrefit
Gaudi::Property<bool> Muon::MooTrackFitter::m_usePrefit {this, "UsePrefit", true, "Use prefit"} |
|
private |
◆ m_varHandleArraysDeclared
◆ m_vhka
The documentation for this class was generated from the following files:
std::unique_ptr< Trk::Track > cleanAndEvaluateTrack(const EventContext &ctx, Trk::Track &track, const std::set< Identifier > &excludedChambers) const
clean and evaluate the track,
Gaudi::Property< unsigned int > m_phiHitsMax
JetConstituentVector::iterator iterator
std::unique_ptr< RIO_OnTrack > uniqueClone() const
NVI clone returning unique_ptr.
PublicToolHandle< MuonEDMPrinterTool > m_printer
tool to print out EDM objects
static std::unique_ptr< Trk::TrackStateOnSurface > createPerigeeTSOS(std::unique_ptr< Trk::TrackParameters > perigee)
create a perigee TSOS, takes ownership of the Perigee
bool extractData(const MuPatCandidateBase &entry1, const MuPatCandidateBase &entry2, FitterData &fitterData) const
extract all information needed for the fit from the track
const ShapeFitter * fitter
const TrackParameters * trackParameters() const
return ptr to trackparameters const overload
Gaudi::Property< bool > m_seedPhiWithEtaHits
static StIndex toStationIndex(ChIndex index)
convert ChIndex into StIndex
Contains information about the 'fitter' of this track.
@ Perigee
This represents a perigee, and so will contain a Perigee object only.
static double qOverPFromEntry(const MuPatCandidateBase &entry)
get q/p from entry
Const iterator class for DataVector/DataList.
constexpr ParticleHypothesis particle[PARTICLEHYPOTHESES]
the array of masses
std::unique_ptr< Trk::Perigee > createPerigee(const EventContext &ctx, const Trk::TrackParameters &firstPars, const Trk::MeasurementBase &firstMeas) const
create perigee parameter to initialize fit
std::atomic_uint m_nfailedExtractCleaning
std::atomic_uint m_nfailedExtractInital
Eigen::Matrix< double, Eigen::Dynamic, 1 > VectorX
Dynamic Vector - dynamic allocation.
Eigen::Matrix< double, Eigen::Dynamic, Eigen::Dynamic > MatrixX
Dynamic Matrix - dynamic allocation.
Gaudi::Property< bool > m_seedWithSegmentTheta
std::vector< DCOnTrack > DCOnTrackVec
double StripLength(bool measphi) const
returns the strip length for the phi or eta plane
std::unique_ptr< Trk::Track > refit(const EventContext &ctx, const MuPatTrack &trkCan) const
refit a MuPatTrack
double charge() const
Returns the charge.
bool getMinMaxPhi(FitterData &fitterData) const
calculate the minimum and maximum phi value a track could have to pass all eta channels
Gaudi::Property< bool > m_usePreciseHits
double innerTubeRadius() const
Returns the inner tube radius excluding the aluminium walls.
PublicToolHandle< MuPatHitTool > m_hitHandler
hit handler
ToolHandle< IMuonSegmentMomentumEstimator > m_momentumEstimator
tool to estimate track momentum
Intersection straightLineIntersection(const T &pars, bool forceDir=false, const Trk::BoundaryCheck &bchk=false) const
fst straight line intersection schema - templated for charged and neutral parameters
Scalar perp() const
perp method - perpenticular length
std::shared_ptr< const MuonSegment > segmentFromEntry(const EventContext &ctx, const MuPatCandidateBase &entry) const
get segment from entry
const Amg::Vector3D & position() const
Access method for the position.
Eigen::Matrix< double, 2, 1 > Vector2D
std::atomic_uint m_noPerigee
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T > &t)
std::unique_ptr< ParametersBase< DIM, T > > uniqueClone() const
clone method for polymorphic deep copy returning unique_ptr; it is not overriden, but uses the existi...
Dummy class used to allow special convertors to be called for surfaces owned by a detector element.
const TrackInfo & info() const
Returns a const ref to info of a const tracks.
std::atomic_uint m_nfailedTubeFit
Gaudi::Property< double > m_chi2Cut
Gaudi::Property< double > m_openingAngleCut
std::atomic_uint m_nsuccess
virtual const Amg::Vector3D & globalPosition() const override=0
Interface method to get the global Position.
virtual Amg::Transform3D GlobalToAmdbLRSTransform() const
bool addFakePhiHits(const EventContext &ctx, FitterData &fitterData, const Trk::TrackParameters &referenceParameter) const
check fitterData, add fake phi hits if needed.
std::pair< int, int > SmallLargeChambers
StoreGateSvc_t m_evtStore
Pointer to StoreGate (event store by default)
const MuonChannelDesign * getDesign(const Identifier &id) const
returns the MuonChannelDesign class for the given identifier
std::vector< SG::VarHandleKeyArray * > m_vhka
Gaudi::Property< int > m_matEffects
bool msgLvl(const MSG::Level lvl) const
Gaudi::Property< bool > m_seedWithAvePhi
const MeasurementBase * measurementOnTrack() const
returns MeasurementBase const overload
An RpcReadoutElement corresponds to a single RPC module; therefore typicaly a barrel muon station con...
@ loc2
generic first and second local coordinate
std::atomic_uint m_nfailedExtractPrecise
bool cleanPhiHits(const EventContext &ctx, double momentum, FitterData &phiHits, const PrepVec &patternPhiHits) const
clean phi hits, returns true if anything happened during the cleaning
Trk::TrackInfo::TrackPatternRecoInfo m_patRecInfo
This class represents a drift time measurement.
std::unique_ptr< Trk::Track > fitSplitTrack(const EventContext &ctx, const Trk::TrackParameters &startPars, const std::vector< const Trk::TrackStateOnSurface * > &tsos) const
construct a track from a list of TSOS and a start parameters
#define ATH_MSG_VERBOSE(x)
Gaudi::Property< double > m_pThreshold
const Amg::Vector3D & center() const
Returns the center position of the Surface.
ToolHandle< IMuonTrackToSegmentTool > m_trackToSegmentTool
helper tool to convert tracks into segments
bool fit(const LArSamples::AbsShape &data, const AbsShape &reference, double &k, double &deltaT, double &chi2, const ScaledErrorData *sed=0) const
std::unique_ptr< Trk::MeasurementBase > createFakePhiForMeasurement(const Trk::MeasurementBase &measurement, const Amg::Vector3D *overlapPos, const Amg::Vector3D *phiPos, double error) const
create fake phi hit on the surface of the give measurement
bool is_valid() const
Check if id is in a valid state.
MeasVec::const_iterator MeasCit
double stripLength(int chamberLayer, int measuresPhi, int stripNumber, double &epsilon) const
Gaudi::Property< bool > m_slProp
Implementation of 2 dimensional vector class.
std::pair< double, ParamDefs > DefinedParameter
const std::vector< ChamberHitSummary > & chamberHitSummary() const
access to the vector of chamber hit summaries on the track
Gaudi::Property< double > m_preCleanChi2Cut
virtual void setOwner(IDataHandleHolder *o)=0
std::vector< const Trk::MeasurementBase * > MeasVec
Class to handle pseudo-measurements in fitters and on track objects.
double get(ParamDefs par) const
Retrieve specified parameter (const version).
double stripActiveLengthRight(const Identifier &id) const
Gaudi::Property< Trk::RunOutlierRemoval > m_runOutlier
std::string toString(const Translation3D &translation, int precision=4)
GeoPrimitvesToStringConverter.
Gaudi::Property< bool > m_cleanPhiHits
bool corruptEntry(const MuPatCandidateBase &entry) const
sanity check for entries
MuPatHitList::const_iterator MuPatHitCit
bool validMomentum(const Trk::TrackParameters &pars) const
check whether mometum of start parameter is ok
double getActiveTubeLength(const int tubeLayer, const int tube) const
An sTgcReadoutElement corresponds to a single STGC module; therefore typicaly a barrel muon station c...
Eigen::Affine3d Transform3D
A TgcReadoutElement corresponds to a single TGC chamber; therefore typically a TGC station contains s...
virtual const Surface & surface() const =0
Return surface associated with this detector element.
std::atomic_uint m_nfailedFakePrecise
Out copy_if(In first, const In &last, Out res, const Pred &p)
virtual const Amg::Vector3D & normal() const
Returns the normal vector of the Surface (i.e.
Gaudi::Property< bool > m_usePrefit
void removeSegmentOutliers(FitterData &fitterData) const
Detailed track summary for the muon system Give access to hit counts per chamber.
Gaudi::Property< bool > m_preciseFirstStation
StoreGateSvc_t m_detStore
Pointer to StoreGate (detector store by default)
Trk::ParticleHypothesis m_ParticleHypothesis
nomen est omen
std::atomic_uint m_nlowMomentum
double gangCentralWidth(int gasGap, int gang) const
Returns the length of the central wire in the gang.
std::atomic_uint m_nfailedMinMaxPhi
std::shared_ptr< MuPatHit > MuPatHitPtr
@ FullField
Field is set to be realistic, but within a given Volume.
ToolHandle< IMuonHitSelector > m_phiHitSelector
tool to clean phi hits
const Amg::MatrixX & localCovariance() const
Interface method to get the localError.
virtual void renounce()=0
std::conditional< std::is_base_of< SG::VarHandleKeyArray, T >::value, VarHandleKeyArrayType, type2 >::type type
@ NoField
Field is set to 0., 0., 0.,.
const Perigee * perigeeParameters() const
return Perigee.
represents the track state (measurement, material, fit parameters and quality) at a surface.
virtual const Amg::Vector3D & globalPosition() const override final
returns the global Position (interface from MeasurementBase)
A summary of the information contained by a track.
virtual const Surface & associatedSurface() const =0
Interface method to get the associated Surface.
Gaudi::Property< bool > m_allowFirstFit
double error(const Amg::MatrixX &mat, int index)
return diagonal error of the matrix caller should ensure the matrix is symmetric and the index is in ...
Gaudi::Property< bool > m_cosmics
ToolHandle< Trk::ITrackSummaryHelperTool > m_trackSummaryTool
std::atomic_uint m_nfailedFitPrecise
virtual const Amg::Vector3D & globalPosition() const =0
Interface method to get the global Position.
void cleanSegment(const MuonSegment &seg, std::set< Identifier > &removedIdentifiers) const
Eigen::Matrix< double, 3, 1 > Vector3D
std::vector< MuPatHitPtr > MuPatHitList
std::atomic_uint m_nfailedParsInital
ToolHandle< Trk::IPropagator > m_propagator
propagator
const LocalParameters & localParameters() const
Interface method to get the LocalParameters.
Trk::MagneticFieldProperties m_magFieldProperties
magnetic field properties
double channelLength(int channel) const
STRIPS ONLY: calculate channel length for a given strip number.
const_iterator end() const noexcept
Return a const_iterator pointing past the end of the collection.
unsigned int hasPhiConstrain(FitterData &inputData) const
check whether data has sufficient phi constraints
const Amg::Vector3D & momentum() const
Access method for the momentum.
std::atomic_uint m_nfailedFakeInitial
virtual bool globalToLocal(const Amg::Vector3D &glob, const Amg::Vector3D &mom, Amg::Vector2D &loc) const =0
Specified by each surface type: GlobalToLocal method without dynamic memory allocation - boolean chec...
ToolHandle< IMuonTrackCleaner > m_cleaner
std::optional< double > intersect(const AmgVector(N)&posA, const AmgVector(N)&dirA, const AmgVector(N)&posB, const AmgVector(N)&dirB)
Calculates the point B' along the line B that's closest to a second line A.
#define ATH_MSG_WARNING(x)
std::string getStationType() const
Identifier identify() const
return the identifier -extends MeasurementBase
Gaudi::Property< bool > m_slFit
An MMReadoutElement corresponds to a single STGC module; therefore typicaly a barrel muon station con...
class representing a drift circle meaurement on segment
SG::VarHandleKey & vhKey()
Return a non-const reference to the HandleKey.
ChIndex
enum to classify the different chamber layers in the muon spectrometer
ToolHandle< Trk::ITrackFitter > m_trackFitter
fitter
static std::unique_ptr< Trk::TrackStateOnSurface > createMeasTSOSWithUpdate(const Trk::TrackStateOnSurface &tsos, std::unique_ptr< Trk::MeasurementBase > meas, std::unique_ptr< Trk::TrackParameters > pars, Trk::TrackStateOnSurface::TrackStateOnSurfaceType type)
create a TSOS with a measurement, takes ownership of the pointers
StIndex
enum to classify the different station layers in the muon spectrometer
ServiceHandle< Muon::IMuonIdHelperSvc > m_idHelperSvc
phiRange
Filling Phi ranges.
std::unique_ptr< Trk::Track > fit(const EventContext &ctx, const MuPatCandidateBase &firstEntry, const MuPatCandidateBase &secondEntry, const PrepVec &externalPhiHits) const
fit the hits of two MuPatCandidateBase
virtual const TrkDetElementBase * detectorElement() const =0
returns the detector element, assoicated with the PRD of this class
void setPatternRecognitionInfo(const TrackPatternRecoInfo &patternReco)
Method setting the pattern recognition algorithm.
void cleanEntry(const MuPatCandidateBase &entry, std::set< Identifier > &removedIdentifiers) const
void createStartParameters(const EventContext &ctx, FitterData &inputData) const
create a perigee parameter give the input data
const MuonTrackSummary * muonTrackSummary() const
returns a pointer to the MuonTrackSummary if available
float distance(const Amg::Vector3D &p1, const Amg::Vector3D &p2)
calculates the distance between two point in 3D space
const Amg::Transform3D & transform() const
Returns HepGeom::Transform3D by reference.
virtual const Amg::Vector3D & center() const =0
Return the center of the element.
size_type size() const noexcept
Returns the number of elements in the collection.
virtual ParametersT< DIM, T, S > * clone() const override final
Virtual clone.
Gaudi::Details::PropertyBase & declareGaudiProperty(Gaudi::Property< T > &hndl, const SG::VarHandleKeyType &)
specialization for handling Gaudi::Property<SG::VarHandleKey>
Gaudi::Property< bool > m_seedAtStartOfTrack
Scalar mag() const
mag method
virtual void localToGlobal(const Amg::Vector2D &locp, const Amg::Vector3D &mom, Amg::Vector3D &glob) const =0
Specified by each surface type: LocalToGlobal method without dynamic memory allocation.
@ Measurement
This is a measurement, and will at least contain a Trk::MeasurementBase.
double qOverPFromEntries(const EventContext &ctx, const MuPatCandidateBase &firstEntry, const MuPatCandidateBase &secondEntry) const
get q/p using angle + position of the two entries
ServiceHandle< IMuonEDMHelperSvc > m_edmHelperSvc
multi purpose helper tool
const_iterator begin() const noexcept
Return a const_iterator pointing at the beginning of the collection.
ToolHandle< IMuonSegmentInOverlapResolvingTool > m_overlapResolver
void setThetaPhi(Amg::Vector3D &v, double theta, double phi)
sets the theta and phi angle of a vector without changing the magnitude
Muon::NSW_PadTriggerSegment segment(const NSWL1::PadTrigger &data)
std::pair< double, double > getElementHalfLengths(const Identifier &id, const Trk::TrkDetElementBase *ele) const
@ InTime
drift time too small to be compatible with drift spectrum
double stripActiveLengthLeft(const Identifier &id) const
@ Unknown
Track fitter not defined.