Commit in hps-java/src/main/java/org/lcsim/hps/users/omoreno on MAIN | |||
SvtTrackRecoEfficiency.java | +182 | added 1.1 |
Driver to find track reconstruction efficiency
diff -N SvtTrackRecoEfficiency.java --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ SvtTrackRecoEfficiency.java 18 Sep 2012 23:14:28 -0000 1.1 @@ -0,0 +1,182 @@
+package org.lcsim.hps.users.omoreno; + +//--- java ---// +import java.util.List; +import java.util.Map; +import java.util.TreeMap; +import java.util.ArrayList; + +//--- lcsim ---// +import org.lcsim.util.Driver; +import org.lcsim.detector.tracker.silicon.SiSensor; +import org.lcsim.event.EventHeader; +import org.lcsim.event.MCParticle; +import org.lcsim.event.SimTrackerHit; +import org.lcsim.event.RawTrackerHit; +import org.lcsim.event.Track; + +//--- hps-java ---// +import org.lcsim.hps.recon.tracking.SvtUtils; +import org.lcsim.hps.recon.tracking.TrackUtils; + +/** + * + * @author Omar Moreno <[log in to unmask]> + * @version $Id: SvtTrackRecoEfficiency.java,v 1.1 2012/09/18 23:14:28 omoreno Exp $ + */ +public class SvtTrackRecoEfficiency extends Driver { + + // Map to store SimTrackerHits for a given event + TreeMap<Integer, List<SimTrackerHit>> eventToSimTrackerHits = new TreeMap<Integer, List<SimTrackerHit>>(); + TrackUtils trkUtils = new TrackUtils(); + + // Collection Names + String simTrackerHitCollectionName = "TrackerHits"; + String rawTrackerHitCollectionName = "SVTRawTrackerHits"; + String trackCollectionName = "MatchedTracks"; + + int eventNumber = 0; + // List<Integer> topSimTrackerHits = new ArrayList<Integer>(10); + // List<Integer> bottomSimTrackerHits = new ArrayList<Integer>(10); + int[] topSimTrackerHits; + int[] bottomSimTrackerHits; + double topPossibleTracks, bottomPossibleTracks, possibleTracks; + double totalTopTracks, totalBottomTracks, totalTracks; + + + boolean debug = false; + + /** + * Enable/Disable debug + */ + public void setDebug(boolean debug){ + this.debug = debug; + } + + /** + * Dflt Ctor + */ + public SvtTrackRecoEfficiency(){ + } + + public void process(EventHeader event){ + + eventNumber++; + + // If the event contains SimTrackerHits store them + if(event.hasCollection(SimTrackerHit.class, simTrackerHitCollectionName)){ + List<SimTrackerHit> simTrackerHits = event.get(SimTrackerHit.class, simTrackerHitCollectionName); + eventToSimTrackerHits.put(eventNumber, simTrackerHits); + System.out.println(this.getClass().getSimpleName() + ": Event: " + eventNumber + " Number of SimTrackerHits: " + simTrackerHits.size()); + + } + + // The SimTrackerHits should not be stored for more than 200 events + if(!eventToSimTrackerHits.isEmpty()){ + Integer firstEvent = eventToSimTrackerHits.firstKey(); + if(firstEvent.intValue() + 200 < eventNumber){ + eventToSimTrackerHits.remove(firstEvent); + } + } + + // If the event doesn't contain RawTrackerHits skip it + if(!event.hasCollection(RawTrackerHit.class, rawTrackerHitCollectionName)) return; + + if(eventToSimTrackerHits.isEmpty()){ + throw new RuntimeException(this.getClass().getSimpleName() + ": There are no SimTrackerHits associated with the RawTrackerHits"); + } + + List<SimTrackerHit> simTrackerHits = eventToSimTrackerHits.get(eventToSimTrackerHits.firstKey()); + for(SimTrackerHit simTrackerHit : simTrackerHits){ + MCParticle particle = simTrackerHit.getMCParticle(); + System.out.println(this.getClass().getSimpleName() + ": MC Particle: " + particle.getPDGID()); + System.out.println(this.getClass().getSimpleName() + ": SimTrackerHit: " + SvtUtils.getInstance().getDescription((SiSensor) simTrackerHit.getDetectorElement())); + } + + this.countHitsPerLayer(simTrackerHits); + + // Check if a track should be found + if(this.hasConsecutiveHits(topSimTrackerHits)){ + topPossibleTracks++; + possibleTracks++; + System.out.println(this.getClass().getSimpleName() + ": Found Top Possible Track"); + } else if(this.hasConsecutiveHits(bottomSimTrackerHits)){ + bottomPossibleTracks++; + System.out.println(this.getClass().getSimpleName() + ": Found Bottom Possible Track"); + possibleTracks++; + } else { + return; + } + + // Get the RawTrackerHits from the event +// List<RawTrackerHit> rawHits = event.get(RawTrackerHit.class, rawTrackerHitCollectionName); +// for(RawTrackerHit rawHit : rawHits){ +// System.out.println(this.getClass().getSimpleName() + ": RawTrackerHit: " + SvtUtils.getInstance().getDescription((SiSensor) rawHit.getDetectorElement())); +// } + + // If consecutive hits were found, check if a track was also found + if(!event.hasCollection(Track.class, trackCollectionName)) return; + + List<Track> tracks = event.get(Track.class, trackCollectionName); + + for(Track track : tracks){ + trkUtils.setTrack(track); + if(trkUtils.getZ0() > 0){ + totalTopTracks++; + System.out.println(this.getClass().getSimpleName() + ": Found Top Track"); + } + else{ + totalBottomTracks++; + System.out.println(this.getClass().getSimpleName() + ": Found Bottom Track"); + } + totalTracks++; + } + } + + /** + * + */ + private boolean hasConsecutiveHits(int[] topSimTrackerHits2){ + for(int index = 0; index < topSimTrackerHits2.length; index++){ + if(topSimTrackerHits2[index] == 0) return false; + } + return true; + } + + /** + * + */ + private void countHitsPerLayer(List<SimTrackerHit> simTrackerHits){ + topSimTrackerHits = new int[10]; + bottomSimTrackerHits = new int[10]; + + SiSensor sensor = null; + for(SimTrackerHit simTrackerHit : simTrackerHits){ + // The only hits of interest are those created by an electron (or positron) + if(Math.abs(simTrackerHit.getMCParticle().getPDGID()) != 11) continue; + sensor = (SiSensor) simTrackerHit.getDetectorElement(); + if(SvtUtils.getInstance().isTopLayer(sensor)){ + topSimTrackerHits[SvtUtils.getInstance().getLayerNumber(sensor) - 1]++; + } else { + bottomSimTrackerHits[SvtUtils.getInstance().getLayerNumber(sensor) - 1]++; + } + } + } + + @Override + public void endOfData(){ + System.out.println("%===============================================================%"); + System.out.println("%============== Track Reconstruction Efficiencies ==============%"); + System.out.println("%===============================================================%\n%"); + if(possibleTracks > 0){ + System.out.println("% Total Track Reconstruction Efficiency: " + (totalTracks/possibleTracks)*100 + "%"); + } + if(topPossibleTracks > 0){ + System.out.println("% Top Track Reconstruction Efficiency: " + (totalTopTracks/topPossibleTracks)*100 + "%"); + } + if(bottomPossibleTracks > 0){ + System.out.println("% Bottom Track Reconstruction Efficiency: " + (totalBottomTracks/bottomPossibleTracks)*100 + "%"); + } + System.out.println("%\n%===============================================================%"); + } +}
Use REPLY-ALL to reply to list
To unsubscribe from the LCD-CVS list, click the following link:
https://listserv.slac.stanford.edu/cgi-bin/wa?SUBED1=LCD-CVS&A=1