Belle II Software  release-08-00-10
CDCTriggerNeuroDQMOnlineModule.cc
1 /**************************************************************************
2  * basf2 (Belle II Analysis Software Framework) *
3  * Author: The Belle II Collaboration *
4  * *
5  * See git log for contributors and copyright holders. *
6  * This file is licensed under LGPL-3.0, see LICENSE.md. *
7  **************************************************************************/
8 #include <framework/dataobjects/EventMetaData.h>
9 
10 #include "TDirectory.h"
11 #include <tracking/dataobjects/RecoTrack.h>
12 #include <trg/cdc/modules/dqmneuro/CDCTriggerNeuroDQMOnlineModule.h>
13 
14 
15 using namespace Belle2;
16 //-----------------------------------------------------------------
17 // Register the Module
18 //-----------------------------------------------------------------
19 REG_MODULE(CDCTriggerNeuroDQMOnline);
20 
21 //-----------------------------------------------------------------
22 // Implementation
23 //-----------------------------------------------------------------
24 
26 {
27  //Set module properties
28  setDescription("CDC Trigger DQM Online module for HLT/Expressreco");
29  setPropertyFlags(c_ParallelProcessingCertified); // specify this flag if you need parallel processing
30  addParam("unpacked2DTracksName", m_unpacked2DTracksName,
31  "The name of the StoreArray of the unpacked 2D finder tracks",
32  std::string("CDCTrigger2DFinderTracks"));
33  addParam("simNeuroTracksName", m_simNeuroTracksName,
34  "The name of the StoreArray of the Neurotrigger tracks from HWSIM",
35  std::string("TSimNeuroTracks"));
36  addParam("unpackedNeuroTracksName", m_unpackedNeuroTracksName,
37  "The name of the StoreArray of the unpacked neurotrigger tracks",
38  std::string("CDCTriggerNeuroTracks"));
39  addParam("unpackedNeuroInput2dTracksName", m_unpackedNeuroInput2DTracksName,
40  "The name of the StoreArray of the neurotrigger input 2d tracks",
41  std::string("CDCTriggerNNInput2DFinderTracks"));
42  addParam("unpackedNeuroInputSegmentHits", m_unpackedNeuroInputSegmentHitsName,
43  "The name of the StoreArray of the neurotrigger input segment hits",
44  std::string("CDCTriggerNNInputSegmentHits"));
45  addParam("unpackedNeuroInputAllStereoSegmentHitsName", m_unpackedNeuroInputAllSegmentHitsName,
46  "The name of the StoreArray of all segmenthits arriving at the NN boards",
47  std::string("CDCTriggerNNInputAllStereoSegmentHits"));
48  addParam("histogramDirectoryName", m_histogramDirectoryName,
49  "Name of the directory where histograms will be placed",
50  std::string("TRGCDCTNN2"));
51  addParam("RecoTracksName", m_recoTracksName,
52  "Name of the RecoTrack StoreArray. Leave empty for skipping them.",
53  std::string("RecoTracks"));
54  addParam("useSimTracks", m_useSimTracks,
55  "switch on to use simulated tracks for plots, error logs and in debug output"
56  "Useful for debugging SW/HW Errors:",
57  false);
58  addParam("useRecoTracks", m_useRecoTracks,
59  "switch on to use recotracks",
60  true);
61 
62 }
63 
64 
66 {
67 }
68 
69 //------------------------------------------------------------------
70 // Function to define histograms
71 //-----------------------------------------------------------------
72 
74 {
75  // Create a separate histogram directory and cd into it.
76  TDirectory* oldDir = gDirectory;
77  if (m_histogramDirectoryName != "") {
78  oldDir->mkdir(m_histogramDirectoryName.c_str());
79  oldDir->cd(m_histogramDirectoryName.c_str());
80  }
81  //----------------------------------------------------------------
82 
83  // define neurotrigger histograms
84 
85  // histograms with recotracks (and hwsimtracks):
86 
87  m_neuroHWOutdzall = new TH1F("NeuroHWOutZ-RecoZ",
88  "z Resolution of unpacked and valid neuro tracks; delta z [cm]",
89  200, -100, 100);
90  m_neuroHWOutdz0 = new TH1F("Q0NeuroHWOutZ-RecoZ",
91  "Quadrant0 z Resolution of unpacked and valid neuro tracks; delta z [cm]",
92  200, -100, 100);
93  m_neuroHWOutdz1 = new TH1F("Q1NeuroHWOutZ-RecoZ",
94  "Quadrant1 z Resolution of unpacked and valid neuro tracks; delta z [cm]",
95  200, -100, 100);
96  m_neuroHWOutdz2 = new TH1F("Q2NeuroHWOutZ-RecoZ",
97  "Quadrant2 z Resolution of unpacked and valid neuro tracks; delta z [cm]",
98  200, -100, 100);
99  m_neuroHWOutdz3 = new TH1F("Q3NeuroHWOutZ-RecoZ",
100  "Quadrant3 z Resolution of unpacked and valid neuro tracks; delta z [cm]",
101  200, -100, 100);
102  m_neuroHWSimRecodZ = new TH1F("NeuroHWSimZ-RecoZ",
103  "z Resolution of Simulated HW Tracks; delta z [cm]",
104  200, -100, 100);
105 
106  // histograms wih just hwneuro and hw2dtracks:
107 
108  m_neuroHWOutZ = new TH1F("NeuroHWOutZ",
109  "z distribution of unpacked and valid neuro tracks; z [cm]",
110  200, -100, 100);
111  m_recoZ = new TH1F("RecoTrackZ",
112  "z distribution of all RecoTracks; z [cm]",
113  400, -200, 200);
114  m_recoZ_related = new TH1F("RecoTrackZ_related",
115  "z distribution of all related Recotracks; z [cm]",
116  400, -200, 200);
117  m_neuroHWOutSTTZ = new TH1F("NeuroHWOutSTTZ",
118  "z distribution of unpacked and valid first not updated per event Neurotracks and p<0.7GeV; z [cm]",
119  200, -100, 100);
120  m_neuroHWOutCosTheta = new TH1F("NeuroHWOutCosTheta",
121  "cos theta distribution of unpacked and valid neuro tracks; cos(#theta) ",
122  100, -1, 1);
123  m_neuroHWOutPhi0 = new TH1F("NeuroHWOutPhi0",
124  "phi distribution of unpacked and valid neuro tracks; #phi [#circ]",
125  80, 0, 360); // shift to reduce the binning error
126  m_neuroHWOutP = new TH1F("NeuroHWOutP",
127  "P distribution of unpacked neuro tracks; p_{T} [GeV]",
128  100, 0, 3);
129  m_neuroHWOutPt = new TH1F("NeuroHWOutPt",
130  "Pt distribution of unpacked neuro tracks; p_{T} [GeV]",
131  10, 0, 3);
132  m_neuroHWOutm_time = new TH1F("NeuroHWOutM_time", "m_time distribution of unpacked neuro tracks; clock cycle",
133  48, 0, 48);
134  m_neuroHWValTracksNumber = new TH1F("NeuroHWValTracksNumber", "number of valid neurotracks per event; track count",
135  20, 0, 20);
136  m_neuroHWSector = new TH1F("NeuroHWExpert",
137  "Expert of unpacked neuro tracks; Expert",
138  5, 0, 5);
139  m_neuroHWInTSID = new TH1F("NeuroHWInTSID", "ID of incoming track segments",
140  2336, 0, 2336);
141  m_neuroHWInTSIDSel = new TH1F("NeuroHWInSelTSID", "ID of selected NNT track segments",
142  2336, 0, 2336);
143  m_neuroHWInCDCFE = new TH1F("NeuroHWInCDCFE", "Number of incoming CDCFE board",
144  300, 0, 300);
145  m_neuroHWInm_time = new TH1F("NeuroHWInM_time", "m_time distribution from incoming 2dtracks; clock cycle",
146  48, 0, 48);
147  m_neuroHWIn2DTracksNumber = new TH1F("NeuroHWIn2DTracksNumber", "number of incoming 2dtracks per event; track count",
148  20, 0, 20);
149 
150  // now the histograms with hwsim neurotracks:
151 
152  m_neuroHWOutHwSimdZ = new TH1F("NeuroHWOutZ-NeuroHWSimZ",
153  "dz Distribution of Valid Neuro Tracks and Simulated HW Tracks; z [cm]",
154  200, -100, 100);
155  m_neuroHWSimZ = new TH1F("NeuroHWSimZ",
156  "z Distribution of Simulated HW Tracks; z [cm]",
157  200, -100, 100);
158  m_neuroHWSimCosTheta = new TH1F("NeuroHWSimCosTheta",
159  "cos theta Distribution of Simulated HW Tracks; cos(#theta) ",
160  100, -1, 1);
161  m_neuroErrors = new TH1F("Neurotrigger-Errors", "Errors in the Neuro Hardware", m_errcount, 0, m_errcount);
162  // cd back to root directory
163  oldDir->cd();
164 }
166 {
167  // Register histograms (calls back defineHisto)
168 
169  REG_HISTOGRAM
170 
171  // require event time and hwneuro related arrays:
172 
173  m_eventTime.isOptional("CDCTriggerNeuroETFT0");
175 
182 
183  // require recotracks, if activated:
184 
185  if (m_useRecoTracks) {m_RecoTracks.isRequired("RecoTracks");}
186 
187  //require hwsimtracks, if activated:
188 
189  if (m_useSimTracks) {
193  }
194 
195  // require certain relations
196 
200  if (m_useSimTracks) {
202  }
203  if (m_useRecoTracks) {
205  }
208  }
209 
210 
211 }
212 
214 {
215  // Just to make sure, reset all the histograms.
216 
217  // histograms with recotracks (and hwsimtracks):
218 
219  m_neuroHWOutdzall->Reset();
220  m_neuroHWOutdz0->Reset();
221  m_neuroHWOutdz1->Reset();
222  m_neuroHWOutdz2->Reset();
223  m_neuroHWOutdz3->Reset();
224  m_neuroHWSimRecodZ->Reset();
225 
226  // histograms with only hwneurotracks
227 
228  m_neuroHWOutZ->Reset();
229  m_recoZ->Reset();
230  m_recoZ_related->Reset();
231  m_neuroHWOutSTTZ->Reset();
232  m_neuroHWOutCosTheta->Reset();
233  m_neuroHWOutPhi0->Reset();
234  m_neuroHWOutPt->Reset();
235  m_neuroHWOutP->Reset();
236  m_neuroHWOutm_time->Reset();
237  m_neuroHWValTracksNumber->Reset();
238  m_neuroHWSector->Reset();
239  m_neuroHWInTSID->Reset();
240  m_neuroHWInTSIDSel->Reset();
241  m_neuroHWInCDCFE->Reset();
242  m_neuroHWInm_time->Reset();
243  m_neuroHWIn2DTracksNumber->Reset();
244 
245  // histograms with hwsim tracks:
246 
247  m_neuroHWOutHwSimdZ->Reset();
248  m_neuroHWSimZ->Reset();
249  m_neuroHWSimCosTheta->Reset();
250  m_neuroErrors->Reset();
251  for (unsigned i = 0; i < m_errcount; ++i) {
252  m_neuroErrors->GetXaxis()->SetBinLabel(i + 1, m_errdict[i].c_str());
253  }
254  //m_neuroErrorsRaw->Reset();
255 }
257 {
259  B2DEBUG(150, "No unpacked TS found, skipping event.");
260  return;
261  }
262 
263  fillHWPlots();
264 
265  if (m_useRecoTracks) {fillRecoPlots();}
266 
267  if (m_useSimTracks) {
268  fillSimPlots();
269  makeDebugOutput();
270  }
271 
272 
273 
274 }
275 
276 void CDCTriggerNeuroDQMOnlineModule::fillHWPlots()
277 {
278 
279  unsigned valtrackcount = 0;
280 
281  // first, fill the tsid plots and the cdcfe plot:
282 
284  m_neuroHWInTSID->Fill(hit.getSegmentID());
285  m_neuroHWInCDCFE->Fill((int)(std::roundf(hit.getSegmentID()) * 2 + 8));
286  m_neuroHWInCDCFE->Fill((int)(std::roundf(hit.getSegmentID()) * 2 + 9));
287  }
289  m_neuroHWInTSIDSel->Fill(hit.getSegmentID());
290  }
291 
292  // now, we loop over the hardware neurotracks and fill the
293  // corresponding histograms
294 
295  bool firsttrack = true;
296  for (CDCTriggerTrack& neuroHWTrack : m_unpackedNeuroTracks) {
297  bool valtrack = false;
298  try {
299  valtrack = neuroHWTrack.getValidStereoBit();
300  } catch (...) {
301  B2WARNING("HWTrack doesn't have 'valid bit', get it from relations now ...");
303  }
304  if (valtrack) {
305  valtrackcount ++;
306  m_neuroHWOutZ->Fill(neuroHWTrack.getZ0());
307  m_neuroHWOutCosTheta->Fill(copysign(1.0,
308  neuroHWTrack.getCotTheta()) / sqrt(1. / (neuroHWTrack.getCotTheta()*neuroHWTrack.getCotTheta())));
309  double phinorm = neuroHWTrack.getPhi0() * 180. / M_PI;
310  if (phinorm < 0.) {phinorm += 360.;}
311  m_neuroHWOutPhi0->Fill(phinorm);
312  m_neuroHWOutPt->Fill(neuroHWTrack.getPt());
313  float momentum = neuroHWTrack.getPt() / sin(acos(neuroHWTrack.getCotTheta() / sqrt(1 + neuroHWTrack.getCotTheta() *
314  neuroHWTrack.getCotTheta())));
315  m_neuroHWOutP->Fill(momentum);
316  if (momentum < 0.7 && firsttrack && neuroHWTrack.getFoundOldTrack()[0] == false) {
317  m_neuroHWOutSTTZ->Fill(neuroHWTrack.getZ0());
318  firsttrack = false;
319  }
320 
321  m_neuroHWOutm_time->Fill(neuroHWTrack.getTime());
322  m_neuroHWSector->Fill(neuroHWTrack.getRelatedTo<CDCTriggerMLPInput>(m_unpackedNeuroInputVectorName)->getSector());
323 
324 
325  CDCTriggerTrack* twodHWTrack = neuroHWTrack.getRelatedFrom<CDCTriggerTrack>(m_unpackedNeuroInput2DTracksName);
326  m_neuroHWInm_time->Fill(twodHWTrack->getTime());
327 
328  // fill the error plots here, but only if simtracks are available
329  // first, get the related simtrack
330  if (m_useSimTracks) {
331  CDCTriggerTrack* neuroSimTrack = neuroHWTrack.getRelatedTo<CDCTriggerTrack>(m_simNeuroTracksName);
332  if (!neuroSimTrack) {
333  B2WARNING("No Simtrack related to HWTrack! This should not happen!");
334  }
335  std::vector<float> unpackedInput =
336  neuroHWTrack.getRelatedTo<CDCTriggerMLPInput>(m_unpackedNeuroInputVectorName)->getInput();
337  std::vector<float> simInput =
338  neuroSimTrack->getRelatedTo<CDCTriggerMLPInput>(m_simNeuroInputVectorName)->getInput();
339  bool sameInputId = true;
340  bool sameInputAlpha = true;
341  bool scaleErr = false;
342  bool missingTS = false;
343  bool timeErr = false;
344  for (unsigned ii = 0; ii < unpackedInput.size(); ii += 3) {
345  bool hwZero = false;
346  bool hwSimZero = false;
347  if (unpackedInput[ii] != simInput[ii]) {sameInputId = false;}
348  if (unpackedInput[ii + 2] != simInput[ii + 2]) {sameInputAlpha = false;}
349  if (unpackedInput[ii + 1] != simInput[ii + 1]) {timeErr = true;}
350  if (unpackedInput[ii + 1] == 0 && fabs(simInput[ii + 1] > 0.99)) {scaleErr = true;}
351  if (simInput[ii + 1] == 0 && fabs(unpackedInput[ii + 1] > 0.99)) {scaleErr = true;}
352  if (unpackedInput[ii] == 0 && unpackedInput[ii + 1] == 0 && unpackedInput[ii + 2] == 0) {hwZero = true;}
353  if (simInput[ii] == 0 && simInput[ii + 1] == 0 && simInput[ii + 2] == 0) {hwSimZero = true;}
354  if (hwZero != hwSimZero) {missingTS = true;}
355  }
356  double diff = neuroHWTrack.getZ0() - neuroSimTrack->getZ0();
357  if (abs(diff) > 1.) {neuroHWTrack.setQualityVector(2);}
358  if (!sameInputId) {neuroHWTrack.setQualityVector(4);}
359  if (!sameInputAlpha) {neuroHWTrack.setQualityVector(8);}
360  if (scaleErr) {neuroHWTrack.setQualityVector(16);}
361  if (missingTS) {neuroHWTrack.setQualityVector(32);}
362  if (timeErr) {neuroHWTrack.setQualityVector(64);}
363 
364  // now fill the error histogram:
365  unsigned qvec = neuroHWTrack.getQualityVector();
366  //m_neuroErrorsRaw->Fill(qvec);
367  m_neuroErrors->Fill(8);
368  for (unsigned k = 0; k < m_errcount; k++) {
369  if (qvec & (1 << k)) {m_neuroErrors->Fill(k);}
370  }
371  }
372  }
373 
374  }
375  m_neuroHWIn2DTracksNumber->Fill(m_unpackedNeuroInput2DTracks.getEntries());
376  m_neuroHWValTracksNumber->Fill(valtrackcount);
377 }
378 
379 
380 
381 void CDCTriggerNeuroDQMOnlineModule::fillSimPlots()
382 {
383 
384  for (CDCTriggerTrack& neuroSimTrack : m_simNeuroTracks) {
385  CDCTriggerTrack* neuroHWTrack = nullptr;
386  bool valtrack = false;
387  try {
388  valtrack = neuroSimTrack.getValidStereoBit();
389  } catch (...) {
390  B2WARNING("SimTrack doesn't have 'valid bit', get it from relations now ...");
392  }
393  if (valtrack) {
394 
395  m_neuroHWSimZ->Fill(neuroSimTrack.getZ0());
396  m_neuroHWSimCosTheta->Fill(copysign(1.0,
397  neuroSimTrack.getCotTheta()) / sqrt(1. / (neuroSimTrack.getCotTheta()*neuroSimTrack.getCotTheta())));
398 
399  neuroHWTrack = neuroSimTrack.getRelatedFrom<CDCTriggerTrack>(m_unpackedNeuroTracksName);
400  if (neuroHWTrack) {
401  bool valhwtrack = false;
402  try {
403  valhwtrack = neuroHWTrack->getValidStereoBit();
404  } catch (...) {
405  B2WARNING("HWTrack doesn't have 'valid bit', get it from relations now ...");
407  }
408  if (valhwtrack) {
409  double diff = neuroHWTrack->getZ0() - neuroSimTrack.getZ0();
410  m_neuroHWOutHwSimdZ->Fill(diff);
411  }
412  }
413 
414  // now check for recotracks and fill the delta plot
415 
416  if (m_useRecoTracks) {
417 
418  // try to find related neurotrack
419 
420  RecoTrack* recoTrack = neuroSimTrack.getRelatedFrom<RecoTrack>(m_recoTracksName);
421  if (recoTrack) {
422  double zTarget = 0;
423  bool foundValidRep = false;
424 
425  for (genfit::AbsTrackRep* rep : recoTrack->getRepresentations()) {
426  if (!recoTrack->wasFitSuccessful(rep))
427  continue;
428  // get state (position, momentum etc.) from hit closest to IP and
429  // extrapolate to z-axis (may throw an exception -> continue to next representation)
430  try {
432  recoTrack->getMeasuredStateOnPlaneClosestTo(ROOT::Math::XYZVector(0, 0, 0), rep);
433  rep->extrapolateToLine(state, TVector3(0, 0, -1000), TVector3(0, 0, 2000));
434 
435  zTarget = state.getPos().Z();
436  } catch (...) {
437  continue;
438  }
439  // break loop
440  foundValidRep = true;
441  break;
442  }
443  if (!foundValidRep) {
444  B2DEBUG(150, "No valid representation found for RecoTrack, skipping.");
445  } else {
446  //no need to check valid bit again
447  m_neuroHWSimRecodZ->Fill(neuroSimTrack.getZ0() - zTarget);
448  }
449  }
450  }
451  }
452  }
453 }
454 
455 void CDCTriggerNeuroDQMOnlineModule::makeDebugOutput()
456 {
457  StoreObjPtr<EventMetaData> eventMetaData;
458  static constexpr std::array<int, 9> nWiresInSuperLayer = {
459  160, 160, 192, 224, 256, 288, 320, 352, 384
460  };
461  unsigned axhwts = 0;
462  unsigned sthwts = 0;
463 
464  std::vector<TSLine> hwtsoutput;
466  if (xhit.getISuperLayer() % 2 == 0) {
467  axhwts ++;
468  } else {
469  sthwts ++;
470  }
471  int iSL = xhit.getISuperLayer();
472  int iTS = xhit.getIWire();
473  int nwires = nWiresInSuperLayer[ iSL ];
474  if (iSL == 8) {
475  iTS += 16;
476  if (iTS > nwires) {
477  iTS -= nwires;
478  }
479  }
480  int tsIDInTracker = iTS - nwires * xhit.getQuadrant() / 4;
481  if (tsIDInTracker < 0) {
482  tsIDInTracker += nwires;
483  }
484  TSLine l(xhit);
485  l.strline = "("
486  + padto(std::to_string(xhit.getISuperLayer()), 2) + ", "
487  + padto(std::to_string(xhit.getQuadrant()), 1) + ", "
488  + padto(std::to_string(xhit.getSegmentID()), 4) + ", "
489  + padto(std::to_string(xhit.getIWire()), 5) + ", "
490  + padto(std::to_string(xhit.getPriorityPosition()), 2) + ", "
491  + padto(std::to_string(xhit.getLeftRight()), 2) + ", "
492  + padto(std::to_string(xhit.priorityTime()), 4) + ", "
493  + padto(std::to_string(xhit.foundTime()), 3) + ", "
494  + padto(std::to_string(tsIDInTracker), 4) + ") | ";
495 
496  unsigned count2d = 0;
498  count2d++;
499  if (have_relation(track, xhit, m_unpackedNeuroInputSegmentHitsName)) {
500  l.strline += std::to_string(count2d);
501  } else {
502  l.strline += ".";
503  }
504  }
505  l.strline += " | ";
506  unsigned counthwn = 0;
507  for (CDCTriggerTrack& track : m_unpackedNeuroTracks) {
508  counthwn++;
509  if (have_relation(track, xhit, m_unpackedNeuroInputSegmentHitsName)) {
510  if (track.getValidStereoBit()) {
511  l.strline += std::to_string(counthwn);
512  } else {
513  l.strline += "x";
514  }
515  } else {
516  l.strline += ".";
517  }
518  }
519  l.strline += " | ";
520 
521  unsigned countswn = 0;
522  for (CDCTriggerTrack& track : m_simNeuroTracks) {
523  countswn++;
524  if (have_relation(track, xhit, m_unpackedNeuroInputSegmentHitsName)) {
525  l.strline += std::to_string(countswn);
526  } else {
527  l.strline += ".";
528  }
529  }
530  l.strline += " | ";
531 
532  if (m_useRecoTracks) {
533  unsigned countreco = 0;
534  for (const auto& track : m_RecoTracks) {
535  countreco++;
536  bool related = false;
537  for (const CDCTriggerSegmentHit& ts : track.getRelationsTo<CDCTriggerSegmentHit>(m_unpackedNeuroInputSegmentHitsName)) {
538  if (&ts == &xhit) {related = true;}
539  }
540  if (related) {
541  l.strline += std::to_string(countreco);
542  } else {
543  l.strline += ".";
544  }
545  }
546  l.strline += " | ";
547  }
549  }
550 
551  std::string axhw = std::to_string(axhwts) + " / " + std::to_string(sthwts);
552  std::string hwtsstring = "(SL, Q, SID , WID , PP, LR, pT , fT , TSID) | HWNNIn2D | HWNeuro | SWNeuro | ";
553  if (m_useRecoTracks) {hwtsstring += "Reco | ";}
554  B2DEBUG(10, padright(" ", 100));
555  B2DEBUG(10, "----------------------------------------------------------------------------------------------------");
556  B2DEBUG(10, padright(" ", 100));
557  std::string experimentstring = "Experiment " + std::to_string(eventMetaData->getExperiment()) + " Run " +
558  std::to_string(eventMetaData->getRun()) + " Event " + std::to_string(eventMetaData->getEvent());
559  B2DEBUG(10, padright(experimentstring, 100));
560  B2DEBUG(10, padright(" ", 100));
561  B2DEBUG(10, padright(" ", 100));
562  B2DEBUG(10, padright("Number of NN HW TS (Axial/Stereo): ", 40) << padright(axhw, 60));
563  B2DEBUG(10, padright("Number of HW 2DFinderTracks: ", 40) << padright(std::to_string(m_unpacked2DTracks.getEntries()),
564  60));
565  unsigned f2dtrn = 0;
566  for (CDCTriggerTrack& ltrack : m_unpacked2DTracks) {
567  f2dtrn++;
568  std::stringstream strpt;
569  std::stringstream stromega;
570  std::stringstream strphi;
571  strpt << std::fixed << std::setprecision(2) << ltrack.getPt();
572  stromega << std::fixed << std::setprecision(2) << ltrack.getOmega();
573  strphi << std::fixed << std::setprecision(2) << (ltrack.getPhi0() * 180. / M_PI);
574  std::string trs = " HW2DFinderTrack Nr. " + std::to_string(f2dtrn) + " (pt, omega, phi) = ";
575  trs += padto(strpt.str(), 6) + ", " + padto(stromega.str(), 6) + ", " + padto(strphi.str(), 6) + ")";
576  B2DEBUG(15, padright(trs, 100));
577  }
578  B2DEBUG(10, padright("Number of HW NNInput2DFinderTracks: ",
579  40) << padright(std::to_string(m_unpackedNeuroInput2DTracks.getEntries()), 60));
580  unsigned n2dtrn = 0;
582  n2dtrn++;
583  std::stringstream strpt;
584  std::stringstream stromega;
585  std::stringstream strphi;
586  strpt << std::fixed << std::setprecision(2) << ltrack.getPt();
587  stromega << std::fixed << std::setprecision(2) << ltrack.getOmega();
588  strphi << std::fixed << std::setprecision(2) << (ltrack.getPhi0() * 180. / M_PI);
589  std::string trs = " HWNeuroInput2DTrack Nr. " + std::to_string(n2dtrn) + " (pt, omega, phi) = ";
590  trs += padto(strpt.str(), 6) + ", " + padto(stromega.str(), 6) + ", " + padto(strphi.str(), 6) + ", " + ")";
591  B2DEBUG(15, padright(trs, 100));
592  }
593  B2DEBUG(10, padright("Number of HW NeuroTracks: ",
594  40) << padright(std::to_string(m_unpackedNeuroTracks.getEntries()), 60));
595  unsigned hwntrn = 0;
596  for (CDCTriggerTrack& ltrack : m_unpackedNeuroTracks) {
597  hwntrn++;
598  std::stringstream strpt;
599  std::stringstream stromega;
600  std::stringstream strphi;
601  std::stringstream strtheta;
602  std::stringstream strz;
603  std::stringstream hwomega;
604  std::stringstream hwphi;
605  std::stringstream hwtheta;
606  std::stringstream hwz;
607  strpt << std::fixed << std::setprecision(2) << ltrack.getPt();
608  stromega << std::fixed << std::setprecision(2) << ltrack.getOmega();
609  strphi << std::fixed << std::setprecision(2) << (ltrack.getPhi0() * 180. / M_PI);
610  strtheta << std::fixed << std::setprecision(2) << (ltrack.getDirection().Theta() * 180. / M_PI);
611  strz << std::fixed << std::setprecision(2) << ltrack.getZ0();
612  hwomega << std::fixed << std::setprecision(0) << ltrack.getRawOmega();
613  hwphi << std::fixed << std::setprecision(0) << ltrack.getRawPhi0();
614  hwtheta << std::fixed << std::setprecision(0) << ltrack.getRawTheta();
615  hwz << std::fixed << std::setprecision(0) << ltrack.getRawZ();
616  std::string trs = " HWNeuroTrack Nr. " + std::to_string(hwntrn) + " (pt,om,phi,theta,z)=(";
617  trs += padto(strpt.str(), 4) + "," + padto(stromega.str(), 6) + "," + padto(strphi.str(), 6) + "," + padto(strtheta.str(),
618  6) + "," + padto(strz.str(), 6) + "),(x," + padto(hwomega.str(), 3) + "," + padto(hwphi.str(), 3) + "," + padto(hwtheta.str(),
619  3) + "," + padto(hwz.str(), 3) + ")";
620  B2DEBUG(15, padright(trs, 100));
621  std::string infostr = ", Found old track: ( ";
622  for (bool x : ltrack.getFoundOldTrack()) {
623  infostr += std::to_string(x);
624  }
625  infostr += "), ";
626  infostr = padright(infostr, 50);
627  infostr += "Drift threshold: ( ";
628  for (bool x : ltrack.getDriftThreshold()) {
629  infostr += std::to_string(x);
630  }
631  infostr += ")";
632  infostr += (ltrack.getValidStereoBit()) ? " valid" : " NOT valid";
633  B2DEBUG(15, padright(infostr, 100));
634  std::string infostr2 = " std. ETF vld:";
635  infostr2 += std::to_string(m_eventTime.isValid());
636  infostr2 += ", ETFT0: ";
637  if (m_eventTime.isValid()) {
638  infostr2 += std::to_string(m_eventTime->getBinnedEventT0(Const::CDC));
639  } else {
640  infostr2 += " ";
641  }
642  infostr2 += ", ETF in CC: ";
643  infostr2 += std::to_string(ltrack.getETF_unpacked());
644  infostr2 += ", ETF recalculated: ";
645  infostr2 += std::to_string(ltrack.getETF_recalced());
646  B2DEBUG(15, padright(infostr2, 100));
647  std::string info2str = " Expert Network Number: " + std::to_string(ltrack.getExpert());
648  info2str += ", TSVector: (";
649  for (unsigned x : ltrack.getTSVector()) {
650  info2str += std::to_string(x) + " ";
651  }
652  info2str += ")";
653  info2str += ", Quality=";
654  info2str += std::to_string(ltrack.getQualityVector());
655  B2DEBUG(15, padright(info2str, 100));
656  CDCTriggerTrack* ftrack = ltrack.getRelatedFrom<CDCTriggerTrack>(m_unpackedNeuroInput2DTracksName);
657  CDCTriggerTrack* strack = ftrack->getRelatedTo<CDCTriggerTrack>(m_simNeuroTracksName);
658  if (strack) {
659  std::vector<float> unpackedInput =
660  ltrack.getRelatedTo<CDCTriggerMLPInput>(m_unpackedNeuroInputVectorName)->getInput();
661  std::vector<float> simInput =
662  strack->getRelatedTo<CDCTriggerMLPInput>(m_simNeuroInputVectorName)->getInput();
663  B2DEBUG(20, padright(" Input Vector unpacked (id, t, alpha), sim (id, t, alpha), delta (id, t, alpha):", 100));
664  for (unsigned ii = 0; ii < unpackedInput.size(); ii += 3) {
665  std::string lla = " " + std::to_string(ii / 3) + ")";
666  std::string llb = " " + std::to_string(ii / 3) + ")";
667  lla += "(" + padright(std::to_string(unpackedInput[ii]), 8) + " " + padright(std::to_string(unpackedInput[ii + 1]),
668  8) + " " + padright(std::to_string(unpackedInput[ii + 2]), 8) + "),(" + padright(std::to_string(simInput[ii]),
669  8) + " " + padright(std::to_string(simInput[ii + 1]), 8) + " " + padright(std::to_string(simInput[ii + 2]),
670  8) + "),(" + padright(std::to_string(unpackedInput[ii] - simInput[ii]),
671  8) + " " + padright(std::to_string(unpackedInput[ii + 1] - simInput[ii + 1]),
672  8) + " " + padright(std::to_string(unpackedInput[ii + 2] - simInput[ii + 2]), 8) + ")";
673  llb += " (" + padright(std::to_string(int(unpackedInput[ii] * 4096)),
674  8) + " " + padright(std::to_string(int(unpackedInput[ii + 1] * 4096)),
675  8) + " " + padright(std::to_string(int(unpackedInput[ii + 2] * 4096)),
676  8) + "),(" + padright(std::to_string(int(simInput[ii] * 4096)), 8) + " " + padright(std::to_string(int(simInput[ii + 1] * 4096)),
677  8) + " " + padright(std::to_string(int(simInput[ii + 2] * 4096)),
678  8) + "),(" + padright(std::to_string(int(unpackedInput[ii] * 4096 - simInput[ii] * 4096)),
679  8) + " " + padright(std::to_string(int(unpackedInput[ii + 1] * 4096 - simInput[ii + 1] * 4096)),
680  8) + " " + padright(std::to_string(int(unpackedInput[ii + 2] * 4096 - simInput[ii + 2] * 4096)), 8) + ")";
681 
682  B2DEBUG(30, padright(lla, 100));
683  B2DEBUG(20, padright(llb, 100));
684  }
685  }
686  }
687  if (m_useRecoTracks) {
688  B2DEBUG(10, padright("Number of RecoTracks: ", 40) << padright(std::to_string(m_RecoTracks.getEntries()), 60));
689  unsigned recotrn = 0;
690  for (RecoTrack& ltrack : m_RecoTracks) {
691  double phi0Target = 0;
692  double invptTarget = 0;
693  double thetaTarget = 0;
694  double zTarget = 0;
695  double d0Target = 0;
696  bool foundValidRep = false;
697  for (genfit::AbsTrackRep* rep : ltrack.getRepresentations()) {
698  if (!ltrack.wasFitSuccessful(rep))
699  continue;
700  // get state (position, momentum etc.) from hit closest to IP and
701  // extrapolate to z-axis (may throw an exception -> continue to next representation)
702  try {
704  ltrack.getMeasuredStateOnPlaneClosestTo(ROOT::Math::XYZVector(0, 0, 0), rep);
705  rep->extrapolateToLine(state, TVector3(0, 0, -1000), TVector3(0, 0, 2000));
706  // TODO check after matching
707  // // flip tracks if necessary, such that trigger tracks and reco tracks
708  // // point in the same direction
709  // if (state.getMom().Dot(m_tracks[itrack]->getDirection()) < 0) {
710  // state.setPosMom(state.getPos(), -state.getMom());
711  // state.setChargeSign(-state.getCharge());
712  // }
713  // get track parameters
714  phi0Target = state.getMom().Phi() * 180. / M_PI ;
715  if (phi0Target < 0.) {phi0Target = phi0Target + 360. ;}
716  invptTarget = state.getCharge() * state.getMom().Pt();
717  thetaTarget = acos(state.getMom().CosTheta()) * 180 / M_PI;
718  zTarget = state.getPos().Z();
719  d0Target = state.getPos().Perp();
720  } catch (...) {
721  continue;
722  }
723  // break loop
724  foundValidRep = true;
725  break;
726  }
727  if (!foundValidRep) {
728  B2DEBUG(150, "No valid representation found for RecoTrack, skipping.");
729  continue;
730  }
731  recotrn++;
732  std::stringstream strpt;
733  std::stringstream stromega;
734  std::stringstream strphi;
735  std::stringstream strtheta;
736  std::stringstream strz;
737  strpt << std::fixed << std::setprecision(2) << invptTarget;
738  stromega << std::fixed << std::setprecision(2) << d0Target;
739  strphi << std::fixed << std::setprecision(2) << phi0Target;
740  strtheta << std::fixed << std::setprecision(2) << thetaTarget;
741  strz << std::fixed << std::setprecision(2) << zTarget;
742  std::string trs = " RecoTrack Nr. " + std::to_string(recotrn) + " (invpt, d0, phi, theta, z) = ";
743  trs += padto(strpt.str(), 6) + ", " + padto(stromega.str(), 6) + ", " + padto(strphi.str(), 6) + ", " + padto(strtheta.str(),
744  6) + ", " + padto(strz.str(), 6) + ")";
745  B2DEBUG(15, padright(trs, 100));
746  }
747  }
748  B2DEBUG(10, padright(" ", 100));
749  B2DEBUG(10, padright(" ", 100));
750  B2DEBUG(15, padright("Detailed information about HW TS ", 100));
751  B2DEBUG(15, padright(" ", 100));
752  B2DEBUG(15, padright(hwtsstring, 100));
753  for (auto x : hwtsoutput) {
754  B2DEBUG(15, padright(x.strline, 100));
755  }
756  B2DEBUG(15, padright(" ", 100));
757 
758 
759 }
760 
761 
762 void CDCTriggerNeuroDQMOnlineModule::fillRecoPlots()
763 {
764  for (RecoTrack& recoTrack : m_RecoTracks) {
765  double zTarget = 0;
766  bool foundValidRep = false;
767  for (genfit::AbsTrackRep* rep : recoTrack.getRepresentations()) {
768  if (!recoTrack.wasFitSuccessful(rep))
769  continue;
770  // get state (position, momentum etc.) from hit closest to IP and
771  // extrapolate to z-axis (may throw an exception -> continue to next representation)
772  try {
774  recoTrack.getMeasuredStateOnPlaneClosestTo(ROOT::Math::XYZVector(0, 0, 0), rep);
775  rep->extrapolateToLine(state, TVector3(0, 0, -1000), TVector3(0, 0, 2000));
776  zTarget = state.getPos().Z();
777  } catch (...) {
778  continue;
779  }
780  // break loop
781  foundValidRep = true;
782  break;
783  }
784  if (!foundValidRep) {
785  B2DEBUG(150, "No valid representation found for RecoTrack, skipping.");
786  continue;
787  }
788  m_recoZ->Fill(zTarget);
789  // try to find related neurotrack
790 
792  if (!neuroHWTrack) {continue;}
793  bool valtrack = false;
794 
795  //check valid bit, else continue (valid ^= enough stereo track segments)
796 
797  try {
798  valtrack = neuroHWTrack->getValidStereoBit();
799  } catch (...) {
800  B2WARNING("HWTrack doesn't have 'valid bit', get it from relations now ...");
802  }
803  if (!valtrack) {continue;}
804  // TODO check after matching
805  // // flip tracks if necessary, such that trigger tracks and reco tracks
806  // // point in the same direction
807  // if (state.getMom().Dot(m_tracks[itrack]->getDirection()) < 0) {
808  // state.setPosMom(state.getPos(), -state.getMom());
809  // state.setChargeSign(-state.getCharge());
810  // }
811  m_recoZ_related->Fill(zTarget);
812  m_neuroHWOutdzall->Fill(neuroHWTrack->getZ0() - zTarget);
813  switch (neuroHWTrack->getQuadrant()) {
814  case -1:
815  B2WARNING("Neurotrack quadrant was not set!");
816  break;
817  case 0:
818  m_neuroHWOutdz0->Fill(neuroHWTrack->getZ0() - zTarget);
819  break;
820  case 1:
821  m_neuroHWOutdz1->Fill(neuroHWTrack->getZ0() - zTarget);
822  break;
823  case 2:
824  m_neuroHWOutdz2->Fill(neuroHWTrack->getZ0() - zTarget);
825  break;
826  case 3:
827  m_neuroHWOutdz3->Fill(neuroHWTrack->getZ0() - zTarget);
828  break;
829  }
830  }
831 }
833 {
834 }
835 
836 
838 {
839 }
int getBinnedEventT0(const Const::EDetector detector) const
Return the stored binned event t0 for the given detector or 0 if nothing stored.
Class to hold some intermediate information for the monitoring of the neurotrigger.
unsigned getSector()
get the sector index
Combination of several CDCHits to a track segment hit for the trigger.
Track created by the CDC trigger.
float getTime() const
get the track found time
bool getValidStereoBit() const
returns true, if at least 3 stereo ts were found
void setQualityVector(const unsigned newbits)
setter and getter for the quality vector.
short getQuadrant() const
get the quadrant
HistoModule.h is supposed to be used instead of Module.h for the modules with histogram definitions t...
Definition: HistoModule.h:29
void setDescription(const std::string &description)
Sets the description of the module.
Definition: Module.cc:214
void setPropertyFlags(unsigned int propertyFlags)
Sets the flags for the module properties.
Definition: Module.cc:208
@ c_ParallelProcessingCertified
This module can be run in parallel processing mode safely (All I/O must be done through the data stor...
Definition: Module.h:80
This is the Reconstruction Event-Data Model Track.
Definition: RecoTrack.h:79
bool wasFitSuccessful(const genfit::AbsTrackRep *representation=nullptr) const
Returns true if the last fit with the given representation was successful.
Definition: RecoTrack.cc:336
const genfit::MeasuredStateOnPlane & getMeasuredStateOnPlaneClosestTo(const ROOT::Math::XYZVector &closestPoint, const genfit::AbsTrackRep *representation=nullptr)
Return genfit's MasuredStateOnPlane, that is closest to the given point useful for extrapolation of m...
Definition: RecoTrack.cc:426
const std::vector< genfit::AbsTrackRep * > & getRepresentations() const
Return a list of track representations. You are not allowed to modify or delete them!
Definition: RecoTrack.h:638
FROM * getRelatedFrom(const std::string &name="", const std::string &namedRelation="") const
Get the object from which this object has a relation.
bool isRequired(const std::string &name="")
Ensure this array/object has been registered previously.
bool isOptional(const std::string &name="")
Tell the DataStore about an optional input.
bool requireRelationTo(const StoreArray< TO > &toArray, DataStore::EDurability durability=DataStore::c_Event, const std::string &namedRelation="") const
Produce error if no relation from this array to 'toArray' has been registered.
Definition: StoreArray.h:155
int getEntries() const
Get the number of objects in the array.
Definition: StoreArray.h:216
Type-safe access to single objects in the data store.
Definition: StoreObjPtr.h:96
bool isValid() const
Check whether the object was created.
Definition: StoreObjPtr.h:111
StoreArray< CDCTriggerMLPInput > m_simNeuroInputVector
StoreArray for neuro input vector from TSIM.
StoreArray< CDCTriggerTrack > m_unpackedNeuroInput2DTracks
StoreArray for neuro input 2dfinder tracks.
StoreArray< CDCTriggerTrack > m_unpackedNeuroTracks
StoreArray for neuro tracks from unpacker.
std::string m_unpackedNeuroInputSegmentHitsName
Name for neuro input Track segments.
void initialize() override
Module functions.
void event() override
Function to process event record.
std::string m_unpacked2DTracksName
Name for 2D finder tracks from unpacker.
void endRun() override
Function to process end_run record.
bool m_useSimTracks
Switch to turn on use of hw sim tracks.
void terminate() override
Function to terminate module.
std::string m_unpackedNeuroInput2DTracksName
Name for neuro input 2d finder tracks.
StoreArray< CDCTriggerMLPInput > m_unpackedNeuroInputVector
StoreArray for neuro input vector from unpacker.
std::string m_unpackedNeuroInputAllSegmentHitsName
Name for TS hits from unpacker.
StoreArray< CDCTriggerTrack > m_simNeuroTracks
StoreArray for neuro tracks from TSIM.
std::string m_simNeuroInputVectorName
Name for simulated neuro input vector using HW TS, HW 2D.
void beginRun() override
Function to process begin_run record.
std::string m_histogramDirectoryName
Name of the histogram directory in ROOT file.
std::string m_recoTracksName
Name for the RecoTrack array name.
bool m_useRecoTracks
Switch to turn on use of recotracks.
std::string m_simNeuroTracksName
name of the storearray for hwsim tracks
unsigned getPattern(CDCTriggerTrack *track, std::string hitCollectionName)
get pattern of the track
std::string m_unpackedNeuroInputVectorName
Name for neuro input vector from unpacker.
bool isValidPattern(unsigned pattern)
Validity of the pattern.
StoreObjPtr< BinnedEventT0 > m_eventTime
storeobjpointer for event time
StoreArray< CDCTriggerSegmentHit > m_unpackedNeuroInputSegmentHits
StoreArray for neuro input Track segments.
StoreArray< CDCTriggerTrack > m_unpacked2DTracks
StoreArray for 2D finder tracks from unpacker.
std::string m_unpackedNeuroTracksName
Name for neuro tracks from unpacker.
StoreArray< RecoTrack > m_RecoTracks
StoreArray for RecoTracks.
StoreArray< CDCTriggerSegmentHit > m_unpackedNeuroInputAllSegmentHits
StoreArray for all TS hits from neuro unpacker.
void defineHisto() override
Histogram definitions such as TH1(), TH2(), TNtuple(), TTree()....
Abstract base class for a track representation.
Definition: AbsTrackRep.h:66
#StateOnPlane with additional covariance matrix.
REG_MODULE(arichBtest)
Register the Module.
void addParam(const std::string &name, T &paramVariable, const std::string &description, const T &defaultValue)
Adds a new parameter to the module.
Definition: Module.h:560
double sqrt(double a)
sqrt for double
Definition: beamHelpers.h:28
Abstract base class for different kinds of events.