Print

Print


Commit in GeomConverter/src/org/lcsim/detector/converter/compact on MAIN
SiTrackerEndcapConverter.java+248-151.7 -> 1.8
JM: implementation of module substructure for org.lcsim

GeomConverter/src/org/lcsim/detector/converter/compact
SiTrackerEndcapConverter.java 1.7 -> 1.8
diff -u -r1.7 -r1.8
--- SiTrackerEndcapConverter.java	29 Oct 2007 21:36:37 -0000	1.7
+++ SiTrackerEndcapConverter.java	31 Oct 2007 00:33:54 -0000	1.8
@@ -5,6 +5,7 @@
 
 import org.jdom.DataConversionException;
 import org.jdom.Element;
+import org.jdom.JDOMException;
 import org.lcsim.detector.DetectorElement;
 import org.lcsim.detector.IDetectorElement;
 import org.lcsim.detector.ILogicalVolume;
@@ -17,10 +18,11 @@
 import org.lcsim.detector.Transform3D;
 import org.lcsim.detector.Translation3D;
 import org.lcsim.detector.material.IMaterial;
-import org.lcsim.detector.solids.Trd;
+import org.lcsim.detector.material.MaterialStore;
+import org.lcsim.detector.solids.Box;
 import org.lcsim.detector.solids.Trap;
+import org.lcsim.detector.solids.Trd;
 import org.lcsim.detector.solids.Tube;
-import org.lcsim.detector.solids.Box;
 import org.lcsim.geometry.compact.Detector;
 import org.lcsim.geometry.compact.Subdetector;
 import org.lcsim.geometry.subdetector.SiTrackerEndcap;
@@ -29,12 +31,14 @@
  * Converter for SiTrackerEndcap.
  *
  * @author Jeremy McCormick, Tim Nelson
- * @version $Id: SiTrackerEndcapConverter.java,v 1.7 2007/10/29 21:36:37 jeremy Exp $
+ * @version $Id: SiTrackerEndcapConverter.java,v 1.8 2007/10/31 00:33:54 jeremy Exp $
  */
 
 public class SiTrackerEndcapConverter
         implements ISubdetectorConverter
-{
+{   
+    private ModuleParameters moduleParameters = null;
+    
     public void convert(Subdetector subdet, Detector detector)
     {
         IPhysicalVolume trackingPV = detector.getTrackingVolume();
@@ -42,6 +46,17 @@
         
         Element node = subdet.getNode();
         
+        IDetectorElement endcapDE = new DetectorElement(subdet.getName(), detector.getDetectorElement());
+        
+        // Positive endcap DE.
+        IDetectorElement endcapPosDE = new DetectorElement(subdet.getName() + "_positive", endcapDE);
+        
+        // Negative endcap DE.
+        IDetectorElement endcapNegDE = new DetectorElement(subdet.getName() + "_negative", endcapDE);
+        
+        // Set static module parameters.
+        moduleParameters = new ModuleParameters(node.getChild("module"));
+        
         for (Object o : node.getChildren("layer"))
         {
             Element layerElement = (Element)o;
@@ -75,19 +90,19 @@
             
             double layerZ = innerZ + thickness / 2;
             
-            // Positive endcap.
+            // Positive endcap layer.
             ITransform3D layerTrans = new Transform3D(new Translation3D(0,0,layerZ));
             String layerName = layerLV.getName() + "_positive";
             new PhysicalVolume(layerTrans,layerName,layerLV,trackingLV,layern);
             String layerPath = "/" + trackingPV.getName() + "/" + layerName;
-            IDetectorElement layerDE = new DetectorElement(layerLV.getName(),null,detector.getNavigator().getPath(layerPath));
+            IDetectorElement layerDE = new DetectorElement(layerLV.getName(),endcapPosDE,detector.getNavigator().getPath(layerPath));
             
-            // Negative endcap.
+            // Negative endcap layer.
             ITransform3D layerTransReflect = new Transform3D(new Translation3D(0,0,-layerZ), new RotationPassiveXYZ(0,Math.PI,0));
             String layerNameReflect = layerLV.getName() + "_negative";
             new PhysicalVolume(layerTransReflect,layerNameReflect,layerLV,trackingLV,layern);
             String layerPathReflect = "/" + trackingPV.getName() + "/" + layerNameReflect;
-            IDetectorElement layerDEReflect = new DetectorElement(layerNameReflect,null,detector.getNavigator().getPath(layerPathReflect));
+            IDetectorElement layerDEReflect = new DetectorElement(layerNameReflect,endcapNegDE,detector.getNavigator().getPath(layerPathReflect));
             
             // Wedge DE.
             for (IPhysicalVolume wedge : layerLV.getDaughters())
@@ -105,18 +120,40 @@
                 // Module DEs.
                 for (IPhysicalVolume module : wedge.getLogicalVolume().getDaughters())
                 {
-                    // Positive endcap.
+                    // Positive endcap module.
                     String modulePath = wedgePath + "/" + module.getName();
                     String moduleName = wedgeName + "_module" + module.getCopyNumber();
-                    new DetectorElement(moduleName,wedgeDE,detector.getNavigator().getPath(modulePath));
-                    
-                    // Negative endcap.
+                    IDetectorElement moduleDE = new DetectorElement(moduleName,wedgeDE,detector.getNavigator().getPath(modulePath));
+                   
+                    // Negative endcap module.
                     String modulePathReflect = wedgePathReflect + "/" + module.getName();
                     String moduleNameReflect = wedgeNameReflect + "_module" + module.getCopyNumber();
-                    new DetectorElement(moduleNameReflect,wedgeDEReflect,detector.getNavigator().getPath(modulePathReflect));
+                    IDetectorElement moduleDEReflect = new DetectorElement(moduleNameReflect,wedgeDEReflect,detector.getNavigator().getPath(modulePathReflect));
+                    
+                    // Module DEs.
+                    for (IPhysicalVolume component : module.getLogicalVolume().getDaughters())
+                    {
+                        if (component.isSensitive())
+                        {
+                            // Positive endcap component.
+                            new DetectorElement(
+                                    moduleName + "_component" + component.getCopyNumber(),
+                                    moduleDE,
+                                    detector.getNavigator().getPath(modulePath + "/" + component.getName()));
+                            
+                            // Negative endcap component. (should have same physical layout as positive)
+                            new DetectorElement(
+                                    moduleNameReflect + "_component" + component.getCopyNumber(),
+                                    moduleDEReflect,
+                                    detector.getNavigator().getPath(modulePathReflect + "/" + component.getName()));
+                        }
+                    }
                 }
             }
         }
+        
+        // Set cached module parameters to null for GC.
+        moduleParameters = null;
     }
     
     private ILogicalVolume makeWedge(
@@ -189,7 +226,7 @@
         
         // Place the wedges in the layer.
         double r = (innerR + outerR) / 2;
-        String wedgeName = wedgeLV.getName();
+        //String wedgeName = wedgeLV.getName();
         for (int i=0; i<nwedges; i++)
         {
             double phi = i * 2 * Math.PI / nwedges;
@@ -311,6 +348,9 @@
                 
                 ILogicalVolume sliceLV = new LogicalVolume(sliceName, sliceBox, sliceMaterial);
                 
+                // Build the module substructure.
+                makeBoxModule(sliceLV, imodule);
+                
                 Transform3D trans = new Transform3D(new Translation3D(xcenter,0,zcenters.get(i)));
                 
                 new PhysicalVolume(
@@ -332,6 +372,9 @@
                 
                 ILogicalVolume sliceLV = new LogicalVolume(sliceName, sliceTrd, sliceMaterial);
                 
+                // Build the module substructure.
+                makeTrdModule(sliceLV, imodule);
+                
                 Transform3D trans = new Transform3D(new Translation3D(0,0,zcenters.get(i)));
                 
                 new PhysicalVolume(
@@ -365,6 +408,8 @@
                     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)));
                     
@@ -377,14 +422,202 @@
                     
                     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();
+            IMaterial material = component.getMaterial();
+            boolean sensitive = component.isSensitive();
+            int componentNumber = component.getComponentNumber();
+            
+            posY += thickness / 2;
+            
+            String componentName = "module" + moduleTypeId + "_component" + componentNumber;
             
+            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;
         }
+    }
+    
+    public void makeTrdModule(ILogicalVolume module, int moduleTypeId)
+    {
+        Trd trd = (Trd)module.getSolid();
+        double x1 = trd.getXHalfLength1();
+        double x2 = trd.getXHalfLength2();
+        double y1 = trd.getYHalfLength1();
+        double z = trd.getZHalfLength();
+        
+        double posY = -y1;
+        
+        for (ModuleComponentParameters component : moduleParameters)
+        {
+            double thickness = component.getThickness();
+            IMaterial material = component.getMaterial();
+            boolean sensitive = component.isSensitive();
+            int componentNumber = component.getComponentNumber();
+            
+            posY += thickness / 2;
+            
+            String componentName = "module" + moduleTypeId + "_component" + componentNumber;
+            
+            Trd sliceTrd = new Trd(componentName, x1, x2, thickness/2, thickness/2, z);
+            
+            ILogicalVolume volume = new LogicalVolume(componentName, sliceTrd, 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 void makeTrapModule(ILogicalVolume module, int moduleTypeId)
+    {
+        Trap trap = (Trap)module.getSolid();
+        double a1 = trap.getTanAlpha1();
+        double a2 = trap.getTanAlpha2();
+        double x1 = trap.getXHalfLength1();
+        double x2 = trap.getXHalfLength2();
+        double x3 = trap.getXHalfLength3();
+        double x4 = trap.getXHalfLength4();
+        double y1 = trap.getYHalfLength1();
+        double y2 = trap.getYHalfLength2();
+        double z = trap.getZHalfLength();
+        double theta = trap.getTheta();
+        double phi = trap.getPhi();
+        
+        double posY = -y1;
         
+        for (ModuleComponentParameters component : moduleParameters)
+        {
+            double thickness = component.getThickness();
+            IMaterial material = component.getMaterial();
+            boolean sensitive = component.isSensitive();
+            int componentNumber = component.getComponentNumber();
+            
+            posY += thickness / 2;
+            
+            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()
     {
         return SiTrackerEndcap.class;
     }
+    
+    private static class ModuleComponentParameters
+    {
+        IMaterial material;
+        double thickness;
+        boolean sensitive;
+        int componentNumber;
+
+        public ModuleComponentParameters(double thickness, IMaterial material, int componentNumber, boolean sensitive)
+        {
+            this.thickness = thickness;
+            this.material = material;
+            this.sensitive = sensitive;
+            this.componentNumber = componentNumber;
+        }
+        
+        double getThickness()
+        {
+            return thickness;
+        }
+        
+        IMaterial getMaterial()
+        {
+            return material;
+        }
+        
+        boolean isSensitive()
+        {
+            return sensitive;
+        }
+        
+        int getComponentNumber()
+        {
+            return componentNumber;
+        }
+    }
+    
+    private static class ModuleParameters
+    extends ArrayList<ModuleComponentParameters>
+    {
+        double thickness=0.;
+        String name;
+        ModuleParameters(Element element)
+        {
+            name = element.getAttributeValue("name");
+            int cntr=0;
+            for (Object o : element.getChildren("module_component"))
+            {
+                try {
+                    
+                    Element e = (Element)o;
+                    
+                    double cThickness = e.getAttribute("thickness").getDoubleValue();
+                    
+                    IMaterial cMaterial = MaterialStore.getInstance().get(e.getAttributeValue("material"));
+                    
+                    boolean cSensitive = false;
+                    if (e.getAttribute("sensitive") != null)
+                        cSensitive = e.getAttribute("sensitive").getBooleanValue();
+                    add(new ModuleComponentParameters(cThickness, cMaterial, cntr, cSensitive));
+                }
+                catch (JDOMException x)
+                {
+                    throw new RuntimeException(x);
+                }
+                ++cntr;
+            }
+            calculateThickness();
+        }
+                
+        void calculateThickness()
+        {
+            thickness = 0.; // reset thickness
+            for (ModuleComponentParameters p : this)
+            {
+                thickness += p.getThickness();
+            }
+        }
+        
+        double getThickness()
+        {
+            return thickness;
+        }
+    }
 }
\ No newline at end of file
CVSspam 0.2.8