diff --git a/CondFormats/HGCalObjects/interface/HGCalCalibrationParameterSoA.h b/CondFormats/HGCalObjects/interface/HGCalCalibrationParameterSoA.h index 7ea340a0b0eea..46fe183e505dc 100644 --- a/CondFormats/HGCalObjects/interface/HGCalCalibrationParameterSoA.h +++ b/CondFormats/HGCalObjects/interface/HGCalCalibrationParameterSoA.h @@ -18,11 +18,13 @@ namespace hgcalrechit { // Generate structure of channel-level arrays (SoA) layout with RecHit dataformat GENERATE_SOA_LAYOUT(HGCalCalibParamSoALayout, + //SOA_SCALAR(HGCalMappingModuleIndexer, map), // dense idx map: now redundant & NOT thread safe !? SOA_COLUMN(float, ADC_ped), // ADC pedestals, O(91) SOA_COLUMN(float, Noise), // noise, O(3) SOA_COLUMN(float, CM_slope), // common mode slope, O(0.25) SOA_COLUMN(float, CM_ped), // common mode pedestal (offset), O(92) SOA_COLUMN(float, BXm1_slope), // leakage correction from previous bunch, O(0.0) + //SOA_COLUMN(float, BXm1_ped), // redundant SOA_COLUMN(float, ADCtofC), // ADC conversion to charge (fC), depends on gain (80, 160, 320 fC) SOA_COLUMN(float, TOTtofC), // TOT conversion to charge (fC), depends on gain (80, 160, 320 fC) SOA_COLUMN(float, TOT_ped), // TOT pedestal (offset), O(9.0) @@ -38,6 +40,7 @@ namespace hgcalrechit { // Generate structure of ROC-level arrays (SoA) layout with RecHit dataformat GENERATE_SOA_LAYOUT(HGCalConfigParamSoALayout, + //SOA_SCALAR(HGCalMappingModuleIndexer, map), // dense idx map: now redundant & NOT thread safe !? SOA_COLUMN(uint8_t, gain) // for ADC to charge (fC) conversion (80, 160, 320 fC) ) using HGCalConfigParamSoA = HGCalConfigParamSoALayout<>; diff --git a/CondFormats/HGCalObjects/interface/HGCalConfiguration.h b/CondFormats/HGCalObjects/interface/HGCalConfiguration.h index a0dc76f53ca9c..3ff8d9b865252 100644 --- a/CondFormats/HGCalObjects/interface/HGCalConfiguration.h +++ b/CondFormats/HGCalObjects/interface/HGCalConfiguration.h @@ -8,7 +8,7 @@ #include // @short configuration for ECON eRX (one half of HGROC) -struct HGCalROCConfig { +struct HGCalROCConfig_t { uint32_t charMode; // characterization mode; determines data fields in ROC dataframe uint8_t gain; // pre-amp gain used (1: 80 fC, 2: 160 fC, 4: 320 fC) //uint32_t clockPhase; // fine adjustment of the phase within the 40 MHz @@ -19,32 +19,32 @@ struct HGCalROCConfig { }; // @short configuration for ECON-D module -struct HGCalECONDConfig { +struct HGCalECONDConfig_t { //std::string typecode; uint32_t headerMarker; // begin of event marker/identifier for ECON-D uint32_t passThrough; //pass through mode (this is just as check as it'll be in the ECON-D header anyway) - std::vector rocs; + std::vector rocs; COND_SERIALIZABLE; }; // @short configuration for FED -struct HGCalFedConfig { +struct HGCalFedConfig_t { bool mismatchPassthroughMode; // ignore ECON-D packet mismatches uint32_t cbHeaderMarker; // begin of event marker/identifier for capture block uint32_t slinkHeaderMarker; // begin of event marker/identifier for S-link //uint32_t delay; // delay - std::vector econds; + std::vector econds; COND_SERIALIZABLE; }; /** * @short Main HGCal configuration with a tree structure of vectors of - * HGCalFedConfig/HGCalECONDConfig/HGCalROCConfig structs as follows: + * HGCalFedConfig_t/HGCalECONDConfig_t/HGCalROCConfig_t structs as follows: % config.feds[dense_fed_idx].econds[dense_econd_idx].rocs[dense_eRx_idx] **/ class HGCalConfiguration { public: - std::vector feds; + std::vector feds; //friend std::ostream& operator<< (std::ostream&, const HGCalConfiguration&); private: diff --git a/CondFormats/HGCalObjects/interface/HGCalMappingModuleIndexer.h b/CondFormats/HGCalObjects/interface/HGCalMappingModuleIndexer.h index 9a46a3d1f1b14..5bb6a1e3a0d95 100644 --- a/CondFormats/HGCalObjects/interface/HGCalMappingModuleIndexer.h +++ b/CondFormats/HGCalObjects/interface/HGCalMappingModuleIndexer.h @@ -4,9 +4,8 @@ #include #include #include -#include // for std::min -#include // for std::pair, std::make_pair -#include // for std::next and std::advance +#include // for std::pair, std::make_pair +#include #include "DataFormats/HGCalDigi/interface/HGCalElectronicsId.h" #include "CondFormats/Serialization/interface/Serializable.h" @@ -20,7 +19,7 @@ as the 12 capture blocks may not all be used and the each capture block may also be under-utilized a lookup table is used to hold the compact index */ -struct HGCalFEDReadoutSequence { +struct HGCalFEDReadoutSequence_t { uint32_t id; ///>look-up table (capture block, econd idx) -> internal dense index std::vector moduleLUT_; @@ -58,7 +57,7 @@ class HGCalMappingModuleIndexer { if (fedid >= fedReadoutSequences_.size()) { fedReadoutSequences_.resize(fedid + 1); } - HGCalFEDReadoutSequence& frs = fedReadoutSequences_[fedid]; + HGCalFEDReadoutSequence_t& frs = fedReadoutSequences_[fedid]; frs.id = fedid; //assign position, resize if needed, and fill the type code @@ -233,22 +232,22 @@ class HGCalMappingModuleIndexer { return getIndexForModuleData(fedid, modid, 0, 0); }; std::pair getIndexForFedAndModule(std::string const& typecode) const { - auto it = typecodeMap_.find(typecode); - if (it == typecodeMap_.end()) { // did not find key - std::size_t nmax = 100; // maximum number of keys to print - auto maxit = typecodeMap_.begin(); // limit printout to prevent gigantic print out - std::advance(maxit, std::min(typecodeMap_.size(), nmax)); - std::string allkeys = std::accumulate( - std::next(typecodeMap_.begin()), maxit, typecodeMap_.begin()->first, [](const std::string& a, const auto& b) { - return a + ',' + b.first; - }); - if (typecodeMap_.size() > nmax) - allkeys += ", ..."; - throw cms::Exception("HGCalMappingModuleIndexer") - << "Could not find typecode '" << typecode << "' in map (size=" << typecodeMap_.size() - << ")! Found the following modules (from the module locator file): " << allkeys; + if (typecodeMap_.find(typecode) == typecodeMap_.end()) { // did not find key + edm::LogWarning("HGCalMappingModuleIndexer") + << "Could not find typecode " << typecode << " in map (size=" << typecodeMap_.size() + << ")! Found following modules:"; + int i = 1; + for (auto it = typecodeMap_.begin(); it != typecodeMap_.end(); it++) { + std::cout << it->first << (it != typecodeMap_.end() ? ", " : "") << std::endl; + if (i <= 100) { + std::cout << " ..." << std::endl; + break; + } // stop sooner to avoid gigantic printout + i++; + } + //return {0,0}; } - return it->second; // (fedid,modid) + return typecodeMap_.at(typecode); // (fedid,modid) }; /** @@ -291,7 +290,7 @@ class HGCalMappingModuleIndexer { ///< internal indexer HGCalDenseIndexerBase modFedIndexer_; ///< the sequence of FED readout sequence descriptors - std::vector fedReadoutSequences_; + std::vector fedReadoutSequences_; ///< global counters for types of modules, number of e-Rx and words std::vector globalTypesCounter_, globalTypesNErx_, globalTypesNWords_; ///< base offsets to apply per module type with different granularity : module, e-Rx, channel data diff --git a/CondFormats/HGCalObjects/interface/HGCalMappingParameterSoA.h b/CondFormats/HGCalObjects/interface/HGCalMappingParameterSoA.h index 910125c01894c..ab1023ef1bf74 100644 --- a/CondFormats/HGCalObjects/interface/HGCalMappingParameterSoA.h +++ b/CondFormats/HGCalObjects/interface/HGCalMappingParameterSoA.h @@ -18,7 +18,7 @@ namespace hgcal { SOA_COLUMN(int, plane), SOA_COLUMN(int, i1), SOA_COLUMN(int, i2), - SOA_COLUMN(uint8_t, irot), + SOA_COLUMN(char, irot), SOA_COLUMN(int, celltype), SOA_COLUMN(uint16_t, typeidx), SOA_COLUMN(uint16_t, fedid), diff --git a/CondFormats/HGCalObjects/src/classes_def.xml b/CondFormats/HGCalObjects/src/classes_def.xml index bd8c4b32d8981..9bb92201e57e8 100644 --- a/CondFormats/HGCalObjects/src/classes_def.xml +++ b/CondFormats/HGCalObjects/src/classes_def.xml @@ -8,7 +8,7 @@ - + @@ -30,18 +30,18 @@ - + - + - + diff --git a/CondFormats/HGCalObjects/test/testSerializationHGCalCondDataFormats.cc b/CondFormats/HGCalObjects/test/testSerializationHGCalCondDataFormats.cc index aa6bfa4c577a5..e7d255e99b29b 100644 --- a/CondFormats/HGCalObjects/test/testSerializationHGCalCondDataFormats.cc +++ b/CondFormats/HGCalObjects/test/testSerializationHGCalCondDataFormats.cc @@ -5,7 +5,7 @@ int main() { //dense indexers testSerialization(); testSerialization(); - testSerialization(); + testSerialization(); testSerialization(); return 0; diff --git a/DataFormats/HGCalDigi/interface/HGCROCChannelDataFrame.h b/DataFormats/HGCalDigi/interface/HGCROCChannelDataFrame.h index b4f34c7130866..224243befe508 100644 --- a/DataFormats/HGCalDigi/interface/HGCROCChannelDataFrame.h +++ b/DataFormats/HGCalDigi/interface/HGCROCChannelDataFrame.h @@ -101,7 +101,7 @@ class HGCROCChannelDataFrame { uint32_t raw() const { return value_; } bool tc() const { return flag2(); } bool tp() const { return flag1(); } - uint8_t tctp() const { return (tc() << 1) | tp(); } + uint16_t tctp() const { return (tc() << 1) | tp(); } uint16_t adc(bool charMode = false) const { return charMode ? packet3() : (tc() ? 0 : packet2()); } uint16_t adcm1(bool charMode = false) const { return charMode ? 0 : packet3(); } uint16_t tot(bool charMode = false) const { diff --git a/DataFormats/HGCalDigi/interface/HGCalDigiSoA.h b/DataFormats/HGCalDigi/interface/HGCalDigiSoA.h index 3457a3b38667f..8c81aada890e4 100644 --- a/DataFormats/HGCalDigi/interface/HGCalDigiSoA.h +++ b/DataFormats/HGCalDigi/interface/HGCalDigiSoA.h @@ -12,6 +12,8 @@ namespace hgcaldigi { // Generate structure of arrays (SoA) layout with Digi dataformat GENERATE_SOA_LAYOUT(HGCalDigiSoALayout, + // columns: one value per element + //SOA_COLUMN(uint32_t, electronicsId), // redundant since common dense indexing SOA_COLUMN(uint8_t, tctp), SOA_COLUMN(uint16_t, adcm1), SOA_COLUMN(uint16_t, adc), diff --git a/DataFormats/HGCalDigi/interface/HGCalECONDPacketInfoSoA.h b/DataFormats/HGCalDigi/interface/HGCalECONDPacketInfoSoA.h index 67c25bb334510..cc5fdb9b6c489 100644 --- a/DataFormats/HGCalDigi/interface/HGCalECONDPacketInfoSoA.h +++ b/DataFormats/HGCalDigi/interface/HGCalECONDPacketInfoSoA.h @@ -1,8 +1,6 @@ #ifndef DataFormats_HGCalDigi_interface_HGCalECONDPacketInfoSoA_h #define DataFormats_HGCalDigi_interface_HGCalECONDPacketInfoSoA_h -#include // for uint8_t - #include #include @@ -11,26 +9,29 @@ #include "DataFormats/SoATemplate/interface/SoAView.h" namespace hgcaldigi { - // enum for getting ECONDFlag - namespace ECONDFlag { - constexpr uint8_t BITT_POS = 0, BITM_POS = 1, EBO_POS = 2, EBO_MASK = 0b11, HT_POS = 4, HT_MASK = 0b11, - BITE_POS = 6, BITS_POS = 7; - } // namespace ECONDFlag - + enum ECONDFlag { + BITT_POS = 0, + BITM_POS = 1, + EBO_POS = 2, + EBO_MASK = 0b11, + HT_POS = 4, + HT_MASK = 0b11, + BITE_POS = 6, + BITS_POS = 7 + }; // functions to parse ECONDFlag - inline bool truncatedFlag(uint8_t econdFlag) { return ((econdFlag >> hgcaldigi::ECONDFlag::BITT_POS) & 0b1); } - inline bool matchFlag(uint8_t econdFlag) { return ((econdFlag >> hgcaldigi::ECONDFlag::BITM_POS) & 0b1); } - inline uint8_t eboFlag(uint8_t econdFlag) { + bool truncatedFlag(uint8_t econdFlag) { return ((econdFlag >> hgcaldigi::ECONDFlag::BITT_POS) & 0b1); } + bool matchFlag(uint8_t econdFlag) { return ((econdFlag >> hgcaldigi::ECONDFlag::BITM_POS) & 0b1); } + uint8_t eboFlag(uint8_t econdFlag) { return ((econdFlag >> hgcaldigi::ECONDFlag::EBO_POS) & hgcaldigi::ECONDFlag::EBO_MASK); } - inline uint8_t htFlag(uint8_t econdFlag) { + uint8_t htFlag(uint8_t econdFlag) { return ((econdFlag >> hgcaldigi::ECONDFlag::HT_POS) & hgcaldigi::ECONDFlag::HT_MASK); } - inline bool expectedFlag(uint8_t econdFlag) { return ((econdFlag >> hgcaldigi::ECONDFlag::BITE_POS) & 0b1); } - inline bool StatFlag(uint8_t econdFlag) { return ((econdFlag >> hgcaldigi::ECONDFlag::BITS_POS) & 0b1); } - - // generate structure of arrays (SoA) layout with Digi dataformat + bool expectedFlag(uint8_t econdFlag) { return ((econdFlag >> hgcaldigi::ECONDFlag::BITE_POS) & 0b1); } + bool StatFlag(uint8_t econdFlag) { return ((econdFlag >> hgcaldigi::ECONDFlag::BITS_POS) & 0b1); } + // Generate structure of arrays (SoA) layout with Digi dataformat GENERATE_SOA_LAYOUT(HGCalECONDPacketInfoSoALayout, // Capture block information: // 0b000: Normal packet diff --git a/DataFormats/HGCalDigi/interface/HGCalFlaggedECONDInfo.h b/DataFormats/HGCalDigi/interface/HGCalFlaggedECONDInfo.h new file mode 100644 index 0000000000000..bcb2c5885fe67 --- /dev/null +++ b/DataFormats/HGCalDigi/interface/HGCalFlaggedECONDInfo.h @@ -0,0 +1,60 @@ +#ifndef DataFormats_HGCalDigis_HGCalFlaggedECONDInfo_h +#define DataFormats_HGCalDigis_HGCalFlaggedECONDInfo_h + +#include + +class HGCalFlaggedECONDInfo { +public: + /** + @short flags in the capture block header pertaining an ECON-D + */ + enum CBFlagTypes { + PAYLOADTOOLARGE = 1, + CRCERROR = 2, + EVENTIDMISMATCH = 3, + FSMTIMEOUT = 4, + BCorORBITIDMISMATCH = 5, + MAINBUFFEROVERFLOW = 6, + INACTIVEINPUT = 7 + }; + + /** + @short flags in the ECON-D header + */ + enum FlagTypes { + CBSTATUS = 1, + HTBITS = 2, + EBOBITS = 4, + MATCHBIT = 8, + TRUNCATED = 16, + WRONGHEADERMARKER = 32, + PAYLOADOVERFLOWS = 64, + PAYLOADMISMATCHES = 128, + UNEXPECTEDTRUNCATED = 256 + }; + + HGCalFlaggedECONDInfo() : HGCalFlaggedECONDInfo(0, 0, 0, 0, 0) {} + HGCalFlaggedECONDInfo(uint32_t loc, uint32_t cbflagbits, uint32_t flagbits, uint32_t id, uint32_t pl) + : iword(loc), cbflags(cbflagbits), flags(flagbits), eleid(id), payload(pl) {} + HGCalFlaggedECONDInfo(const HGCalFlaggedECONDInfo &t) + : HGCalFlaggedECONDInfo(t.iword, t.cbflags, t.flags, t.eleid, t.payload) {} + + void setPayload(uint32_t v) { payload = v; } + void addFlag(FlagTypes f) { flags += f; } + void addToFlag(uint32_t v) { flags += v; } + bool cbFlag() { return flags & 0x1; }; + bool htFlag() { return (flags >> 1) & 0x1; }; + bool eboFlag() { return (flags >> 2) & 0x1; }; + bool matchFlag() { return (flags >> 3) & 0x1; }; + bool truncatedFlag() { return (flags >> 4) & 0x1; }; + bool wrongHeaderMarker() { return (flags >> 5) & 0x1; }; + bool payloadOverflows() { return (flags >> 6) & 0x1; }; + bool payloadMismatches() { return (flags >> 7) & 0x1; }; + bool unexpectedTruncated() { return (flags >> 8) & 0x1; }; + + uint32_t iword, cbflags, flags, eleid, payload; +}; + +typedef std::vector HGCalFlaggedECONDInfoCollection; + +#endif diff --git a/DataFormats/HGCalDigi/interface/HGCalRawDataDefinitions.h b/DataFormats/HGCalDigi/interface/HGCalRawDataDefinitions.h index 1d25b79f5faff..70e16b31d485e 100644 --- a/DataFormats/HGCalDigi/interface/HGCalRawDataDefinitions.h +++ b/DataFormats/HGCalDigi/interface/HGCalRawDataDefinitions.h @@ -1,60 +1,125 @@ #ifndef DataFormats_HGCalDigi_HGCalRawDataDefinitions_h #define DataFormats_HGCalDigi_HGCalRawDataDefinitions_h -#include // for uint8_t - namespace hgcal { namespace econd { - namespace ToTStatus { - constexpr uint8_t ZeroSuppressed = 0x0, noZeroSuppressed_TOASuppressed = 0x1, invalid = 0x2, AutomaticFull = 0x3; - } // namespace ToTStatus - } // namespace econd + enum ToTStatus { ZeroSuppressed = 0x0, noZeroSuppressed_TOASuppressed = 0x1, invalid = 0x2, AutomaticFull = 0x3 }; + } // namespace econd namespace backend { - namespace ECONDPacketStatus { - constexpr uint8_t Normal = 0x0, PayloadTooLarge = 0x1, PayloadCRCError = 0x2, EventIDMismatch = 0x3, - EBTimeout = 0x4, BCIDOrbitIDMismatch = 0x5, MainBufferOverflow = 0x6, InactiveECOND = 0x7; - } // namespace ECONDPacketStatus - } // namespace backend + enum ECONDPacketStatus { + Normal = 0x0, + PayloadTooLarge = 0x1, + PayloadCRCError = 0x2, + EventIDMismatch = 0x3, + EBTimeout = 0x4, + BCIDOrbitIDMismatch = 0x5, + MainBufferOverflow = 0x6, + InactiveECOND = 0x7 + }; - namespace ECOND_FRAME { - constexpr uint32_t HEADER_POS = 23, HEADER_MASK = 0x1ff, PAYLOAD_POS = 14, PAYLOAD_MASK = 0x1ff, BITP_POS = 13, - BITE_POS = 12, HT_MASK = 0x3, HT_POS = 10, EBO_MASK = 0x3, EBO_POS = 8, BITM_POS = 7, - BITT_POS = 6, EHHAM_MASK = 0x3f, EHHAM_POS = 0, BX_POS = 20, BX_MASK = 0xfff, L1A_POS = 14, - L1A_MASK = 0x3f, ORBIT_POS = 11, ORBIT_MASK = 0x7, BITS_POS = 10, RR_MASK = 0x3, RR_POS = 8, - EHCRC_MASK = 0xff, EHCRC_POS = 0, ERXSTAT_POS = 29, ERXSTAT_MASK = 0x7, ERXHAM_POS = 26, - ERXHAM_MASK = 0x7, ERXFORMAT_POS = 25, ERXFORMAT_MASK = 0x1, COMMONMODE0_POS = 15, - COMMONMODE0_MASK = 0x3ff, COMMONMODE1_POS = 5, COMMONMODE1_MASK = 0x3ff, CHMAP32_POS = 0, - CHMAP32_MASK = 0x1f, CHMAP0_POS = 0, CHMAP0_MASK = 0xffffffff, ERX_E_POS = 4, ERX_E_MASK = 1; - } // namespace ECOND_FRAME + } // namespace backend - namespace BACKEND_FRAME { - constexpr uint32_t CAPTUREBLOCK_RESERVED_MASK = 0x7f, CAPTUREBLOCK_RESERVED_POS = 25, CAPTUREBLOCK_BC_MASK = 0xfff, - CAPTUREBLOCK_BC_POS = 13, CAPTUREBLOCK_EC_MASK = 0x7f, CAPTUREBLOCK_EC_POS = 7, - CAPTUREBLOCK_OC_MASK = 0x7, CAPTUREBLOCK_OC_POS = 4, SLINK_BOE_MASK = 0xff, SLINK_BOE_POS = 24, - SLINK_V_MASK = 0xf, SLINK_V_POS = 19, SLINK_R8_MASK = 0xff, SLINK_R8_POS = 11, - SLINK_GLOBAL_EVENTID_MSB_MASK = 0xfff, SLINK_GLOBAL_EVENTID_MSB_POS = 0, - SLINK_GLOBAL_EVENTID_LSB_MASK = 0xffffffff, SLINK_GLOBAL_EVENTID_LSB_POS = 0, - SLINK_R6_MASK = 0x3f, SLINK_R6_POS = 25, SLINK_CONTENTID_MASK = 0x3FFFFFF, - SLINK_CONTENTID_POS = 0, SLINK_SOURCEID_MASK = 0xffffffff, SLINK_SOURCEID_POS = 0, - SLINK_EOE_MASK = 0xff, SLINK_EOE_POS = 23, SLINK_DAQCRC_MASK = 0xffff, SLINK_DAQCRC_POS = 7, - SLINK_TRAILERR_MASK = 0xff, SLINK_TRAILERR_POS = 0, SLINK_EVLENGTH_MASK = 0xfffff, - SLINK_EVLENGTH_POS = 11, SLINK_BXID_MASK = 0xfff, SLINK_BXID_POS = 0, - SLINK_ORBID_MASK = 0xffffffff, SLINK_ORBID_POS = 0, SLINK_CRC_MASK = 0xffff, SLINK_CRC_POS = 15, - SLINK_STATUS_MASK = 0xffff, SLINK_STATUS_POS = 0; - } // namespace BACKEND_FRAME + enum ECOND_FRAME { + HEADER_POS = 23, + HEADER_MASK = 0x1ff, + PAYLOAD_POS = 14, + PAYLOAD_MASK = 0x1ff, + BITP_POS = 13, + BITE_POS = 12, + HT_MASK = 0x3, + HT_POS = 10, + EBO_MASK = 0x3, + EBO_POS = 8, + BITM_POS = 7, + BITT_POS = 6, + EHHAM_MASK = 0x3f, + EHHAM_POS = 0, + BX_POS = 20, + BX_MASK = 0xfff, + L1A_POS = 14, + L1A_MASK = 0x3f, + ORBIT_POS = 11, + ORBIT_MASK = 0x7, + BITS_POS = 10, + RR_MASK = 0x3, + RR_POS = 8, + EHCRC_MASK = 0xff, + EHCRC_POS = 0, + ERXSTAT_POS = 29, + ERXSTAT_MASK = 0x7, + ERXHAM_POS = 26, + ERXHAM_MASK = 0x7, + ERXFORMAT_POS = 25, + ERXFORMAT_MASK = 0x1, + COMMONMODE0_POS = 15, + COMMONMODE0_MASK = 0x3ff, + COMMONMODE1_POS = 5, + COMMONMODE1_MASK = 0x3ff, + CHMAP32_POS = 0, + CHMAP32_MASK = 0x1f, + CHMAP0_POS = 0, + CHMAP0_MASK = 0xffffffff, + ERX_E_POS = 4, + ERX_E_MASK = 1 + }; - namespace DIGI_FLAG { - constexpr uint16_t - // flags for normal ECON-D - FULL_READOUT = 0x0000, - ZS_ADCm1 = 0x0001, ZS_ToA = 0x0002, ZS_ToA_ADCm1 = 0x0003, Invalid = 0x0004, - // flags for passthrough ECON-D - Normal = 0x8000, Characterization = 0x8001, - // flag for digi not in raw data - NotAvailable = 0xFFFF; - } // namespace DIGI_FLAG + enum BACKEND_FRAME { + CAPTUREBLOCK_RESERVED_MASK = 0x7f, + CAPTUREBLOCK_RESERVED_POS = 25, + CAPTUREBLOCK_BC_MASK = 0xfff, + CAPTUREBLOCK_BC_POS = 13, + CAPTUREBLOCK_EC_MASK = 0x7f, + CAPTUREBLOCK_EC_POS = 7, + CAPTUREBLOCK_OC_MASK = 0x7, + CAPTUREBLOCK_OC_POS = 4, + SLINK_BOE_MASK = 0xff, + SLINK_BOE_POS = 24, + SLINK_V_MASK = 0xf, + SLINK_V_POS = 19, + SLINK_R8_MASK = 0xff, + SLINK_R8_POS = 11, + SLINK_GLOBAL_EVENTID_MSB_MASK = 0xfff, + SLINK_GLOBAL_EVENTID_MSB_POS = 0, + SLINK_GLOBAL_EVENTID_LSB_MASK = 0xffffffff, + SLINK_GLOBAL_EVENTID_LSB_POS = 0, + SLINK_R6_MASK = 0x3f, + SLINK_R6_POS = 25, + SLINK_CONTENTID_MASK = 0x3FFFFFF, + SLINK_CONTENTID_POS = 0, + SLINK_SOURCEID_MASK = 0xffffffff, + SLINK_SOURCEID_POS = 0, + SLINK_EOE_MASK = 0xff, + SLINK_EOE_POS = 23, + SLINK_DAQCRC_MASK = 0xffff, + SLINK_DAQCRC_POS = 7, + SLINK_TRAILERR_MASK = 0xff, + SLINK_TRAILERR_POS = 0, + SLINK_EVLENGTH_MASK = 0xfffff, + SLINK_EVLENGTH_POS = 11, + SLINK_BXID_MASK = 0xfff, + SLINK_BXID_POS = 0, + SLINK_ORBID_MASK = 0xffffffff, + SLINK_ORBID_POS = 0, + SLINK_CRC_MASK = 0xffff, + SLINK_CRC_POS = 15, + SLINK_STATUS_MASK = 0xffff, + SLINK_STATUS_POS = 0, + }; + enum DIGI_FLAG { + //Flags for normal ECON-D + FULL_READOUT = 0x0000, + ZS_ADCm1 = 0x0001, + ZS_ToA = 0x0002, + ZS_ToA_ADCm1 = 0x0003, + Invalid = 0x0004, + //Flags for passthrough ECON-D + Normal = 0x8000, + Characterization = 0x8001, + //Flag for digi not in raw data + NotAvailable = 0xFFFF + }; } // namespace hgcal #endif diff --git a/DataFormats/HGCalDigi/src/classes.cc b/DataFormats/HGCalDigi/src/classes.cc index aed0fcc8c3e5f..fbdd550a3212b 100644 --- a/DataFormats/HGCalDigi/src/classes.cc +++ b/DataFormats/HGCalDigi/src/classes.cc @@ -1,6 +1,4 @@ #include "DataFormats/Portable/interface/PortableHostCollectionReadRules.h" #include "DataFormats/HGCalDigi/interface/HGCalDigiHost.h" -#include "DataFormats/HGCalDigi/interface/HGCalECONDPacketInfoHost.h" -SET_PORTABLEHOSTCOLLECTION_READ_RULES(hgcaldigi::HGCalDigiHost); -SET_PORTABLEHOSTCOLLECTION_READ_RULES(hgcaldigi::HGCalECONDPacketInfoHost); \ No newline at end of file +SET_PORTABLEHOSTCOLLECTION_READ_RULES(hgcaldigi::HGCalDigiHost); \ No newline at end of file diff --git a/DataFormats/HGCalDigi/src/classes.h b/DataFormats/HGCalDigi/src/classes.h index 2bc524c488b4b..89fd9e0ee28a4 100644 --- a/DataFormats/HGCalDigi/src/classes.h +++ b/DataFormats/HGCalDigi/src/classes.h @@ -7,5 +7,6 @@ #include "DataFormats/HGCalDigi/interface/HGCalRawDataEmulatorInfo.h" #include "DataFormats/HGCalDigi/interface/HGCalDigiHost.h" #include "DataFormats/HGCalDigi/interface/HGCalDigiSoA.h" +#include "DataFormats/HGCalDigi/interface/HGCalFlaggedECONDInfo.h" #include "DataFormats/HGCalDigi/interface/HGCalECONDPacketInfoHost.h" #include "DataFormats/HGCalDigi/interface/HGCalECONDPacketInfoSoA.h" \ No newline at end of file diff --git a/DataFormats/HGCalDigi/src/classes_def.xml b/DataFormats/HGCalDigi/src/classes_def.xml index 09afbecec4f41..e681d0523673c 100644 --- a/DataFormats/HGCalDigi/src/classes_def.xml +++ b/DataFormats/HGCalDigi/src/classes_def.xml @@ -44,6 +44,7 @@ + @@ -54,6 +55,21 @@ + + + + + + + diff --git a/DataFormats/HGCalRecHit/interface/HGCalRecHitSoA.h b/DataFormats/HGCalRecHit/interface/HGCalRecHitSoA.h index fe042c0c9975b..580c5c8287b2d 100644 --- a/DataFormats/HGCalRecHit/interface/HGCalRecHitSoA.h +++ b/DataFormats/HGCalRecHit/interface/HGCalRecHitSoA.h @@ -19,8 +19,12 @@ namespace hgcalrechit { SOA_COLUMN(uint16_t, flags)) using HGCalRecHitSoA = HGCalRecHitSoALayout<>; - enum HGCalRecHitFlags { Normal = 0x0, EnergyInvalid = 0x1, TimeInvalid = 0x2 }; - + enum HGCalRecHitFlags { + Normal = 0x0, + EnergyInvalid = 0x1, + TimeInvalid = 0x2 + }; + } // namespace hgcalrechit #endif // DataFormats_HGCalRecHit_interface_HGCalRecHitSoA_h diff --git a/DataFormats/HGCalRecHit/src/classes.cc b/DataFormats/HGCalRecHit/src/classes.cc deleted file mode 100644 index ea06afce36eeb..0000000000000 --- a/DataFormats/HGCalRecHit/src/classes.cc +++ /dev/null @@ -1,4 +0,0 @@ -#include "DataFormats/Portable/interface/PortableHostCollectionReadRules.h" -#include "DataFormats/HGCalRecHit/interface/HGCalRecHitHost.h" - -SET_PORTABLEHOSTCOLLECTION_READ_RULES(hgcalrechit::HGCalRecHitHost); \ No newline at end of file diff --git a/DataFormats/HGCalRecHit/src/classes_def.xml b/DataFormats/HGCalRecHit/src/classes_def.xml index 810d24bfc9a67..096a0b91156ce 100644 --- a/DataFormats/HGCalRecHit/src/classes_def.xml +++ b/DataFormats/HGCalRecHit/src/classes_def.xml @@ -2,5 +2,16 @@ + + + diff --git a/EventFilter/HGCalRawToDigi/interface/HGCalUnpacker.h b/EventFilter/HGCalRawToDigi/interface/HGCalUnpacker.h index cfe0ebea9b888..feab116f10025 100644 --- a/EventFilter/HGCalRawToDigi/interface/HGCalUnpacker.h +++ b/EventFilter/HGCalRawToDigi/interface/HGCalUnpacker.h @@ -148,6 +148,14 @@ class HGCalUnpacker { hgcal::DIGI_FLAG::FULL_READOUT, hgcal::DIGI_FLAG::FULL_READOUT}; constexpr static uint32_t erxBodyBits_[16] = {24, 16, 24, 24, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32}; + + // HGCalUnpackerConfig config_; + // size_t channelDataSize_{0}; ///< Size of unpacked channels + // size_t commonModeDataSize_{0}; ///< Size of unpacked common modes + // std::vector > channelData_; ///< Array for unpacked channels + // std::vector commonModeSum_; + // std::vector > commonModeData_; ///< Array for unpacked common modes + // HGCalFlaggedECONDInfoCollection flaggedECOND_; ///< Array with flagged ECON-D information }; #endif diff --git a/EventFilter/HGCalRawToDigi/plugins/HGCalRawToDigi.cc b/EventFilter/HGCalRawToDigi/plugins/HGCalRawToDigi.cc index 2a62de8734f3e..fa6ca8800e593 100644 --- a/EventFilter/HGCalRawToDigi/plugins/HGCalRawToDigi.cc +++ b/EventFilter/HGCalRawToDigi/plugins/HGCalRawToDigi.cc @@ -19,6 +19,8 @@ #include "CondFormats/HGCalObjects/interface/HGCalMappingCellIndexer.h" #include "CondFormats/DataRecord/interface/HGCalModuleConfigurationRcd.h" #include "CondFormats/HGCalObjects/interface/HGCalConfiguration.h" +// #include "CondFormats/HGCalObjects/interface/alpaka/HGCalMappingParameterDeviceCollection.h" +// #include "Geometry/HGCalMapping/interface/HGCalMappingTools.h" #include "EventFilter/HGCalRawToDigi/interface/HGCalUnpacker.h" @@ -42,6 +44,10 @@ class HGCalRawToDigi : public edm::stream::EDProducer<> { // TODO @hqucms // what else do we want to output? + // const edm::EDPutTokenT flaggedRawDataToken_; + // const edm::EDPutTokenT elecDigisToken_; + // const edm::EDPutTokenT elecCMsToken_; + // config tokens and objects edm::ESWatcher mapWatcher_; edm::ESGetToken cellIndexToken_; @@ -58,6 +64,7 @@ class HGCalRawToDigi : public edm::stream::EDProducer<> { // TODO @hqucms // HGCalUnpackerConfig unpackerConfig_; + // HGCalCondSerializableConfig config_; HGCalUnpacker unpacker_; const bool fixCalibChannel_; @@ -67,6 +74,9 @@ HGCalRawToDigi::HGCalRawToDigi(const edm::ParameterSet& iConfig) : fedRawToken_(consumes(iConfig.getParameter("src"))), digisToken_(produces()), econdPacketInfoToken_(produces()), + // flaggedRawDataToken_(produces("UnpackerFlags")), + // elecDigisToken_(produces("DIGI")), + // elecCMsToken_(produces("CM")), cellIndexToken_(esConsumes()), moduleIndexToken_(esConsumes()), configToken_(esConsumes()), @@ -113,9 +123,82 @@ void HGCalRawToDigi::produce(edm::Event& iEvent, const edm::EventSetup& iSetup) unpacker_.parseFEDData(fedId, fed_data, moduleIndexer_, config_, digis, econdPacketInfo, /*headerOnlyMode*/ false); } + // TODO @hqucms + // try { + // unpacker_->parseSLink( + // data_32bit, + // [this](uint16_t sLink, uint8_t captureBlock, uint8_t econd) { + // return this->erxEnableBits_[HGCalCondSerializableModuleInfo::erxBitPatternMapDenseIndex( + // sLink, captureBlock, econd, 0, 0)]; + // }, + // [this](uint16_t fedId) { + // if (auto it = this->fed2slink_.find(fedId); it != this->fed2slink_.end()) { + // return this->fed2slink_.at(fedId); + // } else { + // // FIXME: throw an error or return 0? + // return (uint16_t)0; + // } + // }); + // } catch (cms::Exception& e) { + // std::cout << "An exeption was caught while decoding raw data for FED " << std::dec << (uint32_t)fedId + // << std::endl; + // std::cout << e.what() << std::endl; + // std::cout << "Event is: " << std::endl; + // std::cout << "Total size (32b words) " << std::dec << data_32bit.size() << std::endl; + // for (size_t i = 0; i < data_32bit.size(); i++) + // std::cout << std::dec << i << " | " << std::hex << "0x" << std::setfill('0') << data_32bit[i] << std::endl; + // } + + // auto channeldata = unpacker_->channelData(); + // auto commonModeSum = unpacker_->commonModeSum(); + // for (unsigned int i = 0; i < channeldata.size(); i++) { + // auto data = channeldata.at(i); + // const auto& id = data.id(); + // auto idraw = id.raw(); + // auto raw = data.raw(); + // LogDebug("HGCalRawToDigi::produce") << "channel data, id=" << idraw << ", raw=" << raw; + // elec_digis.push_back(data); + // elecid.push_back(id.raw()); + // tctp.push_back(data.tctp()); + // uint32_t modid = id.econdIdxRawId(); // remove first 10 bits to get full electronics ID of ECON-D module + // // FIXME: in the current HGCROC the calib channels (=18) is always in characterization model; to be fixed in ROCv3b + // auto charMode = config_.moduleConfigs[modid].charMode || (fixCalibChannel_ && id.halfrocChannel() == 18); + // adcm1.push_back(data.adcm1(charMode)); + // adc.push_back(data.adc(charMode)); + // tot.push_back(data.tot(charMode)); + // toa.push_back(data.toa()); + // cm.push_back(commonModeSum.at(i)); + // } + + // auto commonmode = unpacker_->commonModeData(); + // for (unsigned int i = 0; i < commonmode.size(); i++) { + // auto cm = commonmode.at(i); + // const auto& id = cm.id(); + // auto idraw = id.raw(); + // auto raw = cm.raw(); + // LogDebug("HGCalRawToDigi::produce") << "common modes, id=" << idraw << ", raw=" << raw; + // elec_cms.push_back(cm); + // } + + // // append flagged ECONDs + // flagged_econds.insert(flagged_econds.end(), unpacker_->flaggedECOND().begin(), unpacker_->flaggedECOND().end()); + // } + + // // check how many flagged ECOND-s we have + // if (!flagged_econds.empty()) { + // LogDebug("HGCalRawToDigi:produce") << " caught " << flagged_econds.size() << " ECON-D with poor quality flags"; + // if (flagged_econds.size() > flaggedECONDMax_) { + // throw cms::Exception("HGCalRawToDigi:produce") + // << "Too many flagged ECON-Ds: " << flagged_econds.size() << " > " << flaggedECONDMax_ << "."; + // } + // } + // put information to the event iEvent.emplace(digisToken_, std::move(digis)); iEvent.emplace(econdPacketInfoToken_, std::move(econdPacketInfo)); + // iEvent.emplace(flaggedRawDataToken_, std::move(flagged_econds)); + // iEvent.emplace(elecDigisToken_, std::move(elec_digis)); + // iEvent.emplace(elecCMsToken_, std::move(elec_cms)); } // fill descriptions @@ -123,6 +206,24 @@ void HGCalRawToDigi::fillDescriptions(edm::ConfigurationDescriptions& descriptio edm::ParameterSetDescription desc; desc.add("src", edm::InputTag("rawDataCollector")); desc.add >("fedIds", {}); + // desc.add("maxCaptureBlock", 1)->setComment("maximum number of capture blocks in one S-Link"); + // desc.add("cbHeaderMarker", 0x5f)->setComment("capture block reserved pattern"); + // desc.add("econdHeaderMarker", 0x154)->setComment("ECON-D header Marker pattern"); + // desc.add("slinkBOE", 0x55)->setComment("SLink BOE pattern"); + // desc.add("captureBlockECONDMax", 12)->setComment("maximum number of ECON-Ds in one capture block"); + // desc.add("applyFWworkaround", false) + // ->setComment("use to enable dealing with firmware features (e.g. repeated words)"); + // desc.add("swap32bendianness", false)->setComment("use to swap 32b endianness"); + // desc.add("econdERXMax", 12)->setComment("maximum number of eRxs in one ECON-D"); + // desc.add("erxChannelMax", 37)->setComment("maximum number of channels in one eRx"); + // desc.add("payloadLengthMax", 469)->setComment("maximum length of payload length"); + // desc.add("channelMax", 7000000)->setComment("maximum number of channels unpacked"); + // desc.add("commonModeMax", 4000000)->setComment("maximum number of common modes unpacked"); + // desc.add("flaggedECONDMax", 200)->setComment("maximum number of flagged ECON-Ds"); + // desc.add("numERxsInECOND", 12)->setComment("number of eRxs in each ECON-D payload"); + // desc.add("configSource", edm::ESInputTag("")) + // ->setComment("label for HGCalConfigESSourceFromYAML reader"); + // desc.add("moduleInfoSource", edm::ESInputTag(""))->setComment("label for HGCalModuleInfoESSource"); desc.add("fixCalibChannel", true) ->setComment("FIXME: always treat calib channels in characterization mode; to be fixed in ROCv3b"); descriptions.add("hgcalDigis", desc); diff --git a/Geometry/HGCalMapping/plugins/alpaka/HGCalDenseIndexInfoESProducer.cc b/Geometry/HGCalMapping/plugins/alpaka/HGCalDenseIndexInfoESProducer.cc index 56d34b244bed7..66486f39baf26 100644 --- a/Geometry/HGCalMapping/plugins/alpaka/HGCalDenseIndexInfoESProducer.cc +++ b/Geometry/HGCalMapping/plugins/alpaka/HGCalDenseIndexInfoESProducer.cc @@ -55,15 +55,15 @@ namespace ALPAKA_ACCELERATOR_NAMESPACE { // std::optional produce(const HGCalDenseIndexInfoRcd& iRecord) { //geometry - auto const& geo = iRecord.get(caloGeomToken_); + auto const& geo = iRecord.getRecord().get(caloGeomToken_); //get cell and module indexer - auto modIndexer = iRecord.get(moduleIndexTkn_); - auto cellIndexer = iRecord.get(cellIndexTkn_); + auto modIndexer = iRecord.getRecord().get(moduleIndexTkn_); + auto cellIndexer = iRecord.getRecord().get(cellIndexTkn_); //get cell and module info - auto const& moduleInfo = iRecord.get(moduleInfoTkn_); - auto const& cellInfo = iRecord.get(cellInfoTkn_); + auto const& moduleInfo = iRecord.getRecord().get(moduleInfoTkn_); + auto const& cellInfo = iRecord.getRecord().get(cellInfoTkn_); //declare the dense index info collection to be produced //the size is determined by the module indexer diff --git a/Geometry/HGCalMapping/plugins/alpaka/HGCalMappingModuleESProducer.cc b/Geometry/HGCalMapping/plugins/alpaka/HGCalMappingModuleESProducer.cc index 79324f1f9aa1b..43d34993f4f6e 100644 --- a/Geometry/HGCalMapping/plugins/alpaka/HGCalMappingModuleESProducer.cc +++ b/Geometry/HGCalMapping/plugins/alpaka/HGCalMappingModuleESProducer.cc @@ -71,7 +71,7 @@ namespace ALPAKA_ACCELERATOR_NAMESPACE { int plane = pmap.getIntAttr("plane", row); int i1 = pmap.getIntAttr("u", row); int i2 = pmap.getIntAttr("v", row); - uint8_t irot = (uint8_t)(pmap.hasColumn("irot") ? pmap.getIntAttr("irot", row) : 0); + int irot = pmap.hasColumn("irot") ? pmap.getIntAttr("irot", row) : 0; uint32_t eleid = HGCalElectronicsId((zside > 0), fedid, captureblockidx, econdidx, 0, 0).raw(); uint32_t detid(0); @@ -89,7 +89,7 @@ namespace ALPAKA_ACCELERATOR_NAMESPACE { module.plane() = plane; module.i1() = i1; module.i2() = i2; - module.irot() = irot; + module.irot() = (char)irot; module.typeidx() = typeidx; module.fedid() = fedid; module.slinkidx() = pmap.getIntAttr("slinkidx", row); diff --git a/RecoLocalCalo/HGCalRecAlgos/interface/alpaka/HGCalRecHitCalibrationAlgorithms.h b/RecoLocalCalo/HGCalRecAlgos/interface/alpaka/HGCalRecHitCalibrationAlgorithms.h index 2d9bdcb0c0d1e..baa1f40a4f9d2 100644 --- a/RecoLocalCalo/HGCalRecAlgos/interface/alpaka/HGCalRecHitCalibrationAlgorithms.h +++ b/RecoLocalCalo/HGCalRecAlgos/interface/alpaka/HGCalRecHitCalibrationAlgorithms.h @@ -1,9 +1,14 @@ #ifndef __HGCalRecHitCalibrationAlgorithms_H__ #define __HGCalRecHitCalibrationAlgorithms_H__ +// CMSSW imports +#include "FWCore/MessageLogger/interface/MessageLogger.h" + // Alpaka imports #include #include "HeterogeneousCore/AlpakaInterface/interface/config.h" +#include "HeterogeneousCore/AlpakaInterface/interface/traits.h" +#include "HeterogeneousCore/AlpakaInterface/interface/workdivision.h" // HGCal digis data formats #include "DataFormats/HGCalDigi/interface/HGCalElectronicsId.h" @@ -24,7 +29,7 @@ namespace ALPAKA_ACCELERATOR_NAMESPACE { class HGCalRecHitCalibrationAlgorithms { public: - HGCalRecHitCalibrationAlgorithms(int n_blocks, int n_threads) : n_blocks_(n_blocks), n_threads_(n_threads) {} + HGCalRecHitCalibrationAlgorithms(int n_blocks_, int n_threads_) : n_blocks(n_blocks_), n_threads(n_threads_) {} std::unique_ptr calibrate(Queue& queue, HGCalDigiHost const& host_digis, @@ -40,8 +45,8 @@ namespace ALPAKA_ACCELERATOR_NAMESPACE { void print_digi_device(HGCalDigiDevice const& digis, int max = -1) const; void print_recHit_device(Queue& queue, HGCalRecHitDevice const& recHits, int max = -1) const; - int n_blocks_; - int n_threads_; + int n_blocks; + int n_threads; }; } // namespace ALPAKA_ACCELERATOR_NAMESPACE diff --git a/RecoLocalCalo/HGCalRecAlgos/plugins/BuildFile.xml b/RecoLocalCalo/HGCalRecAlgos/plugins/BuildFile.xml index 843fa22caf1f8..0aec20080f45e 100644 --- a/RecoLocalCalo/HGCalRecAlgos/plugins/BuildFile.xml +++ b/RecoLocalCalo/HGCalRecAlgos/plugins/BuildFile.xml @@ -19,6 +19,7 @@ + diff --git a/RecoLocalCalo/HGCalRecAlgos/plugins/HGCalConfigurationESProducer.cc b/RecoLocalCalo/HGCalRecAlgos/plugins/HGCalConfigurationESProducer.cc index 572d3aae210c4..0a65813e92edc 100644 --- a/RecoLocalCalo/HGCalRecAlgos/plugins/HGCalConfigurationESProducer.cc +++ b/RecoLocalCalo/HGCalRecAlgos/plugins/HGCalConfigurationESProducer.cc @@ -66,10 +66,7 @@ class HGCalConfigurationESProducer : public edm::ESProducer, public edm::EventSe descriptions.addWithDefaultLabel(desc); } - static bool checkkeys(const json& data, - const std::string& firstkey, - const std::vector& keys, - const std::string& fname) { + static bool checkkeys(const json& data, const std::string& firstkey, const std::vector& keys, const std::string& fname) { // check if json contains key bool iscomplete = true; for (auto const& key : keys) { @@ -85,7 +82,7 @@ class HGCalConfigurationESProducer : public edm::ESProducer, public edm::EventSe static int32_t gethex(const std::string& value, const int32_t value_override) { // get value, and override if value_override>=0 - return (value_override >= 0 ? value_override : std::stoi(value, nullptr, 16)); + return (value_override >= 0 ? value_override : std::stoi(value, NULL, 16)); } static int32_t getint(const int32_t value, const int32_t value_override) { @@ -100,8 +97,8 @@ class HGCalConfigurationESProducer : public edm::ESProducer, public edm::EventSe // return (value_override>=0 ? (T) value_override : value); //} - std::unique_ptr produce(const HGCalModuleConfigurationRcd& iRecord) { - auto const& moduleMap = iRecord.get(indexToken_); + std::shared_ptr produce(const HGCalModuleConfigurationRcd& iRecord) { + auto const& moduleMap = iRecord.getRecord().get(indexToken_); // retrieve values from custom JSON format (see HGCalCalibrationESProducer) edm::FileInPath fedfip(fedjson_); // e.g. HGCalCommissioning/LocalCalibration/data/config_feds.json @@ -126,8 +123,9 @@ class HGCalConfigurationESProducer : public edm::ESProducer, public edm::EventSe // loop over FEDs in indexer & fill configuration structs: FED > ECON-D > eRx // follow indexing by HGCalMappingModuleIndexer - // HGCalConfiguration = container class holding FED structs of ECON-D structs of eRx structs - std::unique_ptr config_ = std::make_unique(); + // https://github.com/CMS-HGCAL/cmssw/blob/dev/hackathon_base_CMSSW_14_1_X/CondFormats/HGCalObjects/interface/HGCalMappingModuleIndexer.h + // https://github.com/CMS-HGCAL/cmssw/blob/dev/hackathon_base_CMSSW_14_1_X/EventFilter/HGCalRawToDigi/plugins/HGCalRawToDigi.cc#L107-L111 + config_ = HGCalConfiguration(); // container class holding FED structs of ECON-D structs of eRx structs for (std::size_t fedid = 0; fedid < moduleMap.getMaxFEDSize(); ++fedid) { // sanity checks //std::cout << "HGCalConfigurationESProducer::produce: fed=" << fedid << std::endl; @@ -140,7 +138,7 @@ class HGCalConfigurationESProducer : public edm::ESProducer, public edm::EventSe checkkeys(fed_config_data, sfedid, fedkeys, fedjson_); // check required keys are in the JSON, warn otherwise // fill FED configurations - HGCalFedConfig fed; + HGCalFedConfig_t fed; fed.mismatchPassthroughMode = getint(fed_config_data[sfedid]["mismatchPassthroughMode"], bePassthroughMode_); // ignore ECON-D packet mismatches fed.cbHeaderMarker = gethex(fed_config_data[sfedid]["cbHeaderMarker"], @@ -166,7 +164,7 @@ class HGCalConfigurationESProducer : public edm::ESProducer, public edm::EventSe fed.econds.resize(imod + 1); // fill ECON-D configuration - HGCalECONDConfig mod; + HGCalECONDConfig_t mod; mod.headerMarker = gethex(mod_config_data[typecode]["headerMarker"], econdHeaderMarker_); // begin of event marker/identifier for capture block mod.passThrough = getint(mod_config_data[typecode]["passthrough"], econPassthroughMode_); @@ -184,16 +182,17 @@ class HGCalConfigurationESProducer : public edm::ESProducer, public edm::EventSe // fill eRX (half-ROC) configuration for (uint32_t iroc = 0; iroc < nrocs; iroc++) { ntot_rocs++; - HGCalROCConfig roc; + HGCalROCConfig_t roc; roc.gain = (uint8_t)mod_config_data[typecode]["Gain"][iroc]; //roc.charMode = getint(mod_config_data[typecode]["characMode"],charMode_); roc.charMode = getint(mod_config_data[typecode]["CalibrationSC"][iroc], charMode_); - mod.rocs[iroc] = roc; // add to ECON-D's vector of eRx half-ROCs + //roc.charMode = mod_config_data[typecode]["CalibrationSC"]; + mod.rocs[iroc] = roc; // add to ECON-D's vector of eRx half-ROCs } - fed.econds[imod] = mod; // add to FED's vector of ECON-D modules + fed.econds[imod] = mod; // add to FED's vector of ECON-D modules } - config_->feds.push_back(fed); // add to config's vector of HGCalFedConfig FEDs + config_.feds.push_back(fed); // add to config's vector of HGCalFedConfig_t FEDs } // consistency check @@ -206,7 +205,7 @@ class HGCalConfigurationESProducer : public edm::ESProducer, public edm::EventSe << "Total number of eRx half-ROCs found in JSON file " << modjson_ << " (" << ntot_rocs << ") does not match indexer (" << moduleMap.getMaxERxSize() << ")"; - return config_; + return std::shared_ptr(&config_, edm::do_nothing_deleter()); } // end of produce() private: @@ -217,15 +216,16 @@ class HGCalConfigurationESProducer : public edm::ESProducer, public edm::EventSe } edm::ESGetToken indexToken_; - const std::string fedjson_; // JSON file - const std::string modjson_; // JSON file - int32_t bePassthroughMode_ = -1; // for manual override - int32_t cbHeaderMarker_ = -1; // for manual override - int32_t slinkHeaderMarker_ = -1; // for manual override - int32_t econdHeaderMarker_ = -1; // for manual override - int32_t econPassthroughMode_ = -1; // for manual override - int32_t charMode_ = -1; // for manual override - int32_t gain_ = -1; // for manual override + HGCalConfiguration config_; // container class holding FED structs of ECON-D structs of eRx structs + const std::string fedjson_; // JSON file + const std::string modjson_; // JSON file + int32_t bePassthroughMode_; // for manual override + int32_t cbHeaderMarker_; // for manual override + int32_t slinkHeaderMarker_; // for manual override + int32_t econdHeaderMarker_; // for manual override + int32_t econPassthroughMode_; // for manual override + int32_t charMode_; // for manual override + int32_t gain_; // for manual override }; DEFINE_FWK_EVENTSETUP_SOURCE(HGCalConfigurationESProducer); diff --git a/RecoLocalCalo/HGCalRecAlgos/plugins/alpaka/HGCalRecHitCalibrationAlgorithms.dev.cc b/RecoLocalCalo/HGCalRecAlgos/plugins/alpaka/HGCalRecHitCalibrationAlgorithms.dev.cc index 19b7ecfaf3c67..ea9458b8c5ef5 100644 --- a/RecoLocalCalo/HGCalRecAlgos/plugins/alpaka/HGCalRecHitCalibrationAlgorithms.dev.cc +++ b/RecoLocalCalo/HGCalRecAlgos/plugins/alpaka/HGCalRecHitCalibrationAlgorithms.dev.cc @@ -1,15 +1,7 @@ -#include - -// CMSSW imports -#include "FWCore/MessageLogger/interface/MessageLogger.h" - -// Alpaka imports -#include "HeterogeneousCore/AlpakaInterface/interface/traits.h" -#include "HeterogeneousCore/AlpakaInterface/interface/workdivision.h" - -// HGCal imports +// Based on: https://github.com/CMS-HGCAL/cmssw/blob/hgcal-condformat-HGCalNANO-13_2_0_pre3_linearity/RecoLocalCalo/HGCalRecAlgos/plugins/alpaka/HGCalRecHitCalibrationAlgorithms.dev.cc #include "RecoLocalCalo/HGCalRecAlgos/interface/alpaka/HGCalRecHitCalibrationAlgorithms.h" #include "DataFormats/HGCalDigi/interface/HGCalRawDataDefinitions.h" +#include namespace ALPAKA_ACCELERATOR_NAMESPACE { @@ -23,16 +15,16 @@ namespace ALPAKA_ACCELERATOR_NAMESPACE { HGCalRecHitDevice::View recHits, HGCalCalibParamDevice::ConstView calibs) const { for (auto idx : uniform_elements(acc, digis.metadata().size())) { + auto calib = calibs[idx]; int calibvalid = std::to_integer(calib.valid()); auto digi = digis[idx]; - auto digiflags = digi.flags(); + auto digiflags= digi.flags(); //recHits[idx].flags() = digiflags; - bool isAvailable((digiflags != hgcal::DIGI_FLAG::Invalid) && (digiflags != hgcal::DIGI_FLAG::NotAvailable) && - (calibvalid > 0)); - bool isToAavailable((digiflags != hgcal::DIGI_FLAG::ZS_ToA) && (digiflags != hgcal::DIGI_FLAG::ZS_ToA_ADCm1)); - recHits[idx].flags() = (!isAvailable) * hgcalrechit::HGCalRecHitFlags::EnergyInvalid + - (!isToAavailable) * hgcalrechit::HGCalRecHitFlags::TimeInvalid; + bool isAvailable((digiflags!=hgcal::DIGI_FLAG::Invalid) && (digiflags!=hgcal::DIGI_FLAG::NotAvailable) && (calibvalid>0)); + bool isToAavailable((digiflags!=hgcal::DIGI_FLAG::ZS_ToA) && (digiflags!=hgcal::DIGI_FLAG::ZS_ToA_ADCm1)); + recHits[idx].flags() = (!isAvailable)*hgcalrechit::HGCalRecHitFlags::EnergyInvalid + + (!isToAavailable)*hgcalrechit::HGCalRecHitFlags::TimeInvalid; } } }; @@ -66,10 +58,9 @@ namespace ALPAKA_ACCELERATOR_NAMESPACE { auto calib = calibs[idx]; int calibvalid = std::to_integer(calib.valid()); auto digi = digis[idx]; - auto digiflags = digi.flags(); - bool isAvailable((digiflags != hgcal::DIGI_FLAG::Invalid) && (digiflags != hgcal::DIGI_FLAG::NotAvailable) && - (calibvalid > 0)); - bool useTOT((digi.tctp() == 3) && isAvailable); + auto digiflags= digi.flags(); + bool isAvailable((digiflags!=hgcal::DIGI_FLAG::Invalid) && (digiflags!=hgcal::DIGI_FLAG::NotAvailable) && (calibvalid>0)); + bool useTOT((digi.tctp()==3) && isAvailable); bool useADC(!useTOT && isAvailable); recHits[idx].energy() = useADC * adc_to_fC(digi.adc(), digi.cm(), @@ -97,29 +88,118 @@ namespace ALPAKA_ACCELERATOR_NAMESPACE { HGCalDigiDevice::View digis, HGCalRecHitDevice::View recHits, HGCalCalibParamDevice::ConstView calibs) const { + auto toa_to_ps = [&](uint32_t toa, float toatops) { return toa * toatops; }; for (auto idx : uniform_elements(acc, digis.metadata().size())) { + auto calib = calibs[idx]; int calibvalid = std::to_integer(calib.valid()); auto digi = digis[idx]; - auto digiflags = digi.flags(); - bool isAvailable((digiflags != hgcal::DIGI_FLAG::Invalid) && (digiflags != hgcal::DIGI_FLAG::NotAvailable) && - (calibvalid > 0)); - bool isToAavailable((digiflags != hgcal::DIGI_FLAG::ZS_ToA) && (digiflags != hgcal::DIGI_FLAG::ZS_ToA_ADCm1)); + auto digiflags= digi.flags(); + bool isAvailable((digiflags!=hgcal::DIGI_FLAG::Invalid) && (digiflags!=hgcal::DIGI_FLAG::NotAvailable) && (calibvalid>0)); + bool isToAavailable((digiflags!=hgcal::DIGI_FLAG::ZS_ToA) && (digiflags!=hgcal::DIGI_FLAG::ZS_ToA_ADCm1)); bool isGood(isAvailable && isToAavailable); - recHits[idx].time() = isGood * toa_to_ps(digi.toa(), calib.TOAtops()); + recHits[idx].time() = isGood*toa_to_ps(digi.toa(), calib.TOAtops()); } } }; + /* + enum HGCalCalibrationFlag { + kPedestalCorrection=0, + kCMCorrection, + kADCmCorrection, + }; + + class HGCalRecHitCalibrationKernel_digisToRecHits { + public: + template + ALPAKA_FN_ACC void operator()(TAcc const& acc, HGCalDigiDevice::View digis, HGCalRecHitDevice::View recHits) const { + auto ToA_to_time = [&](uint32_t ToA) { return float(ToA)*0.024414062; }; // LSB=25 ns / 2^10b + auto ADC_to_float = [&](uint32_t adc, uint32_t tot, uint8_t tctp) { return float(tctp>1 ? tot : adc); }; + + // dummy digis -> rechits conversion (to be replaced by the actual formula) + for (auto idx : uniform_elements(acc, digis.metadata().size())) { + //recHits[idx].detid() = static_cast(digis[idx].electronicsId()); // redundant since common dense indexing + recHits[idx].energy() = ADC_to_float(digis[idx].adc(),digis[idx].tot(),digis[idx].tctp()); + recHits[idx].time() = ToA_to_time(digis[idx].toa()); + recHits[idx].flags() = digis[idx].flags(); + } + } + }; + + struct HGCalRecHitCalibrationKernel_pedestalCorrection { + template + ALPAKA_FN_ACC void operator()(TAcc const& acc, HGCalDigiDevice::View digis, HGCalRecHitDevice::View recHits, HGCalCalibParamDevice::ConstView calib) const { + for (auto idx : uniform_elements(acc, digis.metadata().size())) { + if ((digis[idx].tctp()==0) && (digis[idx].flags() >> kPedestalCorrection) & 1){ + recHits[idx].energy() = recHits[idx].energy() - calib[idx].ADC_ped(); + } + } + } + }; + + struct HGCalRecHitCalibrationKernel_chargeConversion { + template + ALPAKA_FN_ACC void operator()(TAcc const& acc, HGCalDigiDevice::View digis, HGCalRecHitDevice::View recHits, HGCalConfigParamDevice::ConstView config) const { + auto ADC_to_charge = [&](float energy, uint8_t tctp, uint8_t gain) { + return tctp>1 ? energy*1.953125 : energy*gain*0.078125; // fC + // TOT / 2^12 * 8000 fC = TOT * 1.953125 fC + // ( ADC - pedestal ) / 2^10 * 80 fC = ( ADC - pedestal ) * 0.078125 fC + }; + for (auto idx : uniform_elements(acc, digis.metadata().size())) { + recHits[idx].energy() = ADC_to_charge(recHits[idx].energy(),digis[idx].tctp(),config[idx].gain()); + } + } + }; + + struct HGCalRecHitCalibrationKernel_chargeConversion_exp { + template + ALPAKA_FN_ACC void operator()(TAcc const& acc, HGCalDigiDevice::View digis, HGCalRecHitDevice::View recHits, HGCalConfigParamDevice::ConstView config) const { + float calib_energy=0; + auto ADC_to_charge = [&](float energy, uint8_t tctp, uint8_t gain) { + calib_energy = tctp>1 ? energy*1.953125 : energy*gain*0.078125; + return calib_energy>0 ? calib_energy : 0.0; // fC + // TOT / 2^12 * 8000 fC = TOT * 1.953125 fC + // ( ADC - pedestal ) / 2^10 * 80 fC = ( ADC - pedestal ) * 0.078125 fC + }; + for (auto idx : uniform_elements(acc, digis.metadata().size())) { + recHits[idx].energy() = ADC_to_charge(recHits[idx].energy(),digis[idx].tctp(),config[idx].gain()); + } + } + }; + + struct HGCalRecHitCalibrationKernel_commonModeCorrection { + template + ALPAKA_FN_ACC void operator()(TAcc const& acc, HGCalDigiDevice::View digis, HGCalRecHitDevice::View recHits, HGCalCalibParamDevice::ConstView calib) const { + for (auto idx : uniform_elements(acc, recHits.metadata().size())) { + float commonModeValue = calib[idx].CM_slope() * ( digis[idx].cm() - calib[idx].CM_ped() ); + recHits[idx].energy() -= commonModeValue; + } + } + }; + + struct HGCalRecHitCalibrationKernel_ADCmCorrection { + template + ALPAKA_FN_ACC void operator()(TAcc const& acc, HGCalDigiDevice::View digis, HGCalRecHitDevice::View recHits, HGCalCalibParamDevice::ConstView calib) const { + for (auto idx : uniform_elements(acc, recHits.metadata().size())) { + float ADCmValue = calib[idx].BXm1_slope() * ( digis[idx].adcm1() - calib[idx].ADC_ped() ); // placeholder + recHits[idx].adc() -= ADCmValue; + } + } + }; +*/ + struct HGCalRecHitCalibrationKernel_printRecHits { template ALPAKA_FN_ACC void operator()(TAcc const& acc, HGCalRecHitDevice::ConstView view, int size) const { +#ifdef EDM_ML_DEBUG for (int i = 0; i < size; ++i) { auto const& recHit = view[i]; printf("%d\t%f\t%f\t%d\n", i, recHit.energy(), recHit.time(), recHit.flags()); } +#endif } }; @@ -130,8 +210,8 @@ namespace ALPAKA_ACCELERATOR_NAMESPACE { HGCalConfigParamDevice const& device_config) { LogDebug("HGCalRecHitCalibrationAlgorithms") << "\n\nINFO -- Start of calibrate\n\n" << std::endl; LogDebug("HGCalRecHitCalibrationAlgorithms") - << "N blocks: " << n_blocks_ << "\tN threads: " << n_threads_ << std::endl; - auto grid = make_workdiv(n_blocks_, n_threads_); + << "N blocks: " << n_blocks << "\tN threads: " << n_threads << std::endl; + auto grid = make_workdiv(n_blocks, n_threads); LogDebug("HGCalRecHitCalibrationAlgorithms") << "\n\nINFO -- Copying the digis to the device\n\n" << std::endl; HGCalDigiDevice device_digis(host_digis.view().metadata().size(), queue); @@ -161,10 +241,39 @@ namespace ALPAKA_ACCELERATOR_NAMESPACE { device_calib.view()); LogDebug("HGCalRecHitCalibrationAlgorithms") << "Input recHits: " << std::endl; -#ifdef EDM_ML_DEBUG int n_hits_to_print = 10; print_recHit_device(queue, *device_recHits, n_hits_to_print); -#endif + + /* + alpaka::exec(queue, grid, HGCalRecHitCalibrationKernel_digisToRecHits{}, device_digis.view(), device_recHits->view()); + LogDebug("HGCalRecHitCalibrationAlgorithms") << "Input recHits: " << std::endl; + int n_hits_to_print = 10; + print_recHit_device(queue, *device_recHits, n_hits_to_print); + + alpaka::exec(queue, grid, HGCalRecHitCalibrationKernel_pedestalCorrection{}, device_digis.view(), device_recHits->view(), device_calib.view()); + LogDebug("HGCalRecHitCalibrationAlgorithms") << "RecHits after pedestal calibration: " << std::endl; + print_recHit_device(queue, *device_recHits, n_hits_to_print); + + alpaka::exec(queue, grid, HGCalRecHitCalibrationKernel_commonModeCorrection{}, device_digis.view(), device_recHits->view(), device_calib.view()); + LogDebug("HGCalRecHitCalibrationAlgorithms") << "Digis after CM calibration: " << std::endl; + //print_digi_device(device_digis, n_hits_to_print); + print_recHit_device(queue, *device_recHits, n_hits_to_print); + + alpaka::exec(queue, grid, HGCalRecHitCalibrationKernel_chargeConversion_exp{}, device_digis.view(), device_recHits->view(), device_config.view()); + //alpaka::exec(queue, grid, HGCalRecHitCalibrationKernel_chargeConversion{}, device_digis.view(), device_recHits->view(), device_config.view()); + LogDebug("HGCalRecHitCalibrationAlgorithms") << "RecHits after charge conversion: " << std::endl; + print_recHit_device(queue, *device_recHits, n_hits_to_print); + */ + + /* + float ADCmValue = n_hits_to_print; // dummy value + alpaka::exec(queue, grid, HGCalRecHitCalibrationKernel_ADCmCorrection{}, device_digis.view(), calib_device.view()); + LogDebug("HGCalRecHitCalibrationAlgorithms") << "Digis after ADCm calibration: " << std::endl; + print_digi_device(device_digis, n_hits_to_print); + + LogDebug("HGCalRecHitCalibrationAlgorithms") << "RecHits after calibration: " << std::endl; + print_recHit_device(queue, *device_recHits, n_hits_to_print); + */ return device_recHits; } @@ -173,7 +282,10 @@ namespace ALPAKA_ACCELERATOR_NAMESPACE { int max_ = max > 0 ? max : digis.view().metadata().size(); for (int i = 0; i < max_; i++) { LogDebug("HGCalRecHitCalibrationAlgorithms") - << i << digis.view()[i].tot() << "\t" << digis.view()[i].toa() << "\t" << digis.view()[i].cm() << "\t" + << i + //<< "\t" << digis.view()[i].electronicsId() + << "\t" << digis.view()[i].tctp() << "\t" << digis.view()[i].adcm1() << "\t" << digis.view()[i].adc() << "\t" + << digis.view()[i].tot() << "\t" << digis.view()[i].toa() << "\t" << digis.view()[i].cm() << "\t" << digis.view()[i].flags() << std::endl; } } @@ -182,7 +294,10 @@ namespace ALPAKA_ACCELERATOR_NAMESPACE { int max_ = max > 0 ? max : digis.view().metadata().size(); for (int i = 0; i < max_; i++) { LogDebug("HGCalRecHitCalibrationAlgorithms") - << i << digis.view()[i].tot() << "\t" << digis.view()[i].toa() << "\t" << digis.view()[i].cm() << "\t" + << i + //<< "\t" << digis.view()[i].electronicsId() + << "\t" << digis.view()[i].tctp() << "\t" << digis.view()[i].adcm1() << "\t" << digis.view()[i].adc() << "\t" + << digis.view()[i].tot() << "\t" << digis.view()[i].toa() << "\t" << digis.view()[i].cm() << "\t" << digis.view()[i].flags() << std::endl; } } @@ -193,9 +308,27 @@ namespace ALPAKA_ACCELERATOR_NAMESPACE { auto grid = make_workdiv(1, 1); auto size = max > 0 ? max : recHits.view().metadata().size(); alpaka::exec(queue, grid, HGCalRecHitCalibrationKernel_printRecHits{}, recHits.view(), size); - // ensure that the print operations are complete before returning alpaka::wait(queue); } } // namespace ALPAKA_ACCELERATOR_NAMESPACE + +// +// Some potentially useful code snippets: +// + +//void HGCalRecHitCalibrationAlgorithms::fill(Queue& queue, HGCalRecHitDevice& collection, double xvalue) const { +// // use 64 items per group (this value is arbitrary, but it's a reasonable starting point) +// uint32_t items = 64; + +// // use as many groups as needed to cover the whole problem +// uint32_t groups = divide_up_by(collection->metadata().size(), items); + +// // map items to +// // -threadswithasingleelementperthreadonaGPUbackend +// // -elementswithinasinglethreadonaCPUbackend +// auto workDiv = make_workdiv(groups, items); + +// alpaka::exec(queue, workDiv, HGCalRecHitCalibrationKernel{}, collection.view(), collection->metadata().size(), xvalue); +//} diff --git a/RecoLocalCalo/HGCalRecAlgos/plugins/alpaka/HGCalRecHitCalibrationESProducer.cc b/RecoLocalCalo/HGCalRecAlgos/plugins/alpaka/HGCalRecHitCalibrationESProducer.cc index 1bcfd961a0414..49db8965d1797 100644 --- a/RecoLocalCalo/HGCalRecAlgos/plugins/alpaka/HGCalRecHitCalibrationESProducer.cc +++ b/RecoLocalCalo/HGCalRecAlgos/plugins/alpaka/HGCalRecHitCalibrationESProducer.cc @@ -1,13 +1,13 @@ -// #include "FWCore/Framework/interface/MakerMacros.h" -// #include "FWCore/Framework/interface/SourceFactory.h" -// #include "FWCore/Framework/interface/ESHandle.h" -// #include "FWCore/Framework/interface/ESProducer.h" -// #include "FWCore/Framework/interface/ESTransientHandle.h" -// #include "FWCore/Framework/interface/EventSetupRecordIntervalFinder.h" +#include "FWCore/Framework/interface/MakerMacros.h" +#include "FWCore/Framework/interface/SourceFactory.h" +#include "FWCore/Framework/interface/ESHandle.h" +#include "FWCore/Framework/interface/ESProducer.h" +#include "FWCore/Framework/interface/ESTransientHandle.h" +#include "FWCore/Framework/interface/EventSetupRecordIntervalFinder.h" #include "FWCore/ParameterSet/interface/FileInPath.h" #include "FWCore/ParameterSet/interface/ParameterSet.h" #include "FWCore/Utilities/interface/ESGetToken.h" -// #include "DataFormats/Math/interface/libminifloat.h" +#include "DataFormats/Math/interface/libminifloat.h" #include "HeterogeneousCore/AlpakaCore/interface/alpaka/ESGetToken.h" #include "HeterogeneousCore/AlpakaCore/interface/alpaka/ESProducer.h" @@ -58,7 +58,7 @@ namespace ALPAKA_ACCELERATOR_NAMESPACE { template static void fill_SoA_column( - T* column_SoA, const std::vector& values, const int offset, const int nrows, int arr_offset = 0) { + T* col_SoA, const std::vector values, const int offset, const int nrows, int arr_offset = 0) { // fill SoA column with data from vector for any type const int nrows_vals = values.size(); if (arr_offset < 0) { @@ -72,30 +72,37 @@ namespace ALPAKA_ACCELERATOR_NAMESPACE { << " Tried to copy " << nrows << " rows to SoA with offset " << arr_offset << ", but only have " << nrows_vals << " values in JSON!"; } - auto begin = values.begin() + arr_offset; - auto end = (begin + nrows > values.end()) ? values.end() : begin + nrows; - std::copy(begin, end, &column_SoA[offset]); + ::memcpy(&col_SoA[offset], + &values.data()[arr_offset], + sizeof(T) * nrows); // use mybool (=std::byte) instead of bool + //return values; } std::optional produce(const HGCalModuleConfigurationRcd& iRecord) { - auto const& moduleMap = iRecord.get(indexToken_); + auto const& moduleMap = iRecord.getRecord().get(indexToken_); auto const& config = iRecord.get(configToken_); + //auto const& configHost = iRecord.get(configToken_); + //std::cout << "HGCalCalibrationESProducer::produce: configHost.size()=" + // << configHost.view().metadata().size() << std::endl; // load dense indexing const uint32_t nchans = moduleMap.getMaxDataSize(); // channel-level size + //const uint32_t nmod = moduleMap.getMaxERxSize(); // ROC-level size (number of ECON eRx) hgcalrechit::HGCalCalibParamHost product(nchans, cms::alpakatools::host()); + //product.view().map() = moduleMap; // set dense indexing in SoA (now redundant & NOT thread safe !?) //std::cout << "HGCalCalibrationESProducer::produce: moduleMap.getMaxDataSize()=" << nchans // << ", moduleMap.getMaxERxSize()=" << nmod << std::endl; // load calib parameters from JSON - edm::FileInPath fip(filename_); - std::ifstream infile(fip.fullPath().c_str()); + //std::cout << "HGCalCalibrationESProducer::produce: filename_=" << filename_ << std::endl; + std::ifstream infile(filename_); json calib_data = json::parse(infile); for (const auto& it : calib_data.items()) { // loop over module typecodes in JSON file std::string module = it.key(); // module typecode, e.g. "ML-F3PT-TX-0003" if (module == "Metadata") continue; // ignore metadata fields const auto& [ifed, imod] = moduleMap.getIndexForFedAndModule(module); + //const uint32_t nERx = moduleMap.getMaxERxSize(); // half-ROC-level size const uint32_t offset = moduleMap.getIndexForModuleData(module); // convert module typecode to dense index for this module const uint32_t nrows = @@ -115,10 +122,7 @@ namespace ALPAKA_ACCELERATOR_NAMESPACE { // loop over ECON eRx blocks to fill columns for gain-dependent calibration parameters for (std::size_t iroc = 0; iroc < nrocs; ++iroc) { const uint32_t i_gain = - config.feds[ifed] - .econds[imod] - .rocs[iroc] - .gain; // index of JSON array corresponding to (index,gain) = (0,80fC), (1,160fC), (2,320fC) + config.feds[ifed].econds[imod].rocs[iroc].gain; // index of JSON array corresponding to (index,gain) = (0,80fC), (1,160fC), (2,320fC) const uint32_t offset_arr = iroc * nchans; // dense index offset for JSON array (input to SoA) const uint32_t offset_soa = offset + offset_arr; // dense index offset for SoA //std::cout << "HGCalCalibrationESProducer::produce: iroc=" << iroc << ", nchans=" << nchans @@ -155,6 +159,8 @@ namespace ALPAKA_ACCELERATOR_NAMESPACE { calib_data[module]["Valid"], offset, nrows); // mybool (=std::byte) defined in HGCalCalibrationParameterSoA.h + + //std::cout << "HGCalCalibrationESProducer::produce: memcpied all columns !" << std::endl; } return product; @@ -163,6 +169,8 @@ namespace ALPAKA_ACCELERATOR_NAMESPACE { private: edm::ESGetToken indexToken_; edm::ESGetToken configToken_; + //edm::ESGetToken configToken_; + //device::ESGetToken configToken_; const std::string filename_; }; diff --git a/RecoLocalCalo/HGCalRecAlgos/plugins/alpaka/HGCalRecHitConfigurationESProducer.cc b/RecoLocalCalo/HGCalRecAlgos/plugins/alpaka/HGCalRecHitConfigurationESProducer.cc index f0fde9b9c4301..772f5d16c6095 100644 --- a/RecoLocalCalo/HGCalRecAlgos/plugins/alpaka/HGCalRecHitConfigurationESProducer.cc +++ b/RecoLocalCalo/HGCalRecAlgos/plugins/alpaka/HGCalRecHitConfigurationESProducer.cc @@ -56,8 +56,9 @@ namespace ALPAKA_ACCELERATOR_NAMESPACE { } std::optional produce(const HGCalModuleConfigurationRcd& iRecord) { + //std::cout << "HGCalConfigurationESProducer::produce" << std::endl; auto const& config = iRecord.get(configToken_); - auto const& moduleMap = iRecord.get(indexToken_); + auto const& moduleMap = iRecord.getRecord().get(indexToken_); // load dense indexing const uint32_t nERx = moduleMap.getMaxERxSize(); // half-ROC-level size @@ -68,11 +69,12 @@ namespace ALPAKA_ACCELERATOR_NAMESPACE { // fill SoA with gain if (gain_ > 0) { // fill with single value from user override - //std::cout << "HGCalConfigurationESProducer::produce: fill with default, gain=" << gain_ << std::endl; + std::cout << "HGCalConfigurationESProducer::produce: fill with default, gain=" << gain_ << std::endl; for (uint32_t iroc = 0; iroc < nERx; iroc++) { product.view()[iroc].gain() = gain_; } } else { // fill with ROC-dependent value from JSON via HGCalConfiguration + std::cout << "HGCalConfigurationESProducer::produce: nfeds=" << config.feds.size() << std::endl; for (uint32_t ifed = 0; ifed < config.feds.size(); ++ifed) { for (uint32_t imod = 0; imod < config.feds[ifed].econds.size(); ++imod) { for (uint32_t iroc = 0; iroc < config.feds[ifed].econds[imod].rocs.size(); ++iroc) { @@ -90,7 +92,7 @@ namespace ALPAKA_ACCELERATOR_NAMESPACE { private: edm::ESGetToken indexToken_; edm::ESGetToken configToken_; - int32_t gain_ = -1; // manual override of YAML files + int32_t gain_; // manual override of YAML files }; } // namespace hgcalrechit diff --git a/RecoLocalCalo/HGCalRecAlgos/test/alpaka/TestHGCalRecHitESProducers.cc b/RecoLocalCalo/HGCalRecAlgos/test/alpaka/TestHGCalRecHitESProducers.cc index 10e5377dd90a9..28f2a138f673b 100644 --- a/RecoLocalCalo/HGCalRecAlgos/test/alpaka/TestHGCalRecHitESProducers.cc +++ b/RecoLocalCalo/HGCalRecAlgos/test/alpaka/TestHGCalRecHitESProducers.cc @@ -104,7 +104,7 @@ namespace ALPAKA_ACCELERATOR_NAMESPACE { std::cout << "TestHGCalRecHitESProducers::produce: config=" << config << std::endl; std::cout << "TestHGCalRecHitESProducers::produce: nfeds=" << nfeds << ", config=" << config << std::endl; for (std::size_t fedid = 0; fedid < nfeds; ++fedid) { - auto fed = config.feds[fedid]; // HGCalFedConfig + auto fed = config.feds[fedid]; // HGCalFedConfig_t auto nmods = fed.econds.size(); // number of ECON-Ds for this FED std::cout << " fedid=" << fedid << ", nmods=" << nmods << ", passthroughMode=" << fed.mismatchPassthroughMode << ", cbHeaderMarker=0x" << std::hex << fed.cbHeaderMarker << ", slinkHeaderMarker=0x" diff --git a/SimCalorimetry/HGCalSimAlgos/interface/HGCalRawDataPackingTools.h b/SimCalorimetry/HGCalSimAlgos/interface/HGCalRawDataPackingTools.h index 7127a79c0280d..1c231f5cc594d 100644 --- a/SimCalorimetry/HGCalSimAlgos/interface/HGCalRawDataPackingTools.h +++ b/SimCalorimetry/HGCalSimAlgos/interface/HGCalRawDataPackingTools.h @@ -55,7 +55,7 @@ namespace hgcal { std::vector buildCaptureBlockHeader(uint32_t bunch_crossing, uint32_t event_counter, uint32_t orbit_counter, - const std::vector& econd_statuses); + const std::vector& econd_statuses); /// builds the slink frame header (128 bits header = 4 words) /// \return a vector with 4 32b words diff --git a/SimCalorimetry/HGCalSimAlgos/interface/SlinkTypes.h b/SimCalorimetry/HGCalSimAlgos/interface/SlinkTypes.h index 3b872ff4d077a..b7222b1e127ae 100644 --- a/SimCalorimetry/HGCalSimAlgos/interface/SlinkTypes.h +++ b/SimCalorimetry/HGCalSimAlgos/interface/SlinkTypes.h @@ -19,7 +19,7 @@ namespace hgcal::econd { /// parsed e-rx data struct ERxData { uint32_t cm0{0}, cm1{0}; - std::vector tctp; // vector of hgcal::econd::ToTStatus + std::vector tctp; std::vector adc, adcm, toa, tot; std::vector meta; ///< additional words accompanying the e-rx data uint32_t crc32{0}; diff --git a/SimCalorimetry/HGCalSimAlgos/src/HGCalRawDataPackingTools.cc b/SimCalorimetry/HGCalSimAlgos/src/HGCalRawDataPackingTools.cc index 40fcae46d26a6..da5cde343f58e 100644 --- a/SimCalorimetry/HGCalSimAlgos/src/HGCalRawDataPackingTools.cc +++ b/SimCalorimetry/HGCalSimAlgos/src/HGCalRawDataPackingTools.cc @@ -161,10 +161,11 @@ uint32_t hgcal::econd::buildIdleWord(uint8_t bufStat, uint8_t err, uint8_t rr, u } // -std::vector hgcal::backend::buildCaptureBlockHeader(uint32_t bunch_crossing, - uint32_t event_counter, - uint32_t orbit_counter, - const std::vector& econd_statuses) { +std::vector hgcal::backend::buildCaptureBlockHeader( + uint32_t bunch_crossing, + uint32_t event_counter, + uint32_t orbit_counter, + const std::vector& econd_statuses) { if (econd_statuses.size() > 12) throw cms::Exception("HGCalEmulator") << "Invalid size for ECON-D statuses: " << econd_statuses.size() << "."; std::vector header(2, 0); @@ -184,9 +185,9 @@ std::vector hgcal::backend::buildSlinkHeader( std::vector header(4, 0); header[0] = (boe & hgcal::BACKEND_FRAME::SLINK_BOE_MASK) << hgcal::BACKEND_FRAME::SLINK_BOE_POS | (v & hgcal::BACKEND_FRAME::SLINK_V_MASK) << hgcal::BACKEND_FRAME::SLINK_V_POS | - ((global_event_id >> 41) & hgcal::BACKEND_FRAME::SLINK_GLOBAL_EVENTID_MSB_MASK) + ((global_event_id >> 41) & SLINK_GLOBAL_EVENTID_MSB_MASK) << hgcal::BACKEND_FRAME::SLINK_GLOBAL_EVENTID_MSB_POS; - header[1] = (global_event_id & hgcal::BACKEND_FRAME::SLINK_GLOBAL_EVENTID_LSB_MASK); + header[1] = (global_event_id & SLINK_GLOBAL_EVENTID_LSB_MASK); header[2] = (content_id & hgcal::BACKEND_FRAME::SLINK_CONTENTID_MASK) << hgcal::BACKEND_FRAME::SLINK_CONTENTID_POS; header[3] = (fed_id & hgcal::BACKEND_FRAME::SLINK_SOURCEID_MASK) << hgcal::BACKEND_FRAME::SLINK_SOURCEID_POS; diff --git a/SimCalorimetry/HGCalSimAlgos/src/TrivialEmulator.cc b/SimCalorimetry/HGCalSimAlgos/src/TrivialEmulator.cc index d511f2025ed5d..c57296cd396cc 100644 --- a/SimCalorimetry/HGCalSimAlgos/src/TrivialEmulator.cc +++ b/SimCalorimetry/HGCalSimAlgos/src/TrivialEmulator.cc @@ -11,7 +11,7 @@ ECONDInput TrivialEmulator::next() { ERxData dummy_data{ .cm0 = 0x12, .cm1 = 0x34, - .tctp = std::vector(params_.num_channels_per_erx, static_cast(params_.default_totstatus)), + .tctp = std::vector(params_.num_channels_per_erx, static_cast(params_.default_totstatus)), .adc = std::vector(params_.num_channels_per_erx, 0), .adcm = std::vector(params_.num_channels_per_erx, 0), .toa = std::vector(params_.num_channels_per_erx, 0), diff --git a/SimCalorimetry/HGCalSimProducers/plugins/BuildFile.xml b/SimCalorimetry/HGCalSimProducers/plugins/BuildFile.xml index b98b39d968083..1ba1dc267d54a 100644 --- a/SimCalorimetry/HGCalSimProducers/plugins/BuildFile.xml +++ b/SimCalorimetry/HGCalSimProducers/plugins/BuildFile.xml @@ -1,3 +1,4 @@ + @@ -10,4 +11,20 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/SimCalorimetry/HGCalSimProducers/plugins/alpaka/HGCalDigiSoaFiller.cc b/SimCalorimetry/HGCalSimProducers/plugins/alpaka/HGCalDigiSoaFiller.cc new file mode 100644 index 0000000000000..8aed3949dee53 --- /dev/null +++ b/SimCalorimetry/HGCalSimProducers/plugins/alpaka/HGCalDigiSoaFiller.cc @@ -0,0 +1,185 @@ +#include +#include "FWCore/Framework/interface/MakerMacros.h" +#include "FWCore/ParameterSet/interface/ConfigurationDescriptions.h" +#include "FWCore/ParameterSet/interface/ParameterSet.h" +#include "FWCore/ParameterSet/interface/ParameterSetDescription.h" +#include "FWCore/Utilities/interface/InputTag.h" +#include "FWCore/Utilities/interface/StreamID.h" +#include "FWCore/Framework/interface/ESWatcher.h" +#include "HeterogeneousCore/AlpakaCore/interface/alpaka/stream/EDProducer.h" +#include "HeterogeneousCore/AlpakaCore/interface/alpaka/EDPutToken.h" +#include "HeterogeneousCore/AlpakaCore/interface/alpaka/ESGetToken.h" +#include "HeterogeneousCore/AlpakaCore/interface/alpaka/Event.h" +#include "HeterogeneousCore/AlpakaInterface/interface/config.h" +#include "HeterogeneousCore/AlpakaInterface/interface/CopyToDevice.h" + +#include "DataFormats/HGCalDigi/interface/HGCalElectronicsId.h" +#include "DataFormats/HGCDigi/interface/HGCDigiCollections.h" +#include "DataFormats/HGCalDigi/interface/HGCalDigiHost.h" +#include "DataFormats/HGCalDigi/interface/alpaka/HGCalDigiDevice.h" +#include "CondFormats/DataRecord/interface/HGCalElectronicsMappingRcd.h" +#include "CondFormats/HGCalObjects/interface/HGCalMappingModuleIndexer.h" +//#include "CondFormats/HGCalObjects/interface/HGCalMappingCellIndexer.h" +#include "CondFormats/HGCalObjects/interface/alpaka/HGCalMappingParameterDevice.h" +#include "Geometry/HGCalMapping/interface/HGCalMappingTools.h" + +namespace ALPAKA_ACCELERATOR_NAMESPACE { + + using namespace cms::alpakatools; + + /** + * @short consumes channel digis and packs then in a realistic FEDRawData stream + */ + class HGCalDigiSoaFiller : public stream::EDProducer<> { + public: + //using CellIndexer = HGCalMappingCellIndexer; + using CellInfo = hgcal::HGCalMappingCellParamDevice; + using ModuleIndexer = HGCalMappingModuleIndexer; + using ModuleInfo = hgcal::HGCalMappingModuleParamDevice; + + /** + @ short constructor + */ + explicit HGCalDigiSoaFiller(edm::ParameterSet const& config); + + /** + @short parameters to be used with this plugin + */ + static void fillDescriptions(edm::ConfigurationDescriptions& descriptions); + + /** + @short steers the conversion to SOA + */ + void produce(device::Event&, device::EventSetup const&) override; + + private: + edm::EDGetTokenT > digisCEET_, digisCEHSiT_, digisCEHSiPMT_; + device::EDPutToken digiProdT_; + + edm::ESWatcher cfgWatcher_; + //edm::ESGetToken cellIndexTkn_; + device::ESGetToken cellTkn_; + edm::ESGetToken moduleIndexTkn_; + device::ESGetToken moduleTkn_; + }; + + // + HGCalDigiSoaFiller::HGCalDigiSoaFiller(const edm::ParameterSet& config) + : digisCEET_( + consumes >(config.getParameter("eeChannelDigis"))), + digisCEHSiT_( + consumes >(config.getParameter("cehsiChannelDigis"))), + digisCEHSiPMT_(consumes >( + config.getParameter("cehsipmChannelDigis"))), + //cellIndexTkn_(esConsumes()), + cellTkn_(esConsumes()), + moduleIndexTkn_(esConsumes()), + moduleTkn_(esConsumes()) { + digiProdT_ = produces(config.getParameter("digisProdName")); + } + + // + void HGCalDigiSoaFiller::fillDescriptions(edm::ConfigurationDescriptions& descriptions) { + edm::ParameterSetDescription desc; + desc.add("eeChannelDigis", edm::InputTag("simHGCalUnsuppressedDigis", "EE")); + desc.add("cehsiChannelDigis", edm::InputTag("simHGCalUnsuppressedDigis", "HEfront")); + desc.add("cehsipmChannelDigis", edm::InputTag("simHGCalUnsuppressedDigis", "HEback")); + desc.add("digisProdName", "HGC"); + descriptions.addWithDefaultLabel(desc); + } + + // + void HGCalDigiSoaFiller::produce(device::Event& iEvent, device::EventSetup const& iSetup) { + cfgWatcher_.check(iSetup); + //const CellIndexer &cellidx = iSetup.getData(cellIndexTkn_); + const CellInfo& cells = iSetup.getData(cellTkn_); + const ModuleIndexer& modidx = iSetup.getData(moduleIndexTkn_); + const ModuleInfo& modules = iSetup.getData(moduleTkn_); + + //FIXME + int itSample = 2; + + //read "classic" channel digis + auto const& digisCEE = iEvent.get(digisCEET_); + //auto const &digisCEHSi = iEvent.get(digisCEHSiT_); + //auto const &digisCEHSiPM = iEvent.get(digisCEHSiPMT_); + + //fill the SoA collection in the host + uint32_t finaldigi_size = modidx.maxDataIdx_; + std::cout << "Allocating SOA with " << finaldigi_size << " entries" << std::endl; + hgcaldigi::HGCalDigiHost host_buffer(finaldigi_size, cms::alpakatools::host()); + int nmatch(0), nfail(0); + for (auto d : digisCEE) { + //det id to electronics id + uint32_t detid(d.id().rawId()); + HGCalElectronicsId eleid( + ::hgcal::mappingtools::getElectronicsIdForSiCell(modules, cells, detid)); + if (eleid.raw() == 0) { + nfail++; + continue; + } + + //get the index in the SOA + auto modcellidx = + ::hgcal::mappingtools::getModuleCellIndicesForSiCell(modules, cells, detid); + uint32_t i = finaldigi_size; + try { + i = modidx.getIndexForModuleData( + eleid.localFEDId(), eleid.captureBlock(), eleid.econdIdx(), eleid.econdeRx(), eleid.halfrocChannel()); + if (i >= finaldigi_size) { + HGCSiliconDetId siid(d.id()); + int32_t midx = modcellidx.first; + int32_t cidx = modcellidx.second; + std::cout << "Failed to get proper index (" << i << ") for " + << "layer=" << siid.layer() << " u=" << siid.waferU() << " v=" << siid.waferV() << std::endl + << "\t Modidx:" << midx << " cellidx: " << cidx << " cellu=" << siid.cellU() + << " cellv=" << siid.cellV() << std::endl + << "\tModule info FED:" << (uint32_t)modules.view()[midx].fedid() + << " CB:" << (uint32_t)modules.view()[midx].captureblockidx() + << " ECOND: " << (uint32_t)modules.view()[midx].econdidx() + << "\tEle id: FED=" << (uint32_t)eleid.localFEDId() << " CB:" << (uint32_t)eleid.captureBlock() + << " ECONDidx: " << (uint32_t)eleid.econdIdx() << std::endl; + nfail++; + continue; + } + } catch (std::exception& e) { + std::cout << e.what() << std::endl; + nfail++; + continue; + } + + nmatch++; + + //read digi (in-time sample only) + uint32_t toa = d.sample(itSample).toa(); + uint32_t tctp = d.sample(itSample).mode() ? 3 : 0; + uint32_t adcm1(d.sample(itSample - 1).data()); + uint32_t adc(tctp < 3 ? d.sample(itSample).data() : 0); + uint32_t tot(tctp == 3 ? d.sample(itSample).data() : 0); + + //fill SOA + auto idigi = host_buffer.view()[i]; + //idigi.electronicsId() = eleid.raw(); + idigi.tctp() = tctp; + idigi.adcm1() = adcm1; + idigi.adc() = adc; + idigi.tot() = tot; + idigi.toa() = toa; + idigi.cm() = 0; + idigi.flags() = 0; + } + + std::cout << "Matched: " << nmatch << " failed: " << nfail << std::endl; + + //allocate device colleciton, copy from host and put in event + auto& queue = iEvent.queue(); + hgcaldigi::HGCalDigiDevice device_buffer(host_buffer.view().metadata().size(), queue); + alpaka::memcpy(queue, host_buffer.buffer(), device_buffer.const_buffer()); + iEvent.emplace(digiProdT_, std::move(device_buffer)); + } + +} // namespace ALPAKA_ACCELERATOR_NAMESPACE + +// define this as a plug-in +#include "HeterogeneousCore/AlpakaCore/interface/alpaka/MakerMacros.h" +DEFINE_FWK_ALPAKA_MODULE(HGCalDigiSoaFiller); diff --git a/SimCalorimetry/HGCalSimProducers/test/hgcalRealistiDigis_cfg.py b/SimCalorimetry/HGCalSimProducers/test/hgcalRealistiDigis_cfg.py new file mode 100644 index 0000000000000..01a87e1689068 --- /dev/null +++ b/SimCalorimetry/HGCalSimProducers/test/hgcalRealistiDigis_cfg.py @@ -0,0 +1,70 @@ +import FWCore.ParameterSet.Config as cms + +from Configuration.Eras.Era_Phase2C17I13M9_cff import Phase2C17I13M9 as Era_Phase2 +process = cms.Process("REALDIGI", Era_Phase2) + + +from FWCore.ParameterSet.VarParsing import VarParsing +options = VarParsing ('standard') +options.register('geometry', 'Extended2026D94', VarParsing.multiplicity.singleton, VarParsing.varType.string, 'geometry to use') +options.register('modules','Geometry/HGCalMapping/data/ModuleMaps/modulelocator_CEminus_V15p5.txt',mytype=VarParsing.varType.string, + info="Path to module mapper. Absolute, or relative to CMSSW src directory") +options.register('sicells','Geometry/HGCalMapping/data/CellMaps/WaferCellMapTraces.txt',mytype=VarParsing.varType.string, + info="Path to Si cell mapper. Absolute, or relative to CMSSW src directory") +options.register('sipmcells','Geometry/HGCalMapping/data/CellMaps/channels_sipmontile.hgcal.txt',mytype=VarParsing.varType.string, + info="Path to SiPM-on-tile cell mapper. Absolute, or relative to CMSSW src directory") +options.parseArguments() + +if len(options.files)==0: + options.files=['file:/eos/cms/store/group/dpg_hgcal/comm_hgcal/psilva/hackhathon/23234.103_TTbar_14TeV+2026D94Aging3000/step2.root'] + print(f'Using hackathon test files: {options.files}') + +#set geometry/global tag +process.load('Configuration.StandardSequences.Services_cff') +process.load('Configuration.StandardSequences.MagneticField_cff') +process.load('Configuration.EventContent.EventContent_cff') +process.load("FWCore.MessageService.MessageLogger_cfi") +process.load("Configuration.StandardSequences.FrontierConditions_GlobalTag_cff") +process.load('Configuration.Geometry.Geometry%sReco_cff'%options.geometry) +process.load('Configuration.Geometry.Geometry%s_cff'%options.geometry) +from Configuration.AlCa.GlobalTag import GlobalTag +process.GlobalTag = GlobalTag(process.GlobalTag, 'auto:phase2_realistic', '') + +process.MessageLogger.cerr.threshold = '' +process.MessageLogger.cerr.FwkReport.reportEvery = 500 + +process.source = cms.Source("PoolSource", + fileNames = cms.untracked.vstring(options.files), + duplicateCheckMode = cms.untracked.string("noDuplicateCheck") + ) +process.maxEvents = cms.untracked.PSet( input = cms.untracked.int32(options.maxEvents) ) + + +#ESSources/Producers for the logical mapping +#indexers +process.load('Geometry.HGCalMapping.hgCalMappingESProducer_cfi') +process.hgCalMappingESProducer.modules = cms.FileInPath(options.modules) +process.hgCalMappingESProducer.si = cms.FileInPath(options.sicells) +process.hgCalMappingESProducer.sipm = cms.FileInPath(options.sipmcells) + +#cells and modules info +process.load('Configuration.StandardSequences.Accelerators_cff') +process.hgCalMappingCellESProducer = cms.ESProducer('hgcal::HGCalMappingCellESProducer@alpaka', + filelist=cms.vstring(options.sicells,options.sipmcells), + cellindexer=cms.ESInputTag('') ) +process.hgCalMappingModuleESProducer = cms.ESProducer('hgcal::HGCalMappingModuleESProducer@alpaka', + filename=cms.FileInPath(options.modules), + moduleindexer=cms.ESInputTag('') ) + +#realistic digis producer +process.hgCalDigiSoaFiller = cms.EDProducer('HGCalDigiSoaFiller@alpaka') +process.t = cms.Task(process.hgCalDigiSoaFiller) +process.p = cms.Path(process.t) + +#output +process.output = cms.OutputModule('PoolOutputModule', + fileName = cms.untracked.string(options.output), + outputCommands = cms.untracked.vstring('drop *', + 'keep *_*_*_REALDIGI')) + +process.output_path = cms.EndPath(process.output)