SiStripRegFEDSelector

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 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164
// system include files
#include <memory>

// user include files
#include "CalibFormats/SiStripObjects/interface/SiStripRegionCabling.h"
#include "CalibTracker/Records/interface/SiStripRegionCablingRcd.h"
#include "CondFormats/SiStripObjects/interface/FedChannelConnection.h"
#include "DataFormats/FEDRawData/interface/FEDRawDataCollection.h"
#include "DataFormats/FEDRawData/interface/FEDRawData.h"
#include "DataFormats/FEDRawData/interface/FEDNumbering.h"
#include "DataFormats/HcalIsolatedTrack/interface/IsolatedPixelTrackCandidate.h"
#include "DataFormats/HcalIsolatedTrack/interface/IsolatedPixelTrackCandidateFwd.h"
#include "DataFormats/HLTReco/interface/TriggerFilterObjectWithRefs.h"

#include "FWCore/Framework/interface/Frameworkfwd.h"
#include "FWCore/Framework/interface/global/EDProducer.h"
#include "FWCore/Framework/interface/Event.h"
#include "FWCore/MessageLogger/interface/MessageLogger.h"
#include "FWCore/ParameterSet/interface/ParameterSet.h"
#include "FWCore/ParameterSet/interface/ConfigurationDescriptions.h"

class SiStripRegFEDSelector : public edm::global::EDProducer<> {
public:
  SiStripRegFEDSelector(const edm::ParameterSet&);
  ~SiStripRegFEDSelector() override;

  static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);

private:
  void beginJob() override {}
  void produce(edm::StreamID, edm::Event&, const edm::EventSetup&) const override;
  void endJob() override {}

  const edm::EDGetTokenT<trigger::TriggerFilterObjectWithRefs> tok_seed_;
  const edm::EDGetTokenT<FEDRawDataCollection> tok_raw_;
  const edm::ESGetToken<SiStripRegionCabling, SiStripRegionCablingRcd> tok_strip_;
  const double delta_;
};

SiStripRegFEDSelector::SiStripRegFEDSelector(const edm::ParameterSet& iConfig)
    : tok_seed_(consumes<trigger::TriggerFilterObjectWithRefs>(iConfig.getParameter<edm::InputTag>("regSeedLabel"))),
      tok_raw_(consumes<FEDRawDataCollection>(iConfig.getParameter<edm::InputTag>("rawInputLabel"))),
      tok_strip_(esConsumes<SiStripRegionCabling, SiStripRegionCablingRcd>()),
      delta_(iConfig.getParameter<double>("delta")) {
  produces<FEDRawDataCollection>();
}

SiStripRegFEDSelector::~SiStripRegFEDSelector() {}

void SiStripRegFEDSelector::produce(edm::StreamID, edm::Event& iEvent, const edm::EventSetup& iSetup) const {
  auto producedData = std::make_unique<FEDRawDataCollection>();

  const edm::Handle<trigger::TriggerFilterObjectWithRefs>& trigSeedTrks = iEvent.getHandle(tok_seed_);

  std::vector<edm::Ref<reco::IsolatedPixelTrackCandidateCollection> > isoPixTrackRefs;
  trigSeedTrks->getObjects(trigger::TriggerTrack, isoPixTrackRefs);

  const edm::Handle<FEDRawDataCollection>& rawIn = iEvent.getHandle(tok_raw_);

  const SiStripRegionCabling* strip_cabling = &iSetup.getData(tok_strip_);
  std::vector<int> stripFEDVec;

  //get vector of regions
  const SiStripRegionCabling::Cabling& ccab = strip_cabling->getRegionCabling();

  //size of region (eta,phi)
  const std::pair<double, double> regDim = strip_cabling->regionDimensions();

  const SiStripRegionCabling::ElementCabling elcabling;

  bool fedSaved[1000];
  for (int i = 0; i < 1000; i++)
    fedSaved[i] = false;

  //cycle on seeds
  for (uint32_t p = 0; p < isoPixTrackRefs.size(); p++) {
    double etaObj_ = isoPixTrackRefs[p]->track()->eta();
    double phiObj_ = isoPixTrackRefs[p]->track()->phi();

    //cycle on regions
    for (uint32_t i = 0; i < ccab.size(); i++) {
      SiStripRegionCabling::Position pos = strip_cabling->position(i);
      double dphi = fabs(pos.second - phiObj_);
      if (dphi > acos(-1))
        dphi = 2 * acos(-1) - dphi;
      double R = sqrt(pow(pos.first - etaObj_, 2) + dphi * dphi);
      if (R - sqrt(pow(regDim.first / 2, 2) + pow(regDim.second / 2, 2)) > delta_)
        continue;
      //get vector of subdets within region
      const SiStripRegionCabling::RegionCabling regSubdets = ccab[i];
      //cycle on subdets
      for (uint32_t idet = 0; idet < SiStripRegionCabling::ALLSUBDETS; idet++) {
        //get vector of layers within subdet of region
        const SiStripRegionCabling::WedgeCabling& regSubdetLayers = regSubdets[idet];
        for (uint32_t ilayer = 0; ilayer < SiStripRegionCabling::ALLLAYERS; ilayer++) {
          //get map of vectors of feds withing the layer of subdet of region
          const SiStripRegionCabling::ElementCabling& fedVectorMap = regSubdetLayers[ilayer];
          SiStripRegionCabling::ElementCabling::const_iterator it = fedVectorMap.begin();
          for (; it != fedVectorMap.end(); it++) {
            for (uint32_t op = 0; op < (it->second).size(); op++) {
              //get fed id
              int fediid = (it->second)[op].fedId();
              if (!fedSaved[fediid]) {
                stripFEDVec.push_back(fediid);
              }
              fedSaved[fediid] = true;
            }
          }
        }
      }
    }
  }

  /////////////// Copying FEDs:

  const FEDRawDataCollection* rdc = rawIn.product();

  //   if ( ( rawData[i].provenance()->processName() != e.processHistory().rbegin()->processName() ) )
  //       continue ; // skip all raw collections not produced by the current process

  for (int j = 0; j <= FEDNumbering::MAXFEDID; ++j) {
    bool rightFED = false;
    for (uint32_t k = 0; k < stripFEDVec.size(); k++) {
      if (j == stripFEDVec[k]) {
        rightFED = true;
      }
    }
    if (!rightFED)
      continue;
    const FEDRawData& fedData = rdc->FEDData(j);
    size_t size = fedData.size();

    if (size > 0) {
      // this fed has data -- lets copy it
      FEDRawData& fedDataProd = producedData->FEDData(j);
      if (fedDataProd.size() != 0) {
        edm::LogVerbatim("HcalIsoTrack") << " More than one FEDRawDataCollection with data in FED " << j
                                         << " Skipping the 2nd *****";
        continue;
      }
      fedDataProd.resize(size);
      unsigned char* dataProd = fedDataProd.data();
      const unsigned char* data = fedData.data();
      for (unsigned int k = 0; k < size; ++k) {
        dataProd[k] = data[k];
      }
    }
  }

  iEvent.put(std::move(producedData));
}

void SiStripRegFEDSelector::fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
  edm::ParameterSetDescription desc;
  desc.add<edm::InputTag>("regSeedLabel", edm::InputTag("hltIsolPixelTrackFilter"));
  desc.add<edm::InputTag>("rawInputLabel", edm::InputTag("rawDataCollector"));
  desc.add<double>("delta", 1.0);
  descriptions.add("stripFED", desc);
}

#include "FWCore/PluginManager/interface/ModuleDef.h"
#include "FWCore/Framework/interface/MakerMacros.h"

DEFINE_FWK_MODULE(SiStripRegFEDSelector);