Skip to content

Commit b894841

Browse files
authored
Merge pull request #1150 from JeffersonLab/kftrkfinding
Add more flexible setting for minHits into KF track finding
2 parents 6fc421f + 5b0c80c commit b894841

File tree

10 files changed

+1124
-1318
lines changed

10 files changed

+1124
-1318
lines changed

recon/src/main/java/org/hps/recon/utils/TrackTruthMatcher.java

Lines changed: 84 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313
import org.lcsim.event.SimTrackerHit;
1414
import org.lcsim.event.Track;
1515
import org.lcsim.event.TrackerHit;
16-
1716
import hep.physics.vec.BasicHep3Vector;
1817

1918
public class TrackTruthMatcher {
@@ -29,7 +28,8 @@ public class TrackTruthMatcher {
2928
private Map<Integer, Set<MCParticle>> _mcpsOnLayerMap = new HashMap<Integer, Set<MCParticle>>();
3029
private Set<Integer> _layersOnTrack = new HashSet<Integer>();
3130
private Map<RawTrackerHit, List<MCParticle>> _stripHitsToMCPsMap = new HashMap<RawTrackerHit, List<MCParticle>>();
32-
31+
private int _totalLayers=14;
32+
3333
public TrackTruthMatcher(Track track, RelationalTable rawtomc){
3434
doAnalysis(track, rawtomc);
3535
}
@@ -118,7 +118,26 @@ public Set<Integer> getLayersOnTrack(){
118118
public List<MCParticle> getMCPsOnRawTrackerHit(RawTrackerHit rawhit){
119119
return this._stripHitsToMCPsMap.get(rawhit);
120120
}
121-
121+
122+
// getGoodHitLayers and getCorrectlyMissingLayers
123+
// give layers where tracking is doing the "right thing"
124+
// ...following the MC particle track
125+
public Set<Integer> getGoodHitLayers(){
126+
return getLayerHitsForAllMCPs().get(this._mcp);
127+
}
128+
129+
public Set<Integer> getCorrectlyMissingLayers(List<SimTrackerHit> simHits){
130+
Set<Integer> correctMissingLayers = new HashSet<Integer>();
131+
Set<Integer> trackLayers = getLayersOnTrack();
132+
Set<Integer> mcpLayers= getLayersHitByMCP(this._mcp, simHits);
133+
for(Integer i=1; i<=_totalLayers; i++){
134+
if(!trackLayers.contains(i) && !mcpLayers.contains(i))
135+
correctMissingLayers.add(i);
136+
}
137+
return correctMissingLayers;
138+
}
139+
140+
//getBadLayerHits, combination of "wrongHit" and "noMCP" ... see below
122141
public Set<Integer> getBadHitLayers(){
123142
Set<Integer> badLayers = new HashSet<Integer>();
124143
Set<Integer> trackLayers = getLayersOnTrack();
@@ -130,11 +149,57 @@ public Set<Integer> getBadHitLayers(){
130149
}
131150
return badLayers;
132151
}
152+
153+
//two ways to get a "bad" hit on track:
154+
//getWrongHitLayers: MC particle left hit on the layer but we picked a different one
155+
//getNonMCPHitLayers: no MC particle hit on layer but we found a hit anyway
156+
public Set<Integer> getWrongHitLayers(List<SimTrackerHit> simHits){
157+
Set<Integer> wrongLayers = new HashSet<Integer>();
158+
Set<Integer> trackLayers = getLayersOnTrack();
159+
Set<Integer> goodLayers = getGoodHitLayers(); //this checks if the hit on track is from main mcp
160+
Set<Integer> mcpLayers= getLayersHitByMCP(this._mcp, simHits);
161+
for(Integer i=1; i<=_totalLayers; i++){
162+
if(trackLayers.contains(i) && !goodLayers.contains(i) && mcpLayers.contains(i))
163+
wrongLayers.add(i);
164+
}
165+
return wrongLayers;
166+
}
133167

134-
public Set<Integer> getGoodHitLayers(){
135-
return getLayerHitsForAllMCPs().get(this._mcp);
168+
public Set<Integer> getNonMCPHitLayers(List<SimTrackerHit> simHits){
169+
Set<Integer> extraLayers = new HashSet<Integer>();
170+
Set<Integer> trackLayers = getLayersOnTrack();
171+
Set<Integer> goodLayers = getGoodHitLayers(); //this checks if the hit on track is from main mcp
172+
Set<Integer> mcpLayers= getLayersHitByMCP(this._mcp, simHits);
173+
//regarding (!goodLayers.contains(i) && !mcpLayers.contains(i))):
174+
//if the mcp hit isn't in a layer, it also can't be in goodLayers
175+
//but keep it this way just to make obvious
176+
for(Integer i=1; i<=_totalLayers; i++){
177+
if(trackLayers.contains(i) && !goodLayers.contains(i) && !mcpLayers.contains(i))
178+
extraLayers.add(i);
179+
}
180+
return extraLayers;
181+
}
182+
183+
//getMissedHitLayers account for layers we have an MC particle hit, but no hit on track
184+
//this doesn't show up in either "goodLayers" or "badLayers" because that loops over hits-on-track
185+
public Set<Integer> getMissedHitLayers(List<SimTrackerHit> simHits){
186+
Set<Integer> missedLayers = new HashSet<Integer>();
187+
Set<Integer> trackLayers = getLayersOnTrack();
188+
Set<Integer> goodLayers = getGoodHitLayers(); //this checks if the hit on track is from main mcp
189+
Set<Integer> mcpLayers= getLayersHitByMCP(this._mcp, simHits);
190+
for(Integer i=1; i<=_totalLayers; i++){
191+
if(!trackLayers.contains(i) && mcpLayers.contains(i))
192+
missedLayers.add(i);
193+
}
194+
return missedLayers;
136195
}
137196

197+
198+
public Set<Integer> getMCPHitLayers(List<SimTrackerHit> simHits){
199+
return getLayersHitByMCP(this._mcp, simHits);
200+
}
201+
202+
138203
public void getMCPsOnTrack(Track track, RelationalTable rawtomc){
139204

140205
double trackPmag = new BasicHep3Vector(track.getTrackStates().get(0).getMomentum()).magnitude();
@@ -260,6 +325,20 @@ public List<MCParticle> getMCParticlesOnRawTrackerHit(RawTrackerHit rawhit, Rela
260325

261326
return mcpList;
262327
}
328+
329+
public Set<Integer> getLayersHitByMCP(MCParticle mcp, List<SimTrackerHit> simhits){
330+
Set<Integer> layerhitsMap = new HashSet<Integer>();
331+
for(SimTrackerHit simhit : simhits){
332+
MCParticle simhitmcp = simhit.getMCParticle();
333+
if(simhitmcp == mcp){
334+
int layer = simhit.getLayer();
335+
if(!layerhitsMap.contains(layer))
336+
layerhitsMap.add(layer);
337+
}
338+
}
339+
return layerhitsMap;
340+
}
341+
263342
}
264343

265344

0 commit comments

Comments
 (0)