lcsim/sandbox/Partridge
diff -u -r1.1 -r1.2
--- HelicalTrackFit.java 21 Nov 2007 16:24:27 -0000 1.1
+++ HelicalTrackFit.java 29 Nov 2007 19:42:40 -0000 1.2
@@ -3,13 +3,16 @@
*
* Created on March 25, 2006, 6:11 PM
*
- * $Id: HelicalTrackFit.java,v 1.1 2007/11/21 16:24:27 partridge Exp $
+ * $Id: HelicalTrackFit.java,v 1.2 2007/11/29 19:42:40 partridge Exp $
*/
package org.lcsim.fit.helicaltrack;
import hep.physics.matrix.SymmetricMatrix;
+import java.util.HashMap;
+import java.util.Map;
+
import org.lcsim.fit.circle.CircleFit;
import org.lcsim.fit.line.SlopeInterceptLineFit;
import org.lcsim.fit.zsegment.ZSegmentFit;
@@ -25,19 +28,20 @@
private int[] _ndf = new int[2];
private double[] _parameters;
private SymmetricMatrix _covmatrix;
+ private Map<HelicalTrackHit, Double> _smap;
/** Creates a new instance of HelicalTrackFit */
public HelicalTrackFit(double[] pars, SymmetricMatrix cov, double[] chisq, int[] ndf) {
+ this(pars, cov, chisq, ndf, new HashMap<HelicalTrackHit, Double>());
+ }
+
+ public HelicalTrackFit(double[]pars, SymmetricMatrix cov, double[] chisq, int[] ndf,
+ Map<HelicalTrackHit, Double> smap) {
_parameters = pars;
_covmatrix = cov;
_chisq = chisq;
_ndf = ndf;
- }
-
- public HelicalTrackFit(CircleFit cfit, int cdof, SlopeInterceptLineFit lfit) {
- _covmatrix = new SymmetricMatrix(5);
- circle(cfit, cdof);
- line(lfit);
+ _smap = smap;
}
public double[] parameters() {
@@ -55,6 +59,10 @@
return _ndf;
}
+ public Map<HelicalTrackHit, Double> pathmap() {
+ return _smap;
+ }
+
public String toString() {
StringBuffer sb = new StringBuffer("HelicalTrackFit: \n");
@@ -67,42 +75,6 @@
return sb.toString();
}
- private void circle(CircleFit cfit, int cdof) {
- _chisq[0] = cfit.chisq();
- _ndf[0] = cdof;
- _parameters[0] = -cfit.dca();
- _parameters[1] = cfit.phi();
- _parameters[2] = cfit.curvature();
- double[] cov = cfit.cov();
- _covmatrix.setElement(0, 0, cov[0]);
- _covmatrix.setElement(0, 1, cov[1]);
- _covmatrix.setElement(1, 1, cov[2]);
- _covmatrix.setElement(0, 2, cov[3]);
- _covmatrix.setElement(1, 2, cov[4]);
- _covmatrix.setElement(2, 2, cov[5]);
- }
-
- private void line(SlopeInterceptLineFit lfit) {
- _chisq[1] = lfit.chisquared();
- _ndf[1] = lfit.ndf();
- _parameters[3] = lfit.intercept();
- _parameters[4] = lfit.slope();
- _covmatrix.setElement(3, 3, Math.pow(lfit.interceptUncertainty(),2));
- _covmatrix.setElement(3, 4, lfit.covariance());
- _covmatrix.setElement(4, 4, Math.pow(lfit.slopeUncertainty(),2));
- }
-
- private void segment(ZSegmentFit zfit, double chisq, int ndof) {
- _chisq[1] = chisq;
- _ndf[1] = ndof;
- double[] cent = zfit.getCentroid();
- _parameters[3] = cent[0];
- _parameters[4] = cent[1];
- SymmetricMatrix cov = zfit.getCovariance();
- _covmatrix.setElement(3, 3, cov.e(0, 0));
- _covmatrix.setElement(3, 4, cov.e(0, 1));
- _covmatrix.setElement(4, 4, cov.e(1, 1));
- }
}
lcsim/sandbox/Partridge
diff -u -r1.2 -r1.3
--- HelicalTrackFitter.java 21 Nov 2007 16:25:06 -0000 1.2
+++ HelicalTrackFitter.java 29 Nov 2007 19:42:40 -0000 1.3
@@ -4,7 +4,7 @@
*
* Created on March 25, 2006, 6:11 PM
*
- * $Id: HelicalTrackFitter.java,v 1.2 2007/11/21 16:25:06 partridge Exp $
+ * $Id: HelicalTrackFitter.java,v 1.3 2007/11/29 19:42:40 partridge Exp $
*/
import hep.physics.matrix.SymmetricMatrix;
@@ -16,15 +16,13 @@
import java.util.List;
import java.util.Map;
-import org.lcsim.event.TrackerHit;
+// import org.lcsim.event.TrackerHit;
import org.lcsim.fit.circle.CircleFit;
import org.lcsim.fit.circle.CircleFitter;
-import org.lcsim.fit.helicaltrack.HelicalTrackFit;
import org.lcsim.fit.line.SlopeInterceptLineFit;
import org.lcsim.fit.line.SlopeInterceptLineFitter;
import org.lcsim.fit.zsegment.ZSegmentFit;
import org.lcsim.fit.zsegment.ZSegmentFitter;
-import org.lcsim.spacegeom.SpacePoint;
/**
* Fit a helix to a set of space points. First, a circle is fit to the x-y coordinates.
@@ -68,21 +66,26 @@
* @return true for successful fit
*/
public boolean fit(double[] x, double[] y, double[] z, double[] drphi, double[] dz, int np) {
- List<HelicalTrackHit> hits = new ArrayList<HelicalTrackHit>();
+ List<HelicalTrackHit> hitcol = new ArrayList<HelicalTrackHit>();
for(int i=0; i<np; i++) {
- SpacePoint pos = new SpacePoint(new BasicHep3Vector(x[i], y[i], z[i]));
if (dz[i] > 0.) {
- hits.add(new HelicalTrack3DHit(pos, drphi[i], dz[i]));
+ hitcol.add(new HelicalTrack3DHit(x[i], y[i], z[i], drphi[i], dz[i]));
} else {
double zmin = z[i] - Math.abs(dz[i]);
double zmax = z[i] + Math.abs(dz[i]);
- hits.add(new HelicalTrack2DHit(pos, drphi[i], zmin, zmax));
+ hitcol.add(new HelicalTrack2DHit(x[i], y[i], z[i], drphi[i], zmin, zmax));
}
}
- return fit(hits);
+ Map<HelicalTrackHit, MultipleScatter> msmap = new HashMap<HelicalTrackHit, MultipleScatter>();
+ return fit(hitcol, msmap);
}
-
- public boolean fit(List<HelicalTrackHit> hitcol) {
+
+ public boolean fit(List<HelicalTrackHit> hitcol) {
+ Map<HelicalTrackHit, MultipleScatter> msmap = new HashMap<HelicalTrackHit, MultipleScatter>();
+ return fit(hitcol, msmap);
+ }
+
+ public boolean fit(List<HelicalTrackHit> hitcol, Map<HelicalTrackHit, MultipleScatter> msmap) {
// Create lists for the various types of hits
List<HelicalTrackHit> circle_hits = new ArrayList<HelicalTrackHit>();
@@ -113,9 +116,12 @@
// Store the hit coordinates and weights in arrays for the circle fitter
for(int i=0; i<nc; i++) {
- x[i] = circle_hits.get(i).x();
- y[i] = circle_hits.get(i).y();
- wrphi[i] = 1. / Math.pow(circle_hits.get(i).drphi(),2);
+ HelicalTrackHit hit = circle_hits.get(i);
+ x[i] = hit.x();
+ y[i] = hit.y();
+ double drphi_ms = 0.;
+ if (msmap.containsKey(hit)) drphi_ms = msmap.get(hit).drphi();
+ wrphi[i] = 1. / (Math.pow(hit.drphi(),2) + Math.pow(drphi_ms,2));
System.out.println(" Circle fit - x: "+x[i]+" y "+y[i]+" w "+wrphi[i]);
}
@@ -153,7 +159,9 @@
for(int i=0; i<npix; i++) {
HelicalTrack3DHit hit = (HelicalTrack3DHit) pixel_hits.get(i);
z[i] = hit.z();
- dz[i] = hit.dz();
+ double dz_ms = 0.;
+ if (msmap.containsKey(hit)) dz_ms = msmap.get(hit).dz();
+ dz[i] = Math.sqrt(Math.pow(hit.dz(),2)+Math.pow(dz_ms,2));
s[i] = smap.get(hit);
System.out.println("Line fit - z: "+z[i]+" s "+s[i]+" dz "+dz[i]);
}
@@ -180,11 +188,13 @@
// If we have one pixel hit, turn it into a pseudo strip hit
if (npix == 1) {
- HelicalTrack3DHit pixhit = (HelicalTrack3DHit) pixel_hits.get(0);
- SpacePoint pos = pixhit.getPosition();
- double zmin = pixhit.z() - pixhit.dz();
- double zmax = pixhit.z() + pixhit.dz();
- strip_hits.add(new HelicalTrack2DHit(pos, pixhit.drphi(), zmin, zmax));
+ HelicalTrack3DHit hit = (HelicalTrack3DHit) pixel_hits.get(0);
+ double dz_ms = 0.;
+ if (msmap.containsKey(hit)) dz_ms = msmap.get(hit).dz();
+ double dz = Math.sqrt(Math.pow(hit.dz(),2)+Math.pow(dz_ms,2));
+ double zmin = hit.z() - dz;
+ double zmax = hit.z() + dz;
+ strip_hits.add(new HelicalTrack2DHit(hit.x(), hit.y(), hit.z(), hit.drphi(), zmin, zmax));
}
// Setup for the ZSegment fit
@@ -219,7 +229,7 @@
}
// Create the HelicalTrackFit for this helix and exit
- _fit = new HelicalTrackFit(par, cov, chisq, ndof);
+ _fit = new HelicalTrackFit(par, cov, chisq, ndof, smap);
return true;
}