Commit in GeomConverter/src/org/lcsim/geometry/compact/converter/lcdd on MAIN
SiTrackerEndcap2.java+204added 1.1
SiTrackerModuleComponentParameters.java+39added 1.1
SiTrackerModuleParameters.java+86added 1.1
SiTrackerEndcap.java+10-971.13 -> 1.14
+339-97
3 added + 1 modified, total 4 files
JM: first version of lcdd converter for new tracker endcap plus some refactoring

GeomConverter/src/org/lcsim/geometry/compact/converter/lcdd
SiTrackerEndcap2.java added at 1.1
diff -N SiTrackerEndcap2.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ SiTrackerEndcap2.java	22 Nov 2008 01:00:39 -0000	1.1
@@ -0,0 +1,204 @@
+package org.lcsim.geometry.compact.converter.lcdd;
+
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
+import org.jdom.Element;
+import org.jdom.JDOMException;
+import org.lcsim.geometry.compact.converter.lcdd.util.LCDD;
+import org.lcsim.geometry.compact.converter.lcdd.util.Material;
+import org.lcsim.geometry.compact.converter.lcdd.util.PhysVol;
+import org.lcsim.geometry.compact.converter.lcdd.util.Position;
+import org.lcsim.geometry.compact.converter.lcdd.util.Rotation;
+import org.lcsim.geometry.compact.converter.lcdd.util.SensitiveDetector;
+import org.lcsim.geometry.compact.converter.lcdd.util.Trapezoid;
+import org.lcsim.geometry.compact.converter.lcdd.util.Volume;
+
+/**
+ * An LCDD converter for a Silicon endcap tracker model based on Bill Cooper's design from
+ * <a href="http://ilcagenda.linearcollider.org/materialDisplay.py?contribId=58&sessionId=1&materialId=slides&confId=2784">Boulder SiD Workshop 2008</a>.
+ * 
+ * @author jeremym 
+ */
+public class SiTrackerEndcap2 extends LCDDSubdetector 
+{
+    Map<String,SiTrackerModuleParameters> moduleParameters = new HashMap<String,SiTrackerModuleParameters>();
+    Map<String,Volume> modules = new HashMap<String,Volume>();
+    Material vacuum;
+    
+    public SiTrackerEndcap2(Element node) throws JDOMException
+    {
+        super(node);
+    }	
+
+	void addToLCDD(LCDD lcdd, SensitiveDetector sd) throws JDOMException 
+	{			
+        int sysId = node.getAttribute("id").getIntValue();
+        String subdetName = node.getAttributeValue("name");
+        vacuum = lcdd.getMaterial("Vacuum");
+        boolean reflect;
+        if (node.getAttribute("reflect") != null)
+            reflect = node.getAttribute("reflect").getBooleanValue();
+        else
+            reflect = true;
+        
+        for (Iterator i = node.getChildren("module").iterator(); i.hasNext();)
+        {
+            Element module = (Element)i.next();
+            String moduleName = module.getAttributeValue("name");
+            moduleParameters.put(moduleName, new SiTrackerModuleParameters(module));
+            modules.put(moduleName, makeModule(moduleParameters.get(moduleName), sd, lcdd));
+        }		              
+        
+        for (Iterator i = node.getChildren("layer").iterator(); i.hasNext();)            
+        {
+            Element layerElement = (Element) i.next();
+            int layerId = layerElement.getAttribute("id").getIntValue();
+            int ringCount = 0;
+            int moduleNumber = 0;
+            for (Iterator j = layerElement.getChildren("ring").iterator(); j.hasNext();)
+            {
+                Element ringElement = (Element) j.next();
+                double r = ringElement.getAttribute("r").getDoubleValue();
+                double phi0 = ringElement.getAttribute("phi0").getDoubleValue();
+                double zstart = ringElement.getAttribute("zstart").getDoubleValue();
+                double dz = Math.abs(ringElement.getAttribute("dz").getDoubleValue());
+                int nmodules = ringElement.getAttribute("nmodules").getIntValue();
+                String module = ringElement.getAttributeValue("module");
+                Volume moduleVolume = modules.get(module);
+                if (moduleVolume == null)
+                    throw new RuntimeException("Module " + module + " was not found.");
+                double iphi = (2 * Math.PI) / nmodules;
+                double phi = phi0;
+                for (int k = 0; k < nmodules; k++)
+                {                    
+                    String moduleBaseName = subdetName + "_layer" + layerId + "_module" + moduleNumber;
+                    
+                    double x = r * Math.cos(phi);
+                    double y = r * Math.sin(phi);
+                    
+                    Position p = new Position(moduleBaseName + "_position");
+                    p.setX(x);
+                    p.setY(y);                        
+                    p.setZ(zstart + dz);                    
+                    Rotation rot = new Rotation(moduleBaseName + "_rotation");
+                    rot.setX(-Math.PI/2);
+                    rot.setY(-Math.PI/2 - phi);                    
+
+                    lcdd.add(p);
+                    lcdd.add(rot);
+                    
+                    PhysVol pv = new PhysVol(moduleVolume, lcdd.getTrackingVolume(), p, rot);
+                    pv.addPhysVolID("system", sysId);
+                    pv.addPhysVolID("barrel", 1); // positive endcap
+                    pv.addPhysVolID("layer", layerId);
+                    pv.addPhysVolID("module", moduleNumber);
+                    
+                    if (reflect)
+                    {
+                        Position pr = new Position(moduleBaseName + "_reflect_position");
+                        pr.setX(x);
+                        pr.setY(y);                        
+                        pr.setZ(-zstart - dz);                    
+                        Rotation rotr = new Rotation(moduleBaseName + "_reflect_rotation");
+                        rotr.setX(-Math.PI/2);
+                        rotr.setY((-Math.PI/2 - phi) + Math.PI);
+
+                        lcdd.add(pr);
+                        lcdd.add(rotr);
+                        
+                        PhysVol pvr = new PhysVol(moduleVolume, lcdd.getTrackingVolume(), pr, rotr);
+                        pvr.addPhysVolID("system", sysId);
+                        pvr.addPhysVolID("barrel", 2);
+                        pvr.addPhysVolID("layer", layerId);
+                        pvr.addPhysVolID("module", moduleNumber);                       
+                    }
+                    
+                    dz = -dz;                    
+                    phi += iphi;
+                    ++ringCount;
+                    ++moduleNumber;
+                }
+            }
+        }                
+	}
+	
+	private Volume makeModule(SiTrackerModuleParameters params, SensitiveDetector sd, LCDD lcdd)
+	{
+	    double thickness = params.getThickness();
+	    double dx1, dx2, dy1, dy2, dz;
+	    dy1 = dy2 = thickness / 2;
+	    dx1 = params.getDimension(0);
+	    dx2 = params.getDimension(1);
+	    dz = params.getDimension(2);
+	    Trapezoid envelope = new Trapezoid(params.getName() + "Trd", dx1, dx2, dy1, dy2, dz);
+	    lcdd.add(envelope);
+	    Volume volume = new Volume(params.getName() + "Volume", envelope, vacuum);
+	    makeModuleComponents(volume, params, sd, lcdd);
+	    lcdd.add(volume);
+	    return volume;
+	}
+	
+	private void makeModuleComponents(Volume moduleVolume, SiTrackerModuleParameters moduleParameters, SensitiveDetector sd, LCDD lcdd)
+    {
+        Trapezoid trd = (Trapezoid)lcdd.getSolid(moduleVolume.getSolidRef());
+
+        double x1 = trd.x1();
+        double x2 = trd.x2();
+        double y1 = trd.y1();
+        double z = trd.z();
+
+        double posY = -y1;
+
+        String moduleName = moduleVolume.getVolumeName();
+
+        int sensor=0;
+        for (SiTrackerModuleComponentParameters component : moduleParameters)
+        {
+            double thickness = component.getThickness();
+
+            Material material = null;
+            try {
+                material = lcdd.getMaterial(component.getMaterialName());
+            }
+            catch (JDOMException x)
+            {
+                throw new RuntimeException(x);
+            }
+            boolean sensitive = component.isSensitive();
+            int componentNumber = component.getComponentNumber();            
+
+            posY += thickness / 2;
+
+            String componentName = moduleName + "_component" + componentNumber;
+
+            Trapezoid sliceTrd = new Trapezoid(componentName + "_trd", x1, x2, thickness/2, thickness/2, z);
+            lcdd.add(sliceTrd);
+
+            Volume volume = new Volume(componentName, sliceTrd, material);
+            lcdd.add(volume);
+
+            Position position = new Position(componentName + "_position",0.,posY,0);
+            lcdd.add(position);
+            Rotation rotation = new Rotation(componentName + "_rotation");
+            lcdd.add(rotation);
+
+            PhysVol pv = new PhysVol(volume, moduleVolume, position, rotation);
+            pv.addPhysVolID("component", componentNumber);
+
+            if (sensitive)
+            {
+                if (sensor > 1)
+                {
+                    throw new RuntimeException("Maximum of 2 sensors per module.");
+                }
+                pv.addPhysVolID("sensor", sensor);
+                volume.setSensitiveDetector(sd);
+                ++sensor;
+            }
+
+            posY += thickness / 2;
+        }   
+    }	
+}
\ No newline at end of file

GeomConverter/src/org/lcsim/geometry/compact/converter/lcdd
SiTrackerModuleComponentParameters.java added at 1.1
diff -N SiTrackerModuleComponentParameters.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ SiTrackerModuleComponentParameters.java	22 Nov 2008 01:00:39 -0000	1.1
@@ -0,0 +1,39 @@
+package org.lcsim.geometry.compact.converter.lcdd;
+
+//FIXME: Duplicates class in org.lcsim.detector.converter.compact.SiTrackerEndcapConverter to avoid dependency.
+
+public class SiTrackerModuleComponentParameters
+{
+    String materialName;
+    double thickness;
+    boolean sensitive;
+    int componentNumber;
+
+    public SiTrackerModuleComponentParameters(double thickness, String materialName, int componentNumber, boolean sensitive)
+    {
+        this.thickness = thickness;
+        this.materialName = materialName;
+        this.sensitive = sensitive;
+        this.componentNumber = componentNumber;
+    }
+
+    public double getThickness()
+    {
+        return thickness;
+    }
+
+    public String getMaterialName()
+    {
+        return materialName;
+    }
+
+    public boolean isSensitive()
+    {
+        return sensitive;
+    }
+
+    public int getComponentNumber()
+    {
+        return componentNumber;
+    }
+}

GeomConverter/src/org/lcsim/geometry/compact/converter/lcdd
SiTrackerModuleParameters.java added at 1.1
diff -N SiTrackerModuleParameters.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ SiTrackerModuleParameters.java	22 Nov 2008 01:00:39 -0000	1.1
@@ -0,0 +1,86 @@
+package org.lcsim.geometry.compact.converter.lcdd;
+
+import java.util.ArrayList;
+
+import org.jdom.DataConversionException;
+import org.jdom.Element;
+import org.jdom.JDOMException;
+
+// FIXME: Duplicates class in org.lcsim.detector.converter.compact.SiTrackerEndcapConverter to avoid dependency.       
+public class SiTrackerModuleParameters
+extends ArrayList<SiTrackerModuleComponentParameters>
+{
+    double thickness=0.;
+    String name;
+    double dimensions[] = new double[3];
+    public SiTrackerModuleParameters(Element element)
+    {
+        name = element.getAttributeValue("name");
+        int cntr=0;
+        for (Object o : element.getChildren("module_component"))
+        {
+            try {
+
+                Element e = (Element)o;
+
+                double thickness = e.getAttribute("thickness").getDoubleValue();
+
+                String materialName = e.getAttributeValue("material");
+
+                boolean sensitive = false;
+                if (e.getAttribute("sensitive") != null)
+                    sensitive = e.getAttribute("sensitive").getBooleanValue();
+                add(new SiTrackerModuleComponentParameters(thickness, materialName, cntr, sensitive));
+            }
+            catch (JDOMException x)
+            {
+                throw new RuntimeException(x);
+            }
+            ++cntr;
+        }
+        
+        // Optional dimension parameters (not always present).
+        if (element.getChild("trd") != null)
+        {
+            Element trd = element.getChild("trd");
+            try 
+            {
+                dimensions[0] = trd.getAttribute("x1").getDoubleValue();
+                dimensions[1] = trd.getAttribute("x2").getDoubleValue();
+                dimensions[2] = trd.getAttribute("z").getDoubleValue();
+            }
+            catch (DataConversionException x)
+            {
+                throw new RuntimeException(x);
+            }
+        }
+        
+        calculateThickness();
+    }
+
+    public void calculateThickness()
+    {
+        thickness = 0.; // reset thickness
+        for (SiTrackerModuleComponentParameters p : this)
+        {
+            thickness += p.getThickness();
+        }
+    }
+
+    public double getThickness()
+    {
+        return thickness;
+    }
+    
+    public String getName()
+    {
+        return name;
+    }
+    
+    public double getDimension(int i)
+    {
+        if (i > (dimensions.length - 1) || i < 0)
+            throw new RuntimeException("Invalid dimensions index " + i);
+        return dimensions[i];
+    }
+}
\ No newline at end of file

GeomConverter/src/org/lcsim/geometry/compact/converter/lcdd
SiTrackerEndcap.java 1.13 -> 1.14
diff -u -r1.13 -r1.14
--- SiTrackerEndcap.java	5 May 2008 21:25:19 -0000	1.13
+++ SiTrackerEndcap.java	22 Nov 2008 01:00:39 -0000	1.14
@@ -23,7 +23,7 @@
 
 public class SiTrackerEndcap extends LCDDSubdetector
 {
-    Map<String,ModuleParameters> moduleParameters = new HashMap<String,ModuleParameters>();
+    Map<String,SiTrackerModuleParameters> moduleParameters = new HashMap<String,SiTrackerModuleParameters>();
     SensitiveDetector sd = null;
 
     public SiTrackerEndcap(Element node) throws JDOMException
@@ -41,7 +41,7 @@
         for (Object n : node.getChildren("module"))
         {
         	Element e = (Element)n;
-        	moduleParameters.put(e.getAttributeValue("name"), new ModuleParameters(e));
+        	moduleParameters.put(e.getAttributeValue("name"), new SiTrackerModuleParameters(e));
         }
         
         int sysId = node.getAttribute("id").getIntValue();
@@ -216,14 +216,14 @@
         if (moduleref == null)
         	throw new RuntimeException("module reference is missing for layer number " + layerN);
         
-        ModuleParameters module = moduleParameters.get(moduleref.getValue());
+        SiTrackerModuleParameters module = moduleParameters.get(moduleref.getValue());
 
         makeModules(subdetElement, wedgeLV, layerElement.getChild("module_parameters"), module, layerN, lcdd);
 
         return wedgeLV;
     }
 
-    private void makeModules(Element subdetElement, Volume wedgeLV, Element moduleParameters, ModuleParameters module, int layerN, LCDD lcdd)
+    private void makeModules(Element subdetElement, Volume wedgeLV, Element moduleParameters, SiTrackerModuleParameters module, int layerN, LCDD lcdd)
     {
         double r_size;
         try
@@ -420,7 +420,7 @@
         }
     }
 
-    void makeBoxModule(Volume moduleVolume, ModuleParameters moduleParameters, LCDD lcdd)
+    void makeBoxModule(Volume moduleVolume, SiTrackerModuleParameters moduleParameters, LCDD lcdd)
     {
         Box moduleBox = (Box)lcdd.getSolid(moduleVolume.getSolidRef());
 
@@ -432,7 +432,7 @@
 
         int sensor=0;
         
-        for (ModuleComponentParameters component : moduleParameters)
+        for (SiTrackerModuleComponentParameters component : moduleParameters)
         {
             double thickness = component.getThickness();
             Material material = null;
@@ -479,7 +479,7 @@
         }    	
     }
 
-    void makeTrdModule(Volume moduleVolume, ModuleParameters moduleParameters, LCDD lcdd)
+    void makeTrdModule(Volume moduleVolume, SiTrackerModuleParameters moduleParameters, LCDD lcdd)
     {
         Trapezoid trd = (Trapezoid)lcdd.getSolid(moduleVolume.getSolidRef());
 
@@ -493,7 +493,7 @@
         String moduleName = moduleVolume.getVolumeName();
 
         int sensor=0;
-        for (ModuleComponentParameters component : moduleParameters)
+        for (SiTrackerModuleComponentParameters component : moduleParameters)
         {
             double thickness = component.getThickness();
 
@@ -541,7 +541,7 @@
         }   
     }
 
-    public void makeTrapModule(Volume module, ModuleParameters moduleParameters, LCDD lcdd)
+    public void makeTrapModule(Volume module, SiTrackerModuleParameters moduleParameters, LCDD lcdd)
     {
         Trap trap = (Trap)lcdd.getSolid(module.getSolidRef());
 
@@ -560,7 +560,7 @@
 
         int sensor = 0;
         
-        for (ModuleComponentParameters component : moduleParameters)
+        for (SiTrackerModuleComponentParameters component : moduleParameters)
         {
             double thickness = component.getThickness();
             Material material = null;
@@ -611,91 +611,4 @@
     {
         return true;
     }
-
-    // FIXME: Duplicates class in org.lcsim.detector.converter.compact.SiTrackerEndcapConverter to avoid dependency.
-    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;
-            this.materialName = materialName;
-            this.sensitive = sensitive;
-            this.componentNumber = componentNumber;
-        }
-
-        public double getThickness()
-        {
-            return thickness;
-        }
-
-        public String getMaterialName()
-        {
-            return materialName;
-        }
-
-        public boolean isSensitive()
-        {
-            return sensitive;
-        }
-
-        public int getComponentNumber()
-        {
-            return componentNumber;
-        }
-    }
-
-    // FIXME: Duplicates class in org.lcsim.detector.converter.compact.SiTrackerEndcapConverter to avoid dependency.       
-    public static class ModuleParameters
-    extends ArrayList<ModuleComponentParameters>
-    {
-        double thickness=0.;
-        String name;
-        public ModuleParameters(Element element)
-        {
-            name = element.getAttributeValue("name");
-            int cntr=0;
-            for (Object o : element.getChildren("module_component"))
-            {
-                try {
-
-                    Element e = (Element)o;
-
-                    double thickness = e.getAttribute("thickness").getDoubleValue();
-
-                    String materialName = e.getAttributeValue("material");
-
-                    boolean sensitive = false;
-                    if (e.getAttribute("sensitive") != null)
-                        sensitive = e.getAttribute("sensitive").getBooleanValue();
-                    add(new ModuleComponentParameters(thickness, materialName, cntr, sensitive));
-                }
-                catch (JDOMException x)
-                {
-                    throw new RuntimeException(x);
-                }
-                ++cntr;
-            }
-            calculateThickness();
-        }
-
-        public void calculateThickness()
-        {
-            thickness = 0.; // reset thickness
-            for (ModuleComponentParameters p : this)
-            {
-                thickness += p.getThickness();
-            }
-        }
-
-        public double getThickness()
-        {
-            return thickness;
-        }
-    }
-
 }
CVSspam 0.2.8