File indexing completed on 2023-03-17 11:17:32
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017 #include "FWCore/Framework/interface/global/EDProducer.h"
0018 #include "FWCore/Framework/interface/Event.h"
0019 #include "FWCore/Framework/interface/EventSetup.h"
0020 #include "FWCore/Framework/interface/ConsumesCollector.h"
0021 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0022 #include "FWCore/ParameterSet/interface/ParameterSetDescription.h"
0023 #include "FWCore/ParameterSet/interface/ConfigurationDescriptions.h"
0024 #include "FWCore/Utilities/interface/EDGetToken.h"
0025
0026 #include "DataFormats/BeamSpot/interface/BeamSpot.h"
0027 #include "DataFormats/VertexReco/interface/Vertex.h"
0028 #include "DataFormats/EgammaReco/interface/SuperClusterFwd.h"
0029 #include "DataFormats/EgammaReco/interface/SuperCluster.h"
0030 #include "DataFormats/EgammaReco/interface/ElectronSeed.h"
0031 #include "DataFormats/EgammaReco/interface/ElectronSeedFwd.h"
0032 #include "DataFormats/TrajectorySeed/interface/TrajectorySeedCollection.h"
0033 #include "DataFormats/TrackerCommon/interface/TrackerTopology.h"
0034 #include "Geometry/Records/interface/TrackerTopologyRcd.h"
0035
0036 #include "RecoEgamma/EgammaElectronAlgos/interface/TrajSeedMatcher.h"
0037
0038 class ElectronNHitSeedProducer : public edm::global::EDProducer<> {
0039 public:
0040 explicit ElectronNHitSeedProducer(const edm::ParameterSet&);
0041
0042 void produce(edm::StreamID, edm::Event&, const edm::EventSetup&) const final;
0043
0044 static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
0045
0046 private:
0047 const TrajSeedMatcher::Configuration matcherConfiguration_;
0048
0049 std::vector<edm::EDGetTokenT<std::vector<reco::SuperClusterRef>>> superClustersTokens_;
0050 const edm::EDGetTokenT<TrajectorySeedCollection> initialSeedsToken_;
0051 const edm::EDGetTokenT<std::vector<reco::Vertex>> verticesToken_;
0052 const edm::EDGetTokenT<reco::BeamSpot> beamSpotToken_;
0053 const edm::EDGetTokenT<MeasurementTrackerEvent> measTkEvtToken_;
0054 const edm::EDPutTokenT<reco::ElectronSeedCollection> putToken_;
0055 const edm::ESGetToken<TrackerTopology, TrackerTopologyRcd> trackerTopologyToken_;
0056 };
0057
0058 namespace {
0059 int getLayerOrDiskNr(DetId detId, const TrackerTopology& trackerTopo) {
0060 if (detId.subdetId() == PixelSubdetector::PixelBarrel) {
0061 return trackerTopo.pxbLayer(detId);
0062 } else if (detId.subdetId() == PixelSubdetector::PixelEndcap) {
0063 return trackerTopo.pxfDisk(detId);
0064 } else
0065 return -1;
0066 }
0067
0068 reco::ElectronSeed::PMVars makeSeedPixelVar(const TrajSeedMatcher::MatchInfo& matchInfo,
0069 const TrackerTopology& trackerTopo) {
0070 int layerOrDisk = getLayerOrDiskNr(matchInfo.detId, trackerTopo);
0071 reco::ElectronSeed::PMVars pmVars;
0072 pmVars.setDet(matchInfo.detId, layerOrDisk);
0073 pmVars.setDPhi(matchInfo.dPhiPos, matchInfo.dPhiNeg);
0074 pmVars.setDRZ(matchInfo.dRZPos, matchInfo.dRZNeg);
0075
0076 return pmVars;
0077 }
0078
0079 }
0080
0081 ElectronNHitSeedProducer::ElectronNHitSeedProducer(const edm::ParameterSet& pset)
0082 : matcherConfiguration_(pset.getParameter<edm::ParameterSet>("matcherConfig"), consumesCollector()),
0083 initialSeedsToken_(consumes(pset.getParameter<edm::InputTag>("initialSeeds"))),
0084 verticesToken_(consumes(pset.getParameter<edm::InputTag>("vertices"))),
0085 beamSpotToken_(consumes(pset.getParameter<edm::InputTag>("beamSpot"))),
0086 measTkEvtToken_(consumes(pset.getParameter<edm::InputTag>("measTkEvt"))),
0087 putToken_{produces<reco::ElectronSeedCollection>()},
0088 trackerTopologyToken_{esConsumes()} {
0089 for (const auto& scTag : pset.getParameter<std::vector<edm::InputTag>>("superClusters")) {
0090 superClustersTokens_.emplace_back(consumes(scTag));
0091 }
0092 }
0093
0094 void ElectronNHitSeedProducer::fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
0095 edm::ParameterSetDescription desc;
0096 desc.add<edm::InputTag>("initialSeeds", {"hltElePixelSeedsCombined"});
0097 desc.add<edm::InputTag>("vertices", {});
0098 desc.add<edm::InputTag>("beamSpot", {"hltOnlineBeamSpot"});
0099 desc.add<edm::InputTag>("measTkEvt", {"hltSiStripClusters"});
0100 desc.add<std::vector<edm::InputTag>>("superClusters", {{"hltEgammaSuperClustersToPixelMatch"}});
0101 desc.add<edm::ParameterSetDescription>("matcherConfig", TrajSeedMatcher::makePSetDescription());
0102
0103 descriptions.add("electronNHitSeedProducer", desc);
0104 }
0105
0106 void ElectronNHitSeedProducer::produce(edm::StreamID, edm::Event& iEvent, const edm::EventSetup& iSetup) const {
0107 auto const& trackerTopology = iSetup.getData(trackerTopologyToken_);
0108
0109 reco::ElectronSeedCollection eleSeeds{};
0110
0111 TrajSeedMatcher matcher{iEvent.get(initialSeedsToken_),
0112 iEvent.get(beamSpotToken_).position(),
0113 matcherConfiguration_,
0114 iSetup,
0115 iEvent.get(measTkEvtToken_)};
0116
0117
0118 for (const auto& superClustersToken : superClustersTokens_) {
0119 for (auto& superClusRef : iEvent.get(superClustersToken)) {
0120
0121
0122 GlobalPoint caloPosition(GlobalPoint::Polar(superClusRef->seed()->position().theta(),
0123 superClusRef->position().phi(),
0124 superClusRef->position().r()));
0125
0126 for (auto const& matchedSeed : matcher(caloPosition, superClusRef->energy())) {
0127 reco::ElectronSeed eleSeed(matchedSeed.seed);
0128 reco::ElectronSeed::CaloClusterRef caloClusRef(superClusRef);
0129 eleSeed.setCaloCluster(caloClusRef);
0130 eleSeed.setNrLayersAlongTraj(matchedSeed.nrValidLayers);
0131 for (auto const& matchInfo : matchedSeed.matchInfos) {
0132 eleSeed.addHitInfo(makeSeedPixelVar(matchInfo, trackerTopology));
0133 }
0134 eleSeeds.emplace_back(eleSeed);
0135 }
0136 }
0137 }
0138 iEvent.emplace(putToken_, std::move(eleSeeds));
0139 }
0140
0141 #include "FWCore/Framework/interface/MakerMacros.h"
0142 DEFINE_FWK_MODULE(ElectronNHitSeedProducer);