Print

Print


Author: [log in to unmask]
Date: Fri Sep  4 18:29:34 2015
New Revision: 3538

Log:
merge track collections; rework how track types are handled and used

Added:
    java/trunk/tracking/src/main/java/org/hps/recon/tracking/MergeTrackCollections.java
Modified:
    java/trunk/steering-files/src/main/resources/org/hps/steering/recon/EngineeringRun2015FullReconMC_Pass2.lcsim
    java/trunk/steering-files/src/main/resources/org/hps/steering/recon/EngineeringRun2015FullRecon_Pass2.lcsim
    java/trunk/tracking/src/main/java/org/hps/recon/tracking/TrackDataDriver.java
    java/trunk/tracking/src/main/java/org/hps/recon/tracking/TrackType.java
    java/trunk/tracking/src/main/java/org/hps/recon/tracking/TrackUtils.java
    java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/GBLOutputDriver.java
    java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/MakeGblTracks.java

Modified: java/trunk/steering-files/src/main/resources/org/hps/steering/recon/EngineeringRun2015FullReconMC_Pass2.lcsim
 =============================================================================
--- java/trunk/steering-files/src/main/resources/org/hps/steering/recon/EngineeringRun2015FullReconMC_Pass2.lcsim	(original)
+++ java/trunk/steering-files/src/main/resources/org/hps/steering/recon/EngineeringRun2015FullReconMC_Pass2.lcsim	Fri Sep  4 18:29:34 2015
@@ -52,10 +52,11 @@
             TrackDataDriver needs to be run before ReconParticleDriver so the
             ReconstructedParticle types are properly set.
          -->
-        <driver name="TrackDataDriver" />              
-        <driver name="ReconParticle" />  
-        <driver name="GBLOutputDriver"/>
+        <driver name="MergeTrackCollections"/>
+        <driver name="GBLOutputDriver" />
         <driver name="GBLRefitterDriver" />
+        <driver name="TrackDataDriver" />
+        <driver name="ReconParticleDriver" />   
         <driver name="LCIOWriter"/>
         <driver name="CleanupDriver"/>
     </execute>    
@@ -94,7 +95,7 @@
         </driver>
           <!-- SVT Track finding -->
         <driver name="TrackReconSeed345Conf2Extd16" type="org.hps.recon.tracking.TrackerReconDriver">
-            <trackCollectionName>MatchedTracks</trackCollectionName>
+            <trackCollectionName>Tracks_s345_c2_e16</trackCollectionName>
             <strategyResource>HPS_s345_c2_e16.xml</strategyResource>
             <debug>false</debug>
             <rmsTimeCut>8.0</rmsTimeCut>
@@ -117,6 +118,7 @@
             <debug>false</debug>
             <rmsTimeCut>8.0</rmsTimeCut>
         </driver>       
+        <driver name="MergeTrackCollections" type="org.hps.recon.tracking.MergeTrackCollections" />
         <driver name="GBLOutputDriver" type="org.hps.recon.tracking.gbl.GBLOutputDriver"/>             
         <driver name="GBLRefitterDriver" type="org.hps.recon.tracking.gbl.HpsGblRefitter"/>
         <driver name="EcalRawConverter" type="org.hps.recon.ecal.EcalRawConverterDriver">

Modified: java/trunk/steering-files/src/main/resources/org/hps/steering/recon/EngineeringRun2015FullRecon_Pass2.lcsim
 =============================================================================
--- java/trunk/steering-files/src/main/resources/org/hps/steering/recon/EngineeringRun2015FullRecon_Pass2.lcsim	(original)
+++ java/trunk/steering-files/src/main/resources/org/hps/steering/recon/EngineeringRun2015FullRecon_Pass2.lcsim	Fri Sep  4 18:29:34 2015
@@ -47,19 +47,20 @@
         --> 
         <driver name="TrackReconSeed123Conf5Extd46"/>
         <!-- 
-            TrackDataDriver needs to be run before ReconParticleDriver so the
-            ReconstructedParticle types are properly set.
-         -->
+           TrackDataDriver needs to be run before ReconParticleDriver so the
+           ReconstructedParticle types are properly set.
+        -->
+        <driver name="MergeTrackCollections"/>
+        <driver name="GBLOutputDriver" />
+        <driver name="GBLRefitterDriver" />
         <driver name="TrackDataDriver" />
         <driver name="ReconParticleDriver" />   
-        <driver name="GBLOutputDriver" />
-        <driver name="GBLRefitterDriver" />
         <driver name="LCIOWriter"/>
         <driver name="CleanupDriver"/>
     </execute>    
     <drivers>    
         <driver name="EventMarkerDriver" type="org.lcsim.job.EventMarkerDriver">
-            <eventInterval>1000</eventInterval>
+            <eventInterval>1</eventInterval>
         </driver>        
 
         <!-- Ecal reconstruction drivers -->
@@ -104,7 +105,7 @@
         </driver>
         <!-- SVT Track finding -->
         <driver name="TrackReconSeed345Conf2Extd16" type="org.hps.recon.tracking.TrackerReconDriver">
-            <trackCollectionName>MatchedTracks</trackCollectionName>
+            <trackCollectionName>Tracks_s345_c2_e16</trackCollectionName>
             <strategyResource>HPS_s345_c2_e16.xml</strategyResource>
             <debug>false</debug>
             <rmsTimeCut>8.0</rmsTimeCut>
@@ -127,6 +128,7 @@
             <debug>false</debug>
             <rmsTimeCut>8.0</rmsTimeCut>
         </driver>             
+        <driver name="MergeTrackCollections" type="org.hps.recon.tracking.MergeTrackCollections" />
         <driver name="TrackDataDriver" type="org.hps.recon.tracking.TrackDataDriver" />
         <driver name="ReconParticleDriver" type="org.hps.recon.particle.HpsReconParticleDriver" > 
             <ecalClusterCollectionName>EcalClustersCorr</ecalClusterCollectionName>        

Added: java/trunk/tracking/src/main/java/org/hps/recon/tracking/MergeTrackCollections.java
 =============================================================================
--- java/trunk/tracking/src/main/java/org/hps/recon/tracking/MergeTrackCollections.java	(added)
+++ java/trunk/tracking/src/main/java/org/hps/recon/tracking/MergeTrackCollections.java	Fri Sep  4 18:29:34 2015
@@ -0,0 +1,94 @@
+package org.hps.recon.tracking;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import org.lcsim.event.EventHeader;
+import org.lcsim.event.RelationalTable;
+import org.lcsim.event.Track;
+import org.lcsim.event.TrackerHit;
+import org.lcsim.lcio.LCIOConstants;
+import org.lcsim.recon.tracking.seedtracker.SeedTrack;
+import org.lcsim.util.Driver;
+
+/**
+ *
+ * @author Sho Uemura <[log in to unmask]>
+ * @version $Id: $
+ */
+public class MergeTrackCollections extends Driver {
+
+    private String outputCollectionName = "MatchedTracks";
+    private boolean removeCollections = true;
+
+    public void setOutputCollectionName(String outputCollectionName) {
+        this.outputCollectionName = outputCollectionName;
+    }
+
+    public void setRemoveCollections(boolean removeCollections) {
+        this.removeCollections = removeCollections;
+    }
+
+    @Override
+    public void process(EventHeader event) {
+        RelationalTable hitToStrips = TrackUtils.getHitToStripsTable(event);
+        RelationalTable hitToRotated = TrackUtils.getHitToRotatedTable(event);
+        List<List<Track>> trackCollections = event.get(Track.class);
+
+        // Loop over each of the track collections retrieved from the event
+        Map<Set<TrackerHit>, List<Track>> hitsToTracksMap = new HashMap<Set<TrackerHit>, List<Track>>();
+        for (List<Track> tracklist : trackCollections) {
+            for (Track trk : tracklist) {
+                Set<TrackerHit> trackHits = new HashSet<TrackerHit>(TrackUtils.getStripHits(trk, hitToStrips, hitToRotated));
+                List<Track> matchingTracks = hitsToTracksMap.get(trackHits);
+                if (matchingTracks == null) {
+                    matchingTracks = new ArrayList<Track>();
+                    hitsToTracksMap.put(trackHits, matchingTracks);
+                }
+                matchingTracks.add(trk);
+
+            }
+        }
+
+        List<Track> deduplicatedTracks = new ArrayList<Track>();
+
+        for (List<Track> matchingTracks : hitsToTracksMap.values()) {
+            Track trk = matchingTracks.get(0);// pick lowest-chisq track (this probably doesn't matter)
+            for (Track matchingTrack : matchingTracks) {
+                if (matchingTrack.getChi2() < trk.getChi2()) {
+                    trk = matchingTrack;
+                }
+            }
+
+            int trackType = 0;
+            for (Track matchingTrack : matchingTracks) {
+                // Get the name of the strategy used to find this track
+                SeedTrack seedTrack = (SeedTrack) matchingTrack;
+                String strategyName = seedTrack.getStrategy().getName();
+
+                // Check if a StrategyType is associated with this strategy. 
+                // If it is, set the track type.  Otherwise, just move on 
+                // and stick with the default value of zero.
+                StrategyType strategyType = StrategyType.getType(strategyName);
+                if (strategyType != null) {
+                    trackType = TrackType.addStrategy(trackType, strategyType);
+                }
+            }
+
+            ((SeedTrack) trk).setTrackType(trackType);
+            deduplicatedTracks.add(trk);
+        }
+
+        int flag = 1 << LCIOConstants.TRBIT_HITS;
+        event.put(outputCollectionName, deduplicatedTracks, Track.class, flag);
+
+        if (removeCollections) {
+            for (List<Track> tracklist : trackCollections) {
+                event.remove(event.getMetaData(tracklist).getName());
+            }
+        }
+    }
+}

Modified: java/trunk/tracking/src/main/java/org/hps/recon/tracking/TrackDataDriver.java
 =============================================================================
--- java/trunk/tracking/src/main/java/org/hps/recon/tracking/TrackDataDriver.java	(original)
+++ java/trunk/tracking/src/main/java/org/hps/recon/tracking/TrackDataDriver.java	Fri Sep  4 18:29:34 2015
@@ -172,23 +172,6 @@
             // Loop over all the tracks in the event
             for (Track track : tracks) {
 
-                //
-                // Set the TrackType of the track based on the tracking 
-                // strategy that was used to find it.
-                //
-                
-                // Get the name of the strategy used to find this track
-                SeedTrack seedTrack = (SeedTrack) track; 
-                String strategyName = seedTrack.getStrategy().getName();
-               
-                // Check if a StrategyType is associated with this strategy. 
-                // If it is, set the track type.  Otherwise, just move on 
-                // and stick with the default value of zero.
-                StrategyType strategyType = StrategyType.getType(strategyName);
-                if (strategyType != null) { 
-                    seedTrack.setTrackType(TrackType.getType(strategyType));
-                }
-                
                 totalT0 = 0;
                 totalHits = 0;
                 t0Residuals.clear();

Modified: java/trunk/tracking/src/main/java/org/hps/recon/tracking/TrackType.java
 =============================================================================
--- java/trunk/tracking/src/main/java/org/hps/recon/tracking/TrackType.java	(original)
+++ java/trunk/tracking/src/main/java/org/hps/recon/tracking/TrackType.java	Fri Sep  4 18:29:34 2015
@@ -1,59 +1,80 @@
 package org.hps.recon.tracking;
 
 /**
- * Class containing utilities used to retrieve the track type value
- * based on the tracking strategy and whether it's a GBL track or not.
- * 
+ * Class containing utilities used to retrieve the track type value based on the
+ * tracking strategy and whether it's a GBL track or not.
+ *
  * @author <a href="mailto:[log in to unmask]">Omar Moreno</a>
  */
 public final class TrackType {
 
     /**
-     * Returns the track type for the given strategy.  This assumes that the
+     * Returns the track type for the given strategy. This assumes that the
      * track is not a GBL track.
-     * 
-     * @param strategyType The StrategyType associated with the tracking 
-     *                     tracking strategy of interest. 
+     *
+     * @param strategyType The StrategyType associated with the tracking
+     * tracking strategy of interest.
      * @return The track type value for this StrategyType
      */
-    public static int getType(StrategyType strategyType) { 
+    public static int getType(StrategyType strategyType) {
         return TrackType.encodeType(strategyType, false);
     }
-    
+
     /**
-     * Returns the track type for a given strategy based of whether the
-     * track is a GBL track or not.
+     * Returns the track type for a given strategy based of whether the track is
+     * a GBL track or not.
      *
-     * @param strategyType The StrategyType associated with the tracking 
-     *                     tracking strategy of interest.
+     * @param strategyType The StrategyType associated with the tracking
+     * tracking strategy of interest.
      * @param isGblTrack Flag indicating whether the track is a GBL track
-     * @return  The track type value
+     * @return The track type value
      */
-    public static int getType(StrategyType strategyType, boolean isGblTrack) { 
+    public static int getType(StrategyType strategyType, boolean isGblTrack) {
         return TrackType.encodeType(strategyType, isGblTrack);
     }
-   
+
     /**
-     * Track type encoder.  The strategy (S) and GBL flag (G) are packed as 
+     * Track type encoder. The strategy (S) and GBL flag (G) are packed as
      * follows:
-     * 
+     *
      * Note that Z denotes zero
-     * 
+     *
      * ZZZZZZZZZZZZZZZZZZZZZZZZZZGSSSSS
-     * 
-     * @param strategyType The StrategyType associated with the tracking 
-     *                     tracking strategy of interest.
+     *
+     * @param strategyType The StrategyType associated with the tracking
+     * tracking strategy of interest.
      * @param isGblTrack Flag indicating whether the track is a GBL track
      * @return The enoded track type value
      */
-    private static int encodeType(StrategyType strategyType, boolean isGblTrack) { 
-       
-        int type = strategyType.getType();
-        if (isGblTrack) type = (type ^ (1 << 6));
-        
-        return type; 
+    private static int encodeType(StrategyType strategyType, boolean isGblTrack) {
+
+        int type = 1 << (strategyType.getType() - 1);
+        if (isGblTrack) {
+            type = (type ^ (1 << 5));
+        }
+
+        return type;
     }
-    
-    /** Constructor */
-    private TrackType() {}
+
+    public static int addStrategy(int type, StrategyType strategyType) {
+        return type | 1 << (strategyType.getType() - 1);
+    }
+
+    public static boolean isGBL(int type) {
+        return (type & (1 << 5)) != 0;
+    }
+
+    public static int setGBL(int type, boolean isGblTrack) {
+        if (isGblTrack != isGBL(type)) {
+            return type ^ (1 << 5);
+        } else {
+            return type;
+        }
+    }
+
+    /**
+     * Constructor
+     */
+    private TrackType() {
+    }
 }

Modified: java/trunk/tracking/src/main/java/org/hps/recon/tracking/TrackUtils.java
 =============================================================================
--- java/trunk/tracking/src/main/java/org/hps/recon/tracking/TrackUtils.java	(original)
+++ java/trunk/tracking/src/main/java/org/hps/recon/tracking/TrackUtils.java	Fri Sep  4 18:29:34 2015
@@ -780,7 +780,7 @@
         if (track.getClass().isInstance(SeedTrack.class))
             return ((SeedTrack) track).getSeedCandidate().getHelix();
         else
-            return getHTF(track.getTrackStates().get(0).getParameters());
+            return getHTF(track.getTrackStates().get(0));
     }
 
     public static HelicalTrackFit getHTF(double par[]) {
@@ -788,6 +788,13 @@
         SymmetricMatrix cov = new SymmetricMatrix(5);
         for (int i = 0; i < cov.getNRows(); ++i)
             cov.setElement(i, i, 1.);
+        HelicalTrackFit htf = new HelicalTrackFit(par, cov, new double[2], new int[2], null, null);
+        return htf;
+    }
+
+    public static HelicalTrackFit getHTF(TrackState state) {
+        double par[] = state.getParameters();
+        SymmetricMatrix cov = new SymmetricMatrix(5, state.getCovMatrix(), true);
         HelicalTrackFit htf = new HelicalTrackFit(par, cov, new double[2], new int[2], null, null);
         return htf;
     }

Modified: java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/GBLOutputDriver.java
 =============================================================================
--- java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/GBLOutputDriver.java	(original)
+++ java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/GBLOutputDriver.java	Fri Sep  4 18:29:34 2015
@@ -12,6 +12,8 @@
 import java.util.logging.Level;
 import java.util.logging.Logger;
 import org.hps.recon.tracking.EventQuality;
+import org.hps.recon.tracking.StrategyType;
+import org.hps.recon.tracking.TrackType;
 import org.hps.recon.tracking.TrackUtils;
 import org.lcsim.event.EventHeader;
 import org.lcsim.event.LCRelation;
@@ -22,7 +24,9 @@
 import org.lcsim.event.TrackerHit;
 import org.lcsim.event.base.MyLCRelation;
 import org.lcsim.geometry.Detector;
+import org.lcsim.lcio.LCIOConstants;
 import org.lcsim.recon.tracking.digitization.sisim.SiTrackerHitStrip1D;
+import org.lcsim.recon.tracking.seedtracker.SeedTrack;
 import org.lcsim.util.Driver;
 import org.lcsim.util.aida.AIDA;
 
@@ -47,6 +51,7 @@
     private String gblFileName = "";
     private String outputPlotFileName = "";
     private final String MCParticleCollectionName = "MCParticle";
+    private String trackCollectionName = "MatchedTracks";
     private int _debug = 0;
     private boolean isMC = false;
     private int totalTracks = 0;
@@ -76,18 +81,14 @@
 
     @Override
     public void process(EventHeader event) {
-        // Check if the event contains a collection of the type Track. If it
-        // doesn't skip the event.
-        if (!event.hasCollection(Track.class)) {
+        List<Track> tracklist = null;
+        if (event.hasCollection(Track.class, trackCollectionName)) {
+            tracklist = event.get(Track.class, trackCollectionName);
+            if (_debug > 0) {
+                System.out.printf("%s: Event %d has %d tracks\n", this.getClass().getSimpleName(), event.getEventNumber(), tracklist.size());
+            }
+        } else {
             return;
-        }
-
-        // Get all collections of the type Track from the event. This is
-        // required since the event contains a track collection for each of the
-        // different tracking strategies.
-        List<List<Track>> trackCollections = event.get(Track.class);
-        if (_debug > 0) {
-            System.out.printf("%s: Event %d has %d tracks\n", this.getClass().getSimpleName(), event.getEventNumber(), trackCollections.size());
         }
 
         List<SiTrackerHitStrip1D> stripHits = event.get(SiTrackerHitStrip1D.class, "StripClusterer_SiTrackerHitStrip1D");
@@ -108,27 +109,6 @@
         if (isMC) {
             if (truthRes != null) {
                 truthRes.processSim(mcParticles, simTrackerHits);
-            }
-        }
-
-        RelationalTable hitToStrips = TrackUtils.getHitToStripsTable(event);
-        RelationalTable hitToRotated = TrackUtils.getHitToRotatedTable(event);
-        // Loop over each of the track collections retrieved from the event
-        Map<Set<TrackerHit>, List<Track>> hitsToTracksMap = new HashMap<Set<TrackerHit>, List<Track>>();
-        for (List<Track> tracklist : trackCollections) {
-            for (Track trk : tracklist) {
-                totalTracks++;
-                if (TrackUtils.isGoodTrack(trk, tracklist, EventQuality.Quality.NONE)) {
-                    Set<TrackerHit> trackHits = new HashSet<TrackerHit>(TrackUtils.getStripHits(trk, hitToStrips, hitToRotated));
-                    List<Track> matchingTracks = hitsToTracksMap.get(trackHits);
-                    if (matchingTracks == null) {
-                        matchingTracks = new ArrayList<Track>();
-                        hitsToTracksMap.put(trackHits, matchingTracks);
-                    }
-                    matchingTracks.add(trk);
-                } else if (_debug > 0) {
-                    System.out.printf("%s: Track failed selection\n", this.getClass().getSimpleName());
-                }
             }
         }
 
@@ -146,38 +126,41 @@
 
         iTrack = 0;
 
-        for (List<Track> matchingTracks : hitsToTracksMap.values()) {
-            Track trk = matchingTracks.get(0);//arbitrarily pick one track to use to generate GBL data
-
-            if (_debug > 0) {
-                System.out.printf("%s: Print GBL output for this track\n", this.getClass().getSimpleName());
-            }
-
-            //GBLDATA
-            GBLTrackData gblTrackData = new GBLTrackData(iTrack);
-            gblTrackDataList.add(gblTrackData);
-
-            //print to text file
-            gbl.printTrackID(iTrack);
-            gbl.printGBL(trk, stripHits, gblTrackData, gblStripDataList, mcParticles, simTrackerHits, this.isMC);
-
-            //GBLDATA
-            //add relation to normal track object
-            for (Track matchingTrack : matchingTracks) {
-                trackToGBLTrackRelationListAll.add(new MyLCRelation(matchingTrack, gblTrackData));
-            }
-            // add strip clusters to lists
-            for (GBLStripClusterData gblStripClusterData : gblStripDataList) {
-                // add all strip clusters from this track to output list
-                gblStripDataListAll.add(gblStripClusterData);
-                // add LC relations between cluster and track
-                gblTrackToStripClusterRelationListAll.add(new MyLCRelation(gblTrackData, gblStripClusterData));
-            }
-            // clear list of strips for next track
-            gblStripDataList.clear();
-
-            totalTracksProcessed++;
-            ++iTrack;
+        // Loop over each of the track collections retrieved from the event
+        for (Track trk : tracklist) {
+            totalTracks++;
+
+            if (TrackUtils.isGoodTrack(trk, tracklist, EventQuality.Quality.NONE)) {
+                if (_debug > 0) {
+                    System.out.printf("%s: Print GBL output for this track\n", this.getClass().getSimpleName());
+                }
+
+                //GBLDATA
+                GBLTrackData gblTrackData = new GBLTrackData(iTrack);
+                gblTrackDataList.add(gblTrackData);
+
+                //print to text file
+                gbl.printTrackID(iTrack);
+                gbl.printGBL(trk, stripHits, gblTrackData, gblStripDataList, mcParticles, simTrackerHits, this.isMC);
+
+                //GBLDATA
+                //add relation to normal track object
+                trackToGBLTrackRelationListAll.add(new MyLCRelation(trk, gblTrackData));
+                // add strip clusters to lists
+                for (GBLStripClusterData gblStripClusterData : gblStripDataList) {
+                    // add all strip clusters from this track to output list
+                    gblStripDataListAll.add(gblStripClusterData);
+                    // add LC relations between cluster and track
+                    gblTrackToStripClusterRelationListAll.add(new MyLCRelation(gblTrackData, gblStripClusterData));
+                }
+                // clear list of strips for next track
+                gblStripDataList.clear();
+
+                totalTracksProcessed++;
+                ++iTrack;
+            } else if (_debug > 0) {
+                System.out.printf("%s: Track failed selection\n", this.getClass().getSimpleName());
+            }
         }
 
         event.put("GBLEventData", gblEventData, GBLEventData.class, 0);
@@ -205,7 +188,7 @@
         }
         System.out.println(this.getClass().getSimpleName() + ": Total Number of Events           = " + iEvent);
         System.out.println(this.getClass().getSimpleName() + ": Total Number of Tracks           = " + totalTracks);
-        System.out.println(this.getClass().getSimpleName() + ": Total Number of Unique Tracks Processed = " + totalTracksProcessed);
+        System.out.println(this.getClass().getSimpleName() + ": Total Number of Tracks Processed = " + totalTracksProcessed);
 
     }
 

Modified: java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/MakeGblTracks.java
 =============================================================================
--- java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/MakeGblTracks.java	(original)
+++ java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/MakeGblTracks.java	Fri Sep  4 18:29:34 2015
@@ -115,13 +115,8 @@
             //  Set the SeedCandidate this track is based on
             trk.setSeedCandidate(trackseed);
 
-            // Check if a StrategyType is associated with this strategy.
-            // If it is, set the track type with the GBL flag set to true.
-            // Otherwise, just move on and stick with the default value.
-            StrategyType strategyType = StrategyType.getType(seedTrack.getType());
-            if (strategyType != null) {
-                trk.setTrackType(TrackType.getType(strategyType, true));
-            }
+            // Add the GBL flag to the track type.
+            trk.setTrackType(TrackType.setGBL(seedTrack.getType(), true));
 
             // Check the track - hook for plugging in external constraint
             //if ((_trackCheck != null) && (! _trackCheck.checkTrack(trk))) continue;
@@ -214,50 +209,49 @@
         logger.info(String.format("corrected helix: d0=%f, z0=%f, omega=%f, tanlambda=%f, phi0=%f, p=%f", dca_gbl, z0_gbl, C_gbl, slope_gbl, phi0_gbl, Math.abs(1 / qOverP_gbl)));
 
         /*
-        // Strandlie, Wittek, NIMA 566, 2006
-        Matrix covariance_gbl = new Matrix(5, 5);
-        //helpers
-        double Bz = -Constants.fieldConversion * Math.abs(bfield); // TODO sign convention and should it be it scaled from Telsa?
-        double p = Math.abs(1 / qOverP_gbl);
-        double q = Math.signum(qOverP_gbl);
-        double tanLambda = Math.tan(lambda_gbl);
-        double cosLambda = Math.cos(lambda_gbl);
-//        Hep3Vector B = new BasicHep3Vector(0, 0, Bz); // TODO sign convention?
-        Hep3Vector H = new BasicHep3Vector(0, 0, 1);
-        Hep3Vector T = HelixUtils.Direction(helix, 0.);
-        Hep3Vector HcrossT = VecOp.cross(H, T);
-        double alpha = HcrossT.magnitude(); // this should be Bvec cross TrackDir/|B|
-        double Q = Bz * q / p;
-        Hep3Vector Z = new BasicHep3Vector(0, 0, 1);
-        Hep3Vector J = VecOp.mult(1. / VecOp.cross(T, Z).magnitude(), VecOp.cross(T, Z));
-        Hep3Vector K = Z;
-        Hep3Vector U = VecOp.mult(-1, J);
-        Hep3Vector V = VecOp.cross(T, U);
-        Hep3Vector I = VecOp.cross(J, K);
-        Hep3Vector N = VecOp.mult(1 / alpha, VecOp.cross(H, T));
-        double UdotI = VecOp.dot(U, I);
-        double NdotV = VecOp.dot(N, V);
-        double NdotU = VecOp.dot(N, U);
-        double TdotI = VecOp.dot(T, I);
-        double VdotI = VecOp.dot(V, I);
-        double VdotK = VecOp.dot(V, K);
-        covariance_gbl.set(HelicalTrackFit.dcaIndex, FittedGblTrajectory.GBLPARIDX.XT.getValue(), VdotK / TdotI);
-        covariance_gbl.set(HelicalTrackFit.phi0Index, FittedGblTrajectory.GBLPARIDX.XTPRIME.getValue(), 1);
-        covariance_gbl.set(HelicalTrackFit.phi0Index, FittedGblTrajectory.GBLPARIDX.XT.getValue(), -alpha * Q * UdotI * NdotU / (cosLambda * TdotI));
-        covariance_gbl.set(HelicalTrackFit.phi0Index, FittedGblTrajectory.GBLPARIDX.YT.getValue(), -alpha * Q * VdotI * NdotU / (cosLambda * TdotI));
-        covariance_gbl.set(HelicalTrackFit.curvatureIndex, FittedGblTrajectory.GBLPARIDX.QOVERP.getValue(), -1 * Bz / cosLambda);
-//        covariance_gbl.set(HelicalTrackFit.curvatureIndex, FittedGblTrajectory.GBLPARIDX.XTPRIME.getValue(), 0);
-        covariance_gbl.set(HelicalTrackFit.curvatureIndex, FittedGblTrajectory.GBLPARIDX.YTPRIME.getValue(), -1 * q * Bz * tanLambda / (p * cosLambda));
-        covariance_gbl.set(HelicalTrackFit.curvatureIndex, FittedGblTrajectory.GBLPARIDX.XT.getValue(), q * Bz * alpha * Q * tanLambda * UdotI * NdotV / (p * cosLambda * TdotI));
-        covariance_gbl.set(HelicalTrackFit.curvatureIndex, FittedGblTrajectory.GBLPARIDX.YT.getValue(), q * Bz * alpha * Q * tanLambda * VdotI * NdotV / (p * cosLambda * TdotI));
-        covariance_gbl.set(HelicalTrackFit.z0Index, FittedGblTrajectory.GBLPARIDX.YT.getValue(), -1 / TdotI);
-        covariance_gbl.set(HelicalTrackFit.slopeIndex, FittedGblTrajectory.GBLPARIDX.YTPRIME.getValue(), -1);
-        covariance_gbl.set(HelicalTrackFit.slopeIndex, FittedGblTrajectory.GBLPARIDX.XT.getValue(), alpha * Q * UdotI * NdotV / TdotI);
-        covariance_gbl.set(HelicalTrackFit.slopeIndex, FittedGblTrajectory.GBLPARIDX.YT.getValue(), alpha * Q * VdotI * NdotV / TdotI);
-
-        covariance_gbl.print(15, 13);
-                */
-        
+         // Strandlie, Wittek, NIMA 566, 2006
+         Matrix covariance_gbl = new Matrix(5, 5);
+         //helpers
+         double Bz = -Constants.fieldConversion * Math.abs(bfield); // TODO sign convention and should it be it scaled from Telsa?
+         double p = Math.abs(1 / qOverP_gbl);
+         double q = Math.signum(qOverP_gbl);
+         double tanLambda = Math.tan(lambda_gbl);
+         double cosLambda = Math.cos(lambda_gbl);
+         //        Hep3Vector B = new BasicHep3Vector(0, 0, Bz); // TODO sign convention?
+         Hep3Vector H = new BasicHep3Vector(0, 0, 1);
+         Hep3Vector T = HelixUtils.Direction(helix, 0.);
+         Hep3Vector HcrossT = VecOp.cross(H, T);
+         double alpha = HcrossT.magnitude(); // this should be Bvec cross TrackDir/|B|
+         double Q = Bz * q / p;
+         Hep3Vector Z = new BasicHep3Vector(0, 0, 1);
+         Hep3Vector J = VecOp.mult(1. / VecOp.cross(T, Z).magnitude(), VecOp.cross(T, Z));
+         Hep3Vector K = Z;
+         Hep3Vector U = VecOp.mult(-1, J);
+         Hep3Vector V = VecOp.cross(T, U);
+         Hep3Vector I = VecOp.cross(J, K);
+         Hep3Vector N = VecOp.mult(1 / alpha, VecOp.cross(H, T));
+         double UdotI = VecOp.dot(U, I);
+         double NdotV = VecOp.dot(N, V);
+         double NdotU = VecOp.dot(N, U);
+         double TdotI = VecOp.dot(T, I);
+         double VdotI = VecOp.dot(V, I);
+         double VdotK = VecOp.dot(V, K);
+         covariance_gbl.set(HelicalTrackFit.dcaIndex, FittedGblTrajectory.GBLPARIDX.XT.getValue(), VdotK / TdotI);
+         covariance_gbl.set(HelicalTrackFit.phi0Index, FittedGblTrajectory.GBLPARIDX.XTPRIME.getValue(), 1);
+         covariance_gbl.set(HelicalTrackFit.phi0Index, FittedGblTrajectory.GBLPARIDX.XT.getValue(), -alpha * Q * UdotI * NdotU / (cosLambda * TdotI));
+         covariance_gbl.set(HelicalTrackFit.phi0Index, FittedGblTrajectory.GBLPARIDX.YT.getValue(), -alpha * Q * VdotI * NdotU / (cosLambda * TdotI));
+         covariance_gbl.set(HelicalTrackFit.curvatureIndex, FittedGblTrajectory.GBLPARIDX.QOVERP.getValue(), -1 * Bz / cosLambda);
+         //        covariance_gbl.set(HelicalTrackFit.curvatureIndex, FittedGblTrajectory.GBLPARIDX.XTPRIME.getValue(), 0);
+         covariance_gbl.set(HelicalTrackFit.curvatureIndex, FittedGblTrajectory.GBLPARIDX.YTPRIME.getValue(), -1 * q * Bz * tanLambda / (p * cosLambda));
+         covariance_gbl.set(HelicalTrackFit.curvatureIndex, FittedGblTrajectory.GBLPARIDX.XT.getValue(), q * Bz * alpha * Q * tanLambda * UdotI * NdotV / (p * cosLambda * TdotI));
+         covariance_gbl.set(HelicalTrackFit.curvatureIndex, FittedGblTrajectory.GBLPARIDX.YT.getValue(), q * Bz * alpha * Q * tanLambda * VdotI * NdotV / (p * cosLambda * TdotI));
+         covariance_gbl.set(HelicalTrackFit.z0Index, FittedGblTrajectory.GBLPARIDX.YT.getValue(), -1 / TdotI);
+         covariance_gbl.set(HelicalTrackFit.slopeIndex, FittedGblTrajectory.GBLPARIDX.YTPRIME.getValue(), -1);
+         covariance_gbl.set(HelicalTrackFit.slopeIndex, FittedGblTrajectory.GBLPARIDX.XT.getValue(), alpha * Q * UdotI * NdotV / TdotI);
+         covariance_gbl.set(HelicalTrackFit.slopeIndex, FittedGblTrajectory.GBLPARIDX.YT.getValue(), alpha * Q * VdotI * NdotV / TdotI);
+
+         covariance_gbl.print(15, 13);
+         */
         // Sho's magic
         Matrix jacobian = new Matrix(5, 5);
         jacobian.set(HelicalTrackFit.dcaIndex, FittedGblTrajectory.GBLPARIDX.XT.getValue(), -clToPerPrj.e(1, 0));