Line Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
#include "EventFilter/DTRawToDigi/plugins/DTDigiToRawModule.h"
#include "EventFilter/DTRawToDigi/plugins/DTDigiToRaw.h"
#include "DataFormats/FEDRawData/interface/FEDRawDataCollection.h"
#include "DataFormats/FEDRawData/interface/FEDNumbering.h"
#include "DataFormats/Common/interface/Handle.h"
#include "FWCore/Framework/interface/Event.h"

#include "DataFormats/FEDRawData/interface/FEDHeader.h"
#include "DataFormats/FEDRawData/interface/FEDTrailer.h"
#include "FWCore/Utilities/interface/CRC16.h"

#include "FWCore/Framework/interface/EventSetup.h"

#include <iostream>

using namespace edm;
using namespace std;

DTDigiToRawModule::DTDigiToRawModule(const edm::ParameterSet& ps) {
  produces<FEDRawDataCollection>();

  dduID = ps.getUntrackedParameter<int>("dduID", 770);
  debug = ps.getUntrackedParameter<bool>("debugMode", false);
  digicoll = consumes<DTDigiCollection>(ps.getParameter<edm::InputTag>("digiColl"));
  mapToken_ = esConsumes<DTReadOutMapping, DTReadOutMappingRcd>();

  useStandardFEDid_ = ps.getUntrackedParameter<bool>("useStandardFEDid", true);
  minFEDid_ = ps.getUntrackedParameter<int>("minFEDid", 770);
  maxFEDid_ = ps.getUntrackedParameter<int>("maxFEDid", 775);

  packer = new DTDigiToRaw(ps);
  if (debug)
    cout << "[DTDigiToRawModule]: constructor" << endl;
}

DTDigiToRawModule::~DTDigiToRawModule() {
  delete packer;
  if (debug)
    cout << "[DTDigiToRawModule]: destructor" << endl;
}

void DTDigiToRawModule::produce(Event& e, const EventSetup& iSetup) {
  auto fed_buffers = std::make_unique<FEDRawDataCollection>();

  // Take digis from the event
  Handle<DTDigiCollection> digis;
  e.getByToken(digicoll, digis);

  // Load DTMap
  edm::ESHandle<DTReadOutMapping> map = iSetup.getHandle(mapToken_);

  // Create the packed data
  int FEDIDmin = 0, FEDIDMax = 0;
  if (useStandardFEDid_) {
    FEDIDmin = FEDNumbering::MINDTFEDID;
    FEDIDMax = FEDNumbering::MAXDTFEDID;
  } else {
    FEDIDmin = minFEDid_;
    FEDIDMax = maxFEDid_;
  }

  for (int id = FEDIDmin; id <= FEDIDMax; ++id) {
    packer->SetdduID(id);
    FEDRawData* rawData = packer->createFedBuffers(*digis, map);

    FEDRawData& fedRawData = fed_buffers->FEDData(id);
    fedRawData = *rawData;
    delete rawData;

    FEDHeader dtFEDHeader(fedRawData.data());
    dtFEDHeader.set(fedRawData.data(), 0, e.id().event(), 0, id);

    FEDTrailer dtFEDTrailer(fedRawData.data() + (fedRawData.size() - 8));
    dtFEDTrailer.set(fedRawData.data() + (fedRawData.size() - 8),
                     fedRawData.size() / 8,
                     evf::compute_crc(fedRawData.data(), fedRawData.size()),
                     0,
                     0);
  }
  // Put the raw data to the event
  e.put(std::move(fed_buffers));
}