CMS 3D CMS Logo

generateTowerEtThresholdLUT_excl30.py
Go to the documentation of this file.
1 #!/usr/bin/env python
2 
3 from __future__ import print_function
4 import os
5 import sys
6 import math
7 
8 
9 ###############################################################################################
10 # Python script for generating LUT to return tower Et threshold for energy sums #
11 # Input 1: 5 bits - compressed pileup estimate, as used for EG #
12 # Input 2: 6 bits - abs(ieta) = absolute value of ieta of the trigger tower #
13 # Tower Et threshold not applied for ieta <= 15 #
14 # LUT address input = compressedPileupEstimate << 6 | abs(ieta) #
15 # Returns 9 bits for tower et threshold #
16 # Author: Aaron Bundock (aaron.*nospamthankyamaam*bundock@cern.ch) #
17 # Date: 26/04/17 #
18 # #
19 ###############################################################################################
20 
21 # Run from src/ directory in your checked out CMSSW code!
22 
23 # open LUT file for writing
24 if not os.path.isdir(os.environ['LOCALRT'] + "/src/L1Trigger/L1TCalorimeter/data"):
25  print(os.environ['LOCALRT'] + "/src/L1Trigger/L1TCalorimeter/data/ directory does not exist.\n"
26  "Creating directory now.\n"
27  "Remember to do 'git add " + os.environ['LOCALRT'] + "L1Trigger/L1TCalorimeter/data' when committing the new LUT!")
28  os.makedirs(os.environ['LOCALRT'] + "/src/L1Trigger/L1TCalorimeter/data")
29 
30 print("Creating tower Et threshold LUT with filename " + os.environ['LOCALRT'] + "/src/L1Trigger/L1TCalorimeter/data/lut_towEtThresh_2017v4_excl30.txt'")
31 towEtThreshLUTFile = open(os.environ['LOCALRT']+"/src/L1Trigger/L1TCalorimeter/data/lut_towEtThresh_2017v4_excl30.txt", "w")
32 
33 
34 # write header info
35 towEtThreshLUTFile.write(
36  "# address to et sum tower Et threshold LUT\n"
37  "# maps 11 bits to 9 bits\n"
38  "# 11 bits = (compressedPileupEstimate << 6) | abs(ieta)\n"
39  "# compressedPileupEstimate is unsigned 5 bits, abs(ieta) is unsigned 6 bits\n"
40  "# data: tower energy threshold returned has 9 bits \n"
41  "# anything after # is ignored with the exception of the header\n"
42  "# the header is first valid line starting with #<header> versionStr nrBitsAddress nrBitsData </header>\n"
43  "#<header> v1 11 9 </header>\n"
44 
45 )
46 
47 # vector of calo tower areas, relative to central barrel areas (0.087 in eta)
48 # dummy for ieta=0 and excludes ieta=29, since they don't physically exist!
49 
50 towerAreas = [0.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,
51  1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,
52  1.03,1.15,1.3,1.48,1.72,2.05,1.72,4.02,
53  3.29,2.01,2.02,2.01,2.02,2.0,2.03,1.99,2.02,2.04,2.00,3.47];
54 
55 etaRange = xrange(0,41) # dummy entry for ieta=0, do not count ieta=29, so count 40 towers
56 compNTT4Range = xrange(0,32) # use compressed pileup estimate from EG LUT
57 addr = 0
58 printBins = ""
59 
60 for compNTT4 in compNTT4Range:
61  for ieta in etaRange:
62  towEtThresh = int(round(float(towerAreas[ieta])*(1/(1+math.exp(-0.2*(ieta-5))))*(float(compNTT4)/10)))
63  if ieta > 28:
64  towEtThresh -= 4
65  if towEtThresh > 16:
66  towEtThresh = int(16)
67  if ieta < 13 or towEtThresh < 0:
68  towEtThresh = 0
69  if ieta == 29:
70  towEtThresh = 511
71  if (addr % 64) == 0:
72  printBins = " # nTT4 = " + str(5*compNTT4) + "-" + str((5*compNTT4)+5) + " ieta = " + str(ieta)
73  else:
74  printBins = ""
75  towEtThreshLUTFile.write(
76  str(addr) + " " +
77  str(towEtThresh) +
78  printBins +
79  "\n"
80  )
81  addr+=1
82  if ieta == 40: # dummy to fill 6 bits for eta
83  extraCount = 0
84  while extraCount < 23:
85  towEtThreshLUTFile.write(
86  str(addr) + " " +
87  str(0) +
88  " #dummy\n"
89  )
90  addr+=1
91  extraCount +=1
92 
93 if addr < 2047:
94  for addr in xrange(addr,2047):
95  towEtThreshLUTFile.write(str(addr) + " " + str(0) + " # dummy\n")
96  addr+=1
97 
98 print("Done. Closing file...")
99 
100 towEtThreshLUTFile.close()
S & print(S &os, JobReport::InputFile const &f)
Definition: JobReport.cc:65
#define str(s)