diff --git a/MuonSpectrometer/MuonCnv/MuonNSWCommonDecode/MuonNSWCommonDecode/NSWOfflineHelper.h b/MuonSpectrometer/MuonCnv/MuonNSWCommonDecode/MuonNSWCommonDecode/NSWOfflineHelper.h index df0a2bf278f66ab57c30edcf649a9e0ec972bd29..2c5f9b001b1aba80142092e55859ba2f8e25fb13 100644 --- a/MuonSpectrometer/MuonCnv/MuonNSWCommonDecode/MuonNSWCommonDecode/NSWOfflineHelper.h +++ b/MuonSpectrometer/MuonCnv/MuonNSWCommonDecode/MuonNSWCommonDecode/NSWOfflineHelper.h @@ -19,8 +19,7 @@ namespace Muon class NSWOfflineHelper { public: - NSWOfflineHelper (Muon::nsw::NSWResourceId *res_id, uint16_t vmm_number, uint16_t vmm_channel_number) - : m_elinkId (res_id), m_vmm (vmm_number), m_chan (vmm_channel_number) {}; + NSWOfflineHelper (Muon::nsw::NSWResourceId *res_id, uint16_t roc_vmm, uint16_t vmm_channel_number); virtual ~NSWOfflineHelper () {}; @@ -37,12 +36,13 @@ namespace Muon uint8_t channel_type (); uint16_t channel_number (); - + uint16_t vmm () { return m_vmm; } + private: - Muon::nsw::NSWResourceId *m_elinkId; + Muon::nsw::NSWResourceId *m_elinkId {nullptr}; - uint16_t m_vmm; - uint16_t m_chan; + uint16_t m_vmm {0}; + uint16_t m_chan {0}; }; class NSWOfflineRobId @@ -68,5 +68,19 @@ namespace Muon } } + +//===================================================================== +inline Muon::nsw::helper::NSWOfflineHelper::NSWOfflineHelper(Muon::nsw::NSWResourceId *res_id, uint16_t roc_vmm, uint16_t vmm_channel_number) +: m_elinkId (res_id) +, m_vmm (roc_vmm) +, m_chan (vmm_channel_number) +{ + // Conversion of an online vmm id (captured by the ROC, read from the fragment) + // to the offline id used in all mappings, and vice versa, since the conversion is symmetric. + constexpr uint8_t vmmRemap[8] = { 2, 3, 0, 1, 5, 4, 6, 7 }; + if (res_id->detId() == eformat::MUON_STGC_ENDCAP_A_SIDE || res_id->detId() == eformat::MUON_STGC_ENDCAP_C_SIDE) + m_vmm = vmmRemap [roc_vmm]; +}; + #endif // _MUON_NSW_OFFLINE_HELPER_H_ diff --git a/MuonSpectrometer/MuonCnv/MuonNSWCommonDecode/MuonNSWCommonDecode/VMMChannel.h b/MuonSpectrometer/MuonCnv/MuonNSWCommonDecode/MuonNSWCommonDecode/VMMChannel.h index 119e8c8e125cc631556f241ace5de69b0349970d..10ef183367659fa43e53f3ffc09d9f67759ff5cd 100644 --- a/MuonSpectrometer/MuonCnv/MuonNSWCommonDecode/MuonNSWCommonDecode/VMMChannel.h +++ b/MuonSpectrometer/MuonCnv/MuonNSWCommonDecode/MuonNSWCommonDecode/VMMChannel.h @@ -17,7 +17,7 @@ namespace Muon private: uint32_t m_vmm_word; - uint16_t m_vmm; // vmm number + uint16_t m_roc_vmm; // captured vmm number uint16_t m_chan; // vmm channel uint16_t m_pdo; // adc amplitude uint16_t m_tdo; // peaking time @@ -52,7 +52,8 @@ namespace Muon uint16_t tdo () {return m_tdo;}; uint16_t rel_bcid () {return m_rel;}; uint16_t vmm_channel () {return m_chan;}; - uint16_t vmm () {return m_vmm;}; + uint16_t roc_vmm () {return m_roc_vmm;}; + uint16_t vmm () {return m_offlineHelper->vmm();}; // Access to Detector logical ID @@ -99,17 +100,17 @@ inline bool Muon::nsw::VMMChannel::calculate_parity () } inline Muon::nsw::VMMChannel::VMMChannel (uint32_t vmm_word, Muon::nsw::NSWElink *elink) - : m_vmm_word (vmm_word), m_elink (elink) +: m_vmm_word (vmm_word), m_elink (elink) { m_tdo = Muon::nsw::helper::get_bits (vmm_word, Muon::nsw::bitMaskVmmHitTDC, Muon::nsw::bitPosVmmHitTDC); // should be 0 if noTDC is true m_pdo = Muon::nsw::helper::get_bits (vmm_word, Muon::nsw::bitMaskVmmHitADC, Muon::nsw::bitPosVmmHitADC); m_chan = Muon::nsw::helper::get_bits (vmm_word, Muon::nsw::bitMaskVmmHitCHANNEL, Muon::nsw::bitPosVmmHitCHANNEL); - m_vmm = Muon::nsw::helper::get_bits (vmm_word, Muon::nsw::bitMaskVmmHitVMMID, Muon::nsw::bitPosVmmHitVMMID); + m_roc_vmm = Muon::nsw::helper::get_bits (vmm_word, Muon::nsw::bitMaskVmmHitVMMID, Muon::nsw::bitPosVmmHitVMMID); m_rel = Muon::nsw::helper::get_bits (vmm_word, Muon::nsw::bitMaskVmmHitRELBCID, Muon::nsw::bitPosVmmHitRELBCID); m_neighbor = Muon::nsw::helper::get_bits (vmm_word, Muon::nsw::bitMaskVmmHitN, Muon::nsw::bitPosVmmHitN); m_parity = Muon::nsw::helper::get_bits (vmm_word, Muon::nsw::bitMaskVmmHitP, Muon::nsw::bitPosVmmHitP); - m_offlineHelper = std::make_unique (elink->elinkId (), m_vmm, m_chan); + m_offlineHelper = std::make_unique (elink->elinkId (), m_roc_vmm, m_chan); } #endif // _MUON_VMM_CHANNEL_H_ diff --git a/MuonSpectrometer/MuonCnv/MuonNSWCommonDecode/MuonNSWCommonDecode/sTGCMapper.h b/MuonSpectrometer/MuonCnv/MuonNSWCommonDecode/MuonNSWCommonDecode/sTGCMapper.h index 08439381d6cf6ff06f253a9150e352a69ad8d30b..cf4eabfc814cc5a821cd4c5211ec6588d5fa577e 100755 --- a/MuonSpectrometer/MuonCnv/MuonNSWCommonDecode/MuonNSWCommonDecode/sTGCMapper.h +++ b/MuonSpectrometer/MuonCnv/MuonNSWCommonDecode/MuonNSWCommonDecode/sTGCMapper.h @@ -20,68 +20,68 @@ namespace Muon sTGCMapper() {}; virtual ~sTGCMapper () {}; - uint16_t channel_number (uint8_t channel_type, uint8_t sector_type, uint8_t quadruplet, uint8_t layer, uint16_t vmm, uint16_t vmm_chan) const; + uint16_t channel_number (uint8_t channel_type, uint8_t sector_type, uint8_t radius, uint8_t layer, uint16_t vmm, uint16_t vmm_chan) const; - static uint16_t private_id (uint8_t channel_type, uint8_t sector_type, uint8_t quadruplet, uint8_t layer); + static uint16_t private_id (uint8_t channel_type, uint8_t sector_type, uint8_t radius, uint8_t layer); }; static const std::map >> s_stgc_channel_map = { // channel range: {vmm0, vmm0_channel, vmm1, vmm1_channel} - // as a function of channel_type, sector_type, quadruplet, layer + // as a function of channel_type, sector_type [1=large 0=small], radius [0->2], layer [0->7] - // note: in bytestream data from pulser runs we see that pads - // are connected to vmms = 2, 3 and not to 1, 2. - + // This mapping reflects the spreadsheet sTGC_AB_Mapping_WithPadTDSChannels.xlsx, + // where vmm ids are the ones set for configuration. + //**** PADS - {sTGCMapper::private_id(OFFLINE_CHANNEL_TYPE_PAD, 0, 0, 0), { {3, 39, 2, 36} }}, // QS1C - {sTGCMapper::private_id(OFFLINE_CHANNEL_TYPE_PAD, 0, 0, 1), { {2, 24, 3, 27} }}, - {sTGCMapper::private_id(OFFLINE_CHANNEL_TYPE_PAD, 0, 0, 2), { {2, 24, 3, 31} }}, - {sTGCMapper::private_id(OFFLINE_CHANNEL_TYPE_PAD, 0, 0, 3), { {3, 39, 2, 32} }}, - {sTGCMapper::private_id(OFFLINE_CHANNEL_TYPE_PAD, 0, 0, 4), { {3, 39, 2, 36} }}, // QS1P - {sTGCMapper::private_id(OFFLINE_CHANNEL_TYPE_PAD, 0, 0, 5), { {2, 24, 3, 27} }}, - {sTGCMapper::private_id(OFFLINE_CHANNEL_TYPE_PAD, 0, 0, 6), { {2, 24, 3, 10} }}, - {sTGCMapper::private_id(OFFLINE_CHANNEL_TYPE_PAD, 0, 0, 7), { {3, 39, 2, 53} }}, - {sTGCMapper::private_id(OFFLINE_CHANNEL_TYPE_PAD, 0, 1, 0), { {3, 23, 2, 40} }}, // QS2C - {sTGCMapper::private_id(OFFLINE_CHANNEL_TYPE_PAD, 0, 1, 1), { {2, 40, 3, 23} }}, - {sTGCMapper::private_id(OFFLINE_CHANNEL_TYPE_PAD, 0, 1, 2), { {2, 42, 3, 22} }}, - {sTGCMapper::private_id(OFFLINE_CHANNEL_TYPE_PAD, 0, 1, 3), { {3, 21, 2, 41} }}, - {sTGCMapper::private_id(OFFLINE_CHANNEL_TYPE_PAD, 0, 1, 4), { {3, 14, 2, 49} }}, // QS2P - {sTGCMapper::private_id(OFFLINE_CHANNEL_TYPE_PAD, 0, 1, 5), { {2, 49, 3, 14} }}, - {sTGCMapper::private_id(OFFLINE_CHANNEL_TYPE_PAD, 0, 1, 6), { {2, 42, 3, 22} }}, - {sTGCMapper::private_id(OFFLINE_CHANNEL_TYPE_PAD, 0, 1, 7), { {3, 21, 2, 41} }}, - {sTGCMapper::private_id(OFFLINE_CHANNEL_TYPE_PAD, 0, 2, 0), { {3, 40, 3, 2} }}, // QS3C - {sTGCMapper::private_id(OFFLINE_CHANNEL_TYPE_PAD, 0, 2, 1), { {2, 1, 2, 39} }}, - {sTGCMapper::private_id(OFFLINE_CHANNEL_TYPE_PAD, 0, 2, 2), { {2, 0, 2, 41} }}, - {sTGCMapper::private_id(OFFLINE_CHANNEL_TYPE_PAD, 0, 2, 3), { {3, 41, 3, 0} }}, - {sTGCMapper::private_id(OFFLINE_CHANNEL_TYPE_PAD, 0, 2, 4), { {3, 32, 3, 9} }}, // QS3P - {sTGCMapper::private_id(OFFLINE_CHANNEL_TYPE_PAD, 0, 2, 5), { {3, 9, 3, 32} }}, - {sTGCMapper::private_id(OFFLINE_CHANNEL_TYPE_PAD, 0, 2, 6), { {3, 2, 3, 40} }}, - {sTGCMapper::private_id(OFFLINE_CHANNEL_TYPE_PAD, 0, 2, 7), { {3, 39, 3, 1} }}, - {sTGCMapper::private_id(OFFLINE_CHANNEL_TYPE_PAD, 1, 0, 0), { {3, 39, 2, 2} }}, // QL1P - {sTGCMapper::private_id(OFFLINE_CHANNEL_TYPE_PAD, 1, 0, 1), { {2, 8, 3, 45} }}, - {sTGCMapper::private_id(OFFLINE_CHANNEL_TYPE_PAD, 1, 0, 2), { {2, 8, 3, 55} }}, - {sTGCMapper::private_id(OFFLINE_CHANNEL_TYPE_PAD, 1, 0, 3), { {3, 39, 2, 0}, {3, 40, 3, 47} }}, - {sTGCMapper::private_id(OFFLINE_CHANNEL_TYPE_PAD, 1, 0, 4), { {3, 39, 2, 8} }}, // QL1C - {sTGCMapper::private_id(OFFLINE_CHANNEL_TYPE_PAD, 1, 0, 5), { {2, 8, 3, 39} }}, - {sTGCMapper::private_id(OFFLINE_CHANNEL_TYPE_PAD, 1, 0, 6), { {2, 13, 3, 44} }}, - {sTGCMapper::private_id(OFFLINE_CHANNEL_TYPE_PAD, 1, 0, 7), { {3, 34, 2, 3} }}, - {sTGCMapper::private_id(OFFLINE_CHANNEL_TYPE_PAD, 1, 1, 0), { {3, 29, 2, 38} }}, // QL2P - {sTGCMapper::private_id(OFFLINE_CHANNEL_TYPE_PAD, 1, 1, 1), { {2, 34, 3, 25} }}, - {sTGCMapper::private_id(OFFLINE_CHANNEL_TYPE_PAD, 1, 1, 2), { {2, 24, 3, 34} }}, - {sTGCMapper::private_id(OFFLINE_CHANNEL_TYPE_PAD, 1, 1, 3), { {3, 39, 2, 29} }}, - {sTGCMapper::private_id(OFFLINE_CHANNEL_TYPE_PAD, 1, 1, 4), { {3, 29, 2, 38} }}, // QL2C - {sTGCMapper::private_id(OFFLINE_CHANNEL_TYPE_PAD, 1, 1, 5), { {2, 34, 3, 25} }}, - {sTGCMapper::private_id(OFFLINE_CHANNEL_TYPE_PAD, 1, 1, 6), { {2, 34, 3, 25} }}, - {sTGCMapper::private_id(OFFLINE_CHANNEL_TYPE_PAD, 1, 1, 7), { {3, 29, 2, 38} }}, - {sTGCMapper::private_id(OFFLINE_CHANNEL_TYPE_PAD, 1, 2, 0), { {3, 21, 2, 26} }}, // QL3P - {sTGCMapper::private_id(OFFLINE_CHANNEL_TYPE_PAD, 1, 2, 1), { {2, 44, 3, 39} }}, - {sTGCMapper::private_id(OFFLINE_CHANNEL_TYPE_PAD, 1, 2, 2), { {2, 34, 3, 39} }}, - {sTGCMapper::private_id(OFFLINE_CHANNEL_TYPE_PAD, 1, 2, 3), { {3, 31, 2, 26} }}, - {sTGCMapper::private_id(OFFLINE_CHANNEL_TYPE_PAD, 1, 2, 4), { {3, 13, 2, 26} }}, // QL3C - {sTGCMapper::private_id(OFFLINE_CHANNEL_TYPE_PAD, 1, 2, 5), { {2, 52, 3, 39} }}, - {sTGCMapper::private_id(OFFLINE_CHANNEL_TYPE_PAD, 1, 2, 6), { {2, 48, 3, 39} }}, - {sTGCMapper::private_id(OFFLINE_CHANNEL_TYPE_PAD, 1, 2, 7), { {3, 17, 2, 26} }}, + {sTGCMapper::private_id(OFFLINE_CHANNEL_TYPE_PAD, 0, 0, 0), { {2, 39, 1, 36} }}, // QS1C + {sTGCMapper::private_id(OFFLINE_CHANNEL_TYPE_PAD, 0, 0, 1), { {1, 24, 2, 27} }}, + {sTGCMapper::private_id(OFFLINE_CHANNEL_TYPE_PAD, 0, 0, 2), { {1, 24, 2, 31} }}, + {sTGCMapper::private_id(OFFLINE_CHANNEL_TYPE_PAD, 0, 0, 3), { {2, 39, 1, 32} }}, + {sTGCMapper::private_id(OFFLINE_CHANNEL_TYPE_PAD, 0, 0, 4), { {2, 39, 1, 36} }}, // QS1P + {sTGCMapper::private_id(OFFLINE_CHANNEL_TYPE_PAD, 0, 0, 5), { {1, 24, 2, 27} }}, + {sTGCMapper::private_id(OFFLINE_CHANNEL_TYPE_PAD, 0, 0, 6), { {1, 24, 2, 10} }}, + {sTGCMapper::private_id(OFFLINE_CHANNEL_TYPE_PAD, 0, 0, 7), { {2, 39, 1, 53} }}, + {sTGCMapper::private_id(OFFLINE_CHANNEL_TYPE_PAD, 0, 1, 0), { {2, 23, 1, 40} }}, // QS2C + {sTGCMapper::private_id(OFFLINE_CHANNEL_TYPE_PAD, 0, 1, 1), { {1, 40, 2, 23} }}, + {sTGCMapper::private_id(OFFLINE_CHANNEL_TYPE_PAD, 0, 1, 2), { {1, 42, 2, 22} }}, + {sTGCMapper::private_id(OFFLINE_CHANNEL_TYPE_PAD, 0, 1, 3), { {2, 21, 1, 41} }}, + {sTGCMapper::private_id(OFFLINE_CHANNEL_TYPE_PAD, 0, 1, 4), { {2, 14, 1, 49} }}, // QS2P + {sTGCMapper::private_id(OFFLINE_CHANNEL_TYPE_PAD, 0, 1, 5), { {1, 49, 2, 14} }}, + {sTGCMapper::private_id(OFFLINE_CHANNEL_TYPE_PAD, 0, 1, 6), { {1, 42, 2, 22} }}, + {sTGCMapper::private_id(OFFLINE_CHANNEL_TYPE_PAD, 0, 1, 7), { {2, 21, 1, 41} }}, + {sTGCMapper::private_id(OFFLINE_CHANNEL_TYPE_PAD, 0, 2, 0), { {2, 40, 2, 2} }}, // QS3C + {sTGCMapper::private_id(OFFLINE_CHANNEL_TYPE_PAD, 0, 2, 1), { {1, 1, 1, 39} }}, + {sTGCMapper::private_id(OFFLINE_CHANNEL_TYPE_PAD, 0, 2, 2), { {1, 0, 1, 41} }}, + {sTGCMapper::private_id(OFFLINE_CHANNEL_TYPE_PAD, 0, 2, 3), { {2, 41, 2, 0} }}, + {sTGCMapper::private_id(OFFLINE_CHANNEL_TYPE_PAD, 0, 2, 4), { {2, 32, 2, 9} }}, // QS3P + {sTGCMapper::private_id(OFFLINE_CHANNEL_TYPE_PAD, 0, 2, 5), { {2, 9, 2, 32} }}, + {sTGCMapper::private_id(OFFLINE_CHANNEL_TYPE_PAD, 0, 2, 6), { {2, 2, 2, 40} }}, + {sTGCMapper::private_id(OFFLINE_CHANNEL_TYPE_PAD, 0, 2, 7), { {2, 39, 2, 1} }}, + {sTGCMapper::private_id(OFFLINE_CHANNEL_TYPE_PAD, 1, 0, 0), { {2, 39, 1, 2} }}, // QL1P + {sTGCMapper::private_id(OFFLINE_CHANNEL_TYPE_PAD, 1, 0, 1), { {1, 8, 2, 45} }}, + {sTGCMapper::private_id(OFFLINE_CHANNEL_TYPE_PAD, 1, 0, 2), { {1, 8, 2, 55} }}, + {sTGCMapper::private_id(OFFLINE_CHANNEL_TYPE_PAD, 1, 0, 3), { {2, 39, 1, 0}, {2, 40, 2, 47} }}, + {sTGCMapper::private_id(OFFLINE_CHANNEL_TYPE_PAD, 1, 0, 4), { {2, 39, 1, 8} }}, // QL1C + {sTGCMapper::private_id(OFFLINE_CHANNEL_TYPE_PAD, 1, 0, 5), { {1, 8, 2, 39} }}, + {sTGCMapper::private_id(OFFLINE_CHANNEL_TYPE_PAD, 1, 0, 6), { {1, 13, 2, 44} }}, + {sTGCMapper::private_id(OFFLINE_CHANNEL_TYPE_PAD, 1, 0, 7), { {2, 34, 1, 3} }}, + {sTGCMapper::private_id(OFFLINE_CHANNEL_TYPE_PAD, 1, 1, 0), { {2, 29, 1, 38} }}, // QL2P + {sTGCMapper::private_id(OFFLINE_CHANNEL_TYPE_PAD, 1, 1, 1), { {1, 34, 2, 25} }}, + {sTGCMapper::private_id(OFFLINE_CHANNEL_TYPE_PAD, 1, 1, 2), { {1, 24, 2, 34} }}, + {sTGCMapper::private_id(OFFLINE_CHANNEL_TYPE_PAD, 1, 1, 3), { {2, 39, 1, 29} }}, + {sTGCMapper::private_id(OFFLINE_CHANNEL_TYPE_PAD, 1, 1, 4), { {2, 29, 1, 38} }}, // QL2C + {sTGCMapper::private_id(OFFLINE_CHANNEL_TYPE_PAD, 1, 1, 5), { {1, 34, 2, 25} }}, + {sTGCMapper::private_id(OFFLINE_CHANNEL_TYPE_PAD, 1, 1, 6), { {1, 34, 2, 25} }}, + {sTGCMapper::private_id(OFFLINE_CHANNEL_TYPE_PAD, 1, 1, 7), { {2, 29, 1, 38} }}, + {sTGCMapper::private_id(OFFLINE_CHANNEL_TYPE_PAD, 1, 2, 0), { {2, 21, 1, 26} }}, // QL3P + {sTGCMapper::private_id(OFFLINE_CHANNEL_TYPE_PAD, 1, 2, 1), { {1, 44, 2, 39} }}, + {sTGCMapper::private_id(OFFLINE_CHANNEL_TYPE_PAD, 1, 2, 2), { {1, 34, 2, 39} }}, + {sTGCMapper::private_id(OFFLINE_CHANNEL_TYPE_PAD, 1, 2, 3), { {2, 31, 1, 26} }}, + {sTGCMapper::private_id(OFFLINE_CHANNEL_TYPE_PAD, 1, 2, 4), { {2, 13, 1, 26} }}, // QL3C + {sTGCMapper::private_id(OFFLINE_CHANNEL_TYPE_PAD, 1, 2, 5), { {1, 52, 2, 39} }}, + {sTGCMapper::private_id(OFFLINE_CHANNEL_TYPE_PAD, 1, 2, 6), { {1, 48, 2, 39} }}, + {sTGCMapper::private_id(OFFLINE_CHANNEL_TYPE_PAD, 1, 2, 7), { {2, 17, 1, 26} }}, //**** STRIPS {sTGCMapper::private_id(OFFLINE_CHANNEL_TYPE_STRIP, 0, 0, 0), { {7, 21, 6, 48}, {6, 15, 5, 48}, {5, 15, 0, 0} }}, @@ -189,10 +189,10 @@ namespace Muon //===================================================================== -inline uint16_t Muon::nsw::sTGCMapper::private_id (uint8_t channel_type, uint8_t sector_type, uint8_t quadruplet, uint8_t layer) +inline uint16_t Muon::nsw::sTGCMapper::private_id (uint8_t channel_type, uint8_t sector_type, uint8_t radius, uint8_t layer) { // an internal unique ID for every VMM channel - return (channel_type & 0xf) << 12 | (sector_type & 0xf) << 8 | (quadruplet & 0xf) << 4 | (layer & 0xf); + return (channel_type & 0xf) << 12 | (sector_type & 0xf) << 8 | (radius & 0xf) << 4 | (layer & 0xf); } #endif // _MUON_NSW_STGC_MAPPER_H_