lcsim/src/org/lcsim/contrib/seedtracker/example
diff -N MyStrategy.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ MyStrategy.java 17 Jun 2008 00:39:16 -0000 1.1
@@ -0,0 +1,175 @@
+/*
+ * MyStrategy.java
+ *
+ * Created on April 12, 2008, 8:42 PM
+ *
+ */
+
+package org.lcsim.contrib.seedtracker.example;
+
+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.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);
+ }
+
+ for (SeedStrategy strategy : _strategylist) {
+ // Set parameters for this strategy
+ strategy.putMinPT(1.0); // Set minimum pT at 1 GeV
+ strategy.putMaxDCA(1.0); // Set maximum d0 at 1 mm
+ strategy.putMaxZ0(1.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;
+ }
+}
lcsim/src/org/lcsim/contrib/seedtracker/example
diff -N SeedTrackerDiagnostics.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ SeedTrackerDiagnostics.java 17 Jun 2008 00:39:16 -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.seedtracker.example;
+
+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