Back to home page

Project CMSSW displayed by LXR

 
 

    


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   // ----------access to event data
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 // ------------ method called once each job just before starting event loop  ------------
0219 void PFClusterTimeSelector::beginRun(const edm::Run& run, const EventSetup& es) {}