CMS 3D CMS Logo

CastorRawToDigi.cc
Go to the documentation of this file.
7 #include <fstream>
11 #include <iostream>
16 using namespace std;
17 
19  : dataTag_(conf.getParameter<edm::InputTag>("InputLabel")),
20  unpacker_(conf.getParameter<int>("CastorFirstFED"),
21  conf.getParameter<int>("firstSample"),
22  conf.getParameter<int>("lastSample")),
23  zdcunpacker_(conf.getParameter<int>("CastorFirstFED"),
24  conf.getParameter<int>("firstSample"),
25  conf.getParameter<int>("lastSample")),
26  ctdcunpacker_(conf.getParameter<int>("CastorFirstFED"),
27  conf.getParameter<int>("firstSample"),
28  conf.getParameter<int>("lastSample")),
29  filter_(
30  conf.getParameter<bool>("FilterDataQuality"), conf.getParameter<bool>("FilterDataQuality"), false, 0, 0, -1),
31  fedUnpackList_(conf.getUntrackedParameter<std::vector<int> >("FEDs", std::vector<int>())),
32  firstFED_(conf.getParameter<int>("CastorFirstFED")),
33  complainEmptyData_(conf.getUntrackedParameter<bool>("ComplainEmptyData", false)),
34  usingctdc_(conf.getParameter<bool>("CastorCtdc")),
35  unpackTTP_(conf.getParameter<bool>("UnpackTTP")),
36  unpackZDC_(conf.getParameter<bool>("UnpackZDC")),
37  silent_(conf.getUntrackedParameter<bool>("silent", true)),
38  usenominalOrbitMessageTime_(conf.getParameter<bool>("UseNominalOrbitMessageTime")),
39  expectedOrbitMessageTime_(conf.getParameter<int>("ExpectedOrbitMessageTime"))
40 
41 {
42  if (fedUnpackList_.empty()) {
44  fedUnpackList_.push_back(i);
45  }
46 
48  std::ostringstream ss;
49  for (unsigned int i = 0; i < fedUnpackList_.size(); i++)
50  ss << fedUnpackList_[i] << " ";
51  edm::LogInfo("CASTOR") << "CastorRawToDigi will unpack FEDs ( " << ss.str() << ")";
52 
53  // products produced...
54  produces<CastorDigiCollection>();
55  produces<ZDCDigiCollection>();
56  produces<CastorTrigPrimDigiCollection>();
57  produces<HcalUnpackerReport>();
58  if (unpackTTP_)
59  produces<HcalTTPDigiCollection>();
60 
61  tok_input_ = consumes<FEDRawDataCollection>(dataTag_);
62 }
63 
64 // Virtual destructor needed.
66 
67 // Functions that gets called by framework every event
69  // Step A: Get Inputs
71  e.getByToken(tok_input_, rawraw);
72  // get the mapping
74  es.get<CastorDbRecord>().get(pSetup);
75  const CastorElectronicsMap* readoutMap = pSetup->getCastorMapping();
76 
77  // Step B: Create empty output : three vectors for three classes...
78  std::vector<CastorDataFrame> castor;
79  std::vector<ZDCDataFrame> zdc;
80  std::vector<HcalTTPDigi> ttp;
81  std::vector<CastorTriggerPrimitiveDigi> htp;
82 
83  auto report = std::make_unique<HcalUnpackerReport>();
84 
86  colls.castorCont = &castor;
87  colls.zdcCont = &zdc;
88  if (unpackTTP_)
89  colls.ttp = &ttp;
90  colls.tpCont = &htp;
91 
92  // Step C: unpack all requested FEDs
93  const FEDRawData& fed722 = rawraw->FEDData(722);
94  const int fed722size = fed722.size();
95  const FEDRawData& fed693 = rawraw->FEDData(693);
96  const int fed693size = fed693.size();
97  for (std::vector<int>::const_iterator i = fedUnpackList_.begin(); i != fedUnpackList_.end(); i++) {
98  const FEDRawData& fed = rawraw->FEDData(*i);
99  //std::cout<<"Fed number "<<*i<<"is being worked on"<<std::endl;
100  if (*i == 693 && fed693size == 0 && fed722size != 0)
101  continue;
102  if (*i == 722 && fed722size == 0 && fed693size != 0)
103  continue;
104 
105  if (*i != 693 && *i != 722) {
106  if (fed.size() == 0) {
107  if (complainEmptyData_) {
108  edm::LogWarning("EmptyData") << "No data for FED " << *i;
109  report->addError(*i);
110  }
111  } else if (fed.size() < 8 * 3) {
112  edm::LogWarning("EmptyData") << "Tiny data " << fed.size() << " for FED " << *i;
113  report->addError(*i);
114  } else {
115  try {
116  if (usingctdc_) {
117  ctdcunpacker_.unpack(fed, *readoutMap, colls, *report);
118  } else {
119  unpacker_.unpack(fed, *readoutMap, colls, *report);
120  }
121  report->addUnpacked(*i);
122  } catch (cms::Exception& e) {
123  edm::LogWarning("Unpacking error") << e.what();
124  report->addError(*i);
125  } catch (...) {
126  edm::LogWarning("Unpacking exception");
127  report->addError(*i);
128  }
129  }
130  }
131 
132  if (*i == 693 && unpackZDC_) {
133  if (fed.size() == 0) {
134  if (complainEmptyData_) {
135  edm::LogWarning("EmptyData") << "No data for FED " << *i;
136  report->addError(*i);
137  }
138  }
139  if (fed.size() != 0) {
140  zdcunpacker_.unpack(fed, *readoutMap, colls, *report);
141  report->addUnpacked(*i);
142  }
143  }
144 
145  if (*i == 722 && unpackZDC_) {
146  if (fed.size() == 0) {
147  if (complainEmptyData_) {
148  edm::LogWarning("EmptyData") << "No data for FED " << *i;
149  report->addError(*i);
150  }
151  }
152  if (fed.size() != 0) {
153  zdcunpacker_.unpack(fed, *readoutMap, colls, *report);
154  report->addUnpacked(*i);
155  }
156  }
157 
158  } //end of loop over feds
159 
160  // Step B: encapsulate vectors in actual collections
161  auto castor_prod = std::make_unique<CastorDigiCollection>();
162  auto htp_prod = std::make_unique<CastorTrigPrimDigiCollection>();
163 
164  castor_prod->swap_contents(castor);
165  htp_prod->swap_contents(htp);
166 
167  // Step C2: filter FEDs, if required
168  if (filter_.active()) {
169  CastorDigiCollection filtered_castor = filter_.filter(*castor_prod, *report);
170 
171  castor_prod->swap(filtered_castor);
172  }
173 
174  // Step D: Put outputs into event
175  // just until the sorting is proven
176  castor_prod->sort();
177  htp_prod->sort();
178 
179  if (unpackZDC_) {
180  auto zdc_prod = std::make_unique<ZDCDigiCollection>();
181  zdc_prod->swap_contents(zdc);
182 
183  zdc_prod->sort();
184  e.put(std::move(zdc_prod));
185  }
186 
187  e.put(std::move(castor_prod));
188  e.put(std::move(htp_prod));
189 
190  if (unpackTTP_) {
191  auto prod = std::make_unique<HcalTTPDigiCollection>();
192  prod->swap_contents(ttp);
193 
194  prod->sort();
195  e.put(std::move(prod));
196  }
197  e.put(std::move(report));
198 }
199 void CastorRawToDigi::beginRun(edm::Run const& irun, edm::EventSetup const& es) {
201  if (irun.run() > 132640) {
203  } else if (irun.run() > 132174) {
205  } else if (irun.run() > 124371) {
207  } else if (irun.run() > 123984) {
209  } else if (irun.run() > 123584) {
211  } else {
213  }
215  }
216 }
CastorDataFrameFilter filter_
OrphanHandle< PROD > put(std::unique_ptr< PROD > product)
Put a new product.
Definition: Event.h:131
RunNumber_t run() const
Definition: RunBase.h:40
ZdcUnpacker zdcunpacker_
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:525
CastorDigiCollection filter(const CastorDigiCollection &incol, HcalUnpackerReport &r)
filter Castor data frames
CastorUnpacker unpacker_
void swap(SortedCollection &other)
char const * what() const override
Definition: Exception.cc:103
CastorCtdcUnpacker ctdcunpacker_
std::vector< int > fedUnpackList_
void beginRun(edm::Run const &, edm::EventSetup const &) override
size_t size() const
Lenght of the data buffer in bytes.
Definition: FEDRawData.h:45
edm::InputTag dataTag_
void unpack(const FEDRawData &raw, const CastorElectronicsMap &emap, CastorRawCollections &conts, HcalUnpackerReport &report, bool silent=false)
For histograms, no begin and end.
edm::EDGetTokenT< FEDRawDataCollection > tok_input_
const FEDRawData & FEDData(int fedid) const
retrieve data for fed
void unpack(const FEDRawData &raw, const CastorElectronicsMap &emap, CastorRawCollections &conts, HcalUnpackerReport &report)
void setExpectedOrbitMessageTime(int time)
bool active() const
whether any filters are on
CastorRawToDigi(const edm::ParameterSet &ps)
std::vector< CastorDataFrame > * castorCont
const CastorElectronicsMap * getCastorMapping() const
void unpack(const FEDRawData &raw, const CastorElectronicsMap &emap, CastorRawCollections &conts, HcalUnpackerReport &report, bool silent=false)
For histograms, no begin and end.
Definition: ZdcUnpacker.cc:108
bool usenominalOrbitMessageTime_
HLT enums.
~CastorRawToDigi() override
T get() const
Definition: EventSetup.h:73
void produce(edm::Event &e, const edm::EventSetup &c) override
def move(src, dest)
Definition: eostools.py:511
Definition: Run.h:45