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