CMS 3D CMS Logo

EcalDetIdToBeRecoveredProducer.cc
Go to the documentation of this file.
1 
32 
33 #include <csignal>
34 #include <set>
35 #include <sys/types.h>
36 
38 public:
40  void produce(edm::Event& evt, const edm::EventSetup& es) final;
41  static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
42 
43 private:
44  //edm::InputTag eeUncalibRecHitCollection_; // secondary name given to collection of EE uncalib rechits
45  //std::string eeRechitCollection_; // secondary name to be given to EE collection of hits
46 
53  /*
54  * InputTag for collections
55  */
56  // SRP collections
59 
60  // Integrity for xtal data
64 
65  // Integrity for xtal data - EE specific (to be rivisited towards EB+EE common collection)
69 
70  // Integrity Errors
73 
74  /*
75  * output collections
76  */
81 };
82 
84  ecalMappingToken_ = esConsumes<EcalElectronicsMapping, EcalMappingRcd>();
85  channelStatusToken_ = esConsumes<EcalChannelStatusMap, EcalChannelStatusRcd>();
86  ttMapToken_ = esConsumes<EcalTrigTowerConstituentsMap, IdealGeometryRecord>();
87  // SRP collections
88  ebSrFlagToken_ = consumes<EBSrFlagCollection>(ps.getParameter<edm::InputTag>("ebSrFlagCollection"));
89  eeSrFlagToken_ = consumes<EESrFlagCollection>(ps.getParameter<edm::InputTag>("eeSrFlagCollection"));
90 
91  // Integrity for xtal data
92  ebIntegrityGainErrorsToken_ = consumes<EBDetIdCollection>(ps.getParameter<edm::InputTag>("ebIntegrityGainErrors"));
94  consumes<EBDetIdCollection>(ps.getParameter<edm::InputTag>("ebIntegrityGainSwitchErrors"));
95  ebIntegrityChIdErrorsToken_ = consumes<EBDetIdCollection>(ps.getParameter<edm::InputTag>("ebIntegrityChIdErrors"));
96 
97  // Integrity for xtal data - EE specific (to be rivisited towards EB+EE common collection)
98  eeIntegrityGainErrorsToken_ = consumes<EEDetIdCollection>(ps.getParameter<edm::InputTag>("eeIntegrityGainErrors"));
100  consumes<EEDetIdCollection>(ps.getParameter<edm::InputTag>("eeIntegrityGainSwitchErrors"));
101  eeIntegrityChIdErrorsToken_ = consumes<EEDetIdCollection>(ps.getParameter<edm::InputTag>("eeIntegrityChIdErrors"));
102 
103  // Integrity Errors
105  consumes<EcalElectronicsIdCollection>(ps.getParameter<edm::InputTag>("integrityTTIdErrors"));
107  consumes<EcalElectronicsIdCollection>(ps.getParameter<edm::InputTag>("integrityBlockSizeErrors"));
108 
109  // output collections
110  ebDetIdCollection_ = ps.getParameter<std::string>("ebDetIdToBeRecovered");
111  eeDetIdCollection_ = ps.getParameter<std::string>("eeDetIdToBeRecovered");
112  ttDetIdCollection_ = ps.getParameter<std::string>("ebFEToBeRecovered");
113  scDetIdCollection_ = ps.getParameter<std::string>("eeFEToBeRecovered");
114 
115  produces<std::set<EBDetId>>(ebDetIdCollection_);
116  produces<std::set<EEDetId>>(eeDetIdCollection_);
117  produces<std::set<EcalTrigTowerDetId>>(ttDetIdCollection_);
118  produces<std::set<EcalScDetId>>(scDetIdCollection_);
119 }
120 
121 // fuction return true if "coll" have "item"
122 template <typename CollT, typename ItemT>
123 bool include(const CollT& coll, const ItemT& item) {
124  typename CollT::const_iterator res = std::find(coll.begin(), coll.end(), item);
125  return (res != coll.end());
126 }
127 
132 
133  std::vector<edm::Handle<EBDetIdCollection>> ebDetIdColls;
134  std::vector<edm::Handle<EEDetIdCollection>> eeDetIdColls;
135  std::vector<edm::Handle<EcalElectronicsIdCollection>> ttColls;
136 
137  auto ebDetIdToRecover = std::make_unique<std::set<EBDetId>>(); // isolated channels to be recovered
138  auto eeDetIdToRecover = std::make_unique<std::set<EEDetId>>(); // isolated channels to be recovered
139  auto ebTTDetIdToRecover = std::make_unique<std::set<EcalTrigTowerDetId>>(); // tt to be recovered
140  auto eeSCDetIdToRecover = std::make_unique<std::set<EcalScDetId>>(); // sc to be recovered
141 
142  /*
143  * get collections
144  */
145 
146  // Selective Readout Flags
148  ev.getByToken(ebSrFlagToken_, ebSrFlags);
149 
151  ev.getByToken(eeSrFlagToken_, eeSrFlags);
152 
153  // Integrity errors
156 
157  ebDetIdColls.push_back(ebIntegrityGainErrors);
158 
161  ebDetIdColls.push_back(ebIntegrityGainSwitchErrors);
162 
165  ebDetIdColls.push_back(ebIntegrityChIdErrors);
166 
169  eeDetIdColls.push_back(eeIntegrityGainErrors);
170 
173  eeDetIdColls.push_back(eeIntegrityGainSwitchErrors);
174 
177  eeDetIdColls.push_back(eeIntegrityChIdErrors);
178 
181  ttColls.push_back(integrityTTIdErrors);
182 
185  ttColls.push_back(integrityBlockSizeErrors);
186 
187  /*
188  * get regions of interest from SRP
189  */
190  // -- Barrel
191  EBDetIdCollection ebSrpDetId;
192  EcalTrigTowerDetIdCollection ebSrpTTDetId;
193  for (EBSrFlagCollection::const_iterator it = ebSrFlags->begin(); it != ebSrFlags->end(); ++it) {
194  const int flag = it->value();
196  const EcalTrigTowerDetId ttId = it->id();
197  ebSrpTTDetId.push_back(ttId);
198 
199  const std::vector<DetId> vid = ttMap_->constituentsOf(ttId);
200 
201  for (std::vector<DetId>::const_iterator itId = vid.begin(); itId != vid.end(); ++itId) {
202  ebSrpDetId.push_back(*itId);
203  }
204  }
205  }
206  // -- Endcap
207  EEDetIdCollection eeSrpDetId;
208  //EcalTrigTowerDetIdCollection eeSrpTTDetId;
209  for (EESrFlagCollection::const_iterator it = eeSrFlags->begin(); it != eeSrFlags->end(); ++it) {
210  const int flag = it->value();
212  //EcalTrigTowerDetId ttId = it->id();
213  //eeSrpTTDetId.push_back( ttId );
214  const EcalScDetId scId(it->id());
215  // not clear how to get the vector of DetId constituents of a SC...
217  //std::vector<DetId> vid = ecalMapping_->dccTowerConstituents( eId.dccId(), eId.towerId() );
218  std::vector<DetId> vid;
219  for (int dx = 1; dx <= 5; ++dx) {
220  for (int dy = 1; dy <= 5; ++dy) {
221  const int ix = (scId.ix() - 1) * 5 + dx;
222  const int iy = (scId.iy() - 1) * 5 + dy;
223  const int iz = scId.zside();
224  if (EEDetId::validDetId(ix, iy, iz)) {
225  vid.push_back(EEDetId(ix, iy, iz));
226  }
227  }
228  }
230  //std::vector<DetId> vid = ttMap_->constituentsOf( ttId );
231  for (std::vector<DetId>::const_iterator itId = vid.begin(); itId != vid.end(); ++itId) {
232  eeSrpDetId.push_back(*itId);
233  }
234  }
235  }
236  // SRP switched off: get the list from the DB
237  if (ebSrFlags->empty()) {
238  }
239  // SRP switched off: get the list from the DB
240  if (eeSrFlags->empty()) {
241  }
242 
243  /*
244  * get OR of integrity error collections
245  * in interesting regions flagged by SRP
246  * and insert them in the list of DetId to recover
247  */
248  // -- Barrel
249  for (std::vector<edm::Handle<EBDetIdCollection>>::const_iterator it = ebDetIdColls.begin(); it != ebDetIdColls.end();
250  ++it) {
251  const EBDetIdCollection* idc = it->product();
252  for (EBDetIdCollection::const_iterator jt = idc->begin(); jt != idc->end(); ++jt)
253  if (include(ebSrpDetId, *jt))
254  ebDetIdToRecover->insert(*jt);
255  }
256  // -- Endcap
257  for (std::vector<edm::Handle<EEDetIdCollection>>::const_iterator it = eeDetIdColls.begin(); it != eeDetIdColls.end();
258  ++it) {
259  const EEDetIdCollection* idc = it->product();
260  for (EEDetIdCollection::const_iterator jt = idc->begin(); jt != idc->end(); ++jt)
261  if (include(eeSrpDetId, *jt))
262  eeDetIdToRecover->insert(*jt);
263  }
264 
265  /*
266  * find isolated dead channels (from DB info) --> chStatus 10, 11, 12
267  * and group of dead channels w/ trigger(from DB info) --> chStatus 13
268  * in interesting regions flagged by SRP
269  */
270  // -- Barrel
271  for (EBDetIdCollection::const_iterator itId = ebSrpDetId.begin(); itId != ebSrpDetId.end(); ++itId) {
273  if (chit != chStatus_->end()) {
274  const int flag = (*chit).getStatusCode();
275  if (flag >= 10 && flag <= 12) { // FIXME -- avoid hardcoded values...
276  ebDetIdToRecover->insert(*itId);
277  } else if (flag == 13 || flag == 14) { // FIXME -- avoid hardcoded values...
278  ebTTDetIdToRecover->insert((*itId).tower());
279  }
280  } else {
281  edm::LogError("EcalDetIdToBeRecoveredProducer") << "No channel status found for xtal " << (*itId).rawId()
282  << "! something wrong with EcalChannelStatus in your DB? ";
283  }
284  }
285  // -- Endcap
286  for (EEDetIdCollection::const_iterator itId = eeSrpDetId.begin(); itId != eeSrpDetId.end(); ++itId) {
288  if (chit != chStatus_->end()) {
289  int flag = (*chit).getStatusCode();
290  if (flag >= 10 && flag <= 12) { // FIXME -- avoid hardcoded values...
291  eeDetIdToRecover->insert(*itId);
292  } else if (flag == 13 || flag == 14) { // FIXME -- avoid hardcoded values...
293  eeSCDetIdToRecover->insert(
294  EcalScDetId(1 + ((*itId).ix() - 1) / 5, 1 + ((*itId).iy() - 1) / 5, (*itId).zside()));
295  }
296  } else {
297  edm::LogError("EcalDetIdToBeRecoveredProducer") << "No channel status found for xtal " << (*itId).rawId()
298  << "! something wrong with EcalChannelStatus in your DB? ";
299  }
300  }
301 
302  // loop over electronics id associated with TT and SC
303  for (size_t t = 0; t < ttColls.size(); ++t) {
304  const EcalElectronicsIdCollection& coll = *(ttColls[t]);
305 
306  for (size_t i = 0; i < coll.size(); ++i) {
307  const EcalElectronicsId elId = coll[i];
308  const EcalSubdetector subdet = elId.subdet();
309  const DetId detId = ecalMapping_->getDetId(elId);
310 
311  if (subdet == EcalBarrel) { // elId pointing to TT
312  // get list of crystals corresponding to TT
314  const std::vector<DetId>& vid = ttMap_->constituentsOf(ttId);
315 
316  for (size_t j = 0; j < vid.size(); ++j) {
317  const EBDetId ebdi(vid[j]);
318  if (include(ebSrpDetId, ebdi)) {
319  ebDetIdToRecover->insert(ebdi);
320  ebTTDetIdToRecover->insert(ebdi.tower());
321  }
322  }
323  } else if (subdet == EcalEndcap) { // elId pointing to SC
324  // extract list of crystals corresponding to SC
325  const EcalScDetId scId(detId);
326  std::vector<DetId> vid;
327  for (int dx = 1; dx <= 5; ++dx) {
328  for (int dy = 1; dy <= 5; ++dy) {
329  const int ix = (scId.ix() - 1) * 5 + dx;
330  const int iy = (scId.iy() - 1) * 5 + dy;
331  const int iz = scId.zside();
332  if (EEDetId::validDetId(ix, iy, iz))
333  vid.push_back(EEDetId(ix, iy, iz));
334  }
335  }
336 
337  for (size_t j = 0; j < vid.size(); ++j) {
338  const EEDetId eedi(vid[i]);
339  if (include(eeSrpDetId, eedi)) {
340  eeDetIdToRecover->insert(eedi);
341  eeSCDetIdToRecover->insert(EcalScDetId(eedi));
342  }
343  }
344  } else
345  edm::LogWarning("EcalDetIdToBeRecoveredProducer")
346  << "Incorrect EcalSubdetector = " << subdet << " in EcalElectronicsIdCollection collection ";
347  }
348  }
349 
350  // return the collections
351  ev.put(std::move(ebDetIdToRecover), ebDetIdCollection_);
352  ev.put(std::move(eeDetIdToRecover), eeDetIdCollection_);
353  ev.put(std::move(ebTTDetIdToRecover), ttDetIdCollection_);
354  ev.put(std::move(eeSCDetIdToRecover), scDetIdCollection_);
355 }
356 
359  desc.add<edm::InputTag>("ebIntegrityChIdErrors", edm::InputTag("ecalDigis", "EcalIntegrityChIdErrors"));
360  desc.add<std::string>("ebDetIdToBeRecovered", "ebDetId");
361  desc.add<edm::InputTag>("integrityTTIdErrors", edm::InputTag("ecalDigis", "EcalIntegrityTTIdErrors"));
362  desc.add<edm::InputTag>("eeIntegrityGainErrors", edm::InputTag("ecalDigis", "EcalIntegrityGainErrors"));
363  desc.add<std::string>("ebFEToBeRecovered", "ebFE");
364  desc.add<edm::InputTag>("ebIntegrityGainErrors", edm::InputTag("ecalDigis", "EcalIntegrityGainErrors"));
365  desc.add<std::string>("eeDetIdToBeRecovered", "eeDetId");
366  desc.add<edm::InputTag>("eeIntegrityGainSwitchErrors", edm::InputTag("ecalDigis", "EcalIntegrityGainSwitchErrors"));
367  desc.add<edm::InputTag>("eeIntegrityChIdErrors", edm::InputTag("ecalDigis", "EcalIntegrityChIdErrors"));
368  desc.add<edm::InputTag>("ebIntegrityGainSwitchErrors", edm::InputTag("ecalDigis", "EcalIntegrityGainSwitchErrors"));
369  desc.add<edm::InputTag>("ebSrFlagCollection", edm::InputTag("ecalDigis"));
370  desc.add<std::string>("eeFEToBeRecovered", "eeFE");
371  desc.add<edm::InputTag>("integrityBlockSizeErrors", edm::InputTag("ecalDigis", "EcalIntegrityBlockSizeErrors"));
372  desc.add<edm::InputTag>("eeSrFlagCollection", edm::InputTag("ecalDigis"));
373  descriptions.add("ecalDetIdToBeRecovered", desc);
374 }
375 
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
T getParameter(std::string const &) const
Definition: ParameterSet.h:307
int zside() const
Definition: EcalScDetId.h:64
T const & getData(const ESGetToken< T, R > &iToken) const noexcept(false)
Definition: EventSetup.h:119
std::vector< DetId > constituentsOf(const EcalTrigTowerDetId &id) const
Get the constituent detids for this tower id.
Ecal readout channel identification [32:20] Unused (so far) [19:13] DCC id [12:6] tower [5:3] strip [...
static const int SRF_FORCED_MASK
Definition: EcalSrFlag.h:29
edm::EDGetTokenT< EcalElectronicsIdCollection > integrityBlockSizeErrorsToken_
std::vector< T >::const_iterator const_iterator
edm::ESGetToken< EcalTrigTowerConstituentsMap, IdealGeometryRecord > ttMapToken_
void push_back(T const &t)
Definition: EDCollection.h:61
edm::EDGetTokenT< EBDetIdCollection > ebIntegrityGainErrorsToken_
edm::EDGetTokenT< EcalElectronicsIdCollection > integrityTTIdErrorsToken_
Log< level::Error, false > LogError
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
Definition: FindCaloHit.cc:19
unsigned ttId(DetId const &, EcalElectronicsMapping const *)
Definition: Electron.h:6
EcalTrigTowerDetId towerOf(const DetId &id) const
Get the tower id for this det id (or null if not known)
edm::EDGetTokenT< EEDetIdCollection > eeIntegrityGainSwitchErrorsToken_
void produce(edm::Event &evt, const edm::EventSetup &es) final
static const int SRF_FULL
Definition: EcalSrFlag.h:24
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
const_iterator begin() const
EcalDetIdToBeRecoveredProducer(const edm::ParameterSet &ps)
int iy() const
Definition: EcalScDetId.h:76
ESHandle< T > getHandle(const ESGetToken< T, R > &iToken) const
Definition: EventSetup.h:130
edm::EDGetTokenT< EBSrFlagCollection > ebSrFlagToken_
edm::EDGetTokenT< EBDetIdCollection > ebIntegrityGainSwitchErrorsToken_
const_iterator find(uint32_t rawId) const
edm::EDGetTokenT< EEDetIdCollection > eeIntegrityChIdErrorsToken_
EcalSubdetector subdet() const
get the subdet
const_iterator begin() const
Definition: EDCollection.h:118
const_iterator end() const
ALPAKA_FN_ACC ALPAKA_FN_INLINE uint32_t ix(uint32_t id)
Definition: DetId.h:17
edm::ESHandle< EcalTrigTowerConstituentsMap > ttMap_
static bool validDetId(int crystal_ix, int crystal_iy, int iz)
Definition: EEDetId.h:248
std::vector< Item >::const_iterator const_iterator
void add(std::string const &label, ParameterSetDescription const &psetDescription)
edm::ESGetToken< EcalElectronicsMapping, EcalMappingRcd > ecalMappingToken_
size_type size() const
Definition: EDCollection.h:83
edm::EDGetTokenT< EEDetIdCollection > eeIntegrityGainErrorsToken_
bool include(const CollT &coll, const ItemT &item)
edm::EDGetTokenT< EESrFlagCollection > eeSrFlagToken_
ALPAKA_FN_ACC ALPAKA_FN_INLINE uint32_t iy(uint32_t id)
EcalTrigTowerDetId tower() const
get the HCAL/trigger iphi of this crystal
Definition: EBDetId.h:57
const_iterator end() const
edm::EDGetTokenT< EBDetIdCollection > ebIntegrityChIdErrorsToken_
Log< level::Warning, false > LogWarning
const EcalElectronicsMapping * ecalMapping_
const_iterator end() const
Definition: EDCollection.h:123
EcalSubdetector
def move(src, dest)
Definition: eostools.py:511
DetId getDetId(const EcalElectronicsId &id) const
Get the detid given an electronicsId.
edm::ESGetToken< EcalChannelStatusMap, EcalChannelStatusRcd > channelStatusToken_
std::vector< T >::const_iterator const_iterator
Definition: EDCollection.h:19
int ix() const
Definition: EcalScDetId.h:70