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 90 91 92 93 94 95 96 97 98 99 100 101 102
#include "DataFormats/FEDRawData/interface/FEDRawDataCollection.h"
#include "DataFormats/FEDRawData/interface/FEDRawData.h"
#include "DataFormats/FEDRawData/interface/FEDNumbering.h"

#include "DataFormats/EcalDigi/interface/ESDataFrame.h"

#include "EventFilter/ESDigiToRaw/interface/ESDigiToRaw.h"
#include "EventFilter/ESDigiToRaw/src/ESDataFormatterV1_1.h"
#include "EventFilter/ESDigiToRaw/src/ESDataFormatterV4.h"

using namespace std;
using namespace edm;

ESDigiToRaw::ESDigiToRaw(const edm::ParameterSet& ps)
    : ESDataFormatter_(nullptr),
      label_(ps.getParameter<string>("Label")),
      instanceName_(ps.getParameter<string>("InstanceES")),
      ESDigiToken_(consumes<ESDigiCollection>(edm::InputTag(label_, instanceName_))),
      lookup_(ps.getUntrackedParameter<FileInPath>("LookupTable")),
      debug_(ps.getUntrackedParameter<bool>("debugMode", false)),
      formatMajor_(ps.getUntrackedParameter<int>("formatMajor", 4)),
      formatMinor_(ps.getUntrackedParameter<int>("formatMinor", 1)) {
  if (formatMajor_ == 4)
    ESDataFormatter_ = new ESDataFormatterV4(ps);
  else
    ESDataFormatter_ = new ESDataFormatterV1_1(ps);

  produces<FEDRawDataCollection>();
  // initialize look-up table
  for (int i = 0; i < 2; ++i)
    for (int j = 0; j < 2; ++j)
      for (int k = 0; k < 40; ++k)
        for (int m = 0; m < 40; m++)
          fedId_[i][j][k][m] = -1;

  // read in look-up table
  int nLines, iz, ip, ix, iy, fed, kchip, pace, bundle, fiber, optorx;
  ifstream file;
  file.open(lookup_.fullPath().c_str());
  if (file.is_open()) {
    file >> nLines;
    for (int i = 0; i < nLines; ++i) {
      file >> iz >> ip >> ix >> iy >> fed >> kchip >> pace >> bundle >> fiber >> optorx;
      fedId_[(3 - iz) / 2 - 1][ip - 1][ix - 1][iy - 1] = fed;
    }
  } else {
    cout << "[ESDigiToRaw] Look up table file can not be found in " << lookup_.fullPath().c_str() << endl;
  }

  file.close();
}

ESDigiToRaw::~ESDigiToRaw() {
  if (ESDataFormatter_)
    delete ESDataFormatter_;
}

void ESDigiToRaw::produce(edm::StreamID, edm::Event& ev, const edm::EventSetup& es) const {
  ESDataFormatter::Meta_Data meta_data;
  meta_data.lv1 = ev.id().event();
  meta_data.run_number = ev.id().run();
  meta_data.orbit_number = meta_data.lv1 / LHC_BX_RANGE;
  meta_data.bx = (meta_data.lv1 % LHC_BX_RANGE);

  meta_data.kchip_ec = (meta_data.lv1 % KCHIP_EC_RANGE);
  meta_data.kchip_bc = (meta_data.lv1 % KCHIP_BC_RANGE);

  edm::Handle<ESDigiCollection> digis;
  ev.getByToken(ESDigiToken_, digis);

  int ifed;
  ESDataFormatter::Digis Digis;
  Digis.clear();

  for (ESDigiCollection::const_iterator it = digis->begin(); it != digis->end(); ++it) {
    const ESDataFrame& df = *it;
    const ESDetId& detId = it->id();

    ifed = fedId_[(3 - detId.zside()) / 2 - 1][detId.plane() - 1][detId.six() - 1][detId.siy() - 1];
    if (ifed < 0)
      continue;

    Digis[ifed].push_back(df);
  }

  auto productRawData = std::make_unique<FEDRawDataCollection>();

  ESDataFormatter::Digis::const_iterator itfed;
  for (itfed = Digis.begin(); itfed != Digis.end(); ++itfed) {
    int fId = (*itfed).first;

    FEDRawData& fedRawData = productRawData->FEDData(fId);
    ESDataFormatter_->DigiToRaw(fId, Digis, fedRawData, meta_data);

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

  ev.put(std::move(productRawData));

  return;
}