Print

Print


Commit in GeomConverter/src/org/lcsim/detector/converter/compact on MAIN
SiTrackerEndcapConverter.java+201-221.9 -> 1.10
Setup sensors for digitization.

GeomConverter/src/org/lcsim/detector/converter/compact
SiTrackerEndcapConverter.java 1.9 -> 1.10
diff -u -r1.9 -r1.10
--- SiTrackerEndcapConverter.java	7 Nov 2007 00:33:20 -0000	1.9
+++ SiTrackerEndcapConverter.java	5 Dec 2007 00:20:46 -0000	1.10
@@ -1,5 +1,8 @@
 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.List;
 
@@ -10,19 +13,37 @@
 import org.lcsim.detector.IDetectorElement;
 import org.lcsim.detector.ILogicalVolume;
 import org.lcsim.detector.IPhysicalVolume;
+import org.lcsim.detector.IPhysicalVolumePath;
+import org.lcsim.detector.IRotation3D;
 import org.lcsim.detector.ITransform3D;
+import org.lcsim.detector.ITranslation3D;
 import org.lcsim.detector.LogicalVolume;
 import org.lcsim.detector.PhysicalVolume;
 import org.lcsim.detector.Rotation3D;
 import org.lcsim.detector.RotationPassiveXYZ;
 import org.lcsim.detector.Transform3D;
 import org.lcsim.detector.Translation3D;
+import org.lcsim.detector.identifier.ExpandedIdentifier;
+import org.lcsim.detector.identifier.IIdentifier;
+import org.lcsim.detector.identifier.IIdentifierDictionary;
+import org.lcsim.detector.identifier.IIdentifierDictionary.FieldNotFoundException;
+import org.lcsim.detector.identifier.IIdentifierDictionary.InvalidIndexException;
+import org.lcsim.detector.identifier.IdentifierDictionaryManager;
+import org.lcsim.detector.identifier.IdentifierUtil;
 import org.lcsim.detector.material.IMaterial;
 import org.lcsim.detector.material.MaterialStore;
 import org.lcsim.detector.solids.Box;
+import org.lcsim.detector.solids.IPolyhedron;
+import org.lcsim.detector.solids.Polygon3D;
 import org.lcsim.detector.solids.Trap;
 import org.lcsim.detector.solids.Trd;
 import org.lcsim.detector.solids.Tube;
+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.detector.tracker.silicon.SiTrackerBarrelModule;
+import org.lcsim.detector.tracker.silicon.SiTrackerIdentifierHelper;
 import org.lcsim.geometry.compact.Detector;
 import org.lcsim.geometry.compact.Subdetector;
 import org.lcsim.geometry.subdetector.SiTrackerEndcap;
@@ -31,12 +52,12 @@
  * Converter for SiTrackerEndcap.
  *
  * @author Jeremy McCormick, Tim Nelson
- * @version $Id: SiTrackerEndcapConverter.java,v 1.9 2007/11/07 00:33:20 jeremy Exp $
+ * @version $Id: SiTrackerEndcapConverter.java,v 1.10 2007/12/05 00:20:46 tknelson Exp $
  */
 
 public class SiTrackerEndcapConverter
         implements ISubdetectorConverter
-{   
+{
     private ModuleParameters moduleParameters = null;
     
     public void convert(Subdetector subdet, Detector detector)
@@ -111,7 +132,7 @@
                 String wedgePath = layerPath + "/" + wedge.getName();
                 String wedgeName = layerName + "_wedge" + wedge.getCopyNumber();
                 IDetectorElement wedgeDE = new DetectorElement(wedgeName,layerDE,detector.getNavigator().getPath(wedgePath));
-
+                
                 // Negative endcap.
                 String wedgePathReflect = layerPathReflect + "/" + wedge.getName();
                 String wedgeNameReflect = layerNameReflect + "_wedge" + wedge.getCopyNumber();
@@ -124,7 +145,7 @@
                     String modulePath = wedgePath + "/" + module.getName();
                     String moduleName = wedgeName + "_module" + module.getCopyNumber();
                     IDetectorElement moduleDE = new DetectorElement(moduleName,wedgeDE,detector.getNavigator().getPath(modulePath));
-                   
+                    
                     // Negative endcap module.
                     String modulePathReflect = wedgePathReflect + "/" + module.getName();
                     String moduleNameReflect = wedgeNameReflect + "_module" + module.getCopyNumber();
@@ -362,7 +383,7 @@
                 
                 imodule++;
             }
-  
+            
             // Small symmetric trapezoids
             if (ntraps == 1)
             {
@@ -408,7 +429,7 @@
                     Trap sliceTrap = new Trap(sliceName,zsizes.get(i),theta*ix,0.0,dy,xsize1,xsize1,0.0,dy,xsize2,xsize2,0.0);
                     
                     ILogicalVolume sliceLV = new LogicalVolume(sliceName, sliceTrap, sliceMaterial);
-
+                    
                     makeTrapModule(sliceLV, imodule);
                     
                     Transform3D trans = new Transform3D(new Translation3D(ix*xcenter,0,zcenters.get(i)));
@@ -422,17 +443,17 @@
                     
                     imodule++;
                 }
-            }      
-        }   
+            }
+        }
     }
     
     public void makeBoxModule(ILogicalVolume module, int moduleTypeId)
-    {        
+    {
         Box moduleBox = (Box)module.getSolid();
         double posY = -moduleBox.getYHalfLength();
         double moduleX = moduleBox.getXHalfLength();
         double moduleZ = moduleBox.getZHalfLength();
-       
+        
         for (ModuleComponentParameters component : moduleParameters)
         {
             double thickness = component.getThickness();
@@ -447,12 +468,12 @@
             Box sliceBox = new Box(componentName + "_box", moduleX, thickness / 2, moduleZ);
             
             ILogicalVolume volume = new LogicalVolume(componentName, sliceBox, material);
-         
+            
             Transform3D trans = new Transform3D(new Translation3D(0,posY,0));
             
             PhysicalVolume pv = new PhysicalVolume(trans, componentName, volume, module, componentNumber);
             pv.setSensitive(sensitive);
-                       
+            
             posY += thickness / 2;
         }
     }
@@ -486,9 +507,9 @@
             
             PhysicalVolume pv = new PhysicalVolume(trans, componentName, volume, module, componentNumber);
             pv.setSensitive(sensitive);
-                       
+            
             posY += thickness / 2;
-        }   
+        }
     }
     
     public void makeTrapModule(ILogicalVolume module, int moduleTypeId)
@@ -519,19 +540,19 @@
             
             posY += thickness / 2;
             
-            String componentName = "module" + moduleTypeId + "_component" + componentNumber;    
+            String componentName = "module" + moduleTypeId + "_component" + componentNumber;
             
             Trap sliceTrap = new Trap(componentName, z, theta, phi, thickness/2, x1, x2, a1, thickness/2, x3, x4, a2);
-                        
+            
             ILogicalVolume volume = new LogicalVolume(componentName, sliceTrap, material);
             
             Transform3D trans = new Transform3D(new Translation3D(0,posY,0));
             
             PhysicalVolume pv = new PhysicalVolume(trans, componentName, volume, module, componentNumber);
             pv.setSensitive(sensitive);
-                       
+            
             posY += thickness / 2;
-        }   
+        }
     }
     
     public Class getSubdetectorType()
@@ -539,13 +560,170 @@
         return SiTrackerEndcap.class;
     }
     
+    private void setupSensorDetectorElements(Subdetector subdet)
+    {
+        
+        SiTrackerIdentifierHelper id_helper = (SiTrackerIdentifierHelper)subdet.getDetectorElement().getIdentifierHelper();
+        
+        int moduleId=0;
+        
+        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() )
+                    {
+                        IPhysicalVolumePath modulePath =
+                                module.getGeometry().getPath();
+                        
+                        IPhysicalVolume modulePhysVol =
+                                modulePath.getLeafVolume();
+                        
+                        int sensorId=0;
+                        for ( IPhysicalVolume pv : modulePhysVol.getLogicalVolume().getDaughters())
+                        {
+                            // Create the identifier for this sensor.
+                            if ( pv.isSensitive() )
+                            {
+                                IIdentifierDictionary iddict =
+                                        IdentifierDictionaryManager.getInstance().
+                                        getIdentifierDictionary( subdet.getReadout().getName() );
+                                
+                                ExpandedIdentifier expId = new ExpandedIdentifier(iddict.getNumberOfFields());
+                                
+                                try
+                                {
+                                    // Set the System ID.
+                                    expId.setValue(iddict.getFieldIndex("system"), subdet.getSystemID());
+                                    
+                                    // Set the barrel-endcap flag.
+                                    if (id_helper.isEndcapPositive(endcap.getIdentifier()))
+                                    {
+                                        expId.setValue(iddict.getFieldIndex("barrel"), id_helper.getEndcapPositiveValue());
+                                    }
+                                    else if (id_helper.isEndcapNegative(endcap.getIdentifier()))
+                                    {
+                                        expId.setValue(iddict.getFieldIndex("barrel"), id_helper.getEndcapNegativeValue());
+                                    }
+                                    
+                                    // Set the layer number.
+                                    expId.setValue(iddict.getFieldIndex("layer"), layer.getGeometry().getPath().getLeafVolume().getCopyNumber());
+                                    
+                                    // Set the wedge number.
+                                    expId.setValue(iddict.getFieldIndex("wedge"), wedge.getGeometry().getPath().getLeafVolume().getCopyNumber());
+                                    
+                                    // Set the module id from the DetectorElement.
+                                    expId.setValue(iddict.getFieldIndex("module"),((SiTrackerBarrelModule)module).getModuleId());
+                                    
+                                    // Set the sensor id for double-sided.
+                                    expId.setValue(iddict.getFieldIndex("sensor"),sensorId);
+                                }
+                                catch (FieldNotFoundException x)
+                                {
+                                    throw new RuntimeException(x);
+                                }
+                                
+                                // Create the packed id using util method.
+                                // No IdentifierHelper is available yet.
+                                IIdentifier id = null;
+                                try
+                                {
+                                    id = IdentifierUtil.pack( iddict, expId );
+                                }
+                                catch (InvalidIndexException x)
+                                {
+                                    throw new RuntimeException(x);
+                                }
+                                
+                                //System.out.println(pv.getName() + " is sens");
+                                //System.out.println("path : " + modulePath.toString() + "/" + pv.getName());
+                                String sensorPath = modulePath.toString() + "/" + pv.getName();
+                                //String sensorName = subdet.getName() + "_layer" + layer.getGeometry().getPhysicalVolume().getCopyNumber() + "_module" + moduleId + "_sensor" + sensorId;
+                                String sensorName = subdet.getName() + "_endcap" + id_helper.getBarrel(endcap.getIdentifier()) +
+                                        "_layer" + layer.getGeometry().getPhysicalVolume().getCopyNumber() +
+                                        "_wedge" +  wedge.getGeometry().getPath().getLeafVolume().getCopyNumber() +
+                                        "_module" + ((SiTrackerBarrelModule)module).getModuleId() + "_sensor" + sensorId;
+                                
+                                SiSensor sensor = new SiSensor(sensorId,sensorName,module,sensorPath,id);
+                                sensor.setIdentifier(id);
+                                
+                                // Set up SiStrips for the sensors
+                                IPolyhedron sensor_solid = (IPolyhedron)sensor.getGeometry().getLogicalVolume().getSolid();
+                                
+                                Polygon3D inner_surface = sensor_solid.getFacesNormalTo(new BasicHep3Vector(0,0,-1)).get(0);
+                                Polygon3D outer_surface = sensor_solid.getFacesNormalTo(new BasicHep3Vector(0,0,1)).get(0);
+                                double strip_angle_magnitude = Math.PI/nwedges;
+                                
+                                Polygon3D p_side;
+                                Polygon3D n_side;
+                                double strip_angle;
+                                
+                                if (sensorId == 0) // inner sensor
+                                {
+                                    p_side = inner_surface;
+                                    n_side = outer_surface;
+                                    strip_angle = strip_angle_magnitude;
+                                }
+                                else // outer sensor
+                                {
+                                    p_side = outer_surface;
+                                    n_side = inner_surface;
+                                    strip_angle = -1*strip_angle_magnitude;
+                                }
+                                
+//                        System.out.println("Plane of p_side polygon has... ");
+//                        System.out.println("                        normal: "+p_side.getNormal());
+//                        System.out.println("                        distance: "+p_side.getDistance());
+//                        for (Point3D point : p_side.getClosedVertices())
+//                        {
+//                            System.out.println("      Vertex: "+point);
+//                        }
+
+//                        System.out.println("Plane of n_side polygon has... ");
+//                        System.out.println("                        normal: "+n_side.getNormal());
+//                        System.out.println("                        distance: "+n_side.getDistance());                                
+                                
+                                // Bias the sensor
+                                sensor.setBiasSurface(ChargeCarrier.HOLE,p_side);
+                                sensor.setBiasSurface(ChargeCarrier.ELECTRON,n_side);
+                                
+                                ITranslation3D electrodes_position = new Translation3D(VecOp.mult(p_side.getDistance(),p_side.getNormal()));  // translate to p_side
+                                IRotation3D electrodes_rotation = new RotationPassiveXYZ(0.0,strip_angle,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 sense electrodes, readout electrodes determined thereon
+                                SiSensorElectrodes sense_electrodes = new SiStrips(ChargeCarrier.HOLE,0.025,sensor,electrodes_transform);
+                                SiSensorElectrodes readout_electrodes = new SiStrips(ChargeCarrier.HOLE,0.050,(sense_electrodes.getNCells()+1)/2,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));
+                                
+                                // Incremenet sensorID for double-sided.
+                                ++sensorId;
+                                
+                            }
+                        }
+                        
+                        ++moduleId;
+                    }
+                }
+            }
+        }
+    }
+    
     public static class ModuleComponentParameters
     {
         String materialName;
         double thickness;
         boolean sensitive;
         int componentNumber;
-
+        
         public ModuleComponentParameters(double thickness, String materialName, int componentNumber, boolean sensitive)
         {
             this.thickness = thickness;
@@ -576,7 +754,7 @@
     }
     
     public static class ModuleParameters
-    extends ArrayList<ModuleComponentParameters>
+            extends ArrayList<ModuleComponentParameters>
     {
         double thickness=0.;
         String name;
@@ -586,7 +764,8 @@
             int cntr=0;
             for (Object o : element.getChildren("module_component"))
             {
-                try {
+                try
+                {
                     
                     Element e = (Element)o;
                     
@@ -607,7 +786,7 @@
             }
             calculateThickness();
         }
-                
+        
         public void calculateThickness()
         {
             thickness = 0.; // reset thickness
CVSspam 0.2.8