CMS 3D CMS Logo

HcalDigiToRawuHTR.cc
Go to the documentation of this file.
6 
9 
12 
14 
22 
25 
26 #include "PackerHelp.h"
27 
28 #include <iostream>
29 #include <fstream>
30 #include <sstream>
31 #include <string>
32 
33 /* QUESTION: what about dual FED readout? */
34 /* QUESTION: what do I do if the number of 16-bit words
35  are not divisible by 4? -- these need to
36  fit into the 64-bit words of the FEDRawDataFormat */
37 
38 using namespace std;
39 
41 public:
42  explicit HcalDigiToRawuHTR(const edm::ParameterSet&);
43  ~HcalDigiToRawuHTR() override;
44 
45  void produce(edm::StreamID, edm::Event&, const edm::EventSetup&) const override;
46 
47  static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
48 
49 private:
51  int tdc1_;
52  int tdc2_;
53  bool packHBTDC_;
54  static constexpr int tdcmax_ = 49;
56 
62 
63  bool premix_;
64 };
65 
67  : _verbosity(iConfig.getUntrackedParameter<int>("Verbosity", 0)),
68  tdc1_(iConfig.getParameter<int>("tdc1")),
69  tdc2_(iConfig.getParameter<int>("tdc2")),
70  packHBTDC_(iConfig.getParameter<bool>("packHBTDC")),
71  electronicsMapLabel_(iConfig.getParameter<std::string>("ElectronicsMap")),
72  tok_QIE10DigiCollection_(
73  consumes<HcalDataFrameContainer<QIE10DataFrame> >(iConfig.getParameter<edm::InputTag>("QIE10"))),
74  tok_QIE11DigiCollection_(
75  consumes<HcalDataFrameContainer<QIE11DataFrame> >(iConfig.getParameter<edm::InputTag>("QIE11"))),
76  tok_HBHEDigiCollection_(consumes<HBHEDigiCollection>(iConfig.getParameter<edm::InputTag>("HBHEqie8"))),
77  tok_HFDigiCollection_(consumes<HFDigiCollection>(iConfig.getParameter<edm::InputTag>("HFqie8"))),
78  tok_TPDigiCollection_(consumes<HcalTrigPrimDigiCollection>(iConfig.getParameter<edm::InputTag>("TP"))),
79  premix_(iConfig.getParameter<bool>("premix")) {
80  produces<FEDRawDataCollection>("");
81  if (!(tdc1_ >= 0 && tdc1_ <= tdc2_ && tdc2_ <= tdcmax_))
82  edm::LogWarning("HcalDigiToRawuHTR") << " incorrect TDC ranges " << tdc1_ << ", " << tdc2_ << ", " << tdcmax_;
83 }
84 
86 
88  using namespace edm;
89 
92  const HcalElectronicsMap* readoutMap = item.product();
93 
94  //collection to be inserted into event
95  std::unique_ptr<FEDRawDataCollection> fed_buffers(new FEDRawDataCollection());
96 
97  //
98  // Extracting All the Collections containing useful Info
99  edm::Handle<QIE10DigiCollection> qie10DigiCollection;
100  edm::Handle<QIE11DigiCollection> qie11DigiCollection;
101  edm::Handle<HBHEDigiCollection> hbheDigiCollection;
102  edm::Handle<HFDigiCollection> hfDigiCollection;
104  iEvent.getByToken(tok_QIE10DigiCollection_, qie10DigiCollection);
105  iEvent.getByToken(tok_QIE11DigiCollection_, qie11DigiCollection);
106  iEvent.getByToken(tok_HBHEDigiCollection_, hbheDigiCollection);
107  iEvent.getByToken(tok_HFDigiCollection_, hfDigiCollection);
109 
110  // first argument is the fedid (minFEDID+crateId)
111  map<int, unique_ptr<HCalFED> > fedMap;
112 
113  // - - - - - - - - - - - - - - - - - - - - - - - - - - -
114  // QIE10 precision data
115  // - - - - - - - - - - - - - - - - - - - - - - - - - - -
116  UHTRpacker uhtrs;
117  // loop over each digi and allocate memory for each
118  if (qie10DigiCollection.isValid()) {
119  const QIE10DigiCollection& qie10dc = *(qie10DigiCollection);
120  for (unsigned int j = 0; j < qie10dc.size(); j++) {
121  QIE10DataFrame qiedf = static_cast<QIE10DataFrame>(qie10dc[j]);
122  DetId detid = qiedf.detid();
123  HcalElectronicsId eid(readoutMap->lookup(detid));
124  int crateId = eid.crateId();
125  int slotId = eid.slot();
126  int uhtrIndex = ((slotId & 0xF) << 8) | (crateId & 0xFF);
127  int presamples = qiedf.presamples();
128 
129  /* Defining a custom index that will encode only
130  the information about the crate and slot of a
131  given channel: crate: bits 0-7
132  slot: bits 8-12 */
133 
134  if (!uhtrs.exist(uhtrIndex)) {
135  uhtrs.newUHTR(uhtrIndex, presamples);
136  }
137  uhtrs.addChannel(uhtrIndex, qiedf, readoutMap, _verbosity);
138  }
139  }
140  // - - - - - - - - - - - - - - - - - - - - - - - - - - -
141  // QIE11 precision data
142  // - - - - - - - - - - - - - - - - - - - - - - - - - - -
143  //UHTRpacker uhtrs;
144  // loop over each digi and allocate memory for each
145  if (qie11DigiCollection.isValid()) {
146  const QIE11DigiCollection& qie11dc = *(qie11DigiCollection);
147  for (unsigned int j = 0; j < qie11dc.size(); j++) {
148  QIE11DataFrame qiedf = static_cast<QIE11DataFrame>(qie11dc[j]);
149  DetId detid = qiedf.detid();
150  HcalElectronicsId eid(readoutMap->lookup(detid));
151  int crateId = eid.crateId();
152  int slotId = eid.slot();
153  int uhtrIndex = ((slotId & 0xF) << 8) | (crateId & 0xFF);
154  int presamples = qiedf.presamples();
155 
156  // convert to hb qie data if hb
157  if (packHBTDC_ && HcalDetId(detid.rawId()).subdet() == HcalSubdetector::HcalBarrel)
158  qiedf = convertHB(qiedf, tdc1_, tdc2_, tdcmax_);
159 
160  if (!uhtrs.exist(uhtrIndex)) {
161  uhtrs.newUHTR(uhtrIndex, presamples);
162  }
163  uhtrs.addChannel(uhtrIndex, qiedf, readoutMap, _verbosity);
164  }
165  }
166  // - - - - - - - - - - - - - - - - - - - - - - - - - - -
167  // HF (QIE8) precision data
168  // - - - - - - - - - - - - - - - - - - - - - - - - - - -
169  // loop over each digi and allocate memory for each
170  if (hfDigiCollection.isValid()) {
171  const HFDigiCollection& qie8hfdc = *(hfDigiCollection);
172  for (HFDigiCollection::const_iterator qiedf = qie8hfdc.begin(); qiedf != qie8hfdc.end(); qiedf++) {
173  DetId detid = qiedf->id();
174 
175  HcalElectronicsId eid(readoutMap->lookup(detid));
176  int crateId = eid.crateId();
177  int slotId = eid.slot();
178  int uhtrIndex = (crateId & 0xFF) | ((slotId & 0xF) << 8);
179  int presamples = qiedf->presamples();
180 
181  if (!uhtrs.exist(uhtrIndex)) {
182  uhtrs.newUHTR(uhtrIndex, presamples);
183  }
184  uhtrs.addChannel(uhtrIndex, qiedf, readoutMap, premix_, _verbosity);
185  }
186  }
187  // - - - - - - - - - - - - - - - - - - - - - - - - - - -
188  // HBHE (QIE8) precision data
189  // - - - - - - - - - - - - - - - - - - - - - - - - - - -
190  // loop over each digi and allocate memory for each
191  if (hbheDigiCollection.isValid()) {
192  const HBHEDigiCollection& qie8hbhedc = *(hbheDigiCollection);
193  for (HBHEDigiCollection::const_iterator qiedf = qie8hbhedc.begin(); qiedf != qie8hbhedc.end(); qiedf++) {
194  DetId detid = qiedf->id();
195 
196  HcalElectronicsId eid(readoutMap->lookup(detid));
197  int crateId = eid.crateId();
198  int slotId = eid.slot();
199  int uhtrIndex = (crateId & 0xFF) | ((slotId & 0xF) << 8);
200  int presamples = qiedf->presamples();
201 
202  if (!uhtrs.exist(uhtrIndex)) {
203  uhtrs.newUHTR(uhtrIndex, presamples);
204  }
205  uhtrs.addChannel(uhtrIndex, qiedf, readoutMap, premix_, _verbosity);
206  }
207  }
208  // - - - - - - - - - - - - - - - - - - - - - - - - - - -
209  // TP data
210  // - - - - - - - - - - - - - - - - - - - - - - - - - - -
211  // loop over each digi and allocate memory for each
212  if (tpDigiCollection.isValid()) {
213  const HcalTrigPrimDigiCollection& qietpdc = *(tpDigiCollection);
214  for (HcalTrigPrimDigiCollection::const_iterator qiedf = qietpdc.begin(); qiedf != qietpdc.end(); qiedf++) {
215  DetId detid = qiedf->id();
216  HcalElectronicsId eid(readoutMap->lookupTrigger(detid));
217 
218  int crateId = eid.crateId();
219  int slotId = eid.slot();
220  int uhtrIndex = (crateId & 0xFF) | ((slotId & 0xF) << 8);
221  int ilink = eid.fiberIndex();
222  int itower = eid.fiberChanId();
223  int channelid = (itower & 0xF) | ((ilink & 0xF) << 4);
224  int presamples = qiedf->presamples();
225 
226  if (!uhtrs.exist(uhtrIndex)) {
227  uhtrs.newUHTR(uhtrIndex, presamples);
228  }
229  uhtrs.addChannel(uhtrIndex, qiedf, channelid, _verbosity);
230  }
231  }
232  // -----------------------------------------------------
233  // -----------------------------------------------------
234  // loop over each uHTR and format data
235  // -----------------------------------------------------
236  // -----------------------------------------------------
237  // loop over each uHTR and format data
238  int idxuhtr = -1;
239  for (UHTRpacker::UHTRMap::iterator uhtr = uhtrs.uhtrs.begin(); uhtr != uhtrs.uhtrs.end(); ++uhtr) {
240  idxuhtr++;
241 
242  uint64_t crateId = (uhtr->first) & 0xFF;
243  uint64_t slotId = (uhtr->first & 0xF00) >> 8;
244 
245  uhtrs.finalizeHeadTail(&(uhtr->second), _verbosity);
246  int fedId = FEDNumbering::MINHCALuTCAFEDID + crateId;
247  if (fedMap.find(fedId) == fedMap.end()) {
248  /* QUESTION: where should the orbit number come from? */
249  fedMap[fedId] = std::unique_ptr<HCalFED>(
250  new HCalFED(fedId, iEvent.id().event(), iEvent.orbitNumber(), iEvent.bunchCrossing()));
251  }
252  fedMap[fedId]->addUHTR(uhtr->second, crateId, slotId);
253  } // end loop over uhtr containers
254 
255  /* ------------------------------------------------------
256  ------------------------------------------------------
257  putting together the FEDRawDataCollection
258  ------------------------------------------------------
259  ------------------------------------------------------ */
260  for (map<int, unique_ptr<HCalFED> >::iterator fed = fedMap.begin(); fed != fedMap.end(); ++fed) {
261  int fedId = fed->first;
262 
263  auto& rawData = fed_buffers->FEDData(fedId);
264  fed->second->formatFEDdata(rawData);
265 
266  FEDHeader hcalFEDHeader(rawData.data());
267  hcalFEDHeader.set(rawData.data(), 1, iEvent.id().event(), iEvent.bunchCrossing(), fedId);
268  FEDTrailer hcalFEDTrailer(rawData.data() + (rawData.size() - 8));
269  hcalFEDTrailer.set(rawData.data() + (rawData.size() - 8),
270  rawData.size() / 8,
271  evf::compute_crc(rawData.data(), rawData.size()),
272  0,
273  0);
274 
275  } // end loop over FEDs with data
276 
277  iEvent.put(std::move(fed_buffers));
278 }
279 
280 // ------------ method fills 'descriptions' with the allowed parameters for the module ------------
282  //The following says we do not know what parameters are allowed so do no validation
283  // Please change this to state exactly what you do use, even if it is no parameters
285  desc.addUntracked<int>("Verbosity", 0);
286  desc.add<int>("tdc1", 4);
287  desc.add<int>("tdc2", 20);
288  desc.add<bool>("packHBTDC", false);
289  desc.add<std::string>("ElectronicsMap", "");
290  desc.add<edm::InputTag>("QIE10", edm::InputTag("simHcalDigis", "HFQIE10DigiCollection"));
291  desc.add<edm::InputTag>("QIE11", edm::InputTag("simHcalDigis", "HBHEQIE11DigiCollection"));
292  desc.add<edm::InputTag>("HBHEqie8", edm::InputTag("simHcalDigis"));
293  desc.add<edm::InputTag>("HFqie8", edm::InputTag("simHcalDigis"));
294  desc.add<edm::InputTag>("TP", edm::InputTag("simHcalTriggerPrimitiveDigis"));
295  desc.add<bool>("premix", false);
296  descriptions.add("hcalDigiToRawuHTR", desc);
297  descriptions.addDefault(desc);
298 }
299 
300 //define this as a plug-in
HcalElectronicsMap.h
FEDNumbering.h
edm::StreamID
Definition: StreamID.h:30
HcalDigiToRawuHTR::tok_QIE11DigiCollection_
edm::EDGetTokenT< HcalDataFrameContainer< QIE11DataFrame > > tok_QIE11DigiCollection_
Definition: HcalDigiToRawuHTR.cc:58
Handle.h
electrons_cff.bool
bool
Definition: electrons_cff.py:372
edm::ParameterSetDescription::add
ParameterDescriptionBase * add(U const &iLabel, T const &value)
Definition: ParameterSetDescription.h:95
HcalElectronicsMapRcd
Definition: HcalElectronicsMapRcd.h:8
edm::SortedCollection::const_iterator
std::vector< T >::const_iterator const_iterator
Definition: SortedCollection.h:80
HcalDataFrameContainer
Definition: HcalDigiCollections.h:35
ESHandle.h
QIE11DataFrame::presamples
constexpr int presamples() const
for backward compatibility
Definition: QIE11DataFrame.h:79
edm::EDGetTokenT
Definition: EDGetToken.h:33
edm
HLT enums.
Definition: AlignableModifier.h:19
QIE10DataFrame::presamples
constexpr int presamples() const
for backward compatibility
Definition: QIE10DataFrame.h:88
HcalDigiToRawuHTR::tdcmax_
static constexpr int tdcmax_
Definition: HcalDigiToRawuHTR.cc:54
edm::ParameterSetDescription
Definition: ParameterSetDescription.h:52
l1tstage2_dqm_sourceclient-live_cfg.rawData
rawData
Definition: l1tstage2_dqm_sourceclient-live_cfg.py:156
edm::SortedCollection
Definition: SortedCollection.h:49
HcalBarrel
Definition: HcalAssistant.h:33
FEDRawData.h
edm::Handle
Definition: AssociativeIterator.h:50
HcalElectronicsMap::lookupTrigger
const DetId lookupTrigger(HcalElectronicsId fId) const
brief lookup the trigger logical detid associated with the given electronics id
Definition: HcalElectronicsMap.cc:80
HcalDigiToRawuHTR::tok_HFDigiCollection_
edm::EDGetTokenT< HFDigiCollection > tok_HFDigiCollection_
Definition: HcalDigiToRawuHTR.cc:60
DetId
Definition: DetId.h:17
MakerMacros.h
edm::EventSetup::get
T get() const
Definition: EventSetup.h:73
HcalDigiToRawuHTR
Definition: HcalDigiToRawuHTR.cc:40
DEFINE_FWK_MODULE
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
edm::ConfigurationDescriptions::add
void add(std::string const &label, ParameterSetDescription const &psetDescription)
Definition: ConfigurationDescriptions.cc:57
QIE10DataFrame::detid
constexpr DetId detid() const
Get the detector id.
Definition: QIE10DataFrame.h:76
edm::SortedCollection::begin
const_iterator begin() const
Definition: SortedCollection.h:262
Service.h
HcalDigiCollections.h
fillDescriptions
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
convertHB
QIE11DataFrame convertHB(QIE11DataFrame qiehe, int tdc1, int tdc2, int tdcmax)
Definition: PackerHelp.h:619
edm::ESHandle
Definition: DTSurvey.h:22
HcalElectronicsId
Readout chain identification for Hcal.
Definition: HcalElectronicsId.h:32
EcalDeadCellTriggerPrimitiveFilter_cfi.tpDigiCollection
tpDigiCollection
Definition: EcalDeadCellTriggerPrimitiveFilter_cfi.py:14
HcalDigiToRawuHTR::fillDescriptions
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
Definition: HcalDigiToRawuHTR.cc:281
hcalTTPDigis_cfi.presamples
presamples
Definition: hcalTTPDigis_cfi.py:9
EcalFEDMonitor_cfi.FEDRawDataCollection
FEDRawDataCollection
Definition: EcalFEDMonitor_cfi.py:6
HcalDbRecord.h
HcalDigiToRawuHTR::premix_
bool premix_
Definition: HcalDigiToRawuHTR.cc:63
evf::compute_crc
unsigned short compute_crc(unsigned char *buffer, unsigned int bufSize)
Definition: CRC16.h:46
edm::global::EDProducer
Definition: EDProducer.h:32
edm::ConfigurationDescriptions
Definition: ConfigurationDescriptions.h:28
AlCaHLTBitMon_QueryRunRegistry.string
string
Definition: AlCaHLTBitMon_QueryRunRegistry.py:256
edm::LogWarning
Definition: MessageLogger.h:141
UHTRpacker::uhtrs
UHTRMap uhtrs
Definition: PackerHelp.h:315
edm::ParameterSetDescription::addUntracked
ParameterDescriptionBase * addUntracked(U const &iLabel, T const &value)
Definition: ParameterSetDescription.h:100
HLT_2018_cff.InputTag
InputTag
Definition: HLT_2018_cff.py:79016
edm::ParameterSet
Definition: ParameterSet.h:36
FEDTrailer
Definition: FEDTrailer.h:14
Event.h
HcalDigiToRawuHTR::~HcalDigiToRawuHTR
~HcalDigiToRawuHTR() override
Definition: HcalDigiToRawuHTR.cc:85
edm::SortedCollection::end
const_iterator end() const
Definition: SortedCollection.h:267
HcalQIESample.h
HcalDigiToRawuHTR::tdc2_
int tdc2_
Definition: HcalDigiToRawuHTR.cc:52
HcalDetId
Definition: HcalDetId.h:12
createfilelist.int
int
Definition: createfilelist.py:10
HcalDigiToRawuHTR::tok_QIE10DigiCollection_
edm::EDGetTokenT< HcalDataFrameContainer< QIE10DataFrame > > tok_QIE10DigiCollection_
Definition: HcalDigiToRawuHTR.cc:57
iEvent
int iEvent
Definition: GenABIO.cc:224
runTauDisplay.eid
eid
Definition: runTauDisplay.py:298
FEDRawDataCollection.h
HcalDigiToRawuHTR::electronicsMapLabel_
std::string electronicsMapLabel_
Definition: HcalDigiToRawuHTR.cc:55
PackerHelp.h
B2GTnPMonitor_cfi.item
item
Definition: B2GTnPMonitor_cfi.py:147
edm::EventSetup
Definition: EventSetup.h:57
l1tstage2_dqm_sourceclient-live_cfg.fedId
fedId
Definition: l1tstage2_dqm_sourceclient-live_cfg.py:82
FEDTrailer::set
static void set(unsigned char *trailer, uint32_t lenght, uint16_t crc, uint8_t evt_stat, uint8_t tts, bool moreTrailers=false)
Set all fields in the trailer.
Definition: FEDTrailer.cc:31
QIE11DataFrame::detid
constexpr DetId detid() const
Get the detector id.
Definition: QIE11DataFrame.h:67
get
#define get
FEDNumbering::MINHCALuTCAFEDID
Definition: FEDNumbering.h:103
HcalElectronicsMap
Definition: HcalElectronicsMap.h:31
HcalDigiToRawuHTR::HcalDigiToRawuHTR
HcalDigiToRawuHTR(const edm::ParameterSet &)
Definition: HcalDigiToRawuHTR.cc:66
eostools.move
def move(src, dest)
Definition: eostools.py:511
std
Definition: JetResolutionObject.h:76
DetId::rawId
constexpr uint32_t rawId() const
get the raw id
Definition: DetId.h:57
HcalDigiToRawuHTR::tdc1_
int tdc1_
Definition: HcalDigiToRawuHTR.cc:51
HcalElectronicsMap::lookup
const DetId lookup(HcalElectronicsId fId) const
lookup the logical detid associated with the given electronics id
Definition: HcalElectronicsMap.cc:70
HcalDigiToRawuHTR::_verbosity
int _verbosity
Definition: HcalDigiToRawuHTR.cc:50
QIE10DataFrame
Definition: QIE10DataFrame.h:11
Frameworkfwd.h
QIE11DataFrame
Definition: QIE11DataFrame.h:11
HCalFED
Definition: PackerHelp.h:179
FEDHeader::set
static void set(unsigned char *header, uint8_t triggerType, uint32_t lvl1ID, uint16_t bxID, uint16_t sourceID, uint8_t version=0, bool moreHeaders=false)
Set all fields in the header.
Definition: FEDHeader.cc:25
UHTRpacker
Definition: PackerHelp.h:310
UHTRpacker::exist
bool exist(int uhtrIndex)
Definition: PackerHelp.h:346
UHTRpacker::newUHTR
uhtrData * newUHTR(int uhtrIndex, int ps=0, int orn=0, int bcn=0, uint64_t evt=0)
Definition: PackerHelp.h:443
cond::uint64_t
unsigned long long uint64_t
Definition: Time.h:13
HcalDigiToRawuHTR::packHBTDC_
bool packHBTDC_
Definition: HcalDigiToRawuHTR.cc:53
genParticles_cff.map
map
Definition: genParticles_cff.py:11
ParameterSet.h
EDProducer.h
dqmiolumiharvest.j
j
Definition: dqmiolumiharvest.py:66
edm::HandleBase::isValid
bool isValid() const
Definition: HandleBase.h:70
FEDHeader
Definition: FEDHeader.h:14
edm::Event
Definition: Event.h:73
edm::ConfigurationDescriptions::addDefault
void addDefault(ParameterSetDescription const &psetDescription)
Definition: ConfigurationDescriptions.cc:99
FEDHeader.h
HcalUHTRData.h
HcalDigiToRawuHTR::produce
void produce(edm::StreamID, edm::Event &, const edm::EventSetup &) const override
Definition: HcalDigiToRawuHTR.cc:87
edm::InputTag
Definition: InputTag.h:15
HcalDigiToRawuHTR::tok_HBHEDigiCollection_
edm::EDGetTokenT< HBHEDigiCollection > tok_HBHEDigiCollection_
Definition: HcalDigiToRawuHTR.cc:59
edm::DataFrameContainer::size
size_type size() const
Definition: DataFrameContainer.h:162
CRC16.h
HcalDigiToRawuHTR::tok_TPDigiCollection_
edm::EDGetTokenT< HcalTrigPrimDigiCollection > tok_TPDigiCollection_
Definition: HcalDigiToRawuHTR.cc:61
UHTRpacker::finalizeHeadTail
void finalizeHeadTail(uhtrData *uhtr, bool verbosity)
Definition: PackerHelp.h:483
UHTRpacker::addChannel
void addChannel(int uhtrIndex, edm::SortedCollection< HFDataFrame >::const_iterator &qiedf, const HcalElectronicsMap *readoutMap, bool premix, int verbosity=0)
Definition: PackerHelp.h:505
FEDTrailer.h