24 declareInterface<IMuonPatternCalibration>(
this);
37 return StatusCode::SUCCESS;
48 return StatusCode::SUCCESS;
76 RegionMap& regionMap,
bool hasPhiMeasurements )
const
78 if (hasPhiMeasurements)
79 ATH_MSG_DEBUG(
"pattern has phi measurements using extrapolation to determine second coordinate");
91 if (isect.prepRawDataVec().empty())
continue;
94 const Amg::Vector3D patdire = isect.intersectDirection().unit();
101 std::map<int, EtaPhiHits> etaPhiHitsPerChamber;
102 std::set<Identifier> clusterIds;
110 double phiStart = patdire.phi();
113 constexpr
double phiRange2 = 0.25 *
M_PI;
114 double phiOffset = 0.;
116 phiOffset = 2 *
M_PI;
117 else if (phiStart > -phiRange2 && phiStart < phiRange2)
120 if (phiOffset > 1.5 *
M_PI) {
121 if (phiStart < 0) phiStart += phiOffset;
122 if (chPhi < 0) chPhi += phiOffset;
123 }
else if (phiOffset > 0.) {
124 phiStart += phiOffset;
127 double dphi = std::abs(phiStart - chPhi);
130 ATH_MSG_DEBUG(
"Large angular phi difference between pattern and chamber, phi pattern "
136 std::map<Identifier, const MdtPrepData*> idMdtMap{};
144 if (!previousMdt || previousMdt->
tdc() > mdt->
tdc())
149 insertMdt(*mdt, regionMap, patpose, patdire, hasPhiMeasurements);
158 if (!clusterIds.insert(
id).second)
continue;
163 EtaPhiHits& hitsPerChamber = etaPhiHitsPerChamber[colHash];
165 ++hitsPerChamber.
nphi;
167 ++hitsPerChamber.
neta;
169 insertCluster(*clus, regionMap, patpose, patdire, hasPhiMeasurements);
171 for (
const auto& [coll_hash,
hits] : etaPhiHitsPerChamber) {
172 if ((
hits.neta > 0 &&
hits.nphi == 0) || (
hits.nphi > 0 &&
hits.neta == 0)) {
181 if (!clusterIds.insert(rpc_prd->identify()).second)
continue;
182 insertCluster(*rpc_prd, regionMap, patpose, patdire, hasPhiMeasurements);
192 if (!clusterIds.insert(tgc_prd->identify()).second)
continue;
193 insertCluster(*tgc_prd, regionMap, patpose, patdire, hasPhiMeasurements);
199 return StatusCode::SUCCESS;
214 if (hasPhiMeasurements) {
222 double denom = patdire.dot(planenormal);
223 double u = (planenormal.dot(planepostion - patpose)) / (
denom);
235 bool hasPointingPhiStrips =
false;
247 hasPointingPhiStrips =
true;
257 glpos[0] = ilpos.x();
259 if (hasPointingPhiStrips) {
261 glpos[1] = ilpos.y();
263 glpos[1] = ilpos.y();
272 ATH_MSG_VERBOSE(
">>>> extrapolated position far outside volume, dropping hit "
273 <<
m_idHelperSvc->toString(
id) <<
". dist along strip " << dif.mag() <<
" 1/2 strip len "
274 << 0.5 * striplen <<
" dist measurement plane " << (
intersect - piOnPlane).mag());
277 if (dif.mag() > 0.5 * striplen) {
278 Amg::Vector3D newpos = globalpos - dif * (0.5 * striplen / dif.mag());
280 ATH_MSG_VERBOSE(
">>>> extrapolated position outside volume, shifting position "
281 <<
m_idHelperSvc->toString(
id) <<
". position along strip " << dif.mag() <<
" 1/2 tube len "
282 << 0.5 * striplen <<
" dist To strip " << (
intersect - piOnPlane).mag()
283 <<
". dist to newpos " << (newpos - globalpos).mag() <<
" pos " << newpos);
295 Region& region = regionMap[regionId];
316 if (hasPhiMeasurements) {
331 double denom = patdire.dot(planenormal);
332 double u = (planenormal.dot(planepostion - patpose)) / (
denom);
335 Amg::Vector3D lpiOnPlane = amdbToGlobal.inverse() * piOnPlane;
344 if (dif.mag() > 0.5 * tubelen) {
345 Amg::Vector3D newpos = tubePos - dif * (0.5 * tubelen / dif.mag());
347 ATH_MSG_VERBOSE(
">>>> extrapolated position outside volume, shifting position "
348 <<
m_idHelperSvc->toString(
id) <<
". position along strip " << dif.mag() <<
" 1/2 tube len "
349 << 0.5 * tubelen <<
" dist To Wire " << (piOnPlane -
intersect).mag() <<
". dist to newpos "
350 << (newpos - tubePos).mag() <<
" pos " << newpos);
370 if (std::abs(
eta) == 8) {
380 if (stName[2] ==
'R') {
398 Region& region = regionMap[regionId];
413 for (
const auto& [detRegionId, chamberData] : regionMap) {
414 ATH_MSG_INFO(
"new region " << detRegionId <<
" trigger " << chamberData.triggerPrds.size() <<
" mdt ch "
415 << chamberData.mdtPrdsPerChamber.size());
416 if (!chamberData.triggerPrds.empty())
ATH_MSG_INFO(
"trigger hits " << chamberData.triggerPrds.size());
418 for (
const auto& [globalPos, prd] : chamberData.triggerPrds) {
421 for (
const auto& [statId, MdtChamHits]: chamberData.mdtPrdsPerChamber) {
422 ATH_MSG_INFO(
"new MDT chamber with " << MdtChamHits.size() <<
" hits");
423 for (
const auto& [globalPos, prd] : MdtChamHits) {
435 for (
const auto& [regionId, regMeasColl] : regionMap) {
439 rotRegion.regionPos = regMeasColl.regionPos;
440 rotRegion.regionDir = regMeasColl.regionDir;
442 for (
const auto& [globalPos, prd] : regMeasColl.triggerPrds) {
443 std::unique_ptr<const MuonClusterOnTrack> cluster{
m_clusterCreator->createRIO_OnTrack(*prd, globalPos)};
444 if (!cluster)
continue;
445 rotRegion.push_back(std::move(cluster));
447 for (
const auto& [regionId, MdtsWithIsect] :regMeasColl.mdtPrdsPerChamber) {
450 for (
const auto& [globalPos, prd] : MdtsWithIsect) {
452 <<
",tdc: "<<prd->tdc()<<
",adc: "<<prd->adc()<<
" at "<<
Amg::toString(globalPos));
458 mdtROTs.push_back(mdt);
460 if (!mdtROTs.empty()) rotRegion.push_back(std::move(mdtROTs));
462 hitsPerRegion.push_back(std::move(rotRegion));
468 const ContType* & cont_ptr)
const {
472 return StatusCode::SUCCESS;
475 if (!readHandle.isValid()) {
477 return StatusCode::FAILURE;
479 cont_ptr = readHandle.cptr();
480 return StatusCode::SUCCESS;