25 declareInterface<IMuonSeededSegmentFinder>(
this);
44 return StatusCode::SUCCESS;
48 const std::set<Identifier>& chIds)
const {
50 std::vector<const MdtPrepData*> mdtPrds =
extractPrds(ctx, chIds);
52 if (mdtPrds.empty()) {
62 const std::set<IdentifierHash>& chIdHs)
const {
64 std::vector<const MdtPrepData*> mdtPrds =
extractPrds(ctx, chIdHs);
66 if (mdtPrds.empty()) {
76 const std::vector<const MdtPrepData*>& mdtPrds)
const {
78 bool doHoleSearch =
true;
81 std::vector<const MdtDriftCircleOnTrack*> mdtROTs;
82 mdtROTs.reserve(mdtPrds.size());
85 if (mdtROTs.empty()) {
91 double roadWidthEta = 1.;
92 if (
pars.covariance()) {
95 if (trackError < 0.2) trackError = 0.2;
96 roadWidthEta = 5. * trackError;
101 std::vector<std::vector<const MdtDriftCircleOnTrack*> > mdtROTsVec;
102 mdtROTsVec.push_back(mdtROTs);
103 std::vector<std::vector<const MuonClusterOnTrack*> > clusterROTsVec;
107 doHoleSearch ?
m_segMaker->find(road, mdtROTsVec, clusterROTsVec, segments.get(),
true)
108 :
m_segMakerNoHoles->find(road, mdtROTsVec, clusterROTsVec, segments.get(),
true);
125 if (MuonDetMgr ==
nullptr) {
126 ATH_MSG_ERROR(
"Null pointer to the read MuonDetectorManager conditions object");
131 std::set<IdentifierHash> chIdHs;
134 std::set<Identifier>::const_iterator chit = chIds.begin();
135 std::set<Identifier>::const_iterator chit_end = chIds.end();
136 for (; chit != chit_end; ++chit) {
151 std::vector<const MdtPrepData*> mdtPrds =
extractPrds(ctx, chIdHs);
157 const std::set<IdentifierHash>& chIdHs)
const {
161 mdtPrdContainer = h_mdtPrdCont.
cptr();
168 std::vector<const MdtPrepData*> mdtPrds;
171 std::set<IdentifierHash>::const_iterator chit = chIdHs.begin();
172 std::set<IdentifierHash>::const_iterator chit_end = chIdHs.end();
173 for (; chit != chit_end; ++chit) {
174 const auto* collptr = mdtPrdContainer->
indexFindPtr(*chit);
175 if (collptr ==
nullptr) {
continue; }
178 mdtPrds.insert(mdtPrds.end(), collptr->begin(), collptr->end());
185 std::vector<const MdtPrepDataCollection*>&
target)
const {
189 mdtPrdContainer = h_mdtPrdCont.
cptr();
194 if (mdtPrdContainer->
empty())
return;
197 std::set<IdentifierHash>::const_iterator chit = chIdHs.begin();
198 std::set<IdentifierHash>::const_iterator chit_end = chIdHs.end();
199 for (; chit != chit_end; ++chit) {
200 const auto* collptr = mdtPrdContainer->
indexFindPtr(*chit);
201 if (collptr ==
nullptr || collptr->empty()) {
continue; }
206 target.push_back(collptr);
211 std::vector<const RpcPrepDataCollection*>&
target)
const {
215 rpcPrdContainer = h_rpcPrdCont.
cptr();
220 if (rpcPrdContainer->
empty())
return;
223 std::set<IdentifierHash>::const_iterator chit = chIdHs.begin();
224 std::set<IdentifierHash>::const_iterator chit_end = chIdHs.end();
225 for (; chit != chit_end; ++chit) {
226 const auto* collptr = rpcPrdContainer->
indexFindPtr(*chit);
227 if (collptr ==
nullptr || collptr->empty()) {
continue; }
232 target.push_back(collptr);
237 std::vector<const TgcPrepDataCollection*>&
target)
const {
241 tgcPrdContainer = h_tgcPrdCont.
cptr();
246 if (tgcPrdContainer->
empty())
return;
249 std::set<IdentifierHash>::const_iterator chit = chIdHs.begin();
250 std::set<IdentifierHash>::const_iterator chit_end = chIdHs.end();
251 for (; chit != chit_end; ++chit) {
252 const auto* collptr = tgcPrdContainer->
indexFindPtr(*chit);
253 if (collptr ==
nullptr || collptr->empty()) {
continue; }
258 target.push_back(collptr);
263 std::vector<const CscPrepDataCollection*>&
target)
const {
272 cscPrdContainer = h_cscPrdCont.
cptr();
277 if (cscPrdContainer->
empty())
return;
280 std::set<IdentifierHash>::const_iterator chit = chIdHs.begin();
281 std::set<IdentifierHash>::const_iterator chit_end = chIdHs.end();
282 for (; chit != chit_end; ++chit) {
283 const auto* collptr = cscPrdContainer->
indexFindPtr(*chit);
284 if (collptr ==
nullptr || collptr->empty()) {
continue; }
290 target.push_back(collptr);
298 std::vector<const sTgcPrepDataCollection*>&
target)
const {
307 stgcPrdContainer = h_stgcPrdCont.
cptr();
312 if (stgcPrdContainer->
empty())
return;
315 std::set<IdentifierHash>::const_iterator chit = chIdHs.begin();
316 std::set<IdentifierHash>::const_iterator chit_end = chIdHs.end();
317 for (; chit != chit_end; ++chit) {
318 const auto* collptr = stgcPrdContainer->
indexFindPtr(*chit);
319 if (collptr ==
nullptr || collptr->empty()) {
continue; }
324 target.push_back(collptr);
330 std::vector<const MMPrepDataCollection*>&
target)
const {
339 mmPrdContainer = h_mmPrdCont.
cptr();
344 if (mmPrdContainer->
empty())
return;
347 std::set<IdentifierHash>::const_iterator chit = chIdHs.begin();
348 std::set<IdentifierHash>::const_iterator chit_end = chIdHs.end();
349 for (; chit != chit_end; ++chit) {
350 const auto* collptr = mmPrdContainer->
indexFindPtr(*chit);
351 if (collptr ==
nullptr || collptr->empty()) {
continue; }
355 target.push_back(collptr);
360 const std::vector<const MdtPrepData*>& mdtPrdCols,
361 std::vector<const MdtDriftCircleOnTrack*>& mdtROTs,
bool& doHoleSearch)
const {
362 ATH_MSG_VERBOSE(
" in selectAndCalibrate, get PRDs " << mdtPrdCols.size());
365 std::vector<const MdtPrepData*>::const_iterator mit = mdtPrdCols.begin();
366 std::vector<const MdtPrepData*>::const_iterator mit_end = mdtPrdCols.end();
367 for (; mit != mit_end; ++mit) {
375 mdtROTs.push_back(mdt);
377 ATH_MSG_VERBOSE(
" calibrated " << mdtROTs.size() <<
" prds out of " << mdtPrdCols.size());
381 const MdtPrepData& mdtPrd,
bool& doHoleSearch)
const {
399 double distanceToWire = exPars->parameters()[
Trk::locR];
400 double posAlongWire = exPars->parameters()[
Trk::locZ];
402 double errorR = exPars->covariance() ? fabs(
Amg::error(*exPars->covariance(),
Trk::locR)) : 500.;
403 double errorZ = exPars->covariance() ? fabs(
Amg::error(*exPars->covariance(),
Trk::locZ)) : 300.;
406 bool isOnSurface = surf.
isOnSurface(exPars->position(),
true, 5 * errorR, 5 * errorZ);
415 double roadWidthR = 5 * errorR + 4 * tubeRadius;
416 double roadWidthZ = 5 * errorZ + 100.;
419 double nSigmaFromTrack = fabs(fabs(distanceToWire) - mdtPrd.
localPosition()[
Trk::locR]) / sqrt(errorR * errorR + driftdr * driftdr);
422 std::string boundCheckStr = isOnSurface ?
" onSurface" :
" outOfSurface";
424 << roadWidthR <<
" z " << posAlongWire <<
" range " << halfTubeLength + roadWidthZ << boundCheckStr;
428 if (nSigmaFromTrack >
m_maxSigma || fabs(posAlongWire) > halfTubeLength + roadWidthZ) {
435 if (doHoleSearch && fabs(posAlongWire) < halfTubeLength + roadWidthZ) doHoleSearch =
false;
453 double error = driftdr;
455 double fullError = sqrt(errorR * errorR +
error *
error);
456 double radialPull =
residual / fullError;
458 if (fabs(radialPull) < 5)
460 else if (fabs(radialPull) > 5 &&
residual > 0)
463 hitType =
"outOfTime";