Print

Print


Author: [log in to unmask]
Date: Mon Feb  2 16:17:50 2015
New Revision: 2022

Log:
Adding Gbl track refit to event. Need to actually correct the helix pars still.

Added:
    java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/MakeGblTracks.java
Modified:
    java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/GBLDriver.java
    java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/GBLOutput.java
    java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/HpsGblFitter.java
    java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/HpsGblRefitter.java

Modified: java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/GBLDriver.java
 =============================================================================
--- java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/GBLDriver.java	(original)
+++ java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/GBLDriver.java	Mon Feb  2 16:17:50 2015
@@ -35,20 +35,24 @@
 		_debug = debug;
 	}
 	
-	public void setMC(boolean mcflag) {
+	public void setIsMC(boolean mcflag) {
 		_isMC = mcflag;
 	}
 	
 	protected void detectorChanged(Detector det) {
-		 Hep3Vector bfield = det.getFieldMap().getField(new BasicHep3Vector(0., 0., 1.));
+	    System.out.printf("%s: detectorChanged\n",getClass().getSimpleName());
+        Hep3Vector bfieldvec = det.getFieldMap().getField(new BasicHep3Vector(0., 1., 0.));
+        double bfield = bfieldvec.y();
+        System.out.printf("%s: b-field %s\n",getClass().getSimpleName(),bfieldvec.toString());
 		 _materialManager = new MaterialSupervisor();
 		 _scattering = new MultipleScattering(_materialManager);
 		 _materialManager.buildModel(det);
-		 _scattering.setBField(Math.abs(bfield.z())); // only absolute of B is needed as it's used for momentum calculation only
-		 _gbl_fitter = new HpsGblFitter(bfield.z(), _scattering, _isMC);
+		 _scattering.setBField(Math.abs(bfield)); // only absolute of B is needed as it's used for momentum calculation only
+		 _gbl_fitter = new HpsGblFitter(bfield, _scattering, _isMC);
 		 if(!milleBinaryName.equalsIgnoreCase("")) {
 			 _gbl_fitter.setMilleBinary(new MilleBinary());
 		 }
+		 System.out.printf("%s: detectorChanged end\n",getClass().getSimpleName());
 	}
 
 	protected void process(EventHeader event) {

Modified: java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/GBLOutput.java
 =============================================================================
--- java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/GBLOutput.java	(original)
+++ java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/GBLOutput.java	Mon Feb  2 16:17:50 2015
@@ -316,8 +316,8 @@
                 		for (MCParticle particle : hit.getMCParticles())  System.out.printf("%s: %d p %s \n",this.getClass().getSimpleName(),particle.getPDGID(),particle.getMomentum().toString());
                 		System.out.printf("%s: these are sim hits in the event:\n",this.getClass().getSimpleName());
                 		for (SimTrackerHit simhit : simTrackerHits) System.out.printf("%s sim hit at %s with MC particle pdgid %d with p %s \n",this.getClass().getSimpleName(),simhit.getPositionVec().toString(),simhit.getMCParticle().getPDGID(),simhit.getMCParticle().getMomentum().toString());
-                		System.out.printf("%s: these are all the MC particles in the event:\n",this.getClass().getSimpleName());
-                		System.exit(1);
+                		//System.out.printf("%s: these are all the MC particles in the event:\n",this.getClass().getSimpleName());
+                		//System.exit(1);
                 	}
 
                 	if(_debug>0) {

Modified: java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/HpsGblFitter.java
 =============================================================================
--- java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/HpsGblFitter.java	(original)
+++ java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/HpsGblFitter.java	Mon Feb  2 16:17:50 2015
@@ -66,12 +66,14 @@
     }
 
     public HpsGblFitter(double Bz, MultipleScattering scattering, boolean isMCFlag) {
+        System.out.printf("%s: Constructor\n",getClass().getSimpleName());
         isMC = isMCFlag;
         _B = Bz;
         _bfac = Bz * Constants.fieldConversion;
         _trackHitUtils = new TrackerHitUtils();
         _scattering = scattering;
-        System.out.println("Constructor");
+        System.out.printf("%s: b-field set to %f (%f)\n",getClass().getSimpleName(), _B, _bfac);
+        System.out.printf("%s: Constructor end\n",getClass().getSimpleName());
     }
 
     public void setMilleBinary(MilleBinary mille) {

Modified: 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/HpsGblRefitter.java	Mon Feb  2 16:17:50 2015
@@ -2,16 +2,19 @@
 
 import hep.physics.vec.BasicHep3Vector;
 import hep.physics.vec.Hep3Vector;
+
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+
 import org.lcsim.event.EventHeader;
 import org.lcsim.event.GenericObject;
 import org.lcsim.event.LCRelation;
 import org.lcsim.event.Track;
 import org.lcsim.geometry.Detector;
+import org.lcsim.recon.tracking.seedtracker.MakeTracks;
 import org.lcsim.util.Driver;
 
 import static java.lang.Math.sin;
@@ -33,7 +36,7 @@
  */
 public class HpsGblRefitter extends Driver
 {
-
+    private enum gblFitResult {SUCCESS, FAILURE};
     private boolean _debug = false;
     private final String trackCollectionName = "MatchedTracks";
     private final String track2GblTrackRelationName = "TrackToGBLTrack";
@@ -42,6 +45,8 @@
     private MilleBinary mille;
     private String milleBinaryFileName = MilleBinary.DEFAULT_OUTPUT_FILE_NAME;
     private boolean writeMilleBinary = false;
+    
+    private MakeGblTracks _makeTracks = null;
 
     public void setDebug(boolean debug)
     {
@@ -60,6 +65,7 @@
 
     public HpsGblRefitter()
     {
+        _makeTracks = new MakeGblTracks();
     }
 
     @Override
@@ -81,9 +87,9 @@
     @Override
     protected void process(EventHeader event)
     {
-        Hep3Vector bfield = event.getDetector().getFieldMap().getField(new BasicHep3Vector(0., 0., 1.));
-        double By = bfield.y();
-        double bfac = 0.0002998 * By;
+        Hep3Vector bfieldvec = event.getDetector().getFieldMap().getField(new BasicHep3Vector(0., 0., 1.));
+        double bfield = bfieldvec.y();
+        double bfac = 0.0002998 * bfield;
         // get the tracks
 //        List<Track> tracks = null;
         if (event.hasCollection(Track.class, trackCollectionName)) {
@@ -116,13 +122,16 @@
         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>();
+        
         // 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
 
         //get the strip hit relations
@@ -144,16 +153,29 @@
             }
         }
 
-        Set<GBLTrackData> keys = stripsGblMap.keySet();
+        Map<GblTrajectory,Track> trackFits = new HashMap<GblTrajectory,Track>();
         int trackNum = 0;
-        for (GBLTrackData t : keys) {
-            int stat = fit(t, stripsGblMap.get(t), bfac);
+        for (GBLTrackData t : stripsGblMap.keySet()) {
+            GblTrajectory traj = fit(t, stripsGblMap.get(t), bfac);
             ++trackNum;
-        }
-
-    }
-
-    private int fit(GBLTrackData track, List<GBLStripClusterData> hits, double bfac)
+            if(traj!=null) {
+                if(_debug) System.out.printf("%s: GBL fit successful.\n",getClass().getSimpleName());
+                Track seed = gblToSeedMap.get(t);
+                trackFits.put(traj, seed);
+            } else {
+                if(_debug) System.out.printf("%s: GBL fit failed.\n",getClass().getSimpleName());                
+            }
+        }
+        if(_debug) System.out.printf("%s: Save %d/%d GBL fitted tracks in this event.\n",getClass().getSimpleName(),trackFits.size(), trackNum);    
+        
+        _makeTracks.Process(event, trackFits, bfield);
+
+        if(_debug) System.out.printf("%s: Done.\n",getClass().getSimpleName());
+        
+        
+    }
+
+    private GblTrajectory fit(GBLTrackData track, List<GBLStripClusterData> hits, double bfac)
     {
         // path length along trajectory
         double s = 0.;
@@ -381,7 +403,7 @@
 
         if (!traj.isValid()) {
             System.out.println("HpsGblFitter: " + " Invalid GblTrajectory -> skip");
-            return 1;//INVALIDTRAJ;
+            return null; //1;//INVALIDTRAJ;
         }
 
         // print the trajectory
@@ -414,7 +436,7 @@
             traj.milleOut(mille);
         }
 //
-        return 0;
+        return traj;
     }
 
     @Override

Added: 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	(added)
+++ java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/MakeGblTracks.java	Mon Feb  2 16:17:50 2015
@@ -0,0 +1,124 @@
+package org.hps.recon.tracking.gbl;
+
+import hep.physics.matrix.SymmetricMatrix;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import org.lcsim.event.EventHeader;
+import org.lcsim.event.Track;
+import org.lcsim.event.TrackerHit;
+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;
+
+public class MakeGblTracks {
+
+
+    private String _TrkCollectionName = "GblTracks";
+
+    /**
+     * Creates a new instance of MakeTracks.
+     */
+    public MakeGblTracks() {
+    }
+    
+    /**
+     * Process a Gbl track and store it into the event
+     * @param event event header
+     * @param track Gbl trajectory
+     * @param seed SeedTrack
+     * @param bfield magnetic field (used to turn curvature into momentum)
+     */
+    public void Process(EventHeader event, Map<GblTrajectory, Track> gblTrajectories, double bfield) {
+        
+        List<Track> tracks = new ArrayList<Track>();
+        
+        for(Entry<GblTrajectory, Track> entry : gblTrajectories.entrySet()) {
+            
+            GblTrajectory traj = entry.getKey();
+            Track seed = entry.getValue();
+
+            //  Initialize the reference point to the origin
+            double[] ref = new double[] {0., 0., 0.};
+            SeedTrack seedTrack = (SeedTrack) seed;
+            SeedCandidate trackseed = seedTrack.getSeedCandidate();
+
+            //  Create a new SeedTrack (SeedTrack extends BaseTrack)
+            SeedTrack trk = new SeedTrack();
+
+            //  Add the hits to the track
+            for (HelicalTrackHit hit : trackseed.getHits()) {
+                trk.addHit((TrackerHit) hit);
+            }
+
+            //  Retrieve the helix and save the relevant bits of helix info
+            HelicalTrackFit helix = trackseed.getHelix();
+            double gblParameters[] = getGblCorrectedHelixParameters(helix,traj);
+            trk.setTrackParameters(gblParameters, bfield); // Sets first TrackState.
+            //trk.setTrackParameters(helix.parameters(), bfield); // Sets first TrackState.
+            SymmetricMatrix gblCovariance = getGblCorrectedHelixCovariance(helix, traj);
+            trk.setCovarianceMatrix(gblCovariance); // Modifies first TrackState.
+            //trk.setCovarianceMatrix(helix.covariance()); // Modifies first TrackState.
+            trk.setChisq(helix.chisqtot());
+            trk.setNDF(helix.ndf()[0]+helix.ndf()[1]);
+
+            //  Flag that the fit was successful and set the reference point
+            trk.setFitSuccess(true);
+            trk.setReferencePoint(ref); // Modifies first TrackState.
+            trk.setRefPointIsDCA(true);
+
+            //      Set the strategy used to find this track
+            trk.setStratetgy(trackseed.getSeedStrategy());
+
+            //  Set the SeedCandidate this track is based on
+            trk.setSeedCandidate(trackseed);
+
+            // Check the track - hook for plugging in external constraint
+            //if ((_trackCheck != null) && (! _trackCheck.checkTrack(trk))) continue;
+
+            //  Add the track to the list of tracks
+            tracks.add((Track) trk);
+        }
+
+        // Put the tracks back into the event and exit
+        int flag = 1<<LCIOConstants.TRBIT_HITS;
+        event.put(_TrkCollectionName, tracks, Track.class, flag);
+
+        return;
+    }
+
+    /**
+     * Compute the track fit covariance matrix
+     * @param helix - original seed track
+     * @param traj - fitted GBL trajectory
+     * @return covariance matrix.
+     */
+    private SymmetricMatrix getGblCorrectedHelixCovariance(
+            HelicalTrackFit helix, GblTrajectory traj) {
+        // TODO Actually implement this method
+        return helix.covariance();
+    }
+
+    /**
+     * Compute the updated helix parameters.
+     * @param helix - original seed track
+     * @param traj - fitted GBL trajectory
+     * @return corrected parameters.
+     */
+    private double[] getGblCorrectedHelixParameters(HelicalTrackFit helix, GblTrajectory traj) {
+        //TODO Actually implement this method
+        return helix.parameters();
+    }
+    
+    public void setTrkCollectionName(String name) {
+        _TrkCollectionName = name;
+    }
+
+   
+   
+}