1
2
3
4
5
6
7
8
9
10 package org.lcsim.detector.tracker.silicon;
11
12 import org.lcsim.detector.ITransform3D;
13 import org.lcsim.util.probability.Erf;
14 import hep.physics.vec.Hep3Vector;
15 import hep.physics.vec.VecOp;
16 import org.lcsim.detector.solids.GeomOp3D;
17
18
19
20
21
22 public class GaussianDistribution2D implements ChargeDistribution
23 {
24 private double _normalization;
25 private Hep3Vector _mean;
26 private Hep3Vector _major_axis;
27 private Hep3Vector _minor_axis;
28
29
30 public GaussianDistribution2D(double normalization, Hep3Vector mean, Hep3Vector major_axis, Hep3Vector minor_axis)
31 {
32
33
34
35
36
37
38
39
40
41 _normalization = normalization;
42 _mean = mean;
43
44
45 if (Math.abs(VecOp.dot(major_axis,minor_axis)) < GeomOp3D.DISTANCE_TOLERANCE)
46 {
47 _major_axis = major_axis;
48 _minor_axis = minor_axis;
49 }
50 else
51 {
52 throw new RuntimeException("Axes not perpendicular!");
53 }
54
55 }
56
57 public void transform(ITransform3D transform)
58 {
59 transform.transform(_mean);
60 transform.rotate(_major_axis);
61 transform.rotate(_major_axis);
62 }
63
64 public ChargeDistribution transformed(ITransform3D transform)
65 {
66 Hep3Vector transformed_mean = transform.transformed(_mean);
67 Hep3Vector transformed_major_axis = transform.rotated(_major_axis);
68 Hep3Vector transformed_minor_axis = transform.rotated(_minor_axis);
69 return new GaussianDistribution2D(_normalization, transformed_mean, transformed_major_axis, transformed_minor_axis);
70 }
71
72 public double getNormalization()
73 {
74 return _normalization;
75 }
76
77 public Hep3Vector getMean()
78 {
79 return _mean;
80 }
81
82 public double sigma1D(Hep3Vector axis)
83 {
84 Hep3Vector uaxis = VecOp.unit(axis);
85 return Math.sqrt( Math.pow(VecOp.dot(uaxis,_major_axis),2) + Math.pow(VecOp.dot(uaxis,_minor_axis),2) );
86 }
87
88
89 public double covxy(Hep3Vector xaxis, Hep3Vector yaxis)
90 {
91
92 if (Math.abs(VecOp.dot(xaxis, yaxis)) > GeomOp3D.ANGULAR_TOLERANCE)
93 throw new RuntimeException("Pixel axes not orthogonal");
94
95
96 double cth = VecOp.dot(VecOp.unit(xaxis), VecOp.unit(_major_axis));
97 double sth = VecOp.dot(VecOp.unit(yaxis), VecOp.unit(_major_axis));
98
99
100 return sth * cth * (_major_axis.magnitudeSquared() - _minor_axis.magnitudeSquared());
101 }
102
103
104 public double upperIntegral1D(Hep3Vector axis, double integration_limit)
105 {
106 double normalized_integration_limit = (integration_limit-VecOp.dot(getMean(),axis))/sigma1D(axis);
107
108
109
110
111
112
113
114
115
116 return _normalization * Erf.phic(normalized_integration_limit);
117
118 }
119
120 }