Phase2TrackerCommissioningDigiProducer

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
#include "DataFormats/Common/interface/DetSet.h"
#include "DataFormats/Common/interface/Handle.h"
#include "DataFormats/FEDRawData/interface/FEDRawDataCollection.h"
#include "DataFormats/Phase2TrackerDigi/interface/Phase2TrackerCommissioningDigi.h"
#include "EventFilter/Phase2TrackerRawToDigi/interface/Phase2TrackerFEDBuffer.h"
#include "EventFilter/Phase2TrackerRawToDigi/interface/Phase2TrackerFEDHeader.h"
#include "EventFilter/Phase2TrackerRawToDigi/interface/utils.h"
#include "FWCore/Framework/interface/global/EDProducer.h"
#include "FWCore/Framework/interface/Event.h"
#include "FWCore/Framework/interface/EventSetup.h"
#include "FWCore/MessageLogger/interface/MessageLogger.h"
#include "FWCore/ParameterSet/interface/ParameterSet.h"
#include "FWCore/Utilities/interface/Exception.h"

namespace Phase2Tracker {

  class Phase2TrackerCommissioningDigiProducer : public edm::global::EDProducer<> {
  public:
    /// constructor
    Phase2TrackerCommissioningDigiProducer(const edm::ParameterSet& pset);
    /// default constructor
    ~Phase2TrackerCommissioningDigiProducer() override = default;
    void produce(edm::StreamID, edm::Event& ev, const edm::EventSetup& es) const override;

  private:
    edm::EDGetTokenT<FEDRawDataCollection> token_;
  };
}  // namespace Phase2Tracker

#include "FWCore/Framework/interface/MakerMacros.h"
typedef Phase2Tracker::Phase2TrackerCommissioningDigiProducer Phase2TrackerCommissioningDigiProducer;
DEFINE_FWK_MODULE(Phase2TrackerCommissioningDigiProducer);

using namespace std;

Phase2Tracker::Phase2TrackerCommissioningDigiProducer::Phase2TrackerCommissioningDigiProducer(
    const edm::ParameterSet& pset) {
  produces<edm::DetSet<Phase2TrackerCommissioningDigi>>("ConditionData");
  token_ = consumes<FEDRawDataCollection>(pset.getParameter<edm::InputTag>("ProductLabel"));
}

void Phase2Tracker::Phase2TrackerCommissioningDigiProducer::produce(edm::StreamID,
                                                                    edm::Event& event,
                                                                    const edm::EventSetup& es) const {
  // Retrieve FEDRawData collection
  edm::Handle<FEDRawDataCollection> buffers;
  event.getByToken(token_, buffers);

  // Analyze strip tracker FED buffers in data
  size_t fedIndex;
  for (fedIndex = 0; fedIndex <= Phase2Tracker::CMS_FED_ID_MAX; ++fedIndex) {
    const FEDRawData& fed = buffers->FEDData(fedIndex);
    if (fed.size() != 0 && fedIndex >= Phase2Tracker::FED_ID_MIN && fedIndex <= Phase2Tracker::FED_ID_MAX) {
      // construct buffer
      Phase2Tracker::Phase2TrackerFEDBuffer* buffer = nullptr;
      buffer = new Phase2Tracker::Phase2TrackerFEDBuffer(fed.data(), fed.size());

      // fetch condition data
      std::map<uint32_t, uint32_t> cond_data = buffer->conditionData();
      delete buffer;

      // print cond data for debug
      LogTrace("Phase2TrackerCommissioningDigiProducer") << "--- Condition data debug ---" << std::endl;
      std::map<uint32_t, uint32_t>::const_iterator it;
      for (it = cond_data.begin(); it != cond_data.end(); it++) {
        LogTrace("Phase2TrackerCommissioningDigiProducer")
            << std::hex << "key: " << it->first << std::hex << " value: " << it->second << " (hex) " << std::dec
            << it->second << " (dec) " << std::endl;
      }
      LogTrace("Phase2TrackerCommissioningDigiProducer") << "----------------------------" << std::endl;
      // store it into digis
      edm::DetSet<Phase2TrackerCommissioningDigi>* cond_data_digi =
          new edm::DetSet<Phase2TrackerCommissioningDigi>(fedIndex);
      for (it = cond_data.begin(); it != cond_data.end(); it++) {
        cond_data_digi->push_back(Phase2TrackerCommissioningDigi(it->first, it->second));
      }
      std::unique_ptr<edm::DetSet<Phase2TrackerCommissioningDigi>> cdd(cond_data_digi);
      event.put(std::move(cdd), "ConditionData");
    }
  }
}