Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2025-02-09 23:41:47

0001 // -*- C++ -*-
0002 //
0003 // Package:    EcalDigiToRaw
0004 // Class:      EcalDigiToRaw
0005 //
0006 /**\class EcalDigiToRaw EcalDigiToRaw.cc EventFilter/EcalDigiToRaw/src/EcalDigiToRaw.cc
0007 
0008  Description: <one line class summary>
0009 
0010  Implementation:
0011      <Notes on implementation>
0012 */
0013 //
0014 // Original Author:  Emmanuelle Perez
0015 //         Created:  Sat Nov 25 13:59:51 CET 2006
0016 //
0017 //
0018 
0019 // system include files
0020 #include <memory>
0021 #include <iostream>
0022 #include <string>
0023 
0024 // user include files
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   // ----------member data ---------------------------
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 // member functions
0113 //
0114 
0115 // ------------ method called to for each event  ------------
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   // ---------   Now the Trigger Block part
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     // iEvent.getByType(ecalTrigPrim);
0149     iEvent.getByToken(labelTT_, ecalTrigPrim);
0150 
0151     // loop on TP's and add one by one to the block
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       // adding the primitive to the block
0167       TCCblockformatter.DigiToRaw(trigprim, rawdata, TheMapping);
0168 
0169     }  // end loop on ecalTrigPrim
0170 
0171   }  // endif doTCC
0172 
0173   if (config_.doSR_) {
0174     if (config_.debug_)
0175       cout << " Process the SR flags " << endl;
0176 
0177     if (config_.doBarrel_) {
0178       // iEvent.getByType(ebSrFlags);
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         // if (Dccid == 10) cout << "Dcc " << Dccid << " DCC_Channel " << DCC_Channel << " flag " << flag << endl;
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     }  // end DoBarrel
0198 
0199     if (config_.doEndCap_) {
0200       // iEvent.getByType(eeSrFlags);
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     }  // end doEndCap
0216 
0217   }  // endif doSR
0218 
0219   // ---------  Now the Tower Block part
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   }  // endif config_.doTower_
0255 
0256   // -------- Clean up things ...
0257 
0258   map<int, map<int, int> >& FEDorder = Towerblockformatter.GetFEDorder();
0259 
0260   Headerblockformatter.CleanUp(&productRawData, &FEDorder);
0261 
0262   /*
0263    cout << "For FED 633 " << endl;
0264          FEDRawData& rawdata = productRawData -> FEDData(633);
0265          Headerblockformatter_ -> print(rawdata);
0266 */
0267 
0268   // Headerblockformatter_ -> PrintSizes(productRawData.get());
0269 
0270   Towerblockformatter.EndEvent(&productRawData);
0271 
0272   iEvent.emplace(putToken_, std::move(productRawData));
0273 
0274   return;
0275 }
0276 
0277 DEFINE_FWK_MODULE(EcalDigiToRaw);