Belle II Software  release-05-02-19
CDCTrigger3DFitterModule.cc
1 #include "trg/cdc/modules/fitting/CDCTrigger3DFitterModule.h"
2 
3 #include <framework/datastore/RelationVector.h>
4 
5 #include <cdc/geometry/CDCGeometryPar.h>
6 #include <trg/cdc/Fitter3DUtility.h>
7 #include <trg/cdc/Fitter3D.h>
8 #include <trg/cdc/JSignal.h>
9 #include <trg/cdc/JSignalData.h>
10 
11 using namespace std;
12 using namespace Belle2;
13 
14 //this line registers the module with the framework and actually makes it available
15 //in steering files or the the module list (basf2 -m).
16 REG_MODULE(CDCTrigger3DFitter);
17 
18 CDCTrigger3DFitterModule::CDCTrigger3DFitterModule() : Module::Module()
19 {
21  "The 3D fitter module of the CDC trigger.\n"
22  "Selects stereo hits around a given 2D track and performs a linear fit "
23  "in the s-z plane (s: 2D arclength).\n"
24  );
26  addParam("hitCollectionName", m_hitCollectionName,
27  "Name of the input StoreArray of CDCTriggerSegmentHits.",
28  string(""));
29  addParam("EventTimeName", m_EventTimeName,
30  "Name of the event time object.",
31  string(""));
32  addParam("inputCollectionName", m_inputCollectionName,
33  "Name of the StoreArray holding the input tracks from the 2D fitter.",
34  string("TRGCDC2DFitterTracks"));
35  addParam("outputCollectionName", m_outputCollectionName,
36  "Name of the StoreArray holding the 3D output tracks.",
37  string("TRGCDC3DFitterTracks"));
38  addParam("fitterMode", m_fitterMode,
39  "Fitter mode: 1: fast, 2: firmware",
40  unsigned(1));
41  addParam("minHits", m_minHits,
42  "Minimal number of hits required for the fitting.",
43  unsigned(2));
44  addParam("xtSimple", m_xtSimple,
45  "If true, use nominal drift velocity, otherwise use table "
46  "for non-linear xt.",
47  false);
48  addParam("isVerbose", m_isVerbose,
49  "If true, prints detail information.",
50  false);
51 }
52 
53 void
55 {
56  // register DataStore elements
57  m_tracks3D.registerInDataStore(m_outputCollectionName);
59  m_hits.isRequired(m_hitCollectionName);
60  m_eventTime.isRequired(m_EventTimeName);
61  // register relations
62  m_tracks2D.registerRelationTo(m_tracks3D);
63  m_tracks2D.requireRelationTo(m_hits);
64  m_tracks3D.registerRelationTo(m_hits);
65 
66 
69  //Fitter3DUtility::saveStereoXt(m_stXts, "stereoXt");
70  //Fitter3DUtility::loadStereoXt("TODOdata/stereoXt",4,m_stXts);
71 
74 
75  // get geometry constants for first priority layers
77  // TODO: avoid hard coding the priority layers here
78  vector<unsigned> iL = {10, 22, 34, 46};
79  for (int iSt = 0; iSt < 4; ++iSt) {
80  nWires.push_back(cdc.nWiresInLayer(iL[iSt]));
81  rr.push_back(cdc.senseWireR(iL[iSt]));
82  zToStraw.push_back(cdc.senseWireBZ(iL[iSt]));
83  nShift.push_back(cdc.nShifts(iL[iSt]));
84  angleSt.push_back(2 * rr.back() * sin(M_PI * nShift.back() / (2 * nWires.back())) /
85  (cdc.senseWireFZ(iL[iSt]) - zToStraw.back()));
86  vector<double> xt(512);
87  for (unsigned iTick = 0; iTick < xt.size(); ++iTick) {
88  double t = iTick * 2 * cdc.getTdcBinWidth();
89  if (m_xtSimple) {
90  xt[iTick] = cdc.getNominalDriftV() * t;
91  } else {
92  double driftLength_0 = cdc.getDriftLength(t, iL[iSt], 0);
93  double driftLength_1 = cdc.getDriftLength(t, iL[iSt], 1);
94  xt[iTick] = (driftLength_0 + driftLength_1) / 2;
95  }
96  }
97  xtTables.push_back(xt);
98  }
99 
100 }
101 
102 void
104 {
105  //cout<<"n2D tracks:"<<m_tracks2D.getEntries()<<endl;
106 
107  if (m_isVerbose) {
108  cout << "Event" << endl;
109  // stereo TS information
110  cout << "----Stereo TS----" << endl;
111  for (int iHit = 0; iHit < m_hits.getEntries(); ++iHit) {
112  if (m_hits[iHit]->getISuperLayer() % 2 != 0)
113  cout << "sl-iWire:" << m_hits[iHit]->getISuperLayer() << "-" << m_hits[iHit]->getIWire() << " pr:" <<
114  m_hits[iHit]->getPriorityPosition() << " lr:" << m_hits[iHit]->getLeftRight() << " rt:" << m_hits[iHit]->getTDCCount() << " dt:" <<
115  m_hits[iHit]->priorityTime() << endl;
116  }
117  cout << "----Stereo TS----" << endl;
118  cout << "----EventTime----" << endl;
119  // event time information
120  cout << "eventTimeValid: " << m_eventTime->hasBinnedEventT0(Const::CDC);
121  if (m_eventTime->hasBinnedEventT0(Const::CDC)) cout << " eventTime: " << m_eventTime->getBinnedEventT0(Const::CDC);
122  cout << endl;
123  cout << "----EventTime----" << endl;
124  cout << "----2D----" << endl;
125  // 2D information
126  for (int iTrack = 0; iTrack < m_tracks2D.getEntries(); ++iTrack) {
127  cout << "2D charge: " << m_tracks2D[iTrack]->getChargeSign() << " pt: " << 1. / abs(m_tracks2D[iTrack]->getOmega()) * 1.5 * 0.3 *
128  0.01 << " phi0_i: " << m_tracks2D[iTrack]->getPhi0() << endl;
129  }
130  cout << "----2D----" << endl;
131  }
132 
133  for (int itrack = 0; itrack < m_tracks2D.getEntries(); ++itrack) {
134  int charge = m_tracks2D[itrack]->getChargeSign();
135  double rho = 1. / abs(m_tracks2D[itrack]->getOmega());
136  double phi = m_tracks2D[itrack]->getPhi0() - charge * M_PI_2;
137 
138  // select stereo hits
139  vector<int> bestTSIndex(4, -1);
140  vector<double> bestTSPhi(4, 9999);
141  finder(charge, rho, phi, bestTSIndex, bestTSPhi);
142 
143  if (m_isVerbose) {
144  cout << "----Found Stereo TS----" << endl;
145  for (unsigned iSt = 0; iSt < 4; ++iSt) {
146  if (bestTSIndex[iSt] == -1) continue;
147  cout << "sl-iWire:" << iSt * 2 + 1 << "-" << m_hits[bestTSIndex[iSt]]->getIWire() << " pr:" <<
148  m_hits[bestTSIndex[iSt]]->getPriorityPosition() << " lr:" << m_hits[bestTSIndex[iSt]]->getLeftRight() << " rt:" <<
149  m_hits[bestTSIndex[iSt]]->getTDCCount() << " dt:" << m_hits[bestTSIndex[iSt]]->priorityTime() << endl;
150  }
151  cout << "----Found Stereo TS----" << endl;
152  cout << "----2D----" << endl;
153  cout << "charge: " << charge << " radius: " << rho << " phi0_c: " << phi << endl;
154  cout << "----2D----" << endl;
155  }
156 
157  // count the number of selected hits
158  unsigned nHits = 0;
159  for (unsigned iSt = 0; iSt < 4; ++iSt) {
160  if (bestTSIndex[iSt] != -1) {
161  nHits += 1;
162  }
163  }
164  if (nHits < m_minHits) {
165  B2DEBUG(100, "Not enough hits to do 3D fit (" << m_minHits << " needed, got " << nHits << ")");
166  continue;
167  }
168 
169  // do the fit and create a new track
170  double z0 = 0;
171  double cot = 0;
172  double chi2 = 0;
173  fitter(bestTSIndex, bestTSPhi, charge, rho, phi, z0, cot, chi2);
174 
175  //cout<<"nHits: "<<nHits<<" charge:"<<charge<<" rho:"<<rho<<" phi:"<<phi<<" z0:"<<z0<<" cot:"<<cot<<endl;
176 
177  // check if fit results are valid
178  if (isnan(z0) || isnan(cot) || isnan(chi2)) {
179  B2DEBUG(100, "3D fit failed");
180  continue;
181  }
182 
183  // save track
184  CDCTriggerTrack* fittedTrack =
185  m_tracks3D.appendNew(m_tracks2D[itrack]->getPhi0(), m_tracks2D[itrack]->getOmega(),
186  m_tracks2D[itrack]->getChi2D(),
187  z0, cot, chi2);
188  // make relation to 2D track
189  m_tracks2D[itrack]->addRelationTo(fittedTrack);
190  // make relation to hits
191  for (unsigned iSt = 0; iSt < 4; ++iSt) {
192  if (bestTSIndex[iSt] != -1)
193  fittedTrack->addRelationTo(m_hits[bestTSIndex[iSt]]);
194  }
195  // add axial relations from 2D track
197  m_tracks2D[itrack]->getRelationsTo<CDCTriggerSegmentHit>(m_hitCollectionName);
198  for (unsigned ihit = 0; ihit < axialHits.size(); ++ihit) {
199  fittedTrack->addRelationTo(axialHits[ihit]);
200  }
201  }
202 }
203 
204 void
205 CDCTrigger3DFitterModule::finder(int charge, double rho, double phi,
206  vector<int>& bestTSIndex, vector<double>& bestTSPhi)
207 {
208  vector<double> stAxPhi(4);
209  for (int iSt = 0; iSt < 4; ++iSt) {
210  stAxPhi[iSt] = Fitter3DUtility::calStAxPhi(charge, angleSt[iSt], zToStraw[iSt],
211  rr[iSt], rho, phi);
212  }
213  // get candidates
214  vector<vector<int>> candidatesIndex(4, vector<int>());
215  vector<vector<double>> candidatesPhi(4, vector<double>());
216  vector<vector<double>> candidatesDiffStWires(4, vector<double>());
217  for (int ihit = 0; ihit < m_hits.getEntries(); ++ihit) {
219  //cout<<"id:"<<m_hits[ihit]->getSegmentID()<<" pr:"<<m_hits[ihit]->getPriorityPosition()<<" lr:"<<m_hits[ihit]->getLeftRight()<<" rt:"<<m_hits[ihit]->priorityTime()<<" fastestTime:"<<m_hits[ihit]->fastestTime()<<" foundTime:"<<m_hits[ihit]->foundTime()<<endl;
220  //cout<<"tdc:"<<m_hits[ihit]->getTDCCount()<<" adc:"<<m_hits[ihit]->getADCCount()<<" isl:"<<m_hits[ihit]->getISuperLayer()<<" ilayer:"<<m_hits[ihit]->getILayer()<<" iwire:"<<m_hits[ihit]->getIWire()<<endl;
221  // Reject second priority TSs.
222  if (m_hits[ihit]->getPriorityPosition() != 3) continue;
223  // only stereo hits
224  unsigned iSL = m_hits[ihit]->getISuperLayer();
225  if (iSL % 2 == 0) continue;
226  // skip hits with too large radius
227  if (2 * rho < rr[iSL / 2]) continue;
228  // Find number of wire difference
229  double wirePhi = m_hits[ihit]->getIWire() * 2. * M_PI / nWires[iSL / 2];
230  double tsDiffSt = stAxPhi[iSL / 2] - wirePhi;
231  if (tsDiffSt > M_PI) tsDiffSt -= 2 * M_PI;
232  if (tsDiffSt < -M_PI) tsDiffSt += 2 * M_PI;
233  tsDiffSt = tsDiffSt / 2 / M_PI * nWires[iSL / 2];
234  // Save index if condition is in 10 wires
235  if ((iSL / 2) % 2 == 0) {
236  if (tsDiffSt > 0 && tsDiffSt <= 10) {
237  candidatesIndex[iSL / 2].push_back(ihit);
238  candidatesPhi[iSL / 2].push_back(wirePhi);
239  candidatesDiffStWires[iSL / 2].push_back(tsDiffSt);
240  }
241  } else {
242  if (tsDiffSt < 0 && tsDiffSt >= -10) {
243  candidatesIndex[iSL / 2].push_back(ihit);
244  candidatesPhi[iSL / 2].push_back(wirePhi);
245  candidatesDiffStWires[iSL / 2].push_back(tsDiffSt);
246  }
247  } // End of saving index
248  } // Candidate loop
249 
250  // Pick middle candidate if multiple candidates
251  // mean wire diff
252  double meanWireDiff[4] = { 3.68186, 3.3542, 3.9099, 4.48263 };
253  for (int iSt = 0; iSt < 4; ++iSt) {
254  //cout<<"iSt: "<<iSt<<" nCandidates:"<<candidatesIndex[iSt].size()<<endl;
255  //if (candidatesIndex[iSt].size() >1) continue;
256  double bestDiff = 9999;
257  for (int iTS = 0; iTS < int(candidatesIndex[iSt].size()); ++iTS) {
258  double diff = abs(abs(candidatesDiffStWires[iSt][iTS]) - meanWireDiff[iSt]);
259  // Pick the better TS
260  if (diff < bestDiff) {
261  bestDiff = diff;
262  bestTSPhi[iSt] = candidatesPhi[iSt][iTS];
263  bestTSIndex[iSt] = candidatesIndex[iSt][iTS];
264  }
265  } // TS loop
266  } // Layer loop
267 
268 
269  //StoreArray<Track> tracks;
270  //for (int iTrack = 0; iTrack < tracks.getEntries(); iTrack++)
271  //{
272  // cout<<tracks[iTrack].getTrackFitResults().size()<<endl;
273  //}
274 
275 }
276 
277 void
278 CDCTrigger3DFitterModule::fitter(vector<int>& bestTSIndex, [[maybe_unused]] vector<double>& bestTSPhi,
279  int charge, double rho, double phi,
280  double& z0, double& cot, double& chi2)
281 {
282  // Find min timing [0, 511]
283 
284  // Convert format
285  // rawStTSs[iSt] = [TS ID, TS LR, TS driftTime]
286  vector<vector<int> > rawStTSs(4, vector<int> (3));
287  for (unsigned iSt = 0; iSt < 4; ++iSt) {
288  if (bestTSIndex[iSt] == -1) continue;
289  rawStTSs[iSt][0] = m_hits[bestTSIndex[iSt]]->getIWire();
290  rawStTSs[iSt][1] = m_hits[bestTSIndex[iSt]]->getLeftRight();
291  rawStTSs[iSt][2] = m_hits[bestTSIndex[iSt]]->priorityTime();
292  }
293  int eventTimeValid = 0;
294  int eventTime = 0;
295  if (m_eventTime->hasBinnedEventT0(Const::CDC)) {
296  eventTimeValid = 1;
297  eventTime = m_eventTime->getBinnedEventT0(Const::CDC);
298  //cout<<"eventTime: "<<eventTime<<endl;
299  }
300  double radius = rho;
301  double phi_c = phi;
302  if (phi_c > M_PI) phi_c -= 2 * M_PI;
303  if (phi_c < -M_PI) phi_c += 2 * M_PI;
304 
305  vector<double> arcS(4, 0);
306  vector<double> zz(4, 0);
307  vector<double> invZError2(4, 0);
308 
309  // Do fit
310  if (m_fitterMode == 1) Fitter3DUtility::fitter3D(m_stGeometry, m_stXts, eventTimeValid, eventTime, rawStTSs, charge, radius, phi_c,
311  z0, cot, chi2, arcS, zz, invZError2);
312 
313  if (m_fitterMode == 2) {
314  Fitter3DUtility::fitter3DFirm(m_mConstD, m_mConstV, eventTimeValid, eventTime, rawStTSs, charge, radius, phi_c, m_commonData,
316  z0 = m_mSignalStorage["z0_r"].getRealInt();
317  cot = m_mSignalStorage["cot_r"].getRealInt();
318  chi2 = m_mSignalStorage["zChi2_r"].getRealInt();
319  for (int iSt = 0; iSt < 4; iSt++) {
320  invZError2[iSt] = m_mSignalStorage["iZError2_" + to_string(iSt)].getRealInt();
321  arcS[iSt] = m_mSignalStorage["arcS_" + to_string(iSt)].getRealInt();
322  zz[iSt] = m_mSignalStorage["zz_" + to_string(iSt)].getRealInt();
323  }
324  }
325 
326  if (m_isVerbose) {
327  cout << "----3D----" << endl;
328  cout << "arcS [0]: " << arcS[0] << " [1]: " << arcS[1] << " [2]: " << arcS[2] << " [3]: " << arcS[3] << endl;
329  cout << "zz [0]: " << zz[0] << " [1]: " << zz[1] << " [2]: " << zz[2] << " [3]: " << zz[3] << endl;
330  cout << "invZError2 [0]: " << invZError2[0] << " [1]: " << invZError2[1] << " [2]: " << invZError2[2] << " [3]: " << invZError2[3]
331  << endl;
332  cout << "z0: " << z0 << " cot: " << cot << " chi2: " << chi2 << endl;
333  cout << "----3D----" << endl;
334  }
335 
336  //double newZ0 = 0;
337  //double newCot = 0;
338  //double newChi2 = 0;
339  //{
340  // // Convert format
341  // // rawStTSs[iSt] = [TS ID, TS LR, TS driftTime]
342  // vector<vector<int> > rawStTSs (4, vector<int> (3));
343  // for(unsigned iSt = 0; iSt <4; ++iSt)
344  // {
345  // if (bestTSIndex[iSt] == -1) continue;
346  // rawStTSs[iSt][0] = m_hits[bestTSIndex[iSt]]->getIWire();
347  // rawStTSs[iSt][1] = m_hits[bestTSIndex[iSt]]->getLeftRight();
348  // rawStTSs[iSt][2] = m_hits[bestTSIndex[iSt]]->priorityTime();
349  // }
350  // int eventTimeValid = 0;
351  // int eventTime = 0;
352  // if (m_eventTime->hasBinnedEventT0(Const::CDC))
353  // {
354  // eventTimeValid = 1;
355  // eventTime = m_eventTime->getBinnedEventT0(Const::CDC);
356  // }
357  // double radius = rho;
358  // double phi_c = phi;
359  // Fitter3DUtility::fitter3D(m_stGeometry, m_stXts, eventTimeValid, eventTime, rawStTSs, charge, radius, phi_c, newZ0, newCot, newChi2);
360  // //// Fit3D
361  // //vector<double> stTSs(4);
362  // //Fitter3DUtility::calPhiFast(m_stGeometry, m_stXts, eventTimeValid, eventTime, rawStTSs, stTSs);
363  // //vector<double> invZError2;
364  // //Fitter3DUtility::setErrorFast(rawStTSs, eventTimeValid, invZError2);
365  // //vector<double> zz(4, 0);
366  // //vector<double> arcS(4, 0);
367  // //for (unsigned iSt = 0; iSt < 4; iSt++) {
368  // // if (rawStTSs[iSt][1] != 0) {
369  // // zz[iSt] = Fitter3DUtility::calZ(charge, m_stGeometry["angleSt"][iSt], m_stGeometry["zToStraw"][iSt],
370  // // m_stGeometry["cdcRadius"][iSt], stTSs[iSt], radius, phi_c);
371  // // arcS[iSt] = Fitter3DUtility::calS(radius, m_stGeometry["cdcRadius"][iSt]);
372  // // }
373  // //}
374  // //double z0 = 0;
375  // //double cot = 0;
376  // //double chi2 = 0;
377  // //Fitter3DUtility::rSFit(&invZError2[0], &arcS[0], &zz[0], z0, cot, chi2);
378  // //newZ0 = z0;
379  // //newCot = cot;
380  // //newChi2 = chi2;
381  // ////cout<<"[Calculate fast]"<<endl;
382  // ////cout<<" [calPhi] "<<stTSs[0]<<" "<<stTSs[1]<<" "<<stTSs[2]<<" "<<stTSs[3]<<endl;
383  // ////cout<<" [invZError2] "<<invZError2[0]<<" "<<invZError2[1]<<" "<<invZError2[2]<<" "<<invZError2[3]<<endl;
384  // ////cout<<" [zz] "<<zz[0]<<" "<<zz[1]<<" "<<zz[2]<<" "<<zz[3]<<endl;
385  // ////cout<<" [arcS] "<<arcS[0]<<" "<<arcS[1]<<" "<<arcS[2]<<" "<<arcS[3]<<endl;
386  // ////cout<<" [z0] "<<z0<<" [cot] "<<cot<<" [chi2] "<<chi2<<endl;
387  //}
388 
389 
390  //int T0 = (m_eventTime->hasBinnedEventT0(Const::CDC))
391  // ? m_eventTime->getBinnedEventT0(Const::CDC)
392  // : 9999;
393  //
396 
398  //vector<double> wirePhi(4, 9999);
399  //vector<unsigned> LR(4, 0);
400  //vector<int> driftTime(4, 9999);
401  //for (unsigned iSt = 0; iSt < 4; ++iSt) {
402  // if (bestTSIndex[iSt] != -1) {
403  // wirePhi[iSt] = bestTSPhi[iSt];
404  // LR[iSt] = m_hits[bestTSIndex[iSt]]->getLeftRight();
405  // driftTime[iSt] = m_hits[bestTSIndex[iSt]]->priorityTime();
406  // }
407  //} // End superlayer loop
411 
413  //vector<double> phi3D(4, 9999);
414  //if (T0 == 9999) {
415  // for (unsigned iSt = 0; iSt < 4; iSt++) {
416  // phi3D[iSt] = wirePhi[iSt];
417  // }
418  //} else {
419  // for (unsigned iSt = 0; iSt < 4; iSt++) {
420  // if (bestTSIndex[iSt] != -1) {
421  // // Get drift length from table.
422  // int t = driftTime[iSt] - T0;
423  // if (t < 0) t = 0;
424  // if (t > 511) t = 511;
425  // double driftLength = xtTables[iSt][t];
426  // phi3D[iSt] = Fitter3DUtility::calPhi(wirePhi[iSt], driftLength, rr[iSt], LR[iSt]);
427  // }
428  // }
429  //}
431  //vector<double> driftZError({0.7676, 0.9753, 1.029, 1.372});
432  //vector<double> wireZError({0.7676, 0.9753, 1.029, 1.372});
433  //vector<double> zError(4, 9999);
434  //vector<double> invZError2(4, 0);
435  //for (unsigned iSt = 0; iSt < 4; ++iSt) {
436  // if (bestTSIndex[iSt] != -1) {
437  // // Check LR and eventTime
438  // if (LR[iSt] != 3 && T0 != 9999) zError[iSt] = driftZError[iSt];
439  // else zError[iSt] = wireZError[iSt];
440  // // Get inverse zerror ^ 2
441  // invZError2[iSt] = 1 / pow(zError[iSt], 2);
442  // }
443  //}
444 
446  //vector<double> zz(4, 0);
447  //vector<double> arcS(4, 0);
448  //for (unsigned iSt = 0; iSt < 4; iSt++) {
449  // if (bestTSIndex[iSt] != -1) {
450  // zz[iSt] = Fitter3DUtility::calZ(charge, angleSt[iSt], zToStraw[iSt],
451  // rr[iSt], phi3D[iSt], rho, phi);
452  // arcS[iSt] = Fitter3DUtility::calS(rho, rr[iSt]);
453  // }
454  //}
455 
457  //Fitter3DUtility::rSFit(&invZError2[0], &arcS[0], &zz[0], z0, cot, chi2);
458 
465 
469 }
Belle2::CDCTrigger3DFitterModule::m_minHits
unsigned m_minHits
Minimal number of hits required for fitting.
Definition: CDCTrigger3DFitterModule.h:75
Belle2::RelationVector::size
size_t size() const
Get number of relations.
Definition: RelationVector.h:98
Belle2::CDCTrigger3DFitterModule::m_mConstD
std::map< std::string, double > m_mConstD
Constants for firmware simulation.
Definition: CDCTrigger3DFitterModule.h:107
Fitter3DUtility::fitter3DFirm
static void fitter3DFirm(std::map< std::string, double > &mConstD, std::map< std::string, std::vector< double > > &mConstV, int eventTimeValid, int eventTime, std::vector< std::vector< int > > const &rawStTSs, int charge, double radius, double phi_c, Belle2::TRGCDCJSignalData *commonData, std::map< std::string, Belle2::TRGCDCJSignal > &mSignalStorage, std::map< std::string, Belle2::TRGCDCJLUT * > &mLutStorage)
Combines several functions for fitter3D firmware.
Definition: Fitter3DUtility.cc:1879
Belle2::CDCTrigger3DFitterModule::m_tracks2D
StoreArray< CDCTriggerTrack > m_tracks2D
list of 2D input tracks
Definition: CDCTrigger3DFitterModule.h:112
Belle2::CDCTrigger3DFitterModule::nShift
std::vector< int > nShift
geometry constants: wire shift of stereo layers
Definition: CDCTrigger3DFitterModule.h:89
Belle2::CDCTrigger3DFitterModule::m_tracks3D
StoreArray< CDCTriggerTrack > m_tracks3D
list of 3D output tracks
Definition: CDCTrigger3DFitterModule.h:114
Belle2::TRGCDCFitter3D::getStereoGeometry
static void getStereoGeometry(std::map< std::string, std::vector< double > > &stGeometry)
Get stereo geometry.
Definition: Fitter3D.cc:1556
Belle2::CDCTrigger3DFitterModule::m_fitterMode
unsigned m_fitterMode
Fitter mode: 1: fast, 2: firmware.
Definition: CDCTrigger3DFitterModule.h:73
Belle2::Module::setDescription
void setDescription(const std::string &description)
Sets the description of the module.
Definition: Module.cc:216
Belle2::CDCTrigger3DFitterModule::m_mConstV
std::map< std::string, std::vector< double > > m_mConstV
Constants for firmware simulation.
Definition: CDCTrigger3DFitterModule.h:109
Belle2::CDCTrigger3DFitterModule::nWires
std::vector< double > nWires
geometry constants: number of wires per super layer
Definition: CDCTrigger3DFitterModule.h:83
Fitter3DUtility::fitter3D
static void fitter3D(std::map< std::string, std::vector< double > > &stGeometry, std::vector< std::vector< double > > const &stXts, int eventTimeValid, int eventTime, std::vector< std::vector< int > > const &rawStTSs, int charge, double radius, double phi_c, double &z0, double &cot, double &chi2)
Combines several functions for fitter3D.
Definition: Fitter3DUtility.cc:1845
REG_MODULE
#define REG_MODULE(moduleName)
Register the given module (without 'Module' suffix) with the framework.
Definition: Module.h:652
Belle2::Module::c_ParallelProcessingCertified
@ 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:82
Belle2::CDCTrigger3DFitterModule::m_hits
StoreArray< CDCTriggerSegmentHit > m_hits
list of track segment hits
Definition: CDCTrigger3DFitterModule.h:116
Belle2::TRGCDCFitter3D::getConstants
static void getConstants(std::map< std::string, double > &mConstD, std::map< std::string, std::vector< double > > &mConstV, bool isXtSimple=0)
Get constants for firmwareFit.
Definition: Fitter3D.cc:1594
Belle2::CDCTriggerTrack
Track created by the CDC trigger.
Definition: CDCTriggerTrack.h:15
Belle2::TRGCDCFitter3D::getStereoXt
static void getStereoXt(std::vector< double > const &stPriorityLayer, std::vector< std::vector< double > > &stXts, bool isSimple=0)
Get stereo Xt.
Definition: Fitter3D.cc:1576
Belle2::CDCTrigger3DFitterModule::rr
std::vector< double > rr
geometry constants: radius of priority layers
Definition: CDCTrigger3DFitterModule.h:85
Belle2::CDCTrigger3DFitterModule::finder
void finder(int charge, double rho, double phi, std::vector< int > &bestTSIndex, std::vector< double > &bestTSPhi)
Select stereo hits.
Definition: CDCTrigger3DFitterModule.cc:205
Belle2::Module
Base class for Modules.
Definition: Module.h:74
Belle2::TRGCDCJSignalData
A class to hold common data for JSignals.
Definition: JSignalData.h:34
Belle2::Module::setPropertyFlags
void setPropertyFlags(unsigned int propertyFlags)
Sets the flags for the module properties.
Definition: Module.cc:210
Belle2::CDC::CDCGeometryPar
The Class for CDC Geometry Parameters.
Definition: CDCGeometryPar.h:75
Belle2::CDCTrigger3DFitterModule::m_inputCollectionName
std::string m_inputCollectionName
Name of the StoreArray containing the input tracks from the 2D fitter.
Definition: CDCTrigger3DFitterModule.h:69
Belle2::RelationVector
Class for type safe access to objects that are referred to in relations.
Definition: DataStore.h:38
Belle2::CDCTrigger3DFitterModule::m_commonData
Belle2::TRGCDCJSignalData * m_commonData
Datastore for firmware simulation.
Definition: CDCTrigger3DFitterModule.h:101
Belle2::CDC::CDCGeometryPar::Instance
static CDCGeometryPar & Instance(const CDCGeometry *=nullptr)
Static method to get a reference to the CDCGeometryPar instance.
Definition: CDCGeometryPar.cc:41
Belle2
Abstract base class for different kinds of events.
Definition: MillepedeAlgorithm.h:19
Belle2::CDCTrigger3DFitterModule::m_mLutStorage
std::map< std::string, Belle2::TRGCDCJLUT * > m_mLutStorage
Lutstore for firmware simulation.
Definition: CDCTrigger3DFitterModule.h:105
Belle2::CDCTrigger3DFitterModule::m_eventTime
StoreObjPtr< BinnedEventT0 > m_eventTime
StoreObjPtr containing the event time.
Definition: CDCTrigger3DFitterModule.h:118
Belle2::CDCTrigger3DFitterModule::m_xtSimple
bool m_xtSimple
Switch between nominal drift velocity and xt table.
Definition: CDCTrigger3DFitterModule.h:77
Belle2::CDCTrigger3DFitterModule::m_outputCollectionName
std::string m_outputCollectionName
Name of the StoreArray containing the resulting 3D tracks.
Definition: CDCTrigger3DFitterModule.h:71
Belle2::CDCTrigger3DFitterModule::m_EventTimeName
std::string m_EventTimeName
name of the event time StoreObjPtr
Definition: CDCTrigger3DFitterModule.h:67
Belle2::Module::addParam
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:562
Belle2::CDCTrigger3DFitterModule::m_stXts
std::vector< std::vector< double > > m_stXts
stereo xt tables
Definition: CDCTrigger3DFitterModule.h:98
Belle2::CDCTrigger3DFitterModule::fitter
void fitter(std::vector< int > &bestTSIndex, std::vector< double > &bestTSPhi, int charge, double rho, double phi, double &z0, double &cot, double &chi2)
Perform the 3D fit.
Definition: CDCTrigger3DFitterModule.cc:278
Belle2::CDCTrigger3DFitterModule::xtTables
std::vector< std::vector< double > > xtTables
geometry constants: drift length - drift time relation
Definition: CDCTrigger3DFitterModule.h:93
Belle2::CDCTrigger3DFitterModule::m_mSignalStorage
std::map< std::string, Belle2::TRGCDCJSignal > m_mSignalStorage
Signalstore for firmware simulation.
Definition: CDCTrigger3DFitterModule.h:103
Belle2::CDCTrigger3DFitterModule::event
virtual void event() override
Run the 3D fitter for an event.
Definition: CDCTrigger3DFitterModule.cc:103
Belle2::CDCTrigger3DFitterModule::angleSt
std::vector< double > angleSt
geometry constants: stereo angle
Definition: CDCTrigger3DFitterModule.h:91
Belle2::CDCTrigger3DFitterModule::m_stGeometry
std::map< std::string, std::vector< double > > m_stGeometry
map of geometry constants
Definition: CDCTrigger3DFitterModule.h:96
Belle2::CDCTrigger3DFitterModule::zToStraw
std::vector< double > zToStraw
geometry constants: backward z of priority layers
Definition: CDCTrigger3DFitterModule.h:87
Belle2::CDCTrigger3DFitterModule::initialize
virtual void initialize() override
Initialize the module and register DataStore arrays.
Definition: CDCTrigger3DFitterModule.cc:54
Belle2::CDCTrigger3DFitterModule::m_hitCollectionName
std::string m_hitCollectionName
Name of the StoreArray containing the input track segment hits.
Definition: CDCTrigger3DFitterModule.h:65
Fitter3DUtility::calStAxPhi
static double calStAxPhi(int charge, double anglest, double ztostraw, double rr, double rho, double phi0)
Calculates the fitted axial phi for the stereo super layer.
Definition: Fitter3DUtility.cc:787
Belle2::CDCTriggerSegmentHit
Combination of several CDCHits to a track segment hit for the trigger.
Definition: CDCTriggerSegmentHit.h:16
Belle2::CDCTrigger3DFitterModule::m_isVerbose
bool m_isVerbose
Switch printing detail information.
Definition: CDCTrigger3DFitterModule.h:79