Print

Print


Commit in GeomConverter/src/org/lcsim/geometry/compact/converter/lcdd on MAIN
SiTrackerEndcap.java+178-1661.11 -> 1.12
Added tolerances to wedges in endcap as test.

GeomConverter/src/org/lcsim/geometry/compact/converter/lcdd
SiTrackerEndcap.java 1.11 -> 1.12
diff -u -r1.11 -r1.12
--- SiTrackerEndcap.java	21 Apr 2008 20:01:18 -0000	1.11
+++ SiTrackerEndcap.java	5 May 2008 20:43:22 -0000	1.12
@@ -9,6 +9,7 @@
 import org.jdom.DataConversionException;
 import org.jdom.Element;
 import org.jdom.JDOMException;
+import org.lcsim.detector.solids.GeomOp3D;
 import org.lcsim.geometry.compact.converter.lcdd.util.Box;
 import org.lcsim.geometry.compact.converter.lcdd.util.LCDD;
 import org.lcsim.geometry.compact.converter.lcdd.util.Material;
@@ -23,25 +24,25 @@
 
 public class SiTrackerEndcap extends LCDDSubdetector
 {
-	Map<String,ModuleParameters> moduleParameters = new HashMap<String,ModuleParameters>();
+    Map<String,ModuleParameters> moduleParameters = new HashMap<String,ModuleParameters>();
     SensitiveDetector sd = null;
-
+    
     public SiTrackerEndcap(Element node) throws JDOMException
     {
         super(node);
     }
-
+    
     public void addToLCDD(LCDD lcdd, SensitiveDetector sens) throws JDOMException
-    {        
+    {
         if (sens == null)
             throw new RuntimeException("SD is null");
-
+        
         this.sd = sens;
         
         for (Object n : node.getChildren("module"))
         {
-        	Element e = (Element)n;
-        	moduleParameters.put(e.getAttributeValue("name"), new ModuleParameters(e));
+            Element e = (Element)n;
+            moduleParameters.put(e.getAttributeValue("name"), new ModuleParameters(e));
         }
         
         int sysId = node.getAttribute("id").getIntValue();
@@ -49,8 +50,8 @@
         
         for (Object o : node.getChildren("layer"))
         {
-            Element layerElement = (Element)o;           
-
+            Element layerElement = (Element)o;
+            
             int nwedges;
             try
             {
@@ -60,7 +61,7 @@
             {
                 throw new RuntimeException(x);
             }
-
+            
             double innerR, outerR, innerZ, thickness;
             int layerN;
             try
@@ -69,33 +70,33 @@
                 innerR = layerElement.getAttribute("inner_r").getDoubleValue();
                 outerR = layerElement.getAttribute("outer_r").getDoubleValue();
                 innerZ = layerElement.getAttribute("inner_z").getDoubleValue();
-                thickness = layerElement.getAttribute("thickness").getDoubleValue();                
+                thickness = layerElement.getAttribute("thickness").getDoubleValue();
             }
             catch (DataConversionException x)
             {
                 throw new RuntimeException(x);
-            }            
-
+            }
+            
             String layerName = subdetName + "_layer" + layerN;
-
+            
             Volume layerVolume = makeLayer(node, layerElement, layerN, innerR, outerR, thickness, nwedges, lcdd);
-
+            
             lcdd.add(layerVolume);
-
+            
             Rotation rotation = new Rotation(layerName + "_rotation");
             Position position = new Position(layerName + "_position");
             double layerZ = innerZ + thickness/2;
             position.setZ(layerZ);
-
+            
             lcdd.add(rotation);
             lcdd.add(position);
-
+            
             // Positive endcap.
             PhysVol posEC = new PhysVol(layerVolume, lcdd.getTrackingVolume(), position, rotation);
             posEC.addPhysVolID("system", sysId);
             posEC.addPhysVolID("barrel", 1); // Positive endcap flag.
             posEC.addPhysVolID("layer", layerN);
-
+            
             // Negative endcap.
             Rotation rotationReflect = new Rotation(layerName + "_rotation_reflect");
             rotationReflect.setY(Math.PI);
@@ -108,49 +109,50 @@
             negEC.addPhysVolID("barrel", 2); // Negative endcap flag.
             negEC.addPhysVolID("layer", layerN);
         }
-
+        
         moduleParameters = null;
     }
-
+    
     private Volume makeLayer(
-            Element subdetElement, 
-            Element layerElement, 
-            int layerN, 
-            double innerR, 
-            double outerR, 
-            double thickness, 
+            Element subdetElement,
+            Element layerElement,
+            int layerN,
+            double innerR,
+            double outerR,
+            double thickness,
             int nwedges,
             LCDD lcdd)
     {
         double dphi = Math.PI / nwedges;
-
+        
         String subdetName = subdetElement.getAttributeValue("name");
-
+        
         String layerName = subdetName + "_layer" + layerN;
-
+        
         double tubeInnerR, tubeOuterR;
         tubeInnerR = innerR;
         tubeOuterR = outerR / Math.cos(dphi);
-
+        
         // FIXME: The z dimension should go in as a half length, but GDML does not use Geant4's convention.
         Tube layerTube = new Tube(layerName + "_tube", tubeInnerR, tubeOuterR, thickness/2);
-
+        
         lcdd.add(layerTube);
-
+        
         Material material;
-        try {
+        try
+        {
             material = lcdd.getMaterial("Air");
         }
         catch (JDOMException x)
         {
             throw new RuntimeException(x);
         }
-
-        Volume layerLV = new Volume(layerName, layerTube, material);        
-
+        
+        Volume layerLV = new Volume(layerName, layerTube, material);
+        
         Volume wedgeLV = makeWedge(subdetElement, layerElement, innerR, outerR, thickness, nwedges, layerN, lcdd);
         lcdd.add(wedgeLV);
-
+        
         double r = (innerR + outerR) / 2;
         String wedgeName = wedgeLV.getVolumeName();
         for (int i=0; i<nwedges; i++)
@@ -158,34 +160,34 @@
             double phi = i * 2 * Math.PI / nwedges;
             double x = r * Math.cos(phi);
             double y = r * Math.sin(phi);
-
+            
             Position p = new Position(wedgeName + i + "_position");
             p.setX(x);
             p.setY(y);
             Rotation rot = new Rotation(wedgeName + i + "_rotation");
             rot.setX(-Math.PI/2);
             rot.setY(-Math.PI/2 - phi);
-
+            
             lcdd.add(p);
             lcdd.add(rot);
-
+            
             PhysVol wedgePV = new PhysVol(wedgeLV, layerLV, p, rot);
-            wedgePV.addPhysVolID("wedge", i);            
+            wedgePV.addPhysVolID("wedge", i);
         }
-
+        
         // Set the layer envelope to invisible to help Geant4 visualization.
         //if (lcdd.getVisAttributes("InvisibleWithDaughters") != null)
         //{
         //    layerLV.setVisAttributes(lcdd.getVisAttributes("InvisibleWithDaughters"));
         //}
-
+        
         return layerLV;
     }
-
+    
     Volume makeWedge(Element subdetElement, Element layerElement, double innerR, double outerR, double thickness, int nwedges, int layerN, LCDD lcdd)
     {
         Material material;
-        try 
+        try
         {
             material = lcdd.getMaterial("Air");
         }
@@ -193,10 +195,10 @@
         {
             throw new RuntimeException(x);
         }
-
+        
         String subdetName = subdetElement.getAttributeValue("name");
         String name = subdetName + "_layer" + layerN + "_wedge";
-
+        
         double dz = (outerR - innerR) / 2;
         double dy1, dy2;
         dy1 = dy2 = thickness / 2;
@@ -204,25 +206,25 @@
         double dphi = Math.PI / nwedges;
         dx1 = innerR * Math.tan(dphi);
         dx2 = outerR * Math.tan(dphi);
-
+        
         Trapezoid wedgeTrd = new Trapezoid(name + "_trapezoid",dx1,dx2,dy1,dy2,dz);
-
+        
         lcdd.add(wedgeTrd);
-
+        
         Volume wedgeLV = new Volume(name, wedgeTrd, material);
         
         Attribute moduleref = layerElement.getAttribute("module");
         
         if (moduleref == null)
-        	throw new RuntimeException("module reference is missing for layer number " + layerN);
+            throw new RuntimeException("module reference is missing for layer number " + layerN);
         
         ModuleParameters 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)
     {
         double r_size;
@@ -234,7 +236,7 @@
         {
             throw new RuntimeException(x);
         }
-
+        
         double phi_size_max;
         try
         {
@@ -244,7 +246,7 @@
         {
             throw new RuntimeException(x);
         }
-
+        
         Trapezoid moduleTrd = (Trapezoid)lcdd.getSolid(wedgeLV.getSolidRef());
         double dz = moduleTrd.z();
         double dx1 = moduleTrd.x1();
@@ -252,12 +254,12 @@
         double dy = moduleTrd.y1();
         double deltax = dx2 - dx1;
         double side_slope = deltax / (2*dz);
-
+        
         List<Double> zcenters = new ArrayList<Double>();
         List<Double> zsizes = new ArrayList<Double>();
         List<Double> xsizes1 = new ArrayList<Double>();
         List<Double> xsizes2 = new ArrayList<Double>();
-
+        
         {
             double zcurr = dz;
             while (zcurr - r_size >= -dz)
@@ -266,13 +268,13 @@
                 double zmin = zcurr-r_size;
                 zcenters.add((zmin+zmax)/2);
                 zsizes.add((zmax-zmin)/2);
-
+                
                 double xsize1 = dx1 + side_slope*(zmin+dz);
                 double xsize2 = dx1 + side_slope*(zmax+dz);
-
+                
                 xsizes1.add(xsize1);
                 xsizes2.add(xsize2);
-
+                
                 zcurr -= r_size;
             }
             double zmax = zcurr;
@@ -284,9 +286,9 @@
             xsizes1.add(xsize1);
             xsizes2.add(xsize2);
         }
-
+        
         Material sliceMaterial;
-        try 
+        try
         {
             sliceMaterial = lcdd.getMaterial("Air");
         }
@@ -294,17 +296,17 @@
         {
             throw new RuntimeException(x);
         }
-
+        
         double xsize1_min = 0.0;
         double xsize_box = 0.0;
         int nboxes = 0;
-
+        
         int imodule = 0;
-
+        
         for (int i=zcenters.size()-1; i >= 0; i--)
-        {   
+        {
             int ntraps = (int)Math.ceil(  2*(xsizes1.get(i) - nboxes*xsize_box) / phi_size_max );
-
+            
             // Squares to fill extra space
             if (ntraps > 2)
             {
@@ -312,131 +314,138 @@
                 nboxes++;
                 ntraps = 2;
             }
-
+            
             double xmin = -nboxes*xsize_box;
             double xmax = xmin+2*xsize_box;
-
+            
             for (int ibox = 0; ibox < nboxes; ibox++)
-            {   
+            {
                 double xcenter = (xmin+xmax)/2;
                 xmin += 2*xsize_box;
                 xmax += 2*xsize_box;
-
+                
                 String sliceName = subdetElement.getAttributeValue("name") + "_layer" + layerN + "_module" + imodule;
-
+                
                 // FIXME: Multiply by 2 to conform to GDML convention of dividing inputs by 2.
                 Box sliceBox = new Box(sliceName + "_box");
-                sliceBox.setX(xsize_box*2);
+                sliceBox.setX(xsize_box*2 - GeomOp3D.DISTANCE_TOLERANCE);
                 sliceBox.setY(dy*2);
-                sliceBox.setZ(zsizes.get(i)*2);
+                sliceBox.setZ(zsizes.get(i)*2 - GeomOp3D.DISTANCE_TOLERANCE);
                 lcdd.add(sliceBox);
-
+                
                 Volume sliceLV = new Volume(sliceName, sliceBox, sliceMaterial);
-
+                
                 // Make the box module.
                 makeBoxModule(sliceLV, module, lcdd);
-
+                
                 lcdd.add(sliceLV);
-
+                
                 Position p = new Position(sliceName + "_position");
                 p.setX(xcenter);
                 p.setZ(zcenters.get(i));
                 lcdd.add(p);
                 Rotation rot = new Rotation(sliceName + "_rotation");
                 lcdd.add(rot);
-
+                
                 PhysVol slicePV = new PhysVol(sliceLV, wedgeLV, p, rot);
                 slicePV.addPhysVolID("module", imodule);
-
+                
                 imodule++;
             }
-
+            
             // Small symmetric trapezoids
             if (ntraps == 1)
             {
                 String sliceName = subdetElement.getAttributeValue("name") + "_layer" + layerN + "_module" + imodule;
-
-                Trapezoid sliceTrd = new Trapezoid(sliceName+"_trapezoid", xsizes1.get(i), xsizes2.get(i), dy, dy, zsizes.get(i));
+                
+                Trapezoid sliceTrd = new Trapezoid(sliceName+"_trapezoid", 
+                        xsizes1.get(i) - GeomOp3D.DISTANCE_TOLERANCE, xsizes2.get(i) - GeomOp3D.DISTANCE_TOLERANCE, dy, dy, 
+                        zsizes.get(i) - GeomOp3D.DISTANCE_TOLERANCE);
                 lcdd.add(sliceTrd);
-
+                
                 Volume sliceLV = new Volume(sliceName, sliceTrd, sliceMaterial);
                 
                 makeTrdModule(sliceLV, module, lcdd);
                 
                 lcdd.add(sliceLV);
-
+                
                 Position p = new Position(sliceName + "_position");
                 p.setZ(zcenters.get(i));
                 lcdd.add(p);
-
+                
                 Rotation rot = new Rotation(sliceName + "_rotation");
                 lcdd.add(rot);
-
+                
                 PhysVol slicePV = new PhysVol(sliceLV, wedgeLV, p, rot);
                 slicePV.addPhysVolID("module", imodule);
-
+                
                 imodule++;
             }
-
+            
             // Split trapezoids
             if (ntraps == 2)
             {
-
+                
                 double xoffset = xsize_box*nboxes;
-
+                
                 double xsize1 = (xsizes1.get(i)-xoffset)/ntraps;
                 if (xsize1_min == 0.0) xsize1_min = xsize1;
                 double xsize2 = (xsizes2.get(i)-xoffset)/ntraps;
-
+                
                 double xcenter = (xsize1+xsize2)/2 + xoffset;
                 double theta = Math.abs(Math.atan(side_slope/2));
-
+                
                 for (int ix = -1; ix <=1; ix=ix+2)
                 {
                     String sliceName = subdetElement.getAttributeValue("name") + "_layer" + layerN + "_module" + imodule;
-
-                    Trap sliceTrap = new Trap(sliceName+"_trap",zsizes.get(i),theta*ix,0.0,dy,xsize1,xsize1,0.0,dy,xsize2,xsize2,0.0);
+                    
+                    Trap sliceTrap = new Trap(sliceName+"_trap",zsizes.get(i) - GeomOp3D.DISTANCE_TOLERANCE,
+                            theta*ix,0.0,dy,
+                            xsize1 - GeomOp3D.DISTANCE_TOLERANCE,xsize1 - GeomOp3D.DISTANCE_TOLERANCE,
+                            0.0,dy,
+                            xsize2 - GeomOp3D.DISTANCE_TOLERANCE,xsize2 - GeomOp3D.DISTANCE_TOLERANCE,0.0);
                     lcdd.add(sliceTrap);
-
+                    
                     Volume sliceLV = new Volume(sliceName, sliceTrap, sliceMaterial);
                     
                     makeTrapModule(sliceLV, module, lcdd);
                     
                     lcdd.add(sliceLV);
-
+                    
                     Position p = new Position(sliceName + "_position");
                     p.setX(ix*xcenter);
                     p.setZ(zcenters.get(i));
                     lcdd.add(p);
                     Rotation rot = new Rotation(sliceName + "_rotation");
                     lcdd.add(rot);
-
+                    
                     PhysVol slicePV = new PhysVol(sliceLV, wedgeLV, p, rot);
                     slicePV.addPhysVolID("module", imodule);
-
+                    
                     imodule++;
                 }
             }
         }
     }
-
+    
     void makeBoxModule(Volume moduleVolume, ModuleParameters moduleParameters, LCDD lcdd)
     {
         Box moduleBox = (Box)lcdd.getSolid(moduleVolume.getSolidRef());
-
+        
         double moduleX = moduleBox.getX();
         double posY = -(moduleBox.getY() / 2);
-        double moduleZ = moduleBox.getZ();    	
-
+        double moduleZ = moduleBox.getZ();
+        
         String moduleName = moduleVolume.getVolumeName();
-
+        
         int sensor=0;
         
         for (ModuleComponentParameters component : moduleParameters)
         {
             double thickness = component.getThickness();
             Material material = null;
-            try {
+            try
+            {
                 material = lcdd.getMaterial(component.getMaterialName());
             }
             catch (JDOMException x)
@@ -445,18 +454,18 @@
             }
             boolean sensitive = component.isSensitive();
             int componentNumber = component.getComponentNumber();
-
+            
             posY += thickness / 2;
-
+            
             String componentName = moduleName + "_component" + componentNumber;
-
+            
             Box sliceBox = new Box(componentName + "_box", moduleX, thickness, moduleZ);
             lcdd.add(sliceBox);
-
+            
             Volume volume = new Volume(componentName, sliceBox, material);
             lcdd.add(volume);
-
-            Position position = new Position(componentName + "_position", 0., posY, 0.); 
+            
+            Position position = new Position(componentName + "_position", 0., posY, 0.);
             lcdd.add(position);
             Rotation rotation = new Rotation(componentName + "_rotation");
             rotation.setY(Math.PI);
@@ -473,32 +482,33 @@
                 volume.setSensitiveDetector(this.sd);
                 pv.addPhysVolID("sensor", sensor);
                 ++sensor;
-            }            
-           
+            }
+            
             posY += thickness / 2;
-        }    	
+        }
     }
-
+    
     void makeTrdModule(Volume moduleVolume, ModuleParameters moduleParameters, 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 (ModuleComponentParameters component : moduleParameters)
         {
             double thickness = component.getThickness();
-
+            
             Material material = null;
-            try {
+            try
+            {
                 material = lcdd.getMaterial(component.getMaterialName());
             }
             catch (JDOMException x)
@@ -506,26 +516,26 @@
                 throw new RuntimeException(x);
             }
             boolean sensitive = component.isSensitive();
-            int componentNumber = component.getComponentNumber();            
-
+            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)
@@ -536,15 +546,15 @@
                 volume.setSensitiveDetector(this.sd);
                 ++sensor;
             }
-
+            
             posY += thickness / 2;
-        }   
+        }
     }
-
+    
     public void makeTrapModule(Volume module, ModuleParameters moduleParameters, LCDD lcdd)
     {
         Trap trap = (Trap)lcdd.getSolid(module.getSolidRef());
-
+        
         double a1 = trap.getAlpha1();
         double a2 = trap.getAlpha2();
         double x1 = trap.getXHalfLength1();
@@ -555,16 +565,17 @@
         double z = trap.getZHalfLength();
         double theta = trap.getTheta();
         double phi = trap.getPhi();
-
+        
         double posY = -y1;
-
+        
         int sensor = 0;
         
         for (ModuleComponentParameters component : moduleParameters)
         {
             double thickness = component.getThickness();
             Material material = null;
-            try {
+            try
+            {
                 material = lcdd.getMaterial(component.getMaterialName());
             }
             catch (JDOMException x)
@@ -573,22 +584,22 @@
             }
             boolean sensitive = component.isSensitive();
             int componentNumber = component.getComponentNumber();
-
+            
             posY += thickness / 2;
-
-            String componentName = module.getVolumeName() + "_component" + componentNumber;    
-
+            
+            String componentName = module.getVolumeName() + "_component" + componentNumber;
+            
             Trap sliceTrap = new Trap(componentName + "_trap", z, theta, phi, thickness/2, x1, x2, a1, thickness/2, x3, x4, a2);
             lcdd.add(sliceTrap);
-
+            
             Volume volume = new Volume(componentName, sliceTrap, 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, module, position, rotation);
             pv.addPhysVolID("component", componentNumber);
             
@@ -601,17 +612,17 @@
                 volume.setSensitiveDetector(this.sd);
                 pv.addPhysVolID("sensor", sensor);
                 ++sensor;
-            }           
-
+            }
+            
             posY += thickness / 2;
-        }   
+        }
     }
-
+    
     public boolean isTracker()
     {
         return true;
     }
-
+    
     // FIXME: Duplicates class in org.lcsim.detector.converter.compact.SiTrackerEndcapConverter to avoid dependency.
     public static class ModuleComponentParameters
     {
@@ -619,7 +630,7 @@
         double thickness;
         boolean sensitive;
         int componentNumber;
-
+        
         public ModuleComponentParameters(double thickness, String materialName, int componentNumber, boolean sensitive)
         {
             this.thickness = thickness;
@@ -627,31 +638,31 @@
             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.       
+    
+    // FIXME: Duplicates class in org.lcsim.detector.converter.compact.SiTrackerEndcapConverter to avoid dependency.
     public static class ModuleParameters
-    extends ArrayList<ModuleComponentParameters>
+            extends ArrayList<ModuleComponentParameters>
     {
         double thickness=0.;
         String name;
@@ -661,14 +672,15 @@
             int cntr=0;
             for (Object o : element.getChildren("module_component"))
             {
-                try {
-
+                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();
@@ -682,7 +694,7 @@
             }
             calculateThickness();
         }
-
+        
         public void calculateThickness()
         {
             thickness = 0.; // reset thickness
@@ -691,11 +703,11 @@
                 thickness += p.getThickness();
             }
         }
-
+        
         public double getThickness()
         {
             return thickness;
         }
     }
-
+    
 }
\ No newline at end of file
CVSspam 0.2.8