Commit in lcsim on MAIN
src/org/lcsim/recon/tracking/digitization/sisim/SiTrackerBarrelSensorSetup.java+104added 1.1
                                               /SiTrackerEndcap2SensorSetup.java+111added 1.1
                                               /SiTrackerEndcapSensorSetup.java+127added 1.1
test/org/lcsim/CombinedTrackerDigiTest.java+81.8 -> 1.9
test/org/lcsim/detector/tracker/readout/TrackerHitDriver_User_Test.java+10-41.13 -> 1.14
+360-4
3 added + 2 modified, total 5 files
checkpoint for SiSensor setup from driver

lcsim/src/org/lcsim/recon/tracking/digitization/sisim
SiTrackerBarrelSensorSetup.java added at 1.1
diff -N SiTrackerBarrelSensorSetup.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ SiTrackerBarrelSensorSetup.java	17 Aug 2009 22:20:21 -0000	1.1
@@ -0,0 +1,104 @@
+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() )
+			{
+				IPhysicalVolume modulePhysVol = module.getGeometry().getPath().getLeafVolume();
+
+				for ( IPhysicalVolume pv : modulePhysVol.getLogicalVolume().getDaughters())
+				{
+					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 added at 1.1
diff -N SiTrackerEndcap2SensorSetup.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ SiTrackerEndcap2SensorSetup.java	17 Aug 2009 22:20:21 -0000	1.1
@@ -0,0 +1,111 @@
+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 added at 1.1
diff -N SiTrackerEndcapSensorSetup.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ SiTrackerEndcapSensorSetup.java	17 Aug 2009 22:20:21 -0000	1.1
@@ -0,0 +1,127 @@
+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/test/org/lcsim
CombinedTrackerDigiTest.java 1.8 -> 1.9
diff -u -r1.8 -r1.9
--- CombinedTrackerDigiTest.java	20 Apr 2009 22:02:08 -0000	1.8
+++ CombinedTrackerDigiTest.java	17 Aug 2009 22:20:21 -0000	1.9
@@ -10,6 +10,8 @@
 import org.lcsim.event.Track;
 import org.lcsim.event.TrackerHit;
 import org.lcsim.fit.helicaltrack.HelicalTrackHit;
+import org.lcsim.recon.tracking.digitization.sisim.SiTrackerBarrelSensorSetup;
+import org.lcsim.recon.tracking.digitization.sisim.SiTrackerEndcapSensorSetup;
 import org.lcsim.recon.tracking.seedtracker.digiexample.DigiSeedTrackerDriver;
 import org.lcsim.util.Driver;
 import org.lcsim.util.cache.FileCache;
@@ -31,6 +33,12 @@
 		File file = cache.getCachedFile(new URL("http://www.lcsim.org/test/lcio/muons100_Theta4-176_1-10GeV_SLIC-v2r5p3_geant4-v9r1p2_LCPhys_sid01_planar_tracker.slcio"));				
 		LCSimLoop loop = new LCSimLoop();		
 		loop.setLCIORecordSource(file); 
+		
+		loop.add(new SiTrackerBarrelSensorSetup("SiTrackerBarrel"));
+		loop.add(new SiTrackerBarrelSensorSetup("SiVertexBarrel"));
+		loop.add(new SiTrackerEndcapSensorSetup("SiTrackerEndcap"));
+		loop.add(new SiTrackerEndcapSensorSetup("SiVertexEndcap"));
+		
 		loop.add(new DigiSeedTrackerDriver());
 		loop.add(new CombinedTrackerDigiCheckDriver());
 		loop.loop(1,null);

lcsim/test/org/lcsim/detector/tracker/readout
TrackerHitDriver_User_Test.java 1.13 -> 1.14
diff -u -r1.13 -r1.14
--- TrackerHitDriver_User_Test.java	24 Apr 2009 18:24:01 -0000	1.13
+++ TrackerHitDriver_User_Test.java	17 Aug 2009 22:20:21 -0000	1.14
@@ -9,13 +9,13 @@
 import junit.framework.TestCase;
 import junit.framework.TestSuite;
 
-import org.lcsim.recon.tracking.digitization.sisim.SimTrackerHitReadoutDriver;
-import org.lcsim.recon.tracking.digitization.sisim.TrackerHitDriver_User;
-import org.lcsim.detector.driver.*;
-
 import org.lcsim.event.EventHeader;
 import org.lcsim.event.RawTrackerHit;
 import org.lcsim.event.TrackerHit;
+import org.lcsim.recon.tracking.digitization.sisim.SiTrackerBarrelSensorSetup;
+import org.lcsim.recon.tracking.digitization.sisim.SiTrackerEndcapSensorSetup;
+import org.lcsim.recon.tracking.digitization.sisim.SimTrackerHitReadoutDriver;
+import org.lcsim.recon.tracking.digitization.sisim.TrackerHitDriver_User;
 import org.lcsim.util.Driver;
 import org.lcsim.util.cache.FileCache;
 import org.lcsim.util.loop.LCSimLoop;
@@ -59,6 +59,12 @@
         List<String> readouts = new ArrayList<String>();
         readouts.add("SiTrackerBarrel_RO");
         readouts.add("SiTrackerEndcap_RO");
+        
+        loop.add(new SiTrackerBarrelSensorSetup("SiTrackerBarrel"));
+		loop.add(new SiTrackerBarrelSensorSetup("SiVertexBarrel"));
+		loop.add(new SiTrackerEndcapSensorSetup("SiTrackerEndcap"));
+		loop.add(new SiTrackerEndcapSensorSetup("SiVertexEndcap"));
+                
         loop.add( new SimTrackerHitReadoutDriver(readouts) );
         
         loop.add( _trackerhitdriver_user );
CVSspam 0.2.8