File indexing completed on 2023-03-17 10:59:35
0001 #include "EventFilter/DTRawToDigi/plugins/DTDigiToRawModule.h"
0002 #include "EventFilter/DTRawToDigi/plugins/DTDigiToRaw.h"
0003 #include "DataFormats/FEDRawData/interface/FEDRawDataCollection.h"
0004 #include "DataFormats/FEDRawData/interface/FEDNumbering.h"
0005 #include "DataFormats/Common/interface/Handle.h"
0006 #include "FWCore/Framework/interface/Event.h"
0007
0008 #include "DataFormats/FEDRawData/interface/FEDHeader.h"
0009 #include "DataFormats/FEDRawData/interface/FEDTrailer.h"
0010 #include "FWCore/Utilities/interface/CRC16.h"
0011
0012 #include "FWCore/Framework/interface/EventSetup.h"
0013
0014 #include <iostream>
0015
0016 using namespace edm;
0017 using namespace std;
0018
0019 DTDigiToRawModule::DTDigiToRawModule(const edm::ParameterSet& ps) {
0020 produces<FEDRawDataCollection>();
0021
0022 dduID = ps.getUntrackedParameter<int>("dduID", 770);
0023 debug = ps.getUntrackedParameter<bool>("debugMode", false);
0024 digicoll = consumes<DTDigiCollection>(ps.getParameter<edm::InputTag>("digiColl"));
0025 mapToken_ = esConsumes<DTReadOutMapping, DTReadOutMappingRcd>();
0026
0027 useStandardFEDid_ = ps.getUntrackedParameter<bool>("useStandardFEDid", true);
0028 minFEDid_ = ps.getUntrackedParameter<int>("minFEDid", 770);
0029 maxFEDid_ = ps.getUntrackedParameter<int>("maxFEDid", 775);
0030
0031 packer = new DTDigiToRaw(ps);
0032 if (debug)
0033 cout << "[DTDigiToRawModule]: constructor" << endl;
0034 }
0035
0036 DTDigiToRawModule::~DTDigiToRawModule() {
0037 delete packer;
0038 if (debug)
0039 cout << "[DTDigiToRawModule]: destructor" << endl;
0040 }
0041
0042 void DTDigiToRawModule::produce(Event& e, const EventSetup& iSetup) {
0043 auto fed_buffers = std::make_unique<FEDRawDataCollection>();
0044
0045
0046 Handle<DTDigiCollection> digis;
0047 e.getByToken(digicoll, digis);
0048
0049
0050 edm::ESHandle<DTReadOutMapping> map = iSetup.getHandle(mapToken_);
0051
0052
0053 int FEDIDmin = 0, FEDIDMax = 0;
0054 if (useStandardFEDid_) {
0055 FEDIDmin = FEDNumbering::MINDTFEDID;
0056 FEDIDMax = FEDNumbering::MAXDTFEDID;
0057 } else {
0058 FEDIDmin = minFEDid_;
0059 FEDIDMax = maxFEDid_;
0060 }
0061
0062 for (int id = FEDIDmin; id <= FEDIDMax; ++id) {
0063 packer->SetdduID(id);
0064 FEDRawData* rawData = packer->createFedBuffers(*digis, map);
0065
0066 FEDRawData& fedRawData = fed_buffers->FEDData(id);
0067 fedRawData = *rawData;
0068 delete rawData;
0069
0070 FEDHeader dtFEDHeader(fedRawData.data());
0071 dtFEDHeader.set(fedRawData.data(), 0, e.id().event(), 0, id);
0072
0073 FEDTrailer dtFEDTrailer(fedRawData.data() + (fedRawData.size() - 8));
0074 dtFEDTrailer.set(fedRawData.data() + (fedRawData.size() - 8),
0075 fedRawData.size() / 8,
0076 evf::compute_crc(fedRawData.data(), fedRawData.size()),
0077 0,
0078 0);
0079 }
0080
0081 e.put(std::move(fed_buffers));
0082 }