Print

Print


Commit in GeomConverter/src/org/lcsim/detector/converter/compact on MAIN
PolyhedraEndcapCalorimeterConverter.java+134-731.4 -> 1.5
add ids to planar calorimeter sensors; modify stave layout to match equivalent lcdd geometry

GeomConverter/src/org/lcsim/detector/converter/compact
PolyhedraEndcapCalorimeterConverter.java 1.4 -> 1.5
diff -u -r1.4 -r1.5
--- PolyhedraEndcapCalorimeterConverter.java	24 Mar 2009 21:50:18 -0000	1.4
+++ PolyhedraEndcapCalorimeterConverter.java	10 Sep 2009 01:07:43 -0000	1.5
@@ -17,12 +17,17 @@
 import org.lcsim.detector.RotationPassiveXYZ;
 import org.lcsim.detector.Transform3D;
 import org.lcsim.detector.Translation3D;
+import org.lcsim.detector.identifier.ExpandedIdentifier;
+import org.lcsim.detector.identifier.IExpandedIdentifier;
+import org.lcsim.detector.identifier.IIdentifier;
+import org.lcsim.detector.identifier.IIdentifierHelper;
 import org.lcsim.detector.material.IMaterial;
 import org.lcsim.detector.material.MaterialStore;
 import org.lcsim.detector.solids.Trd;
 import org.lcsim.geometry.compact.Detector;
 import org.lcsim.geometry.compact.Subdetector;
 import org.lcsim.geometry.layer.LayerStack;
+import org.lcsim.geometry.subdetector.BarrelEndcapFlag;
 import org.lcsim.geometry.subdetector.PolyhedraEndcapCalorimeter;
 
 public class PolyhedraEndcapCalorimeterConverter 
@@ -34,11 +39,27 @@
 		
         String detName = node.getAttributeValue("name");
         
+        int sysId = subdet.getSystemID();
+        
+        boolean reflect = true;
+        try 
+        {
+            if (node.getAttribute("reflect") != null)
+            {
+                reflect = node.getAttribute("reflect").getBooleanValue();
+            }
+        }
+        catch (Exception t)
+        {
+        	throw new RuntimeException(t);
+        }
+        
         Element dimensions = node.getChild("dimensions");
         double zmin, rmin, rmax;
         int numsides;
         
-        try {
+        try 
+        {
         	zmin = dimensions.getAttribute("zmin").getDoubleValue();
         	rmin = dimensions.getAttribute("rmin").getDoubleValue();
         	rmax = dimensions.getAttribute("rmax").getDoubleValue();
@@ -50,7 +71,8 @@
         }
         
         double subdetectorThickness;
-        try {
+        try 
+        {
         	subdetectorThickness = org.lcsim.geometry.layer.LayerFromCompactCnv.computeDetectorTotalThickness(node);
         }
         catch (Exception x)
@@ -64,6 +86,16 @@
         double outerFaceLength = rmax * tan(halfInnerAngle) * 2;
         double radialThickness = rmax - rmin;
         
+        DetectorElement endcapPositive = 
+            new DetectorElement(subdet.getName() + "_positive", subdet.getDetectorElement());
+        
+        DetectorElement endcapNegative = null;
+        if (reflect)
+        {
+        	endcapNegative = 
+                new DetectorElement(subdet.getName() + "_negative", subdet.getDetectorElement());
+        }
+        
         Trd sectTrd = 
         	new Trd(detName + "_stave_trapezoid", 
         			innerFaceLength/2, 
@@ -78,16 +110,17 @@
 
         LayerStack layers = subdet.getLayering().getLayerStack();
         
-        int layer_number = 0;
-        double layer_position_y = subdetectorThickness / 2;
+        int layerNumber = 0;
+        double layerPositionY = subdetectorThickness / 2;
         
         for (Iterator i = node.getChildren("layer").iterator(); i.hasNext();)
         {
-            Element layer_element = (Element) i.next();
+            Element layerElement = (Element) i.next();
 
             int repeat;
-            try {
-            	repeat = (int)layer_element.getAttribute("repeat").getDoubleValue();
+            try 
+            {
+            	repeat = (int)layerElement.getAttribute("repeat").getDoubleValue();
             }
             catch (Exception x)
             {
@@ -96,44 +129,45 @@
             	
             for ( int j=0; j<repeat; j++)
             {
-            	String layer_name = detName + "_stave_layer" + layer_number;
+            	String layerName = detName + "_stave_layer" + layerNumber;
 
-            	double layer_thickness = layers.getLayer(layer_number).getThickness();
+            	double layerThickness = layers.getLayer(layerNumber).getThickness();
 
-            	layer_position_y -= layer_thickness / 2;
+            	layerPositionY -= layerThickness / 2;
 
-                Translation3D layer_position = new Translation3D(0,layer_position_y,0);
+                Translation3D layer_position = new Translation3D(0,layerPositionY,0);
 
                 double layerInnerFaceLength = innerFaceLength;//-LAYER_ENVELOPE_TOLERANCE;
                 double layerOuterFaceLength = outerFaceLength;//-LAYER_ENVELOPE_TOLERANCE;
                 double layerRadialThickness = radialThickness;//-LAYER_ENVELOPE_TOLERANCE;
                 
                 // Layer trapezoid.
-                Trd layer_trd = new Trd(
-                		layer_name + "_trapezoid",
+                Trd layerTrd = new Trd(
+                		layerName + "_trapezoid",
                 		layerInnerFaceLength,
                 		layerOuterFaceLength,
-                		layer_thickness,
-                		layer_thickness,
+                		layerThickness,
+                		layerThickness,
                 		layerRadialThickness);
 
-                ILogicalVolume layer_volume = 
+                ILogicalVolume layerVolume = 
                 	new LogicalVolume(
-                			layer_name,
-                			layer_trd,
+                			layerName,
+                			layerTrd,
                 			air);
 
-                int slice_number = 0;
-                double slice_position_y = layer_thickness / 2;
-                for ( Iterator k = layer_element.getChildren("slice").iterator(); k.hasNext();)
+                int sliceNumber = 0;
+                double slicePositionY = layerThickness / 2;
+                for ( Iterator k = layerElement.getChildren("slice").iterator(); k.hasNext();)
                 {
                 	Element slice_element = (Element)k.next();
 
-                	String slice_name = layer_name + "_slice" + slice_number;
+                	String sliceName = layerName + "_slice" + sliceNumber;
 
                 	Attribute s = slice_element.getAttribute("sensitive");
                     boolean sensitive = false;
-                    try {
+                    try 
+                    {
                     	sensitive = s != null && s.getBooleanValue();
                     }
                     catch (Exception x)
@@ -141,9 +175,10 @@
                     	throw new RuntimeException(x);
                     }
 
-                    double slice_thickness; 
-                    try {
-                    	slice_thickness = slice_element.getAttribute("thickness").getDoubleValue();
+                    double sliceThickness; 
+                    try 
+                    {
+                    	sliceThickness = slice_element.getAttribute("thickness").getDoubleValue();
                     }
                     catch (Exception x)
                     {
@@ -153,60 +188,60 @@
                     // Apply tolerance factor to given slice thickness.
                     //slice_thickness -= SLICE_TOLERANCE;
                     
-                    slice_position_y -=  slice_thickness / 2;
+                    slicePositionY -=  sliceThickness / 2;
 
-                    Translation3D slicePosition = new Translation3D(0,slice_position_y,0);
+                    Translation3D slicePosition = new Translation3D(0,slicePositionY,0);
                     
                     double sliceInnerFaceLength = layerInnerFaceLength;// - SLICE_ENVELOPE_TOLERANCE;
                     double sliceOuterFaceLength = layerOuterFaceLength;// - SLICE_ENVELOPE_TOLERANCE;
                     double sliceRadialThickness = layerRadialThickness;// - SLICE_ENVELOPE_TOLERANCE;
                     
                     Trd sliceTrd = new Trd(
-                    		slice_name + "_trapezoid",
+                    		sliceName + "_trapezoid",
                     		sliceInnerFaceLength/2,
                     		sliceOuterFaceLength/2,
-                    		slice_thickness/2,
-                    		slice_thickness/2,
+                    		sliceThickness/2,
+                    		sliceThickness/2,
                     	    sliceRadialThickness/2);
 
                     ILogicalVolume sliceVolume =
                     	new LogicalVolume(
-                    			slice_name,
+                    			sliceName,
                     			sliceTrd,
                     			MaterialStore.getInstance().get(slice_element.getAttributeValue("material")));
 
                     PhysicalVolume slicePhysVol = 
                     	new PhysicalVolume(
                     		new Transform3D(slicePosition),
-                    		slice_name,
+                    		sliceName,
                     		sliceVolume,
-                    		layer_volume,
-                    		0);
+                    		layerVolume,
+                    		sliceNumber);
                     
                     if (sensitive) slicePhysVol.setSensitive(true);
 
                     // The slice thickness is the original, NOT adjusted for tolerance,
                     // so that the center of the slice is in the right place with tolerance
                     // gaps on either side.
-                    slice_position_y -= slice_thickness / 2;
+                    slicePositionY -= sliceThickness / 2;
 
                     // Increment the slice counter.
-                    ++slice_number;
+                    ++sliceNumber;
                 }
 
                 new PhysicalVolume(
             			new Transform3D(layer_position),
-            			layer_name,
-            			layer_volume,
+            			layerName,
+            			layerVolume,
             			sectVolume,
-            			0);
+            			layerNumber);
 
-                layer_position_y -= layer_thickness / 2;
+                layerPositionY -= layerThickness / 2;
                 
                 // DEBUG
                 //layer_position_y -= INTER_LAYER_GAP;
 
-                ++layer_number;                    
+                ++layerNumber;                    
             }
             // DEBUG - Uncomment to build only one layer. 
             //break;
@@ -220,8 +255,10 @@
         
         for ( int i=0; i < numsides; i++)
         {
-        	double phi = 2*Math.PI*((double)i)/numsides;
-			double zc = -phi + Math.PI/2;
+        	double phi=-(2*Math.PI*((double)i)/numsides-Math.PI/2);
+        	//double phi = 2*Math.PI*((double)i)/numsides;
+        	double zc=-phi+Math.PI/2;
+			//double zc = -phi + Math.PI/2;
 			double x = sectCenter*Math.cos(phi);
 			double y = sectCenter*Math.sin(phi);
 			
@@ -234,61 +271,85 @@
         				detName + "_stave_positive" + i,
         				sectVolume,
         				motherVolume,
-        				0);
+        				i);
         	
-        	new DetectorElement(sectPhysVol.getName(), subdet.getDetectorElement(), "/" + sectPhysVol.getName());
-
-            boolean reflect = true;
-            try 
-            {
-                if (node.getAttribute("reflect") != null)
-                {
-                    reflect = node.getAttribute("reflect").getBooleanValue();
-                }
-            }
-            catch (Exception t)
-            {
-            	throw new RuntimeException(t);
-            }
+        	new DetectorElement(
+        			sectPhysVol.getName(), 
+        			endcapPositive, 
+        			"/" + sectPhysVol.getName());
             
             if (reflect)
             {
-                IRotation3D reflectRotation = new RotationPassiveXYZ(-Math.PI/2, 0, zc);
-                ITranslation3D reflectPosition = new Translation3D(-x, -y, -zmin - subdetectorThickness/2);
+                IRotation3D reflectRotation = new RotationPassiveXYZ(-Math.PI/2, 0, zc + Math.PI);
+                ITranslation3D reflectPosition = new Translation3D(x, y, -zmin - subdetectorThickness/2);
                 
                 IPhysicalVolume physVolReflect = 
                 	new PhysicalVolume(
                 			new Transform3D(reflectPosition, reflectRotation),
-                			detName + "_stave_reflect" + i,
+                			detName + "_stave_negative" + i,
                 			sectVolume,
                 			motherVolume,
-                			0);
+                			i);
                 
-                new DetectorElement(physVolReflect.getName(), subdet.getDetectorElement(), "/" + physVolReflect.getName());
+                new DetectorElement(
+                		physVolReflect.getName(), 
+                		endcapNegative, 
+                		"/" + physVolReflect.getName());
             } 
         }
-        
-        int sensorNum = 0;
+                        
         for (IDetectorElement endcap : subdet.getDetectorElement().getChildren())
         {
+        	//System.out.println("endcap: " + endcap.getName());
+        	IIdentifierHelper helper = endcap.getIdentifierHelper();
             for (IDetectorElement module : endcap.getChildren())
-            {
+            {            	
                 for (IPhysicalVolume layer : module.getGeometry().getLogicalVolume().getDaughters())
                 {
+                	int sensorNum = 0;
                     for (IPhysicalVolume slice : layer.getLogicalVolume().getDaughters())
                     {
                         if (slice.isSensitive())
-                        {
+                        {                        	
+                        	IExpandedIdentifier expId = new ExpandedIdentifier(helper.getIdentifierDictionary().getNumberOfFields());
+                        	
+                        	expId.setValue(helper.getFieldIndex("system"),sysId);
+                        	                        	
+                        	int endcapFlag = BarrelEndcapFlag.ENDCAP_NORTH.getFlag();
+                        	if (endcap.getName().contains("negative"))
+                        	{
+                        		endcapFlag = BarrelEndcapFlag.ENDCAP_SOUTH.getFlag();;
+                        	}
+        					expId.setValue(helper.getFieldIndex("barrel"), endcapFlag);
+        					expId.setValue(helper.getFieldIndex("module"), module.getGeometry().getPhysicalVolume().getCopyNumber());
+        					expId.setValue(helper.getFieldIndex("layer"), layer.getCopyNumber());
+        					expId.setValue(helper.getFieldIndex("slice"), slice.getCopyNumber());
+        					        					
+        					IIdentifier id = helper.pack(expId);
+                        	
                             String sliceDetElemName = 
-                                subdet.getName()
+                                endcap.getName()
                                 + "_module" + module.getGeometry().getPhysicalVolume().getCopyNumber()
                                 + "_layer" + layer.getCopyNumber()
                                 + "_sensor" + sensorNum;
-                            //String sliceDetElemName = subdet.getName() + "_" + module.getName() + "_" + layer.getName() + "_" + slice.getName();
-                            new DetectorElement(
+                            
+                            IDetectorElement sensor =
+                            	new DetectorElement(
                                     sliceDetElemName, 
-                                    endcap, 
-                                    "/" + module.getName() + "/" + layer.getName() + "/" + slice.getName());
+                                    module, 
+                                    "/" + module.getName() + "/" + layer.getName() + "/" + slice.getName(),
+                                    id);
+                            /*
+                            IDetectorElement x = sensor;
+                            System.out.println("---print sensor---");
+                            while (x != null)
+                            {
+                            	System.out.println(x.getName());
+                            	x = x.getParent();                            
+                            }
+                            System.out.println("------------");
+                            */
+                            
                             ++sensorNum;
                         }
                     }
CVSspam 0.2.8