File indexing completed on 2023-03-17 11:16:19
0001
0002
0003
0004
0005
0006 #include "FWCore/Framework/interface/Frameworkfwd.h"
0007 #include "FWCore/Framework/interface/stream/EDProducer.h"
0008 #include "FWCore/Framework/interface/Event.h"
0009 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0010
0011 #include "DataFormats/Common/interface/Association.h"
0012 #include "DataFormats/Common/interface/RefToPtr.h"
0013
0014 #include "DataFormats/PatCandidates/interface/Photon.h"
0015
0016 #include "PhysicsTools/PatAlgos/interface/ObjectModifier.h"
0017
0018 #include "DataFormats/ParticleFlowCandidate/interface/PFCandidate.h"
0019 #include "DataFormats/ParticleFlowCandidate/interface/PFCandidateFwd.h"
0020 #include "DataFormats/PatCandidates/interface/PackedCandidate.h"
0021 #include "CommonTools/UtilAlgos/interface/StringCutObjectSelector.h"
0022 #include "RecoEcal/EgammaCoreTools/interface/EcalClusterLazyTools.h"
0023 #include "FWCore/Utilities/interface/isFinite.h"
0024 #include "DataFormats/Common/interface/ValueMap.h"
0025
0026 namespace pat {
0027
0028 class PATPhotonSlimmer : public edm::stream::EDProducer<> {
0029 public:
0030 explicit PATPhotonSlimmer(const edm::ParameterSet& iConfig);
0031 ~PATPhotonSlimmer() override {}
0032
0033 void produce(edm::Event& iEvent, const edm::EventSetup& iSetup) override;
0034 void beginLuminosityBlock(const edm::LuminosityBlock&, const edm::EventSetup&) final;
0035
0036 private:
0037 const edm::EDGetTokenT<edm::View<pat::Photon>> src_;
0038
0039 const StringCutObjectSelector<pat::Photon> dropSuperClusters_, dropBasicClusters_, dropPreshowerClusters_,
0040 dropSeedCluster_, dropRecHits_, dropSaturation_, dropRegressionData_;
0041
0042 const edm::EDGetTokenT<edm::ValueMap<std::vector<reco::PFCandidateRef>>> reco2pf_;
0043 const edm::EDGetTokenT<edm::Association<pat::PackedCandidateCollection>> pf2pc_;
0044 const edm::EDGetTokenT<pat::PackedCandidateCollection> pc_;
0045 const bool linkToPackedPF_;
0046 const StringCutObjectSelector<pat::Photon> saveNonZSClusterShapes_;
0047 const edm::EDGetTokenT<EcalRecHitCollection> reducedBarrelRecHitCollectionToken_,
0048 reducedEndcapRecHitCollectionToken_;
0049 const bool modifyPhoton_;
0050 std::unique_ptr<pat::ObjectModifier<pat::Photon>> photonModifier_;
0051 const EcalClusterLazyTools::ESGetTokens ecalClusterToolsESGetTokens_;
0052 };
0053
0054 }
0055
0056 pat::PATPhotonSlimmer::PATPhotonSlimmer(const edm::ParameterSet& iConfig)
0057 : src_(consumes<edm::View<pat::Photon>>(iConfig.getParameter<edm::InputTag>("src"))),
0058 dropSuperClusters_(iConfig.getParameter<std::string>("dropSuperCluster")),
0059 dropBasicClusters_(iConfig.getParameter<std::string>("dropBasicClusters")),
0060 dropPreshowerClusters_(iConfig.getParameter<std::string>("dropPreshowerClusters")),
0061 dropSeedCluster_(iConfig.getParameter<std::string>("dropSeedCluster")),
0062 dropRecHits_(iConfig.getParameter<std::string>("dropRecHits")),
0063 dropSaturation_(iConfig.getParameter<std::string>("dropSaturation")),
0064 dropRegressionData_(iConfig.getParameter<std::string>("dropRegressionData")),
0065 reco2pf_(mayConsume<edm::ValueMap<std::vector<reco::PFCandidateRef>>>(
0066 iConfig.getParameter<edm::InputTag>("recoToPFMap"))),
0067 pf2pc_(mayConsume<edm::Association<pat::PackedCandidateCollection>>(
0068 iConfig.getParameter<edm::InputTag>("packedPFCandidates"))),
0069 pc_(mayConsume<pat::PackedCandidateCollection>(iConfig.getParameter<edm::InputTag>("packedPFCandidates"))),
0070 linkToPackedPF_(iConfig.getParameter<bool>("linkToPackedPFCandidates")),
0071 saveNonZSClusterShapes_(iConfig.getParameter<std::string>("saveNonZSClusterShapes")),
0072 reducedBarrelRecHitCollectionToken_(
0073 consumes<EcalRecHitCollection>(iConfig.getParameter<edm::InputTag>("reducedBarrelRecHitCollection"))),
0074 reducedEndcapRecHitCollectionToken_(
0075 consumes<EcalRecHitCollection>(iConfig.getParameter<edm::InputTag>("reducedEndcapRecHitCollection"))),
0076 modifyPhoton_(iConfig.getParameter<bool>("modifyPhotons")),
0077 ecalClusterToolsESGetTokens_{consumesCollector()} {
0078 if (modifyPhoton_) {
0079 const edm::ParameterSet& mod_config = iConfig.getParameter<edm::ParameterSet>("modifierConfig");
0080 photonModifier_ = std::make_unique<pat::ObjectModifier<pat::Photon>>(mod_config, consumesCollector());
0081 }
0082
0083 mayConsume<EcalRecHitCollection>(edm::InputTag("reducedEcalRecHitsEB"));
0084 mayConsume<EcalRecHitCollection>(edm::InputTag("reducedEcalRecHitsEE"));
0085
0086 produces<std::vector<pat::Photon>>();
0087 }
0088
0089 void pat::PATPhotonSlimmer::beginLuminosityBlock(const edm::LuminosityBlock&, const edm::EventSetup& iSetup) {}
0090
0091 void pat::PATPhotonSlimmer::produce(edm::Event& iEvent, const edm::EventSetup& iSetup) {
0092 using namespace edm;
0093 using namespace std;
0094
0095 Handle<View<pat::Photon>> src;
0096 iEvent.getByToken(src_, src);
0097
0098 Handle<edm::ValueMap<std::vector<reco::PFCandidateRef>>> reco2pf;
0099 Handle<edm::Association<pat::PackedCandidateCollection>> pf2pc;
0100 Handle<pat::PackedCandidateCollection> pc;
0101 if (linkToPackedPF_) {
0102 iEvent.getByToken(reco2pf_, reco2pf);
0103 iEvent.getByToken(pf2pc_, pf2pc);
0104 iEvent.getByToken(pc_, pc);
0105 }
0106 noZS::EcalClusterLazyTools lazyToolsNoZS(iEvent,
0107 ecalClusterToolsESGetTokens_.get(iSetup),
0108 reducedBarrelRecHitCollectionToken_,
0109 reducedEndcapRecHitCollectionToken_);
0110
0111 auto out = std::make_unique<std::vector<pat::Photon>>();
0112 out->reserve(src->size());
0113
0114 if (modifyPhoton_) {
0115 photonModifier_->setEvent(iEvent);
0116 }
0117 if (modifyPhoton_)
0118 photonModifier_->setEventContent(iSetup);
0119
0120 std::vector<unsigned int> keys;
0121 for (View<pat::Photon>::const_iterator it = src->begin(), ed = src->end(); it != ed; ++it) {
0122 out->push_back(*it);
0123 pat::Photon& photon = out->back();
0124
0125 if (modifyPhoton_) {
0126 photonModifier_->modify(photon);
0127 }
0128
0129 if (dropSuperClusters_(photon)) {
0130 photon.superCluster_.clear();
0131 photon.embeddedSuperCluster_ = false;
0132 }
0133 if (dropBasicClusters_(photon)) {
0134 photon.basicClusters_.clear();
0135 }
0136 if (dropPreshowerClusters_(photon)) {
0137 photon.preshowerClusters_.clear();
0138 }
0139 if (dropSeedCluster_(photon)) {
0140 photon.seedCluster_.clear();
0141 photon.embeddedSeedCluster_ = false;
0142 }
0143 if (dropRecHits_(photon)) {
0144 photon.recHits_ = EcalRecHitCollection();
0145 photon.embeddedRecHits_ = false;
0146 }
0147 if (dropSaturation_(photon)) {
0148 photon.setSaturationInfo(reco::Photon::SaturationInfo());
0149 }
0150 if (dropRegressionData_(photon)) {
0151 photon.setEMax(0);
0152 photon.setE2nd(0);
0153 photon.setE3x3(0);
0154 photon.setETop(0);
0155 photon.setEBottom(0);
0156 photon.setELeft(0);
0157 photon.setERight(0);
0158 photon.setSee(0);
0159 photon.setSep(0);
0160 photon.setSpp(0);
0161 photon.setMaxDR(0);
0162 photon.setMaxDRDPhi(0);
0163 photon.setMaxDRDEta(0);
0164 photon.setMaxDRRawEnergy(0);
0165 photon.setSubClusRawE1(0);
0166 photon.setSubClusRawE2(0);
0167 photon.setSubClusRawE3(0);
0168 photon.setSubClusDPhi1(0);
0169 photon.setSubClusDPhi2(0);
0170 photon.setSubClusDPhi3(0);
0171 photon.setSubClusDEta1(0);
0172 photon.setSubClusDEta2(0);
0173 photon.setSubClusDEta3(0);
0174 photon.setCryPhi(0);
0175 photon.setCryEta(0);
0176 photon.setIEta(0);
0177 photon.setIPhi(0);
0178 }
0179
0180 if (linkToPackedPF_) {
0181
0182 keys.clear();
0183 for (auto const& pf : (*reco2pf)[photon.refToOrig_]) {
0184 if (pf2pc->contains(pf.id())) {
0185 keys.push_back((*pf2pc)[pf].key());
0186 }
0187 }
0188 photon.setAssociatedPackedPFCandidates(
0189 edm::RefProd<pat::PackedCandidateCollection>(pc), keys.begin(), keys.end());
0190
0191
0192 if (keys.size() == 1) {
0193 photon.refToOrig_ = photon.sourceCandidatePtr(0);
0194 } else {
0195 photon.refToOrig_ = reco::CandidatePtr(pc.id());
0196 }
0197 }
0198 if (saveNonZSClusterShapes_(photon)) {
0199 const auto& vCov = lazyToolsNoZS.localCovariances(*(photon.superCluster()->seed()));
0200 float r9 = lazyToolsNoZS.e3x3(*(photon.superCluster()->seed())) / photon.superCluster()->rawEnergy();
0201 float sigmaIetaIeta = (!edm::isNotFinite(vCov[0])) ? sqrt(vCov[0]) : 0;
0202 float sigmaIetaIphi = vCov[1];
0203 float sigmaIphiIphi = (!edm::isNotFinite(vCov[2])) ? sqrt(vCov[2]) : 0;
0204 float e15o55 =
0205 lazyToolsNoZS.e1x5(*(photon.superCluster()->seed())) / lazyToolsNoZS.e5x5(*(photon.superCluster()->seed()));
0206 photon.addUserFloat("sigmaIetaIeta_NoZS", sigmaIetaIeta);
0207 photon.addUserFloat("sigmaIetaIphi_NoZS", sigmaIetaIphi);
0208 photon.addUserFloat("sigmaIphiIphi_NoZS", sigmaIphiIphi);
0209 photon.addUserFloat("r9_NoZS", r9);
0210 photon.addUserFloat("e1x5_over_e5x5_NoZS", e15o55);
0211 }
0212 }
0213
0214 iEvent.put(std::move(out));
0215 }
0216
0217 #include "FWCore/Framework/interface/MakerMacros.h"
0218 using namespace pat;
0219 DEFINE_FWK_MODULE(PATPhotonSlimmer);