Print

Print


Author: [log in to unmask]
Date: Wed Jun 29 11:46:39 2016
New Revision: 4412

Log:
Added ability to select events with hits in all twelve layers, either top or bottom.

Modified:
    java/trunk/analysis/src/main/java/org/hps/analysis/examples/StripEventDriver.java

Modified: java/trunk/analysis/src/main/java/org/hps/analysis/examples/StripEventDriver.java
 =============================================================================
--- java/trunk/analysis/src/main/java/org/hps/analysis/examples/StripEventDriver.java	(original)
+++ java/trunk/analysis/src/main/java/org/hps/analysis/examples/StripEventDriver.java	Wed Jun 29 11:46:39 2016
@@ -1,8 +1,18 @@
 package org.hps.analysis.examples;
 
 import java.util.List;
+import java.util.Set;
+import java.util.TreeSet;
+import org.lcsim.detector.DetectorElementStore;
+import org.lcsim.detector.IDetectorElement;
+import org.lcsim.detector.identifier.IExpandedIdentifier;
+import org.lcsim.detector.identifier.IIdentifier;
+import org.lcsim.detector.identifier.IIdentifierDictionary;
+import org.lcsim.detector.tracker.silicon.HpsSiSensor;
+import org.lcsim.detector.tracker.silicon.SiSensor;
 import org.lcsim.event.Cluster;
 import org.lcsim.event.EventHeader;
+import org.lcsim.event.RawTrackerHit;
 import org.lcsim.event.Track;
 import org.lcsim.event.TrackerHit;
 import org.lcsim.event.Vertex;
@@ -29,6 +39,10 @@
     private double _maxClusterEnergy = 12.;
 
     private String _clusterCollectionName = "EcalClusters";
+    
+    private boolean _selectAllLayers = false;
+    private boolean _selectTopHits = false;
+    private boolean _selectBottomHits = false;
 
     @Override
     protected void process(EventHeader event)
@@ -64,6 +78,35 @@
             if (nHits > _maxNumberOfStripHits) {
                 skipEvent = true;
             }
+
+            if (!skipEvent && _selectAllLayers) {
+                setupSensors(event);
+                Set<Integer> topLayers = new TreeSet<Integer>();
+                Set<Integer> bottomLayers = new TreeSet<Integer>();
+                List<TrackerHit> hits = event.get(TrackerHit.class, "StripClusterer_SiTrackerHitStrip1D");
+                for (TrackerHit hit : hits) {
+                    List rawHits = hit.getRawHits();
+                    HpsSiSensor sensor = null;
+                    for (Object o : rawHits) {
+                        RawTrackerHit rth = (RawTrackerHit) o;
+                        sensor = (HpsSiSensor) rth.getDetectorElement();
+                    }
+                    String layerName = sensor.getName();
+                    if (layerName.contains("t_")) {
+                        topLayers.add(sensor.getLayerNumber());
+                    } else {
+                        bottomLayers.add(sensor.getLayerNumber());
+                    }
+                }
+                if(_selectTopHits)
+                {
+                  if(topLayers.size() != 12) skipEvent = true;  
+                }
+                if(_selectBottomHits)
+                {
+                  if(bottomLayers.size() != 12) skipEvent = true;  
+                }
+            }
         }
         if (event.hasCollection(Cluster.class, _clusterCollectionName)) {
             List<Cluster> clusters = event.get(Cluster.class, _clusterCollectionName);
@@ -146,5 +189,56 @@
     {
         _clusterCollectionName = s;
     }
+    
+    public void setSelectTopHits(boolean b)
+    {
+        _selectTopHits = b;
+    }
+
+    public void setSelectBottomHits(boolean b)
+    {
+        _selectBottomHits = b;
+    }
+    
+    private void setSelectAllLayers(boolean b)
+    {
+        _selectAllLayers = b;
+    }
+    
+    private void setupSensors(EventHeader event)
+    {
+        List<RawTrackerHit> rawTrackerHits = event.get(RawTrackerHit.class, "SVTRawTrackerHits");
+        EventHeader.LCMetaData meta = event.getMetaData(rawTrackerHits);
+        // Get the ID dictionary and field information.
+        IIdentifierDictionary dict = meta.getIDDecoder().getSubdetector().getDetectorElement().getIdentifierHelper().getIdentifierDictionary();
+        int fieldIdx = dict.getFieldIndex("side");
+        int sideIdx = dict.getFieldIndex("strip");
+        for (RawTrackerHit hit : rawTrackerHits) {
+            // The "side" and "strip" fields needs to be stripped from the ID for sensor lookup.
+            IExpandedIdentifier expId = dict.unpack(hit.getIdentifier());
+            expId.setValue(fieldIdx, 0);
+            expId.setValue(sideIdx, 0);
+            IIdentifier strippedId = dict.pack(expId);
+            // Find the sensor DetectorElement.
+            List<IDetectorElement> des = DetectorElementStore.getInstance().find(strippedId);
+            if (des == null || des.size() == 0) {
+                throw new RuntimeException("Failed to find any DetectorElements with stripped ID <0x" + Long.toHexString(strippedId.getValue()) + ">.");
+            } else if (des.size() == 1) {
+                hit.setDetectorElement((SiSensor) des.get(0));
+            } else {
+                // Use first sensor found, which should work unless there are sensors with duplicate IDs.
+                for (IDetectorElement de : des) {
+                    if (de instanceof SiSensor) {
+                        hit.setDetectorElement((SiSensor) de);
+                        break;
+                    }
+                }
+            }
+            // No sensor was found.
+            if (hit.getDetectorElement() == null) {
+                throw new RuntimeException("No sensor was found for hit with stripped ID <0x" + Long.toHexString(strippedId.getValue()) + ">.");
+            }
+        }
+    }
 
 }