22#include "GaudiKernel/MsgStream.h"
159 ATH_MSG_DEBUG(
"Processing configuration for layouts with BMG chambers.");
167 for (
int side = -1; side < 2; side += 2) {
169 for (
int roe = 1; roe <= (MuonDetMgrDS->
getMuonStation(
"BMG", side *
eta,
phi))->nMuonReadoutElements();
186 unsigned int counter{0};
187 std::string s{
""}, xAxis{
""};
190 std::vector<std::string> ecap{
"BA",
"BC",
"EA",
"EC"};
191 std::vector<std::string> layer{
"Inner",
"Middle",
"Outer",
"Extra"};
192 std::vector<std::unique_ptr<TH2F>> mdtHitsPerMultiLayerLumi;
193 mdtHitsPerMultiLayerLumi.reserve(ecap.size() * layer.size());
195 for (
const auto& iecap : ecap) {
196 for (
const auto& ilayer : layer) {
197 s =
"NumberOfHitsIn" + iecap + ilayer +
"PerMultiLayer_ADCCut";
198 mdtHitsPerMultiLayerLumi.push_back(std::make_unique<TH2F>(s.c_str(), s.c_str(), 1, 0, 1, 1, 0, 1));
199 xAxis = iecap.substr(0, 1) + ilayer.substr(0, 1) + iecap.substr(1, 1);
207 std::vector<std::string> mdtHitsBE{
"Barrel",
"EndCap"};
208 std::vector<std::unique_ptr<TH2F>> mdtHitsPerChamberIMOLumi;
209 mdtHitsPerChamberIMOLumi.reserve(mdtHitsBE.size());
211 for (
const auto& imdt : mdtHitsBE) {
212 s =
"NumberOfHits" + imdt;
213 mdtHitsPerChamberIMOLumi.push_back(std::make_unique<TH2F>(s.c_str(), s.c_str(), 1, 0, 1, 1, 0, 1));
220 std::vector<std::unique_ptr<TH2F>> mdtHitsPerMLByLayer;
221 mdtHitsPerMLByLayer.reserve(layer.size() - 1);
223 for (
const auto& ilayer : layer) {
224 if (ilayer ==
"Extra")
continue;
225 s =
"NumberOfHitsInMDT" + ilayer +
"_ADCCut";
226 mdtHitsPerMLByLayer.push_back(std::make_unique<TH2F>(s.c_str(), s.c_str(), 1, 0, 1, 1, 0, 1));
230 for (std::vector<Identifier>::const_iterator itr =
m_chambersId.begin(); itr !=
m_chambersId.end(); ++itr, ++counter) {
231 std::string hardware_name =
235 if (hardware_name ==
"BML6A13" || hardware_name ==
"BML6C13")
continue;
237 chamber = std::make_unique<MDTChamber>(hardware_name);
239 chamber->SetMDTHitsPerChamber_IMO_Bin(mdtHitsPerChamberIMOLumi[chamber->GetBarrelEndcapEnum()].get());
240 chamber->SetMDTHitsPerML_byLayer_Bins(
241 mdtHitsPerMultiLayerLumi[chamber->GetRegionEnum() * layer.size() + chamber->GetLayerEnum()].get(),
242 mdtHitsPerMLByLayer[(chamber->GetLayerEnum() < 3 ? chamber->GetLayerEnum() : 0)].get());
257 lumiblock = evt->lumiBlock();
259 ATH_MSG_DEBUG(
"MdtRawDataMonAlg::MDT RawData Monitoring Histograms being filled");
264 fill(
"MdtMonitor", run3geo, firstEvent);
268 bool trig_BARREL =
false;
269 bool trig_ENDCAP =
false;
276 trig_BARREL = std::any_of(muonRoIs->begin(), muonRoIs->end(),
277 [](
const auto& i) { return i->getSource() == xAOD::MuonRoI::RoISource::Barrel; });
278 trig_ENDCAP = std::any_of(muonRoIs->begin(), muonRoIs->end(),
279 [](
const auto& i) { return i->getSource() == xAOD::MuonRoI::RoISource::Endcap; });
285 if (!mdt_container.
isValid()) {
287 return StatusCode::FAILURE;
290 ATH_MSG_DEBUG(
"****** mdtContainer->size() : " << mdt_container->size());
293 int nColl_ADCCut = 0;
299 if (!rpc_container.
isValid()) {
301 return StatusCode::FAILURE;
304 ATH_MSG_DEBUG(
"****** rpc->size() : " << rpc_container->size());
310 for (containerIt = rpc_container->begin(); containerIt != rpc_container->end(); ++containerIt) {
316 bool isNoiseBurstCandidate =
false;
318 for (MdtcontainerIt = mdt_container->begin(); MdtcontainerIt != mdt_container->end(); ++MdtcontainerIt) {
320 mdtCollection != (*MdtcontainerIt)->end(); ++mdtCollection) {
326 std::string
type =
"MDT";
327 std::string hardware_name;
329 std::map<std::string, int> evnt_hitsperchamber_map;
330 std::set<std::string> chambers_from_tracks;
345 for (
const auto*
const mu : *muons) {
352 uint8_t ntri_eta = 0;
356 if (ntri_eta + n_phi == 0)
continue;
360 if (!rot_from_track)
continue;
365 m_idHelperSvc->mdtIdHelper().get_module_hash(rotId, mdt_idHash);
367 std::string mdt_chambername = mdt_chamber->
getName();
368 chambers_from_tracks.insert(mdt_chambername);
374 auto summaryPlots = std::make_unique<std::array<MDTSummaryHistogramStruct, 4096>>();
376 std::vector<std::string> v_hit_in_chamber_allphi;
377 std::map<std::string, std::vector<std::string>> v_hit_in_chamber;
380 if (containerIt == mdt_container->end() || containerIt->empty())
continue;
383 bool isHit_above_ADCCut =
false;
385 for (
const auto* mdtCollection : **containerIt) {
388 float adc = mdtCollection->adc();
391 if (hardware_name.substr(0, 3) ==
"BMG") adc /=
m_adcScale;
394 isHit_above_ADCCut =
true;
396 std::string
phi = hardware_name.substr(hardware_name.length() - 2);
397 v_hit_in_chamber[
phi].push_back(hardware_name);
399 v_hit_in_chamber_allphi.push_back(hardware_name);
406 summaryPlots.get()));
412 std::map<std::string, int>::iterator iter_hitsperchamber = evnt_hitsperchamber_map.find(hardware_name);
413 if (iter_hitsperchamber == evnt_hitsperchamber_map.end()) {
414 evnt_hitsperchamber_map.insert(make_pair(hardware_name, 1));
416 iter_hitsperchamber->second += 1;
420 nColl_ADCCut += isHit_above_ADCCut;
423 for (
const auto& phiitem : v_hit_in_chamber) {
425 fill(
"MdtMonitor", hit_in_chamber);
429 fill(
"MdtMonitor", hit_in_chamber_allphi);
434 int nHighOccChambers = 0;
435 for (
const auto& iterstat : evnt_hitsperchamber_map) {
441 float nTubes = iter_tubesperchamber->second;
442 float hits = iterstat.second;
443 float occ = hits / nTubes;
444 if (occ > 0.1) nHighOccChambers++;
455 fill(
"MdtMonitor", nHighOccChambers_mon, nPrd_mon, Nhitsrpc_mon, nPrdcut_mon, nColl_mon, nColl_ADCCut_mon);
465 ATH_MSG_ERROR(
"evtStore() does not contain mdt segms Collection with name " << key);
466 return StatusCode::FAILURE;
475 return StatusCode::SUCCESS;
490 ATH_MSG_ERROR(
"Null pointer to the read MuonDetectorManager conditions object");
496 float mdt_tube_eta = mdtgPos.eta();
498 float tdc = mdtCollection->
tdc() * 25.0 / 32.0;
500 if (hardware_name.substr(0, 3) ==
"BMG") tdc = mdtCollection->
tdc() * 0.2;
502 float adc = mdtCollection->
adc();
503 if (hardware_name.substr(0, 3) ==
"BMG") adc /=
m_adcScale;
507 if (std::abs(mdt_tube_eta) > 0. && std::abs(mdt_tube_eta) < 0.9) {
514 if (std::abs(mdt_tube_eta) > 0.9 && std::abs(mdt_tube_eta) < 1.2) {
521 if (std::abs(mdt_tube_eta) > 1.2 && std::abs(mdt_tube_eta) < 2.7) {
531 if (!isNoisy && adc > 0) {
536 vects.
noiseBurst.push_back((
int)isNoiseBurstCandidate);
537 if (isNoiseBurstCandidate) {
552 fill(
"MdtMonitor", mdt_tube_z_barrel, mdt_tube_perp_barrel, mdt_tube_x_barrel, mdt_tube_y_barrel);
558 fill(
"MdtMonitor", mdt_tube_z_ovl, mdt_tube_perp_ovl, mdt_tube_x_ovl, mdt_tube_y_ovl);
564 fill(
"MdtMonitor", mdt_tube_z_endcap, mdt_tube_perp_endcap, mdt_tube_x_endcap, mdt_tube_y_endcap);
569 fill(
"MdtMonitor", adc_mon_nosel, tdc_mon_nosel, noiseBurst);
573 fill(
"MdtMonitor", tdc_mon, adc_mon);
576 fill(
"MdtMonitor", adc_mon_noiseBurst_notNoisy);
579 fill(
"MdtMonitor", tdc_mon_noiseBurst_adcCut);
582 fill(
"MdtMonitor", tdc_mon_adcCut);
586 bool& isNoiseBurstCandidate,
bool trig_barrel,
bool trig_endcap,
587 std::array<MDTSummaryHistogramStruct, 4096>* vects)
const {
588 StatusCode
sc = StatusCode::SUCCESS;
589 Identifier digcoll_id = (mdtCollection)->identify();
590 IdentifierHash digcoll_idHash = (mdtCollection)->collectionHash();
596 std::string region[4] = {
"BA",
"BC",
"EA",
"EC"};
597 std::string layer[4] = {
"Inner",
"Middle",
"Outer",
"Extra"};
598 std::string crate[4] = {
"01",
"02",
"03",
"04"};
602 int iregion = chamber->GetRegionEnum();
603 int ilayer = chamber->GetLayerEnum();
604 int icrate = chamber->GetCrate();
606 int stationPhi = chamber->GetStationPhi();
607 std::string chambername = chamber->getName();
608 int thisStationEta = chamber->GetStationEta();
610 int crate_region = iregion;
612 if (chambername.substr(0, 3) ==
"BEE" || (chambername.substr(0, 3) ==
"BIS" && (thisStationEta == 7 || thisStationEta == 8))) {
613 if (iregion == 0) crate_region = 2;
614 if (iregion == 1) crate_region = 3;
618 std::array<MDTSummaryHistogramStruct, 4096>& array = *(vects);
619 auto& thisVects = array[v];
621 bool is_on_track =
false;
622 for (
const auto& ch : chambers_from_tracks) {
623 if (chambername == ch) is_on_track =
true;
626 bool isBIM = (chambername.at(2) ==
'M');
627 float tdc = mdtCollection->
tdc() * 25.0 / 32.0;
629 if (chambername.substr(0, 3) ==
"BMG") tdc = mdtCollection->
tdc() * 0.2;
630 float adc = mdtCollection->
adc();
631 if (chambername.substr(0, 3) ==
"BMG") adc /=
m_adcScale;
633 thisVects.sector.push_back(stationPhi + iregion * 16);
642 int mlayer_n =
m_idHelperSvc->mdtIdHelper().multilayer(digcoll_id);
644 if (!isNoisy && adc > 0) {
645 thisVects.adc_mon.push_back(adc);
646 thisVects.tdc_mon.push_back(tdc);
647 if (isNoiseBurstCandidate) {
648 thisVects.tdc_mon_nb2.push_back(tdc);
649 thisVects.adc_mon_nb2.push_back(adc);
655 if (isNoiseBurstCandidate) {
656 thisVects.tdc_mon_nb1.push_back(tdc);
657 thisVects.adc_mon_nb1.push_back(adc);
661 thisVects.adc_mon_adccut.push_back(adc);
662 thisVects.tdc_mon_adccut.push_back(tdc);
663 int thisStationEta = chamber->GetStationEta();
664 thisVects.stationEta.push_back(thisStationEta);
666 int binx = chamber->GetMDTHitsPerChamber_IMO_BinX();
671 int biny = chamber->GetMDTHitsPerChamber_IMO_BinY();
673 std::string varx =
" ";
674 std::string vary =
" ";
675 std::string varx_noise =
" ";
676 std::string vary_noise =
" ";
678 varx =
"x_mon_barrel";
679 vary =
"y_mon_barrel";
680 varx_noise =
"x_mon_barrel_noise";
681 vary_noise =
"y_mon_barrel_noise";
683 varx =
"x_mon_endcap";
684 vary =
"y_mon_endcap";
685 varx_noise =
"x_mon_endcap_noise";
686 vary_noise =
"y_mon_endcap_noise";
689 thisVects.x_mon.push_back(binx);
690 thisVects.y_mon.push_back(biny - 1);
691 if (isNoiseBurstCandidate) {
692 thisVects.x_mon_noise.push_back(binx);
693 thisVects.y_mon_noise.push_back(biny - 1);
694 thisVects.tdc_mon_nb3.push_back(tdc);
697 thisVects.x_bin_perML.push_back(chamber->GetMDTHitsPerML_Binx() - 1);
700 biny_ml = chamber->GetMDTHitsPerML_m1_Biny();
701 else if (mlayer_n == 2)
702 biny_ml = chamber->GetMDTHitsPerML_m2_Biny();
703 thisVects.y_bin_perML.push_back(biny_ml - 1);
705 if (layer[ilayer] !=
"Extra") {
706 thisVects.bin_byLayer_x.push_back(chamber->GetMDTHitsPerML_byLayer_BinX() - 1);
707 thisVects.bin_byLayer_y.push_back(chamber->GetMDTHitsPerML_byLayer_BinY(mlayer_n) - 1);
709 if (trig_barrel) { thisVects.tdc_mon_rpc.push_back(tdc); }
710 if (trig_endcap) { thisVects.tdc_mon_tgc.push_back(tdc); }
713 thisVects.biny_vslb.push_back(
get_bin_for_LB_hist(iregion, ilayer, stationPhi, thisStationEta, isBIM));
714 if (chambername.substr(0, 3) ==
"BEE" || (chambername.substr(0, 3) ==
"BIS" && (thisStationEta == 7 || thisStationEta == 8))) {
715 thisVects.biny_vslb_bycrate_bis_bee.push_back(
718 thisVects.biny_vslb_bycrate.push_back(
723 if (chambername.substr(0, 3) ==
"BEE" || (chambername.substr(0, 3) ==
"BIS" && (thisStationEta == 7 || thisStationEta == 8))) {
724 thisVects.biny_vslb_bycrate_bis_bee_ontrack.push_back(
727 thisVects.biny_vslb_bycrate_ontrack.push_back(
737 std::string region[4] = {
"BA",
"BC",
"EA",
"EC"};
738 std::string layer[4] = {
"Inner",
"Middle",
"Outer",
"Extra"};
739 std::string crate[4] = {
"01",
"02",
"03",
"04"};
744 for (
int iregion = 0; iregion < 4; ++iregion) {
745 std::string MDT_regionGroup =
"MDT_regionGroup" + region[iregion];
746 for (
int crate_region = 0; crate_region < 4; ++crate_region) {
747 std::string MDT_regionGroup_bycrate =
"MDT_regionGroup_bycrate" + region[crate_region];
748 for (
int ilayer = 0; ilayer < 4; ++ilayer) {
749 for (
int stationPhi = 0; stationPhi < 16; ++stationPhi) {
750 for (
int icrate = 0; icrate < 4; ++icrate) {
753 std::array<MDTSummaryHistogramStruct, 4096>& array = *(vects);
754 auto& thisVects = array[v];
758 fill(
"MdtMonitor", lb_mon, sector);
761 "stEta_" + region[iregion] +
"_" + layer[ilayer] +
"_phi" + std::to_string(stationPhi + 1),
762 thisVects.stationEta);
779 std::string varx = iregion < 2 ?
"x_mon_barrel" :
"x_mon_endcap";
780 std::string vary = iregion < 2 ?
"y_mon_barrel" :
"y_mon_endcap";
781 std::string varx_noise = iregion < 2 ?
"x_mon_barrel_noise" :
"x_mon_endcap_noise";
782 std::string vary_noise = iregion < 2 ?
"y_mon_barrel_noise" :
"y_mon_endcap_noise";
788 fill(
"MdtMonitor", x_mon, y_mon, x_mon_noise, y_mon_noise);
791 varx =
"x_mon_" + region[iregion] +
"_" + layer[ilayer];
792 vary =
"y_mon_" + region[iregion] +
"_" + layer[ilayer];
797 if (layer[ilayer] !=
"Extra") {
798 varx =
"x_mon_" + layer[ilayer];
799 vary =
"y_mon_" + layer[ilayer];
803 fill(
"MdtMonitor", bin_byLayer_x, bin_byLayer_y);
809 auto biny_name =
"y_mon_bin_" + region[iregion] +
"_" + layer[ilayer];
810 if (layer[ilayer] ==
"Extra" || layer[ilayer] ==
"Outer")
811 biny_name =
"y_mon_bin_" + region[iregion] +
"_OuterPlusExtra";
815 std::vector<int> sum_biny_vslb_bycrate;
816 sum_biny_vslb_bycrate.reserve(thisVects.biny_vslb_bycrate.size() + thisVects.biny_vslb_bycrate_bis_bee.size());
817 sum_biny_vslb_bycrate.insert(sum_biny_vslb_bycrate.end(), thisVects.biny_vslb_bycrate_bis_bee.begin(),
818 thisVects.biny_vslb_bycrate_bis_bee.end());
819 sum_biny_vslb_bycrate.insert(sum_biny_vslb_bycrate.end(), thisVects.biny_vslb_bycrate.begin(),
820 thisVects.biny_vslb_bycrate.end());
822 auto biny_name_bycrate =
"y_mon_bin_bycrate_" + region[crate_region] +
"_" + crate[icrate];
825 std::vector<int> sum_biny_vslb_bycrate_ontrack;
826 sum_biny_vslb_bycrate_ontrack.reserve(thisVects.biny_vslb_bycrate_ontrack.size() +
827 thisVects.biny_vslb_bycrate_bis_bee_ontrack.size());
828 sum_biny_vslb_bycrate_ontrack.insert(sum_biny_vslb_bycrate_ontrack.end(),
829 thisVects.biny_vslb_bycrate_bis_bee_ontrack.begin(),
830 thisVects.biny_vslb_bycrate_bis_bee_ontrack.end());
831 sum_biny_vslb_bycrate_ontrack.insert(sum_biny_vslb_bycrate_ontrack.end(),
832 thisVects.biny_vslb_bycrate_ontrack.begin(),
833 thisVects.biny_vslb_bycrate_ontrack.end());
835 auto biny_name_bycrate_ontrack =
"y_mon_bin_bycrate_ontrack_" + region[crate_region] +
"_" + crate[icrate];
836 auto biny_var_bycrate_ontrack =
Monitored::Collection(biny_name_bycrate_ontrack, sum_biny_vslb_bycrate_ontrack);
838 fill(MDT_regionGroup, adc_mon, tdc_mon, tdc_mon_nb2, adc_mon_nb2, tdc_mon_adccut, adc_mon_adccut, tdc_mon_adccut,
839 adc_mon_adccut, tdc_mon_nb3, x_bin_perML, y_bin_perML, tdc_mon_rpc, tdc_mon_tgc, biny_var, lb_mon, biny_var);
841 fill(MDT_regionGroup_bycrate, lb_mon, biny_var_bycrate, biny_var_bycrate_ontrack);
848 return StatusCode::SUCCESS;
853 StatusCode
sc = StatusCode::SUCCESS;
854 Identifier digcoll_id = (mdtCollection)->identify();
855 IdentifierHash digcoll_idHash = (mdtCollection)->collectionHash();
860 std::string hardware_name = chamber->getName();
866 int mdtlayer =
m_idHelperSvc->mdtIdHelper().tubeLayer(digcoll_id);
867 if (
m_idHelperSvc->mdtIdHelper().multilayer(digcoll_id) == 2) {
868 if (hardware_name.at(1) ==
'I' && hardware_name.at(3) !=
'8')
879 float tdc = mdtCollection->
tdc() * 25.0 / 32.0;
881 if (hardware_name.substr(0, 3) ==
"BMG") tdc = mdtCollection->
tdc() * 0.2;
882 float adc = mdtCollection->
adc();
883 if (hardware_name.substr(0, 3) ==
"BMG") adc /=
m_adcScale;
885 int iregion = chamber->GetRegionEnum();
887 int mezz =
mezzmdt(digcoll_id);
889 std::string monPerCh =
"MdtMonPerChamber";
890 if (iregion == 0) monPerCh +=
"BA";
891 if (iregion == 1) monPerCh +=
"BC";
892 if (iregion == 2) monPerCh +=
"EA";
893 if (iregion == 3) monPerCh +=
"EC";
895 int mdtMultLayer =
m_idHelperSvc->mdtIdHelper().multilayer(digcoll_id);
907 fill(monPerCh, tdc_perch, adc_perch, layer_perch, tube_perch, mezz_perch, ml1_adccut, ml2_adccut, adccut_nonoise, adccut);
927 std::string
type =
"MDT";
929 std::set<monAlg::TubeTraversedBySegment, monAlg::TubeTraversedBySegment_cmp> store_effTubes;
930 std::set<Identifier> store_ROTs;
937 ATH_MSG_ERROR(
"Null pointer to the read MuonDetectorManager conditions object");
938 return StatusCode::FAILURE;
953 std::vector<Identifier> ROTs_chamber;
954 std::vector<int> ROTs_tube;
955 std::vector<int> ROTs_L;
956 std::vector<int> ROTs_ML;
969 const std::string& chambername = chamber->getName();
974 if (store_ROTs.count(tmpid)) {
continue; }
975 store_ROTs.insert(tmpid);
980 int iregion = chamber->GetRegionEnum();
981 int ilayer = chamber->GetLayerEnum();
982 int statphi = chamber->GetStationPhi();
984 auto& thisVects = vects[iregion][ilayer][statphi];
985 thisVects.adc_segs_mon.push_back(adc);
989 thisVects.tdc_segs_mon.push_back(tdc);
991 int binx = chamber->GetMDTHitsPerChamber_IMO_BinX();
996 int biny = chamber->GetMDTHitsPerChamber_IMO_BinY();
997 thisVects.x_segs_mon.push_back(binx);
998 thisVects.y_segs_mon.push_back(biny - 1);
1002 int mdtMultLayer =
m_idHelperSvc->mdtIdHelper().multilayer(tmpid);
1007 std::string monPerCh =
"MdtMonPerChamber";
1010 else if (iregion == 1)
1012 else if (iregion == 2)
1014 else if (iregion == 3)
1017 ROTs_chamber.push_back(tmpid);
1018 ROTs_ML.push_back(mdtMultLayer);
1019 ROTs_tube.push_back(
m_idHelperSvc->mdtIdHelper().tube(tmpid));
1020 ROTs_L.push_back(
m_idHelperSvc->mdtIdHelper().tubeLayer(tmpid));
1023 fill(monPerCh, adc_perch, adc_ml1, adc_ml2);
1030 std::vector<Identifier> unique_chambers;
1031 std::vector<std::vector<int>> unique_chambers_ML;
1033 for (
unsigned i = 0; i < ROTs_chamber.size(); i++) {
1034 bool isUnique =
true;
1035 for (
unsigned j = 0; j < unique_chambers.size(); j++) {
1038 if (!
AinB(ROTs_ML.at(i), unique_chambers_ML.at(j))) unique_chambers_ML.at(j).push_back(ROTs_ML.at(i));
1043 unique_chambers.push_back(ROTs_chamber.at(i));
1044 std::vector<int> tmp_ML;
1045 tmp_ML.push_back(ROTs_ML.at(i));
1046 unique_chambers_ML.push_back(tmp_ML);
1052 std::vector<Identifier> traversed_station_id;
1053 std::vector<int> traversed_tube;
1054 std::vector<int> traversed_L;
1055 std::vector<int> traversed_ML;
1057 for (
const Identifier& station_id : unique_chambers) {
1068 for (
int ML : {1, 2}) {
1077 int tubeMin = id_helper.
tubeMin(newId);
1079 for (
int i_tube = tubeMin; i_tube <=
tubeMax; ++i_tube) {
1080 for (
int i_layer = tubeLayerMin; i_layer <= tubeLayerMax; ++i_layer) {
1086 if (myIt->second.count(tubeId)) {
1098 double distance = std::abs(segment_track.
signDistFrom(tube_track));
1101 traversed_tube.push_back(i_tube);
1102 traversed_L.push_back(i_layer);
1103 traversed_ML.push_back(ML);
1104 traversed_station_id.push_back(station_id);
1116 if (traversed_tube.size() < 20) {
1119 for (
unsigned k = 0; k < traversed_tube.size(); k++) {
1121 std::string hardware_name =
getChamberName(traversed_station_id.at(k));
1130 bool hit_flag =
false;
1131 for (
unsigned j = 0; j < ROTs_tube.size(); j++) {
1132 if ((
getChamberName(ROTs_chamber.at(j)) == hardware_name) && (traversed_tube.at(k) == ROTs_tube.at(j)) &&
1133 (traversed_L.at(k) == ROTs_L.at(j)) &&
1134 (traversed_ML.at(k) == ROTs_ML.at(j))) {
1140 const Identifier& trav_id = traversed_station_id.at(k);
1149 int mdtlayer = ((traversed_L.at(k) - 1) + (traversed_ML.at(k) - 1) * tubeLayerMax);
1150 int ibin = traversed_tube.at(k) + mdtlayer *
cachedTubeMax(newId);
1156 std::set<monAlg::TubeTraversedBySegment, monAlg::TubeTraversedBySegment_cmp>::iterator it;
1160 it = store_effTubes.find(tmp_effTube_Hit);
1161 if (hit_flag || (it == store_effTubes.end()))
1162 store_effTubes.insert(tmp_effTube);
1164 it = store_effTubes.find(tmp_effTube_noHit);
1165 if (hit_flag && (it != store_effTubes.end()))
1166 store_effTubes.erase(it);
1180 int tubebin = it.tubeBin;
1182 int iregion = chamber->GetRegionEnum();
1183 std::string monPerCh =
"MdtMonPerChamber";
1184 if (iregion == 0) monPerCh +=
"BA";
1185 if (iregion == 1) monPerCh +=
"BC";
1186 if (iregion == 2) monPerCh +=
"EA";
1187 if (iregion == 3) monPerCh +=
"EC";
1189 std::string chambername = chamber->getName();
1193 fill(monPerCh, tube_perch_segs, hitcut);
1196 return StatusCode::SUCCESS;
1201 std::string region[4] = {
"BA",
"BC",
"EA",
"EC"};
1202 std::string layer[4] = {
"Inner",
"Middle",
"Outer",
"Extra"};
1204 for (
int iregion = 0; iregion < 4; ++iregion) {
1205 std::string MDT_regionGroup =
"MDT_regionGroup" + region[iregion];
1206 for (
int ilayer = 0; ilayer < 4; ++ilayer) {
1207 for (
int stationPhi = 0; stationPhi < 16; ++stationPhi) {
1208 const auto& thisVects = vects[iregion][ilayer][stationPhi];
1212 std::string tdc_var =
"tdc_segs_" + region[iregion] +
"_" + layer[ilayer] +
"_phi" + std::to_string(stationPhi + 1);
1219 fill(MDT_regionGroup, adc_segs_mon, tdc_segs_region_mon);
1221 std::string varx = iregion < 2 ?
"x_segs_mon_barrel" :
"x_segs_mon_endcap";
1222 std::string vary = iregion < 2 ?
"y_segs_mon_barrel" :
"y_segs_mon_endcap";
1226 fill(
"MdtMonitor", tdc_segs_overall_mon, adc_segs_overall_mon, x_segs_mon, y_segs_mon);
1230 return StatusCode::SUCCESS;
1234 PVConstLink cv = mydetEl->getMaterialGeom();
1235 int nGrandchildren = cv->getNChildVols();
1236 if (nGrandchildren <= 0)
return;
1242 for (
int layer = 1; layer <= mydetEl->
getNLayers(); ++layer) {
1244 bool tubefound =
false;
1245 for (
unsigned int kk = 0; kk < cv->getNChildVols(); ++kk) {
1246 int tubegeo = cv->getIdOfChildVol(kk).value() % maxNTubesPerLayer;
1247 int layergeo = (cv->getIdOfChildVol(kk).value() - tubegeo) / maxNTubesPerLayer;
1248 if (tubegeo == tube && layergeo == layer) {
1252 if (layergeo > layer)
break;
1256 deadTubes.insert(deadTubeId);
Scalar eta() const
pseudorapidity method
Scalar phi() const
phi method
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_VERBOSE(x)
std::string convertChamberName(int, int, int, const std::string &)
const ServiceHandle< StoreGateSvc > & detStore() const
virtual StatusCode initialize() override
initialize
AthMonitorAlgorithm(const std::string &name, ISvcLocator *pSvcLocator)
Constructor.
DataModel_detail::const_iterator< DataVector > const_iterator
This is a "hash" representation of an Identifier.
const std::string & getName() const
static uint16_t encode(const uint16_t regionIn, const uint16_t layerIn, const uint16_t phiIn, const uint16_t crate_regionIn, const uint16_t crateIn)
virtual int get_module_hash(const Identifier &id, IdentifierHash &hash_id) const override
static constexpr int maxNTubesPerLayer
The maxNTubesPerLayer represents the absolute maximum of tubes which are built into a single multilay...
static int tubeLayerMin()
Identifier channelID(int stationName, int stationEta, int stationPhi, int multilayer, int tubeLayer, int tube) const
virtual StatusCode fillHistograms(const EventContext &ctx) const override
adds event to the monitoring histograms
int get_bin_for_LB_hist(int region, int layer, int phi, int eta, bool isBIM) const
virtual StatusCode fillMDTHistograms(const Muon::MdtPrepData *) const
StatusCode getChamber(const IdentifierHash &id, MDTChamber *&chamber) const
virtual StatusCode binMdtRegional(TH2 *, std::string_view xAxis)
Gaudi::Property< bool > m_do_mdttdccut_sector
SG::ReadHandleKey< xAOD::TrackParticleContainer > m_muon_type
int GetTubeMax(const Identifier &digcoll_id, std::string_view hardware_name)
std::map< Identifier, std::set< Identifier > > m_DeadChannels
virtual StatusCode binMdtGlobal_byLayer(TH2 *, TH2 *, TH2 *)
StatusCode handleEvent_effCalc_fillVects(const Trk::SegmentCollection *segms, MDTSegmentHistogramStruct(&vects)[4][4][16]) const
std::string getChamberName(const Muon::MdtPrepData *) const
SG::ReadHandleKey< Muon::RpcPrepDataContainer > m_key_rpc
ServiceHandle< Muon::IMuonIdHelperSvc > m_idHelperSvc
Gaudi::Property< size_t > m_ADCCut
std::vector< std::unique_ptr< MDTChamber > > m_hist_hash_list
std::vector< Identifier > m_chambersId
static void CorrectLayerMax(const std::string &hardware_name, int &numLayers)
SG::ReadHandleKey< Muon::MdtPrepDataContainer > m_key_mdt
Gaudi::Property< bool > m_do_run3Geometry
Gaudi::Property< bool > m_doMdtESD
virtual StatusCode fillMDTSummaryHistograms(std::array< MDTSummaryHistogramStruct, 4096 > *vects, int lb) const
const MuonGM::MuonDetectorManager * m_detMgr
virtual StatusCode binMdtGlobal(TH2 *, char ecap)
int mezzmdt(const Identifier &id) const
virtual StatusCode initialize() override
initialize
virtual ~MdtRawDataMonAlg()
int get_bin_for_LB_crate_hist(int region, int layer, int phi, int eta, std::string_view chamber) const
Gaudi::Property< bool > m_do_mdtchamberstatphislice
int cachedTubeLayerMax(const Identifier &id) const
std::vector< IdentifierHash > m_chambersIdHash
Gaudi::Property< size_t > m_adcScale
Gaudi::Property< bool > m_chi2_cut
Gaudi::Property< bool > m_maskNoisyTubes
int cachedTubeMax(const Identifier &id) const
Gaudi::Property< size_t > m_HighOccThreshold
std::unique_ptr< MDTNoisyTubes > m_masked_tubes
virtual void fillMDTOverviewHistograms(const MDTOverviewHistogramStruct &vects) const
SG::ReadHandleKeyArray< Trk::SegmentCollection > m_segm_type
SG::ReadHandleKey< xAOD::MuonRoIContainer > m_l1RoiKey
MdtRawDataMonAlg(const std::string &name, ISvcLocator *pSvcLocator)
virtual StatusCode fillMDTSegmentHistograms(const MDTSegmentHistogramStruct(&vects)[4][4][16]) const
std::map< std::string, int > m_tubesperchamber_map
void initDeadChannels(const MuonGM::MdtReadoutElement *mydetEl)
virtual StatusCode fillMDTSummaryVects(const Muon::MdtPrepData *, const std::set< std::string > &, bool &isNoiseBurstCandidate, bool trig_barrel, bool trig_endcap, std::array< MDTSummaryHistogramStruct, 4096 > *) const
SG::ReadCondHandleKey< MuonGM::MuonDetectorManager > m_DetectorManagerKey
Gaudi::Property< bool > m_doChamberHists
static void ChamberTubeNumberCorrection(int &tubeNum, std::string_view hardware_name, int tubePos, int numLayers)
Gaudi::Property< size_t > m_nb_hits
std::atomic< int > m_firstEvent
Gaudi::Property< bool > m_do_mdtChamberHits
static bool AinB(int A, std::vector< int > &B)
SG::ReadHandleKey< xAOD::EventInfo > m_eventInfo
SG::ReadHandleKey< xAOD::MuonContainer > m_muonKey
static void CorrectTubeMax(const std::string &hardware_name, int &numTubes)
virtual void fillMDTOverviewVects(const Muon::MdtPrepData *, bool &isNoiseBurstCandidate, MDTOverviewHistogramStruct &vects) const
Declare a monitored scalar variable.
double signDistFrom(const MTStraightLine &h) const
get the signed distance of two lines (if both are parallel, dist>0)
Amg::Vector3D tubePos(const Identifier &id) const
Returns the global position of the given tube.
int getNLayers() const
Returns the number of tube layers inside the multilayer.
int getMultilayer() const
Returns the multilayer represented by the readout element.
int getNtubesperlayer() const
Returns the number of tubes in each tube layer.
double innerTubeRadius() const
Returns the inner tube radius excluding the aluminium walls.
The MuonDetectorManager stores the transient representation of the Muon Spectrometer geometry and pro...
const MdtReadoutElement * getMdtReadoutElement(const Identifier &id) const
access via extended identifier (requires unpacking)
const MuonStation * getMuonStation(const std::string &stName, int eta, int phi) const
virtual Amg::Vector3D GlobalToAmdbLRSCoords(const Amg::Vector3D &x) const
virtual Amg::Transform3D GlobalToAmdbLRSTransform() const
Identifier identify() const override final
Returns the ATLAS Identifier of the MuonReadOutElement.
This class represents the corrected MDT measurements, where the corrections include the effects of wi...
virtual const MdtPrepData * prepRawData() const override final
Returns the PrepRawData used to create this corrected measurement.
Class to represent measurements from the Monitored Drift Tubes.
int adc() const
Returns the ADC (typically range is 0 to 250).
int tdc() const
Returns the TDC (typically range is 0 to 2500).
This is the common class for 3D segments used in the muon spectrometer.
const Trk::RIO_OnTrack * rioOnTrack(unsigned int) const
returns the RIO_OnTrack (also known as ROT) objects depending on the integer
unsigned int numberOfContainedROTs() const
number of RIO_OnTracks
const Amg::Vector3D & globalDirection() const
global direction
virtual const Amg::Vector3D & globalPosition() const override final
global position
const_pointer_type cptr()
virtual bool isValid() override final
Can the handle be successfully dereferenced?
const_pointer_type cptr()
Dereference the pointer.
bool isPresent() const
Is the referenced object present in SG?
double chiSquared() const
returns the of the overall track fit
double doubleNumberDoF() const
returns the number of degrees of freedom of the overall track or vertex fit as double
This class is the pure abstract base class for all fittable tracking measurements.
Identifier identify() const
return the identifier
Class to handle RIO On Tracks ROT) for InDet and Muons, it inherits from the common MeasurementBase.
Identifier identify() const
return the identifier -extends MeasurementBase
Base class for all TrackSegment implementations, extends the common MeasurementBase.
const FitQuality * fitQuality() const
return the FitQuality object, returns NULL if no FitQuality is defined
const DataVector< const MeasurementBase > * measurementsOnTrack() const
return a pointer to a vector of MeasurementBase (NOT including any that come from outliers).
void fill(const ToolHandle< GenericMonitoringTool > &groupHandle, std::vector< std::reference_wrapper< Monitored::IMonitoredVariable > > &&variables) const
Fills a vector of variables to a group by reference.
T * get(TKey *tobj)
get a TObject* from a TKey* (why can't a TObject be a TKey?)
Eigen::Affine3d Transform3D
Eigen::Matrix< double, 3, 1 > Vector3D
ValuesCollection< T > Collection(std::string name, const T &collection)
Declare a monitored (double-convertible) collection.
DataVector< Trk::Segment > SegmentCollection
@ numberOfTriggerEtaLayers
layers with trigger eta hits [unit8_t].
@ numberOfPhiLayers
layers with a trigger phi hit [unit8_t].
std::vector< float > adc_mon_nosel
std::vector< float > mdt_tube_z_barrel
std::vector< float > tdc_mon_adcCut
std::vector< float > mdt_tube_x_ovl
std::vector< float > mdt_tube_perp_ovl
std::vector< float > mdt_tube_x_endcap
std::vector< float > tdc_mon_nosel
std::vector< float > mdt_tube_x_barrel
std::vector< float > adc_mon_noiseBurst
std::vector< float > mdt_tube_y_ovl
std::vector< float > adc_mon_noiseBurst_notNoisy
std::vector< float > mdt_tube_y_barrel
std::vector< float > mdt_tube_perp_barrel
std::vector< float > tdc_mon_noiseBurst_adcCut
std::vector< float > tdc_mon_noiseBurst
std::vector< float > mdt_tube_z_endcap
std::vector< float > tdc_mon
std::vector< float > mdt_tube_perp_endcap
std::vector< int > noiseBurst
std::vector< float > mdt_tube_z_ovl
std::vector< float > adc_mon
std::vector< float > mdt_tube_y_endcap
std::vector< int > x_segs_mon
std::vector< int > y_segs_mon
std::vector< float > tdc_segs_mon
std::vector< float > adc_segs_mon
std::vector< float > adc_mon_adccut
std::vector< float > tdc_mon_nb3
std::vector< int > sector
std::vector< int > x_bin_perML
std::vector< int > bin_byLayer_x
std::vector< int > biny_vslb_bycrate
std::vector< float > adc_mon_nb2
std::vector< int > y_bin_perML
std::vector< float > tdc_mon_rpc
std::vector< float > tdc_mon_tgc
std::vector< float > adc_mon_nb1
std::vector< int > biny_vslb_bycrate_bis_bee_ontrack
std::vector< int > stationEta
std::vector< int > biny_vslb_bycrate_bis_bee
std::vector< int > bin_byLayer_y
std::vector< float > tdc_mon_nb2
std::vector< int > x_mon_noise
std::vector< int > biny_vslb
std::vector< float > tdc_mon_nb1
std::vector< float > tdc_mon
std::vector< int > biny_vslb_bycrate_ontrack
std::vector< float > tdc_mon_adccut
std::vector< float > adc_mon
std::vector< int > y_mon_noise
void fill(H5::Group &out_file, size_t iterations)