CMS 3D CMS Logo

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