File indexing completed on 2025-02-09 23:41:47
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020 #include <memory>
0021 #include <iostream>
0022 #include <string>
0023
0024
0025 #include "FWCore/Framework/interface/Frameworkfwd.h"
0026 #include "FWCore/Framework/interface/global/EDProducer.h"
0027
0028 #include "FWCore/Framework/interface/Event.h"
0029 #include "FWCore/Framework/interface/MakerMacros.h"
0030
0031 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0032 #include "FWCore/Utilities/interface/ESGetToken.h"
0033
0034 #include "EventFilter/EcalDigiToRaw/interface/TowerBlockFormatter.h"
0035 #include "EventFilter/EcalDigiToRaw/interface/TCCBlockFormatter.h"
0036 #include "EventFilter/EcalDigiToRaw/interface/BlockFormatter.h"
0037 #include "EventFilter/EcalDigiToRaw/interface/SRBlockFormatter.h"
0038
0039 #include "DataFormats/EcalDigi/interface/EcalDigiCollections.h"
0040 #include "DataFormats/EcalDigi/interface/EcalSrFlag.h"
0041
0042 #include "DataFormats/EcalDetId/interface/EcalDetIdCollections.h"
0043
0044 #include "DataFormats/FEDRawData/interface/FEDRawDataCollection.h"
0045 #include "DataFormats/FEDRawData/interface/FEDRawData.h"
0046 #include "DataFormats/FEDRawData/interface/FEDNumbering.h"
0047
0048 #include "DataFormats/Common/interface/Handle.h"
0049 #include "FWCore/Framework/interface/EventSetup.h"
0050 #include "FWCore/Framework/interface/ESHandle.h"
0051
0052 #include "Geometry/EcalMapping/interface/EcalElectronicsMapping.h"
0053 #include "Geometry/EcalMapping/interface/EcalMappingRcd.h"
0054
0055 class EcalDigiToRaw : public edm::global::EDProducer<> {
0056 public:
0057 EcalDigiToRaw(const edm::ParameterSet& pset);
0058
0059 void produce(edm::StreamID, edm::Event& e, const edm::EventSetup& c) const override;
0060
0061 typedef long long Word64;
0062 typedef unsigned int Word32;
0063
0064 private:
0065
0066
0067 edm::EDGetTokenT<EcalTrigPrimDigiCollection> labelTT_;
0068 edm::EDGetTokenT<EBSrFlagCollection> labelEBSR_;
0069 edm::EDGetTokenT<EESrFlagCollection> labelEESR_;
0070 edm::EDGetTokenT<EBDigiCollection> EBDigiToken_;
0071 edm::EDGetTokenT<EEDigiCollection> EEDigiToken_;
0072 edm::ESGetToken<EcalElectronicsMapping, EcalMappingRcd> ecalmappingToken_;
0073 edm::EDPutTokenT<FEDRawDataCollection> putToken_;
0074
0075 const std::vector<int32_t> listDCCId_;
0076
0077 const BlockFormatter::Config config_;
0078 };
0079
0080 using namespace edm;
0081 using namespace std;
0082
0083 EcalDigiToRaw::EcalDigiToRaw(const edm::ParameterSet& iConfig)
0084 : listDCCId_{iConfig.getUntrackedParameter<std::vector<int32_t> >("listDCCId")},
0085 config_{&listDCCId_,
0086 iConfig.getUntrackedParameter<bool>("debug"),
0087 iConfig.getUntrackedParameter<bool>("DoBarrel"),
0088 iConfig.getUntrackedParameter<bool>("DoEndCap"),
0089 iConfig.getUntrackedParameter<bool>("WriteTCCBlock"),
0090 iConfig.getUntrackedParameter<bool>("WriteSRFlags"),
0091 iConfig.getUntrackedParameter<bool>("WriteTowerBlock")} {
0092 auto label = iConfig.getParameter<string>("Label");
0093 auto instanceNameEB = iConfig.getParameter<string>("InstanceEB");
0094 auto instanceNameEE = iConfig.getParameter<string>("InstanceEE");
0095
0096 edm::InputTag EBlabel = edm::InputTag(label, instanceNameEB);
0097 edm::InputTag EElabel = edm::InputTag(label, instanceNameEE);
0098
0099 EBDigiToken_ = consumes<EBDigiCollection>(EBlabel);
0100 EEDigiToken_ = consumes<EEDigiCollection>(EElabel);
0101
0102 labelTT_ = consumes<EcalTrigPrimDigiCollection>(iConfig.getParameter<edm::InputTag>("labelTT"));
0103
0104 labelEBSR_ = consumes<EBSrFlagCollection>(iConfig.getParameter<edm::InputTag>("labelEBSRFlags"));
0105 labelEESR_ = consumes<EESrFlagCollection>(iConfig.getParameter<edm::InputTag>("labelEESRFlags"));
0106 ecalmappingToken_ = esConsumes<EcalElectronicsMapping, EcalMappingRcd>();
0107
0108 putToken_ = produces<FEDRawDataCollection>();
0109 }
0110
0111
0112
0113
0114
0115
0116 void EcalDigiToRaw::produce(edm::StreamID, edm::Event& iEvent, const edm::EventSetup& iSetup) const {
0117 if (config_.debug_)
0118 cout << "Enter in EcalDigiToRaw::produce ... " << endl;
0119
0120 ESHandle<EcalElectronicsMapping> ecalmapping = iSetup.getHandle(ecalmappingToken_);
0121 const EcalElectronicsMapping* TheMapping = ecalmapping.product();
0122
0123 FEDRawDataCollection productRawData;
0124
0125 BlockFormatter::Params params;
0126 params.orbit_number_ = iEvent.orbitNumber();
0127 params.bx_ = iEvent.bunchCrossing();
0128 params.lv1_ = iEvent.id().event() % (0x1 << 24);
0129 params.runnumber_ = iEvent.id().run();
0130
0131 BlockFormatter Headerblockformatter(config_, params);
0132 TCCBlockFormatter TCCblockformatter(config_, params);
0133 TowerBlockFormatter Towerblockformatter(config_, params);
0134 SRBlockFormatter SRblockformatter(config_, params);
0135
0136 Headerblockformatter.DigiToRaw(&productRawData);
0137
0138
0139
0140 Handle<EcalTrigPrimDigiCollection> ecalTrigPrim;
0141
0142 Handle<EBSrFlagCollection> ebSrFlags;
0143 Handle<EESrFlagCollection> eeSrFlags;
0144
0145 if (config_.doTCC_) {
0146 if (config_.debug_)
0147 cout << "Creation of the TCC block " << endl;
0148
0149 iEvent.getByToken(labelTT_, ecalTrigPrim);
0150
0151
0152 for (EcalTrigPrimDigiCollection::const_iterator it = ecalTrigPrim->begin(); it != ecalTrigPrim->end(); it++) {
0153 const EcalTriggerPrimitiveDigi& trigprim = *it;
0154 const EcalTrigTowerDetId& detid = it->id();
0155
0156 if ((detid.subDet() == EcalBarrel) && (!config_.doBarrel_))
0157 continue;
0158 if ((detid.subDet() == EcalEndcap) && (!config_.doEndCap_))
0159 continue;
0160
0161 int iDCC = TheMapping->DCCid(detid);
0162 int FEDid = FEDNumbering::MINECALFEDID + iDCC;
0163
0164 FEDRawData& rawdata = productRawData.FEDData(FEDid);
0165
0166
0167 TCCblockformatter.DigiToRaw(trigprim, rawdata, TheMapping);
0168
0169 }
0170
0171 }
0172
0173 if (config_.doSR_) {
0174 if (config_.debug_)
0175 cout << " Process the SR flags " << endl;
0176
0177 if (config_.doBarrel_) {
0178
0179 iEvent.getByToken(labelEBSR_, ebSrFlags);
0180
0181 for (EBSrFlagCollection::const_iterator it = ebSrFlags->begin(); it != ebSrFlags->end(); it++) {
0182 const EcalSrFlag& srflag = *it;
0183 int flag = srflag.value();
0184
0185 EcalTrigTowerDetId id = srflag.id();
0186 int Dccid = TheMapping->DCCid(id);
0187 int DCC_Channel = TheMapping->iTT(id);
0188 int FEDid = FEDNumbering::MINECALFEDID + Dccid;
0189
0190 if (config_.debug_)
0191 cout << "will process SRblockformatter_ for FEDid " << dec << FEDid << endl;
0192 FEDRawData& rawdata = productRawData.FEDData(FEDid);
0193 if (config_.debug_)
0194 Headerblockformatter.print(rawdata);
0195 SRblockformatter.DigiToRaw(Dccid, DCC_Channel, flag, rawdata);
0196 }
0197 }
0198
0199 if (config_.doEndCap_) {
0200
0201 iEvent.getByToken(labelEESR_, eeSrFlags);
0202
0203 for (EESrFlagCollection::const_iterator it = eeSrFlags->begin(); it != eeSrFlags->end(); it++) {
0204 const EcalSrFlag& srflag = *it;
0205 int flag = srflag.value();
0206 EcalScDetId id = srflag.id();
0207 pair<int, int> ind = TheMapping->getDCCandSC(id);
0208 int Dccid = ind.first;
0209 int DCC_Channel = ind.second;
0210
0211 int FEDid = FEDNumbering::MINECALFEDID + Dccid;
0212 FEDRawData& rawdata = productRawData.FEDData(FEDid);
0213 SRblockformatter.DigiToRaw(Dccid, DCC_Channel, flag, rawdata);
0214 }
0215 }
0216
0217 }
0218
0219
0220
0221 Handle<EBDigiCollection> ebDigis;
0222 Handle<EEDigiCollection> eeDigis;
0223
0224 if (config_.doTower_) {
0225 if (config_.doBarrel_) {
0226 if (config_.debug_)
0227 cout << "Creation of the TowerBlock ... Barrel case " << endl;
0228 iEvent.getByToken(EBDigiToken_, ebDigis);
0229 for (EBDigiCollection::const_iterator it = ebDigis->begin(); it != ebDigis->end(); it++) {
0230 const EBDataFrame& dataframe = *it;
0231 const EBDetId& ebdetid = it->id();
0232 int DCCid = TheMapping->DCCid(ebdetid);
0233 int FEDid = FEDNumbering::MINECALFEDID + DCCid;
0234 FEDRawData& rawdata = productRawData.FEDData(FEDid);
0235 Towerblockformatter.DigiToRaw(dataframe, rawdata, TheMapping);
0236 }
0237 }
0238
0239 if (config_.doEndCap_) {
0240 if (config_.debug_)
0241 cout << "Creation of the TowerBlock ... EndCap case " << endl;
0242 iEvent.getByToken(EEDigiToken_, eeDigis);
0243 for (EEDigiCollection::const_iterator it = eeDigis->begin(); it != eeDigis->end(); it++) {
0244 const EEDataFrame& dataframe = *it;
0245 const EEDetId& eedetid = it->id();
0246 EcalElectronicsId elid = TheMapping->getElectronicsId(eedetid);
0247 int DCCid = elid.dccId();
0248 int FEDid = FEDNumbering::MINECALFEDID + DCCid;
0249 FEDRawData& rawdata = productRawData.FEDData(FEDid);
0250 Towerblockformatter.DigiToRaw(dataframe, rawdata, TheMapping);
0251 }
0252 }
0253
0254 }
0255
0256
0257
0258 map<int, map<int, int> >& FEDorder = Towerblockformatter.GetFEDorder();
0259
0260 Headerblockformatter.CleanUp(&productRawData, &FEDorder);
0261
0262
0263
0264
0265
0266
0267
0268
0269
0270 Towerblockformatter.EndEvent(&productRawData);
0271
0272 iEvent.emplace(putToken_, std::move(productRawData));
0273
0274 return;
0275 }
0276
0277 DEFINE_FWK_MODULE(EcalDigiToRaw);