File indexing completed on 2024-11-23 03:28:57
0001 #include "CommonTools/Utils/interface/StringToEnumValue.h"
0002 #include "DataFormats/CaloRecHit/interface/CaloClusterFwd.h"
0003 #include "DataFormats/CaloRecHit/interface/CaloID.h"
0004 #include "DataFormats/Common/interface/Handle.h"
0005 #include "DataFormats/EcalDetId/interface/EBDetId.h"
0006 #include "DataFormats/EcalRecHit/interface/EcalRecHit.h"
0007 #include "DataFormats/EcalRecHit/interface/EcalRecHitCollections.h"
0008 #include "DataFormats/EgammaReco/interface/BasicCluster.h"
0009 #include "DataFormats/EgammaReco/interface/BasicClusterFwd.h"
0010 #include "FWCore/Framework/interface/ESHandle.h"
0011 #include "FWCore/Framework/interface/Event.h"
0012 #include "FWCore/Framework/interface/EventSetup.h"
0013 #include "FWCore/Framework/interface/stream/EDProducer.h"
0014 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0015 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0016 #include "FWCore/Utilities/interface/ESGetToken.h"
0017 #include "FWCore/Utilities/interface/EDPutToken.h"
0018 #include "FWCore/Utilities/interface/Exception.h"
0019 #include "Geometry/CaloGeometry/interface/CaloCellGeometry.h"
0020 #include "Geometry/CaloGeometry/interface/CaloGeometry.h"
0021 #include "Geometry/CaloGeometry/interface/CaloSubdetectorGeometry.h"
0022 #include "Geometry/CaloTopology/interface/CaloSubdetectorTopology.h"
0023 #include "Geometry/CaloTopology/interface/EcalBarrelTopology.h"
0024 #include "Geometry/CaloTopology/interface/EcalEndcapTopology.h"
0025 #include "Geometry/Records/interface/CaloGeometryRecord.h"
0026 #include "RecoEcal/EgammaClusterAlgos/interface/Multi5x5ClusterAlgo.h"
0027 #include "RecoEcal/EgammaCoreTools/interface/PositionCalc.h"
0028 #include "FWCore/ParameterSet/interface/ConfigurationDescriptions.h"
0029
0030 #include <ctime>
0031 #include <iostream>
0032 #include <memory>
0033 #include <vector>
0034
0035 class Multi5x5ClusterProducer : public edm::stream::EDProducer<> {
0036 public:
0037 Multi5x5ClusterProducer(const edm::ParameterSet& ps);
0038
0039 void produce(edm::Event&, const edm::EventSetup&) final;
0040
0041 static void fillDescriptions(edm::ConfigurationDescriptions&);
0042
0043 private:
0044 const edm::EDGetTokenT<EcalRecHitCollection> barrelHitToken_;
0045 const edm::EDGetTokenT<EcalRecHitCollection> endcapHitToken_;
0046 const edm::ESGetToken<CaloGeometry, CaloGeometryRecord> caloGeometryToken_;
0047
0048 const edm::EDPutTokenT<reco::BasicClusterCollection> barrelToken_;
0049 const edm::EDPutTokenT<reco::BasicClusterCollection> endcapToken_;
0050
0051 Multi5x5ClusterAlgo island_;
0052
0053
0054 const bool doBarrel_;
0055 const bool doEndcap_;
0056
0057 reco::BasicClusterCollection clusterizeECALPart(const EcalRecHitCollection& hits,
0058 const edm::EventSetup& es,
0059 const reco::CaloID::Detectors detector);
0060
0061 reco::BasicClusterCollection makeClusters(const EcalRecHitCollection& hits,
0062 const CaloSubdetectorGeometry* geom,
0063 const CaloSubdetectorGeometry* preshower,
0064 const CaloSubdetectorTopology* topology,
0065 const reco::CaloID::Detectors detector);
0066 };
0067
0068 #include "FWCore/Framework/interface/MakerMacros.h"
0069 DEFINE_FWK_MODULE(Multi5x5ClusterProducer);
0070
0071 Multi5x5ClusterProducer::Multi5x5ClusterProducer(const edm::ParameterSet& ps)
0072 : barrelHitToken_{consumes<EcalRecHitCollection>(ps.getParameter<edm::InputTag>("barrelHitTag"))},
0073 endcapHitToken_{consumes<EcalRecHitCollection>(ps.getParameter<edm::InputTag>("endcapHitTag"))},
0074 caloGeometryToken_{esConsumes<CaloGeometry, CaloGeometryRecord>()},
0075 barrelToken_{produces<reco::BasicClusterCollection>(ps.getParameter<std::string>("barrelClusterCollection"))},
0076 endcapToken_{produces<reco::BasicClusterCollection>(ps.getParameter<std::string>("endcapClusterCollection"))},
0077 island_{ps.getParameter<double>("IslandBarrelSeedThr"),
0078 ps.getParameter<double>("IslandEndcapSeedThr"),
0079 StringToEnumValue<EcalRecHit::Flags>(ps.getParameter<std::vector<std::string>>("RecHitFlagToBeExcluded")),
0080 PositionCalc(ps.getParameter<edm::ParameterSet>("posCalcParameters")),
0081 ps.getParameter<bool>("reassignSeedCrysToClusterItSeeds")},
0082 doBarrel_{ps.getParameter<bool>("doBarrel")},
0083 doEndcap_{ps.getParameter<bool>("doEndcap")} {}
0084
0085 void Multi5x5ClusterProducer::fillDescriptions(edm::ConfigurationDescriptions& iDesc) {
0086 edm::ParameterSetDescription ps;
0087 ps.add<edm::InputTag>("barrelHitTag");
0088 ps.add<edm::InputTag>("endcapHitTag");
0089 ps.add<bool>("doEndcap");
0090 ps.add<bool>("doBarrel");
0091 ps.add<std::string>("barrelClusterCollection");
0092 ps.add<std::string>("endcapClusterCollection");
0093 ps.add<double>("IslandBarrelSeedThr");
0094 ps.add<double>("IslandEndcapSeedThr");
0095 ps.add<std::vector<std::string>>("RecHitFlagToBeExcluded");
0096
0097 edm::ParameterSetDescription posCal;
0098 posCal.add<bool>("LogWeighted");
0099 posCal.add<double>("T0_barl");
0100 posCal.add<double>("T0_endc");
0101 posCal.add<double>("T0_endcPresh");
0102 posCal.add<double>("W0");
0103 posCal.add<double>("X0");
0104 ps.add<edm::ParameterSetDescription>("posCalcParameters", posCal);
0105
0106 ps.add<bool>("reassignSeedCrysToClusterItSeeds", false);
0107 iDesc.addDefault(ps);
0108 }
0109
0110 void Multi5x5ClusterProducer::produce(edm::Event& evt, const edm::EventSetup& es) {
0111 if (doEndcap_) {
0112
0113 const EcalRecHitCollection& hitCollection = evt.get(endcapHitToken_);
0114 evt.emplace(endcapToken_, clusterizeECALPart(hitCollection, es, reco::CaloID::DET_ECAL_ENDCAP));
0115 }
0116 if (doBarrel_) {
0117
0118 const EcalRecHitCollection& hitCollection = evt.get(barrelHitToken_);
0119 evt.emplace(barrelToken_, clusterizeECALPart(hitCollection, es, reco::CaloID::DET_ECAL_BARREL));
0120 }
0121 }
0122
0123 reco::BasicClusterCollection Multi5x5ClusterProducer::makeClusters(const EcalRecHitCollection& hits,
0124 const CaloSubdetectorGeometry* geom,
0125 const CaloSubdetectorGeometry* preshower,
0126 const CaloSubdetectorTopology* topology,
0127 const reco::CaloID::Detectors detector) {
0128
0129 return island_.makeClusters(&hits, geom, topology, preshower, detector);
0130 }
0131
0132 reco::BasicClusterCollection Multi5x5ClusterProducer::clusterizeECALPart(const EcalRecHitCollection& hitCollection,
0133 const edm::EventSetup& es,
0134 const reco::CaloID::Detectors detector) {
0135
0136 CaloGeometry const& geo = es.getData(caloGeometryToken_);
0137
0138 const CaloSubdetectorGeometry* preshower_p = geo.getSubdetectorGeometry(DetId::Ecal, EcalPreshower);
0139 if (detector == reco::CaloID::DET_ECAL_BARREL) {
0140 auto geometry_p = geo.getSubdetectorGeometry(DetId::Ecal, EcalBarrel);
0141 EcalBarrelTopology topology{geo};
0142 return makeClusters(hitCollection, geometry_p, preshower_p, &topology, detector);
0143 } else {
0144 auto geometry_p = geo.getSubdetectorGeometry(DetId::Ecal, EcalEndcap);
0145 EcalEndcapTopology topology{geo};
0146 return makeClusters(hitCollection, geometry_p, preshower_p, &topology, detector);
0147 }
0148 }