CMS 3D CMS Logo

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