File indexing completed on 2023-05-26 01:15:39
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010 #include "DataFormats/HGCalDigi/interface/HGCROCChannelDataFrame.h"
0011 #include "EventFilter/HGCalRawToDigi/interface/HGCalModuleTreeReader.h"
0012 #include "EventFilter/HGCalRawToDigi/interface/HGCalRawDataDefinitions.h"
0013 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0014 #include "FWCore/Utilities/interface/Exception.h"
0015
0016 #include "TChain.h"
0017
0018 using namespace hgcal::econd;
0019
0020 HGCalModuleTreeReader::HGCalModuleTreeReader(const EmulatorParameters& params,
0021 const std::string& tree_name,
0022 const std::vector<std::string>& filenames)
0023 : Emulator(params) {
0024 TChain chain(tree_name.data());
0025 for (const auto& filename : filenames)
0026 chain.Add(filename.c_str());
0027
0028 HGCModuleTreeEvent event;
0029 chain.SetBranchAddress("event", &event.event);
0030 chain.SetBranchAddress("chip", &event.chip);
0031 chain.SetBranchAddress("half", &event.half);
0032 chain.SetBranchAddress("daqdata", &event.daqdata);
0033 chain.SetBranchAddress("bxcounter", &event.bxcounter);
0034 chain.SetBranchAddress("eventcounter", &event.eventcounter);
0035 chain.SetBranchAddress("orbitcounter", &event.orbitcounter);
0036 chain.SetBranchAddress("trigtime", &event.trigtime);
0037 chain.SetBranchAddress("trigwidth", &event.trigwidth);
0038
0039 for (long long i = 0; i < chain.GetEntries(); ++i) {
0040 chain.GetEntry(i);
0041
0042
0043 EventId key{(uint32_t)event.eventcounter, (uint32_t)event.bxcounter, (uint32_t)event.orbitcounter};
0044 if (data_.count(key) == 0)
0045 data_[key] = ERxInput{};
0046
0047
0048 ERxId_t erxKey{(uint8_t)event.chip, (uint8_t)event.half};
0049 if (data_[key].count(erxKey) == 0)
0050 data_[key][erxKey] = ERxData{};
0051
0052
0053 if (const auto nwords = event.daqdata->size(); nwords != 41)
0054 throw cms::Exception("HGCalModuleTreeReader")
0055 << "Invalid number of words retrieved for event {" << event.eventcounter << ":" << event.bxcounter << ":"
0056 << event.orbitcounter << "}: should be 41, got " << nwords << ".";
0057
0058
0059
0060
0061 const uint32_t cmword(event.daqdata->at(1));
0062 if (((cmword >> 20) & 0xfff) != 0)
0063 throw cms::Exception("HGCalModuleTreeReader")
0064 << "Consistency check failed for common mode word: " << ((cmword >> 20) & 0xfff) << " != 0.";
0065
0066 data_[key][erxKey].cm1 = cmword & 0x3ff;
0067 data_[key][erxKey].cm0 = (cmword >> 10) & 0x3ff;
0068
0069
0070 for (size_t i = 2; i < 2 + params_.num_channels_per_erx; i++) {
0071 HGCROCChannelDataFrame<uint32_t> frame(0, event.daqdata->at(i));
0072 const auto tctp = static_cast<ToTStatus>(frame.tctp());
0073 data_[key][erxKey].tctp.push_back(tctp);
0074 data_[key][erxKey].adcm.push_back(frame.adcm1());
0075 data_[key][erxKey].adc.push_back(tctp == ToTStatus::ZeroSuppressed ? frame.adc() : 0);
0076 data_[key][erxKey].tot.push_back(tctp == ToTStatus::ZeroSuppressed ? frame.rawtot() : 0);
0077 data_[key][erxKey].toa.push_back(frame.toa());
0078 }
0079
0080
0081 data_[key][erxKey].crc32 = event.daqdata->at(39);
0082
0083
0084
0085
0086 data_[key][erxKey].meta.push_back(event.trigtime);
0087 data_[key][erxKey].meta.push_back(event.trigwidth);
0088 }
0089
0090 edm::LogInfo("HGCalModuleTreeReader") << "read " << data_.size() << " events.";
0091
0092 it_data_ = data_.begin();
0093 }
0094
0095
0096 ECONDInput HGCalModuleTreeReader::next() {
0097 if (it_data_ == data_.end())
0098 throw cms::Exception("HGCalModuleTreeReader") << "Insufficient number of events were retrieved from input tree to "
0099 "proceed with the generation of emulated events.";
0100
0101 ++it_data_;
0102 return ECONDInput{it_data_->first, it_data_->second};
0103 }