File indexing completed on 2024-04-06 11:58:43
0001
0002 #include <memory>
0003 #include <string>
0004
0005 #include "FWCore/Framework/interface/Frameworkfwd.h"
0006 #include "FWCore/Framework/interface/global/EDProducer.h"
0007 #include "FWCore/Framework/interface/Event.h"
0008 #include "FWCore/Framework/interface/EventSetup.h"
0009 #include "FWCore/Framework/interface/MakerMacros.h"
0010 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0011 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0012 #include "FWCore/ParameterSet/interface/ConfigurationDescriptions.h"
0013
0014 #include "DataFormats/DetId/interface/DetId.h"
0015 #include "DataFormats/EgammaCandidates/interface/Photon.h"
0016 #include "DataFormats/EgammaCandidates/interface/PhotonFwd.h"
0017 #include "DataFormats/JetReco/interface/PFJetCollection.h"
0018 #include "DataFormats/HcalRecHit/interface/HBHERecHit.h"
0019 #include "DataFormats/HcalRecHit/interface/HFRecHit.h"
0020 #include "DataFormats/HcalRecHit/interface/HORecHit.h"
0021 #include "DataFormats/Common/interface/ValueMap.h"
0022 #include "DataFormats/Common/interface/TriggerResults.h"
0023 #include "DataFormats/HLTReco/interface/TriggerEvent.h"
0024 #include "DataFormats/HLTReco/interface/TriggerObject.h"
0025 #include "DataFormats/ParticleFlowCandidate/interface/PFCandidate.h"
0026 #include "DataFormats/METReco/interface/PFMET.h"
0027 #include "DataFormats/METReco/interface/PFMETCollection.h"
0028 #include "DataFormats/VertexReco/interface/Vertex.h"
0029 #include "DataFormats/VertexReco/interface/VertexFwd.h"
0030 #include "DataFormats/GeometryVector/interface/GlobalPoint.h"
0031
0032 #include "Geometry/CaloGeometry/interface/CaloGeometry.h"
0033 #include "Geometry/Records/interface/CaloGeometryRecord.h"
0034 #include <iostream>
0035
0036
0037
0038
0039
0040 class AlCaGammaJetProducer : public edm::global::EDProducer<> {
0041 public:
0042 explicit AlCaGammaJetProducer(const edm::ParameterSet&);
0043 ~AlCaGammaJetProducer() override = default;
0044 void produce(edm::StreamID, edm::Event&, const edm::EventSetup&) const override;
0045 static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
0046
0047 private:
0048 bool select(const reco::PhotonCollection&, const reco::PFJetCollection&) const;
0049
0050
0051
0052 edm::InputTag labelPhoton_, labelPFJet_, labelHBHE_, labelHF_, labelHO_, labelTrigger_, labelPFCandidate_,
0053 labelVertex_, labelPFMET_, labelGsfEle_, labelRho_, labelConv_, labelBeamSpot_, labelLoosePhot_, labelTightPhot_;
0054 double minPtJet_, minPtPhoton_;
0055
0056 edm::EDGetTokenT<reco::PhotonCollection> tok_Photon_;
0057 edm::EDGetTokenT<reco::PFJetCollection> tok_PFJet_;
0058 edm::EDGetTokenT<edm::SortedCollection<HBHERecHit, edm::StrictWeakOrdering<HBHERecHit>>> tok_HBHE_;
0059 edm::EDGetTokenT<edm::SortedCollection<HFRecHit, edm::StrictWeakOrdering<HFRecHit>>> tok_HF_;
0060 edm::EDGetTokenT<edm::SortedCollection<HORecHit, edm::StrictWeakOrdering<HORecHit>>> tok_HO_;
0061 edm::EDGetTokenT<edm::TriggerResults> tok_TrigRes_;
0062 edm::EDGetTokenT<reco::PFCandidateCollection> tok_PFCand_;
0063 edm::EDGetTokenT<reco::VertexCollection> tok_Vertex_;
0064 edm::EDGetTokenT<reco::PFMETCollection> tok_PFMET_;
0065 edm::EDGetTokenT<reco::GsfElectronCollection> tok_GsfElec_;
0066 edm::EDGetTokenT<double> tok_Rho_;
0067 edm::EDGetTokenT<reco::ConversionCollection> tok_Conv_;
0068 edm::EDGetTokenT<reco::BeamSpot> tok_BS_;
0069 edm::EDGetTokenT<edm::ValueMap<Bool_t>> tok_loosePhoton_;
0070 edm::EDGetTokenT<edm::ValueMap<Bool_t>> tok_tightPhoton_;
0071
0072 edm::EDPutTokenT<reco::PhotonCollection> put_photon_;
0073 edm::EDPutTokenT<reco::PFJetCollection> put_pfJet_;
0074 edm::EDPutTokenT<edm::SortedCollection<HBHERecHit, edm::StrictWeakOrdering<HBHERecHit>>> put_hbhe_;
0075 edm::EDPutTokenT<edm::SortedCollection<HFRecHit, edm::StrictWeakOrdering<HFRecHit>>> put_hf_;
0076 edm::EDPutTokenT<edm::SortedCollection<HORecHit, edm::StrictWeakOrdering<HORecHit>>> put_ho_;
0077 edm::EDPutTokenT<edm::TriggerResults> put_trigger_;
0078 edm::EDPutTokenT<std::vector<Bool_t>> put_loosePhot_;
0079 edm::EDPutTokenT<std::vector<Bool_t>> put_tightPhot_;
0080 edm::EDPutTokenT<double> put_rho_;
0081 edm::EDPutTokenT<reco::PFCandidateCollection> put_pfCandidate_;
0082 edm::EDPutTokenT<reco::VertexCollection> put_vertex_;
0083 edm::EDPutTokenT<reco::PFMETCollection> put_pfMET_;
0084 edm::EDPutTokenT<reco::GsfElectronCollection> put_gsfEle_;
0085 edm::EDPutTokenT<reco::ConversionCollection> put_conv_;
0086 edm::EDPutTokenT<reco::BeamSpot> put_beamSpot_;
0087 };
0088
0089 AlCaGammaJetProducer::AlCaGammaJetProducer(const edm::ParameterSet& iConfig) {
0090
0091 labelPhoton_ = iConfig.getParameter<edm::InputTag>("PhoInput");
0092 labelPFJet_ = iConfig.getParameter<edm::InputTag>("PFjetInput");
0093 labelHBHE_ = iConfig.getParameter<edm::InputTag>("HBHEInput");
0094 labelHF_ = iConfig.getParameter<edm::InputTag>("HFInput");
0095 labelHO_ = iConfig.getParameter<edm::InputTag>("HOInput");
0096 labelTrigger_ = iConfig.getParameter<edm::InputTag>("TriggerResults");
0097 labelPFCandidate_ = iConfig.getParameter<edm::InputTag>("particleFlowInput");
0098 labelVertex_ = iConfig.getParameter<edm::InputTag>("VertexInput");
0099 labelPFMET_ = iConfig.getParameter<edm::InputTag>("METInput");
0100 labelGsfEle_ = iConfig.getParameter<edm::InputTag>("gsfeleInput");
0101 labelRho_ = iConfig.getParameter<edm::InputTag>("rhoInput");
0102 labelConv_ = iConfig.getParameter<edm::InputTag>("ConversionsInput");
0103 labelBeamSpot_ = iConfig.getParameter<edm::InputTag>("BeamSpotInput");
0104 labelLoosePhot_ = iConfig.getParameter<edm::InputTag>("PhoLoose");
0105 labelTightPhot_ = iConfig.getParameter<edm::InputTag>("PhoTight");
0106 minPtJet_ = iConfig.getParameter<double>("MinPtJet");
0107 minPtPhoton_ = iConfig.getParameter<double>("MinPtPhoton");
0108
0109 tok_Photon_ = consumes<reco::PhotonCollection>(labelPhoton_);
0110 tok_PFJet_ = consumes<reco::PFJetCollection>(labelPFJet_);
0111 tok_HBHE_ = consumes<edm::SortedCollection<HBHERecHit, edm::StrictWeakOrdering<HBHERecHit>>>(labelHBHE_);
0112 tok_HF_ = consumes<edm::SortedCollection<HFRecHit, edm::StrictWeakOrdering<HFRecHit>>>(labelHF_);
0113 tok_HO_ = consumes<edm::SortedCollection<HORecHit, edm::StrictWeakOrdering<HORecHit>>>(labelHO_);
0114 tok_TrigRes_ = consumes<edm::TriggerResults>(labelTrigger_);
0115 tok_PFCand_ = consumes<reco::PFCandidateCollection>(labelPFCandidate_);
0116 tok_Vertex_ = consumes<reco::VertexCollection>(labelVertex_);
0117 tok_PFMET_ = consumes<reco::PFMETCollection>(labelPFMET_);
0118 tok_loosePhoton_ = consumes<edm::ValueMap<Bool_t>>(labelLoosePhot_);
0119 tok_tightPhoton_ = consumes<edm::ValueMap<Bool_t>>(labelTightPhot_);
0120 tok_GsfElec_ = consumes<reco::GsfElectronCollection>(labelGsfEle_);
0121 tok_Rho_ = consumes<double>(labelRho_);
0122 tok_Conv_ = consumes<reco::ConversionCollection>(labelConv_);
0123 tok_BS_ = consumes<reco::BeamSpot>(labelBeamSpot_);
0124
0125
0126 put_photon_ = produces<reco::PhotonCollection>(labelPhoton_.encode());
0127 put_pfJet_ = produces<reco::PFJetCollection>(labelPFJet_.encode());
0128 put_hbhe_ = produces<edm::SortedCollection<HBHERecHit, edm::StrictWeakOrdering<HBHERecHit>>>(labelHBHE_.encode());
0129 put_hf_ = produces<edm::SortedCollection<HFRecHit, edm::StrictWeakOrdering<HFRecHit>>>(labelHF_.encode());
0130 put_ho_ = produces<edm::SortedCollection<HORecHit, edm::StrictWeakOrdering<HORecHit>>>(labelHO_.encode());
0131 put_trigger_ = produces<edm::TriggerResults>(labelTrigger_.encode());
0132 put_loosePhot_ = produces<std::vector<Bool_t>>(labelLoosePhot_.encode());
0133 put_tightPhot_ = produces<std::vector<Bool_t>>(labelTightPhot_.encode());
0134 put_rho_ = produces<double>(labelRho_.encode());
0135 put_pfCandidate_ = produces<reco::PFCandidateCollection>(labelPFCandidate_.encode());
0136 put_vertex_ = produces<reco::VertexCollection>(labelVertex_.encode());
0137 put_pfMET_ = produces<reco::PFMETCollection>(labelPFMET_.encode());
0138 put_gsfEle_ = produces<reco::GsfElectronCollection>(labelGsfEle_.encode());
0139 put_conv_ = produces<reco::ConversionCollection>(labelConv_.encode());
0140 put_beamSpot_ = produces<reco::BeamSpot>(labelBeamSpot_.encode());
0141 }
0142
0143 bool AlCaGammaJetProducer::select(const reco::PhotonCollection& ph, const reco::PFJetCollection& jt) const {
0144
0145 if (ph.empty())
0146 return false;
0147 bool ok(false);
0148 for (reco::PFJetCollection::const_iterator itr = jt.begin(); itr != jt.end(); ++itr) {
0149 if (itr->pt() >= minPtJet_) {
0150 ok = true;
0151 break;
0152 }
0153 }
0154 if (!ok)
0155 return ok;
0156 for (reco::PhotonCollection::const_iterator itr = ph.begin(); itr != ph.end(); ++itr) {
0157 if (itr->pt() >= minPtPhoton_)
0158 return ok;
0159 }
0160 return false;
0161 }
0162
0163
0164 void AlCaGammaJetProducer::produce(edm::StreamID, edm::Event& iEvent, const edm::EventSetup&) const {
0165
0166 auto const& phoHandle = iEvent.getHandle(tok_Photon_);
0167 if (!phoHandle.isValid()) {
0168 edm::LogWarning("AlCaGammaJet") << "AlCaGammaJetProducer: Error! can't get the product " << labelPhoton_;
0169 return;
0170 }
0171 const reco::PhotonCollection& photon = *(phoHandle.product());
0172
0173 auto const& pfjet = iEvent.getHandle(tok_PFJet_);
0174 if (!pfjet.isValid()) {
0175 edm::LogWarning("AlCaGammaJet") << "AlCaGammaJetProducer: Error! can't get product " << labelPFJet_;
0176 return;
0177 }
0178 const reco::PFJetCollection& pfjets = *(pfjet.product());
0179
0180 auto const& pfc = iEvent.getHandle(tok_PFCand_);
0181 if (!pfc.isValid()) {
0182 edm::LogWarning("AlCaGammaJet") << "AlCaGammaJetProducer: Error! can't get product " << labelPFCandidate_;
0183 return;
0184 }
0185 const reco::PFCandidateCollection& pfcand = *(pfc.product());
0186
0187 auto const& vt = iEvent.getHandle(tok_Vertex_);
0188 if (!vt.isValid()) {
0189 edm::LogWarning("AlCaGammaJet") << "AlCaGammaJetProducer: Error! can't get product " << labelVertex_;
0190 return;
0191 }
0192 const reco::VertexCollection& vtx = *(vt.product());
0193
0194 auto const& pfmt = iEvent.getHandle(tok_PFMET_);
0195 if (!pfmt.isValid()) {
0196 edm::LogWarning("AlCaGammaJet") << "AlCaGammaJetProducer: Error! can't get product " << labelPFMET_;
0197 return;
0198 }
0199 const reco::PFMETCollection& pfmet = *(pfmt.product());
0200
0201 auto const& hbhe = iEvent.getHandle(tok_HBHE_);
0202 if (!hbhe.isValid()) {
0203 edm::LogWarning("AlCaGammaJet") << "AlCaGammaJetProducer: Error! can't get product " << labelHBHE_;
0204 return;
0205 }
0206 const edm::SortedCollection<HBHERecHit, edm::StrictWeakOrdering<HBHERecHit>>& Hithbhe = *(hbhe.product());
0207
0208 auto const& ho = iEvent.getHandle(tok_HO_);
0209 if (!ho.isValid()) {
0210 edm::LogWarning("AlCaGammaJet") << "AlCaGammaJetProducer: Error! can't get product " << labelHO_;
0211 return;
0212 }
0213 const edm::SortedCollection<HORecHit, edm::StrictWeakOrdering<HORecHit>>& Hitho = *(ho.product());
0214
0215 auto const& hf = iEvent.getHandle(tok_HF_);
0216 if (!hf.isValid()) {
0217 edm::LogWarning("AlCaGammaJet") << "AlCaGammaJetProducer: Error! can't get product " << labelHF_;
0218 return;
0219 }
0220 const edm::SortedCollection<HFRecHit, edm::StrictWeakOrdering<HFRecHit>>& Hithf = *(hf.product());
0221
0222 auto const& trig = iEvent.getHandle(tok_TrigRes_);
0223 if (!trig.isValid()) {
0224 edm::LogWarning("AlCaGammaJet") << "AlCaGammaJetProducer: Error! can't get product " << labelTrigger_;
0225 return;
0226 }
0227 const edm::TriggerResults& trigres = *(trig.product());
0228
0229 auto const& rh = iEvent.getHandle(tok_Rho_);
0230 if (!rh.isValid()) {
0231 edm::LogWarning("AlCaGammaJet") << "AlCaGammaJetProducer: Error! can't get product " << labelRho_;
0232 return;
0233 }
0234 const double rho_val = *(rh.product());
0235
0236 auto const& gsf = iEvent.getHandle(tok_GsfElec_);
0237 if (!gsf.isValid()) {
0238 edm::LogWarning("AlCaGammaJet") << "AlCaGammaJetProducer: Error! can't get product " << labelGsfEle_;
0239 return;
0240 }
0241 const reco::GsfElectronCollection& gsfele = *(gsf.product());
0242
0243 auto const& con = iEvent.getHandle(tok_Conv_);
0244 if (!con.isValid()) {
0245 edm::LogWarning("AlCaGammaJet") << "AlCaGammaJetProducer: Error! can't get product " << labelConv_;
0246 return;
0247 }
0248 const reco::ConversionCollection& conv = *(con.product());
0249
0250 auto const& bs = iEvent.getHandle(tok_BS_);
0251 if (!bs.isValid()) {
0252 edm::LogWarning("AlCaGammaJet") << "AlCaGammaJetProducer: Error! can't get product " << labelBeamSpot_;
0253 return;
0254 }
0255 const reco::BeamSpot& beam = *(bs.product());
0256
0257
0258
0259 reco::BeamSpot miniBeamSpotCollection(
0260 beam.position(), beam.sigmaZ(), beam.dxdz(), beam.dydz(), beam.BeamWidthX(), beam.covariance(), beam.type());
0261
0262 std::vector<Bool_t> miniLoosePhoton{};
0263 std::vector<Bool_t> miniTightPhoton{};
0264
0265
0266 bool accept = select(photon, pfjets);
0267 if (accept) {
0268 iEvent.emplace(put_photon_, photon);
0269 iEvent.emplace(put_pfJet_, pfjets);
0270 iEvent.emplace(put_hbhe_, Hithbhe);
0271 iEvent.emplace(put_hf_, Hithf);
0272 iEvent.emplace(put_ho_, Hitho);
0273 iEvent.emplace(put_trigger_, trigres);
0274 iEvent.emplace(put_pfCandidate_, pfcand);
0275 iEvent.emplace(put_vertex_, vtx);
0276 iEvent.emplace(put_pfMET_, pfmet);
0277 iEvent.emplace(put_gsfEle_, gsfele);
0278 iEvent.emplace(put_rho_, rho_val);
0279 iEvent.emplace(put_conv_, conv);
0280
0281 auto const& loosePhotonQual = iEvent.getHandle(tok_loosePhoton_);
0282 auto const& tightPhotonQual = iEvent.getHandle(tok_tightPhoton_);
0283 if (loosePhotonQual.isValid() && tightPhotonQual.isValid()) {
0284 miniLoosePhoton.reserve(photon.size());
0285 miniTightPhoton.reserve(photon.size());
0286 for (int iPho = 0; iPho < int(photon.size()); ++iPho) {
0287 edm::Ref<reco::PhotonCollection> photonRef(phoHandle, iPho);
0288 if (!photonRef) {
0289 edm::LogVerbatim("AlCaGammaJet") << "failed ref";
0290 miniLoosePhoton.push_back(-1);
0291 miniTightPhoton.push_back(-1);
0292 } else {
0293 miniLoosePhoton.push_back((*loosePhotonQual)[photonRef]);
0294 miniTightPhoton.push_back((*tightPhotonQual)[photonRef]);
0295 }
0296 }
0297 }
0298 } else {
0299 iEvent.emplace(put_photon_, reco::PhotonCollection{});
0300 iEvent.emplace(put_pfJet_, reco::PFJetCollection{});
0301 iEvent.emplace(put_hbhe_, edm::SortedCollection<HBHERecHit, edm::StrictWeakOrdering<HBHERecHit>>{});
0302 iEvent.emplace(put_hf_, edm::SortedCollection<HFRecHit, edm::StrictWeakOrdering<HFRecHit>>{});
0303 iEvent.emplace(put_ho_, edm::SortedCollection<HORecHit, edm::StrictWeakOrdering<HORecHit>>{});
0304 iEvent.emplace(put_trigger_, edm::TriggerResults{});
0305 iEvent.emplace(put_pfCandidate_, reco::PFCandidateCollection{});
0306 iEvent.emplace(put_vertex_, reco::VertexCollection{});
0307 iEvent.emplace(put_pfMET_, reco::PFMETCollection{});
0308 iEvent.emplace(put_gsfEle_, reco::GsfElectronCollection{});
0309 iEvent.emplace(put_rho_, double{});
0310 iEvent.emplace(put_conv_, reco::ConversionCollection{});
0311 }
0312
0313
0314 iEvent.emplace(put_beamSpot_, std::move(miniBeamSpotCollection));
0315 iEvent.emplace(put_loosePhot_, std::move(miniLoosePhoton));
0316 iEvent.emplace(put_tightPhot_, std::move(miniTightPhoton));
0317
0318 return;
0319 }
0320
0321 void AlCaGammaJetProducer::fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
0322 edm::ParameterSetDescription desc;
0323 desc.add<edm::InputTag>("PhoInput", edm::InputTag("gedPhotons"));
0324 desc.add<edm::InputTag>("PFjetInput", edm::InputTag("ak4PFJetsCHS"));
0325 desc.add<edm::InputTag>("HBHEInput", edm::InputTag("hbhereco"));
0326 desc.add<edm::InputTag>("HFInput", edm::InputTag("hfreco"));
0327 desc.add<edm::InputTag>("HOInput", edm::InputTag("horeco"));
0328 desc.add<edm::InputTag>("METInput", edm::InputTag("pfMet"));
0329 desc.add<edm::InputTag>("TriggerResults", edm::InputTag("TriggerResults::HLT"));
0330 desc.add<edm::InputTag>("gsfeleInput", edm::InputTag("gedGsfElectrons"));
0331 desc.add<edm::InputTag>("particleFlowInput", edm::InputTag("particleFlow"));
0332 desc.add<edm::InputTag>("VertexInput", edm::InputTag("offlinePrimaryVertices"));
0333 desc.add<edm::InputTag>("ConversionsInput", edm::InputTag("allConversions"));
0334 desc.add<edm::InputTag>("rhoInput", edm::InputTag("fixedGridRhoFastjetAll"));
0335 desc.add<edm::InputTag>("BeamSpotInput", edm::InputTag("offlineBeamSpot"));
0336 desc.add<edm::InputTag>("PhoLoose", edm::InputTag("PhotonIDProdGED", "PhotonCutBasedIDLoose"));
0337 desc.add<edm::InputTag>("PhoTight", edm::InputTag("PhotonIDProdGED", "PhotonCutBasedIDTight"));
0338 desc.add<double>("MinPtJet", 10.0);
0339 desc.add<double>("MinPtPhoton", 10.0);
0340 descriptions.add("alcaGammaJetProducer", desc);
0341 }
0342
0343 DEFINE_FWK_MODULE(AlCaGammaJetProducer);