GeomConverter/src/org/lcsim/geometry/compact/converter/lcdd
diff -u -r1.15 -r1.16
--- SiTrackerEndcap.java 3 Dec 2008 00:53:45 -0000 1.15
+++ SiTrackerEndcap.java 3 Feb 2009 23:36:16 -0000 1.16
@@ -27,23 +27,23 @@
{
Map<String,SiTrackerModuleParameters> moduleParameters = new HashMap<String,SiTrackerModuleParameters>();
SensitiveDetector sd = null;
-
+
public SiTrackerEndcap(Element node) throws JDOMException
{
super(node);
}
-
+
public void addToLCDD(LCDD lcdd, SensitiveDetector sens) throws JDOMException
- {
+ {
if (sens == null)
throw new RuntimeException("SD is null");
-
+
this.sd = sens;
for (Object n : node.getChildren("module"))
{
- Element e = (Element)n;
- moduleParameters.put(e.getAttributeValue("name"), new SiTrackerModuleParameters(e));
+ Element e = (Element)n;
+ moduleParameters.put(e.getAttributeValue("name"), new SiTrackerModuleParameters(e));
}
int sysId = node.getAttribute("id").getIntValue();
@@ -51,8 +51,8 @@
for (Object o : node.getChildren("layer"))
{
- Element layerElement = (Element)o;
-
+ Element layerElement = (Element)o;
+
int nwedges;
try
{
@@ -62,7 +62,7 @@
{
throw new RuntimeException(x);
}
-
+
double innerR, outerR, innerZ, thickness;
int layerN;
try
@@ -71,33 +71,33 @@
innerR = layerElement.getAttribute("inner_r").getDoubleValue();
outerR = layerElement.getAttribute("outer_r").getDoubleValue();
innerZ = layerElement.getAttribute("inner_z").getDoubleValue();
- thickness = layerElement.getAttribute("thickness").getDoubleValue();
+ thickness = layerElement.getAttribute("thickness").getDoubleValue();
}
catch (DataConversionException x)
{
throw new RuntimeException(x);
- }
-
+ }
+
String layerName = subdetName + "_layer" + layerN;
-
+
Volume layerVolume = makeLayer(node, layerElement, layerN, innerR, outerR, thickness, nwedges, lcdd);
-
+
lcdd.add(layerVolume);
-
+
Rotation rotation = new Rotation(layerName + "_rotation");
Position position = new Position(layerName + "_position");
double layerZ = innerZ + thickness/2;
position.setZ(layerZ);
-
+
lcdd.add(rotation);
lcdd.add(position);
-
+
// Positive endcap.
PhysVol posEC = new PhysVol(layerVolume, lcdd.getTrackingVolume(), position, rotation);
posEC.addPhysVolID("system", sysId);
posEC.addPhysVolID("barrel", 1); // Positive endcap flag.
posEC.addPhysVolID("layer", layerN);
-
+
// Negative endcap.
Rotation rotationReflect = new Rotation(layerName + "_rotation_reflect");
rotationReflect.setY(Math.PI);
@@ -110,49 +110,50 @@
negEC.addPhysVolID("barrel", 2); // Negative endcap flag.
negEC.addPhysVolID("layer", layerN);
}
-
+
moduleParameters = null;
}
-
+
private Volume makeLayer(
- Element subdetElement,
- Element layerElement,
- int layerN,
- double innerR,
- double outerR,
- double thickness,
+ Element subdetElement,
+ Element layerElement,
+ int layerN,
+ double innerR,
+ double outerR,
+ double thickness,
int nwedges,
LCDD lcdd)
{
double dphi = Math.PI / nwedges;
-
+
String subdetName = subdetElement.getAttributeValue("name");
-
+
String layerName = subdetName + "_layer" + layerN;
-
+
double tubeInnerR, tubeOuterR;
tubeInnerR = innerR;
tubeOuterR = outerR / Math.cos(dphi);
-
+
// FIXME: The z dimension should go in as a half length, but GDML does not use Geant4's convention.
Tube layerTube = new Tube(layerName + "_tube", tubeInnerR, tubeOuterR, thickness/2);
-
+
lcdd.add(layerTube);
-
+
Material material;
- try {
+ try
+ {
material = lcdd.getMaterial("Air");
}
catch (JDOMException x)
{
throw new RuntimeException(x);
}
-
- Volume layerLV = new Volume(layerName, layerTube, material);
-
+
+ Volume layerLV = new Volume(layerName, layerTube, material);
+
Volume wedgeLV = makeWedge(subdetElement, layerElement, innerR, outerR, thickness, nwedges, layerN, lcdd);
lcdd.add(wedgeLV);
-
+
double r = (innerR + outerR) / 2;
String wedgeName = wedgeLV.getVolumeName();
for (int i=0; i<nwedges; i++)
@@ -160,34 +161,34 @@
double phi = i * 2 * Math.PI / nwedges;
double x = r * Math.cos(phi);
double y = r * Math.sin(phi);
-
+
Position p = new Position(wedgeName + i + "_position");
p.setX(x);
p.setY(y);
Rotation rot = new Rotation(wedgeName + i + "_rotation");
rot.setX(-Math.PI/2);
rot.setY(-Math.PI/2 - phi);
-
+
lcdd.add(p);
lcdd.add(rot);
-
+
PhysVol wedgePV = new PhysVol(wedgeLV, layerLV, p, rot);
- wedgePV.addPhysVolID("wedge", i);
+ wedgePV.addPhysVolID("wedge", i);
}
-
+
// Set the layer envelope to invisible to help Geant4 visualization.
//if (lcdd.getVisAttributes("InvisibleWithDaughters") != null)
//{
// layerLV.setVisAttributes(lcdd.getVisAttributes("InvisibleWithDaughters"));
//}
-
+
return layerLV;
}
-
+
Volume makeWedge(Element subdetElement, Element layerElement, double innerR, double outerR, double thickness, int nwedges, int layerN, LCDD lcdd)
{
Material material;
- try
+ try
{
material = lcdd.getMaterial("Air");
}
@@ -195,10 +196,10 @@
{
throw new RuntimeException(x);
}
-
+
String subdetName = subdetElement.getAttributeValue("name");
String name = subdetName + "_layer" + layerN + "_wedge";
-
+
double dz = (outerR - innerR) / 2;
double dy1, dy2;
dy1 = dy2 = thickness / 2;
@@ -206,25 +207,25 @@
double dphi = Math.PI / nwedges;
dx1 = innerR * Math.tan(dphi);
dx2 = outerR * Math.tan(dphi);
-
+
Trapezoid wedgeTrd = new Trapezoid(name + "_trapezoid",dx1,dx2,dy1,dy2,dz);
-
+
lcdd.add(wedgeTrd);
-
+
Volume wedgeLV = new Volume(name, wedgeTrd, material);
Attribute moduleref = layerElement.getAttribute("module");
if (moduleref == null)
- throw new RuntimeException("module reference is missing for layer number " + layerN);
+ throw new RuntimeException("module reference is missing for layer number " + layerN);
SiTrackerModuleParameters module = moduleParameters.get(moduleref.getValue());
-
+
makeModules(subdetElement, wedgeLV, layerElement.getChild("module_parameters"), module, layerN, lcdd);
-
+
return wedgeLV;
}
-
+
private void makeModules(Element subdetElement, Volume wedgeLV, Element moduleParameters, SiTrackerModuleParameters module, int layerN, LCDD lcdd)
{
double r_size;
@@ -236,7 +237,7 @@
{
throw new RuntimeException(x);
}
-
+
double phi_size_max;
try
{
@@ -246,7 +247,7 @@
{
throw new RuntimeException(x);
}
-
+
Trapezoid moduleTrd = (Trapezoid)lcdd.getSolid(wedgeLV.getSolidRef());
double dz = moduleTrd.z();
double dx1 = moduleTrd.x1();
@@ -254,27 +255,27 @@
double dy = moduleTrd.y1();
double deltax = dx2 - dx1;
double side_slope = deltax / (2*dz);
-
+
List<Double> zcenters = new ArrayList<Double>();
List<Double> zsizes = new ArrayList<Double>();
List<Double> xsizes1 = new ArrayList<Double>();
List<Double> xsizes2 = new ArrayList<Double>();
-
+
{
double zcurr = dz;
- while (zcurr - r_size >= -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 = dx1 + side_slope*(zmin+dz);
double xsize2 = dx1 + side_slope*(zmax+dz);
-
+
xsizes1.add(xsize1);
xsizes2.add(xsize2);
-
+
zcurr -= r_size;
}
double zmax = zcurr;
@@ -286,9 +287,9 @@
xsizes1.add(xsize1);
xsizes2.add(xsize2);
}
-
+
Material sliceMaterial;
- try
+ try
{
sliceMaterial = lcdd.getMaterial("Air");
}
@@ -296,149 +297,173 @@
{
throw new RuntimeException(x);
}
-
- double xsize1_min = 0.0;
+
+ double zsize_last = 0.0;
+ double xsize1_min = phi_size_max/2;
double xsize_box = 0.0;
int nboxes = 0;
-
+
int imodule = 0;
-
+
for (int i=zcenters.size()-1; i >= 0; i--)
- {
+ {
+
+ if (zsizes.get(i) != zsize_last)
+ {
+ zsize_last = zsizes.get(i);
+ xsize1_min = phi_size_max/2;
+ xsize_box = 0.0;
+ nboxes = 0;
+ }
+
int ntraps = (int)Math.ceil( 2*(xsizes1.get(i) - nboxes*xsize_box) / phi_size_max );
-
+
// Squares to fill extra space
if (ntraps > 2)
{
- if (xsize_box == 0.0) xsize_box = xsizes1.get(i) - 2*xsize1_min;
- nboxes++;
+ double delta_x = xsizes2.get(i) - xsizes1.get(i);
+
+ if (phi_size_max > delta_x)
+ {
+ xsize_box = delta_x*(int)Math.floor(phi_size_max/delta_x);
+ }
+ else
+ {
+ xsize_box = delta_x/(int)Math.floor(delta_x/phi_size_max);
+ }
+
+ if (xsize_box > 0.0)
+ {
+ nboxes = (int)Math.floor((xsizes1.get(i)-2*xsize1_min)/xsize_box);
+ }
ntraps = 2;
}
-
+
double xmin = -nboxes*xsize_box;
double xmax = xmin+2*xsize_box;
-
+
for (int ibox = 0; ibox < nboxes; ibox++)
- {
+ {
double xcenter = (xmin+xmax)/2;
xmin += 2*xsize_box;
xmax += 2*xsize_box;
-
+
String sliceName = subdetElement.getAttributeValue("name") + "_layer" + layerN + "_module" + imodule;
-
+
// FIXME: Multiply by 2 to conform to GDML convention of dividing inputs by 2.
Box sliceBox = new Box(sliceName + "_box");
sliceBox.setX(xsize_box*2);
sliceBox.setY(dy*2);
sliceBox.setZ(zsizes.get(i)*2);
lcdd.add(sliceBox);
-
+
Volume sliceLV = new Volume(sliceName, sliceBox, sliceMaterial);
-
+
// Make the box module.
makeBoxModule(sliceLV, module, lcdd);
-
+
lcdd.add(sliceLV);
-
+
Position p = new Position(sliceName + "_position");
p.setX(xcenter);
p.setZ(zcenters.get(i));
lcdd.add(p);
Rotation rot = new Rotation(sliceName + "_rotation");
lcdd.add(rot);
-
+
PhysVol slicePV = new PhysVol(sliceLV, wedgeLV, p, rot);
slicePV.addPhysVolID("module", imodule);
-
+
imodule++;
}
-
+
// Small symmetric trapezoids
if (ntraps == 1)
{
String sliceName = subdetElement.getAttributeValue("name") + "_layer" + layerN + "_module" + imodule;
-
+
Trapezoid sliceTrd = new Trapezoid(sliceName+"_trapezoid", xsizes1.get(i), xsizes2.get(i), dy, dy, zsizes.get(i));
lcdd.add(sliceTrd);
-
+
Volume sliceLV = new Volume(sliceName, sliceTrd, sliceMaterial);
makeTrdModule(sliceLV, module, lcdd);
lcdd.add(sliceLV);
-
+
Position p = new Position(sliceName + "_position");
p.setZ(zcenters.get(i));
lcdd.add(p);
-
+
Rotation rot = new Rotation(sliceName + "_rotation");
lcdd.add(rot);
-
+
PhysVol slicePV = new PhysVol(sliceLV, wedgeLV, p, rot);
slicePV.addPhysVolID("module", 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;
-
+
double xcenter = (xsize1+xsize2)/2 + xoffset;
double theta = Math.abs(Math.atan(side_slope/2));
-
+
for (int ix = -1; ix <=1; ix=ix+2)
{
String sliceName = subdetElement.getAttributeValue("name") + "_layer" + layerN + "_module" + imodule;
-
+
Trap sliceTrap = new Trap(sliceName+"_trap",zsizes.get(i),theta*ix,0.0,dy,xsize1,xsize1,0.0,dy,xsize2,xsize2,0.0);
lcdd.add(sliceTrap);
-
+
Volume sliceLV = new Volume(sliceName, sliceTrap, sliceMaterial);
makeTrapModule(sliceLV, module, lcdd);
lcdd.add(sliceLV);
-
+
Position p = new Position(sliceName + "_position");
p.setX(ix*xcenter);
p.setZ(zcenters.get(i));
lcdd.add(p);
Rotation rot = new Rotation(sliceName + "_rotation");
lcdd.add(rot);
-
+
PhysVol slicePV = new PhysVol(sliceLV, wedgeLV, p, rot);
slicePV.addPhysVolID("module", imodule);
-
+
imodule++;
}
}
}
}
-
+
void makeBoxModule(Volume moduleVolume, SiTrackerModuleParameters moduleParameters, LCDD lcdd)
{
Box moduleBox = (Box)lcdd.getSolid(moduleVolume.getSolidRef());
-
+
double moduleX = moduleBox.getX();
double posY = -(moduleBox.getY() / 2);
- double moduleZ = moduleBox.getZ();
-
+ double moduleZ = moduleBox.getZ();
+
String moduleName = moduleVolume.getVolumeName();
-
+
int sensor=0;
for (SiTrackerModuleComponentParameters component : moduleParameters)
{
double thickness = component.getThickness();
Material material = null;
- try {
+ try
+ {
material = lcdd.getMaterial(component.getMaterialName());
}
catch (JDOMException x)
@@ -447,18 +472,18 @@
}
boolean sensitive = component.isSensitive();
int componentNumber = component.getComponentNumber();
-
+
posY += thickness / 2;
-
+
String componentName = moduleName + "_component" + componentNumber;
-
+
Box sliceBox = new Box(componentName + "_box", moduleX, thickness, moduleZ);
lcdd.add(sliceBox);
-
+
Volume volume = new Volume(componentName, sliceBox, material);
lcdd.add(volume);
-
- Position position = new Position(componentName + "_position", 0., posY, 0.);
+
+ Position position = new Position(componentName + "_position", 0., posY, 0.);
lcdd.add(position);
Rotation rotation = new Rotation(componentName + "_rotation");
rotation.setY(Math.PI);
@@ -475,32 +500,33 @@
volume.setSensitiveDetector(this.sd);
pv.addPhysVolID("sensor", sensor);
++sensor;
- }
-
+ }
+
posY += thickness / 2;
- }
+ }
}
-
+
void makeTrdModule(Volume moduleVolume, SiTrackerModuleParameters moduleParameters, LCDD lcdd)
{
Trapezoid trd = (Trapezoid)lcdd.getSolid(moduleVolume.getSolidRef());
-
+
double x1 = trd.x1();
double x2 = trd.x2();
double y1 = trd.y1();
double z = trd.z();
-
+
double posY = -y1;
-
+
String moduleName = moduleVolume.getVolumeName();
-
+
int sensor=0;
for (SiTrackerModuleComponentParameters component : moduleParameters)
{
double thickness = component.getThickness();
-
+
Material material = null;
- try {
+ try
+ {
material = lcdd.getMaterial(component.getMaterialName());
}
catch (JDOMException x)
@@ -508,26 +534,26 @@
throw new RuntimeException(x);
}
boolean sensitive = component.isSensitive();
- int componentNumber = component.getComponentNumber();
-
+ int componentNumber = component.getComponentNumber();
+
posY += thickness / 2;
-
+
String componentName = moduleName + "_component" + componentNumber;
-
+
Trapezoid sliceTrd = new Trapezoid(componentName + "_trd", x1, x2, thickness/2, thickness/2, z);
lcdd.add(sliceTrd);
-
+
Volume volume = new Volume(componentName, sliceTrd, material);
lcdd.add(volume);
-
+
Position position = new Position(componentName + "_position",0.,posY,0);
lcdd.add(position);
Rotation rotation = new Rotation(componentName + "_rotation");
lcdd.add(rotation);
-
+
PhysVol pv = new PhysVol(volume, moduleVolume, position, rotation);
pv.addPhysVolID("component", componentNumber);
-
+
if (sensitive)
{
if (sensor > 1)
@@ -538,15 +564,15 @@
volume.setSensitiveDetector(this.sd);
++sensor;
}
-
+
posY += thickness / 2;
- }
+ }
}
-
+
public void makeTrapModule(Volume module, SiTrackerModuleParameters moduleParameters, LCDD lcdd)
{
Trap trap = (Trap)lcdd.getSolid(module.getSolidRef());
-
+
double a1 = trap.getAlpha1();
double a2 = trap.getAlpha2();
double x1 = trap.getXHalfLength1();
@@ -557,16 +583,17 @@
double z = trap.getZHalfLength();
double theta = trap.getTheta();
double phi = trap.getPhi();
-
+
double posY = -y1;
-
+
int sensor = 0;
for (SiTrackerModuleComponentParameters component : moduleParameters)
{
double thickness = component.getThickness();
Material material = null;
- try {
+ try
+ {
material = lcdd.getMaterial(component.getMaterialName());
}
catch (JDOMException x)
@@ -575,22 +602,22 @@
}
boolean sensitive = component.isSensitive();
int componentNumber = component.getComponentNumber();
-
+
posY += thickness / 2;
-
- String componentName = module.getVolumeName() + "_component" + componentNumber;
-
+
+ String componentName = module.getVolumeName() + "_component" + componentNumber;
+
Trap sliceTrap = new Trap(componentName + "_trap", z, theta, phi, thickness/2, x1, x2, a1, thickness/2, x3, x4, a2);
lcdd.add(sliceTrap);
-
+
Volume volume = new Volume(componentName, sliceTrap, material);
lcdd.add(volume);
-
+
Position position = new Position(componentName + "_position",0,posY,0);
lcdd.add(position);
Rotation rotation = new Rotation(componentName + "_rotation");
lcdd.add(rotation);
-
+
PhysVol pv = new PhysVol(volume, module, position, rotation);
pv.addPhysVolID("component", componentNumber);
@@ -603,12 +630,12 @@
volume.setSensitiveDetector(this.sd);
pv.addPhysVolID("sensor", sensor);
++sensor;
- }
-
+ }
+
posY += thickness / 2;
- }
+ }
}
-
+
public boolean isTracker()
{
return true;
GeomConverter/src/org/lcsim/detector/converter/compact
diff -u -r1.28 -r1.29
--- SiTrackerEndcapConverter.java 3 Dec 2008 00:53:45 -0000 1.28
+++ SiTrackerEndcapConverter.java 3 Feb 2009 23:36:16 -0000 1.29
@@ -59,28 +59,28 @@
* Converter for SiTrackerEndcap.
*
* @author Jeremy McCormick, Tim Nelson
- * @version $Id: SiTrackerEndcapConverter.java,v 1.28 2008/12/03 00:53:45 jeremy Exp $
+ * @version $Id: SiTrackerEndcapConverter.java,v 1.29 2009/02/03 23:36:16 tknelson Exp $
*/
public class SiTrackerEndcapConverter
extends AbstractSubdetectorConverter
implements ISubdetectorConverter
{
- public SiTrackerEndcapConverter()
- {}
+ public SiTrackerEndcapConverter()
+ {}
public IIdentifierHelper makeIdentifierHelper(Subdetector subdetector, SystemMap systemMap)
{
return new SiTrackerIdentifierHelper(
- subdetector.getDetectorElement(),
- makeIdentifierDictionary(subdetector),
- systemMap);
+ subdetector.getDetectorElement(),
+ makeIdentifierDictionary(subdetector),
+ systemMap);
}
-
+
public void convert(Subdetector subdet, Detector detector)
- {
- Map<String, SiTrackerModuleParameters> moduleParameters = new HashMap<String, SiTrackerModuleParameters>();
-
+ {
+ Map<String, SiTrackerModuleParameters> moduleParameters = new HashMap<String, SiTrackerModuleParameters>();
+
IPhysicalVolume trackingPV = detector.getTrackingVolume();
ILogicalVolume trackingLV = trackingPV.getLogicalVolume();
@@ -117,10 +117,10 @@
// Set static module parameters.
for (Object n : node.getChildren("module"))
- {
- Element e = (Element)n;
- moduleParameters.put(e.getAttributeValue("name"), new SiTrackerModuleParameters(e));
- }
+ {
+ Element e = (Element)n;
+ moduleParameters.put(e.getAttributeValue("name"), new SiTrackerModuleParameters(e));
+ }
for (Object o : node.getChildren("layer"))
{
@@ -180,12 +180,12 @@
// Negative endcap.
String wedgePathReflect = layerPathReflect + "/" + wedge.getName();
String wedgeNameReflect = layerNameReflect + "_wedge" + wedge.getCopyNumber();
- IDetectorElement wedgeDEReflect =
- new DetectorElement(
- wedgeNameReflect,
- layerDEReflect,
- detector.getNavigator().getPath(wedgePathReflect)
- );
+ IDetectorElement wedgeDEReflect =
+ new DetectorElement(
+ wedgeNameReflect,
+ layerDEReflect,
+ detector.getNavigator().getPath(wedgePathReflect)
+ );
// Module DEs.
for (IPhysicalVolume module : wedge.getLogicalVolume().getDaughters())
@@ -193,8 +193,8 @@
// Positive endcap module.
String modulePath = wedgePath + "/" + module.getName();
String moduleName = wedgeName + "_module" + module.getCopyNumber();
- IDetectorElement moduleDE =
- new SiTrackerModule(
+ IDetectorElement moduleDE =
+ new SiTrackerModule(
moduleName,
wedgeDE,
detector.getNavigator().getPath(modulePath).toString(),
@@ -203,13 +203,13 @@
// Negative endcap module.
String modulePathReflect = wedgePathReflect + "/" + module.getName();
String moduleNameReflect = wedgeNameReflect + "_module" + module.getCopyNumber();
- IDetectorElement moduleDEReflect =
- new SiTrackerModule(
+ IDetectorElement moduleDEReflect =
+ new SiTrackerModule(
moduleNameReflect,
wedgeDEReflect,
detector.getNavigator().getPath(modulePathReflect).toString(),
module.getCopyNumber()
- );
+ );
}
}
}
@@ -221,7 +221,7 @@
catch (Exception x)
{
throw new RuntimeException(x);
- }
+ }
}
private ILogicalVolume makeWedge(
@@ -293,7 +293,7 @@
Attribute moduleref = layerElement.getAttribute("module");
if (moduleref == null)
- throw new RuntimeException("module reference is missing for layer number " + layern);
+ throw new RuntimeException("module reference is missing for layer number " + layern);
SiTrackerModuleParameters module = moduleParameters.get(moduleref.getValue());
@@ -361,7 +361,7 @@
{
double zcurr = dz;
- while (zcurr - r_size >= -dz)
+ while (zcurr - r_size > -dz)
{
double zmax = zcurr;
double zmin = zcurr-r_size;
@@ -388,7 +388,8 @@
IMaterial sliceMaterial = wedgeLV.getMaterial();
- double xsize1_min = 0.0;
+ double zsize_last = 0.0;
+ double xsize1_min = phi_size_max/2;
double xsize_box = 0.0;
int nboxes = 0;
@@ -397,13 +398,34 @@
for (int i=zcenters.size()-1; i >= 0; i--)
{
- int ntraps = (int)Math.ceil( 2*(xsizes1.get(i) - nboxes*xsize_box) / phi_size_max );
+ if (zsizes.get(i) != zsize_last)
+ {
+ zsize_last = zsizes.get(i);
+ xsize1_min = phi_size_max/2;
+ xsize_box = 0.0;
+ nboxes = 0;
+ }
+
+ int ntraps = (int)Math.ceil( 2*(xsizes1.get(i) - nboxes*xsize_box) / phi_size_max );
// Squares to fill extra space
if (ntraps > 2)
{
- if (xsize_box == 0.0) xsize_box = xsizes1.get(i) - 2*xsize1_min;
- nboxes++;
+ double delta_x = xsizes2.get(i) - xsizes1.get(i);
+
+ if (phi_size_max > delta_x)
+ {
+ xsize_box = delta_x*(int)Math.floor(phi_size_max/delta_x);
+ }
+ else
+ {
+ xsize_box = delta_x/(int)Math.floor(delta_x/phi_size_max);
+ }
+
+ if (xsize_box > 0.0)
+ {
+ nboxes = (int)Math.floor((xsizes1.get(i)-2*xsize1_min)/xsize_box);
+ }
ntraps = 2;
}
@@ -578,7 +600,7 @@
double y1 = trap.getYHalfLength1();
double z = trap.getZHalfLength();
double theta = trap.getTheta();
- double phi = trap.getPhi();
+ double phi = trap.getPhi();
double posY = -y1;
for (SiTrackerModuleComponentParameters component : moduleParameters)
@@ -649,7 +671,7 @@
// Set the System ID.
expId.setValue(iddict.getFieldIndex("system"), subdet.getSystemID());
-
+
// Set the barrel-endcap flag.
if (id_helper.isEndcapPositive(endcap.getIdentifier()))
{
@@ -663,30 +685,30 @@
{
throw new RuntimeException(endcap.getName() + " - not pos or neg endcap!");
}
-
+
//System.out.println("barrel flag set to " + expId.getValue(iddict.getFieldIndex("barrel")));
-
+
// Set the layer number.
expId.setValue(iddict.getFieldIndex("layer"), layer.getGeometry().getPath().getLeafVolume().getCopyNumber());
-
+
// Set the wedge number.
expId.setValue(iddict.getFieldIndex("wedge"), wedge.getGeometry().getPath().getLeafVolume().getCopyNumber());
-
+
// Set the module id from the DetectorElement.
expId.setValue(iddict.getFieldIndex("module"),((SiTrackerModule)module).getModuleId());
-
+
// Set the sensor id for double-sided.
expId.setValue(iddict.getFieldIndex("sensor"),sensorId);
-
+
// Create the packed id using util method.
// No IdentifierHelper is available yet.
IIdentifier id = IdentifierUtil.pack( iddict, expId );
-
+
String sensorPath = modulePath.toString() + "/" + pv.getName();
String sensorName = endcap.getName() +
- "_layer" + layer.getGeometry().getPhysicalVolume().getCopyNumber() +
- "_wedge" + wedge.getGeometry().getPath().getLeafVolume().getCopyNumber() +
- "_module" + ((SiTrackerModule)module).getModuleId() + "_sensor" + sensorId;
+ "_layer" + layer.getGeometry().getPhysicalVolume().getCopyNumber() +
+ "_wedge" + wedge.getGeometry().getPath().getLeafVolume().getCopyNumber() +
+ "_module" + ((SiTrackerModule)module).getModuleId() + "_sensor" + sensorId;
//System.out.println(sensorName + " -> " + expId);
//System.out.println(sensorName + " -> " + id);
@@ -742,11 +764,11 @@
ITranslation3D electrodes_position = new Translation3D(VecOp.mult(-p_side.getDistance(),new BasicHep3Vector(0,0,1))); // translate to outside of polygon
IRotation3D electrodes_rotation = new RotationPassiveXYZ(side*(Math.PI/2),0,strip_angle); //
- Transform3D electrodes_transform = new Transform3D(electrodes_position, electrodes_rotation);
+ Transform3D electrodes_transform = new Transform3D(electrodes_position, electrodes_rotation);
// Free calculation of readout electrodes, sense electrodes determined thereon
SiSensorElectrodes readout_electrodes = new SiStrips(ChargeCarrier.HOLE,0.050,sensor,electrodes_transform);
- SiSensorElectrodes sense_electrodes = new SiStrips(ChargeCarrier.HOLE,0.025,(readout_electrodes.getNCells()*2-1),sensor,electrodes_transform);
+ SiSensorElectrodes sense_electrodes = new SiStrips(ChargeCarrier.HOLE,0.025,(readout_electrodes.getNCells()*2-1),sensor,electrodes_transform);
sensor.setSenseElectrodes(sense_electrodes);
sensor.setReadoutElectrodes(readout_electrodes);
@@ -757,7 +779,7 @@
// Increment sensorID for double-sided.
++sensorId;
}
- }
+ }
++moduleId;
}
}
@@ -772,7 +794,7 @@
double thickness;
boolean sensitive;
int componentNumber;
-
+
public ModuleComponentParameters(double thickness, String materialName, int componentNumber, boolean sensitive)
{
this.thickness = thickness;
@@ -780,28 +802,28 @@
this.sensitive = sensitive;
this.componentNumber = componentNumber;
}
-
+
public double getThickness()
{
return thickness;
}
-
+
public String getMaterialName()
{
return materialName;
}
-
+
public boolean isSensitive()
{
return sensitive;
}
-
+
public int getComponentNumber()
{
return componentNumber;
}
}
-
+
public static class ModuleParameters
extends ArrayList<ModuleComponentParameters>
{
@@ -815,13 +837,13 @@
{
try
{
-
+
Element e = (Element)o;
-
+
double thickness = e.getAttribute("thickness").getDoubleValue();
-
+
String materialName = e.getAttributeValue("material");
-
+
boolean sensitive = false;
if (e.getAttribute("sensitive") != null)
sensitive = e.getAttribute("sensitive").getBooleanValue();
@@ -835,7 +857,7 @@
}
calculateThickness();
}
-
+
public void calculateThickness()
{
thickness = 0.; // reset thickness
@@ -844,11 +866,11 @@
thickness += p.getThickness();
}
}
-
+
public double getThickness()
{
return thickness;
}
}
- */
+ */
}