Print

Print


Author: [log in to unmask]
Date: Fri Aug 28 19:10:13 2015
New Revision: 3462

Log:
dedupe code

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/GblUtils.java
    java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/HpsGblFitter.java

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	Fri Aug 28 19:10:13 2015
@@ -477,29 +477,7 @@
                     if (_debug > 0) {
                         System.out.printf("%s: WARNING cannot find scatter for detector %s with strip cluster at %s\n", this.getClass(), ((RawTrackerHit) strip.getStrip().rawhits().get(0)).getDetectorElement().getName(), strip.origin().toString());
                     }
-                    //can be edge case where helix is outside, but close to sensor, so make a new scatter point assuming the helix does pass through the sensor
-                    DetectorPlane hitPlane = null;
-                    if (MaterialSupervisor.class.isInstance(_scattering.getMaterialManager())) {
-                        MaterialSupervisor matSup = (MaterialSupervisor) _scattering.getMaterialManager();
-                        IDetectorElement hitElement = ((RawTrackerHit) strip.getStrip().rawhits().get(0)).getDetectorElement();
-                        for (ScatteringDetectorVolume vol : matSup.getMaterialVolumes()) {
-                            if (vol.getDetectorElement() == hitElement) {
-                                hitPlane = (DetectorPlane) vol;
-                                break;
-                            }
-                        }
-                        if (hitPlane == null) {
-                            throw new RuntimeException("cannot find plane for hit!");
-                        } else {
-                            // find scatterlength
-                            double s_closest = HelixUtils.PathToXPlane(htf, hitPlane.origin().x(), 0., 0).get(0);
-                            double X0 = hitPlane.getMaterialTraversedInRL(HelixUtils.Direction(htf, s_closest));
-                            ScatterAngle scatterAngle = new ScatterAngle(s_closest, _scattering.msangle(htf.p(this._B.magnitude()), X0));
-                            scatAngle = scatterAngle.Angle();
-                        }
-                    } else {
-                        throw new UnsupportedOperationException("Should not happen. This problem is only solved with the MaterialSupervisor.");
-                    }
+                    scatAngle = GblUtils.estimateScatter(strip, htf, _scattering, _B.magnitude());
                 }
 
                 //print scatterer to file

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	Fri Aug 28 19:10:13 2015
@@ -1,89 +1,120 @@
 package org.hps.recon.tracking.gbl;
 
 import hep.physics.matrix.BasicMatrix;
+import org.hps.recon.tracking.MaterialSupervisor;
+import org.hps.recon.tracking.MultipleScattering;
+import org.lcsim.detector.IDetectorElement;
+import org.lcsim.event.RawTrackerHit;
+import org.lcsim.fit.helicaltrack.HelicalTrackFit;
+import org.lcsim.fit.helicaltrack.HelixUtils;
+import org.lcsim.recon.tracking.seedtracker.ScatterAngle;
 
 /**
  * A class providing various utilities related to GBL
- * 
+ *
  * @author Per Hansson Adrian <[log in to unmask]>
  *
  */
+public class GblUtils {
 
-public class GblUtils {
-	
-	private static GblUtils INSTANCE = null;
-	
-	private GblUtils() {
-	}
-	
-	public static GblUtils getInstance() {
-		if(INSTANCE == null) {
-			return new GblUtils();
-		} else {
-			return INSTANCE;
-		}
-	}
-	
-	
-	public BasicMatrix gblSimpleJacobianLambdaPhi(double ds,double cosl,double bfac) {
-		/*
-	     Simple jacobian: quadratic in arc length difference.
-	     using lambda phi as directions
+    private static GblUtils INSTANCE = null;
+
+    private GblUtils() {
+    }
+
+    public static GblUtils getInstance() {
+        if (INSTANCE == null) {
+            return new GblUtils();
+        } else {
+            return INSTANCE;
+        }
+    }
+
+    public BasicMatrix 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
-	  */
-		BasicMatrix mat = unitMatrix(5,5);
-		mat.setElement(2, 0, -bfac * ds);
-		mat.setElement(3, 0, -0.5 * bfac * ds * ds * cosl);
-		mat.setElement(3, 2, ds * cosl);
-		mat.setElement(4, 1, ds);
-		return mat;
-	 }
-		
-	 public BasicMatrix unitMatrix(int rows, int cols) {
-		BasicMatrix mat = new BasicMatrix(rows,cols);
-		for(int row=0;row!=mat.getNRows();row++) {
-			for(int col=0;col!=mat.getNColumns();col++) {
-				if(row!=col) mat.setElement(row, col, 0);
-				else mat.setElement(row, col, 1);
-			}
-		}
-		return mat;
-	 }
+         @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
+         */
+        BasicMatrix mat = unitMatrix(5, 5);
+        mat.setElement(2, 0, -bfac * ds);
+        mat.setElement(3, 0, -0.5 * bfac * ds * ds * cosl);
+        mat.setElement(3, 2, ds * cosl);
+        mat.setElement(4, 1, ds);
+        return mat;
+    }
 
-	 public BasicMatrix zeroMatrix(int rows, int cols) {
-		BasicMatrix mat = new BasicMatrix(rows,cols);
-		for(int row=0;row!=mat.getNRows();row++) {
-			for(int col=0;col!=mat.getNColumns();col++) {
-				mat.setElement(row, col, 0.);
-			}
-		}
-		return mat;
-	 }
+    public BasicMatrix unitMatrix(int rows, int cols) {
+        BasicMatrix mat = new BasicMatrix(rows, cols);
+        for (int row = 0; row != mat.getNRows(); row++) {
+            for (int col = 0; col != mat.getNColumns(); col++) {
+                if (row != col) {
+                    mat.setElement(row, col, 0);
+                } else {
+                    mat.setElement(row, col, 1);
+                }
+            }
+        }
+        return mat;
+    }
 
-	
+    public BasicMatrix zeroMatrix(int rows, int cols) {
+        BasicMatrix mat = new BasicMatrix(rows, cols);
+        for (int row = 0; row != mat.getNRows(); row++) {
+            for (int col = 0; col != mat.getNColumns(); col++) {
+                mat.setElement(row, col, 0.);
+            }
+        }
+        return mat;
+    }
 
+    public static double estimateScatter(HelicalTrackStripGbl strip, HelicalTrackFit htf, MultipleScattering scattering, double _B) {
+        //can be edge case where helix is outside, but close to sensor, so make a new scatter point assuming the helix does pass through the sensor
+        MaterialSupervisor.DetectorPlane hitPlane = null;
+        if (MaterialSupervisor.class.isInstance(scattering.getMaterialManager())) {
+            MaterialSupervisor matSup = (MaterialSupervisor) scattering.getMaterialManager();
+            IDetectorElement hitElement = ((RawTrackerHit) strip.getStrip().rawhits().get(0)).getDetectorElement();
+            for (MaterialSupervisor.ScatteringDetectorVolume vol : matSup.getMaterialVolumes()) {
+                if (vol.getDetectorElement() == hitElement) {
+                    hitPlane = (MaterialSupervisor.DetectorPlane) vol;
+                    break;
+                }
+            }
+            if (hitPlane == null) {
+                throw new RuntimeException("cannot find plane for hit!");
+            } else {
+                // find scatterlength
+                double s_closest = HelixUtils.PathToXPlane(htf, hitPlane.origin().x(), 0., 0).get(0);
+                double X0 = hitPlane.getMaterialTraversedInRL(HelixUtils.Direction(htf, s_closest));
+                ScatterAngle scatterAngle = new ScatterAngle(s_closest, scattering.msangle(htf.p(Math.abs(_B)), X0));
+                return scatterAngle.Angle();
+            }
+        } else {
+            throw new UnsupportedOperationException("Should not happen. This problem is only solved with the MaterialSupervisor.");
+        }
+    }
 }

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	Fri Aug 28 19:10:13 2015
@@ -7,7 +7,6 @@
 import hep.physics.vec.Hep3Matrix;
 import hep.physics.vec.Hep3Vector;
 import hep.physics.vec.VecOp;
-
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Comparator;
@@ -24,6 +23,7 @@
 import org.hps.recon.tracking.TrackUtils;
 import org.hps.recon.tracking.TrackerHitUtils;
 import org.lcsim.constants.Constants;
+import org.lcsim.detector.IDetectorElement;
 import org.lcsim.event.RawTrackerHit;
 import org.lcsim.event.Track;
 import org.lcsim.fit.helicaltrack.HelicalTrackCross;
@@ -39,7 +39,7 @@
  * Class to running GBL on HPS track.
  *
  * @author phansson
- * 
+ *
  * @version $Id:
  *
  */
@@ -66,14 +66,14 @@
     }
 
     public HpsGblFitter(double Bz, MultipleScattering scattering, boolean isMCFlag) {
-        System.out.printf("%s: Constructor\n",getClass().getSimpleName());
+        System.out.printf("%s: Constructor\n", getClass().getSimpleName());
         isMC = isMCFlag;
         _B = Bz;
         _bfac = Bz * Constants.fieldConversion;
         _trackHitUtils = new TrackerHitUtils();
         _scattering = scattering;
-        System.out.printf("%s: b-field set to %f (%f)\n",getClass().getSimpleName(), _B, _bfac);
-        System.out.printf("%s: Constructor end\n",getClass().getSimpleName());
+        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) {
@@ -110,17 +110,16 @@
         // The msCov below holds the MS errors
         // This is for testing purposes only.
         boolean useUncorrMS = false;
-        BasicMatrix msCov = GblUtils.getInstance().zeroMatrix(5, 5);
+//        BasicMatrix msCov = GblUtils.getInstance().zeroMatrix(5, 5);
 
         // 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
         // need to use pointer for TMatrix here?
-        Map<Integer, Matrix> proL2m_list = new HashMap<Integer, Matrix>();
+//        Map<Integer, Matrix> proL2m_list = new HashMap<Integer, Matrix>();
         // Save the association between strip cluster and label	
-        Map<HelicalTrackStrip, Integer> stripLabelMap = new HashMap<HelicalTrackStrip, Integer>();
-
+//        Map<HelicalTrackStrip, Integer> stripLabelMap = new HashMap<HelicalTrackStrip, Integer>();
         //start trajectory at refence point (s=0) - this point has no measurement
         GblPoint ref_point = new GblPoint(jacPointToPoint);
         listOfPoints.add(ref_point);
@@ -306,33 +305,10 @@
             if (scatter != null) {
                 scatAngle = scatter.getScatterAngle().Angle();
             } else {
-                System.out.printf("%s: WARNING cannot find scatter for detector %s with strip cluster at %s\n", this.getClass(), ((RawTrackerHit) strip.getStrip().rawhits().get(0)).getDetectorElement().getName(), strip.origin().toString());
-                //can be edge case where helix is outside, but close to sensor, so use hack with the sensor origin closest to hit
-                //TODO check if this really makes sense to do
-                DetectorPlane closest = null;
-                double dx = 999999.9;
-                if (MaterialSupervisor.class.isInstance(_scattering.getMaterialManager())) {
-                    MaterialSupervisor matSup = (MaterialSupervisor) _scattering.getMaterialManager();
-                    for (ScatteringDetectorVolume vol : matSup.getMaterialVolumes()) {
-                        DetectorPlane plane = (DetectorPlane) vol;
-                        double dx_loop = Math.abs(strip.origin().x() - plane.origin().x());
-                        if (dx_loop < dx) {
-                            dx = dx_loop;
-                            closest = plane;
-                        }
-                    }
-                    if (closest == null) {
-                        throw new RuntimeException("cannot find any plane that is close to strip!");
-                    } else {
-                        // find scatterlength
-                        double s_closest = HelixUtils.PathToXPlane(htf, closest.origin().x(), 0., 0).get(0);
-                        double X0 = closest.getMaterialTraversedInRL(HelixUtils.Direction(htf, s_closest));
-                        ScatterAngle scatterAngle = new ScatterAngle(s_closest, _scattering.msangle(htf.p(Math.abs(_B)), X0));
-                        scatAngle = scatterAngle.Angle();
-                    }
-                } else {
-                    throw new UnsupportedOperationException("Should not happen. This problem is only solved with the MaterialSupervisor.");
+                if (_debug) {
+                    System.out.printf("%s: WARNING cannot find scatter for detector %s with strip cluster at %s\n", this.getClass(), ((RawTrackerHit) strip.getStrip().rawhits().get(0)).getDetectorElement().getName(), strip.origin().toString());
                 }
+                scatAngle = GblUtils.estimateScatter(strip, htf, _scattering, _B);
             }
 
             // Scattering angle in the curvilinear frame
@@ -357,8 +333,8 @@
             int iLabel = listOfPoints.size();
 
             // Update MS covariance matrix 
-            msCov.setElement(1, 1, msCov.e(1, 1) + scatErr.e(0, 0) * scatErr.e(0, 0));
-            msCov.setElement(2, 2, msCov.e(2, 2) + scatErr.e(0, 1) * scatErr.e(0, 1));
+//            msCov.setElement(1, 1, msCov.e(1, 1) + scatErr.e(0, 0) * scatErr.e(0, 0));
+//            msCov.setElement(2, 2, msCov.e(2, 2) + scatErr.e(0, 1) * scatErr.e(0, 1));
 
             /*
 
@@ -407,21 +383,19 @@
         }
 
         // print the trajectory
-        if(_debug)
-        {
+        if (_debug) {
             System.out.println(" Gbl Trajectory ");
             _traj.printPoints(4);
         }
         // fit trajectory
         _traj.fit(m_chi2, m_ndf, m_lost_weight);
-        
+
         //cng
 //        System.out.println("fitting the traectory...");
 //        double[] retDVals = new double[2];
 //        int[] retIVals = new int[1];
 //        int success = _traj.fit(retDVals, retIVals, "");
         //cng
-
         if (_debug) {
             System.out.printf("%s:  Chi2  Fit: %f , %d , %d\n", this.getClass().getSimpleName(), m_chi2, m_ndf, m_lost_weight);
         }