Print

Print


Author: [log in to unmask]
Date: Thu May 28 13:39:26 2015
New Revision: 3055

Log:
Some local changes and a couple on few track utility methods

Added:
    java/trunk/users/src/main/java/org/hps/users/mgraham/ProfileDriver.java
    java/trunk/users/src/main/java/org/hps/users/mgraham/SplitHitsOnTracks.java
Modified:
    java/trunk/steering-files/src/main/resources/org/hps/steering/users/mgraham/TrackingAndReconMonitoring.lcsim
    java/trunk/tracking/src/main/java/org/hps/recon/tracking/TrackUtils.java

Modified: java/trunk/steering-files/src/main/resources/org/hps/steering/users/mgraham/TrackingAndReconMonitoring.lcsim
 =============================================================================
--- java/trunk/steering-files/src/main/resources/org/hps/steering/users/mgraham/TrackingAndReconMonitoring.lcsim	(original)
+++ java/trunk/steering-files/src/main/resources/org/hps/steering/users/mgraham/TrackingAndReconMonitoring.lcsim	Thu May 28 13:39:26 2015
@@ -10,35 +10,51 @@
         <driver name="RawTrackerHitFitterDriver" />
         <driver name="TrackerHitDriver"/>
         <driver name="HelicalTrackHitDriver"/>
-        <driver name="FullTrackerReconDriver"/>
-        <driver name="TrackDataDriver" />    
+        <driver name="FullTrackerReconDriver"/><!--
+                <driver name="TrackDataDriver" />    
+        -->        
         <driver name="EcalRunningPedestal"/>
-        <driver name="EcalRawConverter" />
-        <driver name="ReconClusterer" />
+        <driver name="EcalRawConverter" /><!--
+-->        
+        <driver name="ReconClusterer" /><!--
+-->        
         <driver name="ReconParticle" /> <!--
-        <driver name="GTPOnlineClusterer" /> -->
-        <!--  SVT opening angle alignment -->
-        <!--        <driver name="TrackerL1to3ReconDriver"/> 
+        <driver name="GTPOnlineClusterer" /> 
+          SVT opening angle alignment -->
+        <driver name="SplitHitsOnTrack"/>       
+        <driver name="TrackerL1to3ReconDriver"/> 
         <driver name="TrackerL4to6ReconDriver"/> 
-        <driver name="SVTAlignment"/> -->
+        <driver name="TrackerL134ReconDriver"/> 
+        <driver name="ReconParticleL1to3" />
+        <driver name="ReconParticleL4to6" />
+        <driver name="ReconParticleL134" />
+        <driver name="SVTAlignment"/> 
+        <driver name="TrackingMonitoringSingles1DQM" /> 
+        <driver name="TrackingMonitoringL1to3Singles1DQM"/>
+        <driver name="TrackingMonitoringL4to6Singles1DQM"/>
+        <driver name="TrackingMonitoringL134Singles1DQM"/>
+        <driver name="FinalStateL1to3DQMSingles1"/>
+        <driver name="FinalStateL4to6DQMSingles1"/>
+        <driver name="FinalStateL134DQMSingles1"/>
         <!-- Online Monitoring Drivers -->
         <!--       <driver name="TrackingMonitoring" />  
         <driver name="TrackingResiduals"/>  
         <driver name="TrackTime"/>  
         <driver name="V0Monitoring"/>    -->       
-        <driver name="SVTMonitoring"/>  
-        <driver name="TrackingMonitoringDQM" />  
-        <driver name="TrackingMonitoringSingles1DQM" />  
-        <driver name="TrackingMonitoringPairs1DQM" />  
-        <driver name="TrackingResidualsPairs1DQM"/>  
-         <driver name="TrackingResidualsSingles1DQM"/>  
-        <driver name="FinalStateDQM"/>  
-        <driver name="FinalStateDQMSingles1"/>
+        <!--        <driver name="SVTMonitoring"/>  
+                <driver name="TrackingMonitoringDQM" />  
+                <driver name="TrackingMonitoringSingles1DQM" />  
+                <driver name="TrackingMonitoringPairs1DQM" />  
+                <driver name="TrackingResidualsPairs1DQM"/>  
+                <driver name="TrackingResidualsSingles1DQM"/>  
+                <driver name="FinalStateDQM"/>  
+        -->        
+        <driver name="FinalStateDQMSingles1"/><!--
         <driver name="FinalStateDQMPairs1"/>
         <driver name="V0DQM"/>  
         <driver name="V0DQMSingles1"/>
         <driver name="V0DQMPairs1"/>
-        <driver name="TridentMonitoringPairs1"/>
+        <driver name="TridentMonitoringPairs1"/>-->
         <!--        <driver name="PositronDebug"/>-->
         <driver name="AidaSaveDriver"/>     
         <driver name="LCIOWriter"/>     
@@ -65,19 +81,32 @@
             <tolerance>1.0</tolerance>
             <saveAxialHits>false</saveAxialHits>
         </driver>-->
+        
+        <driver name="SplitHitsOnTrack" type="org.hps.users.mgraham.SplitHitsOnTracks">             
+        </driver>
         <driver name="TrackerL1to3ReconDriver" type="org.hps.recon.tracking.TrackerReconDriver">
             <debug>false</debug>
-            <includeMS>false</includeMS>
-            <useHPSMaterialManager>false</useHPSMaterialManager>
+<!--            <includeMS>false</includeMS>
+            <useHPSMaterialManager>false</useHPSMaterialManager>-->
+            <inputHitCollectionName>OnTrackHits</inputHitCollectionName>
             <trackCollectionName>L1to3Tracks</trackCollectionName>
             <strategyResource>/org/hps/recon/tracking/strategies/HPS-Full-L1-3.xml</strategyResource>
         </driver>
         <driver name="TrackerL4to6ReconDriver" type="org.hps.recon.tracking.TrackerReconDriver">
             <debug>false</debug>
-            <includeMS>false</includeMS>
-            <useHPSMaterialManager>false</useHPSMaterialManager>
+<!--            <includeMS>false</includeMS>
+            <useHPSMaterialManager>false</useHPSMaterialManager>-->
             <trackCollectionName>L4to6Tracks</trackCollectionName>
+            <inputHitCollectionName>OnTrackHits</inputHitCollectionName>
             <strategyResource>/org/hps/recon/tracking/strategies/HPS-Full-L4-6.xml</strategyResource>
+        </driver>
+         <driver name="TrackerL134ReconDriver" type="org.hps.recon.tracking.TrackerReconDriver">
+            <debug>false</debug>
+<!--            <includeMS>false</includeMS>
+            <useHPSMaterialManager>false</useHPSMaterialManager>-->
+            <trackCollectionName>L134Tracks</trackCollectionName>
+            <inputHitCollectionName>OnTrackHits</inputHitCollectionName>
+            <strategyResource>/org/hps/recon/tracking/strategies/HPS-Full-L134.xml</strategyResource>
         </driver>
         <!--        <driver name="FullTrackerReconDriver" type="org.hps.recon.tracking.TrackerReconDriver">
             <debug>false</debug>
@@ -98,6 +127,47 @@
                <logLevel>ALL</logLevel>
         </driver>     -->
         <driver name="ReconParticle" type="org.hps.recon.particle.HpsReconParticleDriver">
+            <debug>false</debug>
+            <dxCut>50</dxCut>
+            <dyCut>50</dyCut>
+        </driver>  
+        
+        <driver name="ReconParticleL1to3" type="org.hps.recon.particle.HpsReconParticleDriver">
+            <trackCollectionName>L1to3Tracks</trackCollectionName>
+            <targetConV0VerticesColName>TargetConstrainedV0CandidatesL1to3</targetConV0VerticesColName>
+            <finalStateParticlesColName>FinalStateParticlesL1to3</finalStateParticlesColName>
+            <unconstrainedV0CandidatesColName>UnconstrainedV0CandidatesL1to3</unconstrainedV0CandidatesColName>
+            <beamConV0CandidatesColName>BeamspotConstrainedV0CandidatesL1to3</beamConV0CandidatesColName>
+            <unconstrainedV0VerticesColName>UnconstrainedV0VerticesL1to3</unconstrainedV0VerticesColName>
+            <beamConV0VerticesColName>BeamspotConstrainedV0VerticesL1to3</beamConV0VerticesColName>   
+            <targetConV0VerticesColName>TargetConstrainedV0VerticesL1to3</targetConV0VerticesColName>     
+            <debug>false</debug>
+            <dxCut>50</dxCut>
+            <dyCut>50</dyCut>
+        </driver>  
+        <driver name="ReconParticleL4to6" type="org.hps.recon.particle.HpsReconParticleDriver">
+            <trackCollectionName>L4to6Tracks</trackCollectionName>          
+            <targetConV0VerticesColName>TargetConstrainedV0CandidatesL4to6</targetConV0VerticesColName>
+            <finalStateParticlesColName>FinalStateParticlesL4to6</finalStateParticlesColName>
+            <unconstrainedV0CandidatesColName>UnconstrainedV0CandidatesL4to6</unconstrainedV0CandidatesColName>
+            <beamConV0CandidatesColName>BeamspotConstrainedV0CandidatesL4to6</beamConV0CandidatesColName>
+            <unconstrainedV0VerticesColName>UnconstrainedV0VerticesL4to6</unconstrainedV0VerticesColName>
+            <beamConV0VerticesColName>BeamspotConstrainedV0VerticesL4to6</beamConV0VerticesColName>   
+            <targetConV0VerticesColName>TargetConstrainedV0VerticesL4to6</targetConV0VerticesColName>     
+            <debug>false</debug>
+            <dxCut>50</dxCut>
+            <dyCut>50</dyCut>
+        </driver>  
+        
+          <driver name="ReconParticleL134" type="org.hps.recon.particle.HpsReconParticleDriver">
+            <trackCollectionName>L134Tracks</trackCollectionName>          
+            <targetConV0VerticesColName>TargetConstrainedV0CandidatesL134</targetConV0VerticesColName>
+            <finalStateParticlesColName>FinalStateParticlesL134</finalStateParticlesColName>
+            <unconstrainedV0CandidatesColName>UnconstrainedV0CandidatesL134</unconstrainedV0CandidatesColName>
+            <beamConV0CandidatesColName>BeamspotConstrainedV0CandidatesL134</beamConV0CandidatesColName>
+            <unconstrainedV0VerticesColName>UnconstrainedV0VerticesL134</unconstrainedV0VerticesColName>
+            <beamConV0VerticesColName>BeamspotConstrainedV0VerticesL134</beamConV0VerticesColName>   
+            <targetConV0VerticesColName>TargetConstrainedV0VerticesL134</targetConV0VerticesColName>     
             <debug>false</debug>
             <dxCut>50</dxCut>
             <dyCut>50</dyCut>
@@ -116,25 +186,25 @@
             <debug>false</debug>
         </driver>
         <driver name="TrackerHitDriver" type="org.hps.recon.tracking.DataTrackerHitDriver">
-<!--            <neighborDeltaT>8.0</neighborDeltaT>-->
-             <neighborDeltaT>24.0</neighborDeltaT>
+            <neighborDeltaT>8.0</neighborDeltaT>
+<!--            <neighborDeltaT>24.0</neighborDeltaT>-->
         </driver>
         <driver name="HelicalTrackHitDriver" type="org.hps.recon.tracking.HelicalTrackHitDriver">
             <debug>false</debug>
 <!--            <clusterTimeCut>10.0</clusterTimeCut>
             <maxDt>12.0</maxDt>-->
-            <!--            <clusterTimeCut>12.0</clusterTimeCut>
-            <maxDt>16.0</maxDt>-->
-               <clusterTimeCut>24.0</clusterTimeCut>
-            <maxDt>24.0</maxDt>
+            <clusterTimeCut>12.0</clusterTimeCut>
+            <maxDt>16.0</maxDt>
+<!--            <clusterTimeCut>24.0</clusterTimeCut>
+            <maxDt>24.0</maxDt>-->
             <maxSeperation>20.0</maxSeperation>
             <tolerance>1.0</tolerance>
         </driver>
         <driver name="FullTrackerReconDriver" type="org.hps.recon.tracking.TrackerReconDriver">
             <strategyResource>HPS-Full.xml</strategyResource>
             <debug>false</debug>             
-<!--            <rmsTimeCut>8.0</rmsTimeCut>-->
-            <rmsTimeCut>24.0</rmsTimeCut>
+            <rmsTimeCut>8.0</rmsTimeCut>
+<!--            <rmsTimeCut>24.0</rmsTimeCut>-->
         </driver>    
         <driver name="EcalRunningPedestal" type="org.hps.recon.ecal.EcalRunningPedestalDriver">
             <logLevel>CONFIG</logLevel>
@@ -188,6 +258,24 @@
             <printDQMStrings>false</printDQMStrings>
         </driver>
         
+            <driver name="TrackingMonitoringL1to3Singles1DQM" type="org.hps.analysis.dataquality.TrackingMonitoring">         
+                <trackCollectionName>L1to3Tracks</trackCollectionName>
+                <overwriteDB>false</overwriteDB>
+            <printDQMStrings>false</printDQMStrings>
+        </driver>
+           <driver name="TrackingMonitoringL4to6Singles1DQM" type="org.hps.analysis.dataquality.TrackingMonitoring">         
+                <trackCollectionName>L4to6Tracks</trackCollectionName>
+                <overwriteDB>false</overwriteDB>
+            <printDQMStrings>false</printDQMStrings>
+        </driver>
+        
+           <driver name="TrackingMonitoringL134Singles1DQM" type="org.hps.analysis.dataquality.TrackingMonitoring">         
+                <trackCollectionName>L134Tracks</trackCollectionName>
+                <overwriteDB>false</overwriteDB>
+            <printDQMStrings>false</printDQMStrings>
+        </driver>
+        
+        
         <driver name="TrackingMonitoringSingles1DQM" type="org.hps.analysis.dataquality.TrackingMonitoring">         
             <overwriteDB>false</overwriteDB>
             <printDQMStrings>false</printDQMStrings>
@@ -202,12 +290,12 @@
         <driver name="TrackingResidualsPairs1DQM" type="org.hps.analysis.dataquality.TrackingResiduals">           
             <overwriteDB>false</overwriteDB>
             <printDQMStrings>false</printDQMStrings>
-             <triggerType>pairs1</triggerType>
-        </driver>
-         <driver name="TrackingResidualsSingles1DQM" type="org.hps.analysis.dataquality.TrackingResiduals">           
-            <overwriteDB>false</overwriteDB>
-            <printDQMStrings>false</printDQMStrings>
-             <triggerType>singles1</triggerType>
+            <triggerType>pairs1</triggerType>
+        </driver>
+        <driver name="TrackingResidualsSingles1DQM" type="org.hps.analysis.dataquality.TrackingResiduals">           
+            <overwriteDB>false</overwriteDB>
+            <printDQMStrings>false</printDQMStrings>
+            <triggerType>singles1</triggerType>
         </driver>
         <driver name="FinalStateDQM" type="org.hps.analysis.dataquality.FinalStateMonitoring">        
             <overwriteDB>false</overwriteDB>
@@ -215,17 +303,38 @@
             <triggerType>all</triggerType>
         </driver>
         
+        <driver name="FinalStateL1to3DQMSingles1" type="org.hps.analysis.dataquality.FinalStateMonitoring">        
+            <finalStateParticlesColName>FinalStateParticlesL1to3</finalStateParticlesColName>
+            <overwriteDB>false</overwriteDB>
+            <printDQMStrings>false</printDQMStrings>
+            <triggerType>singles1</triggerType>
+        </driver>
+        
+        <driver name="FinalStateL4to6DQMSingles1" type="org.hps.analysis.dataquality.FinalStateMonitoring">        
+            <finalStateParticlesColName>FinalStateParticlesL4to6</finalStateParticlesColName>
+            <overwriteDB>false</overwriteDB>
+            <printDQMStrings>false</printDQMStrings>
+            <triggerType>singles1</triggerType>
+        </driver>
+         <driver name="FinalStateL134DQMSingles1" type="org.hps.analysis.dataquality.FinalStateMonitoring">        
+            <finalStateParticlesColName>FinalStateParticlesL134</finalStateParticlesColName>
+            <overwriteDB>false</overwriteDB>
+            <printDQMStrings>false</printDQMStrings>
+            <triggerType>singles1</triggerType>
+        </driver>
         <driver name="FinalStateDQMPairs1" type="org.hps.analysis.dataquality.FinalStateMonitoring">        
             <overwriteDB>false</overwriteDB>
             <printDQMStrings>false</printDQMStrings>
             <triggerType>pairs1</triggerType>
         </driver>
+        
+        
         <driver name="FinalStateDQMSingles1" type="org.hps.analysis.dataquality.FinalStateMonitoring">        
             <overwriteDB>false</overwriteDB>
             <printDQMStrings>false</printDQMStrings>
             <triggerType>singles1</triggerType>
         </driver>
-        
+ 
         <driver name="V0DQM" type="org.hps.analysis.dataquality.V0Monitoring">        
             <overwriteDB>false</overwriteDB>
             <printDQMStrings>false</printDQMStrings>

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	Thu May 28 13:39:26 2015
@@ -23,6 +23,7 @@
 import org.lcsim.event.MCParticle;
 import org.lcsim.event.RawTrackerHit;
 import org.lcsim.event.Track;
+import org.lcsim.event.TrackState;
 import org.lcsim.event.TrackerHit;
 import org.lcsim.fit.helicaltrack.HelicalTrackFit;
 import org.lcsim.fit.helicaltrack.HelicalTrackHit;
@@ -31,14 +32,17 @@
 import org.lcsim.fit.helicaltrack.HelixUtils;
 import org.lcsim.fit.helicaltrack.HitUtils;
 import org.lcsim.fit.helicaltrack.MultipleScatter;
+import org.lcsim.geometry.subdetector.BarrelEndcapFlag;
 import org.lcsim.recon.tracking.seedtracker.SeedCandidate;
+import org.lcsim.recon.tracking.seedtracker.SeedStrategy;
 import org.lcsim.recon.tracking.seedtracker.SeedTrack;
 import org.lcsim.util.swim.Helix;
 
 /**
- * Assorted helper functions for the track and helix objects in lcsim. Re-use as much of HelixUtils
+ * Assorted helper functions for the track and helix objects in lcsim. Re-use as
+ * much of HelixUtils
  * as possible.
- * 
+ *
  * @author Omar Moreno <[log in to unmask]>
  */
 // TODO: Switch to tracking/LCsim coordinates for the extrapolation output!
@@ -52,8 +56,10 @@
     }
 
     /**
-     * Extrapolate track to a position along the x-axis. Turn the track into a helix object in
+     * Extrapolate track to a position along the x-axis. Turn the track into a
+     * helix object in
      * order to use HelixUtils.
+     *
      * @param track
      * @param x
      * @return
@@ -64,6 +70,7 @@
 
     /**
      * Extrapolate helix to a position along the x-axis. Re-use HelixUtils.
+     *
      * @param track
      * @param x
      * @return
@@ -75,7 +82,6 @@
 
     // ==========================================================================
     // Helper functions for track parameters and commonly used derived variables
-
     public static double getPhi(Track track, Hep3Vector position) {
         double x = Math.sin(getPhi0(track)) - (1 / getR(track)) * (position.x() - getX0(track));
         double y = Math.cos(getPhi0(track)) + (1 / getR(track)) * (position.y() - getY0(track));
@@ -119,10 +125,12 @@
     }
 
     // ==========================================================================
-
-    /**
-     * Calculate the point of interception between the helix and a plane in space. Uses an iterative procedure.
-     * This function makes assumptions on the sign and convecntion of the B-field. Be careful.
+    /**
+     * Calculate the point of interception between the helix and a plane in
+     * space. Uses an iterative procedure.
+     * This function makes assumptions on the sign and convecntion of the
+     * B-field. Be careful.
+     *
      * @param helfit - helix
      * @param unit_vec_normal_to_plane - unit vector normal to the plane
      * @param point_on_plane - point on the plane
@@ -144,8 +152,10 @@
     }
 
     /**
-     * Calculate the point of interception between the helix and a plane in space. Uses an
+     * Calculate the point of interception between the helix and a plane in
+     * space. Uses an
      * iterative procedure.
+     *
      * @param helfit - helix
      * @param strip - strip cluster that will define the plane
      * @param bfield - magnetic field value
@@ -174,11 +184,11 @@
         // y_int = k*x_int + m
         // R^2 = (y_int-y_c)^2 + (x_int-x_c)^2
         // solve for x_int
-
     }
 
     /**
      * Get position of a track extrapolated to the HARP in the HPS test run 2012
+     *
      * @param track
      * @return position at HARP
      */
@@ -187,7 +197,9 @@
     }
 
     /**
-     * Get position of a track extrapolated to the ECAL face in the HPS test run 2012
+     * Get position of a track extrapolated to the ECAL face in the HPS test run
+     * 2012
+     *
      * @param track
      * @return position at ECAL
      */
@@ -197,8 +209,10 @@
 
     /**
      * Extrapolate track to given position.
+     *
      * @param helix - to be extrapolated
-     * @param track - position along the x-axis of the helix in lcsim coordiantes
+     * @param track - position along the x-axis of the helix in lcsim
+     * coordiantes
      * @return
      */
     public static Hep3Vector extrapolateTrack(Track track, double z) {
@@ -234,6 +248,7 @@
 
     /**
      * Extrapolate helix to given position
+     *
      * @param helix - to be extrapolated
      * @param z - position along the x-axis of the helix in lcsim coordiantes
      * @return
@@ -254,7 +269,8 @@
      * @param helix input helix object
      * @param origin of the plane to intercept
      * @param normal of the plane to intercept
-     * @param eps criteria on the distance to the plane before stopping iteration
+     * @param eps criteria on the distance to the plane before stopping
+     * iteration
      * @return position in space at the intercept of the plane
      */
     public static Hep3Vector getHelixPlanePositionIter(HelicalTrackFit helix, Hep3Vector origin, Hep3Vector normal, double eps) {
@@ -314,79 +330,67 @@
         // System.out.printf("pos %s xc %f phi_at_x %f dphi_at_x %f s_at_x %f\n",
         // pos.toString(),xc,phi_at_x,dphi_at_x,s_at_x);
         Hep3Vector posXCheck = TrackUtils.extrapolateHelixToXPlane(helix, x);
-        if (VecOp.sub(pos, posXCheck).magnitude() > 0.0000001) {
+        if (VecOp.sub(pos, posXCheck).magnitude() > 0.0000001)
             throw new RuntimeException(String.format("ERROR the helix propagation equations do not agree? (%f,%f,%f) vs (%f,%f,%f) in HelixUtils", pos.x(), pos.y(), pos.z(), posXCheck.x(), posXCheck.y(), posXCheck.z()));
-        }
         return pos;
     }
 
     /**
-        *
-        */
+     *
+     */
     public static double findTriangleArea(double x0, double y0, double x1, double y1, double x2, double y2) {
         return .5 * (x1 * y2 - y1 * x2 - x0 * y2 + y0 * x2 + x0 * y1 - y0 * x1);
     }
 
     /**
-        *
-        */
+     *
+     */
     public static boolean sensorContainsTrack(Hep3Vector trackPosition, SiSensor sensor) {
         boolean debug = false;
         ITransform3D localToGlobal = sensor.getGeometry().getLocalToGlobal();
 
         Box sensorSolid = (Box) sensor.getGeometry().getLogicalVolume().getSolid();
         Polygon3D sensorFace = sensorSolid.getFacesNormalTo(new BasicHep3Vector(0, 0, 1)).get(0);
-        if (debug) {
+        if (debug)
             System.out.println("sensorContainsTrack:  Track Position: " + trackPosition.toString());
-        }
 
         List<Point3D> vertices = new ArrayList<Point3D>();
-        for (int index = 0; index < 4; index++) {
+        for (int index = 0; index < 4; index++)
             vertices.add(new Point3D());
-        }
-        for (Point3D vertex : sensorFace.getVertices()) {
+        for (Point3D vertex : sensorFace.getVertices())
             if (vertex.y() < 0 && vertex.x() > 0) {
                 localToGlobal.transform(vertex);
                 // vertices.set(0, new Point3D(vertex.y() + sensorPos.x(), vertex.x() +
                 // sensorPos.y(), vertex.z() + sensorPos.z()));
                 vertices.set(0, new Point3D(vertex.x(), vertex.y(), vertex.z()));
-                if (debug) {
-                    System.out.println("sensorContainsTrack:  Vertex 1 Position: " + vertices.get(0).toString());
-                    // System.out.println("sensorContainsTrack:  Transformed Vertex 1 Position: " +
-                    // localToGlobal.transformed(vertex).toString());
-                }
+                if (debug)
+                    System.out.println("sensorContainsTrack:  Vertex 1 Position: " + vertices.get(0).toString()); // System.out.println("sensorContainsTrack:  Transformed Vertex 1 Position: " +
+                // localToGlobal.transformed(vertex).toString());
             } else if (vertex.y() > 0 && vertex.x() > 0) {
                 localToGlobal.transform(vertex);
                 // vertices.set(1, new Point3D(vertex.y() + sensorPos.x(), vertex.x() +
                 // sensorPos.y(), vertex.z() + sensorPos.z()));
                 vertices.set(1, new Point3D(vertex.x(), vertex.y(), vertex.z()));
-                if (debug) {
-                    System.out.println("sensorContainsTrack:  Vertex 2 Position: " + vertices.get(1).toString());
-                    // System.out.println("sensorContainsTrack:  Transformed Vertex 2 Position: " +
-                    // localToGlobal.transformed(vertex).toString());
-                }
+                if (debug)
+                    System.out.println("sensorContainsTrack:  Vertex 2 Position: " + vertices.get(1).toString()); // System.out.println("sensorContainsTrack:  Transformed Vertex 2 Position: " +
+                // localToGlobal.transformed(vertex).toString());
             } else if (vertex.y() > 0 && vertex.x() < 0) {
                 localToGlobal.transform(vertex);
                 // vertices.set(2, new Point3D(vertex.y() + sensorPos.x(), vertex.x() +
                 // sensorPos.y(), vertex.z() + sensorPos.z()));
                 vertices.set(2, new Point3D(vertex.x(), vertex.y(), vertex.z()));
-                if (debug) {
-                    System.out.println("sensorContainsTrack:  Vertex 3 Position: " + vertices.get(2).toString());
-                    // System.out.println("sensorContainsTrack:  Transformed Vertex 3 Position: " +
-                    // localToGlobal.transformed(vertex).toString());
-                }
+                if (debug)
+                    System.out.println("sensorContainsTrack:  Vertex 3 Position: " + vertices.get(2).toString()); // System.out.println("sensorContainsTrack:  Transformed Vertex 3 Position: " +
+                // localToGlobal.transformed(vertex).toString());
             } else if (vertex.y() < 0 && vertex.x() < 0) {
                 localToGlobal.transform(vertex);
                 // vertices.set(3, new Point3D(vertex.y() + sensorPos.x(), vertex.x() +
                 // sensorPos.y(), vertex.z() + sensorPos.z()));
                 vertices.set(3, new Point3D(vertex.x(), vertex.y(), vertex.z()));
-                if (debug) {
-                    System.out.println("sensorContainsTrack:  Vertex 4 Position: " + vertices.get(3).toString());
-                    // System.out.println("sensorContainsTrack:  Transformed Vertex 4 Position: " +
-                    // localToGlobal.transformed(vertex).toString());
-                }
+                if (debug)
+                    System.out.println("sensorContainsTrack:  Vertex 4 Position: " + vertices.get(3).toString()); // System.out.println("sensorContainsTrack:  Transformed Vertex 4 Position: " +
+                // localToGlobal.transformed(vertex).toString());
             }
-        }
 
         double area1 = TrackUtils.findTriangleArea(vertices.get(0).x(), vertices.get(0).y(), vertices.get(1).x(), vertices.get(1).y(), trackPosition.y(), trackPosition.z());
         double area2 = TrackUtils.findTriangleArea(vertices.get(1).x(), vertices.get(1).y(), vertices.get(2).x(), vertices.get(2).y(), trackPosition.y(), trackPosition.z());
@@ -414,7 +418,6 @@
         }
 
         // Calculate the residuals that are being used in the track fit
-
         // Start with the bendplane y
         double drphi_res = hth.drphi();
         double wrphi = Math.sqrt(drphi_res * drphi_res + msdrphi * msdrphi);
@@ -504,10 +507,9 @@
         // Find interception with plane that the strips belongs to
         Hep3Vector trkpos = TrackUtils.getHelixPlaneIntercept(_trk, strip, Math.abs(bFieldInZ));
 
-        if (debug) {
+        if (debug)
             System.out.printf("calculateLocalTrackHitResiduals: strip u %s origin %s \n", u.toString(),corigin.toString());
             System.out.printf("calculateLocalTrackHitResiduals: found interception point with sensor at %s \n", trkpos.toString());
-        }
 
         if (Double.isNaN(trkpos.x()) || Double.isNaN(trkpos.y()) || Double.isNaN(trkpos.z())) {
             System.out.printf("calculateLocalTrackHitResiduals: failed to get interception point (%s) \n", trkpos.toString());
@@ -561,17 +563,16 @@
     }
 
     public static int[] getHitsInTopBottom(Track track) {
-        int n[] = { 0, 0 };
+        int n[] = {0, 0};
         List<TrackerHit> hitsOnTrack = track.getTrackerHits();
         for (TrackerHit hit : hitsOnTrack) {
             HelicalTrackHit hth = (HelicalTrackHit) hit;
             //===> if (SvtUtils.getInstance().isTopLayer((SiSensor) ((RawTrackerHit) hth.getRawHits().get(0)).getDetectorElement())) {
             HpsSiSensor sensor = ((HpsSiSensor) ((RawTrackerHit) hth.getRawHits().get(0)).getDetectorElement());
-            if(sensor.isTopLayer()){
+            if (sensor.isTopLayer())
                 n[0] = n[0] + 1;
-            } else {
+            else
                 n[1] = n[1] + 1;
-            }
         }
         return n;
     }
@@ -586,13 +587,12 @@
 
     public static int isTopOrBottomTrack(Track track, int minhits) {
         int nhits[] = getHitsInTopBottom(track);
-        if (nhits[0] >= minhits && nhits[1] == 0) {
+        if (nhits[0] >= minhits && nhits[1] == 0)
             return 1;
-        } else if (nhits[1] >= minhits && nhits[0] == 0) {
+        else if (nhits[1] >= minhits && nhits[0] == 0)
             return 0;
-        } else {
+        else
             return -1;
-        }
     }
 
     public static boolean hasTopBotHit(Track track) {
@@ -609,10 +609,9 @@
             List<TrackerHit> hitsOnTrack = track.getTrackerHits();
             for (TrackerHit loop_hit : hitsOnTrack) {
                 HelicalTrackHit loop_hth = (HelicalTrackHit) loop_hit;
-                if (hth.equals(loop_hth)) {
+                if (hth.equals(loop_hth))
                     // System.out.printf("share hit at layer %d at %s (%s) with track w/ chi2=%f\n",hth.Layer(),hth.getCorrectedPosition().toString(),loop_hth.getCorrectedPosition().toString(),track.getChi2());
                     return true;
-                }
             }
         }
         return false;
@@ -624,20 +623,17 @@
         // System.out.printf("look for another track with chi2=%f and px=%f \n",track.getChi2(),track.getTrackStates().get(0).getMomentum()[0]);
         for (Track t : tracklist) {
             // System.out.printf("add track with chi2=%f and px=%f ?\n",t.getChi2(),t.getTrackStates().get(0).getMomentum()[0]);
-            if (t.equals(track)) {
+            if (t.equals(track))
                 // System.out.printf("NOPE\n");
                 continue;
-            }
             // System.out.printf("YEPP\n");
             tracks.add(t);
         }
         List<TrackerHit> hitsOnTrack = track.getTrackerHits();
         int n_shared = 0;
-        for (TrackerHit hit : hitsOnTrack) {
-            if (isSharedHit(hit, tracks)) {
+        for (TrackerHit hit : hitsOnTrack)
+            if (isSharedHit(hit, tracks))
                 ++n_shared;
-            }
-        }
         return n_shared;
     }
 
@@ -655,8 +651,8 @@
     }
 
     public static int passTrackSelections(Track track, List<Track> tracklist, EventQuality.Quality trk_quality) {
-        int cuts[] = { 0 };
-        if(trk_quality.compareTo(Quality.NONE) != 0) {
+        int cuts[] = {0};
+        if (trk_quality.compareTo(Quality.NONE) != 0) {
             if (track.getTrackStates().get(0).getMomentum()[0] < EventQuality.instance().getCutValue(EventQuality.Cut.PZ, trk_quality))
                 cut(cuts, EventQuality.Cut.PZ);
             if (track.getChi2() >= EventQuality.instance().getCutValue(EventQuality.Cut.CHI2, trk_quality))
@@ -680,24 +676,24 @@
     }
 
     /**
-     * Transform MCParticle into a Helix object. Note that it produces the helix parameters at
+     * Transform MCParticle into a Helix object. Note that it produces the helix
+     * parameters at
      * nominal x=0 and assumes that there is no field at x<0
-     * 
+     *
      * @param mcp MC particle to be transformed
      * @return helix object based on the MC particle
      */
     public static HelicalTrackFit getHTF(MCParticle mcp, double Bz) {
         boolean debug = true;
-        if(debug) {
+        if (debug) {
             System.out.printf("getHTF\n");
-            System.out.printf("mcp org %s mc p %s\n",mcp.getOrigin().toString(),mcp.getMomentum().toString());
+            System.out.printf("mcp org %s mc p %s\n", mcp.getOrigin().toString(), mcp.getMomentum().toString());
         }
         Hep3Vector org = CoordinateTransformations.transformVectorToTracking(mcp.getOrigin());
         Hep3Vector p = CoordinateTransformations.transformVectorToTracking(mcp.getMomentum());
 
-        if(debug) {
-            System.out.printf("mcp org %s mc p %s (trans)\n",org.toString(),p.toString());
-        }
+        if (debug)
+            System.out.printf("mcp org %s mc p %s (trans)\n", org.toString(), p.toString());
 
         // Move to x=0 if needed
         double targetX = BeamlineConstants.DIPOLE_EDGELOW_TESTRUN;
@@ -715,9 +711,8 @@
             // old.toString(),p.toString(),org.toString());
         }
 
-        if(debug) {
-            System.out.printf("mcp org %s mc p %s (trans2)\n",org.toString(),p.toString());
-        }
+        if (debug)
+            System.out.printf("mcp org %s mc p %s (trans2)\n", org.toString(), p.toString());
 
         HelixParamCalculator helixParamCalculator = new HelixParamCalculator(p, org, -1 * ((int) mcp.getCharge()), Bz);
         double par[] = new double[5];
@@ -727,17 +722,16 @@
         par[HelicalTrackFit.curvatureIndex] = 1.0 / helixParamCalculator.getRadius();
         par[HelicalTrackFit.z0Index] = helixParamCalculator.getZ0();
         HelicalTrackFit htf = getHTF(par);
-         System.out.printf("d0 %f z0 %f R %f phi %f lambda %s\n",
-         htf.dca(),htf.z0(),htf.R(),htf.phi0(),htf.slope() );
+        System.out.printf("d0 %f z0 %f R %f phi %f lambda %s\n",
+                htf.dca(), htf.z0(), htf.R(), htf.phi0(), htf.slope());
         return htf;
     }
 
     public static HelicalTrackFit getHTF(Track track) {
-        if (track.getClass().isInstance(SeedTrack.class)) {
+        if (track.getClass().isInstance(SeedTrack.class))
             return ((SeedTrack) track).getSeedCandidate().getHelix();
-        } else {
+        else
             return getHTF(track.getTrackStates().get(0).getParameters());
-        }
     }
 
     public static HelicalTrackFit getHTF(double par[]) {
@@ -757,9 +751,8 @@
         if (useFringe) {
             // broken because you need ot provide the Field Map to get this...
 //            pos1 = hpstrk1.getPositionAtZMap(100.0, zVal, 5.0)[0];            
-        } else {
+        } else
             pos1 = TrackUtils.extrapolateTrack(trk1, zVal);
-        }
         // System.out.printf("%s: Position1 at edge of fringe %s\n",this.getClass().getSimpleName(),pos1.toString());
         Helix traj = (Helix) hpstrk1.getTrajectory();
         if (traj == null) {
@@ -771,59 +764,99 @@
         // System.out.printf("%s: straight line track: x0=%f,y0=%f,z0=%f dz/dx=%f dydx=%f targetY=%f targetZ=%f \n",this.getClass().getSimpleName(),slt1.x0(),slt1.y0(),slt1.z0(),slt1.dzdx(),slt1.dydx(),slt1.TargetYZ()[0],slt1.TargetYZ()[1]);
         return slt1;
     }
-    
-    
-    
+
     public static MCParticle getMatchedTruthParticle(Track track) {
         boolean debug = false;
-        
-        Map<MCParticle,Integer> particlesOnTrack = new HashMap<MCParticle,Integer>();
-        
-        if(debug) System.out.printf("getMatchedTruthParticle: getmatched mc particle from %d tracker hits on the track \n",track.getTrackerHits().size());
-        
-        
-        for(TrackerHit hit : track.getTrackerHits()) {
-            List<MCParticle> mcps = ((HelicalTrackHit)hit).getMCParticles();
-            if(mcps==null) {
-                System.out.printf("getMatchedTruthParticle: warning, this hit (layer %d pos=%s) has no mc particles.\n",((HelicalTrackHit)hit).Layer(),((HelicalTrackHit)hit).getCorrectedPosition().toString());
-            } 
+
+        Map<MCParticle, Integer> particlesOnTrack = new HashMap<MCParticle, Integer>();
+
+        if (debug)
+            System.out.printf("getMatchedTruthParticle: getmatched mc particle from %d tracker hits on the track \n", track.getTrackerHits().size());
+
+        for (TrackerHit hit : track.getTrackerHits()) {
+            List<MCParticle> mcps = ((HelicalTrackHit) hit).getMCParticles();
+            if (mcps == null)
+                System.out.printf("getMatchedTruthParticle: warning, this hit (layer %d pos=%s) has no mc particles.\n", ((HelicalTrackHit) hit).Layer(), ((HelicalTrackHit) hit).getCorrectedPosition().toString());
             else {
-                if( debug ) System.out.printf("getMatchedTruthParticle: this hit (layer %d pos=%s) has %d mc particles.\n",((HelicalTrackHit)hit).Layer(),((HelicalTrackHit)hit).getCorrectedPosition().toString(),mcps.size());
-                for(MCParticle mcp : mcps) {
-                    if( !particlesOnTrack.containsKey(mcp) ) {
+                if (debug)
+                    System.out.printf("getMatchedTruthParticle: this hit (layer %d pos=%s) has %d mc particles.\n", ((HelicalTrackHit) hit).Layer(), ((HelicalTrackHit) hit).getCorrectedPosition().toString(), mcps.size());
+                for (MCParticle mcp : mcps) {
+                    if (!particlesOnTrack.containsKey(mcp))
                         particlesOnTrack.put(mcp, 0);
-                    }
                     int c = particlesOnTrack.get(mcp);
-                    particlesOnTrack.put(mcp, c+1);
+                    particlesOnTrack.put(mcp, c + 1);
                 }
             }
         }
-        if(debug) {
-            System.out.printf("Track p=[ %f, %f, %f] \n",track.getTrackStates().get(0).getMomentum()[0],track.getTrackStates().get(0).getMomentum()[1],track.getTrackStates().get(0).getMomentum()[1]);
-            System.out.printf("Found %d particles\n",particlesOnTrack.size());
-            for(Map.Entry<MCParticle, Integer> entry : particlesOnTrack.entrySet()) {
-                System.out.printf("%d hits assigned to %d p=%s \n",entry.getValue(),entry.getKey().getPDGID(),entry.getKey().getMomentum().toString());
-            }
-        }
-        Map.Entry<MCParticle,Integer> maxEntry = null;
-        for(Map.Entry<MCParticle,Integer> entry : particlesOnTrack.entrySet()) {
-            if ( maxEntry == null || entry.getValue().compareTo(maxEntry.getValue()) > 0 ) maxEntry = entry;
-            //if ( maxEntry != null ) {
-            //    if(entry.getValue().compareTo(maxEntry.getValue()) < 0) continue;
-            //}
-            //maxEntry = entry;
-        }
-        if(debug) {
-            if (maxEntry != null ) {
+        if (debug) {
+            System.out.printf("Track p=[ %f, %f, %f] \n", track.getTrackStates().get(0).getMomentum()[0], track.getTrackStates().get(0).getMomentum()[1], track.getTrackStates().get(0).getMomentum()[1]);
+            System.out.printf("Found %d particles\n", particlesOnTrack.size());
+            for (Map.Entry<MCParticle, Integer> entry : particlesOnTrack.entrySet())
+                System.out.printf("%d hits assigned to %d p=%s \n", entry.getValue(), entry.getKey().getPDGID(), entry.getKey().getMomentum().toString());
+        }
+        Map.Entry<MCParticle, Integer> maxEntry = null;
+        for (Map.Entry<MCParticle, Integer> entry : particlesOnTrack.entrySet())
+            if (maxEntry == null || entry.getValue().compareTo(maxEntry.getValue()) > 0)
+                maxEntry = entry; //if ( maxEntry != null ) {
+        //    if(entry.getValue().compareTo(maxEntry.getValue()) < 0) continue;
+        //}
+        //maxEntry = entry;
+        if (debug)
+            if (maxEntry != null)
                 System.out.printf("Matched particle with pdgId=%d and mom %s to track with charge %d and momentum [%f %f %f]\n",
-                        maxEntry.getKey().getPDGID(),maxEntry.getKey().getMomentum().toString(),
-                        track.getCharge(),track.getTrackStates().get(0).getMomentum()[0],track.getTrackStates().get(0).getMomentum()[1],track.getTrackStates().get(0).getMomentum()[2]);
-            } else {
+                        maxEntry.getKey().getPDGID(), maxEntry.getKey().getMomentum().toString(),
+                        track.getCharge(), track.getTrackStates().get(0).getMomentum()[0], track.getTrackStates().get(0).getMomentum()[1], track.getTrackStates().get(0).getMomentum()[2]);
+            else
                 System.out.printf("No truth particle found on this track\n");
-            }
-        }
         return maxEntry == null ? null : maxEntry.getKey();
     }
-    
+
+    /*       
+     try to make a seed track from a base track
+     ...some things are irretrivable (tracking strategy)..
+     and some things I just don't care much about to dig out (det name)
+     */
+    public static SeedTrack makeSeedTrackFromBaseTrack(Track track) {
+
+        TrackState trkState = track.getTrackStates().get(0);
+        //  first make the HelicalTrackFit Object
+        double[] covArray = trkState.getCovMatrix();
+        SymmetricMatrix cov = new SymmetricMatrix(5, covArray, true);
+        double[] chisq = {track.getChi2(), 0};
+        int[] ndf = {track.getNDF(), 0};
+        Map<HelicalTrackHit, Double> smap = new HashMap<>();  // just leave these empty
+        Map<HelicalTrackHit, MultipleScatter> msmap = new HashMap<>();// just leave these empty
+        double[] pars = {trkState.getD0(), trkState.getPhi(), trkState.getOmega(), trkState.getZ0(), trkState.getTanLambda()};
+        HelicalTrackFit htf = new HelicalTrackFit(pars, cov, chisq, ndf, smap, msmap);
+        //  now get the hits and make them helicaltrackhits
+        List<TrackerHit> rth = track.getTrackerHits();
+        List<HelicalTrackHit> hth = new ArrayList<>();
+        for (TrackerHit hit : rth)
+            hth.add(makeHelicalTrackHitFromTrackerHit(hit));
+//        SeedCandidate(List<HelicalTrackHit> , SeedStrategy strategy, HelicalTrackFit helix, double bfield) ;
+        SeedCandidate scand = new SeedCandidate(hth, null, htf, 0.24);
+        SeedTrack st = new SeedTrack();
+        st.setSeedCandidate(scand);
+        return st;
+    }
+
+    /*
+        cast TrackerHit as HTH...this is pretty dumb; just a rearrangment of information
+        in TrackerHit.  The important information that's in HTH but not 
+        in Tracker hit is the HelicalTrackCrosses (and from there the individual strip clusters)
+        is lost; some work to get them back.  
+     */
+    public static HelicalTrackHit makeHelicalTrackHitFromTrackerHit(TrackerHit hit) {
+        Hep3Vector pos = new BasicHep3Vector(hit.getPosition());
+        SymmetricMatrix hitcov = new SymmetricMatrix(3, hit.getCovMatrix(), true);
+        double dedx = hit.getdEdx();
+        double time = hit.getTime();
+        int type = hit.getType();
+        List rhits = hit.getRawHits();
+        String detname = "Foobar";
+        int layer = 666;
+        BarrelEndcapFlag beflag = BarrelEndcapFlag.BARREL;
+        return new HelicalTrackHit(pos, hitcov, dedx, time, type, rhits, detname, layer, beflag);
+    }
 
 }

Added: java/trunk/users/src/main/java/org/hps/users/mgraham/ProfileDriver.java
 =============================================================================
--- java/trunk/users/src/main/java/org/hps/users/mgraham/ProfileDriver.java	(added)
+++ java/trunk/users/src/main/java/org/hps/users/mgraham/ProfileDriver.java	Thu May 28 13:39:26 2015
@@ -0,0 +1,15 @@
+package org.hps.users.mgraham;
+
+import java.io.IOException;
+
+/**
+ *
+ * @author mgraham
+ */
+public class ProfileDriver {        
+     public static void main(String[] args) throws IOException {
+         
+         
+         
+     }
+}

Added: java/trunk/users/src/main/java/org/hps/users/mgraham/SplitHitsOnTracks.java
 =============================================================================
--- java/trunk/users/src/main/java/org/hps/users/mgraham/SplitHitsOnTracks.java	(added)
+++ java/trunk/users/src/main/java/org/hps/users/mgraham/SplitHitsOnTracks.java	Thu May 28 13:39:26 2015
@@ -0,0 +1,66 @@
+package org.hps.users.mgraham;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.lcsim.event.EventHeader;
+import org.lcsim.event.Track;
+import org.lcsim.event.TrackerHit;
+import org.lcsim.fit.helicaltrack.HelicalTrackHit;
+import org.lcsim.recon.tracking.seedtracker.SeedTrack;
+import org.lcsim.util.Driver;
+
+/**
+ *
+ * @author mgraham
+ * Split the HelicalTrackHit collection into hits that 
+ * are on a track and hits that are not
+ *
+ */
+public class SplitHitsOnTracks extends Driver {
+
+    private String trackCollectionName = "MatchedTracks";
+    private String inputHitCollectionName = "RotatedHelicalTrackHits";
+    private String onTrackCollectionName = "OnTrackHits";
+    private String offTrackCollectionName = "OffTrackHits";
+
+    public void setTrackCollectionName(String name) {
+        this.trackCollectionName = name;
+    }
+
+    public void setInputHitCollectionName(String name) {
+        this.inputHitCollectionName = name;
+    }
+
+    public void setOnTrackHitCollectionName(String name) {
+        this.onTrackCollectionName = name;
+    }
+
+    public void setOffTrackHitCollectionName(String name) {
+        this.offTrackCollectionName = name;
+    }
+
+    @Override
+    public void process(EventHeader event) {
+        if (!event.hasCollection(TrackerHit.class, inputHitCollectionName))
+            return;
+        if (!event.hasCollection(Track.class, trackCollectionName))
+            return;
+        List<Track> tracks = event.get(Track.class, trackCollectionName);
+        List<HelicalTrackHit> onTrack = new ArrayList<HelicalTrackHit>();
+        for (Track trk : tracks) {
+            SeedTrack st = (SeedTrack) trk;
+            List<HelicalTrackHit> theseHits = st.getSeedCandidate().getHits();
+            for (HelicalTrackHit hth : theseHits)
+                if (!onTrack.contains(hth))
+                    onTrack.add(hth);
+        }
+        List<HelicalTrackHit> offTrack = new ArrayList<HelicalTrackHit>();
+        List<HelicalTrackHit> allHits = event.get(HelicalTrackHit.class, inputHitCollectionName);
+        for (HelicalTrackHit hth : allHits)
+            if (!onTrack.contains(hth))
+                offTrack.add(hth);
+
+        event.put(onTrackCollectionName, onTrack, HelicalTrackHit.class, 0);
+        event.put(offTrackCollectionName, offTrack, HelicalTrackHit.class, 0);
+    }
+}