Commit in GeomConverter/src/org/lcsim/detector/converter/compact on MAIN | |||
HPSTrackerConverter.java | +79 | -33 | 1.2 -> 1.3 |
add sensor creation to the geometry driver for now; eventually will be moved to external Driver
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; } }
-
}
Use REPLY-ALL to reply to list
To unsubscribe from the LCD-CVS list, click the following link:
https://listserv.slac.stanford.edu/cgi-bin/wa?SUBED1=LCD-CVS&A=1