CMS 3D CMS Logo

SectorProcessorLUT.cc
Go to the documentation of this file.
2 
3 #include <cassert>
4 #include <iostream>
5 #include <fstream>
6 
10 
11 
13  version_(0xFFFFFFFF)
14 {
15 
16 }
17 
19 
20 }
21 
22 void SectorProcessorLUT::read(int pc_lut_version) {
23  if (version_ == pc_lut_version) return;
24 
25  edm::LogInfo("L1T") << "EMTF using pc_lut_ver: " << pc_lut_version;
26 
27  std::string coord_lut_dir = "";
28  if (pc_lut_version == 0)
29  coord_lut_dir = "ph_lut_v1"; // All year 2016
30  else if (pc_lut_version == 1)
31  coord_lut_dir = "ph_lut_v2"; // Beginning of 2017
32  else if (pc_lut_version == -1)
33  coord_lut_dir = "ph_lut_v2"; // Beginning of 2017, use local CPPF LUTs
34  else
35  throw cms::Exception("SectorProcessorLUT")
36  << "Trying to use EMTF pc_lut_version = " << pc_lut_version << ", does not exist!";
37  // Will catch user trying to run with Global Tag settings on 2016 data, rather than fakeEmtfParams. - AWB 08.06.17
38 
39  std::string coord_lut_path = "L1Trigger/L1TMuon/data/emtf_luts/" + coord_lut_dir + "/";
40 
41  read_file(coord_lut_path+"ph_init_neighbor.txt", ph_init_neighbor_);
42  read_file(coord_lut_path+"ph_disp_neighbor.txt", ph_disp_neighbor_);
43  read_file(coord_lut_path+"th_init_neighbor.txt", th_init_neighbor_);
44  read_file(coord_lut_path+"th_disp_neighbor.txt", th_disp_neighbor_);
45  read_file(coord_lut_path+"th_lut_neighbor.txt", th_lut_neighbor_);
46  read_file(coord_lut_path+"th_corr_lut_neighbor.txt", th_corr_lut_neighbor_);
47 
48  std::string cppf_coord_lut_path = "L1Trigger/L1TMuon/data/cppf/"; // Coordinate LUTs actually used by CPPF
49  bool use_local_cppf_files = (pc_lut_version == -1);
50  if (use_local_cppf_files) { // More accurate coordinate transformation LUTs from Jia Fu
51  cppf_coord_lut_path = "L1Trigger/L1TMuon/data/cppf_luts/angleScale_v1/";
52  }
53 
54  read_cppf_file(cppf_coord_lut_path, cppf_ph_lut_, cppf_th_lut_, use_local_cppf_files); // cppf filenames are hardcoded in the function
55 
56  if (ph_init_neighbor_.size() != 2*6*61) { // [endcap_2][sector_6][chamber_61]
57  throw cms::Exception("SectorProcessorLUT")
58  << "Expected ph_init_neighbor_ to get " << 2*6*61 << " values, "
59  << "got " << ph_init_neighbor_.size() << " values.";
60  }
61 
62  if (ph_disp_neighbor_.size() != 2*6*61) { // [endcap_2][sector_6][chamber_61]
63  throw cms::Exception("SectorProcessorLUT")
64  << "Expected ph_disp_neighbor_ to get " << 2*6*61 << " values, "
65  << "got " << ph_disp_neighbor_.size() << " values.";
66  }
67 
68  if (th_init_neighbor_.size() != 2*6*61) { // [endcap_2][sector_6][chamber_61]
69  throw cms::Exception("SectorProcessorLUT")
70  << "Expected th_init_neighbor_ to get " << 2*6*61 << " values, "
71  << "got " << th_init_neighbor_.size() << " values.";
72  }
73 
74  if (th_disp_neighbor_.size() != 2*6*61) { // [endcap_2][sector_6][chamber_61]
75  throw cms::Exception("SectorProcessorLUT")
76  << "Expected th_disp_neighbor_ to get " << 2*6*61 << " values, "
77  << "got " << th_disp_neighbor_.size() << " values.";
78  }
79 
80  if (th_lut_neighbor_.size() != 2*6*61*128) { // [endcap_2][sector_6][chamber_61][wire_128]
81  throw cms::Exception("SectorProcessorLUT")
82  << "Expected th_lut_neighbor_ to get " << 2*6*61*128 << " values, "
83  << "got " << th_lut_neighbor_.size() << " values.";
84  }
85 
86  if (th_corr_lut_neighbor_.size() != 2*6*7*128) { // [endcap_2][sector_6][chamber_61][strip_wire_128]
87  throw cms::Exception("SectorProcessorLUT")
88  << "Expected th_corr_lut_neighbor_ to get " << 2*6*7*128 << " values, "
89  << "got " << th_corr_lut_neighbor_.size() << " values.";
90  }
91 
92  if (cppf_ph_lut_.size() != 2*6*6*6*3*64) { // [endcap_2][rpc_sector_6][rpc_station_ring_6][rpc_subsector_6][rpc_roll_3][rpc_halfstrip_64]
93  throw cms::Exception("SectorProcessorLUT")
94  << "Expected cppf_ph_lut_ to get " << 2*6*6*6*3*64 << " values, "
95  << "got " << cppf_ph_lut_.size() << " values.";
96  }
97 
98  if (cppf_th_lut_.size() != 2*6*6*6*3) { // [endcap_2][rpc_sector_6][rpc_station_ring_6][rpc_subsector_6][rpc_roll_3]
99  throw cms::Exception("SectorProcessorLUT")
100  << "Expected cppf_th_lut_ to get " << 2*6*6*6*3 << " values, "
101  << "got " << cppf_th_lut_.size() << " values.";
102  }
103 
104  // clct pattern convertion array from CMSSW
105  //{0.0, 0.0, -0.60, 0.60, -0.64, 0.64, -0.23, 0.23, -0.21, 0.21, 0.0}
106  // 0 0 -5 +5 -5 +5 -2 +2 -2 +2 0
107  ph_patt_corr_ = {
108  0, 0, 5, 5, 5, 5, 2, 2, 2, 2, 0
109  };
110  if (ph_patt_corr_.size() != 11) {
111  throw cms::Exception("SectorProcessorLUT")
112  << "Expected ph_patt_corr_ to get " << 11 << " values, "
113  << "got " << ph_patt_corr_.size() << " values.";
114  }
115 
117  0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0
118  };
119  if (ph_patt_corr_sign_.size() != 11) {
120  throw cms::Exception("SectorProcessorLUT")
121  << "Expected ph_patt_corr_sign_ to get " << 11 << " values, "
122  << "got " << ph_patt_corr_sign_.size() << " values.";
123  }
124 
125  ph_zone_offset_ = {
126  39,57,76,39,58,76,41,60,79,
127  95,114,132,95,114,133,98,116,135,
128  38,76,113,39,58,76,95,114,132,
129  38,76,113,39,58,76,95,114,132,
130  38,76,113,38,57,76,95,113,132,
131  21,21,23,1,21,1,21,1,20
132  };
133  if (ph_zone_offset_.size() != 6*9) {
134  throw cms::Exception("SectorProcessorLUT")
135  << "Expected ph_zone_offset_ to get " << 6*9 << " values, "
136  << "got " << ph_zone_offset_.size() << " values.";
137  }
138 
139  // start phi of each chamber in reduced precision, for zone hits,
140  // with negative offset to allow for possible chamber movement
141  ph_init_hard_ = {
142  39, 57, 76, 39, 58, 76, 41, 60, 79, 39, 57, 76, 21, 21, 23, 21,
143  95, 114, 132, 95, 114, 133, 98, 116, 135, 95, 114, 132, 0, 0, 0, 0,
144  38, 76, 113, 39, 58, 76, 95, 114, 132, 1, 21, 0, 0, 0, 0, 0,
145  38, 76, 113, 39, 58, 76, 95, 114, 132, 1, 21, 0, 0, 0, 0, 0,
146  38, 76, 113, 38, 57, 76, 95, 113, 132, 1, 20, 0, 0, 0, 0, 0
147  };
148  if (ph_init_hard_.size() != 5*16) {
149  throw cms::Exception("SectorProcessorLUT")
150  << "Expected ph_init_hard_ to get " << 5*16 << " values, "
151  << "got " << ph_init_hard_.size() << " values.";
152  }
153 
154  version_ = pc_lut_version;
155  return;
156 }
157 
158 uint32_t SectorProcessorLUT::get_ph_init(int fw_endcap, int fw_sector, int pc_lut_id) const {
159  size_t index = (fw_endcap * 6 + fw_sector) * 61 + pc_lut_id;
160  return ph_init_neighbor_.at(index);
161 }
162 
163 uint32_t SectorProcessorLUT::get_ph_disp(int fw_endcap, int fw_sector, int pc_lut_id) const {
164  size_t index = (fw_endcap * 6 + fw_sector) * 61 + pc_lut_id;
165  return ph_disp_neighbor_.at(index);
166 }
167 
168 uint32_t SectorProcessorLUT::get_th_init(int fw_endcap, int fw_sector, int pc_lut_id) const {
169  size_t index = (fw_endcap * 6 + fw_sector) * 61 + pc_lut_id;
170  return th_init_neighbor_.at(index);
171 }
172 
173 uint32_t SectorProcessorLUT::get_th_disp(int fw_endcap, int fw_sector, int pc_lut_id) const {
174  size_t index = (fw_endcap * 6 + fw_sector) * 61 + pc_lut_id;
175  return th_disp_neighbor_.at(index);
176 }
177 
178 uint32_t SectorProcessorLUT::get_th_lut(int fw_endcap, int fw_sector, int pc_lut_id, int pc_wire_id) const {
179  int pc_lut_id2 = pc_lut_id;
180 
181  // Make ME1/1a the same as ME1/1b
182  if ((9 <= pc_lut_id2 && pc_lut_id2 < 12) || (25 <= pc_lut_id2 && pc_lut_id2 < 28))
183  pc_lut_id2 -= 9;
184  // Make ME1/1a neighbor the same as ME1/1b
185  if (pc_lut_id2 == 15)
186  pc_lut_id2 -= 3;
187 
188  size_t index = ((fw_endcap * 6 + fw_sector) * 61 + pc_lut_id2) * 128 + pc_wire_id;
189  return th_lut_neighbor_.at(index);
190 }
191 
192 uint32_t SectorProcessorLUT::get_th_corr_lut(int fw_endcap, int fw_sector, int pc_lut_id, int pc_wire_strip_id) const {
193  int pc_lut_id2 = pc_lut_id;
194 
195  // Make ME1/1a the same as ME1/1b
196  if ((9 <= pc_lut_id2 && pc_lut_id2 < 12) || (25 <= pc_lut_id2 && pc_lut_id2 < 28))
197  pc_lut_id2 -= 9;
198  // Make ME1/1a neighbor the same as ME1/1b
199  if (pc_lut_id2 == 15)
200  pc_lut_id2 -= 3;
201 
202  if (pc_lut_id2 <= 3) {
203  pc_lut_id2 -= 0;
204  } else if (pc_lut_id2 == 12) {
205  pc_lut_id2 -= 9;
206  } else if (16 <= pc_lut_id2 && pc_lut_id2 < 19) {
207  pc_lut_id2 -= 12;
208  } else {
209  throw cms::Exception("SectorProcessorLUT")
210  << "get_th_corr_lut(): out of range pc_lut_id: " << pc_lut_id;
211  }
212 
213  size_t index = ((fw_endcap * 6 + fw_sector) * 7 + pc_lut_id2) * 128 + pc_wire_strip_id;
214  return th_corr_lut_neighbor_.at(index);
215 }
216 
218  return ph_patt_corr_.at(pattern);
219 }
220 
222  return ph_patt_corr_sign_.at(pattern);
223 }
224 
225 uint32_t SectorProcessorLUT::get_ph_zone_offset(int pc_station, int pc_chamber) const {
226  size_t index = pc_station * 9 + pc_chamber;
227  return ph_zone_offset_.at(index);
228 }
229 
230 uint32_t SectorProcessorLUT::get_ph_init_hard(int fw_station, int fw_cscid) const {
231  size_t index = fw_station * 16 + fw_cscid;
232  return ph_init_hard_.at(index);
233 }
234 
235 uint32_t SectorProcessorLUT::get_cppf_lut_id(int rpc_region, int rpc_sector, int rpc_station, int rpc_ring, int rpc_subsector, int rpc_roll) const {
236  uint32_t iendcap = (rpc_region == -1) ? 1 : 0;
237  uint32_t isector = (rpc_sector - 1);
238  uint32_t istationring = (rpc_station >= 3) ? ((rpc_station - 3) * 2 + (rpc_ring - 2) + 2) : (rpc_station - 1);
239  uint32_t isubsector = (rpc_subsector - 1);
240  uint32_t iroll = (rpc_roll - 1);
241  return ((((iendcap * 6 + isector) * 6 + istationring) * 6 + isubsector) * 3 + iroll);
242 }
243 
244 uint32_t SectorProcessorLUT::get_cppf_ph_lut(int rpc_region, int rpc_sector, int rpc_station, int rpc_ring, int rpc_subsector, int rpc_roll, int halfstrip, bool is_neighbor) const {
245  size_t th_index = get_cppf_lut_id(rpc_region, rpc_sector, rpc_station, rpc_ring, rpc_subsector, rpc_roll);
246  size_t ph_index = (th_index * 64) + (halfstrip - 1);
247  uint32_t ph = cppf_ph_lut_.at(ph_index);
248  if (!is_neighbor && rpc_subsector == 2)
249  ph += 900;
250  return ph;
251 }
252 
253 uint32_t SectorProcessorLUT::get_cppf_th_lut(int rpc_region, int rpc_sector, int rpc_station, int rpc_ring, int rpc_subsector, int rpc_roll) const {
254  size_t th_index = get_cppf_lut_id(rpc_region, rpc_sector, rpc_station, rpc_ring, rpc_subsector, rpc_roll);
255  uint32_t th = cppf_th_lut_.at(th_index);
256  return th;
257 }
258 
259 void SectorProcessorLUT::read_file(const std::string& filename, std::vector<uint32_t>& vec) {
260  vec.clear();
261 
262  std::ifstream infile;
263  infile.open(edm::FileInPath(filename).fullPath().c_str());
264 
265  int buf;
266  while (infile >> buf) {
267  buf = (buf == -999) ? 0 : buf;
268  vec.push_back(buf);
269  }
270  infile.close();
271 }
272 
273 void SectorProcessorLUT::read_cppf_file(const std::string& filename, std::vector<uint32_t>& vec1, std::vector<uint32_t>& vec2, bool local) {
274  auto get_rpc_region = [](uint32_t id) { return (static_cast<int>((id >> 0) & 0X3) + (-1)); };
275  auto get_rpc_sector = [](uint32_t id) { return (static_cast<int>((id >> 7) & 0XF) + (1)); };
276  auto get_rpc_ring = [](uint32_t id) { return (static_cast<int>((id >> 2) & 0X7) + (1)); };
277  auto get_rpc_station = [](uint32_t id) { return (static_cast<int>((id >> 5) & 0X3) + (1)); };
278  auto get_rpc_subsector = [](uint32_t id) { return (static_cast<int>((id >> 12) & 0X7) + (1)); };
279  auto get_rpc_roll = [](uint32_t id) { return (static_cast<int>((id >> 15) & 0X7) + (0)); };
280 
281  std::vector<std::string> cppf_filenames = {
282  "angleScale_RPC_CPPFp1.txt",
283  "angleScale_RPC_CPPFp2.txt",
284  "angleScale_RPC_CPPFp3.txt",
285  "angleScale_RPC_CPPFp4.txt",
286  "angleScale_RPC_CPPFn1.txt",
287  "angleScale_RPC_CPPFn2.txt",
288  "angleScale_RPC_CPPFn3.txt",
289  "angleScale_RPC_CPPFn4.txt",
290  };
291 
292 
293  vec1.clear();
294  vec2.clear();
295  vec1.resize(2*6*6*6*3*64, 0);
296  vec2.resize(2*6*6*6*3, 0);
297 
298  for (size_t i = 0; i < cppf_filenames.size(); ++i) {
299  std::ifstream infile;
300  infile.open(edm::FileInPath(filename + cppf_filenames.at(i)).fullPath().c_str());
301 
302  // std::cout << "\n\nOpening CPPF LUT file " << cppf_filenames.at(i) << std::endl;
303 
304  int buf1, buf2, buf3, buf4, buf5, buf6;
305  // Special variables for transforming centrally-provided CPPF LUTs
306  int buf1_prev = 0, buf2_prev = 0, halfstrip_prev = 0; // Values from previous line in file
307  int line_num = 0; // Line number in file
308  int count_dir = -1; // Direction of half-strip counting: +1 is up, -1 is down
309  int dStrip = 0; // Offset for half-strip from full strip
310  while ((infile >> buf1) && (infile >> buf2) && (infile >> buf3) && (infile >> buf4) && (infile >> buf5) && (infile >> buf6)) {
311 
312  if ((line_num % 192) == 191) line_num += 1; // Gap in central files vs. Jia Fu's files
313  line_num += 1;
314  // On roughly every-other line, files in L1Trigger/L1TMuon/data/cppf have 0 in the first three columns
315  // Skips a "0 0 0" line once every 192 lines
316  if ((line_num % 2) == 1) {
317  buf1_prev = buf1;
318  buf2_prev = buf2;
319  }
320 
321  if (local && (buf1 == 0 || buf2 == 0)) {
322  throw cms::Exception("SectorProcessorLUT") << "Expected non-0 values, got buf1 = " << buf1 << ", buf2 = " << buf2;
323  }
324  if (!local && (buf1_prev == 0 || buf2_prev == 0)) {
325  throw cms::Exception("SectorProcessorLUT") << "Expected non-0 values, got buf1_prev = " << buf1_prev << ", buf2_prev = " << buf2_prev;
326  }
327 
328  uint32_t id = (local ? buf1 : buf1_prev);
329  int32_t rpc_region = get_rpc_region(id);
330  int32_t rpc_sector = get_rpc_sector(id);
331  int32_t rpc_station = get_rpc_station(id);
332  int32_t rpc_ring = get_rpc_ring(id);
333  int32_t rpc_subsector = get_rpc_subsector(id);
334  int32_t rpc_roll = get_rpc_roll(id);
335 
336  // Offset into halfstrips from centrally-provided LUTs
337  if ( buf2_prev*2 > halfstrip_prev + 8 ||
338  buf2_prev*2 < halfstrip_prev - 8 ) { // Starting a new series of strips
339  if (buf2_prev == 1) count_dir = +1; // Starting from a low number, counting up
340  else count_dir = -1; // Starting from a high number, counting down
341  }
342  if (count_dir == -1) dStrip = (buf2_prev*2 == halfstrip_prev ? 1 : 0);
343  if (count_dir == +1) dStrip = (buf2_prev*2 == halfstrip_prev + 2 ? 1 : 0);
344  if (buf2_prev*2 < halfstrip_prev - 8 && buf2_prev == 1) dStrip = 1;
345 
346  //uint32_t strip = buf2;
347  uint32_t halfstrip = (local ? buf2 : buf2_prev*2 - dStrip); // I modified the local text files to use 'halfstrip' instead of 'strip' in column 2
348  halfstrip_prev = halfstrip;
349 
350  uint32_t ph = buf5;
351  uint32_t th = buf6;
352 
353  size_t th_index = get_cppf_lut_id(rpc_region, rpc_sector, rpc_station, rpc_ring, rpc_subsector, rpc_roll);
354  size_t ph_index = (th_index * 64) + (halfstrip - 1);
355 
356  // std::cout << id << " " << rpc_region << " " << rpc_sector << " " << rpc_station << " " << rpc_ring << " "
357  // << rpc_subsector << " " << rpc_roll << " " << halfstrip << " " << th_index << " " << ph_index << std::endl;
358 
359  vec1.at(ph_index) = ph;
360  if (halfstrip == 1)
361  vec2.at(th_index) = th;
362 
363  // Fill gap in centrally-provided LUTs once every 192 lines
364  if (!local && (line_num % 192) == 191)
365  vec1.at(ph_index+1) = ph;
366 
367  } // End while ((infile >> buf1) && ... && (infile >> buf6))
368  infile.close();
369  } // End loop over CPPF LUT files
370 }
void read(int pc_lut_version)
std::vector< uint32_t > ph_zone_offset_
std::vector< uint32_t > cppf_ph_lut_
std::vector< uint32_t > th_corr_lut_neighbor_
uint32_t get_ph_patt_corr_sign(int pattern) const
std::vector< uint32_t > cppf_th_lut_
std::vector< uint32_t > th_disp_neighbor_
uint32_t get_th_init(int fw_endcap, int fw_sector, int pc_lut_id) const
std::vector< uint32_t > ph_patt_corr_
std::vector< double > vec1
Definition: HCALResponse.h:15
uint32_t get_cppf_th_lut(int rpc_region, int rpc_sector, int rpc_station, int rpc_ring, int rpc_subsector, int rpc_roll) const
std::vector< uint32_t > ph_init_hard_
uint32_t get_th_disp(int fw_endcap, int fw_sector, int pc_lut_id) const
uint32_t get_ph_disp(int fw_endcap, int fw_sector, int pc_lut_id) const
std::vector< uint32_t > ph_patt_corr_sign_
void read_cppf_file(const std::string &filename, std::vector< uint32_t > &vec1, std::vector< uint32_t > &vec2, bool local)
std::vector< uint32_t > th_init_neighbor_
uint32_t get_ph_zone_offset(int pc_station, int pc_chamber) const
std::vector< uint32_t > ph_disp_neighbor_
uint32_t get_cppf_lut_id(int rpc_region, int rpc_sector, int rpc_station, int rpc_ring, int rpc_subsector, int rpc_roll) const
uint32_t get_ph_patt_corr(int pattern) const
uint32_t get_th_lut(int fw_endcap, int fw_sector, int pc_lut_id, int pc_wire_id) const
std::vector< uint32_t > ph_init_neighbor_
uint32_t get_ph_init_hard(int fw_station, int fw_cscid) const
void read_file(const std::string &filename, std::vector< uint32_t > &vec)
std::vector< vec1 > vec2
Definition: HCALResponse.h:16
uint32_t get_ph_init(int fw_endcap, int fw_sector, int pc_lut_id) const
uint32_t get_th_corr_lut(int fw_endcap, int fw_sector, int pc_lut_id, int pc_wire_strip_id) const
uint32_t get_cppf_ph_lut(int rpc_region, int rpc_sector, int rpc_station, int rpc_ring, int rpc_subsector, int rpc_roll, int halfstrip, bool is_neighbor) const
std::vector< uint32_t > th_lut_neighbor_