1313import org .lcsim .event .SimTrackerHit ;
1414import org .lcsim .event .Track ;
1515import org .lcsim .event .TrackerHit ;
16-
1716import hep .physics .vec .BasicHep3Vector ;
1817
1918public 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