View Javadoc

1   package org.lcsim.recon.tracking.magfield;
2   
3   import java.util.logging.Level;
4   import java.util.logging.Logger;
5   import org.apache.commons.math.ArgumentOutsideDomainException;
6   import org.apache.commons.math.analysis.interpolation.SplineInterpolator;
7   import org.apache.commons.math.analysis.polynomials.PolynomialSplineFunction;
8   import org.lcsim.recon.tracking.spacegeom.CartesianPointVector;
9   import org.lcsim.recon.tracking.spacegeom.SpacePoint;
10  import org.lcsim.recon.tracking.spacegeom.SpacePointTensor;
11  import org.lcsim.recon.tracking.spacegeom.SpacePointVector;
12  
13  /**
14   *
15   * @author Norman A Graf
16   *
17   * @version $Id:
18   */
19  public class SplineFit1DMagneticFieldMap extends AbstractMagneticField
20  {
21  
22      private SplineInterpolator _interpolator = new SplineInterpolator();
23      private PolynomialSplineFunction _spline;
24  
25      private COORDINATE _coord;
26      private BVAL _bval;
27  
28      private double _scaleFactor = 1.0;
29  
30      public enum COORDINATE
31      {
32  
33          X(0, "x"), Y(1, "y"), Z(2, "z");
34          private int _numVal;
35          private String _stringVal;
36  
37          COORDINATE(int numVal, String stringVal)
38          {
39              this._numVal = numVal;
40              this._stringVal = stringVal;
41          }
42  
43          public int numVal()
44          {
45              return _numVal;
46          }
47  
48          public String stringVal()
49          {
50              return _stringVal;
51          }
52      }
53  
54      public enum BVAL
55      {
56  
57          BX(0, "Bx"), BY(1, "By"), BZ(2, "Bz");
58          private int _numVal;
59          private String _stringVal;
60  
61          BVAL(int numVal, String stringVal)
62          {
63              this._numVal = numVal;
64              this._stringVal = stringVal;
65          }
66  
67          public int numVal()
68          {
69              return _numVal;
70          }
71  
72          public String stringVal()
73          {
74              return _stringVal;
75          }
76  
77      }
78  
79      public SplineFit1DMagneticFieldMap(COORDINATE coord, double[] pos, BVAL bval, double[] val)
80      {
81          this(coord, pos, bval, val, 1.);
82  
83      }
84  
85      public SplineFit1DMagneticFieldMap(COORDINATE coord, double[] pos, BVAL bval, double[] val, double scale)
86      {
87          _coord = coord;
88          _bval = bval;
89          _spline = _interpolator.interpolate(pos, val);
90          _scaleFactor = scale;
91      }
92  
93      public void setScalefactor(double scale)
94      {
95          _scaleFactor = scale;
96      }
97  
98      @Override
99      public SpacePointVector field(SpacePoint p)
100     {
101         double[] b = {0., 0., 0.};
102         double v = p.getCartesianArray()[_coord.numVal()];
103         int index = _bval.numVal();
104         try {
105             b[index] = _spline.value(v);
106         } catch (ArgumentOutsideDomainException ex) {
107             ex.printStackTrace();
108         }
109         return new CartesianPointVector(p, _scaleFactor*b[0], _scaleFactor*b[1], _scaleFactor*b[2]);
110     }
111 
112     @Override
113     public SpacePointVector field(SpacePoint p, SpacePointTensor g)
114     {
115         throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
116     }
117 
118     public String toString()
119     {
120         return "1D magnetic field returning " + _bval.stringVal() + " as a function of " + _coord.stringVal()+" with scale factor "+_scaleFactor;
121     }
122 
123 }