View Javadoc

1   package org.lcsim.mc.fast.tracking;
2   
3   import Jama.EigenvalueDecomposition;
4   import Jama.Matrix;
5   import Jama.util.Maths;
6   
7   import org.lcsim.mc.fast.tracking.SimpleTables;
8   import java.util.Random;
9   
10  /**
11   * @author T. Barklow
12   */
13  class SmearTrackSimple {
14      /**
15       * Smear track parameters according to modified version of track's stored error matrix.
16       *
17       * @see TrackParameters
18       */
19      static DocaTrackParameters smearTrackSimple(double bField, TrackParameters noSmear, Random rand, SimpleTables SmTbl, double pt, boolean hist) {
20  
21          final double errScale = 0.0001;
22          final double eMScale = 1.e14;
23          // get copy of error matrix and prepare for modification
24          Matrix eM = Maths.toJamaMatrix(noSmear.getErrorMatrix());
25          double[] errscale = { SmTbl.getD0ErrorScale(), SmTbl.getPhiErrorScale(), 1., SmTbl.getZ0ErrorScale(), SmTbl.getTanLambdaErrorScale() };
26          double[] oldDiagErr = new double[5];
27          double[] newDiagErr = new double[5];
28          for (int i = 0; i < 5; i++) {
29              oldDiagErr[i] = Math.sqrt(noSmear.getErrorMatrix().diagonal(i));
30              if (i == 2) {
31                  double th = Math.atan(1 / (noSmear.getTanL()));
32                  double a = SmTbl.getConstantTerm();
33                  double b = SmTbl.getThetaTerm() / (pt * Math.sin(th));
34                  newDiagErr[i] = Math.abs(noSmear.getOmega()) * pt * Math.sqrt(a * a + b * b);
35              } else {
36                  newDiagErr[i] = errscale[i] * oldDiagErr[i];
37              }
38              eM.set(i, i, Math.pow(newDiagErr[i], 2.));
39              for (int j = 0; j < i; j++) {
40                  eM.set(i, j, noSmear.getErrorMatrix().e(i, j) * newDiagErr[i] * newDiagErr[j] / oldDiagErr[i] / oldDiagErr[j]);
41                  eM.set(j, i, eM.get(i, j));
42              }
43          }
44          Matrix M = eM.copy();
45          if (M.det() <= 0.) {
46              throw new RuntimeException("Error matrix not positive definite!");
47          }
48  
49          // run Eigenvalue decomposition and get matrices and vectors
50          EigenvalueDecomposition eig = M.eig();
51  
52          Matrix T = eig.getV();
53          double[] er = eig.getRealEigenvalues();
54          double[] ei = eig.getImagEigenvalues();
55  
56          // sanity check: det(T) != 0
57          if (T.det() == 0.) {
58              throw new RuntimeException("Non orthogonal basis!");
59          }
60  
61          // sanity check: no imaginary eigenvalues
62          for (int i = 0; i < ei.length; i++)
63              if (ei[i] != 0.) {
64                  throw new RuntimeException("Imaginary Eigenvalues seen!");
65              }
66  
67          // now do the real smearing
68          double[] dev = new double[5];
69          for (int i = 0; i < er.length; i++) {
70              if (er[i] <= 0) {
71                  throw new RuntimeException("Non-positive Eigenvalue seen!");
72              }
73              dev[i] = Math.sqrt(er[i]) * rand.nextGaussian();
74          }
75  
76          Matrix shift = T.times(new Matrix(dev, 5));
77          Matrix val = new Matrix(noSmear.getTrackParameters(), 5);
78          double[] newval = (val.plus(shift)).getColumnPackedCopy();
79  
80          // adjust new phi value to [-pi,pi] if necessary
81          if (newval[1] > Math.PI) {
82              newval[1] -= (2. * Math.PI);
83          }
84          if (newval[1] < -Math.PI) {
85              newval[1] += (2. * Math.PI);
86          }
87  
88          // Chi2 calculation
89          double chi2 = ((shift.transpose()).times((M.inverse()).times(shift))).get(0, 0);
90  
91          // DocaTrackParameters smeared = new DocaTrackParameters(bField, newval, (eM.timesEquals(eMScale)).getArray(), chi2);
92          // DocaTrackParameters smeared = new DocaTrackParameters(bField, newval, eM.getArray(), chi2);
93          // DocaTrackParameters smeared = new DocaTrackParameters(bField, newval, (Matrix.constructWithCopy(noSmear.getErrorMatrix()).timesEquals(errScale)).getArray(), chi2);
94          DocaTrackParameters smeared = new DocaTrackParameters(bField, newval, noSmear.getErrorMatrix(), chi2);
95          if (noSmear instanceof DocaTrackParameters) {
96              smeared.setL0(((DocaTrackParameters) noSmear).getL0());
97          }
98  
99          return smeared;
100     }
101 }