GeomConverter/src/org/lcsim/detector/converter/compact
diff -u -r1.2 -r1.3
--- HPSTrackerConverter.java 13 Jan 2012 21:34:23 -0000 1.2
+++ HPSTrackerConverter.java 18 Jan 2012 00:25:44 -0000 1.3
@@ -1,5 +1,9 @@
package org.lcsim.detector.converter.compact;
+import hep.physics.matrix.BasicMatrix;
+import hep.physics.vec.BasicHep3Vector;
+import hep.physics.vec.VecOp;
+
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
@@ -14,9 +18,12 @@
import org.lcsim.detector.IDetectorElement;
import org.lcsim.detector.IPhysicalVolume;
import org.lcsim.detector.IPhysicalVolumePath;
+import org.lcsim.detector.IRotation3D;
+import org.lcsim.detector.ITranslation3D;
import org.lcsim.detector.LogicalVolume;
import org.lcsim.detector.PhysicalVolume;
import org.lcsim.detector.RotationGeant;
+import org.lcsim.detector.RotationPassiveXYZ;
import org.lcsim.detector.Transform3D;
import org.lcsim.detector.Translation3D;
import org.lcsim.detector.identifier.ExpandedIdentifier;
@@ -27,7 +34,10 @@
import org.lcsim.detector.material.IMaterial;
import org.lcsim.detector.material.MaterialStore;
import org.lcsim.detector.solids.Box;
+import org.lcsim.detector.solids.Polygon3D;
+import org.lcsim.detector.tracker.silicon.ChargeCarrier;
import org.lcsim.detector.tracker.silicon.SiSensor;
+import org.lcsim.detector.tracker.silicon.SiStrips;
import org.lcsim.detector.tracker.silicon.SiTrackerIdentifierHelper;
import org.lcsim.detector.tracker.silicon.SiTrackerModule;
import org.lcsim.geometry.compact.Detector;
@@ -39,6 +49,11 @@
Map<String, ModuleParameters> moduleParameters = new HashMap<String, ModuleParameters>();
Map<String, LogicalVolume> modules = new HashMap<String, LogicalVolume>();
IMaterial vacuum;
+
+ public Class getSubdetectorType()
+ {
+ return HPSTracker.class;
+ }
public IIdentifierHelper makeIdentifierHelper(Subdetector subdetector, SystemMap systemMap)
{
@@ -47,7 +62,7 @@
public void convert(Subdetector subdet, Detector detector)
{
- System.out.println("HPSTrackerConverter: Converting...");
+ //System.out.println("HPSTrackerConverter: Converting...");
try
{
Element node = subdet.getNode();
@@ -162,32 +177,22 @@
for (int kk = 0; kk < ny; kk++ )
{
String moduleBaseName = subdetName + "_layer" + layerId + "_module" + moduleNumber;
-
- // Positive endcap module.
Translation3D p = new Translation3D(x, y, z + dz);
-
- //RotationGeant rot = new RotationGeant(-Math.PI / 2, Math.PI / 2 + phi0, 0);
- RotationGeant rot = new RotationGeant(0, 0, 0);
+ RotationGeant rot = new RotationGeant(0, 0, phi0);
new PhysicalVolume(new Transform3D(p, rot), moduleBaseName, moduleVolume, detector.getTrackingVolume().getLogicalVolume(), 0);
String path = "/" + detector.getTrackingVolume().getName() + "/" + moduleBaseName;
- IDetectorElement modulePos = new SiTrackerModule(moduleBaseName, layerPos, path, moduleNumber);
- ++moduleNumber;
-
- // System.out.println("Making module " + moduleBaseName + " @ " + layerPos.toString());
+ new SiTrackerModule(moduleBaseName, layerPos, path, moduleNumber);
+ ++moduleNumber;
if (reflect)
{
Translation3D pr = new Translation3D(x, -y, z + dz);
double rphi0 = phi0;
if (flipSA)
rphi0 = -rphi0;
-
- //RotationGeant rotr = new RotationGeant(-Math.PI / 2, Math.PI / 2 + rphi0, 0);
- RotationGeant rotr = new RotationGeant(0, 0, 0);
-
+ RotationGeant rotr = new RotationGeant(0, 0, rphi0);
String path2 = "/" + detector.getTrackingVolume().getName() + "/" + moduleBaseName + "_reflected";
new PhysicalVolume(new Transform3D(pr, rotr), moduleBaseName + "_reflected", moduleVolume, detector.getTrackingVolume().getLogicalVolume(), k);
new SiTrackerModule(moduleBaseName + "_reflected", layerNeg, path2, moduleNumber);
- // System.out.println("Making module " + moduleBaseName + " @ " + layerNeg.toString());
}
dz = -dz;
@@ -203,9 +208,7 @@
{
throw new RuntimeException(except);
}
-
- // Create DetectorElements for the sensors.
- setupSensorDetectorElements(subdet);
+ makeSensors(subdet);
}
private LogicalVolume makeModule(ModuleParameters params)
@@ -249,7 +252,6 @@
double zrot = 0;
if (sensitive)
{
- // TODO Place embedded sensor here with possible dead area in outside (see LCDD converter).
if (sensorNumber > 1)
{
throw new RuntimeException("Exceeded maximum of 2 sensors per module.");
@@ -269,9 +271,10 @@
Box sensorBox = new Box(sensorName + "Box", sensorX / 2, sensorY / 2, componentThickness / 2);
LogicalVolume sensorVol = new LogicalVolume(sensorName, sensorBox, material);
Translation3D sensorPosition = new Translation3D(0, 0, 0);
- RotationGeant sensorRotation = new RotationGeant(0, 0, 0);
- PhysicalVolume sensorPhysVol = new PhysicalVolume(new Transform3D(sensorPosition, sensorRotation), sensorName, sensorVol, componentVolume, sensorNumber);
- //sensorPhysVol.addPhysVolID("sensor", sensor);
+ RotationGeant sensorRotation = new RotationGeant(0, 0, zrot);
+ //PhysicalVolume sensorPhysVol =
+ new PhysicalVolume(new Transform3D(sensorPosition, sensorRotation), sensorName, sensorVol, componentVolume, sensorNumber);
+ // TODO Could make sensors here?
++sensorNumber;
}
Translation3D position = new Translation3D(0., 0., posZ);
@@ -282,10 +285,10 @@
}
}
- private void setupSensorDetectorElements(Subdetector subdet)
+ // Called after geometry is in place to create the Sensor DetectorElements.
+ private void makeSensors(Subdetector subdet)
{
SiTrackerIdentifierHelper helper = (SiTrackerIdentifierHelper) subdet.getDetectorElement().getIdentifierHelper();
-
for (IDetectorElement endcap : subdet.getDetectorElement().getChildren())
{
for (IDetectorElement layer : endcap.getChildren())
@@ -297,10 +300,9 @@
int sensorId = 0;
for (IPhysicalVolume componentPhysVol : modulePhysVol.getLogicalVolume().getDaughters())
{
+ // Setup the sensor.
if (componentPhysVol.getLogicalVolume().getDaughters().size() != 0)
{
- //if (pv.isSensitive())
- //{
IPhysicalVolume sensorPhysVol = componentPhysVol.getLogicalVolume().getDaughters().get(0);
IIdentifierDictionary iddict = subdet.getDetectorElement().getIdentifierHelper().getIdentifierDictionary();
@@ -333,8 +335,13 @@
String sensorPath = modulePath.toString() + "/" + componentPhysVol.getName() + "/" + sensorPhysVol.getName();
String sensorName = module.getName() + "_sensor" + sensorId;
+ // Create the sensor.
SiSensor sensor = new SiSensor(sensorId, sensorName, module, sensorPath, id);
+
+ // Configure parameters of strips, etc.
+ configSensor(sensor);
+ // Increment sensor numbering.
++sensorId;
}
// }
@@ -343,10 +350,54 @@
}
}
}
+
+ // Parameters...
+ private double readoutCapacitanceIntercept = 0;
+ private double readoutCapacitanceSlope = 0.16;
+ private double senseCapacitanceIntercept = 0;
+ private double senseCapacitanceSlope = 0.16;
+ private double readoutStripPitch = 0.060;
+ private double senseStripPitch = 0.030;
+ private double readoutTransferEfficiency = 0.986;
+ private double senseTransferEfficiency = 0.419;
- public Class getSubdetectorType()
+ // TODO: Move this method to a Driver class.
+ private void configSensor(SiSensor sensor)
{
- return HPSTracker.class;
+ Box sensorSolid = (Box) sensor.getGeometry().getLogicalVolume().getSolid();
+
+ Polygon3D pside = sensorSolid.getFacesNormalTo(new BasicHep3Vector(0, 0, 1)).get(0);
+ Polygon3D nside = sensorSolid.getFacesNormalTo(new BasicHep3Vector(0, 0, -1)).get(0);
+
+ sensor.setBiasSurface(ChargeCarrier.HOLE, pside); // P side collects holes.
+ sensor.setBiasSurface(ChargeCarrier.ELECTRON, nside); // N side collects electrons.
+
+ // Setup electrodes on the XY front and back surfaces of the Box.
+ ITranslation3D electrodesPosition = new Translation3D(VecOp.mult(-pside.getDistance(), pside.getNormal())); // Translate to outside of polygon (always the same).
+
+ // Strip angle.
+ IRotation3D electrodesRotation = new RotationPassiveXYZ(0.0, 0.0, 0.0); // Strips aligned to edge of sensor, ALWAYS.
+ Transform3D electrodesTransform = new Transform3D(electrodesPosition, electrodesRotation);
+
+ // Free calculation of readout electrodes, sense electrodes determined thereon.
+ SiStrips readoutElectrodes = new SiStrips(ChargeCarrier.HOLE, readoutStripPitch, sensor, electrodesTransform);
+ SiStrips senseElectrodes = new SiStrips(ChargeCarrier.HOLE, senseStripPitch, (readoutElectrodes.getNCells()*2-1), sensor, electrodesTransform);
+
+ // Readout electrode parameters.
+ readoutElectrodes.setCapacitanceIntercept(readoutCapacitanceIntercept);
+ readoutElectrodes.setCapacitanceSlope(readoutCapacitanceSlope);
+
+ // Sense electrode parameters.
+ senseElectrodes.setCapacitanceIntercept(senseCapacitanceIntercept);
+ senseElectrodes.setCapacitanceSlope(senseCapacitanceSlope);
+
+ // Set sense and readout electrodes.
+ sensor.setSenseElectrodes(senseElectrodes);
+ sensor.setReadoutElectrodes(readoutElectrodes);
+
+ // Charge transfer efficiency.
+ double[][] transferEfficiencies = {{readoutTransferEfficiency, senseTransferEfficiency}};
+ sensor.setTransferEfficiencies(ChargeCarrier.HOLE, new BasicMatrix(transferEfficiencies));
}
static class ModuleComponentParameters
@@ -415,10 +466,8 @@
public ModuleParameters(Element element)
{
name = element.getAttributeValue("name");
-
if (element.getAttribute("vis") != null)
this.vis = element.getAttribute("vis").getValue();
-
// Optional dimension parameters (not always present).
if (element.getChild("trd") != null)
{
@@ -447,7 +496,6 @@
throw new RuntimeException(x);
}
}
-
int cntr = 0;
for (Object o : element.getChildren("module_component"))
{
@@ -485,7 +533,6 @@
}
++cntr;
}
-
calculateThickness();
}
@@ -520,5 +567,4 @@
return vis;
}
}
-
}