lcsim/src/org/lcsim/contrib/CosminDeaconu
diff -u -r1.1 -r1.2
--- TrackerHitTrackFinder.java 19 Jul 2007 23:16:32 -0000 1.1
+++ TrackerHitTrackFinder.java 20 Jul 2007 17:48:44 -0000 1.2
@@ -29,6 +29,26 @@
import org.lcsim.util.aida.AIDA;
/**
+ * This driver takes in input collections of TrackerHits (or SimTrackerHits which
+ * will be converted to TrackerHits via TrackerHitCheater) and tries to find tracks.
+ *
+ *
+ * Method:
+ * * Sorts all hits by distance from center
+ * * Goes through all combinations of 3 hits (starting from outside)
+ * * For each combination of 3 hits, a helix is fit, and a list of candidate
+ * hits is generated that lie close to the helix but are not too close to
+ * other hits
+ * * If the chisq for the candidates + the 3 seed hits is good enough, they
+ * form a track, otherwise the farthest hit from the helix is removed until
+ * either the chisq is good enough or there are too few hits.
+ * * Tracks must satisfy a minimum number of hits (and a maximum number of hits too, which can be set arbitrarily high)
+ * * Optionally, hits may be required to be on different layers
+ *
+ * Usage:
+ * Generally, you'll want to use the public methods to give the driver an input collection of hits (from the event).
+ *
+ *
*
* @author Cosmin Deaconu
*/
@@ -38,12 +58,16 @@
public class TrackerHitTrackFinder extends Driver{
private ArrayList<TrackerHit> _input_hit_collection = null;
+
+ private ArrayList<String> event_input = new ArrayList<String>();
+ private ArrayList<String> sim_event_input = new ArrayList<String>();
+
private HashMap<TrackerHit,Double> _hit_separation = new HashMap<TrackerHit,Double>();
-
private ArrayList<TrackerHit> _hitset = new ArrayList<TrackerHit>();
private ArrayList<StandaloneOuterTrack> _tracks = new ArrayList<StandaloneOuterTrack>();
private ArrayList<TrackerHit> _used = new ArrayList<TrackerHit>();
+
private HelicalTrackFitter _fitter = new HelicalTrackFitter();
private HelicalTrackFit _fit = null;
@@ -51,7 +75,7 @@
double chisq_c = 10;
int min_hits = 4;
- int max_hits = 8;
+ int max_hits = 20;
private AIDA _aida = AIDA.defaultInstance();
private boolean _make_histograms = true;
@@ -75,10 +99,7 @@
protected void process(EventHeader event) {
- // addSimTrackerHitInput((ArrayList<SimTrackerHit>) event.getSimTrackerHits("TkrBarrHits"));
- addSimTrackerHitInput((ArrayList<SimTrackerHit>) event.getSimTrackerHits("TkrForwardHits"));
- addSimTrackerHitInput((ArrayList<SimTrackerHit>) event.getSimTrackerHits("TkrEndcapHits"));
-
+ updateEventInput(event);
if (_input_hit_collection==null)
{
@@ -89,7 +110,7 @@
DistanceCompare<TrackerHit> c = new DistanceCompare<TrackerHit>();
Collections.sort(_input_hit_collection,c); // sort from outside in... yeah this may take a while if there are a lot of hits
-
+ generateHistogram("Number of Input Hits in collection",_input_hit_collection.size());
// get hit separation
for (TrackerHit hit : _input_hit_collection)
@@ -108,7 +129,7 @@
{
if (hit1==hit3 || hit2==hit3) continue;
if (require_different_layers && (sameLayer(hit1,hit3) || sameLayer(hit2,hit3))) continue;
- if (_used.contains(hit1)||_used.contains(hit2)||_used.contains(hit3)) continue;
+ if (_used.contains(hit1)||_used.contains(hit2)||_used.contains(hit3)) continue; //don't reuse hits that already have a home'
_hitset.clear();
_hitset.add(hit1);
@@ -117,10 +138,10 @@
_fit = doFit(_hitset);
- makeHistogram("chisql_1",_fit.chisq()[1]);
+ generateHistogram("chisql_1",_fit.chisq()[1]);
//check line chisquare to see if it's reasonable'
if (_fit.chisq()[1]/3.0>chisq_l) continue;
- makeHistogram("chisql_2",_fit.chisq()[1]);
+ generateHistogram("chisql_2",_fit.chisq()[1]);
ArrayList<TrackerHit> candidates = new ArrayList<TrackerHit>();
@@ -156,7 +177,6 @@
{
if (sameLayer(new_hit,i)) fail=true;
}
-
if (fail) continue;
}
@@ -165,7 +185,7 @@
_hitset.remove(new_hit);
}
- makeHistogram("candidates_size",candidates.size());
+ generateHistogram("candidates_size",candidates.size());
////first, try adding all candidates
@@ -175,8 +195,8 @@
_fit = doFit(_hitset);
- makeHistogram("chisql_3",_fit.chisq()[1]);
- makeHistogram("chisqc_1",_fit.chisq()[0]);
+ generateHistogram("chisql_3",_fit.chisq()[1]);
+ generateHistogram("chisqc_1",_fit.chisq()[0]);
int while_loop_iterations = 0;
@@ -210,7 +230,7 @@
_fit = doFit(_hitset);
}
- makeHistogram("while loop iter",while_loop_iterations);
+ generateHistogram("while loop iter",while_loop_iterations);
//now, I think we have a track
if (_hitset.size()>=min_hits)
@@ -224,20 +244,23 @@
_tracks.add(track);
_used.addAll(_hitset);
- makeHistogram("Number of hits per track",_hitset.size());
- makeHistogram("Purity",purity);
+ generateHistogram("Number of hits per track",_hitset.size());
+ generateHistogram("purity",purity);
}
}
}
}
event.put(EventHeader.TRACKS, _tracks, Track.class, 0); //put tracks into event
- makeHistogram("n_tracks",_tracks.size());
+ generateHistogram("ntracks",_tracks.size());
purgeLists(); //do some cleanup
}
//-------------------------Public Controller Methods--------------------------------------------------------------
+
+ //TODO: write javadoc...
+
public void addInput(ArrayList<TrackerHit> hits)
{
if (_input_hit_collection==null)
@@ -251,12 +274,58 @@
}
}
+ public void requireDifferentLayers(boolean b)
+ {require_different_layers=b;}
+
+ public void setChisqL(double chisql)
+ {chisq_l=chisql;}
+
+ public void setChisqC(double chisqc)
+ {chisq_c=chisqc;}
+
+ public void set_dz(double newdz)
+ {dz = newdz;}
+
+ public void set_drphi(double newdrphi)
+ {dz = newdrphi;}
+
+ public void setRequiredDistance(double d)
+ {required_distance=d;}
+
+ public void setRequiredSeparation(double s)
+ {required_separation=s;}
+
+ public void setMinHits(int minhits)
+ {min_hits = minhits;}
+
+ public void setMaxHits(int maxhits)
+ {max_hits = maxhits;}
+
+ public void make_histograms()
+ {_make_histograms = true;}
+
+ public void make_histograms(boolean histograms)
+ {_make_histograms = histograms;}
+
public void addSimTrackerHitInput(ArrayList<SimTrackerHit> hits)
{
TrackerHitCheater _cheat = new TrackerHitCheater();
addInput ((ArrayList<TrackerHit>) _cheat.makeTrackerHits(hits));
}
+ public void addSimTrackerInputCollection(String sim_tracker_hit_collection_name)
+ {
+ sim_event_input.add(sim_tracker_hit_collection_name);
+ }
+
+ public void addInputCollection(String tracker_hit_collection_name)
+ {
+ event_input.add(tracker_hit_collection_name);
+ }
+
+ public void setID(String s)
+ {_id = s;}
+
//--------------------------Private Helper Methods-----------------------------------------------------
private double findNearest(TrackerHit hit, List<TrackerHit> hits)
@@ -365,8 +434,8 @@
private double findPurity(ArrayList<TrackerHit> hits, MCParticle mp)
{
- int denom = hits.size();
- int num = 0;
+ int denom = hits.size(); //denominator
+ int num = 0; //numerator
for (TrackerHit i : hits)
{
@@ -379,7 +448,7 @@
return ((double) num)/((double) denom);
}
- private void makeHistogram(String name, double value)
+ private void generateHistogram(String name, double value)
{
if (_make_histograms)
{
@@ -396,9 +465,32 @@
_used.clear();
_tracks.clear();
}
-}
+
+ private void updateEventInput(final EventHeader event) {
+
+ if (event_input.size()>0) //get any input from the event
+ {
+ for (String s : event_input)
+ {
+ ArrayList<TrackerHit> eventhits = (ArrayList) event.get(TrackerHit.class,s);
+ if (eventhits!=null) addInput(eventhits);
+ }
+ }
+
+ if (sim_event_input.size()>0) // get any simtracker input from the event
+ {
+ for (String s : sim_event_input)
+ {
+ ArrayList<SimTrackerHit> simeventhits = (ArrayList) event.get(SimTrackerHit.class,s);
+ if (simeventhits!=null) addSimTrackerHitInput(simeventhits);
+ }
+ }
+ }
+
+
+} //end TrackerHitTrackFinder class
-//comparator class used to sort points from outermost to innermost
+//============================comparator class used to sort points from outermost to innermost========================
class DistanceCompare<TrackerHit> implements Comparator<TrackerHit>
{
public int compare(Object a, Object b)
lcsim/src/org/lcsim/contrib/CosminDeaconu
diff -u -r1.3 -r1.4
--- OuterTrackFinder.java 19 Jul 2007 23:16:32 -0000 1.3
+++ OuterTrackFinder.java 20 Jul 2007 17:48:44 -0000 1.4
@@ -84,7 +84,7 @@
private String _output_hit_collection = "";
- private double _module_length = 100.0;
+ private double _module_length = 300.0;
private double _seedhit_isolation = 0.5; //0; //0.5;
private double _seed_ip_dca = 100.0; //900000; //100.0;
private double _pass1_hit_dca = 0.5; //900000; //0.5;
@@ -114,7 +114,7 @@
private double dz = 100; //
private double drphi = 0.0316; //I think this is equivalent to having 1000 for weights on circle fit
- private double[] _h_chisq_dof = {10.,10.};
+ private double[] _h_chisq_dof = {10.,20.};
private boolean _debug_sysouts = false;
private double _debug_sysout_level=6;
@@ -866,7 +866,7 @@
_aida.cloud1D("Found MCParticle momentum"+_id).fill(majority_particle.getMomentum().magnitude());
}
}
- }
+ }
double purity = (double)nhits_max/(double)nhits;
@@ -1023,7 +1023,14 @@
public void setUsedLayers(int[] usedLayers)
{
_usedLayers.clear();
- _usedLayers = new ArrayList(Arrays.asList((usedLayers)));
+ Integer[] usedLayersInt = new Integer[usedLayers.length];
+
+ for (int i = 0; i < usedLayers.length; i++)
+ {
+ usedLayersInt[i] = Integer.valueOf(usedLayers[i]);
+ }
+
+ _usedLayers = new ArrayList(Arrays.asList((usedLayersInt)));
}
public void setCombinedLayers(int[][] combinedLayers)
@@ -1148,9 +1155,9 @@
_useAllLayers=true;
setInputHits("TkrBarrHits");
setSubdetectors(new String[]{"TrackerBarrel"});
- dz = ((double)_module_length)/(Math.sqrt(12.0));
+ dz = ((double)_module_length)/(Math.sqrt(12.0)); //I'm not actually sure this is how the dz works...
_phi_cut = true;
- //_h_chisq_dof[1]=1000000000000000000000000000000000000000000.0; // emulate circle fit by setting ridiculously high line chisq cutoff for helical fit.
+ _h_chisq_dof[1]=1000000000000000000000000000000000000000000.0; // emulate circle fit by setting ridiculously high line chisq cutoff for helical fit.
_zseg=true;
}