6 modified files
lcsim/src/org/lcsim/contrib/seedtracker
diff -u -r1.2 -r1.3
--- DefaultStrategy.java 10 Aug 2007 15:50:26 -0000 1.2
+++ DefaultStrategy.java 11 Aug 2007 00:17:32 -0000 1.3
@@ -11,39 +11,57 @@
import java.util.ArrayList;
import org.lcsim.contrib.seedtracker.SeedLayer.SeedType;
+import org.lcsim.geometry.subdetector.BarrelEndcapFlag;
/**
- *
+ * Define the default strategy to be used by the SeedTracker tracking algorithm. The default strategy may be
+ * over-ridden by calling the method SeedTracker.putStrategyList.
* @author Richard Partridge
* @version 1.0
*/
-public class DefaultStrategy
-{
+public class DefaultStrategy {
private List<SeedStrategy> StrategyList;
/** Creates a new instance of DefaultStrategy */
- public DefaultStrategy()
- {
+ public DefaultStrategy() {
StrategyList = new ArrayList();
+ // Barrel only strategies
+ List<SeedLayer> TB012Layers = new ArrayList();
+ TB012Layers.add(new SeedLayer("TrackerBarrel", 0, BarrelEndcapFlag.BARREL, SeedType.Seed));
+ TB012Layers.add(new SeedLayer("TrackerBarrel", 1, BarrelEndcapFlag.BARREL, SeedType.Seed));
+ TB012Layers.add(new SeedLayer("TrackerBarrel", 2, BarrelEndcapFlag.BARREL, SeedType.Seed));
+ StrategyList.add(new SeedStrategy("TB012",TB012Layers));
- List<SeedLayer> TD012Layers = new ArrayList();
- TD012Layers.add(new SeedLayer("TrackerEndcap", 0, SeedType.Seed));
- TD012Layers.add(new SeedLayer("TrackerEndcap", 1, SeedType.Seed));
- TD012Layers.add(new SeedLayer("TrackerEndcap", 2, SeedType.Seed));
-// StrategyList.add(new SeedStrategy("TD012",TD012Layers));
-
- List<SeedLayer> VB012Layers = new ArrayList();
- VB012Layers.add(new SeedLayer("VertexBarrel", 2, SeedType.Seed));
- VB012Layers.add(new SeedLayer("VertexBarrel", 3, SeedType.Seed));
- VB012Layers.add(new SeedLayer("VertexBarrel", 4, SeedType.Seed));
- VB012Layers.add(new SeedLayer("TrackerBarrel", 0, SeedType.Confirm));
-// VB012Layers.add(new SeedLayer("VertexBarrel", 0, SeedType.Confirm));
-// VB012Layers.add(new SeedLayer("VertexBarrel", 1, SeedType.Confirm));
- StrategyList.add(new SeedStrategy("VB012",VB012Layers));
+ List<BarrelEndcapFlag> belist = new ArrayList();
+ belist.add(BarrelEndcapFlag.ENDCAP_NORTH);
+ belist.add(BarrelEndcapFlag.ENDCAP_SOUTH);
+ for (BarrelEndcapFlag beflag : belist) {
+ List<SeedLayer> TD012Layers = new ArrayList();
+ TD012Layers.add(new SeedLayer("TrackerEndcap", 0, beflag, SeedType.Seed));
+ TD012Layers.add(new SeedLayer("TrackerEndcap", 2, beflag, SeedType.Seed));
+ TD012Layers.add(new SeedLayer("TrackerEndcap", 4, beflag, SeedType.Seed));
+ StrategyList.add(new SeedStrategy("TD012"+beflag.toString(),TD012Layers));
+
+ List<SeedLayer> TCALayers = new ArrayList();
+ TCALayers.add(new SeedLayer("TrackerBarrel", 0, BarrelEndcapFlag.BARREL, SeedType.Seed));
+ TCALayers.add(new SeedLayer("TrackerBarrel", 1, BarrelEndcapFlag.BARREL, SeedType.Seed));
+ TCALayers.add(new SeedLayer("TrackerEndcap", 4, beflag, SeedType.Seed));
+ StrategyList.add(new SeedStrategy("TCA"+beflag.toString(),TCALayers));
+
+ List<SeedLayer> TCBLayers = new ArrayList();
+ TCBLayers.add(new SeedLayer("TrackerBarrel", 0, BarrelEndcapFlag.BARREL, SeedType.Seed));
+ TCBLayers.add(new SeedLayer("TrackerEndcap", 2, beflag, SeedType.Seed));
+ TCBLayers.add(new SeedLayer("TrackerEndcap", 4, beflag, SeedType.Seed));
+ StrategyList.add(new SeedStrategy("TCB"+beflag.toString(),TCBLayers));
+ }
}
- public List<SeedStrategy> getStrategyList()
- {
+
+ /**
+ * Returns the default list of track-finding strategies
+ * @return List of strategies to be used by SeedTracker
+ */
+ public List<SeedStrategy> getStrategyList() {
return StrategyList;
}
}
lcsim/src/org/lcsim/contrib/seedtracker
diff -u -r1.1 -r1.2
--- HitManager.java 10 Aug 2007 15:50:26 -0000 1.1
+++ HitManager.java 11 Aug 2007 00:17:32 -0000 1.2
@@ -52,6 +52,10 @@
String identifier = LyrIdentifier(hit);
if (!_hitlist.containsKey(identifier)) {
_hitlist.put(identifier, new ArrayList<TrackerHit>());
+ _rmin.put(identifier,9999999.);
+ _rmax.put(identifier,0.);
+ _zmin.put(identifier,9999999.);
+ _zmax.put(identifier,-9999999.);
}
_hitlist.get(identifier).add(hit);
double r = Math.sqrt(Math.pow(hit.getPosition()[0],2)+Math.pow(hit.getPosition()[1],2));
@@ -76,17 +80,14 @@
}
/**
- * Return the list of tracker hits associated with a specified SeedLayer and list of BarrelEndcapFlags
+ * Return the list of tracker hits associated with a specified SeedLayer
* @param seedlayer Seedlayer to look at
- * @param beflaglist List of BarrelEndcapFlags to include
* @return List of TrackerHits
*/
- public List<TrackerHit> getTrackerHits(SeedLayer seedlayer, List<BarrelEndcapFlag> beflaglist) {
+ public List<TrackerHit> getTrackerHits(SeedLayer seedlayer) {
List<TrackerHit> hits = new ArrayList<TrackerHit>();
- for (BarrelEndcapFlag beflag : beflaglist) {
- String identifier = Identifier(seedlayer.getDetName(),seedlayer.getLayer(),beflag);
- if (_hitlist.containsKey(identifier)) hits.addAll(_hitlist.get(identifier));
- }
+ String identifier = Identifier(seedlayer.getDetName(),seedlayer.getLayer(),seedlayer.getBarrelEndcapFlag());
+ if (_hitlist.containsKey(identifier)) hits.addAll(_hitlist.get(identifier));
return hits;
}
@@ -106,63 +107,51 @@
}
/**
- * Return the smallest radius hit for a particular SeedLayer and list of BarrelEndcapFlags
+ * Return the smallest radius hit for a particular SeedLayer
* @param seedlayer SeedLayer to consider
- * @param beflaglist List of BarrelEndcapFlags to consider
* @return Minimum hit radius
*/
- public double getRMin(SeedLayer seedlayer, List<BarrelEndcapFlag> beflaglist) {
+ public double getRMin(SeedLayer seedlayer) {
double rmin = 9999999.;
- for (BarrelEndcapFlag beflag : beflaglist) {
- String identifier = Identifier(seedlayer.getDetName(),seedlayer.getLayer(),beflag);
- if (_rmin.containsKey(identifier)) rmin = Math.min(rmin,_rmin.get(identifier));
- }
- return rmin;
+ String identifier = Identifier(seedlayer.getDetName(), seedlayer.getLayer(), seedlayer.getBarrelEndcapFlag());
+ if (_rmin.containsKey(identifier)) rmin = Math.min(rmin, _rmin.get(identifier));
+ return rmin;
}
/**
- * Return the largest radius hit for a particular SeedLayer and list of BarrelEndcapFlags
+ * Return the largest radius hit for a particular SeedLayer
* @param seedlayer SeedLayer to consider
- * @param beflaglist List of BarrelEndcapFlags to consider
* @return Maximum hit radius
*/
- public double getRMax(SeedLayer seedlayer, List<BarrelEndcapFlag> beflaglist) {
+ public double getRMax(SeedLayer seedlayer) {
double rmax = 0.;
- for (BarrelEndcapFlag beflag : beflaglist) {
- String identifier = Identifier(seedlayer.getDetName(),seedlayer.getLayer(),beflag);
- if (_rmax.containsKey(identifier)) rmax = Math.max(rmax,_rmax.get(identifier));
- }
- return rmax;
+ String identifier = Identifier(seedlayer.getDetName(), seedlayer.getLayer(), seedlayer.getBarrelEndcapFlag());
+ if (_rmax.containsKey(identifier)) rmax = Math.max(rmax, _rmax.get(identifier));
+ return rmax;
}
/**
- * Return the minimum z coordinate for a hit in a particular SeedLayer and list of BarrelEndcapFlags
+ * Return the minimum z coordinate for a hit in a particular SeedLayer
* @param seedlayer SeedLayer to consider
- * @param beflaglist List of BarrelEndcapFlags to consider
* @return Minimum z coordinate
*/
- public double getZMin(SeedLayer seedlayer, List<BarrelEndcapFlag> beflaglist) {
+ public double getZMin(SeedLayer seedlayer) {
double zmin = 9999999.;
- for (BarrelEndcapFlag beflag : beflaglist) {
- String identifier = Identifier(seedlayer.getDetName(),seedlayer.getLayer(),beflag);
- if (_zmin.containsKey(identifier)) zmin = Math.min(zmin,_zmin.get(identifier));
- }
- return zmin;
+ String identifier = Identifier(seedlayer.getDetName(), seedlayer.getLayer(), seedlayer.getBarrelEndcapFlag());
+ if (_zmin.containsKey(identifier)) zmin = Math.min(zmin, _zmin.get(identifier));
+ return zmin;
}
/**
- * Return the maximum z coordinate for a hit in a particular SeedLayer and list of BarrelEndcapFlags
+ * Return the maximum z coordinate for a hit in a particular SeedLayer
* @param seedlayer SeedLayer to consider
- * @param beflaglist List of BarrelEndcapFlags to consider
* @return Maximum z coordinate
*/
- public double getZMax(SeedLayer seedlayer, List<BarrelEndcapFlag> beflaglist) {
- double zmax = 0.;
- for (BarrelEndcapFlag beflag : beflaglist) {
- String identifier = Identifier(seedlayer.getDetName(),seedlayer.getLayer(),beflag);
- if (_zmax.containsKey(identifier)) zmax = Math.max(zmax,_zmax.get(identifier));
- }
- return zmax;
+ public double getZMax(SeedLayer seedlayer) {
+ double zmax = -9999999.;
+ String identifier = Identifier(seedlayer.getDetName(), seedlayer.getLayer(), seedlayer.getBarrelEndcapFlag());
+ if (_zmax.containsKey(identifier)) zmax = Math.max(zmax, _zmax.get(identifier));
+ return zmax;
}
}
lcsim/src/org/lcsim/contrib/seedtracker
diff -u -r1.2 -r1.3
--- SeedLayer.java 10 Aug 2007 15:50:26 -0000 1.2
+++ SeedLayer.java 11 Aug 2007 00:17:32 -0000 1.3
@@ -7,6 +7,8 @@
package org.lcsim.contrib.seedtracker;
+import org.lcsim.geometry.subdetector.BarrelEndcapFlag;
+
/**
* Encapsulates information about a tracker layer needed for the SeedTracker algorithm
* @author Richard Partridge
@@ -30,20 +32,23 @@
*/
Extend}
- private String _DetName;
- private int _Layer;
- private SeedType _Type;
+ private String _detname;
+ private int _layer;
+ private BarrelEndcapFlag _beflag;
+ private SeedType _type;
/**
* Creates a new instance of SeedLayer
- * @param DetName Decector name
- * @param Layer Layer number
- * @param Type Layer type
- */
- public SeedLayer(String DetName, int Layer, SeedType Type) {
- _DetName = DetName;
- _Layer = Layer;
- _Type = Type;
+ * @param detname Decector name
+ * @param layer Layer number
+ * @param beflag Barrel-endcap flag
+ * @param type Layer type
+ */
+ public SeedLayer(String detname, int layer, BarrelEndcapFlag beflag, SeedType type) {
+ _detname = detname;
+ _layer = layer;
+ _beflag = beflag;
+ _type = type;
}
/**
@@ -51,7 +56,7 @@
* @return Detector name
*/
public String getDetName() {
- return _DetName;
+ return _detname;
}
/**
@@ -59,7 +64,15 @@
* @return Layer number
*/
public int getLayer() {
- return _Layer;
+ return _layer;
+ }
+
+ /**
+ * Return the BarrelEndcapFlag
+ * @return Barrel-endcap flag
+ */
+ public BarrelEndcapFlag getBarrelEndcapFlag() {
+ return _beflag;
}
/**
@@ -67,6 +80,6 @@
* @return Layer type
*/
public SeedType getType() {
- return _Type;
+ return _type;
}
}
lcsim/src/org/lcsim/contrib/seedtracker
diff -u -r1.3 -r1.4
--- SeedTracker.java 10 Aug 2007 15:50:26 -0000 1.3
+++ SeedTracker.java 11 Aug 2007 00:17:32 -0000 1.4
@@ -21,16 +21,17 @@
//import org.lcsim.event.base.BaseTrackerHitMC;
import org.lcsim.fit.helicaltrack.HelicalTrackFit;
import org.lcsim.fit.helicaltrack.HelicalTrackFitter;
-import org.lcsim.geometry.subdetector.BarrelEndcapFlag;
import org.lcsim.util.Driver;
import hep.physics.vec.BasicHep3Vector;
import hep.physics.vec.Hep3Vector;
/**
- * Tracking algorithm based on forming track seeds from all 3-hit combinations
- * and adding tracks to the helix defined by the three hits.
- *
+ * Tracking algorithm based on forming track seeds from all 3-hit combinations,
+ * confirming this tentantive helix by requiring additional hits, and extending
+ * the track to additional layers. The operation of the algorithm is controlled
+ * by a list of SeedStrategy that define the tracker layers to be used and the
+ * cuts on the tracking algorithm.
* @author Richard Partridge
* @version 1.0
*/
@@ -39,132 +40,134 @@
private List<SeedStrategy> _strategylist;
private HelicalTrackFitter _hf = new HelicalTrackFitter();
private Hep3Vector _IP = new BasicHep3Vector(0.,0.,0.);
+ private double[] _OldIP = {0., 0., 0.};
private double _BField;
private HitManager _HM = new HitManager();
- private List<List<BarrelEndcapFlag>> _beflagcol;
/** Creates a new instance of SeedTracker */
public SeedTracker() {
_strategylist = _DS.getStrategyList();
- _beflagcol = getDefaultBEFlagLists();
}
+ /**
+ * Invoke the track finding algorithm
+ * @param event EventHeader for this event
+ */
protected void process(EventHeader event) {
// Find the magnetic field
- _BField = event.getDetector().getFieldMap().getField(_IP).z();
+// _BField = event.getDetector().getFieldMap().getField(_IP).z();
+ _BField = event.getDetector().getFieldMap().getField(_OldIP)[2];
// Tell the hit manager to sort the hits for this event
_HM.OrganizeHits(event);
// Create the list of final track seeds
List<SeedCandidate> trackseeds = new ArrayList<SeedCandidate>();
// Loop over all strategies
for (SeedStrategy strategy : _strategylist) {
- // Loop over the BarrelEndcapFlag combinations to consider
- for (List<BarrelEndcapFlag> beflaglist : _beflagcol) {
- // Find the 3 hits seeds for this strategy
- List<SeedCandidate> seedlist = FindSeeds(strategy, beflaglist);
- // Loop over the seeds
- for (SeedCandidate seed : seedlist) {
- // Try to add confirming hits to the seed
- List<SeedCandidate> confirmedseeds = FindConfirmedSeeds(strategy, beflaglist, seed);
- // Loop over the confirmed seeds
- for (SeedCandidate conseed : confirmedseeds) {
- // Try to extend seeds to additional layers
- List<SeedCandidate> extendedseeds = FindExtendedSeeds(strategy, beflaglist, conseed);
- // Loop over the extended seeds
- for (SeedCandidate extseed : extendedseeds) {
- // Purge any duplicate extended seeds
- PurgeDuplicateSeeds(trackseeds,extseed);
- }
+ // Find the 3 hits seeds for this strategy
+ List<SeedCandidate> seedlist = FindSeeds(strategy);
+ // Loop over the seeds
+ for (SeedCandidate seed : seedlist) {
+ // Try to add confirming hits to the seed
+ List<SeedCandidate> confirmedseeds = FindConfirmedSeeds(strategy, seed);
+ // Loop over the confirmed seeds
+ for (SeedCandidate conseed : confirmedseeds) {
+ // Try to extend seeds to additional layers
+ List<SeedCandidate> extendedseeds = FindExtendedSeeds(strategy, conseed);
+ // Loop over the extended seeds
+ for (SeedCandidate extseed : extendedseeds) {
+ // Purge any duplicate extended seeds
+ PurgeDuplicateSeeds(trackseeds,extseed);
}
}
}
}
// Make tracks from the final list of track seeds
- MakeTracks(trackseeds);
+ MakeTracks(event, trackseeds);
return;
}
-
- private List<SeedCandidate> FindSeeds(SeedStrategy strategy, List<BarrelEndcapFlag> beflaglist) {
- List<SeedCandidate> candidates = new ArrayList<SeedCandidate>();
- // Get the SeedLayers for this strategy
- List<SeedLayer> seedlayerlist = strategy.getLayers(SeedType.Seed);
- if (seedlayerlist.size() != 3) return candidates;
- // Get the hits for the seed layers
- List<List<TrackerHit>> seedhits = new ArrayList<List<TrackerHit>>();
- for (SeedLayer seedlyr : seedlayerlist) {
- seedhits.add(_HM.getTrackerHits(seedlyr, beflaglist));
- }
- // Order the seed layers from fewest hits to most hits
- for (int i=0; i<2; i++) {
- for (int j=i+1; j<3; j++) {
- if (seedhits.get(i).size() > seedhits.get(j).size()) {
- List<TrackerHit> temp = seedhits.get(i);
- seedhits.set(i,seedhits.get(j));
- seedhits.set(j,temp);
- }
+
+ private List<SeedCandidate> FindSeeds(SeedStrategy strategy) {
+ List<SeedCandidate> candidates = new ArrayList<SeedCandidate>();
+ // Get the SeedLayers for this strategy
+ List<SeedLayer> seedlayerlist = strategy.getLayers(SeedType.Seed);
+ if (seedlayerlist.size() != 3) return candidates;
+ // Get the hits for the seed layers
+ List<List<TrackerHit>> seedhits = new ArrayList<List<TrackerHit>>();
+ for (SeedLayer seedlyr : seedlayerlist) {
+ seedhits.add(_HM.getTrackerHits(seedlyr));
+ }
+ // Order the seed layers from fewest hits to most hits
+ for (int i=0; i<2; i++) {
+ for (int j=i+1; j<3; j++) {
+ if (seedhits.get(i).size() > seedhits.get(j).size()) {
+ List<TrackerHit> temp = seedhits.get(i);
+ seedhits.set(i,seedhits.get(j));
+ seedhits.set(j,temp);
}
}
- double RMin = strategy.getMinPT() / (0.0003 * _BField);
- double dMax = strategy.getMaxDCA();
-
- // Todo: add code to limit seeds to those that satisfy cuts
-
- for (TrackerHit s1 : seedhits.get(0)) {
- double[] pos1 = s1.getPosition();
- double r1 = Math.sqrt(pos1[0]*pos1[0] + pos1[1]*pos1[1]);
- double phi1 = Math.atan2(pos1[1],pos1[0]);
- double dphi1 = Math.asin((2*RMin*dMax - dMax*dMax-r1*r1)/(2*r1*(RMin-dMax)));
- for (TrackerHit s2 : seedhits.get(1)) {
- double[] pos2 = s2.getPosition();
- double r2 = Math.sqrt(pos2[0]*pos2[0] + pos2[1]*pos2[1]);
- double phi2 = Math.atan2(pos2[1],pos2[0]);
- double dphi2 = Math.asin((2*RMin*dMax - dMax*dMax-r2*r2)/(2*r2*(RMin-dMax)));
- if (Math.abs(phi2-phi1) > Math.abs(dphi2-dphi1)) continue;
-
- for (TrackerHit s3 : seedhits.get(2)) {
- double[] pos3 = s3.getPosition();
- double r3 = Math.sqrt(pos3[0]*pos3[0] + pos3[1]*pos3[1]);
- double phi3 = Math.atan2(pos3[1],pos3[0]);
- double dphi3 = Math.asin((2*RMin*dMax - dMax*dMax-r3*r3)/(2*r3*(RMin-dMax)));
- if (Math.abs(phi3-phi2) > Math.abs(dphi3-dphi2)) continue;
- List<TrackerHit> hitlist = new ArrayList<TrackerHit>();
- hitlist.add(s1);
- hitlist.add(s2);
- hitlist.add(s3);
- boolean status = _hf.fit(hitlist);
- if (!status) continue;
- HelicalTrackFit helix = _hf.getFit();
- if (!HelixCuts(strategy, helix)) continue;
- candidates.add(new SeedCandidate(hitlist, helix));
+ }
+ double RMin = strategy.getMinPT() / (0.0003 * _BField);
+ double dMax = strategy.getMaxDCA();
+
+ // Todo: add code to limit seeds to those that satisfy cuts
+
+ for (TrackerHit s1 : seedhits.get(0)) {
+ double[] pos1 = s1.getPosition();
+ double r1 = Math.sqrt(pos1[0]*pos1[0] + pos1[1]*pos1[1]);
+ double phi1 = Math.atan2(pos1[1],pos1[0]);
+ double dphi1 = Math.asin((2*RMin*dMax - dMax*dMax-r1*r1)/(2*r1*(RMin-dMax)));
+ for (TrackerHit s2 : seedhits.get(1)) {
+ double[] pos2 = s2.getPosition();
+ double r2 = Math.sqrt(pos2[0]*pos2[0] + pos2[1]*pos2[1]);
+ double phi2 = Math.atan2(pos2[1],pos2[0]);
+ double dphi2 = Math.asin((2*RMin*dMax - dMax*dMax-r2*r2)/(2*r2*(RMin-dMax)));
+ if (Math.abs(phi2-phi1) > Math.abs(dphi2-dphi1)) continue;
+
+ for (TrackerHit s3 : seedhits.get(2)) {
+ double[] pos3 = s3.getPosition();
+ double r3 = Math.sqrt(pos3[0]*pos3[0] + pos3[1]*pos3[1]);
+ double phi3 = Math.atan2(pos3[1],pos3[0]);
+ double dphi3 = Math.asin((2*RMin*dMax - dMax*dMax-r3*r3)/(2*r3*(RMin-dMax)));
+ if (Math.abs(phi3-phi2) > Math.abs(dphi3-dphi2)) continue;
+ List<TrackerHit> hitlist = new ArrayList<TrackerHit>();
+ hitlist.add(s1);
+ hitlist.add(s2);
+ hitlist.add(s3);
+ boolean status = _hf.fit(hitlist);
+ if (!status) continue;
+ HelicalTrackFit helix = _hf.getFit();
+ if (!HelixCuts(strategy, helix)) continue;
+ for (TrackerHit hit : hitlist) {
+ System.out.println(" Hit x "+hit.getPosition()[0]+" y "+hit.getPosition()[1]+" z "+hit.getPosition()[2]);
}
+ candidates.add(new SeedCandidate(hitlist, helix));
}
}
- System.out.println(" Number of seeds: "+candidates.size());
-
- return candidates;
- }
-
- private boolean HelixCuts(SeedStrategy strategy, HelicalTrackFit helix) {
- double[] params = helix.parameters();
- if (helix.chisq()[0]+helix.chisq()[1] < strategy.getMaxChisq()) return false;
- double pT = 0.0003 * _BField / Math.abs(params[2]);
- if (pT > strategy.getMinPT()) return false;
- if (params[0] < strategy.getMaxDCA()) return false;
- if (params[3] < strategy.getMaxZ0()) return false;
- System.out.println(" d0 "+params[0]);
- System.out.println(" phi0 "+params[1]);
- System.out.println(" curvatures "+params[2]);
- System.out.println(" z0 "+params[3]);
- System.out.println(" slope "+params[4]);
- System.out.println(" pT "+pT);
- return true;
}
-
- private List<SeedCandidate> FindConfirmedSeeds(SeedStrategy strategy, List<BarrelEndcapFlag> beflaglist, SeedCandidate seed) {
- List<SeedCandidate> confirmedseeds = new ArrayList<SeedCandidate>();
- // For now, confirm our original seed
- confirmedseeds.add(seed);
+ return candidates;
+ }
+
+ private boolean HelixCuts(SeedStrategy strategy, HelicalTrackFit helix) {
+ double[] params = helix.parameters();
+ if (helix.chisq()[0]+helix.chisq()[1] > strategy.getMaxChisq()) return false;
+ double pT = 0.0003 * _BField / Math.abs(params[2]);
+ if (pT < strategy.getMinPT()) return false;
+ if (params[0] > strategy.getMaxDCA()) return false;
+ if (params[3] > strategy.getMaxZ0()) return false;
+ System.out.println(" d0 "+params[0]);
+ System.out.println(" phi0 "+params[1]);
+ System.out.println(" curvatures "+params[2]);
+ System.out.println(" z0 "+params[3]);
+ System.out.println(" slope "+params[4]);
+ System.out.println(" pT "+pT);
+ return true;
+ }
+
+ private List<SeedCandidate> FindConfirmedSeeds(SeedStrategy strategy, SeedCandidate seed) {
+ List<SeedCandidate> confirmedseeds = new ArrayList<SeedCandidate>();
+ // For now, confirm our original seed
+ confirmedseeds.add(seed);
// private List<List<TrackerHit>> FindConfirms(SeedStrategy strategy, List<BarrelEndcapFlag> beflaglist, SeedCandidate seed) {
// // Create a list of possible confirmation hits for each confirmation layer
// List<List<TrackerHit>> confirmbylayer = new ArrayList();
@@ -176,21 +179,21 @@
// // If we have some confirmation hits in this layer, add the list of hits for this layer
// if (confirmhits.size()>0) confirmbylayer.add(confirmhits);
// }
- // Initialize a list of track candidates that include confirmation hits
+ // Initialize a list of track candidates that include confirmation hits
// List<List<TrackerHit>> candlist = new ArrayList();
- // check that there are sufficient layers with confirmation hits
+ // check that there are sufficient layers with confirmation hits
// if (confirmbylayer.size() >= strategy.getMinConfirm()) {
- // Start with our seed hits as a candidate
+ // Start with our seed hits as a candidate
// candlist.add(seed.getTrackerHits());
- // Loop over all the confirming layers
+ // Loop over all the confirming layers
// for (List<TrackerHit> confirmhits : confirmbylayer) {
- // Create a list of new candidates that have hits added from this layer
+ // Create a list of new candidates that have hits added from this layer
// List<List<TrackerHit>> newcandlist = new ArrayList();
- // Loop over all existing candidates
+ // Loop over all existing candidates
// for (List<TrackerHit> oldcand : candlist) {
- // Loop over all the hits in this confirming layer
+ // Loop over all the hits in this confirming layer
// for (TrackerHit hit : confirmhits) {
- // Create a new track candidate that adds this hit
+ // Create a new track candidate that adds this hit
// List<TrackerHit> newcand = new ArrayList();
// boolean status = newcand.addAll(oldcand);
// newcand.add(hit);
@@ -200,13 +203,13 @@
// boolean status = candlist.addAll(newcandlist);
// }
// }
- // Remove candidates that have too few confirmation hits
+ // Remove candidates that have too few confirmation hits
// ListIterator<List<BaseTrackerHitMC>> itr = candlist.listIterator();
// while (itr.hasNext()) {
// List<BaseTrackerHitMC> hitlist = itr.next();
// if (hitlist.size() < strategy.getMinConfirm()+3) candlist.remove(hitlist);
// }
-//
+//
// return candlist;
// }
// int maxhits = 3 + strategy.getLayers(SeedType.Confirm).size();
@@ -219,109 +222,92 @@
// if (candidate.size() == nhit) {
// if (!isDuplicate(candidate, tracklist)) {
// boolean status2 = FindHelix(strategy, candidate);
- return confirmedseeds;
- }
-
- private List<SeedCandidate> FindExtendedSeeds(SeedStrategy strategy, List<BarrelEndcapFlag> beflaglist, SeedCandidate seed) {
- List<SeedCandidate> extendedseeds = new ArrayList<SeedCandidate>();
- // For now, just pass along the input seed
- extendedseeds.add(seed);
- return extendedseeds;
- }
-
- private void PurgeDuplicateSeeds(List<SeedCandidate> trackseeds, SeedCandidate extseed) {
- // Ignore duplicates for now
- return;
- }
-
- private void MakeTracks(List<SeedCandidate> trackseeds) {
+ return confirmedseeds;
+ }
+
+ private List<SeedCandidate> FindExtendedSeeds(SeedStrategy strategy, SeedCandidate seed) {
+ List<SeedCandidate> extendedseeds = new ArrayList<SeedCandidate>();
+ // For now, just pass along the input seed
+ extendedseeds.add(seed);
+ return extendedseeds;
+ }
+
+ private void PurgeDuplicateSeeds(List<SeedCandidate> trackseeds, SeedCandidate extseed) {
+ // Ignore duplicates for now
+ trackseeds.add(extseed);
+ return;
+ }
+
+ private void MakeTracks(EventHeader event, List<SeedCandidate> trackseeds) {
// Create a list of tracks
List<Track> tracklist = new ArrayList<Track>();
-// BaseTrack track = new BaseTrack();
-// track.setReferencePoint(_IP.v());
-// track.setRefPointIsDCA(false);
-// HelicalTrackFit helix = seed.getHelix();
-// track.setTrackParameters(helix.parameters(), _BField);
-// track.setChisq(helix.chisq()[0]+helix.chisq()[1]);
-// track.setNDF(helix.ndf()[0]+helix.ndf()[1]);
-// track.setCovarianceMatrix(helix.covariance());
-// track.setTrackType(0);
-// List<TrackerHit> castcand = new ArrayList();
-// for (TrackerHit hit : candidate) {
-// castcand.add((TrackerHit) hit);
-// }
-// track.addHits(castcand);
-// tracklist.add(track);
-// foundtrack = true;
- return;
- }
-
- private boolean isDuplicate(List<TrackerHit> hitlist, List<Track> tracklist) {
- boolean isDuplicate = false;
- for (Track track : tracklist) {
- List<TrackerHit> hitlist2 = track.getTrackerHits();
- boolean matchall = true;
- if (hitlist.size() <= hitlist2.size()) {
- for (TrackerHit hit1 : hitlist) {
- boolean match = false;
- for (TrackerHit hit2 : hitlist2) {
- if (hit1 == hit2) {
- match = true;
- break;
- }
- }
- if (!match) {
- matchall = false;
+ for (SeedCandidate seed : trackseeds) {
+ BaseTrack track = new BaseTrack();
+ track.setReferencePoint(_IP.v());
+ track.setRefPointIsDCA(false);
+ HelicalTrackFit helix = seed.getHelix();
+ track.setTrackParameters(helix.parameters(), _BField);
+ track.setChisq(helix.chisq()[0]+helix.chisq()[1]);
+ track.setNDF(helix.ndf()[0]+helix.ndf()[1]);
+ track.setCovarianceMatrix(helix.covariance());
+ track.setTrackType(0);
+ track.addHits(seed.getTrackerHits());
+ tracklist.add(track);
+ }
+ System.out.println(" Tracks found: "+tracklist.size());
+ event.put(EventHeader.TRACKS, tracklist, Track.class, 0);
+ List<Track> test = event.getTracks();
+ return;
+ }
+
+ private boolean isDuplicate(List<TrackerHit> hitlist, List<Track> tracklist) {
+ boolean isDuplicate = false;
+ for (Track track : tracklist) {
+ List<TrackerHit> hitlist2 = track.getTrackerHits();
+ boolean matchall = true;
+ if (hitlist.size() <= hitlist2.size()) {
+ for (TrackerHit hit1 : hitlist) {
+ boolean match = false;
+ for (TrackerHit hit2 : hitlist2) {
+ if (hit1 == hit2) {
+ match = true;
break;
}
}
- if (matchall) {
- isDuplicate = true;
+ if (!match) {
+ matchall = false;
break;
}
}
+ if (matchall) {
+ isDuplicate = true;
+ break;
+ }
}
- return isDuplicate;
- }
-
- private double rphi_error(double[] position, double[] covmat) {
- // Todo: include MS errors in weight
- double x = position[0];
- double y = position[1];
- double r2 = x * x + y * y;
- double varxx = covmat[0];
- double varxy = covmat[1];
- double varyy = covmat[2];
- return Math.sqrt((y * y * varxx + x * x * varyy - 2 * x * y * varxy) / r2);
- }
-
- private List<List<BarrelEndcapFlag>> getDefaultBEFlagLists() {
-
- // Create the default lists of BarrelEndcapFlags to consider
- List<BarrelEndcapFlag> north = new ArrayList<BarrelEndcapFlag>();
- north.add(BarrelEndcapFlag.BARREL);
- north.add(BarrelEndcapFlag.ENDCAP_NORTH);
- List<BarrelEndcapFlag> south = new ArrayList<BarrelEndcapFlag>();
- south.add(BarrelEndcapFlag.BARREL);
- south.add(BarrelEndcapFlag.ENDCAP_SOUTH);
- List<List<BarrelEndcapFlag>> beflagcol = new ArrayList<List<BarrelEndcapFlag>>();
- beflagcol.add(north);
- beflagcol.add(south);
- return beflagcol;
- }
-
- public List<List<BarrelEndcapFlag>> getBEFlagLists() {
- return _beflagcol;
- }
-
- public void putBEFlagLists(List<List<BarrelEndcapFlag>> beflagcol) {
- _beflagcol = beflagcol;
- return;
- }
-
- public void putStrategyList(List<SeedStrategy> strategylist) {
- _strategylist = strategylist;
- return;
}
+ return isDuplicate;
+ }
+
+ private double rphi_error(double[] position, double[] covmat) {
+ // Todo: include MS errors in weight
+ double x = position[0];
+ double y = position[1];
+ double r2 = x * x + y * y;
+ double varxx = covmat[0];
+ double varxy = covmat[1];
+ double varyy = covmat[2];
+ return Math.sqrt((y * y * varxx + x * x * varyy - 2 * x * y * varxy) / r2);
+ }
- }
\ No newline at end of file
+ /**
+ * Specifiy the strategies to be used by the SeedTracker algorithm. Invoking this
+ * method will override the default strategies defined by the DefaultStrategy
+ * class.
+ * @param strategylist List of strategies to be used
+ */
+ public void putStrategyList(List<SeedStrategy> strategylist) {
+ _strategylist = strategylist;
+ return;
+ }
+
+}
\ No newline at end of file
lcsim/src/org/lcsim/contrib/seedtracker
diff -u -r1.2 -r1.3
--- SeedTrackerDriver.java 26 Apr 2007 22:16:31 -0000 1.2
+++ SeedTrackerDriver.java 11 Aug 2007 00:17:32 -0000 1.3
@@ -13,7 +13,8 @@
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
*/
@@ -26,6 +27,10 @@
add(new SeedTracker());
}
+ /**
+ * Process the current event
+ * @param event EventHeader for this event
+ */
public void process(EventHeader event)
{
super.process(event);
lcsim/src/org/lcsim/contrib/seedtracker
diff -u -r1.1 -r1.2
--- SmearMCHits.java 7 Aug 2006 17:46:32 -0000 1.1
+++ SmearMCHits.java 11 Aug 2007 00:17:32 -0000 1.2
@@ -11,72 +11,41 @@
import java.util.ArrayList;
import java.util.List;
-import java.util.Random;
-import org.lcsim.util.Driver;
+
+import org.lcsim.contrib.tracking.TrackerHitCheater;
import org.lcsim.event.EventHeader;
import org.lcsim.event.SimTrackerHit;
-import org.lcsim.event.base.BaseTrackerHitMC;
+import org.lcsim.event.TrackerHit;
+import org.lcsim.util.Driver;
/**
- *
+ * Create cheated and smeared TrackerHits from all collections of SimTrackerHits
* @author partridge
*/
public class SmearMCHits extends Driver{
- Random rn = new Random();
- double drphi = 0.005;
- double dz = 0.005;
+ TrackerHitCheater cheater = new TrackerHitCheater();
/** Creates a new instance of SmearMCHits */
public SmearMCHits() {
}
+ /**
+ * Process the current event
+ * @param event EventHeader for this event
+ */
public void process(EventHeader event) {
// Initialize the TrackerHit list
- List<BaseTrackerHitMC> trkhits = new ArrayList<BaseTrackerHitMC>();
+ List<TrackerHit> allhits = new ArrayList<TrackerHit>();
// Get the SimTrackerHit collections
List<List<SimTrackerHit>> allgenhits = event.get(SimTrackerHit.class);
// Loop over the various hit collections
for (List<SimTrackerHit> genhitcol : allgenhits) {
- // Now loop over the hits in a particular collection
- for (SimTrackerHit genhit : genhitcol) {
- // Generate a new BaseTrackerHitMC for each SimTrackerHit
- // Note: treat all layers the same for now, hard code the resolution
- double x = genhit.getPoint()[0];
- double y = genhit.getPoint()[1];
- double z = genhit.getPoint()[2];
- double r = Math.sqrt(x*x + y*y);
- double phi = Math.atan2(y,x);
- phi = phi + (drphi / r) * rn.nextGaussian();
- z = z + dz * rn.nextGaussian();
- // Fill in smeared position
- double[] pos = new double[3];
- pos[0] = r * Math.cos(phi);
- pos[1] = r * Math.sin(phi);
- pos[2] = z;
- // covariance matrix in lower triangular form
- double[] cov = new double[6];
- cov[0] = Math.pow(Math.sin(phi)*drphi,2);
- cov[1] = -Math.sin(phi)*Math.cos(phi)*drphi*drphi;
- cov[2] = Math.pow(Math.cos(phi)*drphi,2);
- cov[3] = 0.;
- cov[4] = 0.;
- cov[5] = dz*dz;
-
- double time = genhit.getTime();
-
- double dedx = genhit.getdEdx();
-
- int type = 0;
- // Create the list of SimTrackerHits for this TrackerHit and add our hit to the list
- List<SimTrackerHit> hits = new ArrayList<SimTrackerHit>();
- hits.add(genhit);
- // Create a new TrackerHit and add it to our list of tracker hits
- trkhits.add(new BaseTrackerHitMC(pos, cov, time, dedx, type, hits));
- }
+ List<TrackerHit> hits = cheater.makeTrackerHits(genhitcol);
+ allhits.addAll(hits);
}
// Put the list of TrackerHits into the event
- event.put("BaseTrackerHitMC",trkhits,BaseTrackerHitMC.class,0);
+ event.put("TrackerHit",allhits,TrackerHit.class,0);
}
}
CVSspam 0.2.8