Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2024-10-29 06:08:37

0001 #ifndef RecoParticleFlow_PFClusterProducer_PFEcalBarrelRecHitCreator_h
0002 #define RecoParticleFlow_PFClusterProducer_PFEcalBarrelRecHitCreator_h
0003 
0004 #include "RecoParticleFlow/PFClusterProducer/interface/PFRecHitCreatorBase.h"
0005 #include "DataFormats/EcalRecHit/interface/EcalRecHit.h"
0006 #include "DataFormats/EcalRecHit/interface/EcalRecHitCollections.h"
0007 #include "DataFormats/EcalDetId/interface/EcalSubdetector.h"
0008 #include "DataFormats/EcalDetId/interface/EcalTrigTowerDetId.h"
0009 
0010 #include "DataFormats/EcalDetId/interface/EEDetId.h"
0011 #include "DataFormats/EcalDetId/interface/EBDetId.h"
0012 #include "DataFormats/EcalDigi/interface/EcalDigiCollections.h"
0013 
0014 #include "Geometry/CaloGeometry/interface/CaloSubdetectorGeometry.h"
0015 #include "Geometry/CaloGeometry/interface/CaloGeometry.h"
0016 #include "Geometry/CaloGeometry/interface/CaloCellGeometry.h"
0017 #include "Geometry/CaloGeometry/interface/TruncatedPyramid.h"
0018 #include "Geometry/Records/interface/CaloGeometryRecord.h"
0019 
0020 #include "Geometry/EcalAlgo/interface/EcalEndcapGeometry.h"
0021 #include "Geometry/EcalAlgo/interface/EcalBarrelGeometry.h"
0022 #include "Geometry/CaloTopology/interface/EcalEndcapTopology.h"
0023 #include "Geometry/CaloTopology/interface/EcalBarrelTopology.h"
0024 #include "Geometry/CaloTopology/interface/EcalPreshowerTopology.h"
0025 #include "Geometry/CaloTopology/interface/EcalTrigTowerConstituentsMap.h"
0026 #include "RecoCaloTools/Navigation/interface/CaloNavigator.h"
0027 
0028 class PFEcalBarrelRecHitCreator : public PFRecHitCreatorBase {
0029 public:
0030   PFEcalBarrelRecHitCreator(const edm::ParameterSet& iConfig, edm::ConsumesCollector& cc)
0031       : PFRecHitCreatorBase(iConfig, cc),
0032         recHitToken_(cc.consumes<EcalRecHitCollection>(iConfig.getParameter<edm::InputTag>("src"))),
0033         triggerTowerMap_(nullptr),
0034         geomToken_(cc.esConsumes()),
0035         towerToken_(cc.esConsumes<edm::Transition::BeginRun>()) {
0036     auto srF = iConfig.getParameter<edm::InputTag>("srFlags");
0037     if (not srF.label().empty())
0038       srFlagToken_ = cc.consumes<EBSrFlagCollection>(srF);
0039   }
0040 
0041   void importRecHits(std::unique_ptr<reco::PFRecHitCollection>& out,
0042                      std::unique_ptr<reco::PFRecHitCollection>& cleaned,
0043                      const edm::Event& iEvent,
0044                      const edm::EventSetup& iSetup) override {
0045     beginEvent(iEvent, iSetup);
0046 
0047     edm::Handle<EcalRecHitCollection> recHitHandle;
0048 
0049     edm::ESHandle<CaloGeometry> geoHandle = iSetup.getHandle(geomToken_);
0050 
0051     bool useSrF = false;
0052     if (not srFlagToken_.isUninitialized()) {
0053       iEvent.getByToken(srFlagToken_, srFlagHandle_);
0054       useSrF = true;
0055     }
0056 
0057     // get the ecal geometry
0058     const CaloSubdetectorGeometry* gTmp = geoHandle->getSubdetectorGeometry(DetId::Ecal, EcalBarrel);
0059 
0060     const EcalBarrelGeometry* ecalGeo = dynamic_cast<const EcalBarrelGeometry*>(gTmp);
0061 
0062     iEvent.getByToken(recHitToken_, recHitHandle);
0063     for (const auto& erh : *recHitHandle) {
0064       const DetId& detid = erh.detid();
0065       auto energy = erh.energy();
0066       auto time = erh.time();
0067       auto flags = erh.flagsBits();
0068       bool hi = (useSrF ? isHighInterest(detid) : true);
0069 
0070       {
0071         auto thisCell = ecalGeo->getGeometry(detid);
0072 
0073         // find rechit geometry
0074         if (!thisCell) {
0075           throw cms::Exception("PFEcalBarrelRecHitCreator") << "detid " << detid.rawId() << "not found in geometry";
0076         }
0077 
0078         out->emplace_back(std::move(thisCell), detid.rawId(), PFLayer::ECAL_BARREL, energy, flags);
0079       }
0080       auto& rh = out->back();
0081 
0082       bool rcleaned = false;
0083       bool keep = true;
0084 
0085       //Apply Q tests
0086       for (const auto& qtest : qualityTests_) {
0087         if (!qtest->test(rh, erh, rcleaned, hi)) {
0088           keep = false;
0089         }
0090       }
0091 
0092       if (keep) {
0093         rh.setTime(time);
0094         rh.setDepth(1);
0095       } else {
0096         if (rcleaned)
0097           cleaned->push_back(std::move(out->back()));
0098         out->pop_back();
0099       }
0100     }
0101   }
0102 
0103   void init(const edm::EventSetup& es) override { triggerTowerMap_ = &es.getData(towerToken_); }
0104 
0105 protected:
0106   bool isHighInterest(const EBDetId& detid) {
0107     bool result = false;
0108     auto srf = srFlagHandle_->find(readOutUnitOf(detid));
0109     if (srf == srFlagHandle_->end())
0110       return false;
0111     else
0112       result = ((srf->value() & ~EcalSrFlag::SRF_FORCED_MASK) == EcalSrFlag::SRF_FULL);
0113     return result;
0114   }
0115 
0116   EcalTrigTowerDetId readOutUnitOf(const EBDetId& detid) const { return triggerTowerMap_->towerOf(detid); }
0117 
0118   edm::EDGetTokenT<EcalRecHitCollection> recHitToken_;
0119   edm::EDGetTokenT<EBSrFlagCollection> srFlagToken_;
0120 
0121   // ECAL trigger tower mapping
0122   const EcalTrigTowerConstituentsMap* triggerTowerMap_;
0123   // selective readout flags collection
0124   edm::Handle<EBSrFlagCollection> srFlagHandle_;
0125 
0126 private:
0127   edm::ESGetToken<CaloGeometry, CaloGeometryRecord> geomToken_;
0128   edm::ESGetToken<EcalTrigTowerConstituentsMap, IdealGeometryRecord> towerToken_;
0129 };
0130 
0131 #endif