lcsim/test/org/lcsim/detector/driver
diff -N NewSimTrackerDigitizationTest.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ NewSimTrackerDigitizationTest.java 3 Jul 2007 23:55:07 -0000 1.1
@@ -0,0 +1,204 @@
+package org.lcsim.detector.driver;
+
+import java.io.File;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.SortedMap;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+import hep.physics.vec.BasicHep3Vector;
+import hep.physics.vec.Hep3Vector;
+import hep.physics.vec.VecOp;
+
+import org.lcsim.event.EventHeader;
+import org.lcsim.event.SimTrackerHit;
+import org.lcsim.event.RawTrackerHit;
+import org.lcsim.event.base.BaseRawTrackerHit;
+import org.lcsim.geometry.IDDecoder;
+import org.lcsim.util.Driver;
+import org.lcsim.util.cache.FileCache;
+import org.lcsim.util.loop.LCSimLoop;
+import org.lcsim.detector.driver.SimTrackerHitIdentifierReadoutDriver;
+import org.lcsim.detector.IDetectorElement;
+import org.lcsim.detector.ITransform3D;
+import org.lcsim.detector.IReadout;
+import org.lcsim.geometry.compact.Subdetector;
+
+import org.lcsim.detector.tracker.silicon.SiSensor;
+import org.lcsim.detector.tracker.silicon.TrackSegment;
+import org.lcsim.detector.tracker.silicon.ChargeCarrier;
+
+import org.lcsim.contrib.SiStripSim.SiSensorSim;
+import org.lcsim.contrib.SiStripSim.CDFSiSensorSim;
+import org.lcsim.contrib.SiStripSim.ReadoutChip;
+import org.lcsim.contrib.SiStripSim.Kpix;
+import org.lcsim.contrib.SiStripSim.SiElectrodeDataCollection;
+
+/**
+ * Reads 2 muon event generated in sid01_polyhedra, which uses
+ * SiTrackerBarrel. For DetectorElements where there is a
+ * Readout containing one hit, check that the hit from the event
+ * and the DE's have matching cell id.
+ */
+public class NewSimTrackerDigitizationTest extends TestCase
+{
+ public NewSimTrackerDigitizationTest(String testName)
+ {
+ super(testName);
+ }
+
+ public static Test suite()
+ {
+// return new TestSuite(SimTrackerHitPositionalReadoutDriverTest.class);
+ return new TestSuite(NewSimTrackerDigitizationTest.class);
+ }
+
+ public void setUp()
+ {
+ java.lang.Runtime.getRuntime().gc();
+ }
+
+ public void testReadout() throws Exception
+ {
+ URL url =
+ new URL("http://www.lcsim.org/test/lcio/mu-_10GeV_10_SLIC_v2r1p7_geant4-v8r2p0_SiTrackerBarrelTest00.slcio");
+ FileCache cache = new FileCache();
+ File file = cache.getCachedFile(url);
+
+ LCSimLoop loop = new LCSimLoop();
+ loop.setLCIORecordSource(file);
+// loop.add( new SimTrackerHitPositionalReadoutDriver(new String[] {"SiTrackerBarrel_RO"} ) );
+ loop.add( new SimTrackerHitIdentifierReadoutDriver(new String[] {"SiTrackerBarrel_RO"} ) );
+ loop.add( new TestDriver() );
+ loop.loop(1);
+ loop.dispose();
+ }
+
+ class TestDriver
+ extends Driver
+ {
+ protected void process(EventHeader header)
+ {
+ List<SimTrackerHit> hitsFromRO = new ArrayList<SimTrackerHit>();
+ IDetectorElement tkr = header.getDetector().getSubdetector("SiTrackerBarrel").getDetectorElement();
+ for ( IDetectorElement layer : tkr.getChildren() )
+ {
+ for ( IDetectorElement module : layer.getChildren() )
+ {
+ for ( IDetectorElement sensor : module.getChildren() )
+ {
+ IReadout ro = sensor.getReadout();
+ List<SimTrackerHit> hits = ro.getHits(SimTrackerHit.class);
+ hitsFromRO.addAll( hits );
+ }
+ }
+ }
+
+ /*
+ System.out.println("hitsFromRO.size = " + hitsFromRO.size() );
+ for ( SimTrackerHit roHit : hitsFromRO )
+ {
+ System.out.println("got hit from RO - " + roHit.getCellID());
+ }*/
+
+ List<SimTrackerHit> eventHits = header.get(SimTrackerHit.class, "SiTrackerBarrel_RO");
+
+ System.out.println("Number of SimTrackerHits: " + eventHits.size());
+
+ // set of sensors with hits
+ Set<SiSensor> hit_sensors = new HashSet<SiSensor>();
+
+ // readout chip
+ ReadoutChip readout_chip = new Kpix();
+
+ for (SimTrackerHit hit : eventHits)
+ {
+// _decoder.setID(hit.getCellID());
+
+ // Create track segment in global coordinates
+ Hep3Vector midpoint = new BasicHep3Vector(hit.getPoint());
+ Hep3Vector direction = VecOp.unit(new BasicHep3Vector(hit.getMomentum()));
+ Hep3Vector half_length = VecOp.mult(hit.getPathLength()/2.0,direction);
+
+ Hep3Vector p1 = VecOp.add(midpoint,VecOp.mult(-1.0,half_length));
+ Hep3Vector p2 = VecOp.add(midpoint,half_length);
+
+ double energy = hit.getdEdx();
+
+ TrackSegment track_segment = new TrackSegment(p1,p2,energy);
+
+ // Find the sensor for this hit, add to list of hit sensors
+ SiSensor sensor = (SiSensor)tkr.findDetectorElement(midpoint);
+ hit_sensors.add(sensor);
+
+ // Transform track segment to sensor coordinates and assign to sensor
+ ITransform3D global_to_sensor = sensor.getGeometry().getGlobalToLocal();
+ track_segment.transform(global_to_sensor);
+ sensor.addTrackSegment(track_segment);
+ }
+
+
+ // Setup simulation
+ SiSensorSim si_simulation = new CDFSiSensorSim();
+ ReadoutChip kpix = new Kpix();
+ List<RawTrackerHit> raw_hits = new ArrayList<RawTrackerHit>();
+
+ // Loop over sensors
+ System.out.println("Number of Hit Sensors: " + hit_sensors.size());
+
+ for (SiSensor sensor : hit_sensors)
+ {
+
+ System.out.println("\n" + "Sensor: " + sensor.getName());
+
+ // deposit charge with CDF/Padova model
+ si_simulation.simulate(sensor);
+
+ for (ChargeCarrier carrier : ChargeCarrier.values())
+ {
+ if (sensor.hasElectrodesOnSide(carrier))
+ {
+ System.out.println("Raw Charge Map for " + carrier + ": " + si_simulation.getReadoutData(carrier).getChargeMap());
+ SortedMap<Integer,Integer> digitized_hits = kpix.readout(si_simulation.getReadoutData(carrier).getChargeMap(),sensor.getReadoutElectrodes(carrier));
+ SiElectrodeDataCollection digitized_data = new SiElectrodeDataCollection(si_simulation.getReadoutData(carrier));
+ digitized_data.putChargeMap(digitized_hits);
+ System.out.println("Digitized Charge Map for " + carrier + ": " + digitized_hits);
+
+ // Create RawTrackerHits
+ for (Integer readout_cell : si_simulation.getReadoutData(carrier).getChargeMap().keySet())
+ {
+ int time = 0;
+ long cell_id = sensor.makeStripId(readout_cell,carrier.charge()).getValue();
+ short[] adc_values = {(short)digitized_data.get(readout_cell).getCharge()};
+ List<SimTrackerHit> simulated_hits = si_simulation.getReadoutData(carrier).get(readout_cell).getSimulatedHits();
+ IDetectorElement detector_element = sensor;
+
+ RawTrackerHit raw_hit = new BaseRawTrackerHit(time,cell_id,adc_values,simulated_hits,detector_element);
+ raw_hits.add(raw_hit);
+ }
+ }
+ }
+
+ // Clear simulation and add RawTrackerHits to event
+ si_simulation.clearReadout();
+ header.put("BarrelTrackerHits",raw_hits,RawTrackerHit.class,0,"Kpix");
+
+ }
+
+
+
+
+
+ }
+
+
+ }
+}
+