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
12
13 class SmearTrackSimple {
14
15
16
17
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
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
50 EigenvalueDecomposition eig = M.eig();
51
52 Matrix T = eig.getV();
53 double[] er = eig.getRealEigenvalues();
54 double[] ei = eig.getImagEigenvalues();
55
56
57 if (T.det() == 0.) {
58 throw new RuntimeException("Non orthogonal basis!");
59 }
60
61
62 for (int i = 0; i < ei.length; i++)
63 if (ei[i] != 0.) {
64 throw new RuntimeException("Imaginary Eigenvalues seen!");
65 }
66
67
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
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
89 double chi2 = ((shift.transpose()).times((M.inverse()).times(shift))).get(0, 0);
90
91
92
93
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 }