Commit in lcsim/src/org/lcsim/contrib/Pelham/Example1 on MAIN
SeedTrackerDiagnostics.java+247added 1.1
AnalysisDriver2.java+193added 1.1
MyStrategy.java+265added 1.1
VSExampleSegmenter.java+64added 1.1
VSExampleDriver.java+128added 1.1
MyTrackerDriver.java+57added 1.1
HistogramAnalysisDriver.java+19-2251.3 -> 1.4
HelixParamHistograms.java-1771.3 removed
TrackHitHistograms.java-3051.2 removed
+973-707
6 added + 2 removed + 1 modified, total 9 files
Files were moved out of this file into the analysis utils folder under seedtracker.

lcsim/src/org/lcsim/contrib/Pelham/Example1
SeedTrackerDiagnostics.java added at 1.1
diff -N SeedTrackerDiagnostics.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ SeedTrackerDiagnostics.java	13 Aug 2008 18:36:14 -0000	1.1
@@ -0,0 +1,247 @@
+/*
+ * To change this template, choose Tools | Templates
+ * and open the template in the editor.
+ */
+
+package org.lcsim.contrib.Pelham.Example1;
+
+import org.lcsim.contrib.seedtracker.*;
+import hep.physics.vec.Hep3Vector;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import org.lcsim.contrib.seedtracker.ConfirmerExtender.Task;
+import org.lcsim.contrib.seedtracker.diagnostic.EmptySeedTrackerDiagnostics;
+import org.lcsim.contrib.seedtracker.diagnostic.FindableTracks;
+import org.lcsim.contrib.seedtracker.diagnostic.ISeedTrackerDiagnostics;
+import org.lcsim.contrib.seedtracker.diagnostic.SeedValidator;
+import org.lcsim.event.MCParticle;
+import org.lcsim.fit.helicaltrack.HelicalTrackHit;
+import org.lcsim.math.chisq.ChisqProb;
+import org.lcsim.util.aida.AIDA;
+
+/**
+ *
+ * @author cozzy
+ */
+public class SeedTrackerDiagnostics extends EmptySeedTrackerDiagnostics implements ISeedTrackerDiagnostics{
+
+    AIDA aida = AIDA.defaultInstance();
+     
+    private double purity_cutoff = 0.0; 
+    private String prefix = ""; 
+    private boolean debugOut = true; 
+    
+    public SeedTrackerDiagnostics(){
+
+    }
+    
+    /**
+     * Generates diagnostic plots given a list of seed candidates and a strategy.
+     * @param seedlist
+     * @param strategy
+     */
+    @Override
+    public void fireFinalDiagnostics(List<SeedCandidate> seedlist){
+        
+        System.out.println(" After merging: "+seedlist.size());
+        Map<SeedCandidate,SeedValidator> vmap = generateValidators(seedlist);
+        makePurityPlots(vmap);        
+        Set<MCParticle> likelyMCs = generateLikelyMCSet(vmap);
+        makeEfficiencyPlots(likelyMCs,currentStrategy);
+    }
+    
+   /**
+    * Sets the purity cutoff for a track's MC to be considered found when 
+    * calculating efficiency. Default is 0.0. 
+    * @param new_purity_cutoff
+    */
+    public void setPurityCutoff(double new_purity_cutoff){
+        purity_cutoff = new_purity_cutoff; 
+    }
+    
+    /**
+     * Sets the prefix to be appended to the beginning of each plot (for example, a strategy name
+     * @param str the new prefix
+     */
+    public void setPrefix(String str){
+        this.prefix = str; 
+    }
+    
+    
+    @Override
+    public void fireStrategyChanged(SeedStrategy strategy) {
+        setPrefix("chisq cut = "+strategy.getMaxChisq()+"/");
+        super.fireStrategyChanged(strategy);
+    }
+
+
+    @Override
+    public void fireMergeIsBetterDiagnostics(SeedCandidate newSeed, SeedCandidate oldSeed, boolean returnValue) {
+        if (returnValue){
+            
+            SeedValidator oldV = new SeedValidator(oldSeed);
+            SeedValidator newV = new SeedValidator(newSeed);
+
+                if (oldV.getPurity() > newV.getPurity()){
+                     makeBadDecisionPlots(newSeed,oldSeed, oldV,newV);
+                }
+        }
+    }
+
+    @Override
+    public void fireFinderDone(int maxseeds, int nseed, int nfit, int nconfirm, List<SeedCandidate> confirmedSeeds) {
+//        System.out.println("Possible seeds: "+maxseeds);
+//        System.out.print(" Trial seeds: "+nseed);
+//        System.out.println(" Fitted seeds: "+nfit);
+//        System.out.println(" Confirmed seeds: "+nconfirm);
+//        System.out.println(" Confirmed seed candidates: "+confirmedSeeds.size());
+    }
+    
+    @Override
+    public void fireConfirmerExtenderWorkingSeedInfo(Task task, SeedCandidate seed, List<HelicalTrackHit> hitlist) {
+        if (debugOut) {
+            System.out.println("Oldcirclechisq: "+seed.getHelix().chisq()[0]);
+            System.out.println("Oldchisq: "+seed.getHelix().chisqtot());
+            System.out.println("Oldhits: "+seed.getHits().size());
+            System.out.println("Old Helix: "+seed.getHelix().toString()); 
+        }
+        return;
+    }
+
+    @Override
+    public void fireConfirmerExtenderFitNoSuccess(Task task, SeedCandidate Seed, HelicalTrackHit hit, HelixFitter fitter,  boolean optimize) {
+        if (debugOut) System.out.println("Circlechissq" + fitter.getCircleFit().chisq());
+    }
+
+    @Override
+   public void fireConfirmerExtenderFitSuccess(Task task, SeedCandidate Seed, HelicalTrackHit hit, HelixFitter fitter, double chisqbest, boolean optimize) {
+        if (debugOut) {
+            System.out.println("Good fit");
+            System.out.println("Chisq: "+fitter.getHelix().chisqtot());
+            System.out.println("Circle Chisq: "+fitter.getHelix().chisq()[0]);
+            System.out.println("New Helix: "+fitter.getHelix().toString());
+        }
+    }
+
+    @Override
+    public void fireConfirmerExtenderLayerDone(Task task, int numSeeds, List<SeedCandidate> seedlist) {
+        if (debugOut){
+            System.out.println(" "+task.toString()+" seeds: "+numSeeds);
+            System.out.println(" "+task.toString()+" seed candidates: "+seedlist.size());
+        }
+    }
+    
+        private void makeBadDecisionPlots(SeedCandidate newseed, SeedCandidate seed, SeedValidator oldV, SeedValidator newV) {
+
+        aida.cloud1D(prefix+"Bad Decision newseed chisq").fill(newseed.getHelix().chisqtot());
+        aida.cloud1D(prefix+"Bad Decision oldseed chisq").fill(seed.getHelix().chisqtot());
+        aida.cloud2D(prefix+"Bad Decision newseed vs. oldseed chisq").fill(newseed.getHelix().chisqtot(), seed.getHelix().chisqtot());
+        aida.cloud1D(prefix+"Bad Decision old seedpurity").fill(oldV.getPurity());
+        aida.cloud1D(prefix+"Bad Decision new seedpurity").fill(newV.getPurity());
+        
+        
+        if(oldV.getVerdict().isGoodValue()){
+            Hep3Vector p = oldV.getLikelyMC().getMomentum();
+            double pt = Math.sqrt(p.x() * p.x() + p.y() * p.y());
+            aida.cloud1D(prefix+"Bad Decision real particle transverse momentum").fill(pt);
+        
+            Hep3Vector r = oldV.getLikelyMC().getOrigin();
+            double rc = Math.sqrt(r.x()*r.x()+r.y()*r.y()); 
+            aida.cloud1D(prefix + "Bad Decision real particle start radius (cylindrical)").fill(rc);
+        }
+        
+    }
+
+ 
+    //makes purity plots
+    private void makePurityPlots(Map<SeedCandidate, SeedValidator> vmap) {
+        
+        for (SeedCandidate s : vmap.keySet()) {
+
+            SeedValidator v = vmap.get(s);
+   
+            if (v.getVerdict().isGoodValue()) {
+                aida.cloud1D(prefix+"Good seeds chisq").fill(s.getHelix().chisqtot());
+                aida.cloud1D(prefix+"Good seeds numhits").fill(s.getHits().size());
+                aida.cloud1D(prefix+"Good seeds pt").fill(s.getHelix().pT(5.0));
+            } else {
+                aida.cloud1D(prefix+"Bad seeds chisq").fill(s.getHelix().chisqtot());
+                aida.cloud1D(prefix+"Bad seeds numhits").fill(s.getHits().size());
+                aida.cloud1D(prefix+"Bad seeds pt").fill(s.getHelix().pT(5.0));
+            }
+            
+            aida.cloud1D(prefix+"purity").fill(v.getPurity());
+            aida.cloud2D(prefix+"purity vs. numHits").fill(v.getPurity(), s.getHits().size());
+            aida.cloud2D(prefix+"purity vs. pt").fill(v.getPurity(), s.getHelix().pT(5.0));
+            aida.cloud2D(prefix+"purity vs. cth").fill(v.getPurity(), s.getHelix().cth());
+            aida.cloud2D(prefix+"purity vs. chisq").fill(v.getPurity(), s.getHelix().chisqtot());
+            
+            double chisqdof = ChisqProb.gammq(s.getHelix().chisqtot(), s.getHits().size()-1); 
+            
+            aida.cloud2D(prefix+"purity vs. (1 - chisq_cdf(chisq,ndof)").fill(v.getPurity(), chisqdof);
+            aida.cloud2D(prefix+"purity cs. dca").fill(v.getPurity(), s.getHelix().dca());
+        }
+    }
+    
+    private void makeEfficiencyPlots(Set<MCParticle> likelyMCs, SeedStrategy strat){
+        
+        FindableTracks findable = new FindableTracks(strat, hitManager);
+        findable.setBField(bField);
+        
+        List<MCParticle> MCs = new ArrayList<MCParticle>(); 
+        MCs.addAll(event.getMCParticles());
+        
+        Iterator iter = MCs.iterator();
+
+            //remove all none findable MCs
+            while(iter.hasNext()){
+                if(!findable.isFindable((MCParticle)iter.next()))
+                    iter.remove();
+            }
+
+            int numFindable = MCs.size(); 
+            aida.cloud1D(prefix+"Number findable").fill(numFindable);
+
+            
+            // remove all the MC's we've found... this gives us findable - found
+            MCs.removeAll(likelyMCs);
+
+            int numFound = numFindable - MCs.size(); // findable - (findable - found) = found 
+            
+            aida.cloud1D(prefix+"Num found (purity cutoff="+purity_cutoff+") ").fill(numFound);
+            
+            if(numFindable > 0){
+                double eff = (double) numFound / (double) numFindable;
+                aida.cloud1D(prefix+"Efficiency").fill(eff);
+            }
+        
+    }
+    
+    
+    private Map<SeedCandidate,SeedValidator> generateValidators(List<SeedCandidate> seedlist) {
+        
+        Map<SeedCandidate,SeedValidator> ret = new HashMap<SeedCandidate,SeedValidator>(); 
+        for (SeedCandidate s : seedlist) {
+            ret.put(s, new SeedValidator(s));
+        }
+        
+        return ret;
+    }
+    
+    private Set<MCParticle> generateLikelyMCSet(Map<SeedCandidate, SeedValidator> vmap) {
+        
+        Set<MCParticle> set = new HashSet<MCParticle>(); 
+        
+        for (SeedValidator v : vmap.values()) {
+            if(v.getPurity()<purity_cutoff) continue; 
+            set.add(v.getLikelyMC());
+        }
+        return set; 
+    }   
+}
+    
\ No newline at end of file

lcsim/src/org/lcsim/contrib/Pelham/Example1
AnalysisDriver2.java added at 1.1
diff -N AnalysisDriver2.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ AnalysisDriver2.java	13 Aug 2008 18:36:14 -0000	1.1
@@ -0,0 +1,193 @@
+/*
+ * AnalysisDriver.java
+ *
+ * Created on February 11, 2008, 11:47 AM
+ *
+ */
+
+package org.lcsim.contrib.Pelham.Example1;
+
+import org.lcsim.contrib.seedtracker.analysis.HelixParamHistograms;
+import hep.aida.IHistogram1D;
+import java.util.List;
+import java.util.Map;
+import java.util.HashMap;
+
+import org.lcsim.contrib.seedtracker.SeedTrack;
+import org.lcsim.contrib.seedtracker.SeedCandidate;
+import org.lcsim.fit.helicaltrack.HelicalTrackFit;
+import org.lcsim.fit.helicaltrack.HelicalTrackHit;
+import org.lcsim.event.EventHeader;
+import org.lcsim.event.Track;
+import org.lcsim.event.MCParticle;
+import org.lcsim.contrib.seedtracker.analysis.HelixParamCalculator;
+import org.lcsim.util.aida.AIDA;
+import org.lcsim.util.Driver;
+
+
+/**
+ *
+ * @author Richard Partridge
+ * @version 1.0
+ */
+public class AnalysisDriver2 extends Driver {
+   private AIDA aida = AIDA.defaultInstance();
+   private IHistogram1D h1,h2,h3,h4,h5,h6;
+   
+    /** Creates a new instance of AnalysisDriver */
+    public AnalysisDriver2() {
+        h1 = aida.histogramFactory().createHistogram1D("Dat-Phi", 200, -20, 20);
+        h2 = aida.histogramFactory().createHistogram1D("Dat-Radius", 200, -10000, 10000);
+        h3 = aida.histogramFactory().createHistogram1D("Dat-Z", 200, -20, 20);
+        h4 = aida.histogramFactory().createHistogram1D("MC-Phi", 200, -20, 20);
+        h5 = aida.histogramFactory().createHistogram1D("MC-Radius", 200, -10000, 10000);
+        h6 = aida.histogramFactory().createHistogram1D("MC-Z", 200, -20, 20);
+    }
+    
+    /**
+     * Process the current event
+     * @param event EventHeader for this event
+     */
+    public void process(EventHeader event) {
+        List<Track> tracklist = event.getTracks();
+        Map<MCParticle, Track> trkmap = new HashMap<MCParticle, Track>();
+       
+        for (Track track : tracklist) {
+           Map<MCParticle, Integer> mcmap = new HashMap<MCParticle, Integer>();
+            if (track instanceof SeedTrack) {
+                SeedCandidate seed = ((SeedTrack) track).getSeedCandidate();
+                for (HelicalTrackHit hit : seed.getHits()) {
+                    HelicalTrackFit helix = seed.getHelix();
+                    MCParticle particle = hit.getMCParticles().get(0);
+                                  
+                   
+                    List<MCParticle> mclist = hit.getMCParticles();
+                    for (MCParticle mcp : mclist) {
+                        if (mcmap.containsKey(mcp)) {
+                            int entries = mcmap.get(mcp) + 1;
+                            mcmap.put(mcp, entries);
+                        } else
+                            mcmap.put(mcp, 1);
+                    }
+                }
+                MCParticle mcmatch = null;
+                int nmatch = 0;
+                for (Map.Entry<MCParticle, Integer> me : mcmap.entrySet()) {
+                    if (me.getValue() > nmatch) {
+                        nmatch = me.getValue();
+                        mcmatch = me.getKey();
+                    }
+                }
+                if (trkmap.containsKey(mcmatch)) System.out.println("more than one track associated with an MCParticle!!");
+                else trkmap.put(mcmatch, track);
+            }
+        }
+        
+        List<MCParticle> mclist = event.getMCParticles();
+        for (MCParticle mcp : mclist) {
+            if (mcp.getCharge() == 0) continue;
+            if (mcp.getGeneratorStatus() != mcp.FINAL_STATE) continue;
+ 
+            if (trkmap.containsKey(mcp)) {
+                Track trk = trkmap.get(mcp);
+                if (trk instanceof SeedTrack) {
+                    SeedTrack strk = (SeedTrack) trk;
+                    HelicalTrackFit fit = strk.getSeedCandidate().getHelix();
+                    
+                    //Class to draw histrogram
+                    HelixParamHistograms draw = new HelixParamHistograms(fit,mcp,event);
+         
+           
+            //---Histrograms------------Histograms--------------Histrograms---\\
+           /*
+            if(mcp.getCharge()>0)
+            {
+                draw.DrawDataPositive();
+                draw.DrawMCPositive();
+                draw.DrawResidualPositive();
+                draw.DrawPullPositive();  
+            }
+            else
+            {
+                draw.DrawDataNegative();
+                draw.DrawMCNegative();
+                draw.DrawResidualNegative();
+                draw.DrawPullNegative();               
+            }
+            draw.DrawResidual();
+            draw.DrawPull();
+            */
+                //helix from mc partcle  for layer hit 1st
+                //simtracker hit where is nrg
+                //pos from tracker hit 2nd
+                //compare fitted helix to mcparticle hits r phi z
+                //fit hit locations compared to 
+                                  
+                //Comparing hit locations
+                    
+            HelixParamCalculator calc = new HelixParamCalculator(mcp,event);
+            //find x0,y0 coordinates
+            double x0 = -1*calc.getDCA()*Math.sin(calc.getPhi0());
+            double y0 =    calc.getDCA()*Math.sin(calc.getPhi0());
+            //varible for easier calculation temp = C*s/2
+            double temp = ((calc.getMCOmega()*calc.getArcLength())/2);
+            //find x,y coordinates
+            double x = x0 + (((calc.getArcLength()*Math.sin(temp))/temp)*Math.cos(calc.getPhi0()-temp));
+            double y = y0 + (((calc.getArcLength()*Math.sin(temp))/temp)*Math.sin(calc.getPhi0()-temp));
+    
+            //Find MC phi, MC radius (r), MC z coordinate
+            double phi = Math.atan2(Math.sin(calc.getPhi0()-calc.getMCOmega()*(x-x0)),Math.cos(calc.getPhi0()+calc.getMCOmega()*(y-y0)));
+            double r = calc.getRadius();
+            double z = calc.getZ0() + calc.getArcLength()*calc.getSlopeSZPlane();
+            
+            //find fit x0,y0
+            double datx0 = -1*fit.dca()*Math.sin(fit.phi0());
+            double daty0 =    fit.dca()*Math.sin(fit.phi0());
+            List<HelicalTrackHit> hit = strk.getSeedCandidate().getHits();
+            double xh,yh,s,phih,rh,zh;
+            
+            for(int i=0;i<hit.size();i++)
+            {
+                //x,y coordinates from fit
+                xh = hit.get(i).x();
+                yh = hit.get(i).y();
+                //arclength
+                s  = (xh-x0)*Math.cos(fit.phi0())+(yh-y0)*Math.sin(fit.phi0());
+                //phi from fit
+                phih = Math.atan2(Math.sin(fit.phi0()-fit.curvature()*(xh-datx0)),Math.cos(fit.phi0()+fit.curvature()*(yh-daty0)));
+                //radius from fit
+                rh = fit.R();
+                //z coordinate
+                zh = fit.z0() + s*fit.slope();
+                //put into histogram
+                h1.fill(phih);
+                h2.fill(rh);
+                h3.fill(zh);
+            }
+            h4.fill(phi);
+            h5.fill(r);
+            h6.fill(z);
+            
+            
+            aida.histogramFactory().subtract("Residual-Phi", h1, h4);
+            aida.histogramFactory().subtract("Residual-R", h2, h5);
+            aida.histogramFactory().subtract("Residual-Z", h3, h6);
+            
+           
+        }
+            }
+            if (!trkmap.containsKey(mcp)) {
+                List<HelicalTrackHit> hits = event.get(HelicalTrackHit.class, "HelicalTrackHits");
+                if (hits.size() > 6) {
+                    System.out.println("Failed to find track.  Found "+hits.size()+" hits @ theta = "
+                            +180.*Math.acos(mcp.getMomentum().z() / mcp.getMomentum().magnitude())/Math.PI);
+                    for (HelicalTrackHit hit : hits) {
+                        System.out.println("Hit in "+hit.getLayerIdentifier()+" at x= "+hit.x()+" y= "+hit.y()+" z= "+hit.z());
+                    }
+                }
+            }
+        }
+       
+        return;
+    }
+}
\ No newline at end of file

lcsim/src/org/lcsim/contrib/Pelham/Example1
MyStrategy.java added at 1.1
diff -N MyStrategy.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ MyStrategy.java	13 Aug 2008 18:36:14 -0000	1.1
@@ -0,0 +1,265 @@
+/*
+ * MyStrategy.java
+ *
+ * Created on April 12, 2008, 8:42 PM
+ *
+ */
+
+package org.lcsim.contrib.Pelham.Example1;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+import org.lcsim.contrib.seedtracker.SeedLayer;
+import org.lcsim.contrib.seedtracker.SeedLayer.SeedType;
+import org.lcsim.contrib.seedtracker.SeedStrategy;
+import org.lcsim.contrib.seedtracker.StrategyXMLUtils;
+import org.lcsim.geometry.subdetector.BarrelEndcapFlag;
+
+public class MyStrategy {
+    private List<SeedStrategy> _strategylist = new ArrayList<SeedStrategy>();
+    
+    public MyStrategy() {
+        
+        BarrelEndcapFlag barrel = BarrelEndcapFlag.BARREL;
+        BarrelEndcapFlag nend = BarrelEndcapFlag.ENDCAP_NORTH;
+        BarrelEndcapFlag send = BarrelEndcapFlag.ENDCAP_SOUTH;
+        
+        List<BarrelEndcapFlag> beflags = new ArrayList<BarrelEndcapFlag>();
+        beflags.add(nend);
+        beflags.add(send);
+        
+        //  Create an outside-in strategy for the barrel
+        List<SeedLayer> lyrlist = new ArrayList<SeedLayer>();
+        lyrlist.add(new SeedLayer("VertexBarrel",0,barrel,SeedType.Extend));
+        lyrlist.add(new SeedLayer("VertexBarrel",1,barrel,SeedType.Extend));
+        lyrlist.add(new SeedLayer("VertexBarrel",2,barrel,SeedType.Extend));
+        lyrlist.add(new SeedLayer("VertexBarrel",3,barrel,SeedType.Extend));
+        lyrlist.add(new SeedLayer("VertexBarrel",4,barrel,SeedType.Extend));
+        lyrlist.add(new SeedLayer("VertexEndcap",0,nend,SeedType.Extend));
+        lyrlist.add(new SeedLayer("VertexEndcap",1,nend,SeedType.Extend));
+        lyrlist.add(new SeedLayer("TrackerForward",0,nend,SeedType.Extend));
+        lyrlist.add(new SeedLayer("VertexEndcap",0,send,SeedType.Extend));
+        lyrlist.add(new SeedLayer("VertexEndcap",1,send,SeedType.Extend));
+        lyrlist.add(new SeedLayer("TrackerForward",0,send,SeedType.Extend));
+        lyrlist.add(new SeedLayer("TrackerBarrel",0,barrel,SeedType.Extend));
+        lyrlist.add(new SeedLayer("TrackerBarrel",1,barrel,SeedType.Confirm));
+        lyrlist.add(new SeedLayer("TrackerBarrel",2,barrel,SeedType.Seed));
+        lyrlist.add(new SeedLayer("TrackerBarrel",3,barrel,SeedType.Seed));
+        lyrlist.add(new SeedLayer("TrackerBarrel",4,barrel,SeedType.Seed));
+        SeedStrategy outsideinbarrel = new SeedStrategy("OutsideInBarrel",lyrlist);
+        _strategylist.add(outsideinbarrel);
+        
+        for (BarrelEndcapFlag endcap : beflags) {
+            
+            
+            //  Create an outside-in strategy for the disks
+            List<SeedLayer> lyrlist2 = new ArrayList<SeedLayer>();
+            lyrlist2.add(new SeedLayer("VertexBarrel",0,barrel,SeedType.Extend));
+            lyrlist2.add(new SeedLayer("VertexBarrel",1,barrel,SeedType.Extend));
+            lyrlist2.add(new SeedLayer("VertexBarrel",2,barrel,SeedType.Extend));
+            lyrlist2.add(new SeedLayer("VertexEndcap",0,endcap,SeedType.Extend));
+            lyrlist2.add(new SeedLayer("VertexEndcap",1,endcap,SeedType.Extend));
+            lyrlist2.add(new SeedLayer("VertexEndcap",2,endcap,SeedType.Extend));
+            lyrlist2.add(new SeedLayer("VertexEndcap",3,endcap,SeedType.Extend));
+            lyrlist2.add(new SeedLayer("TrackerForward",0,endcap,SeedType.Extend));
+            lyrlist2.add(new SeedLayer("TrackerForward",1,endcap,SeedType.Extend));
+            lyrlist2.add(new SeedLayer("TrackerBarrel",0,barrel,SeedType.Extend));
+            lyrlist2.add(new SeedLayer("TrackerBarrel",1,barrel,SeedType.Confirm));
+            lyrlist2.add(new SeedLayer("TrackerEndcap",0,endcap,SeedType.Confirm));
+            lyrlist2.add(new SeedLayer("TrackerEndcap",1,endcap,SeedType.Seed));
+            lyrlist2.add(new SeedLayer("TrackerEndcap",2,endcap,SeedType.Seed));
+            lyrlist2.add(new SeedLayer("TrackerEndcap",3,endcap,SeedType.Seed));
+            SeedStrategy outsideinendcap = new SeedStrategy("OutsideInEndcap",lyrlist2);
+            _strategylist.add(outsideinendcap);
+            
+            //  Create an outside-in strategy for the disks
+            List<SeedLayer> lyrlist3 = new ArrayList<SeedLayer>();
+            lyrlist3.add(new SeedLayer("VertexBarrel",0,barrel,SeedType.Extend));
+            lyrlist3.add(new SeedLayer("VertexBarrel",1,barrel,SeedType.Extend));
+            lyrlist3.add(new SeedLayer("VertexBarrel",2,barrel,SeedType.Extend));
+            lyrlist3.add(new SeedLayer("VertexBarrel",3,barrel,SeedType.Extend));
+            lyrlist3.add(new SeedLayer("VertexEndcap",0,endcap,SeedType.Extend));
+            lyrlist3.add(new SeedLayer("VertexEndcap",1,endcap,SeedType.Extend));
+            lyrlist3.add(new SeedLayer("TrackerForward",0,endcap,SeedType.Extend));
+            lyrlist3.add(new SeedLayer("TrackerBarrel",0,barrel,SeedType.Extend));
+            lyrlist3.add(new SeedLayer("TrackerBarrel",1,barrel,SeedType.Confirm));
+            lyrlist3.add(new SeedLayer("TrackerBarrel",2,barrel,SeedType.Seed));
+            lyrlist3.add(new SeedLayer("TrackerBarrel",3,barrel,SeedType.Seed));
+            lyrlist3.add(new SeedLayer("TrackerEndcap",3,endcap,SeedType.Seed));
+            SeedStrategy outsideinendcap3 = new SeedStrategy("OutsideInEndcap3",lyrlist3);
+            _strategylist.add(outsideinendcap3);
+            
+            //  Create an outside-in strategy for the disks
+            List<SeedLayer> lyrlist4 = new ArrayList<SeedLayer>();
+            lyrlist4.add(new SeedLayer("VertexBarrel",0,barrel,SeedType.Extend));
+            lyrlist4.add(new SeedLayer("VertexBarrel",1,barrel,SeedType.Extend));
+            lyrlist4.add(new SeedLayer("VertexBarrel",2,barrel,SeedType.Extend));
+            lyrlist4.add(new SeedLayer("VertexBarrel",3,barrel,SeedType.Extend));
+            lyrlist4.add(new SeedLayer("VertexEndcap",0,endcap,SeedType.Extend));
+            lyrlist4.add(new SeedLayer("VertexEndcap",1,endcap,SeedType.Extend));
+            lyrlist4.add(new SeedLayer("VertexEndcap",2,endcap,SeedType.Extend));
+            lyrlist4.add(new SeedLayer("TrackerForward",0,endcap,SeedType.Extend));
+            lyrlist4.add(new SeedLayer("TrackerBarrel",0,barrel,SeedType.Extend));
+            lyrlist4.add(new SeedLayer("TrackerBarrel",1,barrel,SeedType.Confirm));
+            lyrlist4.add(new SeedLayer("TrackerBarrel",2,barrel,SeedType.Seed));
+            lyrlist4.add(new SeedLayer("TrackerEndcap",2,endcap,SeedType.Seed));
+            lyrlist4.add(new SeedLayer("TrackerEndcap",3,endcap,SeedType.Seed));
+            SeedStrategy outsideinendcap4 = new SeedStrategy("OutsideInEndcap4",lyrlist4);
+            _strategylist.add(outsideinendcap4);
+            
+            //  Create an outside-in strategy for the disks
+            List<SeedLayer> lyrlist5 = new ArrayList<SeedLayer>();
+            lyrlist5.add(new SeedLayer("VertexBarrel",0,barrel,SeedType.Extend));
+            lyrlist5.add(new SeedLayer("VertexBarrel",1,barrel,SeedType.Extend));
+            lyrlist5.add(new SeedLayer("VertexBarrel",2,barrel,SeedType.Extend));
+            lyrlist5.add(new SeedLayer("VertexEndcap",0,endcap,SeedType.Extend));
+            lyrlist5.add(new SeedLayer("VertexEndcap",1,endcap,SeedType.Extend));
+            lyrlist5.add(new SeedLayer("VertexEndcap",2,endcap,SeedType.Extend));
+            lyrlist5.add(new SeedLayer("TrackerForward",0,endcap,SeedType.Extend));
+            lyrlist5.add(new SeedLayer("TrackerBarrel",0,barrel,SeedType.Extend));
+            lyrlist5.add(new SeedLayer("TrackerBarrel",1,barrel,SeedType.Confirm));
+            lyrlist5.add(new SeedLayer("TrackerEndcap",1,endcap,SeedType.Seed));
+            lyrlist5.add(new SeedLayer("TrackerEndcap",2,endcap,SeedType.Seed));
+            lyrlist5.add(new SeedLayer("TrackerEndcap",3,endcap,SeedType.Seed));
+            SeedStrategy outsideinendcap5 = new SeedStrategy("OutsideInEndcap5",lyrlist5);
+            _strategylist.add(outsideinendcap5);
+            
+            //  Create an outside-in strategy for the disks
+            List<SeedLayer> lyrlist6 = new ArrayList<SeedLayer>();
+            lyrlist6.add(new SeedLayer("VertexBarrel",0,barrel,SeedType.Extend));
+            lyrlist6.add(new SeedLayer("VertexBarrel",1,barrel,SeedType.Extend));
+            lyrlist6.add(new SeedLayer("VertexEndcap",0,endcap,SeedType.Extend));
+            lyrlist6.add(new SeedLayer("VertexEndcap",1,endcap,SeedType.Extend));
+            lyrlist6.add(new SeedLayer("VertexEndcap",2,endcap,SeedType.Extend));
+            lyrlist6.add(new SeedLayer("VertexEndcap",3,endcap,SeedType.Extend));
+            lyrlist6.add(new SeedLayer("TrackerForward",0,endcap,SeedType.Extend));
+            lyrlist6.add(new SeedLayer("TrackerForward",1,endcap,SeedType.Confirm));
+            lyrlist6.add(new SeedLayer("TrackerForward",2,endcap,SeedType.Confirm));
+            lyrlist6.add(new SeedLayer("TrackerEndcap",1,endcap,SeedType.Seed));
+            lyrlist6.add(new SeedLayer("TrackerEndcap",2,endcap,SeedType.Seed));
+            lyrlist6.add(new SeedLayer("TrackerEndcap",3,endcap,SeedType.Seed));
+            SeedStrategy outsideinendcap6 = new SeedStrategy("OutsideInEndcap6",lyrlist6);
+            _strategylist.add(outsideinendcap6);
+            
+            //  Create an outside-in strategy for the disks
+            List<SeedLayer> lyrlist7 = new ArrayList<SeedLayer>();
+            lyrlist7.add(new SeedLayer("VertexBarrel",0,barrel,SeedType.Extend));
+            lyrlist7.add(new SeedLayer("VertexBarrel",1,barrel,SeedType.Extend));
+            lyrlist7.add(new SeedLayer("VertexEndcap",0,endcap,SeedType.Extend));
+            lyrlist7.add(new SeedLayer("VertexEndcap",1,endcap,SeedType.Extend));
+            lyrlist7.add(new SeedLayer("VertexEndcap",2,endcap,SeedType.Extend));
+            lyrlist7.add(new SeedLayer("VertexEndcap",3,endcap,SeedType.Extend));
+            lyrlist7.add(new SeedLayer("TrackerForward",0,endcap,SeedType.Extend));
+            lyrlist7.add(new SeedLayer("TrackerForward",1,endcap,SeedType.Confirm));
+            lyrlist7.add(new SeedLayer("TrackerForward",2,endcap,SeedType.Seed));
+            lyrlist7.add(new SeedLayer("TrackerEndcap",2,endcap,SeedType.Seed));
+            lyrlist7.add(new SeedLayer("TrackerEndcap",3,endcap,SeedType.Seed));
+            SeedStrategy outsideinendcap7 = new SeedStrategy("OutsideInEndcap7",lyrlist7);
+            _strategylist.add(outsideinendcap7);
+            
+            //  Create an inside out for the forward region
+            List<SeedLayer> lyrlist8 = new ArrayList<SeedLayer>();
+            lyrlist8.add(new SeedLayer("VertexBarrel",0,barrel,SeedType.Extend));
+            lyrlist8.add(new SeedLayer("VertexBarrel",1,barrel,SeedType.Extend));
+            lyrlist8.add(new SeedLayer("VertexEndcap",0,endcap,SeedType.Seed));
+            lyrlist8.add(new SeedLayer("VertexEndcap",1,endcap,SeedType.Seed));
+            lyrlist8.add(new SeedLayer("VertexEndcap",2,endcap,SeedType.Seed));
+            lyrlist8.add(new SeedLayer("VertexEndcap",3,endcap,SeedType.Confirm));
+            lyrlist8.add(new SeedLayer("TrackerForward",0,endcap,SeedType.Extend));
+            lyrlist8.add(new SeedLayer("TrackerForward",1,endcap,SeedType.Extend));
+            lyrlist8.add(new SeedLayer("TrackerForward",2,endcap,SeedType.Extend));
+            lyrlist8.add(new SeedLayer("TrackerEndcap",2,endcap,SeedType.Extend));
+            lyrlist8.add(new SeedLayer("TrackerEndcap",3,endcap,SeedType.Extend));
+            SeedStrategy outsideinendcap8 = new SeedStrategy("InsideOutEndcap1",lyrlist8);
+            _strategylist.add(outsideinendcap8);
+            
+            //  Create an inside out for the forward region
+            List<SeedLayer> lyrlist9 = new ArrayList<SeedLayer>();
+            lyrlist9.add(new SeedLayer("VertexBarrel",0,barrel,SeedType.Extend));
+            lyrlist9.add(new SeedLayer("VertexBarrel",1,barrel,SeedType.Extend));
+            lyrlist9.add(new SeedLayer("VertexEndcap",0,endcap,SeedType.Seed));
+            lyrlist9.add(new SeedLayer("VertexEndcap",1,endcap,SeedType.Seed));
+            lyrlist9.add(new SeedLayer("VertexEndcap",2,endcap,SeedType.Seed));
+            lyrlist9.add(new SeedLayer("VertexEndcap",3,endcap,SeedType.Extend));
+            lyrlist9.add(new SeedLayer("TrackerForward",0,endcap,SeedType.Confirm));
+            lyrlist9.add(new SeedLayer("TrackerForward",1,endcap,SeedType.Extend));
+            lyrlist9.add(new SeedLayer("TrackerForward",2,endcap,SeedType.Extend));
+            lyrlist9.add(new SeedLayer("TrackerEndcap",2,endcap,SeedType.Extend));
+            lyrlist9.add(new SeedLayer("TrackerEndcap",3,endcap,SeedType.Extend));
+            SeedStrategy outsideinendcap9 = new SeedStrategy("InsideOutEndcap2",lyrlist9);
+            _strategylist.add(outsideinendcap9);
+            
+            //  Create an inside out for the forward region
+            List<SeedLayer> lyrlist10 = new ArrayList<SeedLayer>();
+            lyrlist10.add(new SeedLayer("VertexBarrel",0,barrel,SeedType.Seed));
+            lyrlist10.add(new SeedLayer("VertexBarrel",1,barrel,SeedType.Seed));
+            lyrlist10.add(new SeedLayer("VertexBarrel",2,barrel,SeedType.Extend));
+            lyrlist10.add(new SeedLayer("VertexBarrel",3,barrel,SeedType.Extend));
+            lyrlist10.add(new SeedLayer("VertexBarrel",4,barrel,SeedType.Extend));
+            lyrlist10.add(new SeedLayer("TrackerBarrel",0,barrel,SeedType.Seed));
+            lyrlist10.add(new SeedLayer("TrackerBarrel",1,barrel,SeedType.Confirm));
+            lyrlist10.add(new SeedLayer("TrackerBarrel",2,barrel,SeedType.Extend));
+            lyrlist10.add(new SeedLayer("TrackerBarrel",3,barrel,SeedType.Extend));
+            lyrlist10.add(new SeedLayer("TrackerBarrel",4,barrel,SeedType.Extend));
+            lyrlist10.add(new SeedLayer("VertexEndcap",0,endcap,SeedType.Extend));
+            lyrlist10.add(new SeedLayer("VertexEndcap",1,endcap,SeedType.Extend));
+            lyrlist10.add(new SeedLayer("VertexEndcap",2,endcap,SeedType.Extend));
+            lyrlist10.add(new SeedLayer("VertexEndcap",3,endcap,SeedType.Extend));
+            lyrlist10.add(new SeedLayer("TrackerForward",0,endcap,SeedType.Extend));
+            lyrlist10.add(new SeedLayer("TrackerForward",1,endcap,SeedType.Extend));
+            lyrlist10.add(new SeedLayer("TrackerForward",2,endcap,SeedType.Extend));
+            lyrlist10.add(new SeedLayer("TrackerEndcap",2,endcap,SeedType.Extend));
+            lyrlist10.add(new SeedLayer("TrackerEndcap",3,endcap,SeedType.Extend));
+            SeedStrategy outsideinendcap10 = new SeedStrategy("InsideOutEndcap3",lyrlist10);
+            _strategylist.add(outsideinendcap10);
+            
+            //  Create an inside out for the forward region
+            List<SeedLayer> lyrlist11 = new ArrayList<SeedLayer>();
+            lyrlist11.add(new SeedLayer("VertexBarrel",0,barrel,SeedType.Extend));
+            lyrlist11.add(new SeedLayer("VertexBarrel",1,barrel,SeedType.Extend));
+            lyrlist11.add(new SeedLayer("VertexBarrel",2,barrel,SeedType.Extend));
+            lyrlist11.add(new SeedLayer("VertexBarrel",3,barrel,SeedType.Extend));
+            lyrlist11.add(new SeedLayer("VertexBarrel",4,barrel,SeedType.Extend));
+            lyrlist11.add(new SeedLayer("TrackerBarrel",0,barrel,SeedType.Extend));
+            lyrlist11.add(new SeedLayer("TrackerBarrel",1,barrel,SeedType.Extend));
+            lyrlist11.add(new SeedLayer("TrackerBarrel",2,barrel,SeedType.Extend));
+            lyrlist11.add(new SeedLayer("TrackerBarrel",3,barrel,SeedType.Extend));
+            lyrlist11.add(new SeedLayer("TrackerBarrel",4,barrel,SeedType.Extend));
+            lyrlist11.add(new SeedLayer("VertexEndcap",0,endcap,SeedType.Extend));
+            lyrlist11.add(new SeedLayer("VertexEndcap",1,endcap,SeedType.Seed));
+            lyrlist11.add(new SeedLayer("VertexEndcap",2,endcap,SeedType.Seed));
+            lyrlist11.add(new SeedLayer("VertexEndcap",3,endcap,SeedType.Seed));
+            lyrlist11.add(new SeedLayer("TrackerForward",0,endcap,SeedType.Confirm));
+            lyrlist11.add(new SeedLayer("TrackerForward",1,endcap,SeedType.Extend));
+            lyrlist11.add(new SeedLayer("TrackerForward",2,endcap,SeedType.Extend));
+            lyrlist11.add(new SeedLayer("TrackerEndcap",2,endcap,SeedType.Extend));
+            lyrlist11.add(new SeedLayer("TrackerEndcap",3,endcap,SeedType.Extend));
+            SeedStrategy outsideinendcap11 = new SeedStrategy("InsideOutEndcap4",lyrlist11);
+            _strategylist.add(outsideinendcap11);
+            
+        }
+        
+        for (SeedStrategy strategy : _strategylist) {
+            //  Set parameters for this strategy
+            strategy.putMinPT(1.0);        //  Set minimum pT at 1 GeV
+            strategy.putMaxDCA(10.0);       //  Set maximum d0 at 1 mm
+            strategy.putMaxZ0(10.0);        //  Set maximum z0 at 1 mm
+            strategy.putMinConfirm(1);     //  Require at least 1 confirm hit
+            strategy.putMinHits(7);        //  Require at least 7 total hits
+            strategy.putMaxChisq(50.);     //  Set maximum chi^2 at 50
+            strategy.putBadHitChisq(15.);  //  Set chi^2 change that gives preference to excluding the hit
+        }
+    }
+    
+    public List<SeedStrategy> getStrategies() {
+        return _strategylist;
+    }
+    
+    public static void main(String[] args){
+        MyStrategy strat = new MyStrategy(); 
+        
+        StrategyXMLUtils.writeStrategyListToFile(strat.getStrategies(), new File("C:\\out.xml"));
+        
+    }
+}

lcsim/src/org/lcsim/contrib/Pelham/Example1
VSExampleSegmenter.java added at 1.1
diff -N VSExampleSegmenter.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ VSExampleSegmenter.java	13 Aug 2008 18:36:14 -0000	1.1
@@ -0,0 +1,64 @@
+package org.lcsim.contrib.Pelham.Example1;
+
+import org.lcsim.units.clhep.SystemOfUnits;
+
+import org.lcsim.contrib.onoprien.tracking.geom.segmenters.CylindricalBarrelSegmenter;
+import org.lcsim.contrib.onoprien.tracking.geom.segmenters.DiskTrackerToWedgesSegmenter;
+import org.lcsim.contrib.onoprien.tracking.geom.segmenters.DiskTrackerToRingsSegmenter;
+import org.lcsim.contrib.onoprien.tracking.geom.segmenters.SubdetectorBasedSegmenter;
+
+/**
+ * 
+ * 
+ * 
+ * 
+ * @author D. Onoprienko
+ * @version $Id: VSExampleSegmenter.java,v 1.1 2008/08/13 18:36:14 keaheyp Exp $
+ */
+public class VSExampleSegmenter extends SubdetectorBasedSegmenter {
+  
+// -- Constructors :  ----------------------------------------------------------
+  
+  public VSExampleSegmenter() {
+    
+    // 25 um pixels in VTX Barrel
+    
+    CylindricalBarrelSegmenter vtxBarrelSegmenter = new CylindricalBarrelSegmenter("VertexBarrel");
+    vtxBarrelSegmenter.setStripLength(25.*SystemOfUnits.micrometer);
+    vtxBarrelSegmenter.setStripWidth(25.*SystemOfUnits.micrometer);
+    setSegmenter("VertexBarrel", vtxBarrelSegmenter);
+    
+    // 10 cm x 25 um strips in outer Tracker Barrel
+    
+    CylindricalBarrelSegmenter trackerBarrelSegmenter = new CylindricalBarrelSegmenter("TrackerBarrel");
+    trackerBarrelSegmenter.setStripLength(10.*SystemOfUnits.cm);
+    trackerBarrelSegmenter.setStripWidth(25.*SystemOfUnits.micrometer);
+    setSegmenter("TrackerBarrel", trackerBarrelSegmenter);
+    
+    // 25 um pixels in VTX Endcap
+    
+    DiskTrackerToRingsSegmenter vtxEndcapSegmenter = new DiskTrackerToRingsSegmenter("VertexEndcap");
+    vtxEndcapSegmenter.setStripLength(25.*SystemOfUnits.micrometer);
+    vtxEndcapSegmenter.setStripWidth(25.*SystemOfUnits.micrometer);
+    setSegmenter("VertexEndcap", vtxEndcapSegmenter);
+    
+    // 15 degrees stereo wedges in Forward Tracker
+    
+    DiskTrackerToWedgesSegmenter trackerForwardSegmenter = new DiskTrackerToWedgesSegmenter("TrackerForward");
+    trackerForwardSegmenter.setStripLength(10.*SystemOfUnits.cm);
+    trackerForwardSegmenter.setStripWidth(25.*SystemOfUnits.micrometer);
+    trackerForwardSegmenter.setNumberOfPhiSlices(24);
+    setSegmenter("TrackerForward", trackerForwardSegmenter);
+    
+    // 15 degrees stereo wedges in outer Tracker Endcap
+    
+    DiskTrackerToWedgesSegmenter trackerEndcapSegmenter = new DiskTrackerToWedgesSegmenter("TrackerEndcap");
+    trackerEndcapSegmenter.setNumberOfRadialSlices(new int[]{3,5,8,10, 10});
+    trackerEndcapSegmenter.setStripWidth(25.*SystemOfUnits.micrometer);
+    trackerEndcapSegmenter.setNumberOfPhiSlices(24);
+    setSegmenter("TrackerEndcap", trackerEndcapSegmenter);
+  }
+  
+// -- Private parts :  ---------------------------------------------------------
+  
+}

lcsim/src/org/lcsim/contrib/Pelham/Example1
VSExampleDriver.java added at 1.1
diff -N VSExampleDriver.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ VSExampleDriver.java	13 Aug 2008 18:36:14 -0000	1.1
@@ -0,0 +1,128 @@
+package org.lcsim.contrib.Pelham.Example1;
+
+import java.util.*;
+
+import hep.aida.*;
+import org.lcsim.event.EventHeader;
+import org.lcsim.event.SimTrackerHit;
+import org.lcsim.recon.cat.util.NoSuchParameterException;
+import org.lcsim.units.clhep.SystemOfUnits;
+import org.lcsim.util.Driver;
+import org.lcsim.util.aida.AIDA;
+import hep.physics.vec.BasicHep3Vector;
+import hep.physics.vec.Hep3Vector;
+import hep.physics.vec.VecOp;
+
+import org.lcsim.contrib.onoprien.tracking.clustering.ClusteringDriver;
+import org.lcsim.contrib.onoprien.tracking.clustering.clusterers.NearestNeighborClusterer;
+import org.lcsim.contrib.onoprien.tracking.digitization.SimToDigiDriver;
+import org.lcsim.contrib.onoprien.tracking.digitization.SimToDigiConverter;
+import org.lcsim.contrib.onoprien.tracking.digitization.algorithms.ConverterSimple;
+import org.lcsim.contrib.onoprien.tracking.geom.SegmentationManager;
+import org.lcsim.contrib.onoprien.tracking.geom.Segmenter;
+import org.lcsim.contrib.onoprien.tracking.geom.Sensor;
+import org.lcsim.contrib.onoprien.tracking.geom.SensorType;
+import org.lcsim.contrib.onoprien.tracking.hit.DigiTrackerHit;
+import org.lcsim.contrib.onoprien.tracking.hit.TrackerCluster;
+import org.lcsim.contrib.onoprien.tracking.hit.TrackerHit;
+import org.lcsim.contrib.onoprien.tracking.hitmaking.HitMakingDriver;
+import org.lcsim.contrib.onoprien.tracking.hitmaking.TrackerHitConverter;
+import org.lcsim.contrib.onoprien.tracking.hitmaking.TrackerHitMaker;
+import org.lcsim.contrib.onoprien.tracking.hitmaking.hitmakers.TrackerHitMakerBasic;
+import org.lcsim.contrib.onoprien.tracking.mctruth.MCTruth;
+import org.lcsim.contrib.onoprien.tracking.mctruth.MCTruthDriver;
+import org.lcsim.contrib.onoprien.tracking.mctruth.SimGroup;
+
+/**
+ * An Example of how to define virtual segmentation of the tracker, 
+ * and use {@link TrackerHitConverter} to create
+ * "standard" <tt>org.lcsim.event.TrackerHits</tt>.
+ * Parameters are chosen to define reasonable segmentation for SiD01.
+ * 
+ * 
+ * 
+ * @author D. Onoprienko
+ * @version $Id: VSExampleDriver.java,v 1.1 2008/08/13 18:36:14 keaheyp Exp $
+ */
+public class VSExampleDriver extends Driver {
+  
+// -- Constructors :  ----------------------------------------------------------
+  
+  public VSExampleDriver() {
+
+    add(new MCTruthDriver());
+    
+    // Segmentation description :
+    
+    Segmenter segmenter = new VSExampleSegmenter();
+    SegmentationManager segMan = new SegmentationManager(segmenter);
+    SegmentationManager.setDefaultInstance(segMan);
+    add(segMan);
+    
+    // Digitization :
+
+    SimToDigiConverter converter = new ConverterSimple();
+    SimToDigiDriver conversionDriver = new SimToDigiDriver(converter);
+    conversionDriver.set("ADD_INPUT_LIST_NAME", "TkrBarrHits");
+    conversionDriver.set("ADD_INPUT_LIST_NAME", "VtxBarrHits");
+    conversionDriver.set("ADD_INPUT_LIST_NAME", "TkrEndcapHits");
+    conversionDriver.set("ADD_INPUT_LIST_NAME", "VtxEndcapHits");
+    conversionDriver.set("ADD_INPUT_LIST_NAME", "TkrForwardHits");
+    conversionDriver.set("OUTPUT_MAP_NAME", "DigiTrackerHits");
+    add(conversionDriver);
+
+    // Clustering :
+    
+    ClusteringDriver clusteringDriver = new ClusteringDriver(new NearestNeighborClusterer());
+    clusteringDriver.set("INPUT_MAP_NAME","DigiTrackerHits");
+    clusteringDriver.set("OUTPUT_MAP_NAME","TrackerClusters");
+    add(clusteringDriver);
+    
+    // Hit making :
+    
+    TrackerHitMaker hitMaker = new TrackerHitMakerBasic();
+    HitMakingDriver hitMakingDriver = new HitMakingDriver(hitMaker);
+    hitMakingDriver.set("INPUT_MAP_NAME","TrackerClusters");
+    hitMakingDriver.set("OUTPUT_MAP_NAME","NewTrackerHits");
+    add(hitMakingDriver);
+     
+    // Conversion to "standard" org.lcsim.event.TrackerHit :  ------------------
+    
+//    TrackerHitConverter hitConverter = new TrackerHitConverter();
+//    hitConverter.set("INPUT_CLUSTER_MAP_NAME", "TrackerClusters");
+//    hitConverter.set("OUTPUT_HIT_LIST_NAME", "StandardTrackerHits");
+//    add(hitConverter);
+  }
+  
+  
+// -- Event processing :  ------------------------------------------------------
+
+  public void process(EventHeader event) {
+    
+//    System.out.println(" ");
+//    System.out.println("Event "+event.getEventNumber());
+
+    super.process(event);
+    
+    MCTruth mcTruth = (MCTruth) event.get("MCTruth");
+    
+//    System.out.println(" ");
+    
+    int n = 0;
+    HashMap<Sensor, List<DigiTrackerHit>> digiMap = 
+            (HashMap<Sensor, List<DigiTrackerHit>>) event.get("DigiTrackerHits");
+    for (List<DigiTrackerHit> digiList : digiMap.values()) n += digiList.size();
+    System.out.println("Created " + n + " DigiTrackerHits on " + digiMap.keySet().size() + " sensors");
+    
+    n = 0;
+    HashMap<Sensor, List<TrackerCluster>> clusterMap = 
+            (HashMap<Sensor, List<TrackerCluster>>) event.get("TrackerClusters");
+    for (List<TrackerCluster> clusterList : clusterMap.values()) n += clusterList.size();
+    System.out.println("Created " + n + " TrackerClusters on " + clusterMap.keySet().size() + " sensors");
+    
+//    n = 0;
+//    List<org.lcsim.event.TrackerHit> oldHitList = (List<org.lcsim.event.TrackerHit>) event.get("StandardTrackerHits");
+//    System.out.println("Created " + oldHitList.size() + " org.lcsim.event.TrackerHits");
+  }
+
+}

lcsim/src/org/lcsim/contrib/Pelham/Example1
MyTrackerDriver.java added at 1.1
diff -N MyTrackerDriver.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ MyTrackerDriver.java	13 Aug 2008 18:36:14 -0000	1.1
@@ -0,0 +1,57 @@
+/*
+ * MyTrackerDriver.java
+ *
+ * Created on March 29, 2006, 4:58 PM
+ *
+ */
+
+package org.lcsim.contrib.Pelham.Example1;
+
+import java.io.File;
+import org.lcsim.contrib.seedtracker.SeedTracker;
+//import org.lcsim.contrib.seedtracker.diagnostic.SeedTrackerDiagnostics;
+import org.lcsim.contrib.seedtracker.StrategyXMLUtils;
+import org.lcsim.event.EventHeader;
+import org.lcsim.fit.helicaltrack.HelicalTrackHitDriver;
+import org.lcsim.fit.helicaltrack.HelicalTrackHitDriver.HitType;
+import org.lcsim.util.Driver;
+
+/**
+ * Driver for testing the SeedTracker track finding algorithm.  This driver causes
+ * the SmearMCHits and SeedTracker drivers to be invoked for each event.
+ * @author Richard Partridge
+ * @version 1.0
+ */
+public class MyTrackerDriver extends Driver
+{  private int counter=0;
+   public MyTrackerDriver()
+    {
+       
+        //  Add the hit digitization driver (this example uses the virtual segment digitization code)
+        add(new VSExampleDriver());
+        
+        //  Add a driver to create HelicalTrackHits from the digitized hits
+        HelicalTrackHitDriver hitdriver = new HelicalTrackHitDriver();
+        hitdriver.addCollection("NewTrackerHits",HitType.VirtualSegmentation);
+        add(hitdriver);
+        
+        //  Create a list of strategies to be used in track finding
+        MyStrategy strategylist = new MyStrategy();
+        
+        //  Add a driver to do the track finding
+        SeedTracker st = new SeedTracker(strategylist.getStrategies());
+        //st.setDiagnostics(new SeedTrackDiag());
+        add(st);
+
+	//  Add an example analysis driver
+        add(new HistogramAnalysisDriver());
+	
+    }
+    public void process(EventHeader event)
+    {
+        System.out.println("Event Number:"+counter);
+        counter++;
+        super.process(event);
+        return;     
+    }    
+}

lcsim/src/org/lcsim/contrib/Pelham/Example1
HistogramAnalysisDriver.java 1.3 -> 1.4
diff -u -r1.3 -r1.4
--- HistogramAnalysisDriver.java	7 Aug 2008 21:07:09 -0000	1.3
+++ HistogramAnalysisDriver.java	13 Aug 2008 18:36:14 -0000	1.4
@@ -8,27 +8,23 @@
 package org.lcsim.contrib.Pelham.Example1;
 
 
-import hep.aida.IHistogram1D;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
+import org.lcsim.contrib.seedtracker.analysis.TrackHitHistograms;
+import org.lcsim.contrib.seedtracker.analysis.HelixParamHistograms;
 import java.util.List;
 import java.util.Map;
 import java.util.HashMap;
 
-import java.util.HashSet;
 import org.lcsim.contrib.seedtracker.SeedTrack;
 import org.lcsim.contrib.seedtracker.SeedCandidate;
 import org.lcsim.contrib.seedtracker.analysis.AnalysisUtils;
+import org.lcsim.contrib.seedtracker.analysis.EfficiencyHistograms;
 import org.lcsim.fit.helicaltrack.HelicalTrackFit;
 import org.lcsim.fit.helicaltrack.HelicalTrackHit;
 import org.lcsim.contrib.seedtracker.analysis.HelixParamCalculator;
+import org.lcsim.contrib.seedtracker.analysis.PurityHistograms;
 import org.lcsim.event.EventHeader;
 import org.lcsim.event.Track;
 import org.lcsim.event.MCParticle;
-import org.lcsim.event.RawTrackerHit;
-import org.lcsim.fit.helicaltrack.HelicalTrackFitter;
-import org.lcsim.fit.helicaltrack.HelicalTrackFitter.FitStatus;
 import org.lcsim.util.aida.AIDA;
 import org.lcsim.util.Driver;
 
@@ -40,27 +36,20 @@
  */
 public class HistogramAnalysisDriver extends Driver {
   private AIDA aida = AIDA.defaultInstance();
-  IHistogram1D thetaeff,pteff,dcaeff,z0eff,phi0eff,tanLeff,omegaeff,eff;
-  private double foundtracks=0,findabletracks=0,effi;
     /** Creates a new instance of AnalysisDriver */
     public HistogramAnalysisDriver() {
-        aida.tree().mkdir("Efficiency");
-        thetaeff = aida.histogramFactory().createHistogram1D("Efficiency/Theta","", 90, 0., 180., "type=efficiency");
-        pteff    = aida.histogramFactory().createHistogram1D("Efficiency/Pt","",  100,  0.,  50., "type=efficiency");
-        aida.tree().mkdir("Efficiency/HelixParam");
-        dcaeff   = aida.histogramFactory().createHistogram1D("Efficiency/HelixParam/DCA","", 120, -4.,   4., "type=efficiency");
-        z0eff    = aida.histogramFactory().createHistogram1D("Efficiency/HelixParam/z0","", 120, -4., 4., "type=efficiency");
-        phi0eff  = aida.histogramFactory().createHistogram1D("Efficiency/HelixParam/phi0","", 120, 0., 360., "type=efficiency");
-        tanLeff  = aida.histogramFactory().createHistogram1D("Efficiency/HelixParam/tanL","", 120, -10., 10., "type=efficiency");
-        omegaeff = aida.histogramFactory().createHistogram1D("Efficiency/HelixParam/Omega","", 120, -.02, .02, "type=efficiency");
-        eff = aida.histogramFactory().createHistogram1D("Efficiency/efficiency",200,0,3);
+        
     }       
     
     /**
      * Process the current event
      * @param event EventHeader for this event
      */
+        PurityHistograms draw3 = new PurityHistograms();
+    EfficiencyHistograms draw4 = new EfficiencyHistograms();
     public void process(EventHeader event){
+        
+       
         List<Track> tracklist = event.getTracks();
         Map<MCParticle, Track> trkmap = new HashMap<MCParticle, Track>();
       
@@ -109,7 +98,8 @@
                     //Class to draw histrogram
                     HelixParamHistograms draw = new HelixParamHistograms(fit,mcp,event);
                     HelixParamCalculator calc = new HelixParamCalculator(mcp, 5);
-           
+                    AnalysisUtils util = new AnalysisUtils();
+                    
             //---Helix Parameter Histrograms------------Helix Parameter Histrograms---\\
             aida.histogram1D("p", 200, 0, 50).fill(calc.getMCMomentum());
             if(mcp.getCharge()>0)
@@ -126,8 +116,7 @@
             draw.DrawPull();
             
             
-            List<HelicalTrackHit> hit = strk.getSeedCandidate().getHits();
-            TrackHitHistograms draw2 = new TrackHitHistograms(fit, mcp,event,hit);
+            TrackHitHistograms draw2 = new TrackHitHistograms(fit, mcp,event);
             
            //---MCParticle vs HelicalTrackFit----------------------------MCParticle vs HelicalTrackFit---
             draw2.drawMCParticlevHelicalTrackHit();
@@ -135,209 +124,14 @@
             //---SimTracker vs HelicalTrackFit---------------------------SimTracker vs HelicalTrackFit---
             draw2.drawSimTrackervHelicalTrack();
              
-            Map<MCParticle,Integer> occurrences = new HashMap<MCParticle,Integer>(); 
-            double purity=0;
-            double mostoccured;
-            int index;
-            
-            for (HelicalTrackHit h : strk.getSeedCandidate().getHits()){
-                List<MCParticle> mcpl = h.getMCParticles();
-                for(MCParticle part : mcpl){
-                  if(occurrences.containsKey(part)){
-                     index = occurrences.get(part);
-                     occurrences.put(part,index+1);
-                   }
-                   else {
-                     occurrences.put(part, 1);
-                   }
-                }
-                
-            }
-            if(occurrences.size()==1){
-                purity =1;
-            }
-            else{
-                mostoccured = -1;
-                for(MCParticle p : occurrences.keySet()){
-                    int occured = occurrences.get(p);
-                    if(occured>mostoccured){
-                        mostoccured = occured;
-                    }
-                }
-            purity = mostoccured / strk.getSeedCandidate().getHits().size();
-            }  
-            int hitsize = strk.getSeedCandidate().getHits().size();
-            String stratname = strk.getStrategy().getName();
-            if(purity<.5)aida.histogram1D("Purity/Purity<.5 only", 200, 0, 1.1).fill(purity);
-            //1D histograms
-            aida.histogram1D("Purity/Strat: "+stratname, 200,0,1.1).fill(purity);
-            aida.histogram1D("Purity/Purity", 200, 0, 1.1).fill(purity);
-            if(purity!=1)aida.histogram1D("Purity/Purity<1 only", 200, 0, 1.1).fill(purity);
-            aida.histogram1D("Purity/Purity to hits: "+hitsize, 300, 0, 1.1).fill(purity);
-            //2D histograms
-            aida.histogram1D("Purity/Hits v Purity", 200, 0, 20,"type=efficiency").fill(hitsize,purity);
-            aida.histogram1D("Purity/Theta v Purity", 100, 10, 100, "type=efficiency").fill(180*calc.getTheta()/Math.PI,purity);
-            aida.histogram1D("Purity/Pt v Purity", 200, 0, 70,"type=efficiency").fill(calc.getMCTransverseMomentum(),purity);
-            
-
-          }
-     }      
-            HelixParamCalculator calc = new HelixParamCalculator(mcp, 5);
-            double wgt=0;
-            double theta = calc.getTheta();
-            double pt = calc.getMCTransverseMomentum();
-            double dca = calc.getDCA();
-            double z0 = calc.getZ0();
-            double degreetheta = 180*theta / Math.PI;
-            Map<MCParticle,List<String>> hitlayermap = new HashMap<MCParticle,List<String>>();
-            Map<MCParticle,List<HelicalTrackHit>> hitordermap = new HashMap<MCParticle,List<HelicalTrackHit>>();
-            //!!
-           List<HelicalTrackHit> listjmk = event.get(HelicalTrackHit.class,"HelicalTrackHits");
-           List<MCParticle> temp = new ArrayList<MCParticle>();
-           AnalysisUtils util = new AnalysisUtils();
-            //!!
-           HelicalTrackFitter fitme = new HelicalTrackFitter();
-           
-           Collections.sort(listjmk, new Comparator() {
-
-                public int compare(Object o1, Object o2) {
-                    HelicalTrackHit h1 = (HelicalTrackHit) o1;
-                    HelicalTrackHit h2 = (HelicalTrackHit) o2;
-                    
-                    double t1, t2; 
-                    try{
-                        t1 = ((RawTrackerHit)h1.getRawHits().get(0)).getSimTrackerHit().get(0).getTime();
-                        t2 = ((RawTrackerHit)h2.getRawHits().get(0)).getSimTrackerHit().get(0).getTime();
-                    } catch(NullPointerException npe) {
-                        t1 = h1.getTime();
-                        t2 = h2.getTime(); 
-                    }
-                    
-                    return Double.compare(t1, t2);
-                }
-            });
-           
-            for(HelicalTrackHit hito : listjmk){
-                     List<MCParticle> mplist = hito.getMCParticles();
-                     for(MCParticle mp : mplist){
-                         if(hitlayermap.containsKey(mp)){
-                             hitlayermap.get(mp).add(hito.getLayerIdentifier());
-                             hitordermap.get(mp).add(hito);
-                         }
-                         else{
-                             ArrayList<String> layers = new ArrayList<String>();
-                             layers.add(hito.getLayerIdentifier());
-                             hitlayermap.put(mp, layers);
-                             ArrayList<HelicalTrackHit> trackhits = new ArrayList<HelicalTrackHit>();
-                             trackhits.add(hito);
-                             hitordermap.put(mp, trackhits);
-                             temp.add(mp);
-                         }
-                     }
-            }
-            List<MCParticle> testlist = util.FindMCParticleInAllHits(listjmk);
-            if(testlist.containsAll(temp)){System.out.println("true");}
-            HashSet<String> bleh = new HashSet<String>();
-            if(hitlayermap.containsKey(mcp)){
-                for(String e : hitlayermap.get(mcp)){
-                bleh.add(e);
-                }
-            }
-            
-            if(hitlayermap.containsKey(mcp) && bleh.size()>=7){
-                
-                if(trkmap.containsKey(mcp)){
-                    wgt=1;
-                    eff.fill(1);
-                    foundtracks++;
-                    findabletracks++;
-                    //pass to fitter in sim tracker give any strategy, 'helix fitter" first try helicaltrackfitter
-                }
-                else if(pt>1.1 && Math.abs(dca) < 9 && Math.abs(z0) < 9 && Math.cos(theta) < 0.985 ){
-                    findabletracks++;
-                    eff.fill(2);
-                    if(hitordermap.containsKey(mcp)){
-                        
-                        FitStatus status = fitme.fit(hitordermap.get(mcp));
-                        if(status==FitStatus.Success){
-                            System.out.println("Fitted Successfully From Analysis Driver");
-                            HelicalTrackFit trackfit = fitme.getFit();
-                            System.out.println("P: "+mcp.getMomentum().toString());
-                            for(HelicalTrackHit h : hitordermap.get(mcp)){
-                                System.out.print(h.getLayerIdentifier()+"(time:"+h.getTime()+")");
-                                System.out.print("("+h.getPosition()[0]+",");
-                                 System.out.print(h.getPosition()[1]+",");
-                                 System.out.print(h.getPosition()[2]+")");
-                                 System.out.println();
-                            }
-                            System.out.println("chisq0: "+trackfit.chisq()[0]);
-                            System.out.println("chisq1: "+trackfit.chisq()[1]);
-                            System.out.println("chisqtot: "+trackfit.chisqtot());
-                            System.out.println();
-                            
-                        }
-                        else{
-                            System.out.println("Failed to fit: "+status.toString());
-                        }
-                    }
-                    aida.histogram1D("Efficiency/NoNHit/MissCount",  100,  0.,  2.).fill(1);
-                    aida.histogram1D("Efficiency/NoNHit/Size",  100,  0.,  15.).fill(hitlayermap.get(mcp).size());
-                    aida.histogram1D("Efficiency/NoNHit/p",  100,  0.,  10.).fill(calc.getMCMomentum());
-                    aida.histogram1D("Efficiency/NoNHit/pt",  100,  0.,  14.).fill(calc.getMCTransverseMomentum());
-                    //aida.histogram1D("Efficiency/NoNHit/Endpoint",  100,  -5000.,  5000).fill(mcp.getEndPoint().x()*mcp.getEndPoint().x()+mcp.getEndPoint().y()*mcp.getEndPoint().y());
-                    aida.histogram1D("Efficiency/NoNHit/theta",  100,  0.,  180).fill(180*calc.getTheta()/Math.PI);
-                    aida.histogram1D("Efficiency/NoNHit/theta",  100,  0.,  180).fill(180*calc.getTheta()/Math.PI);
-                    if(aida.histogram1D("Efficiency/NoNHit/layer hit path/"+hitlayermap.get(mcp).toString(),  100,  0.,  360).entries()>1){
-                        aida.histogram1D("Efficiency/NoNHit/layer hit path/"+hitlayermap.get(mcp).toString(),  100,  0.,  360).setTitle("Interesting");
-                    }
-                    aida.histogram1D("Efficiency/NoNHit/layer hit path/"+hitlayermap.get(mcp).toString(),  100,  0, 360).fill(180*calc.getTheta()/Math.PI);
-                    
-                }
-                //particle type
+           //---Purity---------------------------Purity---
+            draw3.drawPurityHistograms(mcp, trk);
            
-            
-                //p vec,endpoint,daughters,charge
-                
-                //how many hits
-                //sim final state
-            
-                if(pt>1.1 && Math.abs(dca) < 9 && Math.abs(z0) < 9){
-                    thetaeff.fill(degreetheta, wgt);
-                    tanLeff.fill(calc.getSlopeSZPlane(), wgt);
-                    aida.histogram1D("Efficiency/MCType/tanL/"+mcp.getType().getName(),120, -10., 10., "type=efficiency").fill(calc.getSlopeSZPlane(), wgt);
-                }
-                //Pt Cuts: Cos(theta) DCA z0
-                if (Math.cos(theta) < 0.985 && Math.abs(dca) < 9 && Math.abs(z0) < 9) {
-                    pteff.fill(pt,wgt);
-                    aida.histogram1D("Efficiency/MCType/Pt/"+mcp.getType().getName(),  100,  0.,  50., "type=efficiency").fill(pt, wgt);
-                }
-                //Omega Cut: Pt
-                if(pt>1.1){
-                    omegaeff.fill(calc.getMCOmega(), wgt);
-                    aida.histogram1D("Efficiency/MCType/Omega/"+mcp.getType().getName(), 120, -.02, .02, "type=efficiency").fill(calc.getMCOmega(), wgt);
-                }
-                //Z0 Cuts: Pt DCA Cos(theta)
-                if(pt>1.1 && Math.abs(dca) < 9 && Math.cos(theta) < 0.985){
-                    z0eff.fill(calc.getZ0(), wgt);
-                    aida.histogram1D("Efficiency/MCType/z0/"+mcp.getType().getName(), 120, -4., 4., "type=efficiency").fill(calc.getZ0(), wgt);
-                }
-                //DCA Cuts: Pt Cos(theta) z0 
-                if(pt>1.1 &&  Math.cos(theta) < 0.985 && Math.abs(z0) < 9){
-                    dcaeff.fill(calc.getDCA(), wgt);
-                    aida.histogram1D("Efficiency/MCType/DCA/"+mcp.getType().getName(), 120, -4.,   4., "type=efficiency").fill(calc.getDCA(), wgt);
-                }
-                //Phi0 Cuts: Pt Cos(theta) z0 DCA
-                if(pt>1.1 &&  Math.cos(theta) < 0.985 && Math.abs(z0) < 9 && Math.abs(dca) < 9){
-                    phi0eff.fill(180*calc.getPhi0()/Math.PI, wgt);
-                    aida.histogram1D("Efficiency/MCType/phi0/"+mcp.getType().getName(), 120, 0., 360., "type=efficiency").fill(calc.getDCA(), wgt);
-                }
-            }       
+            }             
+          }            
+            //--Efficiency---------------------------Efficiency---
+            draw4.drawEfficiencyHistograms(mcp,event);
         }
-        effi = (foundtracks/findabletracks)*100;
-        System.out.println("%:"+ effi);
-        return;
-        }
-   
-
     }
+  }
 

lcsim/src/org/lcsim/contrib/Pelham/Example1
HelixParamHistograms.java removed after 1.3
diff -N HelixParamHistograms.java
--- HelixParamHistograms.java	25 Jul 2008 18:40:42 -0000	1.3
+++ /dev/null	1 Jan 1970 00:00:00 -0000
@@ -1,177 +0,0 @@
-package org.lcsim.contrib.Pelham.Example1;
-
-
-import org.lcsim.fit.helicaltrack.HelicalTrackFit;
-import org.lcsim.event.MCParticle;
-import org.lcsim.event.EventHeader;
-import org.lcsim.util.aida.AIDA;
-import org.lcsim.fit.helicaltrack.HelixParamCalculator;
-
-/**
- *
- * @author Pelham Keahey
- * Thursday, July 3rd 2008
- */
-public class HelixParamHistograms {
-    //helix from mc partcle  for layer hit 1st
-    //simtracker hit where is nrg
-    //pos from tracker hit 2nd
-    //compare fitted helix to mcparticle hits r phi z
-    private AIDA aida = AIDA.defaultInstance();
-    //Histrogram Variables
-    private double datom,dtl,ddca,dphi0,dz,dm,dtm;
-    private double mcom,mctl,mcdca,mcphi0,mcz,mcm,mctm;
-    //Error Variables
-    private double  curverror,sloperror,dcaerror,phi0error,z0error;
-       
-    //Constructor for Histrogram Drawer, Calculations done inside as well
-    public HelixParamHistograms(HelicalTrackFit fit,MCParticle mcp,EventHeader event)
-    {
-            
-           
-            HelixParamCalculator calc = new HelixParamCalculator(mcp,event);
-            //************ Data Calculations for MOMENTUM, OMEGA, TRANS. MOMENTUM *********
-            dm    = fit.p(calc.getMagField());
-            datom = fit.curvature();
-            dtm   = fit.pT(calc.getMagField());
-            
-            
-            //************* MCParticles Calculations for MOMENTUM, OMEGA, TRANS. MOMENTUM ******
-            mcm  = calc.getMCMomentum();
-            mcom = calc.getMCOmega();
-            mctm = calc.getMCTransverseMomentum();
-           
-            
-            //************ Tan Lamda Calculations tanL tsnL tan L *************    
-            dtl  = fit.slope();
-            mctl = calc.getSlopeSZPlane();
-            
-            
-            //************ DCA Calculations DCA DCA DCA DCA DCA DCA *************
-            ddca = fit.dca();
-            mcdca = calc.getDCA();
-            
-                      
-            //******* phi0 Calculation phi0 phi0 phi0 phi0 ******************
-            dphi0  = fit.phi0();
-            mcphi0 = calc.getPhi0();
-           
-                        
-            //******* z0 Calculations z0 z0 z0 z0 z0 z0 z0 ************************
-            dz = fit.z0();
-            mcz= calc.getZ0();
-            
-            
-            //Get error for calculating the pull
-            curverror = fit.getCurveError();
-            sloperror = fit.getSlopeError();
-            dcaerror  = fit.getDcaError();
-            phi0error = fit.getPhi0Error();
-            z0error   = fit.getZ0Error();
-
-            
-    }
-    public void DrawDataPositive()
-    {
-             
-        aida.histogram1D("HelixParam/1Dat-Positive/Omega", 300, -1*Math.pow(10, -3), Math.pow(10,-3)).fill(datom);
-        aida.histogram1D("HelixParam/1Dat-Positive/tanL", 200, -8., 8.).fill(dtl);
-        aida.histogram1D("HelixParam/1Dat-Positive/DCA", 200, -.1, .1).fill(ddca);
-        aida.histogram1D("HelixParam/1Dat-Positive/phi0", 200, -1., 3*Math.PI).fill(dphi0);
-        aida.histogram1D("HelixParam/1Dat-Positive/z0" , 200, -.1, .1).fill(dz);
-        aida.histogram1D("HelixParam/1Dat-Positive/Momentum", 200, 0., 200.).fill(dm);
-        aida.histogram1D("HelixParam/1Dat-Positive/Trans.Momentum", 200, 0., 150.).fill(dtm);
-    }  
-    public void DrawDataNegative()
-    {
-        aida.histogram1D("HelixParam/2Dat-Negative/Omega", 300, -1*Math.pow(10, -3), Math.pow(10,-3)).fill(datom);
-        aida.histogram1D("HelixParam/2Dat-Negative/tanL", 200, -8., 8.).fill(dtl);
-        aida.histogram1D("HelixParam/2Dat-Negative/DCA", 200, -.1, .1).fill(ddca);
-        aida.histogram1D("HelixParam/2Dat-Negative/phi0", 200, -1., 3*Math.PI).fill(dphi0);
-        aida.histogram1D("HelixParam/2Dat-Negative/z0" , 200, -.1, .1).fill(dz);
-        aida.histogram1D("HelixParam/2Dat-Negative/Momentum", 200, 0., 200.).fill(dm);
-        aida.histogram1D("HelixParam/2Dat-Negative/Trans.Momentum", 200, 0., 150.).fill(dtm);
-    }
-    public void DrawMCPositive()
-    {
-        
-        aida.histogram1D("HelixParam/3MC-Positive/Omega", 300, -1*Math.pow(10, -3), Math.pow(10,-3)).fill(mcom);
-        aida.histogram1D("HelixParam/3MC-Positive/tanL", 200, -8., 8.).fill(mctl);
-        aida.histogram1D("HelixParam/3MC-Positive/DCA", 200, -.01, .01).fill(mcdca);
-        aida.histogram1D("HelixParam/3MC-Positive/phi0", 200, -1., 3*Math.PI).fill(mcphi0);
-        aida.histogram1D("HelixParam/3MC-Positive/z0" , 200, -.001, .001).fill(mcz);
-        aida.histogram1D("HelixParam/3MC-Positive/Momentum", 200, 0., 200.).fill(mcm);  
-        aida.histogram1D("HelixParam/3MC-Positive/Trans.Momentum", 200, 0., 150.).fill(mctm);
-    }
-    public void DrawMCNegative()
-    {
-        aida.histogram1D("HelixParam/4MC-Negative/Omega", 300, -1*Math.pow(10, -3), Math.pow(10,-3)).fill(mcom);                 
-        aida.histogram1D("HelixParam/4MC-Negative/tanL", 200, -8., 8.).fill(mctl);
-        aida.histogram1D("HelixParam/4MC-Negative/DCA", 200, -.01, .01).fill(mcdca);
-        aida.histogram1D("HelixParam/4MC-Negative/phi0", 200, -1., 3*Math.PI).fill(mcphi0);
-        aida.histogram1D("HelixParam/4MC-Negative/z0" , 200, -.001, .001).fill(mcz);
-        aida.histogram1D("HelixParam/4MC-Negative/Momentum", 200, 0., 200.).fill(mcm);  
-        aida.histogram1D("HelixParam/4MC-Negative/Trans.Momentum", 200, 0., 150.).fill(mctm);
-        
-    }
-    public void DrawResidualPositive()
-    {
-        aida.histogram1D("HelixParam/Residual-Positive/Momentum"      , 200,                -10., 10.).fill(dm-mcm);  
-        aida.histogram1D("HelixParam/Residual-Positive/Trans.Momentum", 200,                 -5., 5.).fill(dtm-mctm); 
-        aida.histogram1D("HelixParam/Residual-Positive/Omega"         , 300, -5*Math.pow(10, -6), 5*Math.pow(10,-6)).fill(datom-mcom);
-        aida.histogram1D("HelixParam/Residual-Positive/tanL"          , 300,                -.01, .01).fill(dtl-mctl);
-        aida.histogram1D("HelixParam/Residual-Positive/DCA"           , 200,                 -.1, .1).fill(ddca-mcdca);   
-        aida.histogram1D("HelixParam/Residual-Positive/phi0"          , 200,               -.002, .002).fill(dphi0-mcphi0);
-        aida.histogram1D("HelixParam/Residual-Positive/z0"            , 200,                 -.1, .1).fill(dz-mcz);
-        
-    }
-    public void DrawResidualNegative()
-    {
-        aida.histogram1D("HelixParam/Residual-Negative/Momentum"      , 200,                -10., 10.).fill(dm-mcm);  
-        aida.histogram1D("HelixParam/Residual-Negative/Trans.Momentum", 200,                 -5., 5.).fill(dtm-mctm); 
-        aida.histogram1D("HelixParam/Residual-Negative/Omega"         , 300, -5*Math.pow(10, -6), 5*Math.pow(10,-6)).fill(datom-mcom);
-        aida.histogram1D("HelixParam/Residual-Negative/tanL"          , 300,                -.01, .01).fill(dtl-mctl);
-        aida.histogram1D("HelixParam/Residual-Negative/DCA"           , 200,                 -.1, .1).fill(ddca-mcdca);   
-        aida.histogram1D("HelixParam/Residual-Negative/phi0"          , 200,               -.002, .002).fill(dphi0-mcphi0);
-        aida.histogram1D("HelixParam/Residual-Negative/z0"            , 200,                 -.1, .1).fill(dz-mcz);
-        
-    }
-    public void DrawResidual()
-    {
-        aida.histogram1D("HelixParam/Residual-both/Momentum"      , 200,                -10., 10.).fill(dm-mcm);  
-        aida.histogram1D("HelixParam/Residual-both/Trans.Momentum", 200,                 -5., 5.).fill(dtm-mctm); 
-        aida.histogram1D("HelixParam/Residual-both/Omega"         , 300, -5*Math.pow(10, -6), 5*Math.pow(10,-6)).fill(datom-mcom);
-        aida.histogram1D("HelixParam/Residual-both/tanL"          , 300,                -.01, .01).fill(dtl-mctl);
-        aida.histogram1D("HelixParam/Residual-both/DCA"           , 200,                 -.1, .1).fill(ddca-mcdca);   
-        aida.histogram1D("HelixParam/Residual-both/phi0"          , 200,               -.002, .002).fill(dphi0-mcphi0);
-        aida.histogram1D("HelixParam/Residual-both/z0"            , 200,                 -.1, .1).fill(dz-mcz);
-        
-    }
-    public void DrawPullPositive()
-    {
-        aida.histogram1D("HelixParam/Pull-Positive/Omega", 300, -10, 10).fill((datom-mcom)/curverror);
-        aida.histogram1D("HelixParam/Pull-Positive/tanL" , 300, -11, 11).fill((dtl-mctl)/sloperror);
-        aida.histogram1D("HelixParam/Pull-Positive/dca"  , 300, -10, 10).fill((ddca-mcdca)/dcaerror);
-        aida.histogram1D("HelixParam/Pull-Positive/phi0" , 300, -11, 11).fill((dphi0-mcphi0)/phi0error);
-        aida.histogram1D("HelixParam/Pull-Positive/z0"   , 300, -50, 50).fill((dz-mcz)/z0error);
-        
-    }
-    public void DrawPullNegative()
-    {
-        aida.histogram1D("HelixParam/Pull-Negative/Omega", 300, -10, 10).fill((datom-mcom)/curverror);
-        aida.histogram1D("HelixParam/Pull-Negative/tanL" , 300, -11, 11).fill((dtl-mctl)/sloperror);
-        aida.histogram1D("HelixParam/Pull-Negative/dca"  , 300, -10, 10).fill((ddca-mcdca)/dcaerror);
-        aida.histogram1D("HelixParam/Pull-Negative/phi0" , 300, -11, 11).fill((dphi0-mcphi0)/phi0error);
-        aida.histogram1D("HelixParam/Pull-Negative/z0"   , 300, -50, 50).fill((dz-mcz)/z0error);
-    }
-    public void DrawPull()
-    {
-        aida.histogram1D("HelixParam/Pull-Both/Omega", 300, -10, 10).fill((datom-mcom)/curverror);
-        aida.histogram1D("HelixParam/Pull-Both/tanL" , 300, -11, 11).fill((dtl-mctl)/sloperror);
-        aida.histogram1D("HelixParam/Pull-Both/dca "  , 300, -10, 10).fill((ddca-mcdca)/dcaerror);
-        aida.histogram1D("HelixParam/Pull-Both/phi0" , 300, -11, 11).fill((dphi0-mcphi0)/phi0error);
-        aida.histogram1D("HelixParam/Pull-Both/z0  "   , 300, -50, 50).fill((dz-mcz)/z0error);
-    }
-    
-    
-}

lcsim/src/org/lcsim/contrib/Pelham/Example1
TrackHitHistograms.java removed after 1.2
diff -N TrackHitHistograms.java
--- TrackHitHistograms.java	25 Jul 2008 22:10:10 -0000	1.2
+++ /dev/null	1 Jan 1970 00:00:00 -0000
@@ -1,305 +0,0 @@
-/*
- * To change this template, choose Tools | Templates
- * and open the template in the editor.
- */
-
-package org.lcsim.contrib.Pelham.Example1;
-import java.util.Map;
-import hep.physics.vec.BasicHep3Vector;
-import hep.physics.vec.VecOp;
-import java.util.ArrayList;
-import org.lcsim.fit.helicaltrack.HelicalTrackFit;
-import org.lcsim.event.MCParticle;
-import org.lcsim.event.EventHeader;
-import org.lcsim.fit.helicaltrack.HelicalTrackHit;
-import org.lcsim.fit.helicaltrack.HelixParamCalculator;
-import org.lcsim.util.aida.AIDA;
-import java.util.List;
-import org.lcsim.event.SimTrackerHit;
-import org.lcsim.fit.helicaltrack.HelicalTrackCross;
-import org.lcsim.fit.helicaltrack.HelicalTrackStrip;
-import org.lcsim.fit.helicaltrack.HelixUtils;
-import java.util.HashMap;
-
-/**
- *
- * @author Pelham Keahey
- */
-public class TrackHitHistograms {
-   
-    private AIDA aida = AIDA.defaultInstance();
-    private double phi,r,z;
-    private double phih,rh,zh;
-    private double simr,simz,simphi;
-    HelicalTrackFit fit;
-    MCParticle mcp;
-    EventHeader event;
-    List<HelicalTrackHit> hitlist;
-    
-    /**
-     * 
-     * @param pfit
-     * @param pmcp
-     * @param pevent
-     * @param phit
-     */
-    public TrackHitHistograms(HelicalTrackFit pfit, MCParticle pmcp, EventHeader pevent,List<HelicalTrackHit> phit)
-    {
-        fit=pfit;
-        event = pevent;
-        mcp=pmcp;
-        hitlist = phit;
-       
-        
-    }
-    public void drawMCParticlevHelicalTrackHit()
-    {
-        HelixParamCalculator calc = new HelixParamCalculator(mcp, event);
-        double [] pars = new double[5];
-        pars[0]=calc.getDCA();
-        pars[1]=calc.getPhi0();
-        pars[2]=calc.getMCOmega();
-        pars[3]=calc.getZ0();
-        pars[4]=calc.getSlopeSZPlane();
-        
-        for(HelicalTrackHit hit : hitlist)
-          {
-            Map<HelicalTrackHit, Double> lol = new HashMap<HelicalTrackHit, Double>();
-            lol.put(hit, calc.getArcLength());
-            
-            HelicalTrackFit test = new HelicalTrackFit(pars,null, null, null, lol, null);
-            //Calculations for MC particle
-            //find x0,y0 coordinates
-            double x0 = calc.getX0();
-            double y0 = calc.getY0();
-           
-            //find the pathlength of the helix directly from the hit
-            double pathlength;
-            double closer=999999999,difference;
-            
-            List<Double> listd;
-            HelixUtils util = new HelixUtils();
-            if(hit.BarrelEndcapFlag().isBarrel()){
-                listd = util.PathToCylinder(fit, hit.r(), 5000, 10);
-                closer = 999999999;
-                pathlength = listd.get(0);
-                for(double temp : listd){
-                    BasicHep3Vector tempvec = (BasicHep3Vector) util.PointOnHelix(fit, temp);
-                    difference = Math.abs(hit.z()-tempvec.z());
-                    if(difference<closer){
-                        closer = difference;
-                        pathlength = temp;
-                        //System.out.println(arclength+":"+pathlength+"fitmap vs pathcylinderbarrel");
-                    }
-                }
-                                
-            }
-            else{
-                pathlength = util.PathToZPlane(fit, hit.z());
-                //System.out.println(arclength+":"+pathlength+"fitmap vs pathcylinderendcap");
-            }
-            
-            //varible for easier calculation temp = C*s/2
-            double temp = ((calc.getMCOmega()*pathlength)/2);
- 
-            //find x,y coordinates
-            double x = x0 + (((pathlength*Math.sin(temp))/temp)*Math.cos(calc.getPhi0()-temp));
-            double y = y0 + (((pathlength*Math.sin(temp))/temp)*Math.sin(calc.getPhi0()-temp));
-            
-            //Find MC phi, MC radius (r), MC z coordinate EDIT
-            phi = Math.atan2(y, x);
-                if(phi<0)
-                {
-                phi+=2*Math.PI;
-                }
-            r = Math.sqrt(x*x + y*y);
-            z = calc.getZ0() + pathlength*calc.getSlopeSZPlane();
-            
-            //Calculations directly from hit
-            
-            //Calculations directly from HelicalTrackHit 
-            phih = hit.phi();
-            rh = hit.r();
-            zh = hit.z();
-
-        if(hit.getLayerIdentifier().contains("Tracker"))
-            {
-                 if(hit.BarrelEndcapFlag().isBarrel())
-                    {
-                        
-                        //Residual Histograms
-                        aida.histogram1D("MCParticleVSHelicalTrackFit/Residual-Tracker/Barrel/r*phi/r*phi-"+hit.getLayerIdentifier(), 200, -25, 25).fill((r*phi)-(rh*phih));
-                        aida.histogram1D("MCParticleVSHelicalTrackFit/Residual-Tracker/Barrel/R/R-"+hit.getLayerIdentifier()  , 200, -.1,.1).fill(r-rh);
-                        aida.histogram1D("MCParticleVSHelicalTrackFit/Residual-Tracker/Barrel/Z/Z-"+hit.getLayerIdentifier()  , 200, -55,55).fill(z-zh);
-                    } 
-            }
-        if(hit.getLayerIdentifier().contains("Tracker"))
-            {
-                if(hit.BarrelEndcapFlag().isEndcap())
-                    {
-                        
-                        //Residual Histograms
-                        aida.histogram1D("MCParticleVSHelicalTrackFit/Residual-Tracker/EndCap/r*phi/r*phi-"+hit.getLayerIdentifier(), 200, -25, 25).fill((r*phi)-(rh*phih));
-                        aida.histogram1D("MCParticleVSHelicalTrackFit/Residual-Tracker/EndCap/R/R-"+hit.getLayerIdentifier()  , 200, -.1,.1).fill(r-rh);
-                        aida.histogram1D("MCParticleVSHelicalTrackFit/Residual-Tracker/EndCap/Z/Z-"+hit.getLayerIdentifier()  , 200, -5,5).fill(z-zh);
-                    }
-            }
-        if(hit.getLayerIdentifier().contains("Vertex"))
-            {
-                  if(hit.BarrelEndcapFlag().isBarrel())
-                     {
-                      
-                         //Residual Histograms
-                        aida.histogram1D("MCParticleVSHelicalTrackFit/Residual-Vertex/Barrel/r*phi/r*phi-"+hit.getLayerIdentifier(), 200, -.5, .5).fill((r*phi)-(rh*phih));
-                        aida.histogram1D("MCParticleVSHelicalTrackFit/Residual-Vertex/Barrel/R/R-"+hit.getLayerIdentifier()  , 200, -.1,.1).fill(r-rh);
-                        aida.histogram1D("MCParticleVSHelicalTrackFit/Residual-Vertex/Barrel/Z/Z-"+hit.getLayerIdentifier()  , 200, -55,55).fill(z-zh);
-                     }
-            }
-        if(hit.getLayerIdentifier().contains("Vertex"))
-            {
-                  if(hit.BarrelEndcapFlag().isEndcap())
-                     {
-                      
-                         //Residual Histograms
-                        aida.histogram1D("MCParticleVSHelicalTrackFit/Residual-Vertex/EndCap/r*phi/r*phi-"+hit.getLayerIdentifier(), 200, -30, 30).fill((r*phi)-(rh*phih));
-                        aida.histogram1D("MCParticleVSHelicalTrackFit/Residual-Vertex/EndCap/R/R-"+hit.getLayerIdentifier()  , 200, -.1,.1).fill(r-rh);
-                        aida.histogram1D("MCParticleVSHelicalTrackFit/Residual-Vertex/EndCap/Z/Z-"+hit.getLayerIdentifier()  , 200, -55,55).fill(z-zh);
-                     }
-            }
-        }
-    }
-    public void drawSimTrackervHelicalTrack()
-    {
-        
-        List<SimTrackerHit> simhitlist = new ArrayList<SimTrackerHit>();
-            
-            for(List<SimTrackerHit> l : event.get(SimTrackerHit.class))
-             {
-                 simhitlist.addAll(l);
-             }
-            
-            double [] alld;
-            double distancex,distancey,distancez;
-            double closest=999999999,testclose;
-            double zstripdiff;
-            double closestdiff;
-            double smallres;
-            double us,resunmeas;
-            
-            
-            for(HelicalTrackHit hit : hitlist)
-            {
-                if(hit instanceof HelicalTrackCross)
-                {
-                   smallres = 999999999;
-                   HelicalTrackCross cross = (HelicalTrackCross) hit;
-                       
-                   for(HelicalTrackStrip strip : cross.getStrips())
-                    {
-                       SimTrackerHit closesthit =null;
-                       closestdiff = 999999999;
-                     for(SimTrackerHit simhit : simhitlist)
-                     {
-                        BasicHep3Vector simclose = new BasicHep3Vector(simhit.getPoint());
-                        zstripdiff = Math.abs(simclose.z()- strip.origin().z());
-                         if(zstripdiff<closestdiff)
-                         {
-                            closestdiff = zstripdiff;
-                            closesthit = simhit;
-                         }
-                        
-                     }
-                        BasicHep3Vector closesthitvec = new BasicHep3Vector(closesthit.getPoint());
-                        BasicHep3Vector diffvector = new BasicHep3Vector();
-                        diffvector = (BasicHep3Vector) VecOp.sub(closesthitvec, strip.origin());
-                        us = VecOp.dot(diffvector, strip.u());
-                        resunmeas = strip.umeas() - us;
-                        if(resunmeas<smallres)
-                        {
-                            smallres = resunmeas;
-                        }
-                        aida.histogram1D("Unmeasured/EndCaps/"+Math.round(strip.origin().z())+":ZPOS Unmeasured Strip ", 200, -1,1).fill(smallres);
-                        
-                    }
-                 }
-             }
-             for(HelicalTrackHit hit : hitlist)
-             {
-                SimTrackerHit hitholder = null;
-                closest = 999999999;
-                 for(SimTrackerHit simhit : simhitlist)
-                 {
-                    
-                    //Search for the closest points
-                    alld = simhit.getPoint();
-                    distancex = hit.x()-alld[0];
-                    distancey = hit.y()-alld[1];
-                    distancez = hit.z()-alld[2];
-                    testclose = Math.sqrt((distancex*distancex) + (distancey*distancey)+(distancez*distancez));
-                    if(testclose<closest)
-                        {
-                        closest=testclose;
-                        hitholder = simhit;
-                        }
-                    
-                   
-                 }
-                
-                    alld = hitholder.getPoint();
-                    simr = Math.sqrt((alld[0]*alld[0])+(alld[1]*alld[1]));
-                    simz = alld[2];
-                    simphi = Math.atan2(alld[1], alld[0]);
-                    if(simphi<0)
-                        {
-                            simphi+=2*Math.PI;
-                        }
-                    
-                      rh   = hit.r();
-                      zh   = hit.z();
-                      phih = hit.phi();
-          
-          if(hit.getLayerIdentifier().contains("Tracker"))
-          {
-                 
-                 if(hit.BarrelEndcapFlag().isBarrel())
-                    {
-                         //Residual Histograms: SimTrackerHit - HelicalTrackHit
-                         aida.histogram1D("SimTrackerVSHelicalTrack/Tracker/Barrel/Residual/r*phi/R*Phi"+hit.getLayerIdentifier(), 200, -1,1).fill((simr*simphi)-(rh*phih));
-                         aida.histogram1D("SimTrackerVSHelicalTrack/Tracker/Barrel/Residual/R/R"+hit.getLayerIdentifier(), 200, -.5,.5).fill(simr-rh);
-                         aida.histogram1D("SimTrackerVSHelicalTrack/Tracker/Barrel/Residual/Z/Z"+hit.getLayerIdentifier(), 200, -55,55).fill(simz-zh);
-                    }
-                 
-                 else
-                    {
-                        //Residual Histograms: SimTrackerHit - HelicalTrackHit
-                        aida.histogram1D("SimTrackerVSHelicalTrack/Tracker/Endcap/Residual/r*phi/R*Phi"+hit.getLayerIdentifier(), 200, -10, 10).fill((simr*simphi)-(rh*phih));
-                        aida.histogram1D("SimTrackerVSHelicalTrack/Tracker/Endcap/Residual/R/R"+hit.getLayerIdentifier(), 200, -3,3).fill(simr-rh);
-                        aida.histogram1D("SimTrackerVSHelicalTrack/Tracker/Endcap/Residual/Z/Z"+hit.getLayerIdentifier(), 200, -3,3).fill(simz-zh);
-                     }
-          }
-          else
-          {
-                  if(hit.BarrelEndcapFlag().isBarrel())
-                     {
-                        
-                        //Residual Histograms: SimTrackerHit - HelicalTrackHit
-                        aida.histogram1D("SimTrackerVSHelicalTrack/Vertex/Barrel/Residual/r*phi/R*Phi"+hit.getLayerIdentifier(), 200, -1,1).fill((simr*simphi)-(rh*phih));
-                        aida.histogram1D("SimTrackerVSHelicalTrack/Vertex/Barrel/Residual/R/R"+hit.getLayerIdentifier(), 200, -1,1).fill(simr-rh);
-                        aida.histogram1D("SimTrackerVSHelicalTrack/Vertex/Barrel/Residual/Z/Z"+hit.getLayerIdentifier(), 200, -1,1).fill(simz-zh);
-                     }
-                  else
-                  {
-                        
-                        //Residual Histograms: SimTrackerHit - HelicalTrackHit
-                        aida.histogram1D("SimTrackerVSHelicalTrack/Vertex/Endcap/Residual/r*phi/R*Phi"+hit.getLayerIdentifier(), 200, -1, 1).fill((simr*simphi)-(rh*phih));
-                        aida.histogram1D("SimTrackerVSHelicalTrack/Vertex/Endcap/Residual/R/R"+hit.getLayerIdentifier(), 200, -1,1).fill(simr-rh);
-                        aida.histogram1D("SimTrackerVSHelicalTrack/Vertex/Endcap/Residual/Z/Z"+hit.getLayerIdentifier(), 200, -1,1).fill(simz-zh);
-                     }
-          }
-        }
-    }
-   
-    
-             
-    
-}
CVSspam 0.2.8