CMS 3D CMS Logo

L1TMuonBarrelParamsHelper.cc
Go to the documentation of this file.
2 
3 void L1TMuonBarrelParamsHelper::print(std::ostream& out) const {
4 
5  out << "L1 BMTF Parameters" << std::endl;
6 
7  out << "Firmware version: " << fwVersion_ << std::endl;
8 }
9 
10 L1TMuonBarrelParamsHelper::L1TMuonBarrelParamsHelper(const L1TMuonBarrelParams& barrelParams) : L1TMuonBarrelParams(barrelParams) //: L1TMuonBarrelParams_PUBLIC(cast_to_L1TMuonBarrelParams_PUBLIC(barrelParams)) //: m_params_helper(barrelParams)
11 {
12 // if (pnodes_.size() != 2)
13 // pnodes_.resize(2);
14 
15 }
16 
17 void L1TMuonBarrelParamsHelper::configFromPy(std::map<std::string, int>& allInts, std::map<std::string, bool>& allBools, std::map<std::string, std::vector<std::string> > allMasks, unsigned int fwVersion, const std::string& AssLUTpath)
18 {
19  set_PT_Assignment_nbits_Phi(allInts["PT_Assignment_nbits_Phi"]);
20  set_PT_Assignment_nbits_PhiB(allInts["PT_Assignment_nbits_PhiB"]);
21  set_PHI_Assignment_nbits_Phi(allInts["PHI_Assignment_nbits_Phi"]);
22  set_PHI_Assignment_nbits_PhiB(allInts["PHI_Assignment_nbits_PhiB"]);
23  set_Extrapolation_nbits_Phi(allInts["Extrapolation_nbits_Phi"]);
24  set_Extrapolation_nbits_PhiB(allInts["Extrapolation_nbits_PhiB"]);
25  set_BX_min(allInts["BX_min"]);
26  set_BX_max(allInts["BX_max"]);
27  set_Extrapolation_Filter(allInts["Extrapolation_Filter"]);
28  set_OutOfTime_Filter_Window(allInts["OutOfTime_Filter_Window"]);
29  set_OutOfTime_Filter(allBools["OutOfTime_Filter"]);
30  set_Open_LUTs(allBools["Open_LUTs"]);
31  set_EtaTrackFinder(allBools["EtaTrackFinder"]);
32  set_Extrapolation_21(allBools["Extrapolation_21"]);
33  setFwVersion(fwVersion);
34  set_DisableNewAlgo(allBools["DisableNewAlgo"]);
35 
36  setAssLUTPath(AssLUTpath);
38  std::vector<LUT> pta_lut(0); pta_lut.reserve(19);
39  std::vector<int> pta_threshold(10);
40  if ( load_pt(pta_lut,pta_threshold, allInts["PT_Assignment_nbits_Phi"], AssLUTpath) != 0 ) {
41  cout << "Can not open files to load pt-assignment look-up tables for L1TMuonBarrelTrackProducer!" << endl;
42  }
43  setpta_lut(pta_lut);
44  setpta_threshold(pta_threshold);
45 
47  std::vector<LUT> phi_lut(0); phi_lut.reserve(2);
48  if ( load_phi(phi_lut, allInts["PHI_Assignment_nbits_Phi"], allInts["PHI_Assignment_nbits_PhiB"], AssLUTpath) != 0 ) {
49  cout << "Can not open files to load phi-assignment look-up tables for L1TMuonBarrelTrackProducer!" << endl;
50  }
51  setphi_lut(phi_lut);
52 
53 
54 
55 
56  l1mudttfparams.reset(); //KK
57  l1mudttfqualplut.load(); //KK: Do these LUTs ever change and is it safe to initialize it from the release files like that?
58  l1mudttfetaplut.load(); //KK
59  // the data members of the Helper class loaded above are transient, push those to the persistent storage of the base class:
62 
63 
64  for( int wh=-3; wh<4; wh++ ) {
65  int sec = 0;
66  for(char& c : allMasks["mask_phtf_st1"].at(wh+3) ) {
67  int mask = c - '0';
69  sec++;
70  }
71  sec = 0;
72  for(char& c : allMasks["mask_phtf_st2"].at(wh+3) ) {
73  int mask = c - '0';
75  sec++;
76  }
77  sec = 0;
78  for(char& c : allMasks["mask_phtf_st3"].at(wh+3) ) {
79  int mask = c - '0';
81  sec++;
82  }
83  sec = 0;
84  for(char& c : allMasks["mask_phtf_st4"].at(wh+3) ) {
85  int mask = c - '0';
87  sec++;
88  }
89  sec = 0;
90  for(char& c : allMasks["mask_ettf_st1"].at(wh+3) ) {
91  int mask = c - '0';
93  sec++;
94  }
95  sec = 0;
96  for(char& c : allMasks["mask_ettf_st2"].at(wh+3) ) {
97  int mask = c - '0';
99  sec++;
100  }
101  sec = 0;
102  for(char& c : allMasks["mask_ettf_st3"].at(wh+3) ) {
103  int mask = c - '0';
104  l1mudttfmasks.set_etsoc_chdis_st3(wh,sec,mask);
105  //Not used in BMTF - mask
106  l1mudttfmasks.set_inrec_chdis_csc(wh,sec,true);
107  sec++;
108  }
109 
110  }
111 
112 
114  std::vector<L1TMuonBarrelParams::LUTParams::extLUT> ext_lut(0); ext_lut.reserve(12);
115  if ( load_ext(ext_lut, allInts["PHI_Assignment_nbits_Phi"], allInts["PHI_Assignment_nbits_PhiB"]) != 0 ) {
116  cout << "Can not open files to load extrapolation look-up tables for L1TMuonBarrelTrackProducer!" << endl;
117  }
118  setext_lut(ext_lut);
119 
120  //l1mudttfextlut.load();
121 }
122 
124 {
125  std::map<std::string, std::string> procRole = trgSys.getProcToRoleAssignment();
126 
127  for(auto it_proc=procRole.begin(); it_proc!=procRole.end(); it_proc++ )
128  {
129 
130  std::string procId = it_proc->first;
131 
132  std::map<std::string, l1t::Parameter> settings = trgSys.getParameters(procId.c_str());
133 
134 
135  std::vector<std::string> paths = settings["regTable"].getTableColumn<std::string>("register_path");
136  std::vector<unsigned int> vals = settings["regTable"].getTableColumn<unsigned int>("register_value");
137  for(unsigned int row=0; row<paths.size(); row++)
138  {
139  if (paths[row].find("open_lut") != std::string::npos){
140  //std::cout << "Value is: " << vals[row] << std::endl;
141  set_Open_LUTs(vals[row]);
142  }
143  if (paths[row].find("sel_21") != std::string::npos){
144  //std::cout << "Value is: " << vals[row] << std::endl;
145  set_Extrapolation_21(vals[row]);
146  }
147 
148  if (paths[row].find("dis_newalgo") != std::string::npos){
149  //std::cout << "Value is: " << vals[row] << std::endl;
150  //int fwv = (vals[row]==1) ? 1 : 2;
151  //setFwVersion(fwv);
152  bool disnewalgo = (vals[row]==1);
153  set_DisableNewAlgo(disnewalgo);
154  }
155 
156  string masks[5] = {"mask_ctrl_N2", "mask_ctrl_N1", "mask_ctrl_0", "mask_ctrl_P1", "mask_ctrl_P2"};
157 
158  for(int m=0; m<5; m++)
159  {
160 
161  if (paths[row].find(masks[m]) != std::string::npos){
163  int mask = 0x1&vals[row];
164  int mask_all = vals[row];
166  if(!( mask_all==0x111111 || mask_all==0x222222 || mask_all==0x333333 || mask_all==0x444444 ||
167  mask_all==0x555555 || mask_all==0x666666 || mask_all==0x777777) )
168  cerr<<"BMTF: Cannot re-emulate properly. Individual link masking cannot be handled."<<endl;
169 
170  if((mask&1)>0) {
171  for(int sec=0; sec<12; sec++){
172  if(masks[m]=="mask_ctrl_N2"){
173  l1mudttfmasks.set_inrec_chdis_st1(-3,sec,true);
174  l1mudttfmasks.set_etsoc_chdis_st1(-3,sec,true);
175  }
176  if(masks[m]=="mask_ctrl_N1"){
177  l1mudttfmasks.set_inrec_chdis_st1(-2,sec,true);
178  l1mudttfmasks.set_etsoc_chdis_st1(-2,sec,true);
179  }
180 
181  if(masks[m]=="mask_ctrl_0"){
182  l1mudttfmasks.set_inrec_chdis_st1(-1,sec,true);
184  l1mudttfmasks.set_etsoc_chdis_st1(-1,sec,true);
186  }
187  if(masks[m]=="mask_ctrl_P1"){
190  }
191  if(masks[m]=="mask_ctrl_P2"){
194  }
195  }
196 
197  }
198 
199  if((mask&2)>0) {
200  for(int sec=0; sec<12; sec++){
201  if(masks[m]=="mask_ctrl_N2"){
202  l1mudttfmasks.set_inrec_chdis_st2(-3,sec,true);
203  l1mudttfmasks.set_etsoc_chdis_st2(-3,sec,true);
204  }
205  if(masks[m]=="mask_ctrl_N1"){
206  l1mudttfmasks.set_inrec_chdis_st2(-2,sec,true);
207  l1mudttfmasks.set_etsoc_chdis_st2(-2,sec,true);
208  }
209 
210  if(masks[m]=="mask_ctrl_0"){
211  l1mudttfmasks.set_inrec_chdis_st2(-1,sec,true);
213  l1mudttfmasks.set_etsoc_chdis_st2(-1,sec,true);
215  }
216  if(masks[m]=="mask_ctrl_P1"){
219  }
220  if(masks[m]=="mask_ctrl_P2"){
223  }
224  }
225  }
226 
227  if((mask&4)>0) {
228  for(int sec=0; sec<12; sec++){
229  if(masks[m]=="mask_ctrl_N2"){
230  l1mudttfmasks.set_inrec_chdis_st3(-3,sec,true);
231  l1mudttfmasks.set_etsoc_chdis_st3(-3,sec,true);
232  }
233  if(masks[m]=="mask_ctrl_N1"){
234  l1mudttfmasks.set_inrec_chdis_st3(-2,sec,true);
235  l1mudttfmasks.set_etsoc_chdis_st3(-2,sec,true);
236  }
237 
238  if(masks[m]=="mask_ctrl_0"){
239  l1mudttfmasks.set_inrec_chdis_st3(-1,sec,true);
241  l1mudttfmasks.set_etsoc_chdis_st3(-1,sec,true);
243  }
244  if(masks[m]=="mask_ctrl_P1"){
247  }
248  if(masks[m]=="mask_ctrl_P2"){
251  }
252  }
253  }
254 
255  if((mask&8)>0) {
256  for(int sec=0; sec<12; sec++){
257  if(masks[m]=="mask_ctrl_N2"){
258  l1mudttfmasks.set_inrec_chdis_st4(-3,sec,true);
259  }
260  if(masks[m]=="mask_ctrl_N1"){
261  l1mudttfmasks.set_inrec_chdis_st4(-2,sec,true);
262  }
263 
264  if(masks[m]=="mask_ctrl_0"){
265  l1mudttfmasks.set_inrec_chdis_st4(-1,sec,true);
267  }
268  if(masks[m]=="mask_ctrl_P1"){
270  }
271  if(masks[m]=="mask_ctrl_P2"){
273  }
274  }
275  }
276  }
277  }
278  }
279  }
280 }
281 
283  std::vector<int>& pta_threshold,
284  unsigned short int nbitphi,
285  std::string AssLUTpath
286  ){
287 
288 
289 // maximal number of pt assignment methods
290 const int MAX_PTASSMETH = 19;
291 const int MAX_PTASSMETHA = 12;
292 
293 // pt assignment methods
296  PB12H, PB13H, PB14H, PB21H, PB23H, PB24H, PB34H,
297  NODEF };
298 
299  // get directory name
300  string pta_str = "";
301  // precision : in the look-up tables the following precision is used :
302  // phi ...12 bits (address) and pt ...5 bits
303  // now convert phi and phib to the required precision
304  int nbit_phi = nbitphi;
305  int sh_phi = 12 - nbit_phi;
306 
307  // loop over all pt-assignment methods
308  for ( int pam = 0; pam < MAX_PTASSMETH; pam++ ) {
309  switch ( pam ) {
310  case PT12L : { pta_str = "pta12l"; break; }
311  case PT12H : { pta_str = "pta12h"; break; }
312  case PT13L : { pta_str = "pta13l"; break; }
313  case PT13H : { pta_str = "pta13h"; break; }
314  case PT14L : { pta_str = "pta14l"; break; }
315  case PT14H : { pta_str = "pta14h"; break; }
316  case PT23L : { pta_str = "pta23l"; break; }
317  case PT23H : { pta_str = "pta23h"; break; }
318  case PT24L : { pta_str = "pta24l"; break; }
319  case PT24H : { pta_str = "pta24h"; break; }
320  case PT34L : { pta_str = "pta34l"; break; }
321  case PT34H : { pta_str = "pta34h"; break; }
322  case PB12H : { pta_str = "ptb12h_Feb2016"; break; }
323  case PB13H : { pta_str = "ptb13h_Feb2016"; break; }
324  case PB14H : { pta_str = "ptb14h_Feb2016"; break; }
325  case PB21H : { pta_str = "ptb21h_Feb2016"; break; }
326  case PB23H : { pta_str = "ptb23h_Feb2016"; break; }
327  case PB24H : { pta_str = "ptb24h_Feb2016"; break; }
328  case PB34H : { pta_str = "ptb34h_Feb2016"; break; }
329 
330  }
331 
332  // assemble file name
333  const string& lutpath = AssLUTpath;
334  edm::FileInPath lut_f = edm::FileInPath(string(lutpath + pta_str + ".lut"));
335  string pta_file = lut_f.fullPath();
336 
337  // open file
338  L1TriggerLutFile file(pta_file);
339  if ( file.open() != 0 ) return -1;
340 
341  // get the right shift factor
342  int shift = sh_phi;
343  int adr_old = -2048 >> shift;
344  if (pam >= MAX_PTASSMETHA) adr_old = -512 >> shift;
345 
346  LUT tmplut;
347 
348  int number = -1;
349  int sum_pt = 0;
350 
351  if ( file.good() ) {
352  int threshold = file.readInteger();
353  pta_threshold[pam/2] = threshold;
354  }
355 
356  // read values and shift to correct precision
357  while ( file.good() ) {
358 
359  int adr = (file.readInteger()) >> shift;
360  int pt = file.readInteger();
361 
362  number++;
363  //cout<<pam<<" "<<number<<" "<<MAX_PTASSMETHA<<endl;
364  if ( adr != adr_old ) {
365  assert(number);
366  tmplut.insert(make_pair( adr_old, (sum_pt/number) ));
367 
368  adr_old = adr;
369  number = 0;
370  sum_pt = 0;
371  }
372 
373  sum_pt += pt;
374 
375  if ( !file.good() ) file.close();
376 
377  }
378 
379  file.close();
380  pta_lut.push_back(tmplut);
381  }
382  return 0;
383 
384 }
385 
386 
387 
388 
390  unsigned short int nbit_phi,
391  unsigned short int nbit_phib,
392  std::string AssLUTpath
393  ) {
394 
395 
396  // precision : in the look-up tables the following precision is used :
397  // address (phib) ...10 bits, phi ... 12 bits
398 
399  int sh_phi = 12 - nbit_phi;
400  int sh_phib = 10 - nbit_phib;
401 
402  string phi_str;
403  // loop over all phi-assignment methods
404  for ( int idx = 0; idx < 2; idx++ ) {
405  switch ( idx ) {
406  case 0 : { phi_str = "phi12"; break; }
407  case 1 : { phi_str = "phi42"; break; }
408  }
409 
410  // assemble file name
411  edm::FileInPath lut_f = edm::FileInPath(string(AssLUTpath + phi_str + ".lut"));
412  string phi_file = lut_f.fullPath();
413 
414  // open file
415  L1TriggerLutFile file(phi_file);
416  if ( file.open() != 0 ) return -1;
417 
418  LUT tmplut;
419 
420  int number = -1;
421  int adr_old = -512 >> sh_phib;
422  int sum_phi = 0;
423 
424  // read values
425  while ( file.good() ) {
426 
427  int adr = (file.readInteger()) >> sh_phib;
428  int phi = file.readInteger();
429 
430  number++;
431 
432  if ( adr != adr_old ) {
433  assert(number);
434  tmplut.insert(make_pair( adr_old, ((sum_phi/number) >> sh_phi) ));
435 
436  adr_old = adr;
437  number = 0;
438  sum_phi = 0;
439  }
440 
441  sum_phi += phi;
442 
443  if ( !file.good() ) file.close();
444 
445  }
446 
447  file.close();
448  phi_lut.push_back(tmplut);
449  }
450  return 0;
451 
452 }
453 
454 /*
455 int L1TMuonBarrelParamsESProducer::getPtLutThreshold(int pta_ind, std::vector<int>& pta_threshold) const {
456 
457  if ( pta_ind >= 0 && pta_ind < 13/2 ) {
458  return pta_threshold[pta_ind];
459  }
460  else {
461  cerr << "PtaLut::getPtLutThreshold : can not find threshold " << pta_ind << endl;
462  return 0;
463  }
464 
465 }
466 
467 */
468 
469 
470 
471 
472 //
473 // load extrapolation look-up tables
474 //
475 int L1TMuonBarrelParamsHelper::load_ext(std::vector<L1TMuonBarrelParams::LUTParams::extLUT>& ext_lut,
476  unsigned short int nbit_phi,
477  unsigned short int nbit_phib) {
478 
479  //max. number of Extrapolations
480  const int MAX_EXT = 12;
481 
482  // extrapolation types
483  enum Extrapolation { EX12, EX13, EX14, EX21, EX23, EX24, EX34,
484  EX15, EX16, EX25, EX26, EX56 };
485 
486  // get directory name
487  string defaultPath = "L1Trigger/L1TMuon/data/bmtf_luts/";
488  string ext_dir = "LUTs_Ext/";
489  string ext_str = "";
490 
491  // precision : in the look-up tables the following precision is used :
492  // phi ...12 bits (low, high), phib ...10 bits (address)
493  // now convert phi and phib to the required precision
494 
495  int sh_phi = 12 - nbit_phi;
496  int sh_phib = 10 - nbit_phib;
497 
498  // loop over all extrapolations
499  for ( int ext = 0; ext < MAX_EXT; ext++ ) {
500  switch (ext) {
501  case EX12 : ext_str = "ext12"; break;
502  case EX13 : ext_str = "ext13"; break;
503  case EX14 : ext_str = "ext14"; break;
504  case EX21 : ext_str = "ext21"; break;
505  case EX23 : ext_str = "ext23"; break;
506  case EX24 : ext_str = "ext24"; break;
507  case EX34 : ext_str = "ext34"; break;
508  case EX15 : ext_str = "ext15"; break;
509  case EX16 : ext_str = "ext16"; break;
510  case EX25 : ext_str = "ext25"; break;
511  case EX26 : ext_str = "ext26"; break;
512  case EX56 : ext_str = "ext56"; break;
513  }
514 
515  // assemble file name
516  edm::FileInPath lut_f = edm::FileInPath(string(defaultPath + ext_dir + ext_str + ".lut"));
517  string ext_file = lut_f.fullPath();
518 
519  // open file
520  L1TriggerLutFile file(ext_file);
521  if ( file.open() != 0 ) return -1;
522  // if ( L1MuDTTFConfig::Debug(1) ) cout << "Reading file : "
523  // << file.getName() << endl;
524 
526 
527  int number = -1;
528  int adr_old = -512 >> sh_phib;
529  int sum_low = 0;
530  int sum_high = 0;
531 
532  // read values and shift to correct precision
533  while ( file.good() ) {
534 
535  int adr = ( file.readInteger() ) >> sh_phib; // address (phib)
536  int low = ( file.readInteger() ); // low value (phi)
537  int high = ( file.readInteger() ); // high value (phi)
538 
539  number++;
540 
541  if ( adr != adr_old ) {
542 
543  tmplut.low[adr_old] = sum_low >> sh_phi;
544  tmplut.high[adr_old] = sum_high >> sh_phi;
545 
546  adr_old = adr;
547  number = 0;
548  sum_low = 0;
549  sum_high = 0;
550 
551  }
552 
553  if (number == 0) sum_low = low;
554  if (number == 0) sum_high = high;
555 
556  if ( !file.good() ) file.close();
557  }
558 
559  file.close();
560  ext_lut.push_back(tmplut);
561  }
562  return 0;
563 
564 }
L1MuBMTQualPatternLut l1mudttfqualplut
friend std::ostream& operator<<(std::ostream& o, const L1TMuonBarrelParams & p) { p...
L1MuDTTFParameters l1mudttfparams
void set_etsoc_chdis_st1(int wh, int sc, const bool val)
int load()
load look-up tables
int load_phi(std::vector< LUT > &, unsigned short int, unsigned short int, std::string)
int load()
load pattern look-up table
std::vector< LUT > phi_lut() const
void set_etsoc_chdis_st2(int wh, int sc, const bool val)
bool good()
return status of file stream
std::vector< LUT > pta_lut() const
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
Definition: FindCaloHit.cc:20
std::vector< int > pta_threshold() const
std::vector< LUTParams::extLUT > ext_lut() const
const std::map< std::string, std::string > & getProcToRoleAssignment(void) const noexcept
Definition: TriggerSystem.h:61
void setphi_lut(std::vector< LUT > philut)
int load_ext(std::vector< L1TMuonBarrelParams::LUTParams::extLUT > &, unsigned short int, unsigned short int)
L1MuDTTFMasks l1mudttfmasks
void close()
close file
const int MAX_EXT
void setpta_lut(std::vector< LUT > ptalut)
void set_inrec_chdis_st4(int wh, int sc, const bool val)
Extrapolation
int load_pt(std::vector< LUT > &, std::vector< int > &, unsigned short int, std::string)
if configDB
void reset()
reset parameters to zero
void setAssLUTPath(std::string path)
void set_inrec_chdis_st2(int wh, int sc, const bool val)
std::map< short, short, std::less< short > > LUT
L1MuBMPtaLut.
void set_inrec_chdis_st3(int wh, int sc, const bool val)
const std::map< std::string, Parameter > & getParameters(const char *processor) const
void setFwVersion(unsigned fwVersion)
void set_etsoc_chdis_st3(int wh, int sc, const bool val)
void setext_lut(std::vector< LUTParams::extLUT > extlut)
void configFromPy(std::map< std::string, int > &allInts, std::map< std::string, bool > &allBools, std::map< std::string, std::vector< std::string > > allMasks, unsigned int fwVersion, const std::string &AssLUTpath)
int readInteger()
read one integer from file
constexpr uint32_t masks[]
Definition: CaloRecHit.cc:12
static unsigned int const shift
std::string fullPath() const
Definition: FileInPath.cc:197
void print(std::ostream &) const
void configFromDB(l1t::TriggerSystem &trgSys)
Definition: memstream.h:15
int open()
open file
void setpta_threshold(std::vector< int > ptathresh)
void set_inrec_chdis_csc(int wh, int sc, const bool val)
const int MAX_PTASSMETH
void set_inrec_chdis_st1(int wh, int sc, const bool val)
PtAssMethod