View Javadoc

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   * Basic implementation of {@link org.lcsim.event.Track} interface.
19   * Includes method for initializing track parameters from momentum at a given point.
20   *
21   * @author D. Onoprienko
22   * @version $Id: BasicTrack.java,v 1.4 2012/06/18 23:02:14 jeremy Exp $
23   */
24  public class BasicTrack implements Track {
25  
26  // -- Constructors and static initialization :  --------------------------------
27   
28    /** 
29     * Initialization of static members.
30     * Runs automatically once the detector classes have been initialized.
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    /** Default constructor. */
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    /** Copy constructor. */
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  // -- Standard getters (implementing Track interface) :  -----------------------
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 // -- Additional getters :  ----------------------------------------------------
119   
120   /** Returns transverse momentum of the track. */
121   public double getPt() {
122     return Math.hypot(_momentum[0], _momentum[1]);
123   }
124   
125   /** Returns amplitude of the track momentum. */
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 // -- Setters :  ---------------------------------------------------------------
132   
133   /** Add track to the list of tracks associated with this track. */
134   public void addTrack(Track track) {_tracks.add(track);}
135   
136   /** Removes track from the list of tracks associated with this track. */
137   public void removeTrack(Track track) {_tracks.remove(track);}
138   
139   /** Remove all tracks from the list of tracks associated with this track. */
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 // -- Private parts :  ---------------------------------------------------------
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 }