CMS 3D CMS Logo

TrackletEventProcessor.cc
Go to the documentation of this file.
10 
12 
13 #include <iomanip>
14 #include <filesystem>
15 
16 using namespace trklet;
17 using namespace std;
18 
20 
22  if (settings_ && settings_->bookHistos()) {
23  histbase_->close();
24  }
25 }
26 
27 void TrackletEventProcessor::init(Settings const& theSettings) {
28  settings_ = &theSettings;
29 
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()) {
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  globals_->event() = &ev;
178 
179  tracks_.clear();
180 
181  eventnum_++;
182  bool first = (eventnum_ == 1);
183 
184  for (unsigned int k = 0; k < N_SECTOR; k++) {
185  sector_->setSector(k);
186 
187  cleanTimer_.start();
188  sector_->clean();
189  cleanTimer_.stop();
190 
192 
193  vector<int> layerstubs(N_LAYER + N_DISK, 0);
194  vector<int> layerstubssector(N_SECTOR * (N_LAYER + N_DISK), 0);
195 
196  for (int j = 0; j < ev.nstubs(); j++) {
197  const L1TStub& stub = ev.stub(j);
198  unsigned int isector = stub.region();
199  if (isector != k) {
200  continue;
201  }
202 
203  const string& dtc = stub.DTClink();
204 
205  layerstubs[stub.layerdisk()]++;
206  layerstubssector[isector * (N_LAYER + N_DISK) + stub.layerdisk()]++;
207 
208  sector_->addStub(stub, dtc);
209  }
210 
211  if (settings_->writeMonitorData("StubsLayerSector")) {
212  for (unsigned int index = 0; index < layerstubssector.size(); index++) {
213  int layerdisk = index % (N_LAYER + N_DISK);
214  int sector = index / (N_LAYER + N_DISK);
215  globals_->ofstream("stubslayersector.txt")
216  << layerdisk << " " << sector << " " << layerstubssector[index] << endl;
217  }
218  }
219 
220  if (settings_->writeMonitorData("StubsLayer")) {
221  for (unsigned int layerdisk = 0; layerdisk < layerstubs.size(); layerdisk++) {
222  globals_->ofstream("stubslayer.txt") << layerdisk << " " << layerstubs[layerdisk] << endl;
223  }
224  }
225 
227 
228  // ----------------------------------------------------------------------------------------
229  // Now start the tracklet processing
230 
231  // VM router
233  sector_->executeIR();
234  if (settings_->writeMem() && k == settings_->writememsect()) {
235  sector_->writeDTCStubs(first);
236  sector_->writeIRStubs(first);
237  }
239 
241  sector_->executeVMR();
242  if (settings_->writeMem() && k == settings_->writememsect()) {
243  sector_->writeVMSTE(first);
244  sector_->writeVMSME(first);
245  sector_->writeAS(first);
246  sector_->writeAIS(first);
247  }
249 
250  // tracklet engine
251  TETimer_.start();
252  sector_->executeTE();
253  TETimer_.stop();
254 
255  // tracklet engine displaced
256  TEDTimer_.start();
257  sector_->executeTED();
258  TEDTimer_.stop();
259 
260  // triplet engine
261  TRETimer_.start();
262  sector_->executeTRE();
263  if (settings_->writeMem() && k == settings_->writememsect()) {
264  sector_->writeST(first);
265  }
266  TRETimer_.stop();
267 
268  // tracklet processor (alternative implementation to TE+TC)
269  TPTimer_.start();
270  sector_->executeTP();
271  TPTimer_.stop();
272 
273  if (settings_->writeMem() && k == settings_->writememsect()) {
274  sector_->writeSP(first);
275  }
276 
277  // tracklet calculator
278  TCTimer_.start();
279  sector_->executeTC();
280  TCTimer_.stop();
281 
282  int nTP = globals_->event()->nsimtracks();
283  for (int iTP = 0; iTP < nTP; iTP++) {
284  L1SimTrack simtrk = globals_->event()->simtrack(iTP);
285  if (simtrk.pt() < 2.0)
286  continue;
287  if (std::abs(simtrk.vz()) > 15.0)
288  continue;
289  if (hypot(simtrk.vx(), simtrk.vy()) > 0.1)
290  continue;
291  bool electron = (abs(simtrk.type()) == 11);
292  bool muon = (abs(simtrk.type()) == 13);
293  bool pion = (abs(simtrk.type()) == 211);
294  bool kaon = (abs(simtrk.type()) == 321);
295  bool proton = (abs(simtrk.type()) == 2212);
296  if (!(electron || muon || pion || kaon || proton))
297  continue;
298  int nlayers = 0;
299  int ndisks = 0;
300  int simtrackid = simtrk.trackid();
301  unsigned int hitmask = ev.layersHit(simtrackid, nlayers, ndisks);
302  if (nlayers + ndisks < 4)
303  continue;
304 
305  if (settings_->writeMonitorData("HitEff")) {
306  static ofstream outhit("hiteff.txt");
307  outhit << simtrk.eta() << " " << (hitmask & 1) << " " << (hitmask & 2) << " " << (hitmask & 4) << " "
308  << (hitmask & 8) << " " << (hitmask & 16) << " " << (hitmask & 32) << " " << (hitmask & 64) << " "
309  << (hitmask & 128) << " " << (hitmask & 256) << " " << (hitmask & 512) << " " << (hitmask & 1024)
310  << endl;
311  }
312 
313  std::unordered_set<int> matchseed;
314  std::unordered_set<int> matchseedtmp = sector_->seedMatch(iTP);
315  matchseed.insert(matchseedtmp.begin(), matchseedtmp.end());
316  if (settings_->bookHistos()) {
317  for (int iseed = 0; iseed < 8; iseed++) {
318  bool eff = matchseed.find(iseed) != matchseed.end();
319  globals_->histograms()->fillSeedEff(iseed, simtrk.eta(), eff);
320  }
321  }
322  }
323 
324  // tracklet calculator displaced
325  TCDTimer_.start();
326  sector_->executeTCD();
327  TCDTimer_.stop();
328 
329  if (settings_->writeMem() && k == settings_->writememsect()) {
330  sector_->writeTPAR(first);
331  sector_->writeTPROJ(first);
332  }
333 
334  // projection router
335  PRTimer_.start();
336  sector_->executePR();
337  if (settings_->writeMem() && k == settings_->writememsect()) {
338  sector_->writeVMPROJ(first);
339  sector_->writeAP(first);
340  }
341  PRTimer_.stop();
342 
343  // match engine
344  METimer_.start();
345  sector_->executeME();
346  if (settings_->writeMem() && k == settings_->writememsect()) {
347  sector_->writeCM(first);
348  }
349  METimer_.stop();
350 
351  // match calculator
352  MCTimer_.start();
353  sector_->executeMC();
354  MCTimer_.stop();
355 
356  // match processor (alternative to ME+MC)
357  MPTimer_.start();
358  sector_->executeMP();
359  MPTimer_.stop();
360 
361  if (settings_->writeMem() && k == settings_->writememsect()) {
362  sector_->writeMC(first);
363  }
364 
365  // fit track
366  FTTimer_.start();
367  sector_->executeFT();
368  if ((settings_->writeMem() || settings_->writeMonitorData("IFit")) && k == settings_->writememsect()) {
369  sector_->writeTF(first);
370  }
371  FTTimer_.stop();
372 
373  // purge duplicate
374  PDTimer_.start();
375  sector_->executePD(tracks_);
376  if (((settings_->writeMem() || settings_->writeMonitorData("IFit")) && k == settings_->writememsect()) ||
377  settings_->writeMonitorData("CT")) {
378  sector_->writeCT(first);
379  }
380  PDTimer_.stop();
381  }
382 }
383 
385  if (settings_->bookHistos()) {
386  globals_->histograms()->close();
387  }
388 
389  edm::LogVerbatim("Tracklet") << "Process Times called Average time (ms) Total time (s)"
390  << "\n"
391  << "Cleaning " << setw(10) << cleanTimer_.ntimes() << setw(20)
392  << setprecision(3) << cleanTimer_.avgtime() * 1000.0 << setw(20) << setprecision(3)
393  << cleanTimer_.tottime() << "\n"
394  << "Add Stubs " << setw(10) << addStubTimer_.ntimes() << setw(20)
395  << setprecision(3) << addStubTimer_.avgtime() * 1000.0 << setw(20) << setprecision(3)
396  << addStubTimer_.tottime() << "\n"
397  << "InputRouter " << setw(10) << InputRouterTimer_.ntimes() << setw(20)
398  << setprecision(3) << InputRouterTimer_.avgtime() * 1000.0 << setw(20) << setprecision(3)
399  << InputRouterTimer_.tottime() << "\n"
400  << "VMRouter " << setw(10) << VMRouterTimer_.ntimes() << setw(20)
401  << setprecision(3) << VMRouterTimer_.avgtime() * 1000.0 << setw(20) << setprecision(3)
402  << VMRouterTimer_.tottime();
403  if (settings_->combined()) {
404  edm::LogVerbatim("Tracklet") << "TrackletProcessor " << setw(10) << TPTimer_.ntimes() << setw(20)
405  << setprecision(3) << TPTimer_.avgtime() * 1000.0 << setw(20) << setprecision(3)
406  << TPTimer_.tottime() << "\n"
407  << "MatchProcessor " << setw(10) << MPTimer_.ntimes() << setw(20)
408  << setprecision(3) << MPTimer_.avgtime() * 1000.0 << setw(20) << setprecision(3)
409  << MPTimer_.tottime();
410  } else {
411  edm::LogVerbatim("Tracklet") << "TrackletEngine " << setw(10) << TETimer_.ntimes() << setw(20)
412  << setprecision(3) << TETimer_.avgtime() * 1000.0 << setw(20) << setprecision(3)
413  << TETimer_.tottime();
414  if (settings_->extended()) {
415  edm::LogVerbatim("Tracklet") << "TrackletEngineDisplaced" << setw(10) << TEDTimer_.ntimes() << setw(20)
416  << setprecision(3) << TEDTimer_.avgtime() * 1000.0 << setw(20) << setprecision(3)
417  << TEDTimer_.tottime() << "\n"
418  << "TripletEngine " << setw(10) << TRETimer_.ntimes() << setw(20)
419  << setprecision(3) << TRETimer_.avgtime() * 1000.0 << setw(20) << setprecision(3)
420  << TRETimer_.tottime() << "\n"
421  << "TrackletCalculatorDisplaced" << setw(10) << TCDTimer_.ntimes() << setw(20)
422  << setprecision(3) << TCDTimer_.avgtime() * 1000.0 << setw(20) << setprecision(3)
423  << TCDTimer_.tottime();
424  }
425  edm::LogVerbatim("Tracklet") << "TrackletCalculator " << setw(10) << TCTimer_.ntimes() << setw(20)
426  << setprecision(3) << TCTimer_.avgtime() * 1000.0 << setw(20) << setprecision(3)
427  << TCTimer_.tottime() << "\n"
428  << "ProjectionRouter " << setw(10) << PRTimer_.ntimes() << setw(20)
429  << setprecision(3) << PRTimer_.avgtime() * 1000.0 << setw(20) << setprecision(3)
430  << PRTimer_.tottime() << "\n"
431  << "MatchEngine " << setw(10) << METimer_.ntimes() << setw(20)
432  << setprecision(3) << METimer_.avgtime() * 1000.0 << setw(20) << setprecision(3)
433  << METimer_.tottime() << "\n"
434  << "MatchCalculator " << setw(10) << MCTimer_.ntimes() << setw(20)
435  << setprecision(3) << MCTimer_.avgtime() * 1000.0 << setw(20) << setprecision(3)
436  << MCTimer_.tottime();
437  }
438  edm::LogVerbatim("Tracklet") << "FitTrack " << setw(10) << FTTimer_.ntimes() << setw(20)
439  << setprecision(3) << FTTimer_.avgtime() * 1000.0 << setw(20) << setprecision(3)
440  << FTTimer_.tottime() << "\n"
441  << "PurgeDuplicate " << setw(10) << PDTimer_.ntimes() << setw(20)
442  << setprecision(3) << PDTimer_.avgtime() * 1000.0 << setw(20) << setprecision(3)
443  << PDTimer_.tottime();
444 }
size
Write out results.
Log< level::Info, true > LogVerbatim
unsigned int ntimes() const
Definition: Timer.h:17
double kz() const
Definition: Settings.h:302
constexpr int N_DISK
Definition: Settings.h:22
bool bookHistos() const
Definition: Settings.h:207
double kphi1() const
Definition: Settings.h:299
void start()
Definition: Timer.cc:5
double kz0pars() const
Definition: Settings.h:390
double kphider() const
Definition: Settings.h:393
std::unique_ptr< Sector > sector_
bool combined() const
Definition: Settings.h:250
virtual void open()
Definition: HistBase.h:22
std::string const & wiresFile() const
Definition: Settings.h:69
const std::string & DTClink() const
Definition: L1TStub.h:102
double vy() const
Definition: L1SimTrack.h:30
bool writeMem() const
Definition: Settings.h:188
virtual void bookDiskResidual()
Definition: HistBase.h:26
virtual void bookLayerResidual()
Definition: HistBase.h:25
double kd0pars() const
Definition: Settings.h:391
double ktpars() const
Definition: Settings.h:389
bool writetrace() const
Definition: Settings.h:183
Definition: config.py:1
double krinvpars() const
Definition: Settings.h:384
std::unique_ptr< Globals > globals_
assert(be >=bs)
double tottime() const
Definition: Timer.h:20
double kphi0pars() const
Definition: Settings.h:388
void init(Settings const &theSettings)
std::string tablePath() const
Definition: Settings.h:193
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:104
uint16_t mem[nChs][nEvts]
double avgtime() const
Definition: Timer.h:18
bool writeMonitorData(std::string module) const
Definition: Settings.h:109
std::string const & memoryModulesFile() const
Definition: Settings.h:68
bool debugTracklet() const
Definition: Settings.h:182
int trackid() const
Definition: L1SimTrack.h:24
constexpr unsigned int N_SECTOR
Definition: Settings.h:19
double vz() const
Definition: L1SimTrack.h:31
double kr() const
Definition: Settings.h:304
int iseed
Definition: AMPTWrapper.h:134
config
parse the configuration file
std::string const & processingModulesFile() const
Definition: Settings.h:67
void configure(std::istream &inwire, std::istream &inmem, std::istream &inproc)
bool writeConfig() const
Definition: Settings.h:190
double vx() const
Definition: L1SimTrack.h:29
bool extended() const
Definition: Settings.h:248
virtual void close()
Definition: HistBase.h:23
void stop()
Definition: Timer.cc:6
double eta() const
Definition: L1SimTrack.h:27
virtual void bookTrackletParams()
Definition: HistBase.h:27
unsigned int writememsect() const
Definition: Settings.h:200
std::ofstream openfile(const std::string &dir, const std::string &fname, const char *file, int line)
Definition: Util.h:139
int region() const
Definition: L1TStub.h:106
int phi0bitshift() const
Definition: Settings.h:363
constexpr int N_LAYER
Definition: Settings.h:21