Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2024-04-06 12:10:31

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   // Take digis from the event
0046   Handle<DTDigiCollection> digis;
0047   e.getByToken(digicoll, digis);
0048 
0049   // Load DTMap
0050   edm::ESHandle<DTReadOutMapping> map = iSetup.getHandle(mapToken_);
0051 
0052   // Create the packed data
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   // Put the raw data to the event
0081   e.put(std::move(fed_buffers));
0082 }