GeomConverter/src/org/lcsim/detector/converter/compact
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