hps-java/src/main/java/org/lcsim/hps/users/omoreno
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%===============================================================%");
+ }
+}