CMS 3D CMS Logo

Tracklet.cc
Go to the documentation of this file.
5 
8 
9 #include <memory>
10 
11 #include <sstream>
12 
13 using namespace std;
14 using namespace trklet;
15 
16 Tracklet::Tracklet(Settings const& settings,
17  unsigned int iSeed,
18  const Stub* innerFPGAStub,
19  const Stub* middleFPGAStub,
20  const Stub* outerFPGAStub,
21  double rinv,
22  double phi0,
23  double d0,
24  double z0,
25  double t,
26  double rinvapprox,
27  double phi0approx,
28  double d0approx,
29  double z0approx,
30  double tapprox,
31  int irinv,
32  int iphi0,
33  int id0,
34  int iz0,
35  int it,
36  Projection projs[N_LAYER + N_DISK],
37  bool disk,
38  bool overlap)
39  : settings_(settings) {
40  seedIndex_ = iSeed;
41 
42  overlap_ = overlap;
43  disk_ = disk;
44  assert(!(disk && overlap));
45  barrel_ = (!disk) && (!overlap);
46  triplet_ = false;
47 
48  trackletIndex_ = -1;
49  TCIndex_ = -1;
50 
52 
53  if (barrel_ && middleFPGAStub == nullptr)
55 
59 
60  trackpars_.init(rinv, phi0, d0, t, z0);
61 
63 
64  fpgapars_.rinv().set(irinv, settings_.nbitsrinv(), false, __LINE__, __FILE__);
65  fpgapars_.phi0().set(iphi0, settings_.nbitsphi0(), false, __LINE__, __FILE__);
66  fpgapars_.d0().set(id0, settings_.nbitsd0(), false, __LINE__, __FILE__);
67  fpgapars_.z0().set(iz0, settings_.nbitsz0(), false, __LINE__, __FILE__);
68  fpgapars_.t().set(it, settings_.nbitst(), false, __LINE__, __FILE__);
69 
70  fpgatrack_ = nullptr;
71 
72  triplet_ = (seedIndex_ >= 8);
73 
74  //fill projection layers
75  for (unsigned int i = 0; i < N_LAYER - 2; i++) {
76  projlayer_[i] = settings.projlayers(seedIndex_, i);
77  }
78 
79  //fill projection disks
80  for (unsigned int i = 0; i < N_DISK; i++) {
81  projdisk_[i] = settings.projdisks(seedIndex_, i);
82  }
83 
84  //Handle projections to the layers
85  for (unsigned int i = 0; i < N_LAYER - 2; i++) {
86  if (projlayer_[i] == 0)
87  continue;
88  if (!projs[projlayer_[i] - 1].valid())
89  continue;
90 
91  proj_[projlayer_[i] - 1] = projs[projlayer_[i] - 1];
92  }
93  //Now handle projections to the disks
94  for (unsigned int i = 0; i < N_DISK; i++) {
95  if (projdisk_[i] == 0)
96  continue;
97  if (!projs[N_LAYER + projdisk_[i] - 1].valid())
98  continue;
99 
100  proj_[N_LAYER + projdisk_[i] - 1] = projs[N_LAYER + projdisk_[i] - 1];
101  }
102 
103  ichisqrphifit_.set(-1, 8, false);
104  ichisqrzfit_.set(-1, 8, false);
105 }
106 
108  set<int> tpset;
109 
110  set<int> tpsetstubinner;
111  set<int> tpsetstubouter;
112 
113  vector<int> tps = innerFPGAStub_->l1tstub()->tps();
114  for (auto tp : tps) {
115  if (tp != 0) {
116  tpsetstubinner.insert(tp);
117  tpset.insert(abs(tp));
118  }
119  }
120 
121  tps = outerFPGAStub_->l1tstub()->tps();
122  for (auto tp : tps) {
123  if (tp != 0) {
124  tpsetstubouter.insert(tp);
125  tpset.insert(abs(tp));
126  }
127  }
128 
129  for (auto& tp : tpset) {
130  if (tpsetstubinner.find(tp) != tpsetstubinner.end() && tpsetstubinner.find(-tp) != tpsetstubinner.end() &&
131  tpsetstubouter.find(tp) != tpsetstubouter.end() && tpsetstubouter.find(-tp) != tpsetstubouter.end()) {
132  return tp;
133  }
134  }
135  return 0;
136 }
137 
139  set<int> tpset;
140  set<int> tpsetstub;
141  set<int> tpsetstubinner;
142  set<int> tpsetstubouter;
143 
144  vector<int> tps = stub->tps();
145  for (auto tp : tps) {
146  if (tp != 0) {
147  tpsetstub.insert(tp);
148  tpset.insert(abs(tp));
149  }
150  }
151  tps = innerFPGAStub_->l1tstub()->tps();
152  for (auto tp : tps) {
153  if (tp != 0) {
154  tpsetstubinner.insert(tp);
155  tpset.insert(abs(tp));
156  }
157  }
158  tps = outerFPGAStub_->l1tstub()->tps();
159  for (auto tp : tps) {
160  if (tp != 0) {
161  tpsetstubouter.insert(tp);
162  tpset.insert(abs(tp));
163  }
164  }
165 
166  for (auto tp : tpset) {
167  if (tpsetstub.find(tp) != tpsetstub.end() && tpsetstub.find(-tp) != tpsetstub.end() &&
168  tpsetstubinner.find(tp) != tpsetstubinner.end() && tpsetstubinner.find(-tp) != tpsetstubinner.end() &&
169  tpsetstubouter.find(tp) != tpsetstubouter.end() && tpsetstubouter.find(-tp) != tpsetstubouter.end()) {
170  return true;
171  }
172  }
173 
174  return false;
175 }
176 
180  if (middleFPGAStub_) {
182  }
184 
185  return str;
186 }
187 
189  if (settings_.writeoutReal()) {
190  std::string oss = std::to_string(fpgapars_.rinv().value() * settings_.krinvpars()) + " " +
191  std::to_string(fpgapars_.phi0().value() * settings_.kphi0pars()) + " " +
192  std::to_string(fpgapars_.d0().value() * settings_.kd0pars()) + " " +
193  std::to_string(fpgapars_.z0().value() * settings_.kz()) + " " +
194  std::to_string(fpgapars_.t().value() * settings_.ktpars());
195  return oss;
196  } else {
198  if (middleFPGAStub_) {
199  str += middleFPGAStub_->stubindex().str() + "|";
200  }
201  str += outerFPGAStub_->stubindex().str() + "|" + fpgapars_.rinv().str() + "|" + fpgapars_.phi0().str() + "|";
202  if (middleFPGAStub_)
203  str += fpgapars_.d0().str() + "|";
204  str += fpgapars_.z0().str() + "|" + fpgapars_.t().str();
205  return str;
206  }
207 }
208 
209 std::string Tracklet::vmstrlayer(int layer, unsigned int allstubindex) {
210  FPGAWord index;
211  if (allstubindex >= (1 << 7)) {
212  edm::LogPrint("Tracklet") << "Warning projection number too large!";
213  index.set((1 << 7) - 1, 7, true, __LINE__, __FILE__);
214  } else {
215  index.set(allstubindex, 7, true, __LINE__, __FILE__);
216  }
217 
218  // This is a shortcut.
219  //int irinvvm=16+(fpgarinv().value()>>(fpgarinv().nbits()-5));
220  // rinv is not directly available in the TrackletProjection.
221  // can be inferred from phi derivative: rinv = - phider * 2
222  int tmp_irinv = proj_[layer - 1].fpgaphiprojder().value() * (-2);
223  int nbits_irinv = proj_[layer - 1].fpgaphiprojder().nbits() + 1;
224 
225  // irinv in VMProjection:
226  // top 5 bits of rinv and shifted to be positive
227  int irinvvm = 16 + (tmp_irinv >> (nbits_irinv - 5));
228 
229  if (settings_.extended() && (irinvvm > 31)) { //TODO - displaced tracking should protect against this
230  edm::LogPrint("Tracklet") << "Warning irinvvm too large:" << irinvvm;
231  irinvvm = 31;
232  }
233 
234  assert(irinvvm >= 0);
235  assert(irinvvm < 32);
236  FPGAWord tmp;
237  tmp.set(irinvvm, 5, true, __LINE__, __FILE__);
238  std::string oss = index.str() + "|" + proj_[layer - 1].fpgarzbin1projvm().str() + "|" +
239  proj_[layer - 1].fpgarzbin2projvm().str() + "|" + proj_[layer - 1].fpgafinerzvm().str() + "|" +
240  proj_[layer - 1].fpgafinephivm().str() + "|" + tmp.str() + "|" + std::to_string(PSseed());
241  return oss;
242 }
243 
244 std::string Tracklet::vmstrdisk(int disk, unsigned int allstubindex) {
245  FPGAWord index;
246  if (allstubindex >= (1 << 7)) {
247  edm::LogPrint("Tracklet") << "Warning projection number too large!";
248  index.set((1 << 7) - 1, 7, true, __LINE__, __FILE__);
249  } else {
250  index.set(allstubindex, 7, true, __LINE__, __FILE__);
251  }
252  std::string oss =
253  index.str() + "|" + proj_[N_LAYER + disk - 1].fpgarzbin1projvm().str() + "|" +
254  proj_[N_LAYER + disk - 1].fpgarzbin2projvm().str() + "|" + proj_[N_LAYER + disk - 1].fpgafinerzvm().str() + "|" +
255  proj_[N_LAYER + disk - 1].fpgafinephivm().str() + "|" + proj_[N_LAYER + disk - 1].getBendIndex().str();
256  return oss;
257 }
258 
260  assert(layer > 0 && layer <= N_LAYER);
261  FPGAWord tmp;
262  if (trackletIndex_ < 0 || trackletIndex_ > (int)settings_.ntrackletmax()) {
263  throw cms::Exception("BadConfig") << __FILE__ << " " << __LINE__ << " trackletIndex_ = " << trackletIndex_;
264  }
265  tmp.set(trackletIndex_, settings_.nbitstrackletindex(), true, __LINE__, __FILE__);
266  FPGAWord tcid;
267  tcid.set(TCIndex_, settings_.nbitstcindex(), true, __LINE__, __FILE__);
268 
269  std::string oss = tcid.str() + "|" + tmp.str() + "|" + proj_[layer - 1].fpgaphiproj().str() + "|" +
270  proj_[layer - 1].fpgarzproj().str() + "|" + proj_[layer - 1].fpgaphiprojder().str() + "|" +
271  proj_[layer - 1].fpgarzprojder().str();
272  return oss;
273 }
274 
276  assert(abs(disk) <= N_DISK);
277  FPGAWord tmp;
278  if (trackletIndex_ < 0 || trackletIndex_ > (int)settings_.ntrackletmax()) {
279  throw cms::Exception("BadConfig") << __FILE__ << " " << __LINE__ << " trackletIndex_ = " << trackletIndex_;
280  }
281  tmp.set(trackletIndex_, settings_.nbitstrackletindex(), true, __LINE__, __FILE__);
282  FPGAWord tcid;
283  if (settings_.extended()) {
284  tcid.set(TCIndex_, 8, true, __LINE__, __FILE__);
285  } else {
286  tcid.set(TCIndex_, 7, true, __LINE__, __FILE__);
287  }
288  std::string oss = tcid.str() + "|" + tmp.str() + "|" + proj_[N_LAYER + abs(disk) - 1].fpgaphiproj().str() + "|" +
289  proj_[N_LAYER + abs(disk) - 1].fpgarzproj().str() + "|" +
290  proj_[N_LAYER + abs(disk) - 1].fpgaphiprojder().str() + "|" +
291  proj_[N_LAYER + abs(disk) - 1].fpgarzprojder().str();
292  return oss;
293 }
294 
295 void Tracklet::addMatch(unsigned int layerdisk,
296  int ideltaphi,
297  int ideltarz,
298  double dphi,
299  double drz,
300  double dphiapprox,
301  double drzapprox,
302  int stubid,
303  const trklet::Stub* stubptr) {
304  assert(layerdisk < N_LAYER + N_DISK);
305  resid_[layerdisk].init(settings_, layerdisk, ideltaphi, ideltarz, stubid, dphi, drz, dphiapprox, drzapprox, stubptr);
306 }
307 
309  assert(layer > 0 && layer <= N_LAYER);
310 
311  FPGAWord tmp;
312  if (trackletIndex_ < 0 || trackletIndex_ > (int)settings_.ntrackletmax()) {
313  throw cms::Exception("BadConfig") << __FILE__ << " " << __LINE__ << " trackletIndex_ = " << trackletIndex_;
314  }
315  tmp.set(trackletIndex_, settings_.nbitstrackletindex(), true, __LINE__, __FILE__);
316  FPGAWord tcid;
317  tcid.set(TCIndex_, settings_.nbitstcindex(), true, __LINE__, __FILE__);
318  std::string oss = tcid.str() + "|" + tmp.str() + "|" + resid_[layer - 1].fpgastubid().str() + "|" +
319  resid_[layer - 1].stubptr()->r().str() + "|" + resid_[layer - 1].fpgaphiresid().str() + "|" +
320  resid_[layer - 1].fpgarzresid().str();
321  return oss;
322 }
323 
325  assert(disk > 0 && disk <= N_DISK);
326 
327  FPGAWord tmp;
328  if (trackletIndex_ < 0 || trackletIndex_ > (int)settings_.ntrackletmax()) {
329  throw cms::Exception("BadConfig") << __FILE__ << " " << __LINE__ << " trackletIndex_ = " << trackletIndex_;
330  }
331  tmp.set(trackletIndex_, settings_.nbitstrackletindex(), true, __LINE__, __FILE__);
332  FPGAWord tcid;
333  tcid.set(TCIndex_, settings_.nbitstcindex(), true, __LINE__, __FILE__);
334  const FPGAWord& stubr = resid_[N_LAYER + disk - 1].stubptr()->r();
335  const bool isPS = resid_[N_LAYER + disk - 1].stubptr()->isPSmodule();
336  std::string oss = tcid.str() + "|" + tmp.str() + "|" + resid_[N_LAYER + disk - 1].fpgastubid().str() + "|" +
337  (isPS ? stubr.str() : ("00000000" + stubr.str())) + "|" +
338  resid_[N_LAYER + disk - 1].fpgaphiresid().str() + "|" +
339  resid_[N_LAYER + disk - 1].fpgarzresid().str();
340  return oss;
341 }
342 
343 std::vector<const L1TStub*> Tracklet::getL1Stubs() {
344  std::vector<const L1TStub*> tmp;
345 
346  if (innerFPGAStub_)
347  tmp.push_back(innerFPGAStub_->l1tstub());
348  if (middleFPGAStub_)
349  tmp.push_back(middleFPGAStub_->l1tstub());
350  if (outerFPGAStub_)
351  tmp.push_back(outerFPGAStub_->l1tstub());
352 
353  for (const auto& iresid : resid_) {
354  if (iresid.valid())
355  tmp.push_back(iresid.stubptr()->l1tstub());
356  }
357 
358  return tmp;
359 }
360 
361 std::map<int, int> Tracklet::getStubIDs() {
362  std::map<int, int> stubIDs;
363 
364  // For future reference, *resid_[i] uses i as the absolute stub index. (0-5 for barrel, 0-4 for disk)
365  // On the other hand, proj*_[i] uses i almost like *resid_[i], except the *seeding* layer indices are removed entirely.
366  // E.g. An L3L4 track has 0=L1, 1=L2, 2=L4, 3=L5 for the barrels (for proj*_[i])
367 
368  if (innerFPGAStub_)
370  if (middleFPGAStub_)
372  if (outerFPGAStub_)
374 
375  if (barrel_) {
376  for (int i = 0; i < N_LAYER; i++) {
377  //check barrel
378  if (resid_[i].valid()) {
379  // two extra bits to indicate if the matched stub is local or from neighbor
380  int location = 1; // local
381  location <<= resid_[i].fpgastubid().nbits();
382 
383  stubIDs[1 + i] = resid_[i].fpgastubid().value() + location;
384  }
385 
386  //check disk
387  if (i >= N_DISK)
388  continue; //i=[0..4] for disks
389  if (resid_[N_LAYER + i].valid()) {
390  if (i == 3 && resid_[0].valid() && innerFPGAStub_->layer().value() == 1)
391  continue; // Don't add D4 if track has L1 stub
392  // two extra bits to indicate if the matched stub is local or from neighbor
393  int location = 1; // local
395 
396  if (itfit().value() < 0) {
397  stubIDs[-(N_LAYER + N_DISK) - i] = resid_[N_LAYER + i].fpgastubid().value() + location;
398  } else {
399  stubIDs[N_LAYER + N_DISK + i] = resid_[N_LAYER + i].fpgastubid().value() + location;
400  }
401  }
402  }
403 
404  //get stubs making up tracklet
405  if (innerFPGAStub_)
406  stubIDs[innerFPGAStub_->layer().value() + 1] = innerFPGAStub_->phiregionaddress() + (1 << 10);
407  if (middleFPGAStub_)
408  stubIDs[middleFPGAStub_->layer().value() + 1] = middleFPGAStub_->phiregionaddress() + (1 << 10);
409  if (outerFPGAStub_)
410  stubIDs[outerFPGAStub_->layer().value() + 1] = outerFPGAStub_->phiregionaddress() + (1 << 10);
411 
412  } else if (disk_) {
413  for (int i = 0; i < N_DISK; i++) {
414  //check barrel
415  if (resid_[i].valid()) {
416  // two extra bits to indicate if the matched stub is local or from neighbor
417  int location = 1; // local
418  location <<= resid_[i].fpgastubid().nbits();
419 
420  stubIDs[1 + i] = resid_[i].fpgastubid().value() + location;
421  }
422 
423  //check disks
424  if (i == 4 && resid_[1].valid())
425  continue; // Don't add D5 if track has L2 stub
426  if (resid_[N_LAYER + i].valid()) {
427  // two extra bits to indicate if the matched stub is local or from neighbor
428  int location = 1; // local
430 
431  if (innerFPGAStub_->l1tstub()->disk() < 0) {
432  stubIDs[-11 - i] = resid_[N_LAYER + i].fpgastubid().value() + location;
433  } else {
434  stubIDs[11 + i] = resid_[N_LAYER + i].fpgastubid().value() + location;
435  }
436  }
437  }
438 
439  //get stubs making up tracklet
440  if (innerFPGAStub_->disk().value() < 0) { //negative side runs 6-10
441  if (innerFPGAStub_)
442  stubIDs[innerFPGAStub_->disk().value() - 10] = innerFPGAStub_->phiregionaddress() + (1 << 10);
443  if (middleFPGAStub_)
444  stubIDs[middleFPGAStub_->disk().value() - 10] = middleFPGAStub_->phiregionaddress() + (1 << 10);
445  if (outerFPGAStub_)
446  stubIDs[outerFPGAStub_->disk().value() - 10] = outerFPGAStub_->phiregionaddress() + (1 << 10);
447  } else { // positive side runs 11-15]
448  if (innerFPGAStub_)
449  stubIDs[innerFPGAStub_->disk().value() + 10] = innerFPGAStub_->phiregionaddress() + (1 << 10);
450  if (middleFPGAStub_)
451  stubIDs[middleFPGAStub_->disk().value() + 10] = middleFPGAStub_->phiregionaddress() + (1 << 10);
452  if (outerFPGAStub_)
453  stubIDs[outerFPGAStub_->disk().value() + 10] = outerFPGAStub_->phiregionaddress() + (1 << 10);
454  }
455 
456  } else if (overlap_) {
457  for (int i = 0; i < N_DISK; i++) {
458  //check barrel
459  if (resid_[i].valid()) {
460  // two extra bits to indicate if the matched stub is local or from neighbor
461  int location = 1; // local
462  location <<= resid_[i].fpgastubid().nbits();
463 
464  stubIDs[1 + i] = resid_[i].fpgastubid().value() + location;
465  }
466 
467  //check disks
468  if (resid_[N_LAYER + i].valid()) {
469  // two extra bits to indicate if the matched stub is local or from neighbor
470  int location = 1; // local
472 
473  if (innerFPGAStub_->l1tstub()->disk() < 0) { // if negative overlap
474  if (innerFPGAStub_->layer().value() != 2 || !resid_[0].valid() ||
475  i != 3) { // Don't add D4 if this is an L3L2 track with an L1 stub
476  stubIDs[-11 - i] = resid_[N_LAYER + i].fpgastubid().value() + location;
477  }
478  } else {
479  if (innerFPGAStub_->layer().value() != 2 || !resid_[0].valid() || i != 3) {
480  stubIDs[11 + i] = resid_[N_LAYER + i].fpgastubid().value() + location;
481  }
482  }
483  }
484  }
485 
486  //get stubs making up tracklet
487 
488  if (innerFPGAStub_->layer().value() == 2) { // L3L2 track
489  if (innerFPGAStub_)
490  stubIDs[innerFPGAStub_->layer().value() + 1] = innerFPGAStub_->phiregionaddress() + (1 << 10);
491  if (middleFPGAStub_)
492  stubIDs[middleFPGAStub_->layer().value() + 1] = middleFPGAStub_->phiregionaddress() + (1 << 10);
493  if (outerFPGAStub_)
494  stubIDs[outerFPGAStub_->layer().value() + 1] = outerFPGAStub_->phiregionaddress() + (1 << 10);
495  } else if (innerFPGAStub_->disk().value() < 0) { //negative side runs -11 - -15
496  if (innerFPGAStub_)
497  stubIDs[innerFPGAStub_->disk().value() - 10] = innerFPGAStub_->phiregionaddress() + (1 << 10);
498  if (middleFPGAStub_)
499  stubIDs[middleFPGAStub_->layer().value() + 1] = middleFPGAStub_->phiregionaddress() + (1 << 10);
500  if (outerFPGAStub_)
501  stubIDs[outerFPGAStub_->layer().value() + 1] = outerFPGAStub_->phiregionaddress() + (1 << 10);
502  } else { // positive side runs 11-15]
503  if (innerFPGAStub_)
504  stubIDs[innerFPGAStub_->disk().value() + 10] = innerFPGAStub_->phiregionaddress() + (1 << 10);
505  if (middleFPGAStub_)
506  stubIDs[middleFPGAStub_->layer().value() + 1] = middleFPGAStub_->phiregionaddress() + (1 << 10);
507  if (outerFPGAStub_)
508  stubIDs[outerFPGAStub_->layer().value() + 1] = outerFPGAStub_->phiregionaddress() + (1 << 10);
509  }
510  }
511 
512  return stubIDs;
513 }
514 
515 void Tracklet::setFitPars(double rinvfit,
516  double phi0fit,
517  double d0fit,
518  double tfit,
519  double z0fit,
520  double chisqrphifit,
521  double chisqrzfit,
522  double rinvfitexact,
523  double phi0fitexact,
524  double d0fitexact,
525  double tfitexact,
526  double z0fitexact,
527  double chisqrphifitexact,
528  double chisqrzfitexact,
529  int irinvfit,
530  int iphi0fit,
531  int id0fit,
532  int itfit,
533  int iz0fit,
534  int ichisqrphifit,
535  int ichisqrzfit,
536  int hitpattern,
537  const vector<const L1TStub*>& l1stubs) {
539  chisqrphifit_ = chisqrphifit;
540  chisqrzfit_ = chisqrzfit;
541 
543  chisqrphifitexact_ = chisqrphifitexact;
544  chisqrzfitexact_ = chisqrzfitexact;
545 
546  if (irinvfit > (1 << 14))
547  irinvfit = (1 << 14);
548  if (irinvfit <= -(1 << 14))
549  irinvfit = -(1 << 14) + 1;
550  fpgafitpars_.rinv().set(irinvfit, 15, false, __LINE__, __FILE__);
551  fpgafitpars_.phi0().set(iphi0fit, 19, false, __LINE__, __FILE__);
552  fpgafitpars_.d0().set(id0fit, 19, false, __LINE__, __FILE__);
553  fpgafitpars_.t().set(itfit, 14, false, __LINE__, __FILE__);
554 
555  if (iz0fit >= (1 << (settings_.nbitsz0() - 1))) {
556  iz0fit = (1 << (settings_.nbitsz0() - 1)) - 1;
557  }
558 
559  if (iz0fit <= -(1 << (settings_.nbitsz0() - 1))) {
560  iz0fit = 1 - (1 << (settings_.nbitsz0() - 1));
561  }
562 
563  fpgafitpars_.z0().set(iz0fit, settings_.nbitsz0(), false, __LINE__, __FILE__);
564  ichisqrphifit_.set(ichisqrphifit, 8, true, __LINE__, __FILE__);
565  ichisqrzfit_.set(ichisqrzfit, 8, true, __LINE__, __FILE__);
566 
567  hitpattern_ = hitpattern;
568 
569  fpgatrack_ = std::make_unique<Track>(makeTrack(l1stubs));
570 }
571 
572 const std::string Tracklet::layerstubstr(const unsigned layer) const {
573  assert(layer < N_LAYER);
574 
575  std::stringstream oss("");
576  if (!resid_[layer].valid())
577  oss << "0|0000000|0000000000|0000000|000000000000|000000000";
578  else {
579  if (trackIndex_ < 0 || trackIndex_ > (int)settings_.ntrackletmax()) {
580  cout << "trackIndex_ = " << trackIndex_ << endl;
581  assert(0);
582  }
583  const FPGAWord tmp(trackIndex_, settings_.nbitstrackletindex(), true, __LINE__, __FILE__);
584  oss << "1|"; // valid bit
585  oss << tmp.str() << "|";
586  oss << resid_[layer].fpgastubid().str() << "|";
587  oss << resid_[layer].stubptr()->r().str() << "|";
588  oss << resid_[layer].fpgaphiresid().str() << "|";
589  oss << resid_[layer].fpgarzresid().str();
590  }
591 
592  return oss.str();
593 }
594 
595 const std::string Tracklet::diskstubstr(const unsigned disk) const {
596  assert(disk < N_DISK);
597 
598  std::stringstream oss("");
599  if (!resid_[N_LAYER + disk].valid())
600  oss << "0|0000000|0000000000|000000000000|000000000000|0000000";
601  else {
602  if (trackIndex_ < 0 || trackIndex_ > (int)settings_.ntrackletmax()) {
603  cout << "trackIndex_ = " << trackIndex_ << endl;
604  assert(0);
605  }
606  const FPGAWord tmp(trackIndex_, settings_.nbitstrackletindex(), true, __LINE__, __FILE__);
607  const FPGAWord& stubr = resid_[N_LAYER + disk].stubptr()->r();
608  const bool isPS = resid_[N_LAYER + disk].stubptr()->isPSmodule();
609  oss << "1|"; // valid bit
610  oss << tmp.str() << "|";
611  oss << resid_[N_LAYER + disk].fpgastubid().str() << "|";
612  oss << (isPS ? stubr.str() : ("00000000" + stubr.str())) << "|";
613  oss << resid_[N_LAYER + disk].fpgaphiresid().str() << "|";
614  oss << resid_[N_LAYER + disk].fpgarzresid().str();
615  }
616 
617  return oss.str();
618 }
619 
621  const unsigned maxNHits = 8;
622  const unsigned nBitsPerHit = 3;
623  vector<string> stub(maxNHits, "0");
624  string hitmap(maxNHits * nBitsPerHit, '0');
625 
626  // Assign stub strings for each of the possible projections for each seed.
627  // The specific layers/disks for a given seed are determined by the wiring.
628  switch (seedIndex()) {
629  case 0: // L1L2
630  stub[0] = layerstubstr(2); // L3
631  stub[1] = layerstubstr(3); // L4
632  stub[2] = layerstubstr(4); // L5
633  stub[3] = layerstubstr(5); // L6
634 
635  stub[4] = diskstubstr(0); // D1
636  stub[5] = diskstubstr(1); // D2
637  stub[6] = diskstubstr(2); // D3
638  stub[7] = diskstubstr(3); // D4
639 
640  break;
641 
642  case 1: // L2L3
643  stub[0] = layerstubstr(0); // L1
644  stub[1] = layerstubstr(3); // L4
645  stub[2] = layerstubstr(4); // L5
646 
647  stub[3] = diskstubstr(0); // D1
648  stub[4] = diskstubstr(1); // D2
649  stub[5] = diskstubstr(2); // D3
650  stub[6] = diskstubstr(3); // D4
651 
652  break;
653 
654  case 2: // L3L4
655  stub[0] = layerstubstr(0); // L1
656  stub[1] = layerstubstr(1); // L2
657  stub[2] = layerstubstr(4); // L5
658  stub[3] = layerstubstr(5); // L6
659 
660  stub[4] = diskstubstr(0); // D1
661  stub[5] = diskstubstr(1); // D2
662 
663  break;
664 
665  case 3: // L5L6
666  stub[0] = layerstubstr(0); // L1
667  stub[1] = layerstubstr(1); // L2
668  stub[2] = layerstubstr(2); // L3
669  stub[3] = layerstubstr(3); // L4
670 
671  break;
672 
673  case 4: // D1D2
674  stub[0] = layerstubstr(0); // L1
675  stub[1] = layerstubstr(1); // L2
676 
677  stub[2] = diskstubstr(2); // D3
678  stub[3] = diskstubstr(3); // D4
679  stub[4] = diskstubstr(4); // D5
680 
681  break;
682 
683  case 5: // D3D4
684  stub[0] = layerstubstr(0); // L1
685 
686  stub[1] = diskstubstr(0); // D1
687  stub[2] = diskstubstr(1); // D2
688  stub[3] = diskstubstr(4); // D5
689 
690  break;
691 
692  case 6: // L1D1
693  stub[0] = diskstubstr(1); // D2
694  stub[1] = diskstubstr(2); // D3
695  stub[2] = diskstubstr(3); // D4
696  stub[3] = diskstubstr(4); // D5
697 
698  break;
699 
700  case 7: // L2D1
701  stub[0] = layerstubstr(0); // L1
702 
703  stub[1] = diskstubstr(1); // D2
704  stub[2] = diskstubstr(2); // D3
705  stub[3] = diskstubstr(3); // D4
706 
707  break;
708  }
709 
710  // Only one hit per layer/disk is allowed currently, so the hit map for a
711  // given layer/disk is just equal to the valid bit of the corresponding stub
712  // string, which is the first character.
713  for (unsigned i = 0; i < maxNHits; i++)
714  hitmap[i * nBitsPerHit + 2] = stub[i][0];
715 
716  std::string oss("");
717  //Binary print out
718  if (!settings_.writeoutReal()) {
719  const FPGAWord tmp(getISeed(), settings_.nbitsseed(), true, __LINE__, __FILE__);
720 
721  oss += "1|"; // valid bit
722  oss += tmp.str() + "|";
723  oss += fpgapars_.rinv().str() + "|";
724  oss += fpgapars_.phi0().str() + "|";
725  oss += fpgapars_.z0().str() + "|";
726  oss += fpgapars_.t().str() + "|";
727  oss += hitmap;
728  for (unsigned i = 0; i < maxNHits; i++)
729  // If a valid stub string was never assigned, then that stub is not
730  // included in the output.
731  if (stub[i] != "0")
732  oss += "|" + stub[i];
733  }
734 
735  return oss;
736 }
737 
738 // Create a Track object from stubs & digitized track helix params
739 
740 Track Tracklet::makeTrack(const vector<const L1TStub*>& l1stubs) {
741  assert(fit());
742 
743  // Digitized track helix params
744  TrackPars<int> ipars(fpgafitpars_.rinv().value(),
745  fpgafitpars_.phi0().value(),
746  fpgafitpars_.d0().value(),
747  fpgafitpars_.t().value(),
748  fpgafitpars_.z0().value());
749 
750  // If fitter produced no stub list, take it from original tracklet.
751  vector<const L1TStub*> tmp = l1stubs.empty() ? getL1Stubs() : l1stubs;
752 
753  vector<L1TStub> tmp2;
754 
755  tmp2.reserve(tmp.size());
756  for (auto stub : tmp) {
757  tmp2.push_back(*stub);
758  }
759 
760  Track tmpTrack(ipars,
764  chisqrzfit_,
765  hitpattern_,
766  getStubIDs(),
767  tmp2,
768  getISeed());
769 
770  return tmpTrack;
771 }
772 
773 int Tracklet::layer() const {
774  int l1 = (innerFPGAStub_ && innerFPGAStub_->layerdisk() < N_LAYER) ? innerFPGAStub_->l1tstub()->layerdisk() + 1 : 999,
776  : 999,
778  l = min(min(l1, l2), l3);
779  return (l < 999 ? l : 0);
780 }
781 
782 int Tracklet::disk() const {
783  int d1 = (innerFPGAStub_ && (innerFPGAStub_->layerdisk() >= N_LAYER)) ? innerFPGAStub_->l1tstub()->disk() : 999,
785  d3 = (outerFPGAStub_ && (outerFPGAStub_->layerdisk() >= N_LAYER)) ? outerFPGAStub_->l1tstub()->disk() : 999,
786  d = 999;
787  if (abs(d1) < min(abs(d2), abs(d3)))
788  d = d1;
789  if (abs(d2) < min(abs(d1), abs(d3)))
790  d = d2;
791  if (abs(d3) < min(abs(d1), abs(d2)))
792  d = d3;
793  return (d < 999 ? d : 0);
794 }
795 
796 void Tracklet::setTrackletIndex(unsigned int index) {
799 }
800 
801 int Tracklet::getISeed() const {
802  const int iSeed = TCIndex_ >> settings_.nbitsitc();
803  assert(iSeed >= 0 && iSeed <= (int)N_SEED);
804  return iSeed;
805 }
806 
807 int Tracklet::getITC() const {
808  const int iSeed = getISeed(), iTC = TCIndex_ - (iSeed << settings_.nbitsitc());
809  assert(iTC >= 0 && iTC <= 14);
810  return iTC;
811 }
812 
814  trackIndex_ = index;
815  assert(index <= (int)settings_.ntrackletmax());
816 }
817 
818 int Tracklet::trackIndex() const { return trackIndex_; }
TrackPars< FPGAWord > fpgapars_
Definition: Tracklet.h:244
unsigned int seedIndex() const
Definition: Tracklet.h:224
double d0fitexact() const
Definition: Tracklet.h:147
double kz() const
Definition: Settings.h:314
double t() const
Definition: Tracklet.h:123
const FPGAWord & fpgafinerzvm() const
Definition: Projection.h:69
const Stub * innerFPGAStub()
Definition: Tracklet.h:61
const FPGAWord & iz0fit() const
Definition: Tracklet.h:155
Projection proj_[N_LAYER+N_DISK]
Definition: Tracklet.h:270
unsigned int layer() const
Definition: L1TStub.h:45
constexpr int N_DISK
Definition: Settings.h:22
const FPGAWord & r() const
Definition: Stub.h:60
double rinvfitexact() const
Definition: Tracklet.h:145
std::string fullmatchdiskstr(int disk)
Definition: Tracklet.cc:324
double d0fit() const
Definition: Tracklet.h:140
const Stub * outerFPGAStub()
Definition: Tracklet.h:65
int disk() const
Definition: Tracklet.cc:782
const std::string layerstubstr(const unsigned layer) const
Definition: Tracklet.cc:572
unsigned int nbitstrackletindex() const
Definition: Settings.h:281
std::string fullmatchstr(int layer)
Definition: Tracklet.cc:308
int trackIndex() const
Definition: Tracklet.cc:818
const FPGAWord & fpgastubid() const
Definition: Residual.h:42
constexpr unsigned int N_SEED
Definition: Settings.h:24
const FPGAWord & fpgarzbin2projvm() const
Definition: Projection.h:64
std::string trackfitstr() const
Definition: Tracklet.cc:620
const FPGAWord & fpgarzprojder() const
Definition: Projection.h:54
double tfit() const
Definition: Tracklet.h:141
std::string vmstrlayer(int layer, unsigned int allstubindex)
Definition: Tracklet.cc:209
const FPGAWord & fpgaphiresid() const
Definition: Residual.h:32
unsigned int nbitsseed() const
Definition: Settings.h:285
double phi0() const
Definition: Tracklet.h:121
std::string to_string(const V &value)
Definition: OMSAccess.h:77
int getITC() const
Definition: Tracklet.cc:807
double kd0pars() const
Definition: Settings.h:404
double ktpars() const
Definition: Settings.h:402
double chisqrzfit_
Definition: Tracklet.h:260
double krinvpars() const
Definition: Settings.h:397
TrackPars< double > trackparsapprox_
Definition: Tracklet.h:247
void init(Settings const &settings, unsigned int layerdisk, int iphiresid, int irzresid, int istubid, double phiresid, double rzresid, double phiresidapprox, double rzresidapprox, const Stub *stubptr)
Definition: Residual.cc:7
std::string phiregionaddressstr() const
Definition: Stub.cc:117
std::string vmstrdisk(int disk, unsigned int allstubindex)
Definition: Tracklet.cc:244
void setTrackIndex(int index)
Definition: Tracklet.cc:813
assert(be >=bs)
unsigned int nbitsd0() const
Definition: Settings.h:321
double chisqrzfitexact_
Definition: Tracklet.h:264
std::vector< const L1TStub * > getL1Stubs()
Definition: Tracklet.cc:343
const FPGAWord & iphi0fit() const
Definition: Tracklet.h:152
const FPGAWord & fpgaphiproj() const
Definition: Projection.h:39
Settings const & settings_
Definition: Tracklet.h:274
FPGAWord ichisqrzfit_
Definition: Tracklet.h:256
double kphi0pars() const
Definition: Settings.h:401
const FPGAWord & disk() const
Definition: Stub.h:68
bool fit() const
Definition: Tracklet.h:197
FPGAWord ichisqrphifit_
Definition: Tracklet.h:255
void addMatch(unsigned int layerdisk, int ideltaphi, int ideltarz, double dphi, double drz, double dphiapprox, double drzapprox, int stubid, const trklet::Stub *stubptr)
Definition: Tracklet.cc:295
unsigned int projlayers(unsigned int iSeed, unsigned int i) const
Definition: Settings.h:155
std::string addressstr()
Definition: Tracklet.cc:177
TrackPars< double > fitpars_
Definition: Tracklet.h:258
int nbitst() const
Definition: Settings.h:348
const FPGAWord & fpgarzresid() const
Definition: Residual.h:37
const Stub * middleFPGAStub()
Definition: Tracklet.h:63
double phi0approx() const
Definition: Tracklet.h:127
const FPGAWord & getBendIndex() const
Definition: Projection.h:121
double z0fitexact() const
Definition: Tracklet.h:149
const FPGAWord & id0fit() const
Definition: Tracklet.h:153
double rinv() const
Definition: Tracklet.h:120
TrackPars< FPGAWord > fpgafitpars_
Definition: Tracklet.h:254
int projdisk_[N_DISK]
Definition: Tracklet.h:251
int projlayer_[N_LAYER - 2]
Definition: Tracklet.h:250
int nbitsrinv() const
Definition: Settings.h:346
unsigned int seedIndex_
Definition: Tracklet.h:227
std::string trackletprojstr(int layer) const
Definition: Tracklet.cc:259
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
std::unique_ptr< Track > fpgatrack_
Definition: Tracklet.h:268
unsigned int phiregionaddress() const
Definition: Stub.cc:112
int value() const
Definition: FPGAWord.h:24
double tfitexact() const
Definition: Tracklet.h:148
int layerdisk() const
Definition: L1TStub.h:112
double tapprox() const
Definition: Tracklet.h:129
L1TStub * l1tstub()
Definition: Stub.h:77
int disk() const
Definition: L1TStub.h:46
unsigned int projdisks(unsigned int iSeed, unsigned int i) const
Definition: Settings.h:156
unsigned int nbitsitc() const
Definition: Settings.h:284
double phi0fitexact() const
Definition: Tracklet.h:146
Log< level::Warning, true > LogPrint
unsigned int layerdisk() const
Definition: Stub.cc:185
d
Definition: ztail.py:151
const FPGAWord & fpgarzbin1projvm() const
Definition: Projection.h:59
const FPGAWord & fpgaphiprojder() const
Definition: Projection.h:49
unsigned int nbitstcindex() const
Definition: Settings.h:286
const FPGAWord & stubindex() const
Definition: Stub.h:66
std::string trackletprojstrD(int disk) const
Definition: Tracklet.cc:275
double rinvapprox() const
Definition: Tracklet.h:126
Residual resid_[N_LAYER+N_DISK]
Definition: Tracklet.h:272
double d0() const
Definition: Tracklet.h:122
static constexpr float d0
const std::string diskstubstr(const unsigned disk) const
Definition: Tracklet.cc:595
bool stubtruthmatch(const L1TStub *stub)
Definition: Tracklet.cc:138
double z0approx() const
Definition: Tracklet.h:130
int nbits() const
Definition: FPGAWord.h:25
void setTrackletIndex(unsigned int index)
Definition: Tracklet.cc:796
double rinv(double phi1, double phi2, double r1, double r2)
Definition: Util.h:49
int getISeed() const
Definition: Tracklet.cc:801
double z0fit() const
Definition: Tracklet.h:142
void set(int value, int nbits, bool positive=true, int line=-1, const char *file=nullptr)
Definition: FPGAWord.cc:14
bool isPSmodule() const
Definition: Stub.h:71
const Stub * stubptr() const
Definition: Residual.h:67
const FPGAWord & fpgarzproj() const
Definition: Projection.h:44
double d0approx() const
Definition: Tracklet.h:128
TrackPars< double > fitparsexact_
Definition: Tracklet.h:262
bool valid() const
Definition: Residual.h:30
bool extended() const
Definition: Settings.h:256
double z0() const
Definition: Tracklet.h:124
const FPGAWord & itfit() const
Definition: Tracklet.h:154
bool writeoutReal() const
Definition: Settings.h:205
const Stub * outerFPGAStub_
Definition: Tracklet.h:237
unsigned int ntrackletmax() const
Definition: Settings.h:343
std::string trackletparstr()
Definition: Tracklet.cc:188
void setFitPars(double rinvfit, double phi0fit, double d0fit, double tfit, double z0fit, double chisqrphifit, double chisqrzfit, double rinvfitexact, double phi0fitexact, double d0fitexact, double tfitexact, double z0fitexact, double chisqrphifitexact, double chisqrzfitexact, int irinvfit, int iphi0fit, int id0fit, int itfit, int iz0fit, int ichisqrphifit, int ichisqrzfit, int hitpattern, const std::vector< const L1TStub *> &l1stubs=std::vector< const L1TStub *>())
Definition: Tracklet.cc:515
Track makeTrack(const std::vector< const L1TStub *> &l1stubs)
Definition: Tracklet.cc:740
const FPGAWord & fpgafinephivm() const
Definition: Projection.h:74
const Stub * innerFPGAStub_
Definition: Tracklet.h:235
const FPGAWord & layer() const
Definition: Stub.h:67
const Stub * middleFPGAStub_
Definition: Tracklet.h:236
int layer() const
Definition: Tracklet.cc:773
static constexpr float d1
unsigned int PSseed() const
Definition: Tracklet.h:222
int nbitsphi0() const
Definition: Settings.h:347
#define str(s)
tmp
align.sh
Definition: createJobs.py:716
TrackPars< double > trackpars_
Definition: Tracklet.h:246
int nbitsz0() const
Definition: Settings.h:349
double chisqrphifitexact_
Definition: Tracklet.h:263
const FPGAWord & irinvfit() const
Definition: Tracklet.h:151
std::string str() const
Definition: FPGAWord.cc:54
double phi0fit() const
Definition: Tracklet.h:139
double rinvfit() const
Definition: Tracklet.h:138
constexpr unsigned int N_BITSMEMADDRESS
Definition: Settings.h:39
double chisqrphifit_
Definition: Tracklet.h:259
void init(T rinv, T phi0, T d0, T t, T z0)
Definition: TrackPars.h:21
constexpr int N_LAYER
Definition: Settings.h:21
std::map< int, int > getStubIDs()
Definition: Tracklet.cc:361
std::vector< int > tps() const
Definition: L1TStub.h:81