Print

Print


Commit in lcsim on MAIN
test/org/lcsim/recon/tracking/gtrdetector/GtrDetectorTest.java+25added 1.1
src/org/lcsim/recon/tracking/gtrdetector/GtrDetector.java+106-91.6 -> 1.7
+131-9
1 added + 1 modified, total 2 files
JM: snapshot of work with Norman on org.lcsim.detector to GtrDetector

lcsim/test/org/lcsim/recon/tracking/gtrdetector
GtrDetectorTest.java added at 1.1
diff -N GtrDetectorTest.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ GtrDetectorTest.java	6 May 2008 23:48:48 -0000	1.1
@@ -0,0 +1,25 @@
+package org.lcsim.recon.tracking.gtrdetector;
+
+import junit.framework.TestCase;
+
+import org.lcsim.conditions.DetectorLocator;
+import org.lcsim.geometry.Detector;
+
+public class GtrDetectorTest extends TestCase 
+{
+	public void test1()
+	{
+		Detector det = DetectorLocator.findDetector("sid01_planar_tracker");
+		GtrDetector gtrdet = new GtrDetector(det);
+	}	
+	
+	/*
+	class TestDriver
+	{
+		public void detectorChanged(Detector detector)
+		{
+			System.out.println("detectorChanged - " + detector.getName());
+		}				
+	}
+	*/
+}

lcsim/src/org/lcsim/recon/tracking/gtrdetector
GtrDetector.java 1.6 -> 1.7
diff -u -r1.6 -r1.7
--- GtrDetector.java	6 Apr 2006 18:12:54 -0000	1.6
+++ GtrDetector.java	6 May 2008 23:48:48 -0000	1.7
@@ -3,34 +3,42 @@
  *
  * Created on July 30, 2005, 3:30 PM
  *
- * $Id: GtrDetector.java,v 1.6 2006/04/06 18:12:54 ngraf Exp $
+ * $Id: GtrDetector.java,v 1.7 2008/05/06 23:48:48 jeremy Exp $
  */
 
 package org.lcsim.recon.tracking.gtrdetector;
+import static org.lcsim.units.clhep.SystemOfUnits.cm;
+import hep.physics.vec.Hep3Vector;
+
+import java.util.ArrayList;
 import java.util.Collection;
+import java.util.List;
 import java.util.Map;
 import java.util.Set;
-import java.util.List;
-import java.util.ArrayList;
 
 import org.lcsim.conditions.DetectorLocator;
+import org.lcsim.detector.IDetectorElement;
+import org.lcsim.detector.IRotation3D;
+import org.lcsim.detector.material.IMaterial;
+import org.lcsim.detector.solids.Box;
 import org.lcsim.geometry.compact.Subdetector;
-import org.lcsim.geometry.subdetector.DiskTracker;
-import org.lcsim.geometry.subdetector.MultiLayerTracker;
-
 import org.lcsim.geometry.layer.Layer;
 import org.lcsim.geometry.layer.LayerSlice;
 import org.lcsim.geometry.layer.LayerStack;
+import org.lcsim.geometry.subdetector.DiskTracker;
+import org.lcsim.geometry.subdetector.MultiLayerTracker;
+import org.lcsim.geometry.subdetector.SiTrackerBarrel;
+import org.lcsim.recon.tracking.spacegeom.CartesianPoint;
+import org.lcsim.recon.tracking.spacegeom.SpacePoint;
 import org.lcsim.recon.tracking.trfbase.Interactor;
 import org.lcsim.recon.tracking.trfbase.MultiInteractor;
 import org.lcsim.recon.tracking.trfcyl.ClusterFindCyl;
 import org.lcsim.recon.tracking.trfcyl.LayerCylinder;
 import org.lcsim.recon.tracking.trfcyl.ThinCylMs;
 import org.lcsim.recon.tracking.trflayer.ClusterFindManager;
-
-
 import org.lcsim.recon.tracking.trflayer.Detector;
 import org.lcsim.recon.tracking.trflayer.InteractingLayer;
+import org.lcsim.recon.tracking.trfxyp.BSurfXYPlane;
 import org.lcsim.recon.tracking.trfzp.ClusFindZPlane2;
 import org.lcsim.recon.tracking.trfzp.LayerZPlane;
 import org.lcsim.recon.tracking.trfzp.ThinZPlaneMs;
@@ -40,6 +48,30 @@
  */
 public class GtrDetector extends Detector
 {
+	public GtrDetector(org.lcsim.geometry.Detector det)
+	{
+		System.out.println("building GtrDetector from " + det.getDetectorName());
+		Map<String, Subdetector> subDetMap = det.getSubdetectors();
+        Set<String> keys = subDetMap.keySet();
+        Collection<Subdetector> subDets = subDetMap.values();
+        // TODO need a mechanism to define what the digitization for each subdetector is.
+        // current default is to assume 2d points being measured in all the detectors.
+        for(Subdetector subDet : subDets)
+        {
+            if (subDet instanceof DiskTracker)
+            {
+                add( (DiskTracker) subDet);
+            }
+            else if  (subDet instanceof MultiLayerTracker)
+            {
+                add((MultiLayerTracker) subDet);
+            }
+            else if (subDet instanceof SiTrackerBarrel)
+            {
+            	add((SiTrackerBarrel) subDet);
+            }
+        }
+	}
     
     /** Creates a new instance of GtrDetector */
     public GtrDetector(String detectorName)
@@ -264,8 +296,59 @@
         }
         
     }
+    
+    // TODO: Handle modules with multiple sensitive components.
+    private void add(SiTrackerBarrel barrel)
+    {
+    	IDetectorElement subdet = barrel.getDetectorElement();
+    	for (IDetectorElement layer : subdet.getChildren())
+    	{
+    		//System.out.println(layer.getName());
+    		for (IDetectorElement module : layer.getChildren())
+    		{
+    			//System.out.println("    " + module.getName());
+    			double x0 = calculateModuleX0(module);
+    			//System.out.println("    module <" + module.getName() + "> x0="+x0);
+    			IDetectorElement sensor = null;
+    			for (IDetectorElement component : module.getChildren())
+    			{    				
+    				if (component.getGeometry().getPhysicalVolume().isSensitive())
+    				{
+    					sensor = component;
+    					//System.out.println("        sensor <" + component.getName() +">");
+    					break;    					
+    				}
+    			}
+    			if (sensor == null)
+    				throw new RuntimeException("No sensor found!");
+    			
+    			// Get position.
+    			Hep3Vector position = sensor.getGeometry().getPosition();
+    			SpacePoint point = new CartesianPoint(position.v());
+    			//System.out.print(point);
+    			double rxy = point.rxy();
+    			    			
+    			// Get global rotation.
+    			IRotation3D rot = sensor.getGeometry().getLocalToGlobal().getRotation();
+    			//System.out.println("rot="+rot.toString());
+    			
+    			// Get width (x) and length (y).
+    			Box box = (Box)sensor.getGeometry().getLogicalVolume().getSolid();
+    			double u = box.getXHalfLength();
+    			double v = box.getYHalfLength(); 
+    			
+    			// TODO: Convert rotation to phi measurement.
+    			// FIXME: Assert error!
+    			//BSurfXYPlane xyp = new BSurfXYPlane(rxy, point.phi(), -v, v, -u, u);
+
+    			//System.out.println("XYPlane for sensor <" + sensor.getName() + ">");
+    			//System.out.println(xyp);
+    		}
+    	}    	
+    }
+    
 // return effective x/x0 for this layer
-    double calculateLayerX0( Layer layer)
+    private double calculateLayerX0( Layer layer)
     {
         List<LayerSlice> lslist = layer.getSlices();
         double xOverX0 = 0.;
@@ -278,6 +361,20 @@
         }
         return xOverX0;
     }
+         
+    private double calculateModuleX0(IDetectorElement module)
+    {
+    	double xOverX0 = 0.;
+    	for (IDetectorElement component : module.getChildren())
+    	{
+    		Box b = (Box)component.getGeometry().getLogicalVolume().getSolid();
+    		double thickness = b.getZHalfLength() * 2;
+    		IMaterial material = component.getGeometry().getLogicalVolume().getMaterial();
+    		double x0 = material.getRadiationLengthWithDensity();
+    		xOverX0 += thickness/(x0*cm);
+    	}
+    	return xOverX0;
+    }
     
     public static void main(String[] args)
     {
CVSspam 0.2.8