Commit in GeomConverter/src/org/lcsim on MAIN
geometry/compact/converter/lcdd/SiTrackerEndcap.java+175-1481.15 -> 1.16
detector/converter/compact/SiTrackerEndcapConverter.java+82-601.28 -> 1.29
+257-208
2 modified files
SiTrackerEndcap goes to college.

GeomConverter/src/org/lcsim/geometry/compact/converter/lcdd
SiTrackerEndcap.java 1.15 -> 1.16
diff -u -r1.15 -r1.16
--- SiTrackerEndcap.java	3 Dec 2008 00:53:45 -0000	1.15
+++ SiTrackerEndcap.java	3 Feb 2009 23:36:16 -0000	1.16
@@ -27,23 +27,23 @@
 {
     Map<String,SiTrackerModuleParameters> moduleParameters = new HashMap<String,SiTrackerModuleParameters>();
     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 SiTrackerModuleParameters(e));
+            Element e = (Element)n;
+            moduleParameters.put(e.getAttributeValue("name"), new SiTrackerModuleParameters(e));
         }
         
         int sysId = node.getAttribute("id").getIntValue();
@@ -51,8 +51,8 @@
         
         for (Object o : node.getChildren("layer"))
         {
-            Element layerElement = (Element)o;           
-
+            Element layerElement = (Element)o;
+            
             int nwedges;
             try
             {
@@ -62,7 +62,7 @@
             {
                 throw new RuntimeException(x);
             }
-
+            
             double innerR, outerR, innerZ, thickness;
             int layerN;
             try
@@ -71,33 +71,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);
@@ -110,49 +110,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++)
@@ -160,34 +161,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");
         }
@@ -195,10 +196,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;
@@ -206,25 +207,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);
         
         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, SiTrackerModuleParameters module, int layerN, LCDD lcdd)
     {
         double r_size;
@@ -236,7 +237,7 @@
         {
             throw new RuntimeException(x);
         }
-
+        
         double phi_size_max;
         try
         {
@@ -246,7 +247,7 @@
         {
             throw new RuntimeException(x);
         }
-
+        
         Trapezoid moduleTrd = (Trapezoid)lcdd.getSolid(wedgeLV.getSolidRef());
         double dz = moduleTrd.z();
         double dx1 = moduleTrd.x1();
@@ -254,27 +255,27 @@
         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)
+            while (zcurr - r_size > -dz)
             {
                 double zmax = zcurr;
                 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;
@@ -286,9 +287,9 @@
             xsizes1.add(xsize1);
             xsizes2.add(xsize2);
         }
-
+        
         Material sliceMaterial;
-        try 
+        try
         {
             sliceMaterial = lcdd.getMaterial("Air");
         }
@@ -296,149 +297,173 @@
         {
             throw new RuntimeException(x);
         }
-
-        double xsize1_min = 0.0;
+        
+        double zsize_last = 0.0;
+        double xsize1_min = phi_size_max/2;
         double xsize_box = 0.0;
         int nboxes = 0;
-
+        
         int imodule = 0;
-
+        
         for (int i=zcenters.size()-1; i >= 0; i--)
-        {   
+        {
+            
+            if (zsizes.get(i) != zsize_last)
+            {
+                zsize_last = zsizes.get(i);
+                xsize1_min = phi_size_max/2;
+                xsize_box = 0.0;
+                nboxes = 0;
+            }
+            
             int ntraps = (int)Math.ceil(  2*(xsizes1.get(i) - nboxes*xsize_box) / phi_size_max );
-
+            
             // Squares to fill extra space
             if (ntraps > 2)
             {
-                if (xsize_box == 0.0) xsize_box = xsizes1.get(i) - 2*xsize1_min;
-                nboxes++;
+                double delta_x = xsizes2.get(i) - xsizes1.get(i);
+
+                if (phi_size_max > delta_x)
+                {
+                    xsize_box = delta_x*(int)Math.floor(phi_size_max/delta_x);
+                }
+                else
+                {
+                    xsize_box = delta_x/(int)Math.floor(delta_x/phi_size_max);
+                }
+
+                if (xsize_box > 0.0)
+                {
+                    nboxes = (int)Math.floor((xsizes1.get(i)-2*xsize1_min)/xsize_box);
+                }
                 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.setY(dy*2);
                 sliceBox.setZ(zsizes.get(i)*2);
                 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));
                 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);
                     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, SiTrackerModuleParameters 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 (SiTrackerModuleComponentParameters component : moduleParameters)
         {
             double thickness = component.getThickness();
             Material material = null;
-            try {
+            try
+            {
                 material = lcdd.getMaterial(component.getMaterialName());
             }
             catch (JDOMException x)
@@ -447,18 +472,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);
@@ -475,32 +500,33 @@
                 volume.setSensitiveDetector(this.sd);
                 pv.addPhysVolID("sensor", sensor);
                 ++sensor;
-            }            
-           
+            }
+            
             posY += thickness / 2;
-        }    	
+        }
     }
-
+    
     void makeTrdModule(Volume moduleVolume, SiTrackerModuleParameters 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 (SiTrackerModuleComponentParameters component : moduleParameters)
         {
             double thickness = component.getThickness();
-
+            
             Material material = null;
-            try {
+            try
+            {
                 material = lcdd.getMaterial(component.getMaterialName());
             }
             catch (JDOMException x)
@@ -508,26 +534,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)
@@ -538,15 +564,15 @@
                 volume.setSensitiveDetector(this.sd);
                 ++sensor;
             }
-
+            
             posY += thickness / 2;
-        }   
+        }
     }
-
+    
     public void makeTrapModule(Volume module, SiTrackerModuleParameters moduleParameters, LCDD lcdd)
     {
         Trap trap = (Trap)lcdd.getSolid(module.getSolidRef());
-
+        
         double a1 = trap.getAlpha1();
         double a2 = trap.getAlpha2();
         double x1 = trap.getXHalfLength1();
@@ -557,16 +583,17 @@
         double z = trap.getZHalfLength();
         double theta = trap.getTheta();
         double phi = trap.getPhi();
-
+        
         double posY = -y1;
-
+        
         int sensor = 0;
         
         for (SiTrackerModuleComponentParameters component : moduleParameters)
         {
             double thickness = component.getThickness();
             Material material = null;
-            try {
+            try
+            {
                 material = lcdd.getMaterial(component.getMaterialName());
             }
             catch (JDOMException x)
@@ -575,22 +602,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);
             
@@ -603,12 +630,12 @@
                 volume.setSensitiveDetector(this.sd);
                 pv.addPhysVolID("sensor", sensor);
                 ++sensor;
-            }           
-
+            }
+            
             posY += thickness / 2;
-        }   
+        }
     }
-
+    
     public boolean isTracker()
     {
         return true;

GeomConverter/src/org/lcsim/detector/converter/compact
SiTrackerEndcapConverter.java 1.28 -> 1.29
diff -u -r1.28 -r1.29
--- SiTrackerEndcapConverter.java	3 Dec 2008 00:53:45 -0000	1.28
+++ SiTrackerEndcapConverter.java	3 Feb 2009 23:36:16 -0000	1.29
@@ -59,28 +59,28 @@
  * Converter for SiTrackerEndcap.
  *
  * @author Jeremy McCormick, Tim Nelson
- * @version $Id: SiTrackerEndcapConverter.java,v 1.28 2008/12/03 00:53:45 jeremy Exp $
+ * @version $Id: SiTrackerEndcapConverter.java,v 1.29 2009/02/03 23:36:16 tknelson Exp $
  */
 
 public class SiTrackerEndcapConverter
         extends AbstractSubdetectorConverter
         implements ISubdetectorConverter
 {
-	public SiTrackerEndcapConverter()
-	{}
+    public SiTrackerEndcapConverter()
+    {}
     
     public IIdentifierHelper makeIdentifierHelper(Subdetector subdetector, SystemMap systemMap)
     {
         return new SiTrackerIdentifierHelper(
-        		subdetector.getDetectorElement(),
-        		makeIdentifierDictionary(subdetector), 
-        		systemMap);
+                subdetector.getDetectorElement(),
+                makeIdentifierDictionary(subdetector),
+                systemMap);
     }
-	    
+    
     public void convert(Subdetector subdet, Detector detector)
-    {    	    
-    	Map<String, SiTrackerModuleParameters> moduleParameters = new HashMap<String, SiTrackerModuleParameters>();
-    	
+    {
+        Map<String, SiTrackerModuleParameters> moduleParameters = new HashMap<String, SiTrackerModuleParameters>();
+        
         IPhysicalVolume trackingPV = detector.getTrackingVolume();
         ILogicalVolume trackingLV = trackingPV.getLogicalVolume();
         
@@ -117,10 +117,10 @@
         
         // Set static module parameters.
         for (Object n : node.getChildren("module"))
-        {        	
-        	Element e = (Element)n; 
-        	moduleParameters.put(e.getAttributeValue("name"), new SiTrackerModuleParameters(e));
-        }        
+        {
+            Element e = (Element)n;
+            moduleParameters.put(e.getAttributeValue("name"), new SiTrackerModuleParameters(e));
+        }
         
         for (Object o : node.getChildren("layer"))
         {
@@ -180,12 +180,12 @@
                 // Negative endcap.
                 String wedgePathReflect = layerPathReflect + "/" + wedge.getName();
                 String wedgeNameReflect = layerNameReflect + "_wedge" + wedge.getCopyNumber();
-                IDetectorElement wedgeDEReflect = 
-                    new DetectorElement(
-                            wedgeNameReflect,
-                            layerDEReflect,
-                            detector.getNavigator().getPath(wedgePathReflect)
-                            );
+                IDetectorElement wedgeDEReflect =
+                        new DetectorElement(
+                        wedgeNameReflect,
+                        layerDEReflect,
+                        detector.getNavigator().getPath(wedgePathReflect)
+                        );
                 
                 // Module DEs.
                 for (IPhysicalVolume module : wedge.getLogicalVolume().getDaughters())
@@ -193,8 +193,8 @@
                     // Positive endcap module.
                     String modulePath = wedgePath + "/" + module.getName();
                     String moduleName = wedgeName + "_module" + module.getCopyNumber();
-                    IDetectorElement moduleDE = 
-                        new SiTrackerModule(
+                    IDetectorElement moduleDE =
+                            new SiTrackerModule(
                             moduleName,
                             wedgeDE,
                             detector.getNavigator().getPath(modulePath).toString(),
@@ -203,13 +203,13 @@
                     // Negative endcap module.
                     String modulePathReflect = wedgePathReflect + "/" + module.getName();
                     String moduleNameReflect = wedgeNameReflect + "_module" + module.getCopyNumber();
-                    IDetectorElement moduleDEReflect = 
-                        new SiTrackerModule(
+                    IDetectorElement moduleDEReflect =
+                            new SiTrackerModule(
                             moduleNameReflect,
                             wedgeDEReflect,
                             detector.getNavigator().getPath(modulePathReflect).toString(),
                             module.getCopyNumber()
-                            );                    
+                            );
                 }
             }
         }
@@ -221,7 +221,7 @@
         catch (Exception x)
         {
             throw new RuntimeException(x);
-        }        
+        }
     }
     
     private ILogicalVolume makeWedge(
@@ -293,7 +293,7 @@
         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);
         
         SiTrackerModuleParameters module = moduleParameters.get(moduleref.getValue());
         
@@ -361,7 +361,7 @@
         
         {
             double zcurr = dz;
-            while (zcurr - r_size >= -dz)
+            while (zcurr - r_size > -dz)
             {
                 double zmax = zcurr;
                 double zmin = zcurr-r_size;
@@ -388,7 +388,8 @@
         
         IMaterial sliceMaterial = wedgeLV.getMaterial();
         
-        double xsize1_min = 0.0;
+        double zsize_last = 0.0;
+        double xsize1_min = phi_size_max/2;
         double xsize_box = 0.0;
         int nboxes = 0;
         
@@ -397,13 +398,34 @@
         for (int i=zcenters.size()-1; i >= 0; i--)
         {
             
-            int ntraps = (int)Math.ceil(  2*(xsizes1.get(i) - nboxes*xsize_box) / phi_size_max );            
+            if (zsizes.get(i) != zsize_last)
+            {
+                zsize_last = zsizes.get(i);
+                xsize1_min = phi_size_max/2;
+                xsize_box = 0.0;
+                nboxes = 0;
+            }
+            
+            int ntraps = (int)Math.ceil(  2*(xsizes1.get(i) - nboxes*xsize_box) / phi_size_max );
             
             // Squares to fill extra space
             if (ntraps > 2)
             {
-                if (xsize_box == 0.0) xsize_box = xsizes1.get(i) - 2*xsize1_min;
-                nboxes++;
+                double delta_x = xsizes2.get(i) - xsizes1.get(i);
+
+                if (phi_size_max > delta_x)
+                {
+                    xsize_box = delta_x*(int)Math.floor(phi_size_max/delta_x);
+                }
+                else
+                {
+                    xsize_box = delta_x/(int)Math.floor(delta_x/phi_size_max);
+                }
+
+                if (xsize_box > 0.0)
+                {
+                    nboxes = (int)Math.floor((xsizes1.get(i)-2*xsize1_min)/xsize_box);
+                }
                 ntraps = 2;
             }
             
@@ -578,7 +600,7 @@
         double y1 = trap.getYHalfLength1();
         double z = trap.getZHalfLength();
         double theta = trap.getTheta();
-        double phi = trap.getPhi();        
+        double phi = trap.getPhi();
         double posY = -y1;
         
         for (SiTrackerModuleComponentParameters component : moduleParameters)
@@ -649,7 +671,7 @@
                                 
                                 // Set the System ID.
                                 expId.setValue(iddict.getFieldIndex("system"), subdet.getSystemID());
-                                    
+                                
                                 // Set the barrel-endcap flag.
                                 if (id_helper.isEndcapPositive(endcap.getIdentifier()))
                                 {
@@ -663,30 +685,30 @@
                                 {
                                     throw new RuntimeException(endcap.getName() + " - not pos or neg endcap!");
                                 }
-
+                                
                                 //System.out.println("barrel flag set to " + expId.getValue(iddict.getFieldIndex("barrel")));
-
+                                
                                 // 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"),((SiTrackerModule)module).getModuleId());
-
+                                
                                 // Set the sensor id for double-sided.
                                 expId.setValue(iddict.getFieldIndex("sensor"),sensorId);
-
+                                
                                 // Create the packed id using util method.
                                 // No IdentifierHelper is available yet.
                                 IIdentifier id = IdentifierUtil.pack( iddict, expId );
-
+                                
                                 String sensorPath = modulePath.toString() + "/" + pv.getName();
                                 String sensorName = endcap.getName() +
-                                "_layer" + layer.getGeometry().getPhysicalVolume().getCopyNumber() +
-                                "_wedge" +  wedge.getGeometry().getPath().getLeafVolume().getCopyNumber() +
-                                "_module" + ((SiTrackerModule)module).getModuleId() + "_sensor" + sensorId;
+                                        "_layer" + layer.getGeometry().getPhysicalVolume().getCopyNumber() +
+                                        "_wedge" +  wedge.getGeometry().getPath().getLeafVolume().getCopyNumber() +
+                                        "_module" + ((SiTrackerModule)module).getModuleId() + "_sensor" + sensorId;
                                 
                                 //System.out.println(sensorName + " -> " + expId);
                                 //System.out.println(sensorName + " -> " + id);
@@ -742,11 +764,11 @@
                                 
                                 ITranslation3D electrodes_position = new Translation3D(VecOp.mult(-p_side.getDistance(),new BasicHep3Vector(0,0,1)));  // translate to outside of polygon
                                 IRotation3D electrodes_rotation = new RotationPassiveXYZ(side*(Math.PI/2),0,strip_angle);          //
-                                Transform3D electrodes_transform = new Transform3D(electrodes_position, electrodes_rotation);                                
+                                Transform3D electrodes_transform = new Transform3D(electrodes_position, electrodes_rotation);
                                 
                                 // Free calculation of readout electrodes, sense electrodes determined thereon
                                 SiSensorElectrodes readout_electrodes = new SiStrips(ChargeCarrier.HOLE,0.050,sensor,electrodes_transform);
-                                SiSensorElectrodes sense_electrodes = new SiStrips(ChargeCarrier.HOLE,0.025,(readout_electrodes.getNCells()*2-1),sensor,electrodes_transform);                                                                
+                                SiSensorElectrodes sense_electrodes = new SiStrips(ChargeCarrier.HOLE,0.025,(readout_electrodes.getNCells()*2-1),sensor,electrodes_transform);
                                 
                                 sensor.setSenseElectrodes(sense_electrodes);
                                 sensor.setReadoutElectrodes(readout_electrodes);
@@ -757,7 +779,7 @@
                                 // Increment sensorID for double-sided.
                                 ++sensorId;
                             }
-                        }                        
+                        }
                         ++moduleId;
                     }
                 }
@@ -772,7 +794,7 @@
         double thickness;
         boolean sensitive;
         int componentNumber;
-        
+     
         public ModuleComponentParameters(double thickness, String materialName, int componentNumber, boolean sensitive)
         {
             this.thickness = thickness;
@@ -780,28 +802,28 @@
             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;
         }
     }
-    
+     
     public static class ModuleParameters
             extends ArrayList<ModuleComponentParameters>
     {
@@ -815,13 +837,13 @@
             {
                 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();
@@ -835,7 +857,7 @@
             }
             calculateThickness();
         }
-        
+     
         public void calculateThickness()
         {
             thickness = 0.; // reset thickness
@@ -844,11 +866,11 @@
                 thickness += p.getThickness();
             }
         }
-        
+     
         public double getThickness()
         {
             return thickness;
         }
     }
-    */
+     */
 }
CVSspam 0.2.8