CMS 3D CMS Logo

TrackletEventProcessor.cc
Go to the documentation of this file.
11 
13 
14 #include <iomanip>
15 #include <filesystem>
16 
17 using namespace trklet;
18 using namespace std;
19 
21 
23  if (settings_ && settings_->bookHistos()) {
24  histbase_->close();
25  }
26 }
27 
28 void TrackletEventProcessor::init(Settings const& theSettings, const tt::Setup* setup) {
29  settings_ = &theSettings;
30  globals_ = make_unique<Globals>(*settings_);
31 
32  //Verify consistency
33  if (settings_->kphi0pars() != globals_->ITC_L1L2()->phi0_final.K()) {
34  throw cms::Exception("Inconsistency") << "phi0 conversion parameter inconsistency\n";
35  }
36 
37  if (settings_->krinvpars() != globals_->ITC_L1L2()->rinv_final.K()) {
38  throw cms::Exception("Inconsistency") << "ring conversion parameter inconsistency\n";
39  }
40 
41  if (settings_->ktpars() != globals_->ITC_L1L2()->t_final.K()) {
42  throw cms::Exception("Inconsistency") << "t conversion parameter inconsistency\n";
43  }
44 
45  if (settings_->kphider() != globals_->ITC_L1L2()->der_phiL_final.K()) {
46  throw cms::Exception("Inconsistency")
47  << "t conversion parameter inconsistency:" << settings_->kphider() / globals_->ITC_L1L2()->der_phiL_final.K()
48  << "\n";
49  }
50 
51  if (settings_->debugTracklet()) {
52  edm::LogVerbatim("Tracklet") << "========================================================= \n"
53  << "Conversion factors for global coordinates: \n"
54  << "z kz = " << settings_->kz() << "\n"
55  << "r kr = " << settings_->kr() << "\n"
56  << "phi kphi1 = " << settings_->kphi1() << "\n"
57  << "========================================================= \n"
58  << "Conversion factors for track(let) parameters: \n"
59  << "rinv krinvpars = " << settings_->krinvpars() << "\n"
60  << "phi0 kphi0pars = " << settings_->kphi0pars() << "\n"
61  << "d0 kd0pars = " << settings_->kd0pars() << "\n"
62  << "t ktpars = " << settings_->ktpars() << "\n"
63  << "z0 kz0pars = " << settings_->kz0pars() << "\n"
64  << "========================================================= \n"
65  << "phi0bitshift = " << settings_->phi0bitshift() << "\n"
66  << "d0bitshift = ??? \n"
67  << "=========================================================";
68  }
69 
70  if (settings_->bookHistos()) {
71  histbase_ = new HistBase;
72  histbase_->open();
77 
78  globals_->histograms() = histbase_;
79  }
80 
81  sector_ = make_unique<Sector>(*settings_, globals_.get());
82 
83  if (settings_->extended() || settings_->reduced()) {
84  ifstream inmem(settings_->memoryModulesFile().c_str());
85  assert(inmem.good());
86 
87  ifstream inproc(settings_->processingModulesFile().c_str());
88  assert(inproc.good());
89 
90  ifstream inwire(settings_->wiresFile().c_str());
91  assert(inwire.good());
92 
93  configure(inwire, inmem, inproc);
94 
95  } else {
97 
98  //Write configurations to file.
99  if (settings_->writeConfig()) {
100  std::ofstream wires = openfile(settings_->tablePath(), "wires.dat", __FILE__, __LINE__);
101  std::ofstream memorymodules = openfile(settings_->tablePath(), "memorymodules.dat", __FILE__, __LINE__);
102  std::ofstream processingmodules = openfile(settings_->tablePath(), "processingmodules.dat", __FILE__, __LINE__);
103 
104  config.writeAll(wires, memorymodules, processingmodules);
105  }
106 
107  std::stringstream wires;
108  std::stringstream memorymodules;
109  std::stringstream processingmodules;
110 
111  config.writeAll(wires, memorymodules, processingmodules);
112  configure(wires, memorymodules, processingmodules);
113  }
114 }
115 
116 void TrackletEventProcessor::configure(istream& inwire, istream& inmem, istream& inproc) {
117  // get the memory modules
118  if (settings_->debugTracklet()) {
119  edm::LogVerbatim("Tracklet") << "Will read memory modules";
120  }
121 
122  while (inmem.good()) {
123  string memType, memName, size;
124  inmem >> memType >> memName >> size;
125  if (!inmem.good())
126  continue;
127  if (settings_->writetrace()) {
128  edm::LogVerbatim("Tracklet") << "Read memory: " << memType << " " << memName;
129  }
130  sector_->addMem(memType, memName);
131  }
132 
133  // get the processing modules
134  if (settings_->debugTracklet()) {
135  edm::LogVerbatim("Tracklet") << "Will read processing modules";
136  }
137 
138  while (inproc.good()) {
139  string procType, procName;
140  inproc >> procType >> procName;
141  if (!inproc.good())
142  continue;
143  if (settings_->writetrace()) {
144  edm::LogVerbatim("Tracklet") << "Read process: " << procType << " " << procName;
145  }
146  sector_->addProc(procType, procName);
147  }
148 
149  // get the wiring information
150  if (settings_->debugTracklet()) {
151  edm::LogVerbatim("Tracklet") << "Will read wiring information";
152  }
153 
154  while (inwire.good()) {
155  string line;
156  getline(inwire, line);
157  if (!inwire.good())
158  continue;
159  if (settings_->writetrace()) {
160  edm::LogVerbatim("Tracklet") << "Line : " << line;
161  }
162  stringstream ss(line);
163  string mem, tmp1, procin, tmp2, procout;
164  ss >> mem >> tmp1 >> procin;
165  if (procin == "output=>") {
166  procin = "";
167  ss >> procout;
168  } else {
169  ss >> tmp2 >> procout;
170  }
171 
172  sector_->addWire(mem, procin, procout);
173  }
174 }
175 
177  vector<vector<string>>& streamsTrackRaw,
178  vector<vector<StubStreamData>>& streamsStubRaw) {
179  globals_->event() = &ev;
180 
181  tracks_.clear();
182  eventnum_++;
183  bool first = (eventnum_ == 1);
184 
185  for (unsigned int k = 0; k < N_SECTOR; k++) {
186  sector_->setSector(k);
187 
188  cleanTimer_.start();
189  sector_->clean();
190  cleanTimer_.stop();
191 
193 
194  vector<int> layerstubs(N_LAYER + N_DISK, 0);
195  vector<int> layerstubssector(N_SECTOR * (N_LAYER + N_DISK), 0);
196 
197  for (int j = 0; j < ev.nstubs(); j++) {
198  const L1TStub& stub = ev.stub(j);
199  unsigned int isector = stub.region();
200  if (isector != k) {
201  continue;
202  }
203 
204  const string& dtc = stub.DTClink();
205 
206  layerstubs[stub.layerdisk()]++;
207  layerstubssector[isector * (N_LAYER + N_DISK) + stub.layerdisk()]++;
208 
209  sector_->addStub(stub, dtc);
210  }
211 
212  if (settings_->writeMonitorData("StubsLayerSector")) {
213  for (unsigned int index = 0; index < layerstubssector.size(); index++) {
214  int layerdisk = index % (N_LAYER + N_DISK);
215  int sector = index / (N_LAYER + N_DISK);
216  globals_->ofstream("stubslayersector.txt")
217  << layerdisk << " " << sector << " " << layerstubssector[index] << endl;
218  }
219  }
220 
221  if (settings_->writeMonitorData("StubsLayer")) {
222  for (unsigned int layerdisk = 0; layerdisk < layerstubs.size(); layerdisk++) {
223  globals_->ofstream("stubslayer.txt") << layerdisk << " " << layerstubs[layerdisk] << endl;
224  }
225  }
226 
228 
229  // ----------------------------------------------------------------------------------------
230  // Now start the tracklet processing
231 
232  // VM router
234  sector_->executeIR();
235  if (settings_->writeMem() && k == settings_->writememsect()) {
236  sector_->writeDTCStubs(first);
237  sector_->writeIRStubs(first);
238  }
240 
242  sector_->executeVMR();
243  if (settings_->writeMem() && k == settings_->writememsect()) {
244  sector_->writeVMSTE(first);
245  sector_->writeVMSME(first);
246  sector_->writeAS(first);
247  sector_->writeAIS(first);
248  }
250 
251  // tracklet engine
252  TETimer_.start();
253  sector_->executeTE();
254  TETimer_.stop();
255 
256  // tracklet engine displaced
257  TEDTimer_.start();
258  sector_->executeTED();
259  TEDTimer_.stop();
260 
261  // triplet engine
262  TRETimer_.start();
263  sector_->executeTRE();
264  if (settings_->writeMem() && k == settings_->writememsect()) {
265  sector_->writeST(first);
266  }
267  TRETimer_.stop();
268 
269  // tracklet processor (alternative implementation to TE+TC)
270  TPTimer_.start();
271  sector_->executeTP();
272  TPTimer_.stop();
273 
274  if (settings_->writeMem() && k == settings_->writememsect()) {
275  sector_->writeSP(first);
276  }
277 
278  // tracklet calculator
279  TCTimer_.start();
280  sector_->executeTC();
281  TCTimer_.stop();
282 
283  if (settings_->writeMonitorData("HitEff") || settings_->bookHistos()) {
284  int nTP = globals_->event()->nsimtracks();
285  for (int iTP = 0; iTP < nTP; iTP++) {
286  L1SimTrack simtrk = globals_->event()->simtrack(iTP);
287  if (simtrk.pt() < 2.0)
288  continue;
289  if (std::abs(simtrk.vz()) > 15.0)
290  continue;
291  if (hypot(simtrk.vx(), simtrk.vy()) > 0.1)
292  continue;
293  bool electron = (abs(simtrk.type()) == 11);
294  bool muon = (abs(simtrk.type()) == 13);
295  bool pion = (abs(simtrk.type()) == 211);
296  bool kaon = (abs(simtrk.type()) == 321);
297  bool proton = (abs(simtrk.type()) == 2212);
298  if (!(electron || muon || pion || kaon || proton))
299  continue;
300  int nlayers = 0;
301  int ndisks = 0;
302  int simtrackid = simtrk.trackid();
303  unsigned int hitmask = 0;
304  hitmask = ev.layersHit(simtrackid, nlayers, ndisks); // FIX CPU use.
305  if (nlayers + ndisks < 4)
306  continue;
307 
308  if (settings_->writeMonitorData("HitEff")) {
309  static ofstream outhit("hiteff.txt");
310  outhit << simtrk.eta() << " " << (hitmask & 1) << " " << (hitmask & 2) << " " << (hitmask & 4) << " "
311  << (hitmask & 8) << " " << (hitmask & 16) << " " << (hitmask & 32) << " " << (hitmask & 64) << " "
312  << (hitmask & 128) << " " << (hitmask & 256) << " " << (hitmask & 512) << " " << (hitmask & 1024)
313  << endl;
314  }
315 
316  std::unordered_set<int> matchseed;
317  std::unordered_set<int> matchseedtmp = sector_->seedMatch(iTP);
318  matchseed.insert(matchseedtmp.begin(), matchseedtmp.end());
319  if (settings_->bookHistos()) {
320  for (int iseed = 0; iseed < 8; iseed++) {
321  bool eff = matchseed.find(iseed) != matchseed.end();
322  globals_->histograms()->fillSeedEff(iseed, simtrk.eta(), eff);
323  }
324  }
325  }
326  }
327 
328  // tracklet calculator displaced
329  TCDTimer_.start();
330  sector_->executeTCD();
331  TCDTimer_.stop();
332 
333  // tracklet processor displaced
334  TPDTimer_.start();
335  sector_->executeTPD();
336  TPDTimer_.stop();
337 
338  if (settings_->writeMem() && k == settings_->writememsect()) {
339  sector_->writeTPAR(first);
340  sector_->writeTPROJ(first);
341  }
342 
343  // projection router
344  PRTimer_.start();
345  sector_->executePR();
346  if (settings_->writeMem() && k == settings_->writememsect()) {
347  sector_->writeVMPROJ(first);
348  sector_->writeAP(first);
349  }
350  PRTimer_.stop();
351 
352  // match engine
353  METimer_.start();
354  sector_->executeME();
355  if (settings_->writeMem() && k == settings_->writememsect()) {
356  sector_->writeCM(first);
357  }
358  METimer_.stop();
359 
360  // match calculator
361  MCTimer_.start();
362  sector_->executeMC();
363  MCTimer_.stop();
364 
365  // match processor (alternative to ME+MC)
366  MPTimer_.start();
367  sector_->executeMP();
368  MPTimer_.stop();
369 
370  if (settings_->writeMem() && k == settings_->writememsect()) {
371  sector_->writeMC(first);
372  }
373 
374  // fit track
375  FTTimer_.start();
376  sector_->executeFT(streamsTrackRaw, streamsStubRaw);
377  if ((settings_->writeMem() || settings_->writeMonitorData("IFit")) && k == settings_->writememsect()) {
378  sector_->writeTF(first);
379  }
380  FTTimer_.stop();
381 
382  // purge duplicate
383  PDTimer_.start();
384  sector_->executePD(tracks_);
385  if (((settings_->writeMem() || settings_->writeMonitorData("IFit")) && k == settings_->writememsect()) ||
386  settings_->writeMonitorData("CT")) {
387  sector_->writeCT(first);
388  }
389  PDTimer_.stop();
390  }
391 }
392 
394  if (settings_->bookHistos()) {
395  globals_->histograms()->close();
396  }
397 
398  edm::LogVerbatim("Tracklet") << "Process Times called Average time (ms) Total time (s)"
399  << "\n"
400  << "Cleaning " << setw(10) << cleanTimer_.ntimes() << setw(20)
401  << setprecision(3) << cleanTimer_.avgtime() * 1000.0 << setw(20) << setprecision(3)
402  << cleanTimer_.tottime() << "\n"
403  << "Add Stubs " << setw(10) << addStubTimer_.ntimes() << setw(20)
404  << setprecision(3) << addStubTimer_.avgtime() * 1000.0 << setw(20) << setprecision(3)
405  << addStubTimer_.tottime() << "\n"
406  << "InputRouter " << setw(10) << InputRouterTimer_.ntimes() << setw(20)
407  << setprecision(3) << InputRouterTimer_.avgtime() * 1000.0 << setw(20) << setprecision(3)
408  << InputRouterTimer_.tottime() << "\n"
409  << "VMRouter " << setw(10) << VMRouterTimer_.ntimes() << setw(20)
410  << setprecision(3) << VMRouterTimer_.avgtime() * 1000.0 << setw(20) << setprecision(3)
411  << VMRouterTimer_.tottime();
412  if (settings_->combined()) {
413  edm::LogVerbatim("Tracklet") << "TrackletProcessor " << setw(10) << TPTimer_.ntimes() << setw(20)
414  << setprecision(3) << TPTimer_.avgtime() * 1000.0 << setw(20) << setprecision(3)
415  << TPTimer_.tottime() << "\n"
416  << "MatchProcessor " << setw(10) << MPTimer_.ntimes() << setw(20)
417  << setprecision(3) << MPTimer_.avgtime() * 1000.0 << setw(20) << setprecision(3)
418  << MPTimer_.tottime();
419  } else {
420  edm::LogVerbatim("Tracklet") << "TrackletEngine " << setw(10) << TETimer_.ntimes() << setw(20)
421  << setprecision(3) << TETimer_.avgtime() * 1000.0 << setw(20) << setprecision(3)
422  << TETimer_.tottime();
423  if (settings_->extended()) {
424  edm::LogVerbatim("Tracklet") << "TrackletEngineDisplaced" << setw(10) << TEDTimer_.ntimes() << setw(20)
425  << setprecision(3) << TEDTimer_.avgtime() * 1000.0 << setw(20) << setprecision(3)
426  << TEDTimer_.tottime() << "\n"
427  << "TripletEngine " << setw(10) << TRETimer_.ntimes() << setw(20)
428  << setprecision(3) << TRETimer_.avgtime() * 1000.0 << setw(20) << setprecision(3)
429  << TRETimer_.tottime() << "\n"
430  << "TrackletCalculatorDisplaced" << setw(10) << TCDTimer_.ntimes() << setw(20)
431  << setprecision(3) << TCDTimer_.avgtime() * 1000.0 << setw(20) << setprecision(3)
432  << TCDTimer_.tottime() << "\n"
433  << TCDTimer_.tottime() << "\n"
434  << "TrackletProcessorDisplaced" << setw(10) << TPDTimer_.ntimes() << setw(20)
435  << setprecision(3) << TPDTimer_.avgtime() * 1000.0 << setw(20) << setprecision(3)
436  << TPDTimer_.tottime();
437  }
438  edm::LogVerbatim("Tracklet") << "TrackletCalculator " << setw(10) << TCTimer_.ntimes() << setw(20)
439  << setprecision(3) << TCTimer_.avgtime() * 1000.0 << setw(20) << setprecision(3)
440  << TCTimer_.tottime() << "\n"
441  << "ProjectionRouter " << setw(10) << PRTimer_.ntimes() << setw(20)
442  << setprecision(3) << PRTimer_.avgtime() * 1000.0 << setw(20) << setprecision(3)
443  << PRTimer_.tottime() << "\n"
444  << "MatchEngine " << setw(10) << METimer_.ntimes() << setw(20)
445  << setprecision(3) << METimer_.avgtime() * 1000.0 << setw(20) << setprecision(3)
446  << METimer_.tottime() << "\n"
447  << "MatchCalculator " << setw(10) << MCTimer_.ntimes() << setw(20)
448  << setprecision(3) << MCTimer_.avgtime() * 1000.0 << setw(20) << setprecision(3)
449  << MCTimer_.tottime();
450  }
451  edm::LogVerbatim("Tracklet") << "FitTrack " << setw(10) << FTTimer_.ntimes() << setw(20)
452  << setprecision(3) << FTTimer_.avgtime() * 1000.0 << setw(20) << setprecision(3)
453  << FTTimer_.tottime() << "\n"
454  << "PurgeDuplicate " << setw(10) << PDTimer_.ntimes() << setw(20)
455  << setprecision(3) << PDTimer_.avgtime() * 1000.0 << setw(20) << setprecision(3)
456  << PDTimer_.tottime();
457 }
Log< level::Info, true > LogVerbatim
unsigned int ntimes() const
Definition: Timer.h:17
double kz() const
Definition: Settings.h:342
constexpr int N_DISK
Definition: Settings.h:26
MPlex< T, D1, D2, N > hypot(const MPlex< T, D1, D2, N > &a, const MPlex< T, D1, D2, N > &b)
Definition: Matriplex.h:436
bool bookHistos() const
Definition: Settings.h:219
double kphi1() const
Definition: Settings.h:339
void init(Settings const &theSettings, const tt::Setup *setup=nullptr)
void start()
Definition: Timer.cc:5
double kz0pars() const
Definition: Settings.h:431
double kphider() const
Definition: Settings.h:434
std::unique_ptr< Sector > sector_
bool combined() const
Definition: Settings.h:270
Class to process and provide run-time constants used by Track Trigger emulators.
Definition: Setup.h:44
virtual void open()
Definition: HistBase.h:22
std::string const & wiresFile() const
Definition: Settings.h:78
const std::string & DTClink() const
Definition: L1TStub.h:117
double vy() const
Definition: L1SimTrack.h:30
bool writeMem() const
Definition: Settings.h:200
virtual void bookDiskResidual()
Definition: HistBase.h:26
virtual void bookLayerResidual()
Definition: HistBase.h:25
double kd0pars() const
Definition: Settings.h:432
double ktpars() const
Definition: Settings.h:430
bool writetrace() const
Definition: Settings.h:195
Definition: config.py:1
double krinvpars() const
Definition: Settings.h:425
std::unique_ptr< Globals > globals_
bool reduced() const
Definition: Settings.h:272
assert(be >=bs)
double tottime() const
Definition: Timer.h:20
double kphi0pars() const
Definition: Settings.h:429
std::string tablePath() const
Definition: Settings.h:205
double pt() const
Definition: L1SimTrack.h:26
int type() const
Definition: L1SimTrack.h:25
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
virtual void bookSeedEff()
Definition: HistBase.h:28
int layerdisk() const
Definition: L1TStub.h:119
uint16_t mem[nChs][nEvts]
double avgtime() const
Definition: Timer.h:18
bool writeMonitorData(std::string module) const
Definition: Settings.h:118
std::string const & memoryModulesFile() const
Definition: Settings.h:77
bool debugTracklet() const
Definition: Settings.h:194
int trackid() const
Definition: L1SimTrack.h:24
constexpr unsigned int N_SECTOR
Definition: Settings.h:23
double vz() const
Definition: L1SimTrack.h:31
double kr() const
Definition: Settings.h:344
int iseed
Definition: AMPTWrapper.h:134
std::string const & processingModulesFile() const
Definition: Settings.h:76
void configure(std::istream &inwire, std::istream &inmem, std::istream &inproc)
bool writeConfig() const
Definition: Settings.h:202
double vx() const
Definition: L1SimTrack.h:29
bool extended() const
Definition: Settings.h:268
virtual void close()
Definition: HistBase.h:23
dictionary config
Read in AllInOne config in JSON format.
Definition: DiMuonV_cfg.py:30
void stop()
Definition: Timer.cc:6
double eta() const
Definition: L1SimTrack.h:27
virtual void bookTrackletParams()
Definition: HistBase.h:27
void event(SLHCEvent &ev, std::vector< std::vector< std::string >> &streamsTrackRaw, std::vector< std::vector< StubStreamData >> &streamsStubRaw)
unsigned int writememsect() const
Definition: Settings.h:212
std::ofstream openfile(const std::string &dir, const std::string &fname, const char *file, int line)
Definition: Util.h:154
int region() const
Definition: L1TStub.h:121
int phi0bitshift() const
Definition: Settings.h:403
constexpr int N_LAYER
Definition: Settings.h:25