View Javadoc

1   /*
2    * GaussianDistribution2D.java
3    *
4    * Created on October 10, 2007, 10:36 AM
5    *
6    * To change this template, choose Tools | Template Manager
7    * and open the template in the editor.
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   * @author tknelson
21   */
22  public class GaussianDistribution2D implements ChargeDistribution
23  {
24      private double _normalization; // = 1.0;
25      private Hep3Vector _mean; // = new BasicHep3Vector(0.0,0.0,0.0);
26      private Hep3Vector _major_axis; // = new BasicHep3Vector(1.0,0.0,0.0);
27      private Hep3Vector _minor_axis; // = new BasicHep3Vector(0.0,1.0,0.0);
28      
29      /** Creates a new instance of GaussianDistribution2D */
30      public GaussianDistribution2D(double normalization, Hep3Vector mean, Hep3Vector major_axis, Hep3Vector minor_axis)
31      {
32  //        System.out.println("Constructing GaussianDistribution2D");
33  //        
34  //        System.out.println("normalization: "+normalization);
35  //        System.out.println("mean: "+mean);
36  //        System.out.println("major axis: "+major_axis);
37  //        System.out.println("minor axis: "+minor_axis);
38  //        
39  //        System.out.println("VecOp.dot(major_axis,minor_axis): "+VecOp.dot(major_axis,minor_axis));
40          
41          _normalization = normalization;
42          _mean = mean;
43    
44  //        if (VecOp.dot(major_axis,minor_axis) == 0.0)
45          if (Math.abs(VecOp.dot(major_axis,minor_axis)) < GeomOp3D.DISTANCE_TOLERANCE)  // must have a tolerance on this
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      //  Calculate the x-y off-diagonal covariance matrix element
89      public double covxy(Hep3Vector xaxis, Hep3Vector yaxis)
90      {
91          //  Check that axes are orthogonal
92          if (Math.abs(VecOp.dot(xaxis, yaxis)) > GeomOp3D.ANGULAR_TOLERANCE)
93              throw new RuntimeException("Pixel axes not orthogonal");
94  
95          //  Find the sin and cos of the angle between the x axis and the major axis
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          //  Calculate the x-y covariance matrix element
100         return sth * cth * (_major_axis.magnitudeSquared() - _minor_axis.magnitudeSquared());
101     }
102 
103     // One dimensional upper integral of charge distribution along a given axis
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 //        System.out.println("Integration limit: "+integration_limit);
109 //        System.out.println("Mean: "+getMean());
110 //        System.out.println("Axis: "+axis);
111 //        System.out.println("VecOp.dot(getMean(),axis)): "+VecOp.dot(getMean(),axis));
112 //        System.out.println("integration_limit-VecOp.dot(getMean(),axis)): "+(integration_limit - VecOp.dot(getMean(),axis)));
113 //        System.out.println("sigma1D(axis): "+sigma1D(axis));
114 //        System.out.println("Normalized integration limit: "+normalized_integration_limit);
115         
116         return _normalization * Erf.phic(normalized_integration_limit);
117         
118     }
119     
120 }