Commit in lcsim/src/org/lcsim/recon/tracking/seedtracker on MAIN
SeedTrackerTrackStateDriver.java+54-401.7 -> 1.8
fix NaN problem.

lcsim/src/org/lcsim/recon/tracking/seedtracker
SeedTrackerTrackStateDriver.java 1.7 -> 1.8
diff -u -r1.7 -r1.8
--- SeedTrackerTrackStateDriver.java	23 Nov 2010 09:19:23 -0000	1.7
+++ SeedTrackerTrackStateDriver.java	3 Dec 2010 21:12:26 -0000	1.8
@@ -34,11 +34,12 @@
  * @author jeremym
  * @author ngraf
  * 
- * @version $Id: SeedTrackerTrackStateDriver.java,v 1.7 2010/11/23 09:19:23 grefe Exp $
+ * @version $Id: SeedTrackerTrackStateDriver.java,v 1.8 2010/12/03 21:12:26 ngraf Exp $
  */
 public class SeedTrackerTrackStateDriver extends Driver
 {
     // protected CalorimeterInformation calInfo;
+
     protected double ecalRadius;
     protected int ecalNumSides;
     protected double ecalZ;
@@ -46,27 +47,28 @@
     protected HelixSwimmer swimmer;
 
     public SeedTrackerTrackStateDriver()
-    {}
+    {
+    }
 
-    protected void detectorChanged( Detector detector )
+    protected void detectorChanged(Detector detector)
     {
         // get the magnetic field and set up the helix swimmer
-        magField = detector.getFieldMap().getField( new BasicHep3Vector( 0, 0, 0 ) ).magnitude();
-        swimmer = new HelixSwimmer( magField );
+        magField = detector.getFieldMap().getField(new BasicHep3Vector(0, 0, 0)).magnitude();
+        swimmer = new HelixSwimmer(magField);
 
         // Get calorimeter parameters from Detector.
         Calorimeter ecalBarrel = null;
         Calorimeter ecalEndcap = null;
 
         // Get the EM Barrel.
-        ecalBarrel = detector.getCalorimeterByType( CalorimeterType.EM_BARREL );
-        if ( ecalBarrel == null )
-            throw new RuntimeException( "Missing EM_BARREL subdetector in compact description." );
+        ecalBarrel = detector.getCalorimeterByType(CalorimeterType.EM_BARREL);
+        if (ecalBarrel == null)
+            throw new RuntimeException("Missing EM_BARREL subdetector in compact description.");
 
         // Get the EM Endcap.
-        ecalEndcap = detector.getCalorimeterByType( CalorimeterType.EM_ENDCAP );
-        if ( ecalEndcap == null )
-            throw new RuntimeException( "Missing EM_ENDCAP subdetector in compact description." );
+        ecalEndcap = detector.getCalorimeterByType(CalorimeterType.EM_ENDCAP);
+        if (ecalEndcap == null)
+            throw new RuntimeException("Missing EM_ENDCAP subdetector in compact description.");
 
         ecalRadius = ecalBarrel.getInnerRadius();
         ecalNumSides = ecalBarrel.getNumberOfSides();
@@ -75,10 +77,10 @@
         //System.out.println( "ECAL: radius " + ecalRadius + " nsides " + ecalNumSides + " z " + ecalZ );
     }
 
-    public void process( EventHeader event )
+    public void process(EventHeader event)
     {
         // Get the Tracks from the event. Collection name is SeedTracker's default.
-        List<Track> tracks = event.get( Track.class, "Tracks" );
+        List<Track> tracks = event.get(Track.class, "Tracks");
 
         // TrackState lists.
         List<GenericObject> startObjs = new ArrayList<GenericObject>();
@@ -86,30 +88,30 @@
         List<GenericObject> ecalObjs = new ArrayList<GenericObject>();
 
         // Loop over all the Tracks in the collection.
-        for ( Track track : tracks )
+        for (Track track : tracks)
         {
             SeedTrack strk = (SeedTrack) track;
             SeedCandidate scand = strk.getSeedCandidate();
             HelicalTrackFit helix = scand.getHelix();
-            Hep3Vector ptrk = new BasicHep3Vector( strk.getMomentum() );
+            Hep3Vector ptrk = new BasicHep3Vector(strk.getMomentum());
             double smax = -9999.;
             HelicalTrackHit last = null;
-            for ( HelicalTrackHit hit : scand.getHits() )
+            for (HelicalTrackHit hit : scand.getHits())
             {
-                double s = helix.PathMap().get( hit );
-                if ( s > smax )
+                double s = helix.PathMap().get(hit);
+                if (s > smax)
                 {
                     smax = s;
                     last = hit;
                 }
             }
-            TrackDirection trkdir = HelixUtils.CalculateTrackDirection( helix, smax );
+            TrackDirection trkdir = HelixUtils.CalculateTrackDirection(helix, smax);
             Hep3Vector dir = trkdir.Direction();
             Hep3Vector pos = null;
-            if ( last instanceof HelicalTrackCross )
+            if (last instanceof HelicalTrackCross)
             {
                 HelicalTrackCross cross = (HelicalTrackCross) last;
-                cross.setTrackDirection( trkdir, helix.covariance() );
+                cross.setTrackDirection(trkdir, helix.covariance());
                 pos = cross.getCorrectedPosition();
             }
             else
@@ -118,36 +120,48 @@
             }
 
             // Set the End TrackState from the outermost hit on the track.
-            Hep3Vector xmomentum = VecOp.mult( ptrk.magnitude(), dir );
+            Hep3Vector xmomentum = VecOp.mult(ptrk.magnitude(), dir);
 
             // Set the End TrackState to the point of closest approach to the last hit
-            swimmer.setTrack( track );
-            double s = swimmer.getDistanceToPoint( pos );
-            Hep3Vector corPos = swimmer.getPointAtLength( s );
+            swimmer.setTrack(track);
+            double s = swimmer.getDistanceToPoint(pos);
+            Hep3Vector corPos = swimmer.getPointAtLength(s);
 
-            TrackState endState = new TrackState( corPos, xmomentum );
-            endObjs.add( endState );
+            TrackState endState = new TrackState(corPos, xmomentum);
+            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 );
+            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);
 
             // TODO Should set the ECal TrackState by propagating from the outermost hit on the track.
-            s = Math.min( swimmer.getDistanceToZ( ecalZ ), swimmer.getDistanceToPolyhedra( ecalRadius, ecalNumSides ) );
-
-            SpacePoint ecalPos = swimmer.getPointAtLength( s );
-            SpaceVector ecalMom = swimmer.getMomentumAtLength( s );
+            double sZ = swimmer.getDistanceToZ(ecalZ);
+            double sR = swimmer.getDistanceToPolyhedra(ecalRadius, ecalNumSides);
+            if (Double.isNaN(sR))
+            {
+                s = sZ;
+            }
+            else if (Double.isNaN(sZ))
+            {
+                s = sR;
+            }
+            else
+            {
+                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 );
+            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 );
-        event.put( "StateAtEnd", endObjs, GenericObject.class, 0 );
+        event.put("StateAtStart", startObjs, GenericObject.class, 0);
+        event.put("StateAtECal", ecalObjs, GenericObject.class, 0);
+        event.put("StateAtEnd", endObjs, GenericObject.class, 0);
     }
-}
\ No newline at end of file
+}
CVSspam 0.2.8