File indexing completed on 2024-06-22 02:24:04
0001 #include "DataFormats/ParticleFlowReco/interface/PFCluster.h"
0002 #include "DataFormats/ParticleFlowReco/interface/PFClusterFwd.h"
0003 #include "FWCore/Framework/interface/ESHandle.h"
0004 #include "FWCore/Framework/interface/Event.h"
0005 #include "FWCore/Framework/interface/EventSetup.h"
0006 #include "FWCore/Framework/interface/Frameworkfwd.h"
0007 #include "FWCore/Framework/interface/MakerMacros.h"
0008 #include "FWCore/Framework/interface/stream/EDProducer.h"
0009 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0010 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0011
0012 #include <memory>
0013 #include <vector>
0014
0015 class PFClusterTimeSelector : public edm::stream::EDProducer<> {
0016 public:
0017 explicit PFClusterTimeSelector(const edm::ParameterSet&);
0018 ~PFClusterTimeSelector() override;
0019
0020 void beginRun(const edm::Run& run, const edm::EventSetup& es) override;
0021
0022 void produce(edm::Event& iEvent, const edm::EventSetup& iSetup) override;
0023 static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
0024
0025 protected:
0026 struct CutInfo {
0027 double depth;
0028 double minE;
0029 double maxE;
0030 double minTime;
0031 double maxTime;
0032 bool endcap;
0033 };
0034
0035
0036 edm::EDGetTokenT<reco::PFClusterCollection> clusters_;
0037 std::vector<CutInfo> cutInfo_;
0038 };
0039
0040 #include "FWCore/Framework/interface/MakerMacros.h"
0041 DEFINE_FWK_MODULE(PFClusterTimeSelector);
0042
0043 void PFClusterTimeSelector::fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
0044 edm::ParameterSetDescription desc;
0045 desc.add<edm::InputTag>("src", {"particleFlowClusterECALWithTimeUncorrected"});
0046 {
0047 std::vector<edm::ParameterSet> vpset;
0048 vpset.reserve(10);
0049 {
0050 edm::ParameterSet pset;
0051 pset.addParameter<double>("depth", 1.0);
0052 pset.addParameter<double>("minEnergy", 0.0);
0053 pset.addParameter<double>("maxEnergy", 1.0);
0054 pset.addParameter<bool>("endcap", false);
0055 pset.addParameter<double>("minTime", -12.);
0056 pset.addParameter<double>("maxTime", 12.);
0057 vpset.emplace_back(pset);
0058 }
0059 {
0060 edm::ParameterSet pset;
0061 pset.addParameter<double>("depth", 1.0);
0062 pset.addParameter<double>("minEnergy", 0.0);
0063 pset.addParameter<double>("maxEnergy", 1.0);
0064 pset.addParameter<bool>("endcap", true);
0065 pset.addParameter<double>("minTime", -31.5);
0066 pset.addParameter<double>("maxTime", 31.5);
0067 vpset.emplace_back(pset);
0068 }
0069 {
0070 edm::ParameterSet pset;
0071 pset.addParameter<double>("depth", 1.0);
0072 pset.addParameter<double>("minEnergy", 1.0);
0073 pset.addParameter<double>("maxEnergy", 2.0);
0074 pset.addParameter<bool>("endcap", false);
0075 pset.addParameter<double>("minTime", -6.);
0076 pset.addParameter<double>("maxTime", 6.);
0077 vpset.emplace_back(pset);
0078 }
0079 {
0080 edm::ParameterSet pset;
0081 pset.addParameter<double>("depth", 1.0);
0082 pset.addParameter<double>("minEnergy", 1.0);
0083 pset.addParameter<double>("maxEnergy", 2.0);
0084 pset.addParameter<bool>("endcap", true);
0085 pset.addParameter<double>("minTime", -20.5);
0086 pset.addParameter<double>("maxTime", 20.5);
0087 vpset.emplace_back(pset);
0088 }
0089 {
0090 edm::ParameterSet pset;
0091 pset.addParameter<double>("depth", 1.0);
0092 pset.addParameter<double>("minEnergy", 2.0);
0093 pset.addParameter<double>("maxEnergy", 5.0);
0094 pset.addParameter<bool>("endcap", false);
0095 pset.addParameter<double>("minTime", -4.);
0096 pset.addParameter<double>("maxTime", 4.);
0097 vpset.emplace_back(pset);
0098 }
0099 {
0100 edm::ParameterSet pset;
0101 pset.addParameter<double>("depth", 1.0);
0102 pset.addParameter<double>("minEnergy", 2.0);
0103 pset.addParameter<double>("maxEnergy", 5.0);
0104 pset.addParameter<bool>("endcap", true);
0105 pset.addParameter<double>("minTime", -12.);
0106 pset.addParameter<double>("maxTime", 12.);
0107 vpset.emplace_back(pset);
0108 }
0109 {
0110 edm::ParameterSet pset;
0111 pset.addParameter<double>("depth", 1.0);
0112 pset.addParameter<double>("minEnergy", 5.0);
0113 pset.addParameter<double>("maxEnergy", 20.0);
0114 pset.addParameter<bool>("endcap", false);
0115 pset.addParameter<double>("minTime", -4.);
0116 pset.addParameter<double>("maxTime", 4.);
0117 vpset.emplace_back(pset);
0118 }
0119 {
0120 edm::ParameterSet pset;
0121 pset.addParameter<double>("depth", 1.0);
0122 pset.addParameter<double>("minEnergy", 5.0);
0123 pset.addParameter<double>("maxEnergy", 20.0);
0124 pset.addParameter<bool>("endcap", true);
0125 pset.addParameter<double>("minTime", -5.);
0126 pset.addParameter<double>("maxTime", 5.);
0127 vpset.emplace_back(pset);
0128 }
0129 {
0130 edm::ParameterSet pset;
0131 pset.addParameter<double>("depth", 1.0);
0132 pset.addParameter<double>("minEnergy", 20.0);
0133 pset.addParameter<double>("maxEnergy", 1e24);
0134 pset.addParameter<bool>("endcap", false);
0135 pset.addParameter<double>("minTime", -4.);
0136 pset.addParameter<double>("maxTime", 4.);
0137 vpset.emplace_back(pset);
0138 }
0139 {
0140 edm::ParameterSet pset;
0141 pset.addParameter<double>("depth", 1.0);
0142 pset.addParameter<double>("minEnergy", 20.0);
0143 pset.addParameter<double>("maxEnergy", 1e24);
0144 pset.addParameter<bool>("endcap", true);
0145 pset.addParameter<double>("minTime", -5.);
0146 pset.addParameter<double>("maxTime", 5.);
0147 vpset.emplace_back(pset);
0148 }
0149 edm::ParameterSetDescription psd;
0150 psd.add<double>("depth", 1.0);
0151 psd.add<double>("minEnergy", 0.0);
0152 psd.add<double>("maxEnergy", 1e24);
0153 psd.add<bool>("endcap", false);
0154 psd.add<double>("minTime", -50.);
0155 psd.add<double>("maxTime", 50.);
0156 desc.addVPSet("cuts", psd, vpset);
0157 }
0158 descriptions.add("particleFlowClusterECALTimeSelected", desc);
0159 }
0160
0161 using namespace std;
0162 using namespace edm;
0163
0164 PFClusterTimeSelector::PFClusterTimeSelector(const edm::ParameterSet& iConfig)
0165 : clusters_(consumes<reco::PFClusterCollection>(iConfig.getParameter<edm::InputTag>("src"))) {
0166 std::vector<edm::ParameterSet> cuts = iConfig.getParameter<std::vector<edm::ParameterSet> >("cuts");
0167 for (const auto& cut : cuts) {
0168 CutInfo info;
0169 info.depth = cut.getParameter<double>("depth");
0170 info.minE = cut.getParameter<double>("minEnergy");
0171 info.maxE = cut.getParameter<double>("maxEnergy");
0172 info.minTime = cut.getParameter<double>("minTime");
0173 info.maxTime = cut.getParameter<double>("maxTime");
0174 info.endcap = cut.getParameter<bool>("endcap");
0175 cutInfo_.push_back(info);
0176 }
0177
0178 produces<reco::PFClusterCollection>();
0179 produces<reco::PFClusterCollection>("OOT");
0180 }
0181
0182 void PFClusterTimeSelector::produce(edm::Event& iEvent, const edm::EventSetup& iSetup) {
0183 edm::Handle<reco::PFClusterCollection> clusters;
0184 iEvent.getByToken(clusters_, clusters);
0185 auto out = std::make_unique<reco::PFClusterCollection>();
0186 auto outOOT = std::make_unique<reco::PFClusterCollection>();
0187
0188 for (const auto& cluster : *clusters) {
0189 const double energy = cluster.energy();
0190 const double time = cluster.time();
0191 const double depth = cluster.depth();
0192 const PFLayer::Layer layer = cluster.layer();
0193 for (const auto& info : cutInfo_) {
0194 if (energy < info.minE || energy > info.maxE)
0195 continue;
0196 if (depth < 0.9 * info.depth || depth > 1.1 * info.depth)
0197 continue;
0198 if ((info.endcap &&
0199 (layer == PFLayer::ECAL_BARREL || layer == PFLayer::HCAL_BARREL1 || layer == PFLayer::HCAL_BARREL2)) ||
0200 (((!info.endcap) && (layer == PFLayer::ECAL_ENDCAP || layer == PFLayer::HCAL_ENDCAP))))
0201 continue;
0202
0203 if (time > info.minTime && time < info.maxTime)
0204 out->push_back(cluster);
0205 else
0206 outOOT->push_back(cluster);
0207
0208 break;
0209 }
0210 }
0211
0212 iEvent.put(std::move(out));
0213 iEvent.put(std::move(outOOT), "OOT");
0214 }
0215
0216 PFClusterTimeSelector::~PFClusterTimeSelector() = default;
0217
0218
0219 void PFClusterTimeSelector::beginRun(const edm::Run& run, const EventSetup& es) {}