lcsim/src/org/lcsim/contrib/seedtracker
diff -u -r1.7 -r1.8
--- HelixFitter.java 6 May 2008 23:52:00 -0000 1.7
+++ HelixFitter.java 10 Jun 2008 19:36:10 -0000 1.8
@@ -8,15 +8,19 @@
package org.lcsim.contrib.seedtracker;
import org.lcsim.contrib.seedtracker.diagnostic.ISeedTrackerDiagnostics;
+import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.lcsim.fit.circle.CircleFit;
+import org.lcsim.fit.helicaltrack.HelicalTrackCross;
import org.lcsim.fit.helicaltrack.HelicalTrackFit;
import org.lcsim.fit.helicaltrack.HelicalTrackFitter;
import org.lcsim.fit.helicaltrack.HelicalTrackFitter.FitStatus;
import org.lcsim.fit.helicaltrack.HelicalTrackHit;
+import org.lcsim.fit.helicaltrack.HelixUtils;
import org.lcsim.fit.helicaltrack.MultipleScatter;
+import org.lcsim.fit.helicaltrack.TrackDirection;
import org.lcsim.fit.line.SlopeInterceptLineFit;
import org.lcsim.fit.zsegment.ZSegmentFit;
@@ -31,24 +35,26 @@
private HelicalTrackFit _helix;
private MaterialManager _materialmanager;
private ConstrainHelix _constrain;
+ private HelixUtils _helixutils;
private double _bfield;
private CircleFit _circlefit;
private SlopeInterceptLineFit _linefit;
private ZSegmentFit _zsegmentfit;
private FitStatus _status;
- private ISeedTrackerDiagnostics diag = null;
+ private ISeedTrackerDiagnostics diag = null;
/**
* Creates a new instance of HelixFitter
*/
public HelixFitter(double bfield, MaterialManager materialmanager) {
_materialmanager = materialmanager;
+ _helixutils = new HelixUtils();
_bfield = bfield;
_scattering = new MultipleScattering(_materialmanager, _bfield);
_constrain = new ConstrainHelix(_bfield);
}
public boolean FitCandidate(SeedCandidate seed, SeedStrategy strategy) {
-
+
// Initialize fit results to null objects
_helix = null;
@@ -60,13 +66,19 @@
// If this is the candidate's first helix fit, first do a fit without MS errors
if (oldhelix == null) {
+
+ // Reset the stereo hit positions to their nominal value
+ for (HelicalTrackHit hit : hitlist) {
+ if (hit instanceof HelicalTrackCross) ((HelicalTrackCross) hit).resetTrackDirection();
+ }
+ // Do the fit
_status = _fitter.fit(hitlist);
checkfit();
if (_status != FitStatus.Success) {
if(diag!=null) diag.fireFitterFitMade(seed, null,_circlefit,_linefit,_zsegmentfit, _status, false);
return false;
}
-
+
// Retrieve the helix parameters from this fit
oldhelix = _fitter.getFit();
}
@@ -74,8 +86,16 @@
// Calculate the MS errors
Map<HelicalTrackHit, MultipleScatter> msmap = _scattering.HelixScatters(oldhelix, hitlist);
+ // Adjust stereo hit positions and covariance matrices for cross hits
+ Map<HelicalTrackHit, Double> pathmap = oldhelix.PathMap();
+ for (HelicalTrackHit hit : hitlist) {
+ if (hit instanceof HelicalTrackCross) {
+ ((HelicalTrackCross) hit).setTrackDirection(_helixutils.getTrackDirection(oldhelix, pathmap.get(hit)), oldhelix);
+ }
+ }
+
// Do a helix fit including MS errors
- _status = _fitter.fit(hitlist, msmap);
+ _status = _fitter.fit(hitlist, msmap, oldhelix);
checkfit();
if (_status != FitStatus.Success) {
if(diag!=null) diag.fireFitterFitMade(seed, null,_circlefit,_linefit,_zsegmentfit, _status, false);
@@ -87,7 +107,7 @@
// Set the non-holonomic constraint chi square
_constrain.setConstraintChisq(strategy, _helix);
-
+
// System.out.println(" circle chisq "+helix.chisq()[0]);
// System.out.println(" line fit chisq "+helix.chisq()[1]);
// System.out.println(" total chisq "+chisq);
@@ -104,7 +124,7 @@
}
public void setDiagnostics(ISeedTrackerDiagnostics d) {
- diag = d;
+ diag = d;
}
public HelicalTrackFit getHelix() {
@@ -125,7 +145,7 @@
public ZSegmentFit getZSegmentFit() {
return _zsegmentfit;
- }
+ }
private void checkfit() {
_circlefit = null;
@@ -139,7 +159,7 @@
if (_status == FitStatus.ZSegmentFitFailed) return;
_linefit = _fitter.getLineFit();
_zsegmentfit = _fitter.getZSegmentFit();
-
+
return;
}
}
\ No newline at end of file