CMS 3D CMS Logo

MatchCalculator.cc
Go to the documentation of this file.
11 
15 
16 #include <filesystem>
17 
18 using namespace std;
19 using namespace trklet;
20 
21 MatchCalculator::MatchCalculator(string name, Settings const& settings, Globals* global)
22  : ProcessBase(name, settings, global),
23  phimatchcuttable_(settings),
24  zmatchcuttable_(settings),
25  rphicutPStable_(settings),
26  rphicut2Stable_(settings),
27  rcutPStable_(settings),
28  rcut2Stable_(settings) {
29  phiregion_ = name[8] - 'A';
31 
32  fullMatches_.resize(12, nullptr);
33 
34  //TODO - need to sort out constants here
35  icorrshift_ = 7;
36 
37  if (layerdisk_ < N_PSLAYER) {
39  } else {
41  }
42  phi0shift_ = 3;
43  fact_ = 1;
44  if (layerdisk_ >= N_PSLAYER && layerdisk_ < N_LAYER) {
45  fact_ = (1 << (settings_.nzbitsstub(0) - settings_.nzbitsstub(5)));
49  phi0shift_ = 0;
50  }
51 
52  unsigned int region = getName()[8] - 'A';
54 
55  if (layerdisk_ < N_LAYER) {
56  phimatchcuttable_.initmatchcut(layerdisk_, TrackletLUT::MatchType::barrelphi, region);
57  zmatchcuttable_.initmatchcut(layerdisk_, TrackletLUT::MatchType::barrelz, region);
58  } else {
59  rphicutPStable_.initmatchcut(layerdisk_, TrackletLUT::MatchType::diskPSphi, region);
60  rphicut2Stable_.initmatchcut(layerdisk_, TrackletLUT::MatchType::disk2Sphi, region);
61  rcutPStable_.initmatchcut(layerdisk_, TrackletLUT::MatchType::diskPSr, region);
62  rcut2Stable_.initmatchcut(layerdisk_, TrackletLUT::MatchType::disk2Sr, region);
63  }
64 
65  for (unsigned int i = 0; i < N_DSS_MOD * 2; i++) {
67  (1 << (settings_.nbitsalpha() - 1)) / (settings_.rDSSinner(i) * settings_.rDSSinner(i)) /
68  settings_.kphi();
70  (1 << (settings_.nbitsalpha() - 1)) / (settings_.rDSSouter(i) * settings_.rDSSouter(i)) /
71  settings_.kphi();
72  }
73 }
74 
76  if (settings_.writetrace()) {
77  edm::LogVerbatim("Tracklet") << "In " << name_ << " adding output to " << memory->getName() << " to output "
78  << output;
79  }
80  if (output.substr(0, 8) == "matchout") {
81  auto* tmp = dynamic_cast<FullMatchMemory*>(memory);
82  assert(tmp != nullptr);
83  unsigned int iSeed = getISeed(memory->getName());
84  fullMatches_[iSeed] = tmp;
85  return;
86  }
87  throw cms::Exception("BadConfig") << __FILE__ << " " << __LINE__ << " could not find output " << output;
88 }
89 
91  if (settings_.writetrace()) {
92  edm::LogVerbatim("Tracklet") << "In " << name_ << " adding input from " << memory->getName() << " to input "
93  << input;
94  }
95  if (input == "allstubin") {
96  auto* tmp = dynamic_cast<AllStubsMemory*>(memory);
97  assert(tmp != nullptr);
98  allstubs_ = tmp;
99  return;
100  }
101  if (input == "allprojin") {
102  auto* tmp = dynamic_cast<AllProjectionsMemory*>(memory);
103  assert(tmp != nullptr);
104  allprojs_ = tmp;
105  return;
106  }
107  if (input.substr(0, 5) == "match" && input.substr(input.size() - 2, 2) == "in") {
108  auto* tmp = dynamic_cast<CandidateMatchMemory*>(memory);
109  assert(tmp != nullptr);
110  matches_.push_back(tmp);
111  return;
112  }
113  throw cms::Exception("BadConfig") << __FILE__ << " " << __LINE__ << " could not find input " << input;
114 }
115 
116 void MatchCalculator::execute(double phioffset) {
117  unsigned int countall = 0;
118  unsigned int countsel = 0;
119 
120  Tracklet* oldTracklet = nullptr;
121 
122  std::vector<std::pair<std::pair<Tracklet*, int>, const Stub*> > mergedMatches = mergeMatches(matches_);
123 
124  for (unsigned int j = 0; j < mergedMatches.size(); j++) {
125  if (settings_.debugTracklet() && j == 0) {
126  edm::LogVerbatim("Tracklet") << getName() << " has " << mergedMatches.size() << " candidate matches";
127  }
128 
129  countall++;
130 
131  const Stub* fpgastub = mergedMatches[j].second;
132  Tracklet* tracklet = mergedMatches[j].first.first;
133  const L1TStub* stub = fpgastub->l1tstub();
134 
135  //check that the matches are orderd correctly
136  //allow equal here since we can have more than one cadidate match per tracklet projection
137  if (oldTracklet != nullptr) {
138  assert(oldTracklet->TCID() <= tracklet->TCID());
139  }
140  oldTracklet = tracklet;
141 
142  if (layerdisk_ < N_LAYER) {
143  //Integer calculation
144 
145  const Projection& proj = tracklet->proj(layerdisk_);
146 
147  int ir = fpgastub->r().value();
148  int iphi = proj.fpgaphiproj().value();
149  int icorr = (ir * proj.fpgaphiprojder().value()) >> icorrshift_;
150  iphi += icorr;
151 
152  int iz = proj.fpgarzproj().value();
153  int izcor = (ir * proj.fpgarzprojder().value() + (1 << (icorzshift_ - 1))) >> icorzshift_;
154  iz += izcor;
155 
156  int ideltaz = fpgastub->z().value() - iz;
157  int ideltaphi = (fpgastub->phi().value() << phi0shift_) - (iphi << (settings_.phi0bitshift() - 1 + phi0shift_));
158 
159  //Floating point calculations
160 
161  double phi = stub->phi() - phioffset;
162  double r = stub->r();
163  double z = stub->z();
164 
165  if (settings_.useapprox()) {
166  double dphi = reco::reduceRange(phi - fpgastub->phiapprox(0.0, 0.0));
167  assert(std::abs(dphi) < 0.001);
168  phi = fpgastub->phiapprox(0.0, 0.0);
169  z = fpgastub->zapprox();
170  r = fpgastub->rapprox();
171  }
172 
173  if (phi < 0)
174  phi += 2 * M_PI;
175 
176  double dr = r - settings_.rmean(layerdisk_);
178 
179  double dphi = reco::reduceRange(phi - (proj.phiproj() + dr * proj.phiprojder()));
180 
181  double dz = z - (proj.rzproj() + dr * proj.rzprojder());
182 
183  double dphiapprox = reco::reduceRange(phi - (proj.phiprojapprox() + dr * proj.phiprojderapprox()));
184 
185  double dzapprox = z - (proj.rzprojapprox() + dr * proj.rzprojderapprox());
186 
187  int seedindex = tracklet->getISeed();
188 
189  assert(phimatchcuttable_.lookup(seedindex) > 0);
190  assert(zmatchcuttable_.lookup(seedindex) > 0);
191 
192  if (settings_.bookHistos()) {
193  bool truthmatch = tracklet->stubtruthmatch(stub);
194 
196  hists->FillLayerResidual(layerdisk_ + 1,
197  seedindex,
198  dphiapprox * settings_.rmean(layerdisk_),
199  ideltaphi * settings_.kphi1() * settings_.rmean(layerdisk_),
200  ideltaz * fact_ * settings_.kz(),
201  dz,
202  truthmatch);
203  }
204 
205  //This would catch significant consistency problems in the configuration - helps to debug if there are problems.
206  if (std::abs(dphi) > 0.5 * settings_.dphisectorHG() || std::abs(dphiapprox) > 0.5 * settings_.dphisectorHG()) {
207  throw cms::Exception("LogicError")
208  << "WARNING dphi and/or dphiapprox too large : " << dphi << " " << dphiapprox << endl;
209  }
210 
211  if (settings_.writeMonitorData("Residuals")) {
212  double pt = 0.01 * settings_.c() * settings_.bfield() / std::abs(tracklet->rinv());
213 
214  globals_->ofstream("layerresiduals.txt")
215  << layerdisk_ + 1 << " " << seedindex << " " << pt << " "
216  << ideltaphi * settings_.kphi1() * settings_.rmean(layerdisk_) << " "
217  << dphiapprox * settings_.rmean(layerdisk_) << " "
218  << phimatchcuttable_.lookup(seedindex) * settings_.kphi1() * settings_.rmean(layerdisk_) << " "
219  << ideltaz * fact_ * settings_.kz() << " " << dz << " "
220  << zmatchcuttable_.lookup(seedindex) * settings_.kz() << endl;
221  }
222 
223  bool imatch = (std::abs(ideltaphi) <= (int)phimatchcuttable_.lookup(seedindex)) &&
224  (std::abs(ideltaz * fact_) <= (int)zmatchcuttable_.lookup(seedindex));
225 
226  if (settings_.debugTracklet()) {
227  edm::LogVerbatim("Tracklet") << getName() << " imatch = " << imatch << " ideltaphi cut " << ideltaphi << " "
228  << phimatchcuttable_.lookup(seedindex) << " ideltaz*fact cut " << ideltaz * fact_
229  << " " << zmatchcuttable_.lookup(seedindex);
230  }
231 
232  if (imatch) {
233  countsel++;
234 
235  tracklet->addMatch(layerdisk_,
236  ideltaphi,
237  ideltaz,
238  dphi,
239  dz,
240  dphiapprox,
241  dzapprox,
242  (phiregion_ << 7) + fpgastub->stubindex().value(),
243  mergedMatches[j].second);
244 
245  if (settings_.debugTracklet()) {
246  edm::LogVerbatim("Tracklet") << "Accepted full match in layer " << getName() << " " << tracklet;
247  }
248 
249  fullMatches_[seedindex]->addMatch(tracklet, mergedMatches[j].second);
250  }
251  } else { //disk matches
252 
253  //check that stubs and projections in same half of detector
254  assert(stub->z() * tracklet->t() > 0.0);
255 
256  int sign = (tracklet->t() > 0.0) ? 1 : -1;
257  int disk = sign * (layerdisk_ - (N_LAYER - 1));
258  assert(disk != 0);
259 
260  //Perform integer calculations here
261 
262  const Projection& proj = tracklet->proj(layerdisk_);
263 
264  int iz = fpgastub->z().value();
265  int iphi = proj.fpgaphiproj().value();
266 
267  //TODO - need to express interms of constants
268  int shifttmp = 6;
269  int iphicorr = (iz * proj.fpgaphiprojder().value()) >> shifttmp;
270 
271  iphi += iphicorr;
272 
273  int ir = proj.fpgarzproj().value();
274 
275  //TODO - need to express interms of constants
276  int shifttmp2 = 7;
277  int ircorr = (iz * proj.fpgarzprojder().value()) >> shifttmp2;
278 
279  ir += ircorr;
280 
281  int ideltaphi = fpgastub->phi().value() * settings_.kphi() / settings_.kphi() - iphi;
282 
283  int irstub = fpgastub->r().value();
284  int ialphafact = 0;
285  if (!stub->isPSmodule()) {
286  assert(irstub < (int)N_DSS_MOD * 2);
287  if (abs(disk) <= 2) {
288  ialphafact = ialphafactinner_[irstub];
289  irstub = settings_.rDSSinner(irstub) / settings_.kr();
290  } else {
291  ialphafact = ialphafactouter_[irstub];
292  irstub = settings_.rDSSouter(irstub) / settings_.kr();
293  }
294  }
295 
296  //TODO stub and projection r should not use different # bits...
297  int ideltar = (irstub >> 1) - ir;
298 
299  if (!stub->isPSmodule()) {
300  int ialpha = fpgastub->alpha().value();
301  int iphialphacor = ((ideltar * ialpha * ialphafact) >> settings_.alphashift());
302  ideltaphi += iphialphacor;
303  }
304 
305  //Perform floating point calculations here
306 
307  double phi = stub->phi() - phioffset;
308  double z = stub->z();
309  double r = stub->r();
310 
311  if (settings_.useapprox()) {
312  double dphi = reco::reduceRange(phi - fpgastub->phiapprox(0.0, 0.0));
313  assert(std::abs(dphi) < 0.001);
314  phi = fpgastub->phiapprox(0.0, 0.0);
315  z = fpgastub->zapprox();
316  r = fpgastub->rapprox();
317  }
318 
319  if (phi < 0)
320  phi += 2 * M_PI;
321 
322  double dz = z - sign * settings_.zmean(layerdisk_ - N_LAYER);
323 
324  if (std::abs(dz) > settings_.dzmax()) {
325  throw cms::Exception("LogicError") << __FILE__ << " " << __LINE__ << " " << name_ << " " << tracklet->getISeed()
326  << "\n stub " << stub->z() << " disk " << disk << " " << dz;
327  }
328 
329  double phiproj = proj.phiproj() + dz * proj.phiprojder();
330 
331  double rproj = proj.rzproj() + dz * proj.rzprojder();
332 
333  double deltar = r - rproj;
334 
335  double dr = stub->r() - rproj;
336 
337  double dphi = reco::reduceRange(phi - phiproj);
338 
339  double dphiapprox = reco::reduceRange(phi - (proj.phiprojapprox() + dz * proj.phiprojderapprox()));
340 
341  double drapprox = stub->r() - (proj.rzprojapprox() + dz * proj.rzprojderapprox());
342 
343  double drphi = dphi * stub->r();
344  double drphiapprox = dphiapprox * stub->r();
345 
346  if (!stub->isPSmodule()) {
347  double alphanorm = stub->alphanorm();
348  dphi += dr * alphanorm * settings_.half2SmoduleWidth() / stub->r2();
349  dphiapprox += drapprox * alphanorm * settings_.half2SmoduleWidth() / stub->r2();
350 
351  drphi += dr * alphanorm * settings_.half2SmoduleWidth() / stub->r();
352  drphiapprox += dr * alphanorm * settings_.half2SmoduleWidth() / stub->r();
353  }
354 
355  int seedindex = tracklet->getISeed();
356 
357  int idrphicut = rphicutPStable_.lookup(seedindex);
358  int idrcut = rcutPStable_.lookup(seedindex);
359  if (!stub->isPSmodule()) {
360  idrphicut = rphicut2Stable_.lookup(seedindex);
361  idrcut = rcut2Stable_.lookup(seedindex);
362  }
363 
364  double drphicut = idrphicut * settings_.kphi() * settings_.kr();
365  double drcut = idrcut * settings_.krprojshiftdisk();
366 
367  bool match, imatch;
368  if (std::abs(dphi) < third * settings_.dphisectorHG() &&
369  std::abs(dphiapprox) < third * settings_.dphisectorHG()) { //1/3 of sector size to catch errors
370  if (settings_.writeMonitorData("Residuals")) {
371  double pt = 0.01 * settings_.c() * settings_.bfield() / std::abs(tracklet->rinv());
372 
373  globals_->ofstream("diskresiduals.txt")
374  << disk << " " << stub->isPSmodule() << " " << tracklet->layer() << " " << abs(tracklet->disk()) << " "
375  << pt << " " << ideltaphi * settings_.kphi() * stub->r() << " " << drphiapprox << " " << drphicut << " "
376  << ideltar * settings_.krprojshiftdisk() << " " << deltar << " " << drcut << " " << endl;
377  }
378 
379  match = (std::abs(drphi) < drphicut) && (std::abs(deltar) < drcut);
380 
381  imatch = (std::abs(ideltaphi * irstub) < idrphicut) && (std::abs(ideltar) < idrcut);
382  } else {
383  edm::LogProblem("Tracklet") << "WARNING dphi and/or dphiapprox too large : " << dphi << " " << dphiapprox
384  << "dphi " << dphi << " Seed / ISeed " << tracklet->getISeed() << endl;
385  match = false;
386  imatch = false;
387  }
388  if (settings_.debugTracklet()) {
389  edm::LogVerbatim("Tracklet") << "imatch match disk: " << imatch << " " << match << " " << std::abs(ideltaphi)
390  << " " << drphicut / (settings_.kphi() * stub->r()) << " " << std::abs(ideltar)
391  << " " << drcut / settings_.krprojshiftdisk() << " r = " << stub->r();
392  }
393 
394  if (imatch) {
395  countsel++;
396 
397  if (settings_.debugTracklet()) {
398  edm::LogVerbatim("Tracklet") << "MatchCalculator found match in disk " << getName();
399  }
400 
401  tracklet->addMatch(layerdisk_,
402  ideltaphi,
403  ideltar,
404  drphi / stub->r(),
405  dr,
406  drphiapprox / stub->r(),
407  drapprox,
408  (phiregion_ << 7) + fpgastub->stubindex().value(),
409  fpgastub);
410 
411  if (settings_.debugTracklet()) {
412  edm::LogVerbatim("Tracklet") << "Accepted full match in disk " << getName() << " " << tracklet;
413  }
414 
415  fullMatches_[seedindex]->addMatch(tracklet, mergedMatches[j].second);
416  }
417  }
418  if (countall >= settings_.maxStep("MC"))
419  break;
420  }
421 
422  if (settings_.writeMonitorData("MC")) {
423  globals_->ofstream("matchcalculator.txt") << getName() << " " << countall << " " << countsel << endl;
424  }
425 }
426 
427 std::vector<std::pair<std::pair<Tracklet*, int>, const Stub*> > MatchCalculator::mergeMatches(
428  vector<CandidateMatchMemory*>& candmatch) {
429  std::vector<std::pair<std::pair<Tracklet*, int>, const Stub*> > tmp;
430 
431  std::vector<unsigned int> indexArray;
432  indexArray.reserve(candmatch.size());
433  for (unsigned int i = 0; i < candmatch.size(); i++) {
434  indexArray.push_back(0);
435  }
436 
437  int bestIndex = -1;
438  do {
439  int bestSector = 100;
440  int bestTCID = -1;
441  bestIndex = -1;
442  for (unsigned int i = 0; i < candmatch.size(); i++) {
443  if (indexArray[i] >= candmatch[i]->nMatches()) {
444  // skip as we were at the end
445  continue;
446  }
447  int TCID = candmatch[i]->getMatch(indexArray[i]).first.first->TCID();
448  int dSector = 0;
449  if (dSector > 2)
450  dSector -= N_SECTOR;
451  if (dSector < -2)
452  dSector += N_SECTOR;
453  assert(abs(dSector) < 2);
454  if (dSector == -1)
455  dSector = 2;
456  if (dSector < bestSector) {
457  bestSector = dSector;
458  bestTCID = TCID;
459  bestIndex = i;
460  }
461  if (dSector == bestSector) {
462  if (TCID < bestTCID || bestTCID < 0) {
463  bestTCID = TCID;
464  bestIndex = i;
465  }
466  }
467  }
468  if (bestIndex != -1) {
469  tmp.push_back(candmatch[bestIndex]->getMatch(indexArray[bestIndex]));
470  indexArray[bestIndex]++;
471  }
472  } while (bestIndex != -1);
473 
474  if (layerdisk_ < N_LAYER) {
475  int lastTCID = -1;
476  bool error = false;
477 
478  //Allow equal TCIDs since we can have multiple candidate matches
479  for (unsigned int i = 1; i < tmp.size(); i++) {
480  if (lastTCID > tmp[i].first.first->TCID()) {
481  edm::LogProblem("Tracklet") << "Wrong TCID ordering for projections in " << getName() << " last " << lastTCID
482  << " " << tmp[i].first.first->TCID();
483  error = true;
484  } else {
485  lastTCID = tmp[i].first.first->TCID();
486  }
487  }
488 
489  if (error) {
490  for (unsigned int i = 1; i < tmp.size(); i++) {
491  edm::LogProblem("Tracklet") << "Wrong order for in " << getName() << " " << i << " " << tmp[i].first.first
492  << " " << tmp[i].first.first->TCID();
493  }
494  }
495  }
496 
497  for (unsigned int i = 0; i < tmp.size(); i++) {
498  if (i > 0) {
499  //This allows for equal TCIDs. This means that we can e.g. have a track seeded
500  //in L1L2 that projects to both L3 and D4. The algorithm will pick up the first hit and
501  //drop the second
502 
503  assert(tmp[i - 1].first.first->TCID() <= tmp[i].first.first->TCID());
504  }
505  }
506 
507  return tmp;
508 }
Log< level::Info, true > LogVerbatim
double kz() const
Definition: Settings.h:302
double phi() const
Definition: L1TStub.h:63
double t() const
Definition: Tracklet.h:123
double zapprox() const
Definition: Stub.cc:158
unsigned int maxStep(std::string module) const
Definition: Settings.h:116
const FPGAWord & r() const
Definition: Stub.h:60
int PS_zderL_shift() const
Definition: Settings.h:352
bool bookHistos() const
Definition: Settings.h:207
void execute(double phioffset)
unsigned int nrbitsstub(unsigned int layerdisk) const
Definition: Settings.h:84
std::string name_
Definition: ProcessBase.h:38
int disk() const
Definition: Tracklet.cc:779
double kphi1() const
Definition: Settings.h:299
void initmatchcut(unsigned int layerdisk, MatchType type, unsigned int region)
Definition: TrackletLUT.cc:13
double rDSSinner(unsigned int iBin) const
Definition: Settings.h:171
constexpr T reduceRange(T x)
Definition: deltaPhi.h:18
double phiapprox(double phimin, double) const
Definition: Stub.cc:177
const FPGAWord & z() const
Definition: Stub.h:61
double dphisectorHG() const
Definition: Settings.h:281
Projection & proj(int layerdisk)
Definition: Tracklet.h:87
Settings const & settings_
Definition: ProcessBase.h:40
double z() const
Definition: L1TStub.h:57
Globals * globals_
Definition: ProcessBase.h:41
int lookup(unsigned int index) const
Definition: TrackletLUT.cc:900
bool writetrace() const
Definition: Settings.h:183
double dzmax() const
Definition: Settings.h:129
constexpr unsigned int N_DSS_MOD
Definition: Settings.h:27
assert(be >=bs)
int TCID() const
Definition: Tracklet.h:212
constexpr double third
Definition: Settings.h:42
static std::string const input
Definition: EdmProvDump.cc:47
unsigned int isPSmodule() const
Definition: L1TStub.h:94
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
U second(std::pair< T, U > const &p)
void addOutput(MemoryBase *memory, std::string output) override
double half2SmoduleWidth() const
Definition: Settings.h:131
unsigned int nzbitsstub(unsigned int layerdisk) const
Definition: Settings.h:82
double rmean(unsigned int iLayer) const
Definition: Settings.h:164
AllStubsMemory * allstubs_
double rinv() const
Definition: Tracklet.h:120
std::vector< CandidateMatchMemory * > matches_
AllProjectionsMemory * allprojs_
double rDSSouter(unsigned int iBin) const
Definition: Settings.h:174
double bfield() const
Definition: Settings.h:253
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
int value() const
Definition: FPGAWord.h:24
int alphashift() const
Definition: Settings.h:216
L1TStub * l1tstub()
Definition: Stub.h:77
bool writeMonitorData(std::string module) const
Definition: Settings.h:109
double rapprox() const
Definition: Stub.cc:144
double zmean(unsigned int iDisk) const
Definition: Settings.h:167
void initLayerDisk(unsigned int pos, int &layer, int &disk)
Definition: ProcessBase.cc:33
const FPGAWord & stubindex() const
Definition: Stub.h:66
#define M_PI
unsigned int nallstubs(unsigned int layerdisk) const
Definition: Settings.h:107
bool debugTracklet() const
Definition: Settings.h:182
constexpr unsigned int N_SECTOR
Definition: Settings.h:19
std::vector< std::pair< std::pair< Tracklet *, int >, const Stub * > > mergeMatches(std::vector< CandidateMatchMemory *> &candmatch)
constexpr unsigned int N_PSLAYER
Definition: Settings.h:23
double kr() const
Definition: Settings.h:304
double drmax() const
Definition: Settings.h:128
double alphanorm() const
Definition: L1TStub.cc:85
bool stubtruthmatch(const L1TStub *stub)
Definition: Tracklet.cc:138
Definition: deltar.py:1
int getISeed() const
Definition: Tracklet.cc:798
void addInput(MemoryBase *memory, std::string input) override
int ialphafactouter_[N_DSS_MOD *2]
double c() const
Definition: Settings.h:212
unsigned int getISeed(const std::string &name)
Definition: ProcessBase.cc:119
const FPGAWord & alpha() const
Definition: Stub.h:64
double r() const
Definition: L1TStub.h:58
std::ofstream & ofstream(std::string fname)
Definition: Globals.cc:44
int nbitsalpha() const
Definition: Settings.h:217
HistBase *& histograms()
Definition: Globals.h:38
std::pair< typename Association::data_type::first_type, double > match(Reference key, Association association, bool bestMatchByMaxValue)
Generic matching function.
Definition: Utils.h:10
double krprojshiftdisk() const
Definition: Settings.h:400
const FPGAWord & phi() const
Definition: Stub.h:62
int ialphafactinner_[N_DSS_MOD *2]
int layer() const
Definition: Tracklet.cc:770
double kphi() const
Definition: Settings.h:298
tmp
align.sh
Definition: createJobs.py:716
double r2() const
Definition: L1TStub.h:60
std::string const & getName() const
Definition: ProcessBase.h:22
int SS_zderL_shift() const
Definition: Settings.h:353
std::vector< FullMatchMemory * > fullMatches_
bool useapprox() const
Definition: Settings.h:234
Log< level::Error, true > LogProblem
int phi0bitshift() const
Definition: Settings.h:363
constexpr int N_LAYER
Definition: Settings.h:21