lcsim/src/org/lcsim/recon/tracking/gtrdetector
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)
{