Print

Print


Commit in lcsim/src/org/lcsim/contrib/seedtracker on MAIN
DefaultStrategy.java+47added 1.1
HelicalTrackFitter.java+179added 1.1
SeedLayer.java+100added 1.1
SeedStrategy.java+149added 1.1
SeedTracker.java+285added 1.1
SeedTrackerDriver.java+34added 1.1
SmearMCHits.java+82added 1.1
+876
7 added files


lcsim/src/org/lcsim/contrib/seedtracker
DefaultStrategy.java added at 1.1
diff -N DefaultStrategy.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ DefaultStrategy.java	7 Aug 2006 17:46:30 -0000	1.1
@@ -0,0 +1,47 @@
+/*
+ * DefaultStrategy.java
+ *
+ * Created on March 29, 2006, 3:45 PM
+ *
+ */
+
+package org.lcsim.contrib.seedtracker;
+
+import java.util.List;
+import java.util.ArrayList;
+
+/**
+ *
+ * @author Richard Partridge
+ * @version 1.0
+ */
+public class DefaultStrategy
+{
+    private List<SeedStrategy> StrategyList;
+    
+    /** Creates a new instance of DefaultStrategy */
+    public DefaultStrategy()
+    {
+        StrategyList = new ArrayList();
+        
+        List<SeedLayer> TD012Layers = new ArrayList();
+        TD012Layers.add(new SeedLayer("TrackerEndcap", 0, SeedLayer.SeedType.SeedInner));
+        TD012Layers.add(new SeedLayer("TrackerEndcap", 1, SeedLayer.SeedType.SeedMiddle));
+        TD012Layers.add(new SeedLayer("TrackerEndcap", 2, SeedLayer.SeedType.SeedOuter));
+//        StrategyList.add(new SeedStrategy("TD012",TD012Layers));
+        
+        List<SeedLayer> VB012Layers = new ArrayList();
+        VB012Layers.add(new SeedLayer("VertexBarrel", 2, SeedLayer.SeedType.SeedInner));
+        VB012Layers.add(new SeedLayer("VertexBarrel", 3, SeedLayer.SeedType.SeedMiddle));
+        VB012Layers.add(new SeedLayer("VertexBarrel", 4, SeedLayer.SeedType.SeedOuter));
+        VB012Layers.add(new SeedLayer("TrackerBarrel", 0, SeedLayer.SeedType.Confirm3D));
+//        VB012Layers.add(new SeedLayer("VertexBarrel", 0, SeedLayer.SeedType.Confirm3D));
+//        VB012Layers.add(new SeedLayer("VertexBarrel", 1, SeedLayer.SeedType.Confirm3D));
+        StrategyList.add(new SeedStrategy("VB012",VB012Layers));
+        
+    }
+    public List<SeedStrategy> getStrategyList()
+    {
+        return StrategyList;
+    }
+}

lcsim/src/org/lcsim/contrib/seedtracker
HelicalTrackFitter.java added at 1.1
diff -N HelicalTrackFitter.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ HelicalTrackFitter.java	7 Aug 2006 17:46:31 -0000	1.1
@@ -0,0 +1,179 @@
+/*
+ * HelicalTrackFitter.java
+ *
+ * Created on March 25, 2006, 6:11 PM
+ *
+ * $Id: HelicalTrackFitter.java,v 1.1 2006/08/07 17:46:31 partridge Exp $
+ */
+
+package org.lcsim.contrib.seedtracker;
+import static java.lang.Math.atan2;
+import static java.lang.Math.abs;
+import static java.lang.Math.PI;
+import static java.lang.Math.cos;
+import static java.lang.Math.sin;
+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;
+/**
+ *
+ * @author Norman Graf
+ */
+public class HelicalTrackFitter
+{
+    private CircleFitter _cfitter = new CircleFitter();
+    private SlopeInterceptLineFitter _lfitter = new SlopeInterceptLineFitter();
+    
+    private HelicalTrackFit _fit;
+    
+    private double[] _circleParameters = new double[3];
+    
+    /** Creates a new instance of HelicalTrackFitter */
+    public HelicalTrackFitter()
+    {
+    }
+    
+    public boolean fit(double[] x, double[] y, double[] z, double[] drphi, double[] dz, int np)
+    {
+        // fit a circle in the x-y plane
+        double[] wrphi = new double[np];
+        for(int i=0; i<np; ++i)
+        {
+            wrphi[i] = 1/(drphi[i]*drphi[i]);
+        }
+        boolean success = _cfitter.fit(x, y, wrphi, np);
+        if(!success) return false;
+        
+        CircleFit cfit = _cfitter.getfit();
+        double radius = 1./cfit.curvature();
+        double phi0 = cfit.phi();
+        double dca = -cfit.dca();
+        double xc = (radius-dca)*sin(phi0);
+        double yc = -(radius-dca)*cos(phi0);
+        _circleParameters[0] = xc;
+        _circleParameters[1] = yc;
+        _circleParameters[2] = radius;
+        // fit a line in the s-z plane
+        // assumes points are in increasing order
+        double[] s = new double[np];
+        double[] sfit = new double[np];
+        double[] zfit = new double[np];
+        double[] wz = new double[np];
+        int nz = 0;
+        for(int i=0; i<np; i++)
+        {
+            if (i==0) {
+                s[0] = s(radius, xc, yc, x[0], y[0], 0., 0.);
+            }
+            else {
+                s[i] = s(radius, xc, yc, x[i], y[i], x[i-1], y[i-1]) + s[i-1];
+            }
+            if (dz[i]>0) {
+                sfit[nz] = s[i];
+                zfit[nz] = z[i];
+                wz[nz] = 1/(dz[i]*dz[i]);
+                nz++;
+            }
+        }
+        
+        success = _lfitter.fit(sfit, zfit, wz, nz);
+        if(!success) return false;
+        SlopeInterceptLineFit lfit = _lfitter.getFit();
+        
+        // TODO convert fit results to track parameters and covariance matrix.
+        // now have the fits, need to assemble the track parameters...
+        
+        // see org.lcsim.event.Track.Parameters
+        // The track parameters for LCD are defined as follows
+        // <table>
+        // <tr><th>Index</th><th>Meaning</th></tr>
+        // <tr><td> 0 </td><td> d0 = XY impact parameter </td><tr>
+        // <tr><td> 1 </td><td> phi0 </td><tr> </td><tr>
+        // <tr><td> 2 </td><td> omega = 1/curv.radius (negative for negative tracks) </td><tr>
+        // <tr><td> 3 </td><td> z0 = z of track origin (z impact parameter) </td><tr>
+        // <tr><td> 4 </td><td> s = tan lambda </td><tr>
+        // </table>
+        
+        // tanlambda = line fit slope
+        // z0 = line fit intercept
+        //TODO should shift s-z line fit to centroid of x-y fit and introduce covariance terms to be correct.
+        
+        
+//        System.out.println("circle fit: "+cfit);
+//        System.out.println("line fit: "+lfit);;
+        double[] pars = new double[5];
+        double[][] cov = new double[5][5];
+        double[] chisq = new double[2];
+        int[] ndf = new int[2];
+        
+        chisq[0] = cfit.chisq();
+        chisq[1] = lfit.chisquared();
+        
+        ndf[1] = lfit.ndf();
+        ndf[0] = np - 3;
+        
+        // d0, xy impact parameter.
+        pars[0] = -cfit.dca();
+        // phi0
+        pars[1] =  cfit.phi();
+        // omega signed curvature
+        pars[2] = cfit.curvature();
+        // z0
+        pars[3] = lfit.intercept();
+        // tan lambda
+        pars[4] = lfit.slope();
+        
+        // fill in covariance matrix
+        cov[0][0] = cfit.cov()[0];
+        cov[0][1] = cfit.cov()[1];
+        cov[1][1] = cfit.cov()[2];
+        cov[0][2] = cfit.cov()[3];
+        cov[1][2] = cfit.cov()[4];
+        cov[2][2] = cfit.cov()[5];
+        cov[0][3] = 0.;
+        cov[1][3] = 0.;
+        cov[2][3] = 0.;
+        cov[3][3] = lfit.interceptUncertainty();
+        cov[0][4] = 0.;
+        cov[1][4] = 0.;
+        cov[2][4] = 0.;
+        cov[3][4] = lfit.covariance();
+        cov[4][4] = lfit.slopeUncertainty();
+        for (int i=0; i<4; i++) {
+            for (int j=i+1; j<5; j++){
+                cov[j][i] = cov[i][j];
+            }
+        }
+//        for(int i=0; i<5; ++i)
+//        {
+//            System.out.println("pars["+i+"]= "+pars[i]);
+//        }
+        _fit = new HelicalTrackFit(pars, cov, chisq, ndf);
+        _fit.setCircleParameters(_circleParameters);
+        return true;
+    }
+    
+    public HelicalTrackFit getFit()
+    {
+        return _fit;
+    }
+    
+    public double[] getCircleParameters()
+    {
+        return _circleParameters;
+    }
+    
+    double s(double radius, double xcenter, double ycenter, double x1, double y1, double x2, double y2)
+    {
+        double phi1 = atan2( (y1-ycenter), (x1-xcenter) );
+        if (phi1<0) phi1 += 2*PI;
+        double phi2 = atan2( (y2-ycenter), (x2-xcenter) );
+        if (phi2<0) phi2 += 2*PI;
+        double dphi = abs(phi1-phi2);
+        if(dphi>PI) dphi = 2.*PI-dphi;
+        return abs(radius)*dphi;
+    }
+    
+}
\ No newline at end of file

lcsim/src/org/lcsim/contrib/seedtracker
SeedLayer.java added at 1.1
diff -N SeedLayer.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ SeedLayer.java	7 Aug 2006 17:46:31 -0000	1.1
@@ -0,0 +1,100 @@
+/*
+ * SeedLayer.java
+ *
+ * Created on March 29, 2006, 1:59 PM
+ *
+ */
+
+package org.lcsim.contrib.seedtracker;
+
+//import org.lcsim.event.SimTrackerHit;
+import org.lcsim.event.base.BaseTrackerHitMC;
+import java.util.List;
+import java.util.ArrayList;
+import org.lcsim.geometry.subdetector.DiskTracker;
+import org.lcsim.geometry.subdetector.MultiLayerTracker;
+
+/**
+ *
+ * @author Richard Partridge
+ * @version 1.0
+ */
+public class SeedLayer
+{
+    public enum SeedType {SeedInner, SeedMiddle, SeedOuter, Confirm2D, Confirm3D, Search2D, Search3D}
+    
+    protected String DetName;
+    protected int Layer;
+    protected SeedType Type;
+    protected List<BaseTrackerHitMC> HitList;
+    protected double RMax = 0;
+    protected double RMin = 99999;
+    protected double ZMax = 99999;
+    protected boolean IsEndcap = false;
+
+    /** Creates a new instance of SeedLayer */
+    public SeedLayer(String DetName, int Layer, SeedType Type)
+    {
+        this.DetName = DetName;
+        this.Layer = Layer;
+        this.Type = Type;
+        HitList = new ArrayList<BaseTrackerHitMC>();
+    }
+    public String getDetName()
+    {
+        return DetName;
+    }
+    public int getLayer()
+    {
+        return Layer;
+    }
+    public SeedType getType()
+    {
+        return Type;
+    }
+    public List<BaseTrackerHitMC> getHitList()
+    {
+        return HitList;
+    }
+    public void putDetName(String DetName)
+    {
+        this.DetName = DetName;
+        return;
+    }
+    public void putLayer(int Layer)
+    {
+        this.Layer = Layer;
+        return;
+    }
+    public void putType(SeedType Type)
+    {
+        this.Type = Type;
+        return;
+    }
+    public void addHit(BaseTrackerHitMC Hit)
+    {
+        if (HitList.isEmpty()) {
+            IsEndcap = Hit.getSimHits().get(0).getSubdetector().isEndcap();
+            if (IsEndcap) {
+                DiskTracker dtrkr = (DiskTracker) Hit.getSimHits().get(0).getSubdetector();
+                RMin = dtrkr.getInnerR()[Layer];
+                RMax = dtrkr.getOuterR()[Layer];
+                ZMax = dtrkr.getInnerZ()[Layer];
+            }
+            else {
+                MultiLayerTracker ctrkr = (MultiLayerTracker) Hit.getSimHits().get(0).getSubdetector();
+                RMin = 0.;
+                RMax = ctrkr.getInnerR()[Layer];
+                ZMax = ctrkr.getOuterZ()[Layer];
+            }
+            System.out.println(DetName+" Layer "+Layer+" RMIN "+RMin+" RMAX "+RMax+" ZMax "+ZMax);
+        }
+        HitList.add(Hit);
+        return;
+    }
+    public void clearHitList()
+    {
+        HitList.clear();
+        return;
+    }
+}

lcsim/src/org/lcsim/contrib/seedtracker
SeedStrategy.java added at 1.1
diff -N SeedStrategy.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ SeedStrategy.java	7 Aug 2006 17:46:31 -0000	1.1
@@ -0,0 +1,149 @@
+/*
+ * SeedStrategy.java
+ *
+ * Created on March 29, 2006, 3:04 PM
+ *
+ */
+
+package org.lcsim.contrib.seedtracker;
+
+import java.util.*;
+import org.lcsim.contrib.seedtracker.SeedLayer;
+
+/**
+ *
+ * @author Richard Partridge
+ * @version 1.0
+ */
+public class SeedStrategy {
+    private String Name;
+    private List<SeedLayer> LayerList;
+    private double MinPT = 0.5;
+    private double MaxDCA = 10.0;
+    private double MaxZ0 = 10.0;
+    private double MaxChisq = 100.;
+    private int MinConfirm = 1;
+    private int MinHits = 4;
+    
+    /** Creates a new instance of SeedStrategy */
+    public SeedStrategy(String Name, List<SeedLayer> LayerList, double MinPT,
+            double MaxDCA, double MaxZ0, double MaxChisq, int MinConfirm, int MinHits) {
+        this.Name = Name;
+        this.LayerList = LayerList;
+        this.MinPT = MinPT;
+        this.MaxDCA = MaxDCA;
+        this.MaxZ0 = MaxZ0;
+        this.MaxChisq = MaxChisq;
+        this.MinConfirm = MinConfirm;
+        this.MinHits = MinHits;
+    }
+    public SeedStrategy(String Name, double MinPT, double MaxDCA,double MaxZ0,
+            double MaxChisq, int MinConfirm, int MinHits) {
+        this.Name = Name;
+        this.LayerList = new ArrayList<SeedLayer>();
+        this.MinPT = MinPT;
+        this.MaxDCA = MaxDCA;
+        this.MaxZ0 = MaxZ0;
+        this.MaxChisq = MaxChisq;
+        this.MinConfirm = MinConfirm;
+        this.MinHits = MinHits;
+    }
+    public SeedStrategy(String Name) {
+        this.Name = Name;
+        this.LayerList = new ArrayList<SeedLayer>();
+    }
+    public SeedStrategy(String Name, List<SeedLayer> LayerList) {
+        this.Name = Name;
+        this.LayerList = LayerList;
+    }
+    public String getName() {
+        return Name;
+    }
+    public List<SeedLayer> getLayerList() {
+        return LayerList;
+    }
+    public double getMinPT() {
+        return MinPT;
+    }
+    public double getMaxDCA() {
+        return MaxDCA;
+    }
+    public double getMaxZ0() {
+        return MaxZ0;
+    }
+    public double getMaxChisq() {
+        return MaxChisq;
+    }
+    public int getMinConfirm() {
+        return MinConfirm;
+    }
+    public int getMinHits() {
+        return MinHits;
+    }
+    public void putName(String Name) {
+        this.Name=Name;
+        return;
+    }
+    public void putLayerList(List<SeedLayer> LayerList) {
+        this.LayerList = LayerList;
+        return;
+    }
+    public void putMinPT(double MinPT) {
+        this.MinPT = MinPT;
+        return;
+    }
+    public void putMaxDCA(double MaxDCA) {
+        this.MaxDCA = MaxDCA;
+        return;
+    }
+    public void putMaxZ0(double MaxZ0) {
+        this.MaxZ0 = MaxZ0;
+        return;
+    }
+    public void putMaxChisq(double MaxChisq) {
+        this.MaxChisq = MaxChisq;
+        return;
+    }
+    public void putMinConfirm(int MinConfirm) {
+        this.MinConfirm = MinConfirm;
+        return;
+    }
+    public void putMinHits(int MinHits) {
+        this.MinHits = MinHits;
+        return;
+    }
+    public void addLayer(SeedLayer Layer) {
+        LayerList.add(Layer);
+        return;
+    }
+    public SeedLayer getSeedInner() {
+        SeedLayer Inner = new SeedLayer("Dummy",0,SeedLayer.SeedType.SeedInner);
+        for (SeedLayer layer : LayerList) {
+            if (layer.getType() == SeedLayer.SeedType.SeedInner) Inner = layer;
+        }
+        return Inner;
+    }
+    
+     public SeedLayer getSeedMiddle() {
+        SeedLayer Middle = new SeedLayer("Dummy",0,SeedLayer.SeedType.SeedMiddle);
+        for (SeedLayer layer : LayerList) {
+            if (layer.getType() == SeedLayer.SeedType.SeedMiddle) Middle = layer;
+        }
+        return Middle;
+     }
+     
+     public SeedLayer getSeedOuter() {
+        SeedLayer Outer = new SeedLayer("Dummy",0,SeedLayer.SeedType.SeedOuter);
+        for (SeedLayer layer : LayerList) {
+            if (layer.getType() == SeedLayer.SeedType.SeedOuter) Outer = layer;
+        }
+        return Outer;
+    }
+    public List<SeedLayer> getConfirmLayers() {
+        List<SeedLayer> confirmlayers = new ArrayList();
+        for (SeedLayer layer : LayerList) {
+            if (layer.getType() == SeedLayer.SeedType.Confirm3D) confirmlayers.add(layer);
+        }
+        return confirmlayers;
+    } 
+}

lcsim/src/org/lcsim/contrib/seedtracker
SeedTracker.java added at 1.1
diff -N SeedTracker.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ SeedTracker.java	7 Aug 2006 17:46:31 -0000	1.1
@@ -0,0 +1,285 @@
+/*
+ * SeedTracker.java
+ *
+ * Created on August 16, 2005, 8:54 AM
+ *
+ */
+
+package org.lcsim.contrib.seedtracker;
+
+import java.util.ArrayList;
+import java.util.ListIterator;
+import org.lcsim.event.MCParticle;
+import org.lcsim.event.SimTrackerHit;
+import org.lcsim.event.Track;
+import org.lcsim.event.TrackerHit;
+import org.lcsim.event.base.BaseTrack;
+import org.lcsim.event.base.BaseTrackerHitMC;
+import org.lcsim.fit.helicaltrack.HelicalTrackFit;
+import org.lcsim.geometry.Detector;
+import org.lcsim.geometry.subdetector.MultiLayerTracker;
+import org.lcsim.util.Driver;
+import org.lcsim.event.EventHeader;
+import java.util.List;
+
+/**
+ * Tracking algorithm based on forming track seeds from all 3-hit combinations
+ * and adding tracks to the helix defined by the three hits.
+ *
+ * @author Richard Partridge
+ * @version 1.0
+ */
+public class SeedTracker extends Driver {
+    private DefaultStrategy DS = new DefaultStrategy();
+    private List<SeedStrategy> StrategyList = DS.getStrategyList();
+    private HelicalTrackFitter hf = new HelicalTrackFitter();
+    private HelicalTrackFit helix;
+    private double[] IP = {0.,0.,0.};
+    private double BField;
+    
+    /** Creates a new instance of SeedTracker */
+    public SeedTracker() {
+    }
+    
+    protected void process(EventHeader event) {
+        
+        // Find the magnetic field
+        Detector detector = event.getDetector();
+        BField = detector.getFieldMap().getField(IP)[2];
+        
+        // Associate hits with layers (ignore layers that aren't included in a strategy
+        AssociateHits(event);
+        
+        // Create a list of tracks
+        List<BaseTrack> tracklist = new ArrayList();
+        
+        // Loop over all strategies
+        for (SeedStrategy strategy : StrategyList) {
+            // Find the 3 hits seeds for this strategy
+            List<List<BaseTrackerHitMC>> seedlist = FindSeeds(strategy);
+            // Loop over the seeds
+            for (List<BaseTrackerHitMC> hitlist : seedlist) {
+                // See if we can create a helix that satisfies the cuts for this strategy
+                boolean status = FindHelix(strategy, hitlist);
+                if (!status) continue;
+                List<List<BaseTrackerHitMC>> confirmlist = FindConfirms(strategy, hitlist);
+                int maxhits = 3 + strategy.getConfirmLayers().size();
+                int minhits = 3 + strategy.getMinConfirm();
+                // First try to find one or more tracks using all the confirm hits
+                // If this fails, work our way down to the minimum number
+                for (int nhit = maxhits; nhit >= minhits; nhit--) {
+                    boolean foundtrack = false;
+                    for (List<BaseTrackerHitMC> candidate : confirmlist) {
+                        if (candidate.size() == nhit) {
+                            if (!isDuplicate(candidate, tracklist)) {
+                                boolean status2 = FindHelix(strategy, candidate);
+                                if (status2) {
+                                    // Create a new track
+                                    BaseTrack track = new BaseTrack();
+                                    track.setReferencePoint(IP);
+                                    track.setRefPointIsDCA(false);
+                                    track.setTrackParameters(helix.parameters(), BField);
+                                    track.setChisq(helix.chisq()[0]+helix.chisq()[1]);
+                                    track.setNDF(helix.ndf()[0]+helix.ndf()[1]);
+                                    track.setCovarianceMatrix(helix.covariance());
+                                    track.setTrackType(0);
+                                    List<TrackerHit> castcand = new ArrayList();
+                                    for (BaseTrackerHitMC hit : candidate) {
+                                        castcand.add((TrackerHit) hit);
+                                    }
+                                    track.addHits(castcand);
+                                    tracklist.add(track);
+                                    foundtrack = true;
+                                }
+                            }
+                        }
+                    }
+                    if (foundtrack) break;
+                }
+            }
+        }
+        event.put("Tracks", tracklist, Track.class, 0);
+    }
+    
+    private void AssociateHits(EventHeader event) {
+        List<BaseTrackerHitMC>  hitcol = event.get(BaseTrackerHitMC.class,"BaseTrackerHitMC");
+        
+        for (SeedStrategy strategy : StrategyList) {
+            for (SeedLayer slyr : strategy.getLayerList()) {
+                slyr.clearHitList();
+                for (BaseTrackerHitMC hit : hitcol) {
+                    for (SimTrackerHit simhit : hit.getSimHits()) {
+                        if (simhit.getLayer() == slyr.Layer) {
+                            if (simhit.getSubdetector().getName().equals(slyr.getDetName())) {
+                                slyr.addHit(hit);
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        return;
+    }
+    public List<SeedStrategy> getStrategyList() {
+        return StrategyList;
+    }
+    
+    public void putStrategyList(List<SeedStrategy> StrategyList) {
+        this.StrategyList = StrategyList;
+        return;
+    }
+    
+    private List<List<BaseTrackerHitMC>> FindSeeds(SeedStrategy strategy) {
+        SeedLayer inner = strategy.getSeedInner();
+        SeedLayer middle = strategy.getSeedMiddle();
+        SeedLayer outer = strategy.getSeedOuter();
+        
+        // Todo: add code to limit seeds to those that satisfy cuts
+        List<List<BaseTrackerHitMC>> seedlist = new ArrayList();
+        
+        for (BaseTrackerHitMC si : inner.getHitList()) {
+            for (BaseTrackerHitMC sm : middle.getHitList()) {
+                for (BaseTrackerHitMC so : outer.getHitList()) {
+                    List<BaseTrackerHitMC> hitlist = new ArrayList();
+                    hitlist.add(si);
+                    hitlist.add(sm);
+                    hitlist.add(so);
+                    seedlist.add(hitlist);
+                }
+            }
+        }
+        System.out.println(" Number of seeds: "+seedlist.size());
+        
+        return seedlist;
+    }
+    
+    private boolean FindHelix(SeedStrategy strategy, List<BaseTrackerHitMC> hitlist) {
+        boolean status = false;
+        int np = hitlist.size();
+        double[] xx = new double[np];
+        double[] yy = new double[np];
+        double[] zz = new double[np];
+        double[] drphi = new double[np];
+        double[] dz = new double[np];
+        
+        for (int i=0; i<np; i++) {
+            BaseTrackerHitMC hit = hitlist.get(i);
+            double[] position = hit.getPosition();
+            xx[i] = position[0];
+            yy[i] = position[1];
+            zz[i] = position[2];
+            double[] covmat = hit.getCovMatrix();
+            drphi[i] = rphi_error(position, covmat);
+            dz[i] = Math.sqrt(covmat[5]);
+        }
+        boolean goodfit = hf.fit(xx, yy, zz, drphi, dz, np);
+        if (goodfit) {
+            helix = hf.getFit();
+            double[] params = helix.parameters();
+            double pT = 0.0003 * BField / Math.abs(params[2]);
+            if (helix.chisq()[0]+helix.chisq()[1] < strategy.getMaxChisq()) {
+                if (pT > strategy.getMinPT()) {
+                    double d0 = params[0];
+                    if (d0 < strategy.getMaxDCA()) {
+                        double z0 = params[3];
+                        if (z0 < strategy.getMaxZ0()) {
+            System.out.println(" d0 "+params[0]);
+            System.out.println(" phi0 "+params[1]);
+            System.out.println(" curvatures "+params[2]);
+            System.out.println(" z0 "+params[3]);
+            System.out.println(" slope "+params[4]);
+                System.out.println(" pT "+pT);
+                            status = true;
+                        }
+                    }
+                }
+            }
+        }
+        return status;
+    }
+    
+    private List<List<BaseTrackerHitMC>> FindConfirms(SeedStrategy strategy, List<BaseTrackerHitMC> seedhits) {
+        // Create a list of possible confirmation hits for each confirmation layer
+        List<List<BaseTrackerHitMC>> confirmbylayer = new ArrayList();
+        // Loop over the various layers
+        for (SeedLayer layer : strategy.getConfirmLayers()) {
+            // Get the list of potential confirmation hits for this layer
+            // Todo - select only hits near tracks
+            List<BaseTrackerHitMC> confirmhits = layer.getHitList();
+            // If we have some confirmation hits in this layer, add the list of hits for this layer
+            if (confirmhits.size()>0) confirmbylayer.add(confirmhits);
+        }
+        // Initialize a list of track candidates that include confirmation hits
+        List<List<BaseTrackerHitMC>> candlist = new ArrayList();
+        // check that there are sufficient layers with confirmation hits
+        if (confirmbylayer.size() >= strategy.getMinConfirm()) {
+            // Start with our seed hits as a candidate
+            candlist.add(seedhits);
+            // Loop over all the confirming layers
+            for (List<BaseTrackerHitMC> confirmhits : confirmbylayer) {
+                // Create a list of new candidates that have hits added from this layer
+                List<List<BaseTrackerHitMC>> newcandlist = new ArrayList();
+                // Loop over all existing candidates
+                for (List<BaseTrackerHitMC> oldcand : candlist) {
+                    // Loop over all the hits in this confirming layer
+                    for (BaseTrackerHitMC hit : confirmhits) {
+                        // Create a new track candidate that adds this hit
+                        List<BaseTrackerHitMC> newcand = new ArrayList();
+                        boolean status = newcand.addAll(oldcand);
+                        newcand.add(hit);
+                        newcandlist.add(newcand);
+                    }
+                }
+                boolean status = candlist.addAll(newcandlist);
+            }
+        }
+        // Remove candidates that have too few confirmation hits
+//        ListIterator<List<BaseTrackerHitMC>> itr = candlist.listIterator();
+//        while (itr.hasNext()) {
+//            List<BaseTrackerHitMC> hitlist = itr.next();
+//            if (hitlist.size() < strategy.getMinConfirm()+3) candlist.remove(hitlist);
+//        }
+        
+        return candlist;
+    }
+    
+    private boolean isDuplicate(List<BaseTrackerHitMC> hitlist, List<BaseTrack> tracklist) {
+        boolean isDuplicate = false;
+        for (BaseTrack track : tracklist) {
+            List<TrackerHit> hitlist2 = track.getTrackerHits();
+            boolean matchall = true;
+            if (hitlist.size() <= hitlist2.size()) {
+                for ( BaseTrackerHitMC hit1 : hitlist) {
+                    boolean match = false;
+                    for (TrackerHit hit2 : hitlist2) {
+                        if (hit1 == (BaseTrackerHitMC) hit2) {
+                            match = true;
+                            break;
+                        }
+                    }
+                    if (!match) {
+                        matchall = false;
+                        break;
+                    }
+                }
+                if (matchall) {
+                    isDuplicate = true;
+                    break;
+                }
+            }
+        }
+        return isDuplicate;
+    }
+    
+    private double rphi_error(double[] position, double[] covmat) {
+        // Todo: include MS errors in weight
+        double x = position[0];
+        double y = position[1];
+        double r2 = x * x + y * y;
+        double varxx = covmat[0];
+        double varxy = covmat[1];
+        double varyy = covmat[2];
+        return Math.sqrt((y * y * varxx + x * x * varyy - 2 * x * y * varxy) / r2);
+    }
+    
+}
\ No newline at end of file

lcsim/src/org/lcsim/contrib/seedtracker
SeedTrackerDriver.java added at 1.1
diff -N SeedTrackerDriver.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ SeedTrackerDriver.java	7 Aug 2006 17:46:32 -0000	1.1
@@ -0,0 +1,34 @@
+/*
+ * SeedTrackerDriver.java
+ *
+ * Created on March 29, 2006, 4:58 PM
+ *
+ */
+
+// package org.lcsim.contrib.seedtracker;
+
+import org.lcsim.contrib.seedtracker.SeedTracker;
+import org.lcsim.contrib.seedtracker.SmearMCHits;
+import org.lcsim.event.EventHeader;
+import org.lcsim.util.Driver;
+
+/**
+ *
+ * @author Richard Partridge
+ * @version 1.0
+ */
+public class SeedTrackerDriver extends Driver
+{  
+    /** Creates a new instance of SeedTrackerDriver */
+    public SeedTrackerDriver()
+    {
+        add(new SmearMCHits());
+        add(new SeedTracker());
+    }
+
+    public void process(EventHeader event)
+    {
+        super.process(event);
+        return;     
+    }    
+}

lcsim/src/org/lcsim/contrib/seedtracker
SmearMCHits.java added at 1.1
diff -N SmearMCHits.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ SmearMCHits.java	7 Aug 2006 17:46:32 -0000	1.1
@@ -0,0 +1,82 @@
+/*
+ * SmearMCHits.java
+ *
+ * Created on July 12, 2006, 10:25 AM
+ *
+ * To change this template, choose Tools | Template Manager
+ * and open the template in the editor.
+ */
+
+package org.lcsim.contrib.seedtracker;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Random;
+import org.lcsim.util.Driver;
+import org.lcsim.event.EventHeader;
+import org.lcsim.event.SimTrackerHit;
+import org.lcsim.event.base.BaseTrackerHitMC;
+
+/**
+ *
+ * @author partridge
+ */
+public class SmearMCHits extends Driver{
+    
+    Random rn = new Random();
+    double drphi = 0.005;
+    double dz = 0.005;
+    
+    /** Creates a new instance of SmearMCHits */
+    public SmearMCHits() {
+    }
+    
+    public void process(EventHeader event) {
+        
+        //  Initialize the TrackerHit list
+        List<BaseTrackerHitMC> trkhits = new ArrayList<BaseTrackerHitMC>();
+        //  Get the SimTrackerHit collections
+        List<List<SimTrackerHit>> allgenhits = event.get(SimTrackerHit.class);
+        //  Loop over the various hit collections
+        for (List<SimTrackerHit> genhitcol : allgenhits) {
+            //  Now loop over the hits in a particular collection
+            for (SimTrackerHit genhit : genhitcol) {
+                //  Generate a new BaseTrackerHitMC for each SimTrackerHit
+                //  Note: treat all layers the same for now, hard code the resolution
+                double x = genhit.getPoint()[0];
+                double y = genhit.getPoint()[1];
+                double z = genhit.getPoint()[2];
+                double r = Math.sqrt(x*x + y*y);
+                double phi = Math.atan2(y,x);
+                phi = phi + (drphi / r) * rn.nextGaussian();
+                z = z + dz * rn.nextGaussian();
+                // Fill in smeared position
+                double[] pos = new double[3];
+                pos[0] = r * Math.cos(phi);
+                pos[1] = r * Math.sin(phi);
+                pos[2] = z;
+                // covariance matrix in lower triangular form
+                double[] cov = new double[6];
+                cov[0] = Math.pow(Math.sin(phi)*drphi,2);
+                cov[1] = -Math.sin(phi)*Math.cos(phi)*drphi*drphi;
+                cov[2] = Math.pow(Math.cos(phi)*drphi,2);
+                cov[3] = 0.;
+                cov[4] = 0.;
+                cov[5] = dz*dz;
+                
+                double time = genhit.getTime();
+                
+                double dedx = genhit.getdEdx();
+                
+                int type = 0;
+                //  Create the list of SimTrackerHits for this TrackerHit and add our hit to the list
+                List<SimTrackerHit> hits = new ArrayList<SimTrackerHit>();
+                hits.add(genhit);
+                //  Create a new TrackerHit and add it to our list of tracker hits
+                trkhits.add(new BaseTrackerHitMC(pos, cov,  time, dedx, type, hits));
+            }
+        }
+        //  Put the list of TrackerHits into the event
+        event.put("BaseTrackerHitMC",trkhits,BaseTrackerHitMC.class,0);
+    }  
+}
CVSspam 0.2.8