CMS 3D CMS Logo

L1TMuonBarrelKalmanSectorProcessor.cc
Go to the documentation of this file.
2 
4  : verbose_(iConfig.getParameter<int>("verbose")), sector_(sector) {
5  std::vector<int> wheels = iConfig.getParameter<std::vector<int> >("wheelsToProcess");
6  for (const auto wheel : wheels)
7  regions_.push_back(
9 }
10 
12 
14  const L1MuKBMTCombinedStubRefVector& stubsAll,
15  int bx) {
16  L1MuKBMTrackCollection tracksM2;
17  L1MuKBMTrackCollection tracksM1;
18  L1MuKBMTrackCollection tracks0;
19  L1MuKBMTrackCollection tracksP1;
20  L1MuKBMTrackCollection tracksP2;
21 
22  for (auto& region : regions_) {
23  L1MuKBMTrackCollection tmp = region.process(trackMaker, stubsAll, bx);
24  if (region.wheel() == -2)
25  tracksM2.insert(tracksM2.end(), tmp.begin(), tmp.end());
26  if (region.wheel() == -1)
27  tracksM1.insert(tracksM1.end(), tmp.begin(), tmp.end());
28  if (region.wheel() == 0)
29  tracks0.insert(tracks0.end(), tmp.begin(), tmp.end());
30  if (region.wheel() == 1)
31  tracksP1.insert(tracksP1.end(), tmp.begin(), tmp.end());
32  if (region.wheel() == 2)
33  tracksP2.insert(tracksP2.end(), tmp.begin(), tmp.end());
34  }
35 
36  L1MuKBMTrackCollection out = wedgeSort(tracksM2, tracksM1, tracks0, tracksP1, tracksP2);
37  if (verbose_ == 1)
38  verbose(trackMaker, out);
39 
40  return out;
41 }
42 
46  out.pt_1 = 0;
47  out.qual_1 = 0;
48  out.eta_1 = 0;
49  out.HF_1 = 0;
50  out.phi_1 = 0;
51  out.bx0_1 = 0;
52  out.charge_1 = 0;
53  out.chargeValid_1 = 0;
54  out.dxy_1 = 0;
55  out.addr1_1 = 3;
56  out.addr2_1 = 15;
57  out.addr3_1 = 15;
58  out.addr4_1 = 15;
59  out.reserved_1 = 0;
60  out.wheel_1 = 0;
61  out.ptSTA_1 = 0;
62  out.SE_1 = 0;
63 
64  out.pt_2 = 0;
65  out.qual_2 = 0;
66  out.eta_2 = 0;
67  out.HF_2 = 0;
68  out.phi_2 = 0;
69  out.bx0_2 = 0;
70  out.charge_2 = 0;
71  out.chargeValid_2 = 0;
72  out.dxy_2 = 0;
73  out.addr1_2 = 3;
74  out.addr2_2 = 15;
75  out.addr3_2 = 15;
76  out.addr4_2 = 15;
77  out.reserved_2 = 0;
78  out.wheel_2 = 0;
79  out.ptSTA_2 = 0;
80  out.SE_2 = 0;
81 
82  out.pt_3 = 0;
83  out.qual_3 = 0;
84  out.eta_3 = 0;
85  out.HF_3 = 0;
86  out.phi_3 = 0;
87  out.bx0_3 = 0;
88  out.charge_3 = 0;
89  out.chargeValid_3 = 0;
90  out.dxy_3 = 0;
91  out.addr1_3 = 3;
92  out.addr2_3 = 15;
93  out.addr3_3 = 15;
94  out.addr4_3 = 15;
95  out.reserved_3 = 0;
96  out.wheel_3 = 0;
97  out.ptSTA_3 = 0;
98  out.SE_3 = 0;
99 
100  if (!tracks.empty()) {
101  l1t::RegionalMuonCand mu = trackMaker->convertToBMTF(tracks[0]);
102  out.pt_1 = mu.hwPt();
103  out.qual_1 = mu.hwQual();
104  out.eta_1 = mu.hwEta();
105  out.HF_1 = mu.hwHF();
106  out.phi_1 = mu.hwPhi();
107  out.bx0_1 = 0;
108  out.charge_1 = mu.hwSign();
109  out.chargeValid_1 = mu.hwSignValid();
110  out.dxy_1 = mu.hwDXY();
111  out.addr1_1 = mu.trackSubAddress(l1t::RegionalMuonCand::kStat1);
112  out.addr2_1 = mu.trackSubAddress(l1t::RegionalMuonCand::kStat2);
113  out.addr3_1 = mu.trackSubAddress(l1t::RegionalMuonCand::kStat3);
114  out.addr4_1 = mu.trackSubAddress(l1t::RegionalMuonCand::kStat4);
115  out.wheel_1 = mu.trackSubAddress(l1t::RegionalMuonCand::kWheelSide) * (1 << 2) +
116  mu.trackSubAddress(l1t::RegionalMuonCand::kWheelNum);
117  out.ptSTA_1 = mu.hwPtUnconstrained();
118  }
119 
120  if (tracks.size() > 1) {
121  l1t::RegionalMuonCand mu = trackMaker->convertToBMTF(tracks[1]);
122  out.pt_2 = mu.hwPt();
123  out.qual_2 = mu.hwQual();
124  out.eta_2 = mu.hwEta();
125  out.HF_2 = mu.hwHF();
126  out.phi_2 = mu.hwPhi();
127  out.bx0_2 = 0;
128  out.charge_2 = mu.hwSign();
129  out.chargeValid_2 = mu.hwSignValid();
130  out.dxy_2 = mu.hwDXY();
131  out.addr1_2 = mu.trackSubAddress(l1t::RegionalMuonCand::kStat1);
132  out.addr2_2 = mu.trackSubAddress(l1t::RegionalMuonCand::kStat2);
133  out.addr3_2 = mu.trackSubAddress(l1t::RegionalMuonCand::kStat3);
134  out.addr4_2 = mu.trackSubAddress(l1t::RegionalMuonCand::kStat4);
135  out.wheel_2 = mu.trackSubAddress(l1t::RegionalMuonCand::kWheelSide) * (1 << 2) +
136  mu.trackSubAddress(l1t::RegionalMuonCand::kWheelNum);
137 
138  out.ptSTA_2 = mu.hwPtUnconstrained();
139  }
140 
141  if (tracks.size() > 2) {
142  l1t::RegionalMuonCand mu = trackMaker->convertToBMTF(tracks[2]);
143  out.pt_3 = mu.hwPt();
144  out.qual_3 = mu.hwQual();
145  out.eta_3 = mu.hwEta();
146  out.HF_3 = mu.hwHF();
147  out.phi_3 = mu.hwPhi();
148  out.bx0_3 = 0;
149  out.charge_3 = mu.hwSign();
150  out.chargeValid_3 = mu.hwSignValid();
151  out.dxy_3 = mu.hwDXY();
152  out.addr1_3 = mu.trackSubAddress(l1t::RegionalMuonCand::kStat1);
153  out.addr2_3 = mu.trackSubAddress(l1t::RegionalMuonCand::kStat2);
154  out.addr3_3 = mu.trackSubAddress(l1t::RegionalMuonCand::kStat3);
155  out.addr4_3 = mu.trackSubAddress(l1t::RegionalMuonCand::kStat4);
156  out.wheel_3 = mu.trackSubAddress(l1t::RegionalMuonCand::kWheelSide) * (1 << 2) +
157  mu.trackSubAddress(l1t::RegionalMuonCand::kWheelNum);
158  out.ptSTA_3 = mu.hwPtUnconstrained();
159  }
160  return out;
161 }
162 
165  std::cout << "O " << sector_ << " " << out.pt_1 << " " << out.qual_1 << " " << out.eta_1 << " " << out.HF_1 << " "
166  << out.phi_1 << " " << out.charge_1 << " " << out.chargeValid_1 << " " << out.dxy_1 << " " << out.addr1_1
167  << " " << out.addr2_1 << " " << out.addr3_1 << " " << out.addr4_1 << " " << out.wheel_1 << " "
168  << out.ptSTA_1 << " " << out.pt_2 << " " << out.qual_2 << " " << out.eta_2 << " " << out.HF_2 << " "
169  << out.phi_2 << " " << out.charge_2 << " " << out.chargeValid_2 << " " << out.dxy_2 << " " << out.addr1_2
170  << " " << out.addr2_2 << " " << out.addr3_2 << " " << out.addr4_2 << " " << out.wheel_2 << " "
171  << out.ptSTA_2 << " " << out.pt_3 << " " << out.qual_3 << " " << out.eta_3 << " " << out.HF_3 << " "
172  << out.phi_3 << " " << out.charge_3 << " " << out.chargeValid_3 << " " << out.dxy_3 << " " << out.addr1_3
173  << " " << out.addr2_3 << " " << out.addr3_3 << " " << out.addr4_3 << " " << out.wheel_3 << " "
174  << out.ptSTA_3 << std::endl;
175 }
176 
177 // L1MuKBMTrackCollection L1TMuonBarrelKalmanSectorProcessor::cleanAndSort(const L1MuKBMTrackCollection& pretracks,uint keep) {
178 // L1MuKBMTrackCollection out;
179 
180 // if (verbose_)
181 // printf" -----Preselected Kalman Tracks for sector %d----- \n",sector_);
182 
183 // for(const auto& track1 : pretracks) {
184 // if (verbose_)
185 // printf("Pre Track charge=%d pt=%f eta=%f phi=%f curvature=%d curvature STA =%d stubs=%d bitmask=%d rank=%d chi=%d pts=%f %f\n",track1.charge(),track1.pt(),track1.eta(),track1.phi(),track1.curvatureAtVertex(),track1.curvatureAtMuon(),int(track1.stubs().size()),track1.hitPattern(),track1.rank(),track1.approxChi2(),track1.pt(),track1.ptUnconstrained());
186 
187 // bool keep=true;
188 // for(const auto& track2 : pretracks) {
189 // if (track1==track2)
190 // continue;
191 // if (!track1.overlapTrack(track2))
192 // continue;
193 
194 // if (track1.rank()<track2.rank())
195 // keep=false;
196 
197 // if ((track1.rank()==track2.rank()) && (fabs(track1.stubs()[0]->whNum())<fabs(track2.stubs()[0]->whNum())))
198 // keep=false;
199 // }
200 // if (keep)
201 // out.push_back(track1);
202 // }
203 
204 // if (verbose_) {
205 // printf(" -----Algo Result Kalman Tracks-----\n");
206 // for (const auto& track1 :out)
207 // printf("Final Kalman Track charge=%d pt=%f eta=%f phi=%f curvature=%d curvature STA =%d stubs=%d chi2=%d pts=%f %f\n",track1.charge(),track1.pt(),track1.eta(),track1.phi(),track1.curvatureAtVertex(),track1.curvatureAtMuon(),int(track1.stubs().size()),track1.approxChi2(),track1.pt(),track1.ptUnconstrained());
208 // }
209 
210 // TrackSorter sorter;
211 // if (!out.empty())
212 // std::sort(out.begin(),out.end(),sorter);
213 
214 // L1MuKBMTrackCollection exported;
215 // for (uint i=0;i<out.size();++i)
216 // if (i<=keep)
217 // exported.push_back(out[i]);
218 // return exported;
219 // }
220 
222  const L1MuKBMTrackCollection& coll2) {
224 
225  for (const auto& track1 : coll1) {
226  /*
227  if (verbose_)
228  printf(
229  "Pre Track charge=%d pt=%f eta=%f phi=%f curvature=%d curvature STA =%d stubs=%d bitmask=%d rank=%d chi=%d "
230  "pts=%f %f\n",
231  track1.charge(),
232  track1.pt(),
233  track1.eta(),
234  track1.phi(),
235  track1.curvatureAtVertex(),
236  track1.curvatureAtMuon(),
237  int(track1.stubs().size()),
238  track1.hitPattern(),
239  track1.rank(),
240  track1.approxChi2(),
241  track1.pt(),
242  track1.ptUnconstrained());
243  */
244  bool keep = true;
245  for (const auto& track2 : coll2) {
246  if (!track1.overlapTrack(track2))
247  continue;
248 
249  if (track1.rank() < track2.rank())
250  keep = false;
251 
252  if ((track1.rank() == track2.rank()) && (fabs(track1.stubs()[0]->whNum()) < fabs(track2.stubs()[0]->whNum())))
253  keep = false;
254  }
255  if (keep)
256  out.push_back(track1);
257  else {
258  L1MuKBMTrack temp = track1;
259  temp.setPtEtaPhi(0, 0, 0);
260  temp.setRank(0);
261  out.push_back(temp);
262  }
263  }
264 
265  return out;
266 }
267 
269  const L1MuKBMTrackCollection& coll2,
270  const L1MuKBMTrackCollection& coll3) {
272 
273  for (const auto& track1 : coll1) {
274  // if (verbose_)
275  // printf("Pre Track charge=%d pt=%f eta=%f phi=%f curvature=%d curvature STA =%d stubs=%d bitmask=%d rank=%d chi=%d pts=%f %f\n",track1.charge(),track1.pt(),track1.eta(),track1.phi(),track1.curvatureAtVertex(),track1.curvatureAtMuon(),int(track1.stubs().size()),track1.hitPattern(),track1.rank(),track1.approxChi2(),track1.pt(),track1.ptUnconstrained());
276 
277  bool keep = true;
278  for (const auto& track2 : coll2) {
279  if (!track1.overlapTrack(track2))
280  continue;
281 
282  if (track1.rank() < track2.rank())
283  keep = false;
284 
285  if ((track1.rank() == track2.rank()) && (fabs(track1.stubs()[0]->whNum()) < fabs(track2.stubs()[0]->whNum())))
286  keep = false;
287  }
288 
289  for (const auto& track2 : coll3) {
290  if (!track1.overlapTrack(track2))
291  continue;
292 
293  if (track1.rank() < track2.rank())
294  keep = false;
295 
296  if ((track1.rank() == track2.rank()) && (fabs(track1.stubs()[0]->whNum()) < fabs(track2.stubs()[0]->whNum())))
297  keep = false;
298  }
299 
300  if (keep)
301  out.push_back(track1);
302  else {
303  L1MuKBMTrack temp = track1;
304  temp.setPtEtaPhi(0, 0, 0);
305  temp.setRank(0);
306  out.push_back(temp);
307  }
308  }
309 
310  return out;
311 }
312 
313 void swap(std::map<uint, double>& info, std::map<uint, L1MuKBMTrack>& trackInfo, uint i, uint j) {
314  double pt1 = info[i];
315  double pt2 = info[j];
316 
317  if (pt2 > pt1) {
318  info[j] = pt1;
319  info[i] = pt2;
320 
321  if (pt1 != 0.0 && pt2 != 0.0) {
322  L1MuKBMTrack tmp = trackInfo[i];
323  trackInfo[i] = trackInfo[j];
324  trackInfo[j] = tmp;
325  }
326  if (pt2 != 0.0 && pt1 == 0.0) {
327  trackInfo[i] = trackInfo[j];
328  }
329  }
330 }
331 
333  const L1MuKBMTrackCollection& preminus1,
334  const L1MuKBMTrackCollection& prezero,
335  const L1MuKBMTrackCollection& preone,
336  const L1MuKBMTrackCollection& pretwo) {
337  //first clean
338 
339  L1MuKBMTrackCollection minus2 = cleanNeighbor(preminus2, preminus1);
340  L1MuKBMTrackCollection minus1 = cleanNeighbors(preminus1, preminus2, prezero);
341  L1MuKBMTrackCollection zero = cleanNeighbors(prezero, preminus1, preone);
342  L1MuKBMTrackCollection plus1 = cleanNeighbors(preone, prezero, pretwo);
343  L1MuKBMTrackCollection plus2 = cleanNeighbor(pretwo, preone);
344 
345  std::map<uint, L1MuKBMTrack> trackInfo;
346  std::map<uint, double> ptInfo;
347 
348  for (uint i = 0; i < 10; ++i)
349  ptInfo[i] = 0.0;
350 
351  if (minus2.size() > 1) {
352  ptInfo[0] = minus2[0].pt();
353  trackInfo[0] = minus2[0];
354  ptInfo[1] = minus2[1].pt();
355  trackInfo[1] = minus2[1];
356  } else if (minus2.size() == 1) {
357  if (minus2[0].stubs()[0]->tag()) {
358  ptInfo[1] = minus2[0].pt();
359  trackInfo[1] = minus2[0];
360  } else {
361  ptInfo[0] = minus2[0].pt();
362  trackInfo[0] = minus2[0];
363  }
364  }
365 
366  if (minus1.size() > 1) {
367  ptInfo[2] = minus1[0].pt();
368  trackInfo[2] = minus1[0];
369  ptInfo[3] = minus1[1].pt();
370  trackInfo[3] = minus1[1];
371  } else if (minus1.size() == 1) {
372  if (minus1[0].stubs()[0]->tag()) {
373  ptInfo[3] = minus1[0].pt();
374  trackInfo[3] = minus1[0];
375  } else {
376  ptInfo[2] = minus1[0].pt();
377  trackInfo[2] = minus1[0];
378  }
379  }
380 
381  if (zero.size() > 1) {
382  ptInfo[4] = zero[0].pt();
383  trackInfo[4] = zero[0];
384  ptInfo[5] = zero[1].pt();
385  trackInfo[5] = zero[1];
386  } else if (zero.size() == 1) {
387  if (zero[0].stubs()[0]->tag()) {
388  ptInfo[5] = zero[0].pt();
389  trackInfo[5] = zero[0];
390  } else {
391  ptInfo[4] = zero[0].pt();
392  trackInfo[4] = zero[0];
393  }
394  }
395 
396  if (plus1.size() > 1) {
397  ptInfo[6] = plus1[0].pt();
398  trackInfo[6] = plus1[0];
399  ptInfo[7] = plus1[1].pt();
400  trackInfo[7] = plus1[1];
401  } else if (plus1.size() == 1) {
402  if (plus1[0].stubs()[0]->tag()) {
403  ptInfo[7] = plus1[0].pt();
404  trackInfo[7] = plus1[0];
405  } else {
406  ptInfo[6] = plus1[0].pt();
407  trackInfo[6] = plus1[0];
408  }
409  }
410 
411  if (plus2.size() > 1) {
412  ptInfo[8] = plus2[0].pt();
413  trackInfo[8] = plus2[0];
414  ptInfo[9] = plus2[1].pt();
415  trackInfo[9] = plus2[1];
416  } else if (plus2.size() == 1) {
417  if (plus2[0].stubs()[0]->tag()) {
418  ptInfo[9] = plus2[0].pt();
419  trackInfo[9] = plus2[0];
420  } else {
421  ptInfo[8] = plus2[0].pt();
422  trackInfo[8] = plus2[0];
423  }
424  }
425 
426  //Now my glorious partial bitonic != power of two sorter
427  swap(ptInfo, trackInfo, 0, 5);
428  swap(ptInfo, trackInfo, 1, 6);
429  swap(ptInfo, trackInfo, 2, 7);
430  swap(ptInfo, trackInfo, 3, 8);
431  swap(ptInfo, trackInfo, 4, 9);
432 
433  swap(ptInfo, trackInfo, 0, 3);
434  swap(ptInfo, trackInfo, 1, 4);
435  swap(ptInfo, trackInfo, 5, 8);
436  swap(ptInfo, trackInfo, 6, 9);
437 
438  swap(ptInfo, trackInfo, 0, 2);
439  swap(ptInfo, trackInfo, 3, 6);
440  swap(ptInfo, trackInfo, 7, 9);
441 
442  swap(ptInfo, trackInfo, 0, 1);
443  swap(ptInfo, trackInfo, 2, 4);
444  swap(ptInfo, trackInfo, 5, 7);
445  swap(ptInfo, trackInfo, 8, 9);
446 
447  swap(ptInfo, trackInfo, 1, 2);
448  swap(ptInfo, trackInfo, 3, 5);
449  swap(ptInfo, trackInfo, 4, 6);
450  swap(ptInfo, trackInfo, 7, 8);
451 
452  swap(ptInfo, trackInfo, 1, 3);
453  swap(ptInfo, trackInfo, 2, 5);
454  swap(ptInfo, trackInfo, 4, 7);
455  swap(ptInfo, trackInfo, 6, 8);
456 
457  swap(ptInfo, trackInfo, 2, 3);
458 
460  if (ptInfo[0] != 0.0)
461  out.push_back(trackInfo[0]);
462  if (ptInfo[1] != 0.0)
463  out.push_back(trackInfo[1]);
464  if (ptInfo[2] != 0.0)
465  out.push_back(trackInfo[2]);
466 
467  return out;
468 }
l1t::RegionalMuonCand convertToBMTF(const L1MuKBMTrack &track)
std::vector< L1TMuonBarrelKalmanRegionModule > regions_
T getParameter(std::string const &) const
Definition: ParameterSet.h:303
static const TGPicture * info(bool iBackgroundIsBlack)
L1MuKBMTrackCollection cleanNeighbors(const L1MuKBMTrackCollection &, const L1MuKBMTrackCollection &, const L1MuKBMTrackCollection &)
std::vector< edm::Ref< L1MuKBMTCombinedStubCollection > > L1MuKBMTCombinedStubRefVector
void verbose(L1TMuonBarrelKalmanAlgo *, const L1MuKBMTrackCollection &)
bmtf_out makeWord(L1TMuonBarrelKalmanAlgo *, const L1MuKBMTrackCollection &)
L1MuKBMTrackCollection process(L1TMuonBarrelKalmanAlgo *, const L1MuKBMTCombinedStubRefVector &stubs, int bx)
void swap(std::map< uint, double > &info, std::map< uint, L1MuKBMTrack > &trackInfo, uint i, uint j)
L1MuKBMTrackCollection cleanNeighbor(const L1MuKBMTrackCollection &, const L1MuKBMTrackCollection &)
std::vector< L1MuKBMTrack > L1MuKBMTrackCollection
Definition: L1MuKBMTrack.h:15
L1TMuonBarrelKalmanSectorProcessor(const edm::ParameterSet &, int sector)
L1MuKBMTrackCollection wedgeSort(const L1MuKBMTrackCollection &, const L1MuKBMTrackCollection &, const L1MuKBMTrackCollection &, const L1MuKBMTrackCollection &, const L1MuKBMTrackCollection &)
tmp
align.sh
Definition: createJobs.py:716