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()) + ">.");
+ }
+ }
+ }
}
|