CMS 3D CMS Logo

PropagationMPlexEndcap.cc
Go to the documentation of this file.
5 
6 #include "PropagationMPlex.h"
7 
8 //#define DEBUG
9 #include "Debug.h"
10 
11 namespace {
12  using namespace mkfit;
13 
14  void MultHelixPropEndcap(const MPlexLL& A, const MPlexLS& B, MPlexLL& C) {
15  // C = A * B
16 
17  typedef float T;
18  const Matriplex::idx_t N = NN;
19 
20  const T* a = A.fArray;
21  ASSUME_ALIGNED(a, 64);
22  const T* b = B.fArray;
23  ASSUME_ALIGNED(b, 64);
24  T* c = C.fArray;
25  ASSUME_ALIGNED(c, 64);
26 
27 #include "MultHelixPropEndcap.ah"
28  }
29 
30  void MultHelixPropTranspEndcap(const MPlexLL& A, const MPlexLL& B, MPlexLS& C) {
31  // C = B * AT;
32 
33  typedef float T;
34  const Matriplex::idx_t N = NN;
35 
36  const T* a = A.fArray;
37  ASSUME_ALIGNED(a, 64);
38  const T* b = B.fArray;
39  ASSUME_ALIGNED(b, 64);
40  T* c = C.fArray;
41  ASSUME_ALIGNED(c, 64);
42 
43 #include "MultHelixPropTranspEndcap.ah"
44  }
45 
46 } // namespace
47 
48 // ============================================================================
49 // BEGIN STUFF FROM PropagationMPlex.icc
50 namespace {}
51 
52 // END STUFF FROM PropagationMPlex.icc
53 // ============================================================================
54 
55 namespace mkfit {
56 
57  void propagateHelixToZMPlex(const MPlexLS& inErr,
58  const MPlexLV& inPar,
59  const MPlexQI& inChg,
60  const MPlexQF& msZ,
61  MPlexLS& outErr,
62  MPlexLV& outPar,
63  MPlexQI& outFailFlag,
64  const int N_proc,
65  const PropagationFlags& pflags,
66  const MPlexQI* noMatEffPtr) {
67  // debug = true;
68 
69  outErr = inErr;
70  outPar = inPar;
71 
72  MPlexLL errorProp;
73 
74  //helixAtZ_new(inPar, inChg, msZ, outPar, errorProp, outFailFlag, N_proc, pflags);
75  helixAtZ(inPar, inChg, msZ, outPar, errorProp, outFailFlag, N_proc, pflags);
76 
77 #ifdef DEBUG
78  if (debug && g_debug) {
79  for (int kk = 0; kk < N_proc; ++kk) {
80  dprintf("inPar %d\n", kk);
81  for (int i = 0; i < 6; ++i) {
82  dprintf("%8f ", inPar.constAt(kk, i, 0));
83  }
84  dprintf("\n");
85 
86  dprintf("inErr %d\n", kk);
87  for (int i = 0; i < 6; ++i) {
88  for (int j = 0; j < 6; ++j)
89  dprintf("%8f ", inErr.constAt(kk, i, j));
90  dprintf("\n");
91  }
92  dprintf("\n");
93 
94  dprintf("errorProp %d\n", kk);
95  for (int i = 0; i < 6; ++i) {
96  for (int j = 0; j < 6; ++j)
97  dprintf("%8f ", errorProp.At(kk, i, j));
98  dprintf("\n");
99  }
100  dprintf("\n");
101  }
102  }
103 #endif
104 
105 #ifdef DEBUG
106  if (debug && g_debug) {
107  for (int kk = 0; kk < N_proc; ++kk) {
108  dprintf("outErr %d\n", kk);
109  for (int i = 0; i < 6; ++i) {
110  for (int j = 0; j < 6; ++j)
111  dprintf("%8f ", outErr.constAt(kk, i, j));
112  dprintf("\n");
113  }
114  dprintf("\n");
115  }
116  }
117 #endif
118 
119  // Matriplex version of: result.errors = ROOT::Math::Similarity(errorProp, outErr);
120  MPlexLL temp;
121  MultHelixPropEndcap(errorProp, outErr, temp);
122  MultHelixPropTranspEndcap(errorProp, temp, outErr);
123  // can replace with: MultHelixPropFull(errorProp, outErr, temp); MultHelixPropTranspFull(errorProp, temp, outErr);
124 
125  if (pflags.apply_material) {
126  MPlexQF hitsRl;
127  MPlexQF hitsXi;
128  MPlexQF propSign;
129 
130  const TrackerInfo& tinfo = *pflags.tracker_info;
131 
132 #pragma omp simd
133  for (int n = 0; n < NN; ++n) {
134  if (n >= N_proc || (noMatEffPtr && noMatEffPtr->constAt(n, 0, 0))) {
135  hitsRl(n, 0, 0) = 0.f;
136  hitsXi(n, 0, 0) = 0.f;
137  } else {
138  const float hypo = std::hypot(outPar(n, 0, 0), outPar(n, 1, 0));
139  auto mat = tinfo.material_checked(std::abs(msZ(n, 0, 0)), hypo);
140  hitsRl(n, 0, 0) = mat.radl;
141  hitsXi(n, 0, 0) = mat.bbxi;
142  }
143  if (n < N_proc) {
144  const float zout = msZ.constAt(n, 0, 0);
145  const float zin = inPar.constAt(n, 2, 0);
146  propSign(n, 0, 0) = (std::abs(zout) > std::abs(zin) ? 1.f : -1.f);
147  }
148  }
149  MPlexHV plNrm;
150 #pragma omp simd
151  for (int n = 0; n < NN; ++n) {
152  plNrm(n, 0, 0) = 0.f;
153  plNrm(n, 1, 0) = 0.f;
154  plNrm(n, 2, 0) = 1.f;
155  }
156  applyMaterialEffects(hitsRl, hitsXi, propSign, plNrm, outErr, outPar, N_proc);
157 #ifdef DEBUG
158  if (debug && g_debug) {
159  for (int kk = 0; kk < N_proc; ++kk) {
160  dprintf("propSign %d\n", kk);
161  for (int i = 0; i < 1; ++i) {
162  dprintf("%8f ", propSign.constAt(kk, i, 0));
163  }
164  dprintf("\n");
165  dprintf("plNrm %d\n", kk);
166  for (int i = 0; i < 3; ++i) {
167  dprintf("%8f ", plNrm.constAt(kk, i, 0));
168  }
169  dprintf("\n");
170  dprintf("outErr(after material) %d\n", kk);
171  for (int i = 0; i < 6; ++i) {
172  for (int j = 0; j < 6; ++j)
173  dprintf("%8f ", outErr.constAt(kk, i, j));
174  dprintf("\n");
175  }
176  dprintf("\n");
177  }
178  }
179 #endif
180  }
181 
182  squashPhiMPlex(outPar, N_proc); // ensure phi is between |pi|
183 
184  // PROP-FAIL-ENABLE To keep physics changes minimal, we always restore the
185  // state to input when propagation fails -- as was the default before.
186  // if (pflags.copy_input_state_on_fail) {
187  for (int i = 0; i < N_proc; ++i) {
188  if (outFailFlag(i, 0, 0)) {
189  outPar.copySlot(i, inPar);
190  outErr.copySlot(i, inErr);
191  }
192  }
193  // }
194  }
195 
196  void helixAtZ(const MPlexLV& inPar,
197  const MPlexQI& inChg,
198  const MPlexQF& msZ,
199  MPlexLV& outPar,
200  MPlexLL& errorProp,
201  MPlexQI& outFailFlag,
202  const int N_proc,
203  const PropagationFlags& pflags) {
204  errorProp.setVal(0.f);
205  outFailFlag.setVal(0.f);
206 
207  // debug = true;
208 #pragma omp simd
209  for (int n = 0; n < NN; ++n) {
210  //initialize erroProp to identity matrix, except element 2,2 which is zero
211  errorProp(n, 0, 0) = 1.f;
212  errorProp(n, 1, 1) = 1.f;
213  errorProp(n, 3, 3) = 1.f;
214  errorProp(n, 4, 4) = 1.f;
215  errorProp(n, 5, 5) = 1.f;
216  }
217  float zout[NN];
218  float zin[NN];
219  float ipt[NN];
220  float phiin[NN];
221  float theta[NN];
222 #pragma omp simd
223  for (int n = 0; n < NN; ++n) {
224  //initialize erroProp to identity matrix, except element 2,2 which is zero
225  zout[n] = msZ.constAt(n, 0, 0);
226  zin[n] = inPar.constAt(n, 2, 0);
227  ipt[n] = inPar.constAt(n, 3, 0);
228  phiin[n] = inPar.constAt(n, 4, 0);
229  theta[n] = inPar.constAt(n, 5, 0);
230  }
231 
232  float k[NN];
233  if (pflags.use_param_b_field) {
234 #pragma omp simd
235  for (int n = 0; n < NN; ++n) {
236  k[n] = inChg.constAt(n, 0, 0) * 100.f /
237  (-Const::sol * Config::bFieldFromZR(zin[n], hipo(inPar.constAt(n, 0, 0), inPar.constAt(n, 1, 0))));
238  }
239  } else {
240 #pragma omp simd
241  for (int n = 0; n < NN; ++n) {
242  k[n] = inChg.constAt(n, 0, 0) * 100.f / (-Const::sol * Config::Bfield);
243  }
244  }
245 
246  float kinv[NN];
247 #pragma omp simd
248  for (int n = 0; n < NN; ++n) {
249  kinv[n] = 1.f / k[n];
250  }
251 
252 #pragma omp simd
253  for (int n = 0; n < NN; ++n) {
254  dprint_np(n,
255  std::endl
256  << "input parameters"
257  << " inPar.constAt(n, 0, 0)=" << std::setprecision(9) << inPar.constAt(n, 0, 0)
258  << " inPar.constAt(n, 1, 0)=" << std::setprecision(9) << inPar.constAt(n, 1, 0)
259  << " inPar.constAt(n, 2, 0)=" << std::setprecision(9) << inPar.constAt(n, 2, 0)
260  << " inPar.constAt(n, 3, 0)=" << std::setprecision(9) << inPar.constAt(n, 3, 0)
261  << " inPar.constAt(n, 4, 0)=" << std::setprecision(9) << inPar.constAt(n, 4, 0)
262  << " inPar.constAt(n, 5, 0)=" << std::setprecision(9) << inPar.constAt(n, 5, 0)
263  << " inChg.constAt(n, 0, 0)=" << std::setprecision(9) << inChg.constAt(n, 0, 0));
264  }
265 #pragma omp simd
266  for (int n = 0; n < NN; ++n) {
267  dprint_np(n,
268  "propagation start, dump parameters"
269  << std::endl
270  << "pos = " << inPar.constAt(n, 0, 0) << " " << inPar.constAt(n, 1, 0) << " "
271  << inPar.constAt(n, 2, 0) << std::endl
272  << "mom (cart) = " << std::cos(inPar.constAt(n, 4, 0)) / inPar.constAt(n, 3, 0) << " "
273  << std::sin(inPar.constAt(n, 4, 0)) / inPar.constAt(n, 3, 0) << " "
274  << 1. / (inPar.constAt(n, 3, 0) * tan(inPar.constAt(n, 5, 0))) << " r="
275  << std::sqrt(inPar.constAt(n, 0, 0) * inPar.constAt(n, 0, 0) +
276  inPar.constAt(n, 1, 0) * inPar.constAt(n, 1, 0))
277  << " pT=" << 1. / std::abs(inPar.constAt(n, 3, 0)) << " q=" << inChg.constAt(n, 0, 0)
278  << " targetZ=" << msZ.constAt(n, 0, 0) << std::endl);
279  }
280 
281  float pt[NN];
282 #pragma omp simd
283  for (int n = 0; n < NN; ++n) {
284  pt[n] = 1.f / ipt[n];
285  }
286 
287  //no trig approx here, phi can be large
288  float cosP[NN];
289  float sinP[NN];
290 #pragma omp simd
291  for (int n = 0; n < NN; ++n) {
292  cosP[n] = std::cos(phiin[n]);
293  }
294 
295 #pragma omp simd
296  for (int n = 0; n < NN; ++n) {
297  sinP[n] = std::sin(phiin[n]);
298  }
299 
300  float cosT[NN];
301  float sinT[NN];
302 #pragma omp simd
303  for (int n = 0; n < NN; ++n) {
304  cosT[n] = std::cos(theta[n]);
305  }
306 
307 #pragma omp simd
308  for (int n = 0; n < NN; ++n) {
309  sinT[n] = std::sin(theta[n]);
310  }
311 
312  float tanT[NN];
313  float icos2T[NN];
314  float pxin[NN];
315  float pyin[NN];
316 #pragma omp simd
317  for (int n = 0; n < NN; ++n) {
318  tanT[n] = sinT[n] / cosT[n];
319  icos2T[n] = 1.f / (cosT[n] * cosT[n]);
320  pxin[n] = cosP[n] * pt[n];
321  pyin[n] = sinP[n] * pt[n];
322  }
323 
324  float deltaZ[NN];
325  float alpha[NN];
326 #pragma omp simd
327  for (int n = 0; n < NN; ++n) {
328  deltaZ[n] = zout[n] - zin[n];
329  alpha[n] = deltaZ[n] * tanT[n] * ipt[n] * kinv[n];
330  }
331 
332  float cosahTmp[NN];
333  float sinahTmp[NN];
335 #if !defined(__INTEL_COMPILER)
336 #pragma omp simd
337 #endif
338  for (int n = 0; n < NN; ++n) {
339  sincos4(alpha[n] * 0.5f, sinahTmp[n], cosahTmp[n]);
340  }
341  } else {
342 #if !defined(__INTEL_COMPILER)
343 #pragma omp simd
344 #endif
345  for (int n = 0; n < NN; ++n) {
346  cosahTmp[n] = std::cos(alpha[n] * 0.5f);
347  }
348 #if !defined(__INTEL_COMPILER)
349 #pragma omp simd
350 #endif
351  for (int n = 0; n < NN; ++n) {
352  sinahTmp[n] = std::sin(alpha[n] * 0.5f);
353  }
354  }
355 
356  float cosah[NN];
357  float sinah[NN];
358  float cosa[NN];
359  float sina[NN];
360 #pragma omp simd
361  for (int n = 0; n < NN; ++n) {
362  cosah[n] = cosahTmp[n];
363  sinah[n] = sinahTmp[n];
364  cosa[n] = 1.f - 2.f * sinah[n] * sinah[n];
365  sina[n] = 2.f * sinah[n] * cosah[n];
366  }
367 
368 //update parameters
369 #pragma omp simd
370  for (int n = 0; n < NN; ++n) {
371  outPar.At(n, 0, 0) = outPar.At(n, 0, 0) + 2.f * k[n] * sinah[n] * (pxin[n] * cosah[n] - pyin[n] * sinah[n]);
372  outPar.At(n, 1, 0) = outPar.At(n, 1, 0) + 2.f * k[n] * sinah[n] * (pyin[n] * cosah[n] + pxin[n] * sinah[n]);
373  outPar.At(n, 2, 0) = zout[n];
374  outPar.At(n, 4, 0) = phiin[n] + alpha[n];
375  }
376 
377 #pragma omp simd
378  for (int n = 0; n < NN; ++n) {
379  dprint_np(n,
380  "propagation to Z end (OLD), dump parameters\n"
381  << " pos = " << outPar(n, 0, 0) << " " << outPar(n, 1, 0) << " " << outPar(n, 2, 0) << "\t\t r="
382  << std::sqrt(outPar(n, 0, 0) * outPar(n, 0, 0) + outPar(n, 1, 0) * outPar(n, 1, 0)) << std::endl
383  << " mom = " << outPar(n, 3, 0) << " " << outPar(n, 4, 0) << " " << outPar(n, 5, 0) << std::endl
384  << " cart= " << std::cos(outPar(n, 4, 0)) / outPar(n, 3, 0) << " "
385  << std::sin(outPar(n, 4, 0)) / outPar(n, 3, 0) << " "
386  << 1. / (outPar(n, 3, 0) * tan(outPar(n, 5, 0))) << "\t\tpT=" << 1. / std::abs(outPar(n, 3, 0))
387  << std::endl);
388  }
389 
390  float pxcaMpysa[NN];
391 #pragma omp simd
392  for (int n = 0; n < NN; ++n) {
393  pxcaMpysa[n] = pxin[n] * cosa[n] - pyin[n] * sina[n];
394  }
395 
396 #pragma omp simd
397  for (int n = 0; n < NN; ++n) {
398  errorProp(n, 0, 2) = -tanT[n] * ipt[n] * pxcaMpysa[n];
399  errorProp(n, 0, 3) =
400  k[n] * pt[n] * pt[n] *
401  (cosP[n] * (alpha[n] * cosa[n] - sina[n]) + sinP[n] * 2.f * sinah[n] * (sinah[n] - alpha[n] * cosah[n]));
402  errorProp(n, 0, 4) = -2.f * k[n] * pt[n] * sinah[n] * (sinP[n] * cosah[n] + cosP[n] * sinah[n]);
403  errorProp(n, 0, 5) = deltaZ[n] * ipt[n] * pxcaMpysa[n] * icos2T[n];
404  }
405 
406  float pycaPpxsa[NN];
407 #pragma omp simd
408  for (int n = 0; n < NN; ++n) {
409  pycaPpxsa[n] = pyin[n] * cosa[n] + pxin[n] * sina[n];
410  }
411 
412 #pragma omp simd
413  for (int n = 0; n < NN; ++n) {
414  errorProp(n, 1, 2) = -tanT[n] * ipt[n] * pycaPpxsa[n];
415  errorProp(n, 1, 3) =
416  k[n] * pt[n] * pt[n] *
417  (sinP[n] * (alpha[n] * cosa[n] - sina[n]) - cosP[n] * 2.f * sinah[n] * (sinah[n] - alpha[n] * cosah[n]));
418  errorProp(n, 1, 4) = 2.f * k[n] * pt[n] * sinah[n] * (cosP[n] * cosah[n] - sinP[n] * sinah[n]);
419  errorProp(n, 1, 5) = deltaZ[n] * ipt[n] * pycaPpxsa[n] * icos2T[n];
420  }
421 
422 #pragma omp simd
423  for (int n = 0; n < NN; ++n) {
424  errorProp(n, 4, 2) = -ipt[n] * tanT[n] * kinv[n];
425  errorProp(n, 4, 3) = tanT[n] * deltaZ[n] * kinv[n];
426  errorProp(n, 4, 5) = ipt[n] * deltaZ[n] * kinv[n] * icos2T[n];
427  }
428 
429 #pragma omp simd
430  for (int n = 0; n < NN; ++n) {
431  dprint_np(
432  n,
433  "propagation end, dump parameters"
434  << std::endl
435  << "pos = " << outPar.At(n, 0, 0) << " " << outPar.At(n, 1, 0) << " " << outPar.At(n, 2, 0) << std::endl
436  << "mom (cart) = " << std::cos(outPar.At(n, 4, 0)) / outPar.At(n, 3, 0) << " "
437  << std::sin(outPar.At(n, 4, 0)) / outPar.At(n, 3, 0) << " "
438  << 1. / (outPar.At(n, 3, 0) * tan(outPar.At(n, 5, 0)))
439  << " r=" << std::sqrt(outPar.At(n, 0, 0) * outPar.At(n, 0, 0) + outPar.At(n, 1, 0) * outPar.At(n, 1, 0))
440  << " pT=" << 1. / std::abs(outPar.At(n, 3, 0)) << std::endl);
441  }
442 
443  // PROP-FAIL-ENABLE Disabled to keep physics changes minimal.
444  // To be reviewed, enabled and processed accordingly elsewhere.
445  /*
446  // Check for errors, set fail-flag.
447  for (int n = 0; n < NN; ++n) {
448  // We propagate for alpha: mark fail when prop angle more than pi/2
449  if (std::abs(alpha[n]) > 1.57) {
450  dprintf("helixAtZ: more than quarter turn, alpha = %f\n", alpha[n]);
451  outFailFlag[n] = 1;
452  } else {
453  // Have we reached desired z? We can't know, we copy desired z to actual z.
454  // Are we close to apex? Same condition as in propToR, 12.5 deg, cos(78.5deg) = 0.2
455  float dotp = (outPar.At(n, 0, 0) * std::cos(outPar.At(n, 4, 0)) +
456  outPar.At(n, 1, 0) * std::sin(outPar.At(n, 4, 0))) /
457  std::hypot(outPar.At(n, 0, 0), outPar.At(n, 1, 0));
458  if (dotp < 0.2 || dotp < 0) {
459  dprintf("helixAtZ: dot product bad, dotp = %f\n", dotp);
460  outFailFlag[n] = 1;
461  }
462  }
463  }
464  */
465 
466 #ifdef DEBUG
467  if (debug && g_debug) {
468  for (int n = 0; n < N_proc; ++n) {
469  dmutex_guard;
470  std::cout << n << ": jacobian" << std::endl;
471  printf("%5f %5f %5f %5f %5f %5f\n",
472  errorProp(n, 0, 0),
473  errorProp(n, 0, 1),
474  errorProp(n, 0, 2),
475  errorProp(n, 0, 3),
476  errorProp(n, 0, 4),
477  errorProp(n, 0, 5));
478  printf("%5f %5f %5f %5f %5f %5f\n",
479  errorProp(n, 1, 0),
480  errorProp(n, 1, 1),
481  errorProp(n, 1, 2),
482  errorProp(n, 1, 3),
483  errorProp(n, 1, 4),
484  errorProp(n, 1, 5));
485  printf("%5f %5f %5f %5f %5f %5f\n",
486  errorProp(n, 2, 0),
487  errorProp(n, 2, 1),
488  errorProp(n, 2, 2),
489  errorProp(n, 2, 3),
490  errorProp(n, 2, 4),
491  errorProp(n, 2, 5));
492  printf("%5f %5f %5f %5f %5f %5f\n",
493  errorProp(n, 3, 0),
494  errorProp(n, 3, 1),
495  errorProp(n, 3, 2),
496  errorProp(n, 3, 3),
497  errorProp(n, 3, 4),
498  errorProp(n, 3, 5));
499  printf("%5f %5f %5f %5f %5f %5f\n",
500  errorProp(n, 4, 0),
501  errorProp(n, 4, 1),
502  errorProp(n, 4, 2),
503  errorProp(n, 4, 3),
504  errorProp(n, 4, 4),
505  errorProp(n, 4, 5));
506  printf("%5f %5f %5f %5f %5f %5f\n",
507  errorProp(n, 5, 0),
508  errorProp(n, 5, 1),
509  errorProp(n, 5, 2),
510  errorProp(n, 5, 3),
511  errorProp(n, 5, 4),
512  errorProp(n, 5, 5));
513  }
514  }
515 #endif
516  }
517 
518 } // namespace mkfit
Matriplex::Matriplex< float, LL, LL, NN > MPlexLL
Definition: Matrix.h:53
MPlex< T, D1, D2, N > hypot(const MPlex< T, D1, D2, N > &a, const MPlex< T, D1, D2, N > &b)
Definition: Matriplex.h:616
Definition: APVGainStruct.h:7
#define dprint_np(n, x)
Definition: Debug.h:96
Matriplex::Matriplex< float, HH, 1, NN > MPlexHV
Definition: Matrix.h:58
Sin< T >::type sin(const T &t)
Definition: Sin.h:22
const TrackerInfo * tracker_info
void applyMaterialEffects(const MPlexQF &hitsRl, const MPlexQF &hitsXi, const MPlexQF &propSign, const MPlexHV &plNrm, MPlexLS &outErr, MPlexLV &outPar, const int N_proc)
Matriplex::Matriplex< float, LL, 1, NN > MPlexLV
Definition: Matrix.h:54
void squashPhiMPlex(MPlexLV &par, const int N_proc)
void propagateHelixToZMPlex(const MPlexLS &inErr, const MPlexLV &inPar, const MPlexQI &inChg, const MPlexQF &msZ, MPlexLS &outErr, MPlexLV &outPar, MPlexQI &outFailFlag, const int N_proc, const PropagationFlags &pflags, const MPlexQI *noMatEffPtr=nullptr)
bool g_debug
Definition: Debug.cc:2
void helixAtZ(const MPlexLV &inPar, const MPlexQI &inChg, const MPlexQF &msZ, MPlexLV &outPar, MPlexLL &errorProp, MPlexQI &outFailFlag, const int N_proc, const PropagationFlags &pflags)
T sqrt(T t)
Definition: SSEVec.h:23
constexpr Matriplex::idx_t NN
Definition: Matrix.h:48
Cos< T >::type cos(const T &t)
Definition: Cos.h:22
constexpr float Bfield
Definition: Config.h:60
Tan< T >::type tan(const T &t)
Definition: Tan.h:22
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
double f[11][100]
constexpr bool useTrigApprox
Definition: Config.h:51
Matriplex::Matriplex< int, 1, 1, NN > MPlexQI
Definition: Matrix.h:81
#define debug
Definition: HDRShower.cc:19
constexpr float sol
Definition: Config.h:13
Matriplex::Matriplex< float, 1, 1, NN > MPlexQF
Definition: Matrix.h:80
#define N
Definition: blowfish.cc:9
float hipo(float x, float y)
Definition: Matrix.h:9
float bFieldFromZR(const float z, const float r)
Definition: Config.h:131
double b
Definition: hdecay.h:120
double a
Definition: hdecay.h:121
Matriplex::MatriplexSym< float, LL, NN > MPlexLS
Definition: Matrix.h:55
Material material_checked(float z, float r) const
Definition: TrackerInfo.h:275
Definition: APVGainStruct.h:7
long double T
void sincos4(const float x, float &sin, float &cos)
Definition: Matrix.h:13
#define ASSUME_ALIGNED(a, b)
#define dprintf(...)
Definition: Debug.h:98