73 {
74
77 return nullptr;
78 }
79
81
83 <<
" ID track " <<
m_printer->print(indetTrack) << std::endl
84 <<
" MS track " <<
m_printer->print(spectrometerTrack) << std::endl
85 <<
m_printer->printStations(spectrometerTrack));
86
89
90 while (!lastIndetPars && index > 0) {
93 }
94
95 if (!lastIndetPars) {
97 return nullptr;
98 }
99
100
101 std::unique_ptr<Trk::TrackParameters> innerParameters, middleParameters, outerParameters;
102 std::unique_ptr<Trk::TrackParameters> lastPars = lastIndetPars->
uniqueClone();
103 bool innerParsSet{false};
104
105 std::vector<const Trk::TrackStateOnSurface*> stations;
106 std::set<Muon::MuonStationIndex::StIndex> etaIndices, phiIndices, badEtaIndices, badPhiIndices;
107
108 unsigned int nmeas = 0;
109
111 const Trk::MeasurementBase* meas = tsosit->measurementOnTrack();
112 if (!meas) continue;
113
115
117 if (!id.is_valid()) continue;
118
121 ++nmeas;
122
123 if (measuresPhi) {
124 if (phiIndices.count(index)) continue;
126 phiIndices.insert(index);
128 if (etaIndices.count(index)) continue;
129
131 etaIndices.insert(index);
132 } else {
133 continue;
134 }
135
136 std::unique_ptr<Trk::TrackParameters> exPars{};
139 exPars = std::move(lastPars);
140 } else {
142 }
143
144 if (!exPars) {
146 continue;
147 }
148
150
152
154 if (measuresPhi) {
155 badPhiIndices.insert(index);
156 } else {
157 badEtaIndices.insert(index);
158 }
159 }
160
161
164 const MuonGM::MuonReadoutElement* detEl = nullptr;
166 const Muon::MdtDriftCircleOnTrack* mdt = dynamic_cast<const Muon::MdtDriftCircleOnTrack*>(meas);
169 const Muon::CscClusterOnTrack* csc = dynamic_cast<const Muon::CscClusterOnTrack*>(meas);
171 }
172
173 if (detEl) {
174 const Trk::PlaneSurface* detSurf =
dynamic_cast<const Trk::PlaneSurface*
>(&detEl->
surface());
175 if (detSurf) {
176 Trk::LocalDirection idDir{};
178
180 Trk::LocalDirection msDir{};
184 }
185 }
186 }
187 }
188
189 if (!innerParsSet && !innerParameters && exPars && lastPars) {
190 innerParameters = std::move(exPars);
191 } else if (exPars && innerParameters && !middleParameters ) {
192 middleParameters = std::move(exPars);
193 } else {
194 lastPars = std::move(exPars);
195 }
196 innerParsSet = true;
197 }
198
199 if (middleParameters) {
200 outerParameters = std::move(lastPars);
201 } else {
202 middleParameters = std::move(innerParameters);
203 if (!middleParameters) {
205 return nullptr;
206 }
207 }
208
209 bool cleanEta = badEtaIndices.size() == 1 && etaIndices.size() > 1;
210 bool cleanPhi = badPhiIndices.size() == 1;
211
212 if (!cleanPhi && !cleanEta) {
214 return nullptr;
215 }
216
217 if (badEtaIndices.size() == etaIndices.size()) {
219 return nullptr;
220 }
221
224 const Trk::MeasurementBase* meas = tsosit->measurementOnTrack();
225 if (!meas) continue;
227
229 if (!id.is_valid()) continue;
230
233 if (cleanEta && !measuresPhi && badEtaIndices.count(index)) continue;
234 if (cleanPhi && measuresPhi && badPhiIndices.count(index)) continue;
235 spectrometerMeasurements.push_back(meas);
236 }
237
238 ATH_MSG_DEBUG(
"Number of measurements before cleaning " << nmeas <<
" after cleaning " << spectrometerMeasurements.size());
239
240 if (spectrometerMeasurements.size() < 6) {
242 return nullptr;
243 }
244
245
248 combinedTrack =
m_trackBuilder->indetExtension(ctx, indetTrack, spectrometerMeasurements, std::move(innerParameters), std::move(middleParameters),
249 std::move(outerParameters));
250 }
251 if (combinedTrack) {
254
256 <<
m_printer->print(*combinedTrack) << std::endl
257 <<
m_printer->printStations(*combinedTrack));
258 } else {
261 }
263 }
#define ATH_MSG_WARNING(x)
std::pair< std::vector< unsigned int >, bool > res
bool msgLvl(const MSG::Level lvl) const
virtual const MuonGM::CscReadoutElement * detectorElement() const override final
Returns the detector element, associated with the PRD of this class.
virtual const MuonGM::MdtReadoutElement * detectorElement() const override final
Returns the detector element, assoicated with the PRD of this class.
Gaudi::Property< double > m_minP
Gaudi::Property< double > m_minPt
Gaudi::Property< double > m_pullCut
double angleXZ() const
access method for angle of local XZ projection
double angleYZ() const
access method for angle of local YZ projection
virtual const Surface & associatedSurface() const =0
Interface method to get the associated Surface.
const Amg::Vector3D & momentum() const
Access method for the momentum.
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...
void globalToLocalDirection(const Amg::Vector3D &glodir, Trk::LocalDirection &locdir) const
This method transforms the global direction to a local direction wrt the plane.
@ Unbiased
RP with track state that has measurement not included.
@ MuidMuonRecoveryTool
Muons found by the ID seeded muon recovery.
@ Outlier
This TSoS contains an outlier, that is, it contains a MeasurementBase/RIO_OnTrack which was not used ...
const Trk::TrackStates * trackStateOnSurfaces() const
return a pointer to a const DataVector of const TrackStateOnSurfaces.
const DataVector< const TrackParameters > * trackParameters() const
Return a pointer to a vector of TrackParameters.
const Perigee * perigeeParameters() const
return Perigee.
virtual const Surface & surface() const =0
Return surface associated with this detector element.
StIndex
enum to classify the different station layers in the muon spectrometer
std::vector< const MeasurementBase * > MeasurementSet
vector of fittable measurements
ParametersBase< TrackParametersDim, Charged > TrackParameters
void combinedTrack(long int ICH, double *pv0, double *covi, double BMAG, double *par, double *covo)