1 package org.lcsim.recon.cat.util;
2
3 import java.util.*;
4
5 import org.lcsim.event.*;
6 import org.lcsim.util.*;
7 import hep.physics.matrix.SymmetricMatrix;
8 import org.lcsim.spacegeom.SpacePoint;
9 import org.lcsim.spacegeom.SpaceVector;
10 import org.lcsim.conditions.ConditionsListener;
11 import org.lcsim.conditions.ConditionsEvent;
12 import org.lcsim.conditions.ConditionsManager;
13 import org.lcsim.conditions.ConditionsManager.ConditionsSetNotFoundException;
14 import org.lcsim.geometry.Detector;
15 import org.lcsim.util.swim.HelixSwimmer;
16
17
18
19
20
21
22
23
24 public class BasicTrack implements Track {
25
26
27
28
29
30
31
32 static public void initialize(Detector detector) {
33 _bField = detector.getFieldMap().getField(new double[]{0.,0.,0.})[2];
34 _swimmer = new HelixSwimmer(_bField);
35 }
36
37
38 public BasicTrack() {
39 _refPoint = new double[3];
40 _refPointIsPCA = false;
41 _parameters = new double[5];
42 _covMatrix = new SymmetricMatrix(5);
43 _momentum = new double[3];
44 _charge = 0;
45 _fitSuccess = false;
46 _chi2 = 0.;
47 _ndf = 1;
48 _dEdx = 0.;
49 _dEdxErr = 0.;
50 _innermostHitRadius = 9999.;
51 _nHitsSubdet = new int[4];
52 _tracks = new ArrayList<Track>(1);
53 _hits = new ArrayList<TrackerHit>(1);
54 _type = 0;
55 }
56
57
58 public BasicTrack(BasicTrack track) {
59 _refPoint = new double[3];
60 System.arraycopy(track._refPoint, 0, _refPoint, 0, 3);
61 _refPointIsPCA = track._refPointIsPCA;
62 _parameters = new double[5];
63 System.arraycopy(track._parameters, 0, _parameters, 0, 5);
64 _covMatrix = new SymmetricMatrix(track._covMatrix);
65 _momentum = new double[3];
66 System.arraycopy(track._momentum, 0, _momentum, 0, 3);
67 _charge = track._charge;
68 _fitSuccess = track._fitSuccess;
69 _chi2 = track._chi2;
70 _ndf = track._ndf;
71 _dEdx = track._dEdx;
72 _dEdxErr = track._dEdxErr;
73 _innermostHitRadius = track._innermostHitRadius;
74 _nHitsSubdet = new int[4];
75 System.arraycopy(track._nHitsSubdet, 0, _nHitsSubdet, 0, 4);
76 _tracks = new ArrayList<Track>(track._tracks);
77 _hits = new ArrayList<TrackerHit>(track._hits);
78 _type = track._type;
79 }
80
81
82
83 public int getCharge() {return _charge;}
84
85 public double[] getReferencePoint() {return _refPoint;}
86 public double getReferencePointX() {return _refPoint[0];}
87 public double getReferencePointY() {return _refPoint[1];}
88 public double getReferencePointZ() {return _refPoint[2];}
89
90 public boolean isReferencePointPCA() {return _refPointIsPCA;}
91
92 public double[] getMomentum() {return _momentum;}
93 public double getPX() {return _momentum[0];}
94 public double getPY() {return _momentum[1];}
95 public double getPZ() {return _momentum[2];}
96
97 public double[] getTrackParameters() {return _parameters;}
98 public double getTrackParameter(int i) {return _parameters[i];}
99 public SymmetricMatrix getErrorMatrix() {return _covMatrix;}
100
101 public boolean fitSuccess() {return _fitSuccess;}
102 public double getChi2() {return _chi2;}
103 public int getNDF() {return _ndf;}
104
105 public double getdEdx() {return _dEdx;}
106 public double getdEdxError() {return _dEdxErr;}
107
108 public double getRadiusOfInnermostHit() {return _innermostHitRadius;}
109
110 public int[] getSubdetectorHitNumbers() {return _nHitsSubdet;}
111
112 public List<Track> getTracks() {return _tracks;}
113
114 public List<TrackerHit> getTrackerHits() {return _hits;}
115
116 public int getType() {return _type;}
117
118
119
120
121 public double getPt() {
122 return Math.hypot(_momentum[0], _momentum[1]);
123 }
124
125
126 public double getP() {
127 double[] p = getMomentum();
128 return Math.sqrt(_momentum[0]*_momentum[0]+_momentum[1]*_momentum[1]+_momentum[2]*_momentum[2]);
129 }
130
131
132
133
134 public void addTrack(Track track) {_tracks.add(track);}
135
136
137 public void removeTrack(Track track) {_tracks.remove(track);}
138
139
140 public void removeTracks() {_tracks.clear();}
141
142 public void setHelixParameters(SpacePoint refPoint, SpacePoint position, SpaceVector momentum, int charge) {
143 _refPoint = refPoint.v();
144 _swimmer.setTrack(momentum, position, charge);
145 double alpha = _swimmer.getTrackLengthToPoint(refPoint);
146 SpacePoint poca = _swimmer.getPointAtLength(alpha);
147 SpaceVector momentumAtPoca = _swimmer.getMomentumAtLength(alpha);
148 LCIOParameters parameters = LCIOParameters.SpaceMomentum2Parameters(poca, momentumAtPoca, refPoint, charge, _bField);
149 _parameters = parameters.getValues();
150 _momentum = momentumAtPoca.v();
151 _charge = charge;
152 }
153
154
155
156 protected double[] _refPoint;
157 protected boolean _refPointIsPCA;
158 protected double[] _parameters;
159 protected SymmetricMatrix _covMatrix;
160 protected double[] _momentum;
161 protected int _charge;
162 protected boolean _fitSuccess;
163 protected double _chi2;
164 protected int _ndf;
165 protected double _dEdx;
166 protected double _dEdxErr;
167 protected double _innermostHitRadius;
168 protected int[] _nHitsSubdet;
169 protected ArrayList<Track> _tracks;
170 protected ArrayList<TrackerHit> _hits;
171 protected int _type;
172
173 protected static double _bField;
174 protected static HelixSwimmer _swimmer;
175
176 protected static ConditionsListener _conListener = new ConditionsListener() {
177 public void conditionsChanged(ConditionsEvent event) {
178 ConditionsManager conMan = (event == null) ? ConditionsManager.defaultInstance() : event.getConditionsManager();
179 try {
180 Detector det = conMan.getCachedConditions(Detector.class,"compact.xml").getCachedData();
181 initialize(det);
182 } catch (ConditionsSetNotFoundException x) {}
183 }
184 };
185 static {
186 ConditionsManager.defaultInstance().addConditionsListener(_conListener);
187 _conListener.conditionsChanged(null);
188 }
189
190 public List<TrackState> getTrackStates()
191 {
192 return null;
193 }
194 }