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
16
17
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.");
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 }