4 added + 2 removed + 6 modified, total 12 files
GeomConverter/src/org/lcsim/detector/converter/compact
diff -N SiTrackerEndcap2Converter.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ SiTrackerEndcap2Converter.java 3 Dec 2008 00:53:45 -0000 1.1
@@ -0,0 +1,375 @@
+package org.lcsim.detector.converter.compact;
+
+import hep.physics.matrix.BasicMatrix;
+import hep.physics.vec.BasicHep3Vector;
+import hep.physics.vec.VecOp;
+
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
+import org.jdom.Element;
+import org.jdom.JDOMException;
+import org.lcsim.detector.DetectorElement;
+import org.lcsim.detector.DetectorIdentifierHelper;
+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.DetectorIdentifierHelper.SystemMap;
+import org.lcsim.detector.identifier.ExpandedIdentifier;
+import org.lcsim.detector.identifier.IExpandedIdentifier;
+import org.lcsim.detector.identifier.IIdentifier;
+import org.lcsim.detector.identifier.IIdentifierDictionary;
+import org.lcsim.detector.identifier.IIdentifierHelper;
+import org.lcsim.detector.identifier.IdentifierUtil;
+import org.lcsim.detector.material.IMaterial;
+import org.lcsim.detector.material.MaterialStore;
+import org.lcsim.detector.solids.Point3D;
+import org.lcsim.detector.solids.Polygon3D;
+import org.lcsim.detector.solids.Trd;
+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.SiTrackerIdentifierHelper;
+import org.lcsim.detector.tracker.silicon.SiTrackerModule;
+import org.lcsim.geometry.compact.Detector;
+import org.lcsim.geometry.compact.Subdetector;
+import org.lcsim.geometry.compact.converter.SiTrackerModuleComponentParameters;
+import org.lcsim.geometry.compact.converter.SiTrackerModuleParameters;
+import org.lcsim.geometry.subdetector.SiTrackerEndcap2;
+
+/**
+ * An LCDD converter for a Silicon endcap tracker model based on Bill Cooper's design from
+ * <a href="http://ilcagenda.linearcollider.org/materialDisplay.py?contribId=58&sessionId=1&materialId=slides&confId=2784">Boulder SiD Workshop 2008</a>.
+ *
+ * @author jeremym
+ */
+public class SiTrackerEndcap2Converter
+extends AbstractSubdetectorConverter
+implements ISubdetectorConverter
+{
+ Map<String,SiTrackerModuleParameters> moduleParameters = new HashMap<String,SiTrackerModuleParameters>();
+ Map<String,LogicalVolume> modules = new HashMap<String,LogicalVolume>();
+ IMaterial vacuum;
+
+ public IIdentifierHelper makeIdentifierHelper(Subdetector subdetector, SystemMap systemMap)
+ {
+ return new SiTrackerIdentifierHelper(
+ subdetector.getDetectorElement(),
+ makeIdentifierDictionary(subdetector),
+ systemMap);
+ }
+
+ public void convert(Subdetector subdet, Detector detector)
+ {
+ try
+ {
+ Element node = subdet.getNode();
+ int sysId = node.getAttribute("id").getIntValue();
+ String subdetName = node.getAttributeValue("name");
+ vacuum = MaterialStore.getInstance().get("Air");
+
+ boolean reflect;
+ if (node.getAttribute("reflect") != null)
+ reflect = node.getAttribute("reflect").getBooleanValue();
+ else
+ reflect = true;
+
+ IDetectorElement subdetDetElem = subdet.getDetectorElement();
+ DetectorIdentifierHelper helper = (DetectorIdentifierHelper)subdetDetElem.getIdentifierHelper();
+ int nfields = helper.getIdentifierDictionary().getNumberOfFields();
+ IDetectorElement endcapPos = null;
+ IDetectorElement endcapNeg = null;
+ try
+ {
+ // Positive endcap DE
+ IExpandedIdentifier endcapPosId = new ExpandedIdentifier(nfields);
+ endcapPosId.setValue(helper.getFieldIndex("system"), subdet.getSystemID());
+ endcapPosId.setValue(helper.getFieldIndex("barrel"), helper.getEndcapPositiveValue());
+ endcapPos = new DetectorElement(subdet.getName() + "_positive", subdetDetElem);
+ endcapPos.setIdentifier(helper.pack(endcapPosId));
+
+ // Negative endcap DE.
+ if (reflect)
+ {
+ IExpandedIdentifier endcapNegId = new ExpandedIdentifier(nfields);
+ endcapNegId.setValue(helper.getFieldIndex("system"), subdet.getSystemID());
+ endcapNegId.setValue(helper.getFieldIndex("barrel"), helper.getEndcapNegativeValue());
+ endcapNeg = new DetectorElement(subdet.getName() + "_negative", subdetDetElem);
+ endcapNeg.setIdentifier(helper.pack(endcapNegId));
+ }
+
+ }
+ catch (Exception x)
+ {
+ throw new RuntimeException(x);
+ }
+
+ for (Iterator i = node.getChildren("module").iterator(); i.hasNext();)
+ {
+ Element module = (Element)i.next();
+ String moduleName = module.getAttributeValue("name");
+ moduleParameters.put(moduleName, new SiTrackerModuleParameters(module));
+ modules.put(moduleName, makeModule(moduleParameters.get(moduleName)));
+ }
+
+ for (Iterator i = node.getChildren("layer").iterator(); i.hasNext();)
+ {
+ Element layerElement = (Element) i.next();
+
+ int layerId = layerElement.getAttribute("id").getIntValue();
+
+ // Positive endcap layer.
+ IExpandedIdentifier layerPosId = new ExpandedIdentifier(nfields);
+ layerPosId.setValue(helper.getFieldIndex("system"), subdet.getSystemID());
+ layerPosId.setValue(helper.getFieldIndex("barrel"), helper.getEndcapPositiveValue());
+ layerPosId.setValue(helper.getFieldIndex("layer"), layerId);
+ IDetectorElement layerPos = new DetectorElement(endcapPos.getName() + "_layer" + layerId, endcapPos);
+ layerPos.setIdentifier(helper.pack(layerPosId));
+
+ // Negative endcap layer.
+ IDetectorElement layerNeg = null;
+ if (reflect)
+ {
+ IExpandedIdentifier layerNegId = new ExpandedIdentifier(nfields);
+ layerPosId.setValue(helper.getFieldIndex("system"), subdet.getSystemID());
+ layerPosId.setValue(helper.getFieldIndex("barrel"), helper.getEndcapNegativeValue());
+ layerPosId.setValue(helper.getFieldIndex("layer"), layerId);
+ layerNeg = new DetectorElement(endcapNeg.getName() + "_layer" + layerId, endcapNeg);
+ layerNeg.setIdentifier(helper.pack(layerNegId));
+ }
+
+ int moduleNumber = 0;
+ for (Iterator j = layerElement.getChildren("ring").iterator(); j.hasNext();)
+ {
+ Element ringElement = (Element) j.next();
+ double r = ringElement.getAttribute("r").getDoubleValue();
+ double phi0 = ringElement.getAttribute("phi0").getDoubleValue();
+ double zstart = ringElement.getAttribute("zstart").getDoubleValue();
+ double dz = Math.abs(ringElement.getAttribute("dz").getDoubleValue());
+ int nmodules = ringElement.getAttribute("nmodules").getIntValue();
+ String module = ringElement.getAttributeValue("module");
+ LogicalVolume moduleVolume = modules.get(module);
+ if (moduleVolume == null)
+ throw new RuntimeException("Module " + module + " was not found.");
+ double iphi = (2 * Math.PI) / nmodules;
+ double phi = phi0;
+ for (int k = 0; k < nmodules; k++)
+ {
+ String moduleBaseName = subdetName + "_layer" + layerId + "_module" + moduleNumber;
+
+ double x = r * Math.cos(phi);
+ double y = r * Math.sin(phi);
+
+ // Positive endcap module.
+ Translation3D p = new Translation3D(x,y,zstart+dz);
+ RotationGeant rot = new RotationGeant(-Math.PI/2, -Math.PI/2 - phi, 0);
+ new PhysicalVolume(new Transform3D(p,rot), moduleBaseName, moduleVolume, detector.getTrackingVolume().getLogicalVolume(), k);
+ String path = "/" + detector.getTrackingVolume().getName() + "/" + moduleBaseName;
+ IDetectorElement modulePos = new SiTrackerModule(moduleBaseName, layerPos, path, moduleNumber);
+
+ // Negative endcap module.
+ if (reflect)
+ {
+ Translation3D pr = new Translation3D(x,y,-zstart-dz);
+ RotationGeant rotr = new RotationGeant(-Math.PI/2, -Math.PI/2 - phi, Math.PI);
+
+ 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);
+ }
+
+ dz = -dz;
+ phi += iphi;
+ ++moduleNumber;
+ }
+ }
+ }
+ }
+ catch (JDOMException except)
+ {
+ throw new RuntimeException(except);
+ }
+
+ // Create DetectorElements for the sensors.
+ setupSensorDetectorElements(subdet);
+ }
+
+ private LogicalVolume makeModule(SiTrackerModuleParameters params)
+ {
+ double thickness = params.getThickness();
+ double dx1, dx2, dy1, dy2, dz;
+ dy1 = dy2 = thickness / 2;
+ dx1 = params.getDimension(0);
+ dx2 = params.getDimension(1);
+ dz = params.getDimension(2);
+ Trd envelope = new Trd(params.getName() + "Trd", dx1, dx2, dy1, dy2, dz);
+ LogicalVolume volume = new LogicalVolume(params.getName() + "Volume", envelope, vacuum);
+ makeModuleComponents(volume, params);
+ return volume;
+ }
+
+ private void makeModuleComponents(LogicalVolume moduleVolume, SiTrackerModuleParameters moduleParameters)
+ {
+ Trd trd = (Trd)moduleVolume.getSolid();
+
+ double x1 = trd.getXHalfLength1();
+ double x2 = trd.getXHalfLength2();
+ double y1 = trd.getYHalfLength1();
+ double z = trd.getZHalfLength();
+
+ double posY = -y1;
+
+ String moduleName = moduleVolume.getName();
+
+ int sensor=0;
+ for (SiTrackerModuleComponentParameters component : moduleParameters)
+ {
+ double thickness = component.getThickness();
+
+ IMaterial material = MaterialStore.getInstance().get(component.getMaterialName());
+ if (material == null)
+ {
+ throw new RuntimeException("The material " + component.getMaterialName() + " does not exist in the materials database.");
+ }
+ boolean sensitive = component.isSensitive();
+ int componentNumber = component.getComponentNumber();
+
+ posY += thickness / 2;
+
+ String componentName = moduleName + "_component" + componentNumber;
+
+ Trd sliceTrd = new Trd(componentName + "_trd", x1, x2, thickness/2, thickness/2, z);
+
+ LogicalVolume volume = new LogicalVolume(componentName, sliceTrd, material);
+
+ double zrot = 0;
+ if (sensitive)
+ {
+ if (sensor > 1)
+ {
+ throw new RuntimeException("Exceeded maximum of 2 sensors per module.");
+ }
+ // Flip 180 deg for 1st sensor.
+ if (sensor == 0)
+ {
+ zrot = Math.PI;
+ }
+ ++sensor;
+ }
+ Translation3D position = new Translation3D(0.,posY,0);
+ RotationGeant rotation = new RotationGeant(0,0,zrot);
+ PhysicalVolume pv = new PhysicalVolume(new Transform3D(position,rotation), componentName, volume, moduleVolume, componentNumber);
+ pv.setSensitive(sensitive);
+
+ posY += thickness / 2;
+ }
+ }
+
+ private void setupSensorDetectorElements(Subdetector subdet)
+ {
+ SiTrackerIdentifierHelper helper = (SiTrackerIdentifierHelper)subdet.getDetectorElement().getIdentifierHelper();
+
+ for (IDetectorElement endcap : subdet.getDetectorElement().getChildren())
+ {
+ for (IDetectorElement layer : endcap.getChildren() )
+ {
+ for (IDetectorElement module : layer.getChildren())
+ {
+ IPhysicalVolume modulePhysVol = module.getGeometry().getPhysicalVolume();
+ IPhysicalVolumePath modulePath = module.getGeometry().getPath();
+ int sensorId=0;
+ for (IPhysicalVolume pv : modulePhysVol.getLogicalVolume().getDaughters())
+ {
+ //System.out.println(pv.getName());
+ if (pv.isSensitive())
+ {
+ IIdentifierDictionary iddict = subdet.getDetectorElement().getIdentifierHelper().getIdentifierDictionary();
+
+ ExpandedIdentifier expId = new ExpandedIdentifier(iddict.getNumberOfFields());
+ expId.setValue(iddict.getFieldIndex("system"), subdet.getSystemID());
+
+ if (helper.isEndcapPositive(endcap.getIdentifier()))
+ {
+ expId.setValue(iddict.getFieldIndex("barrel"), helper.getEndcapPositiveValue());
+ }
+ else if (helper.isEndcapNegative(endcap.getIdentifier()))
+ {
+ expId.setValue(iddict.getFieldIndex("barrel"), helper.getEndcapNegativeValue());
+ }
+ else
+ {
+ throw new RuntimeException(endcap.getName() + " is not a positive or negative endcap!");
+ }
+ expId.setValue(iddict.getFieldIndex("layer"), layer.getIdentifierHelper().getValue(layer.getIdentifier(), "layer"));
+ expId.setValue(iddict.getFieldIndex("module"), ((SiTrackerModule)module).getModuleId());
+ expId.setValue(iddict.getFieldIndex("sensor"), sensorId);
+
+ IIdentifier id = IdentifierUtil.pack(iddict, expId);
+
+ String sensorPath = modulePath.toString() + "/" + pv.getName();
+ String sensorName = layer.getName() + module.getName();
+
+ SiSensor sensor = new SiSensor(sensorId,sensorName,module,sensorPath,id);
+
+ // Set up SiStrips for the sensors
+ Trd sensor_solid = (Trd)sensor.getGeometry().getLogicalVolume().getSolid();
+
+ Polygon3D n_side = sensor_solid.getFacesNormalTo(new BasicHep3Vector(0,-1,0)).get(0);
+ Polygon3D p_side = sensor_solid.getFacesNormalTo(new BasicHep3Vector(0,1,0)).get(0);
+
+ 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.getVertices())
+ {
+ 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);
+
+ //double strip_angle = Math.PI/nwedges;
+ double strip_angle = Math.atan2(sensor_solid.getXHalfLength2() - sensor_solid.getXHalfLength1(), sensor_solid.getZHalfLength() * 2);
+
+ 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(-Math.PI/2,0,strip_angle);
+ 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);
+
+ sensor.setSenseElectrodes(sense_electrodes);
+ sensor.setReadoutElectrodes(readout_electrodes);
+
+ double[][] transfer_efficiencies = { {0.986,0.419} };
+ sensor.setTransferEfficiencies(ChargeCarrier.HOLE,new BasicMatrix(transfer_efficiencies));
+
+ ++sensorId;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ public Class getSubdetectorType()
+ {
+ return SiTrackerEndcap2.class;
+ }
+}
\ No newline at end of file
GeomConverter/src/org/lcsim/detector/converter/compact
diff -u -r1.39 -r1.40
--- DetectorConverter.java 7 Jul 2008 22:19:04 -0000 1.39
+++ DetectorConverter.java 3 Dec 2008 00:53:45 -0000 1.40
@@ -82,17 +82,18 @@
public DetectorConverter()
- {
- addSubdetectorConverter( new CylindricalBarrelCalorimeterConverter() );
- addSubdetectorConverter( new CylindricalEndcapCalorimeterConverter() );
- addSubdetectorConverter( new MultiLayerTrackerConverter() );
- addSubdetectorConverter( new DiskTrackerConverter() );
- addSubdetectorConverter( new SiTrackerBarrelConverter() );
- addSubdetectorConverter( new PolyconeSupportConverter() );
- addSubdetectorConverter( new SiTrackerEndcapConverter() );
- addSubdetectorConverter( new PolyhedraBarrelCalorimeterConverter() );
- addSubdetectorConverter( new PolyhedraEndcapCalorimeterConverter() );
- addSubdetectorConverter( new TubeSegmentConverter() );
+ {
+ addSubdetectorConverter(new CylindricalBarrelCalorimeterConverter());
+ addSubdetectorConverter(new CylindricalEndcapCalorimeterConverter());
+ addSubdetectorConverter(new MultiLayerTrackerConverter());
+ addSubdetectorConverter(new DiskTrackerConverter());
+ addSubdetectorConverter(new SiTrackerBarrelConverter());
+ addSubdetectorConverter(new PolyconeSupportConverter());
+ addSubdetectorConverter(new SiTrackerEndcapConverter());
+ addSubdetectorConverter(new SiTrackerEndcap2Converter());
+ addSubdetectorConverter(new PolyhedraBarrelCalorimeterConverter());
+ addSubdetectorConverter(new PolyhedraEndcapCalorimeterConverter());
+ addSubdetectorConverter(new TubeSegmentConverter());
}
private void addSubdetectorConverter(ISubdetectorConverter s)
@@ -142,14 +143,14 @@
{
// Process all Subdetectors in the Detector.
for ( Subdetector subdetector : detector.getSubdetectors().values())
- {
+ {
// Find a converter for this type.
ISubdetectorConverter cnv = getSubdetectorConverter(subdetector.getClass());
-
+
if ( cnv != null )
{
DetectorElement subdetectorDE = (DetectorElement)cnv.makeSubdetectorDetectorElement(detector, subdetector);
-
+
// Make the IdentifierHelper for this Subdetector.
IIdentifierHelper helper = cnv.makeIdentifierHelper(subdetector, sysMap);
@@ -174,7 +175,7 @@
// Check if a DetectorElement was created. Some compact "detector" objects
// are not really detectors but dead material so this check is necessary
// to avoid errors.
- if ( subdetDE != null)
+ if (subdetDE != null)
{
// Make the Parameters from the compact detector element
// and assign to the Subdetector's DetectorElement.
@@ -228,7 +229,8 @@
if ( constants.get("world_x") == null ||
constants.get("world_y") == null ||
- constants.get("world_z") == null ) {
+ constants.get("world_z") == null )
+ {
throw new RuntimeException("Missing world_x, world_y, or world_z!");
}
GeomConverter/src/org/lcsim/detector/converter/compact
diff -u -r1.27 -r1.28
--- SiTrackerEndcapConverter.java 2 Jul 2008 21:38:32 -0000 1.27
+++ SiTrackerEndcapConverter.java 3 Dec 2008 00:53:45 -0000 1.28
@@ -12,7 +12,6 @@
import org.jdom.Attribute;
import org.jdom.DataConversionException;
import org.jdom.Element;
-import org.jdom.JDOMException;
import org.lcsim.detector.DetectorElement;
import org.lcsim.detector.DetectorIdentifierHelper;
import org.lcsim.detector.IDetectorElement;
@@ -52,13 +51,15 @@
import org.lcsim.detector.tracker.silicon.SiTrackerModule;
import org.lcsim.geometry.compact.Detector;
import org.lcsim.geometry.compact.Subdetector;
+import org.lcsim.geometry.compact.converter.SiTrackerModuleComponentParameters;
+import org.lcsim.geometry.compact.converter.SiTrackerModuleParameters;
import org.lcsim.geometry.subdetector.SiTrackerEndcap;
/**
* Converter for SiTrackerEndcap.
*
* @author Jeremy McCormick, Tim Nelson
- * @version $Id: SiTrackerEndcapConverter.java,v 1.27 2008/07/02 21:38:32 jeremy Exp $
+ * @version $Id: SiTrackerEndcapConverter.java,v 1.28 2008/12/03 00:53:45 jeremy Exp $
*/
public class SiTrackerEndcapConverter
@@ -78,7 +79,7 @@
public void convert(Subdetector subdet, Detector detector)
{
- Map<String, ModuleParameters> moduleParameters = new HashMap<String, ModuleParameters>();
+ Map<String, SiTrackerModuleParameters> moduleParameters = new HashMap<String, SiTrackerModuleParameters>();
IPhysicalVolume trackingPV = detector.getTrackingVolume();
ILogicalVolume trackingLV = trackingPV.getLogicalVolume();
@@ -118,7 +119,7 @@
for (Object n : node.getChildren("module"))
{
Element e = (Element)n;
- moduleParameters.put(e.getAttributeValue("name"), new ModuleParameters(e));
+ moduleParameters.put(e.getAttributeValue("name"), new SiTrackerModuleParameters(e));
}
for (Object o : node.getChildren("layer"))
@@ -179,7 +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())
@@ -187,8 +193,8 @@
// Positive endcap module.
String modulePath = wedgePath + "/" + module.getName();
String moduleName = wedgeName + "_module" + module.getCopyNumber();
- //IDetectorElement moduleDE = new DetectorElement(moduleName,wedgeDE,detector.getNavigator().getPath(modulePath));
- IDetectorElement moduleDE = new SiTrackerModule(
+ IDetectorElement moduleDE =
+ new SiTrackerModule(
moduleName,
wedgeDE,
detector.getNavigator().getPath(modulePath).toString(),
@@ -197,37 +203,13 @@
// Negative endcap module.
String modulePathReflect = wedgePathReflect + "/" + module.getName();
String moduleNameReflect = wedgeNameReflect + "_module" + module.getCopyNumber();
- //IDetectorElement moduleDEReflect = new DetectorElement(moduleNameReflect,wedgeDEReflect,detector.getNavigator().getPath(modulePathReflect));
- IDetectorElement moduleDEReflect = new SiTrackerModule(
+ IDetectorElement moduleDEReflect =
+ new SiTrackerModule(
moduleNameReflect,
wedgeDEReflect,
detector.getNavigator().getPath(modulePathReflect).toString(),
module.getCopyNumber()
- );
-
- // I believe this is correctly done now in setupSensorDetectorElements()
-// // Sensor DEs.
-// for (IPhysicalVolume component : module.getLogicalVolume().getDaughters())
-// {
-// if (component.isSensitive())
-// {
-// int sensorNum = component.getCopyNumber();
-//
-// // Positive endcap component.
-// new SiSensor(
-// sensorNum,
-// moduleName + "_component" + sensorNum,
-// moduleDE,
-// detector.getNavigator().getPath(modulePath + "/" + component.getName()).toString());
-//
-// // Negative endcap component. (should have same physical layout as positive)
-// new SiSensor(
-// sensorNum,
-// moduleNameReflect + "_component" + sensorNum,
-// moduleDEReflect,
-// detector.getNavigator().getPath(modulePathReflect + "/" + component.getName()).toString());
-// }
-// }
+ );
}
}
}
@@ -278,7 +260,7 @@
double thickness,
int nwedges,
Element layerElement,
- Map<String, ModuleParameters> moduleParameters
+ Map<String, SiTrackerModuleParameters> moduleParameters
)
{
int layern;
@@ -313,14 +295,13 @@
if (moduleref == null)
throw new RuntimeException("module reference is missing for layer number " + layern);
- ModuleParameters module = moduleParameters.get(moduleref.getValue());
+ SiTrackerModuleParameters module = moduleParameters.get(moduleref.getValue());
// Make the modules in the wedge.
makeModules(subdet, wedgeLV, layerElement.getChild("module_parameters"), module, layern);
// Place the wedges in the layer.
double r = (innerR + outerR) / 2;
- //String wedgeName = wedgeLV.getName();
for (int i=0; i<nwedges; i++)
{
@@ -329,7 +310,6 @@
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);
IRotation3D rot = new RotationGeant(-Math.PI/2,-Math.PI/2 - phi,0.);
Transform3D transform = new Transform3D(p,rot);
new PhysicalVolume(
@@ -344,7 +324,7 @@
}
- private void makeModules(Subdetector subdet, ILogicalVolume wedgeLV, Element moduleElement, ModuleParameters module, int layern)
+ private void makeModules(Subdetector subdet, ILogicalVolume wedgeLV, Element moduleElement, SiTrackerModuleParameters module, int layern)
{
double r_size;
try
@@ -521,14 +501,14 @@
}
}
- public void makeBoxModule(ILogicalVolume module, ModuleParameters moduleParameters, int moduleTypeId)
+ public void makeBoxModule(ILogicalVolume module, SiTrackerModuleParameters moduleParameters, int moduleTypeId)
{
Box moduleBox = (Box)module.getSolid();
double posY = -moduleBox.getYHalfLength();
double moduleX = moduleBox.getXHalfLength();
double moduleZ = moduleBox.getZHalfLength();
- for (ModuleComponentParameters component : moduleParameters)
+ for (SiTrackerModuleComponentParameters component : moduleParameters)
{
double thickness = component.getThickness();
IMaterial material = MaterialStore.getInstance().get(component.getMaterialName());
@@ -552,7 +532,7 @@
}
}
- public void makeTrdModule(ILogicalVolume module, ModuleParameters moduleParameters, int moduleTypeId)
+ public void makeTrdModule(ILogicalVolume module, SiTrackerModuleParameters moduleParameters, int moduleTypeId)
{
Trd trd = (Trd)module.getSolid();
double x1 = trd.getXHalfLength1();
@@ -562,7 +542,7 @@
double posY = -y1;
- for (ModuleComponentParameters component : moduleParameters)
+ for (SiTrackerModuleComponentParameters component : moduleParameters)
{
double thickness = component.getThickness();
IMaterial material = MaterialStore.getInstance().get(component.getMaterialName());
@@ -586,7 +566,7 @@
}
}
- public void makeTrapModule(ILogicalVolume module, ModuleParameters moduleParameters, int moduleTypeId)
+ public void makeTrapModule(ILogicalVolume module, SiTrackerModuleParameters moduleParameters, int moduleTypeId)
{
Trap trap = (Trap)module.getSolid();
double a1 = trap.getAlpha1();
@@ -601,7 +581,7 @@
double phi = trap.getPhi();
double posY = -y1;
- for (ModuleComponentParameters component : moduleParameters)
+ for (SiTrackerModuleComponentParameters component : moduleParameters)
{
double thickness = component.getThickness();
IMaterial material = MaterialStore.getInstance().get(component.getMaterialName());
@@ -713,7 +693,6 @@
//System.out.println();
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();
@@ -762,20 +741,12 @@
//System.out.println(" side = : "+side);
ITranslation3D electrodes_position = new Translation3D(VecOp.mult(-p_side.getDistance(),new BasicHep3Vector(0,0,1))); // translate to outside of polygon
-// ITranslation3D electrodes_position = new Translation3D(VecOp.mult(-p_side.getDistance(),p_side.getNormal())); // translate to p_side
IRotation3D electrodes_rotation = new RotationPassiveXYZ(side*(Math.PI/2),0,strip_angle); //
- Transform3D electrodes_transform = new Transform3D(electrodes_position, electrodes_rotation);
-
- //System.out.println(" electrodes_transform translation: \n"+electrodes_transform.getTranslation().getTranslationVector());
- //System.out.println(" electrodes_transform rotation: \n"+electrodes_transform.getRotation().getRotationMatrix());
+ 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);
-
-// // 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);
+ 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);
@@ -783,11 +754,10 @@
double[][] transfer_efficiencies = { {0.986,0.419} };
sensor.setTransferEfficiencies(ChargeCarrier.HOLE,new BasicMatrix(transfer_efficiencies));
- // Incremenet sensorID for double-sided.
+ // Increment sensorID for double-sided.
++sensorId;
}
- }
-
+ }
++moduleId;
}
}
@@ -795,6 +765,7 @@
}
}
+ /*
public static class ModuleComponentParameters
{
String materialName;
@@ -879,4 +850,5 @@
return thickness;
}
}
+ */
}
GeomConverter/src/org/lcsim/detector/converter/heprep
diff -u -r1.14 -r1.15
--- DetectorElementToHepRepConverter.java 7 Jul 2008 22:18:21 -0000 1.14
+++ DetectorElementToHepRepConverter.java 3 Dec 2008 00:53:45 -0000 1.15
@@ -27,12 +27,9 @@
{
public static void convert(IDetectorElement detelem, HepRepFactory factory, HepRep heprep, int currentDepth, int maxDepth)
{
- //System.out.println("convert");
if (maxDepth != -1 && currentDepth > maxDepth)
return;
-
- //System.out.println("converting " + detelem.getName());
-
+
HepRepInstanceTree instanceTree = heprep.getInstanceTreeTop("Detector","1.0");
HepRepTypeTree typeTree = heprep.getTypeTree("DetectorType","1.0");
@@ -60,8 +57,7 @@
Hep3Vector p = geo.transformLocalToGlobal(points.get(point_ordering[i]));
factory.createHepRepPoint(instance,p.x(),p.y(),p.z());
}
- }
-
+ }
else if ( solid instanceof Tube )
{
Tube tube = (Tube)geo.getLogicalVolume().getSolid();
GeomConverter/src/org/lcsim/geometry/compact/converter
diff -N SiTrackerModuleComponentParameters.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ SiTrackerModuleComponentParameters.java 3 Dec 2008 00:53:45 -0000 1.1
@@ -0,0 +1,39 @@
+package org.lcsim.geometry.compact.converter;
+
+//FIXME: Duplicates class in org.lcsim.detector.converter.compact.SiTrackerEndcapConverter to avoid dependency.
+
+public class SiTrackerModuleComponentParameters
+{
+ String materialName;
+ double thickness;
+ boolean sensitive;
+ int componentNumber;
+
+ public SiTrackerModuleComponentParameters(double thickness, String materialName, int componentNumber, boolean sensitive)
+ {
+ this.thickness = thickness;
+ this.materialName = materialName;
+ 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;
+ }
+}
GeomConverter/src/org/lcsim/geometry/compact/converter
diff -N SiTrackerModuleParameters.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ SiTrackerModuleParameters.java 3 Dec 2008 00:53:45 -0000 1.1
@@ -0,0 +1,86 @@
+package org.lcsim.geometry.compact.converter;
+
+import java.util.ArrayList;
+
+import org.jdom.DataConversionException;
+import org.jdom.Element;
+import org.jdom.JDOMException;
+
+// FIXME: Duplicates class in org.lcsim.detector.converter.compact.SiTrackerEndcapConverter to avoid dependency.
+public class SiTrackerModuleParameters
+extends ArrayList<SiTrackerModuleComponentParameters>
+{
+ double thickness=0.;
+ String name;
+ double dimensions[] = new double[3];
+ public SiTrackerModuleParameters(Element element)
+ {
+ name = element.getAttributeValue("name");
+ int cntr=0;
+ for (Object o : element.getChildren("module_component"))
+ {
+ 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();
+ add(new SiTrackerModuleComponentParameters(thickness, materialName, cntr, sensitive));
+ }
+ catch (JDOMException x)
+ {
+ throw new RuntimeException(x);
+ }
+ ++cntr;
+ }
+
+ // Optional dimension parameters (not always present).
+ if (element.getChild("trd") != null)
+ {
+ Element trd = element.getChild("trd");
+ try
+ {
+ dimensions[0] = trd.getAttribute("x1").getDoubleValue();
+ dimensions[1] = trd.getAttribute("x2").getDoubleValue();
+ dimensions[2] = trd.getAttribute("z").getDoubleValue();
+ }
+ catch (DataConversionException x)
+ {
+ throw new RuntimeException(x);
+ }
+ }
+
+ calculateThickness();
+ }
+
+ public void calculateThickness()
+ {
+ thickness = 0.; // reset thickness
+ for (SiTrackerModuleComponentParameters p : this)
+ {
+ thickness += p.getThickness();
+ }
+ }
+
+ public double getThickness()
+ {
+ return thickness;
+ }
+
+ public String getName()
+ {
+ return name;
+ }
+
+ public double getDimension(int i)
+ {
+ if (i > (dimensions.length - 1) || i < 0)
+ throw new RuntimeException("Invalid dimensions index: " + i);
+ return dimensions[i];
+ }
+}
\ No newline at end of file
GeomConverter/src/org/lcsim/geometry/compact/converter/lcdd
diff -u -r1.14 -r1.15
--- SiTrackerEndcap.java 22 Nov 2008 01:00:39 -0000 1.14
+++ SiTrackerEndcap.java 3 Dec 2008 00:53:45 -0000 1.15
@@ -9,6 +9,8 @@
import org.jdom.DataConversionException;
import org.jdom.Element;
import org.jdom.JDOMException;
+import org.lcsim.geometry.compact.converter.SiTrackerModuleComponentParameters;
+import org.lcsim.geometry.compact.converter.SiTrackerModuleParameters;
import org.lcsim.geometry.compact.converter.lcdd.util.Box;
import org.lcsim.geometry.compact.converter.lcdd.util.LCDD;
import org.lcsim.geometry.compact.converter.lcdd.util.Material;
GeomConverter/src/org/lcsim/geometry/compact/converter/lcdd
diff -u -r1.4 -r1.5
--- SiTrackerEndcap2.java 25 Nov 2008 22:52:12 -0000 1.4
+++ SiTrackerEndcap2.java 3 Dec 2008 00:53:45 -0000 1.5
@@ -6,6 +6,8 @@
import org.jdom.Element;
import org.jdom.JDOMException;
+import org.lcsim.geometry.compact.converter.SiTrackerModuleComponentParameters;
+import org.lcsim.geometry.compact.converter.SiTrackerModuleParameters;
import org.lcsim.geometry.compact.converter.lcdd.util.LCDD;
import org.lcsim.geometry.compact.converter.lcdd.util.Material;
import org.lcsim.geometry.compact.converter.lcdd.util.PhysVol;
GeomConverter/src/org/lcsim/geometry/compact/converter/lcdd
diff -N SiTrackerModuleComponentParameters.java
--- SiTrackerModuleComponentParameters.java 22 Nov 2008 01:00:39 -0000 1.1
+++ /dev/null 1 Jan 1970 00:00:00 -0000
@@ -1,39 +0,0 @@
-package org.lcsim.geometry.compact.converter.lcdd;
-
-//FIXME: Duplicates class in org.lcsim.detector.converter.compact.SiTrackerEndcapConverter to avoid dependency.
-
-public class SiTrackerModuleComponentParameters
-{
- String materialName;
- double thickness;
- boolean sensitive;
- int componentNumber;
-
- public SiTrackerModuleComponentParameters(double thickness, String materialName, int componentNumber, boolean sensitive)
- {
- this.thickness = thickness;
- this.materialName = materialName;
- 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;
- }
-}
GeomConverter/src/org/lcsim/geometry/compact/converter/lcdd
diff -N SiTrackerModuleParameters.java
--- SiTrackerModuleParameters.java 22 Nov 2008 01:00:39 -0000 1.1
+++ /dev/null 1 Jan 1970 00:00:00 -0000
@@ -1,86 +0,0 @@
-package org.lcsim.geometry.compact.converter.lcdd;
-
-import java.util.ArrayList;
-
-import org.jdom.DataConversionException;
-import org.jdom.Element;
-import org.jdom.JDOMException;
-
-// FIXME: Duplicates class in org.lcsim.detector.converter.compact.SiTrackerEndcapConverter to avoid dependency.
-public class SiTrackerModuleParameters
-extends ArrayList<SiTrackerModuleComponentParameters>
-{
- double thickness=0.;
- String name;
- double dimensions[] = new double[3];
- public SiTrackerModuleParameters(Element element)
- {
- name = element.getAttributeValue("name");
- int cntr=0;
- for (Object o : element.getChildren("module_component"))
- {
- 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();
- add(new SiTrackerModuleComponentParameters(thickness, materialName, cntr, sensitive));
- }
- catch (JDOMException x)
- {
- throw new RuntimeException(x);
- }
- ++cntr;
- }
-
- // Optional dimension parameters (not always present).
- if (element.getChild("trd") != null)
- {
- Element trd = element.getChild("trd");
- try
- {
- dimensions[0] = trd.getAttribute("x1").getDoubleValue();
- dimensions[1] = trd.getAttribute("x2").getDoubleValue();
- dimensions[2] = trd.getAttribute("z").getDoubleValue();
- }
- catch (DataConversionException x)
- {
- throw new RuntimeException(x);
- }
- }
-
- calculateThickness();
- }
-
- public void calculateThickness()
- {
- thickness = 0.; // reset thickness
- for (SiTrackerModuleComponentParameters p : this)
- {
- thickness += p.getThickness();
- }
- }
-
- public double getThickness()
- {
- return thickness;
- }
-
- public String getName()
- {
- return name;
- }
-
- public double getDimension(int i)
- {
- if (i > (dimensions.length - 1) || i < 0)
- throw new RuntimeException("Invalid dimensions index " + i);
- return dimensions[i];
- }
-}
\ No newline at end of file
GeomConverter/src/org/lcsim/geometry/subdetector
diff -N SiTrackerEndcap2.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ SiTrackerEndcap2.java 3 Dec 2008 00:53:45 -0000 1.1
@@ -0,0 +1,26 @@
+package org.lcsim.geometry.subdetector;
+
+import hep.graphics.heprep.HepRep;
+import hep.graphics.heprep.HepRepFactory;
+
+import org.jdom.Element;
+import org.jdom.JDOMException;
+import org.lcsim.detector.converter.heprep.DetectorElementToHepRepConverter;
+
+public class SiTrackerEndcap2 extends AbstractTracker
+{
+ SiTrackerEndcap2(Element node) throws JDOMException
+ {
+ super(node);
+ }
+
+ public void appendHepRep(HepRepFactory factory, HepRep heprep)
+ {
+ DetectorElementToHepRepConverter.convert(getDetectorElement(), factory, heprep, 0, -1);
+ }
+
+ public boolean isEndcap()
+ {
+ return true;
+ }
+}
\ No newline at end of file
GeomConverter/testResources/org/lcsim/geometry/compact/converter/lcdd
diff -u -r1.1 -r1.2
--- SiTrackerEndcap2Test.xml 22 Nov 2008 01:13:56 -0000 1.1
+++ SiTrackerEndcap2Test.xml 3 Dec 2008 00:53:45 -0000 1.2
@@ -5,13 +5,13 @@
<comment></comment>
</info>
<define>
- <constant name="cm" value="10"/>
- <constant name="world_side" value="30000"/>
- <constant name="world_x" value="world_side"/>
- <constant name="world_y" value="world_side"/>
- <constant name="world_z" value="world_side"/>
- <constant name="tracking_region_radius" value="180.0 * cm"/>
- <constant name="tracking_region_zmax" value="300.0 * cm"/>
+ <constant name="cm" value="10"/>
+ <constant name="world_side" value="30000"/>
+ <constant name="world_x" value="world_side"/>
+ <constant name="world_y" value="world_side"/>
+ <constant name="world_z" value="world_side"/>
+ <constant name="tracking_region_radius" value="180.0 * cm"/>
+ <constant name="tracking_region_zmax" value="300.0 * cm"/>
</define>
<materials>
</materials>
@@ -21,33 +21,34 @@
</display>
-->
<detectors>
-
- <detector id="1" name="SiTrackerEndcap2" type="SiTrackerEndcap2" readout="SiTrackerEndcap_RO">
+ <detector id="1" name="SiTrackerEndcap2" type="SiTrackerEndcap2" readout="TestReadout">
<module name="Module1">
<trd x1="65.2422" x2="88.47" z="110.48" />
<module_component thickness="1.0" material="Silicon"/>
</module>
<module name="Module2">
<trd x1="88.63" x2="118.5" z="92.6" />
- <module_component thickness="1.0" material="Silicon"/>
+ <module_component thickness="5.0" material="Silicon" sensitive="true"/>
+ <module_component thickness="2.0" material="Silicon"/>
+ <module_component thickness="5.0" material="Silicon" sensitive="true"/>
</module>
<layer id="1">
- <ring r="1210.0" phi0="0.0" zstart="855.0" dz="1.25" nmodules="84" module="Module2"/>
+ <ring r="1210.0" phi0="0.0" zstart="855.0" dz="1.25" nmodules="24" module="Module2"/>
<!-- <ring r="200.0" phi0="0.0" zstart="1100.0" dz="1.1" nmodules="30" module="Module1"/>-->
</layer>
</detector>
</detectors>
<readouts>
- <readout name="SiTrackerEndcap_RO">
- <id>system:6,barrel:3,layer:4,wedge:6,module:6,sensor:1,side:32:-2,strip:12</id>
- </readout>
+ <readout name="TestReadout">
+ <id>system:6,barrel:3,layer:4,module:6,sensor:1,side:32:-2,strip:12</id>
+ </readout>
</readouts>
<fields>
- <field type="Solenoid"
- name="GlobalSolenoid"
- inner_field="5.0"
- outer_field="-0.6"
- zmax="1000"
- outer_radius="(250.0+ 5.0 + 17.5 + 40./2.)*cm" />
+ <field type="Solenoid"
+ name="GlobalSolenoid"
+ inner_field="5.0"
+ outer_field="-0.6"
+ zmax="1000"
+ outer_radius="(250.0+ 5.0 + 17.5 + 40./2.)*cm" />
</fields>
</lccdd>
CVSspam 0.2.8