CMS 3D CMS Logo

InterestingDetIdCollectionProducer.cc
Go to the documentation of this file.
1 // -*- C++ -*-
2 //
3 // Package: InterestingDetIdCollectionProducer
4 // Class: InterestingDetIdCollectionProducer
5 //
47 
48 #include <memory>
49 
51 public:
54  void beginRun(edm::Run const&, const edm::EventSetup&) final;
56  void produce(edm::Event&, const edm::EventSetup&) override;
57 
58 private:
59  // ----------member data ---------------------------
65 
70 
75 };
76 
79 
81  recHitsToken_ = consumes<EcalRecHitCollection>(iConfig.getParameter<edm::InputTag>("recHitsLabel"));
83  consumes<reco::BasicClusterCollection>(iConfig.getParameter<edm::InputTag>("basicClustersLabel"));
84  caloTopologyToken_ = esConsumes<CaloTopology, CaloTopologyRecord, edm::Transition::BeginRun>();
85  sevLVToken_ = esConsumes<EcalSeverityLevelAlgo, EcalSeverityLevelAlgoRcd, edm::Transition::BeginRun>();
86  nextToDeadToken_ = esConsumes<EcalNextToDeadChannel, EcalNextToDeadChannelRcd>();
87 
88  interestingDetIdCollection_ = iConfig.getParameter<std::string>("interestingDetIdCollection");
89 
90  minimalEtaSize_ = iConfig.getParameter<int>("etaSize");
91  minimalPhiSize_ = iConfig.getParameter<int>("phiSize");
92  if (minimalPhiSize_ % 2 == 0 || minimalEtaSize_ % 2 == 0)
93  edm::LogError("InterestingDetIdCollectionProducerError") << "Size of eta/phi should be odd numbers";
94 
95  //register your products
96  produces<DetIdCollection>(interestingDetIdCollection_);
97 
98  severityLevel_ = iConfig.getParameter<int>("severityLevel");
99  keepNextToDead_ = iConfig.getParameter<bool>("keepNextToDead");
100  keepNextToBoundary_ = iConfig.getParameter<bool>("keepNextToBoundary");
101 }
102 
104  edm::ESHandle<CaloTopology> theCaloTopology = iSetup.getHandle(caloTopologyToken_);
105  caloTopology_ = &(*theCaloTopology);
106 
108  severity_ = sevLv.product();
109 }
110 
111 // ------------ method called to produce the data ------------
113  using namespace edm;
114  using namespace std;
115 
116  // take BasicClusters
118  iEvent.getByToken(basicClustersToken_, pClusters);
119 
120  // take EcalRecHits
121  Handle<EcalRecHitCollection> recHitsHandle;
122  iEvent.getByToken(recHitsToken_, recHitsHandle);
123 
124  //Create empty output collections
125  std::vector<DetId> indexToStore;
126  indexToStore.reserve(1000);
127 
128  reco::BasicClusterCollection::const_iterator clusIt;
129 
130  std::vector<DetId> xtalsToStore;
131  xtalsToStore.reserve(50);
132  for (clusIt = pClusters->begin(); clusIt != pClusters->end(); clusIt++) {
133  const std::vector<std::pair<DetId, float> >& clusterDetIds = clusIt->hitsAndFractions();
134  for (const auto& detidpair : clusterDetIds) {
135  indexToStore.push_back(detidpair.first);
136  }
137 
138  //below checks and additional code are only relevant for EB/EE, not for ES
139  if (clusterDetIds.front().first.subdetId() == EcalBarrel || clusterDetIds.front().first.subdetId() == EcalEndcap) {
140  std::vector<std::pair<DetId, float> >::const_iterator posCurrent;
141 
142  float eMax = 0.;
143  DetId eMaxId(0);
144 
145  EcalRecHit testEcalRecHit;
146 
147  for (posCurrent = clusterDetIds.begin(); posCurrent != clusterDetIds.end(); posCurrent++) {
148  EcalRecHitCollection::const_iterator itt = recHitsHandle->find((*posCurrent).first);
149  if ((!((*posCurrent).first.null())) && (itt != recHitsHandle->end()) && ((*itt).energy() > eMax)) {
150  eMax = (*itt).energy();
151  eMaxId = (*itt).id();
152  }
153  }
154 
155  if (eMaxId.null())
156  continue;
157 
158  const CaloSubdetectorTopology* topology = caloTopology_->getSubdetectorTopology(eMaxId.det(), eMaxId.subdetId());
159 
160  xtalsToStore = topology->getWindow(eMaxId, minimalEtaSize_, minimalPhiSize_);
161 
162  for (const auto& detid : xtalsToStore) {
163  indexToStore.push_back(detid);
164  }
165  }
166  }
167 
169  for (EcalRecHitCollection::const_iterator it = recHitsHandle->begin(); it != recHitsHandle->end(); ++it) {
170  // also add recHits of dead TT if the corresponding TP is saturated
171  if (it->checkFlag(EcalRecHit::kTPSaturated)) {
172  indexToStore.push_back(it->id());
173  }
174  // add hits for severities above a threshold
175  if (severityLevel_ >= 0 && severity_->severityLevel(*it) >= severityLevel_) {
176  indexToStore.push_back(it->id());
177  }
178  if (keepNextToDead_) {
180  // also keep channels next to dead ones
181  if (EcalTools::isNextToDead(it->id(), *dch)) {
182  indexToStore.push_back(it->id());
183  }
184  }
185 
186  if (keepNextToBoundary_) {
187  // keep channels around EB/EE boundary
188  if (it->id().subdetId() == EcalBarrel) {
189  EBDetId ebid(it->id());
190  if (abs(ebid.ieta()) == 85)
191  indexToStore.push_back(it->id());
192  } else {
193  if (EEDetId::isNextToRingBoundary(it->id()))
194  indexToStore.push_back(it->id());
195  }
196  }
197  }
198  }
199 
200  //unify the vector
201  std::sort(indexToStore.begin(), indexToStore.end());
202  std::unique(indexToStore.begin(), indexToStore.end());
203 
204  iEvent.put(std::make_unique<DetIdCollection>(indexToStore), interestingDetIdCollection_);
205 }
edm::ESGetToken< EcalNextToDeadChannel, EcalNextToDeadChannelRcd > nextToDeadToken_
T getParameter(std::string const &) const
Definition: ParameterSet.h:307
std::vector< EcalRecHit >::const_iterator const_iterator
Log< level::Error, false > LogError
constexpr Detector det() const
get the detector field from this detid
Definition: DetId.h:46
EcalSeverityLevel::SeverityLevel severityLevel(const DetId &id) const
Evaluate status from id use channelStatus from DB.
constexpr bool null() const
is this a null id ?
Definition: DetId.h:59
int iEvent
Definition: GenABIO.cc:224
T const * product() const
Definition: ESHandle.h:86
def unique(seq, keepstr=True)
Definition: tier0.py:24
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
static bool isNextToRingBoundary(EEDetId id)
Definition: EEDetId.cc:284
edm::EDGetTokenT< EcalRecHitCollection > recHitsToken_
InterestingDetIdCollectionProducer(const edm::ParameterSet &)
ctor
edm::ESGetToken< EcalSeverityLevelAlgo, EcalSeverityLevelAlgoRcd > sevLVToken_
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
constexpr int subdetId() const
get the contents of the subdetector field (not cast into any detector&#39;s numbering enum) ...
Definition: DetId.h:48
const_iterator begin() const
virtual std::vector< DetId > getWindow(const DetId &id, const int &northSouthSize, const int &eastWestSize) const
ESHandle< T > getHandle(const ESGetToken< T, R > &iToken) const
Definition: EventSetup.h:130
const_iterator end() const
void produce(edm::Event &, const edm::EventSetup &) override
producer
static bool isNextToDead(const DetId &id, const EcalNextToDeadChannel &es)
true if the channel is near a dead one (in the 3x3)
Definition: EcalTools.cc:54
Definition: DetId.h:17
const CaloSubdetectorTopology * getSubdetectorTopology(const DetId &id) const
access the subdetector Topology for the given subdetector directly
Definition: CaloTopology.cc:17
iterator find(key_type k)
HLT enums.
void beginRun(edm::Run const &, const edm::EventSetup &) final
Definition: Run.h:45
edm::EDGetTokenT< reco::BasicClusterCollection > basicClustersToken_
edm::ESGetToken< CaloTopology, CaloTopologyRecord > caloTopologyToken_