CMS 3D CMS Logo

All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
EcalDetIdToBeRecoveredProducer.cc
Go to the documentation of this file.
2 
5 
7 
11 
13 
17 
18 #include <set>
19 
20 #include <sys/types.h>
21 #include <csignal>
22 
24  // SRP collections
25  ebSrFlagToken_ = consumes<EBSrFlagCollection>(ps.getParameter<edm::InputTag>("ebSrFlagCollection"));
26  eeSrFlagToken_ = consumes<EESrFlagCollection>(ps.getParameter<edm::InputTag>("eeSrFlagCollection"));
27 
28  // Integrity for xtal data
29  ebIntegrityGainErrorsToken_ = consumes<EBDetIdCollection>(ps.getParameter<edm::InputTag>("ebIntegrityGainErrors"));
31  consumes<EBDetIdCollection>(ps.getParameter<edm::InputTag>("ebIntegrityGainSwitchErrors"));
32  ebIntegrityChIdErrorsToken_ = consumes<EBDetIdCollection>(ps.getParameter<edm::InputTag>("ebIntegrityChIdErrors"));
33 
34  // Integrity for xtal data - EE specific (to be rivisited towards EB+EE common collection)
35  eeIntegrityGainErrorsToken_ = consumes<EEDetIdCollection>(ps.getParameter<edm::InputTag>("eeIntegrityGainErrors"));
37  consumes<EEDetIdCollection>(ps.getParameter<edm::InputTag>("eeIntegrityGainSwitchErrors"));
38  eeIntegrityChIdErrorsToken_ = consumes<EEDetIdCollection>(ps.getParameter<edm::InputTag>("eeIntegrityChIdErrors"));
39 
40  // Integrity Errors
42  consumes<EcalElectronicsIdCollection>(ps.getParameter<edm::InputTag>("integrityTTIdErrors"));
44  consumes<EcalElectronicsIdCollection>(ps.getParameter<edm::InputTag>("integrityBlockSizeErrors"));
45 
46  // output collections
47  ebDetIdCollection_ = ps.getParameter<std::string>("ebDetIdToBeRecovered");
48  eeDetIdCollection_ = ps.getParameter<std::string>("eeDetIdToBeRecovered");
49  ttDetIdCollection_ = ps.getParameter<std::string>("ebFEToBeRecovered");
50  scDetIdCollection_ = ps.getParameter<std::string>("eeFEToBeRecovered");
51 
52  produces<std::set<EBDetId>>(ebDetIdCollection_);
53  produces<std::set<EEDetId>>(eeDetIdCollection_);
54  produces<std::set<EcalTrigTowerDetId>>(ttDetIdCollection_);
55  produces<std::set<EcalScDetId>>(scDetIdCollection_);
56 }
57 
59 
62  es.get<EcalMappingRcd>().get(pEcalMapping);
63  ecalMapping_ = pEcalMapping.product();
64 
66  es.get<EcalChannelStatusRcd>().get(pChStatus);
67  chStatus_ = pChStatus.product();
68 
69  es.get<IdealGeometryRecord>().get(ttMap_);
70 }
71 
72 // fuction return true if "coll" have "item"
73 template <typename CollT, typename ItemT>
74 bool include(const CollT& coll, const ItemT& item) {
75  typename CollT::const_iterator res = std::find(coll.begin(), coll.end(), item);
76  return (res != coll.end());
77 }
78 
80  std::vector<edm::Handle<EBDetIdCollection>> ebDetIdColls;
81  std::vector<edm::Handle<EEDetIdCollection>> eeDetIdColls;
82  std::vector<edm::Handle<EcalElectronicsIdCollection>> ttColls;
83 
84  auto ebDetIdToRecover = std::make_unique<std::set<EBDetId>>(); // isolated channels to be recovered
85  auto eeDetIdToRecover = std::make_unique<std::set<EEDetId>>(); // isolated channels to be recovered
86  auto ebTTDetIdToRecover = std::make_unique<std::set<EcalTrigTowerDetId>>(); // tt to be recovered
87  auto eeSCDetIdToRecover = std::make_unique<std::set<EcalScDetId>>(); // sc to be recovered
88 
89  /*
90  * get collections
91  */
92 
93  // Selective Readout Flags
95  ev.getByToken(ebSrFlagToken_, ebSrFlags);
96 
98  ev.getByToken(eeSrFlagToken_, eeSrFlags);
99 
100  // Integrity errors
102  ev.getByToken(ebIntegrityGainErrorsToken_, ebIntegrityGainErrors);
103 
104  ebDetIdColls.push_back(ebIntegrityGainErrors);
105 
107  ev.getByToken(ebIntegrityGainSwitchErrorsToken_, ebIntegrityGainSwitchErrors);
108  ebDetIdColls.push_back(ebIntegrityGainSwitchErrors);
109 
111  ev.getByToken(ebIntegrityChIdErrorsToken_, ebIntegrityChIdErrors);
112  ebDetIdColls.push_back(ebIntegrityChIdErrors);
113 
115  ev.getByToken(eeIntegrityGainErrorsToken_, eeIntegrityGainErrors);
116  eeDetIdColls.push_back(eeIntegrityGainErrors);
117 
119  ev.getByToken(eeIntegrityGainSwitchErrorsToken_, eeIntegrityGainSwitchErrors);
120  eeDetIdColls.push_back(eeIntegrityGainSwitchErrors);
121 
123  ev.getByToken(eeIntegrityChIdErrorsToken_, eeIntegrityChIdErrors);
124  eeDetIdColls.push_back(eeIntegrityChIdErrors);
125 
127  ev.getByToken(integrityTTIdErrorsToken_, integrityTTIdErrors);
128  ttColls.push_back(integrityTTIdErrors);
129 
131  ev.getByToken(integrityBlockSizeErrorsToken_, integrityBlockSizeErrors);
132  ttColls.push_back(integrityBlockSizeErrors);
133 
134  /*
135  * get regions of interest from SRP
136  */
137  // -- Barrel
138  EBDetIdCollection ebSrpDetId;
139  EcalTrigTowerDetIdCollection ebSrpTTDetId;
140  for (EBSrFlagCollection::const_iterator it = ebSrFlags->begin(); it != ebSrFlags->end(); ++it) {
141  const int flag = it->value();
142  if (flag == EcalSrFlag::SRF_FULL || (flag == EcalSrFlag::SRF_FORCED_MASK)) {
143  const EcalTrigTowerDetId ttId = it->id();
144  ebSrpTTDetId.push_back(ttId);
145 
146  const std::vector<DetId> vid = ttMap_->constituentsOf(ttId);
147 
148  for (std::vector<DetId>::const_iterator itId = vid.begin(); itId != vid.end(); ++itId) {
149  ebSrpDetId.push_back(*itId);
150  }
151  }
152  }
153  // -- Endcap
154  EEDetIdCollection eeSrpDetId;
155  //EcalTrigTowerDetIdCollection eeSrpTTDetId;
156  for (EESrFlagCollection::const_iterator it = eeSrFlags->begin(); it != eeSrFlags->end(); ++it) {
157  const int flag = it->value();
158  if (flag == EcalSrFlag::SRF_FULL || (flag == EcalSrFlag::SRF_FORCED_MASK)) {
159  //EcalTrigTowerDetId ttId = it->id();
160  //eeSrpTTDetId.push_back( ttId );
161  const EcalScDetId scId(it->id());
162  // not clear how to get the vector of DetId constituents of a SC...
164  //std::vector<DetId> vid = ecalMapping_->dccTowerConstituents( eId.dccId(), eId.towerId() );
165  std::vector<DetId> vid;
166  for (int dx = 1; dx <= 5; ++dx) {
167  for (int dy = 1; dy <= 5; ++dy) {
168  const int ix = (scId.ix() - 1) * 5 + dx;
169  const int iy = (scId.iy() - 1) * 5 + dy;
170  const int iz = scId.zside();
171  if (EEDetId::validDetId(ix, iy, iz)) {
172  vid.push_back(EEDetId(ix, iy, iz));
173  }
174  }
175  }
177  //std::vector<DetId> vid = ttMap_->constituentsOf( ttId );
178  for (std::vector<DetId>::const_iterator itId = vid.begin(); itId != vid.end(); ++itId) {
179  eeSrpDetId.push_back(*itId);
180  }
181  }
182  }
183  // SRP switched off: get the list from the DB
184  if (ebSrFlags->empty()) {
185  }
186  // SRP switched off: get the list from the DB
187  if (eeSrFlags->empty()) {
188  }
189 
190  /*
191  * get OR of integrity error collections
192  * in interesting regions flagged by SRP
193  * and insert them in the list of DetId to recover
194  */
195  // -- Barrel
196  for (std::vector<edm::Handle<EBDetIdCollection>>::const_iterator it = ebDetIdColls.begin(); it != ebDetIdColls.end();
197  ++it) {
198  const EBDetIdCollection* idc = it->product();
199  for (EBDetIdCollection::const_iterator jt = idc->begin(); jt != idc->end(); ++jt)
200  if (include(ebSrpDetId, *jt))
201  ebDetIdToRecover->insert(*jt);
202  }
203  // -- Endcap
204  for (std::vector<edm::Handle<EEDetIdCollection>>::const_iterator it = eeDetIdColls.begin(); it != eeDetIdColls.end();
205  ++it) {
206  const EEDetIdCollection* idc = it->product();
207  for (EEDetIdCollection::const_iterator jt = idc->begin(); jt != idc->end(); ++jt)
208  if (include(eeSrpDetId, *jt))
209  eeDetIdToRecover->insert(*jt);
210  }
211 
212  /*
213  * find isolated dead channels (from DB info) --> chStatus 10, 11, 12
214  * and group of dead channels w/ trigger(from DB info) --> chStatus 13
215  * in interesting regions flagged by SRP
216  */
217  // -- Barrel
218  for (EBDetIdCollection::const_iterator itId = ebSrpDetId.begin(); itId != ebSrpDetId.end(); ++itId) {
220  if (chit != chStatus_->end()) {
221  const int flag = (*chit).getStatusCode();
222  if (flag >= 10 && flag <= 12) { // FIXME -- avoid hardcoded values...
223  ebDetIdToRecover->insert(*itId);
224  } else if (flag == 13 || flag == 14) { // FIXME -- avoid hardcoded values...
225  ebTTDetIdToRecover->insert((*itId).tower());
226  }
227  } else {
228  edm::LogError("EcalDetIdToBeRecoveredProducer") << "No channel status found for xtal " << (*itId).rawId()
229  << "! something wrong with EcalChannelStatus in your DB? ";
230  }
231  }
232  // -- Endcap
233  for (EEDetIdCollection::const_iterator itId = eeSrpDetId.begin(); itId != eeSrpDetId.end(); ++itId) {
235  if (chit != chStatus_->end()) {
236  int flag = (*chit).getStatusCode();
237  if (flag >= 10 && flag <= 12) { // FIXME -- avoid hardcoded values...
238  eeDetIdToRecover->insert(*itId);
239  } else if (flag == 13 || flag == 14) { // FIXME -- avoid hardcoded values...
240  eeSCDetIdToRecover->insert(
241  EcalScDetId(1 + ((*itId).ix() - 1) / 5, 1 + ((*itId).iy() - 1) / 5, (*itId).zside()));
242  }
243  } else {
244  edm::LogError("EcalDetIdToBeRecoveredProducer") << "No channel status found for xtal " << (*itId).rawId()
245  << "! something wrong with EcalChannelStatus in your DB? ";
246  }
247  }
248 
249  // loop over electronics id associated with TT and SC
250  for (size_t t = 0; t < ttColls.size(); ++t) {
251  const EcalElectronicsIdCollection& coll = *(ttColls[t]);
252 
253  for (size_t i = 0; i < coll.size(); ++i) {
254  const EcalElectronicsId elId = coll[i];
255  const EcalSubdetector subdet = elId.subdet();
256  const DetId detId = ecalMapping_->getDetId(elId);
257 
258  if (subdet == EcalBarrel) { // elId pointing to TT
259  // get list of crystals corresponding to TT
260  const EcalTrigTowerDetId ttId(ttMap_->towerOf(detId));
261  const std::vector<DetId>& vid = ttMap_->constituentsOf(ttId);
262 
263  for (size_t j = 0; j < vid.size(); ++j) {
264  const EBDetId ebdi(vid[j]);
265  if (include(ebSrpDetId, ebdi)) {
266  ebDetIdToRecover->insert(ebdi);
267  ebTTDetIdToRecover->insert(ebdi.tower());
268  }
269  }
270  } else if (subdet == EcalEndcap) { // elId pointing to SC
271  // extract list of crystals corresponding to SC
272  const EcalScDetId scId(detId);
273  std::vector<DetId> vid;
274  for (int dx = 1; dx <= 5; ++dx) {
275  for (int dy = 1; dy <= 5; ++dy) {
276  const int ix = (scId.ix() - 1) * 5 + dx;
277  const int iy = (scId.iy() - 1) * 5 + dy;
278  const int iz = scId.zside();
279  if (EEDetId::validDetId(ix, iy, iz))
280  vid.push_back(EEDetId(ix, iy, iz));
281  }
282  }
283 
284  for (size_t j = 0; j < vid.size(); ++j) {
285  const EEDetId eedi(vid[i]);
286  if (include(eeSrpDetId, eedi)) {
287  eeDetIdToRecover->insert(eedi);
288  eeSCDetIdToRecover->insert(EcalScDetId(eedi));
289  }
290  }
291  } else
292  edm::LogWarning("EcalDetIdToBeRecoveredProducer")
293  << "Incorrect EcalSubdetector = " << subdet << " in EcalElectronicsIdCollection collection ";
294  }
295  }
296 
297  // return the collections
298  ev.put(std::move(ebDetIdToRecover), ebDetIdCollection_);
299  ev.put(std::move(eeDetIdToRecover), eeDetIdCollection_);
300  ev.put(std::move(ebTTDetIdToRecover), ttDetIdCollection_);
301  ev.put(std::move(eeSCDetIdToRecover), scDetIdCollection_);
302 }
303 
306  desc.add<edm::InputTag>("ebIntegrityChIdErrors", edm::InputTag("ecalDigis", "EcalIntegrityChIdErrors"));
307  desc.add<std::string>("ebDetIdToBeRecovered", "ebDetId");
308  desc.add<edm::InputTag>("integrityTTIdErrors", edm::InputTag("ecalDigis", "EcalIntegrityTTIdErrors"));
309  desc.add<edm::InputTag>("eeIntegrityGainErrors", edm::InputTag("ecalDigis", "EcalIntegrityGainErrors"));
310  desc.add<std::string>("ebFEToBeRecovered", "ebFE");
311  desc.add<edm::InputTag>("ebIntegrityGainErrors", edm::InputTag("ecalDigis", "EcalIntegrityGainErrors"));
312  desc.add<std::string>("eeDetIdToBeRecovered", "eeDetId");
313  desc.add<edm::InputTag>("eeIntegrityGainSwitchErrors", edm::InputTag("ecalDigis", "EcalIntegrityGainSwitchErrors"));
314  desc.add<edm::InputTag>("eeIntegrityChIdErrors", edm::InputTag("ecalDigis", "EcalIntegrityChIdErrors"));
315  desc.add<edm::InputTag>("ebIntegrityGainSwitchErrors", edm::InputTag("ecalDigis", "EcalIntegrityGainSwitchErrors"));
316  desc.add<edm::InputTag>("ebSrFlagCollection", edm::InputTag("ecalDigis"));
317  desc.add<std::string>("eeFEToBeRecovered", "eeFE");
318  desc.add<edm::InputTag>("integrityBlockSizeErrors", edm::InputTag("ecalDigis", "EcalIntegrityBlockSizeErrors"));
319  desc.add<edm::InputTag>("eeSrFlagCollection", edm::InputTag("ecalDigis"));
320  descriptions.add("ecalDetIdToBeRecovered", desc);
321 }
322 
size_type size() const
Definition: EDCollection.h:82
T getParameter(std::string const &) const
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
OrphanHandle< PROD > put(std::unique_ptr< PROD > product)
Put a new product.
Definition: Event.h:131
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:525
const_iterator end() const
Definition: EDCollection.h:122
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
void push_back(T const &t)
Definition: EDCollection.h:60
edm::EDGetTokenT< EBDetIdCollection > ebIntegrityGainErrorsToken_
bool ev
edm::EDGetTokenT< EcalElectronicsIdCollection > integrityTTIdErrorsToken_
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 &)
Definition: Electron.h:6
EcalTrigTowerDetId towerOf(const DetId &id) const
Get the tower id for this det id (or null if not known)
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
edm::EDGetTokenT< EEDetIdCollection > eeIntegrityGainSwitchErrorsToken_
int ix() const
Definition: EcalScDetId.h:70
void produce(edm::Event &evt, const edm::EventSetup &es) final
static const int SRF_FULL
Definition: EcalSrFlag.h:24
EcalTrigTowerDetId tower() const
get the HCAL/trigger iphi of this crystal
Definition: EBDetId.h:57
EcalDetIdToBeRecoveredProducer(const edm::ParameterSet &ps)
ParameterDescriptionBase * add(U const &iLabel, T const &value)
std::vector< DetId > constituentsOf(const EcalTrigTowerDetId &id) const
Get the constituent detids for this tower id.
edm::EDGetTokenT< EBSrFlagCollection > ebSrFlagToken_
EcalSubdetector subdet() const
get the subdet
edm::EDGetTokenT< EBDetIdCollection > ebIntegrityGainSwitchErrorsToken_
int iy() const
Definition: EcalScDetId.h:76
edm::EDGetTokenT< EEDetIdCollection > eeIntegrityChIdErrorsToken_
const_iterator end() const
Definition: DetId.h:17
edm::ESHandle< EcalTrigTowerConstituentsMap > ttMap_
const_iterator begin() const
Definition: EDCollection.h:117
JetCorrectorParametersCollection coll
Definition: classes.h:10
static bool validDetId(int crystal_ix, int crystal_iy, int iz)
Definition: EEDetId.h:248
std::vector< Item >::const_iterator const_iterator
int zside() const
Definition: EcalScDetId.h:64
void add(std::string const &label, ParameterSetDescription const &psetDescription)
DetId getDetId(const EcalElectronicsId &id) const
Get the detid given an electronicsId.
edm::EDGetTokenT< EEDetIdCollection > eeIntegrityGainErrorsToken_
bool include(const CollT &coll, const ItemT &item)
T get() const
Definition: EventSetup.h:73
const_iterator find(uint32_t rawId) const
edm::EDGetTokenT< EESrFlagCollection > eeSrFlagToken_
void beginRun(edm::Run const &run, const edm::EventSetup &es) final
const_iterator end() const
edm::EDGetTokenT< EBDetIdCollection > ebIntegrityChIdErrorsToken_
const EcalElectronicsMapping * ecalMapping_
EcalSubdetector
T const * product() const
Definition: ESHandle.h:86
def move(src, dest)
Definition: eostools.py:511
const_iterator begin() const
Definition: Run.h:45
std::vector< T >::const_iterator const_iterator
Definition: EDCollection.h:19