Commit in lcsim/src/org/lcsim/recon/tracking/seedtracker/example on MAIN | |||
AnalysisDriver.java | +142 | added 1.1 | |
MyStrategy.java | +256 | added 1.1 | |
MyTrackerDriver.java | +71 | added 1.1 | |
SeedTrackerDiagnostics.java | +250 | added 1.1 | |
VSExampleDriver.java | +128 | added 1.1 | |
VSExampleSegmenter.java | +64 | added 1.1 | |
+911 |
Refactor seedtracker to recon.tracking
diff -N AnalysisDriver.java --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ AnalysisDriver.java 27 Aug 2008 17:56:36 -0000 1.1 @@ -0,0 +1,142 @@
+/* + * AnalysisDriver.java + * + * Created on February 11, 2008, 11:47 AM + * + */ + +package org.lcsim.recon.tracking.seedtracker.example; + +import hep.aida.IHistogram1D; +import hep.physics.vec.Hep3Vector; + +import java.util.List; +import java.util.Map; +import java.util.HashMap; + +import org.lcsim.constants.Constants; +import org.lcsim.recon.tracking.seedtracker.SeedTrack; +import org.lcsim.recon.tracking.seedtracker.SeedCandidate; +import org.lcsim.fit.helicaltrack.HelicalTrackFit; +import org.lcsim.event.TrackerHit; +import org.lcsim.fit.helicaltrack.HelicalTrackHit; +import org.lcsim.event.EventHeader; +import org.lcsim.event.Track; +import org.lcsim.event.MCParticle; +import org.lcsim.util.aida.AIDA; +import org.lcsim.util.Driver; + + +/** + * + * @author Richard Partridge + * @version 1.0 + */ +public class AnalysisDriver extends Driver { + private AIDA aida = AIDA.defaultInstance(); + private IHistogram1D h1; + private IHistogram1D h2; + + /** Creates a new instance of AnalysisDriver */ + public AnalysisDriver() { + h1 = aida.histogramFactory().createHistogram1D("pT Efficiency", "", 100, 0., 50., "type=efficiency"); + h2 = aida.histogramFactory().createHistogram1D("theta Efficiency", "", 90, 0., 180., "type=efficiency"); + + } + + /** + * 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) { + List<TrackerHit> hitlist = track.getTrackerHits(); + Map<MCParticle, Integer> mcmap = new HashMap<MCParticle, Integer>(); + if (track instanceof SeedTrack) { + SeedCandidate seed = ((SeedTrack) track).getSeedCandidate(); + for (HelicalTrackHit hit : seed.getHits()) { + double x = hit.getCorrectedPosition().x(); + double y = hit.getCorrectedPosition().y(); + HelicalTrackFit helix = seed.getHelix(); + MCParticle particle = hit.getMCParticles().get(0); + Hep3Vector p = particle.getMomentum(); + double phi = Math.atan2(p.y(), p.x()); + double R = Math.sqrt(p.x()*p.x() + p.y()*p.y()) / (5. * Constants.fieldConversion); + double RS = R; + if (particle.getCharge() < 0.) RS = -1. * RS; + Hep3Vector start = particle.getOrigin(); + double xc = start.x() + RS * Math.sin(phi); + double yc = start.y() - RS * Math.cos(phi); +// double xc = helix.xc(); +// double yc = helix.yc(); +// double R = Math.abs(helix.R()); + double RHit = Math.sqrt((x-xc)*(x-xc) + (y-yc)*(y-yc)); + double drphi_ms = 0.; + if (helix.ScatterMap().containsKey(hit)) drphi_ms = helix.ScatterMap().get(hit).drphi(); + double drphi_res = hit.drphi(); + double drphi = Math.sqrt(drphi_ms*drphi_ms + drphi_res*drphi_res); + aida.cloud1D("r-phi residual for layer "+hit.getLayerIdentifier()).fill(RHit-R); + aida.cloud1D("Pull for layer "+hit.getLayerIdentifier()).fill((RHit - R)/drphi); + aida.cloud1D("Hit resolution for layer "+hit.getLayerIdentifier()).fill(drphi_res); + aida.cloud2D("Hit MS resolution for layer "+hit.getLayerIdentifier()).fill(drphi_ms, helix.pT(5.)); + 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; + double px = mcp.getPX(); + double py = mcp.getPY(); + double pz = mcp.getPZ(); + double pt = Math.sqrt(px*px + py*py); + double p = Math.sqrt(pt*pt + pz*pz); + double cth = pz / p; + double theta = 180. * Math.acos(cth) / Math.PI; + double wgt = 0.; + if (trkmap.containsKey(mcp)) wgt = 1.; + if (pt > 1.1) { + aida.profile1D("Efficiency vs theta", 90, 0., 180.).fill(theta, wgt); + h2.fill(theta, wgt); + aida.histogram1D("MC angle", 90, 0., 180.).fill(theta); + } + if (Math.abs(cth) < 0.985) { + aida.profile1D("Efficiency vs pT", 100, 0., 50.).fill(pt, wgt); + h1.fill(pt,wgt); + aida.histogram1D("MC pT", 100, 0., 50.).fill(pt); + } + 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
diff -N MyStrategy.java --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ MyStrategy.java 27 Aug 2008 17:56:36 -0000 1.1 @@ -0,0 +1,256 @@
+/* + * MyStrategy.java + * + * Created on April 12, 2008, 8:42 PM + * + */ + +package org.lcsim.recon.tracking.seedtracker.example; + +import java.util.ArrayList; +import java.util.List; +import org.lcsim.recon.tracking.seedtracker.SeedLayer; +import org.lcsim.recon.tracking.seedtracker.SeedLayer.SeedType; +import org.lcsim.recon.tracking.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); + + // 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; + } +}
diff -N MyTrackerDriver.java --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ MyTrackerDriver.java 27 Aug 2008 17:56:36 -0000 1.1 @@ -0,0 +1,71 @@
+/* + * MyTrackerDriver.java + * + * Created on March 29, 2006, 4:58 PM + * + */ + +package org.lcsim.recon.tracking.seedtracker.example; + +import java.util.List; +import org.lcsim.contrib.Pelham.Example1.HistogramAnalysisDriver; +import org.lcsim.recon.tracking.seedtracker.SeedStrategy; +import org.lcsim.recon.tracking.seedtracker.SeedTracker; +//import org.lcsim.contrib.seedtracker.diagnostic.SeedTrackerDiagnostics; +import org.lcsim.recon.tracking.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 +{ + 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); + + // Obtain a trained list of strategies from a saved resource. + // Because resources are loaded from inside the compiled JAR file, + // it is necessary to recompile when modifying a saved resource. + // StrategyXMLUtils.getDefaultStrategiesPrefix() will provide the correct + // prefix in the resource tree (i.e. "/org/lcsim/contrib/seedtracker/strategybuilder/strategies/") + List<SeedStrategy> stratlist = StrategyXMLUtils.getStrategyListFromResource(StrategyXMLUtils.getDefaultStrategiesPrefix()+"autogen_zpole_sid01.xml"); + + // For development / modifications, one may choose to load a strategy + // list from a local file instead of a resource. The line below shows + // an example of how to do this + +// List<SeedStrategy> stratlist = StrategyXMLUtils.getStrategyListFromFile(new File("/path/to/file/strategies.xml")); + + + // Add a driver to do the track finding + SeedTracker st = new SeedTracker(stratlist); + + //Enable diagnostics +// st.setDiagnostics(new SeedTrackerDiagnostics()); + + //Add the Driver + add(st); + + // Add an example analysis driver +// add (new HistogramAnalysisDriver()); + + } + public void process(EventHeader event) + { + super.process(event); + return; + } +}
diff -N SeedTrackerDiagnostics.java --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ SeedTrackerDiagnostics.java 27 Aug 2008 17:56:36 -0000 1.1 @@ -0,0 +1,250 @@
+/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ + +package org.lcsim.recon.tracking.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.recon.tracking.seedtracker.ConfirmerExtender.Task; +import org.lcsim.recon.tracking.seedtracker.diagnostic.EmptySeedTrackerDiagnostics; +import org.lcsim.recon.tracking.seedtracker.diagnostic.FindableTracks; +import org.lcsim.recon.tracking.seedtracker.diagnostic.ISeedTrackerDiagnostics; +import org.lcsim.recon.tracking.seedtracker.diagnostic.SeedValidator; +import org.lcsim.event.MCParticle; +import org.lcsim.fit.helicaltrack.HelicalTrackHit; +import org.lcsim.math.chisq.ChisqProb; +import org.lcsim.recon.tracking.seedtracker.HelixFitter; +import org.lcsim.recon.tracking.seedtracker.SeedCandidate; +import org.lcsim.recon.tracking.seedtracker.SeedStrategy; +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
diff -N VSExampleDriver.java --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ VSExampleDriver.java 27 Aug 2008 17:56:36 -0000 1.1 @@ -0,0 +1,128 @@
+package org.lcsim.recon.tracking.seedtracker.example; + +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/27 17:56:36 partridge 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"); + } + +}
diff -N VSExampleSegmenter.java --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ VSExampleSegmenter.java 27 Aug 2008 17:56:36 -0000 1.1 @@ -0,0 +1,64 @@
+package org.lcsim.recon.tracking.seedtracker.example; + +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/27 17:56:36 partridge 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 : --------------------------------------------------------- + +}