37 return StatusCode::SUCCESS;
50 return StatusCode::FAILURE;
55 return StatusCode::FAILURE;
60 if (!NSWpadTriggerContainer.
isValid()) {
62 return StatusCode::FAILURE;
75 return StatusCode::SUCCESS;
92 int multiplet =
m_idHelperSvc -> stgcIdHelper().multilayer(
id);
94 int channelType =
m_idHelperSvc -> stgcIdHelper().channelType(
id);
102 std::string
side = GeometricSectors::sTgcSide[iside];
103 std::string channelName =
"";
105 if (channelType == sTgcIdHelper::sTgcChannelTypes::Pad) {
112 int maxPadNumberQ1 = sTgcReadoutObjectPadQ1 -> maxPadNumber(idPadQ1);
113 int maxPadNumberQ2 = sTgcReadoutObjectPadQ2 -> maxPadNumber(idPadQ2);
115 if (stationEtaAbs == 2) padNumber = padNumber + maxPadNumberQ1;
116 else if (stationEtaAbs == 3) padNumber = padNumber + maxPadNumberQ1 + maxPadNumberQ2;
120 fill(
"Occupancy", sectorMon, padNumberMon);
124 fill(
"Occupancy", layerMon, quadMon);
127 else if (channelType == sTgcIdHelper::sTgcChannelTypes::Strip) {
128 channelName =
"strip";
129 int stripNumber =
m_idHelperSvc -> stgcIdHelper().channel(
id);
134 int maxStripNumberQ1 = sTgcReadoutObjectStripQ1 -> numberOfStrips(idStripQ1);
135 int maxStripNumberQ2 = sTgcReadoutObjectStripQ2 -> numberOfStrips(idStripQ2);
137 if (stationEtaAbs == 2) stripNumber = stripNumber + maxStripNumberQ1 + 1;
138 else if (stationEtaAbs == 3) stripNumber = stripNumber + maxStripNumberQ1 + maxStripNumberQ2 + 1;
142 fill(
"Occupancy", sectorMon, stripNumberMon);
146 fill(
"Occupancy", layerMon, quadMon);
149 else if (channelType == sTgcIdHelper::sTgcChannelTypes::Wire) {
150 channelName =
"wire";
151 int wireGroupNumber =
m_idHelperSvc -> stgcIdHelper().channel(
id);
153 const MuonGM::sTgcReadoutElement* sTgcReadoutObjectWireGroupQ3 = muonDetectorManagerObject -> getsTgcReadoutElement(idWireGroupQ3);
154 int maxWireGroupNumberQ3 = sTgcReadoutObjectWireGroupQ3 -> numberOfStrips(idWireGroupQ3);
157 auto wireGroupNumberMon =
Monitored::Scalar<int>(
"wireGroupNumber_layer_" + layerStr, wireGroupNumber + (sector - 1)*maxWireGroupNumberQ3);
158 fill(
"Occupancy", stationEtaMon, wireGroupNumberMon);
162 fill(
"Occupancy", layerMon, quadMon);
167 fill(
"Overview", sectorMon, febMon);
188 int channelType =
m_idHelperSvc->stgcIdHelper().channelType(
id);
189 int multiplet =
m_idHelperSvc->stgcIdHelper().multilayer(
id);
198 std::string
side = GeometricSectors::sTgcSide[iside];
199 std::string channelName =
"";
202 if (channelType == sTgcIdHelper::sTgcChannelTypes::Pad) channelName =
"pad";
203 else if (channelType == sTgcIdHelper::sTgcChannelTypes::Strip) channelName =
"strip";
204 else if (channelType == sTgcIdHelper::sTgcChannelTypes::Wire) channelName =
"wire";
209 fill(
"LBShifterGroup", lbMon, febMon);
219 if(!meTrack)
continue;
222 if (!
status.has_value())
continue;
223 std::tuple<Identifier, const Trk::RIO_OnTrack*> rotIDtuple =
status.value();
225 Identifier rot_id = std::get<Identifier>(rotIDtuple);
228 if(!cluster)
continue;
233 int channelType =
m_idHelperSvc -> stgcIdHelper().channelType(rot_id);
234 int stEta =
m_idHelperSvc -> stgcIdHelper().stationEta(rot_id);
240 int iside = (stEta > 0) ? 1 : 0;
241 std::string
side = GeometricSectors::sTgcSide[iside];
242 std::string channelName =
"";
246 if (channelType == sTgcIdHelper::sTgcChannelTypes::Pad) {
247 float padCharge = prd ->
charge();
251 short int padTiming = prd ->
time();
254 fill(
"sTgcTiming", padSectorSidedMon, padTimingMon);
258 fill(
"padTiming_quad_" +
std::to_string(std::abs(stEta)), padSectorSidedExpertMon, padTimingExpertMon);
264 fill(
"sTgcTiming", timeMon, febMon);
267 else if (channelType == sTgcIdHelper::sTgcChannelTypes::Strip) {
268 channelName =
"strip";
269 const std::vector<Identifier>& stripIds = prd->
rdoList();
270 unsigned int csize = stripIds.size();
272 std::vector<short int> stripTimesVec = prd -> stripTimes();
273 std::vector<int> stripChargesVec = prd -> stripCharges();
275 float stripClusterTimes = 0;
276 float stripClusterCharges = 0;
278 for (
unsigned int sIdx = 0; sIdx < csize; ++sIdx) {
279 stripClusterTimes += stripTimesVec.at(sIdx);
280 stripClusterCharges += stripChargesVec.at(sIdx);
283 stripClusterTimes /= stripTimesVec.size();
291 fill(
"sTgcTiming", stripClusterSectorSidedMon, stripClusterTimesMon);
292 fill(
"padTriggerExpert", stripClusterSectorSidedMon, stripClusterSizeMon);
298 fill(
"sTgcTiming", timeMon, febMon);
303 fill(
"stripTiming_quad_" +
std::to_string(std::abs(stEta)), stripSectorSidedExpertMon, stripTimingExpertMon);
306 std::optional<Trk::ResidualPull> resPull(
m_residualPullCalculator -> residualPull(trkState -> measurementOnTrack(), trkState -> trackParameters(), Trk::ResidualPull::ResidualType::Biased));
315 else if (channelType == sTgcIdHelper::sTgcChannelTypes::Wire) {
316 float wireGroupCharge = prd ->
charge();
320 short int wireGroupTiming = prd ->
time();
323 fill(
"sTgcTiming", wireGroupSectorSidedMon, wireGroupTimingMon);
327 fill(
"wireTiming_quad_" +
std::to_string(std::abs(stEta)), wireSectorSidedExpertMon, wireTimingExpertMon);
333 fill(
"sTgcTiming", timeMon, febMon);
344 bool largeSector = rdo -> largeSector();
346 int iside = (
sideA) ? 1 : 0;
347 int isize = (largeSector) ? 1 : 0;
349 std::string
side = GeometricSectors::sTgcSide[iside];
350 std::string
size = GeometricSectors::sTgcSize[isize];
352 size_t numberOfTriggers = rdo -> getNumberOfTriggers();
353 size_t numberOfHits = rdo -> getNumberOfHits();
355 for (
size_t trigger = 0; trigger < numberOfTriggers; ++trigger) {
356 int triggerPhiIdsUnsigned = rdo -> getTriggerPhiIds().at(trigger);
357 int triggerBandIds = rdo -> getTriggerBandIds().at(trigger);
358 int triggerRelBCID = rdo -> getTriggerRelBcids().at(trigger);
359 int sourceId = rdo -> getSourceid();
368 fill(
"padTriggerShifter", phiIdsPerSideSizeMon, bandIdsPerSideSizeMon);
374 fill(
"padTriggerShifter", lbMon, relBCIDMon, sectorMon, numberOfTriggersMon);
381 fill(
"padTriggerExpert", numberOfTriggersPerSectorMon, phiIdsSidedSizedPerSectorMon, bandIdsSidedSizedPerSectorMon, lbPerSectorMon, relBCIDperSectorMon);
386 fill(
"padTriggerExpert", RelBCIDPerSectorMon, PhiIDPerSectorMon, BandIDPerSectorMon);
390 std::optional<Identifier>
status =
getPadId(rdo->getSourceid(), rdo->getHitPfebs().at(
hits), rdo->getHitTdsChannels().at(
hits));
391 if (!
status.has_value())
continue;
398 const xAOD::TrackParticle* meTP =
mu -> trackParticle(xAOD::Muon::TrackParticleType::ExtrapolatedMuonSpectrometerTrackParticle);
399 if(meTP ==
nullptr)
continue;
402 if(!meTrack)
continue;
406 if (!
status.has_value())
continue;
409 int channelType =
m_idHelperSvc -> stgcIdHelper().channelType(rot_id);
410 if (channelType != sTgcIdHelper::sTgcChannelTypes::Pad)
continue;
413 if (rot_id != pad_id)
continue;
415 int sourceIds = rdo -> getSourceid();
417 int hitRelBCID = rdo -> getHitRelBcids().at(
hits);
418 int hitpfebs = rdo -> getHitPfebs().at(
hits);
419 int hitTdsChannels = rdo->getHitTdsChannels().at(
hits);
421 std::optional<std::tuple<int, int, std::string, std::string, int>> statusPadEtaPhi =
getPadEtaPhiTuple(sourceIds, hitpfebs, hitTdsChannels);
422 if (!statusPadEtaPhi.has_value())
continue;
423 std::tuple<int, int, std::string, std::string, int> padEtaPhiTuple = statusPadEtaPhi.value();
425 int padPhi = std::get<0>(padEtaPhiTuple);
426 int padEta = std::get<1>(padEtaPhiTuple);
427 std::string sideName = std::get<2>(padEtaPhiTuple);
428 std::string sizeName = std::get<3>(padEtaPhiTuple);
429 int layer = std::get<4>(padEtaPhiTuple);
433 fill(
"padTriggerOccupancy", padPhiMon, padEtaMon);
438 fill(
"padTriggerShifter", hitRelBCIDmon, hitPfebsMon, sectorMon);
442 fill(
"padTriggerExpert", hitRelBCIDPerSectorMon, hitpfebsPerSectorMon);
457 std::array<int, 8> quadMultiplet{};
458 std::array<int, 8> layerMultiplet{};
459 std::array<float, 8> xPosMultiplet{};
460 std::array<float, 8> yPosMultiplet{};
461 std::array<float, 8> zPosMultiplet{};
464 std::array<std::array<sTGCeff, 16>, 2> effPlots;
466 const xAOD::TrackParticle* meTP =
mu -> trackParticle(xAOD::Muon::TrackParticleType::ExtrapolatedMuonSpectrometerTrackParticle);
467 if(meTP ==
nullptr)
continue;
470 if(!meTrack)
continue;
474 if (!
status.has_value())
continue;
478 int channelType =
m_idHelperSvc -> stgcIdHelper().channelType(rot_id);
479 if (channelType != sTgcIdHelper::sTgcChannelTypes::Strip)
continue;
481 int stEta =
m_idHelperSvc -> stgcIdHelper().stationEta(rot_id);
482 int iside = (stEta > 0) ? 1 : 0;
488 const Amg::Vector2D& positionsMultiplet = (trkState) -> trackParameters() -> localPosition();
489 float xPosStripInMultipletLocal = positionsMultiplet.x();
490 float yPosStripInMultipletLocal = positionsMultiplet.y();
492 Amg::Vector2D localPos(xPosStripInMultipletLocal, yPosStripInMultipletLocal);
495 sTgcReadoutObjectStrip -> surface(rot_id).localToGlobal(localPos,
Amg::Vector3D::Zero(), globalPos);
496 float xPosStripInMultiplet = globalPos.x();
497 float yPosStripInMultiplet = globalPos.y();
500 (muonDetectorManagerObject -> getsTgcReadoutElement(rot_id)) -> stripGlobalPosition(rot_id, posStripGlobal);
501 float zPosStripInMultiplet = posStripGlobal.z();
503 auto& sTGCelements = effPlots[iside][sector - 1];
505 sTGCelements.quadMultiplet.at(
layer - 1) = stEta;
506 sTGCelements.layerMultiplet.at(
layer - 1) =
layer;
507 sTGCelements.xPosMultiplet.at(
layer - 1) = xPosStripInMultiplet;
508 sTGCelements.yPosMultiplet.at(
layer - 1) = yPosStripInMultiplet;
509 sTGCelements.zPosMultiplet.at(
layer - 1) = zPosStripInMultiplet;
512 for (
unsigned int isideIndex = 0; isideIndex <= 1; ++isideIndex) {
513 for (
unsigned int sectorIndex = 1; sectorIndex <= 16; ++sectorIndex) {
514 auto& sTGCelements = effPlots[isideIndex][sectorIndex - 1];
515 bool fourOutEight = std::count_if(sTGCelements.layerMultiplet.begin(), sTGCelements.layerMultiplet.end(), [](
int i) { return i != 0; }) >= 4;
516 bool oneRefLayer = std::count_if(sTGCelements.layerMultiplet.begin(), sTGCelements.layerMultiplet.end(), [](
int i) { return i != 0; }) >= 1;
519 for (
auto layerIndex =
static_cast<std::array<int, 8>::size_type
>(1); layerIndex <= sTGCelements.layerMultiplet.size(); ++layerIndex) {
520 if (sTGCelements.layerMultiplet.at(layerIndex - 1) == 0)
continue;
522 float xPos = sTGCelements.xPosMultiplet.at(layerIndex - 1);
523 float yPos = sTGCelements.yPosMultiplet.at(layerIndex - 1);
524 float rPos = std::hypot(xPos, yPos);
526 std::string
side = GeometricSectors::sTgcSide[isideIndex];
535 fill(
"padTriggerShifter", xPosStripmon, yPosStripmon, effQuestionMon);
540 else if (!fourOutEight && oneRefLayer) {
541 auto refLayerIndex =
std::distance(sTGCelements.layerMultiplet.begin(), std::find_if(sTGCelements.layerMultiplet.begin(), sTGCelements.layerMultiplet.end(), [](
int i) {return i != 0;}));
543 for (
auto layerIndex =
static_cast<std::array<int, 8>::size_type
>(1); layerIndex <= sTGCelements.layerMultiplet.size(); ++layerIndex) {
544 if (sTGCelements.layerMultiplet.at(layerIndex - 1) != 0)
continue;
545 int quad = sTGCelements.quadMultiplet.at(refLayerIndex);
547 int gap = (layerIndex <= static_cast<std::array<int, 8>::size_type>(
m_idHelperSvc->stgcIdHelper().gasGapMax())) ? layerIndex : layerIndex -
static_cast<std::array<int, 8>::size_type
>(
m_idHelperSvc->stgcIdHelper().gasGapMax());
550 const Identifier idProbe =
m_idHelperSvc -> stgcIdHelper().channelID((sectorIndex % 2 == 0) ?
"STS" :
"STL",
quad, (sectorIndex % 2 == 0) ? sectorIndex/2 : (sectorIndex + 1)/2,
multi,
gap, sTgcIdHelper::sTgcChannelTypes::Strip, 1,
isValid);
558 (muonDetectorManagerObject -> getsTgcReadoutElement(idProbe)) -> stripGlobalPosition(idProbe, posProbe);
559 float posZprobe = posProbe.z();
561 float xSlope = sTGCelements.xPosMultiplet.at(refLayerIndex)/sTGCelements.zPosMultiplet.at(refLayerIndex);
562 float ySlope = sTGCelements.yPosMultiplet.at(refLayerIndex)/sTGCelements.zPosMultiplet.at(refLayerIndex);
564 float xPos = sTGCelements.xPosMultiplet.at(refLayerIndex) + xSlope*(posZprobe - sTGCelements.zPosMultiplet.at(refLayerIndex));
565 float yPos = sTGCelements.yPosMultiplet.at(refLayerIndex) + ySlope*(posZprobe - sTGCelements.zPosMultiplet.at(refLayerIndex));
566 float rPos = std::hypot(xPos, yPos);
568 std::string
side = GeometricSectors::sTgcSide[isideIndex];
577 fill(
"padTriggerShifter", xPosStripProbemon, yPosStripProbemon, effQuestionMon);
593 double recoMuonEta =
mu ->
eta();
594 double recoMuonPhi =
mu ->
phi();
596 std::string sideRecoMuon = GeometricSectors::sTgcSide[recoMuonEta > 0];
598 std::string minSideRecoMuon =
"", minSideTrigger =
"";
600 double minTriggerEta = 999., minTriggerPhi = 999.,
601 minRecoEta = 999., minRecoPhi = 999., minDeltaR = 999.;
603 auto minDeltaRtrigIt = -1;
607 bool largeSector = rdo -> largeSector();
608 std::string sideTrigger = GeometricSectors::sTgcSide[
sideA];
609 size_t numberOfTriggers = rdo -> getNumberOfTriggers();
611 for (
size_t trigger = 0; trigger < numberOfTriggers; ++trigger) {
612 int triggerPhiIdsUnsigned = rdo -> getTriggerPhiIds().at(trigger);
613 int triggerBandIds = rdo -> getTriggerBandIds().at(trigger);
614 int sourceId = rdo -> getSourceid();
619 std::optional<double>
status =
bandId2eta(triggerBandIds, largeSector,
sideA, muonDetectorManagerObject);
620 if (!
status.has_value())
continue;
621 double triggerBandIdToEta =
status.value();
627 if (sideRecoMuon == sideTrigger) {
629 minSideRecoMuon = sideRecoMuon;
630 minSideTrigger = sideTrigger;
631 minTriggerEta = triggerBandIdToEta;
632 minTriggerPhi = triggerPhiIDtoPhi;
633 minRecoEta = recoMuonEta;
634 minRecoPhi = recoMuonPhi;
636 minDeltaRtrigIt = trigger;
642 bool muonRecoTriggerMatch =
false;
644 if (minDeltaRtrigIt != -1) {
646 muonRecoTriggerMatch =
true;
651 fill(
"Overview", deltaRmon);
655 fill(
"Overview", etaRecoMuonMon, phiRecoMuonMon);
659 fill(
"Overview", etaPadTriggerMon, phiPadTriggerMon);
663 fill(
"Overview", phiRecoMuonSidedMon, phiPadTriggerSidedMon);
668 fill(
"Overview", muonRecoTriggerMatchMon, etaRecoMuonEffMon, phiRecoMuonEffMon);