CMS 3D CMS Logo

L1MuGMTMIAUPhiPro1LUT.cc
Go to the documentation of this file.
1 //-------------------------------------------------
2 //
3 // Class: L1MuGMTMIAUPhiPro1LUT
4 //
5 //
6 //
7 // Author :
8 // H. Sakulin HEPHY Vienna
9 //
10 // Migrated to CMSSW:
11 // I. Mikulec
12 //
13 //--------------------------------------------------
14 
15 //-----------------------
16 // This Class's Header --
17 //-----------------------
19 
20 //---------------
21 // C++ Headers --
22 //---------------
23 
24 //-------------------------------
25 // Collaborating Class Headers --
26 //-------------------------------
30 
32 
34 
35 using namespace std;
36 
37 //-------------------
38 // InitParameters --
39 //-------------------
40 
42  m_calo_align = 0.; //***FIXME: read from DB or .orcarc
43 }
44 
45 //--------------------------------------------------------------------------------
46 // Phi Projection LUT 1: project in phi based on eta(4bit), pt and charge
47 // =====================
48 //
49 // This LUT contains the phi projection. Based on the fine phi (lower 3 bits of the
50 // phi code) inside a calo region, eta(4bit), pt and charge it delivers a 3-bit offset
51 // to the starting calo region(=upper 5 bits of phi code) and a 1-bit fine grain
52 // information indicating which half of the target calo region the projection points to.
53 //
54 // The offset for positive charge is always positive, for neg charge it is always negative
55 // However, to accomodate for a calo alignment, an offset of 1 region into the opposite
56 // direction is possible.
57 //
58 // meaning of 3-bit calo-offset cphi_ofs:
59 // charge + charge -
60 // offset phi(*) offset phi(*)
61 // 0 | -1 reg -20deg.. 0deg | +1 reg +20deg.. 40deg |
62 // 1 | 0 - 0deg.. 20deg | 0 0deg.. 20deg |
63 // 2 | +1 reg 20deg.. 40deg | -1 reg -20deg.. 0deg |
64 // 3 | +2 reg 40deg.. 60deg | -2 reg -40deg.. -20deg |
65 // 4 | +3 reg 60deg.. 80deg | -3 reg -60deg.. -40deg |
66 // 5 | +4 reg 80deg..100deg | -4 reg -80deg.. -60deg |
67 // 6 | +5 reg 100deg..120deg | -5 reg -100deg.. -80deg |
68 // 7 | +6 reg 120deg..140deg | -6 reg -120deg..-100deg |
69 //
70 // (*) relative to low edge of start region
71 //
72 //
73 //
74 // It is possible to specify a calo alignment: This is the angle between the low
75 // edge of the first calo region an the low edge of the first bin of the muon phi
76 // scale. By default both low edges are at phi=0.
77 //
78 // calo_align = Phi(low edge of first calo reg) - Phi (Low edge of first muon oh bin)
79 //
80 //--------------------------------------------------------------------------------
81 
82 
83 unsigned L1MuGMTMIAUPhiPro1LUT::TheLookupFunction (int idx, unsigned phi_fine, unsigned eta, unsigned pt, unsigned charge) const {
84  // idx is MIP_DT, MIP_BRPC, ISO_DT, ISO_BRPC, MIP_CSC, MIP_FRPC, ISO_CSC, ISO_FRPC
85  // INPUTS: phi_fine(3) eta(4) pt(5) charge(1)
86  // OUTPUTS: cphi_fine(1) cphi_ofs(3)
87 
88 // const L1MuTriggerScales* theTriggerScales = L1MuGMTConfig::getTriggerScales();
89  const L1MuTriggerPtScale* theTriggerPtScale = L1MuGMTConfig::getTriggerPtScale();
90 
91  int isRPC = idx % 2;
92  int isFWD = idx / 4;
93 
94  int isys = isFWD + 2 * isRPC; // DT, CSC, BRPC, FRPC
95  int isISO = (idx / 2) % 2;
96 
97  int ch_idx = (charge == 0) ? 1 : 0; // positive charge is 0 (but idx 1)
98 
99  // currently only support 3-bit eta (3 lower bits); ignore 4th bit
100  if (eta>7) eta -= 8;
101 
102  float dphi = L1MuGMTPhiLUT::dphi (isys, isISO, ch_idx, (int) eta,
103  theTriggerPtScale->getPtScale()->getLowEdge(pt) ); // use old LUT, here
104  // theTriggerScales->getPtScale()->getLowEdge(pt) ); // use old LUT, here
105 
106  // calculate phi in calo relative to low edge of start region
107  // == use low edge of muon phi bin as dphi was calculated with this assumption
108 
109  float calophi = phi_fine * 2.5 / 180. * M_PI - dphi - m_calo_align;
110 
111  if (charge == 0 && calophi < 0.) { // plus charge
112  edm::LogWarning("LUTMismatch")
113  << "warning: calo offset goes into wrong direction. charge is plus and calophi < 0deg" << endl
114  << "SYS=" << ( isys==0?"DT":isys==1? "CSC" : isys== 2? "BRPC" : "FRPC" )
115  << " ISO = " << isISO
116  << " etabin = " << eta
117  << " pval = " << theTriggerPtScale->getPtScale()->getLowEdge(pt)
118  // << " pval = " << theTriggerScales->getPtScale()->getLowEdge(pt)
119  << " charge = " << ( charge==0?"pos":"neg" )
120  << " phi_fine = " << phi_fine
121  << " calophi(deg) = " << calophi * 180. / M_PI
122  << endl;
123  }
124  else if (charge == 1 && calophi > 20. / 180. * M_PI) { // neg charge
125  edm::LogWarning("LUTMismatch")
126  << "warning: calo offset goes into wrong direction. charge is minus and calophi > 20deg" << endl
127  << "SYS=" << ( isys==0?"DT":isys==1? "CSC" : isys== 2? "BRPC" : "FRPC" )
128  << " ISO = " << isISO
129  << " etabin = " << eta
130  << " pval = " << theTriggerPtScale->getPtScale()->getLowEdge(pt)
131  // << " pval = " << theTriggerScales->getPtScale()->getLowEdge(pt)
132  << " charge = " << ( charge==0?"pos":"neg" )
133  << " phi_fine = " << phi_fine
134  << " calophi(deg) = " << calophi * 180. / M_PI
135  << endl;
136  }
137 
138  // which half of calo region
139  int cphi_fine = (int) ( ( calophi + 2. * M_PI ) / ( 10. / 180. * M_PI ) );
140  cphi_fine %= 2;
141 
142  // shift by one region so that an offset in wrong direction w.r.t. bending becomes possible
143  // (may be necessary to accomodate a calo alignment)
144  if (charge == 1) // neg charge
145  calophi = 20. / 180 * M_PI - calophi;
146  calophi += 20. / 180 * M_PI;
147 
148  if (calophi < 0.) {
149  edm::LogWarning("LUTMismatch")
150  << "warning: calo offset goes into wrong direction by more than 20deg !!!! please correct!" << endl;
151  calophi = 0.;
152  }
153  int cphi_ofs = (int) ( calophi / ( 20. / 180. * M_PI) ); // in 20 deg regions
154  // 0; -1 region; 1 no offset; 2: +1 region , ... 7: +6 regions
155 
156  if (cphi_ofs > 7) {
157  edm::LogWarning("LUTMismatch")
158  << "warning: calo offset is larger than 6 regions !!!! please correct!" << endl;
159  cphi_ofs = 7;
160  }
161 
162  return ( (cphi_fine << 3) + cphi_ofs );
163 }
164 
165 
166 
167 
168 
169 
170 
171 
172 
173 
174 
175 
176 
177 
178 
179 
180 
181 
182 
const L1MuScale * getPtScale() const
get the Pt scale
bool isRPC(const GeomDetEnumerators::SubDetector m)
void InitParameters()
Initialize scales, configuration parameters, alignment constants, ...
#define M_PI
static const L1MuTriggerPtScale * getTriggerPtScale()
unsigned TheLookupFunction(int idx, unsigned phi_fine, unsigned eta, unsigned pt, unsigned charge) const
The lookup function - here the functionality of the LUT is implemented.
static float dphi(int isys, int isISO, int icharge, int ieta, float pt)
look up delta-phi with integer eta
virtual float getLowEdge(unsigned packed) const =0
get the low edge of bin represented by packed