Print

Print


Commit in lcsim/src/org/lcsim/recon/tracking/digitization/sisim on MAIN
SiTrackerBarrelSensorSetup.java-991.2 removed
SiTrackerEndcap2SensorSetup.java-1111.1 removed
SiTrackerEndcapSensorSetup.java-1271.1 removed
SiVertexBarrelSensorSetup.java-1001.1 removed
SiVertexEndcapSensorSetup.java-1401.1 removed
config/SiTrackerBarrelSensorSetup.java+98added 1.1
      /SiTrackerEndcap2SensorSetup.java+111added 1.1
      /SiTrackerEndcapSensorSetup.java+127added 1.1
      /SiVertexBarrelSensorSetup.java+100added 1.1
      /SiVertexEndcapSensorSetup.java+140added 1.1
+576-577
5 added + 5 removed, total 10 files
moving digi config drivers to subpackage

lcsim/src/org/lcsim/recon/tracking/digitization/sisim
SiTrackerBarrelSensorSetup.java removed after 1.2
diff -N SiTrackerBarrelSensorSetup.java
--- SiTrackerBarrelSensorSetup.java	19 Aug 2009 22:49:54 -0000	1.2
+++ /dev/null	1 Jan 1970 00:00:00 -0000
@@ -1,99 +0,0 @@
-package org.lcsim.recon.tracking.digitization.sisim;
-
-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.IPhysicalVolume;
-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;
-
-	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.");
-	}
-
-	private void setupSensorDetectorElements(Subdetector subdet)
-	{
-		System.out.println(this.getClass().getCanonicalName() + " - Setting up sensors for " + subdet.getName() + " ...");		
-		
-		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.");
-
-					SiSensor sensor = sensors.get(0);
-
-					// Set up SiStrips for the sensors
-					IPolyhedron sensor_solid = (IPolyhedron)sensor.getGeometry().getLogicalVolume().getSolid();
-
-					// Bias the sensor
-					Polygon3D p_side = sensor_solid.getFacesNormalTo(new BasicHep3Vector(0,0,1)).get(0);                        
-
-					Polygon3D n_side = sensor_solid.getFacesNormalTo(new BasicHep3Vector(0,0,-1)).get(0);
-
-					sensor.setBiasSurface(ChargeCarrier.HOLE,p_side);
-					sensor.setBiasSurface(ChargeCarrier.ELECTRON,n_side);
-
-					// Add sense and readout electrodes
-					ITranslation3D electrodes_position = new Translation3D(VecOp.mult(-p_side.getDistance(),p_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,0.050,sensor,electrodes_transform);
-					SiSensorElectrodes sense_electrodes = new SiStrips(ChargeCarrier.HOLE,0.025,(readout_electrodes.getNCells()*2-1),sensor,electrodes_transform);
-
-					sensor.setSenseElectrodes(sense_electrodes);
-					sensor.setReadoutElectrodes(readout_electrodes);
-
-					double[][] transfer_efficiencies = { {0.986,0.419} };
-					sensor.setTransferEfficiencies(ChargeCarrier.HOLE,new BasicMatrix(transfer_efficiencies));                        
-			}                
-		}        
-	}
-}

lcsim/src/org/lcsim/recon/tracking/digitization/sisim
SiTrackerEndcap2SensorSetup.java removed after 1.1
diff -N SiTrackerEndcap2SensorSetup.java
--- SiTrackerEndcap2SensorSetup.java	17 Aug 2009 22:20:21 -0000	1.1
+++ /dev/null	1 Jan 1970 00:00:00 -0000
@@ -1,111 +0,0 @@
-package org.lcsim.recon.tracking.digitization.sisim;
-
-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;
-
-	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.");
-	}
-
-	private void setupSensorDetectorElements(Subdetector subdet)
-	{
-		System.out.println(this.getClass().getCanonicalName() + " - Setting up sensors for " + subdet.getName() + " ...");
-
-		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() )
-					{
-						List<SiSensor> sensors = module.findDescendants(SiSensor.class);
-
-						if (sensors.size() == 0)
-							throw new RuntimeException("No sensors found in module.");
-
-						//int sensorId = 0;
-						for (SiSensor sensor : sensors)
-						{
-							Trd sensor_solid = (Trd)sensor.getGeometry().getLogicalVolume().getSolid();
-                            
-                            Polygon3D n_side = sensor_solid.getFacesNormalTo(new BasicHep3Vector(0,-1,0)).get(0);
-                            Polygon3D p_side = sensor_solid.getFacesNormalTo(new BasicHep3Vector(0,1,0)).get(0);
-
-                            // 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,0.050,sensor,electrodes_transform);
-                            SiSensorElectrodes sense_electrodes = new SiStrips(ChargeCarrier.HOLE,0.025,(readout_electrodes.getNCells()*2-1),sensor,electrodes_transform);                                                                
-                            
-                            sensor.setSenseElectrodes(sense_electrodes);
-                            sensor.setReadoutElectrodes(readout_electrodes);
-                            
-                            double[][] transfer_efficiencies = { {0.986,0.419} };
-                            sensor.setTransferEfficiencies(ChargeCarrier.HOLE,new BasicMatrix(transfer_efficiencies));
-							// here
-
-							//++sensorId;
-						}
-					}
-				}                
-			}        
-		}
-	}
-}
-
-

lcsim/src/org/lcsim/recon/tracking/digitization/sisim
SiTrackerEndcapSensorSetup.java removed after 1.1
diff -N SiTrackerEndcapSensorSetup.java
--- SiTrackerEndcapSensorSetup.java	17 Aug 2009 22:20:21 -0000	1.1
+++ /dev/null	1 Jan 1970 00:00:00 -0000
@@ -1,127 +0,0 @@
-package org.lcsim.recon.tracking.digitization.sisim;
-
-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.SiTrackerEndcap;
-import org.lcsim.util.Driver;
-
-public class SiTrackerEndcapSensorSetup extends Driver 
-{
-	String subdetectorName;
-
-	public SiTrackerEndcapSensorSetup()
-	{}
-
-	public SiTrackerEndcapSensorSetup(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)
-			setupSensorDetectorElements(subdetector);
-		else
-			throw new RuntimeException("The subdetector " + subdetectorName + " is not an instance of SiTrackerEndcap.");
-	}
-
-	private void setupSensorDetectorElements(Subdetector subdet)
-	{
-		System.out.println(this.getClass().getCanonicalName() + " - Setting up sensors for " + subdet.getName() + " ...");
-
-		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() )
-					{
-						List<SiSensor> sensors = module.findDescendants(SiSensor.class);
-
-						if (sensors.size() == 0)
-							throw new RuntimeException("No sensors found in module.");
-
-						int sensorId = 0;
-						for (SiSensor sensor : sensors)
-						{
-							// Set up SiStrips for the sensors
-							IPolyhedron sensor_solid = (IPolyhedron)sensor.getGeometry().getLogicalVolume().getSolid();
-
-							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);
-
-							Polygon3D p_side;
-							Polygon3D n_side;
-							int side;
-
-							if (sensorId == 0) // inner sensor
-							{
-								p_side = inner_surface;
-								n_side = outer_surface;
-								side = 1;
-							}
-							else // outer sensor
-							{
-								p_side = outer_surface;
-								n_side = inner_surface;
-								side = -1;
-							}
-
-							// Bias the sensor
-							sensor.setBiasSurface(ChargeCarrier.HOLE,p_side);
-							sensor.setBiasSurface(ChargeCarrier.ELECTRON,n_side);
-
-							double strip_angle = Math.PI/nwedges;
-
-							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(side*(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,0.050,sensor,electrodes_transform);
-							SiSensorElectrodes sense_electrodes = new SiStrips(ChargeCarrier.HOLE,0.025,(readout_electrodes.getNCells()*2-1),sensor,electrodes_transform);
-
-							sensor.setSenseElectrodes(sense_electrodes);
-							sensor.setReadoutElectrodes(readout_electrodes);
-
-							double[][] transfer_efficiencies = { {0.986,0.419} };
-							sensor.setTransferEfficiencies(ChargeCarrier.HOLE,new BasicMatrix(transfer_efficiencies));
-
-							++sensorId;
-						}
-					}
-				}                
-			}        
-		}
-	}
-}
-

lcsim/src/org/lcsim/recon/tracking/digitization/sisim
SiVertexBarrelSensorSetup.java removed after 1.1
diff -N SiVertexBarrelSensorSetup.java
--- SiVertexBarrelSensorSetup.java	19 Aug 2009 22:50:45 -0000	1.1
+++ /dev/null	1 Jan 1970 00:00:00 -0000
@@ -1,100 +0,0 @@
-package org.lcsim.recon.tracking.digitization.sisim;
-
-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;
-
-	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.");
-	}
-	
-	private void setupSensorDetectorElements(Subdetector subdet)
-	{
-		System.out.println(this.getClass().getCanonicalName() + " - Setting up sensors for " + subdet.getName() + " ...");		
-		
-		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.");
-
-					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, bot_side);
-                    sensor.setBiasSurface(ChargeCarrier.ELECTRON, top_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.ELECTRON, 0.05, 0.25, sensor, electrodes_transform);
-                    SiSensorElectrodes sense_electrodes = new SiPixels(ChargeCarrier.ELECTRON, 0.05, 0.25, 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 = {{1.0}};
-                    sensor.setTransferEfficiencies(ChargeCarrier.ELECTRON, new BasicMatrix(transfer_efficiencies));
-			}
-		}
-	}
-}

lcsim/src/org/lcsim/recon/tracking/digitization/sisim
SiVertexEndcapSensorSetup.java removed after 1.1
diff -N SiVertexEndcapSensorSetup.java
--- SiVertexEndcapSensorSetup.java	19 Aug 2009 22:50:45 -0000	1.1
+++ /dev/null	1 Jan 1970 00:00:00 -0000
@@ -1,140 +0,0 @@
-package org.lcsim.recon.tracking.digitization.sisim;
-
-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;
-
-public class SiVertexEndcapSensorSetup
-{
-	
-	String subdetectorName;
-
-	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.");
-	}
-	
-	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 p_side;
-    						Polygon3D n_side;
-    						int side;
-
-    						if (sensorId == 0) // inner sensor
-    						{
-    							p_side = inner_surface;
-    							n_side = outer_surface;
-    							side = 1;
-    						} 
-    						else // outer sensor
-    						{
-    							p_side = outer_surface;
-    							n_side = inner_surface;
-    							side = -1;
-    						}
-
-    						double strip_angle = Math.PI / nwedges;
-
-    						// 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(side * (Math.PI / 2), 0, strip_angle);          //
-    						Transform3D electrodes_transform = new Transform3D(electrodes_position, electrodes_rotation);
-
-    						//
-    						// Pixel-specific code starts here.
-    						//
-    						
-    						// Set the bias surfaces.
-    						sensor.setBiasSurface(ChargeCarrier.ELECTRON, p_side);
-    						sensor.setBiasSurface(ChargeCarrier.HOLE, n_side);
-            
-    						//  Define the pixel electrodes.
-    						SiSensorElectrodes readout_electrodes = new SiPixels(ChargeCarrier.ELECTRON, 0.05, 0.25, sensor, electrodes_transform);
-    						SiSensorElectrodes sense_electrodes = new SiPixels(ChargeCarrier.ELECTRON, 0.05, 0.25, 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 = {{1.0}};
-    						sensor.setTransferEfficiencies(ChargeCarrier.ELECTRON, new BasicMatrix(transfer_efficiencies));
-    					}
-                    }
-                }
-            }
-        }
-	}
-}
\ No newline at end of file

lcsim/src/org/lcsim/recon/tracking/digitization/sisim/config
SiTrackerBarrelSensorSetup.java added at 1.1
diff -N SiTrackerBarrelSensorSetup.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ SiTrackerBarrelSensorSetup.java	21 Aug 2009 20:51:03 -0000	1.1
@@ -0,0 +1,98 @@
+package 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.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;
+
+	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.");
+	}
+
+	private void setupSensorDetectorElements(Subdetector subdet)
+	{
+		System.out.println(this.getClass().getCanonicalName() + " - Setting up sensors for " + subdet.getName() + " ...");		
+		
+		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.");
+
+					SiSensor sensor = sensors.get(0);
+
+					// Set up SiStrips for the sensors
+					IPolyhedron sensor_solid = (IPolyhedron)sensor.getGeometry().getLogicalVolume().getSolid();
+
+					// Bias the sensor
+					Polygon3D p_side = sensor_solid.getFacesNormalTo(new BasicHep3Vector(0,0,1)).get(0);                        
+
+					Polygon3D n_side = sensor_solid.getFacesNormalTo(new BasicHep3Vector(0,0,-1)).get(0);
+
+					sensor.setBiasSurface(ChargeCarrier.HOLE,p_side);
+					sensor.setBiasSurface(ChargeCarrier.ELECTRON,n_side);
+
+					// Add sense and readout electrodes
+					ITranslation3D electrodes_position = new Translation3D(VecOp.mult(-p_side.getDistance(),p_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,0.050,sensor,electrodes_transform);
+					SiSensorElectrodes sense_electrodes = new SiStrips(ChargeCarrier.HOLE,0.025,(readout_electrodes.getNCells()*2-1),sensor,electrodes_transform);
+
+					sensor.setSenseElectrodes(sense_electrodes);
+					sensor.setReadoutElectrodes(readout_electrodes);
+
+					double[][] transfer_efficiencies = { {0.986,0.419} };
+					sensor.setTransferEfficiencies(ChargeCarrier.HOLE,new BasicMatrix(transfer_efficiencies));                        
+			}                
+		}        
+	}
+}

lcsim/src/org/lcsim/recon/tracking/digitization/sisim/config
SiTrackerEndcap2SensorSetup.java added at 1.1
diff -N SiTrackerEndcap2SensorSetup.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ SiTrackerEndcap2SensorSetup.java	21 Aug 2009 20:51:03 -0000	1.1
@@ -0,0 +1,111 @@
+package 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;
+
+	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.");
+	}
+
+	private void setupSensorDetectorElements(Subdetector subdet)
+	{
+		System.out.println(this.getClass().getCanonicalName() + " - Setting up sensors for " + subdet.getName() + " ...");
+
+		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() )
+					{
+						List<SiSensor> sensors = module.findDescendants(SiSensor.class);
+
+						if (sensors.size() == 0)
+							throw new RuntimeException("No sensors found in module.");
+
+						//int sensorId = 0;
+						for (SiSensor sensor : sensors)
+						{
+							Trd sensor_solid = (Trd)sensor.getGeometry().getLogicalVolume().getSolid();
+                            
+                            Polygon3D n_side = sensor_solid.getFacesNormalTo(new BasicHep3Vector(0,-1,0)).get(0);
+                            Polygon3D p_side = sensor_solid.getFacesNormalTo(new BasicHep3Vector(0,1,0)).get(0);
+
+                            // 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,0.050,sensor,electrodes_transform);
+                            SiSensorElectrodes sense_electrodes = new SiStrips(ChargeCarrier.HOLE,0.025,(readout_electrodes.getNCells()*2-1),sensor,electrodes_transform);                                                                
+                            
+                            sensor.setSenseElectrodes(sense_electrodes);
+                            sensor.setReadoutElectrodes(readout_electrodes);
+                            
+                            double[][] transfer_efficiencies = { {0.986,0.419} };
+                            sensor.setTransferEfficiencies(ChargeCarrier.HOLE,new BasicMatrix(transfer_efficiencies));
+							// here
+
+							//++sensorId;
+						}
+					}
+				}                
+			}        
+		}
+	}
+}
+
+

lcsim/src/org/lcsim/recon/tracking/digitization/sisim/config
SiTrackerEndcapSensorSetup.java added at 1.1
diff -N SiTrackerEndcapSensorSetup.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ SiTrackerEndcapSensorSetup.java	21 Aug 2009 20:51:03 -0000	1.1
@@ -0,0 +1,127 @@
+package 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.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.SiTrackerEndcap;
+import org.lcsim.util.Driver;
+
+public class SiTrackerEndcapSensorSetup extends Driver 
+{
+	String subdetectorName;
+
+	public SiTrackerEndcapSensorSetup()
+	{}
+
+	public SiTrackerEndcapSensorSetup(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)
+			setupSensorDetectorElements(subdetector);
+		else
+			throw new RuntimeException("The subdetector " + subdetectorName + " is not an instance of SiTrackerEndcap.");
+	}
+
+	private void setupSensorDetectorElements(Subdetector subdet)
+	{
+		System.out.println(this.getClass().getCanonicalName() + " - Setting up sensors for " + subdet.getName() + " ...");
+
+		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() )
+					{
+						List<SiSensor> sensors = module.findDescendants(SiSensor.class);
+
+						if (sensors.size() == 0)
+							throw new RuntimeException("No sensors found in module.");
+
+						int sensorId = 0;
+						for (SiSensor sensor : sensors)
+						{
+							// Set up SiStrips for the sensors
+							IPolyhedron sensor_solid = (IPolyhedron)sensor.getGeometry().getLogicalVolume().getSolid();
+
+							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);
+
+							Polygon3D p_side;
+							Polygon3D n_side;
+							int side;
+
+							if (sensorId == 0) // inner sensor
+							{
+								p_side = inner_surface;
+								n_side = outer_surface;
+								side = 1;
+							}
+							else // outer sensor
+							{
+								p_side = outer_surface;
+								n_side = inner_surface;
+								side = -1;
+							}
+
+							// Bias the sensor
+							sensor.setBiasSurface(ChargeCarrier.HOLE,p_side);
+							sensor.setBiasSurface(ChargeCarrier.ELECTRON,n_side);
+
+							double strip_angle = Math.PI/nwedges;
+
+							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(side*(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,0.050,sensor,electrodes_transform);
+							SiSensorElectrodes sense_electrodes = new SiStrips(ChargeCarrier.HOLE,0.025,(readout_electrodes.getNCells()*2-1),sensor,electrodes_transform);
+
+							sensor.setSenseElectrodes(sense_electrodes);
+							sensor.setReadoutElectrodes(readout_electrodes);
+
+							double[][] transfer_efficiencies = { {0.986,0.419} };
+							sensor.setTransferEfficiencies(ChargeCarrier.HOLE,new BasicMatrix(transfer_efficiencies));
+
+							++sensorId;
+						}
+					}
+				}                
+			}        
+		}
+	}
+}
+

lcsim/src/org/lcsim/recon/tracking/digitization/sisim/config
SiVertexBarrelSensorSetup.java added at 1.1
diff -N SiVertexBarrelSensorSetup.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ SiVertexBarrelSensorSetup.java	21 Aug 2009 20:51:03 -0000	1.1
@@ -0,0 +1,100 @@
+package 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.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;
+
+	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.");
+	}
+	
+	private void setupSensorDetectorElements(Subdetector subdet)
+	{
+		System.out.println(this.getClass().getCanonicalName() + " - Setting up sensors for " + subdet.getName() + " ...");		
+		
+		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.");
+
+					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, bot_side);
+                    sensor.setBiasSurface(ChargeCarrier.ELECTRON, top_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.ELECTRON, 0.05, 0.25, sensor, electrodes_transform);
+                    SiSensorElectrodes sense_electrodes = new SiPixels(ChargeCarrier.ELECTRON, 0.05, 0.25, 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 = {{1.0}};
+                    sensor.setTransferEfficiencies(ChargeCarrier.ELECTRON, new BasicMatrix(transfer_efficiencies));
+			}
+		}
+	}
+}

lcsim/src/org/lcsim/recon/tracking/digitization/sisim/config
SiVertexEndcapSensorSetup.java added at 1.1
diff -N SiVertexEndcapSensorSetup.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ SiVertexEndcapSensorSetup.java	21 Aug 2009 20:51:03 -0000	1.1
@@ -0,0 +1,140 @@
+package 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.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;
+
+public class SiVertexEndcapSensorSetup
+{
+	
+	String subdetectorName;
+
+	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.");
+	}
+	
+	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 p_side;
+    						Polygon3D n_side;
+    						int side;
+
+    						if (sensorId == 0) // inner sensor
+    						{
+    							p_side = inner_surface;
+    							n_side = outer_surface;
+    							side = 1;
+    						} 
+    						else // outer sensor
+    						{
+    							p_side = outer_surface;
+    							n_side = inner_surface;
+    							side = -1;
+    						}
+
+    						double strip_angle = Math.PI / nwedges;
+
+    						// 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(side * (Math.PI / 2), 0, strip_angle);          //
+    						Transform3D electrodes_transform = new Transform3D(electrodes_position, electrodes_rotation);
+
+    						//
+    						// Pixel-specific code starts here.
+    						//
+    						
+    						// Set the bias surfaces.
+    						sensor.setBiasSurface(ChargeCarrier.ELECTRON, p_side);
+    						sensor.setBiasSurface(ChargeCarrier.HOLE, n_side);
+            
+    						//  Define the pixel electrodes.
+    						SiSensorElectrodes readout_electrodes = new SiPixels(ChargeCarrier.ELECTRON, 0.05, 0.25, sensor, electrodes_transform);
+    						SiSensorElectrodes sense_electrodes = new SiPixels(ChargeCarrier.ELECTRON, 0.05, 0.25, 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 = {{1.0}};
+    						sensor.setTransferEfficiencies(ChargeCarrier.ELECTRON, new BasicMatrix(transfer_efficiencies));
+    					}
+                    }
+                }
+            }
+        }
+	}
+}
\ No newline at end of file
CVSspam 0.2.8