CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
List of all members | Public Member Functions | Private Attributes
PrimitiveConverter Class Reference

#include <PrimitiveConverter.h>

Public Member Functions

std::vector< ConvertedHitconvert (std::vector< L1TMuon::TriggerPrimitive > TriggPrim, int SectIndex)
 
 PrimitiveConverter ()
 

Private Attributes

unsigned int Ph_Disp_Neighbor_ [12][61]
 
int Ph_Init_Neighbor_ [12][5][16]
 
int Th_Corr_Neighbor_ [2][12][4][96]
 
unsigned int Th_Init_Neighbor_ [12][61]
 
int Th_LUT_St1_Neighbor_ [2][12][16][64]
 
int Th_LUT_St234_Neighbor_ [3][12][11][112]
 

Detailed Description

Definition at line 13 of file PrimitiveConverter.h.

Constructor & Destructor Documentation

PrimitiveConverter::PrimitiveConverter ( )

Definition at line 68 of file PrimitiveConverter.cc.

References read_buf().

68  {
69  read_buf("L1Trigger/L1TMuon/data/emtf_luts/ph_lut_v1/ph_disp_neighbor.txt", &Ph_Disp_Neighbor_[0][0], 12*61);
70  read_buf("L1Trigger/L1TMuon/data/emtf_luts/ph_lut_v1/ph_init_neighbor.txt", &Ph_Init_Neighbor_[0][0][0], 12*5*16);
71  read_buf("L1Trigger/L1TMuon/data/emtf_luts/ph_lut_v1/th_corr_neighbor.txt", &Th_Corr_Neighbor_[0][0][0][0], 2*12*4*96);
72  read_buf("L1Trigger/L1TMuon/data/emtf_luts/ph_lut_v1/th_init_neighbor.txt", &Th_Init_Neighbor_[0][0], 12*61);
73  read_buf("L1Trigger/L1TMuon/data/emtf_luts/ph_lut_v1/th_lut_st1_neighbor.txt", &Th_LUT_St1_Neighbor_[0][0][0][0], 2*12*16*64);
74  read_buf("L1Trigger/L1TMuon/data/emtf_luts/ph_lut_v1/th_lut_st234_neighbor.txt", &Th_LUT_St234_Neighbor_[0][0][0][0], 3*12*11*112);
75 }
unsigned int Th_Init_Neighbor_[12][61]
static void read_buf(const char *name, T *buf, unsigned size)
int Th_LUT_St234_Neighbor_[3][12][11][112]
int Th_Corr_Neighbor_[2][12][4][96]
int Th_LUT_St1_Neighbor_[2][12][16][64]
unsigned int Ph_Disp_Neighbor_[12][61]
int Ph_Init_Neighbor_[12][5][16]

Member Function Documentation

std::vector< ConvertedHit > PrimitiveConverter::convert ( std::vector< L1TMuon::TriggerPrimitive TriggPrim,
int  SectIndex 
)
Define Subsector ///

/// ME1 only ////////

Define look-up index ///

Definition at line 77 of file PrimitiveConverter.cc.

References ConvertedHit::AddTheta(), rpcdqm::BX, L1TMuon::TriggerPrimitive::CSCData::bx, CSCDetId::chamber(), L1TMuon::TriggerPrimitive::detId(), Reference_intrackfit_cff::endcap, CSCDetId::endcap(), V0MonitoringClient_cfi::factor, L1TMuon::TriggerPrimitive::getCSCData(), L1TMuon::TriggerPrimitive::getPattern(), L1TMuon::TriggerPrimitive::Id(), recoMuon::in, cmsHarvester::index, L1TMuon::TriggerPrimitive::CSCData::keywire, LogDebug, neighbor(), listBenchmarks::pattern, ph_offsets, ConvertedHit::Phi(), L1TMuon::TriggerPrimitive::CSCData::quality, HLT_25ns10e33_v2_cff::quality, relativeConstraints::ring, CSCDetId::ring(), ConvertedHit::SetNeighbor(), ConvertedHit::SetSectorIndex(), ConvertedHit::SetTP(), ConvertedHit::SetValues(), ConvertedHit::SetZhit(), ConvertedHit::SetZoneWord(), relativeConstraints::station, CSCDetId::station(), L1TMuon::TriggerPrimitive::CSCData::strip, ConvertedHit::Theta(), and CSCDetId::triggerSector().

77  {
78 
79  //bool verbose = false;
80 
81  std::vector<ConvertedHit> ConvHits;
82  for(std::vector<L1TMuon::TriggerPrimitive>::iterator C1 = TriggPrim.begin();C1 != TriggPrim.end();C1++){
83 
88  CSCDetId Det = C3.detId<CSCDetId>();
89 
90  int station = Det.station(), chamber = Det.chamber(), ring = Det.ring(), wire = C3.getCSCData().keywire;
91  int sector = Det.triggerSector(), strip = C3.getCSCData().strip, pattern = C3.getPattern(), Id = C3.Id();
92  int quality = C3.getCSCData().quality, BX = C3.getCSCData().bx, endcap = Det.endcap();
93 
94  if (station == 1 && ring == 1 && strip > 127) ring = 4;
95  int sub = 0;
96 
101 
102  if (station == 1)//is this correct? I know it starts from 1 so not quite what I intended I think.
103  {
104  if(chamber%6 > 2)
105  sub = 1;
106  else
107  sub = 2;
108  }
109 
110  bool IsNeighbor = neighbor(endcap,sector,SectIndex,Id,sub,station);
111 
112  if(ring == 4){Id += 9;}
113 
114  if( (SectIndex == (endcap - 1)*6 + sector - 1 ) || IsNeighbor ) {
115 
119 
120  int ph_tmp = -999, th_tmp = -999;
121  int clctpatcor = -999, clctpatsign = -999;
122  int eightstrip = -999;
123 
124  int factor = (station == 1 && ring == 4) ? 1707://ME1/1a1707?
125  (station == 1 && ring == 3) ? 947: //ME1/3//changed Id > 6 to ring == 3.
126  (station == 1 && ring == 1) ? 1301://ME1/1b
127  1024;//all other chambers
128 
129  bool ph_reverse = (endcap == 1 && station >= 3) ? 1:
130  (endcap == 2 && station < 3) ? 1: 0;
131 
132  int ph_coverage = (station <= 1 && Id > 6 && Id < 10) ? 15 : //30 :
133  (station >= 2 && Id <= 3) ? 40 : 20; //80 : 40;
134 
135  int th_coverage = (station == 1 && Id <= 3) ? 45 :
136  (station == 1 && Id > 6 && Id < 10) ? 27 :
137  (station == 1 && Id > 3) ? 39 :
138  (station == 2 && Id <= 3) ? 43 :
139  (station == 2 && Id > 3) ? 56 :
140  (station == 3 && Id <= 3) ? 34 :
141  (station == 3 && Id > 3) ? 52 :
142  (station == 4 && Id <= 3) ? 28 :
143  (station == 4 && Id > 3) ? 50 : 0;
144 
145  int ph_zone_bnd1 = (station <= 1 && (Id <= 3 || Id > 9)) ? 41 :
146  (station == 2 && Id <= 3) ? 41 :
147  (station == 2 && Id > 3) ? 87 :
148  (station == 3 && Id > 3) ? 49 :
149  (station == 4 && Id > 3) ? 49 : 127;
150 
151  int ph_zone_bnd2 = (station == 3 && Id > 3) ? 87 : 127;
152 
153  int zone_overlap = 2;
154 
155  int fph = -999, th = -999, ph_hit = -999, phzvl = -999;// th_hit = -999, ////
156 
160 
161  int LUTi = -999;
162  int nId = Id;
163  if(IsNeighbor){
164 
165  if(station < 2){
166  nId = 12 + Id/3;
167  }
168  else{
169  int xx = Id;
170  if(xx > 6) xx = 6;
171  nId = 9 + xx/3;
172  }
173  }
174  switch(station)
175  {
176  case 1:
177  switch(sub)
178  {
179  case 1: LUTi = nId - 1;break;
180  case 2: LUTi = 15 + nId;break;
181  default:;//std::cout<<"Sub is out of range"<<std::endl;
182  }
183  break;
184  case 2: LUTi = 27 + nId;break;
185  case 3: LUTi = 38 + nId;break;
186  case 4: LUTi = 49 + nId;break;
187  default:;//std::cout<<"station is out of range"<<std::endl;
188  }
189  if(IsNeighbor && station == 1){
190  switch(sub)
191  {
192  case 1: LUTi = 15 + nId;break;
193  case 2: LUTi = nId - 1;break;
194  default:;//std::cout<<"Sub is out of range"<<std::endl;
195  }
196  }
197 
201 
202  clctpatcor = 0;
203  clctpatsign = 0;
204 
205  if(pattern > 0 && pattern < 11){
206  clctpatsign = ((pattern%2) == 0);
207  if(pattern >= 2) {clctpatcor = 5;}
208  if(pattern >= 6) {clctpatcor = 2;}
209  if(pattern == 10) {clctpatcor = 0;clctpatsign = 0;}
210  }
211 
215 
216  eightstrip = 8*strip;
217  int patcor = clctpatcor;
218 
219  if(station == 1 || Id > 3){//10 Degree Chambers
220  eightstrip = (eightstrip>>1);
221  patcor = (patcor>>1);
222  if(ring == 4 && strip > 127) eightstrip -= 512;
223  }
224 
225  if(clctpatsign) patcor = -patcor;
226  eightstrip += patcor;
227 
231 
232  ph_tmp = ((eightstrip*factor)>>10);
233  int phShift = (ph_tmp>>5);
234  int phLow = 0;
235 
236  if(ph_reverse){
237  ph_tmp = -ph_tmp;
238  phShift = -phShift;
239  phLow = ph_coverage;
240  }
241 
242  int phInitIndex = Id;
243 
244  if(station == 1){
245  int neighborId = C3.Id()/3;
246  int subId = sub;
247  if(IsNeighbor ){
248  subId = 1;
249  phInitIndex = 12 + neighborId;
250  if(ring == 4)
251  phInitIndex = 16;//phInitIndex++;
252  }
253  fph = Ph_Init_Neighbor_[SectIndex][subId-1][phInitIndex - 1] + ph_tmp;
254  }
255  else{
256  int neighborId = Id/3;
257  if(neighborId > 2) neighborId = 2;
258 
259  if(IsNeighbor) phInitIndex = 9 + neighborId;
260 
261  fph = Ph_Init_Neighbor_[SectIndex][station][phInitIndex - 1] + ph_tmp;
262  }
263 
264  if (station == 0 || nId == -1 || SectIndex < 0 || SectIndex > 11 || LUTi < 0 || LUTi > 60) {
265  LogDebug("L1TMuonEndCap") << "\n*********************************************************************" << std::endl;
266  LogDebug("L1TMuonEndCap") << "EMTF malformed LCT: BX " << C3.getCSCData().bx << ", endcap " << Det.endcap()
267  << ", station " << Det.station() << ", sector " << Det.triggerSector()
268  << ", ring " << Det.ring() << ", ID " << C3.Id() << ", chamber " << Det.chamber()
269  << ", strip " << C3.getCSCData().strip << ", wire " << C3.getCSCData().keywire
270  << ", pattern " << C3.getPattern() << ", quality " << C3.getCSCData().quality << std::endl;
271  LogDebug("L1TMuonEndCap") << "Produces: station " << station << ", nId " << nId
272  << ", SectIndex " << SectIndex << ", LUTi " << LUTi << std::endl;
273  continue;
274  }
275 
276  ph_hit = phLow + phShift + (Ph_Disp_Neighbor_[SectIndex][LUTi]>>1);
277 
281 
282  int index = -999;
283  int th_corr = -999;
284  int idl = Id;
285 
286  if(station == 1){
287  int neighborId = C3.Id()/3;
288  int subId = sub;
289  if(IsNeighbor){
290  subId = 1;
291  idl = 12 + neighborId;
292  if(ring == 4) idl = 16;
293  }
294  th_tmp = Th_LUT_St1_Neighbor_[subId-1][SectIndex][idl -1][wire];
295  }
296  else{
297  int neighborId = Id/3;
298  if(neighborId > 2) neighborId = 2;
299  if(IsNeighbor) idl = 9 + neighborId;
300  th_tmp = Th_LUT_St234_Neighbor_[station-2][SectIndex][idl-1][wire];
301  }
302 
303  th = th_tmp + Th_Init_Neighbor_[SectIndex][LUTi];
304  int rth = th;
305 
306  if(station == 1 && (ring == 1 || ring == 4) /*&& endcap == 1*/){
307 
308  index = (wire>>4)*32 + (eightstrip>>4);
309 
310  int corrIndex = Id;
311  int subId = sub;
312  if(corrIndex > 3) corrIndex -= 9;
313 
314  if(IsNeighbor && ring == 4){
315  subId = 1;
316  corrIndex++;
317  }
318 
319  th_corr = Th_Corr_Neighbor_[subId-1][SectIndex][corrIndex-1][index];
320 
321  if(ph_reverse) th_corr = -th_corr;
322 
323  th_tmp += th_corr; // add correction to th_tmp
324  if(th_tmp < 0 || wire == 0) th_tmp = 0;
325 
326  if(th_tmp > th_coverage)//this is one change that I'm not sure if it does anything good or not
327  th_tmp = th_coverage;
328 
329  th_tmp &= 0x3f; //keep only lowest 6 bits
330 
331  if (th_tmp <= th_coverage) th = th_tmp + Th_Init_Neighbor_[SectIndex][LUTi];
332  else th = rth; //was -999
333  }
334 
338 
339  if(th != -999){
340  phzvl = 0;
341  if (th <= (ph_zone_bnd1 + zone_overlap)) phzvl |= 1;
342  if (th > (ph_zone_bnd2 - zone_overlap)) phzvl |= 4;
343  if ((th > (ph_zone_bnd1 - zone_overlap)) && (th <= (ph_zone_bnd2 + zone_overlap))) phzvl |= 2;
344  }
345 
351 
352  if(ring == 4){
353  Id -= 9;
354  if(strip < 128) strip += 128;
355  }
356 
357  //determination of zone contribution
358  int zoneword = 0, zhit = -99, zmask[4] = {1,2,4,8};
359  bool zoneConditions[4] {((phzvl & 1) && (Id < 4)),
360  (((phzvl & 2) && (Id < 4) && (station < 3)) || ((phzvl & 1) && (Id > 3) && (station > 2))),
361  (((phzvl & 1) && (Id > 3) && (Id < 7) && (station == 1)) || ((phzvl & 1) && (Id > 3) && (station == 2)) || ((phzvl & 2) && (Id > 3) && (station > 2))),
362  ( ((station == 1) && (Id > 6)) || ((phzvl & 2) && (Id > 3) && (station == 2)) || ((phzvl & 4) && (station == 3) && (Id > 3)) )};
363 
364  for(int z=0;z<4;z++){
365  if(zoneConditions[z]) zoneword |= zmask[z];
366  }
367 
368  int cindex = Id - 1;
369  int sindex = station;
370  if(sub == 1) sindex--;
371 
372  if(IsNeighbor){
373  sindex = 5;
374  if(station == 1) cindex = Id/3 - 1;
375  else cindex = (station - 1)*2 + ((Id > 6) ? 2:1);
376  }
377 
378  zhit = ph_hit + ph_offsets[sindex][cindex];
379 
384 
386 
387  int in = 0;
388  if(IsNeighbor) in = 1;
389 
390  Hit.SetValues(fph,th,ph_hit,phzvl,station,sub,Id,quality,pattern,wire,strip,BX);
391  Hit.AddTheta(th);
392  Hit.SetTP(C3);
393  Hit.SetZhit(zhit);
394  Hit.SetSectorIndex(SectIndex);
395  Hit.SetNeighbor(in);
396  Hit.SetZoneWord(zoneword);
397 
398  if(Hit.Theta() != -999 && Hit.Phi() > 0 ){//if theta is valid
399  ConvHits.push_back(Hit);
400  }
401  else {
402  LogDebug("L1TMuonEndCap") << "\n#####################################################################" << std::endl;
403  LogDebug("L1TMuonEndCap") << "LCT w/o theta/phi: BX " << C3.getCSCData().bx << ", endcap " << Det.endcap()
404  << ", station " << Det.station() << ", sector " << Det.triggerSector()
405  << ", ring " << Det.ring() << ", ID " << C3.Id() << ", chamber " << Det.chamber()
406  << ", strip " << C3.getCSCData().strip << ", wire " << C3.getCSCData().keywire
407  << ", pattern " << C3.getPattern() << ", quality " << C3.getCSCData().quality << std::endl;
408  LogDebug("L1TMuonEndCap") << "Has fph " << fph << ", th " << th << ", ph_hit " << ph_hit
409  << ", phzvl " << phzvl << ", station " << station << ", sub " << sub
410  << ", Id " << Id << ", quality " << quality << ", pattern " << pattern
411  << ", wire " << wire << ", strip " << strip << ", BX " << BX << std::endl;
412  }
413 
414  } //if sector == sectIndex
415  }
416  return ConvHits;
417 }
#define LogDebug(id)
unsigned int Th_Init_Neighbor_[12][61]
int chamber() const
Definition: CSCDetId.h:68
void SetNeighbor(int neighbor)
int Th_LUT_St234_Neighbor_[3][12][11][112]
void SetZoneWord(int zword)
bool neighbor(int endcap, int sector, int SectIndex, int id, int sub, int station)
const CSCData getCSCData() const
int endcap() const
Definition: CSCDetId.h:93
void SetTP(L1TMuon::TriggerPrimitive tp)
SeedingHitSet::ConstRecHitPointer Hit
int Th_Corr_Neighbor_[2][12][4][96]
int Th_LUT_St1_Neighbor_[2][12][16][64]
int ring() const
Definition: CSCDetId.h:75
int triggerSector() const
Definition: CSCDetId.cc:3
void AddTheta(int theta)
unsigned int Ph_Disp_Neighbor_[12][61]
void SetZhit(int zhit)
void SetValues(int phi, int theta, int ph_hit, int phzvl, int station, int sub, int id, int quality, int pattern, int wire, int strip, int BX)
int station() const
Definition: CSCDetId.h:86
int Ph_Init_Neighbor_[12][5][16]
void SetSectorIndex(int sectorIndex)
int ph_offsets[6][9]

Member Data Documentation

unsigned int PrimitiveConverter::Ph_Disp_Neighbor_[12][61]
private

Definition at line 20 of file PrimitiveConverter.h.

int PrimitiveConverter::Ph_Init_Neighbor_[12][5][16]
private

Definition at line 21 of file PrimitiveConverter.h.

int PrimitiveConverter::Th_Corr_Neighbor_[2][12][4][96]
private

Definition at line 22 of file PrimitiveConverter.h.

unsigned int PrimitiveConverter::Th_Init_Neighbor_[12][61]
private

Definition at line 23 of file PrimitiveConverter.h.

int PrimitiveConverter::Th_LUT_St1_Neighbor_[2][12][16][64]
private

Definition at line 24 of file PrimitiveConverter.h.

int PrimitiveConverter::Th_LUT_St234_Neighbor_[3][12][11][112]
private

Definition at line 25 of file PrimitiveConverter.h.