Commit in lcsim/src/org/lcsim/recon/tracking/seedtracker on MAIN
SeedTrackerTrackStateDriver.java+43-131.3 -> 1.4
fix state at ecal

lcsim/src/org/lcsim/recon/tracking/seedtracker
SeedTrackerTrackStateDriver.java 1.3 -> 1.4
diff -u -r1.3 -r1.4
--- SeedTrackerTrackStateDriver.java	26 May 2010 15:10:25 -0000	1.3
+++ SeedTrackerTrackStateDriver.java	26 May 2010 21:02:49 -0000	1.4
@@ -1,4 +1,4 @@
-// $Id: SeedTrackerTrackStateDriver.java,v 1.3 2010/05/26 15:10:25 ngraf Exp $
+// $Id: SeedTrackerTrackStateDriver.java,v 1.4 2010/05/26 21:02:49 ngraf Exp $
 package org.lcsim.recon.tracking.seedtracker;
 
 import hep.physics.vec.BasicHep3Vector;
@@ -16,7 +16,12 @@
 import org.lcsim.fit.helicaltrack.HelicalTrackHit;
 import org.lcsim.fit.helicaltrack.HelixUtils;
 import org.lcsim.fit.helicaltrack.TrackDirection;
+import org.lcsim.geometry.Calorimeter.CalorimeterType;
+import org.lcsim.recon.util.CalorimeterInformation;
+import org.lcsim.spacegeom.SpacePoint;
+import org.lcsim.spacegeom.SpaceVector;
 import org.lcsim.util.Driver;
+import org.lcsim.util.swim.HelixSwimmer;
 
 /**
  * This Driver creates the three TrackState collections expected by slicPandora
@@ -30,16 +35,32 @@
  */
 public class SeedTrackerTrackStateDriver extends Driver
 {
+
+    @Override
     public void process(EventHeader event)
     {
+        // Need the B field for extrapolation
+        double magField = event.getDetector().getFieldMap().getField(new BasicHep3Vector(0, 0, 0)).magnitude();
+
+        //TODO cache this and refresh under detectorChanged method
+        CalorimeterInformation calInfo = CalorimeterInformation.instance();
+        double ecalRadius = calInfo.getRMin(CalorimeterType.EM_BARREL);
+        // number of sides
+        int ecalNumSides = calInfo.getNSides(CalorimeterType.EM_BARREL);
+        // inner z of ECal endcap
+        double ecalZ = calInfo.getZMin(CalorimeterType.EM_ENDCAP);
+//        System.out.println("ECAL: radius " + ecalRadius + " nsides " + ecalNumSides + " z " + ecalZ);
+        // the swimmer
+        HelixSwimmer swimmer = new HelixSwimmer(magField);
+
         // Get the Tracks from the event. Collection name is SeedTracker's default.
         List<Track> tracks = event.get(Track.class, "Tracks");
-        
+
         // TrackState lists.
         List<GenericObject> startObjs = new ArrayList<GenericObject>();
         List<GenericObject> endObjs = new ArrayList<GenericObject>();
-        List<GenericObject> ecalObjs = new ArrayList<GenericObject>();        
-       
+        List<GenericObject> ecalObjs = new ArrayList<GenericObject>();
+
         // Loop over all the Tracks in the collection.
         for (Track track : tracks)
         {
@@ -67,27 +88,36 @@
                 HelicalTrackCross cross = (HelicalTrackCross) last;
                 cross.setTrackDirection(trkdir, helix.covariance());
                 pos = cross.getCorrectedPosition();
-            }
-            else
+            } else
             {
                 pos = last.getCorrectedPosition();
             }
-            
-            // Set both the End and ECal TrackStates from the outermost hit on the track.
+
+            // Set the End TrackState from the outermost hit on the track.
             double[] xpos = pos.v();
             double[] xmomentum = VecOp.mult(ptrk.magnitude(), dir).v();
-            TrackState ecalState = new TrackState(xpos[0], xpos[1], xpos[2], xmomentum[0], xmomentum[1], xmomentum[2]);
-            ecalObjs.add(ecalState);            
+
             TrackState endState = new TrackState(xpos[0], xpos[1], xpos[2], xmomentum[0], xmomentum[1], xmomentum[2]);
             endObjs.add(endState);
-            
+
             // Calculate the Start state and add to list.
             double[] smom = ptrk.v();
             double[] spos = HelixUtils.PointOnHelix(helix, 0.).v();
             TrackState startState = new TrackState(spos[0], spos[1], spos[2], smom[0], smom[1], smom[2]);
-            startObjs.add(startState);             
+            startObjs.add(startState);
+
+            //TODO Should set the ECal TrackState by propagating from the outermost hit on the track.
+            swimmer.setTrack(track);
+            double s = Math.min(swimmer.getDistanceToZ(ecalZ), swimmer.getDistanceToPolyhedra(ecalRadius, ecalNumSides));
+
+            SpacePoint ecalPos = swimmer.getPointAtLength(s);
+            SpaceVector ecalMom = swimmer.getMomentumAtLength(s);
+
+            TrackState ecalState = new TrackState(ecalPos.x(), ecalPos.y(), ecalPos.z(), ecalMom.x(), ecalMom.y(), ecalMom.z());
+            ecalObjs.add(ecalState);
+
         }
-        
+
         // Add the lists to the event.
         event.put("StateAtStart", startObjs, GenericObject.class, 0);
         event.put("StateAtECal", ecalObjs, GenericObject.class, 0);
CVSspam 0.2.8