CMS 3D CMS Logo

VMRouterTable.cc
Go to the documentation of this file.
1 // VMRouterTable: Lookup table used by the VMRouter to route stubs and provide information about which VMStubs are needed by the TrackletEngine
4 #include <algorithm>
5 #include <filesystem>
6 
7 using namespace std;
8 using namespace trklet;
9 
10 VMRouterTable::VMRouterTable(Settings const& settings) : settings_(settings) {}
11 
12 VMRouterTable::VMRouterTable(Settings const& settings, unsigned int layerdisk, std::string const& name)
13  : settings_(settings) {
14  init(layerdisk, name);
15 }
16 
17 void VMRouterTable::init(unsigned int layerdisk, std::string const& name) {
18  zbits_ = settings_.vmrlutzbits(layerdisk);
19  rbits_ = settings_.vmrlutrbits(layerdisk);
20 
21  rbins_ = (1 << rbits_);
22  zbins_ = (1 << zbits_);
23 
24  if (layerdisk < N_LAYER) {
25  zmin_ = -settings_.zlength();
27  rmin_ = settings_.rmean(layerdisk) - settings_.drmax();
28  rmax_ = settings_.rmean(layerdisk) + settings_.drmax();
29  } else {
30  rmin_ = 0;
32  zmin_ = settings_.zmean(layerdisk - N_LAYER) - settings_.dzmax();
33  zmax_ = settings_.zmean(layerdisk - N_LAYER) + settings_.dzmax();
34  }
35 
36  dr_ = (rmax_ - rmin_) / rbins_;
37  dz_ = (zmax_ - zmin_) / zbins_;
38 
40 
41  for (int izbin = 0; izbin < zbins_; izbin++) {
42  for (int irbin = 0; irbin < rbins_; irbin++) {
43  double r = rmin_ + (irbin + 0.5) * dr_;
44  double z = zmin_ + (izbin + 0.5) * dz_;
45 
46  if (layerdisk > (N_LAYER - 1) && irbin < 10) //special case for the tabulated radii in 2S disks
47  r = (layerdisk <= 7) ? settings_.rDSSinner(irbin) : settings_.rDSSouter(irbin);
48 
49  int bin;
50  if (layerdisk < N_LAYER) {
51  double zproj = z * settings_.rmean(layerdisk) / r;
52  bin = NBINS * (zproj + settings_.zlength()) / (2 * settings_.zlength());
53  } else {
54  double rproj = r * settings_.zmean(layerdisk - N_LAYER) / z;
56  }
57  if (bin < 0)
58  bin = 0;
59  if (bin >= NBINS)
60  bin = NBINS - 1;
61  vmrtable_.push_back(bin);
62 
63  if (layerdisk >= N_LAYER) {
64  double rproj = r * settings_.zmean(layerdisk - N_LAYER) / z;
65  bin = 0.5 * NBINS * (rproj - settings_.rmindiskvm()) / (settings_.rmaxdiskvm() - settings_.rmindiskvm());
66  if (bin < 0)
67  bin = 0;
68  if (bin >= NBINS / 2)
69  bin = NBINS / 2 - 1;
70  vmrtabletedisk_.push_back(bin);
71  }
72 
73  if (layerdisk == 0 || layerdisk == 2 || layerdisk == 4 || layerdisk == 6 || layerdisk == 8) {
74  vmrtableteinner_.push_back(getLookup(layerdisk + 1, z, r));
75  }
76 
77  if (layerdisk == 1) {
78  vmrtableteinner_.push_back(getLookup(layerdisk + 1, z, r, 1));
79  }
80 
81  if (layerdisk == 1) { //projection from L2 to D1 for L2L3D1 seeding
82  vmrtableteinnerThird_.push_back(getLookup(6, z, r, 10));
83  }
84 
85  if (layerdisk == 4) { //projection from L5 to L4 for L5L6L4 seeding
86  vmrtableteinnerThird_.push_back(getLookup(3, z, r));
87  }
88 
89  if (layerdisk == 2) { //projection from L3 to L5 for L3L4L2 seeding
90  vmrtableteinnerThird_.push_back(getLookup(1, z, r));
91  }
92 
93  if (layerdisk == 6) { //projection from D1 to L2 for D1D2L2 seeding
94  vmrtableteinnerThird_.push_back(getLookup(1, z, r));
95  }
96 
97  if (layerdisk == 0 || layerdisk == 1) {
98  vmrtableteinneroverlap_.push_back(getLookup(6, z, r, layerdisk + 6));
99  }
100  }
101  }
102 
103  if (settings_.writeTable()) {
104  if (not std::filesystem::exists(settings_.tablePath())) {
105  int fail = system((string("mkdir -p ") + settings_.tablePath()).c_str());
106  if (fail)
107  throw cms::Exception("BadDir") << __FILE__ << " " << __LINE__ << " could not create directory "
108  << settings_.tablePath();
109  }
110 
111  // write finebin tables
112  writeVMTable(settings_.tablePath() + name + "_finebin.tab", vmrtable_);
113  // write barrel seed teinner tables (L1L2, L2L3, L3L4, L5L6)
114  if (layerdisk == 0 || layerdisk == 1 || layerdisk == 2 || layerdisk == 4) {
115  std::string fnamesuffix = "L" + to_string(layerdisk + 1) + "L" + std::to_string(layerdisk + 2);
116  writeVMTable(settings_.tablePath() + "VMTableInner" + fnamesuffix + ".tab", vmrtableteinner_);
117  }
118  // write disk seed teinner tables (D1D2, D3D4)
119  if (layerdisk == 6 || layerdisk == 8) {
120  std::string fnamesuffix = "D" + to_string(layerdisk - N_LAYER + 1) + "D" + to_string(layerdisk - N_LAYER + 2);
121  writeVMTable(settings_.tablePath() + "VMTableInner" + fnamesuffix + ".tab", vmrtableteinner_);
122  }
123  // write overlap seed teinner tables (L1D1, L2D1)
124  if (layerdisk == 0 || layerdisk == 1) {
125  std::string fnamesuffix = "L" + to_string(layerdisk + 1) + "D1";
126  writeVMTable(settings_.tablePath() + "VMTableInner" + fnamesuffix + ".tab", vmrtableteinneroverlap_);
127  }
128  // write barrel teouter tables (L2, L3, L4, L6, same as finebin tables)
129  if (layerdisk == 1 || layerdisk == 2 || layerdisk == 3 || layerdisk == 5) {
130  std::string fnamesuffix = "L" + to_string(layerdisk + 1);
131  writeVMTable(settings_.tablePath() + "VMTableOuter" + fnamesuffix + ".tab", vmrtable_);
132  }
133  // write disk teouter tables (D1, D2, D4)
134  if (layerdisk == 6 || layerdisk == 7 || layerdisk == 9) {
135  std::string fnamesuffix = "D" + to_string(layerdisk - N_LAYER + 1);
136  writeVMTable(settings_.tablePath() + "VMTableOuter" + fnamesuffix + ".tab", vmrtabletedisk_);
137  }
138  }
139 }
140 
141 int VMRouterTable::getLookup(unsigned int layerdisk, double z, double r, int iseed) {
142  double z0cut = settings_.z0cut();
143 
144  if (layerdisk < N_LAYER) {
145  if (iseed == 1 && std::abs(z) < 52.0)
146  return -1;
147 
148  double rmean = settings_.rmean(layerdisk);
149 
150  double rratio1 = rmean / (r + 0.5 * dr_);
151  double rratio2 = rmean / (r - 0.5 * dr_);
152 
153  double z1 = (z - 0.5 * dz_) * rratio1 + z0cut * (rratio1 - 1.0);
154  double z2 = (z + 0.5 * dz_) * rratio1 + z0cut * (rratio1 - 1.0);
155  double z3 = (z - 0.5 * dz_) * rratio2 + z0cut * (rratio2 - 1.0);
156  double z4 = (z + 0.5 * dz_) * rratio2 + z0cut * (rratio2 - 1.0);
157  double z5 = (z - 0.5 * dz_) * rratio1 - z0cut * (rratio1 - 1.0);
158  double z6 = (z + 0.5 * dz_) * rratio1 - z0cut * (rratio1 - 1.0);
159  double z7 = (z - 0.5 * dz_) * rratio2 - z0cut * (rratio2 - 1.0);
160  double z8 = (z + 0.5 * dz_) * rratio2 - z0cut * (rratio2 - 1.0);
161 
162  double zmin = std::min({z1, z2, z3, z4, z5, z6, z7, z8});
163  double zmax = std::max({z1, z2, z3, z4, z5, z6, z7, z8});
164 
166 
167  int zbin1 = NBINS * (zmin + settings_.zlength()) / (2 * settings_.zlength());
168  int zbin2 = NBINS * (zmax + settings_.zlength()) / (2 * settings_.zlength());
169 
170  if (zbin1 >= NBINS)
171  return -1;
172  if (zbin2 < 0)
173  return -1;
174 
175  if (zbin2 >= NBINS)
176  zbin2 = NBINS - 1;
177  if (zbin1 < 0)
178  zbin1 = 0;
179 
180  // This is a 10 bit word:
181  // xxx|yyy|z|rrr
182  // xxx is the delta z window
183  // yyy is the z bin
184  // z is flag to look in next bin
185  // rrr first fine z bin
186  // NOTE : this encoding is not efficient z is one if xxx+rrr is greater than 8
187  // and xxx is only 1,2, or 3
188  // should also reject xxx=0 as this means projection is outside range
189 
190  int value = zbin1 / 8;
191  value *= 2;
192  if (zbin2 / 8 - zbin1 / 8 > 0)
193  value += 1;
194  value *= 8;
195  value += (zbin1 & 7);
196  assert(value / 8 < 15);
197  int deltaz = zbin2 - zbin1;
198  if (deltaz > 7) {
199  deltaz = 7;
200  }
201  assert(deltaz < 8);
202  value += (deltaz << 7);
203 
204  return value;
205 
206  } else {
207  if (std::abs(z) < 2.0 * z0cut)
208  return -1;
209 
210  double zmean = settings_.zmean(layerdisk - N_LAYER);
211  if (z < 0.0)
212  zmean = -zmean;
213 
214  double r1 = (r + 0.5 * dr_) * (zmean + z0cut) / (z + 0.5 * dz_ + z0cut);
215  double r2 = (r - 0.5 * dr_) * (zmean - z0cut) / (z + 0.5 * dz_ - z0cut);
216  double r3 = (r + 0.5 * dr_) * (zmean + z0cut) / (z - 0.5 * dz_ + z0cut);
217  double r4 = (r - 0.5 * dr_) * (zmean - z0cut) / (z - 0.5 * dz_ - z0cut);
218  double r5 = (r + 0.5 * dr_) * (zmean - z0cut) / (z + 0.5 * dz_ - z0cut);
219  double r6 = (r - 0.5 * dr_) * (zmean + z0cut) / (z + 0.5 * dz_ + z0cut);
220  double r7 = (r + 0.5 * dr_) * (zmean - z0cut) / (z - 0.5 * dz_ - z0cut);
221  double r8 = (r - 0.5 * dr_) * (zmean + z0cut) / (z - 0.5 * dz_ + z0cut);
222 
223  double rmin = std::min({r1, r2, r3, r4, r5, r6, r7, r8});
224  double rmax = std::max({r1, r2, r3, r4, r5, r6, r7, r8});
225 
227 
228  double rmindisk = settings_.rmindiskvm();
229  double rmaxdisk = settings_.rmaxdiskvm();
230 
231  if (iseed == 6)
232  rmaxdisk = settings_.rmaxdiskl1overlapvm();
233  if (iseed == 7)
234  rmindisk = settings_.rmindiskl2overlapvm();
235  if (iseed == 10)
236  rmaxdisk = settings_.rmaxdisk();
237 
238  if (rmin > rmaxdisk)
239  return -1;
240  if (rmax > rmaxdisk)
241  rmax = rmaxdisk;
242 
243  if (rmax < rmindisk)
244  return -1;
245  if (rmin < rmindisk)
246  rmin = rmindisk;
247 
248  int rbin1 = NBINS * (rmin - settings_.rmindiskvm()) / (settings_.rmaxdiskvm() - settings_.rmindiskvm());
249  int rbin2 = NBINS * (rmax - settings_.rmindiskvm()) / (settings_.rmaxdiskvm() - settings_.rmindiskvm());
250 
251  if (iseed == 10) {
252  constexpr double rminspec = 40.0;
253  rbin1 = NBINS * (rmin - rminspec) / (settings_.rmaxdisk() - rminspec);
254  rbin2 = NBINS * (rmax - rminspec) / (settings_.rmaxdisk() - rminspec);
255  }
256 
257  if (rbin2 >= NBINS)
258  rbin2 = NBINS - 1;
259  if (rbin1 < 0)
260  rbin1 = 0;
261 
262  // This is a 9 bit word:
263  // xxx|yy|z|rrr
264  // xxx is the delta r window
265  // yy is the r bin yy is three bits for overlaps
266  // z is flag to look in next bin
267  // rrr fine r bin
268  // NOTE : this encoding is not efficient z is one if xxx+rrr is greater than 8
269  // and xxx is only 1,2, or 3
270  // should also reject xxx=0 as this means projection is outside range
271 
272  bool overlap = iseed == 6 || iseed == 7 || iseed == 10;
273 
274  int value = rbin1 / 8;
275  if (overlap) {
276  if (z < 0.0)
277  value += 4;
278  }
279  value *= 2;
280  if (rbin2 / 8 - rbin1 / 8 > 0)
281  value += 1;
282  value *= 8;
283  value += (rbin1 & 7);
284  assert(value / 8 < 15);
285  int deltar = rbin2 - rbin1;
286  if (deltar > 7)
287  deltar = 7;
288  if (overlap) {
289  value += (deltar << 7);
290  } else {
291  value += (deltar << 6);
292  }
293 
294  return value;
295  }
296 }
297 
298 int VMRouterTable::lookup(int zbin, int rbin) {
299  int index = zbin * rbins_ + rbin;
300  assert(index >= 0 && index < (int)vmrtable_.size());
301  return vmrtable_[index];
302 }
303 
304 int VMRouterTable::lookupdisk(int zbin, int rbin) {
305  int index = zbin * rbins_ + rbin;
306  assert(index >= 0 && index < (int)vmrtabletedisk_.size());
307  return vmrtabletedisk_[index];
308 }
309 
310 int VMRouterTable::lookupinner(int zbin, int rbin) {
311  int index = zbin * rbins_ + rbin;
312  assert(index >= 0 && index < (int)vmrtableteinner_.size());
313  return vmrtableteinner_[index];
314 }
315 
316 int VMRouterTable::lookupinneroverlap(int zbin, int rbin) {
317  int index = zbin * rbins_ + rbin;
318  assert(index >= 0 && index < (int)vmrtableteinneroverlap_.size());
320 }
321 
322 int VMRouterTable::lookupinnerThird(int zbin, int rbin) {
323  int index = zbin * rbins_ + rbin;
324  assert(index >= 0 && index < (int)vmrtableteinnerThird_.size());
326 }
327 
328 void VMRouterTable::writeVMTable(std::string const& name, std::vector<int> const& table) {
329  ofstream out(name);
330  if (out.fail())
331  throw cms::Exception("BadFile") << __FILE__ << " " << __LINE__ << " could not create file " << name;
332 
333  out << "{" << endl;
334  for (unsigned int i = 0; i < table.size(); i++) {
335  if (i != 0) {
336  out << "," << endl;
337  }
338  int itable = table[i];
339  out << itable;
340  }
341  out << endl << "};" << endl;
342  out.close();
343 }
trklet::VMRouterTable::getLookup
int getLookup(unsigned int layerdisk, double z, double r, int iseed=-1)
Definition: VMRouterTable.cc:141
Settings.h
trklet::Settings::rmindiskvm
double rmindiskvm() const
Definition: Settings.h:281
mps_fire.i
i
Definition: mps_fire.py:428
trklet::VMRouterTable::vmrtable_
std::vector< int > vmrtable_
Definition: VMRouterTable.h:54
trklet::VMRouterTable::init
void init(unsigned int layerdisk, std::string const &name)
Definition: VMRouterTable.cc:17
trklet::VMRouterTable::vmrtableteinneroverlap_
std::vector< int > vmrtableteinneroverlap_
Definition: VMRouterTable.h:57
NBINS
const int NBINS
Definition: CaloCachedShapeIntegrator.cc:3
trklet::VMRouterTable::zmax_
double zmax_
Definition: VMRouterTable.h:42
trklet::VMRouterTable::lookupdisk
int lookupdisk(int zbin, int rbin)
Definition: VMRouterTable.cc:304
trklet::Settings::dzmax
double dzmax() const
Definition: Settings.h:116
min
T min(T a, T b)
Definition: MathUtil.h:58
trklet::Settings::rmaxdiskl1overlapvm
double rmaxdiskl1overlapvm() const
Definition: Settings.h:284
VMRouterTable.h
trklet::Settings::vmrlutrbits
unsigned int vmrlutrbits(unsigned int layerdisk) const
Definition: Settings.h:158
trklet::Settings
Definition: Settings.h:31
trklet::Settings::rmindiskl2overlapvm
double rmindiskl2overlapvm() const
Definition: Settings.h:285
cms::cuda::assert
assert(be >=bs)
trklet::VMRouterTable::rbits_
int rbits_
Definition: VMRouterTable.h:48
deltar
Definition: deltar.py:1
trklet::Settings::rmean
double rmean(unsigned int iLayer) const
Definition: Settings.h:143
trklet::VMRouterTable::lookupinneroverlap
int lookupinneroverlap(int zbin, int rbin)
Definition: VMRouterTable.cc:316
trklet::Settings::rDSSinner
double rDSSinner(unsigned int iBin) const
Definition: Settings.h:150
trklet::VMRouterTable::writeVMTable
void writeVMTable(std::string const &name, std::vector< int > const &table)
Definition: VMRouterTable.cc:328
SiStripMonitorCluster_cfi.zmin
zmin
Definition: SiStripMonitorCluster_cfi.py:200
trklet::Settings::writeTable
bool writeTable() const
Definition: Settings.h:168
trklet::Settings::rDSSouter
double rDSSouter(unsigned int iBin) const
Definition: Settings.h:153
testProducerWithPsetDescEmpty_cfi.z2
z2
Definition: testProducerWithPsetDescEmpty_cfi.py:41
trklet::VMRouterTable::settings_
Settings const & settings_
Definition: VMRouterTable.h:36
trklet::VMRouterTable::lookup
int lookup(int zbin, int rbin)
Definition: VMRouterTable.cc:298
trklet::VMRouterTable::dz_
double dz_
Definition: VMRouterTable.h:45
trklet::VMRouterTable::dr_
double dr_
Definition: VMRouterTable.h:44
trklet::VMRouterTable::zbits_
int zbits_
Definition: VMRouterTable.h:47
SiStripMonitorCluster_cfi.zmax
zmax
Definition: SiStripMonitorCluster_cfi.py:201
trklet::VMRouterTable::VMRouterTable
VMRouterTable(Settings const &settings)
Definition: VMRouterTable.cc:10
trklet::N_LAYER
constexpr int N_LAYER
Definition: Settings.h:19
trklet::VMRouterTable::lookupinnerThird
int lookupinnerThird(int zbin, int rbin)
Definition: VMRouterTable.cc:322
trklet::Settings::zmean
double zmean(unsigned int iDisk) const
Definition: Settings.h:146
trklet::VMRouterTable::lookupinner
int lookupinner(int zbin, int rbin)
Definition: VMRouterTable.cc:310
AlCaHLTBitMon_QueryRunRegistry.string
string
Definition: AlCaHLTBitMon_QueryRunRegistry.py:256
trklet::Settings::drmax
double drmax() const
Definition: Settings.h:115
trklet::Settings::rmaxdisk
double rmaxdisk() const
Definition: Settings.h:112
iseed
int iseed
Definition: AMPTWrapper.h:134
trklet::Settings::NLONGVMBINS
unsigned int NLONGVMBINS() const
Definition: Settings.h:295
SiStripPI::max
Definition: SiStripPayloadInspectorHelper.h:169
trklet::VMRouterTable::rmin_
double rmin_
Definition: VMRouterTable.h:38
diffTwoXMLs.r2
r2
Definition: diffTwoXMLs.py:73
muon::overlap
bool overlap(const reco::Muon &muon1, const reco::Muon &muon2, double pullX=1.0, double pullY=1.0, bool checkAdjacentChambers=false)
Definition: MuonSelectors.cc:791
value
Definition: value.py:1
trklet
Definition: AllProjectionsMemory.h:9
trklet::VMRouterTable::zmin_
double zmin_
Definition: VMRouterTable.h:41
trklet::VMRouterTable::rbins_
int rbins_
Definition: VMRouterTable.h:51
trklet::VMRouterTable::vmrtableteinnerThird_
std::vector< int > vmrtableteinnerThird_
Definition: VMRouterTable.h:58
trklet::VMRouterTable::vmrtabletedisk_
std::vector< int > vmrtabletedisk_
Definition: VMRouterTable.h:55
alignCSCRings.r
r
Definition: alignCSCRings.py:93
newFWLiteAna.bin
bin
Definition: newFWLiteAna.py:161
std
Definition: JetResolutionObject.h:76
diffTwoXMLs.r1
r1
Definition: diffTwoXMLs.py:53
trklet::Settings::vmrlutzbits
unsigned int vmrlutzbits(unsigned int layerdisk) const
Definition: Settings.h:157
trklet::Settings::tablePath
std::string const & tablePath() const
Definition: Settings.h:170
relativeConstraints.value
value
Definition: relativeConstraints.py:53
Exception
Definition: hltDiff.cc:245
Skims_PA_cff.name
name
Definition: Skims_PA_cff.py:17
AlignmentPI::index
index
Definition: AlignmentPayloadInspectorHelper.h:46
MillePedeFileConverter_cfg.out
out
Definition: MillePedeFileConverter_cfg.py:31
trklet::VMRouterTable::rmax_
double rmax_
Definition: VMRouterTable.h:39
cms::Exception
Definition: Exception.h:70
trklet::Settings::z0cut
double z0cut() const
Definition: Settings.h:290
funct::abs
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
TableParser.table
table
Definition: TableParser.py:111
trklet::VMRouterTable::vmrtableteinner_
std::vector< int > vmrtableteinner_
Definition: VMRouterTable.h:56
trklet::VMRouterTable::zbins_
int zbins_
Definition: VMRouterTable.h:50
trklet::Settings::rmaxdiskvm
double rmaxdiskvm() const
Definition: Settings.h:282
trklet::Settings::zlength
double zlength() const
Definition: Settings.h:111