Commit in GeomConverter/src/org/lcsim/detector/converter/compact on MAIN
HPSTrackerConverter.java+79-331.2 -> 1.3
add sensor creation to the geometry driver for now; eventually will be moved to external Driver

GeomConverter/src/org/lcsim/detector/converter/compact
HPSTrackerConverter.java 1.2 -> 1.3
diff -u -r1.2 -r1.3
--- HPSTrackerConverter.java	13 Jan 2012 21:34:23 -0000	1.2
+++ HPSTrackerConverter.java	18 Jan 2012 00:25:44 -0000	1.3
@@ -1,5 +1,9 @@
 package org.lcsim.detector.converter.compact;
 
+import hep.physics.matrix.BasicMatrix;
+import hep.physics.vec.BasicHep3Vector;
+import hep.physics.vec.VecOp;
+
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.Iterator;
@@ -14,9 +18,12 @@
 import org.lcsim.detector.IDetectorElement;
 import org.lcsim.detector.IPhysicalVolume;
 import org.lcsim.detector.IPhysicalVolumePath;
+import org.lcsim.detector.IRotation3D;
+import org.lcsim.detector.ITranslation3D;
 import org.lcsim.detector.LogicalVolume;
 import org.lcsim.detector.PhysicalVolume;
 import org.lcsim.detector.RotationGeant;
+import org.lcsim.detector.RotationPassiveXYZ;
 import org.lcsim.detector.Transform3D;
 import org.lcsim.detector.Translation3D;
 import org.lcsim.detector.identifier.ExpandedIdentifier;
@@ -27,7 +34,10 @@
 import org.lcsim.detector.material.IMaterial;
 import org.lcsim.detector.material.MaterialStore;
 import org.lcsim.detector.solids.Box;
+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.SiStrips;
 import org.lcsim.detector.tracker.silicon.SiTrackerIdentifierHelper;
 import org.lcsim.detector.tracker.silicon.SiTrackerModule;
 import org.lcsim.geometry.compact.Detector;
@@ -39,6 +49,11 @@
     Map<String, ModuleParameters> moduleParameters = new HashMap<String, ModuleParameters>();
     Map<String, LogicalVolume> modules = new HashMap<String, LogicalVolume>();
     IMaterial vacuum;
+    
+    public Class getSubdetectorType()
+    {
+        return HPSTracker.class;
+    }
 
     public IIdentifierHelper makeIdentifierHelper(Subdetector subdetector, SystemMap systemMap)
     {
@@ -47,7 +62,7 @@
 
     public void convert(Subdetector subdet, Detector detector)
     {
-        System.out.println("HPSTrackerConverter:  Converting...");
+        //System.out.println("HPSTrackerConverter:  Converting...");
         try
         {
             Element node = subdet.getNode();
@@ -162,32 +177,22 @@
                         for (int kk = 0; kk < ny; kk++ )
                         {
                             String moduleBaseName = subdetName + "_layer" + layerId + "_module" + moduleNumber;
-
-                            // Positive endcap module.
                             Translation3D p = new Translation3D(x, y, z + dz);
-
-                            //RotationGeant rot = new RotationGeant(-Math.PI / 2, Math.PI / 2 + phi0, 0);
-                            RotationGeant rot = new RotationGeant(0, 0, 0);
+                            RotationGeant rot = new RotationGeant(0, 0, phi0);
                             new PhysicalVolume(new Transform3D(p, rot), moduleBaseName, moduleVolume, detector.getTrackingVolume().getLogicalVolume(), 0);
                             String path = "/" + detector.getTrackingVolume().getName() + "/" + moduleBaseName;
-                            IDetectorElement modulePos = new SiTrackerModule(moduleBaseName, layerPos, path, moduleNumber);
-                            ++moduleNumber;
-                            
-                            // System.out.println("Making module " + moduleBaseName + "  @ " + layerPos.toString());
+                            new SiTrackerModule(moduleBaseName, layerPos, path, moduleNumber);
+                            ++moduleNumber;                           
                             if (reflect)
                             {
                                 Translation3D pr = new Translation3D(x, -y, z + dz);
                                 double rphi0 = phi0;
                                 if (flipSA)
                                     rphi0 = -rphi0;
-
-                                //RotationGeant rotr = new RotationGeant(-Math.PI / 2, Math.PI / 2 + rphi0, 0);
-                                RotationGeant rotr = new RotationGeant(0, 0, 0);
-
+                                RotationGeant rotr = new RotationGeant(0, 0, rphi0);
                                 String path2 = "/" + detector.getTrackingVolume().getName() + "/" + moduleBaseName + "_reflected";
                                 new PhysicalVolume(new Transform3D(pr, rotr), moduleBaseName + "_reflected", moduleVolume, detector.getTrackingVolume().getLogicalVolume(), k);
                                 new SiTrackerModule(moduleBaseName + "_reflected", layerNeg, path2, moduleNumber);
-                                // System.out.println("Making module " + moduleBaseName + "  @ " + layerNeg.toString());
                             }
 
                             dz = -dz;
@@ -203,9 +208,7 @@
         {
             throw new RuntimeException(except);
         }
-
-        // Create DetectorElements for the sensors.
-        setupSensorDetectorElements(subdet);
+        makeSensors(subdet);
     }
 
     private LogicalVolume makeModule(ModuleParameters params)
@@ -249,7 +252,6 @@
             double zrot = 0;
             if (sensitive)
             {
-                // TODO Place embedded sensor here with possible dead area in outside (see LCDD converter).
                 if (sensorNumber > 1)
                 {
                     throw new RuntimeException("Exceeded maximum of 2 sensors per module.");
@@ -269,9 +271,10 @@
                 Box sensorBox = new Box(sensorName + "Box", sensorX / 2, sensorY / 2, componentThickness / 2);
                 LogicalVolume sensorVol = new LogicalVolume(sensorName, sensorBox, material);                
                 Translation3D sensorPosition = new Translation3D(0, 0, 0);
-                RotationGeant sensorRotation = new RotationGeant(0, 0, 0);
-                PhysicalVolume sensorPhysVol = new PhysicalVolume(new Transform3D(sensorPosition, sensorRotation), sensorName, sensorVol, componentVolume, sensorNumber);
-                //sensorPhysVol.addPhysVolID("sensor", sensor);                               
+                RotationGeant sensorRotation = new RotationGeant(0, 0, zrot);
+                //PhysicalVolume sensorPhysVol = 
+                new PhysicalVolume(new Transform3D(sensorPosition, sensorRotation), sensorName, sensorVol, componentVolume, sensorNumber);                
+                // TODO Could make sensors here?
                 ++sensorNumber;
             }
             Translation3D position = new Translation3D(0., 0., posZ);
@@ -282,10 +285,10 @@
         }
     }
 
-    private void setupSensorDetectorElements(Subdetector subdet)
+    // Called after geometry is in place to create the Sensor DetectorElements.
+    private void makeSensors(Subdetector subdet)
     {
         SiTrackerIdentifierHelper helper = (SiTrackerIdentifierHelper) subdet.getDetectorElement().getIdentifierHelper();
-
         for (IDetectorElement endcap : subdet.getDetectorElement().getChildren())
         {
             for (IDetectorElement layer : endcap.getChildren())
@@ -297,10 +300,9 @@
                     int sensorId = 0;
                     for (IPhysicalVolume componentPhysVol : modulePhysVol.getLogicalVolume().getDaughters())
                     {
+                        // Setup the sensor.
                         if (componentPhysVol.getLogicalVolume().getDaughters().size() != 0)
                         {
-                        //if (pv.isSensitive())
-                        //{
                             IPhysicalVolume sensorPhysVol = componentPhysVol.getLogicalVolume().getDaughters().get(0);
                             
                             IIdentifierDictionary iddict = subdet.getDetectorElement().getIdentifierHelper().getIdentifierDictionary();
@@ -333,8 +335,13 @@
                             String sensorPath = modulePath.toString() + "/" + componentPhysVol.getName() + "/" + sensorPhysVol.getName();
                             String sensorName = module.getName() + "_sensor" + sensorId;
 
+                            // Create the sensor.
                             SiSensor sensor = new SiSensor(sensorId, sensorName, module, sensorPath, id);
+                            
+                            // Configure parameters of strips, etc.                              
+                            configSensor(sensor);                            
 
+                            // Increment sensor numbering.
                             ++sensorId;
                         }
                     //    }
@@ -343,10 +350,54 @@
             }
         }
     }
+   
+    // Parameters...    
+    private double readoutCapacitanceIntercept = 0;
+    private double readoutCapacitanceSlope = 0.16;
+    private double senseCapacitanceIntercept = 0;
+    private double senseCapacitanceSlope = 0.16;
+    private double readoutStripPitch = 0.060;
+    private double senseStripPitch = 0.030;
+    private double readoutTransferEfficiency = 0.986;
+    private double senseTransferEfficiency =  0.419;
 
-    public Class getSubdetectorType()
+    // TODO: Move this method to a Driver class.
+    private void configSensor(SiSensor sensor)
     {
-        return HPSTracker.class;
+        Box sensorSolid = (Box) sensor.getGeometry().getLogicalVolume().getSolid();                                                        
+        
+        Polygon3D pside = sensorSolid.getFacesNormalTo(new BasicHep3Vector(0, 0, 1)).get(0);
+        Polygon3D nside = sensorSolid.getFacesNormalTo(new BasicHep3Vector(0, 0, -1)).get(0);         
+
+        sensor.setBiasSurface(ChargeCarrier.HOLE, pside);     // P side collects holes.
+        sensor.setBiasSurface(ChargeCarrier.ELECTRON, nside); // N side collects electrons.
+
+        // Setup electrodes on the XY front and back surfaces of the Box. 
+        ITranslation3D electrodesPosition = new Translation3D(VecOp.mult(-pside.getDistance(), pside.getNormal()));  // Translate to outside of polygon (always the same).
+        
+        // Strip angle.
+        IRotation3D electrodesRotation = new RotationPassiveXYZ(0.0, 0.0, 0.0); // Strips aligned to edge of sensor, ALWAYS.
+        Transform3D electrodesTransform = new Transform3D(electrodesPosition, electrodesRotation);
+        
+        // Free calculation of readout electrodes, sense electrodes determined thereon.
+        SiStrips readoutElectrodes = new SiStrips(ChargeCarrier.HOLE, readoutStripPitch, sensor, electrodesTransform);
+        SiStrips senseElectrodes = new SiStrips(ChargeCarrier.HOLE, senseStripPitch, (readoutElectrodes.getNCells()*2-1), sensor, electrodesTransform);
+
+        // Readout electrode parameters.
+        readoutElectrodes.setCapacitanceIntercept(readoutCapacitanceIntercept);
+        readoutElectrodes.setCapacitanceSlope(readoutCapacitanceSlope);
+        
+        // Sense electrode parameters.
+        senseElectrodes.setCapacitanceIntercept(senseCapacitanceIntercept);
+        senseElectrodes.setCapacitanceSlope(senseCapacitanceSlope); 
+
+        // Set sense and readout electrodes.
+        sensor.setSenseElectrodes(senseElectrodes);
+        sensor.setReadoutElectrodes(readoutElectrodes);
+
+        // Charge transfer efficiency.
+        double[][] transferEfficiencies = {{readoutTransferEfficiency, senseTransferEfficiency}};
+        sensor.setTransferEfficiencies(ChargeCarrier.HOLE, new BasicMatrix(transferEfficiencies));
     }
     
     static class ModuleComponentParameters
@@ -415,10 +466,8 @@
         public ModuleParameters(Element element)
         {
             name = element.getAttributeValue("name");
-
             if (element.getAttribute("vis") != null)
                 this.vis = element.getAttribute("vis").getValue();
-
             // Optional dimension parameters (not always present).
             if (element.getChild("trd") != null)
             {
@@ -447,7 +496,6 @@
                     throw new RuntimeException(x);
                 }
             }
-
             int cntr = 0;
             for (Object o : element.getChildren("module_component"))
             {
@@ -485,7 +533,6 @@
                 }
                 ++cntr;
             }
-
             calculateThickness();
         }
 
@@ -520,5 +567,4 @@
             return vis;
         }
     }
-
 }
CVSspam 0.2.12


Use REPLY-ALL to reply to list

To unsubscribe from the LCD-CVS list, click the following link:
https://listserv.slac.stanford.edu/cgi-bin/wa?SUBED1=LCD-CVS&A=1