CMS 3D CMS Logo

TrackletConfigBuilder.cc
Go to the documentation of this file.
1 #include <vector>
2 #include <utility>
3 #include <set>
4 #include <cmath>
5 #include <iostream>
6 #include <fstream>
7 #include <sstream>
8 #include <cstdlib>
9 #include <cassert>
10 #include <mutex>
11 
14 #ifdef CMSSW_GIT_HASH
17 #endif
18 
19 using namespace std;
20 using namespace trklet;
21 
22 TrackletConfigBuilder::TrackletConfigBuilder(const Settings& settings, const tt::Setup* setup) : settings_(settings) {
24  rcrit_ = settings.rcrit();
25 
26  combinedmodules_ = settings.combined();
27 
28  extended_ = settings.extended();
29 
30  rinvmax_ = settings.rinvmax();
31 
32  rmaxdisk_ = settings.rmaxdisk();
33  zlength_ = settings.zlength();
34 
35  for (int i = 0; i < N_LAYER; i++) {
36  rmean_[i] = settings.rmean(i);
37  }
38 
39  for (int i = 0; i < N_DISK; i++) {
40  zmean_[i] = settings.zmean(i);
41  }
42 
43  dphisectorHG_ = settings.dphisectorHG();
44 
45  for (int layerdisk = 0; layerdisk < N_LAYER + N_DISK; layerdisk++) {
46  NRegions_[layerdisk] = settings.nallstubs(layerdisk);
47  NVMME_[layerdisk] = settings.nvmme(layerdisk);
48  }
49 
50  for (unsigned int iseed = 0; iseed < N_SEED_PROMPT; iseed++) {
51  NVMTE_[iseed] = std::pair<unsigned int, unsigned int>(settings.nvmte(0, iseed), settings.nvmte(1, iseed));
52  NTC_[iseed] = settings.NTC(iseed);
53  }
54 
55  initGeom();
56 
57  buildTE();
58 
59  buildTC();
60 
62 
64 
65  if (settings_.writeConfig()) {
66  static std::once_flag runOnce; // Only one thread should call this.
67  std::call_once(runOnce, &TrackletConfigBuilder::writeDTCphirange, this);
68  }
69 }
70 
71 //--- Calculate phi range of modules read by each DTC.
72 
73 #ifdef CMSSW_GIT_HASH
74 
76  list<DTCinfo> vecDTCinfo_unsorted;
77 
78  // Loop over DTCs in this tracker nonant.
79  unsigned int numDTCsPerSector = setup->numDTCsPerRegion();
80  for (unsigned int dtcId = 0; dtcId < numDTCsPerSector; dtcId++) {
81  typedef std::pair<float, float> PhiRange;
82  std::map<int, PhiRange> dtcPhiRange;
83 
84  // Loop over all tracker nonants, taking worst case not all identical.
85  for (unsigned int iSector = 0; iSector < N_SECTOR; iSector++) {
86  unsigned int dtcId_regI = iSector * numDTCsPerSector + dtcId;
87  const std::vector<tt::SensorModule*>& dtcModules = setup->dtcModules(dtcId_regI);
88  for (const tt::SensorModule* sm : dtcModules) {
89  // Convert layer number to Hybrid convention.
90  int layer = sm->layerId(); // Barrel = 1-6, Endcap = 11-15;
91  if (sm->barrel()) {
92  layer--; // Barrel 0-5
93  } else {
94  const int endcapOffsetHybrid = 5;
95  layer -= endcapOffsetHybrid; // Layer 6-19
96  }
97  // Inner radius of module.
98  float r = sm->r() - 0.5 * sm->numColumns() * sm->pitchCol() * fabs(sm->sinTilt());
99  // phi with respect to tracker nonant centre.
100  float phiMin = sm->phi() - 0.5 * sm->numRows() * sm->pitchRow() / r;
101  float phiMax = sm->phi() + 0.5 * sm->numRows() * sm->pitchRow() / r;
102  // Hybrid measures phi w.r.t. lower edge of tracker nonant.
103  const float phiOffsetHybrid = 0.5 * dphisectorHG_;
104  phiMin += phiOffsetHybrid;
105  phiMax += phiOffsetHybrid;
106  if (dtcPhiRange.find(layer) == dtcPhiRange.end()) {
107  dtcPhiRange[layer] = {phiMin, phiMax};
108  } else {
109  dtcPhiRange.at(layer).first = std::min(phiMin, dtcPhiRange.at(layer).first);
110  dtcPhiRange.at(layer).second = std::max(phiMax, dtcPhiRange.at(layer).second);
111  }
112  }
113  }
114  for (const auto& p : dtcPhiRange) {
115  const unsigned int numSlots = setup->numATCASlots();
116  std::string dtcName = settings_.slotToDTCname(dtcId % numSlots);
117  if (dtcId >= numSlots)
118  dtcName = "neg" + dtcName;
119  DTCinfo info;
120  info.name = dtcName;
121  info.layer = p.first;
122  info.phimin = p.second.first;
123  info.phimax = p.second.second;
124  vecDTCinfo_unsorted.push_back(info);
125  }
126  }
127 
128  // Put DTCinfo vector in traditional order (PS first). (Needed?)
129  for (const DTCinfo& info : vecDTCinfo_unsorted) {
130  string dtcname = info.name;
131  if (dtcname.find("PS") != std::string::npos) {
132  vecDTCinfo_.push_back(info);
133  }
134  }
135  for (const DTCinfo& info : vecDTCinfo_unsorted) {
136  string dtcname = info.name;
137  if (dtcname.find("PS") == std::string::npos) {
138  vecDTCinfo_.push_back(info);
139  }
140  }
141 }
142 
143 //--- Write DTC phi ranges to file to support stand-alone emulation.
144 //--- (Only needed to support stand-alone emulation)
145 
146 void TrackletConfigBuilder::writeDTCphirange() const {
147  bool first = true;
148  for (const DTCinfo& info : vecDTCinfo_) {
149  string dirName = settings_.tablePath();
150  string fileName = dirName + "../dtcphirange.dat";
151  std::ofstream out;
152  openfile(out, first, dirName, fileName, __FILE__, __LINE__);
153  if (first) {
154  out << "// layer & phi ranges of modules read by each DTC" << endl;
155  out << "// (Used by stand-alone emulation)" << endl;
156  }
157  out << info.name << " " << info.layer << " " << info.phimin << " " << info.phimax << endl;
158  out.close();
159  first = false;
160  }
161 }
162 
163 #else
164 
165 //--- Set DTC phi ranges from .txt file (stand-alone operation only)
166 
168  // This file previously written by writeDTCphirange().
169  const string fname = "../data/dtcphirange.txt";
170  if (vecDTCinfo_.empty()) { // Only run once per thread.
171  std::ifstream str_dtc;
172  str_dtc.open(fname);
173  assert(str_dtc.good());
174  string line;
175  while (ifstream, getline(line)) {
176  std::istringstream iss(line);
177  DTCinfo info;
178  iss >> info.name >> info.layer >> info.phimin >> info.phimax;
179  vecDTCinfo_.push_back(info);
180  }
181  str_dtc.close();
182  }
183 }
184 
185 #endif
186 
187 //--- Helper fcn. to get the layers/disks for a seed
188 
189 std::pair<unsigned int, unsigned int> TrackletConfigBuilder::seedLayers(unsigned int iSeed) {
190  return std::pair<unsigned int, unsigned int>(settings_.seedlayers(0, iSeed), settings_.seedlayers(1, iSeed));
191 }
192 
193 //--- Method to initialize the regions and VM in each layer
194 
196  for (unsigned int ilayer = 0; ilayer < N_LAYER + N_DISK; ilayer++) {
197  double dphi = dphisectorHG_ / NRegions_[ilayer];
198  for (unsigned int iReg = 0; iReg < NRegions_[ilayer]; iReg++) {
199  std::vector<std::pair<unsigned int, unsigned int> > emptyVec;
200  projections_[ilayer].push_back(emptyVec);
201  // FIX: sector doesn't have hourglass shape
202  double phimin = dphi * iReg;
203  double phimax = phimin + dphi;
204  std::pair<double, double> tmp(phimin, phimax);
205  allStubs_[ilayer].push_back(tmp);
206  double dphiVM = dphi / NVMME_[ilayer];
207  for (unsigned int iVM = 0; iVM < NVMME_[ilayer]; iVM++) {
208  double phivmmin = phimin + iVM * dphiVM;
209  double phivmmax = phivmmin + dphiVM;
210  std::pair<double, double> tmp(phivmmin, phivmmax);
211  VMStubsME_[ilayer].push_back(tmp);
212  }
213  }
214  }
215  for (unsigned int iseed = 0; iseed < N_SEED_PROMPT; iseed++) {
216  unsigned int l1 = seedLayers(iseed).first;
217  unsigned int l2 = seedLayers(iseed).second;
218  unsigned int nVM1 = NVMTE_[iseed].first;
219  unsigned int nVM2 = NVMTE_[iseed].second;
220  double dphiVM = dphisectorHG_ / (nVM1 * NRegions_[l1]);
221  for (unsigned int iVM = 0; iVM < nVM1 * NRegions_[l1]; iVM++) {
222  double phivmmin = iVM * dphiVM;
223  double phivmmax = phivmmin + dphiVM;
224  std::pair<double, double> tmp(phivmmin, phivmmax);
225  VMStubsTE_[iseed].first.push_back(tmp);
226  }
227  dphiVM = dphisectorHG_ / (nVM2 * NRegions_[l2]);
228  for (unsigned int iVM = 0; iVM < nVM2 * NRegions_[l2]; iVM++) {
229  double phivmmin = iVM * dphiVM;
230  double phivmmax = phivmmin + dphiVM;
231  std::pair<double, double> tmp(phivmmin, phivmmax);
232  VMStubsTE_[iseed].second.push_back(tmp);
233  }
234  }
235 }
236 
237 //--- Helper fcn to get the radii of the two layers in a seed
238 
239 std::pair<double, double> TrackletConfigBuilder::seedRadii(unsigned int iseed) {
240  std::pair<unsigned int, unsigned int> seedlayers = seedLayers(iseed);
241 
242  unsigned int l1 = seedlayers.first;
243  unsigned int l2 = seedlayers.second;
244 
245  double r1, r2;
246 
247  if (iseed < 4) { //barrel seeding
248  r1 = rmean_[l1];
249  r2 = rmean_[l2];
250  } else if (iseed < 6) { //disk seeding
251  r1 = rmean_[0] + 40.0; //FIX: Somewhat of a hack - but allows finding all the regions
252  //when projecting to L1
253  r2 = r1 * zmean_[l2 - 6] / zmean_[l1 - 6];
254  } else { //overlap seeding
255  r1 = rmean_[l1];
256  r2 = r1 * zmean_[l2 - 6] / zlength_;
257  }
258 
259  return std::pair<double, double>(r1, r2);
260 }
261 
262 //--- Helper function to determine if a pair of VM memories form valid TE
263 
264 bool TrackletConfigBuilder::validTEPair(unsigned int iseed, unsigned int iTE1, unsigned int iTE2) {
265  double rinvmin = 999.9;
266  double rinvmax = -999.9;
267 
268  double phi1[2] = {VMStubsTE_[iseed].first[iTE1].first, VMStubsTE_[iseed].first[iTE1].second};
269  double phi2[2] = {VMStubsTE_[iseed].second[iTE2].first, VMStubsTE_[iseed].second[iTE2].second};
270 
271  std::pair<double, double> seedradii = seedRadii(iseed);
272 
273  for (unsigned int i1 = 0; i1 < 2; i1++) {
274  for (unsigned int i2 = 0; i2 < 2; i2++) {
275  double arinv = rinv(seedradii.first, phi1[i1], seedradii.second, phi2[i2]);
276  if (arinv < rinvmin)
277  rinvmin = arinv;
278  if (arinv > rinvmax)
279  rinvmax = arinv;
280  }
281  }
282 
283  if (rinvmin > rinvmax_)
284  return false;
285  if (rinvmax < -rinvmax_)
286  return false;
287 
288  return true;
289 }
290 
291 //--- Builds the list of TE for each seeding combination
292 
294  for (unsigned int iseed = 0; iseed < N_SEED_PROMPT; iseed++) {
295  for (unsigned int i1 = 0; i1 < VMStubsTE_[iseed].first.size(); i1++) {
296  for (unsigned int i2 = 0; i2 < VMStubsTE_[iseed].second.size(); i2++) {
297  if (validTEPair(iseed, i1, i2)) {
298  std::pair<unsigned int, unsigned int> tmp(i1, i2);
299  // Contains pairs of indices of all valid VM pairs in seeding layers
300  TE_[iseed].push_back(tmp);
301  }
302  }
303  }
304  }
305 }
306 
307 //--- Builds the lists of TC for each seeding combination
308 
310  for (unsigned int iSeed = 0; iSeed < N_SEED_PROMPT; iSeed++) {
311  unsigned int nTC = NTC_[iSeed];
312  std::vector<std::pair<unsigned int, unsigned int> >& TEs = TE_[iSeed];
313  std::vector<std::vector<unsigned int> >& TCs = TC_[iSeed];
314 
315  //Very naive method to group TEs in TC
316 
317  double invnTC = nTC * (1.0 / TEs.size());
318 
319  for (unsigned int iTE = 0; iTE < TEs.size(); iTE++) {
320  int iTC = invnTC * iTE;
321  assert(iTC < (int)nTC);
322  if (iTC >= (int)TCs.size()) {
323  std::vector<unsigned int> tmp;
324  tmp.push_back(iTE);
325  TCs.push_back(tmp);
326  } else {
327  TCs[iTC].push_back(iTE);
328  }
329  }
330  }
331 }
332 
333 //--- Helper fcn to return the phi range of a projection of a tracklet from a TC
334 
335 std::pair<double, double> TrackletConfigBuilder::seedPhiRange(double rproj, unsigned int iSeed, unsigned int iTC) {
336  std::vector<std::vector<unsigned int> >& TCs = TC_[iSeed];
337 
338  std::pair<double, double> seedradii = seedRadii(iSeed);
339 
340  double phimin = 999.0;
341  double phimax = -999.0;
342  for (unsigned int iTE = 0; iTE < TCs[iTC].size(); iTE++) {
343  unsigned int theTE = TCs[iTC][iTE];
344  unsigned int l1TE = TE_[iSeed][theTE].first;
345  unsigned int l2TE = TE_[iSeed][theTE].second;
346  double phi1[2] = {VMStubsTE_[iSeed].first[l1TE].first, VMStubsTE_[iSeed].first[l1TE].second};
347  double phi2[2] = {VMStubsTE_[iSeed].second[l2TE].first, VMStubsTE_[iSeed].second[l2TE].second};
348  for (unsigned int i1 = 0; i1 < 2; i1++) {
349  for (unsigned int i2 = 0; i2 < 2; i2++) {
350  double aphi = phi(seedradii.first, phi1[i1], seedradii.second, phi2[i2], rproj);
351  if (aphi < phimin)
352  phimin = aphi;
353  if (aphi > phimax)
354  phimax = aphi;
355  }
356  }
357  }
358  return std::pair<double, double>(phimin, phimax);
359 }
360 
361 //--- Finds the projections needed for each seeding combination
362 
364  set<string> emptyProjStandard = {
365  "TPROJ_L1L2H_L3PHIB", "TPROJ_L1L2E_L3PHIC", "TPROJ_L1L2K_L3PHIC", "TPROJ_L1L2H_L3PHID", "TPROJ_L1L2F_L5PHIA",
366  "TPROJ_L1L2G_L5PHID", "TPROJ_L1L2A_L6PHIA", "TPROJ_L1L2J_L6PHIB", "TPROJ_L1L2C_L6PHIC", "TPROJ_L1L2L_L6PHID",
367  "TPROJ_L3L4D_D1PHIB", "TPROJ_L2L3A_D1PHIC", "TPROJ_L3L4A_D1PHIC", "TPROJ_L1L2G_D2PHIA", "TPROJ_L1D1D_D2PHIA",
368  "TPROJ_L1D1E_D2PHIA", "TPROJ_L1L2J_D2PHIB", "TPROJ_L3L4D_D2PHIB", "TPROJ_L1D1A_D2PHIB", "TPROJ_L1D1F_D2PHIB",
369  "TPROJ_L1D1G_D2PHIB", "TPROJ_L1L2C_D2PHIC", "TPROJ_L2L3A_D2PHIC", "TPROJ_L3L4A_D2PHIC", "TPROJ_L1D1B_D2PHIC",
370  "TPROJ_L1D1C_D2PHIC", "TPROJ_L1D1H_D2PHIC", "TPROJ_L2D1A_D2PHIC", "TPROJ_L1L2F_D2PHID", "TPROJ_L1D1D_D2PHID",
371  "TPROJ_L1D1E_D2PHID", "TPROJ_L1L2G_D3PHIA", "TPROJ_L1D1D_D3PHIA", "TPROJ_L1D1E_D3PHIA", "TPROJ_L1L2J_D3PHIB",
372  "TPROJ_L1D1A_D3PHIB", "TPROJ_L1D1F_D3PHIB", "TPROJ_L1D1G_D3PHIB", "TPROJ_L1L2C_D3PHIC", "TPROJ_L2L3A_D3PHIC",
373  "TPROJ_L1D1B_D3PHIC", "TPROJ_L1D1C_D3PHIC", "TPROJ_L1D1H_D3PHIC", "TPROJ_L2D1A_D3PHIC", "TPROJ_L1L2F_D3PHID",
374  "TPROJ_L1D1D_D3PHID", "TPROJ_L1D1E_D3PHID", "TPROJ_L1L2G_D4PHIA", "TPROJ_L1D1D_D4PHIA", "TPROJ_L1D1E_D4PHIA",
375  "TPROJ_L1L2J_D4PHIB", "TPROJ_L1D1G_D4PHIB", "TPROJ_L1L2C_D4PHIC", "TPROJ_L2L3A_D4PHIC", "TPROJ_L1D1B_D4PHIC",
376  "TPROJ_L2D1A_D4PHIC", "TPROJ_L1L2F_D4PHID", "TPROJ_L1D1D_D4PHID", "TPROJ_L1D1E_D5PHIA", "TPROJ_L1D1G_D5PHIB",
377  "TPROJ_L1D1B_D5PHIC", "TPROJ_L1D1D_D5PHID"};
378 
379  set<string> emptyProjCombined = {
380  "TPROJ_L1L2J_L6PHIB", "TPROJ_L1L2C_L6PHIC", "TPROJ_L1L2G_D1PHIA", "TPROJ_L1L2J_D1PHIB", "TPROJ_L2L3D_D1PHIB",
381  "TPROJ_L3L4D_D1PHIB", "TPROJ_L1L2C_D1PHIC", "TPROJ_L2L3A_D1PHIC", "TPROJ_L3L4A_D1PHIC", "TPROJ_L1L2F_D1PHID",
382  "TPROJ_L1L2G_D2PHIA", "TPROJ_L1D1E_D2PHIA", "TPROJ_L1L2J_D2PHIB", "TPROJ_L2L3D_D2PHIB", "TPROJ_L3L4D_D2PHIB",
383  "TPROJ_L1D1G_D2PHIB", "TPROJ_L1L2C_D2PHIC", "TPROJ_L2L3A_D2PHIC", "TPROJ_L3L4A_D2PHIC", "TPROJ_L1D1B_D2PHIC",
384  "TPROJ_L2D1A_D2PHIC", "TPROJ_L1L2F_D2PHID", "TPROJ_L1D1D_D2PHID", "TPROJ_L1L2G_D3PHIA", "TPROJ_L1D1E_D3PHIA",
385  "TPROJ_L1L2J_D3PHIB", "TPROJ_L2L3D_D3PHIB", "TPROJ_L1D1G_D3PHIB", "TPROJ_L1L2C_D3PHIC", "TPROJ_L2L3A_D3PHIC",
386  "TPROJ_L1D1B_D3PHIC", "TPROJ_L2D1A_D3PHIC", "TPROJ_L1L2F_D3PHID", "TPROJ_L1D1D_D3PHID", "TPROJ_L1L2G_D4PHIA",
387  "TPROJ_L1D1E_D4PHIA", "TPROJ_L1L2J_D4PHIB", "TPROJ_L2L3D_D4PHIB", "TPROJ_L1D1G_D4PHIB", "TPROJ_L1L2C_D4PHIC",
388  "TPROJ_L2L3A_D4PHIC", "TPROJ_L1D1B_D4PHIC", "TPROJ_L2D1A_D4PHIC", "TPROJ_L1L2F_D4PHID", "TPROJ_L1D1D_D4PHID",
389  "TPROJ_L1D1E_D5PHIA", "TPROJ_L1D1G_D5PHIB", "TPROJ_L1D1B_D5PHIC", "TPROJ_L1D1D_D5PHID"};
390 
391  for (unsigned int iseed = 0; iseed < N_SEED_PROMPT; iseed++) {
392  std::vector<std::vector<unsigned int> >& TCs = TC_[iseed];
393 
394  for (unsigned int ilayer = 0; ilayer < N_LAYER + N_DISK; ilayer++) {
395  if (matchport_[iseed][ilayer] == -1)
396  continue;
397  for (unsigned int iReg = 0; iReg < NRegions_[ilayer]; iReg++) {
398  for (unsigned int iTC = 0; iTC < TCs.size(); iTC++) {
399  double rproj = rmaxdisk_;
400  if (ilayer < 6)
401  rproj = rmean_[ilayer];
402  std::pair<double, double> phiRange = seedPhiRange(rproj, iseed, iTC);
403  if (phiRange.first < allStubs_[ilayer][iReg].second && phiRange.second > allStubs_[ilayer][iReg].first) {
404  std::pair<unsigned int, unsigned int> tmp(iseed, iTC); //seedindex and TC
405  string projName = TPROJName(iseed, iTC, ilayer, iReg);
406  if (combinedmodules_) {
407  if (emptyProjCombined.find(projName) == emptyProjCombined.end()) {
408  projections_[ilayer][iReg].push_back(tmp);
409  }
410  } else {
411  if (emptyProjStandard.find(projName) == emptyProjStandard.end()) {
412  projections_[ilayer][iReg].push_back(tmp);
413  }
414  }
415  }
416  }
417  }
418  }
419  }
420 }
421 
422 //--- Helper function to calculate the phi position of a seed at radius r that is formed
423 //--- by two stubs at (r1,phi1) and (r2, phi2)
424 
425 double TrackletConfigBuilder::phi(double r1, double phi1, double r2, double phi2, double r) {
426  double rhoinv = rinv(r1, phi1, r2, phi2);
427  if (std::abs(rhoinv) > rinvmax_) {
428  rhoinv = rinvmax_ * rhoinv / std::abs(rhoinv);
429  }
430  return phi1 + asin(0.5 * r * rhoinv) - asin(0.5 * r1 * rhoinv);
431 }
432 
433 //--- Helper function to calculate rinv for two stubs at (r1,phi1) and (r2,phi2)
434 
435 double TrackletConfigBuilder::rinv(double r1, double phi1, double r2, double phi2) {
436  double deltaphi = phi1 - phi2;
437  return 2 * sin(deltaphi) / sqrt(r2 * r2 + r1 * r1 - 2 * r1 * r2 * cos(deltaphi));
438 }
439 
440 std::string TrackletConfigBuilder::iSeedStr(unsigned int iSeed) const {
441  static std::string name[8] = {"L1L2", "L2L3", "L3L4", "L5L6", "D1D2", "D3D4", "L1D1", "L2D1"};
442 
443  assert(iSeed < 8);
444  return name[iSeed];
445 }
446 
448  static std::string num[32] = {"1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11",
449  "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22",
450  "23", "24", "25", "26", "27", "28", "29", "30", "31", "32"};
451  assert(i < 32);
452  return num[i];
453 }
454 
456  static std::string name[12] = {"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L"};
457 
458  assert(iTC < 12);
459  return name[iTC];
460 }
461 
462 std::string TrackletConfigBuilder::iRegStr(unsigned int iReg, unsigned int iSeed) const {
463  static std::string name[8] = {"A", "B", "C", "D", "E", "F", "G", "H"};
464 
465  static std::string nameOverlap[8] = {"X", "Y", "Z", "W", "Q", "R", "S", "T"};
466 
467  static std::string nameL2L3[4] = {"I", "J", "K", "L"};
468 
469  if (iSeed == Seed::L2L3) {
470  assert(iReg < 4);
471  return nameL2L3[iReg];
472  }
473  if (iSeed == Seed::L1D1 || iSeed == Seed::L2D1) {
474  assert(iReg < 8);
475  return nameOverlap[iReg];
476  }
477  assert(iReg < 8);
478  return name[iReg];
479 }
480 
481 std::string TrackletConfigBuilder::TCName(unsigned int iSeed, unsigned int iTC) const {
482  if (combinedmodules_) {
483  return "TP_" + iSeedStr(iSeed) + iTCStr(iTC);
484  } else {
485  return "TC_" + iSeedStr(iSeed) + iTCStr(iTC);
486  }
487 }
488 
490  return ilayer < 6 ? ("L" + numStr(ilayer)) : ("D" + numStr(ilayer - 6));
491 }
492 
494  unsigned int iTC,
495  unsigned int ilayer,
496  unsigned int ireg) const {
497  return "TPROJ_" + iSeedStr(iSeed) + iTCStr(iTC) + "_" + LayerName(ilayer) + "PHI" + iTCStr(ireg);
498 }
499 
500 std::string TrackletConfigBuilder::PRName(unsigned int ilayer, unsigned int ireg) const {
501  if (combinedmodules_) {
502  return "MP_" + LayerName(ilayer) + "PHI" + iTCStr(ireg);
503  } else {
504  return "PR_" + LayerName(ilayer) + "PHI" + iTCStr(ireg);
505  }
506 }
507 
508 void TrackletConfigBuilder::writeProjectionMemories(std::ostream& os, std::ostream& memories, std::ostream&) {
509  // Each TC (e.g. TC_L1L2D) writes a projection memory (TPROJ) for each layer the seed projects to,
510  // with name indicating the TC and which layer & phi region it projects to (e.g. TPROJ_L1L2D_L3PHIA).
511  //
512  // Each PR (e.g. PR_L3PHIA) reads all TPROJ memories for the given layer & phi region.
513 
514  for (unsigned int ilayer = 0; ilayer < N_LAYER + N_DISK; ilayer++) {
515  for (unsigned int ireg = 0; ireg < projections_[ilayer].size(); ireg++) {
516  for (unsigned int imem = 0; imem < projections_[ilayer][ireg].size(); imem++) {
517  unsigned int iSeed = projections_[ilayer][ireg][imem].first;
518  unsigned int iTC = projections_[ilayer][ireg][imem].second;
519 
520  memories << "TrackletProjections: " + TPROJName(iSeed, iTC, ilayer, ireg) + " [54]" << std::endl;
521 
522  os << TPROJName(iSeed, iTC, ilayer, ireg) << " input=> " << TCName(iSeed, iTC) << ".projout"
523  << LayerName(ilayer) << "PHI" << iTCStr(ireg) << " output=> " << PRName(ilayer, ireg) << ".projin"
524  << std::endl;
525  }
526  }
527  }
528 }
529 
531  unsigned int ireg1,
532  unsigned int ivm1,
533  unsigned int l2,
534  unsigned int ireg2,
535  unsigned int ivm2,
536  unsigned int iseed) const {
537  return "SP_" + LayerName(l1) + "PHI" + iRegStr(ireg1, iseed) + numStr(ivm1) + "_" + LayerName(l2) + "PHI" +
538  iRegStr(ireg2, iseed) + numStr(ivm2);
539 }
540 
542  unsigned int ireg1,
543  unsigned int ivm1,
544  unsigned int l2,
545  unsigned int ireg2,
546  unsigned int ivm2,
547  unsigned int l3,
548  unsigned int ireg3,
549  unsigned int ivm3,
550  unsigned int iseed) const {
551  return "SPD_" + LayerName(l1) + "PHI" + iRegStr(ireg1, iseed) + numStr(ivm1) + "_" + LayerName(l2) + "PHI" +
552  iRegStr(ireg2, iseed) + numStr(ivm2) + "_" + LayerName(l3) + "PHI" + iRegStr(ireg3, iseed) + numStr(ivm3);
553 }
554 
556  unsigned int ireg1,
557  unsigned int ivm1,
558  unsigned int l2,
559  unsigned int ireg2,
560  unsigned int ivm2,
561  unsigned int iseed) const {
562  return "TE_" + LayerName(l1) + "PHI" + iRegStr(ireg1, iseed) + numStr(ivm1) + "_" + LayerName(l2) + "PHI" +
563  iRegStr(ireg2, iseed) + numStr(ivm2);
564 }
565 
567  unsigned int ireg1,
568  unsigned int ivm1,
569  unsigned int l2,
570  unsigned int ireg2,
571  unsigned int ivm2,
572  unsigned int iseed) const {
573  return "TED_" + LayerName(l1) + "PHI" + iRegStr(ireg1, iseed) + numStr(ivm1) + "_" + LayerName(l2) + "PHI" +
574  iRegStr(ireg2, iseed) + numStr(ivm2);
575 }
576 
577 std::string TrackletConfigBuilder::TParName(unsigned int l1, unsigned int l2, unsigned int l3, unsigned int itc) const {
578  return "TPAR_" + LayerName(l1) + LayerName(l2) + LayerName(l3) + iTCStr(itc);
579 }
580 
581 std::string TrackletConfigBuilder::TCDName(unsigned int l1, unsigned int l2, unsigned int l3, unsigned int itc) const {
582  return "TCD_" + LayerName(l1) + LayerName(l2) + LayerName(l3) + iTCStr(itc);
583 }
584 
586  unsigned int l2,
587  unsigned int l3,
588  unsigned int itc,
589  unsigned int projlayer,
590  unsigned int projreg) const {
591  return "TPROJ_" + LayerName(l1) + LayerName(l2) + LayerName(l3) + iTCStr(itc) + "_" + LayerName(projlayer) + "PHI" +
592  iTCStr(projreg);
593 }
594 
595 std::string TrackletConfigBuilder::FTName(unsigned int l1, unsigned int l2, unsigned int l3) const {
596  return "FT_" + LayerName(l1) + LayerName(l2) + LayerName(l3);
597 }
598 
600  unsigned int ireg1,
601  unsigned int l2,
602  unsigned int ireg2,
603  unsigned int iseed,
604  unsigned int count) const {
605  return "TRE_" + LayerName(l1) + iRegStr(ireg1, iseed) + LayerName(l2) + iRegStr(ireg2, iseed) + "_" + numStr(count);
606 }
607 
609  unsigned int ireg1,
610  unsigned int l2,
611  unsigned int ireg2,
612  unsigned int l3,
613  unsigned int ireg3,
614  unsigned int iseed,
615  unsigned int count) const {
616  return "ST_" + LayerName(l1) + iRegStr(ireg1, iseed) + LayerName(l2) + iRegStr(ireg2, iseed) + "_" + LayerName(l3) +
617  iRegStr(ireg3, iseed) + "_" + numStr(count);
618 }
619 
620 void TrackletConfigBuilder::writeSPMemories(std::ostream& os, std::ostream& memories, std::ostream& modules) {
621  // Each TE reads one VM in two seed layers, finds stub pairs & writes to a StubPair ("SP") memory.
622  //
623  // Each TC reads several StubPair (SP) memories, each containing a pair of VMs of two seeding layers.
624  // Several TC are created for each layer pair, and the SP distributed between them.
625  // If TC name is TC_L1L2C, "C" indicates this is the 3rd TC in L1L2.
626 
627  if (combinedmodules_)
628  return;
629 
630  for (unsigned int iSeed = 0; iSeed < N_SEED_PROMPT; iSeed++) {
631  for (unsigned int iTC = 0; iTC < TC_[iSeed].size(); iTC++) {
632  for (unsigned int iTE = 0; iTE < TC_[iSeed][iTC].size(); iTE++) {
633  unsigned int theTE = TC_[iSeed][iTC][iTE];
634 
635  unsigned int TE1 = TE_[iSeed][theTE].first;
636  unsigned int TE2 = TE_[iSeed][theTE].second;
637 
638  unsigned int l1 = seedLayers(iSeed).first;
639  unsigned int l2 = seedLayers(iSeed).second;
640 
641  memories << "StubPairs: "
642  << SPName(l1, TE1 / NVMTE_[iSeed].first, TE1, l2, TE2 / NVMTE_[iSeed].second, TE2, iSeed) << " [12]"
643  << std::endl;
644  modules << "TrackletEngine: "
645  << TEName(l1, TE1 / NVMTE_[iSeed].first, TE1, l2, TE2 / NVMTE_[iSeed].second, TE2, iSeed) << std::endl;
646 
647  os << SPName(l1, TE1 / NVMTE_[iSeed].first, TE1, l2, TE2 / NVMTE_[iSeed].second, TE2, iSeed) << " input=> "
648  << TEName(l1, TE1 / NVMTE_[iSeed].first, TE1, l2, TE2 / NVMTE_[iSeed].second, TE2, iSeed)
649  << ".stubpairout output=> " << TCName(iSeed, iTC) << ".stubpairin" << std::endl;
650  }
651  }
652  }
653 }
654 
655 void TrackletConfigBuilder::writeSPDMemories(std::ostream& wires, std::ostream& memories, std::ostream& modules) {
656  // Similar to writeSPMemories, but for displaced (=extended) tracking,
657  // with seeds based on triplets of layers.
658 
659  if (!extended_)
660  return;
661 
662  vector<string> stubTriplets[N_SEED];
663 
664  for (unsigned int iSeed = N_SEED_PROMPT; iSeed < N_SEED; iSeed++) {
665  int layerdisk1 = settings_.seedlayers(0, iSeed);
666  int layerdisk2 = settings_.seedlayers(1, iSeed);
667  int layerdisk3 = settings_.seedlayers(2, iSeed);
668 
669  unsigned int nallstub1 = settings_.nallstubs(layerdisk1);
670  unsigned int nallstub2 = settings_.nallstubs(layerdisk2);
671  unsigned int nallstub3 = settings_.nallstubs(layerdisk3);
672 
673  unsigned int nvm1 = settings_.nvmte(0, iSeed);
674  unsigned int nvm2 = settings_.nvmte(1, iSeed);
675  unsigned int nvm3 = settings_.nvmte(2, iSeed);
676 
677  int count = 0;
678  for (unsigned int ireg1 = 0; ireg1 < nallstub1; ireg1++) {
679  for (unsigned int ireg2 = 0; ireg2 < nallstub2; ireg2++) {
680  for (unsigned int ireg3 = 0; ireg3 < nallstub3; ireg3++) {
681  count++;
682  memories << "StubTriplets: " << STName(layerdisk1, ireg1, layerdisk2, ireg2, layerdisk3, ireg3, iSeed, count)
683  << " [18]" << std::endl;
684  stubTriplets[iSeed].push_back(STName(layerdisk1, ireg1, layerdisk2, ireg2, layerdisk3, ireg3, iSeed, count));
685  }
686  }
687  }
688 
689  for (unsigned int ireg1 = 0; ireg1 < nallstub1; ireg1++) {
690  for (unsigned int ivm1 = 0; ivm1 < nvm1; ivm1++) {
691  for (unsigned int ireg2 = 0; ireg2 < nallstub2; ireg2++) {
692  for (unsigned int ivm2 = 0; ivm2 < nvm2; ivm2++) {
693  int count = 0;
694 
695  modules << "TrackletEngineDisplaced: "
696  << TEDName(layerdisk1, ireg1, ireg1 * nvm1 + ivm1, layerdisk2, ireg2, ireg2 * nvm2 + ivm2, iSeed)
697  << std::endl;
698 
699  for (unsigned int ireg3 = 0; ireg3 < nallstub3; ireg3++) {
700  for (unsigned int ivm3 = 0; ivm3 < nvm3; ivm3++) {
701  count++;
702 
703  memories << "StubPairsDisplaced: "
704  << SPDName(layerdisk1,
705  ireg1,
706  ireg1 * nvm1 + ivm1,
707  layerdisk2,
708  ireg2,
709  ireg2 * nvm2 + ivm2,
710  layerdisk3,
711  ireg3,
712  ireg3 * nvm3 + ivm3,
713  iSeed)
714  << " [12]" << std::endl;
715 
716  modules << "TripletEngine: " << TREName(layerdisk1, ireg1, layerdisk2, ireg2, iSeed, count)
717  << std::endl;
718 
719  wires << SPDName(layerdisk1,
720  ireg1,
721  ireg1 * nvm1 + ivm1,
722  layerdisk2,
723  ireg2,
724  ireg2 * nvm2 + ivm2,
725  layerdisk3,
726  ireg3,
727  ireg3 * nvm3 + ivm3,
728  iSeed)
729  << " input=> "
730  << TEDName(layerdisk1, ireg1, ireg1 * nvm1 + ivm1, layerdisk2, ireg2, ireg2 * nvm2 + ivm2, iSeed)
731  << ".stubpairout output=> " << TREName(layerdisk1, ireg1, layerdisk2, ireg2, iSeed, count)
732  << ".stubpair"
733  << "1"
734  << "in" << std::endl;
735  }
736  }
737  }
738  }
739  }
740  }
741 
742  unsigned int nTC = 10;
743  for (unsigned int itc = 0; itc < nTC; itc++) {
744  for (int iproj = 0; iproj < 4; iproj++) {
745  int ilay = settings_.projlayers(iSeed, iproj);
746  if (ilay > 0) {
747  unsigned int nallstub = settings_.nallstubs(ilay - 1);
748  for (unsigned int ireg = 0; ireg < nallstub; ireg++) {
749  memories << "TrackletProjections: " << TPROJName(layerdisk1, layerdisk2, layerdisk3, itc, ilay - 1, ireg)
750  << " [54]" << std::endl;
751  }
752  }
753 
754  int idisk = settings_.projdisks(iSeed, iproj);
755  if (idisk > 0) {
756  unsigned int nallstub = settings_.nallstubs(idisk + 5);
757  for (unsigned int ireg = 0; ireg < nallstub; ireg++) {
758  memories << "TrackletProjections: " << TPROJName(layerdisk1, layerdisk2, layerdisk3, itc, idisk + 5, ireg)
759  << " [54]" << std::endl;
760 
761  wires << TPROJName(layerdisk1, layerdisk2, layerdisk3, itc, idisk + 5, ireg) << " input=> "
762  << TCDName(layerdisk1, layerdisk2, layerdisk3, itc) << ".projout" << LayerName(idisk + 1) << "PHI"
763  << iTCStr(ireg) << " output=> "
764  << "PR_" << LayerName(idisk + 1) << "PHI" << iTCStr(ireg) << ".projin" << std::endl;
765  }
766  }
767  }
768 
769  memories << "TrackletParameters: " << TParName(layerdisk1, layerdisk2, layerdisk3, itc) << " [56]" << std::endl;
770 
771  modules << "TrackletCalculatorDisplaced: " << TCDName(layerdisk1, layerdisk2, layerdisk3, itc) << std::endl;
772  }
773 
774  unsigned int nST = stubTriplets[iSeed].size();
775  for (unsigned int iST = 0; iST < nST; iST++) {
776  unsigned int iTC = (iST * nTC) / nST;
777  assert(iTC < nTC);
778  string stname = stubTriplets[iSeed][iST];
779  string trename = "TRE_" + stname.substr(3, 6) + "_";
780  unsigned int stlen = stname.size();
781  if (stname[stlen - 2] == '_')
782  trename += stname.substr(stlen - 1, 1);
783  if (stname[stlen - 3] == '_')
784  trename += stname.substr(stlen - 2, 2);
785  wires << stname << " input=> " << trename << ".stubtripout output=> "
786  << TCDName(layerdisk1, layerdisk2, layerdisk3, iTC) << ".stubtriplet" << ((iST * nTC) % nST) << "in"
787  << std::endl;
788  }
789 
790  modules << "FitTrack: " << FTName(layerdisk1, layerdisk2, layerdisk3) << std::endl;
791  }
792 }
793 
794 void TrackletConfigBuilder::writeAPMemories(std::ostream& os, std::ostream& memories, std::ostream& modules) {
795  // The AllProjection memories (e.g. AP_L2PHIA) contain the intercept point of the projection to
796  // a layer. Each is written by one PR module of similar name (e.g. PR_L2PHIA), and read by
797  // a MC (e.g. MC_L2PHIA).
798 
799  if (combinedmodules_)
800  return;
801 
802  for (unsigned int ilayer = 0; ilayer < N_LAYER + N_DISK; ilayer++) {
803  for (unsigned int iReg = 0; iReg < NRegions_[ilayer]; iReg++) {
804  memories << "AllProj: AP_" << LayerName(ilayer) << "PHI" << iTCStr(iReg) << " [56]" << std::endl;
805  modules << "ProjectionRouter: PR_" << LayerName(ilayer) << "PHI" << iTCStr(iReg) << std::endl;
806 
807  os << "AP_" << LayerName(ilayer) << "PHI" << iTCStr(iReg) << " input=> PR_" << LayerName(ilayer) << "PHI"
808  << iTCStr(iReg) << ".allprojout output=> MC_" << LayerName(ilayer) << "PHI" << iTCStr(iReg) << ".allprojin"
809  << std::endl;
810  }
811  }
812 }
813 
814 void TrackletConfigBuilder::writeCMMemories(std::ostream& os, std::ostream& memories, std::ostream& modules) {
815  // The CandidateMatch memory (e.g. CM_L1PHIA1) are each written by ME module of similar name
816  // (e.g. ME_L1PHIA1) and contain indices of matching (tracklet projections,stubs) in the specified
817  // VM region.
818  // All CM memories in a given phi region (e.g. L1PHIA) are read by a MC module (e.g. MC_L1PHIA) that
819  // does more precise matching.
820 
821  if (combinedmodules_)
822  return;
823 
824  for (unsigned int ilayer = 0; ilayer < N_LAYER + N_DISK; ilayer++) {
825  for (unsigned int iME = 0; iME < NVMME_[ilayer] * NRegions_[ilayer]; iME++) {
826  memories << "CandidateMatch: CM_" << LayerName(ilayer) << "PHI" << iTCStr(iME / NVMME_[ilayer]) << iME + 1
827  << " [12]" << std::endl;
828  modules << "MatchEngine: ME_" << LayerName(ilayer) << "PHI" << iTCStr(iME / NVMME_[ilayer]) << iME + 1
829  << std::endl;
830 
831  os << "CM_" << LayerName(ilayer) << "PHI" << iTCStr(iME / NVMME_[ilayer]) << iME + 1 << " input=> ME_"
832  << LayerName(ilayer) << "PHI" << iTCStr(iME / NVMME_[ilayer]) << iME + 1 << ".matchout output=> MC_"
833  << LayerName(ilayer) << "PHI" << iTCStr(iME / NVMME_[ilayer]) << ".matchin" << std::endl;
834  }
835  }
836 }
837 
838 void TrackletConfigBuilder::writeVMPROJMemories(std::ostream& os, std::ostream& memories, std::ostream&) {
839  // The VMPROJ memories (e.g. VMPROJ_L2PHIA1) written by a PR module each correspond to projections to
840  // a single VM region in a layer. Each is filled by the PR using all projections (TPROJ) to this VM
841  // from different seeding layers.
842  //
843  // Each VMPROJ memory is read by a ME module, which matches the projection to stubs.
844 
845  if (combinedmodules_)
846  return;
847 
848  for (unsigned int ilayer = 0; ilayer < N_LAYER + N_DISK; ilayer++) {
849  for (unsigned int iME = 0; iME < NVMME_[ilayer] * NRegions_[ilayer]; iME++) {
850  memories << "VMProjections: VMPROJ_" << LayerName(ilayer) << "PHI" << iTCStr(iME / NVMME_[ilayer]) << iME + 1
851  << " [13]" << std::endl;
852 
853  os << "VMPROJ_" << LayerName(ilayer) << "PHI" << iTCStr(iME / NVMME_[ilayer]) << iME + 1 << " input=> PR_"
854  << LayerName(ilayer) << "PHI" << iTCStr(iME / NVMME_[ilayer]) << ".vmprojout"
855  << "PHI" << iTCStr(iME / NVMME_[ilayer]) << iME + 1 << " output=> ME_" << LayerName(ilayer) << "PHI"
856  << iTCStr(iME / NVMME_[ilayer]) << iME + 1 << ".vmprojin" << std::endl;
857  }
858  }
859 }
860 
861 void TrackletConfigBuilder::writeFMMemories(std::ostream& os, std::ostream& memories, std::ostream& modules) {
862  // All FullMatch (e.g. FM_L2L3_L1PHIA) memories corresponding to a matches between stubs & tracklets
863  // in a given region (e.g. L1PHIA) from all seeding layers, are written by a MC module (e.g. MC_L1PHIA).
864  //
865  // All FullMatch memories corresponding to a given seed pair are read by the TrackBuilder (e.g. FT_L1L2),
866  // which checks if the track has stubs in enough layers.
867 
868  if (combinedmodules_) {
869  for (unsigned int ilayer = 0; ilayer < N_LAYER + N_DISK; ilayer++) {
870  for (unsigned int iReg = 0; iReg < NRegions_[ilayer]; iReg++) {
871  modules << "MatchProcessor: MP_" << LayerName(ilayer) << "PHI" << iTCStr(iReg) << std::endl;
872  for (unsigned int iSeed = 0; iSeed < N_SEED_PROMPT; iSeed++) {
873  if (matchport_[iSeed][ilayer] == -1)
874  continue;
875  memories << "FullMatch: FM_" << iSeedStr(iSeed) << "_" << LayerName(ilayer) << "PHI" << iTCStr(iReg)
876  << " [36]" << std::endl;
877  os << "FM_" << iSeedStr(iSeed) << "_" << LayerName(ilayer) << "PHI" << iTCStr(iReg) << " input=> MP_"
878  << LayerName(ilayer) << "PHI" << iTCStr(iReg) << ".matchout1 output=> FT_" << iSeedStr(iSeed)
879  << ".fullmatch" << matchport_[iSeed][ilayer] << "in" << iReg + 1 << std::endl;
880  }
881  }
882  }
883  } else {
884  for (unsigned int ilayer = 0; ilayer < N_LAYER + N_DISK; ilayer++) {
885  for (unsigned int iReg = 0; iReg < NRegions_[ilayer]; iReg++) {
886  modules << "MatchCalculator: MC_" << LayerName(ilayer) << "PHI" << iTCStr(iReg) << std::endl;
887  for (unsigned int iSeed = 0; iSeed < N_SEED_PROMPT; iSeed++) {
888  if (matchport_[iSeed][ilayer] == -1)
889  continue;
890  memories << "FullMatch: FM_" << iSeedStr(iSeed) << "_" << LayerName(ilayer) << "PHI" << iTCStr(iReg)
891  << " [36]" << std::endl;
892  os << "FM_" << iSeedStr(iSeed) << "_" << LayerName(ilayer) << "PHI" << iTCStr(iReg) << " input=> MC_"
893  << LayerName(ilayer) << "PHI" << iTCStr(iReg) << ".matchout1 output=> FT_" << iSeedStr(iSeed)
894  << ".fullmatch" << matchport_[iSeed][ilayer] << "in" << iReg + 1 << std::endl;
895  }
896  }
897  }
898  }
899 }
900 
901 void TrackletConfigBuilder::writeASMemories(std::ostream& os, std::ostream& memories, std::ostream& modules) {
902  // Each VMR writes AllStub memories (AS) for a single phi region (e.g. PHIC),
903  // merging data from all DTCs related to this phi region. It does so by merging data from
904  // the IL memories written by all IRs for this phi region. The wiring map lists all
905  // IL memories that feed (">") into a single VMR ("VMR_L1PHIC") that writes to the
906  // an AS memory ("AS_L1PHIC").
907  // Multiple copies of each AS memory exist where several modules in chain want to read it.
908 
909  if (combinedmodules_) {
910  //First write AS memories used by MatchProcessor
911  for (unsigned int ilayer = 0; ilayer < N_LAYER + N_DISK; ilayer++) {
912  for (unsigned int iReg = 0; iReg < NRegions_[ilayer]; iReg++) {
913  memories << "AllStubs: AS_" << LayerName(ilayer) << "PHI" << iTCStr(iReg) << "n1"
914  << " [42]" << std::endl;
915  if (combinedmodules_) {
916  modules << "VMRouterCM: VMR_" << LayerName(ilayer) << "PHI" << iTCStr(iReg) << std::endl;
917  } else {
918  modules << "VMRouter: VMR_" << LayerName(ilayer) << "PHI" << iTCStr(iReg) << std::endl;
919  }
920  os << "AS_" << LayerName(ilayer) << "PHI" << iTCStr(iReg) << "n1"
921  << " input=> VMR_" << LayerName(ilayer) << "PHI" << iTCStr(iReg) << ".allstubout output=> MP_"
922  << LayerName(ilayer) << "PHI" << iTCStr(iReg) << ".allstubin" << std::endl;
923  }
924  }
925 
926  //Next write AS memories used by TrackletProcessor
927  for (unsigned int ilayer = 0; ilayer < N_LAYER + N_DISK; ilayer++) {
928  for (int iReg = 0; iReg < (int)NRegions_[ilayer]; iReg++) {
929  unsigned int nmem = 1;
930 
931  for (unsigned int iSeed = 0; iSeed < N_SEED_PROMPT; iSeed++) {
932  unsigned int l1 = seedLayers(iSeed).first;
933  unsigned int l2 = seedLayers(iSeed).second;
934 
935  if (ilayer != l1 && ilayer != l2)
936  continue;
937 
938  bool inner = ilayer == l1;
939 
940  for (unsigned int iTC = 0; iTC < TC_[iSeed].size(); iTC++) {
941  int nTCReg = TC_[iSeed].size() / NRegions_[l2];
942 
943  int iTCReg = iTC / nTCReg;
944 
945  int jTCReg = iTC % nTCReg;
946 
947  if (ilayer == l2) {
948  if (iTCReg != iReg)
949  continue;
950  }
951 
952  string ext = "";
953 
954  if (ilayer == l1) {
955  int ratio = NRegions_[l1] / NRegions_[l2];
956  int min = iTCReg * ratio - 1 + jTCReg;
957  int max = (iTCReg + 1) * ratio - (nTCReg - jTCReg - 1);
958  if ((int)iReg < min || (int)iReg > max)
959  continue;
960 
961  if (max - min >= 2) {
962  ext = "M";
963  if (iReg == min)
964  ext = "R";
965  if (iReg == max)
966  ext = "L";
967  }
968 
969  if (max - min == 1) {
970  if (nTCReg == 2) {
971  assert(0);
972  if (jTCReg == 0) {
973  if (iReg == min)
974  ext = "R";
975  if (iReg == max)
976  ext = "B";
977  }
978  if (jTCReg == 1) {
979  if (iReg == min)
980  ext = "A";
981  if (iReg == max)
982  ext = "L";
983  }
984  }
985  if (nTCReg == 3) {
986  if (jTCReg == 0) {
987  if (iReg == min)
988  ext = "A";
989  if (iReg == max)
990  ext = "F";
991  }
992  if (jTCReg == 1) {
993  if (iReg == min)
994  ext = "E";
995  if (iReg == max)
996  ext = "D";
997  }
998  if (jTCReg == 2) {
999  if (iReg == min)
1000  ext = "C";
1001  if (iReg == max)
1002  ext = "B";
1003  }
1004  }
1005  }
1006  assert(!ext.empty());
1007  }
1008 
1009  if (ext.empty()) {
1010  ext = "_" + LayerName(l1) + iTCStr(iTC);
1011  }
1012 
1013  if (iSeed < 4) { //Barrel seeding
1014  ext = "_B" + ext;
1015  } else if (iSeed > 5) {
1016  ext = "_O" + ext;
1017  } else {
1018  ext = "_D" + ext;
1019  }
1020 
1021  nmem++;
1022  if (inner) {
1023  memories << "AllInnerStubs: ";
1024  } else {
1025  memories << "AllStubs: ";
1026  }
1027  memories << "AS_" << LayerName(ilayer) << "PHI" << iTCStr(iReg) << ext << " [42]" << std::endl;
1028  os << "AS_" << LayerName(ilayer) << "PHI" << iTCStr(iReg) << ext << " input=> VMR_" << LayerName(ilayer)
1029  << "PHI" << iTCStr(iReg) << ".all" << (inner ? "inner" : "") << "stubout output=> TP_" << iSeedStr(iSeed)
1030  << iTCStr(iTC);
1031  if (inner) {
1032  os << ".innerallstubin" << std::endl;
1033  } else {
1034  os << ".outerallstubin" << std::endl;
1035  }
1036  }
1037  }
1038  }
1039  }
1040 
1041  } else {
1042  //First write AS memories used by MatchCalculator
1043  for (unsigned int ilayer = 0; ilayer < N_LAYER + N_DISK; ilayer++) {
1044  for (unsigned int iReg = 0; iReg < NRegions_[ilayer]; iReg++) {
1045  memories << "AllStubs: AS_" << LayerName(ilayer) << "PHI" << iTCStr(iReg) << "n1"
1046  << " [42]" << std::endl;
1047  if (combinedmodules_) {
1048  modules << "VMRouterCM: VMR_" << LayerName(ilayer) << "PHI" << iTCStr(iReg) << std::endl;
1049  } else {
1050  modules << "VMRouter: VMR_" << LayerName(ilayer) << "PHI" << iTCStr(iReg) << std::endl;
1051  }
1052  os << "AS_" << LayerName(ilayer) << "PHI" << iTCStr(iReg) << "n1"
1053  << " input=> VMR_" << LayerName(ilayer) << "PHI" << iTCStr(iReg) << ".allstubout output=> MC_"
1054  << LayerName(ilayer) << "PHI" << iTCStr(iReg) << ".allstubin" << std::endl;
1055  }
1056  }
1057 
1058  //Next write AS memories used by TrackletCalculator
1059  for (unsigned int ilayer = 0; ilayer < N_LAYER + N_DISK; ilayer++) {
1060  for (unsigned int iReg = 0; iReg < NRegions_[ilayer]; iReg++) {
1061  unsigned int nmem = 1;
1062 
1063  for (unsigned int iSeed = 0; iSeed < N_SEED_PROMPT; iSeed++) {
1064  unsigned int l1 = seedLayers(iSeed).first;
1065  unsigned int l2 = seedLayers(iSeed).second;
1066 
1067  if (ilayer != l1 && ilayer != l2)
1068  continue;
1069 
1070  for (unsigned int iTC = 0; iTC < TC_[iSeed].size(); iTC++) {
1071  bool used = false;
1072  // Each TC processes data from several TEs.
1073  for (unsigned int iTE = 0; iTE < TC_[iSeed][iTC].size(); iTE++) {
1074  unsigned int theTE = TC_[iSeed][iTC][iTE];
1075 
1076  unsigned int TE1 = TE_[iSeed][theTE].first; // VM in inner/outer layer of this TE.
1077  unsigned int TE2 = TE_[iSeed][theTE].second;
1078 
1079  if (l1 == ilayer && iReg == TE1 / NVMTE_[iSeed].first)
1080  used = true;
1081  if (l2 == ilayer && iReg == TE2 / NVMTE_[iSeed].second)
1082  used = true;
1083  }
1084 
1085  if (used) {
1086  nmem++; // Another copy of memory
1087  memories << "AllStubs: AS_" << LayerName(ilayer) << "PHI" << iTCStr(iReg) << "n" << nmem << " [42]"
1088  << std::endl;
1089  os << "AS_" << LayerName(ilayer) << "PHI" << iTCStr(iReg) << "n" << nmem << " input=> VMR_"
1090  << LayerName(ilayer) << "PHI" << iTCStr(iReg) << ".allstubout output=> TC_" << iSeedStr(iSeed)
1091  << iTCStr(iTC);
1092  if (ilayer == l1) {
1093  os << ".innerallstubin" << std::endl;
1094  } else {
1095  os << ".outerallstubin" << std::endl;
1096  }
1097  }
1098  }
1099  }
1100  }
1101  }
1102  }
1103 }
1104 
1105 void TrackletConfigBuilder::writeVMSMemories(std::ostream& os, std::ostream& memories, std::ostream&) {
1106  // Each VMR writes to Virtual Module memories ("VMS") to be used later by the ME or TE etc.
1107  // Memory VMSTE_L1PHIC9-12 is the memory for small phi region C in L1 for the TE module.
1108  // Numbers 9-12 correspond to the 4 VMs in this phi region.
1109  //
1110  // Each TE reads one VMS memory in each seeding layer.
1111 
1112  if (combinedmodules_) {
1113  //First write VMS memories used by MatchProcessor
1114  for (unsigned int ilayer = 0; ilayer < N_LAYER + N_DISK; ilayer++) {
1115  for (unsigned int iReg = 0; iReg < NRegions_[ilayer]; iReg++) {
1116  memories << "VMStubsME: VMSME_" << LayerName(ilayer) << "PHI" << iTCStr(iReg) << "n1 [18]" << std::endl;
1117  os << "VMSME_" << LayerName(ilayer) << "PHI" << iTCStr(iReg) << "n1"
1118  << " input=> VMR_" << LayerName(ilayer) << "PHI" << iTCStr(iReg) << ".vmstuboutPHI" << iTCStr(iReg)
1119  << " output=> MP_" << LayerName(ilayer) << "PHI" << iTCStr(iReg) << ".vmstubin" << std::endl;
1120  }
1121  }
1122 
1123  //Next write VMS memories used by TrackletProcessor
1124  for (unsigned int iSeed = 0; iSeed < N_SEED_PROMPT; iSeed++) {
1125  //FIXME - code could be cleaner
1126  unsigned int l1 = seedLayers(iSeed).first;
1127  unsigned int l2 = seedLayers(iSeed).second;
1128 
1129  unsigned int ilayer = seedLayers(iSeed).second;
1130 
1131  //for(unsigned int iReg=0;iReg<NRegions_[ilayer];iReg++){
1132 
1133  unsigned int nTCReg = TC_[iSeed].size() / NRegions_[l2];
1134 
1135  for (unsigned int iReg = 0; iReg < NRegions_[l2]; iReg++) {
1136  unsigned int nmem = 0;
1137  //Hack since we use same module twice
1138  if (iSeed == Seed::L2D1) {
1139  nmem = 2;
1140  }
1141 
1142  for (unsigned iTC = 0; iTC < nTCReg; iTC++) {
1143  nmem++;
1144  memories << "VMStubsTE: VMSTE_" << LayerName(ilayer) << "PHI" << iRegStr(iReg, iSeed) << "n" << nmem
1145  << " [18]" << std::endl;
1146  os << "VMSTE_" << LayerName(ilayer) << "PHI" << iRegStr(iReg, iSeed) << "n" << nmem << " input=> VMR_"
1147  << LayerName(ilayer) << "PHI" << iTCStr(iReg) << ".vmstubout_seed_" << iSeed << " output=> TP_"
1148  << LayerName(l1) << LayerName(l2) << iTCStr(iReg * nTCReg + iTC) << ".outervmstubin" << std::endl;
1149  }
1150  }
1151  }
1152 
1153  } else {
1154  //First write VMS memories used by MatchEngine
1155  for (unsigned int ilayer = 0; ilayer < N_LAYER + N_DISK; ilayer++) {
1156  for (unsigned int iVMME = 0; iVMME < NVMME_[ilayer] * NRegions_[ilayer]; iVMME++) {
1157  unsigned int iReg = iVMME / NVMME_[ilayer];
1158  memories << "VMStubsME: VMSME_" << LayerName(ilayer) << "PHI" << iTCStr(iReg) << iVMME + 1 << "n1 [18]"
1159  << std::endl;
1160  os << "VMSME_" << LayerName(ilayer) << "PHI" << iTCStr(iReg) << iVMME + 1 << "n1"
1161  << " input=> VMR_" << LayerName(ilayer) << "PHI" << iTCStr(iReg) << ".vmstuboutMEPHI" << iTCStr(iReg)
1162  << iVMME + 1 << " output=> ME_" << LayerName(ilayer) << "PHI" << iTCStr(iReg) << iVMME + 1 << ".vmstubin"
1163  << std::endl;
1164  }
1165  }
1166 
1167  // Next write VMS memories used by TrackletEngine
1168  // Each TE processes one VM region in inner + outer seeding layers, and needs its own copy of input memories.
1169  for (unsigned int iSeed = 0; iSeed < N_SEED_PROMPT; iSeed++) {
1170  for (unsigned int innerouterseed = 0; innerouterseed < 2; innerouterseed++) {
1171  //FIXME - code could be cleaner
1172  unsigned int l1 = seedLayers(iSeed).first;
1173  unsigned int l2 = seedLayers(iSeed).second;
1174 
1175  unsigned int NVMTE1 = NVMTE_[iSeed].first;
1176  unsigned int NVMTE2 = NVMTE_[iSeed].second;
1177 
1178  unsigned int ilayer = l1;
1179  unsigned int NVMTE = NVMTE1;
1180  if (innerouterseed == 1) {
1181  ilayer = l2;
1182  NVMTE = NVMTE2;
1183  }
1184 
1185  for (unsigned int iVMTE = 0; iVMTE < NVMTE * NRegions_[ilayer]; iVMTE++) {
1186  unsigned int iReg = iVMTE / NVMTE;
1187 
1188  unsigned int nmem = 0;
1189 
1190  if (iSeed == Seed::L2D1) {
1191  nmem = 4;
1192  }
1193 
1194  for (unsigned int iTE = 0; iTE < TE_[iSeed].size(); iTE++) {
1195  unsigned int TE1 = TE_[iSeed][iTE].first; // VM region in inner/outer layer of this TE
1196  unsigned int TE2 = TE_[iSeed][iTE].second;
1197 
1198  bool used = false;
1199 
1200  if (innerouterseed == 0 && iVMTE == TE1)
1201  used = true;
1202  if (innerouterseed == 1 && iVMTE == TE2)
1203  used = true;
1204 
1205  if (!used)
1206  continue;
1207 
1208  string inorout = "I";
1209  if (innerouterseed == 1)
1210  inorout = "O";
1211 
1212  nmem++; // Add another copy of memory.
1213  memories << "VMStubsTE: VMSTE_" << LayerName(ilayer) << "PHI" << iRegStr(iReg, iSeed) << iVMTE + 1 << "n"
1214  << nmem << " [18]" << std::endl;
1215  os << "VMSTE_" << LayerName(ilayer) << "PHI" << iRegStr(iReg, iSeed) << iVMTE + 1 << "n" << nmem
1216  << " input=> VMR_" << LayerName(ilayer) << "PHI" << iTCStr(iReg) << ".vmstuboutTE" << inorout << "PHI"
1217  << iRegStr(iReg, iSeed) << iVMTE + 1 << " output=> TE_" << LayerName(l1) << "PHI"
1218  << iRegStr(TE1 / NVMTE1, iSeed) << TE1 + 1 << "_" << LayerName(l2) << "PHI"
1219  << iRegStr(TE2 / NVMTE2, iSeed) << TE2 + 1;
1220  if (innerouterseed == 0) {
1221  os << ".innervmstubin" << std::endl;
1222  } else {
1223  os << ".outervmstubin" << std::endl;
1224  }
1225  }
1226  }
1227  }
1228  }
1229  }
1230 }
1231 
1232 void TrackletConfigBuilder::writeTPARMemories(std::ostream& os, std::ostream& memories, std::ostream& modules) {
1233  // Each TC module (e.g. TC_L1L2A) stores helix params in a single TPAR memory of similar name
1234  // (e.g. TPAR_L1L2A). The TPAR is subsequently read by the TrackBuilder (FT).
1235 
1236  if (combinedmodules_) {
1237  for (unsigned int iSeed = 0; iSeed < N_SEED_PROMPT; iSeed++) {
1238  for (unsigned int iTP = 0; iTP < TC_[iSeed].size(); iTP++) {
1239  memories << "TrackletParameters: TPAR_" << iSeedStr(iSeed) << iTCStr(iTP) << " [56]" << std::endl;
1240  modules << "TrackletProcessor: TP_" << iSeedStr(iSeed) << iTCStr(iTP) << std::endl;
1241  os << "TPAR_" << iSeedStr(iSeed) << iTCStr(iTP) << " input=> TP_" << iSeedStr(iSeed) << iTCStr(iTP)
1242  << ".trackpar output=> FT_" << iSeedStr(iSeed) << ".tparin" << std::endl;
1243  }
1244  }
1245  } else {
1246  for (unsigned int iSeed = 0; iSeed < N_SEED_PROMPT; iSeed++) {
1247  for (unsigned int iTC = 0; iTC < TC_[iSeed].size(); iTC++) {
1248  memories << "TrackletParameters: TPAR_" << iSeedStr(iSeed) << iTCStr(iTC) << " [56]" << std::endl;
1249  modules << "TrackletCalculator: TC_" << iSeedStr(iSeed) << iTCStr(iTC) << std::endl;
1250  os << "TPAR_" << iSeedStr(iSeed) << iTCStr(iTC) << " input=> TC_" << iSeedStr(iSeed) << iTCStr(iTC)
1251  << ".trackpar output=> FT_" << iSeedStr(iSeed) << ".tparin" << std::endl;
1252  }
1253  }
1254  }
1255 }
1256 
1257 void TrackletConfigBuilder::writeTFMemories(std::ostream& os, std::ostream& memories, std::ostream& modules) {
1258  for (unsigned int iSeed = 0; iSeed < N_SEED_PROMPT; iSeed++) {
1259  memories << "TrackFit: TF_" << iSeedStr(iSeed) << " [126]" << std::endl;
1260  modules << "FitTrack: FT_" << iSeedStr(iSeed) << std::endl;
1261  os << "TF_" << iSeedStr(iSeed) << " input=> FT_" << iSeedStr(iSeed) << ".trackout output=> PD.trackin" << std::endl;
1262  }
1263 }
1264 
1265 void TrackletConfigBuilder::writeCTMemories(std::ostream& os, std::ostream& memories, std::ostream& modules) {
1266  modules << "PurgeDuplicate: PD" << std::endl;
1267 
1268  for (unsigned int iSeed = 0; iSeed < N_SEED_PROMPT; iSeed++) {
1269  memories << "CleanTrack: CT_" << iSeedStr(iSeed) << " [126]" << std::endl;
1270  os << "CT_" << iSeedStr(iSeed) << " input=> PD.trackout output=>" << std::endl;
1271  }
1272 }
1273 
1274 void TrackletConfigBuilder::writeILMemories(std::ostream& os, std::ostream& memories, std::ostream& modules) {
1275  // Each Input Router (IR) reads stubs from one DTC (e.g. PS10G_1) & sends them
1276  // to 4-8 InputLink (IL) memories (labelled PHIA-PHIH), each corresponding to a small
1277  // phi region of a nonant, for each tracklet layer (L1-L6 or D1-D5) that the DTC
1278  // reads. The InputLink memories have names such as IL_L1PHIC_PS10G_1 to reflect this.
1279 
1280  string olddtc = "";
1281  for (const DTCinfo& info : vecDTCinfo_) {
1282  string dtcname = info.name;
1283  if (olddtc != dtcname) {
1284  // Write one entry per DTC, with each DTC connected to one IR.
1285  modules << "InputRouter: IR_" << dtcname << "_A" << std::endl;
1286  modules << "InputRouter: IR_" << dtcname << "_B" << std::endl;
1287  memories << "DTCLink: DL_" << dtcname << "_A [36]" << std::endl;
1288  memories << "DTCLink: DL_" << dtcname << "_B [36]" << std::endl;
1289  os << "DL_" << dtcname << "_A"
1290  << " input=> output=> IR_" << dtcname << "_A.stubin" << std::endl;
1291  os << "DL_" << dtcname << "_B"
1292  << " input=> output=> IR_" << dtcname << "_B.stubin" << std::endl;
1293  }
1294  olddtc = dtcname;
1295  }
1296 
1297  for (const DTCinfo& info : vecDTCinfo_) {
1298  string dtcname = info.name;
1299  int layerdisk = info.layer;
1300 
1301  for (unsigned int iReg = 0; iReg < NRegions_[layerdisk]; iReg++) {
1302  //--- Ian Tomalin's proposed bug fix
1303  double phiminDTC_A = info.phimin - M_PI / N_SECTOR; // Phi range of each DTC.
1304  double phimaxDTC_A = info.phimax - M_PI / N_SECTOR;
1305  double phiminDTC_B = info.phimin + M_PI / N_SECTOR; // Phi range of each DTC.
1306  double phimaxDTC_B = info.phimax + M_PI / N_SECTOR;
1307  if (allStubs_[layerdisk][iReg].second > phiminDTC_A && allStubs_[layerdisk][iReg].first < phimaxDTC_A) {
1308  memories << "InputLink: IL_" << LayerName(layerdisk) << "PHI" << iTCStr(iReg) << "_" << dtcname << "_A"
1309  << " [36]" << std::endl;
1310  os << "IL_" << LayerName(layerdisk) << "PHI" << iTCStr(iReg) << "_" << dtcname << "_A"
1311  << " input=> IR_" << dtcname << "_A.stubout output=> VMR_" << LayerName(layerdisk) << "PHI" << iTCStr(iReg)
1312  << ".stubin" << std::endl;
1313  }
1314  if (allStubs_[layerdisk][iReg].second > phiminDTC_B && allStubs_[layerdisk][iReg].first < phimaxDTC_B) {
1315  memories << "InputLink: IL_" << LayerName(layerdisk) << "PHI" << iTCStr(iReg) << "_" << dtcname << "_B"
1316  << " [36]" << std::endl;
1317  os << "IL_" << LayerName(layerdisk) << "PHI" << iTCStr(iReg) << "_" << dtcname << "_B"
1318  << " input=> IR_" << dtcname << "_B.stubout output=> VMR_" << LayerName(layerdisk) << "PHI" << iTCStr(iReg)
1319  << ".stubin" << std::endl;
1320  }
1321  //--- Original (buggy) code
1322  /*
1323  double phiminDTC = info.phimin; // Phi range of each DTC.
1324  double phimaxDTC = info.phimax;
1325 
1326  if (allStubs_[layerdisk][iReg].first > phimaxDTC && allStubs_[layerdisk][iReg].second < phiminDTC)
1327  continue;
1328 
1329  // Phi region range must be entirely contained in this DTC to keep this connection.
1330  if (allStubs_[layerdisk][iReg].second < phimaxDTC) {
1331  memories << "InputLink: IL_" << LayerName(layerdisk) << "PHI" << iTCStr(iReg) << "_" << dtcname << "_A"
1332  << " [36]" << std::endl;
1333  os << "IL_" << LayerName(layerdisk) << "PHI" << iTCStr(iReg) << "_" << dtcname << "_A"
1334  << " input=> IR_" << dtcname << "_A.stubout output=> VMR_" << LayerName(layerdisk) << "PHI"
1335  << iTCStr(iReg) << ".stubin" << std::endl;
1336  }
1337 
1338  if (allStubs_[layerdisk][iReg].first > phiminDTC) {
1339  memories << "InputLink: IL_" << LayerName(layerdisk) << "PHI" << iTCStr(iReg) << "_" << dtcname << "_B"
1340  << " [36]" << std::endl;
1341  os << "IL_" << LayerName(layerdisk) << "PHI" << iTCStr(iReg) << "_" << dtcname << "_B"
1342  << " input=> IR_" << dtcname << "_B.stubout output=> VMR_" << LayerName(layerdisk) << "PHI"
1343  << iTCStr(iReg) << ".stubin" << std::endl;
1344  }
1345 */
1346  }
1347  }
1348 }
1349 
1350 //--- Fill streams used to write wiring map to file
1351 
1352 void TrackletConfigBuilder::writeAll(std::ostream& wires, std::ostream& memories, std::ostream& modules) {
1353  writeILMemories(wires, memories, modules);
1354  writeASMemories(wires, memories, modules);
1355  writeVMSMemories(wires, memories, modules);
1356  writeSPMemories(wires, memories, modules);
1357  writeSPDMemories(wires, memories, modules);
1359  writeTPARMemories(wires, memories, modules);
1360  writeVMPROJMemories(wires, memories, modules);
1361  writeAPMemories(wires, memories, modules);
1362  writeCMMemories(wires, memories, modules);
1363  writeFMMemories(wires, memories, modules);
1364  writeTFMemories(wires, memories, modules);
1365  writeCTMemories(wires, memories, modules);
1366 }
void writeProjectionMemories(std::ostream &os, std::ostream &memories, std::ostream &modules)
std::vector< std::vector< std::pair< unsigned int, unsigned int > > > projections_[N_LAYER+N_DISK]
static const TGPicture * info(bool iBackgroundIsBlack)
constexpr int N_DISK
Definition: Settings.h:22
unsigned int NTC(int seed) const
Definition: Settings.h:153
unsigned int seedlayers(int inner, int seed) const
Definition: Settings.h:145
static std::string numStr(unsigned int i)
constexpr unsigned int N_SEED
Definition: Settings.h:24
bool combined() const
Definition: Settings.h:258
Class to process and provide run-time constants used by Track Trigger emulators.
Definition: Setup.h:44
void writeAll(std::ostream &wires, std::ostream &memories, std::ostream &modules)
double dphisectorHG() const
Definition: Settings.h:292
Sin< T >::type sin(const T &t)
Definition: Sin.h:22
static std::string LayerName(unsigned int ilayer)
std::string slotToDTCname(unsigned int slot) const
Definition: Settings.h:434
double zlength() const
Definition: Settings.h:124
double rinvmax() const
Definition: Settings.h:214
void writeASMemories(std::ostream &os, std::ostream &memories, std::ostream &modules)
void writeILMemories(std::ostream &os, std::ostream &memories, std::ostream &modules)
void writeFMMemories(std::ostream &os, std::ostream &memories, std::ostream &modules)
std::vector< std::pair< double, double > > VMStubsME_[N_LAYER+N_DISK]
std::vector< std::pair< unsigned int, unsigned int > > TE_[N_SEED_PROMPT]
std::string TREName(unsigned int l1, unsigned int ireg1, unsigned int l2, unsigned int ireg2, unsigned int iseed, unsigned int count) const
assert(be >=bs)
std::string iRegStr(unsigned int iReg, unsigned int iSeed) const
std::string FTName(unsigned int l1, unsigned int l2, unsigned int l3) const
void setDTCphirange(const tt::Setup *setup=nullptr)
std::string TEDName(unsigned int l1, unsigned int ireg1, unsigned int ivm1, unsigned int l2, unsigned int ireg2, unsigned int ivm2, unsigned int iseed) const
constexpr std::array< uint8_t, layerIndexSize< TrackerTraits > > layer
U second(std::pair< T, U > const &p)
unsigned int projlayers(unsigned int iSeed, unsigned int i) const
Definition: Settings.h:155
std::string PRName(unsigned int ilayer, unsigned int ireg) const
std::string tablePath() const
Definition: Settings.h:193
unsigned int NTC_[N_SEED_PROMPT]
double rmean(unsigned int iLayer) const
Definition: Settings.h:164
std::string iSeedStr(unsigned int iSeed) const
void writeTPARMemories(std::ostream &os, std::ostream &memories, std::ostream &modules)
std::string iTCStr(unsigned int iTC) const
T sqrt(T t)
Definition: SSEVec.h:19
Cos< T >::type cos(const T &t)
Definition: Cos.h:22
std::string TCName(unsigned int iSeed, unsigned int iTC) const
std::vector< std::vector< unsigned int > > TC_[N_SEED_PROMPT]
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
unsigned int projdisks(unsigned int iSeed, unsigned int i) const
Definition: Settings.h:156
void writeSPMemories(std::ostream &os, std::ostream &memories, std::ostream &modules)
double zmean(unsigned int iDisk) const
Definition: Settings.h:167
std::pair< std::vector< std::pair< double, double > >, std::vector< std::pair< double, double > > > VMStubsTE_[N_SEED_PROMPT]
unsigned int nvmte(unsigned int inner, unsigned int iSeed) const
Definition: Settings.h:101
#define M_PI
std::string STName(unsigned int l1, unsigned int ireg1, unsigned int l2, unsigned int ireg2, unsigned int l3, unsigned int ireg3, unsigned int iseed, unsigned int count) const
unsigned int nallstubs(unsigned int layerdisk) const
Definition: Settings.h:107
constexpr unsigned int N_SECTOR
Definition: Settings.h:19
unsigned int NVMME_[N_LAYER+N_DISK]
double rinv(double r1, double phi1, double r2, double phi2)
int iseed
Definition: AMPTWrapper.h:134
double rmaxdisk() const
Definition: Settings.h:125
std::pair< double, double > seedRadii(unsigned int iseed)
void writeCMMemories(std::ostream &os, std::ostream &memories, std::ostream &modules)
unsigned int NRegions_[N_LAYER+N_DISK]
bool validTEPair(unsigned int iseed, unsigned int iTE1, unsigned int iTE2)
void writeVMPROJMemories(std::ostream &os, std::ostream &memories, std::ostream &modules)
void writeTFMemories(std::ostream &os, std::ostream &memories, std::ostream &modules)
bool writeConfig() const
Definition: Settings.h:190
string fname
main script
bool extended() const
Definition: Settings.h:256
unsigned int nvmme(unsigned int layerdisk) const
Definition: Settings.h:104
std::vector< std::pair< double, double > > allStubs_[N_LAYER+N_DISK]
std::string TCDName(unsigned int l1, unsigned int l2, unsigned int l3, unsigned int itc) const
void writeCTMemories(std::ostream &os, std::ostream &memories, std::ostream &modules)
std::pair< unsigned int, unsigned int > seedLayers(unsigned int iSeed)
int matchport_[N_SEED_PROMPT][N_LAYER+N_DISK]
std::string TPROJName(unsigned int iSeed, unsigned int iTC, unsigned int ilayer, unsigned int ireg) const
std::string TEName(unsigned int l1, unsigned int ireg1, unsigned int ivm1, unsigned int l2, unsigned int ireg2, unsigned int ivm2, unsigned int iseed) const
std::pair< double, double > seedPhiRange(double rproj, unsigned int iSeed, unsigned int iTC)
std::string SPDName(unsigned int l1, unsigned int ireg1, unsigned int ivm1, unsigned int l2, unsigned int ireg2, unsigned int ivm2, unsigned int l3, unsigned int ireg3, unsigned int ivm3, unsigned int iseed) const
Definition: memstream.h:15
tmp
align.sh
Definition: createJobs.py:716
std::string TParName(unsigned int l1, unsigned int l2, unsigned int l3, unsigned int itc) const
void writeAPMemories(std::ostream &os, std::ostream &memories, std::ostream &modules)
void writeSPDMemories(std::ostream &os, std::ostream &memories, std::ostream &modules)
void writeVMSMemories(std::ostream &os, std::ostream &memories, std::ostream &modules)
double phi(double r1, double phi1, double r2, double phi2, double r)
std::ofstream openfile(const std::string &dir, const std::string &fname, const char *file, int line)
Definition: Util.h:137
constexpr unsigned int N_SEED_PROMPT
Definition: Settings.h:25
std::string SPName(unsigned int l1, unsigned int ireg1, unsigned int ivm1, unsigned int l2, unsigned int ireg2, unsigned int ivm2, unsigned int iseed) const
std::pair< unsigned int, unsigned int > NVMTE_[N_SEED_PROMPT]
constexpr int N_LAYER
Definition: Settings.h:21
double rcrit() const
Definition: Settings.h:299