CMS 3D CMS Logo

EcalSelectiveReadoutSuppressor.cc
Go to the documentation of this file.
6 
8 
9 // Geometry
15 
17 
18 //exceptions:
20 
21 #include <limits>
22 #include <cmath>
23 #include <iostream>
24 
25 using namespace boost;
26 using namespace std;
27 
29 
31  ttThresOnCompressedEt_(false),
32  ievt_(0)
33 {
34 
35  firstFIRSample = settings->ecalDccZs1stSample_[0];
36  weights = settings->dccNormalizedWeights_[0];
37  symetricZS = settings->symetricZS_[0];
38  actions_ = settings->actions_;
39 
40 
41  int defTtf = params.getParameter<int>("defaultTtf");
42  if(defTtf < 0 || defTtf > 7){
43  throw cms::Exception("InvalidParameter") << "Value of EcalSelectiveReadoutProducer module parameter defaultTtf, "
44  << defaultTtf_ << ", is out of the valid range 0..7\n";
45  } else{
47  }
48 
49  //online configuration has only 4 actions flags, the 4 'forced' flags being the same with the force
50  //bit set to 1. Extends the actions vector for case of online-type configuration:
51  if(actions_.size()==4){
52  for(int i = 0; i < 4; ++i){
53  actions_.push_back(actions_[i] | 0x4);
54  }
55  }
56 
57 
58  bool actionValid = actions_.size()==8;
59  for(size_t i = 0; i < actions_.size(); ++i){
60  if(actions_[i] < 0 || actions_[i] > 7) actionValid = false;
61  }
62 
63  if(!actionValid){
64  throw cms::Exception("InvalidParameter") << "EcalSelectiveReadoutProducer module parameter 'actions' is "
65  "not valid. It must be a vector of 8 integer values comprised between 0 and 7\n";
66  }
67 
68  double adcToGeV = settings->ebDccAdcToGeV_;
69  thrUnit[BARREL] = adcToGeV/4.; //unit=1/4th ADC count
70 
71  adcToGeV = settings->eeDccAdcToGeV_;
72  thrUnit[ENDCAP] = adcToGeV/4.; //unit=1/4th ADC count
74  = auto_ptr<EcalSelectiveReadout>(new EcalSelectiveReadout(
75  settings->deltaEta_[0],
76  settings->deltaPhi_[0]));
77  const int eb = 0;
78  const int ee = 1;
80  settings->srpLowInterestChannelZS_[ee],
81  settings->srpHighInterestChannelZS_[eb],
82  settings->srpHighInterestChannelZS_[ee]
83  );
84  trigPrimBypass_ = params.getParameter<bool>("trigPrimBypass");
85  trigPrimBypassMode_ = params.getParameter<int>("trigPrimBypassMode");
87  = params.getParameter<bool>("trigPrimBypassWithPeakFinder");
88  trigPrimBypassLTH_ = params.getParameter<double>("trigPrimBypassLTH");
89  trigPrimBypassHTH_ = params.getParameter<double>("trigPrimBypassHTH");
90  if(trigPrimBypass_){
91  edm::LogWarning("Digitization") << "Beware a simplified trigger primitive "
92  "computation is used for the ECAL selective readout";
93  if(trigPrimBypassMode_ !=0 && trigPrimBypassMode_ !=1){
94  throw cms::Exception("InvalidParameter")
95  << "Invalid value for EcalSelectiveReadoutProducer parameter 'trigPrimBypassMode_'."
96  " Valid values are 0 and 1.\n";
97  }
98  ttThresOnCompressedEt_ = (trigPrimBypassMode_==1);
99  }
100 }
101 
102 
104  theTriggerMap = map;
105  ecalSelectiveReadout->setTriggerMap(map);
106 }
107 
109  ecalSelectiveReadout->setElecMap(map);
110 }
111 
112 
114 {
115 #ifndef ECALSELECTIVEREADOUT_NOGEOM
116  ecalSelectiveReadout->setGeometry(caloGeometry);
117 #endif
118 }
119 
120 
122  double endcapLowInterest,
123  double barrelHighInterest,
124  double endcapHighInterest){
125  //center, neighbour and single RUs are grouped into a single
126  //'high interest' group
127  int lowInterestThr[2]; //index for BARREL/ENDCAP
128  // int lowInterestSrFlag[2];
129  int highInterestThr[2];
130  // int highInterestSrFlag[2];
131 
132  lowInterestThr[BARREL] = internalThreshold(barrelLowInterest, BARREL);
133  // lowInterestSrFlag[BARREL] = thr2Srf(lowInterestThr[BARREL],
134  // EcalSrFlag::SRF_ZS1);
135 
136  highInterestThr[BARREL] = internalThreshold(barrelHighInterest, BARREL);
137  // highInterestSrFlag[BARREL] = thr2Srf(highInterestThr[BARREL],
138  // EcalSrFlag::SRF_ZS2);
139 
140  lowInterestThr[ENDCAP] = internalThreshold(endcapLowInterest, ENDCAP);
141  //lowInterestSrFlag[ENDCAP] = thr2Srf(lowInterestThr[ENDCAP],
142  // EcalSrFlag::SRF_ZS1);
143 
144  highInterestThr[ENDCAP] = internalThreshold(endcapHighInterest, ENDCAP);
145  // highInterestSrFlag[ENDCAP] = thr2Srf(highInterestThr[ENDCAP],
146  // EcalSrFlag::SRF_ZS2);
147 
148  const int FORCED_MASK = EcalSelectiveReadout::FORCED_MASK;
149 
150  for(int iSubDet = 0; iSubDet<2; ++iSubDet){
151  //low interest
152  //zsThreshold[iSubDet][0] = lowInterestThr[iSubDet];
153  //srFlags[iSubDet][0] = lowInterestSrFlag[iSubDet];
154  //srFlags[iSubDet][0 + FORCED_MASK] = FORCED_MASK | lowInterestSrFlag[iSubDet];
155 
156  //single->high interest
157  //zsThreshold[iSubDet][1] = highInterestThr[iSubDet];
158  //srFlags[iSubDet][1] = highInterestSrFlag[iSubDet];
159  //srFlags[iSubDet][1 + FORCED_MASK] = FORCED_MASK | highInterestSrFlag[iSubDet];
160 
161  //neighbour->high interest
162  //zsThreshold[iSubDet][2] = highInterestThr[iSubDet];
163  //srFlags[iSubDet][2] = highInterestSrFlag[iSubDet];
164  //srFlags[iSubDet][2 + FORCED_MASK] = FORCED_MASK | highInterestSrFlag[iSubDet];
165 
166  //center->high interest
167  //zsThreshold[iSubDet][3] = highInterestThr[iSubDet];
168  //srFlags[iSubDet][3] = highInterestSrFlag[iSubDet];
169  //srFlags[iSubDet][3 + FORCED_MASK] = FORCED_MASK | highInterestSrFlag[iSubDet];
170  for(size_t i = 0; i < 8; ++i){
171  srFlags[iSubDet][i] = actions_[i];
172  if((actions_[i] & ~FORCED_MASK) == 0) zsThreshold[iSubDet][i] = numeric_limits<int>::max();
173  else if((actions_[i] & ~FORCED_MASK) == 1) zsThreshold[iSubDet][i] = lowInterestThr[iSubDet];
174  else if((actions_[i] & ~FORCED_MASK) == 2) zsThreshold[iSubDet][i] = highInterestThr[iSubDet];
175  else zsThreshold[iSubDet][i] = numeric_limits<int>::min();
176  }
177 
178 // for(size_t i = 0; i < 8; ++i){
179 // cout << "zsThreshold[" << iSubDet << "][" << i << "] = " << zsThreshold[iSubDet][i] << endl;
180 // }
181  }
182 }
183 
184 // int EcalSelectiveReadoutSuppressor::thr2Srf(int thr, int zsFlag) const{
185 // if(thr==numeric_limits<int>::max()){
186 // return EcalSrFlag::SRF_SUPPRESS;
187 // }
188 // if(thr==numeric_limits<int>::min()){
189 // return EcalSrFlag::SRF_FULL;
190 // }
191 // return zsFlag;
192 // }
193 
195  int iSubDet) const{
196  double thr_ = thresholdInGeV / thrUnit[iSubDet];
197  //treating over- and underflows, threshold is coded on 11+1 signed bits
198  //an underflow threshold is considered here as if NoRO DCC switch is on
199  //an overflow threshold is considered here as if ForcedRO DCC switch in on
200  //Beware that conparison must be done on a double type, because conversion
201  //cast to an int of a double higher than MAX_INT is undefined.
202  int thr;
203  if(thr_>=0x7FF+.5){
204  thr = numeric_limits<int>::max();
205  } else if(thr_<=-0x7FF-.5){
206  thr = numeric_limits<int>::min();
207  } else{
208  thr = lround(thr_);
209  }
210  return thr;
211 }
212 
213 //This implementation assumes that int is coded on at least 28-bits,
214 //which in pratice should be always true.
216  int thr){
217  //FIR filter weights:
218  const vector<int>& w = getFIRWeigths();
219 
220  //accumulator used to compute weighted sum of samples
221  int acc = 0;
222  bool gain12saturated = false;
223  const int gain12 = 0x01;
224  const int lastFIRSample = firstFIRSample + nFIRTaps - 1;
225  //LogDebug("DccFir") << "DCC FIR operation: ";
226  int iWeight = 0;
227  for(int iSample=firstFIRSample-1;
228  iSample<lastFIRSample; ++iSample, ++iWeight){
229  if(iSample>=0 && iSample < (int)frame.size()){
230  EcalMGPASample sample(frame[iSample]);
231  if(sample.gainId()!=gain12) gain12saturated = true;
232  //LogTrace("DccFir") << (iSample>=firstFIRSample?"+":"") << sample.adc()
233  // << "*(" << w[iWeight] << ")";
234  acc+=sample.adc()*w[iWeight];
235  } else{
236  edm::LogWarning("DccFir") << __FILE__ << ":" << __LINE__ <<
237  ": Not enough samples in data frame or 'ecalDccZs1stSample' module "
238  "parameter is not valid...";
239  }
240  }
241 
242  if(symetricZS){//cut on absolute value
243  if(acc<0) acc = -acc;
244  }
245 
246  //LogTrace("DccFir") << "\n";
247  //discards the 8 LSBs
248  //(result of shift operator on negative numbers depends on compiler
249  //implementation, therefore the value is offset to make sure it is positive
250  //before performing the bit shift).
251  acc = ((acc + (1<<30)) >>8) - (1 <<(30-8));
252 
253  //ZS passed if weigthed sum acc above ZS threshold or if
254  //one sample has a lower gain than gain 12 (that is gain 12 output
255  //is saturated)
256 
257  const bool result = (acc >= thr) || gain12saturated;
258 
259  //LogTrace("DccFir") << "acc: " << acc << "\n"
260  // << "threshold: " << thr << " ("
261  // << thr*thrUnit[((EcalDataFrame&)frame).id().subdetId()==EcalBarrel?0:1]
262  // << "GeV)\n"
263  // << "saturated: " << (gain12saturated?"yes":"no") << "\n"
264  // << "ZS passed: " << (result?"yes":"no")
265  // << (symetricZS?" (symetric cut)":"") << "\n";
266 
267  return result;
268 }
269 
271  const EcalTrigPrimDigiCollection & trigPrims,
274  EBDigiCollection selectedBarrelDigis;
275  EEDigiCollection selectedEndcapDigis;
276 
277  run(eventSetup, trigPrims, barrelDigis, endcapDigis,
278  &selectedBarrelDigis, &selectedEndcapDigis, nullptr, nullptr);
279 
280 //replaces the input with the suppressed version
281  barrelDigis.swap(selectedBarrelDigis);
282  endcapDigis.swap(selectedEndcapDigis);
283 }
284 
285 
286 void
288  const EcalTrigPrimDigiCollection & trigPrims,
291  EBDigiCollection* selectedBarrelDigis,
292  EEDigiCollection* selectedEndcapDigis,
293  EBSrFlagCollection* ebSrFlags,
294  EESrFlagCollection* eeSrFlags){
295  ++ievt_;
296  if(!trigPrimBypass_ || ttThresOnCompressedEt_){//uses output of TPG emulator
297  setTtFlags(trigPrims);
298  } else{//debug mode, run w/o TP digis
299  setTtFlags(eventSetup, barrelDigis, endcapDigis);
300  }
301 
302  ecalSelectiveReadout->runSelectiveReadout0(ttFlags);
303 
304  if(selectedBarrelDigis){
305  selectedBarrelDigis->reserve(barrelDigis.size()/20);
306 
307  // do barrel first
308  for(EBDigiCollection::const_iterator digiItr = barrelDigis.begin();
309  digiItr != barrelDigis.end(); ++digiItr){
310  int interestLevel
311  = ecalSelectiveReadout->getCrystalInterest(EBDigiCollection::DetId(digiItr->id())) && ~EcalSelectiveReadout::FORCED_MASK;
312  if(accept(*digiItr, zsThreshold[BARREL][interestLevel])){
313  selectedBarrelDigis->push_back(digiItr->id(), digiItr->begin());
314  }
315  }
316  }
317 
318  // and endcaps
319  if(selectedEndcapDigis){
320  selectedEndcapDigis->reserve(endcapDigis.size()/20);
321  for(EEDigiCollection::const_iterator digiItr = endcapDigis.begin();
322  digiItr != endcapDigis.end(); ++digiItr){
323  int interestLevel
324  = ecalSelectiveReadout->getCrystalInterest(EEDigiCollection::DetId(digiItr->id()))
325  & ~EcalSelectiveReadout::FORCED_MASK;
326  if(accept(*digiItr, zsThreshold[ENDCAP][interestLevel])){
327  selectedEndcapDigis->push_back(digiItr->id(), digiItr->begin());
328  }
329  }
330  }
331 
332  if(ievt_ <= 10){
333  int neb = (selectedBarrelDigis?selectedBarrelDigis->size():0);
334  if(selectedEndcapDigis) LogDebug("EcalSelectiveReadout")
335  // << __FILE__ << ":" << __LINE__ << ": "
336  << "Number of EB digis passing the SR: " << neb
337  << " / " << barrelDigis.size() << "\n";
338  if(selectedEndcapDigis) LogDebug("EcalSelectiveReadout")
339  // << __FILE__ << ":" << __LINE__ << ": "
340  << "\nNumber of EE digis passing the SR: "
341  << selectedEndcapDigis->size()
342  << " / " << endcapDigis.size() << "\n";
343  }
344 
345  if(ebSrFlags) ebSrFlags->reserve(34*72);
346  if(eeSrFlags) eeSrFlags->reserve(624);
347  //SR flags:
348  for(int iZ = -1; iZ <=1; iZ+=2){ //-1=>EE-, EB-, +1=>EE+, EB+
349  //barrel:
350  for(unsigned iEta = 1; iEta <= nBarrelTriggerTowersInEta/2; ++iEta){
351  for(unsigned iPhi = 1; iPhi <= nTriggerTowersInPhi; ++iPhi){
352  const EcalTrigTowerDetId id(iZ, EcalBarrel, iEta, iPhi);
354  = ecalSelectiveReadout->getTowerInterest(id);
355  if(interest<0){
356  throw cms::Exception("EcalSelectiveReadout")
357  << __FILE__ << ":" << __LINE__ << ": " << "unknown SR flag. for "
358  << " TT " << id << ". Most probably a bug.";
359  }
360  int flag;
361  // if(interest==EcalSelectiveReadout::FORCED_RO){
362  // flag = EcalSrFlag::SRF_FORCED_MASK | EcalSrFlag::SRF_FULL;
363  //} else{
364  flag = srFlags[BARREL][interest];
365  //}
366  if(ebSrFlags) ebSrFlags->push_back(EBSrFlag(id, flag));
367  }//next iPhi
368  } //next barrel iEta
369 
370  //endcap:
371  EcalScDetId id;
372  for(int iX = 1; iX <= 20; ++iX){
373  for(int iY = 1; iY <= 20; ++iY){
374 
375  if (EcalScDetId::validDetId(iX, iY, iZ))
376  id = EcalScDetId(iX, iY, iZ);
377  else
378  continue;
379 
381  = ecalSelectiveReadout->getSuperCrystalInterest(id);
382 
383  if(interest>=0){//negative no SC at (iX,iY) coordinates
384  int flag;
385  // if(interest==EcalSelectiveReadout::FORCED_RO){
386  // flag = EcalSrFlag::SRF_FORCED_MASK | EcalSrFlag::SRF_FULL;
387  //} else{
388  flag = srFlags[ENDCAP][interest];
389  //}
390  if(eeSrFlags) eeSrFlags->push_back(EESrFlag(id, flag));
391  } else if(iX < 9 || iX > 12 || iY < 9 || iY >12){ //not an inner partial SC
392  edm::LogError("EcalSelectiveReadout") << __FILE__ << ":" << __LINE__ << ": "
393  << "negative interest in EE for SC "
394  << id << "\n";
395  }
396  } //next iY
397  } //next iX
398  }
399 }
400 
401 
403  for(size_t iEta0 = 0; iEta0 < nTriggerTowersInEta; ++iEta0){
404  for(size_t iPhi0 = 0; iPhi0 < nTriggerTowersInPhi; ++iPhi0){
405  ttFlags[iEta0][iPhi0] = defaultTtf_;
406  }
407  }
408  for(EcalTrigPrimDigiCollection::const_iterator trigPrim = trigPrims.begin();
409  trigPrim != trigPrims.end(); ++trigPrim){
410  int iEta = trigPrim->id().ieta();
411  unsigned int iEta0;
412  if(iEta<0){ //z- half ECAL: transforming ranges -28;-1 => 0;27
413  iEta0 = iEta + nTriggerTowersInEta/2;
414  } else{ //z+ halfECAL: transforming ranges 1;28 => 28;55
415  iEta0 = iEta + nTriggerTowersInEta/2 - 1;
416  }
417 
418  unsigned int iPhi0 = trigPrim->id().iphi() - 1;
419 
421  ttFlags[iEta0][iPhi0] =
422  (EcalSelectiveReadout::ttFlag_t) trigPrim->ttFlag();
423  } else{
424  int compressedEt = trigPrim->compressedEt();
425  if(compressedEt < trigPrimBypassLTH_){
427  } else if(compressedEt < trigPrimBypassHTH_){
429  } else{
431  }
432  }
433  }
434 }
435 
436 
438  if(firWeights.empty()){
439  firWeights = vector<int>(nFIRTaps, 0); //default weight: 0;
440  const static int maxWeight = 0xEFF; //weights coded on 11+1 signed bits
441  for(unsigned i=0; i < min((size_t)nFIRTaps,weights.size()); ++i){
442  firWeights[i] = lround(weights[i] * (1<<10));
443  if(abs(firWeights[i])>maxWeight){//overflow
444  firWeights[i] = firWeights[i]<0?-maxWeight:maxWeight;
445  }
446  }
447  }
448  return firWeights;
449 }
450 
451 void
453  const EBDigiCollection& ebDigis,
454  const EEDigiCollection& eeDigis){
455  double trigPrim[nTriggerTowersInEta][nTriggerTowersInPhi];
456 
457  //ecal geometry:
458 // static const CaloSubdetectorGeometry* eeGeometry = 0;
459 // static const CaloSubdetectorGeometry* ebGeometry = 0;
460  const CaloSubdetectorGeometry* eeGeometry = nullptr;
461  const CaloSubdetectorGeometry* ebGeometry = nullptr;
462 // if(eeGeometry==0 || ebGeometry==0){
463  edm::ESHandle<CaloGeometry> geoHandle;
464  es.get<CaloGeometryRecord>().get(geoHandle);
465  eeGeometry
466  = (*geoHandle).getSubdetectorGeometry(DetId::Ecal, EcalEndcap);
467  ebGeometry
468  = (*geoHandle).getSubdetectorGeometry(DetId::Ecal, EcalBarrel);
469 // }
470 
471  //init trigPrim array:
472  bzero(trigPrim, sizeof(trigPrim));
473 
474  for(EBDigiCollection::const_iterator it = ebDigis.begin();
475  it != ebDigis.end(); ++it){
476  EBDataFrame frame(*it);
477  const EcalTrigTowerDetId& ttId = theTriggerMap->towerOf(frame.id());
478 // edm:::LogDebug("TT") << __FILE__ << ":" << __LINE__ << ": "
479 // << ((EBDetId&)frame.id()).ieta()
480 // << "," << ((EBDetId&)frame.id()).iphi()
481 // << " -> " << ttId.ieta() << "," << ttId.iphi() << "\n";
482  const int iTTEta0 = iTTEta2cIndex(ttId.ieta());
483  const int iTTPhi0 = iTTPhi2cIndex(ttId.iphi());
484  double theta = ebGeometry->getGeometry(frame.id())->getPosition().theta();
485  double e = frame2Energy(frame);
487  || ((frame2Energy(frame,-1) < e) && (frame2Energy(frame, 1) < e))){
488  trigPrim[iTTEta0][iTTPhi0] += e*sin(theta);
489  }
490  }
491 
492  for(EEDigiCollection::const_iterator it = eeDigis.begin();
493  it != eeDigis.end(); ++it){
494  EEDataFrame frame(*it);
495  const EcalTrigTowerDetId& ttId = theTriggerMap->towerOf(frame.id());
496  const int iTTEta0 = iTTEta2cIndex(ttId.ieta());
497  const int iTTPhi0 = iTTPhi2cIndex(ttId.iphi());
498 // cout << __FILE__ << ":" << __LINE__ << ": EE xtal->TT "
499 // << ((EEDetId&)frame.id()).ix()
500 // << "," << ((EEDetId&)frame.id()).iy()
501 // << " -> " << ttId.ieta() << "," << ttId.iphi() << "\n";
502  double theta = eeGeometry->getGeometry(frame.id())->getPosition().theta();
503  double e = frame2Energy(frame);
505  || ((frame2Energy(frame,-1) < e) && (frame2Energy(frame, 1) < e))){
506  trigPrim[iTTEta0][iTTPhi0] += e*sin(theta);
507  }
508  }
509 
510  //dealing with pseudo-TT in two inner EE eta-ring:
511  int innerTTEtas[] = {0, 1, 54, 55};
512  for(unsigned iRing = 0; iRing < sizeof(innerTTEtas)/sizeof(innerTTEtas[0]);
513  ++iRing){
514  int iTTEta0 = innerTTEtas[iRing];
515  //this detector eta-section is divided in only 36 phi bins
516  //For this eta regions,
517  //current tower eta numbering scheme is inconsistent. For geometry
518  //version 133:
519  //- TT are numbered from 0 to 72 for 36 bins
520  //- some TT have an even index, some an odd index
521  //For geometry version 125, there are 72 phi bins.
522  //The code below should handle both geometry definition.
523  //If there are 72 input trigger primitives for each inner eta-ring,
524  //then the average of the trigger primitive of the two pseudo-TT of
525  //a pair (nEta, nEta+1) is taken as Et of both pseudo TTs.
526  //If there are only 36 input TTs for each inner eta ring, then half
527  //of the present primitive of a pseudo TT pair is used as Et of both
528  //pseudo TTs.
529 
530  for(unsigned iTTPhi0 = 0; iTTPhi0 < nTriggerTowersInPhi-1; iTTPhi0 += 2){
531  double et = .5*(trigPrim[iTTEta0][iTTPhi0]
532  +trigPrim[iTTEta0][iTTPhi0+1]);
533  //divides the TT into 2 phi bins in order to match with 72 phi-bins SRP
534  //scheme or average the Et on the two pseudo TTs if the TT is already
535  //divided into two trigger primitives.
536  trigPrim[iTTEta0][iTTPhi0] = et;
537  trigPrim[iTTEta0][iTTPhi0+1] = et;
538  }
539  }
540 
541  for(unsigned iTTEta0 = 0; iTTEta0 < nTriggerTowersInEta; ++iTTEta0){
542  for(unsigned iTTPhi0 = 0; iTTPhi0 < nTriggerTowersInPhi; ++iTTPhi0){
543  if(trigPrim[iTTEta0][iTTPhi0] > trigPrimBypassHTH_){
545  } else if(trigPrim[iTTEta0][iTTPhi0] > trigPrimBypassLTH_){
547  } else{
549  }
550 
551  // cout /*LogDebug("TT")*/
552  // << "ttFlags[" << iTTEta0 << "][" << iTTPhi0 << "] = "
553  // << ttFlags[iTTEta0][iTTPhi0] << "\n";
554  }
555  }
556 }
557 
558 template<class T>
560  int offset) const{
561  //we have to start by 0 in order to handle offset=-1
562  //(however Fenix FIR has AFAK only 5 taps)
563  double weights[] = {0., -1/3., -1/3., -1/3., 0., 1.};
564 
565  double adc2GeV = 0.;
566  if(typeid(frame) == typeid(EBDataFrame)){
567  adc2GeV = 0.035;
568  } else if(typeid(frame) == typeid(EEDataFrame)){
569  adc2GeV = 0.060;
570  } else{ //T is an invalid type!
571  //TODO: replace message by a cms exception
572  cerr << "Severe error. "
573  << __FILE__ << ":" << __LINE__ << ": "
574  << "this is a bug. Please report it.\n";
575  }
576 
577  double acc = 0;
578 
579  const int n = min<int>(frame.size(), sizeof(weights)/sizeof(weights[0]));
580 
581  double gainInv[] = {12., 1., 6., 12.};
582 
583 
584  //cout << __PRETTY_FUNCTION__ << ": ";
585  for(int i=offset; i < n; ++i){
586  int iframe = i + offset;
587  if(iframe>=0 && iframe<frame.size()){
588  acc += weights[i]*frame[iframe].adc()
589  *gainInv[frame[iframe].gainId()]*adc2GeV;
590  //cout << (iframe>offset?"+":"")
591  // << frame[iframe].adc() << "*" << gainInv[frame[iframe].gainId()]
592  // << "*" << adc2GeV << "*(" << weights[i] << ")";
593  }
594  }
595  //cout << "\n";
596  return acc;
597 }
598 
600  bool withHeader) const{
601  const char tccFlagMarker[] = { '?', '.', 'S', '?', 'C', 'E', 'E', 'E', 'E'};
604 
605  if(withHeader){
606  os << "# TCC flag map\n#\n"
607  "# +-->Phi " << tccFlagMarker[1+0] << ": 000 (low interest)\n"
608  "# | " << tccFlagMarker[1+1] << ": 001 (mid interest)\n"
609  "# | " << tccFlagMarker[1+2] << ": 010 (not valid)\n"
610  "# V Eta " << tccFlagMarker[1+3] << ": 011 (high interest)\n"
611  "# " << tccFlagMarker[1+4] << ": 1xx forced readout (Hw error)\n";
612  }
613 
614  if(iEvent>=0){
615  os << "#\n#Event " << iEvent << "\n";
616  }
617 
618  for(int iEta=0; iEta<nEta; ++iEta){
619  for(int iPhi=0; iPhi<nPhi; ++iPhi){
620  os << tccFlagMarker[ttFlags[iEta][iPhi]+1];
621  }
622  os << "\n";
623  }
624 }
#define LogDebug(id)
void push_back(const Digi &digi)
void setGeometry(const CaloGeometry *caloGeometry)
static bool validDetId(int ix, int iy, int iz)
Definition: EcalScDetId.cc:64
T getParameter(std::string const &) const
void swap(EBDigiCollection &other)
key_type id() const
Definition: EBDataFrame.h:31
static const int FORCED_MASK
boost::transform_iterator< IterHelp, boost::counting_iterator< int > > const_iterator
Definition: CLHEP.h:16
const double w
Definition: UKUtility.cc:23
EcalSelectiveReadoutSuppressor(const edm::ParameterSet &params, const EcalSRSettings *settings)
void initCellThresholds(double barrelLowInterest, double endcapLowInterest, double barrelHighInterest, double endcapHighInterest)
helpers for constructors
void printTTFlags(std::ostream &os, int iEvent=-1, bool withHeader=true) const
std::auto_ptr< EcalSelectiveReadout > ecalSelectiveReadout
Sin< T >::type sin(const T &t)
Definition: Sin.h:22
double frame2Energy(const T &frame, int timeOffset=0) const
std::vector< EcalTriggerPrimitiveDigi >::const_iterator const_iterator
Geom::Theta< T > theta() const
void push_back(T const &t)
std::vector< std::vector< float > > dccNormalizedWeights_
const char tccFlagMarker[]
Definition: GenABIO.cc:176
const_iterator begin() const
int gainId() const
get the gainId (2 bits)
unsigned ttId(DetId const &)
EcalTrigTowerDetId towerOf(const DetId &id) const
Get the tower id for this det id (or null if not known)
int ieta() const
get the tower ieta
std::vector< float > srpHighInterestChannelZS_
void setTriggerMap(const EcalTrigTowerConstituentsMap *map)
EcalSelectiveReadout::ttFlag_t ttFlags[nTriggerTowersInEta][nTriggerTowersInPhi]
std::vector< int > actions_
void run(const edm::EventSetup &eventSetup, const EcalTrigPrimDigiCollection &trigPrims, EBDigiCollection &barrelDigis, EEDigiCollection &endcapDigis)
int internalThreshold(double thresholdInGeV, int iSubDet) const
int iEvent
Definition: GenABIO.cc:230
std::vector< int > ecalDccZs1stSample_
constexpr size_type size() const
Definition: DataFrame.h:64
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
EcalSelectiveReadout::ttFlag_t defaultTtf_
T min(T a, T b)
Definition: MathUtil.h:58
key_type id() const
Definition: EEDataFrame.h:28
std::vector< int > deltaPhi_
const_iterator end() const
void reserve(size_t isize)
int iphi() const
get the tower iphi
virtual std::shared_ptr< const CaloCellGeometry > getGeometry(const DetId &id) const
Get the cell geometry of a given detector id. Should return false if not found.
std::vector< int > symetricZS_
float ebDccAdcToGeV_
ADC to GeV conversion factor used in ZS filter for EB.
static const size_t nTriggerTowersInEta
static const size_t nTriggerTowersInPhi
et
define resolution functions of each parameter
const_iterator end() const
std::vector< float > srpLowInterestChannelZS_
std::vector< int > deltaEta_
T get() const
Definition: EventSetup.h:63
bool accept(const edm::DataFrame &frame, int thr)
void push_back(const Digi &digi)
void setTtFlags(const edm::EventSetup &eventSetup, const EBDigiCollection &ebDigis, const EEDigiCollection &eeDigis)
void reserve(size_type n)
void setElecMap(const EcalElectronicsMapping *map)
const EcalTrigTowerConstituentsMap * theTriggerMap
float eeDccAdcToGeV_
ADC to GeV conversion factor used in ZS filter for EE.
long double T
void swap(EEDigiCollection &other)
const_iterator begin() const
int adc() const
get the ADC sample (12 bits)