Back to home page

Project CMSSW displayed by LXR

 
 

    


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   // cluster which regions
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     // get the hit collection from the event:
0113     const EcalRecHitCollection& hitCollection = evt.get(endcapHitToken_);
0114     evt.emplace(endcapToken_, clusterizeECALPart(hitCollection, es, reco::CaloID::DET_ECAL_ENDCAP));
0115   }
0116   if (doBarrel_) {
0117     // get the hit collection from the event:
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   // Run the clusterization algorithm:
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   // get the geometry and topology from the event setup:
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 }