Print

Print


Author: mgraham
Date: Thu Oct 30 08:17:08 2014
New Revision: 1344

Log:
A couple of changes so that MS doesn't abort for 0 b-field 

Modified:
    java/trunk/tracking/src/main/java/org/hps/recon/tracking/MultipleScattering.java

Modified: java/trunk/tracking/src/main/java/org/hps/recon/tracking/MultipleScattering.java
 =============================================================================
--- java/trunk/tracking/src/main/java/org/hps/recon/tracking/MultipleScattering.java	(original)
+++ java/trunk/tracking/src/main/java/org/hps/recon/tracking/MultipleScattering.java	Thu Oct 30 08:17:08 2014
@@ -17,8 +17,10 @@
 import org.lcsim.recon.tracking.seedtracker.ScatterAngle;
 
 /**
- * Extention of lcsim class to allow use of local classes. Finds scatter points and magnitude from
+ * Extention of lcsim class to allow use of local classes. Finds scatter points
+ * and magnitude from
  * detector geometry directly.
+ *
  * @author Per Hansson <[log in to unmask]>
  */
 public class MultipleScattering extends org.lcsim.recon.tracking.seedtracker.MultipleScattering {
@@ -28,9 +30,11 @@
     }
 
     /**
-     * Override lcsim version and select material manager depending on object type. This allows to
-     * use a local extension of the material manager in teh lcsim track fitting code.
-     * 
+     * Override lcsim version and select material manager depending on object
+     * type. This allows to
+     * use a local extension of the material manager in teh lcsim track fitting
+     * code.
+     *
      * @param helix
      * @return a list of ScatterAngle.
      */
@@ -50,8 +54,9 @@
     }
 
     /**
-     * Extra interface to keep a function returning the same type as the lcsim version
-     * 
+     * Extra interface to keep a function returning the same type as the lcsim
+     * version
+     *
      * @param helix
      * @return a list of ScatterAngle.
      */
@@ -62,19 +67,19 @@
 
     /**
      * Find scatter points along helix using the local material manager
-     * 
+     *
      * @param helix
      * @return the points of scatter along the helix
      */
     public ScatterPoints FindHPSScatterPoints(HelicalTrackFit helix) {
         if (_debug) {
             System.out.printf("\n%s: FindHPSScatters() for helix:\n%s\n", this.getClass().getSimpleName(), helix.toString());
-            System.out.printf("%s: momentum is p=%f,R=%f,B=%f \n", this.getClass().getSimpleName(),helix.p(Math.abs(_bfield)),helix.R(),_bfield);
-        }
-        
-        // Check that B Field is set
-        if (_bfield == 0.)
-            throw new RuntimeException("B Field must be set before calling FindScatters method");
+            System.out.printf("%s: momentum is p=%f,R=%f,B=%f \n", this.getClass().getSimpleName(), helix.p(Math.abs(_bfield)), helix.R(), _bfield);
+        }
+//        MG TURN THIS OFF SO IT DOESN'T ABORT STRAIGHT TRACKS
+//        // Check that B Field is set
+//        if (_bfield == 0.)
+//            throw new RuntimeException("B Field must be set before calling FindScatters method");
 
         // Create a new list to contain the mutliple scatters
         // List<ScatterAngle> scatters = new ArrayList<ScatterAngle>();
@@ -101,7 +106,6 @@
                     System.out.printf("%s: intersection position %s\n", this.getClass().getSimpleName(), pos.toString());
 
                 // find the track direction at the plane
-
                 double s = HelixUtils.PathToXPlane(helix, pos.x(), 0., 0).get(0);
 
                 if (_debug)
@@ -118,7 +122,10 @@
                 if (_debug)
                     System.out.printf("%s: material traversed: %f R.L. (%fmm) \n", this.getClass().getSimpleName(), radlen, vol.getMaterialTraversed(dir));
 
-                double p = helix.p(this._bfield);
+//                double p = helix.p(this._bfield);
+                double p = 1.0; // set default momentum to 1.0
+                if (_bfield != 0)
+                    p = helix.p(this._bfield);
                 double msangle = this.msangle(p, radlen);
 
                 ScatterAngle scat = new ScatterAngle(s, msangle);
@@ -129,12 +136,10 @@
                 ScatterPoint scatterPoint = new ScatterPoint(vol.getDetectorElement(), scat);
                 scatters.addPoint(scatterPoint);
 
-            } else {
+            } else
 
                 if (_debug)
                     System.out.printf("\n%s: helix did not intersect this volume \n", this.getClass().getSimpleName());
-
-            }
 
         }
 
@@ -144,20 +149,18 @@
         if (_debug) {
             System.out.printf("\n%s: found %d scatters for this helix:\n", this.getClass().getSimpleName(), scatters.getPoints().size());
             System.out.printf("%s: %10s %10s\n", this.getClass().getSimpleName(), "s (mm)", "theta(rad)");
-            for (ScatterPoint p : scatters.getPoints()) {
+            for (ScatterPoint p : scatters.getPoints())
                 System.out.printf("%s: %10.2f %10f\n", this.getClass().getSimpleName(), p.getScatterAngle().PathLen(), p.getScatterAngle().Angle());
-            }
         }
         return scatters;
     }
 
     public Hep3Vector getHelixIntersection(HelicalTrackFit helix, ScatteringDetectorVolume plane) {
 
-        if (SiStripPlane.class.isInstance(plane)) {
+        if (SiStripPlane.class.isInstance(plane))
             return getHelixIntersection(helix, (SiStripPlane) plane);
-        } else {
+        else
             throw new UnsupportedOperationException("This det volume type is not supported yet.");
-        }
     }
 
     /*
@@ -193,7 +196,6 @@
         // Consider the plane as pure x-plane i.e. no rotations
         // -> this is not very general, as it assumes that strips are (mostly) along y -> FIX
         // THIS!?
-
         // Transformation from tracking to detector frame
         Hep3Vector pos_det = VecOp.mult(VecOp.inverse(CoordinateTransformations.getMatrix()), pos);
         Hep3Vector direction_det = VecOp.mult(VecOp.inverse(CoordinateTransformations.getMatrix()), direction);
@@ -212,7 +214,6 @@
         double delta_w = -1.0 * pos_sensor.z() / direction_sensor.z();
 
         // find the point where it crossed the plane
-
         Hep3Vector pos_int = VecOp.add(pos_sensor, VecOp.mult(delta_w, direction_sensor));
         Hep3Vector pos_int_det = plane.getSensor().getReadoutElectrodes(ChargeCarrier.HOLE).getLocalToGlobal().transformed(pos_int);
         // find the intercept in the tracking frame
@@ -229,14 +230,12 @@
             System.out.printf("%s: Inside result sensor: %s module: %s\n", this.getClass().getSimpleName(), result_inside.toString(), result_inside_module.toString());
 
         boolean isInsideSolid = false;
-        if (result_inside.equals(Inside.INSIDE) || result_inside.equals(Inside.SURFACE)) {
+        if (result_inside.equals(Inside.INSIDE) || result_inside.equals(Inside.SURFACE))
             isInsideSolid = true;
-        }
 
         boolean isInsideSolidModule = false;
-        if (result_inside_module.equals(Inside.INSIDE) || result_inside_module.equals(Inside.SURFACE)) {
+        if (result_inside_module.equals(Inside.INSIDE) || result_inside_module.equals(Inside.SURFACE))
             isInsideSolidModule = true;
-        }
 
         boolean isInside = true;
         if (Math.abs(pos_int.x()) > plane.getMeasuredDimension() / 2.0) {
@@ -254,30 +253,27 @@
         if (!isInside)
             return null;
 
-        if (this._debug) {
+        if (this._debug)
             System.out.printf("%s: found simple intercept at %s \n", this.getClass().getSimpleName(), pos_int_trk.toString());
-        }
 
         // Check if it's inside sensor and module and if it contradicts the manual calculation
         // For now: trust manual calculation and output warning if it's outside BOTH sensor AND module 
-
         if (!isInsideSolid) {
             if (_debug)
                 System.out.printf("%s: manual calculation says inside sensor, inside solid says outside -> contradiction \n", this.getClass().getSimpleName());
             if (isInsideSolidModule) {
                 if (_debug)
                     System.out.printf("%s: this intercept is outside sensor but inside module\n", this.getClass().getSimpleName());
-            } else {
+            } else
                 if (_debug)
                     System.out.printf("%s: warning: this intercept at %s, in sensor frame %s, (sensor origin at %s ) is outside sensor and module!\n", this.getClass().getSimpleName(), pos_int_trk.toString(), pos_int.toString(), plane.origin().toString());
-            }
         }
 
         // TODO Catch special cases where the incidental iteration procedure seem to fail 
         if (helix.p(Math.abs(_bfield)) < 0.5) {
 
             if (this._debug)
-                System.out.printf("%s: momentum is low (p=%f,R=%f,B=%f), skip the iterative calculation\n", this.getClass().getSimpleName(),helix.p(Math.abs(_bfield)),helix.R(),_bfield);
+                System.out.printf("%s: momentum is low (p=%f,R=%f,B=%f), skip the iterative calculation\n", this.getClass().getSimpleName(), helix.p(Math.abs(_bfield)), helix.R(), _bfield);
 
             return pos_int_trk;
         }
@@ -293,36 +289,31 @@
             return pos_int_trk;
         }
 
-        if (this._debug) {
+        if (this._debug)
             System.out.printf("%s: iterative helix intercept point at %s (diff to approx: %s) \n", this.getClass().getSimpleName(), pos_iter_trk.toString(), VecOp.sub(pos_iter_trk, pos_int_trk).toString());
-        }
 
         // find position in sensor frame
         Hep3Vector pos_iter_det = VecOp.mult(VecOp.inverse(CoordinateTransformations.getMatrix()), pos_iter_trk);
         Hep3Vector pos_iter_sensor = plane.getSensor().getGeometry().getGlobalToLocal().transformed(VecOp.mult(VecOp.inverse(CoordinateTransformations.getMatrix()), pos_iter_trk));
 
-        if (this._debug) {
+        if (this._debug)
             System.out.printf("%s: found iterative helix intercept in sensor coordinates at %s\n", this.getClass().getSimpleName(), pos_iter_sensor.toString());
-        }
-        
+
         result_inside = plane.getDetectorElement().getGeometry().getPhysicalVolume().getMotherLogicalVolume().getSolid().inside(pos_iter_sensor);
         result_inside_module = plane.getSensor().getGeometry().getDetectorElement().getParent().getGeometry().inside(pos_iter_det);
 
-        if (this._debug) {
+        if (this._debug)
             System.out.printf("%s: Inside result sensor: %s module: %s\n", this.getClass().getSimpleName(), result_inside.toString(), result_inside_module.toString());
-        }
-        
+
         isInsideSolid = false;
-        
-        if (result_inside.equals(Inside.INSIDE) || result_inside.equals(Inside.SURFACE)) {
+
+        if (result_inside.equals(Inside.INSIDE) || result_inside.equals(Inside.SURFACE))
             isInsideSolid = true;
-        }
 
         isInsideSolidModule = false;
-        
-        if (result_inside_module.equals(Inside.INSIDE) || result_inside_module.equals(Inside.SURFACE)) {
+
+        if (result_inside_module.equals(Inside.INSIDE) || result_inside_module.equals(Inside.SURFACE))
             isInsideSolidModule = true;
-        }
 
         isInside = true;
         if (Math.abs(pos_iter_sensor.x()) > plane.getMeasuredDimension() / 2.0) {
@@ -340,28 +331,22 @@
         // Check if it's inside sensor and module and if it contradicts the manual calculation
         // For now: trust manual calculation and output warning if it's outside BOTH sensor AND
         // module -> FIX THIS!?
-
         if (!isInsideSolid) {
-            if (_debug) {
+            if (_debug)
                 System.out.printf("%s: manual iterative calculation says inside sensor, inside solid says outside -> contradiction \n", this.getClass().getSimpleName());
-            }
             if (isInsideSolidModule) {
-                if (_debug) {
+                if (_debug)
                     System.out.printf("%s: this iterative intercept is outside sensor but inside module\n", this.getClass().getSimpleName());
-                }
-            } else {
-                if (_debug) {
+            } else
+                if (_debug)
                     System.out.printf("%s: warning: this iterative intercept %s, sensor frame %s, (sensor origin %s ) is outside sensor and module!\n", this.getClass().getSimpleName(), pos_iter_trk.toString(), pos_iter_sensor.toString(), plane.origin().toString());
-                }
-            }
         }
 
         if (!isInside)
             return null;
 
-        if (this._debug) {
+        if (this._debug)
             System.out.printf("%s: found intercept at %s \n", this.getClass().getSimpleName(), pos_iter_trk.toString());
-        }
 
         return pos_iter_trk;
     }
@@ -377,7 +362,8 @@
     }
 
     /**
-     * Nested class to encapsulate the scatter angles and which detector element it is related to
+     * Nested class to encapsulate the scatter angles and which detector element
+     * it is related to
      */
     public class ScatterPoint implements Comparable<ScatterPoint> {
 
@@ -405,7 +391,7 @@
 
     /**
      * Nested class to encapsulate a list of scatters
-     * 
+     *
      */
     public class ScatterPoints {
 
@@ -435,11 +421,9 @@
         }
 
         public ScatterPoint getScatterPoint(IDetectorElement detectorElement) {
-            for (ScatterPoint p : _points) {
-                if (p.getDet().equals(detectorElement)) {
+            for (ScatterPoint p : _points)
+                if (p.getDet().equals(detectorElement))
                     return p;
-                }
-            }
             return null;
         }
     }