CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
HcalRawToDigi.cc
Go to the documentation of this file.
1 using namespace std;
11 #include <iostream>
12 #include <unordered_set>
13 
15  unpacker_(conf.getUntrackedParameter<int>("HcalFirstFED",int(FEDNumbering::MINHCALFEDID)),conf.getParameter<int>("firstSample"),conf.getParameter<int>("lastSample")),
16  filter_(conf.getParameter<bool>("FilterDataQuality"),conf.getParameter<bool>("FilterDataQuality"),
17  false,
18  0, 0,
19  -1),
20  fedUnpackList_(conf.getUntrackedParameter<std::vector<int> >("FEDs", std::vector<int>())),
21  firstFED_(conf.getUntrackedParameter<int>("HcalFirstFED",FEDNumbering::MINHCALFEDID)),
22  unpackCalib_(conf.getUntrackedParameter<bool>("UnpackCalib",false)),
23  unpackZDC_(conf.getUntrackedParameter<bool>("UnpackZDC",false)),
24  unpackTTP_(conf.getUntrackedParameter<bool>("UnpackTTP",false)),
25  silent_(conf.getUntrackedParameter<bool>("silent",true)),
26  complainEmptyData_(conf.getUntrackedParameter<bool>("ComplainEmptyData",false)),
27  unpackerMode_(conf.getUntrackedParameter<int>("UnpackerMode",0)),
28  expectedOrbitMessageTime_(conf.getUntrackedParameter<int>("ExpectedOrbitMessageTime",-1))
29 {
30  electronicsMapLabel_ = conf.getParameter<std::string>("ElectronicsMap");
31  tok_data_ = consumes<FEDRawDataCollection>(conf.getParameter<edm::InputTag>("InputLabel"));
32 
33  if (fedUnpackList_.empty()) {
34  // VME range for back-compatibility
36  fedUnpackList_.push_back(i);
37 
38  // uTCA range
40  fedUnpackList_.push_back(i);
41  }
42 
45  std::ostringstream ss;
46  for (unsigned int i=0; i<fedUnpackList_.size(); i++)
47  ss << fedUnpackList_[i] << " ";
48  edm::LogInfo("HCAL") << "HcalRawToDigi will unpack FEDs ( " << ss.str() << ")";
49 
50  // products produced...
51  produces<HBHEDigiCollection>();
52  produces<HFDigiCollection>();
53  produces<HODigiCollection>();
54  produces<HcalTrigPrimDigiCollection>();
55  produces<HOTrigPrimDigiCollection>();
56  produces<HcalUnpackerReport>();
57  if (unpackCalib_)
58  produces<HcalCalibDigiCollection>();
59  if (unpackZDC_)
60  produces<ZDCDigiCollection>();
61  if (unpackTTP_)
62  produces<HcalTTPDigiCollection>();
63  produces<QIE10DigiCollection>();
64  produces<QIE11DigiCollection>();
65 
66  memset(&stats_,0,sizeof(stats_));
67 
68 }
69 
70 // Virtual destructor needed.
72 
75  desc.addUntracked<int>("HcalFirstFED",int(FEDNumbering::MINHCALFEDID));
76  desc.add<int>("firstSample",0);
77  desc.add<int>("lastSample",9);
78  desc.add<bool>("FilterDataQuality",true);
79  desc.addUntracked<std::vector<int>>("FEDs", std::vector<int>());
80  desc.addUntracked<bool>("UnpackZDC",true);
81  desc.addUntracked<bool>("UnpackCalib",true);
82  desc.addUntracked<bool>("UnpackTTP",true);
83  desc.addUntracked<bool>("silent",true);
84  desc.addUntracked<bool>("ComplainEmptyData",false);
85  desc.addUntracked<int>("UnpackerMode",0);
86  desc.addUntracked<int>("ExpectedOrbitMessageTime",-1);
87  desc.add<edm::InputTag>("InputLabel",edm::InputTag("rawDataCollector"));
88  desc.add<std::string>("ElectronicsMap","");
89  descriptions.add("hcalRawToDigi",desc);
90 }
91 
92 
93 // Functions that gets called by framework every event
95 {
96  // Step A: Get Inputs
98  e.getByToken(tok_data_,rawraw);
99  // get the mapping
101  es.get<HcalDbRecord>().get( pSetup );
104  const HcalElectronicsMap* readoutMap = item.product();
105 
106  // Step B: Create empty output : three vectors for three classes...
107  std::vector<HBHEDataFrame> hbhe;
108  std::vector<HODataFrame> ho;
109  std::vector<HFDataFrame> hf;
110  std::vector<HcalTriggerPrimitiveDigi> htp;
111  std::vector<HcalCalibDataFrame> hc;
112  std::vector<ZDCDataFrame> zdc;
113  std::vector<HcalTTPDigi> ttp;
114  std::vector<HOTriggerPrimitiveDigi> hotp;
115  std::auto_ptr<HcalUnpackerReport> report(new HcalUnpackerReport);
116 
117  // Heuristics: use ave+(max-ave)/8
118  if (stats_.max_hbhe>0) hbhe.reserve(stats_.ave_hbhe+(stats_.max_hbhe-stats_.ave_hbhe)/8);
119  if (stats_.max_ho>0) ho.reserve(stats_.ave_ho+(stats_.max_ho-stats_.ave_ho)/8);
120  if (stats_.max_hf>0) hf.reserve(stats_.ave_hf+(stats_.max_hf-stats_.ave_hf)/8);
122  if (stats_.max_tp>0) htp.reserve(stats_.ave_tp+(stats_.max_tp-stats_.ave_tp)/8);
123  if (stats_.max_tpho>0) hotp.reserve(stats_.ave_tpho+(stats_.max_tpho-stats_.ave_tpho)/8);
124 
125  if (unpackZDC_) zdc.reserve(24);
126 
127 
129  colls.hbheCont=&hbhe;
130  colls.hoCont=&ho;
131  colls.hfCont=&hf;
132  colls.tpCont=&htp;
133  colls.tphoCont=&hotp;
134  colls.calibCont=&hc;
135  colls.zdcCont=&zdc;
136  if (unpackTTP_) colls.ttp=&ttp;
137 
138  // Step C: unpack all requested FEDs
139  for (std::vector<int>::const_iterator i=fedUnpackList_.begin(); i!=fedUnpackList_.end(); i++) {
140  const FEDRawData& fed = rawraw->FEDData(*i);
141  if (fed.size()==0) {
142  if (complainEmptyData_) {
143  if (!silent_) edm::LogWarning("EmptyData") << "No data for FED " << *i;
144  report->addError(*i);
145  }
146  } else if (fed.size()<8*3) {
147  if (!silent_) edm::LogWarning("EmptyData") << "Tiny data " << fed.size() << " for FED " << *i;
148  report->addError(*i);
149  } else {
150  try {
151  unpacker_.unpack(fed,*readoutMap,colls, *report,silent_);
152  report->addUnpacked(*i);
153  } catch (cms::Exception& e) {
154  if (!silent_) edm::LogWarning("Unpacking error") << e.what();
155  report->addError(*i);
156  } catch (...) {
157  if (!silent_) edm::LogWarning("Unpacking exception");
158  report->addError(*i);
159  }
160  }
161  }
162 
163 
164  // gather statistics
165  stats_.max_hbhe=std::max(stats_.max_hbhe,(int)hbhe.size());
166  stats_.ave_hbhe=(stats_.ave_hbhe*stats_.n+hbhe.size())/(stats_.n+1);
167  stats_.max_ho=std::max(stats_.max_ho,(int)ho.size());
168  stats_.ave_ho=(stats_.ave_ho*stats_.n+ho.size())/(stats_.n+1);
169  stats_.max_hf=std::max(stats_.max_hf,(int)hf.size());
170  stats_.ave_hf=(stats_.ave_hf*stats_.n+hf.size())/(stats_.n+1);
171  stats_.max_tp=std::max(stats_.max_tp,(int)htp.size());
172  stats_.ave_tp=(stats_.ave_tp*stats_.n+htp.size())/(stats_.n+1);
173  stats_.max_tpho=std::max(stats_.max_tpho,(int)hotp.size());
174  stats_.ave_tpho=(stats_.ave_tpho*stats_.n+hotp.size())/(stats_.n+1);
175  stats_.max_calib=std::max(stats_.max_calib,(int)hc.size());
176  stats_.ave_calib=(stats_.ave_calib*stats_.n+hc.size())/(stats_.n+1);
177 
178 
179  stats_.n++;
180 
181  // check HF duplication
182  std::unordered_set<uint32_t> cacheForHFdup;
183  unsigned int cntHFdup = 0;
184  for( auto & hf_digi : hf ){
185  if( ! cacheForHFdup.insert(hf_digi.id().rawId()).second ) cntHFdup++;
186  }
187  if( cntHFdup ) edm::LogError("HcalRawToDigi") << "Duplicated HF digis found for "<<cntHFdup<<" times"<<std::endl;
188 
189  // Step B: encapsulate vectors in actual collections
190  std::auto_ptr<HBHEDigiCollection> hbhe_prod(new HBHEDigiCollection());
191  std::auto_ptr<HFDigiCollection> hf_prod(new HFDigiCollection());
192  std::auto_ptr<HODigiCollection> ho_prod(new HODigiCollection());
193  std::auto_ptr<HcalTrigPrimDigiCollection> htp_prod(new HcalTrigPrimDigiCollection());
194  std::auto_ptr<HOTrigPrimDigiCollection> hotp_prod(new HOTrigPrimDigiCollection());
195  if (colls.qie10 == 0) {
196  colls.qie10 = new QIE10DigiCollection();
197  }
198  std::auto_ptr<QIE10DigiCollection> qie10_prod(colls.qie10);
199  if (colls.qie11 == 0) {
200  colls.qie11 = new QIE11DigiCollection();
201  }
202  std::auto_ptr<QIE11DigiCollection> qie11_prod(colls.qie11);
203 
204  hbhe_prod->swap_contents(hbhe);
205  if( !cntHFdup ) hf_prod->swap_contents(hf);
206  ho_prod->swap_contents(ho);
207  htp_prod->swap_contents(htp);
208  hotp_prod->swap_contents(hotp);
209 
210  // Step C2: filter FEDs, if required
211  if (filter_.active()) {
212  HBHEDigiCollection filtered_hbhe=filter_.filter(*hbhe_prod,*report);
213  HODigiCollection filtered_ho=filter_.filter(*ho_prod,*report);
214  HFDigiCollection filtered_hf=filter_.filter(*hf_prod,*report);
215 
216  hbhe_prod->swap(filtered_hbhe);
217  ho_prod->swap(filtered_ho);
218  hf_prod->swap(filtered_hf);
219  }
220 
221 
222  // Step D: Put outputs into event
223  // just until the sorting is proven
224  hbhe_prod->sort();
225  ho_prod->sort();
226  hf_prod->sort();
227  htp_prod->sort();
228  hotp_prod->sort();
229  qie10_prod->sort();
230  qie11_prod->sort();
231 
232  e.put(hbhe_prod);
233  e.put(ho_prod);
234  e.put(hf_prod);
235  e.put(htp_prod);
236  e.put(hotp_prod);
237  e.put(qie10_prod);
238  e.put(qie11_prod);
239 
241  if (unpackCalib_) {
242  std::auto_ptr<HcalCalibDigiCollection> hc_prod(new HcalCalibDigiCollection());
243  hc_prod->swap_contents(hc);
244 
245  if (filter_.active()) {
246  HcalCalibDigiCollection filtered_calib=filter_.filter(*hc_prod,*report);
247  hc_prod->swap(filtered_calib);
248  }
249 
250  hc_prod->sort();
251  e.put(hc_prod);
252  }
253 
255  if (unpackZDC_) {
256  std::auto_ptr<ZDCDigiCollection> prod(new ZDCDigiCollection());
257  prod->swap_contents(zdc);
258 
259  if (filter_.active()) {
260  ZDCDigiCollection filtered_zdc=filter_.filter(*prod,*report);
261  prod->swap(filtered_zdc);
262  }
263 
264  prod->sort();
265  e.put(prod);
266  }
267 
268  if (unpackTTP_) {
269  std::auto_ptr<HcalTTPDigiCollection> prod(new HcalTTPDigiCollection());
270  prod->swap_contents(ttp);
271 
272  prod->sort();
273  e.put(prod);
274  }
275  e.put(report);
276 
277 
278 }
279 
280 
virtual char const * what() const
Definition: Exception.cc:141
T getParameter(std::string const &) const
int i
Definition: DBlmapReader.cc:9
HcalDataFrameFilter filter_
Definition: HcalRawToDigi.h:39
ParameterDescriptionBase * addUntracked(U const &iLabel, T const &value)
std::vector< HcalTTPDigi > * ttp
Definition: HcalUnpacker.h:32
edm::SortedCollection< HcalTriggerPrimitiveDigi > HcalTrigPrimDigiCollection
const bool unpackTTP_
Definition: HcalRawToDigi.h:42
std::vector< HFDataFrame > * hfCont
Definition: HcalUnpacker.h:27
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:462
void swap(SortedCollection &other)
std::vector< HBHEDataFrame > * hbheCont
Definition: HcalUnpacker.h:25
std::vector< HOTriggerPrimitiveDigi > * tphoCont
Definition: HcalUnpacker.h:31
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
edm::SortedCollection< HOTriggerPrimitiveDigi > HOTrigPrimDigiCollection
size_t size() const
Lenght of the data buffer in bytes.
Definition: FEDRawData.h:47
edm::SortedCollection< ZDCDataFrame > ZDCDigiCollection
virtual void produce(edm::Event &, const edm::EventSetup &) override
HcalDataFrameContainer< QIE10DataFrame > QIE10DigiCollection
U second(std::pair< T, U > const &p)
tuple report
Definition: zeeHLT_cff.py:9
const int expectedOrbitMessageTime_
Definition: HcalRawToDigi.h:44
edm::SortedCollection< HODataFrame > HODigiCollection
OrphanHandle< PROD > put(std::auto_ptr< PROD > product)
Put a new product.
Definition: Event.h:121
virtual ~HcalRawToDigi()
const bool complainEmptyData_
Definition: HcalRawToDigi.h:43
std::string electronicsMapLabel_
Definition: HcalRawToDigi.h:45
std::vector< HcalTriggerPrimitiveDigi > * tpCont
Definition: HcalUnpacker.h:30
struct HcalRawToDigi::Statistics stats_
const bool unpackZDC_
Definition: HcalRawToDigi.h:42
ParameterDescriptionBase * add(U const &iLabel, T const &value)
const bool unpackCalib_
Definition: HcalRawToDigi.h:42
HcalRawToDigi(const edm::ParameterSet &ps)
const bool silent_
Definition: HcalRawToDigi.h:43
void setExpectedOrbitMessageTime(int time)
Definition: HcalUnpacker.h:42
HcalDataFrameContainer< QIE11DataFrame > QIE11DigiCollection
void setMode(int mode)
Definition: HcalUnpacker.h:45
void unpack(const FEDRawData &raw, const HcalElectronicsMap &emap, std::vector< HcalHistogramDigi > &histoDigis)
edm::SortedCollection< HcalCalibDataFrame > HcalCalibDigiCollection
std::vector< HcalCalibDataFrame > * calibCont
Definition: HcalUnpacker.h:28
std::vector< int > fedUnpackList_
Definition: HcalRawToDigi.h:40
const T & get() const
Definition: EventSetup.h:56
T const * product() const
Definition: ESHandle.h:86
bool active() const
whether any filters are on
std::vector< HODataFrame > * hoCont
Definition: HcalUnpacker.h:26
QIE11DigiCollection * qie11
Definition: HcalUnpacker.h:34
void add(std::string const &label, ParameterSetDescription const &psetDescription)
HBHEDigiCollection filter(const HBHEDigiCollection &incol, HcalUnpackerReport &r)
filter HB/HE data frames
const int unpackerMode_
Definition: HcalRawToDigi.h:44
HcalUnpacker unpacker_
Definition: HcalRawToDigi.h:38
edm::SortedCollection< HcalTTPDigi > HcalTTPDigiCollection
susybsm::HSCParticleCollection hc
Definition: classes.h:25
edm::SortedCollection< HFDataFrame > HFDigiCollection
QIE10DigiCollection * qie10
Definition: HcalUnpacker.h:33
std::vector< ZDCDataFrame > * zdcCont
Definition: HcalUnpacker.h:29
edm::EDGetTokenT< FEDRawDataCollection > tok_data_
Definition: HcalRawToDigi.h:37
volatile std::atomic< bool > shutdown_flag false
edm::SortedCollection< HBHEDataFrame > HBHEDigiCollection