CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
HcalTriggerPrimitiveAlgo.cc
Go to the documentation of this file.
3 
4 #include <iostream>
12 
13 using namespace std;
14 
15 HcalTriggerPrimitiveAlgo::HcalTriggerPrimitiveAlgo( bool pf, const std::vector<double>& w, int latency,
16  uint32_t FG_threshold, uint32_t ZS_threshold,
17  int numberOfSamples, int numberOfPresamples,
18  uint32_t minSignalThreshold, uint32_t PMT_NoiseThreshold)
19  : incoder_(0), outcoder_(0),
20  theThreshold(0), peakfind_(pf), weights_(w), latency_(latency),
21  FG_threshold_(FG_threshold), ZS_threshold_(ZS_threshold),
22  numberOfSamples_(numberOfSamples),
23  numberOfPresamples_(numberOfPresamples),
24  minSignalThreshold_(minSignalThreshold),
25  PMT_NoiseThreshold_(PMT_NoiseThreshold),
26  peak_finder_algorithm_(2)
27 {
28  //No peak finding setting (for Fastsim)
29  if (!peakfind_){
30  numberOfSamples_ = 1;
32  }
33  // Switch to integer for comparisons - remove compiler warning
35 }
36 
37 
39 }
40 
41 
43  const HcalTPGCompressor* outcoder,
44  const HBHEDigiCollection& hbheDigis,
45  const HFDigiCollection& hfDigis,
47  const HcalTrigTowerGeometry* trigTowerGeometry,
48  float rctlsb) {
49  theTrigTowerGeometry = trigTowerGeometry;
50 
51  incoder_=dynamic_cast<const HcaluLUTTPGCoder*>(incoder);
52  outcoder_=outcoder;
53 
54  theSumMap.clear();
55  theTowerMapFGSum.clear();
56  HF_Veto.clear();
57  fgMap_.clear();
58 
59  // do the HB/HE digis
60  for(HBHEDigiCollection::const_iterator hbheItr = hbheDigis.begin();
61  hbheItr != hbheDigis.end(); ++hbheItr) {
62  addSignal(*hbheItr);
63  }
64 
65  // and the HF digis
66  for(HFDigiCollection::const_iterator hfItr = hfDigis.begin();
67  hfItr != hfDigis.end(); ++hfItr) {
68  addSignal(*hfItr);
69 
70  }
71 
72  for(SumMap::iterator mapItr = theSumMap.begin(); mapItr != theSumMap.end(); ++mapItr) {
73  result.push_back(HcalTriggerPrimitiveDigi(mapItr->first));
74  HcalTrigTowerDetId detId(mapItr->second.id());
75  if(detId.ietaAbs() >= theTrigTowerGeometry->firstHFTower())
76  { analyzeHF(mapItr->second, result.back(), rctlsb);}
77  else{analyze(mapItr->second, result.back());}
78  }
79  return;
80 }
81 
82 
84  //Hack for 300_pre10, should be removed.
85  if (frame.id().depth()==5) return;
86 
87  std::vector<HcalTrigTowerDetId> ids = theTrigTowerGeometry->towerIds(frame.id());
88  assert(ids.size() == 1 || ids.size() == 2);
89  IntegerCaloSamples samples1(ids[0], int(frame.size()));
90 
91  samples1.setPresamples(frame.presamples());
92  incoder_->adc2Linear(frame, samples1);
93 
94  std::vector<bool> msb;
95  incoder_->lookupMSB(frame, msb);
96 
97  if(ids.size() == 2) {
98  // make a second trigprim for the other one, and split the energy
99  IntegerCaloSamples samples2(ids[1], samples1.size());
100  for(int i = 0; i < samples1.size(); ++i) {
101  samples1[i] = uint32_t(samples1[i]*0.5);
102  samples2[i] = samples1[i];
103  }
104  samples2.setPresamples(frame.presamples());
105  addSignal(samples2);
106  addFG(ids[1], msb);
107  }
108  addSignal(samples1);
109  addFG(ids[0], msb);
110 }
111 
112 
114 
115  if(frame.id().depth() == 1 || frame.id().depth() == 2) {
116  std::vector<HcalTrigTowerDetId> ids = theTrigTowerGeometry->towerIds(frame.id());
117  assert(ids.size() == 1);
118  IntegerCaloSamples samples(ids[0], frame.size());
119  samples.setPresamples(frame.presamples());
120  incoder_->adc2Linear(frame, samples);
121 
122  // Don't add to final collection yet
123  // HF PMT veto sum is calculated in analyzerHF()
124  IntegerCaloSamples zero_samples(ids[0], frame.size());
125  zero_samples.setPresamples(frame.presamples());
126  addSignal(zero_samples);
127 
128  // Mask off depths: fgid is the same for both depths
129  uint32_t fgid = (frame.id().rawId() | 0x1c000) ;
130 
131  if ( theTowerMapFGSum.find(ids[0]) == theTowerMapFGSum.end() ) {
132  SumFGContainer sumFG;
133  theTowerMapFGSum.insert(std::pair<HcalTrigTowerDetId, SumFGContainer >(ids[0], sumFG));
134  }
135 
136  SumFGContainer& sumFG = theTowerMapFGSum[ids[0]];
137  SumFGContainer::iterator sumFGItr;
138  for ( sumFGItr = sumFG.begin(); sumFGItr != sumFG.end(); ++sumFGItr) {
139  if (sumFGItr->id() == fgid) break;
140  }
141  // If find
142  if (sumFGItr != sumFG.end()) {
143  for (int i=0; i<samples.size(); ++i) (*sumFGItr)[i] += samples[i];
144  }
145  else {
146  //Copy samples (change to fgid)
147  IntegerCaloSamples sumFGSamples(DetId(fgid), samples.size());
148  sumFGSamples.setPresamples(samples.presamples());
149  for (int i=0; i<samples.size(); ++i) sumFGSamples[i] = samples[i];
150  sumFG.push_back(sumFGSamples);
151  }
152 
153  // set veto to true if Long or Short less than threshold
154  if (HF_Veto.find(fgid) == HF_Veto.end()) {
155  vector<bool> vetoBits(samples.size(), false);
156  HF_Veto[fgid] = vetoBits;
157  }
158  for (int i=0; i<samples.size(); ++i)
159  if (samples[i] < minSignalThreshold_)
160  HF_Veto[fgid][i] = true;
161  }
162 }
163 
164 
166  HcalTrigTowerDetId id(samples.id());
167  SumMap::iterator itr = theSumMap.find(id);
168  if(itr == theSumMap.end()) {
169  theSumMap.insert(std::make_pair(id, samples));
170  }
171  else {
172  // wish CaloSamples had a +=
173  for(int i = 0; i < samples.size(); ++i) {
174  (itr->second)[i] += samples[i];
175  }
176  }
177 }
178 
179 
181  int shrink = weights_.size() - 1;
182  std::vector<bool>& msb = fgMap_[samples.id()];
183  IntegerCaloSamples sum(samples.id(), samples.size());
184 
185  //slide algo window
186  for(int ibin = 0; ibin < int(samples.size())- shrink; ++ibin) {
187  int algosumvalue = 0;
188  for(unsigned int i = 0; i < weights_.size(); i++) {
189  //add up value * scale factor
190  algosumvalue += int(samples[ibin+i] * weights_[i]);
191  }
192  if (algosumvalue<0) sum[ibin]=0; // low-side
193  //high-side
194  //else if (algosumvalue>0x3FF) sum[ibin]=0x3FF;
195  else sum[ibin] = algosumvalue; //assign value to sum[]
196  }
197 
198  // Align digis and TP
199  int dgPresamples=samples.presamples();
200  int tpPresamples=numberOfPresamples_;
201  int shift = dgPresamples - tpPresamples;
202  int dgSamples=samples.size();
203  int tpSamples=numberOfSamples_;
204  if(peakfind_){
205  if((shift<shrink) || (shift + tpSamples + shrink > dgSamples - (peak_finder_algorithm_ - 1) ) ){
206  edm::LogInfo("HcalTriggerPrimitiveAlgo::analyze") <<
207  "TP presample or size from the configuration file is out of the accessible range. Using digi values from data instead...";
208  shift=shrink;
209  tpPresamples=dgPresamples-shrink;
210  tpSamples=dgSamples-(peak_finder_algorithm_-1)-shrink-shift;
211  }
212  }
213 
214  std::vector<bool> finegrain(tpSamples,false);
215 
216  IntegerCaloSamples output(samples.id(), tpSamples);
217  output.setPresamples(tpPresamples);
218 
219  for (int ibin = 0; ibin < tpSamples; ++ibin) {
220  // ibin - index for output TP
221  // idx - index for samples + shift
222  int idx = ibin + shift;
223 
224  //Peak finding
225  if (peakfind_) {
226  bool isPeak = false;
227  switch (peak_finder_algorithm_) {
228  case 1 :
229  isPeak = (samples[idx] > samples[idx-1] && samples[idx] >= samples[idx+1] && samples[idx] > theThreshold);
230  break;
231  case 2:
232  isPeak = (sum[idx] > sum[idx-1] && sum[idx] >= sum[idx+1] && sum[idx] > theThreshold);
233  break;
234  default:
235  break;
236  }
237 
238  if (isPeak){
239  output[ibin] = std::min<unsigned int>(sum[idx],0x3FF);
240  finegrain[ibin] = msb[idx];
241  }
242  // Not a peak
243  else output[ibin] = 0;
244  }
245  else { // No peak finding, just output running sum
246  output[ibin] = std::min<unsigned int>(sum[idx],0x3FF);
247  finegrain[ibin] = msb[idx];
248  }
249 
250  // Only Pegged for 1-TS algo.
251  if (peak_finder_algorithm_ == 1) {
252  if (samples[idx] >= 0x3FF)
253  output[ibin] = 0x3FF;
254  }
255  }
256  outcoder_->compress(output, finegrain, result);
257 }
258 
259 
261  HcalTrigTowerDetId detId(samples.id());
262 
263  // Align digis and TP
264  int dgPresamples=samples.presamples();
265  int tpPresamples=numberOfPresamples_;
266  int shift = dgPresamples - tpPresamples;
267  int dgSamples=samples.size();
268  int tpSamples=numberOfSamples_;
269  if(shift<0 || shift+tpSamples>dgSamples){
270  edm::LogInfo("HcalTriggerPrimitiveAlgo::analyzeHF") <<
271  "TP presample or size from the configuration file is out of the accessible range. Using digi values from data instead...";
272  tpPresamples=dgPresamples;
273  shift=0;
274  tpSamples=dgSamples;
275  }
276 
277  std::vector<bool> finegrain(tpSamples, false);
278 
279  TowerMapFGSum::const_iterator tower2fg = theTowerMapFGSum.find(detId);
280  assert(tower2fg != theTowerMapFGSum.end());
281 
282  const SumFGContainer& sumFG = tower2fg->second;
283  // Loop over all L+S pairs that mapped from samples.id()
284  // Note: 1 samples.id() = 6 x (L+S) without noZS
285  for (SumFGContainer::const_iterator sumFGItr = sumFG.begin(); sumFGItr != sumFG.end(); ++sumFGItr) {
286  const std::vector<bool>& veto = HF_Veto[sumFGItr->id().rawId()];
287  for (int ibin = 0; ibin < tpSamples; ++ibin) {
288  int idx = ibin + shift;
289  // if not vetod, add L+S to total sum and calculate FG
290  bool vetoed = idx<int(veto.size()) && veto[idx];
291  if (!(vetoed && (*sumFGItr)[idx] > PMT_NoiseThreshold_)) {
292  samples[idx] += (*sumFGItr)[idx];
293  finegrain[ibin] = (finegrain[ibin] || (*sumFGItr)[idx] >= FG_threshold_);
294  }
295  }
296  }
297 
298  IntegerCaloSamples output(samples.id(), tpSamples);
299  output.setPresamples(tpPresamples);
300 
301  for (int ibin = 0; ibin < tpSamples; ++ibin) {
302  int idx = ibin + shift;
303  output[ibin] = samples[idx] / (rctlsb == 0.25 ? 4 : 8);
304  if (output[ibin] > 0x3FF) output[ibin] = 0x3FF;
305  }
306  outcoder_->compress(output, finegrain, result);
307 }
308 
310  for (HcalTrigPrimDigiCollection::iterator tp = result.begin(); tp != result.end(); ++tp){
311  bool ZS = true;
312  for (int i=0; i<tp->size(); ++i) {
313  if (tp->sample(i).compressedEt() > ZS_threshold_I_) {
314  ZS=false;
315  break;
316  }
317  }
318  if (ZS) tp->setZSInfo(false,true);
319  else tp->setZSInfo(true,false);
320  }
321 }
322 
324  const HcalElectronicsMap *emap,
326  ){
327  std::set<uint32_t> FrontEndErrors;
328 
330  const FEDRawData& raw = rawraw->FEDData(i);
331  if (raw.size()<12) continue;
332  const HcalDCCHeader* dccHeader=(const HcalDCCHeader*)(raw.data());
333  if(!dccHeader) continue;
334  HcalHTRData htr;
335  for (int spigot=0; spigot<HcalDCCHeader::SPIGOT_COUNT; spigot++) {
336  if (!dccHeader->getSpigotPresent(spigot)) continue;
337  dccHeader->getSpigotData(spigot,htr,raw.size());
338  int dccid = dccHeader->getSourceId();
339  int errWord = htr.getErrorsWord() & 0x1FFFF;
340  bool HTRError = (!htr.check() || htr.isHistogramEvent() || (errWord & 0x800)!=0);
341 
342  if(HTRError) {
343  bool valid =false;
344  for(int fchan=0; fchan<3 && !valid; fchan++) {
345  for(int fib=0; fib<9 && !valid; fib++) {
346  HcalElectronicsId eid(fchan,fib,spigot,dccid-FEDNumbering::MINHCALFEDID);
347  eid.setHTR(htr.readoutVMECrateId(),htr.htrSlot(),htr.htrTopBottom());
348  DetId detId = emap->lookup(eid);
349  if(detId.null()) continue;
350  HcalSubdetector subdet=(HcalSubdetector(detId.subdetId()));
351  if (detId.det()!=4||
352  (subdet!=HcalBarrel && subdet!=HcalEndcap &&
353  subdet!=HcalForward )) continue;
354  std::vector<HcalTrigTowerDetId> ids = theTrigTowerGeometry->towerIds(detId);
355  for (std::vector<HcalTrigTowerDetId>::const_iterator triggerId=ids.begin(); triggerId != ids.end(); ++triggerId) {
356  FrontEndErrors.insert(triggerId->rawId());
357  }
358  //valid = true;
359  }
360  }
361  }
362  }
363  }
364 
365  // Loop over TP collection
366  // Set TP to zero if there is FE Format Error
367  HcalTriggerPrimitiveSample zeroSample(0);
368  for (HcalTrigPrimDigiCollection::iterator tp = result.begin(); tp != result.end(); ++tp){
369  if (FrontEndErrors.find(tp->id().rawId()) != FrontEndErrors.end()) {
370  for (int i=0; i<tp->size(); ++i) tp->setSample(i, zeroSample);
371  }
372  }
373 }
374 
375 void HcalTriggerPrimitiveAlgo::addFG(const HcalTrigTowerDetId& id, std::vector<bool>& msb){
376  FGbitMap::iterator itr = fgMap_.find(id);
377  if (itr != fgMap_.end()){
378  std::vector<bool>& _msb = itr->second;
379  for (size_t i=0; i<msb.size(); ++i)
380  _msb[i] = _msb[i] || msb[i];
381  }
382  else fgMap_[id] = msb;
383 }
384 
386  if (algo <=0 && algo>2)
387  throw cms::Exception("ERROR: Only algo 1 & 2 are supported.") << std::endl;
388  peak_finder_algorithm_ = algo;
389 }
void analyze(IntegerCaloSamples &samples, HcalTriggerPrimitiveDigi &result)
adds the actual RecHits
int i
Definition: DBlmapReader.cc:9
void runFEFormatError(const FEDRawDataCollection *rawraw, const HcalElectronicsMap *emap, HcalTrigPrimDigiCollection &result)
int presamples() const
access presample information
bool check() const
Check for a good event Requires a minimum length, matching wordcount and length, not an empty event...
Definition: HcalHTRData.cc:62
std::vector< HcalTrigTowerDetId > towerIds(const HcalDetId &cellId) const
the mapping to and from DetIds
const double w
Definition: UKUtility.cc:23
unsigned int htrTopBottom() const
HcalElectronicsId-style HTR top/bottom (1=top/0=bottom)
Definition: HcalHTRData.cc:342
int size() const
total number of samples in the digi
Definition: HBHEDataFrame.h:26
std::vector< HBHEDataFrame >::const_iterator const_iterator
void push_back(T const &t)
const HcalTPGCompressor * outcoder_
void setPresamples(int pre)
set presample information
void addFG(const HcalTrigTowerDetId &id, std::vector< bool > &msb)
void run(const HcalTPGCoder *incoder, const HcalTPGCompressor *outcoder, const HBHEDigiCollection &hbheDigis, const HFDigiCollection &hfDigis, HcalTrigPrimDigiCollection &result, const HcalTrigTowerGeometry *trigTowerGeometry, float rctlsb)
void analyzeHF(IntegerCaloSamples &samples, HcalTriggerPrimitiveDigi &result, float rctlsb)
int getSpigotData(int nspigot, HcalHTRData &decodeTool, int validSize) const
size_t size() const
Lenght of the data buffer in bytes.
Definition: FEDRawData.h:47
uint32_t rawId() const
get the raw id
Definition: DetId.h:43
std::vector< IntegerCaloSamples > SumFGContainer
int size() const
get the size
unsigned int htrSlot() const
HcalElectronicsId-style HTR slot.
Definition: HcalHTRData.cc:338
int depth() const
get the tower depth
Definition: HcalDetId.h:40
const HcalTrigTowerGeometry * theTrigTowerGeometry
void lookupMSB(const HBHEDataFrame &df, std::vector< bool > &msb) const
const FEDRawData & FEDData(int fedid) const
retrieve data for fed
tuple result
Definition: query.py:137
HcalSubdetector
Definition: HcalAssistant.h:31
HcalTriggerPrimitiveAlgo(bool pf, const std::vector< double > &w, int latency, uint32_t FG_threshold, uint32_t ZS_threshold, int numberOfSamples, int numberOfPresamples, uint32_t minSignalThreshold=0, uint32_t PMT_NoiseThreshold=0)
bool getSpigotPresent(unsigned int nspigot) const
Read the &quot;PRESENT&quot; bit for this spigot.
std::vector< double > weights_
int subdetId() const
get the contents of the subdetector field (not cast into any detector&#39;s numbering enum) ...
Definition: DetId.h:37
int presamples() const
number of samples before the sample from the triggered beam crossing (according to the hardware) ...
Definition: HBHEDataFrame.h:28
void runZS(HcalTrigPrimDigiCollection &tp)
std::vector< HcalTriggerPrimitiveDigi >::iterator iterator
const_iterator end() const
int getSourceId() const
Definition: HcalDCCHeader.h:32
Definition: DetId.h:18
void setHTR(int crate, int slot, int tb)
int size() const
total number of samples in the digi
Definition: HFDataFrame.h:26
tuple idx
DEBUGGING if hasattr(process,&quot;trackMonIterativeTracking2012&quot;): print &quot;trackMonIterativeTracking2012 D...
unsigned int getErrorsWord() const
Get the errors word.
Definition: HcalHTRData.h:157
bool null() const
is this a null id ?
Definition: DetId.h:45
unsigned int readoutVMECrateId() const
HcalElectronicsId-style VME crate number.
Definition: HcalHTRData.cc:346
const HcaluLUTTPGCoder * incoder_
static const int SPIGOT_COUNT
Definition: HcalDCCHeader.h:19
const unsigned char * data() const
Return a const pointer to the beginning of the data buffer.
Definition: FEDRawData.cc:28
static unsigned int const shift
const HcalDetId & id() const
Definition: HBHEDataFrame.h:22
virtual void adc2Linear(const HBHEDataFrame &df, IntegerCaloSamples &ics) const
void compress(const IntegerCaloSamples &ics, const std::vector< bool > &fineGrain, HcalTriggerPrimitiveDigi &digi) const
int presamples() const
number of samples before the sample from the triggered beam crossing (according to the hardware) ...
Definition: HFDataFrame.h:28
const HcalDetId & id() const
Definition: HFDataFrame.h:22
DetId id() const
get the (generic) id
Detector det() const
get the detector field from this detid
Definition: DetId.h:35
Readout chain identification for Hcal.
void addSignal(const HBHEDataFrame &frame)
adds the signal to the map
const DetId lookup(HcalElectronicsId fId) const
lookup the logical detid associated with the given electronics id
bool isHistogramEvent() const
Is this event a histogram event? (do not call standard unpack in this case!!!!!)
Definition: HcalHTRData.cc:385
const_iterator begin() const
const_reference back() const