lcsim/src/org/lcsim/detector/driver
diff -N RawTrackerHitReadoutDriver.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ RawTrackerHitReadoutDriver.java 23 May 2007 20:14:58 -0000 1.1
@@ -0,0 +1,101 @@
+package org.lcsim.detector.driver;
+
+import java.util.List;
+import java.util.Map;
+
+import org.lcsim.detector.DetectorElementStore;
+import org.lcsim.detector.IDetectorElement;
+import org.lcsim.detector.IReadout;
+import org.lcsim.detector.identifier.IExpandedIdentifier;
+import org.lcsim.detector.identifier.IIdentifier;
+import org.lcsim.detector.identifier.IIdentifierField;
+import org.lcsim.detector.identifier.IIdentifierHelper;
+import org.lcsim.detector.identifier.Identifier;
+import org.lcsim.event.EventHeader;
+import org.lcsim.event.RawTrackerHit;
+import org.lcsim.geometry.subdetector.SiTrackerBarrel;
+
+/**
+ * Assigns the corresponding {@link org.lcsim.detector.IDetectorElement}
+ * to a {@link org.lcsim.event.RawTrackerHit}.
+ *
+ * @author Jeremy McCormick
+ * @version $Id: RawTrackerHitReadoutDriver.java,v 1.1 2007/05/23 20:14:58 jeremy Exp $
+ */
+public class RawTrackerHitReadoutDriver
+extends CollectionHandler
+{
+ public RawTrackerHitReadoutDriver(List<String> collectionNames)
+ {
+ super(collectionNames);
+ add(new ReadoutCleanupDriver(collectionNames));
+ }
+
+ public RawTrackerHitReadoutDriver(String[] collectionNames)
+ {
+ super(collectionNames);
+ add(new ReadoutCleanupDriver(collectionNames));
+ }
+
+ static final private String idKey[] =
+ new String[] {"system","barrel","layer","module","sensor","side","strip"};
+ protected void process(EventHeader header)
+ {
+ super.process(header);
+ List<List<RawTrackerHit>> collections = header.get(RawTrackerHit.class);
+ for ( List<RawTrackerHit> collection : collections )
+ {
+ if (canHandle(header.getMetaData( collection ).getName()))
+ {
+ IIdentifierHelper helper = header.getMetaData(collection).getIDDecoder().getSubdetector().getDetectorElement().getIdentifierHelper();
+
+ // Check that the id is in the expected format.
+ Map<String,IIdentifierField> fields = helper.getIdentifierDictionary().getFieldNameMap();
+ for (int i=0; i<fields.size(); i++)
+ {
+ if (i > (idKey.length - 1))
+ {
+ throw new RuntimeException("Index out of range <"+i+">.");
+ }
+
+ IIdentifierField field = fields.get(idKey[i]);
+
+ if (field == null)
+ {
+ throw new RuntimeException("Missing expected field <"+idKey[i]+">.");
+ }
+
+ if (field.getOrder() != i)
+ {
+ throw new RuntimeException("The field <"+idKey[i]+"> is in the wrong order.");
+ }
+ }
+
+ for (RawTrackerHit hit : collection)
+ {
+ IDetectorElement deSubdet = hit.getSubdetector().getDetectorElement();
+ IIdentifier hitId = new Identifier(hit.getCellID());
+
+ // Extract the field values up to, but not including, "side".
+ IExpandedIdentifier expGeomId = helper.unpack(hitId, 0, helper.getIdentifierDictionary().getFieldIndex("side") - 1);
+
+ // Repack the ID, with non-geometric fields removed.
+ IIdentifier geomId = helper.pack(expGeomId);
+
+ // Lookup the DetectorElement.
+ IDetectorElement deHit =
+ DetectorElementStore.getInstance().findDetectorElement(geomId);
+
+ if (deHit == null)
+ {
+ throw new RuntimeException("DetectorElement not found with id <"+geomId.toHexString()+">.");
+ }
+
+ hit.setDetectorElement(deHit);
+ IReadout ro = deHit.getReadout();
+ ro.addHit(hit);
+ }
+ }
+ }
+ }
+}
lcsim/test/org/lcsim/detector/driver
diff -N RawTrackerHitReadoutDriverTest.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ RawTrackerHitReadoutDriverTest.java 23 May 2007 20:14:58 -0000 1.1
@@ -0,0 +1,77 @@
+package org.lcsim.detector.driver;
+
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.List;
+
+import junit.framework.*;
+
+import org.lcsim.detector.DetectorElementStore;
+import org.lcsim.detector.driver.RawTrackerHitReadoutDriver;
+import org.lcsim.detector.driver.SimTrackerHitIdentifierReadoutDriver;
+import org.lcsim.event.EventHeader;
+import org.lcsim.event.RawTrackerHit;
+import org.lcsim.event.SimTrackerHit;
+import org.lcsim.event.base.BaseRawTrackerHit;
+import org.lcsim.util.Driver;
+import org.lcsim.util.cache.FileCache;
+import org.lcsim.util.loop.LCSimLoop;
+
+/**
+ * Test {@link org.lcsim.detector.RawTrackerHitReadout}.
+ *
+ * @author Jeremy McCormick
+ */
+public class RawTrackerHitReadoutDriverTest extends TestCase
+{
+
+ private static final String resource =
+ "http://www.lcsim.org/test/lcio/mu-_10GeV_SiTrackerBarrelTest00.slcio";
+
+ private static final String[] collection = new String[] { "SiTrackerBarrel_RO" };
+
+ public void testRawTrackerHitIO() throws Exception
+ {
+ LCSimLoop writeLoop = new LCSimLoop();
+ writeLoop.setLCIORecordSource((new FileCache()).getCachedFile(new URL(resource)));
+
+ writeLoop.add(new SimTrackerHitIdentifierReadoutDriver(new String[] { "SiTrackerBarrel_RO" } ));
+ writeLoop.add(new RawTrackerHitMaker());
+ writeLoop.add(new RawTrackerHitReadoutDriver(new String[] { "RawTrackerHitTest" }));
+ writeLoop.add(new CheckDriver());
+ writeLoop.loop(1);
+ writeLoop.dispose();
+ }
+
+ private class RawTrackerHitMaker extends Driver
+ {
+ protected void process(EventHeader event)
+ {
+ List<RawTrackerHit> rawHits = new ArrayList<RawTrackerHit>();
+ List<SimTrackerHit> simHits = event.get(SimTrackerHit.class, "SiTrackerBarrel_RO");
+ for ( SimTrackerHit simHit : simHits )
+ {
+ List<SimTrackerHit> thisSimHit = new ArrayList<SimTrackerHit>();
+ thisSimHit.add(simHit);
+ RawTrackerHit rawHit =
+ new BaseRawTrackerHit(0,(long)simHit.getCellID(),new short[]{},simHit.getIDDecoder(),thisSimHit);
+ rawHits.add(rawHit);
+ }
+ event.put("RawTrackerHitTest", rawHits, RawTrackerHit.class, 0, "SiTrackerBarrel_RO");
+ }
+ }
+
+ private class CheckDriver extends Driver
+ {
+ protected void process(EventHeader event)
+ {
+ List<RawTrackerHit> rawHits = event.get(RawTrackerHit.class, "RawTrackerHitTest");
+ for (RawTrackerHit hit : rawHits)
+ {
+ assertTrue(hit.getIdentifier() != null);
+ assertTrue(hit.getDetectorElement() != null);
+ assertEquals(hit.getDetectorElement(), hit.getSimTrackerHit().get(0).getDetectorElement());
+ }
+ }
+ }
+}
\ No newline at end of file