Commit in lcsim/src/org/lcsim/recon/tracking/seedtracker/trackingdrivers/sidloi3 on MAIN
MainTrackingDriver.java+50added 1.1
MakeSensorsDriver.java+23added 1.1
SiTrackerBarrelSensorSetup.java+120added 1.1
SiTrackerEndcap2SensorSetup.java+132added 1.1
SiVertexBarrelSensorSetup.java+131added 1.1
SiVertexEndcapSensorSetup.java+157added 1.1
TrackerHitDriver_sidloi3.java+228added 1.1
+841
7 added files
Nominal tracking drivers to run tracking with sidloi3

lcsim/src/org/lcsim/recon/tracking/seedtracker/trackingdrivers/sidloi3
MainTrackingDriver.java added at 1.1
diff -N MainTrackingDriver.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ MainTrackingDriver.java	3 Jun 2010 13:06:34 -0000	1.1
@@ -0,0 +1,50 @@
+/*
+ * Tracking driver for sidloi2 detector
+ */
+package org.lcsim.recon.tracking.seedtracker.trackingdrivers.sidloi3;
+
+import org.lcsim.recon.tracking.seedtracker.trackingdrivers.sidloi2.*;
+import java.util.List;
+
+import org.lcsim.fit.helicaltrack.HelicalTrackHitDriver;
+import org.lcsim.fit.helicaltrack.HelicalTrackHitDriver.HitType;
+import org.lcsim.recon.tracking.seedtracker.SeedStrategy;
+import org.lcsim.recon.tracking.seedtracker.SeedTracker;
+import org.lcsim.recon.tracking.seedtracker.StrategyXMLUtils;
+import org.lcsim.util.Driver;
+
+/**
+ *
+ * @author Richard Partridge
+ */
+public class MainTrackingDriver extends Driver {
+
+    private SeedTracker _st;
+
+    public MainTrackingDriver() {
+
+        //  Setup the sensor configuration
+        add(new MakeSensorsDriver());
+
+        //  Digitization and hit making driver for planar sensors
+        TrackerHitDriver_sidloi3 thd = new TrackerHitDriver_sidloi3();
+        add(thd);
+
+        //  Driver to make HelicalTrackHits for tracking
+        HelicalTrackHitDriver hitdriver = new HelicalTrackHitDriver();
+        hitdriver.addCollection(thd.getStripHits1DName(), HitType.Digitized);
+        hitdriver.addCollection(thd.getPixelHitsName(), HitType.Digitized);
+        hitdriver.OutputCollection("HelicalTrackHits");
+        add(hitdriver);
+
+        //  Tracking code
+        String sfile = StrategyXMLUtils.getDefaultStrategiesPrefix() + "autogen_ttbar_sidloi3.xml";
+        List<SeedStrategy> slist = StrategyXMLUtils.getStrategyListFromResource(sfile);
+        _st = new SeedTracker(slist);
+        add(_st);
+    }
+
+    public SeedTracker getSeedTracker() {
+        return _st;
+    }
+}

lcsim/src/org/lcsim/recon/tracking/seedtracker/trackingdrivers/sidloi3
MakeSensorsDriver.java added at 1.1
diff -N MakeSensorsDriver.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ MakeSensorsDriver.java	3 Jun 2010 13:06:34 -0000	1.1
@@ -0,0 +1,23 @@
+/*
+ * Main driver for setting up the sensor configuration.
+ * Currently, we just use default configurations.
+ */
+package org.lcsim.recon.tracking.seedtracker.trackingdrivers.sidloi3;
+
+import org.lcsim.recon.tracking.seedtracker.trackingdrivers.sidloi2.*;
+import org.lcsim.util.Driver;
+
+/**
+ *
+ * @author Richard Partridge
+ */
+public class MakeSensorsDriver extends Driver {
+
+    public MakeSensorsDriver() {
+        add(new SiVertexBarrelSensorSetup("SiVertexBarrel"));
+        add(new SiTrackerBarrelSensorSetup("SiTrackerBarrel"));
+        add(new SiVertexEndcapSensorSetup("SiVertexEndcap"));
+        add(new SiVertexEndcapSensorSetup("SiTrackerForward"));
+        add(new SiTrackerEndcap2SensorSetup("SiTrackerEndcap"));
+    }
+}

lcsim/src/org/lcsim/recon/tracking/seedtracker/trackingdrivers/sidloi3
SiTrackerBarrelSensorSetup.java added at 1.1
diff -N SiTrackerBarrelSensorSetup.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ SiTrackerBarrelSensorSetup.java	3 Jun 2010 13:06:34 -0000	1.1
@@ -0,0 +1,120 @@
+package org.lcsim.recon.tracking.seedtracker.trackingdrivers.sidloi3;
+
+import org.lcsim.recon.tracking.seedtracker.trackingdrivers.sidloi2.*;
+import hep.physics.matrix.BasicMatrix;
+import hep.physics.vec.BasicHep3Vector;
+import hep.physics.vec.VecOp;
+
+import java.util.List;
+
+import org.lcsim.detector.IDetectorElement;
+import org.lcsim.detector.IRotation3D;
+import org.lcsim.detector.ITranslation3D;
+import org.lcsim.detector.RotationPassiveXYZ;
+import org.lcsim.detector.Transform3D;
+import org.lcsim.detector.Translation3D;
+import org.lcsim.detector.solids.IPolyhedron;
+import org.lcsim.detector.solids.Polygon3D;
+import org.lcsim.detector.tracker.silicon.ChargeCarrier;
+import org.lcsim.detector.tracker.silicon.SiSensor;
+import org.lcsim.detector.tracker.silicon.SiSensorElectrodes;
+import org.lcsim.detector.tracker.silicon.SiStrips;
+import org.lcsim.geometry.Detector;
+import org.lcsim.geometry.compact.Subdetector;
+import org.lcsim.geometry.subdetector.SiTrackerBarrel;
+import org.lcsim.util.Driver;
+
+public class SiTrackerBarrelSensorSetup extends Driver 
+{
+	String subdetectorName;
+	
+	double readoutElectrodesPitch = 0.050;
+	double senseElectrodesPitch = 0.025;
+	double transferEfficiencies[] = {0.986,0.419};
+
+	public SiTrackerBarrelSensorSetup()
+	{}
+	
+	public SiTrackerBarrelSensorSetup(String subdetectorName)
+	{
+		this.subdetectorName = subdetectorName;
+	}
+	
+	public void setSubdetectorName(String subdetectorName)
+	{
+		this.subdetectorName = subdetectorName;
+	}
+	
+	public void detectorChanged(Detector detector)
+	{
+		if (subdetectorName == null)
+			throw new RuntimeException("The subdetectorName was not set.");
+		
+		Subdetector subdetector = detector.getSubdetector(subdetectorName);
+		if (subdetector instanceof SiTrackerBarrel)
+			setupSensorDetectorElements(subdetector);
+		else
+			throw new RuntimeException("The subdetector " + subdetectorName + " is not an instance of SiTrackerBarrel.");
+	}
+	
+	public void setReadoutElectrodesPitch(double readoutElectrodesPitch)
+	{
+		this.readoutElectrodesPitch = readoutElectrodesPitch;
+	}
+	
+	public void setSenseElectrodesPitch(double senseElectrodesPitch)
+	{
+		this.senseElectrodesPitch = senseElectrodesPitch;
+	}
+	
+	public void setTransferEfficiencies(double transferEfficiencies[])
+	{
+		if (transferEfficiencies.length < 2)
+		{
+			throw new IllegalArgumentException("Not enough values in transferEfficiencies array.");
+		}
+		this.transferEfficiencies[0] = transferEfficiencies[0];
+		this.transferEfficiencies[1] = transferEfficiencies[1];
+	}
+
+	private void setupSensorDetectorElements(Subdetector subdet)
+	{		
+		for ( IDetectorElement layer : subdet.getDetectorElement().getChildren() )
+		{
+			for ( IDetectorElement module : layer.getChildren() )
+			{
+					List<SiSensor> sensors = module.findDescendants(SiSensor.class);
+
+					if (sensors.size() == 0)
+						throw new RuntimeException("No sensors found in module " + module.getName() + ".");
+
+					SiSensor sensor = sensors.get(0);
+
+					// Set up SiStrips for the sensors
+					IPolyhedron sensor_solid = (IPolyhedron)sensor.getGeometry().getLogicalVolume().getSolid();
+
+					// Bias the sensor
+					Polygon3D top_side = sensor_solid.getFacesNormalTo(new BasicHep3Vector(0,0,1)).get(0);
+					Polygon3D bot_side = sensor_solid.getFacesNormalTo(new BasicHep3Vector(0,0,-1)).get(0);
+
+					sensor.setBiasSurface(ChargeCarrier.HOLE,top_side);
+					sensor.setBiasSurface(ChargeCarrier.ELECTRON,bot_side);
+
+					// Add sense and readout electrodes
+					ITranslation3D electrodes_position = new Translation3D(VecOp.mult(-top_side.getDistance(),top_side.getNormal()));  // translate to p_side
+					IRotation3D electrodes_rotation = new RotationPassiveXYZ(0.0,0.0,0.0);                                      // no rotation (global x-y = local x-y for axial strips)
+					Transform3D electrodes_transform = new Transform3D(electrodes_position, electrodes_rotation);
+
+					// Free calculation of readout electrodes, sense electrodes determined thereon
+					SiSensorElectrodes readout_electrodes = new SiStrips(ChargeCarrier.HOLE,this.readoutElectrodesPitch,sensor,electrodes_transform);
+					SiSensorElectrodes sense_electrodes = new SiStrips(ChargeCarrier.HOLE,senseElectrodesPitch,(readout_electrodes.getNCells()*2-1),sensor,electrodes_transform);
+
+					sensor.setSenseElectrodes(sense_electrodes);
+					sensor.setReadoutElectrodes(readout_electrodes);
+
+					double[][] transferEfficienciesMatrix = { transferEfficiencies };
+					sensor.setTransferEfficiencies(ChargeCarrier.HOLE,new BasicMatrix(transferEfficienciesMatrix));                        
+			}                
+		}        
+	}
+}

lcsim/src/org/lcsim/recon/tracking/seedtracker/trackingdrivers/sidloi3
SiTrackerEndcap2SensorSetup.java added at 1.1
diff -N SiTrackerEndcap2SensorSetup.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ SiTrackerEndcap2SensorSetup.java	3 Jun 2010 13:06:34 -0000	1.1
@@ -0,0 +1,132 @@
+package org.lcsim.recon.tracking.seedtracker.trackingdrivers.sidloi3;
+
+import org.lcsim.recon.tracking.seedtracker.trackingdrivers.sidloi2.*;
+import org.lcsim.recon.tracking.digitization.sisim.config.*;
+import hep.physics.matrix.BasicMatrix;
+import hep.physics.vec.BasicHep3Vector;
+import hep.physics.vec.VecOp;
+
+import java.util.List;
+
+import org.lcsim.detector.IDetectorElement;
+import org.lcsim.detector.IRotation3D;
+import org.lcsim.detector.ITranslation3D;
+import org.lcsim.detector.RotationPassiveXYZ;
+import org.lcsim.detector.Transform3D;
+import org.lcsim.detector.Translation3D;
+import org.lcsim.detector.solids.Polygon3D;
+import org.lcsim.detector.solids.Trd;
+import org.lcsim.detector.tracker.silicon.ChargeCarrier;
+import org.lcsim.detector.tracker.silicon.SiSensor;
+import org.lcsim.detector.tracker.silicon.SiSensorElectrodes;
+import org.lcsim.detector.tracker.silicon.SiStrips;
+import org.lcsim.geometry.Detector;
+import org.lcsim.geometry.compact.Subdetector;
+import org.lcsim.geometry.subdetector.SiTrackerEndcap2;
+import org.lcsim.util.Driver;
+
+public class SiTrackerEndcap2SensorSetup extends Driver 
+{
+	String subdetectorName;
+	double readoutPitch = 0.050;
+	double sensePitch = 0.025;
+	double transferEfficiencies[] = {0.986,0.419};
+
+	public SiTrackerEndcap2SensorSetup()
+	{}
+
+	public SiTrackerEndcap2SensorSetup(String subdetectorName)
+	{
+		this.subdetectorName = subdetectorName;
+	}
+
+	public void setSubdetectorName(String subdetectorName)
+	{
+		this.subdetectorName = subdetectorName;
+	}
+
+	public void detectorChanged(Detector detector)
+	{
+		if (subdetectorName == null)
+			throw new RuntimeException("The subdetectorName was not set.");
+
+		Subdetector subdetector = detector.getSubdetector(subdetectorName);
+		if (subdetector instanceof SiTrackerEndcap2)
+			setupSensorDetectorElements(subdetector);
+		else
+			throw new RuntimeException("The subdetector " + subdetectorName + " is not an instance of SiTrackerEndcap.");
+	}
+	
+	public void setReadoutPitch(double p)
+	{
+		this.readoutPitch = p;
+	}
+	
+	public void setSensePitch(double p)
+	{
+		this.sensePitch = p;
+	}
+	
+	public void setTransferEfficiencies(double transferEfficiencies[])
+	{
+		if (transferEfficiencies.length < 2)
+		{
+			throw new IllegalArgumentException("Not enough values in transferEfficiencies array.");
+		}
+		this.transferEfficiencies[0] = transferEfficiencies[0];
+		this.transferEfficiencies[1] = transferEfficiencies[1];
+	}
+
+	private void setupSensorDetectorElements(Subdetector subdet)
+	{
+		for ( IDetectorElement endcap : subdet.getDetectorElement().getChildren() )
+		{
+			for ( IDetectorElement layer : endcap.getChildren() )
+			{
+				for ( IDetectorElement wedge : layer.getChildren() )
+				{
+					for ( IDetectorElement module : wedge.getChildren() )
+					{
+						List<SiSensor> sensors = module.findDescendants(SiSensor.class);
+
+						if (sensors.size() == 0)
+							throw new RuntimeException("No sensors found in module.");
+
+						for (SiSensor sensor : sensors)
+						{
+							Trd sensor_solid = (Trd)sensor.getGeometry().getLogicalVolume().getSolid();
+                            
+                            Polygon3D inside = sensor_solid.getFacesNormalTo(new BasicHep3Vector(0,-1,0)).get(0);
+                            Polygon3D outside = sensor_solid.getFacesNormalTo(new BasicHep3Vector(0,1,0)).get(0);
+
+                            Polygon3D n_side = inside;
+                            Polygon3D p_side = outside;
+
+                            // Bias the sensor
+                            sensor.setBiasSurface(ChargeCarrier.HOLE,p_side);
+                            sensor.setBiasSurface(ChargeCarrier.ELECTRON,n_side);
+                                                         
+                            double strip_angle = Math.atan2(sensor_solid.getXHalfLength2() - sensor_solid.getXHalfLength1(), sensor_solid.getZHalfLength() * 2);
+                                                        
+                            ITranslation3D electrodes_position = new Translation3D(VecOp.mult(-p_side.getDistance(),new BasicHep3Vector(0,0,1)));  // translate to outside of polygon
+                            IRotation3D electrodes_rotation = new RotationPassiveXYZ(-Math.PI/2,0,strip_angle);
+                            Transform3D electrodes_transform = new Transform3D(electrodes_position, electrodes_rotation);                                
+                            
+                            // Free calculation of readout electrodes, sense electrodes determined thereon
+                            SiSensorElectrodes readout_electrodes = new SiStrips(ChargeCarrier.HOLE,this.readoutPitch,sensor,electrodes_transform);
+                            SiSensorElectrodes sense_electrodes = new SiStrips(ChargeCarrier.HOLE,this.sensePitch,(readout_electrodes.getNCells()*2-1),sensor,electrodes_transform);                                                                
+                            
+                            sensor.setSenseElectrodes(sense_electrodes);
+                            sensor.setReadoutElectrodes(readout_electrodes);
+                            
+                            double[][] transfer_efficiencies = { transferEfficiencies };
+                            sensor.setTransferEfficiencies(ChargeCarrier.HOLE,new BasicMatrix(transfer_efficiencies));
+						}
+					}
+				}                
+			}        
+		}
+	}
+}
+
+

lcsim/src/org/lcsim/recon/tracking/seedtracker/trackingdrivers/sidloi3
SiVertexBarrelSensorSetup.java added at 1.1
diff -N SiVertexBarrelSensorSetup.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ SiVertexBarrelSensorSetup.java	3 Jun 2010 13:06:34 -0000	1.1
@@ -0,0 +1,131 @@
+package org.lcsim.recon.tracking.seedtracker.trackingdrivers.sidloi3;
+
+import org.lcsim.recon.tracking.seedtracker.trackingdrivers.sidloi2.*;
+import hep.physics.matrix.BasicMatrix;
+import hep.physics.vec.BasicHep3Vector;
+import hep.physics.vec.VecOp;
+
+import java.util.List;
+
+import org.lcsim.detector.IDetectorElement;
+import org.lcsim.detector.IRotation3D;
+import org.lcsim.detector.ITranslation3D;
+import org.lcsim.detector.RotationPassiveXYZ;
+import org.lcsim.detector.Transform3D;
+import org.lcsim.detector.Translation3D;
+import org.lcsim.detector.solids.IPolyhedron;
+import org.lcsim.detector.solids.Polygon3D;
+import org.lcsim.detector.tracker.silicon.ChargeCarrier;
+import org.lcsim.detector.tracker.silicon.SiPixels;
+import org.lcsim.detector.tracker.silicon.SiSensor;
+import org.lcsim.detector.tracker.silicon.SiSensorElectrodes;
+import org.lcsim.geometry.Detector;
+import org.lcsim.geometry.compact.Subdetector;
+import org.lcsim.geometry.subdetector.SiTrackerBarrel;
+import org.lcsim.util.Driver;
+
+public class SiVertexBarrelSensorSetup extends Driver
+{
+	String subdetectorName;
+	
+    // Sets pixel size to x=0.05 and y=0.25 (mm)
+	double readoutPitchX = 0.025;
+	double readoutPitchY = 0.025;
+	double sensePitchX = 0.025;
+	double sensePitchY = 0.025;
+	double transferEfficiency = 1.0;
+
+	public SiVertexBarrelSensorSetup()
+	{}
+	
+	public SiVertexBarrelSensorSetup(String subdetectorName)
+	{
+		this.subdetectorName = subdetectorName;
+	}
+	
+	public void setSubdetectorName(String subdetectorName)
+	{
+		this.subdetectorName = subdetectorName;
+	}
+	
+	public void detectorChanged(Detector detector)
+	{
+		if (subdetectorName == null)
+			throw new RuntimeException("The subdetectorName was not set.");
+		
+		Subdetector subdetector = detector.getSubdetector(subdetectorName);
+		if (subdetector instanceof SiTrackerBarrel)
+			setupSensorDetectorElements(subdetector);
+		else
+			throw new RuntimeException("The subdetector " + subdetectorName + " is not an instance of SiTrackerBarrel.");
+	}
+	
+	public void setReadoutPitchX(double x)
+	{
+		this.readoutPitchX = x;
+	}
+	
+	public void setReadoutPitchY(double y)
+	{
+		this.readoutPitchY = y;
+	}
+	
+	public void setSensePitchX(double x)
+	{
+		this.sensePitchX = x;
+	}
+	
+	public void setSensePitchY(double y)
+	{
+		this.sensePitchY = y;
+	}
+	
+	public void setTransferEfficiency(double t)
+	{
+		this.transferEfficiency = t;
+	}
+	
+	private void setupSensorDetectorElements(Subdetector subdet)
+	{		
+		for ( IDetectorElement layer : subdet.getDetectorElement().getChildren() )
+		{
+			for ( IDetectorElement module : layer.getChildren() )
+			{
+					List<SiSensor> sensors = module.findDescendants(SiSensor.class);
+
+					if (sensors.size() == 0)
+						throw new RuntimeException("No sensors found in module " + module.getName() + ".");
+
+					SiSensor sensor = sensors.get(0);
+					IPolyhedron sensor_solid = (IPolyhedron) sensor.getGeometry().getLogicalVolume().getSolid();
+					
+                    Polygon3D top_side = sensor_solid.getFacesNormalTo(new BasicHep3Vector(0, 0, 1)).get(0);
+                    Polygon3D bot_side = sensor_solid.getFacesNormalTo(new BasicHep3Vector(0, 0, -1)).get(0);
+                   
+                    // collect electrons on the top side
+                    sensor.setBiasSurface(ChargeCarrier.HOLE, top_side);
+                    sensor.setBiasSurface(ChargeCarrier.ELECTRON, bot_side);
+
+                    // Add sense and readout electrodes
+                    ITranslation3D electrodes_position = new Translation3D(VecOp.mult(-top_side.getDistance(), top_side.getNormal()));  // translate to p_side
+                    IRotation3D electrodes_rotation = new RotationPassiveXYZ(0.0, 0.0, 0.0);                     
+                    // no rotation (global x-y = local x-y for axial strips)
+
+                    Transform3D electrodes_transform = new Transform3D(electrodes_position, electrodes_rotation);
+
+                    //  Define the pixel electrodes...collecting holes;
+                    SiSensorElectrodes readout_electrodes = new SiPixels(ChargeCarrier.HOLE, this.readoutPitchX, this.readoutPitchY, sensor, electrodes_transform);
+                    SiSensorElectrodes sense_electrodes = new SiPixels(ChargeCarrier.HOLE, this.sensePitchX, this.sensePitchY, sensor, electrodes_transform);
+
+                    //  Tell the sensor about the electrodes
+                    sensor.setSenseElectrodes(sense_electrodes);
+                    sensor.setReadoutElectrodes(readout_electrodes);
+
+                    //  Define the transfer efficiency from sense electrodes to readout electrodes
+                    //  For pixels, we do a direct transfer of charge from sense electrodes to readout electrodes
+                    double[][] transfer_efficiencies = {{this.transferEfficiency}};
+                    sensor.setTransferEfficiencies(ChargeCarrier.HOLE, new BasicMatrix(transfer_efficiencies));
+			}
+		}
+	}
+}

lcsim/src/org/lcsim/recon/tracking/seedtracker/trackingdrivers/sidloi3
SiVertexEndcapSensorSetup.java added at 1.1
diff -N SiVertexEndcapSensorSetup.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ SiVertexEndcapSensorSetup.java	3 Jun 2010 13:06:35 -0000	1.1
@@ -0,0 +1,157 @@
+package org.lcsim.recon.tracking.seedtracker.trackingdrivers.sidloi3;
+
+import org.lcsim.recon.tracking.seedtracker.trackingdrivers.sidloi2.*;
+import hep.physics.matrix.BasicMatrix;
+import hep.physics.vec.BasicHep3Vector;
+import hep.physics.vec.VecOp;
+
+import java.util.List;
+
+import org.lcsim.detector.IDetectorElement;
+import org.lcsim.detector.IRotation3D;
+import org.lcsim.detector.ITranslation3D;
+import org.lcsim.detector.RotationPassiveXYZ;
+import org.lcsim.detector.Transform3D;
+import org.lcsim.detector.Translation3D;
+import org.lcsim.detector.solids.IPolyhedron;
+import org.lcsim.detector.solids.Polygon3D;
+import org.lcsim.detector.tracker.silicon.ChargeCarrier;
+import org.lcsim.detector.tracker.silicon.SiPixels;
+import org.lcsim.detector.tracker.silicon.SiSensor;
+import org.lcsim.detector.tracker.silicon.SiSensorElectrodes;
+import org.lcsim.geometry.Detector;
+import org.lcsim.geometry.compact.Subdetector;
+import org.lcsim.geometry.subdetector.SiTrackerEndcap;
+import org.lcsim.geometry.subdetector.SiTrackerEndcap2;
+import org.lcsim.util.Driver;
+
+public class SiVertexEndcapSensorSetup extends Driver
+{
+	
+	String subdetectorName;
+	double readoutPitchX = 0.05;
+	double readoutPitchY = 0.25;
+	double sensePitchX = 0.05;
+	double sensePitchY = 0.25;
+	double transferEfficiency = 1.0;
+
+	public SiVertexEndcapSensorSetup()
+	{}
+	
+	public SiVertexEndcapSensorSetup(String subdetectorName)
+	{
+		this.subdetectorName = subdetectorName;
+	}
+	
+	public void setSubdetectorName(String subdetectorName)
+	{
+		this.subdetectorName = subdetectorName;
+	}
+	
+	public void detectorChanged(Detector detector)
+	{
+		if (subdetectorName == null)
+			throw new RuntimeException("The subdetectorName was not set.");
+		
+		Subdetector subdetector = detector.getSubdetector(subdetectorName);
+		if (subdetector instanceof SiTrackerEndcap || subdetector instanceof SiTrackerEndcap2)
+			setupSensorDetectorElements(subdetector);
+		else
+			throw new RuntimeException("The subdetector " + subdetectorName + " is not an instance of SiTrackerBarrel.");
+	}
+	
+	public void setReadoutPitchX(double x)
+	{
+		this.readoutPitchX = x;
+	}
+	
+	public void setReadoutPitchY(double y)
+	{
+		this.readoutPitchY = y;
+	}
+	
+	public void setSensePitchX(double x)
+	{
+		this.sensePitchX = x;
+	}
+	
+	public void setSensePitchY(double y)
+	{
+		this.sensePitchY = y;
+	}
+	
+	public void setTransferEfficiency(double t)
+	{
+		this.transferEfficiency = t;
+	}
+	
+	private void setupSensorDetectorElements(Subdetector subdet)
+	{
+        for (IDetectorElement endcap : subdet.getDetectorElement().getChildren()) {
+            for (IDetectorElement layer : endcap.getChildren()) 
+            {
+                int nwedges = layer.getChildren().size();
+                for (IDetectorElement wedge : layer.getChildren()) 
+                {
+                    for (IDetectorElement module : wedge.getChildren()) 
+                    {	
+                    	// find sensors on the module
+                    	List<SiSensor> sensors = module.findDescendants(SiSensor.class);
+
+                    	// require that sensors are found
+    					if (sensors.size() == 0)
+    						throw new RuntimeException("No sensors found in module.");
+
+    					// loop over sensors (can be double-sided)
+    					for (SiSensor sensor : sensors)
+    					{
+    						// get sensor field from id
+    						int sensorId = sensor.getIdentifierHelper().getValue(sensor.getIdentifier(), "sensor");
+
+    						// Get the sensor solid.
+    						IPolyhedron sensor_solid = (IPolyhedron) sensor.getGeometry().getLogicalVolume().getSolid();
+
+    						// Get solids for inner and outer surfaces.
+    						Polygon3D inner_surface = sensor_solid.getFacesNormalTo(new BasicHep3Vector(0, -1, 0)).get(0);
+    						Polygon3D outer_surface = sensor_solid.getFacesNormalTo(new BasicHep3Vector(0, 1, 0)).get(0);
+
+    						//
+    						// Determine p and n sides based on sensor id.
+    						//
+    						
+    						Polygon3D n_side = inner_surface;
+    						Polygon3D p_side = outer_surface;
+ 
+
+    						// Compute the geometric propertes of the electrodes.
+    						ITranslation3D electrodes_position = new Translation3D(VecOp.mult(-p_side.getDistance(), new BasicHep3Vector(0, 0, 1)));  // translate to outside of polygon
+                                                IRotation3D electrodes_rotation = new RotationPassiveXYZ(-Math.PI / 2., 0., 0.);
+    						Transform3D electrodes_transform = new Transform3D(electrodes_position, electrodes_rotation);
+
+    						//
+    						// Pixel-specific code starts here.
+    						//
+    						
+    						// Set the bias surfaces.
+    						sensor.setBiasSurface(ChargeCarrier.HOLE, p_side);
+    						sensor.setBiasSurface(ChargeCarrier.ELECTRON, n_side);
+            
+    						//  Define the pixel electrodes.
+    						SiSensorElectrodes readout_electrodes = new SiPixels(ChargeCarrier.HOLE, readoutPitchX, readoutPitchY, sensor, electrodes_transform);
+    						SiSensorElectrodes sense_electrodes = new SiPixels(ChargeCarrier.HOLE, sensePitchX, sensePitchY, sensor, electrodes_transform);
+
+    						//  Tell the sensor about the electrodes.
+    						sensor.setSenseElectrodes(sense_electrodes);
+    						sensor.setReadoutElectrodes(readout_electrodes);
+
+    						//  Define the transfer efficiency from sense electrodes to readout electrodes.
+    						//  For pixels, we do a direct transfer of charge from sense electrodes to readout electrodes.
+    						double[][] transfer_efficiencies = {{transferEfficiency}};
+    						sensor.setTransferEfficiencies(ChargeCarrier.HOLE, new BasicMatrix(transfer_efficiencies));
+    					}
+                    }
+                }
+            }
+        }
+	}
+}
\ No newline at end of file

lcsim/src/org/lcsim/recon/tracking/seedtracker/trackingdrivers/sidloi3
TrackerHitDriver_sidloi3.java added at 1.1
diff -N TrackerHitDriver_sidloi3.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ TrackerHitDriver_sidloi3.java	3 Jun 2010 13:06:35 -0000	1.1
@@ -0,0 +1,228 @@
+/*
+ * Main driver for setting up the hit digitization and clustering
+ *
+ */
+package org.lcsim.recon.tracking.seedtracker.trackingdrivers.sidloi3;
+
+import org.lcsim.recon.tracking.seedtracker.trackingdrivers.sidloi2.*;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.lcsim.detector.IDetectorElement;
+import org.lcsim.detector.tracker.silicon.SiSensor;
+import org.lcsim.detector.tracker.silicon.SiTrackerModule;
+import org.lcsim.event.EventHeader;
+import org.lcsim.event.RawTrackerHit;
+import org.lcsim.geometry.Detector;
+import org.lcsim.recon.tracking.digitization.sisim.CDFSiSensorSim;
+import org.lcsim.recon.tracking.digitization.sisim.GenericReadoutChip;
+import org.lcsim.recon.tracking.digitization.sisim.NearestNeighbor;
+import org.lcsim.recon.tracking.digitization.sisim.PixelHitMaker;
+import org.lcsim.recon.tracking.digitization.sisim.RawTrackerHitMaker;
+import org.lcsim.recon.tracking.digitization.sisim.SiDigitizer;
+import org.lcsim.recon.tracking.digitization.sisim.SiSensorSim;
+import org.lcsim.recon.tracking.digitization.sisim.SiTrackerHit;
+import org.lcsim.recon.tracking.digitization.sisim.SiTrackerHitPixel;
+import org.lcsim.recon.tracking.digitization.sisim.SiTrackerHitStrip1D;
+import org.lcsim.recon.tracking.digitization.sisim.StripHitMaker;
+import org.lcsim.recon.tracking.digitization.sisim.config.SimTrackerHitReadoutDriver;
+import org.lcsim.util.Driver;
+import org.lcsim.util.lcio.LCIOConstants;
+
+/**
+ *
+ * @author Richard Partridge
+ */
+public class TrackerHitDriver_sidloi3 extends Driver {
+
+    List<String> _readouts = new ArrayList<String>();
+    List<String> _process_paths = new ArrayList<String>();
+    List<IDetectorElement> _process_de = new ArrayList<IDetectorElement>();
+    Set<SiSensor> _process_sensors = new HashSet<SiSensor>();
+    Set<SiTrackerModule> _process_modules = new HashSet<SiTrackerModule>();
+    SiDigitizer _strip_digitizer;
+    SiDigitizer _pixel_digitizer;
+    StripHitMaker _strip_clusterer;
+    PixelHitMaker _pixel_clusterer;
+    String _digitizer_name;
+    int _nev = 0;
+
+    /**
+     * Creates a new instance of TrackerHitDriver
+     */
+    public TrackerHitDriver_sidloi3() {
+
+        //  Instantiate the sensor simulation classes and set the thresholds
+        SiSensorSim strip_simulation = new CDFSiSensorSim();
+        SiSensorSim pixel_simulation = new CDFSiSensorSim();
+
+        //  Instantiate the readout chips and set the noise parameters
+        GenericReadoutChip strip_readout = new GenericReadoutChip();
+        strip_readout.setNoiseIntercept(1000.);
+        strip_readout.setNoiseSlope(0.);
+        strip_readout.setNoiseThreshold(4000.);
+        strip_readout.setNeighborThreshold(2000.);
+        GenericReadoutChip pixel_readout = new GenericReadoutChip();
+        pixel_readout.setNoiseIntercept(80.);
+        pixel_readout.setNoiseSlope(0.);
+        pixel_readout.setNoiseThreshold(400.);
+        pixel_readout.setNeighborThreshold(400.);
+
+        //  Instantiate the digitizer that produces the raw hits
+        _strip_digitizer = new RawTrackerHitMaker(strip_simulation, strip_readout);
+        _pixel_digitizer = new RawTrackerHitMaker(pixel_simulation, pixel_readout);
+        _digitizer_name = _strip_digitizer.getName();
+
+        //  Instantiate a nearest neighbor clustering algorithm for the pixels
+        NearestNeighbor strip_clustering = new NearestNeighbor();
+        strip_clustering.setSeedThreshold(4000.);
+        strip_clustering.setNeighborThreshold(2000.);
+
+        //  Instantiate a nearest neighbor clustering algorithm for the pixels
+        NearestNeighbor pixel_clustering = new NearestNeighbor();
+        pixel_clustering.setSeedThreshold(400.);
+        pixel_clustering.setNeighborThreshold(400.);
+
+        //  Instantiate the clusterers and set hit-making parameters
+        _strip_clusterer = new StripHitMaker(strip_simulation, strip_readout, strip_clustering);
+        _strip_clusterer.setMaxClusterSize(10);
+        _strip_clusterer.setCentralStripAveragingThreshold(4);
+        _strip_clusterer.SetOneClusterErr(1 / Math.sqrt(12.));
+        _strip_clusterer.SetTwoClusterErr(1 / 5.0);
+        _strip_clusterer.SetThreeClusterErr(1 / 3.0);
+        _strip_clusterer.SetFourClusterErr(1 / 2.0);
+        _strip_clusterer.SetFiveClusterErr(1 / 1.0);
+        
+        _pixel_clusterer = new PixelHitMaker(pixel_simulation, pixel_readout, pixel_clustering);
+        _pixel_clusterer.SetOneClusterErr(1 / Math.sqrt(12.));
+        _pixel_clusterer.SetTwoClusterErr(1 / 5.0);
+        _pixel_clusterer.SetThreeClusterErr(1 / 3.0);
+        _pixel_clusterer.SetFourClusterErr(1 / 2.0);
+        _pixel_clusterer.SetFiveClusterErr(1 / 1.0);
+
+        //  Specify the readouts to process
+        _readouts.add("SiVertexBarrelHits");
+        _readouts.add("SiVertexEndcapHits");
+        _readouts.add("SiTrackerBarrelHits");
+        _readouts.add("SiTrackerEndcapHits");
+        _readouts.add("SiTrackerForwardHits");
+
+        //  Specify the detectors to process
+        _process_paths.add("SiVertexBarrel");
+        _process_paths.add("SiVertexEndcap");
+        _process_paths.add("SiTrackerBarrel");
+        _process_paths.add("SiTrackerEndcap");
+        _process_paths.add("SiTrackerForward");
+
+    }
+
+    /**
+     * Initialize whenever we have a new detector
+     * 
+     * @param detector
+     */
+    public void detectorChanged(Detector detector) {
+
+        super.detectorChanged(detector);
+
+        // Process detectors specified by path, otherwise process entire detector
+        IDetectorElement detector_de = detector.getDetectorElement();
+        for (String de_path : _process_paths) {
+            _process_de.add(detector_de.findDetectorElement(de_path));
+        }
+
+        if (_process_de.size() == 0) {
+            _process_de.add(detector_de);
+        }
+
+        for (IDetectorElement detector_element : _process_de) {
+            _process_sensors.addAll(detector_element.findDescendants(SiSensor.class));
+            _process_modules.addAll(detector_element.findDescendants(SiTrackerModule.class));
+        }
+
+    }
+
+    /**
+     * Setup readouts
+     */
+    public void startOfData() {
+        // If readouts not already set, set them up
+        if (_readouts.size() != 0) {
+            super.add(new SimTrackerHitReadoutDriver(_readouts));
+        }
+
+        super.startOfData();
+        _readouts.clear();
+        _nev = 0;
+    }
+
+    /**
+     * Main digitization driver.  Creates raw hits, forms clusters, and makes
+     * tracker hits using the sisim package.
+     *
+     * @param event
+     */
+    public void process(EventHeader event) {
+        super.process(event);
+
+        //  Print out the event number
+//        System.out.println("TrackerHitDriver processing event " + _nev);
+        _nev++;
+
+        // Lists of hits
+        List<RawTrackerHit> raw_hits = new ArrayList<RawTrackerHit>();
+        List<SiTrackerHit> hits_strip1D = new ArrayList<SiTrackerHit>();
+        List<SiTrackerHit> hits_pixel = new ArrayList<SiTrackerHit>();
+
+        for (SiSensor sensor : _process_sensors) {
+ 
+            if (sensor.hasStrips()) {
+                raw_hits.addAll(_strip_digitizer.makeHits(sensor));
+                hits_strip1D.addAll(_strip_clusterer.makeHits(sensor));
+            }
+
+
+            if (sensor.hasPixels()) {
+                raw_hits.addAll(_pixel_digitizer.makeHits(sensor));
+                hits_pixel.addAll(_pixel_clusterer.makeHits(sensor));
+            }
+
+        }
+
+        //int flag = (1 << LCIOConstants.RTHBIT_HITS | 1 << LCIOConstants.TRAWBIT_ID1); //correct flag for persistence 
+        int flag = (1 << LCIOConstants.TRAWBIT_ID1); //correct flag for persistence 
+        event.put(getRawHitsName(), raw_hits, RawTrackerHit.class, flag, toString());
+        event.put(getStripHits1DName(), hits_strip1D, SiTrackerHitStrip1D.class, 0, toString());
+        event.put(getPixelHitsName(), hits_pixel, SiTrackerHitPixel.class, 0, toString());
+
+    }
+
+    /**
+     * Return the name of the raw hits collection
+     *
+     * @return name of raw hits collection
+     */
+    public String getRawHitsName() {
+        return _digitizer_name + "_RawTrackerHits";
+    }
+
+    /**
+     * Return the name of the strip hits collection
+     *
+     * @return name of strip hits collection
+     */
+    public String getStripHits1DName() {
+        return _strip_clusterer.getName() + "_SiTrackerHitStrip1D";
+    }
+
+    /**
+     * Return the name of the pixel hits collection
+     *
+     * @return name of pixel hits collection
+     */
+    public String getPixelHitsName() {
+        return _pixel_clusterer.getName() + "_SiTrackerHitPixel";
+    }
+}
CVSspam 0.2.8