lcsim/src/org/lcsim/recon/tracking/gtrdetector
diff -N GtrDetector.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ GtrDetector.java 31 Jul 2005 07:43:58 -0000 1.1
@@ -0,0 +1,284 @@
+/*
+ * GtrDetector.java
+ *
+ * Created on July 30, 2005, 3:30 PM
+ *
+ */
+
+package org.lcsim.recon.tracking.gtrdetector;
+import java.util.Collection;
+import java.util.Map;
+import java.util.Set;
+import java.util.List;
+import java.util.ArrayList;
+
+import org.lcsim.conditions.DetectorLocator;
+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.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.trfzp.ClusFindZPlane2;
+import org.lcsim.recon.tracking.trfzp.LayerZPlane;
+import org.lcsim.recon.tracking.trfzp.ThinZPlaneMs;
+/**
+ *
+ * @author Norman A. Graf
+ */
+public class GtrDetector extends Detector
+{
+
+ /** Creates a new instance of GtrDetector */
+ public GtrDetector(String detectorName)
+ {
+ // fetch this detector
+ org.lcsim.geometry.compact.Detector det = DetectorLocator.findDetector(detectorName);
+ if(det==null)
+ {
+ System.out.println("Please see http://www.lcsim.org/detectors/index.html");
+ System.exit(1);
+ }
+ Map<String, Subdetector> subDetMap = det.getSubdetectors();
+ Set<String> keys = subDetMap.keySet();
+ Collection<Subdetector> subDets = subDetMap.values();
+ for(Subdetector subDet : subDets)
+ {
+ if (subDet instanceof DiskTracker)
+ {
+ add( (DiskTracker) subDet);
+ }
+ else if (subDet instanceof MultiLayerTracker)
+ {
+ add((MultiLayerTracker) subDet);
+ }
+ }
+ }
+
+ private void add(DiskTracker m)
+ {
+ String name = m.getName();
+ int sysid = m.getSystemID();
+ boolean reflect = m.getReflect();
+ String rname = null;
+ if ( m.getReadout() != null )
+ {
+ rname = m.getReadout().getName();
+ }
+ double[] innerR = m.getInnerR();
+ double[] outerR = m.getOuterR();
+ double[] innerZ = m.getInnerZ();
+ LayerStack ls = m.getLayering().getLayerStack();
+ int nlayers = ls.getNumberOfLayers();
+ for (int i = 0; i < nlayers; i++)
+ {
+ Layer layer = ls.getLayer(i);
+ double thickness = layer.getThickness();
+ boolean sensitive = layer.findIndexOfFirstSensitiveSlice() != -1;
+ if (rname == null) sensitive = false;
+ double layerX0 = calculateLayerX0(layer);
+ String detname = name;
+ if (nlayers > 1) detname += "." + i;
+ /*
+ System.out.println(detname+ " cylinder(name(\"" + name + "\"), ");
+ System.out.println(" @" + layerX0 + ",");
+ System.out.println(" length(" + thickness + " mm), ");
+ System.out.println(" innerRadius(" + innerR[i] + " mm),");
+ String comma = "";
+ if (sensitive) comma = ",";
+ System.out.println(" outerRadius(" + outerR[i] + " mm)" + comma);
+ */
+ if (sensitive)
+ {
+ int sensSliceIndex = layer.findIndexOfFirstSensitiveSlice();
+ LayerSlice sensSlice = layer.getSlice(sensSliceIndex);
+ double zSense = innerZ[i]+layer.getThicknessToSensitive();
+ zSense+=sensSlice.getThickness();
+ //
+ // create a trf layer...
+ double maxChisqDiff = 20.0;
+ ClusterFindManager find = new ClusFindZPlane2( zSense, maxChisqDiff);
+ org.lcsim.recon.tracking.trflayer.Layer lyr = new LayerZPlane( zSense, find );
+ // Add interactions to this layer
+
+ // The list for multiple interactors...
+ List multi_int = new ArrayList();
+
+ // Multiple Scattering...
+
+ Interactor mcs = new ThinZPlaneMs(layerX0);
+ multi_int.add(mcs);
+ /*
+ // Energy Loss...
+ double thickness = 0.001;
+ double density = 0.01;
+ DeDx dedx = new DeDxFixed(density);
+ Interactor eloss = new CylEloss(thickness,dedx);
+ multi_int.add(eloss);
+ */
+ // The MultiInteractor contains both.
+
+ Interactor multi = new MultiInteractor(multi_int);
+
+ // Build an interacting layer
+ org.lcsim.recon.tracking.trflayer.Layer intlayer = new InteractingLayer(lyr, multi);
+
+ // Add interacting layer to the detector
+ addLayer( detname, intlayer );
+
+ /*
+ System.out.println(" type(\"tracker\"),");
+ System.out.println(" idCode(code(" + rname + "),");
+ System.out.println(" data(\"layer\", " + i + "),");
+ System.out.println(" data(\"system\", " + sysid + "),");
+ System.out.println(" data(\"barrel\", 1)");
+ System.out.println(" )");
+ */
+
+// System.out.println(");");
+// System.out.println("World += placement(@" + detname + ", translate(0, 0, " + (innerZ[i] + 0.5 * thickness) + " mm));");
+ if (reflect) // create similar layer at negative z
+ {
+ /*
+ System.out.println("World += placement(@" + detname
+ + ", rotate(axis(\"x\"), angle(180 deg)), translate(0, 0, "
+ + (- innerZ[i] - 0.5 * thickness) + " mm));");
+ */
+ ClusterFindManager find2 = new ClusFindZPlane2( -zSense, maxChisqDiff);
+ org.lcsim.recon.tracking.trflayer.Layer lyr2 = new LayerZPlane( -zSense, find );
+ // Build an interacting layer
+ org.lcsim.recon.tracking.trflayer.Layer intlayer2 = new InteractingLayer(lyr2, multi);
+
+ // Add interacting layer to the detector
+ addLayer( name+"Neg."+i, intlayer2 );
+ }
+ }
+ }
+ }
+
+ private void add(MultiLayerTracker m)
+ {
+ String name = m.getName();
+ int sysid = m.getSystemID();
+ String rname = null;
+ if ( m.getReadout() != null )
+ {
+ rname = m.getReadout().getName();
+ }
+ double[] innerR = m.getInnerR();
+ double[] outerZ = m.getOuterZ();
+ LayerStack ls = m.getLayering().getLayerStack();
+ int nlayers = ls.getNumberOfLayers();
+
+ for (int i = 0; i < nlayers; i++)
+ {
+ Layer layer = ls.getLayer(i);
+ double thickness = layer.getThickness();
+ boolean sensitive = layer.findIndexOfFirstSensitiveSlice() != -1;
+ if (rname == null) sensitive = false;
+ double layerX0 = calculateLayerX0(layer);
+ String detname = name;
+ if (nlayers > 1) detname += "." + i;
+/*
+ System.out.println( detname+ " cylinder(name(\"" + name + "\"), ");
+ System.out.println( " X0 " + layerX0 + ",");
+ System.out.println( " length(" + outerZ[i] * 2 + " mm), ");
+ System.out.println( " innerRadius(" + innerR[i] + " mm),");
+ String comma = "";
+ if (sensitive) comma = ",";
+ System.out.println( " outerRadius(" + (innerR[i] + thickness) + " mm)" + comma);
+ */
+ if (sensitive)
+ {
+ //
+ int sensSliceIndex = layer.findIndexOfFirstSensitiveSlice();
+ LayerSlice sensSlice = layer.getSlice(sensSliceIndex);
+ double rSense = innerR[i]+layer.getThicknessToSensitive();
+ rSense+=sensSlice.getThickness();
+ //
+ // create a trf layer...
+ double maxChisqDiff = 20.0;
+ ClusterFindManager find = new ClusterFindCyl( rSense, 0.0, maxChisqDiff);
+ org.lcsim.recon.tracking.trflayer.Layer lyr = new LayerCylinder( rSense, -outerZ[i], outerZ[i], find );
+
+
+ // Add interactions to this layer
+
+ // The list for multiple interactors...
+ List multi_int = new ArrayList();
+
+ // Multiple Scattering...
+
+ Interactor mcs = new ThinCylMs(layerX0);
+ multi_int.add(mcs);
+ /*
+ // Energy Loss...
+ double thickness = 0.001;
+ double density = 0.01;
+ DeDx dedx = new DeDxFixed(density);
+ Interactor eloss = new CylEloss(thickness,dedx);
+ multi_int.add(eloss);
+ */
+ // The MultiInteractor contains both.
+
+ Interactor multi = new MultiInteractor(multi_int);
+
+ // Build an interacting layer
+ org.lcsim.recon.tracking.trflayer.Layer intlayer = new InteractingLayer(lyr, multi);
+
+ // Add interacting layer to the detector
+ addLayer( detname, intlayer );
+
+// addLayer( detname, lyr );
+ //
+ /*
+ System.out.println(" *** outer radius of sensitive layer="+rSense);
+ //
+ System.out.println( " type(\"tracker\"),");
+ System.out.println( " idCode(code(" + rname + "),");
+ System.out.println( " data(\"layer\", " + i + "),");
+ System.out.println( " data(\"system\", " + sysid + "),");
+ System.out.println( " data(\"barrel\", 0)");
+ System.out.println( " )");
+ */
+ }
+ /*
+ System.out.println( ");");
+ System.out.println( "World += placement(@" + detname + ");");
+ */
+ }
+
+ }
+// return effective x/x0 for this layer
+ double calculateLayerX0( Layer layer)
+ {
+ List<LayerSlice> lslist = layer.getSlices();
+ double xOverX0 = 0.;
+ for (LayerSlice lsl: lslist)
+ {
+ double x0 = lsl.getMaterial().getRadiationLengthWithDensity(); // in cm.
+ double thickness = lsl.getThickness(); // in mm.
+ xOverX0 += thickness/(x0*10.); // cm -> mm
+// System.out.println(lsl.getMaterial().getName()+" x0= "+x0+ " thickness= "+thickness+ " => x/x0= "+thickness/(x0*10.));
+ }
+ return xOverX0;
+ }
+
+ public static void main(String[] args)
+ {
+ GtrDetector gtrdet = new GtrDetector("sidaug05");
+ System.out.println("\n\n\n\n\n"+gtrdet);
+ }
+
+}
lcsim/src/org/lcsim/recon/tracking/gtrdetector
diff -N package.html
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ package.html 31 Jul 2005 07:43:58 -0000 1.1
@@ -0,0 +1,7 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html>
+ <body>
+This package provides the interface between the compact detector description and the global tracking packages.
+ </body>
+</html>
\ No newline at end of file