CMS 3D CMS Logo

GEMClusterProcessor.cc
Go to the documentation of this file.
3 
4 #include <algorithm>
5 #include <iostream>
6 
8  : region_(region), station_(station), chamber_(chamber) {
9  isEven_ = chamber_ % 2 == 0;
10 
11  if (station_ == 1) {
12  const edm::ParameterSet copad(conf.getParameter<edm::ParameterSet>("copadParamGE11"));
13  maxDeltaPad_ = copad.getParameter<unsigned int>("maxDeltaPad");
14  maxDeltaRoll_ = copad.getParameter<unsigned int>("maxDeltaRoll");
15  maxDeltaBX_ = copad.getParameter<unsigned int>("maxDeltaBX");
16 
17  padToHsME1aFiles_ = conf.getParameter<std::vector<std::string>>("padToHsME1aFiles");
18  padToHsME1bFiles_ = conf.getParameter<std::vector<std::string>>("padToHsME1bFiles");
19 
20  padToEsME1aFiles_ = conf.getParameter<std::vector<std::string>>("padToEsME1aFiles");
21  padToEsME1bFiles_ = conf.getParameter<std::vector<std::string>>("padToEsME1bFiles");
22 
23  rollToMaxWgME11Files_ = conf.getParameter<std::vector<std::string>>("rollToMaxWgME11Files");
24  rollToMinWgME11Files_ = conf.getParameter<std::vector<std::string>>("rollToMinWgME11Files");
25 
26  GEMCSCLUT_pad_hs_ME1a_even_ = std::make_unique<CSCLUTReader>(padToHsME1aFiles_[0]);
27  GEMCSCLUT_pad_hs_ME1a_odd_ = std::make_unique<CSCLUTReader>(padToHsME1aFiles_[1]);
28  GEMCSCLUT_pad_hs_ME1b_even_ = std::make_unique<CSCLUTReader>(padToHsME1bFiles_[0]);
29  GEMCSCLUT_pad_hs_ME1b_odd_ = std::make_unique<CSCLUTReader>(padToHsME1bFiles_[1]);
30 
31  GEMCSCLUT_pad_es_ME1a_even_ = std::make_unique<CSCLUTReader>(padToEsME1aFiles_[0]);
32  GEMCSCLUT_pad_es_ME1a_odd_ = std::make_unique<CSCLUTReader>(padToEsME1aFiles_[1]);
33  GEMCSCLUT_pad_es_ME1b_even_ = std::make_unique<CSCLUTReader>(padToEsME1bFiles_[0]);
34  GEMCSCLUT_pad_es_ME1b_odd_ = std::make_unique<CSCLUTReader>(padToEsME1bFiles_[1]);
35 
36  GEMCSCLUT_roll_l1_min_wg_ME11_even_ = std::make_unique<CSCLUTReader>(rollToMinWgME11Files_[0]);
37  GEMCSCLUT_roll_l1_min_wg_ME11_odd_ = std::make_unique<CSCLUTReader>(rollToMinWgME11Files_[1]);
38  GEMCSCLUT_roll_l2_min_wg_ME11_even_ = std::make_unique<CSCLUTReader>(rollToMinWgME11Files_[2]);
39  GEMCSCLUT_roll_l2_min_wg_ME11_odd_ = std::make_unique<CSCLUTReader>(rollToMinWgME11Files_[3]);
40 
41  GEMCSCLUT_roll_l1_max_wg_ME11_even_ = std::make_unique<CSCLUTReader>(rollToMaxWgME11Files_[0]);
42  GEMCSCLUT_roll_l1_max_wg_ME11_odd_ = std::make_unique<CSCLUTReader>(rollToMaxWgME11Files_[1]);
43  GEMCSCLUT_roll_l2_max_wg_ME11_even_ = std::make_unique<CSCLUTReader>(rollToMaxWgME11Files_[2]);
44  GEMCSCLUT_roll_l2_max_wg_ME11_odd_ = std::make_unique<CSCLUTReader>(rollToMaxWgME11Files_[3]);
45  }
46 
47  if (station_ == 2) {
48  // by default set to true
50 
51  const edm::ParameterSet copad(conf.getParameter<edm::ParameterSet>("copadParamGE21"));
52  maxDeltaPad_ = copad.getParameter<unsigned int>("maxDeltaPad");
53  maxDeltaRoll_ = copad.getParameter<unsigned int>("maxDeltaRoll");
54  maxDeltaBX_ = copad.getParameter<unsigned int>("maxDeltaBX");
55 
56  padToHsME21Files_ = conf.getParameter<std::vector<std::string>>("padToHsME21Files");
57  padToEsME21Files_ = conf.getParameter<std::vector<std::string>>("padToEsME21Files");
58 
59  rollToMaxWgME21Files_ = conf.getParameter<std::vector<std::string>>("rollToMaxWgME21Files");
60  rollToMinWgME21Files_ = conf.getParameter<std::vector<std::string>>("rollToMinWgME21Files");
61 
62  GEMCSCLUT_pad_hs_ME21_even_ = std::make_unique<CSCLUTReader>(padToHsME21Files_[0]);
63  GEMCSCLUT_pad_hs_ME21_odd_ = std::make_unique<CSCLUTReader>(padToHsME21Files_[1]);
64  GEMCSCLUT_pad_es_ME21_even_ = std::make_unique<CSCLUTReader>(padToEsME21Files_[0]);
65  GEMCSCLUT_pad_es_ME21_odd_ = std::make_unique<CSCLUTReader>(padToEsME21Files_[1]);
66 
67  GEMCSCLUT_roll_l1_min_wg_ME21_even_ = std::make_unique<CSCLUTReader>(rollToMinWgME21Files_[0]);
68  GEMCSCLUT_roll_l1_min_wg_ME21_odd_ = std::make_unique<CSCLUTReader>(rollToMinWgME21Files_[1]);
69  GEMCSCLUT_roll_l2_min_wg_ME21_even_ = std::make_unique<CSCLUTReader>(rollToMinWgME21Files_[2]);
70  GEMCSCLUT_roll_l2_min_wg_ME21_odd_ = std::make_unique<CSCLUTReader>(rollToMinWgME21Files_[3]);
71 
72  GEMCSCLUT_roll_l1_max_wg_ME21_even_ = std::make_unique<CSCLUTReader>(rollToMaxWgME21Files_[0]);
73  GEMCSCLUT_roll_l1_max_wg_ME21_odd_ = std::make_unique<CSCLUTReader>(rollToMaxWgME21Files_[1]);
74  GEMCSCLUT_roll_l2_max_wg_ME21_even_ = std::make_unique<CSCLUTReader>(rollToMaxWgME21Files_[2]);
75  GEMCSCLUT_roll_l2_max_wg_ME21_odd_ = std::make_unique<CSCLUTReader>(rollToMaxWgME21Files_[3]);
76  }
77 }
78 
80 
82  // Step 1: clear the GEMInternalCluster vector
83  clear();
84 
85  // Step 2: put coincidence clusters in GEMInternalCluster vector
86  addCoincidenceClusters(in_clusters);
87 
88  // Step 3: put single clusters in GEMInternalCluster vector who are not part of any coincidence cluster
89  addSingleClusters(in_clusters);
90 
91  // Step 4: translate the cluster central pad numbers into 1/8-strip number for matching with CSC trigger primitives
93 }
94 
95 std::vector<GEMInternalCluster> GEMClusterProcessor::getClusters(int bx) const {
96  std::vector<GEMInternalCluster> output;
97 
98  for (const auto& cl : clusters_) {
99  // valid single clusters with the right BX
100  if (cl.bx() == bx and cl.isValid()) {
101  output.push_back(cl);
102  }
103  }
104 
105  return output;
106 }
107 
108 std::vector<GEMInternalCluster> GEMClusterProcessor::getClusters(int bx, int deltaBX) const {
109  std::vector<GEMInternalCluster> output;
110 
111  for (const auto& cl : clusters_) {
112  // valid single clusters with the right BX
113  if (std::abs(cl.bx() - bx) <= deltaBX and cl.isValid()) {
114  output.push_back(cl);
115  }
116  }
117 
118  return output;
119 }
120 
121 std::vector<GEMInternalCluster> GEMClusterProcessor::getCoincidenceClusters(int bx) const {
122  std::vector<GEMInternalCluster> output;
123 
124  for (const auto& cl : clusters_) {
125  // valid coincidences with the right BX
126  if (cl.bx() == bx and cl.isCoincidence()) {
127  output.push_back(cl);
128  }
129  }
130 
131  return output;
132 }
133 
135  // Build coincidences
136  for (auto det_range = in_clusters->begin(); det_range != in_clusters->end(); ++det_range) {
137  const GEMDetId& id = (*det_range).first;
138 
139  // coincidence pads are not built for ME0
140  if (id.isME0())
141  continue;
142 
143  // same chamber (no restriction on the roll number)
144  if (id.region() != region_ or id.station() != station_ or id.chamber() != chamber_)
145  continue;
146 
147  // all coincidences detIDs will have layer=1
148  if (id.layer() != 1)
149  continue;
150 
151  // find all corresponding ids with layer 2 and same roll that differs at most maxDeltaRoll_
152  for (unsigned int roll = id.roll() - maxDeltaRoll_; roll <= id.roll() + maxDeltaRoll_; ++roll) {
153  GEMDetId co_id(id.region(), id.ring(), id.station(), 2, id.chamber(), roll);
154 
155  auto co_clusters_range = in_clusters->get(co_id);
156 
157  // empty range = no possible coincidence pads
158  if (co_clusters_range.first == co_clusters_range.second)
159  continue;
160 
161  // now let's correlate the pads in two layers of this partition
162  const auto& pads_range = (*det_range).second;
163  for (auto p = pads_range.first; p != pads_range.second; ++p) {
164  // ignore 8-partition GE2/1 pads
165  if (id.isGE21() and p->nPartitions() == GEMPadDigiCluster::GE21) {
167  continue;
168  }
169 
170  // only consider valid pads
171  if (!p->isValid())
172  continue;
173 
174  for (auto co_p = co_clusters_range.first; co_p != co_clusters_range.second; ++co_p) {
175  // only consider valid clusters
176  if (!co_p->isValid())
177  continue;
178 
179  // check the match in BX
180  if ((unsigned)std::abs(p->bx() - co_p->bx()) > maxDeltaBX_)
181  continue;
182 
183  // get the corrected minimum and maximum of cluster 1
184  int cl1_min = p->pads().front() - maxDeltaPad_;
185  int cl1_max = p->pads().back() + maxDeltaPad_;
186 
187  // get the minimum and maximum of cluster 2
188  int cl2_min = co_p->pads().front();
189  int cl2_max = co_p->pads().back();
190 
191  // match condition
192  const bool condition1(cl1_min <= cl2_min and cl1_max >= cl2_min);
193  const bool condition2(cl1_min <= cl2_max and cl1_max >= cl2_max);
194  const bool match(condition1 or condition2);
195 
196  if (!match)
197  continue;
198 
199  // make a new coincidence
200  clusters_.emplace_back(id, *p, *co_p);
201  }
202  }
203  }
204  }
205 }
206 
208  // first get the coincidences
209  const std::vector<GEMInternalCluster>& coincidences = clusters_;
210 
211  // now start add single clusters
212  for (auto det_range = in_clusters->begin(); det_range != in_clusters->end(); ++det_range) {
213  const GEMDetId& id = (*det_range).first;
214 
215  // ignore ME0
216  if (id.isME0())
217  continue;
218 
219  // same chamber (no restriction on the roll number)
220  if (id.region() != region_ or id.station() != station_ or id.chamber() != chamber_)
221  continue;
222 
223  const auto& clusters_range = (*det_range).second;
224  for (auto p = clusters_range.first; p != clusters_range.second; ++p) {
225  // only consider valid clusters
226  if (!p->isValid())
227  continue;
228 
229  // ignore 8-partition GE2/1 pads
230  if (id.isGE21() and p->nPartitions() == GEMPadDigiCluster::GE21) {
232  continue;
233  }
234 
235  // ignore clusters already contained in a coincidence cluster
236  if (std::find_if(std::begin(coincidences), std::end(coincidences), [p](const GEMInternalCluster& q) {
237  return q.has_cluster(*p);
238  }) != std::end(coincidences))
239  continue;
240 
241  // put the single clusters into the collection
242  if (id.layer() == 1)
243  clusters_.emplace_back(id, *p, GEMPadDigiCluster());
244  else
245  clusters_.emplace_back(id, GEMPadDigiCluster(), *p);
246  }
247  }
248 }
249 
251  // loop on clusters
252  for (auto& cluster : clusters_) {
253  if (cluster.cl1().isValid()) {
254  // starting coordinates
255  const int layer1_first_pad = cluster.layer1_pad();
256  const int layer1_last_pad = layer1_first_pad + cluster.layer1_size() - 1;
257 
258  // calculate the 1/2-strip
259  int layer1_pad_to_first_hs = -1;
260  int layer1_pad_to_last_hs = -1;
261  int layer1_pad_to_first_hs_me1a = -1;
262  int layer1_pad_to_last_hs_me1a = -1;
263 
264  // ME1/1
265  if (station_ == 1) {
266  if (isEven_) {
267  // ME1/b
268  layer1_pad_to_first_hs = GEMCSCLUT_pad_hs_ME1b_even_->lookup(layer1_first_pad);
269  layer1_pad_to_last_hs = GEMCSCLUT_pad_hs_ME1b_even_->lookup(layer1_last_pad);
270  // ME1/a
271  layer1_pad_to_first_hs_me1a = GEMCSCLUT_pad_hs_ME1a_even_->lookup(layer1_first_pad);
272  layer1_pad_to_last_hs_me1a = GEMCSCLUT_pad_hs_ME1a_even_->lookup(layer1_last_pad);
273  } else {
274  // ME1/b
275  layer1_pad_to_first_hs = GEMCSCLUT_pad_hs_ME1b_odd_->lookup(layer1_first_pad);
276  layer1_pad_to_last_hs = GEMCSCLUT_pad_hs_ME1b_odd_->lookup(layer1_last_pad);
277  // ME1/a
278  layer1_pad_to_first_hs_me1a = GEMCSCLUT_pad_hs_ME1a_odd_->lookup(layer1_first_pad);
279  layer1_pad_to_last_hs_me1a = GEMCSCLUT_pad_hs_ME1a_odd_->lookup(layer1_last_pad);
280  }
281  }
282  // ME2/1
283  if (station_ == 2) {
284  if (isEven_) {
285  layer1_pad_to_first_hs = GEMCSCLUT_pad_hs_ME21_even_->lookup(layer1_first_pad);
286  layer1_pad_to_last_hs = GEMCSCLUT_pad_hs_ME21_even_->lookup(layer1_last_pad);
287  } else {
288  layer1_pad_to_first_hs = GEMCSCLUT_pad_hs_ME21_odd_->lookup(layer1_first_pad);
289  layer1_pad_to_last_hs = GEMCSCLUT_pad_hs_ME21_odd_->lookup(layer1_last_pad);
290  }
291  }
292  // middle 1/2-strip
293  int layer1_middle_hs = 0.5 * (layer1_pad_to_first_hs + layer1_pad_to_last_hs);
294  int layer1_middle_hs_me1a = 0.5 * (layer1_pad_to_first_hs_me1a + layer1_pad_to_last_hs_me1a);
295 
296  // set the values
297  cluster.set_layer1_first_hs(layer1_pad_to_first_hs);
298  cluster.set_layer1_last_hs(layer1_pad_to_last_hs);
299  cluster.set_layer1_middle_hs(layer1_middle_hs);
300 
301  if (station_ == 1) {
302  cluster.set_layer1_first_hs_me1a(layer1_pad_to_first_hs_me1a);
303  cluster.set_layer1_last_hs_me1a(layer1_pad_to_last_hs_me1a);
304  cluster.set_layer1_middle_hs_me1a(layer1_middle_hs_me1a);
305  }
306  // calculate the 1/8-strips
307  int layer1_pad_to_first_es = -1;
308  int layer1_pad_to_last_es = -1;
309 
310  int layer1_pad_to_first_es_me1a = -1;
311  int layer1_pad_to_last_es_me1a = -1;
312 
313  // ME1/1
314  if (station_ == 1) {
315  if (isEven_) {
316  // ME1/b
317  layer1_pad_to_first_es = GEMCSCLUT_pad_es_ME1b_even_->lookup(layer1_first_pad);
318  layer1_pad_to_last_es = GEMCSCLUT_pad_es_ME1b_even_->lookup(layer1_last_pad);
319  // ME1/a
320  layer1_pad_to_first_es_me1a = GEMCSCLUT_pad_es_ME1a_even_->lookup(layer1_first_pad);
321  layer1_pad_to_last_es_me1a = GEMCSCLUT_pad_es_ME1a_even_->lookup(layer1_last_pad);
322  } else {
323  // ME1/b
324  layer1_pad_to_first_es = GEMCSCLUT_pad_es_ME1b_odd_->lookup(layer1_first_pad);
325  layer1_pad_to_last_es = GEMCSCLUT_pad_es_ME1b_odd_->lookup(layer1_last_pad);
326  // ME1/a
327  layer1_pad_to_first_es_me1a = GEMCSCLUT_pad_es_ME1a_odd_->lookup(layer1_first_pad);
328  layer1_pad_to_last_es_me1a = GEMCSCLUT_pad_es_ME1a_odd_->lookup(layer1_last_pad);
329  }
330  }
331  // ME2/1
332  if (station_ == 2) {
333  if (isEven_) {
334  layer1_pad_to_first_es = GEMCSCLUT_pad_es_ME21_even_->lookup(layer1_first_pad);
335  layer1_pad_to_last_es = GEMCSCLUT_pad_es_ME21_even_->lookup(layer1_last_pad);
336  } else {
337  layer1_pad_to_first_es = GEMCSCLUT_pad_es_ME21_odd_->lookup(layer1_first_pad);
338  layer1_pad_to_last_es = GEMCSCLUT_pad_es_ME21_odd_->lookup(layer1_last_pad);
339  }
340  }
341  // middle 1/8-strip
342  int layer1_middle_es = 0.5 * (layer1_pad_to_first_es + layer1_pad_to_last_es);
343  int layer1_middle_es_me1a = 0.5 * (layer1_pad_to_first_es_me1a + layer1_pad_to_last_es_me1a);
344 
345  cluster.set_layer1_first_es(layer1_pad_to_first_es);
346  cluster.set_layer1_last_es(layer1_pad_to_last_es);
347  cluster.set_layer1_middle_es(layer1_middle_es);
348 
349  if (station_ == 1) {
350  cluster.set_layer1_first_es_me1a(layer1_pad_to_first_es_me1a);
351  cluster.set_layer1_last_es_me1a(layer1_pad_to_last_es_me1a);
352  cluster.set_layer1_middle_es_me1a(layer1_middle_es_me1a);
353  }
354 
355  // calculate the wiregroups
356  // need to subtract 1 to use the LUTs
357  const int roll = cluster.roll() - 1;
358 
359  int roll_l1_to_min_wg = -1;
360  int roll_l1_to_max_wg = -1;
361 
362  // ME1/1
363  if (station_ == 1) {
364  if (isEven_) {
365  roll_l1_to_min_wg = GEMCSCLUT_roll_l1_min_wg_ME11_even_->lookup(roll);
366  roll_l1_to_max_wg = GEMCSCLUT_roll_l1_max_wg_ME11_even_->lookup(roll);
367  } else {
368  roll_l1_to_min_wg = GEMCSCLUT_roll_l1_min_wg_ME11_odd_->lookup(roll);
369  roll_l1_to_max_wg = GEMCSCLUT_roll_l1_max_wg_ME11_odd_->lookup(roll);
370  }
371  }
372 
373  // ME2/1
374  if (station_ == 2) {
375  if (isEven_) {
376  roll_l1_to_min_wg = GEMCSCLUT_roll_l1_min_wg_ME21_even_->lookup(roll);
377  roll_l1_to_max_wg = GEMCSCLUT_roll_l1_max_wg_ME21_even_->lookup(roll);
378  } else {
379  roll_l1_to_min_wg = GEMCSCLUT_roll_l1_min_wg_ME21_odd_->lookup(roll);
380  roll_l1_to_max_wg = GEMCSCLUT_roll_l1_max_wg_ME21_odd_->lookup(roll);
381  }
382  }
383 
384  // set the values
385  cluster.set_layer1_min_wg(roll_l1_to_min_wg);
386  cluster.set_layer1_max_wg(roll_l1_to_max_wg);
387  }
388 
389  if (cluster.cl2().isValid()) {
390  // starting coordinates
391  const int layer2_first_pad = cluster.layer2_pad();
392  const int layer2_last_pad = layer2_first_pad + cluster.layer2_size() - 1;
393 
394  // calculate the 1/2-strip
395  int layer2_pad_to_first_hs = -1;
396  int layer2_pad_to_last_hs = -1;
397  int layer2_pad_to_first_hs_me1a = -1;
398  int layer2_pad_to_last_hs_me1a = -1;
399 
400  if (station_ == 1) {
401  if (isEven_) {
402  // ME1/b
403  layer2_pad_to_first_hs = GEMCSCLUT_pad_hs_ME1b_even_->lookup(layer2_first_pad);
404  layer2_pad_to_last_hs = GEMCSCLUT_pad_hs_ME1b_even_->lookup(layer2_last_pad);
405  // ME1/a
406  layer2_pad_to_first_hs_me1a = GEMCSCLUT_pad_hs_ME1a_even_->lookup(layer2_first_pad);
407  layer2_pad_to_last_hs_me1a = GEMCSCLUT_pad_hs_ME1a_even_->lookup(layer2_last_pad);
408  } else {
409  // ME1/b
410  layer2_pad_to_first_hs = GEMCSCLUT_pad_hs_ME1b_odd_->lookup(layer2_first_pad);
411  layer2_pad_to_last_hs = GEMCSCLUT_pad_hs_ME1b_odd_->lookup(layer2_last_pad);
412  // ME1/a
413  layer2_pad_to_first_hs_me1a = GEMCSCLUT_pad_hs_ME1a_odd_->lookup(layer2_first_pad);
414  layer2_pad_to_last_hs_me1a = GEMCSCLUT_pad_hs_ME1a_odd_->lookup(layer2_last_pad);
415  }
416  }
417  // ME2/1
418  if (station_ == 2) {
419  if (isEven_) {
420  layer2_pad_to_first_hs = GEMCSCLUT_pad_hs_ME21_even_->lookup(layer2_first_pad);
421  layer2_pad_to_last_hs = GEMCSCLUT_pad_hs_ME21_even_->lookup(layer2_last_pad);
422  } else {
423  layer2_pad_to_first_hs = GEMCSCLUT_pad_hs_ME21_odd_->lookup(layer2_first_pad);
424  layer2_pad_to_last_hs = GEMCSCLUT_pad_hs_ME21_odd_->lookup(layer2_last_pad);
425  }
426  }
427  // middle 1/2-strip
428  int layer2_middle_hs = 0.5 * (layer2_pad_to_first_hs + layer2_pad_to_last_hs);
429  int layer2_middle_hs_me1a = 0.5 * (layer2_pad_to_first_hs_me1a + layer2_pad_to_last_hs_me1a);
430 
431  // set the values
432  cluster.set_layer2_first_hs(layer2_pad_to_first_hs);
433  cluster.set_layer2_last_hs(layer2_pad_to_last_hs);
434  cluster.set_layer2_middle_hs(layer2_middle_hs);
435 
436  if (station_ == 1) {
437  cluster.set_layer2_first_hs_me1a(layer2_pad_to_first_hs_me1a);
438  cluster.set_layer2_last_hs_me1a(layer2_pad_to_last_hs_me1a);
439  cluster.set_layer2_middle_hs_me1a(layer2_middle_hs_me1a);
440  }
441  // calculate the 1/8-strips
442  int layer2_pad_to_first_es = -1;
443  int layer2_pad_to_last_es = -1;
444 
445  int layer2_pad_to_first_es_me1a = -1;
446  int layer2_pad_to_last_es_me1a = -1;
447 
448  if (station_ == 1) {
449  if (isEven_) {
450  // ME1/b
451  layer2_pad_to_first_es = GEMCSCLUT_pad_es_ME1b_even_->lookup(layer2_first_pad);
452  layer2_pad_to_last_es = GEMCSCLUT_pad_es_ME1b_even_->lookup(layer2_last_pad);
453  // ME1/a
454  layer2_pad_to_first_es_me1a = GEMCSCLUT_pad_es_ME1a_even_->lookup(layer2_first_pad);
455  layer2_pad_to_last_es_me1a = GEMCSCLUT_pad_es_ME1a_even_->lookup(layer2_last_pad);
456  } else {
457  // ME1/b
458  layer2_pad_to_first_es = GEMCSCLUT_pad_es_ME1b_odd_->lookup(layer2_first_pad);
459  layer2_pad_to_last_es = GEMCSCLUT_pad_es_ME1b_odd_->lookup(layer2_last_pad);
460  // ME1/a
461  layer2_pad_to_first_es_me1a = GEMCSCLUT_pad_es_ME1a_odd_->lookup(layer2_first_pad);
462  layer2_pad_to_last_es_me1a = GEMCSCLUT_pad_es_ME1a_odd_->lookup(layer2_last_pad);
463  }
464  }
465 
466  // ME2/1
467  if (station_ == 2) {
468  if (isEven_) {
469  layer2_pad_to_first_es = GEMCSCLUT_pad_es_ME21_even_->lookup(layer2_first_pad);
470  layer2_pad_to_last_es = GEMCSCLUT_pad_es_ME21_even_->lookup(layer2_last_pad);
471  } else {
472  layer2_pad_to_first_es = GEMCSCLUT_pad_es_ME21_odd_->lookup(layer2_first_pad);
473  layer2_pad_to_last_es = GEMCSCLUT_pad_es_ME21_odd_->lookup(layer2_last_pad);
474  }
475  }
476  // middle 1/8-strip
477  int layer2_middle_es = 0.5 * (layer2_pad_to_first_es + layer2_pad_to_last_es);
478  int layer2_middle_es_me1a = 0.5 * (layer2_pad_to_first_es_me1a + layer2_pad_to_last_es_me1a);
479 
480  cluster.set_layer2_first_es(layer2_pad_to_first_es);
481  cluster.set_layer2_last_es(layer2_pad_to_last_es);
482  cluster.set_layer2_middle_es(layer2_middle_es);
483 
484  if (station_ == 1) {
485  cluster.set_layer2_first_es_me1a(layer2_pad_to_first_es_me1a);
486  cluster.set_layer2_last_es_me1a(layer2_pad_to_last_es_me1a);
487  cluster.set_layer2_middle_es_me1a(layer2_middle_es_me1a);
488  }
489  }
490 
491  // calculate the wiregroups
492  // need to subtract 1 to use the LUTs
493  const int roll = cluster.roll() - 1;
494 
495  int roll_l2_to_min_wg = -1;
496  int roll_l2_to_max_wg = -1;
497 
498  // ME1/1
499  if (station_ == 1) {
500  if (isEven_) {
501  roll_l2_to_min_wg = GEMCSCLUT_roll_l2_min_wg_ME11_even_->lookup(roll);
502  roll_l2_to_max_wg = GEMCSCLUT_roll_l2_max_wg_ME11_even_->lookup(roll);
503  } else {
504  roll_l2_to_min_wg = GEMCSCLUT_roll_l2_min_wg_ME11_odd_->lookup(roll);
505  roll_l2_to_max_wg = GEMCSCLUT_roll_l2_max_wg_ME11_odd_->lookup(roll);
506  }
507  }
508 
509  // ME2/1
510  if (station_ == 2) {
511  if (isEven_) {
512  roll_l2_to_min_wg = GEMCSCLUT_roll_l2_min_wg_ME21_even_->lookup(roll);
513  roll_l2_to_max_wg = GEMCSCLUT_roll_l2_max_wg_ME21_even_->lookup(roll);
514  } else {
515  roll_l2_to_min_wg = GEMCSCLUT_roll_l2_min_wg_ME21_odd_->lookup(roll);
516  roll_l2_to_max_wg = GEMCSCLUT_roll_l2_max_wg_ME21_odd_->lookup(roll);
517  }
518  }
519 
520  // set the values
521  cluster.set_layer2_min_wg(roll_l2_to_min_wg);
522  cluster.set_layer2_max_wg(roll_l2_to_max_wg);
523  }
524 }
525 
526 std::vector<GEMCoPadDigi> GEMClusterProcessor::readoutCoPads() const {
527  std::vector<GEMCoPadDigi> output;
528 
529  // loop on clusters
530  for (const auto& cluster : clusters_) {
531  // ignore single clusters
532  if (!cluster.isCoincidence())
533  continue;
534 
535  // construct coincidence pads out of the centers of the coincidence clusters
536  output.emplace_back(cluster.roll(), cluster.mid1(), cluster.mid2());
537  }
538 
539  return output;
540 }
GEMClusterProcessor::padToHsME1bFiles_
std::vector< std::string > padToHsME1bFiles_
Definition: GEMClusterProcessor.h:74
GEMClusterProcessor::GEMCSCLUT_roll_l2_max_wg_ME11_even_
std::unique_ptr< CSCLUTReader > GEMCSCLUT_roll_l2_max_wg_ME11_even_
Definition: GEMClusterProcessor.h:110
GEMClusterProcessor::readoutCoPads
std::vector< GEMCoPadDigi > readoutCoPads() const
Definition: GEMClusterProcessor.cc:526
GEMClusterProcessor::GEMCSCLUT_pad_hs_ME1a_even_
std::unique_ptr< CSCLUTReader > GEMCSCLUT_pad_hs_ME1a_even_
Definition: GEMClusterProcessor.h:87
GEMClusterProcessor::rollToMinWgME21Files_
std::vector< std::string > rollToMinWgME21Files_
Definition: GEMClusterProcessor.h:84
MessageLogger.h
GEMClusterProcessor::maxDeltaBX_
unsigned int maxDeltaBX_
Definition: GEMClusterProcessor.h:64
GEMClusterProcessor::GEMCSCLUT_roll_l1_min_wg_ME11_odd_
std::unique_ptr< CSCLUTReader > GEMCSCLUT_roll_l1_min_wg_ME11_odd_
Definition: GEMClusterProcessor.h:104
GEMClusterProcessor::addSingleClusters
void addSingleClusters(const GEMPadDigiClusterCollection *)
Definition: GEMClusterProcessor.cc:207
GEMClusterProcessor::GEMCSCLUT_pad_hs_ME1a_odd_
std::unique_ptr< CSCLUTReader > GEMCSCLUT_pad_hs_ME1a_odd_
Definition: GEMClusterProcessor.h:88
GEMClusterProcessor::GEMCSCLUT_roll_l1_max_wg_ME21_even_
std::unique_ptr< CSCLUTReader > GEMCSCLUT_roll_l1_max_wg_ME21_even_
Definition: GEMClusterProcessor.h:105
GEMClusterProcessor::clear
void clear()
Definition: GEMClusterProcessor.cc:79
GEMClusterProcessor::getClusters
std::vector< GEMInternalCluster > getClusters(int bx) const
Definition: GEMClusterProcessor.cc:95
GEMClusterProcessor::padToEsME21Files_
std::vector< std::string > padToEsME21Files_
Definition: GEMClusterProcessor.h:79
GEMClusterProcessor::GEMCSCLUT_roll_l1_max_wg_ME21_odd_
std::unique_ptr< CSCLUTReader > GEMCSCLUT_roll_l1_max_wg_ME21_odd_
Definition: GEMClusterProcessor.h:106
convertSQLitetoXML_cfg.output
output
Definition: convertSQLitetoXML_cfg.py:72
relativeConstraints.station
station
Definition: relativeConstraints.py:67
GEMClusterProcessor::rollToMinWgME11Files_
std::vector< std::string > rollToMinWgME11Files_
Definition: GEMClusterProcessor.h:82
GEMClusterProcessor::GEMCSCLUT_pad_es_ME1b_odd_
std::unique_ptr< CSCLUTReader > GEMCSCLUT_pad_es_ME1b_odd_
Definition: GEMClusterProcessor.h:97
GEMPadDigiCluster
Definition: GEMPadDigiCluster.h:19
GEMClusterProcessor::padToHsME21Files_
std::vector< std::string > padToHsME21Files_
Definition: GEMClusterProcessor.h:75
l1GtPatternGenerator_cfi.bx
bx
Definition: l1GtPatternGenerator_cfi.py:18
GEMClusterProcessor::clusters_
std::vector< GEMInternalCluster > clusters_
Definition: GEMClusterProcessor.h:70
GEMClusterProcessor::GEMCSCLUT_roll_l2_min_wg_ME11_odd_
std::unique_ptr< CSCLUTReader > GEMCSCLUT_roll_l2_min_wg_ME11_odd_
Definition: GEMClusterProcessor.h:113
GEMClusterProcessor::padToHsME1aFiles_
std::vector< std::string > padToHsME1aFiles_
Definition: GEMClusterProcessor.h:73
GEMClusterProcessor::maxDeltaPad_
unsigned int maxDeltaPad_
Definition: GEMClusterProcessor.h:63
GEMClusterProcessor::run
void run(const GEMPadDigiClusterCollection *)
Definition: GEMClusterProcessor.cc:81
GEMClusterProcessor::GEMCSCLUT_roll_l1_max_wg_ME11_even_
std::unique_ptr< CSCLUTReader > GEMCSCLUT_roll_l1_max_wg_ME11_even_
Definition: GEMClusterProcessor.h:101
GetRecoTauVFromDQM_MC_cff.cl
cl
Definition: GetRecoTauVFromDQM_MC_cff.py:38
GEMClusterProcessor::rollToMaxWgME11Files_
std::vector< std::string > rollToMaxWgME11Files_
Definition: GEMClusterProcessor.h:81
GEMClusterProcessor::GEMCSCLUT_roll_l2_min_wg_ME21_even_
std::unique_ptr< CSCLUTReader > GEMCSCLUT_roll_l2_min_wg_ME21_even_
Definition: GEMClusterProcessor.h:116
GEMClusterProcessor::GEMClusterProcessor
GEMClusterProcessor(int region, unsigned station, unsigned chamber, const edm::ParameterSet &conf)
Definition: GEMClusterProcessor.cc:7
GEMClusterProcessor::rollToMaxWgME21Files_
std::vector< std::string > rollToMaxWgME21Files_
Definition: GEMClusterProcessor.h:83
GEMClusterProcessor::GEMCSCLUT_roll_l1_min_wg_ME21_even_
std::unique_ptr< CSCLUTReader > GEMCSCLUT_roll_l1_min_wg_ME21_even_
Definition: GEMClusterProcessor.h:107
GEMPadDigiCluster::GE21
Definition: GEMPadDigiCluster.h:24
GEMClusterProcessor::GEMCSCLUT_pad_hs_ME21_even_
std::unique_ptr< CSCLUTReader > GEMCSCLUT_pad_hs_ME21_even_
Definition: GEMClusterProcessor.h:91
GEMClusterProcessor::GEMCSCLUT_roll_l1_min_wg_ME21_odd_
std::unique_ptr< CSCLUTReader > GEMCSCLUT_roll_l1_min_wg_ME21_odd_
Definition: GEMClusterProcessor.h:108
mps_fire.end
end
Definition: mps_fire.py:242
GEMClusterProcessor::GEMCSCLUT_roll_l2_max_wg_ME21_even_
std::unique_ptr< CSCLUTReader > GEMCSCLUT_roll_l2_max_wg_ME21_even_
Definition: GEMClusterProcessor.h:114
GEMPadDigiClusterCollection
GEMClusterProcessor::GEMCSCLUT_pad_es_ME21_odd_
std::unique_ptr< CSCLUTReader > GEMCSCLUT_pad_es_ME21_odd_
Definition: GEMClusterProcessor.h:99
phase1PixelTopology::layer
constexpr std::array< uint8_t, layerIndexSize > layer
Definition: phase1PixelTopology.h:99
GEMClusterProcessor::GEMCSCLUT_roll_l2_max_wg_ME11_odd_
std::unique_ptr< CSCLUTReader > GEMCSCLUT_roll_l2_max_wg_ME11_odd_
Definition: GEMClusterProcessor.h:111
GEMClusterProcessor::maxDeltaRoll_
unsigned int maxDeltaRoll_
Definition: GEMClusterProcessor.h:65
GEMClusterProcessor::GEMCSCLUT_roll_l1_max_wg_ME11_odd_
std::unique_ptr< CSCLUTReader > GEMCSCLUT_roll_l1_max_wg_ME11_odd_
Definition: GEMClusterProcessor.h:102
edm::ParameterSet
Definition: ParameterSet.h:47
AlCaHLTBitMon_ParallelJobs.p
def p
Definition: AlCaHLTBitMon_ParallelJobs.py:153
GEMClusterProcessor::GEMCSCLUT_pad_es_ME1a_even_
std::unique_ptr< CSCLUTReader > GEMCSCLUT_pad_es_ME1a_even_
Definition: GEMClusterProcessor.h:94
GEMDetId
Definition: GEMDetId.h:18
match
std::pair< typename Association::data_type::first_type, double > match(Reference key, Association association, bool bestMatchByMaxValue)
Generic matching function.
Definition: Utils.h:10
HLT_FULL_cff.region
region
Definition: HLT_FULL_cff.py:88286
GEMClusterProcessor::GEMCSCLUT_roll_l1_min_wg_ME11_even_
std::unique_ptr< CSCLUTReader > GEMCSCLUT_roll_l1_min_wg_ME11_even_
Definition: GEMClusterProcessor.h:103
submitPVResolutionJobs.q
q
Definition: submitPVResolutionJobs.py:84
GEMClusterProcessor::GEMCSCLUT_pad_es_ME1b_even_
std::unique_ptr< CSCLUTReader > GEMCSCLUT_pad_es_ME1b_even_
Definition: GEMClusterProcessor.h:96
GEMClusterProcessor::GEMCSCLUT_pad_hs_ME1b_odd_
std::unique_ptr< CSCLUTReader > GEMCSCLUT_pad_hs_ME1b_odd_
Definition: GEMClusterProcessor.h:90
GEMClusterProcessor::isEven_
bool isEven_
Definition: GEMClusterProcessor.h:61
GEMClusterProcessor::GEMCSCLUT_roll_l2_min_wg_ME21_odd_
std::unique_ptr< CSCLUTReader > GEMCSCLUT_roll_l2_min_wg_ME21_odd_
Definition: GEMClusterProcessor.h:117
GEMClusterProcessor.h
GEMClusterProcessor::GEMCSCLUT_pad_hs_ME21_odd_
std::unique_ptr< CSCLUTReader > GEMCSCLUT_pad_hs_ME21_odd_
Definition: GEMClusterProcessor.h:92
GEMClusterProcessor::GEMCSCLUT_pad_hs_ME1b_even_
std::unique_ptr< CSCLUTReader > GEMCSCLUT_pad_hs_ME1b_even_
Definition: GEMClusterProcessor.h:89
GEMClusterProcessor::GEMCSCLUT_roll_l2_max_wg_ME21_odd_
std::unique_ptr< CSCLUTReader > GEMCSCLUT_roll_l2_max_wg_ME21_odd_
Definition: GEMClusterProcessor.h:115
GEMClusterProcessor::padToEsME1bFiles_
std::vector< std::string > padToEsME1bFiles_
Definition: GEMClusterProcessor.h:78
GEMClusterProcessor::GEMCSCLUT_roll_l2_min_wg_ME11_even_
std::unique_ptr< CSCLUTReader > GEMCSCLUT_roll_l2_min_wg_ME11_even_
Definition: GEMClusterProcessor.h:112
GeomDetEnumerators::isME0
bool isME0(GeomDetEnumerators::SubDetector m)
Definition: GeomDetEnumerators.cc:96
GEMClusterProcessor::doCoordinateConversion
void doCoordinateConversion()
Definition: GEMClusterProcessor.cc:250
GEMClusterProcessor::padToEsME1aFiles_
std::vector< std::string > padToEsME1aFiles_
Definition: GEMClusterProcessor.h:77
GEMClusterProcessor::chamber_
const int chamber_
Definition: GEMClusterProcessor.h:60
relativeConstraints.ring
ring
Definition: relativeConstraints.py:68
relativeConstraints.chamber
chamber
Definition: relativeConstraints.py:53
or
The Signals That Services Can Subscribe To This is based on ActivityRegistry and is current per Services can connect to the signals distributed by the ActivityRegistry in order to monitor the activity of the application Each possible callback has some defined which we here list in angle e< void, edm::EventID const &, edm::Timestamp const & > We also list in braces which AR_WATCH_USING_METHOD_ is used for those or
Definition: Activities.doc:12
GEMClusterProcessor::region_
const int region_
Definition: GEMClusterProcessor.h:58
edm::ParameterSet::getParameter
T getParameter(std::string const &) const
Definition: ParameterSet.h:303
GEMInternalCluster
Definition: GEMInternalCluster.h:18
GEMClusterProcessor::station_
const int station_
Definition: GEMClusterProcessor.h:59
funct::abs
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
GEMClusterProcessor::addCoincidenceClusters
void addCoincidenceClusters(const GEMPadDigiClusterCollection *)
Definition: GEMClusterProcessor.cc:134
GEMClusterProcessor::GEMCSCLUT_pad_es_ME21_even_
std::unique_ptr< CSCLUTReader > GEMCSCLUT_pad_es_ME21_even_
Definition: GEMClusterProcessor.h:98
GEMClusterProcessor::hasGE21Geometry16Partitions_
bool hasGE21Geometry16Partitions_
Definition: GEMClusterProcessor.h:67
GEMClusterProcessor::getCoincidenceClusters
std::vector< GEMInternalCluster > getCoincidenceClusters(int bx) const
Definition: GEMClusterProcessor.cc:121
GEMClusterProcessor::GEMCSCLUT_pad_es_ME1a_odd_
std::unique_ptr< CSCLUTReader > GEMCSCLUT_pad_es_ME1a_odd_
Definition: GEMClusterProcessor.h:95