CMS 3D CMS Logo

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