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 83 84 85 86 87 88 89
#include "EventFilter/ESRawToDigi/interface/ESRawToDigi.h"

#include "FWCore/ParameterSet/interface/ConfigurationDescriptions.h"
#include "FWCore/ParameterSet/interface/ParameterSetDescription.h"

#include "DataFormats/FEDRawData/interface/FEDRawData.h"
#include "DataFormats/FEDRawData/interface/FEDNumbering.h"
#include "DataFormats/FEDRawData/interface/FEDRawDataCollection.h"
#include "DataFormats/EcalDigi/interface/EcalDigiCollections.h"
#include "DataFormats/EcalRawData/interface/ESDCCHeaderBlock.h"
#include "DataFormats/EcalRawData/interface/ESKCHIPBlock.h"

#include <iostream>

ESRawToDigi::ESRawToDigi(edm::ParameterSet const& ps) {
  edm::InputTag sourceTag = ps.getParameter<edm::InputTag>("sourceTag");
  ESdigiCollection_ = ps.getParameter<std::string>("ESdigiCollection");
  regional_ = ps.getUntrackedParameter<bool>("DoRegional", false);
  edm::InputTag fedsListLabel =
      ps.getUntrackedParameter<edm::InputTag>("ESFedsListLabel", edm::InputTag(":esfedslist"));
  debug_ = ps.getUntrackedParameter<bool>("debugMode", false);

  ESUnpacker_ = new ESUnpacker(ps);

  produces<ESRawDataCollection>();
  produces<ESLocalRawDataCollection>();
  produces<ESDigiCollection>();
  dataToken_ = consumes<FEDRawDataCollection>(sourceTag);
  if (regional_) {
    fedsToken_ = consumes<ESListOfFEDS>(fedsListLabel);
  }
}

ESRawToDigi::~ESRawToDigi() { delete ESUnpacker_; }

void ESRawToDigi::fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
  edm::ParameterSetDescription desc;
  desc.add<edm::InputTag>("sourceTag", edm::InputTag("rawDataCollector"));
  desc.addUntracked<bool>("debugMode", false);
  desc.add<std::string>("InstanceES", "");
  desc.add<edm::FileInPath>("LookupTable", edm::FileInPath("EventFilter/ESDigiToRaw/data/ES_lookup_table.dat"));
  desc.add<std::string>("ESdigiCollection", "");
  descriptions.add("esRawToDigi", desc);
}

void ESRawToDigi::produce(edm::Event& e, const edm::EventSetup& es) {
  // Input
  edm::Handle<FEDRawDataCollection> rawdata;
  e.getByToken(dataToken_, rawdata);
  if (!rawdata.isValid()) {
    LogDebug("") << "ESRawToDigi : Error! can't get rawdata!" << std::endl;
  }

  std::vector<int> esFeds_to_unpack;
  if (regional_) {
    edm::Handle<ESListOfFEDS> fedslist;
    e.getByToken(fedsToken_, fedslist);
    esFeds_to_unpack = fedslist->GetList();
  }

  // Output
  auto productDCC = std::make_unique<ESRawDataCollection>();
  auto productKCHIP = std::make_unique<ESLocalRawDataCollection>();
  auto productDigis = std::make_unique<ESDigiCollection>();

  ESDigiCollection digis;

  if (regional_) {
    for (unsigned int i = 0; i < esFeds_to_unpack.size(); ++i) {
      const FEDRawData& fedRawData = rawdata->FEDData(esFeds_to_unpack[i]);
      ESUnpacker_->interpretRawData(esFeds_to_unpack[i], fedRawData, *productDCC, *productKCHIP, *productDigis);

      if (debug_)
        std::cout << "FED : " << esFeds_to_unpack[i] << " Data size : " << fedRawData.size() << " (Bytes)" << std::endl;
    }
  } else {
    for (int fedId = FEDNumbering::MINPreShowerFEDID; fedId <= FEDNumbering::MAXPreShowerFEDID; ++fedId) {
      const FEDRawData& fedRawData = rawdata->FEDData(fedId);
      ESUnpacker_->interpretRawData(fedId, fedRawData, *productDCC, *productKCHIP, *productDigis);

      if (debug_)
        std::cout << "FED : " << fedId << " Data size : " << fedRawData.size() << " (Bytes)" << std::endl;
    }
  }

  e.put(std::move(productDCC));
  e.put(std::move(productKCHIP));
  e.put(std::move(productDigis), ESdigiCollection_);
}