CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
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
virtual HcalTriggerPrimitiveSample hcalCompress(const HcalTrigTowerDetId &id, unsigned int sample, int fineGrain) const =0
Compression from linear samples+fine grain in the HTR.
const bool filePerCrate_
Definition: HcalLuttoDB.cc:72
void endJob() override
Definition: HcalLuttoDB.cc:351
constexpr bool null() const
is this a null id ?
Definition: DetId.h:59
std::ostream * openPerLut2(HcalElectronicsId eid)
Definition: HcalLuttoDB.cc:138
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
tuple chan
lumi = TPaveText(lowX+0.38, lowY+0.061, lowX+0.45, lowY+0.161, &quot;NDC&quot;) lumi.SetBorderSize( 0 ) lumi...
edm::ESGetToken< CaloTPGTranscoder, CaloTPGRecord > tokcaloCode_
Definition: HcalLuttoDB.cc:81
edm::ESGetToken< HcalTPGCoder, HcalTPGRecord > tokhcalCode_
Definition: HcalLuttoDB.cc:80
HcalLuttoDB(const edm::ParameterSet &)
Definition: HcalLuttoDB.cc:90
std::ostream * openChecksums()
Definition: HcalLuttoDB.cc:106
constexpr int slbChannelIndex() const
get the SLB channel index (valid only for VME trigger-chain ids)
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
const std::string targetfirmware_
Definition: HcalLuttoDB.cc:71
bool getData(T &iHolder) const
Definition: EventSetup.h:122
constexpr int htrTopBottom() const
get the htr top/bottom (1=top/0=bottom), valid for VME
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
constexpr int htrSlot() const
get the htr slot
const std::string fileformat_
Definition: HcalLuttoDB.cc:73
constexpr int readoutVMECrateId() const
get the readout VME crate number
std::ostream * oc_
Definition: HcalLuttoDB.cc:82
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
std::ostream * openPerCrate(int crate)
Definition: HcalLuttoDB.cc:114
Log< level::Info, false > LogInfo
constexpr int fiberIndex() const
get the fiber index. For VME 1-8 (which of eight fibers carried by a spigot), for uTCA fibers are zer...
edm::ESGetToken< HcalDbService, HcalDbRecord > tokdb_
Definition: HcalLuttoDB.cc:79
void beginJob() override
Definition: HcalLuttoDB.cc:342
std::vector< HcalElectronicsId > allElectronicsId() const
std::ostream * openPerLut1(HcalElectronicsId eid)
Definition: HcalLuttoDB.cc:122
string fname
main script
std::string creationstamp_
Definition: HcalLuttoDB.cc:74
const HcalElectronicsMap * getHcalMapping() const
constexpr int slbSiteNumber() const
get the SLB site number (valid only for VME trigger-chain ids)
int compressedEt() const
get the encoded/compressed Et
const DetId lookupTrigger(HcalElectronicsId fId) const
brief lookup the trigger logical detid associated with the given electronics id
constexpr int fiberChanId() const
get the fiber channel id (which of channels on a fiber)
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
HcalGenericSubdetector genericSubdet() const
std::vector< unsigned char > extractOutputLut(const CaloTPGTranscoder &coder, HcalTrigTowerDetId chan)
Definition: HcalLuttoDB.cc:260
Readout chain identification for Hcal.
const DetId lookup(HcalElectronicsId fId) const
lookup the logical detid associated with the given electronics id
static const int formatRevision_
Definition: HcalLuttoDB.cc:86