CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
InterestingDetIdFromSuperClusterProducer.cc
Go to the documentation of this file.
1 // -*- C++ -*-
2 //
3 // Package: InterestingDetIdFromSuperClusterProducer
4 // Class: InterestingDetIdFromSuperClusterProducer
5 //
46 
47 #include <memory>
48 
50 public:
53  void beginRun(edm::Run const&, const edm::EventSetup&) final;
55  void produce(edm::Event&, const edm::EventSetup&) override;
56 
57 private:
58  // ----------member data ---------------------------
68 
73 };
74 
77 
79  recHitsToken_ = consumes<EcalRecHitCollection>(iConfig.getParameter<edm::InputTag>("recHitsLabel"));
81  consumes<reco::SuperClusterCollection>(iConfig.getParameter<edm::InputTag>("superClustersLabel"));
82  caloTopologyToken_ = esConsumes<CaloTopology, CaloTopologyRecord, edm::Transition::BeginRun>();
83  severityLevelToken_ = esConsumes<EcalSeverityLevelAlgo, EcalSeverityLevelAlgoRcd, edm::Transition::BeginRun>();
84  interestingDetIdCollection_ = iConfig.getParameter<std::string>("interestingDetIdCollection");
85 
86  minimalEtaSize_ = iConfig.getParameter<int>("etaSize");
87  minimalPhiSize_ = iConfig.getParameter<int>("phiSize");
88  if (minimalPhiSize_ % 2 == 0 || minimalEtaSize_ % 2 == 0)
89  edm::LogError("InterestingDetIdFromSuperClusterProducerError") << "Size of eta/phi should be odd numbers";
90 
91  //register your products
92  produces<DetIdCollection>(interestingDetIdCollection_);
93 
94  severityLevel_ = iConfig.getParameter<int>("severityLevel");
95  keepNextToDead_ = iConfig.getParameter<bool>("keepNextToDead");
96  keepNextToBoundary_ = iConfig.getParameter<bool>("keepNextToBoundary");
97  if (keepNextToDead_) {
98  nextToDeadToken_ = esConsumes<EcalNextToDeadChannel, EcalNextToDeadChannelRcd>();
99  }
100 }
101 
103  edm::ESHandle<CaloTopology> theCaloTopology = iSetup.getHandle(caloTopologyToken_);
104  caloTopology_ = &(*theCaloTopology);
105 
107  severity_ = sevLv.product();
108 }
109 
110 // ------------ method called to produce the data ------------
112  using namespace edm;
113  using namespace std;
114 
115  // take BasicClusters
117  iEvent.getByToken(superClustersToken_, pClusters);
118 
119  // take EcalRecHits
120  Handle<EcalRecHitCollection> recHitsHandle;
121  iEvent.getByToken(recHitsToken_, recHitsHandle);
122 
123  //Create empty output collections
124  std::vector<DetId> indexToStore;
125  indexToStore.reserve(1000);
126 
127  reco::SuperClusterCollection::const_iterator sclusIt;
128 
129  std::vector<DetId> xtalsToStore;
130  xtalsToStore.reserve(50);
131 
132  //loop over superclusters
133  for (sclusIt = pClusters->begin(); sclusIt != pClusters->end(); sclusIt++) {
134  //loop over subclusters
135  for (reco::CaloCluster_iterator clusIt = sclusIt->clustersBegin(); clusIt != sclusIt->clustersEnd(); ++clusIt) {
136  //PG barrel
137 
138  float eMax = 0.;
139  DetId eMaxId(0);
140 
141  std::vector<std::pair<DetId, float> > clusterDetIds = (*clusIt)->hitsAndFractions();
142  std::vector<std::pair<DetId, float> >::iterator posCurrent;
143 
144  EcalRecHit testEcalRecHit;
145 
146  for (posCurrent = clusterDetIds.begin(); posCurrent != clusterDetIds.end(); posCurrent++) {
147  EcalRecHitCollection::const_iterator itt = recHitsHandle->find((*posCurrent).first);
148  if ((!((*posCurrent).first.null())) && (itt != recHitsHandle->end()) && ((*itt).energy() > eMax)) {
149  eMax = (*itt).energy();
150  eMaxId = (*itt).id();
151  }
152  }
153 
154  if (eMaxId.null())
155  continue;
156 
157  const CaloSubdetectorTopology* topology = caloTopology_->getSubdetectorTopology(eMaxId.det(), eMaxId.subdetId());
158 
159  xtalsToStore = topology->getWindow(eMaxId, minimalEtaSize_, minimalPhiSize_);
160  std::vector<std::pair<DetId, float> > xtalsInClus = (*clusIt)->hitsAndFractions();
161 
162  for (unsigned int ii = 0; ii < xtalsInClus.size(); ii++) {
163  xtalsToStore.push_back(xtalsInClus[ii].first);
164  }
165 
166  indexToStore.insert(indexToStore.end(), xtalsToStore.begin(), xtalsToStore.end());
167  }
168  }
169 
170  for (EcalRecHitCollection::const_iterator it = recHitsHandle->begin(); it != recHitsHandle->end(); ++it) {
171  // also add recHits of dead TT if the corresponding TP is saturated
172  if (it->checkFlag(EcalRecHit::kTPSaturated)) {
173  indexToStore.push_back(it->id());
174  }
175  // add hits for severities above a threshold
176  if (severityLevel_ >= 0 && severity_->severityLevel(*it) >= severityLevel_) {
177  indexToStore.push_back(it->id());
178  }
179  if (keepNextToDead_) {
181  // also keep channels next to dead ones
182  if (EcalTools::isNextToDead(it->id(), *dch)) {
183  indexToStore.push_back(it->id());
184  }
185  }
186 
187  if (keepNextToBoundary_) {
188  // keep channels around EB/EE boundary
189  if (it->id().subdetId() == EcalBarrel) {
190  EBDetId ebid(it->id());
191  if (abs(ebid.ieta()) == 85)
192  indexToStore.push_back(it->id());
193  } else {
194  if (EEDetId::isNextToRingBoundary(it->id()))
195  indexToStore.push_back(it->id());
196  }
197  }
198  }
199 
200  //unify the vector
201  std::sort(indexToStore.begin(), indexToStore.end());
202  std::unique(indexToStore.begin(), indexToStore.end());
203 
204  auto detIdCollection = std::make_unique<DetIdCollection>(indexToStore);
205 
206  iEvent.put(std::move(detIdCollection), interestingDetIdCollection_);
207 }
edm::ESGetToken< CaloTopology, CaloTopologyRecord > caloTopologyToken_
OrphanHandle< PROD > put(std::unique_ptr< PROD > product)
Put a new product.
Definition: Event.h:133
void beginRun(edm::Run const &, const edm::EventSetup &) final
EcalSeverityLevel::SeverityLevel severityLevel(const DetId &id) const
Evaluate status from id use channelStatus from DB.
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:539
constexpr bool null() const
is this a null id ?
Definition: DetId.h:59
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
def unique
Definition: tier0.py:24
std::vector< EcalRecHit >::const_iterator const_iterator
Log< level::Error, false > LogError
int ii
Definition: cuy.py:589
int iEvent
Definition: GenABIO.cc:224
def move
Definition: eostools.py:511
constexpr int subdetId() const
get the contents of the subdetector field (not cast into any detector&#39;s numbering enum) ...
Definition: DetId.h:48
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
static bool isNextToRingBoundary(EEDetId id)
Definition: EEDetId.cc:284
float energy() const
Definition: EcalRecHit.h:68
void produce(edm::Event &, const edm::EventSetup &) override
producer
edm::ESGetToken< EcalNextToDeadChannel, EcalNextToDeadChannelRcd > nextToDeadToken_
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
virtual std::vector< DetId > getWindow(const DetId &id, const int &northSouthSize, const int &eastWestSize) const
edm::EDGetTokenT< reco::SuperClusterCollection > superClustersToken_
T const * product() const
Definition: ESHandle.h:86
T getParameter(std::string const &) const
Definition: ParameterSet.h:303
const CaloSubdetectorTopology * getSubdetectorTopology(const DetId &id) const
access the subdetector Topology for the given subdetector directly
Definition: CaloTopology.cc:17
ESHandle< T > getHandle(const ESGetToken< T, R > &iToken) const
Definition: EventSetup.h:157
edm::ESGetToken< EcalSeverityLevelAlgo, EcalSeverityLevelAlgoRcd > severityLevelToken_
Definition: Run.h:45
constexpr Detector det() const
get the detector field from this detid
Definition: DetId.h:46