Commit in GeomConverter/src/org/lcsim/detector/converter/compact on MAIN
SiTrackerEndcapConverter.java+226-711.3 -> 1.4
Completed endcap geometry conversion.  Still needs material and sensors added.

GeomConverter/src/org/lcsim/detector/converter/compact
SiTrackerEndcapConverter.java 1.3 -> 1.4
diff -u -r1.3 -r1.4
--- SiTrackerEndcapConverter.java	17 Oct 2007 17:48:40 -0000	1.3
+++ SiTrackerEndcapConverter.java	18 Oct 2007 06:37:21 -0000	1.4
@@ -18,7 +18,9 @@
 import org.lcsim.detector.Translation3D;
 import org.lcsim.detector.material.IMaterial;
 import org.lcsim.detector.solids.Trd;
+import org.lcsim.detector.solids.Trap;
 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;
@@ -27,25 +29,26 @@
  * Converter for SiTrackerEndcap.
  *
  * @author Jeremy McCormick
- * @version $Id: SiTrackerEndcapConverter.java,v 1.3 2007/10/17 17:48:40 jeremy Exp $
+ * @version $Id: SiTrackerEndcapConverter.java,v 1.4 2007/10/18 06:37:21 tknelson Exp $
  */
 
 public class SiTrackerEndcapConverter
-implements ISubdetectorConverter
-{    
-	public void convert(Subdetector subdet, Detector detector) 
-	{        
+        implements ISubdetectorConverter
+{
+    public void convert(Subdetector subdet, Detector detector)
+    {
         IPhysicalVolume trackingPV = detector.getTrackingVolume();
-        ILogicalVolume trackingLV = trackingPV.getLogicalVolume();        
-                        
+        ILogicalVolume trackingLV = trackingPV.getLogicalVolume();
+        
         Element node = subdet.getNode();
-                               
+        
         for (Object o : node.getChildren("layer"))
         {
             Element layerElement = (Element)o;
-                        
+            
             int nwedges;
-            try {
+            try
+            {
                 nwedges = layerElement.getAttribute("nwedges").getIntValue();
             }
             catch (DataConversionException x)
@@ -55,7 +58,8 @@
             
             double innerR, outerR, innerZ, thickness;
             int layern;
-            try {
+            try
+            {
                 layern = layerElement.getAttribute("id").getIntValue();
                 innerR = layerElement.getAttribute("inner_r").getDoubleValue();
                 outerR = layerElement.getAttribute("outer_r").getDoubleValue();
@@ -70,23 +74,23 @@
             ILogicalVolume layerLV = makeLayer(detector,subdet,innerR,outerR,thickness,nwedges,layerElement);
             
             double layerZ = innerZ + thickness / 2;
-                        
+            
             // Layer PV.
             ITransform3D layerTrans = new Transform3D(new Translation3D(0,0,layerZ));
             
             String layerName = layerLV.getName();
             
             new PhysicalVolume(layerTrans,layerName,layerLV,trackingLV,layern);
-                        
+            
             // Layer DE.
-            String layerPath = "/" + trackingPV.getName() + "/" + layerName;                                    
+            String layerPath = "/" + trackingPV.getName() + "/" + layerName;
             IDetectorElement layerDE = new DetectorElement(layerLV.getName(),null,detector.getNavigator().getPath(layerPath));
             
             //System.out.println(layerDE.getName() + " -> " + layerPath);
             
             // Wedge DE.
             for (IPhysicalVolume wedge : layerLV.getDaughters())
-            {                
+            {
                 String wedgePath = layerPath + "/" + wedge.getName();
                 String wedgeName = subdet.getName() + "_layer" + layern + "_wedge" + wedge.getCopyNumber();
                 //System.out.println(wedgeName + " -> " + wedgePath);
@@ -98,19 +102,19 @@
                     String modulePath = wedgePath + "/" + module.getName();
                     String moduleName = layerName + "_wedge" + wedge.getCopyNumber() + "_module" + module.getCopyNumber();
                     //System.out.println(moduleName + " -> " + modulePath);
-                    new DetectorElement(moduleName,wedgeDE,detector.getNavigator().getPath(modulePath));                    
+                    new DetectorElement(moduleName,wedgeDE,detector.getNavigator().getPath(modulePath));
                 }
             }
-        }                
-	}
-            
+        }
+    }
+    
     private ILogicalVolume makeWedge(
-            Detector detector, 
-            Subdetector subdet, 
-            double innerR, 
-            double outerR, 
-            double thickness, 
-            int nwedges, 
+            Detector detector,
+            Subdetector subdet,
+            double innerR,
+            double outerR,
+            double thickness,
+            int nwedges,
             int layern)
     {
         IMaterial material = detector.getTrackingVolume().getLogicalVolume().getMaterial();
@@ -122,20 +126,20 @@
         dy1 = dy2 = thickness / 2;
         double dx1, dx2;
         double dphi = Math.PI / nwedges;
-        dx1 = innerR * Math.tan(dphi);
-        dx2 = outerR * Math.tan(dphi);
+        dx1 = outerR * Math.tan(dphi);
+        dx2 = innerR * Math.tan(dphi);
         
         Trd wedgeTrd = new Trd(name,dx1,dx2,dy1,dy2,dz);
         
         ILogicalVolume wedgeLV = new LogicalVolume(name, wedgeTrd, material);
-                           
+        
         return wedgeLV;
     }
-        
+    
     private ILogicalVolume makeLayer(
             Detector detector,
             Subdetector subdet,
-            double innerR, 
+            double innerR,
             double outerR,
             double thickness,
             int nwedges,
@@ -143,7 +147,8 @@
             )
     {
         int layern;
-        try {
+        try
+        {
             layern = layerElement.getAttribute("id").getIntValue();
         }
         catch (DataConversionException x)
@@ -155,14 +160,14 @@
         String layerName = subdet.getName() + "_layer" + layern;
         
         double dphi = Math.PI / nwedges;
-                
+        
         double tubeInnerR, tubeOuterR;
         tubeInnerR = innerR;
         tubeOuterR = outerR / Math.cos(dphi);
         
         Tube layerTube = new Tube(layerName,tubeInnerR,tubeOuterR,thickness/2);
         
-        // Make the layer LV.        
+        // Make the layer LV.
         ILogicalVolume layerLV = new LogicalVolume(layerName,layerTube,material);
         
         // Make the wedge LV.
@@ -173,15 +178,15 @@
         
         // 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;
             double x = r * Math.cos(phi);
             double y = r * Math.sin(phi);
-                
+            
             Translation3D p = new Translation3D(x,y,0);
-            Rotation3D rot = new RotationPassiveXYZ(-Math.PI/2,0.,Math.PI/2 - phi);
+            Rotation3D rot = new RotationPassiveXYZ(-Math.PI/2,0.,-Math.PI/2 - phi);
             Transform3D transform = new Transform3D(p,rot);
             new PhysicalVolume(
                     transform,
@@ -197,8 +202,9 @@
     
     private void makeModules(Subdetector subdet, ILogicalVolume wedgeLV, Element moduleElement, int layern)
     {
-        double r_size;        
-        try {
+        double r_size;
+        try
+        {
             r_size = moduleElement.getAttribute("r_size").getDoubleValue();
         }
         catch (DataConversionException x)
@@ -207,7 +213,8 @@
         }
         
         double phi_size_max;
-        try {
+        try
+        {
             phi_size_max = moduleElement.getAttribute("phi_size_max").getDoubleValue();
         }
         catch (DataConversionException x)
@@ -217,64 +224,212 @@
         
         Trd moduleTrd = (Trd)wedgeLV.getSolid();
         double dz = ((Trd)wedgeLV.getSolid()).getZHalfLength();
+//        System.out.println("\n" + "dz: "+dz);
         double dx1 = moduleTrd.getXHalfLength1();
+//        System.out.println("dx1: "+dx1);
         double dx2 = moduleTrd.getXHalfLength2();
-        double dy1 = moduleTrd.getYHalfLength1();
+//        System.out.println("dx2: "+dx2);
+        double dy = moduleTrd.getYHalfLength1();
+//        System.out.println("dy: "+dy);
         double deltax = dx1 - dx2;
-        double zcurr = -dz;
+//        System.out.println("deltax: "+deltax);
+        double side_slope = deltax/(2*dz);
+//        System.out.println("side_slope: "+side_slope);
+//        System.out.println("r_size: "+r_size);
+        
+//        System.out.println("\n");
         
         List<Double> zcenters = new ArrayList<Double>();
         List<Double> zsizes = new ArrayList<Double>();
         List<Double> xsizes1 = new ArrayList<Double>();
         List<Double> xsizes2 = new ArrayList<Double>();
         
-        while (zcurr + r_size <= dz)
         {
-            zcenters.add(zcurr + r_size/2);
-            zsizes.add(r_size/2);
-            double xsize1 = dx2 + (zcurr + dz)/(2*dz) * deltax; 
-            xsizes2.add(xsize1);
-            double xsize2 = dx2 + (zcurr + r_size + dz)/(2*dz) * deltax;
-            xsizes1.add(xsize2);
-            zcurr += r_size;            
+            double zcurr = 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 = dx2 + side_slope*(zmax+dz);
+                double xsize2 = dx2 + side_slope*(zmin+dz);
+                
+                xsizes1.add(xsize1);
+                xsizes2.add(xsize2);
+                
+                zcurr -= r_size;
+            }
+            double zmax = zcurr;
+            double zmin = -dz;
+            zcenters.add((zmin+zmax)/2);
+            zsizes.add((zmax-zmin)/2);
+            double xsize1 = dx2 + side_slope*(zmax+dz);
+            double xsize2 = dx2 + side_slope*(zmin+dz);
+            xsizes1.add(xsize1);
+            xsizes2.add(xsize2);
         }
-        zsizes.add((dz - zcurr) / 2);
-        zcenters.add(dz - (dz - zcurr) / 2);
-        xsizes2.add(dx2 + (zcurr + dz)/(2*dz) * deltax);
-        xsizes1.add(dx1);
+        
+//        System.out.println("zcenters: "+zcenters);
+//        System.out.println("zsizes: "+zsizes);
+//        System.out.println("xsizes1: "+xsizes1);
+//        System.out.println("xsizes2: "+xsizes2);
         
         IMaterial sliceMaterial = wedgeLV.getMaterial();
         
-        for (int i=zcenters.size(); i >= 0; i-- )
-        {
-            int nxslices = 1;
-        }
         
-            
-        /*
-        for (int i=0; i<zcenters.size(); i++)
+//        int nxslices = 1;
+        
+        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--)
         {
-            //String sliceName = subdet.getName() + "_layer" + layern + "_" + wedgeLV.getName() + "_module" + i;
-            String sliceName = "module" + i;
             
-            Trd sliceTrd = new Trd(sliceName,xsizes1.get(i),xsizes2.get(i),dy1,dy1,zsizes.get(i));
+            int ntraps = (int)Math.ceil(  2*(xsizes1.get(i) - nboxes*xsize_box) / phi_size_max );
             
-            ILogicalVolume sliceLV = new LogicalVolume(sliceName, sliceTrd, sliceMaterial);
             
-            Transform3D trans = new Transform3D(new Translation3D(0,0,zcenters.get(i)));
+            // Squares to fill extra space
+            if (ntraps > 2)
+            {
+                if (xsize_box == 0.0) xsize_box = xsizes1.get(i) - 2*xsize1_min;
+                nboxes++;
+                ntraps = 2;
+            }
             
-            new PhysicalVolume(
+            System.out.println("nboxes: "+nboxes);
+            
+            double xmin = -nboxes*xsize_box;
+            double xmax = xmin+2*xsize_box;
+            
+            for (int ibox = 0; ibox < nboxes; ibox++)
+            {
+                System.out.println("ibox: "+ibox);
+                
+                double xcenter = (xmin+xmax)/2;
+                xmin += 2*xsize_box;
+                xmax += 2*xsize_box;
+                
+                String sliceName = "module" + imodule;
+                
+                System.out.println("sliceName: "+sliceName);
+                
+                Box sliceBox = new Box(sliceName,xsize_box,dy,zsizes.get(i));
+                
+                ILogicalVolume sliceLV = new LogicalVolume(sliceName, sliceBox, sliceMaterial);
+                
+                Transform3D trans = new Transform3D(new Translation3D(xcenter,0,zcenters.get(i)));
+                
+                new PhysicalVolume(
+                        trans,
+                        sliceName,
+                        sliceLV,
+                        wedgeLV,
+                        imodule);
+                
+                imodule++;
+            }
+  
+            // Small symmetric trapezoids
+            if (ntraps == 1)
+            {
+                String sliceName = "module" + imodule;
+                
+                System.out.println("sliceName: "+sliceName);
+                
+                Trd sliceTrd = new Trd(sliceName,xsizes1.get(i),xsizes2.get(i),dy,dy,zsizes.get(i));
+                
+                ILogicalVolume sliceLV = new LogicalVolume(sliceName, sliceTrd, sliceMaterial);
+                
+                Transform3D trans = new Transform3D(new Translation3D(0,0,zcenters.get(i)));
+                
+                new PhysicalVolume(
                         trans,
                         sliceName,
                         sliceLV,
                         wedgeLV,
-                        i);            
+                        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;
+                
+                System.out.println("xsize1: "+xsize1);
+                System.out.println("xsize2: "+xsize2);
+                System.out.println("xsize1_min: "+xsize1_min);
+                
+                double xcenter = (xsize1+xsize2)/2 + xoffset;
+                double theta = Math.abs(Math.atan(side_slope/2));
+                
+                for (int ix = -1; ix <=1; ix=ix+2)
+                {
+                    
+                    System.out.println("ix: "+ix);
+                    
+                    String sliceName = "module" + imodule;
+                    
+                    System.out.println("sliceName: "+sliceName);
+                    
+                    Trap sliceTrap = new Trap(sliceName,zsizes.get(i),theta*ix,0.0,dy,xsize2,xsize2,0.0,dy,xsize1,xsize1,0.0);
+                    
+                    ILogicalVolume sliceLV = new LogicalVolume(sliceName, sliceTrap, sliceMaterial);
+                    
+                    Transform3D trans = new Transform3D(new Translation3D(ix*xcenter,0,zcenters.get(i)));
+                    
+                    new PhysicalVolume(
+                            trans,
+                            sliceName,
+                            sliceLV,
+                            wedgeLV,
+                            imodule);
+                    
+                    imodule++;
+                }
+            }
+            
+            
+            
+            
         }
-        */
+        
+        
+        
+//        for (int i=0; i<zcenters.size(); i++)
+//        {
+//            //String sliceName = subdet.getName() + "_layer" + layern + "_" + wedgeLV.getName() + "_module" + i;
+//            String sliceName = "module" + i;
+//
+//            Trd sliceTrd = new Trd(sliceName,xsizes1.get(i),xsizes2.get(i),dy,dy,zsizes.get(i));
+//
+//            ILogicalVolume sliceLV = new LogicalVolume(sliceName, sliceTrd, sliceMaterial);
+//
+//            Transform3D trans = new Transform3D(new Translation3D(0,0,zcenters.get(i)));
+//
+//            new PhysicalVolume(
+//                    trans,
+//                    sliceName,
+//                    sliceLV,
+//                    wedgeLV,
+//                    i);
+//        }
+        
     }
     
-    public Class getSubdetectorType() 
-    {       
+    public Class getSubdetectorType()
+    {
         return SiTrackerEndcap.class;
-    }   
+    }
 }
\ No newline at end of file
CVSspam 0.2.8