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  October 2015

HPS-SVN October 2015

Subject:

r3750 - in /java/trunk/tracking/src/main/java/org/hps/recon/tracking: MergeTrackCollections.java gbl/GBLRefitterDriver.java gbl/MakeGblTracks.java

From:

[log in to unmask]

Reply-To:

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

Date:

Fri, 2 Oct 2015 02:49:42 -0000

Content-Type:

text/plain

Parts/Attachments:

Parts/Attachments

text/plain (893 lines)

Author: [log in to unmask]
Date: Thu Oct  1 19:49:39 2015
New Revision: 3750

Log:
start work on simple GBL refitter

Added:
    java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/GBLRefitterDriver.java
      - copied, changed from r3749, java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/HpsGblRefitter.java
Modified:
    java/trunk/tracking/src/main/java/org/hps/recon/tracking/MergeTrackCollections.java
    java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/MakeGblTracks.java

Modified: java/trunk/tracking/src/main/java/org/hps/recon/tracking/MergeTrackCollections.java
 =============================================================================
--- java/trunk/tracking/src/main/java/org/hps/recon/tracking/MergeTrackCollections.java	(original)
+++ java/trunk/tracking/src/main/java/org/hps/recon/tracking/MergeTrackCollections.java	Thu Oct  1 19:49:39 2015
@@ -7,7 +7,6 @@
 import java.util.Map;
 import java.util.Set;
 import org.lcsim.event.EventHeader;
-import org.lcsim.event.RelationalTable;
 import org.lcsim.event.Track;
 import org.lcsim.event.TrackerHit;
 import org.lcsim.lcio.LCIOConstants;
@@ -68,15 +67,13 @@
 
     @Override
     public void process(EventHeader event) {
-        RelationalTable hitToStrips = TrackUtils.getHitToStripsTable(event);
-        RelationalTable hitToRotated = TrackUtils.getHitToRotatedTable(event);
         List<List<Track>> trackCollections = event.get(Track.class);
 
         // Loop over each of the track collections retrieved from the event
         Map<Set<TrackerHit>, List<Track>> hitsToTracksMap = new HashMap<Set<TrackerHit>, List<Track>>();
         for (List<Track> tracklist : trackCollections) {
             for (Track trk : tracklist) {
-                Set<TrackerHit> trackHits = new HashSet<TrackerHit>(TrackUtils.getStripHits(trk, hitToStrips, hitToRotated));
+                Set<TrackerHit> trackHits = new HashSet<TrackerHit>(trk.getTrackerHits());
                 List<Track> matchingTracks = hitsToTracksMap.get(trackHits);
                 if (matchingTracks == null) {
                     matchingTracks = new ArrayList<Track>();

Copied: java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/GBLRefitterDriver.java (from r3749, java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/HpsGblRefitter.java)
 =============================================================================
--- java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/HpsGblRefitter.java	(original)
+++ java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/GBLRefitterDriver.java	Thu Oct  1 19:49:39 2015
@@ -1,754 +1,108 @@
 package org.hps.recon.tracking.gbl;
 
-import hep.physics.vec.BasicHep3Vector;
-import hep.physics.vec.Hep3Vector;
-import hep.physics.vec.VecOp;
-import static java.lang.Math.abs;
-import static java.lang.Math.sin;
-import static java.lang.Math.sqrt;
 import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
-import java.util.logging.Formatter;
-import java.util.logging.Level;
-import java.util.logging.Logger;
+import java.util.Set;
+import org.hps.recon.tracking.MaterialSupervisor;
+import org.hps.recon.tracking.MultipleScattering;
 import org.hps.recon.tracking.TrackUtils;
-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.hps.util.BasicLogFormatter;
-import org.lcsim.constants.Constants;
 import org.lcsim.event.EventHeader;
-import org.lcsim.event.GenericObject;
-import org.lcsim.event.LCRelation;
+import org.lcsim.event.RawTrackerHit;
+import org.lcsim.event.RelationalTable;
 import org.lcsim.event.Track;
+import org.lcsim.event.TrackerHit;
+import org.lcsim.fit.helicaltrack.HelicalTrackFit;
 import org.lcsim.geometry.Detector;
-import org.lcsim.geometry.compact.converter.MilleParameter;
+import org.lcsim.lcio.LCIOConstants;
 import org.lcsim.util.Driver;
-import org.lcsim.util.log.LogUtil;
 
 /**
- * A Driver which refits tracks using GBL. Modeled on the hps-dst code written
- * by Per Hansson and Omar Moreno. Requires the GBL Collections and Relations to
+ * A Driver which refits tracks using GBL. Does not require GBL collections to
  * be present in the event.
- *
- * @author Norman A Graf
- * @author Per Hansson Adrian <[log in to unmask]>
- *
- * @version $Id: HpsGblRefitter.java 3460 2015-08-29 01:45:39Z
- * [log in to unmask] $
  */
-public class HpsGblRefitter extends Driver {
+public class GBLRefitterDriver extends Driver {
 
-    static Formatter f = new BasicLogFormatter();
-    private static Logger logger = LogUtil.create(HpsGblRefitter.class.getSimpleName(), f, Level.WARNING);
-    //private static final Logger logger = Logger.getLogger(HpsGblRefitter.class.getName());
-    private boolean _debug = false;
-    private final String trackCollectionName = "MatchedTracks";
-    private final String track2GblTrackRelationName = "TrackToGBLTrack";
-    private final String gblTrack2StripRelationName = "GBLTrackToStripData";
+    private String inputCollectionName = "MatchedTracks";
+    private String outputCollectionName = "GBLTracks";
 
-    private MilleBinary mille;
-    private String milleBinaryFileName = MilleBinary.DEFAULT_OUTPUT_FILE_NAME;
-    private boolean writeMilleBinary = false;
+    private double bfield;
+    private final MultipleScattering _scattering = new MultipleScattering(new MaterialSupervisor());
 
-    private final MakeGblTracks _makeTracks;
-
-    public void setDebug(boolean debug) {
-        _debug = debug;
-        _makeTracks.setDebug(debug);
+    public void setInputCollectionName(String inputCollectionName) {
+        this.inputCollectionName = inputCollectionName;
     }
 
-    public void setMilleBinaryFileName(String filename) {
-        milleBinaryFileName = filename;
-    }
-
-    public void setWriteMilleBinary(boolean writeMillepedeFile) {
-        writeMilleBinary = writeMillepedeFile;
-    }
-
-    public HpsGblRefitter() {
-        _makeTracks = new MakeGblTracks();
-        _makeTracks.setDebug(_debug);
-        logger.setLevel(Level.WARNING);
-        System.out.println("level " + logger.getLevel().toString());
-    }
-
-    //@Override
-    //public void setLogLevel(String logLevel) {
-    //    logger.setLevel(Level.parse(logLevel));
-    //}
-    @Override
-    protected void startOfData() {
-        if (writeMilleBinary) {
-            mille = new MilleBinary(milleBinaryFileName);
-        }
+    public void setOutputCollectionName(String outputCollectionName) {
+        this.outputCollectionName = outputCollectionName;
     }
 
     @Override
-    protected void endOfData() {
-        if (writeMilleBinary) {
-            mille.close();
-        }
+    protected void detectorChanged(Detector detector) {
+        bfield = Math.abs(TrackUtils.getBField(detector).magnitude());
+        _scattering.getMaterialManager().buildModel(detector);
+        _scattering.setBField(bfield); // only absolute of B is needed as it's used for momentum calculation only
     }
 
     @Override
     protected void process(EventHeader event) {
-        double bfield = TrackUtils.getBField(event.getDetector()).y();
-        //double bfac = 0.0002998 * bfield;
-        double bfac = Constants.fieldConversion * bfield;
-
-        // get the tracks
-        if (!event.hasCollection(Track.class, trackCollectionName)) {
-            if (_debug) {
-                System.out.printf("%s: No tracks in Event %d \n", this.getClass().getSimpleName(), event.getEventNumber());
-            }
+        if (!event.hasCollection(Track.class, inputCollectionName)) {
             return;
         }
+        List<Track> tracks = event.get(Track.class, inputCollectionName);
+        RelationalTable hitToStrips = TrackUtils.getHitToStripsTable(event);
+        RelationalTable hitToRotated = TrackUtils.getHitToRotatedTable(event);
 
-        //get the relations to the GBLtracks
-        if (!event.hasItem(track2GblTrackRelationName)) {
-            System.out.println("Need Relations " + track2GblTrackRelationName);
-            return;
-        }
-        // and strips
-        if (!event.hasItem(gblTrack2StripRelationName)) {
-            System.out.println("Need Relations " + gblTrack2StripRelationName);
-            return;
+        List<Track> refittedTracks = new ArrayList<Track>();
+
+        Map<Track, Track> inputToRefitted = new HashMap<Track, Track>();
+        for (Track track : tracks) {
+            HelicalTrackFit helix = TrackUtils.getHTF(track);
+            FittedGblTrajectory fit = GblUtils.doGBLFit(helix, TrackUtils.getStripHits(track, hitToStrips, hitToRotated), _scattering, bfield, 0);
+
+            Track newTrack = MakeGblTracks.makeCorrectedTrack(fit, helix, track.getTrackerHits(), track.getType(), bfield);
+            refittedTracks.add(newTrack);
+            inputToRefitted.put(track, newTrack);
         }
 
-        List<LCRelation> track2GblTrackRelations = event.get(LCRelation.class, track2GblTrackRelationName);
-        //need a map of GBLTrackData keyed on the Generic object from which it created
-        Map<GenericObject, GBLTrackData> gblObjMap = new HashMap<GenericObject, GBLTrackData>();
-        //need a map of SeedTrack to GBLTrackData keyed on the track object from which it created
-        Map<GBLTrackData, Track> gblToSeedMap = new HashMap<GBLTrackData, Track>();
+        Map<Set<TrackerHit>, List<Track>> hitSetToTrackList = new HashMap<Set<TrackerHit>, List<Track>>();
 
-        // loop over the relations
-        for (LCRelation relation : track2GblTrackRelations) {
-            Track t = (Track) relation.getFrom();
-            GenericObject gblTrackObject = (GenericObject) relation.getTo();
-            GBLTrackData gblT = new GBLTrackData(gblTrackObject);
-            gblObjMap.put(gblTrackObject, gblT);
-            gblToSeedMap.put(gblT, t);
-        } //end of loop over tracks
+        for (Track track : tracks) {
+            Set<TrackerHit> trackHth = new HashSet<TrackerHit>(track.getTrackerHits());
+            for (Track otherTrack : tracks) {
+                Set<TrackerHit> allHth = new HashSet<TrackerHit>(otherTrack.getTrackerHits());
+                allHth.addAll(trackHth);
+                List<TrackerHit> hthList = new ArrayList<TrackerHit>(allHth);
+                if (hthList.size() == trackHth.size()) {
+                    continue;
+                }
 
-        //get the strip hit relations
-        List<LCRelation> gblTrack2StripRelations = event.get(LCRelation.class, gblTrack2StripRelationName);
+                boolean[] hasHit = new boolean[6];
+                boolean isGood = true;
 
-        // need a map of lists of strip data keyed by the gblTrack to which they correspond
-        Map<GBLTrackData, List<GBLStripClusterData>> stripsGblMap = new HashMap<GBLTrackData, List<GBLStripClusterData>>();
-        for (LCRelation relation : gblTrack2StripRelations) {
-            //from GBLTrackData to GBLStripClusterData
-            GenericObject gblTrackObject = (GenericObject) relation.getFrom();
-            //Let's get the GBLTrackData that corresponds to this object...
-            GBLTrackData gblT = gblObjMap.get(gblTrackObject);
-            GBLStripClusterData sd = new GBLStripClusterData((GenericObject) relation.getTo());
-            if (stripsGblMap.containsKey(gblT)) {
-                stripsGblMap.get(gblT).add(sd);
-            } else {
-                stripsGblMap.put(gblT, new ArrayList<GBLStripClusterData>());
-                stripsGblMap.get(gblT).add(sd);
-            }
-        }
+                for (TrackerHit hit : hthList) {
+                    int layer = (TrackUtils.getLayer(hit) - 1) / 2;
+                    if (hasHit[layer]) {
+                        isGood = false;
+                        break;
+                    }
+                    hasHit[layer] = true;
+                }
+                if (isGood) {
+                    HelicalTrackFit helix = TrackUtils.getHTF(track);
+                    Set<TrackerHit> allStripHits = new HashSet<TrackerHit>(TrackUtils.getStripHits(track, hitToStrips, hitToRotated));
+                    allStripHits.addAll(TrackUtils.getStripHits(otherTrack, hitToStrips, hitToRotated));
 
-        // loop over the tracks and do the GBL fit
-        List<FittedGblTrajectory> trackFits = new ArrayList<FittedGblTrajectory>();
-        logger.info("Trying to fit " + stripsGblMap.size() + " tracks");
-        for (GBLTrackData t : stripsGblMap.keySet()) {
-            FittedGblTrajectory traj = fit(stripsGblMap.get(t), bfac, _debug);
-            if (traj != null) {
-                logger.info("GBL fit successful");
-                if (_debug) {
-                    System.out.printf("%s: GBL fit successful.\n", getClass().getSimpleName());
-                }
-                // write to MP binary file
-                if (writeMilleBinary) {
-                    traj.get_traj().milleOut(mille);
-                }
-                traj.set_seed(gblToSeedMap.get(t));
-                trackFits.add(traj);
-            } else {
-                logger.info("GBL fit failed");
-                if (_debug) {
-                    System.out.printf("%s: GBL fit failed.\n", getClass().getSimpleName());
+                    FittedGblTrajectory fit = GblUtils.doGBLFit(helix, new ArrayList<TrackerHit>(allStripHits), _scattering, bfield, 0);
+                    Track newTrack = MakeGblTracks.makeCorrectedTrack(fit, helix, new ArrayList<TrackerHit>(allHth), 0, bfield);
+                    System.out.format("%f %f %f\n", fit.get_chi2(), inputToRefitted.get(track).getChi2(), inputToRefitted.get(otherTrack).getChi2());
                 }
             }
         }
-
-        logger.info(event.get(Track.class, trackCollectionName).size() + " tracks in collection \"" + trackCollectionName + "\"");
-        logger.info(gblObjMap.size() + " tracks in gblObjMap");
-        logger.info(gblToSeedMap.size() + " tracks in gblToSeedMap");
-        logger.info(stripsGblMap.size() + " tracks in stripsGblMap");
-        logger.info(trackFits.size() + " fitted GBL tracks before adding to event");
-
-        _makeTracks.Process(event, trackFits, bfield);
-
-        if (_debug) {
-            System.out.printf("%s: Done.\n", getClass().getSimpleName());
-        }
-
-    }
-
-    public static FittedGblTrajectory fit(List<GBLStripClusterData> hits, double bfac, boolean debug) {
-        // path length along trajectory
-        double s = 0.;
-
-        // jacobian to transport errors between points along the path
-        Matrix jacPointToPoint = new Matrix(5, 5);
-        jacPointToPoint.UnitMatrix();
-        // Vector of the strip clusters used for the GBL fit
-        List<GblPoint> listOfPoints = new ArrayList<GblPoint>();
-
-        // Store the projection from local to measurement frame for each strip cluster
-        Map< Integer, Matrix> proL2m_list = new HashMap<Integer, Matrix>();
-        // Save the association between strip cluster and label
-
-        //start trajectory at refence point (s=0) - this point has no measurement
-        GblPoint ref_point = new GblPoint(jacPointToPoint);
-        listOfPoints.add(ref_point);
-
-        // Loop over strips
-        int n_strips = hits.size();
-        for (int istrip = 0; istrip != n_strips; ++istrip) {
-            GBLStripClusterData strip = hits.get(istrip);
-            //MG--9/18/2015--beamspot has Id=666/667...don't include it in the GBL fit
-            if (strip.getId() > 99) {
-                continue;
-            }
-            if (debug) {
-                System.out.println("HpsGblFitter: Processing strip " + istrip + " with id/layer " + strip.getId());
-            }
-            // Path length step for this cluster
-            double step = strip.getPath3D() - s;
-            if (debug) {
-                System.out.println("HpsGblFitter: " + "Path length step " + step + " from " + s + " to " + strip.getPath3D());
-            }
-
-            // get measurement frame unit vectors
-            Hep3Vector u = strip.getU();
-            Hep3Vector v = strip.getV();
-            Hep3Vector w = strip.getW();
-
-            // Measurement direction (perpendicular and parallel to strip direction)
-            Matrix mDir = new Matrix(2, 3);
-            mDir.set(0, 0, u.x());
-            mDir.set(0, 1, u.y());
-            mDir.set(0, 2, u.z());
-            mDir.set(1, 0, v.x());
-            mDir.set(1, 1, v.y());
-            mDir.set(1, 2, v.z());
-            if (debug) {
-                System.out.println("HpsGblFitter: " + "mDir");
-                mDir.print(4, 6);
-            }
-            Matrix mDirT = mDir.copy().transpose();
-
-            if (debug) {
-                System.out.println("HpsGblFitter: " + "mDirT");
-                mDirT.print(4, 6);
-            }
-
-            // Track direction 
-            double sinLambda = sin(strip.getTrackLambda());//->GetLambda());
-            double cosLambda = sqrt(1.0 - sinLambda * sinLambda);
-            double sinPhi = sin(strip.getTrackPhi());//->GetPhi());
-            double cosPhi = sqrt(1.0 - sinPhi * sinPhi);
-
-            if (debug) {
-                System.out.println("HpsGblFitter: " + "Track direction sinLambda=" + sinLambda + " sinPhi=" + sinPhi);
-            }
-
-            // Track direction in curvilinear frame (U,V,T)
-            // U = Z x T / |Z x T|, V = T x U
-            Matrix uvDir = new Matrix(2, 3);
-            uvDir.set(0, 0, -sinPhi);
-            uvDir.set(0, 1, cosPhi);
-            uvDir.set(0, 2, 0.);
-            uvDir.set(1, 0, -sinLambda * cosPhi);
-            uvDir.set(1, 1, -sinLambda * sinPhi);
-            uvDir.set(1, 2, cosLambda);
-
-            if (debug) {
-                System.out.println("HpsGblFitter: " + "uvDir");
-                uvDir.print(6, 4);
-            }
-
-            // projection from  measurement to local (curvilinear uv) directions (duv/dm)
-            Matrix proM2l = uvDir.times(mDirT);
-
-            //projection from local (uv) to measurement directions (dm/duv)
-            Matrix proL2m = proM2l.copy();
-            proL2m = proL2m.inverse();
-            proL2m_list.put(strip.getId(), proL2m.copy()); // is a copy needed or is that just a C++/root thing?
-
-            if (debug) {
-                System.out.println("HpsGblFitter: " + "proM2l:");
-                proM2l.print(4, 6);
-                System.out.println("HpsGblFitter: " + "proL2m:");
-                proL2m.print(4, 6);
-                System.out.println("HpsGblFitter: " + "proM2l*proL2m (should be unit matrix):");
-                (proM2l.times(proL2m)).print(4, 6);
-            }
-
-            // measurement/residual in the measurement system
-            // only 1D measurement in u-direction, set strip measurement direction to zero
-            Vector meas = new Vector(2);
-//		double uRes = strip->GetUmeas() - strip->GetTrackPos().x(); // how can this be correct?
-            double uRes = strip.getMeas() - strip.getTrackPos().x();
-            meas.set(0, uRes);
-            meas.set(1, 0.);
-//		//meas[0][0] += deltaU[iLayer] # misalignment
-            Vector measErr = new Vector(2);
-            measErr.set(0, strip.getMeasErr());
-            measErr.set(1, 0.);
-            Vector measPrec = new Vector(2);
-            measPrec.set(0, 1.0 / (measErr.get(0) * measErr.get(0)));
-            measPrec.set(1, 0.);
-
-            if (debug) {
-                System.out.println("HpsGblFitter: " + "meas: ");
-                meas.print(4, 6);
-                System.out.println("HpsGblFitter: " + "measErr:");
-                measErr.print(4, 6);
-                System.out.println("HpsGblFitter: " + "measPrec:");
-                measPrec.print(4, 6);
-            }
-
-            //Find the Jacobian to be able to propagate the covariance matrix to this strip position
-            jacPointToPoint = gblSimpleJacobianLambdaPhi(step, cosLambda, abs(bfac));
-
-            if (debug) {
-                System.out.println("HpsGblFitter: " + "jacPointToPoint to extrapolate to this point:");
-                jacPointToPoint.print(4, 6);
-            }
-
-            // Get the transpose of the Jacobian
-            Matrix jacPointToPointTransposed = jacPointToPoint.copy().transpose();
-
-            // Option to use uncorrelated  MS errors
-            // This is similar to what is done in lcsim seedtracker
-            // The msCov below holds the MS errors
-            // This is for testing purposes only.
-            boolean useUncorrMS = false;
-            Matrix msCov = new Matrix(5, 5);
-
-            // Propagate the MS covariance matrix (in the curvilinear frame) to this strip position
-            msCov = msCov.times(jacPointToPointTransposed);
-            msCov = jacPointToPoint.times(msCov);
-
-            // Get the MS covariance for the measurements in the measurement frame
-            Matrix proL2mTransposed = proL2m.copy().transpose();
-
-            Matrix measMsCov = proL2m.times((msCov.getMatrix(3, 4, 3, 4)).times(proL2mTransposed));
-
-            if (debug) {
-                System.out.println("HpsGblFitter: " + " msCov at this point:");
-                msCov.print(4, 6);
-                System.out.println("HpsGblFitter: " + "measMsCov at this point:");
-                measMsCov.print(4, 6);
-            }
-
-            GblPoint point = new GblPoint(jacPointToPoint);
-            //Add measurement to the point
-            point.addMeasurement(proL2m, meas, measPrec, 0.);
-            //Add scatterer in curvilinear frame to the point
-            // no direction in this frame
-            Vector scat = new Vector(2);
-
-            // Scattering angle in the curvilinear frame
-            //Note the cosLambda to correct for the projection in the phi direction
-            Vector scatErr = new Vector(2);
-            scatErr.set(0, strip.getScatterAngle());
-            scatErr.set(1, strip.getScatterAngle() / cosLambda);
-            Vector scatPrec = new Vector(2);
-            scatPrec.set(0, 1.0 / (scatErr.get(0) * scatErr.get(0)));
-            scatPrec.set(1, 1.0 / (scatErr.get(1) * scatErr.get(1)));
-
-            // add scatterer if not using the uncorrelated MS covariances for testing
-            if (!useUncorrMS) {
-                point.addScatterer(scat, scatPrec);
-                if (debug) {
-                    System.out.println("HpsGblFitter: " + "adding scatError to this point:");
-                    scatErr.print(4, 6);
-                }
-            }
-
-            // Add this GBL point to list that will be used in fit
-            listOfPoints.add(point);
-            int iLabel = listOfPoints.size();
-
-            // Update MS covariance matrix 
-            msCov.set(1, 1, msCov.get(1, 1) + scatErr.get(0) * scatErr.get(0));
-            msCov.set(2, 2, msCov.get(2, 2) + scatErr.get(1) * scatErr.get(1));
-
-            //// Calculate global derivatives for this point
-            // track direction in tracking/global frame
-            Hep3Vector tDirGlobal = new BasicHep3Vector(cosPhi * cosLambda, sinPhi * cosLambda, sinLambda);
-
-            // Cross-check that the input is consistent
-            if (VecOp.sub(tDirGlobal, strip.getTrackDirection()).magnitude() > 0.00001) {
-                throw new RuntimeException("track directions are inconsistent: " + tDirGlobal.toString() + " and " + strip.getTrackDirection().toString());
-            }
-            // rotate track direction to measurement frame     
-            Hep3Vector tDirMeas = new BasicHep3Vector(VecOp.dot(tDirGlobal, u), VecOp.dot(tDirGlobal, v), VecOp.dot(tDirGlobal, w));
-            // TODO this is a trivial one. Fix it.
-            Hep3Vector normalMeas = new BasicHep3Vector(VecOp.dot(w, u), VecOp.dot(w, v), VecOp.dot(w, w));
-
-            // vector coplanar with measurement plane from origin to prediction
-            Hep3Vector tPosMeas = strip.getTrackPos();
-
-            // measurements: non-measured directions 
-            double vmeas = 0.;
-            double wmeas = 0.;
-
-            // calculate and add derivatives to point
-            GlobalDers glDers = new GlobalDers(strip.getId(), meas.get(0), vmeas, wmeas, tDirMeas, tPosMeas, normalMeas);
-
-            //TODO find a more robust way to get half.
-            boolean isTop = Math.sin(strip.getTrackLambda()) > 0;
-
-            // Get the list of millepede parameters
-            List<MilleParameter> milleParameters = glDers.getDers(isTop);
-
-            // need to make vector and matrices for interface
-            List<Integer> labGlobal = new ArrayList<Integer>();
-            Matrix addDer = new Matrix(1, milleParameters.size());
-            for (int i = 0; i < milleParameters.size(); ++i) {
-                labGlobal.add(milleParameters.get(i).getId());
-                addDer.set(0, i, milleParameters.get(i).getValue());
-            }
-            point.addGlobals(labGlobal, addDer);
-            String logders = "";
-            for (int i = 0; i < milleParameters.size(); ++i) {
-                logders += labGlobal.get(i) + "\t" + addDer.get(0, i) + "\n";
-            }
-            logger.info("\n" + logders);
-
-            logger.info("uRes " + strip.getId() + " uRes " + uRes + " pred (" + strip.getTrackPos().x() + "," + strip.getTrackPos().y() + "," + strip.getTrackPos().z() + ") s(3D) " + strip.getPath3D());
-
-            //go to next point
-            s += step;
-
-        } //strips
-
-        //create the trajectory
-        GblTrajectory traj = new GblTrajectory(listOfPoints); //,seedLabel, clSeed);
-
-        if (!traj.isValid()) {
-            System.out.println("HpsGblFitter: " + " Invalid GblTrajectory -> skip");
-            return null; //1;//INVALIDTRAJ;
-        }
-
-        // print the trajectory
-        if (debug) {
-            System.out.println("%%%% Gbl Trajectory ");
-            traj.printTrajectory(1);
-            traj.printData();
-            traj.printPoints(4);
-        }
-        // fit trajectory
-        double[] dVals = new double[2];
-        int[] iVals = new int[1];
-        traj.fit(dVals, iVals, "");
-        logger.info("fit result: Chi2=" + dVals[0] + " Ndf=" + iVals[0] + " Lost=" + dVals[1]);
-        Vector aCorrection = new Vector(5);
-        SymMatrix aCovariance = new SymMatrix(5);
-        traj.getResults(1, aCorrection, aCovariance);
-        if (debug) {
-            System.out.println(" cor ");
-            aCorrection.print(6, 4);
-            System.out.println(" cov ");
-            aCovariance.print(6, 4);
-        }
-
-        logger.fine("locPar " + aCorrection.toString());
-
-//
-        return new FittedGblTrajectory(traj, dVals[0], iVals[0], dVals[1]);
-    }
-
-    @Override
-    protected void detectorChanged(Detector detector) {
-    }
-
-    private static Matrix gblSimpleJacobianLambdaPhi(double ds, double cosl, double bfac) {
-        /**
-         * Simple jacobian: quadratic in arc length difference. using lambda phi
-         * as directions
-         *
-         * @param ds: arc length difference
-         * @type ds: float
-         * @param cosl: cos(lambda)
-         * @type cosl: float
-         * @param bfac: Bz*c
-         * @type bfac: float
-         * @return: jacobian to move by 'ds' on trajectory
-         * @rtype: matrix(float) ajac(1,1)= 1.0D0 ajac(2,2)= 1.0D0
-         * ajac(3,1)=-DBLE(bfac*ds) ajac(3,3)= 1.0D0
-         * ajac(4,1)=-DBLE(0.5*bfac*ds*ds*cosl) ajac(4,3)= DBLE(ds*cosl)
-         * ajac(4,4)= 1.0D0 ajac(5,2)= DBLE(ds) ajac(5,5)= 1.0D0 ''' jac =
-         * np.eye(5) jac[2, 0] = -bfac * ds jac[3, 0] = -0.5 * bfac * ds * ds *
-         * cosl jac[3, 2] = ds * cosl jac[4, 1] = ds return jac
-         */
-        Matrix jac = new Matrix(5, 5);
-        jac.UnitMatrix();
-        jac.set(2, 0, -bfac * ds);
-        jac.set(3, 0, -0.5 * bfac * ds * ds * cosl);
-        jac.set(3, 2, ds * cosl);
-        jac.set(4, 1, ds);
-        return jac;
-    }
-
-    private static class GlobalDers {
-
-        private final int _layer;
-        private final double _umeas; // measurement direction
-        private final double _vmeas; // unmeasured direction
-        private final double _wmeas; // normal to plane
-        private final Hep3Vector _t; // track direction
-        private final Hep3Vector _p; // track prediction
-        private final Hep3Vector _n; // normal to plane
-        private final Matrix _dm_dg; //Global derivaties of the local measurements
-        private final Matrix _dr_dm; //Derivatives of residuals w.r.t. measurement
-        private final Matrix _dr_dg; //Derivatives of residuals w.r.t. global parameters
-
-        public GlobalDers(int layer, double umeas, double vmeas, double wmeas, Hep3Vector tDir, Hep3Vector tPred, Hep3Vector normal) {
-            _layer = layer;
-            _umeas = umeas;
-            _vmeas = vmeas;
-            _wmeas = wmeas;
-            _t = tDir;
-            _p = tPred;
-            _n = normal;
-            // Derivatives of residuals w.r.t. perturbed measurement 
-            _dr_dm = getResDers();
-            // Derivatives of perturbed measurement w.r.t. global parameters
-            _dm_dg = getMeasDers();
-            // Calculate, by chain rule, derivatives of residuals w.r.t. global parameters
-            _dr_dg = _dr_dm.times(_dm_dg);
-
-            //logger.log(Level.FINER," dr_dm\n"+ _dr_dm.toString() + "\ndm_dg\n" + _dm_dg.toString() + "\ndr_dg\n" +_dr_dg.toString());
-            //logger.info("loglevel " + logger.getLevel().toString());
-            //print 'dm_dg'
-            //print dm_dg
-            //print 'dr_dm'
-            //print dr_dm
-            //print 'dr_dg'
-            //print self.dr_dg
-        }
-
-        /**
-         * Derivative of mt, the perturbed measured coordinate vector m w.r.t.
-         * to global parameters: u,v,w,alpha,beta,gamma
-         */
-        private Matrix getMeasDers() {
-
-            //Derivative of the local measurement for a translation in u
-            double dmu_du = 1.;
-            double dmv_du = 0.;
-            double dmw_du = 0.;
-            // Derivative of the local measurement for a translation in v
-            double dmu_dv = 0.;
-            double dmv_dv = 1.;
-            double dmw_dv = 0.;
-            // Derivative of the local measurement for a translation in w
-            double dmu_dw = 0.;
-            double dmv_dw = 0.;
-            double dmw_dw = 1.;
-            // Derivative of the local measurement for a rotation around u-axis (alpha)
-            double dmu_dalpha = 0.;
-            double dmv_dalpha = _p.z(); // self.wmeas
-            double dmw_dalpha = -1.0 * _p.y(); // -1.0 * self.vmeas
-            // Derivative of the local measurement for a rotation around v-axis (beta)
-            double dmu_dbeta = -1.0 * _p.z(); //-1.0 * self.wmeas
-            double dmv_dbeta = 0.;
-            double dmw_dbeta = _p.x(); //self.umeas
-            // Derivative of the local measurement for a rotation around w-axis (gamma)
-            double dmu_dgamma = _p.y(); // self.vmeas
-            double dmv_dgamma = -1.0 * _p.x();  // -1.0 * self.umeas 
-            double dmw_dgamma = 0.;
-            // put into matrix
-            Matrix dm_dg = new Matrix(3, 6);
-            dm_dg.set(0, 0, dmu_du);
-            dm_dg.set(0, 1, dmu_dv);
-            dm_dg.set(0, 2, dmu_dw);
-            dm_dg.set(0, 3, dmu_dalpha);
-            dm_dg.set(0, 4, dmu_dbeta);
-            dm_dg.set(0, 5, dmu_dgamma);
-            dm_dg.set(1, 0, dmv_du);
-            dm_dg.set(1, 1, dmv_dv);
-            dm_dg.set(1, 2, dmv_dw);
-            dm_dg.set(1, 3, dmv_dalpha);
-            dm_dg.set(1, 4, dmv_dbeta);
-            dm_dg.set(1, 5, dmv_dgamma);
-            dm_dg.set(2, 0, dmw_du);
-            dm_dg.set(2, 1, dmw_dv);
-            dm_dg.set(2, 2, dmw_dw);
-            dm_dg.set(2, 3, dmw_dalpha);
-            dm_dg.set(2, 4, dmw_dbeta);
-            dm_dg.set(2, 5, dmw_dgamma);
-            //dmdg = np.array([[dmu_du, dmu_dv, dmu_dw, dmu_dalpha, dmu_dbeta, dmu_dgamma],[dmv_du, dmv_dv, dmv_dw, dmv_dalpha, dmv_dbeta, dmv_dgamma],[dmw_du, dmw_dv, dmw_dw, dmw_dalpha, dmw_dbeta, dmw_dgamma]])
-            return dm_dg;
-        }
-
-        /**
-         * Derivatives of the local perturbed residual w.r.t. the measurements m
-         * (u,v,w)'
-         */
-        private Matrix getResDers() {
-            double tdotn = VecOp.dot(_t, _n);
-            Matrix dr_dm = Matrix.identity(3, 3);
-            //print 't ', self.t, ' n ', self.n, ' dot(t,n) ', tdotn
-            //logger.info("t " + _t.toString() +" n " + _n.toString() + " dot(t,n) " + tdotn);
-            double delta, val;
-            for (int i = 0; i < 3; ++i) {
-                for (int j = 0; j < 3; ++j) {
-                    delta = i == j ? 1. : 0.;
-                    val = delta - _t.v()[i] * _n.v()[j] / tdotn;
-                    dr_dm.set(i, j, val);
-                }
-            }
-            return dr_dm;
-        }
-
-        /**
-         * Turn derivative matrix into @Milleparameter
-         *
-         * @param isTop - top or bottom track
-         * @return list of @Milleparameters
-         */
-        private List<MilleParameter> getDers(boolean isTop) {
-            int transRot;
-            int direction;
-            int label;
-            double value;
-            List<MilleParameter> milleParameters = new ArrayList<MilleParameter>();
-            int topBot = isTop == true ? 1 : 2;
-            for (int ip = 1; ip < 7; ++ip) {
-                if (ip > 3) {
-                    transRot = 2;
-                    direction = ((ip - 1) % 3) + 1;
-                } else {
-                    transRot = 1;
-                    direction = ip;
-                }
-                label = topBot * MilleParameter.half_offset + transRot * MilleParameter.type_offset + direction * MilleParameter.dimension_offset + _layer;
-                value = _dr_dg.get(0, ip - 1);
-                MilleParameter milleParameter = new MilleParameter(label, value, 0.0);
-                milleParameters.add(milleParameter);
-            }
-            return milleParameters;
-        }
-
-
-        /*
-
-         class globalDers:
-         def __init__(self,layer,umeas,vmeas,wmeas, tDir, tPred, normal):
-         self.layer = layer # measurement direction
-         self.umeas = umeas # measurement direction
-         self.vmeas = vmeas # unmeasured direction
-         self.wmeas = wmeas # normal to plane
-         self.t = tDir # track direction
-         self.p = tPred # track prediction
-         self.n = normal # normal to plane
-         # Global derivaties of the local measurements
-         self.dm_dg = self.getMeasDers()
-         # Derivatives of residuals w.r.t. measurement 
-         self.dr_dm = self.getResDers()
-         # Derivatives of residuals w.r.t. global parameters
-         self.dr_dg = np.dot(self.dr_dm, self.dm_dg)
-         #print 'dm_dg'
-         #print dm_dg
-         #print 'dr_dm'
-         #print dr_dm
-         #print 'dr_dg'
-         #print self.dr_dg
-
-         def dump(self):
-         print 'globalDers:'
-         print 'layer ', self.layer
-         print 'umeas ', self.umeas, ' vmeas ', self.vmeas, ' wmeas ', self.wmeas
-         print 't ', self.t, ' p ', self.p, ' n ', self.n
-         print 'dm_dg\n',self.dm_dg, '\ndr_dm\n',self.dr_dm,'\ndr_dg\n',self.dr_dg
-
-         def getDers(self,isTop):
-         half_offset = 10000 
-         translation_offset = 1000
-         direction_offset = 100
-         topBot = 1
-         transRot = 1
-         direction = 1
-         if not isTop:
-         topBot = 2
-         res = {}
-         labels = []
-         ders = []
-         for ip, name in global_params.iteritems():
-         if ip > 3:
-         transRot = 2
-         direction = ((ip-1) % 3) + 1
-         else:
-         direction = ip
-         label = (int)(topBot * half_offset + transRot * translation_offset + direction * direction_offset + self.layer)
-         labels.append(label)
-         ders.append(self.dr_dg[0,ip-1])
-
-         return {'labels':np.array([labels]) , 'ders':np.array([ders])}
-
-
-
-
-         def getResDers(self):
-         # Derivatives of the local perturbed residual w.r.t. the measurements m (u,v,w)'
-         tdotn = np.dot(self.t.T,self.n)
-         drdg = np.eye(3)
-         #print 't ', self.t, ' n ', self.n, ' dot(t,n) ', tdotn
-         for i in range(3):
-         for j in range(3):
-         delta = 0.
-         if i==j:
-         delta = 1.       
-         drdg[i][j] = delta - self.t[i]*self.n[j]/tdotn[0]
-         return drdg
-
-
-
-
-         def getMeasDers(self):
-         # Derivative of mt, the perturbed measured coordinate vector m 
-         # w.r.t. to global parameters: u,v,w,alpha,beta,gamma
-
-         # Derivative of the local measurement for a translation in u
-         dmu_du = 1.
-         dmv_du = 0.
-         dmw_du = 0.
-         # Derivative of the local measurement for a translation in v
-         dmu_dv = 0.
-         dmv_dv = 1.
-         dmw_dv = 0.
-         # Derivative of the local measurement for a translation in w
-         dmu_dw = 0.
-         dmv_dw = 0.
-         dmw_dw = 1.
-         # Derivative of the local measurement for a rotation around u-axis (alpha)
-         dmu_dalpha = 0.
-         dmv_dalpha = self.p[2] # self.wmeas
-         dmw_dalpha = -1.0 * self.p[1] # -1.0 * self.vmeas
-         # Derivative of the local measurement for a rotation around v-axis (beta)
-         dmu_dbeta = -1.0 * self.p[2] #-1.0 * self.wmeas
-         dmv_dbeta = 0.
-         dmw_dbeta = self.p[0] #self.umeas
-         # Derivative of the local measurement for a rotation around w-axis (gamma)
-         dmu_dgamma = self.p[1] # self.vmeas
-         dmv_dgamma = -1.0 * self.p[0]  # -1.0 * self.umeas 
-         dmw_dgamma = 0.
-         # put into matrix
-         dmdg = np.array([[dmu_du, dmu_dv, dmu_dw, dmu_dalpha, dmu_dbeta, dmu_dgamma],[dmv_du, dmv_dv, dmv_dw, dmv_dalpha, dmv_dbeta, dmv_dgamma],[dmw_du, dmw_dv, dmw_dw, dmw_dalpha, dmw_dbeta, dmw_dgamma]])
-         #print dmw_dbeta
-         #dmdg = np.array([[dmu_du, dmu_dv],[dmu_dw, dmu_dalpha], [dmw_dbeta, dmw_dgamma]])
-         return dmdg
-         */
+        // Put the tracks back into the event and exit
+        int flag = 1 << LCIOConstants.TRBIT_HITS;
+        event.put(outputCollectionName, refittedTracks, Track.class, flag);
     }
 }

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	Thu Oct  1 19:49:39 2015
@@ -26,7 +26,6 @@
 import org.lcsim.event.base.BaseTrack;
 import org.lcsim.event.base.BaseTrackState;
 import org.lcsim.fit.helicaltrack.HelicalTrackFit;
-import org.lcsim.fit.helicaltrack.HelicalTrackHit;
 import org.lcsim.lcio.LCIOConstants;
 import org.lcsim.recon.tracking.seedtracker.SeedCandidate;
 import org.lcsim.recon.tracking.seedtracker.SeedTrack;
@@ -42,7 +41,7 @@
 public class MakeGblTracks {
 
     private String _TrkCollectionName = "GBLTracks";
-    private static Logger logger = LogUtil.create(MakeGblTracks.class, new BasicLogFormatter(), Level.INFO);
+    private static Logger logger = LogUtil.create(MakeGblTracks.class, new BasicLogFormatter(), Level.OFF);
 
     /**
      * Creates a new instance of MakeTracks.

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