Print

Print


Author: [log in to unmask]
Date: Wed Nov 25 12:43:16 2015
New Revision: 3988

Log:
add GBL kinks to event

Added:
    java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/GBLKinkData.java
      - copied, changed from r3956, java/trunk/tracking/src/main/java/org/hps/recon/tracking/TrackData.java
Modified:
    java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/GBLRefitterDriver.java
    java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/GblUtils.java
    java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/MakeGblTracks.java
    java/trunk/users/src/main/java/org/hps/users/meeg/SvtChargeIntegrator.java

Copied: java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/GBLKinkData.java (from r3956, java/trunk/tracking/src/main/java/org/hps/recon/tracking/TrackData.java)
 =============================================================================
--- java/trunk/tracking/src/main/java/org/hps/recon/tracking/TrackData.java	(original)
+++ java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/GBLKinkData.java	Wed Nov 25 12:43:16 2015
@@ -1,103 +1,42 @@
-package org.hps.recon.tracking;
+package org.hps.recon.tracking.gbl;
 
 import org.lcsim.event.GenericObject;
 
 /**
- * Generic object used to persist track data not available through a Track
- * object.
+ * Generic object used to persist GBL kink data.
  *
  * @author Omar Moreno <[log in to unmask]>
  * @author Sho Uemura <[log in to unmask]>
  *
  */
-public class TrackData implements GenericObject {
+public class GBLKinkData implements GenericObject {
 
-    public static final int L1_ISOLATION_INDEX = 0;
-    public static final int L2_ISOLATION_INDEX = 1;
-    public static final int N_ISOLATIONS = 12;
-    public static final int TRACK_TIME_INDEX = 0;
-    public static final int TRACK_VOLUME_INDEX = 0;
-    public static final String TRACK_DATA_COLLECTION = "TrackData";
-    public static final String TRACK_DATA_RELATION_COLLECTION = "TrackDataRelations";
+    public static final String DATA_COLLECTION = "GBLKinkData";
+    public static final String DATA_RELATION_COLLECTION = "GBLKinkDataRelations";
 
-    private final double[] doubles;
-    private final float[] floats;
-    private final int[] ints;
+    private final double[] phiKinks;
+    private final float[] lambdaKinks;
 
-    /**
-     * Default constructor
-     */
-    public TrackData() {
-        doubles = new double[N_ISOLATIONS];
-        floats = new float[1];
-        ints = new int[1];
+    public GBLKinkData(float[] lambdaKinks, double[] phiKinks) {
+
+        this.lambdaKinks = lambdaKinks;
+        this.phiKinks = phiKinks;
     }
 
-    /**
-     * Constructor
-     *
-     * @param trackVolume : SVT volume associated with the track
-     * @param trackTime : The track time
-     * @param isolations : an array of doubles containing isolations for every
-     * sensor layer
-     */
-    public TrackData(int trackVolume, float trackTime, double[] isolations) {
-
-        this.doubles = isolations;
-        this.floats = new float[]{trackTime};
-        this.ints = new int[]{trackVolume};
+    public double getPhiKink(int layer) {
+        return phiKinks[layer];
     }
 
-    /**
-     * Get isolation value for the hit in the given sensor layer.
-     *
-     * @param layer The sensor layer of interest (0-11)
-     * @return The isolation value: positive if the nearest hit is outwards from
-     * the beam plane, negative if the nearest hit is inwards, offscale low if
-     * the track has no hit in this layer, offscale high if there is no other
-     * hit in this layer
-     */
-    public double getIsolation(int layer) {
-        return doubles[layer];
+    public double getLambdaKink(int layer) {
+        return lambdaKinks[layer];
     }
 
-    /**
-     * @return The track time
-     */
-    public float getTrackTime() {
-        return floats[TRACK_TIME_INDEX];
-    }
-
-    /**
-     * @return The SVT volume associated with the track
-     */
-    public int getTrackVolume() {
-        return ints[TRACK_VOLUME_INDEX];
-    }
-
-    /**
-     * @param object : The generic object containing the data.
-     * @param layer The sensor layer of interest (0-11)
-     * @return The isolation value for the specified layer
-     */
-    public static double getIsolation(GenericObject object, int layer) {
+    public static double getPhiKink(GenericObject object, int layer) {
         return object.getDoubleVal(layer);
     }
 
-    /**
-     * @param object : The generic object containing the data.
-     * @return The track time
-     */
-    public static float getTrackTime(GenericObject object) {
-        return object.getFloatVal(TRACK_TIME_INDEX);
-    }
-
-    /**
-     * @param object : The generic object containing the data.
-     * @return The SVT volume associated with the track
-     */
-    public static int getTrackVolume(GenericObject object) {
-        return object.getIntVal(TRACK_VOLUME_INDEX);
+    public static double getLambdaKink(GenericObject object, int layer) {
+        return object.getFloatVal(layer);
     }
 
     /**
@@ -105,7 +44,7 @@
      */
     @Override
     public double getDoubleVal(int index) {
-        return doubles[index];
+        return phiKinks[index];
     }
 
     /**
@@ -113,7 +52,7 @@
      */
     @Override
     public float getFloatVal(int index) {
-        return floats[index];
+        return lambdaKinks[index];
     }
 
     /**
@@ -121,7 +60,7 @@
      */
     @Override
     public int getIntVal(int index) {
-        return ints[index];
+        throw new ArrayIndexOutOfBoundsException();
     }
 
     /**
@@ -129,7 +68,7 @@
      */
     @Override
     public int getNDouble() {
-        return doubles.length;
+        return phiKinks.length;
     }
 
     /**
@@ -137,7 +76,7 @@
      */
     @Override
     public int getNFloat() {
-        return floats.length;
+        return lambdaKinks.length;
     }
 
     /**
@@ -145,7 +84,7 @@
      */
     @Override
     public int getNInt() {
-        return ints.length;
+        return 0;
     }
 
     /**

Modified: java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/GBLRefitterDriver.java
 =============================================================================
--- java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/GBLRefitterDriver.java	(original)
+++ java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/GBLRefitterDriver.java	Wed Nov 25 12:43:16 2015
@@ -6,6 +6,7 @@
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import org.apache.commons.math3.util.Pair;
 import org.hps.recon.tracking.MaterialSupervisor;
 import org.hps.recon.tracking.MultipleScattering;
 import org.hps.recon.tracking.TrackUtils;
@@ -68,9 +69,9 @@
 
         Map<Track, Track> inputToRefitted = new HashMap<Track, Track>();
         for (Track track : tracks) {
-            Track newTrack = GblUtils.refitTrack(TrackUtils.getHTF(track), TrackUtils.getStripHits(track, hitToStrips, hitToRotated), track.getTrackerHits(), 5, _scattering, bfield);
-            refittedTracks.add(newTrack);
-            inputToRefitted.put(track, newTrack);
+            Pair<Track, GBLKinkData> newTrack = GblUtils.refitTrack(TrackUtils.getHTF(track), TrackUtils.getStripHits(track, hitToStrips, hitToRotated), track.getTrackerHits(), 5, _scattering, bfield);
+            refittedTracks.add(newTrack.getFirst());
+            inputToRefitted.put(track, newTrack.getFirst());
         }
 
         if (mergeTracks) {
@@ -105,8 +106,8 @@
                         }
                     }
 
-                    Track mergedTrack = GblUtils.refitTrack(TrackUtils.getHTF(track), TrackUtils.getStripHits(track, hitToStrips, hitToRotated), allHth, 5, _scattering, bfield);
-                    mergedTracks.add(mergedTrack);
+                    Pair<Track, GBLKinkData> mergedTrack = GblUtils.refitTrack(TrackUtils.getHTF(track), TrackUtils.getStripHits(track, hitToStrips, hitToRotated), allHth, 5, _scattering, bfield);
+                    mergedTracks.add(mergedTrack.getFirst());
 //                    System.out.format("%f %f %f\n", fit.get_chi2(), inputToRefitted.get(track).getChi2(), inputToRefitted.get(otherTrack).getChi2());
 //                mergedTrackToTrackList.put(mergedTrack, new ArrayList<Track>());
                 }

Modified: java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/GblUtils.java
 =============================================================================
--- java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/GblUtils.java	(original)
+++ java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/GblUtils.java	Wed Nov 25 12:43:16 2015
@@ -10,6 +10,7 @@
 import java.util.Collections;
 import java.util.Comparator;
 import java.util.List;
+import org.apache.commons.math3.util.Pair;
 import org.hps.recon.tracking.CoordinateTransformations;
 import org.hps.recon.tracking.MaterialSupervisor;
 import org.hps.recon.tracking.MultipleScattering;
@@ -144,16 +145,16 @@
      * @param bfield B-field
      * @return The refitted track.
      */
-    public static Track refitTrack(HelicalTrackFit helix, Collection<TrackerHit> stripHits, Collection<TrackerHit> hth, int nIterations, MultipleScattering scattering, double bfield) {
+    public static Pair<Track, GBLKinkData> refitTrack(HelicalTrackFit helix, Collection<TrackerHit> stripHits, Collection<TrackerHit> hth, int nIterations, MultipleScattering scattering, double bfield) {
         List<TrackerHit> allHthList = sortHits(hth);
         List<TrackerHit> sortedStripHits = sortHits(stripHits);
         FittedGblTrajectory fit = GblUtils.doGBLFit(helix, sortedStripHits, scattering, bfield, 0);
         for (int i = 0; i < nIterations; i++) {
-            Track newTrack = MakeGblTracks.makeCorrectedTrack(fit, helix, allHthList, 0, bfield);
-            helix = TrackUtils.getHTF(newTrack);
+            Pair<Track, GBLKinkData> newTrack = MakeGblTracks.makeCorrectedTrack(fit, helix, allHthList, 0, bfield);
+            helix = TrackUtils.getHTF(newTrack.getFirst());
             fit = GblUtils.doGBLFit(helix, sortedStripHits, scattering, bfield, 0);
         }
-        Track mergedTrack = MakeGblTracks.makeCorrectedTrack(fit, helix, allHthList, 0, bfield);
+        Pair<Track, GBLKinkData> mergedTrack = MakeGblTracks.makeCorrectedTrack(fit, helix, allHthList, 0, bfield);
         return mergedTrack;
     }
 

Modified: java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/MakeGblTracks.java
 =============================================================================
--- java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/MakeGblTracks.java	(original)
+++ java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/MakeGblTracks.java	Wed Nov 25 12:43:16 2015
@@ -1,27 +1,27 @@
 package org.hps.recon.tracking.gbl;
 
-import static org.hps.recon.tracking.gbl.GBLOutput.getPerToClPrj;
 import hep.physics.matrix.SymmetricMatrix;
 import hep.physics.vec.BasicHep3Vector;
 import hep.physics.vec.Hep3Matrix;
 import hep.physics.vec.Hep3Vector;
 import hep.physics.vec.VecOp;
-
 import java.util.ArrayList;
 import java.util.List;
 import java.util.logging.Level;
 import java.util.logging.Logger;
-
 import org.apache.commons.math3.util.Pair;
 import org.hps.recon.tracking.TrackType;
+import static org.hps.recon.tracking.gbl.GBLOutput.getPerToClPrj;
 import org.hps.recon.tracking.gbl.matrix.Matrix;
 import org.hps.recon.tracking.gbl.matrix.SymMatrix;
 import org.hps.recon.tracking.gbl.matrix.Vector;
 import org.lcsim.constants.Constants;
 import org.lcsim.event.EventHeader;
+import org.lcsim.event.LCRelation;
 import org.lcsim.event.Track;
 import org.lcsim.event.TrackState;
 import org.lcsim.event.TrackerHit;
+import org.lcsim.event.base.BaseLCRelation;
 import org.lcsim.event.base.BaseTrack;
 import org.lcsim.event.base.BaseTrackState;
 import org.lcsim.fit.helicaltrack.HelicalTrackFit;
@@ -67,6 +67,10 @@
 
         List<Track> tracks = new ArrayList<Track>();
 
+        List<GBLKinkData> kinkDataCollection = new ArrayList<GBLKinkData>();
+
+        List<LCRelation> kinkDataRelations = new ArrayList<LCRelation>();
+
         LOGGER.info("adding " + gblTrajectories.size() + " of fitted GBL tracks to the event");
 
         for (FittedGblTrajectory fittedTraj : gblTrajectories) {
@@ -75,10 +79,12 @@
             SeedCandidate trackseed = seedTrack.getSeedCandidate();
 
             //  Create a new Track
-            Track trk = makeCorrectedTrack(fittedTraj, trackseed.getHelix(), seedTrack.getTrackerHits(), seedTrack.getType(), bfield);
+            Pair<Track, GBLKinkData> trk = makeCorrectedTrack(fittedTraj, trackseed.getHelix(), seedTrack.getTrackerHits(), seedTrack.getType(), bfield);
 
             //  Add the track to the list of tracks
-            tracks.add(trk);
+            tracks.add(trk.getFirst());
+            kinkDataCollection.add(trk.getSecond());
+            kinkDataRelations.add(new BaseLCRelation(trk.getSecond(), trk.getFirst()));
         }
 
         LOGGER.info("adding " + Integer.toString(tracks.size()) + " Gbl tracks to event with " + event.get(Track.class, "MatchedTracks").size() + " matched tracks");
@@ -86,9 +92,11 @@
         // Put the tracks back into the event and exit
         int flag = 1 << LCIOConstants.TRBIT_HITS;
         event.put(_TrkCollectionName, tracks, Track.class, flag);
-    }
-
-    public static Track makeCorrectedTrack(FittedGblTrajectory fittedTraj, HelicalTrackFit helix, List<TrackerHit> trackHits, int trackType, double bfield) {
+        event.put(GBLKinkData.DATA_COLLECTION, kinkDataCollection, GBLKinkData.class, 0);
+        event.put(GBLKinkData.DATA_RELATION_COLLECTION, kinkDataRelations, LCRelation.class, 0);
+    }
+
+    public static Pair<Track, GBLKinkData> makeCorrectedTrack(FittedGblTrajectory fittedTraj, HelicalTrackFit helix, List<TrackerHit> trackHits, int trackType, double bfield) {
         //  Initialize the reference point to the origin
         double[] ref = new double[]{0., 0., 0.};
 
@@ -112,6 +120,8 @@
         Pair<double[], SymmetricMatrix> correctedHelixParamsLast = getGblCorrectedHelixParameters(helix, fittedTraj.get_traj(), bfield, FittedGblTrajectory.GBLPOINT.LAST);
         TrackState stateLast = new BaseTrackState(correctedHelixParamsLast.getFirst(), ref, correctedHelixParamsLast.getSecond().asPackedArray(true), TrackState.AtLastHit, bfield);
         trk.getTrackStates().add(stateLast);
+
+        GBLKinkData kinkData = getKinks(fittedTraj.get_traj());
 
         // Set other info needed
         trk.setChisq(fittedTraj.get_chi2());
@@ -128,7 +138,7 @@
                 LOGGER.info(String.format("param %d: %.10f -> %.10f    helix-gbl= %f", i, helix.parameters()[i], trk.getTrackParameter(i), helix.parameters()[i] - trk.getTrackParameter(i)));
             }
         }
-        return trk;
+        return new Pair<Track, GBLKinkData>(trk, kinkData);
     }
 
     /**
@@ -285,6 +295,30 @@
         return new Pair<double[], SymmetricMatrix>(parameters_gbl, cov);
     }
 
+    public static GBLKinkData getKinks(GblTrajectory traj) {
+
+        // get corrections from GBL fit
+        Vector locPar = new Vector(5);
+        SymMatrix locCov = new SymMatrix(5);
+        float[] lambdaKinks = new float[traj.getNumPoints() - 1];
+        double[] phiKinks = new double[traj.getNumPoints() - 1];
+
+        double oldPhi = 0, oldLambda = 0;
+        for (int i = 0; i < traj.getNumPoints(); i++) {
+            traj.getResults(i + 1, locPar, locCov); // vertex point
+            double newPhi = locPar.get(FittedGblTrajectory.GBLPARIDX.XTPRIME.getValue());
+            double newLambda = locPar.get(FittedGblTrajectory.GBLPARIDX.YTPRIME.getValue());
+            if (i > 0) {
+                lambdaKinks[i - 1] = (float) (newLambda - oldLambda);
+                phiKinks[i - 1] = newPhi - oldPhi;
+            }
+            oldPhi = newPhi;
+            oldLambda = newLambda;
+        }
+
+        return new GBLKinkData(lambdaKinks, phiKinks);
+    }
+
     public void setTrkCollectionName(String name) {
         _TrkCollectionName = name;
     }

Modified: java/trunk/users/src/main/java/org/hps/users/meeg/SvtChargeIntegrator.java
 =============================================================================
--- java/trunk/users/src/main/java/org/hps/users/meeg/SvtChargeIntegrator.java	(original)
+++ java/trunk/users/src/main/java/org/hps/users/meeg/SvtChargeIntegrator.java	Wed Nov 25 12:43:16 2015
@@ -124,6 +124,9 @@
                             continue;
                         }
                         tiTimeOffset = RunManager.getRunManager().getTriggerConfig().getTiTimeOffset();
+                        if (tiTimeOffset == 0) {
+                            continue;
+                        }
                     }
 
                     try {
@@ -188,9 +191,15 @@
                 }
 
                 if (useTI) {
+                    if (firstTI == 0 || lastTI == 0) {
+                        continue;
+                    }
                     startDate = new Date((long) ((firstTI + tiTimeOffset) / 1e6));
                     endDate = new Date((long) ((lastTI + tiTimeOffset) / 1e6));
                 } else {
+                    if (firstTime == 0 || lastTime == 0) {
+                        continue;
+                    }
                     startDate = new Date(firstTime * 1000);
                     endDate = new Date(lastTime * 1000);
                 }
@@ -285,7 +294,10 @@
                     }
                     if (date.after(endDate)) {//this is the last interval overlapping the file's time range; backtrack so this line will be read again for the next file
                         date = lastDate;
-                        br.reset();
+                        try {
+                            br.reset();
+                        } catch (IOException e) {
+                        }
                         break;
                     }
                     br.mark(1000);