LISTSERV mailing list manager LISTSERV 16.5

Help for HPS-SVN Archives


HPS-SVN Archives

HPS-SVN Archives


HPS-SVN@LISTSERV.SLAC.STANFORD.EDU


View:

Message:

[

First

|

Previous

|

Next

|

Last

]

By Topic:

[

First

|

Previous

|

Next

|

Last

]

By Author:

[

First

|

Previous

|

Next

|

Last

]

Font:

Proportional Font

LISTSERV Archives

LISTSERV Archives

HPS-SVN Home

HPS-SVN Home

HPS-SVN  December 2015

HPS-SVN December 2015

Subject:

r4017 - in /java/trunk: steering-files/src/main/resources/org/hps/steering/recon/EngineeringRun2015STRecon.lcsim users/src/main/java/org/hps/users/phansson/STUtils.java users/src/main/java/org/hps/users/phansson/StraightThroughAnalysisDriver.java

From:

[log in to unmask]

Reply-To:

Notification of commits to the hps svn repository <[log in to unmask]>

Date:

Mon, 7 Dec 2015 19:39:57 -0000

Content-Type:

text/plain

Parts/Attachments:

Parts/Attachments

text/plain (1028 lines)

Author: [log in to unmask]
Date: Mon Dec  7 11:39:52 2015
New Revision: 4017

Log:
Straight through drivers, steering files and utils.

Added:
    java/trunk/steering-files/src/main/resources/org/hps/steering/recon/EngineeringRun2015STRecon.lcsim
Modified:
    java/trunk/users/src/main/java/org/hps/users/phansson/STUtils.java
    java/trunk/users/src/main/java/org/hps/users/phansson/StraightThroughAnalysisDriver.java

Added: java/trunk/steering-files/src/main/resources/org/hps/steering/recon/EngineeringRun2015STRecon.lcsim
 =============================================================================
--- java/trunk/steering-files/src/main/resources/org/hps/steering/recon/EngineeringRun2015STRecon.lcsim	(added)
+++ java/trunk/steering-files/src/main/resources/org/hps/steering/recon/EngineeringRun2015STRecon.lcsim	Mon Dec  7 11:39:52 2015
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<lcsim xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" xs:noNamespaceSchemaLocation="http://www.lcsim.org/schemas/lcsim/1.0/lcsim.xsd">
+    <!-- 
+      @brief Steering file to run simple straight through trackingon the 2015 Engineering Run data. 
+      @author <a href="mailto:[log in to unmask]">Sho Uemura</a>
+    -->
+    <execute>
+        <driver name="EventMarkerDriver"/>
+        <!-- SVT reconstruction drivers -->
+        <driver name="RawTrackerHitSensorSetup"/>
+        <driver name="RawTrackerHitFitterDriver" />
+        <driver name="TrackerHitDriver"/>
+        <driver name="HelicalTrackHitDriver"/>
+        <!--<driver name="SensorOccupancyDriver"/>-->
+        
+        <driver name="StraightThroughDriver"/>
+        <!--<driver name="TrackingReconstructionPlots" />-->
+        <!--<driver name="LCIOWriter"/>-->
+        <!--<driver name="AidaSaveDriver"/>-->
+        <driver name="CleanupDriver"/>
+    </execute>    
+    <drivers>    
+        <driver name="EventMarkerDriver" type="org.lcsim.job.EventMarkerDriver">
+            <eventInterval>100</eventInterval>
+        </driver>        
+        <driver name="RawTrackerHitSensorSetup" type="org.lcsim.recon.tracking.digitization.sisim.config.RawTrackerHitSensorSetup">
+            <readoutCollections>SVTRawTrackerHits</readoutCollections>
+        </driver>
+        <driver name="RawTrackerHitFitterDriver" type="org.hps.recon.tracking.RawTrackerHitFitterDriver">
+            <fitAlgorithm>Pileup</fitAlgorithm>
+            <useTimestamps>false</useTimestamps>
+            <correctTimeOffset>true</correctTimeOffset>
+            <correctT0Shift>true</correctT0Shift>
+            <useTruthTime>false</useTruthTime>
+            <subtractTOF>true</subtractTOF>
+            <subtractTriggerTime>true</subtractTriggerTime>
+            <correctChanT0>true</correctChanT0>
+            <debug>false</debug>
+        </driver>
+        <driver name="TrackerHitDriver" type="org.hps.recon.tracking.DataTrackerHitDriver">
+            <neighborDeltaT>8.0</neighborDeltaT>
+        </driver>
+        <driver name="HelicalTrackHitDriver" type="org.hps.recon.tracking.HelicalTrackHitDriver">
+            <debug>false</debug>
+            <clusterTimeCut>12.0</clusterTimeCut>
+            <maxDt>16.0</maxDt>
+            <clusterAmplitudeCut>400.0</clusterAmplitudeCut>
+        </driver>
+        <driver name="LCIOWriter" type="org.lcsim.util.loop.LCIODriver">
+            <outputFilePath>${outputFile}.slcio</outputFilePath>
+        </driver>
+        <driver name="CleanupDriver" type="org.lcsim.recon.tracking.digitization.sisim.config.ReadoutCleanupDriver"/>
+        <driver name="AidaSaveDriver" type="org.lcsim.job.AidaSaveDriver">
+            <outputFileName>${outputFile}.root</outputFileName>
+        </driver>  
+        <driver name="TrackingReconstructionPlots" type="org.hps.users.phansson.TrackingReconstructionPlots">
+            <showPlots>False</showPlots>
+        </driver>
+        <driver name="SensorOccupancyDriver" type="org.hps.monitoring.drivers.svt.SensorOccupancyPlotsDriver">
+            <enablePositionPlots>True</enablePositionPlots>
+            <eventRefreshRate>100</eventRefreshRate>
+            <enableTriggerFilter>False</enableTriggerFilter>
+        </driver>
+        <driver name="StraightThroughDriver" type="org.hps.users.phansson.StraightThroughAnalysisDriver">
+            <outputFilename>${outputFile}</outputFilename>
+            <writeGbl>true</writeGbl>
+        </driver>
+
+    </drivers>
+</lcsim>

Modified: java/trunk/users/src/main/java/org/hps/users/phansson/STUtils.java
 =============================================================================
--- java/trunk/users/src/main/java/org/hps/users/phansson/STUtils.java	(original)
+++ java/trunk/users/src/main/java/org/hps/users/phansson/STUtils.java	Mon Dec  7 11:39:52 2015
@@ -3,6 +3,7 @@
  */
 package org.hps.users.phansson;
 
+import hep.physics.matrix.BasicMatrix;
 import hep.physics.vec.BasicHep3Matrix;
 import hep.physics.vec.BasicHep3Vector;
 import hep.physics.vec.Hep3Matrix;
@@ -15,6 +16,7 @@
 import java.util.logging.Logger;
 
 import org.apache.commons.math3.stat.regression.SimpleRegression;
+import org.hps.recon.tracking.CoordinateTransformations;
 import org.hps.users.phansson.STUtils.STStereoTrack.VIEW;
 import org.lcsim.detector.ITransform3D;
 import org.lcsim.detector.tracker.silicon.HpsSiSensor;
@@ -36,6 +38,9 @@
 public class STUtils {
     
     public final static Logger logger = Logger.getLogger(STUtils.class.getSimpleName());
+    protected static final double sensorThickness = 0.7e-2*0.5; // radiation length per sensor
+    protected static final double beamEnergy = 1.05;
+        
 
     
     /**
@@ -254,14 +259,24 @@
         public String toString() {
             StringBuffer sb = new StringBuffer("STStereoTrack:\n");
             sb.append(hits.size() + " stereo hits.\n");
+            for(StereoPair pair : hits) {
+                sb.append("Pair: pos " + pair.getPosition() + 
+                        " " + pair.getAxial().getRawHits().get(0).getDetectorElement().getName() + " org " + getOrigin(pair.getAxial()).toString() +
+                        " " + pair.getStereo().getRawHits().get(0).getDetectorElement().getName() + " org " + getOrigin(pair.getStereo()).toString() + "\n");
+            }
+            sb.append("\nPointlists:\n");
             for(int i=0;i<2;++i) {
                 VIEW v = VIEW.values()[i];
                 sb.append("View " + v.name() + ": \n");
                 for(double[] xy : getPointList(v))
                     sb.append(xy[0] + ", " + xy[1] + "\n");
-                if(getFit(v)!=null) sb.append(getFit(v).toString());
+                if(getFit(v)!=null) sb.append(getFit(v).toString() + "\n");
             }
             return sb.toString();
+        }
+
+        public double getMomentum() {
+            return beamEnergy;
         }
 
 
@@ -610,9 +625,29 @@
         return z > 0 ? Math.sqrt( z*z + dy*dy ) : -1*Math.sqrt( z*z + dy*dy );
     }
     
-    
-    
-    
+    public static double getTraversedMaterial(STStereoTrack track, SiTrackerHitStrip1D hit) {
+
+        // calculate the path length through the material
+        if( (track.getDirection().magnitude() - 1) > 0.0001 )
+            throw new RuntimeException("track dir is not normalized? " + track.getDirection().toString() + " mag = " + track.getDirection().magnitude());
+        
+        final double C = sensorThickness/track.getDirection().z();
+        Hep3Vector t = VecOp.mult(C, track.getDirection());
+        double thickness = t.magnitude();
+        logger.finest("\nMaterial " + thickness + " X0 from \nC = " + C + " \nsensor thickness = " + sensorThickness + " \ntDir = " + track.getDirection().toString() + " \nt = " + t.toString());
+        
+        return thickness;        
+    }
+    
+    
+    
+    /**
+     * Prints information for running GBL to a text file.
+     * 
+     * @param printWriter
+     * @param event
+     * @param tracks
+     */
     public static void printGBL(PrintWriter printWriter, EventHeader event, List<STStereoTrack> tracks) {
         printWriter.printf("New Event %d %f", event.getEventNumber(), 0.0);
         printWriter.println();
@@ -623,15 +658,16 @@
             printWriter.printf("New Track %d", iTrack);
             printWriter.println();
             
-            double[] perPars = getPerPars(track);
-            printWriter.printf("Track perPar (x0 y0 dxdz dydz) %.12f %.12f %.12f %.12f", perPars[0],perPars[1],perPars[2],perPars[3]);
+            double[] perPars= getPerPars(track);
+            printWriter.printf("Track perPar (y0 z0 dydx dzdx) %.12f %.12f %.12f %.12f", perPars[0],perPars[1],perPars[2],perPars[3]);
             printWriter.println();
             
+            
             double[] clPars = getCLPars(track);
-            printWriter.printf("Track clPar (xT yT dxTdz dyTdz) %.12f %.12f %.12f %.12f", clPars[0],clPars[1],clPars[2],clPars[3]);
+            printWriter.printf("Track clPar (q/p lambda phi xT yT) %.12f %.12f %.12f %.12f %.12f", clPars[0],clPars[1],clPars[2],clPars[3], clPars[4]);
             printWriter.println();
-            
-            Hep3Matrix clPrj = curvilinearProjectionMatrix(track.getDirection());
+
+            Hep3Matrix clPrj = curvilinearProjectionMatrix(CoordinateTransformations.transformVectorToTracking( track.getDirection() ) );
             StringBuffer sb = new StringBuffer();
             for(int i=0;i!=3;++i) 
                 for(int j=0;j!=3;++j) 
@@ -639,8 +675,9 @@
             printWriter.printf("Track clPrj %s", sb.toString());
             printWriter.println();
             
-            //List<SiTrackerHitStrip1D> stripHits = new ArrayList<SiTrackerHitStrip1D>();
+            //Counter of number strips
             int iStrip = 0;
+
             for(StereoPair pair : track.getHits()) {
                 SiTrackerHitStrip1D strips[] = new SiTrackerHitStrip1D[2];
                 if(pair.getAxial().getPosition()[2] < pair.getStereo().getPosition()[2]) {
@@ -651,10 +688,56 @@
                     strips[0] = pair.getStereo();
                 }
                 for(int i=0; i<strips.length;++i) {
+                    
                     SiTrackerHitStrip1D strip = strips[i];
+                    
                     HpsSiSensor sensor = (HpsSiSensor) ((RawTrackerHit) strip.getRawHits().get(0)).getDetectorElement();
                     printWriter.printf("New Strip id layer %d %d %s", iStrip, sensor.getMillepedeId(), sensor.getName() );
                     printWriter.println();
+                    
+                    Hep3Vector originGlobal = getOrigin(strip);
+                    Hep3Vector origin = CoordinateTransformations.transformVectorToTracking(originGlobal);
+                    printWriter.printf("Strip origin %.12f %.12f %.12f", origin.x(), origin.y(), origin.z() );
+                    printWriter.println();
+
+                    Hep3Vector stereoHitPosition = CoordinateTransformations.transformVectorToTracking( pair.getPosition() );
+                    printWriter.printf("Strip 3D hit pos %.12f %.12f %.12f", stereoHitPosition.x(), stereoHitPosition.y(), stereoHitPosition.z() );
+                    printWriter.println();
+
+                    Hep3Vector trackPositionGlobal = getLinePlaneIntercept(strip, track);
+                    Hep3Vector trackPosition = CoordinateTransformations.transformVectorToTracking(trackPositionGlobal);
+                    printWriter.printf("Strip track pos %.12f %.12f %.12f", trackPosition.x(), trackPosition.y(), trackPosition.z() );
+                    printWriter.println();
+                    
+                    double pathLen = getPathLength(trackPositionGlobal.z(), track);
+                    printWriter.printf("Strip pathLen %.12f", pathLen );
+                    printWriter.println();
+
+                    Hep3Vector u = CoordinateTransformations.transformVectorToTracking( strip.getMeasuredCoordinate());
+                    printWriter.printf("Strip meas dir %.12f %.12f %.12f", u.x(), u.y(), u.z() );
+                    printWriter.println();
+
+                    Hep3Vector v = CoordinateTransformations.transformVectorToTracking( strip.getUnmeasuredCoordinate());
+                    printWriter.printf("Strip non-meas dir %.12f %.12f %.12f", v.x(), v.y(), v.z() );
+                    printWriter.println();
+
+                    Hep3Vector w = VecOp.cross(u, v );
+                    printWriter.printf("Strip normal dir %.12f %.12f %.12f", w.x(), w.y(), w.z() );
+                    printWriter.println();
+
+                    printWriter.printf("Strip u %.12f", strip.getTransformedHit(CoordinateSystem.SENSOR).getPosition()[0]);
+                    printWriter.println();
+
+                    double uRes = getUResidual(strip, track);
+                    double uRes_err = Math.sqrt( strip.getTransformedHit(CoordinateSystem.SENSOR).getCovarianceAsMatrix().diagonal(0) );
+                    printWriter.printf("Strip ures %.12f %.12f", uRes, uRes_err);
+                    printWriter.println();
+                    
+                    double scatAngle = getScatteringAngle(strip, track);
+                    printWriter.printf("Strip scatangle %.12f", scatAngle);
+                    printWriter.println();
+
+                    // update hit counter
                     iStrip++;
                 }
             }
@@ -666,26 +749,240 @@
     
     
     
-    
+
+    /**
+     * Calculate the multiple scattering angle for a given momentum and thickness
+     * @param p
+     * @param radlength
+     * @return
+     */
+    public static double msangle(double p, double radlength) {
+        double angle = (0.0136 / p) * Math.sqrt(radlength) * (1.0 + 0.038 * Math.log(radlength));
+        return angle;
+    }
+
+    /**
+     * Calculate expected multiple Coulomb scattering angle for this track from given sensor.
+     * @param strip
+     * @param track
+     * @return angle
+     */
+    private static double getScatteringAngle(SiTrackerHitStrip1D strip, STStereoTrack track) {
+        final double thickness = getTraversedMaterial(track, strip);
+        final double angle = msangle(track.getMomentum(), thickness);
+        return angle;
+    }
+    
+    
+    
+    /**
+     * Finds point of intercept between a generic straight line and a plane.
+     * 
+     * @param l - vector pointing along the line
+     * @param l0 - point on the line
+     * @param p0 - point on the plane
+     * @param n - normal vector of the plane.
+     * @return point of intercept. 
+     */
+    private static Hep3Vector getLinePlaneIntercept(Hep3Vector l, Hep3Vector l0, Hep3Vector p0, Hep3Vector n) {
+        if( VecOp.dot(l, n) == 0 )
+            throw new RuntimeException("This line and plane are parallel!");
+       final double d = VecOp.dot( VecOp.sub(p0, l0), n) / VecOp.dot(l, n);
+       Hep3Vector p = VecOp.add( VecOp.mult(d, l) , l0);
+       return p;
+        
+    }
+    
+    /**
+     * Finds point of intercept between a {@link STStereoTrack} and a sensor obtained from a {@link SiTrackerHitStrip1D}.
+     * @param strip
+     * @param track
+     * @return point of intercept.
+     */
+    private static Hep3Vector getLinePlaneIntercept(SiTrackerHitStrip1D strip, STStereoTrack track) {
+        // line description
+        Hep3Vector l0 = new BasicHep3Vector(track.getIntercept()[VIEW.XZ.ordinal()], track.getIntercept()[VIEW.YZ.ordinal()], 0);
+        Hep3Vector l = track.getDirection();
+        // plane
+        Hep3Vector p0 = getOrigin(strip);
+        Hep3Vector n = VecOp.cross(strip.getMeasuredCoordinate(), strip.getUnmeasuredCoordinate());
+        // find intercept
+        Hep3Vector trkpos = getLinePlaneIntercept(l, l0, p0, n);
+        logger.finest("\ntrkpos " + trkpos.toString() + "\n l " + l.toString() + "\n l0 " + l0.toString() + "\n p0 " + p0.toString() + "\n n " + n.toString());
+        return trkpos;
+    }
+    
+    
+    /**
+     * Calculate the residual (measured - predicted) for this hit in the measurement frame.
+     * @param strip
+     * @param track
+     * @return
+     */
+    protected static double getUResidual(SiTrackerHitStrip1D strip, STStereoTrack track) {
+        
+        //Predict track position on sensor
+        Hep3Vector trkpos = getLinePlaneIntercept(strip, track);
+        
+        logger.finest("trkpos " + trkpos.toString());
+        logger.finest("origin " + getOrigin(strip).toString());
+        logger.finest("u " + strip.getMeasuredCoordinate().toString() + " v " + strip.getUnmeasuredCoordinate().toString() + " w " + VecOp.cross(strip.getMeasuredCoordinate(), strip.getUnmeasuredCoordinate()).toString());
+        
+        
+        // vector from origin to track position
+        Hep3Vector trkposOrigin = VecOp.sub(trkpos, getOrigin(strip));
+
+        logger.finest("trkposOrigin " + trkposOrigin.toString());
+
+        
+        //trkposOriginLocal = globalToLocal.rotated(trkposOrigin);
+        
+        // Transform from JLab frame to sensor frame (done through the RawTrackerHit)
+        SiTrackerHitStrip1D local = strip.getTransformedHit(CoordinateSystem.SENSOR);
+        ITransform3D globalToLocal = local.getLocalToGlobal().inverse();
+        
+        logger.finest("local pos " + local.getPositionAsVector());
+
+        logger.finest("localToGlobal:\n" + local.getLocalToGlobal().toString());
+        logger.finest("localToGlobal:\n" + local.getLocalToGlobal().inverse().toString());
+        
+        
+        //Hep3Vector trkposOriginLocal = strip.getLocalToGlobal().getRotation().inverse().rotated(trkposOrigin);
+        Hep3Vector trkposOriginLocal = globalToLocal.getRotation().rotated(trkposOrigin);
+        
+        logger.finest("trkposOriginLocal " + trkposOriginLocal.toString());
+        
+        // get the measured position
+        Hep3Vector measpos = VecOp.sub(strip.getPositionAsVector(), getOrigin(strip));
+
+        logger.finest("strip pos " + strip.getPositionAsVector().toString());
+        logger.finest("strip origin " + getOrigin(strip).toString());
+        logger.finest("measpos " + measpos.toString());
+        
+        //Hep3Vector measposLocal = strip.getLocalToGlobal().getRotation().inverse().rotated(measpos);
+        Hep3Vector measposLocal = globalToLocal.rotated(measpos);
+
+        logger.finest("measposLocal " + measposLocal.toString());
+
+        final double ures = measposLocal.x() - trkposOriginLocal.x();
+        
+        logger.finest("res " + VecOp.sub(measposLocal, trkposOriginLocal).toString());
+        
+        logger.finest("\nures " + ures + " \ntrkpos " + trkpos.toString() + " \ntrkposOriginLocal " + trkposOriginLocal.toString() + " \nmeaspos " + measpos.toString() + " \nmeasposLocal " + measposLocal.toString());
+        
+        return ures;
+    }
+
+    /**
+     * Path length to this point along the {@link STStereoTrack}.
+     * @param z
+     * @param track
+     * @return
+     */
+    private static double getPathLength(double z, STStereoTrack track) {
+        final double C = z / track.getDirection().z();
+        final Hep3Vector tNew = VecOp.mult(C, track.getDirection());
+        final double s = tNew.magnitude();
+        logger.finest("\npath length " + s + " to z " + z + " from \nt  " + track.getDirection().toString() + " \ntNew = " + tNew.toString() + " \nC = " + C );
+        return s;
+    }
+
+
+    /**
+     * Get a vector of track parameters for a {@link STStereoTrack} in the tracking frame.
+     * @param track
+     * @return array of intercept YX, intercept ZX, slope YX and slope ZX.
+     */
     public static double[] getPerPars(STStereoTrack track) {
-        double intercept[] = track.getIntercept();
-        double slope[] = track.getSlope();
+       Hep3Vector interceptGlobalFrame = new BasicHep3Vector(track.getIntercept(VIEW.XZ), track.getIntercept(VIEW.YZ), 0);
+       Hep3Vector interceptTrackingFrame = CoordinateTransformations.transformVectorToTracking(interceptGlobalFrame);
+       Hep3Vector slopeGlobalFrame = new BasicHep3Vector(track.getSlope(VIEW.XZ), track.getSlope(VIEW.YZ), 0);
+       Hep3Vector slopeTrackingFrame = CoordinateTransformations.transformVectorToTracking(slopeGlobalFrame);
+       logger.finest("intercept global " + interceptGlobalFrame.toString() + " tracking " +  interceptTrackingFrame.toString());
+       logger.finest("slope global " + slopeGlobalFrame.toString() + " tracking " +  slopeTrackingFrame.toString());
         return new double[]{
-                intercept[VIEW.XZ.ordinal()],
-                intercept[VIEW.YZ.ordinal()],
-                slope[VIEW.XZ.ordinal()],
-                slope[VIEW.YZ.ordinal()]};
-    }
-    
-    
-    /**
-     * Computes projection matrix from the ST variables x0,y0,z0
+                interceptTrackingFrame.y(),
+                interceptTrackingFrame.z(),
+                slopeTrackingFrame.y(),
+                slopeTrackingFrame.z()};
+    }
+    
+    
+    
+    /**
+     * Compute the Jacobian for transporting uncertainties along the track a certain distance.
+     * @param ds - distance along the track
+     * @return Jacobian matrix
+     */
+    private static BasicMatrix getSimpleJacobian(double ds) {
+        
+        // Spell out variables for readibility
+        double d_xT_d_xT = 1;
+        double d_xT_d_yT = 0;
+        double d_xT_d_xTprime = ds;
+        double d_xT_d_yTprime = 0;
+        
+        double d_yT_d_xT = 0;
+        double d_yT_d_yT = 1;
+        double d_yT_d_xTprime = 0;
+        double d_yT_d_yTprime = ds;
+        
+        double d_xTprime_d_xT = 0;
+        double d_xTprime_d_yT = 0;
+        double d_xTprime_d_xTprime = 1;
+        double d_xTprime_d_yTprime = 0;
+        
+        double d_yTprime_d_xT = 0;
+        double d_yTprime_d_yT = 0;
+        double d_yTprime_d_xTprime = 0;
+        double d_yTprime_d_yTprime = 1;
+
+        BasicMatrix jacobian = new BasicMatrix(4, 4);
+        jacobian.setElement(0, 0, d_xT_d_xT);
+        jacobian.setElement(0, 1, d_xT_d_yT);
+        jacobian.setElement(0, 2, d_xT_d_xTprime);
+        jacobian.setElement(0, 3, d_xT_d_yTprime);
+        
+        jacobian.setElement(1, 0, d_yT_d_xT);
+        jacobian.setElement(1, 1, d_yT_d_yT);
+        jacobian.setElement(1, 2, d_yT_d_xTprime);
+        jacobian.setElement(1, 3, d_yT_d_yTprime);
+        
+        jacobian.setElement(2, 0, d_xTprime_d_xT);
+        jacobian.setElement(2, 1, d_xTprime_d_yT);
+        jacobian.setElement(2, 2, d_xTprime_d_xTprime);
+        jacobian.setElement(2, 3, d_xTprime_d_yTprime);
+        
+        jacobian.setElement(3, 0, d_yTprime_d_xT);
+        jacobian.setElement(3, 1, d_yTprime_d_yT);
+        jacobian.setElement(3, 2, d_yTprime_d_xTprime);
+        jacobian.setElement(3, 3, d_yTprime_d_yTprime);
+        
+        
+        // debug 
+        StringBuffer sb = new StringBuffer();
+        sb.append("\nJacobian d(xT,yT,xT',yT')/d(xT,yT,xT',yT'):\n");
+        for(int i=0;i!=4;++i) {
+            sb.append("\n");
+            for(int j=0;j!=4;++j) {
+                sb.append(jacobian.e(i, j) + "  ");
+            }
+        }
+        logger.finest(sb.toString());
+        
+        
+        
+        return jacobian;
+    }
+    
+    /**
+     * Computes projection matrix from the intercept variables x0,y0,z0 
      * to the curvilinear xT,yT,zT variables.
      *
      * @param track - {@link STStereoTrack}
      * @return 3x3 projection matrix
      */
-    static Hep3Matrix curvilinearProjectionMatrix(Hep3Vector dir) {
+    private static Hep3Matrix curvilinearProjectionMatrix(Hep3Vector dir) {
         
         Hep3Vector X = new BasicHep3Vector(1, 0, 0);
         Hep3Vector Y = new BasicHep3Vector(0, 1, 0);
@@ -696,15 +993,9 @@
         Hep3Vector J = VecOp.mult(1. / VecOp.cross(T, Z).magnitude(), VecOp.cross(T, Z));
         Hep3Vector U = VecOp.mult(-1, J);
         Hep3Vector V = VecOp.cross(T, U);
-        Hep3Vector K = Z;
-        Hep3Vector I = VecOp.cross(J, K);
-
-        logger.info("U " + U.toString());
-        logger.info("V " + V.toString());
-        logger.info("T " + T.toString());
-        logger.info("X " + X.toString());
-        logger.info("Y " + Y.toString());
-        logger.info("Z " + Z.toString());
+        //Hep3Vector K = Z;
+        //Hep3Vector I = VecOp.cross(J, K);
+
         BasicHep3Matrix trans = new BasicHep3Matrix();
         trans.setElement(0, 0, VecOp.dot(X, U));
         trans.setElement(0, 1, VecOp.dot(Y, U));
@@ -716,12 +1007,24 @@
         trans.setElement(2, 1, VecOp.dot(Y, T));
         trans.setElement(2, 2, VecOp.dot(Z, T));
         
-        
-        
+        // debug 
+        StringBuffer sb = new StringBuffer();
+        sb.append("\nU " + U.toString());
+        sb.append("\nV " + V.toString());
+        sb.append("\nT " + T.toString());
+        sb.append("\nX " + X.toString());
+        sb.append("\nY " + Y.toString());
+        sb.append("\nZ " + Z.toString());
+        for(int i=0;i!=3;++i) {
+            sb.append("\n");
+            for(int j=0;j!=3;++j) {
+                sb.append(trans.e(i, j) + "  ");
+            }
+        }
+        logger.finest(sb.toString());
+
         return trans;
-
-    }
-
+    }
     
     /**
      * Computes projection matrix from the ST variables x0,y0,z0
@@ -733,71 +1036,77 @@
     static Hep3Vector curvilinearProjection(double x0, double y0, Hep3Vector dir) {
         final double z0 = 0; 
         Hep3Vector v = new BasicHep3Vector(x0, y0, z0);
+
+        logger.finest("Convert v " + v.toString() + " in x,y,z to curvilinear frame xT,yT,zT");
+        
+        Hep3Matrix trans = curvilinearProjectionMatrix(dir);
+        
+        Hep3Vector vnew = VecOp.mult(trans, v);
+
+        logger.finest("New vector is " + vnew.toString() + " in curvilinear frame xT,yT,zT");
+        
+        return vnew;
+
+    }
+    
+    /**
+     * Get curvilinear track parameters for this {@link STStereoTrack}.
+     * @param track
+     * @return array of track parameters
+     */
+    public static double[] getCLPars(STStereoTrack track) {
+        return getCLPars(track.getMomentum(), track.getIntercept(VIEW.XZ), track.getIntercept(VIEW.YZ), track.getSlope(VIEW.XZ), track.getSlope(VIEW.YZ));
+    }
+    
+    /**
+     * Get curvilinear track parameters from slope and intercept parameters.
+     * @param p
+     * @param x0
+     * @param y0
+     * @param dxdz
+     * @param dydz
+     * @return curvilinear parameters 1/p, lambda, phi, xT and yT
+     */
+    public static double[] getCLPars(double p, double x0, double y0, double dxdz, double dydz) {
+        
+        // track direction
+        Hep3Vector dirGlobal = VecOp.unit( new BasicHep3Vector(dxdz, dydz, 1) );
+        Hep3Vector dir = CoordinateTransformations.transformVectorToTracking(dirGlobal);
+        
+        final double z0 = 0;
+        Hep3Vector vGlobal = new BasicHep3Vector(x0, y0, z0);
+        Hep3Vector v = CoordinateTransformations.transformVectorToTracking(vGlobal);
         Hep3Matrix trans = curvilinearProjectionMatrix(dir);
         Hep3Vector vnew = VecOp.mult(trans, v);
 
+        // Spell these out for readability
+        double xT = vnew.x();
+        double yT = vnew.y();
+        //double zT = vnew.z();
+
+        double lambda = Math.atan( dir.z() );
+        double phi = Math.asin( dir.y() );
+        
+        // debug stuff
         StringBuffer sb = new StringBuffer();
-        sb.append("Convert v " + v.toString() + " in ST x,y,z to curvilinear frame xT,yT,zT with prjection matrix:\n");
+        sb.append("\n dir " + dir.toString() + "\n(x0,y0,z0) " + v.toString() + "\n(xT,yT,zT) " + vnew.toString() + "\nlambda " + lambda + "\nphi " + phi );
+        //logger.finest("getCLPars: \n(x0,y0,z0) " + v.toString() + "\n(xT,yT,zT) " + vnew.toString() + "\nd/dz(x,y,z) " + dxyz_dv.toString() + "\nd/dz(xT,yT,zT) " + dxyzT_dv.toString()  );
+        sb.append("\nusing projection matrix:\n");
         for(int i=0;i!=3;++i) {
             sb.append("\n");
             for(int j=0;j!=3;++j) {
                 sb.append(trans.e(i, j) + "  ");
             }
         }
-        sb.append("New vector is " + vnew.toString() + " in curvilinear frame xT,yT,zT");
-        logger.info(sb.toString());
-        
-        return vnew;
-
-    }
-    
-    /**
-     * 
-     * Get curvilinear track parameter. 
-     */
-    public static double[] getCLPars(STStereoTrack track) {
-        return getCLPars(track.getIntercept(VIEW.XZ), track.getIntercept(VIEW.YZ), track.getSlope(VIEW.XZ), track.getSlope(VIEW.YZ));
-    }
-    
-    public static double[] getCLPars(double x0, double y0, double dxdz, double dydz) {
-        // track direction
-        Hep3Vector dir = new BasicHep3Vector(dxdz, dydz, 1 - Math.sqrt(dxdz*dxdz + dydz*dydz));
-        
-        final double z0 = 0;
-        Hep3Vector v = new BasicHep3Vector(x0, y0, z0);
-        Hep3Matrix trans = curvilinearProjectionMatrix(dir);
-        Hep3Vector vnew = VecOp.mult(trans, v);
-
-        // for readability
-        double xT = vnew.x();
-        double yT = vnew.y();
-        //double zT = vnew.z();
-
-        final double dzdz = 1.0;
-        Hep3Vector dxyz_dv = new BasicHep3Vector(dxdz, dydz, dzdz);
-        Hep3Vector dxyzT_dv = VecOp.mult(trans, dxyz_dv);
-
-        // for readability
-        double xT_prime = dxyzT_dv.x();
-        double yT_prime = dxyzT_dv.y();
-        //double zT_prime = dxyzT_dv.z();
-
-        double clPars[] = new double[]{xT,yT,xT_prime,yT_prime};
-        
-        logger.info("getCLPars: \n(x0,y0,z0) " + v.toString() + "\n(xT,yT,zT) " + vnew.toString() + "\nd/dz(x,y,z) " + dxyz_dv.toString() + "\nd/dz(xT,yT,zT) " + dxyzT_dv.toString()  );
-        StringBuffer sb = new StringBuffer();
-        for(int i=0;i!=3;++i) {
-            sb.append("\n");
-            for(int j=0;j!=3;++j) {
-                sb.append(trans.e(i, j) + "  ");
-            }
-        }
-        logger.info("using CL prj matrix:\n" + sb.toString() + "\n and track direction "+ dir.toString());
-        
+        logger.finest(sb.toString());
+        
+        double clPars[] = new double[]{1.0/p, lambda, phi, xT, yT,};
         return clPars;
     }
 
     
+   
+    
     
     
 

Modified: java/trunk/users/src/main/java/org/hps/users/phansson/StraightThroughAnalysisDriver.java
 =============================================================================
--- java/trunk/users/src/main/java/org/hps/users/phansson/StraightThroughAnalysisDriver.java	(original)
+++ java/trunk/users/src/main/java/org/hps/users/phansson/StraightThroughAnalysisDriver.java	Mon Dec  7 11:39:52 2015
@@ -41,10 +41,15 @@
 import org.lcsim.util.aida.AIDA;
 
 /**
+ * Driver that fits {@link SiTrackerHitStrip1D} clusters to a straight line track model. 
+ * 
  * @author Per Hansson Adrian <[log in to unmask]>
  *
  */
 public class StraightThroughAnalysisDriver extends Driver {
+
+
+
 
     final static Logger logger = Logger.getLogger(StraightThroughAnalysisDriver.class.getSimpleName());
     private String stripClusterCollectionName = "StripClusterer_SiTrackerHitStrip1D";
@@ -56,6 +61,7 @@
     private Map<String,IHistogram1D> sensorHitResGlobal = new HashMap<String, IHistogram1D>();
     private Map<String,IHistogram1D>  sensorStereoHitYZResGlobal = new HashMap<String, IHistogram1D>();
     private Map<String,IHistogram1D>  sensorStereoHitXZResGlobal = new HashMap<String, IHistogram1D>();
+    private Map<String,IHistogram1D>  sensorURes = new HashMap<String, IHistogram1D>();
     private Map<String,IHistogram1D> sensorHitPositions = new HashMap<String, IHistogram1D>();
     private Map<String,IHistogram1D> sensorHitCounts = new HashMap<String, IHistogram1D>();
     private Map<String,IHistogram1D> sensorHitTimes = new HashMap<String, IHistogram1D>();
@@ -101,6 +107,7 @@
 
     private String outputFilename = "";
     private PrintWriter gblPrintWriter = null;
+    private boolean writeGbl = true;
     
 
     
@@ -109,22 +116,21 @@
      */
     public StraightThroughAnalysisDriver() {
         logger.setLevel(Level.INFO);
-        STUtils.logger.setLevel(logger.getLevel());
+        STUtils.logger.setLevel(Level.INFO); 
     }
 
   
-    private static double getTheta0(double beta,double p,double X0) {
-        return 13.6/beta/p*Math.sqrt(X0)*(1 + 0.038*Math.log(X0));
-    }
+    
     protected void detectorChanged(Detector detector) {
 
-        if(!outputFilename.isEmpty()) {
+        if(writeGbl) {
+            String gblFileName = outputFilename.isEmpty() ? "straight_throughs.gbl" : outputFilename + ".gbl"; 
             try {
-                gblPrintWriter = new PrintWriter( new BufferedWriter(new FileWriter(outputFilename)));
+                gblPrintWriter = new PrintWriter( new BufferedWriter(new FileWriter(gblFileName)));
             } catch (IOException e) {
                 e.printStackTrace();
             }
-            logger.info("Created a GBL filewriter for to file \"" + outputFilename + "\"");
+            logger.info("Created a GBL filewriter for to file \"" + gblFileName + "\"");
         }
 
         // find the stereo layers for this detector
@@ -133,12 +139,7 @@
         for(SvtStereoLayer sl : stereoLayers) sb.append(sl.getLayerNumber() + ": " + sl.getAxialSensor().getName()+ " - " + sl.getStereoSensor().getName() + "\n");
         logger.info(sb.toString());
 
-        //
-        double beta = 1.0;
-        double p = 1.05;
-        double X0 = 0.007; // per stereo pair
-        double theta0 = getTheta0(beta, p, X0);
-        double msErrY = 100.0*theta0;
+        double msErrY = 100.0*STUtils.msangle(STUtils.beamEnergy, STUtils.sensorThickness);
         regressionFitter.setErrY(msErrY);
         
         
@@ -148,8 +149,10 @@
         plotters.put("Sensor hit position", af.createPlotterFactory().create("Sensor hit positions"));
         plotters.get("Sensor hit position").setStyle(this.getDefaultPlotterStyle("Hit y (mm)","Entries"));
         plotters.get("Sensor hit position").createRegions(6, 6);
+        plotters.put("Sensor u res", af.createPlotterFactory().create("Sensor u res"));
+        plotters.get("Sensor u res").setStyle(this.getDefaultPlotterStyle("u residual (mm)","Entries"));
+        plotters.get("Sensor u res").createRegions(6, 6);
         plotters.put("Sensor hit res", af.createPlotterFactory().create("Sensor hit res"));
-        //plotters.get("Sensor hit res").setStyle(this.getDefaultPlotterStyle("Hit y res global (mm)","Entries"));
         plotters.get("Sensor hit res").createRegions(3, 6);
         plotters.put("Sensor stereo YZ hit res", af.createPlotterFactory().create("Sensor stereo YZ hit res"));
         plotters.get("Sensor stereo YZ hit res").setStyle(this.getDefaultPlotterStyle("Stereo hit y res global (mm)","Entries"));
@@ -307,7 +310,13 @@
             sensorHitTimes.put(sensor.getName(), hf.createHistogram1D(sensor.getName() + "_hittime", 50, -100, 100));
             sensorHitCountMap.put(sensor.getName(), new int[1]);
             sensorHitCountMap.get(sensor.getName())[0] = 0;
-
+            sensorURes.put(sensor.getName(), hf.createHistogram1D(sensor.getName() + "_ures", 50, -1, 1));
+
+            plotters.get("Sensor u res").region(SvtPlotUtils.computePlotterRegion(sensor)).plot(sensorURes.get(sensor.getName()));
+            plotters.get("Sensor hit position").region(SvtPlotUtils.computePlotterRegion(sensor)).plot(sensorHitPositions.get(sensor.getName()));
+            plotters.get("Sensor hit times").region(SvtPlotUtils.computePlotterRegion(sensor)).plot(sensorHitTimes.get(sensor.getName()));
+            plotters.get("Sensor cluster counts").region(SvtPlotUtils.computePlotterRegion(sensor)).plot(sensorHitCounts.get(sensor.getName()));
+            
             if(sensor.isAxial()) {
                 sensorHitResGlobal.put(sensor.getName(), hf.createHistogram1D(sensor.getName() + "_hitresglobal", 50, -0.7, 0.7));
                 plotters.get("Sensor hit res").region(SvtPlotUtils.computePlotterRegionAxialOnly(sensor)).plot(sensorHitResGlobal.get(sensor.getName()));
@@ -321,10 +330,8 @@
 
             
             }
-            
-            plotters.get("Sensor hit position").region(SvtPlotUtils.computePlotterRegion(sensor)).plot(sensorHitPositions.get(sensor.getName()));
-            plotters.get("Sensor hit times").region(SvtPlotUtils.computePlotterRegion(sensor)).plot(sensorHitTimes.get(sensor.getName()));
-            plotters.get("Sensor cluster counts").region(SvtPlotUtils.computePlotterRegion(sensor)).plot(sensorHitCounts.get(sensor.getName()));
+
+            
             
         }
 
@@ -558,31 +565,28 @@
             axialTracks.add(track);
         }
 
-        // add stereo hits to tracks and fit them with simple regression in 1D
+        // add stereo hits to tracks and fit them 
         List<STUtils.STStereoTrack> stereoTracks = new ArrayList<STUtils.STStereoTrack>();
         for(List<STUtils.StereoPair> seedHits : stereoPairs) {
             
+            // require min number of hits
             if(seedHits.size() < minHitsStereoTrack) 
                 continue;
 
+            // Create the track and set the hits
             STUtils.STStereoTrack track = new STUtils.STStereoTrack();
             track.setHits(seedHits);
             
+            // Fit the hits
             STUtils.fit(regressionFitter, track);
 
-            //            logger.fine("Fit stereo track in YZ");
-//            regressionFitter.fit(track.getPointList(STStereoTrack.VIEW.YZ,null));
-//            track.setFit(regressionFitter.getFit(), STStereoTrack.VIEW.YZ);
-//            logger.fine("Fit stereo track in XZ");
-//            regressionFitter.fit(track.getPointList(STStereoTrack.VIEW.XZ,STStereoTrack.VIEW.YZ));
-//            track.setFit(regressionFitter.getFit(), STStereoTrack.VIEW.XZ);
-            
+            // add fitted track to list of tracks
             stereoTracks.add(track);
         }
         
         
         
-        // Loop over the axial tracks
+        // Fill histograms for axial tracks
         int nTracksAxial[] = {0,0};
         for(STUtils.STTrack track : axialTracks) {
             
@@ -594,7 +598,7 @@
                 sensorHitResGlobal.get(hit.getRawHits().get(0).getDetectorElement().getName()).fill(resGlobal);
             }
             
-            logger.fine(track.toString());
+            logger.finest(track.toString());
 
             if(track.isTop()) {
                 nTracksAxial[0]++;
@@ -614,8 +618,7 @@
         
         
         
-        // Loop over the stereo tracks
-        int nTracks[] = {0,0};
+        // Update track and hit positions
         for(STUtils.STStereoTrack track : stereoTracks) {
 
             int half = track.isTop() ? 0 : 1;
@@ -624,15 +627,15 @@
             double delta = 9999.9;
             int idelta = 0;
             while(delta>0.05) {
-                logger.fine(idelta + ": delta " + delta);
+                logger.finest(idelta + ": delta " + delta);
                 delta = 0.0;
                 for(STUtils.StereoPair pair : track.getHits()) {
                     Hep3Vector p = new BasicHep3Vector(pair.getPosition().v());
                     Hep3Vector trackDirection = track.getDirection();
-                    logger.fine("updatePosition " + p.toString() + " with track dir " + trackDirection.toString());
+                    logger.finest("updatePosition " + p.toString() + " with track dir " + trackDirection.toString());
                     pair.updatePosition(trackDirection);
                     Hep3Vector pnew = pair.getPosition();
-                    logger.fine("new position " + pnew.toString());
+                    logger.finest("new position " + pnew.toString());
                     delta += VecOp.sub(p, pnew).magnitude();
                 }
                 delta = delta / track.getHits().size();
@@ -642,30 +645,42 @@
 
                 // Re-fit the track after the update
                 STUtils.fit(regressionFitter,track);
-//                track.clearFit();
-//                logger.fine("Fit stereo track in YZ");
-//                regressionFitter.fit(track.getPointList(STStereoTrack.VIEW.YZ,null));
-//                track.setFit(regressionFitter.getFit(), STStereoTrack.VIEW.YZ);
-//                logger.fine("Fit stereo track in XZ");
-//                regressionFitter.fit(track.getPointList(STStereoTrack.VIEW.XZ,STStereoTrack.VIEW.YZ));
-//                track.setFit(regressionFitter.getFit(), STStereoTrack.VIEW.XZ);
-                
-            }
-            logger.fine("finished update position after " + idelta + "iterations with delta " + delta);
-            
-            
+                
+            }
+            
+            logger.finest("finished update position after " + idelta + "iterations with delta " + delta);
+        
+        }
+        
+        
+        // Fill histograms for stereo tracks
+        int nTracks[] = {0,0};
+        for(STUtils.STStereoTrack track : stereoTracks) {
+
+            logger.finest(track.toString());
+
+            int half = track.isTop() ? 0 : 1;
+            
+            // fill histograms
             for(STUtils.StereoPair hit : track.getHits()) {
                 double yhit = hit.getPosition().y();
                 double xhit = hit.getPosition().x();
                 double zHit = hit.getPosition().z();
                 double xyPred[] = track.predict(zHit);
                 double resGlobalY = yhit - xyPred[STStereoTrack.VIEW.YZ.ordinal()];
-                double resGlobalX = xhit - xyPred[STStereoTrack.VIEW.XZ.ordinal()];;
+                double resGlobalX = xhit - xyPred[STStereoTrack.VIEW.XZ.ordinal()];
+                double uResAxial =STUtils.getUResidual(hit.getAxial(), track);
+                double uResStereo =STUtils.getUResidual(hit.getStereo(), track);
+                
                 sensorStereoHitYZResGlobal.get(hit.getAxial().getRawHits().get(0).getDetectorElement().getName()).fill(resGlobalY);
                 sensorStereoHitXZResGlobal.get(hit.getAxial().getRawHits().get(0).getDetectorElement().getName()).fill(resGlobalX);
-            }
-
-            logger.fine(track.toString());
+                
+                sensorURes.get(hit.getAxial().getRawHits().get(0).getDetectorElement().getName()).fill(uResAxial);
+                sensorURes.get(hit.getStereo().getRawHits().get(0).getDetectorElement().getName()).fill(uResStereo);
+                
+                
+            }
+
 
             nTracks[half]++;
             trackHitCount[half].fill(track.getHits().size());
@@ -674,7 +689,9 @@
                 trackSlope[half][v].fill(track.getSlope()[view.ordinal()]);
                 trackIntercept[half][v].fill(track.getIntercept()[view.ordinal()]);
             }
+            
         }   
+        
         trackCount[0].fill(nTracks[0]);
         trackCount[1].fill(nTracks[1]);
 
@@ -740,7 +757,9 @@
 
 
         // GBL interface
-        if(gblPrintWriter != null) {
+        if(writeGbl ) {
+            if(gblPrintWriter == null) 
+                throw new RuntimeException("No file was opened!");
             STUtils.printGBL(gblPrintWriter, event, stereoTracks);
         }
 
@@ -750,7 +769,7 @@
     
     protected void endOfData() {
         
-        rootFileName = outputFilename + "_hitrecon.root";
+        rootFileName = outputFilename.isEmpty() ? "hitrecon.root" : outputFilename + "_hitrecon.root";
         RootFileStore rootFileStore = new RootFileStore(rootFileName);
         try {
             rootFileStore.open();
@@ -776,16 +795,18 @@
                     }
                 }
             }
-//            if(sensor.isAxial()) {
-//                sensorHitResGlobal.put(sensor.getName(), hf.createHistogram1D(sensor.getName() + "_hitresglobal", 50, -1.5, 1.5));
-//                plotters.get("Sensor hit res").region(SvtPlotUtils.computePlotterRegionAxialOnly(sensor)).plot(sensorHitResGlobal.get(sensor.getName()));
-//                plotters.get("Sensor hit res").region(0).style().dataStyle().showInStatisticsBox(true);
-//            }
-            
-        }
-        
-    }
-
+        }
+        
+    }
+
+    public void setOutputFilename(String gblOutputFilename) {
+        this.outputFilename = gblOutputFilename;
+    }
+    
+    public void setWriteGbl(boolean writeGbl) {
+        this.writeGbl = writeGbl;
+    }
+    
     protected IPlotterStyle getMinPlotterStyle(String xAxisTitle, String yAxisTitle) {
         // Create a default style
         IPlotterStyle style = this.pf.createPlotterStyle();
@@ -843,11 +864,8 @@
 
 
 
-    public void setOutputFilename(String gblOutputFilename) {
-        this.outputFilename = gblOutputFilename;
-    }
-    
    
+
     
     
 }

Top of Message | Previous Page | Permalink

Advanced Options


Options

Log In

Log In

Get Password

Get Password


Search Archives

Search Archives


Subscribe or Unsubscribe

Subscribe or Unsubscribe


Archives

November 2017
August 2017
July 2017
January 2017
December 2016
November 2016
October 2016
September 2016
August 2016
July 2016
June 2016
May 2016
April 2016
March 2016
February 2016
January 2016
December 2015
November 2015
October 2015
September 2015
August 2015
July 2015
June 2015
May 2015
April 2015
March 2015
February 2015
January 2015
December 2014
November 2014
October 2014
September 2014
August 2014
July 2014
June 2014
May 2014
April 2014
March 2014
February 2014
January 2014
December 2013
November 2013

ATOM RSS1 RSS2



LISTSERV.SLAC.STANFORD.EDU

Secured by F-Secure Anti-Virus CataList Email List Search Powered by the LISTSERV Email List Manager

Privacy Notice, Security Notice and Terms of Use