GeomConverter/src/org/lcsim/detector/converter/compact
diff -u -r1.9 -r1.10
--- SiTrackerEndcapConverter.java 7 Nov 2007 00:33:20 -0000 1.9
+++ SiTrackerEndcapConverter.java 5 Dec 2007 00:20:46 -0000 1.10
@@ -1,5 +1,8 @@
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.List;
@@ -10,19 +13,37 @@
import org.lcsim.detector.IDetectorElement;
import org.lcsim.detector.ILogicalVolume;
import org.lcsim.detector.IPhysicalVolume;
+import org.lcsim.detector.IPhysicalVolumePath;
+import org.lcsim.detector.IRotation3D;
import org.lcsim.detector.ITransform3D;
+import org.lcsim.detector.ITranslation3D;
import org.lcsim.detector.LogicalVolume;
import org.lcsim.detector.PhysicalVolume;
import org.lcsim.detector.Rotation3D;
import org.lcsim.detector.RotationPassiveXYZ;
import org.lcsim.detector.Transform3D;
import org.lcsim.detector.Translation3D;
+import org.lcsim.detector.identifier.ExpandedIdentifier;
+import org.lcsim.detector.identifier.IIdentifier;
+import org.lcsim.detector.identifier.IIdentifierDictionary;
+import org.lcsim.detector.identifier.IIdentifierDictionary.FieldNotFoundException;
+import org.lcsim.detector.identifier.IIdentifierDictionary.InvalidIndexException;
+import org.lcsim.detector.identifier.IdentifierDictionaryManager;
+import org.lcsim.detector.identifier.IdentifierUtil;
import org.lcsim.detector.material.IMaterial;
import org.lcsim.detector.material.MaterialStore;
import org.lcsim.detector.solids.Box;
+import org.lcsim.detector.solids.IPolyhedron;
+import org.lcsim.detector.solids.Polygon3D;
import org.lcsim.detector.solids.Trap;
import org.lcsim.detector.solids.Trd;
import org.lcsim.detector.solids.Tube;
+import org.lcsim.detector.tracker.silicon.ChargeCarrier;
+import org.lcsim.detector.tracker.silicon.SiSensor;
+import org.lcsim.detector.tracker.silicon.SiSensorElectrodes;
+import org.lcsim.detector.tracker.silicon.SiStrips;
+import org.lcsim.detector.tracker.silicon.SiTrackerBarrelModule;
+import org.lcsim.detector.tracker.silicon.SiTrackerIdentifierHelper;
import org.lcsim.geometry.compact.Detector;
import org.lcsim.geometry.compact.Subdetector;
import org.lcsim.geometry.subdetector.SiTrackerEndcap;
@@ -31,12 +52,12 @@
* Converter for SiTrackerEndcap.
*
* @author Jeremy McCormick, Tim Nelson
- * @version $Id: SiTrackerEndcapConverter.java,v 1.9 2007/11/07 00:33:20 jeremy Exp $
+ * @version $Id: SiTrackerEndcapConverter.java,v 1.10 2007/12/05 00:20:46 tknelson Exp $
*/
public class SiTrackerEndcapConverter
implements ISubdetectorConverter
-{
+{
private ModuleParameters moduleParameters = null;
public void convert(Subdetector subdet, Detector detector)
@@ -111,7 +132,7 @@
String wedgePath = layerPath + "/" + wedge.getName();
String wedgeName = layerName + "_wedge" + wedge.getCopyNumber();
IDetectorElement wedgeDE = new DetectorElement(wedgeName,layerDE,detector.getNavigator().getPath(wedgePath));
-
+
// Negative endcap.
String wedgePathReflect = layerPathReflect + "/" + wedge.getName();
String wedgeNameReflect = layerNameReflect + "_wedge" + wedge.getCopyNumber();
@@ -124,7 +145,7 @@
String modulePath = wedgePath + "/" + module.getName();
String moduleName = wedgeName + "_module" + module.getCopyNumber();
IDetectorElement moduleDE = new DetectorElement(moduleName,wedgeDE,detector.getNavigator().getPath(modulePath));
-
+
// Negative endcap module.
String modulePathReflect = wedgePathReflect + "/" + module.getName();
String moduleNameReflect = wedgeNameReflect + "_module" + module.getCopyNumber();
@@ -362,7 +383,7 @@
imodule++;
}
-
+
// Small symmetric trapezoids
if (ntraps == 1)
{
@@ -408,7 +429,7 @@
Trap sliceTrap = new Trap(sliceName,zsizes.get(i),theta*ix,0.0,dy,xsize1,xsize1,0.0,dy,xsize2,xsize2,0.0);
ILogicalVolume sliceLV = new LogicalVolume(sliceName, sliceTrap, sliceMaterial);
-
+
makeTrapModule(sliceLV, imodule);
Transform3D trans = new Transform3D(new Translation3D(ix*xcenter,0,zcenters.get(i)));
@@ -422,17 +443,17 @@
imodule++;
}
- }
- }
+ }
+ }
}
public void makeBoxModule(ILogicalVolume module, int moduleTypeId)
- {
+ {
Box moduleBox = (Box)module.getSolid();
double posY = -moduleBox.getYHalfLength();
double moduleX = moduleBox.getXHalfLength();
double moduleZ = moduleBox.getZHalfLength();
-
+
for (ModuleComponentParameters component : moduleParameters)
{
double thickness = component.getThickness();
@@ -447,12 +468,12 @@
Box sliceBox = new Box(componentName + "_box", moduleX, thickness / 2, moduleZ);
ILogicalVolume volume = new LogicalVolume(componentName, sliceBox, material);
-
+
Transform3D trans = new Transform3D(new Translation3D(0,posY,0));
PhysicalVolume pv = new PhysicalVolume(trans, componentName, volume, module, componentNumber);
pv.setSensitive(sensitive);
-
+
posY += thickness / 2;
}
}
@@ -486,9 +507,9 @@
PhysicalVolume pv = new PhysicalVolume(trans, componentName, volume, module, componentNumber);
pv.setSensitive(sensitive);
-
+
posY += thickness / 2;
- }
+ }
}
public void makeTrapModule(ILogicalVolume module, int moduleTypeId)
@@ -519,19 +540,19 @@
posY += thickness / 2;
- String componentName = "module" + moduleTypeId + "_component" + componentNumber;
+ String componentName = "module" + moduleTypeId + "_component" + componentNumber;
Trap sliceTrap = new Trap(componentName, z, theta, phi, thickness/2, x1, x2, a1, thickness/2, x3, x4, a2);
-
+
ILogicalVolume volume = new LogicalVolume(componentName, sliceTrap, material);
Transform3D trans = new Transform3D(new Translation3D(0,posY,0));
PhysicalVolume pv = new PhysicalVolume(trans, componentName, volume, module, componentNumber);
pv.setSensitive(sensitive);
-
+
posY += thickness / 2;
- }
+ }
}
public Class getSubdetectorType()
@@ -539,13 +560,170 @@
return SiTrackerEndcap.class;
}
+ private void setupSensorDetectorElements(Subdetector subdet)
+ {
+
+ SiTrackerIdentifierHelper id_helper = (SiTrackerIdentifierHelper)subdet.getDetectorElement().getIdentifierHelper();
+
+ int moduleId=0;
+
+ for ( IDetectorElement endcap : subdet.getDetectorElement().getChildren() )
+ {
+ for ( IDetectorElement layer : endcap.getChildren() )
+ {
+ int nwedges = layer.getChildren().size();
+ for ( IDetectorElement wedge : layer.getChildren() )
+ {
+ for ( IDetectorElement module : wedge.getChildren() )
+ {
+ IPhysicalVolumePath modulePath =
+ module.getGeometry().getPath();
+
+ IPhysicalVolume modulePhysVol =
+ modulePath.getLeafVolume();
+
+ int sensorId=0;
+ for ( IPhysicalVolume pv : modulePhysVol.getLogicalVolume().getDaughters())
+ {
+ // Create the identifier for this sensor.
+ if ( pv.isSensitive() )
+ {
+ IIdentifierDictionary iddict =
+ IdentifierDictionaryManager.getInstance().
+ getIdentifierDictionary( subdet.getReadout().getName() );
+
+ ExpandedIdentifier expId = new ExpandedIdentifier(iddict.getNumberOfFields());
+
+ try
+ {
+ // Set the System ID.
+ expId.setValue(iddict.getFieldIndex("system"), subdet.getSystemID());
+
+ // Set the barrel-endcap flag.
+ if (id_helper.isEndcapPositive(endcap.getIdentifier()))
+ {
+ expId.setValue(iddict.getFieldIndex("barrel"), id_helper.getEndcapPositiveValue());
+ }
+ else if (id_helper.isEndcapNegative(endcap.getIdentifier()))
+ {
+ expId.setValue(iddict.getFieldIndex("barrel"), id_helper.getEndcapNegativeValue());
+ }
+
+ // 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"),((SiTrackerBarrelModule)module).getModuleId());
+
+ // Set the sensor id for double-sided.
+ expId.setValue(iddict.getFieldIndex("sensor"),sensorId);
+ }
+ catch (FieldNotFoundException x)
+ {
+ throw new RuntimeException(x);
+ }
+
+ // Create the packed id using util method.
+ // No IdentifierHelper is available yet.
+ IIdentifier id = null;
+ try
+ {
+ id = IdentifierUtil.pack( iddict, expId );
+ }
+ catch (InvalidIndexException x)
+ {
+ throw new RuntimeException(x);
+ }
+
+ //System.out.println(pv.getName() + " is sens");
+ //System.out.println("path : " + modulePath.toString() + "/" + pv.getName());
+ String sensorPath = modulePath.toString() + "/" + pv.getName();
+ //String sensorName = subdet.getName() + "_layer" + layer.getGeometry().getPhysicalVolume().getCopyNumber() + "_module" + moduleId + "_sensor" + sensorId;
+ String sensorName = subdet.getName() + "_endcap" + id_helper.getBarrel(endcap.getIdentifier()) +
+ "_layer" + layer.getGeometry().getPhysicalVolume().getCopyNumber() +
+ "_wedge" + wedge.getGeometry().getPath().getLeafVolume().getCopyNumber() +
+ "_module" + ((SiTrackerBarrelModule)module).getModuleId() + "_sensor" + sensorId;
+
+ SiSensor sensor = new SiSensor(sensorId,sensorName,module,sensorPath,id);
+ sensor.setIdentifier(id);
+
+ // Set up SiStrips for the sensors
+ IPolyhedron sensor_solid = (IPolyhedron)sensor.getGeometry().getLogicalVolume().getSolid();
+
+ Polygon3D inner_surface = sensor_solid.getFacesNormalTo(new BasicHep3Vector(0,0,-1)).get(0);
+ Polygon3D outer_surface = sensor_solid.getFacesNormalTo(new BasicHep3Vector(0,0,1)).get(0);
+ double strip_angle_magnitude = Math.PI/nwedges;
+
+ Polygon3D p_side;
+ Polygon3D n_side;
+ double strip_angle;
+
+ if (sensorId == 0) // inner sensor
+ {
+ p_side = inner_surface;
+ n_side = outer_surface;
+ strip_angle = strip_angle_magnitude;
+ }
+ else // outer sensor
+ {
+ p_side = outer_surface;
+ n_side = inner_surface;
+ strip_angle = -1*strip_angle_magnitude;
+ }
+
+// System.out.println("Plane of p_side polygon has... ");
+// System.out.println(" normal: "+p_side.getNormal());
+// System.out.println(" distance: "+p_side.getDistance());
+// for (Point3D point : p_side.getClosedVertices())
+// {
+// System.out.println(" Vertex: "+point);
+// }
+
+// System.out.println("Plane of n_side polygon has... ");
+// System.out.println(" normal: "+n_side.getNormal());
+// System.out.println(" distance: "+n_side.getDistance());
+
+ // Bias the sensor
+ sensor.setBiasSurface(ChargeCarrier.HOLE,p_side);
+ sensor.setBiasSurface(ChargeCarrier.ELECTRON,n_side);
+
+ ITranslation3D electrodes_position = new Translation3D(VecOp.mult(p_side.getDistance(),p_side.getNormal())); // translate to p_side
+ IRotation3D electrodes_rotation = new RotationPassiveXYZ(0.0,strip_angle,0.0); // no rotation (global x-y = local x-y for axial strips)
+ Transform3D electrodes_transform = new Transform3D(electrodes_position, electrodes_rotation);
+
+ // Free calculation of sense electrodes, readout electrodes determined thereon
+ SiSensorElectrodes sense_electrodes = new SiStrips(ChargeCarrier.HOLE,0.025,sensor,electrodes_transform);
+ SiSensorElectrodes readout_electrodes = new SiStrips(ChargeCarrier.HOLE,0.050,(sense_electrodes.getNCells()+1)/2,sensor,electrodes_transform);
+
+ sensor.setSenseElectrodes(sense_electrodes);
+ sensor.setReadoutElectrodes(readout_electrodes);
+
+ double[][] transfer_efficiencies = { {0.986,0.419} };
+ sensor.setTransferEfficiencies(ChargeCarrier.HOLE,new BasicMatrix(transfer_efficiencies));
+
+ // Incremenet sensorID for double-sided.
+ ++sensorId;
+
+ }
+ }
+
+ ++moduleId;
+ }
+ }
+ }
+ }
+ }
+
public static class ModuleComponentParameters
{
String materialName;
double thickness;
boolean sensitive;
int componentNumber;
-
+
public ModuleComponentParameters(double thickness, String materialName, int componentNumber, boolean sensitive)
{
this.thickness = thickness;
@@ -576,7 +754,7 @@
}
public static class ModuleParameters
- extends ArrayList<ModuleComponentParameters>
+ extends ArrayList<ModuleComponentParameters>
{
double thickness=0.;
String name;
@@ -586,7 +764,8 @@
int cntr=0;
for (Object o : element.getChildren("module_component"))
{
- try {
+ try
+ {
Element e = (Element)o;
@@ -607,7 +786,7 @@
}
calculateThickness();
}
-
+
public void calculateThickness()
{
thickness = 0.; // reset thickness