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); }