CMS 3D CMS Logo

HcalLuttoDB.cc
Go to the documentation of this file.
1 // -*- C++ -*-
2 //
3 // Package: HcalLuttoDB
4 // Class: HcalLuttoDB
5 //
13 //
14 // Original Author: Michael Weinberger
15 // Created: Mon Mar 19 11:53:56 CDT 2007
16 //
17 //
18 
19 // system include files
20 #include <memory>
21 
22 // user include files
27 
29 
38 
43 
44 using namespace edm;
45 using namespace std;
46 #include <iostream>
47 #include <fstream>
48 #include "md5.h"
49 
50 //
51 // class decleration
52 //
53 
55 public:
56  explicit HcalLuttoDB(const edm::ParameterSet&);
57  ~HcalLuttoDB() override;
58 
59  void beginJob() override;
60  void analyze(const edm::Event&, const edm::EventSetup&) override;
61  void endJob() override;
62 
63 private:
64  void writeoutlut1(HcalDetId id, HcalElectronicsId eid, const std::vector<unsigned short>& lut, std::ostream& os);
65  std::vector<unsigned char> extractOutputLut(const CaloTPGTranscoder& coder, HcalTrigTowerDetId chan);
66  void writeoutlut2(HcalTrigTowerDetId id,
68  const std::vector<unsigned char>& lut,
69  std::ostream& os);
72  const bool filePerCrate_;
75  std::ostream* openPerCrate(int crate);
76  std::ostream* openPerLut1(HcalElectronicsId eid);
77  std::ostream* openPerLut2(HcalElectronicsId eid);
78  std::ostream* openChecksums();
82  std::ostream* oc_;
83 };
84 // ----------member data ---------------------------
85 
86 static const int formatRevision_ = 1;
87 
88 // constructors and destructor
89 //
91  : creationtag_(iConfig.getParameter<std::string>("creationtag")),
92  targetfirmware_(iConfig.getParameter<std::string>("targetfirmware")),
93  filePerCrate_(iConfig.getUntrackedParameter<bool>("filePerCrate", true)),
94  fileformat_(iConfig.getParameter<std::string>("filePrefix")) {
95  tokdb_ = esConsumes<HcalDbService, HcalDbRecord>();
96  tokhcalCode_ = esConsumes<HcalTPGCoder, HcalTPGRecord>();
97  tokcaloCode_ = esConsumes<CaloTPGTranscoder, CaloTPGRecord>();
98 }
99 
101 
102 //
103 // member functions
104 //
105 
106 std::ostream* HcalLuttoDB::openChecksums() {
107  char fname[1024];
108  snprintf(fname, 1024, "%s_checksums.xml", fileformat_.c_str());
109  std::ostream* os = new std::ofstream(fname);
110  (*os) << "<?xml version=\"1.0\"?>\n<CFGBrick>\n";
111  return os;
112 }
113 
114 std::ostream* HcalLuttoDB::openPerCrate(int crate) {
115  char fname[1024];
116  snprintf(fname, 1024, "%s_%d.xml", fileformat_.c_str(), crate);
117  std::ostream* os = new std::ofstream(fname);
118  (*os) << "<?xml version=\"1.0\"?>\n<CFGBrickSet>\n";
119  return os;
120 }
121 
123  char fname[1024];
124  snprintf(fname,
125  1024,
126  "%s_%d_%d%c_%d_%d_1.xml",
127  fileformat_.c_str(),
128  eid.readoutVMECrateId(),
129  eid.htrSlot(),
130  ((eid.htrTopBottom()) ? ('t') : ('b')),
131  eid.fiberIndex(),
132  eid.fiberChanId());
133  std::ostream* os = new std::ofstream(fname);
134  (*os) << "<?xml version=\"1.0\"?>\n";
135  return os;
136 }
137 
139  char fname[1024];
140  snprintf(fname,
141  1024,
142  "%s_%d_%d%c_%d_%d_2.xml",
143  fileformat_.c_str(),
144  eid.readoutVMECrateId(),
145  eid.htrSlot(),
146  ((eid.htrTopBottom()) ? ('t') : ('b')),
147  eid.slbSiteNumber(),
148  eid.slbChannelIndex());
149  std::ostream* os = new std::ofstream(fname);
150  (*os) << "<?xml version=\"1.0\"?>\n";
151  return os;
152 }
153 
156  const std::vector<unsigned short>& lut,
157  std::ostream& os) {
158  os << "<CFGBrick> " << std::endl;
159  os << " <Parameter name='IETA' type='int'>" << id.ieta() << "</Parameter>" << std::endl;
160  os << " <Parameter name='IPHI' type='int'>" << id.iphi() << "</Parameter>" << std::endl;
161  os << " <Parameter name='DEPTH' type='int'>" << id.depth() << "</Parameter>" << std::endl;
162  os << " <Parameter name='CRATE' type='int'>" << eid.readoutVMECrateId() << "</Parameter>" << std::endl;
163  os << " <Parameter name='SLOT' type='int'>" << eid.htrSlot() << "</Parameter>" << std::endl;
164  os << " <Parameter name='TOPBOTTOM' type='int'>" << eid.htrTopBottom() << "</Parameter>" << std::endl;
165  os << " <Parameter name='FIBER' type='int'>" << eid.fiberIndex() << "</Parameter>" << std::endl;
166  os << " <Parameter name='FIBERCHAN' type='int'>" << eid.fiberChanId() << "</Parameter>" << std::endl;
167  os << " <Parameter name='LUT_TYPE' type='int'>1</Parameter>" << std::endl;
168  os << " <Parameter name='CREATIONTAG' type='string'>" << creationtag_ << "</Parameter>" << std::endl;
169  os << " <Parameter name='CREATIONSTAMP' type='string'>" << creationstamp_ << "</Parameter>" << std::endl;
170  os << " <Parameter name='FORMATREVISION' type='string'>" << formatRevision_ << "</Parameter>" << std::endl;
171  os << " <Parameter name='TARGETFIRMWARE' type='string'>" << targetfirmware_ << "</Parameter>" << std::endl;
172  int generalizedIndex = id.ietaAbs() + 1000 * id.depth() + 10000 * id.iphi() + ((id.ieta() < 0) ? (0) : (100)) +
173  ((id.subdet() == HcalForward && id.ietaAbs() == 29) ? (4 * 10000) : (0));
174 
175  os << " <Parameter name='GENERALIZEDINDEX' type='int'>" << generalizedIndex << "</Parameter>" << std::endl;
176  // do checksum
177  md5_state_t md5er;
178  md5_byte_t digest[16];
179  unsigned char tool[2];
180  md5_init(&md5er);
181  for (int i = 0; i < 128; i++) {
182  tool[0] = lut[i] & 0xFF;
183  tool[1] = (lut[i] >> 8) & 0xFF;
184  md5_append(&md5er, tool, 2);
185  }
186  md5_finish(&md5er, digest);
187  os << " <Parameter name='CHECKSUM' type='string'>";
188  for (int i = 0; i < 16; i++)
189  os << std::hex << (((int)(digest[i])) & 0xFF);
190  os << "</Parameter>\n";
191 
192  *oc_ << " <Data crate='" << eid.readoutVMECrateId() << "' slot='" << eid.htrSlot() << "' fpga='"
193  << eid.htrTopBottom() << "' fiber='" << eid.fiberIndex() << "' fiberchan='" << eid.fiberChanId()
194  << "' luttype='1' elements='1' encoding='hex'>";
195  for (int i = 0; i < 16; i++)
196  *oc_ << std::hex << (((int)(digest[i])) & 0xFF);
197  *oc_ << "</Data>\n";
198 
199  os << " <Data elements='128' encoding='hex'> " << std::endl;
200  os << std::hex;
201  for (int initr2 = 0; initr2 < 128; initr2++) {
202  os << lut[initr2] << " ";
203  }
204  os << std::dec;
205  os << std::endl;
206  os << " </Data> " << std::endl;
207  os << "</CFGBrick> " << std::endl;
208 }
209 
212  const std::vector<unsigned char>& lut,
213  std::ostream& os) {
214  os << "<CFGBrick> " << std::endl;
215  os << " <Parameter name='IETA' type='int'>" << id.ieta() << "</Parameter>" << std::endl;
216  os << " <Parameter name='IPHI' type='int'>" << id.iphi() << "</Parameter>" << std::endl;
217  os << " <Parameter name='CRATE' type='int'>" << eid.readoutVMECrateId() << "</Parameter>" << std::endl;
218  os << " <Parameter name='SLOT' type='int'>" << eid.htrSlot() << "</Parameter>" << std::endl;
219  os << " <Parameter name='TOPBOTTOM' type='int'>" << eid.htrTopBottom() << "</Parameter>" << std::endl;
220  os << " <Parameter name='SLB' type='int'>" << eid.slbSiteNumber() << "</Parameter>" << std::endl;
221  os << " <Parameter name='SLBCHAN' type='int'>" << eid.slbChannelIndex() << "</Parameter>" << std::endl;
222  os << " <Parameter name='LUT_TYPE' type='int'>2</Parameter>" << std::endl;
223  os << " <Parameter name='CREATIONTAG' type='string'>" << creationtag_ << "</Parameter>" << std::endl;
224  os << " <Parameter name='CREATIONSTAMP' type='string'>" << creationstamp_ << "</Parameter>" << std::endl;
225  os << " <Parameter name='FORMATREVISION' type='string'>" << formatRevision_ << "</Parameter>" << std::endl;
226  os << " <Parameter name='TARGETFIRMWARE' type='string'>" << targetfirmware_ << "</Parameter>" << std::endl;
227  int generalizedIndex = id.ietaAbs() + 10000 * id.iphi() + ((id.ieta() < 0) ? (0) : (100));
228 
229  os << " <Parameter name='GENERALIZEDINDEX' type='int'>" << generalizedIndex << "</Parameter>" << std::endl;
230 
231  // do checksum
232  md5_state_t md5er;
233  md5_byte_t digest[16];
234  md5_init(&md5er);
235  md5_append(&md5er, &(lut[0]), 1024);
236  md5_finish(&md5er, digest);
237  os << " <Parameter name='CHECKSUM' type='string'>";
238  for (int i = 0; i < 16; i++)
239  os << std::hex << (((int)(digest[i])) & 0xFF);
240  os << "</Parameter>\n";
241 
242  *oc_ << " <Data crate='" << eid.readoutVMECrateId() << "' slot='" << eid.htrSlot() << "' fpga='"
243  << eid.htrTopBottom() << "' slb='" << eid.slbSiteNumber() << "' slbchan='" << eid.slbChannelIndex()
244  << "' luttype='2' elements='1' encoding='hex'>";
245  for (int i = 0; i < 16; i++)
246  *oc_ << std::hex << (((int)(digest[i])) & 0xFF);
247  *oc_ << "</Data>\n";
248 
249  os << " <Data elements='1024' encoding='hex'> " << std::endl;
250  os << std::hex;
251  for (int initr2 = 0; initr2 < 1024; initr2++) {
252  os << (int(lut[initr2]) & 0xFF) << " ";
253  }
254  os << std::dec;
255  os << std::endl;
256  os << " </Data> " << std::endl;
257  os << "</CFGBrick> " << std::endl;
258 }
259 
260 std::vector<unsigned char> HcalLuttoDB::extractOutputLut(const CaloTPGTranscoder& coder, HcalTrigTowerDetId chan) {
261  std::vector<unsigned char> lut;
262  for (int i = 0; i < 1024; i++) {
263  HcalTriggerPrimitiveSample s = coder.hcalCompress(chan, i, false);
264  lut.push_back(s.compressedEt());
265  }
266  return lut;
267 }
268 
269 // ------------ method called to produce the data ------------
271  //using namespace edm;
272  //using namespace std;
273 
274  edm::LogInfo("Hcal") << "Beginning dump of Hcal TPG LUTS (this may take a minute or two)";
275 
276  const HcalElectronicsMap* Map_;
277  const HcalDbService* pSetup = &iSetup.getData(tokdb_);
278  Map_ = pSetup->getHcalMapping();
279  // get the conditions, for the decoding
280  const HcalTPGCoder* inputCoder = &iSetup.getData(tokhcalCode_);
281  const CaloTPGTranscoder* outTranscoder = &iSetup.getData(tokcaloCode_);
282 
283  std::vector<HcalElectronicsId> allEID = Map_->allElectronicsId();
284  std::vector<HcalElectronicsId>::iterator itreid;
285 
286  std::ostream* pfile = nullptr;
287  oc_ = openChecksums();
288 
289  for (int crate = 0; crate < 20; crate++) {
290  edm::LogInfo("Hcal") << "Beginning crate " << crate;
291  for (itreid = allEID.begin(); itreid != allEID.end(); ++itreid) {
292  if (itreid->readoutVMECrateId() != crate)
293  continue;
294  if (itreid->isTriggerChainId()) { // lut2
295  HcalTrigTowerDetId tid = Map_->lookupTrigger(*itreid);
296  if (tid.null())
297  continue;
298 
299  if (filePerCrate_ && pfile == nullptr)
300  pfile = openPerCrate(crate);
301  else if (pfile == nullptr)
302  pfile = openPerLut2(*itreid);
303 
304  std::vector<unsigned char> lut = extractOutputLut(*outTranscoder, tid);
305  writeoutlut2(tid, *itreid, lut, *pfile);
306  if (!filePerCrate_) {
307  delete pfile;
308  pfile = nullptr;
309  }
310  } else { // lut1
311  HcalGenericDetId gid = Map_->lookup(*itreid);
312  if (gid.null() || !(gid.genericSubdet() == HcalGenericDetId::HcalGenBarrel ||
315  continue;
316 
317  if (filePerCrate_ && pfile == nullptr)
318  pfile = openPerCrate(crate);
319  else if (pfile == nullptr)
320  pfile = openPerLut1(*itreid);
321 
322  std::vector<unsigned short> lut = inputCoder->getLinearizationLUT(HcalDetId(gid));
323  writeoutlut1(HcalDetId(gid), *itreid, lut, *pfile);
324  if (!filePerCrate_) {
325  delete pfile;
326  pfile = nullptr;
327  }
328  }
329  }
330  if (pfile != nullptr) {
331  if (filePerCrate_)
332  *pfile << "</CFGBrickSet>\n";
333  delete pfile;
334  pfile = nullptr;
335  }
336  }
337  *oc_ << "</CFGBrick>\n";
338  delete oc_;
339 }
340 
341 // ------------ method called once each job just before starting event loop ------------
343  char buffer[120];
344  time_t now = time(nullptr);
345  struct tm* tm = localtime(&now);
346  strftime(buffer, 120, "%F %T", tm);
348 }
349 
350 // ------------ method called once each job just after ending the event loop ------------
352 
353 //define this as a plug-in
const bool filePerCrate_
Definition: HcalLuttoDB.cc:72
T const & getData(const ESGetToken< T, R > &iToken) const noexcept(false)
Definition: EventSetup.h:119
void endJob() override
Definition: HcalLuttoDB.cc:351
std::ostream * openPerLut2(HcalElectronicsId eid)
Definition: HcalLuttoDB.cc:138
edm::ESGetToken< CaloTPGTranscoder, CaloTPGRecord > tokcaloCode_
Definition: HcalLuttoDB.cc:81
edm::ESGetToken< HcalTPGCoder, HcalTPGRecord > tokhcalCode_
Definition: HcalLuttoDB.cc:80
const DetId lookup(HcalElectronicsId fId) const
lookup the logical detid associated with the given electronics id
HcalLuttoDB(const edm::ParameterSet &)
Definition: HcalLuttoDB.cc:90
std::ostream * openChecksums()
Definition: HcalLuttoDB.cc:106
const HcalElectronicsMap * getHcalMapping() const
void writeoutlut2(HcalTrigTowerDetId id, HcalElectronicsId eid, const std::vector< unsigned char > &lut, std::ostream &os)
Definition: HcalLuttoDB.cc:210
example_stream void analyze(const edm::Event &, const edm::EventSetup &) override
void beginJob()
Definition: Breakpoints.cc:14
virtual std::vector< unsigned short > getLinearizationLUT(HcalDetId id) const
Get the full linearization LUT (128 elements). Default implementation just uses adc2Linear to get all...
Definition: HcalTPGCoder.cc:3
const std::string targetfirmware_
Definition: HcalLuttoDB.cc:71
constexpr bool null() const
is this a null id ?
Definition: DetId.h:59
int iEvent
Definition: GenABIO.cc:224
void analyze(const edm::Event &, const edm::EventSetup &) override
Definition: HcalLuttoDB.cc:270
~HcalLuttoDB() override
Definition: HcalLuttoDB.cc:100
const std::string fileformat_
Definition: HcalLuttoDB.cc:73
std::ostream * oc_
Definition: HcalLuttoDB.cc:82
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
std::vector< HcalElectronicsId > allElectronicsId() const
std::ostream * openPerCrate(int crate)
Definition: HcalLuttoDB.cc:114
HcalGenericSubdetector genericSubdet() const
Log< level::Info, false > LogInfo
edm::ESGetToken< HcalDbService, HcalDbRecord > tokdb_
Definition: HcalLuttoDB.cc:79
void beginJob() override
Definition: HcalLuttoDB.cc:342
chan
lumi = TPaveText(lowX+0.38, lowY+0.061, lowX+0.45, lowY+0.161, "NDC") lumi.SetBorderSize( 0 ) lumi...
std::ostream * openPerLut1(HcalElectronicsId eid)
Definition: HcalLuttoDB.cc:122
string fname
main script
std::string creationstamp_
Definition: HcalLuttoDB.cc:74
HLT enums.
void writeoutlut1(HcalDetId id, HcalElectronicsId eid, const std::vector< unsigned short > &lut, std::ostream &os)
Definition: HcalLuttoDB.cc:154
const std::string creationtag_
Definition: HcalLuttoDB.cc:70
const DetId lookupTrigger(HcalElectronicsId fId) const
brief lookup the trigger logical detid associated with the given electronics id
std::vector< unsigned char > extractOutputLut(const CaloTPGTranscoder &coder, HcalTrigTowerDetId chan)
Definition: HcalLuttoDB.cc:260
Readout chain identification for Hcal.
static const int formatRevision_
Definition: HcalLuttoDB.cc:86