Author: [log in to unmask]
Date: Tue Dec 2 11:21:55 2014
New Revision: 3437
Log:
Fixing stereo pairing. Adding support for millepede constants for the new detector.
Modified:
projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/detector/converter/compact/HPSTestRunTracker2014Converter.java
projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/detector/converter/compact/HPSTracker2014Converter.java
projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/detector/converter/compact/HPSTracker2014ConverterBase.java
projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/HPSTestRunTracker2014GeometryDefinition.java
projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/HPSTracker2014GeometryDefinition.java
projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/HPSTrackerBuilder.java
projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/HPSTrackerGeometryDefinition.java
projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/JavaSurveyVolume.java
projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/LCDDSurveyVolume.java
projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/MilleParameter.java
projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/lcdd/HPSTracker2014Base.java
projects/lcsim/trunk/detector-framework/src/test/resources/org/lcsim/geometry/subdetector/HPSTracker2014.xml
Modified: projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/detector/converter/compact/HPSTestRunTracker2014Converter.java
=============================================================================
--- projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/detector/converter/compact/HPSTestRunTracker2014Converter.java (original)
+++ projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/detector/converter/compact/HPSTestRunTracker2014Converter.java Tue Dec 2 11:21:55 2014
@@ -4,8 +4,14 @@
package org.lcsim.detector.converter.compact;
import org.jdom.Element;
+import org.lcsim.detector.IDetectorElement;
+import org.lcsim.detector.identifier.IIdentifier;
+import org.lcsim.detector.tracker.silicon.HpsSiSensor;
+import org.lcsim.detector.tracker.silicon.HpsTestRunSiSensor;
import org.lcsim.geometry.compact.converter.HPSTestRunTracker2014JavaBuilder;
+import org.lcsim.geometry.compact.converter.HPSTrackerBuilder;
import org.lcsim.geometry.compact.converter.HPSTrackerJavaBuilder;
+import org.lcsim.geometry.compact.converter.JavaSurveyVolume;
import org.lcsim.geometry.subdetector.HPSTestRunTracker2014;
/**
@@ -26,8 +32,26 @@
return new HPSTestRunTracker2014JavaBuilder(_debug,node);
}
+ /* (non-Javadoc)
+ * @see org.lcsim.detector.converter.compact.AbstractSubdetectorConverter#getSubdetectorType()
+ */
public Class getSubdetectorType() {
return HPSTestRunTracker2014.class;
}
+
+ /* (non-Javadoc)
+ * @see org.lcsim.detector.converter.compact.HPSTracker2014ConverterBase#createSiSensor(int, java.lang.String, org.lcsim.detector.IDetectorElement, java.lang.String, org.lcsim.detector.identifier.IIdentifier)
+ */
+ HpsSiSensor createSiSensor(int sensorid, String name,
+ IDetectorElement parent, String support, IIdentifier id) {
+ return new HpsTestRunSiSensor(sensorid, name, parent, support, id);
+ }
+
+ /* (non-Javadoc)
+ * @see org.lcsim.detector.converter.compact.HPSTracker2014ConverterBase#getModuleNumber(org.lcsim.geometry.compact.converter.JavaSurveyVolume)
+ */
+ protected int getModuleNumber(JavaSurveyVolume surveyVolume) {
+ return HPSTrackerBuilder.getHalfFromName(surveyVolume.getName()).equals("top") ? 0 : 1;
+ }
}
Modified: projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/detector/converter/compact/HPSTracker2014Converter.java
=============================================================================
--- projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/detector/converter/compact/HPSTracker2014Converter.java (original)
+++ projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/detector/converter/compact/HPSTracker2014Converter.java Tue Dec 2 11:21:55 2014
@@ -1,8 +1,13 @@
package org.lcsim.detector.converter.compact;
import org.jdom.Element;
+import org.lcsim.detector.IDetectorElement;
+import org.lcsim.detector.identifier.IIdentifier;
+import org.lcsim.detector.tracker.silicon.HpsSiSensor;
import org.lcsim.geometry.compact.converter.HPSTracker2014JavaBuilder;
+import org.lcsim.geometry.compact.converter.HPSTrackerBuilder;
import org.lcsim.geometry.compact.converter.HPSTrackerJavaBuilder;
+import org.lcsim.geometry.compact.converter.JavaSurveyVolume;
import org.lcsim.geometry.subdetector.HPSTracker2014;
@@ -17,13 +22,65 @@
super();
}
+ /* (non-Javadoc)
+ * @see org.lcsim.detector.converter.compact.HPSTracker2014ConverterBase#initializeBuilder(org.jdom.Element)
+ */
protected HPSTrackerJavaBuilder initializeBuilder(Element node) {
return new HPSTracker2014JavaBuilder(_debug, node);
}
+ /* (non-Javadoc)
+ * @see org.lcsim.detector.converter.compact.AbstractSubdetectorConverter#getSubdetectorType()
+ */
public Class getSubdetectorType() {
return HPSTracker2014.class;
}
+
+ /* (non-Javadoc)
+ * @see org.lcsim.detector.converter.compact.HPSTracker2014ConverterBase#createSiSensor(int, java.lang.String, org.lcsim.detector.IDetectorElement, java.lang.String, org.lcsim.detector.identifier.IIdentifier)
+ */
+ HpsSiSensor createSiSensor(int sensorid, String name,
+ IDetectorElement parent, String support, IIdentifier id) {
+ return new HpsSiSensor(sensorid, name, parent, support, id);
+ }
+
+
+ /* (non-Javadoc)
+ * @see org.lcsim.detector.converter.compact.HPSTracker2014ConverterBase#getModuleNumber(org.lcsim.geometry.compact.converter.JavaSurveyVolume)
+ */
+ protected int getModuleNumber(JavaSurveyVolume surveyVolume) {
+ boolean isTopLayer = HPSTrackerBuilder.getHalfFromName(surveyVolume.getName()).equals("top") ? true : false;
+ int layer = HPSTrackerBuilder.getLayerFromVolumeName(surveyVolume.getName());
+ int moduleNumber = -1;
+ if(isTopLayer) {
+ if(layer < 4 ) {
+ moduleNumber = 0;
+ } else {
+ if(HPSTrackerBuilder.isHoleFromName(surveyVolume.getName())) {
+ moduleNumber = 2;
+ } else {
+ moduleNumber = 0;
+ }
+ }
+ } else {
+ if(layer < 4 ) {
+ moduleNumber = 1;
+ } else {
+ if(HPSTrackerBuilder.isHoleFromName(surveyVolume.getName())) {
+ moduleNumber = 1;
+ } else {
+ moduleNumber = 3;
+ }
+ }
+ }
+
+ if(moduleNumber<0) throw new RuntimeException("Invalid module nr found for " + surveyVolume.getName());
+
+ return moduleNumber;
+ }
+
+
+
}
Modified: projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/detector/converter/compact/HPSTracker2014ConverterBase.java
=============================================================================
--- projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/detector/converter/compact/HPSTracker2014ConverterBase.java (original)
+++ projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/detector/converter/compact/HPSTracker2014ConverterBase.java Tue Dec 2 11:21:55 2014
@@ -11,6 +11,7 @@
import org.lcsim.detector.IPhysicalVolume;
import org.lcsim.detector.PhysicalVolume;
import org.lcsim.detector.Transform3D;
+import org.lcsim.detector.converter.compact.subdetector.HpsTracker2;
import org.lcsim.detector.identifier.ExpandedIdentifier;
import org.lcsim.detector.identifier.IExpandedIdentifier;
import org.lcsim.detector.identifier.IIdentifier;
@@ -33,13 +34,15 @@
* @author Per Hansson Adrian <[log in to unmask]>
*
*/
-public abstract class HPSTracker2014ConverterBase extends
- AbstractSubdetectorConverter {
+public abstract class HPSTracker2014ConverterBase extends AbstractSubdetectorConverter {
protected boolean _debug = false;
protected IMaterial trackingMaterial = null;
protected static HPSTrackerJavaBuilder builder;
+ /**
+ * Default constructor.
+ */
public HPSTracker2014ConverterBase() {
super();
}
@@ -51,6 +54,22 @@
*/
abstract protected HPSTrackerJavaBuilder initializeBuilder(Element node);
+
+ /**
+ * Abstract method to create the correct type of {@link HpsSiSensor}.
+ * @param sensorid
+ * @param name
+ * @param parent
+ * @param support
+ * @param id
+ * @return the created sensor.
+ */
+ abstract HpsSiSensor createSiSensor(int sensorid, String name, IDetectorElement parent, String support, IIdentifier id);
+
+
+ /* (non-Javadoc)
+ * @see org.lcsim.detector.converter.compact.AbstractSubdetectorConverter#makeIdentifierHelper(org.lcsim.geometry.compact.Subdetector, org.lcsim.detector.DetectorIdentifierHelper.SystemMap)
+ */
public IIdentifierHelper makeIdentifierHelper(Subdetector subdetector, SystemMap systemMap) {
return new SiTrackerIdentifierHelper(subdetector.getDetectorElement(), makeIdentifierDictionary(subdetector), systemMap);
}
@@ -101,33 +120,28 @@
if(_debug) System.out.printf("%s: DONE setup and build the JAVA geometry\n", getClass().getSimpleName());
+ if(_debug) System.out.printf("%s: setup physical volumes\n", getClass().getSimpleName());
+
setupPhysicalVolumes();
-
+
+ if(_debug) System.out.printf("%s: DONE setup physical volumes\n", getClass().getSimpleName());
+
+ if(_debug) System.out.printf("%s: create stereo layers\n", getClass().getSimpleName());
+
+ ((HpsTracker2) subdet.getDetectorElement()).createStereoLayers();
+
+ if(_debug) System.out.printf("%s: DONE create stereo layers\n", getClass().getSimpleName());
+
if(_debug) {
- System.out.printf("%s: Print all %d detector elements in store\n", getClass().getSimpleName(),DetectorElementStore.getInstance().size());
- for(IDetectorElement e : DetectorElementStore.getInstance()) {
- System.out.printf("%s: Name: %s \n", getClass().getSimpleName(),e.getName());
- if(e.hasGeometryInfo()) {
- System.out.printf("%s: Position: %s \n", getClass().getSimpleName(),e.getGeometry().getPosition());
- System.out.printf("%s: LocalToGlobal: \n%s \n", getClass().getSimpleName(),((Transform3D)e.getGeometry().getLocalToGlobal()).toString());
- //System.out.printf("%s: GlobalToLocal: \n%s \n", getClass().getSimpleName(),((Transform3D)e.getGeometry().getGlobalToLocal()).toString());
- IGeometryInfo info = e.getGeometry();
- if(info!=null) {
- while((info=info.parentGeometry())!=null) {
- System.out.printf("%s: Parent geometry DE: %s \n", getClass().getSimpleName(),info.getDetectorElement().getName());
- System.out.printf("%s: Parent Position: %s \n", getClass().getSimpleName(),info.getPosition());
- System.out.printf("%s: Parent LocalToGlobal: \n%s \n", getClass().getSimpleName(),((Transform3D)info.getLocalToGlobal()).toString());
-
- }
- }
- }
- }
- }
- }
-
-
- /**
- * Setup physical volumes based on the top level @JavaSurveyVolume
+ printDEs();
+ }
+ }
+
+
+
+
+ /**
+ * Setup physical volumes based on the top level {@link JavaSurveyVolume}.
*/
private void setupPhysicalVolumes() {
@@ -135,25 +149,18 @@
setupPhysicalVolumes(builder.getBaseTrackerGeometry());
-
if(_debug) System.out.printf("%s: DONE setup the detector elements\n", getClass().getSimpleName());
-
- }
-
-
-
-
-
+ }
/**
* Setup the physical volumes recursively
- * @param geometryObject - volume to process.
- */
- private void setupPhysicalVolumes(JavaSurveyVolume geometryObject) {
-
- if(_debug) System.out.printf("%s: setupDetectorElement for %s\n", getClass().getSimpleName(),geometryObject.getName());
+ * @param surveyVolume - volume to process.
+ */
+ private void setupPhysicalVolumes(JavaSurveyVolume surveyVolume) {
+
+ if(_debug) System.out.printf("%s: setupDetectorElement for %s\n", getClass().getSimpleName(),surveyVolume.getName());
// Only certain objects are setup as detector elements
// Ghost volumes are never setup
@@ -165,257 +172,349 @@
// are added so I keep track of all the elements in the builder in order
// to build a hierarchy.
- if( geometryObject instanceof JavaGhostSurveyVolume) {
-
- if(_debug) System.out.printf("%s: %s is a ghost volume, dont create elements or physvol\n", getClass().getSimpleName(),geometryObject.getName());
-
- } else if(geometryObject.getName().contains("tracking")) {
- if(_debug) System.out.printf("%s: %s is the tracking volume, dont create elements or physvol\n", getClass().getSimpleName(),geometryObject.getName());
+ if( surveyVolume instanceof JavaGhostSurveyVolume) {
+
+ if(_debug) System.out.printf("%s: %s is a ghost volume, dont create elements or physvol\n", getClass().getSimpleName(),surveyVolume.getName());
+
+ } else if(surveyVolume.getName().contains("tracking")) {
+ if(_debug) System.out.printf("%s: %s is the tracking volume, dont create elements or physvol\n", getClass().getSimpleName(),surveyVolume.getName());
} else {
// build the physical volume
- geometryObject.buildPhysVolume();
- PhysicalVolume physVol = (PhysicalVolume) geometryObject.getPhysVolume();
-
+ surveyVolume.buildPhysVolume();
+
// create detector element
// create detector element
- if(HPSTrackerBuilder.isBase(geometryObject.getName())) {
+ if(HPSTrackerBuilder.isBase(surveyVolume.getName())) {
if(_debug) System.out.printf("%s: create the base detector element\n", getClass().getSimpleName());
-
- int nfields = builder.getDetectorIdentifierHelper().getIdentifierDictionary().getNumberOfFields();
- IExpandedIdentifier layerPosId = new ExpandedIdentifier(nfields);
- layerPosId.setValue(builder.getDetectorIdentifierHelper().getFieldIndex("system"), builder.getSubdetector().getSystemID());
- layerPosId.setValue(builder.getDetectorIdentifierHelper().getFieldIndex("barrel"), builder.getDetectorIdentifierHelper().getBarrelValue());
- int layer = 12; // dummy value
- layerPosId.setValue(builder.getDetectorIdentifierHelper().getFieldIndex("layer"), layer);
- IDetectorElement baseDe = builder.getBaseDetectorElement();
- if(baseDe!=null) {
- throw new RuntimeException("Base exists. Shouldn't happen!");
- }
- ILogicalVolume trackingVolume = geometryObject.getPhysMother().getVolume();
- if(!trackingVolume.getName().contains("tracking")) {
- throw new RuntimeException("base phys mother " + geometryObject.getPhysMother().getName() + " is not tracking volume!?");
+ createBaseDetectorElement(surveyVolume);
+
+ if(_debug) System.out.printf("%s: DONE create the base detector element\n", getClass().getSimpleName());
+
+
+ } else if(HPSTrackerBuilder.isHalfModule(surveyVolume.getName())) {
+
+ if(_debug) System.out.printf("%s: create the layer detector element\n", getClass().getSimpleName());
+
+ IDetectorElement layerDe = createLayerDetectorElement(surveyVolume);
+
+ if(_debug) System.out.printf("%s: DONE create the layer detector element\n", getClass().getSimpleName());
+
+ if(_debug) System.out.printf("%s: create the module detector element\n", getClass().getSimpleName());
+
+ createTrackerModuleDetectorElement(surveyVolume, layerDe);
+
+ if(_debug) System.out.printf("%s: DONE create the module detector element\n", getClass().getSimpleName());
+
+
+ } else if(HPSTrackerBuilder.isSensor(surveyVolume.getName())) {
+
+ if(_debug) System.out.printf("%s: set sensitive volume for sensor %s\n", getClass().getSimpleName(),surveyVolume.getName());
+
+ createSensorDetectorElement(surveyVolume);
+
+ if(_debug) System.out.printf("%s: DONE set sensitive volume for sensor %s\n", getClass().getSimpleName(),surveyVolume.getName());
+
+
+ } else if(HPSTrackerBuilder.isActiveSensor(surveyVolume.getName())) {
+
+ if(_debug) System.out.printf("%s: create the active sensor detector element\n", getClass().getSimpleName());
+
+ createActiveSensorDetectorElement(surveyVolume);
+
+ if(_debug) System.out.printf("%s: DONE create the active sensor detector element\n", getClass().getSimpleName());
+
+ } else {
+ throw new RuntimeException("I don't think I should reach this? Should " + surveyVolume.getName() + " be a ghost?" );
+ }
+
+ }
+
+ // add daughters
+ if(_debug) System.out.printf("%s: add %d daughters to %s\n", this.getClass().getSimpleName(),surveyVolume.getDaughters().size(), surveyVolume.getName());
+ for(JavaSurveyVolume daughter : surveyVolume.getDaughters()) {
+ setupPhysicalVolumes(daughter);
+ }
+
+ if(_debug) System.out.printf("%s: DONE setup the detector element for %s\n", this.getClass().getSimpleName(),surveyVolume.getName());
+
+ }
+
+
+
+
+ /**
+ * Find the module {@link DetectorElement} in a layer {@link DetectorElement} using the module number id.
+ * @param layerDe
+ * @param moduleNumber
+ * @return the found {@link DetectorElement} or {@code null} if not found.
+ */
+ private IDetectorElement getModuleDetectorElement(IDetectorElement layerDe, int moduleNumber) {
+ //Find the module by looping over the modules and checking module number
+ IDetectorElement moduleDe = null;
+ for(IDetectorElement e : layerDe.getChildren()) {
+ if(e instanceof SiTrackerModule) {
+ SiTrackerModule m = (SiTrackerModule)e;
+ if(m.getModuleId()==moduleNumber) {
+ moduleDe = m;
}
- String physVolPath = trackingVolume.getName() + "/" + geometryObject.getPhysVolume().getName();
- baseDe = new DetectorElement(builder.getSubdetector().getName() + "_base", builder.getSubdetector().getDetectorElement(), physVolPath, builder.getIdentifierDictionary().pack(layerPosId));
- builder.addBaseDetectorElement(baseDe);
-
- if(_debug) System.out.printf("%s: baseDE name %s \n", getClass().getSimpleName(),baseDe.getName());
-
-
-
- } else if(HPSTrackerBuilder.isHalfModule(geometryObject.getName())) {
-
- if(_debug) System.out.printf("%s: create the layer detector element\n", getClass().getSimpleName());
-
- // The old geometry was built using a layer definition from a barrel tracker
- // It also only has the concept of half-modules which it calls modules
- // Thus the nomenclature here is a little strange
- // Anyway, find those ID's
-
- int nfields = builder.getDetectorIdentifierHelper().getIdentifierDictionary().getNumberOfFields();
- IExpandedIdentifier layerPosId = new ExpandedIdentifier(nfields);
- layerPosId.setValue(builder.getDetectorIdentifierHelper().getFieldIndex("system"), builder.getSubdetector().getSystemID());
- layerPosId.setValue(builder.getDetectorIdentifierHelper().getFieldIndex("barrel"), builder.getDetectorIdentifierHelper().getBarrelValue());
- //use the old definition of layer number to be consistent
- //int layer = HPSTestRunTracker2014Builder.getLayerFromVolumeName(geometryObject.getName());
- int layer = HPSTrackerBuilder.getOldGeomDefLayerFromVolumeName(geometryObject.getName());
- layerPosId.setValue(builder.getDetectorIdentifierHelper().getFieldIndex("layer"), layer);
- if(_debug) System.out.printf("%s: layerPosId layer = %d (compare with new layer %d)\n", getClass().getSimpleName(),layer, HPSTrackerBuilder.getLayerFromVolumeName(geometryObject.getName()));
-
- // find the base DE as mother
- IDetectorElement baseDe = builder.getBaseDetectorElement();
- if(baseDe==null) {
- throw new RuntimeException("Base DE couldn't be found. Shouldn't happen!");
- }
-
-
- // create the layer detector element and keep track of it
- //IDetectorElement layerDe = builder.getLayerDetectorElement(layerPosId);
- IDetectorElement layerDe = builder.getLayerDetectorElement(layerPosId);
-
- if(layerDe==null) {
- //layerDe = new DetectorElement(builder.getSubdetector().getName() + "_layer" + layer, builder.getSubdetector().getDetectorElement(), builder.getDetectorIdentifierHelper().pack(layerPosId));
- layerDe = new DetectorElement(builder.getSubdetector().getName() + "_layer" + layer, baseDe, builder.getDetectorIdentifierHelper().pack(layerPosId));
- builder.addLayerDetectorElement(layerDe);
- } else {
- if(_debug) System.out.printf("%s: layerDE exists\n", getClass().getSimpleName());
- }
-
- if(_debug) System.out.printf("%s: layerDE name %s \n", getClass().getSimpleName(),layerDe.getName());
-
-
-
- if(_debug) System.out.printf("%s: create the module detector element\n", getClass().getSimpleName());
-
- // create the "module" detector element
- // it's under the base element
- String half = HPSTrackerBuilder.getHalfFromName(geometryObject.getName());
- if(half.equals("")) throw new RuntimeException("No half found for " + geometryObject.getName());
- int moduleNumber = half.equals("top") ? 0 : 1;
- //String modulePlacementName = builder.getSubdetector().getName() + "_" + moduleName + "_layer" + layer + "_module" + moduleNumber;
- String modulePlacementName = geometryObject.getName();// builder.getSubdetector().getName() + "_" + moduleName + "_layer" + layer + "_module" + moduleNumber;
-
-
- /*
- ILogicalVolume trackingVolume = null;
- if(builder.getBaseTrackerGeometry().getName().contains("tracking")) {
- trackingVolume = builder.getBaseTrackerGeometry().getVolume();
- } else {
- trackingVolume = builder.getBaseTrackerGeometry().getMother().getVolume();
}
- if( trackingVolume == null ) {
- throw new RuntimeException("failed to get tracking geometry from mother to " + builder.getBaseTrackerGeometry().getName());
- }
- String modulePath = String.format("/%s/%s", trackingVolume.getName(), modulePlacementName);
- */
- // use base as mother for physical volume
- String modulePath = baseDe.getGeometry().getPathString() + "/" + modulePlacementName;
-
- if(_debug) {
- System.out.printf("%s: create SiTrackerModule with: placementname %s, modulePath %s, moduleNumber %d \n", getClass().getSimpleName(),modulePlacementName, modulePath, moduleNumber);
- //System.out.printf("%s: print all %d physical volumes from the Store\n", getClass().getSimpleName(),PhysicalVolumeStore.getInstance().size());
- //for(IPhysicalVolume v : PhysicalVolumeStore.getInstance()) {
- // System.out.printf("%s: %s %s %s\n", getClass().getSimpleName(), v.getName(), v.getLogicalVolume().getName(), v.getMotherLogicalVolume()!=null?v.getMotherLogicalVolume().getName():"(no mother)");
- //}
- }
-
- SiTrackerModule moduleDe = new SiTrackerModule(modulePlacementName, layerDe, modulePath, moduleNumber);
-
- if(_debug) System.out.printf("%s: add module DE to existing ones \n", getClass().getSimpleName(),modulePlacementName, modulePath, moduleNumber);
-
-
- //keep track of the module detector element
- builder.addModuleDetectorElement(moduleDe);
-
-
-
-
- } else if(HPSTrackerBuilder.isSensor(geometryObject.getName())) {
-
- if(_debug) System.out.printf("%s: this is where I would create a detector element for the sensor %s if needed\n", getClass().getSimpleName(),geometryObject.getName());
-
- // set the physical volume to be sensitive
- // TODO this should go into the geometry definition?!
- physVol.setSensitive(true);
-
- } else if(HPSTrackerBuilder.isActiveSensor(geometryObject.getName())) {
-
- // Setup the active sensor element
- // to be consistent with old converter I also add the sensor
- // in the path to the element even though it's not associated with
- // with a element. I'm not sure why this is done.
-
- if(_debug) System.out.printf("%s: create the active sensor detector element\n", getClass().getSimpleName());
-
- if(_debug) System.out.printf("%s: find the active sensor phys vol\n", this.getClass().getSimpleName());
-
- // Find active Sensor physical volume.
- // Keep name consistent with old converter
- PhysicalVolume sensorPhysVol = physVol;
-
- if(sensorPhysVol==null) throw new RuntimeException("cannot find physVol for " + geometryObject.getName());
-
- if(_debug) System.out.printf("%s: found %s phys vol\n", this.getClass().getSimpleName(),sensorPhysVol.getName());
-
- if(_debug) System.out.printf("%s: find the sensor phys vol\n", this.getClass().getSimpleName());
-
- // find the module detector element
-
- // Helpers
- IIdentifierDictionary iddict = builder.getDetectorIdentifierHelper().getIdentifierDictionary();
-
- // Find the mother: the module detector element
- IExpandedIdentifier layerExpId = new ExpandedIdentifier(iddict.getNumberOfFields());
- layerExpId.setValue(iddict.getFieldIndex("system"), builder.getSubdetector().getSystemID());
- layerExpId.setValue(iddict.getFieldIndex("barrel"), builder.getDetectorIdentifierHelper().getBarrelValue());
- //use the old definition of layer number to be consistent
- //int layer = HPSTestRunTracker2014Builder.getLayerFromVolumeName(geometryObject.getName());
- int layer = HPSTrackerBuilder.getOldGeomDefLayerFromVolumeName(geometryObject.getName());
- layerExpId.setValue(iddict.getFieldIndex("layer"), layer);
- String half = HPSTrackerBuilder.getHalfFromName(geometryObject.getName());
- if(half.equals("")) throw new RuntimeException("No half found for " + geometryObject.getName());
- int moduleNumber = half.equals("top") ? 0 : 1;
-
- // The expId is the same for the layerDE and moduleDE because the tracker module object stores the
- // module ID in a member variable. So when searching I need to add this info
- // TODO Can we change this and add the module ID to the identifier?
- //IDetectorElement moduleDe = builder.getModuleDetectorElement(layerExpId);
- //IDetectorElement moduleDe = builder.getSiTrackerModuleDetectorElement(layerExpId, moduleNumber);
-
- //Find the layer
- IDetectorElement layerDe = builder.getLayerDetectorElement(layerExpId);
-
- if(layerDe==null) throw new RuntimeException("Cannot find layer DE");
-
- //Find the module
- IDetectorElement moduleDe = null;
- for(IDetectorElement e : layerDe.getChildren()) {
- if(e instanceof SiTrackerModule) {
- SiTrackerModule m = (SiTrackerModule)e;
- if(m.getModuleId()==moduleNumber) {
- moduleDe = m;
- }
+ }
+ return moduleDe;
+ }
+
+ /**
+ * Abstract method to find the module number.
+ * @param surveyVolume
+ * @return module number
+ */
+ abstract protected int getModuleNumber(JavaSurveyVolume surveyVolume);
+
+ /**
+ * Find the layer {@link DetectorElement}.
+ * @param surveyVolume
+ * @return the {@link DetectorElement}.
+ */
+ private IDetectorElement getLayerDetectorElement(JavaSurveyVolume surveyVolume) {
+ // Helper
+ IIdentifierDictionary iddict = builder.getDetectorIdentifierHelper().getIdentifierDictionary();
+
+ // Find the mother: the module detector element
+ IExpandedIdentifier layerExpId = new ExpandedIdentifier(iddict.getNumberOfFields());
+ layerExpId.setValue(iddict.getFieldIndex("system"), builder.getSubdetector().getSystemID());
+ layerExpId.setValue(iddict.getFieldIndex("barrel"), builder.getDetectorIdentifierHelper().getBarrelValue());
+ //use the old definition of layer number to be consistent
+ //int layer = HPSTestRunTracker2014Builder.getLayerFromVolumeName(geometryObject.getName());
+ int layer = builder._builder.getOldGeomDefLayerFromVolumeName(surveyVolume.getName());
+ layerExpId.setValue(iddict.getFieldIndex("layer"), layer);
+ //Find the layer from the ID
+ return builder.getLayerDetectorElement(layerExpId);
+ }
+
+
+
+ /**
+ * Create the {@link HpsSiSensor} detector element.
+ * @param surveyVolume
+ */
+ private void createActiveSensorDetectorElement(JavaSurveyVolume surveyVolume) {
+ // Setup the active sensor element
+ // to be consistent with old converter I also add the sensor
+ // in the path to the element even though it's not associated with
+ // with a element. I'm not sure why this is done.
+
+
+ if(_debug) System.out.printf("%s: find the active sensor phys vol\n", this.getClass().getSimpleName());
+
+ // Find active Sensor physical volume.
+ // Keep name consistent with old converter
+ PhysicalVolume sensorPhysVol = (PhysicalVolume) surveyVolume.getPhysVolume();
+
+ if(sensorPhysVol==null) throw new RuntimeException("cannot find physVol for " + surveyVolume.getName());
+
+ if(_debug) System.out.printf("%s: found %s phys vol\n", this.getClass().getSimpleName(),sensorPhysVol.getName());
+
+ // find the layer and module detector element
+
+ IDetectorElement layerDe = getLayerDetectorElement(surveyVolume);
+
+ if(layerDe==null) throw new RuntimeException("Cannot find layer DE");
+
+ //Find the module number
+ int moduleNumber = getModuleNumber(surveyVolume);
+
+ //Find the module detector element
+ IDetectorElement moduleDe = getModuleDetectorElement(layerDe, moduleNumber);
+
+ if(moduleDe==null) throw new RuntimeException("Cannot find module DE for " + surveyVolume.getName());
+
+ // Setup SiSensor's identifier.
+ IIdentifierDictionary iddict = builder.getIdentifierDictionary();
+ IExpandedIdentifier expId = new ExpandedIdentifier(iddict.getNumberOfFields());
+ expId.setValue(iddict.getFieldIndex("system"), builder.getSubdetector().getSystemID());
+ expId.setValue(iddict.getFieldIndex("barrel"), 0);
+ expId.setValue(iddict.getFieldIndex("layer"), builder.getDetectorIdentifierHelper().getValue(layerDe.getIdentifier(), "layer"));
+ expId.setValue(iddict.getFieldIndex("module"), ((SiTrackerModule) moduleDe).getModuleId());
+ // The sensorNumber is always 0 in the old geometry. Keep it that way.
+ int sensorNumber = 0;
+ expId.setValue(iddict.getFieldIndex("sensor"), sensorNumber);
+
+ // Packed identifier.
+ IIdentifier sensorId = iddict.pack(expId);
+
+ // Sensor paths.
+ String modulePath = moduleDe.getGeometry().getPathString();
+ IPhysicalVolume componentPhysVol = surveyVolume.getPhysMother().getPhysVolume();
+ String sensorPath = modulePath.toString() + "/" + componentPhysVol.getName() + "/" + sensorPhysVol.getName();
+ String sensorName = moduleDe.getName() + "_sensor" + sensorNumber;
+
+ if(_debug) System.out.printf("%s: create HpsSiSensor with sensorNumber %d name %s moduleDe %s sensorPath %s sensor Id %d \n", getClass().getSimpleName(),
+ sensorNumber, sensorName, moduleDe.getName(), sensorPath, sensorNumber);
+
+
+ // Create the sensor.
+ HpsSiSensor sensor = createSiSensor(sensorNumber, sensorName, moduleDe, sensorPath, sensorId);
+
+ if(_debug) System.out.printf("%s: created sensor %s \n", getClass().getSimpleName(), sensor.getName());
+
+
+ }
+
+
+
+ /**
+ * Set the sensor {@link PhysicalVolume} to be sensitive.
+ * @param surveyVolume
+ */
+ private void createSensorDetectorElement(JavaSurveyVolume surveyVolume) {
+
+ // set the physical volume to be sensitive
+ // TODO this should go into the geometry definition?!
+ ((PhysicalVolume)surveyVolume.getPhysVolume()).setSensitive(true);
+
+ }
+
+ /**
+ * Create the {@link SiTrackerModule}.
+ * @param surveyVolume
+ * @param layerDe - mother {@link DetectorElement}
+ */
+ protected void createTrackerModuleDetectorElement(JavaSurveyVolume surveyVolume, IDetectorElement layerDe) {
+ // create the "module" detector element
+ // it's under the base element
+
+ int moduleNumber = getModuleNumber(surveyVolume);
+
+ String modulePlacementName = surveyVolume.getName();// builder.getSubdetector().getName() + "_" + moduleName + "_layer" + layer + "_module" + moduleNumber;
+
+ // find the base DE as mother
+ IDetectorElement baseDe = builder.getBaseDetectorElement();
+ if(baseDe==null) {
+ throw new RuntimeException("Base DE couldn't be found. Shouldn't happen!");
+ }
+
+ // use base as mother for physical volume
+ String modulePath = baseDe.getGeometry().getPathString() + "/" + modulePlacementName;
+
+ if(_debug) {
+ System.out.printf("%s: create SiTrackerModule with: placementname %s, modulePath %s, moduleNumber %d \n", getClass().getSimpleName(),modulePlacementName, modulePath, moduleNumber);
+ }
+
+ SiTrackerModule moduleDe = new SiTrackerModule(modulePlacementName, layerDe, modulePath, moduleNumber);
+
+ if(_debug) System.out.printf("%s: add module DE to existing ones \n", getClass().getSimpleName(),modulePlacementName, modulePath, moduleNumber);
+
+
+ //keep track of the module detector element
+ builder.addModuleDetectorElement(moduleDe);
+
+ }
+
+
+
+
+ /**
+ * Create the layer {@link DetectorElement}
+ * @param surveyVolume
+ * @return the detector element.
+ */
+ protected IDetectorElement createLayerDetectorElement(JavaSurveyVolume surveyVolume) {
+ int nfields = builder.getDetectorIdentifierHelper().getIdentifierDictionary().getNumberOfFields();
+ IExpandedIdentifier layerPosId = new ExpandedIdentifier(nfields);
+ layerPosId.setValue(builder.getDetectorIdentifierHelper().getFieldIndex("system"), builder.getSubdetector().getSystemID());
+ layerPosId.setValue(builder.getDetectorIdentifierHelper().getFieldIndex("barrel"), builder.getDetectorIdentifierHelper().getBarrelValue());
+ //use the old definition of layer number to be consistent
+ //int layer = HPSTestRunTracker2014Builder.getLayerFromVolumeName(geometryObject.getName());
+ int layer = builder._builder.getOldGeomDefLayerFromVolumeName(surveyVolume.getName());
+ layerPosId.setValue(builder.getDetectorIdentifierHelper().getFieldIndex("layer"), layer);
+ if(_debug) System.out.printf("%s: layerPosId layer = %d (compare with new layer %d)\n", getClass().getSimpleName(),layer, HPSTrackerBuilder.getLayerFromVolumeName(surveyVolume.getName()));
+
+ // find the base DE as mother
+ IDetectorElement baseDe = builder.getBaseDetectorElement();
+ if(baseDe==null) {
+ throw new RuntimeException("Base DE couldn't be found. Shouldn't happen!");
+ }
+
+
+ // create the layer detector element and keep track of it
+ //IDetectorElement layerDe = builder.getLayerDetectorElement(layerPosId);
+ IDetectorElement layerDe = builder.getLayerDetectorElement(layerPosId);
+
+ if(layerDe==null) {
+ //layerDe = new DetectorElement(builder.getSubdetector().getName() + "_layer" + layer, builder.getSubdetector().getDetectorElement(), builder.getDetectorIdentifierHelper().pack(layerPosId));
+ layerDe = new DetectorElement(builder.getSubdetector().getName() + "_layer" + layer, baseDe, builder.getDetectorIdentifierHelper().pack(layerPosId));
+ builder.addLayerDetectorElement(layerDe);
+ } else {
+ if(_debug) System.out.printf("%s: layerDE exists\n", getClass().getSimpleName());
+ }
+
+ if(_debug) System.out.printf("%s: created layerDE %s \n", getClass().getSimpleName(),layerDe.getName());
+
+ return layerDe;
+ }
+
+
+
+ /**
+ * Create the tracker base {@link DetectorElement}
+ * @param surveyVolume
+ */
+ void createBaseDetectorElement(JavaSurveyVolume surveyVolume) {
+
+ int nfields = builder.getDetectorIdentifierHelper().getIdentifierDictionary().getNumberOfFields();
+ IExpandedIdentifier layerPosId = new ExpandedIdentifier(nfields);
+ layerPosId.setValue(builder.getDetectorIdentifierHelper().getFieldIndex("system"), builder.getSubdetector().getSystemID());
+ layerPosId.setValue(builder.getDetectorIdentifierHelper().getFieldIndex("barrel"), builder.getDetectorIdentifierHelper().getBarrelValue());
+ int layer = 12; // dummy value
+ layerPosId.setValue(builder.getDetectorIdentifierHelper().getFieldIndex("layer"), layer);
+ IDetectorElement baseDe = builder.getBaseDetectorElement();
+ if(baseDe!=null) {
+ throw new RuntimeException("Base exists. Shouldn't happen!");
+ }
+ ILogicalVolume trackingVolume = surveyVolume.getPhysMother().getVolume();
+ if(!trackingVolume.getName().contains("tracking")) {
+ throw new RuntimeException("base phys mother " + surveyVolume.getPhysMother().getName() + " is not tracking volume!?");
+ }
+ String physVolPath = trackingVolume.getName() + "/" + surveyVolume.getPhysVolume().getName();
+ baseDe = new DetectorElement(builder.getSubdetector().getName() + "_base", builder.getSubdetector().getDetectorElement(), physVolPath, builder.getIdentifierDictionary().pack(layerPosId));
+ builder.addBaseDetectorElement(baseDe);
+
+ if(_debug) System.out.printf("%s: baseDE name %s \n", getClass().getSimpleName(),baseDe.getName());
+ }
+
+
+ public IDetectorElement makeSubdetectorDetectorElement(Detector detector, Subdetector subdetector) {
+
+ if(_debug) System.out.printf("%s: makeSubdetectorDetectorElement for subdetector %s\n", getClass().getSimpleName(),subdetector.getName());
+
+ IDetectorElement subdetectorDE =
+ new HpsTracker2(subdetector.getName(), detector.getDetectorElement());
+ subdetector.setDetectorElement(subdetectorDE);
+ return subdetectorDE;
+ }
+
+ private void printDEs() {
+ System.out.printf("%s: Print all %d detector elements in store\n", getClass().getSimpleName(),DetectorElementStore.getInstance().size());
+ for(IDetectorElement e : DetectorElementStore.getInstance()) {
+ System.out.printf("%s: Name: %s \n", getClass().getSimpleName(),e.getName());
+ if(e.hasGeometryInfo()) {
+ System.out.printf("%s: Position: %s \n", getClass().getSimpleName(),e.getGeometry().getPosition());
+ System.out.printf("%s: LocalToGlobal: \n%s \n", getClass().getSimpleName(),((Transform3D)e.getGeometry().getLocalToGlobal()).toString());
+ //System.out.printf("%s: GlobalToLocal: \n%s \n", getClass().getSimpleName(),((Transform3D)e.getGeometry().getGlobalToLocal()).toString());
+ IGeometryInfo info = e.getGeometry();
+ if(info!=null) {
+ while((info=info.parentGeometry())!=null) {
+ System.out.printf("%s: Parent geometry DE: %s \n", getClass().getSimpleName(),info.getDetectorElement().getName());
+ System.out.printf("%s: Parent Position: %s \n", getClass().getSimpleName(),info.getPosition());
+ System.out.printf("%s: Parent LocalToGlobal: \n%s \n", getClass().getSimpleName(),((Transform3D)info.getLocalToGlobal()).toString());
+
}
}
-
-
- if(moduleDe==null) throw new RuntimeException("Cannot find module DE for " + geometryObject.getName());
-
- // Setup SiSensor's identifier.
- IExpandedIdentifier expId = new ExpandedIdentifier(iddict.getNumberOfFields());
- expId.setValue(iddict.getFieldIndex("system"), builder.getSubdetector().getSystemID());
- expId.setValue(iddict.getFieldIndex("barrel"), 0);
- expId.setValue(iddict.getFieldIndex("layer"), builder.getDetectorIdentifierHelper().getValue(layerDe.getIdentifier(), "layer"));
- expId.setValue(iddict.getFieldIndex("module"), ((SiTrackerModule) moduleDe).getModuleId());
- // The sensorNumber is always 0 in the old geometry. Keep it that way.
- int sensorNumber = 0;
- expId.setValue(iddict.getFieldIndex("sensor"), sensorNumber);
-
- // Packed identifier.
- IIdentifier sensorId = iddict.pack(expId);
-
- // Sensor paths.
- String modulePath = moduleDe.getGeometry().getPathString();
- IPhysicalVolume componentPhysVol = geometryObject.getPhysMother().getPhysVolume();
- String sensorPath = modulePath.toString() + "/" + componentPhysVol.getName() + "/" + sensorPhysVol.getName();
- String sensorName = moduleDe.getName() + "_sensor" + sensorNumber;
-
- if(_debug) System.out.printf("%s: create HpsSiSensor with sensorNumber %d name %s moduleDe %s sensorPath %s sensor Id %d \n", getClass().getSimpleName(),
- sensorNumber, sensorName, moduleDe.getName(), sensorPath, sensorNumber);
-
-
- // Create the sensor.
- HpsSiSensor sensor = new HpsSiSensor(sensorNumber, sensorName, moduleDe, sensorPath, sensorId);
-
- if(_debug) System.out.printf("%s: created sensor %s \n", getClass().getSimpleName(), sensor.getName());
-
- // Increment sensor numbering.
- // TODO this is just random. Not sure what to do here!
- // ++sensorNumber;
-
- } else {
- throw new RuntimeException("I don't think I should reach this? Should " + geometryObject.getName() + " be a ghost?" );
}
-
-
- }
-
- // add daughters
- if(_debug) System.out.printf("%s: add %d daughters to %s\n", this.getClass().getSimpleName(),geometryObject.getDaughters().size(), geometryObject.getName());
- for(JavaSurveyVolume daughter : geometryObject.getDaughters()) {
- setupPhysicalVolumes(daughter);
- }
-
-
-
- if(_debug) System.out.printf("%s: DONE setup the detector element for %s\n", this.getClass().getSimpleName(),geometryObject.getName());
-
-
- }
-
-
+ }
+ }
+
}
Modified: projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/HPSTestRunTracker2014GeometryDefinition.java
=============================================================================
--- projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/HPSTestRunTracker2014GeometryDefinition.java (original)
+++ projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/HPSTestRunTracker2014GeometryDefinition.java Tue Dec 2 11:21:55 2014
@@ -1787,6 +1787,54 @@
}
+ /* (non-Javadoc)
+ * @see org.lcsim.geometry.compact.converter.HPSTrackerBuilder#getOldGeomDefLayerFromVolumeName(java.lang.String)
+ */
+ public int getOldGeomDefLayerFromVolumeName(String name) {
+
+ String half = getHalfFromName(name);
+ int l = getLayerFromVolumeName(name);
+ boolean isTopLayer = false;
+ if(half=="top") isTopLayer=true;
+ else if(half=="bottom") isTopLayer = false;
+ else throw new RuntimeException("no half found from " + name);
+ boolean isAxial = isAxialFromName(name);
+ return getOldLayerDefinition(isTopLayer, l, isAxial);
+ }
+
+ /* (non-Javadoc)
+ * @see org.lcsim.geometry.compact.converter.HPSTrackerBuilder#getOldLayerDefinition(boolean, int, boolean)
+ */
+ public int getOldLayerDefinition(boolean isTopLayer, int l, boolean isAxial) {
+ int layer=-1;
+ if(isAxial) {
+ if(isTopLayer) {
+ layer = 2*l-1;
+ }
+ else {
+ layer = 2*l;
+ }
+ } else {
+ if(isTopLayer) {
+ layer = 2*l;
+ } else {
+ layer = 2*l-1;
+ }
+ }
+ return layer;
+ }
+
+
+
+ /* (non-Javadoc)
+ * @see org.lcsim.geometry.compact.converter.HPSTrackerBuilder#getMillepedeLayer(java.lang.String)
+ */
+ public int getMillepedeLayer(String name) {
+ return getOldGeomDefLayerFromVolumeName(name);
+ }
+
+
+
}
Modified: projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/HPSTracker2014GeometryDefinition.java
=============================================================================
--- projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/HPSTracker2014GeometryDefinition.java (original)
+++ projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/HPSTracker2014GeometryDefinition.java Tue Dec 2 11:21:55 2014
@@ -1749,11 +1749,11 @@
// hole or slot
boolean isHole = isHoleFromName(volName);
- // find layer according to old definition
- int oldLayer = getOldLayerDefinition(isTopLayer, layer, isAxial);
-
+ // find layer according to Millepede layer definition
+ int millepedeLayer = getMillepedeLayer(isTopLayer, layer, isAxial, isHole);
+
// find alignment correction to this volume
- AlignmentCorrection alignmentCorrection = getHalfModuleAlignmentCorrection(isTopLayer, oldLayer);
+ AlignmentCorrection alignmentCorrection = getHalfModuleAlignmentCorrection(isTopLayer, millepedeLayer);
// find the module bundle that it will be added to
@@ -1898,7 +1898,101 @@
return hm;
}
-
+
+
+
+ /* (non-Javadoc)
+ * @see org.lcsim.geometry.compact.converter.HPSTrackerBuilder#getMillepedeLayer(java.lang.String)
+ */
+ public int getMillepedeLayer(String name) {
+
+ boolean isTopLayer = getHalfFromName(name).equals("top") ? true : false;
+
+ // find layer
+ int layer = getLayerFromVolumeName(name);
+
+ // axial or stereo
+ boolean isAxial = isAxialFromName(name);
+
+ // use default layer numbering for L1-3
+ if(layer<4) {
+ int l = getOldLayerDefinition(isTopLayer, layer, isAxial);
+ System.out.printf("%s: %s %d %s -> MP layer %d\n",getClass().getSimpleName(),isTopLayer?"top":"bottom", layer, isAxial?"axial":"stereo", l);
+ return l;
+ }
+
+ // hole or slot
+ boolean isHole = isHoleFromName(name);
+
+ return getMillepedeLayer(isTopLayer, layer, isAxial, isHole);
+
+ }
+
+
+
+ /**
+ * Definition relating the sensors and layer number used in millepede for this detector.
+ * @param isTopLayer
+ * @param layer
+ * @param isAxial
+ * @param isHole
+ * @return
+ */
+ public int getMillepedeLayer(boolean isTopLayer, int layer, boolean isAxial, boolean isHole) {
+ int l = -1;
+ // use default layer numbering for L1-3
+ if(layer<4) {
+ l = getOldLayerDefinition(isTopLayer, layer, isAxial);
+ } else {
+ // Scheme:
+ // For top modules axial layer is odd and stereo is even.
+ // Hole vs slot given by example below:
+ // e.g. top layer 4:
+ // axial - hole: 7
+ // axial - slot: 9
+ // stereo - hole: 8
+ // axial - slot: 10
+
+ l = 7 + (layer-4)*4;
+ int s = -1;
+ if(isTopLayer) {
+ s = 0;
+ if(isAxial) {
+ s += 0;
+ } else {
+ s += 1;
+ }
+ if(isHole) {
+ s += 0;
+ } else {
+ s += 2;
+ }
+ } else {
+ s = 0;
+ if(!isAxial) {
+ s += 0;
+ } else {
+ s += 1;
+ }
+ if(isHole) {
+ s += 0;
+ } else {
+ s += 2;
+ }
+ }
+ l = l + s;
+ }
+
+ if(l<0) throw new RuntimeException("Error getting the millepede layer.");
+
+ System.out.printf("%s: %s %d %s %s -> MP layer %d\n",getClass().getSimpleName(),isTopLayer?"top":"bottom", layer, isAxial?"axial":"stereo", isHole?"hole":"slot", l);
+
+
+ return l;
+ }
+
+
+
}
Modified: projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/HPSTrackerBuilder.java
=============================================================================
--- projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/HPSTrackerBuilder.java (original)
+++ projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/HPSTrackerBuilder.java Tue Dec 2 11:21:55 2014
@@ -93,6 +93,8 @@
* @return the alignment correction for this half-module
*/
protected AlignmentCorrection getHalfModuleAlignmentCorrection(boolean isTopLayer, int layer) {
+ int rFound = 0;
+ int tFound = 0;
double r[] = {0,0,0};
double t[] = {0,0,0};
for(MilleParameter p_loop: milleparameters) {
@@ -101,10 +103,15 @@
if(paramIsTop==isTopLayer && paramLayer==layer) {
if(p_loop.getType()==1) {
t[p_loop.getDim()-1] = p_loop.getValue();
+ tFound++;
} else if(p_loop.getType()==2) {
r[p_loop.getDim()-1] = p_loop.getValue();
+ rFound++;
}
}
+ }
+ if(tFound!=3 || rFound!=3) {
+ throw new RuntimeException("Problem finding translation alignment parameters (found t " + tFound + " r " + rFound + ") for " + (isTopLayer?"top":"bottom") + " layer " + layer);
}
AlignmentCorrection c = new AlignmentCorrection();
c.setTranslation(new BasicHep3Vector(t));
@@ -423,35 +430,42 @@
* @return transformed vector.
*/
public static Hep3Vector transformToTracking(Hep3Vector vec, SurveyVolume geometry) {
- int debug =0;
- if(debug>0) System.out.printf("\ntransformToTracking: vec %s in local coordiantes of %s with mother %s\n", vec.toString(), geometry.getName(), geometry.getMother().getName().toString());
- Hep3Vector vec_mother_coord = geometry.getCoord().getTransformation().transformed(vec);
- if(debug>0) System.out.printf("vec_mother_coord %s\n",vec_mother_coord.toString());
- if(geometry.getMother().getName().equals("trackingVolume")) {
- if(debug>0) System.out.printf("reached tracking volume. Return \n");
- return vec_mother_coord;
- } else {
- if(debug>0) System.out.printf("continue searching.\n");
- }
- return transformToTracking(vec_mother_coord, geometry.getMother());
- }
-
- /**
- * Get the layer number consistent with the old geometry definition.
- * @param module name that contains layer and half information.
- * @return the layer.
- */
- public static int getOldGeomDefLayerFromVolumeName(String name) {
-
- String half = getHalfFromName(name);
- int l = getLayerFromVolumeName(name);
- boolean isTopLayer = false;
- if(half=="top") isTopLayer=true;
- else if(half=="bottom") isTopLayer = false;
- else throw new RuntimeException("no half found from " + name);
- boolean isAxial = isAxialFromName(name);
- return getOldLayerDefinition(isTopLayer, l, isAxial);
- }
+ return transformToParent(vec, geometry, "trackingVolume");
+ }
+
+ /**
+ * Find the vector in a mother volume coordinate system.
+ * @param vec - vector to transform
+ * @param geometry - geometry where vector is defined.
+ * @return transformed vector.
+ */
+ public static Hep3Vector transformToParent(Hep3Vector vec, SurveyVolume geometry, String targetName) {
+ int debug =0;
+ if(debug>0) System.out.printf("\ntransformToParent: vec %s in local coordiantes of %s\n", vec.toString(), geometry.getName());
+ if(geometry.getMother()==null) {
+ if(debug>0) System.out.printf("\ntransformToParent: no mother, return null\n", vec.toString(), geometry.getName());
+ return null;
+ }
+ if(debug>0) System.out.printf("\ntransformToParent: vec %s in local coordiantes of %s with mother %s\n", vec.toString(), geometry.getName(), geometry.getMother().getName().toString());
+ SurveyCoordinateSystem coord = geometry.getCoord();
+ if(coord==null) {
+ throw new RuntimeException("transformToParent: no coordinate system found for %s, return null " + geometry.getName());
+ }
+ Hep3Vector vec_mother_coord = coord.getTransformation().transformed(vec);
+ if(debug>0) System.out.printf("vec_mother_coord %s\n",vec_mother_coord.toString());
+ if(geometry.getMother().getName().equals(targetName)) {
+ if(debug>0) System.out.printf("reached target \"%s\"tracking volume. Return \n", targetName);
+ return vec_mother_coord;
+ } else {
+ if(debug>0) System.out.printf("continue searching.\n");
+ }
+ return transformToParent(vec_mother_coord, geometry.getMother(), targetName);
+ }
+
+
+
+
+
/**
* Get axial or stereo key name from string
@@ -487,7 +501,25 @@
* @param isAxial - axial or stereo sensor
* @return
*/
- public static int getOldLayerDefinition(boolean isTopLayer, int l, boolean isAxial) {
+ public int getOldGeomDefLayerFromVolumeName(String name) {
+
+ String half = getHalfFromName(name);
+ int l = getLayerFromVolumeName(name);
+ boolean isTopLayer = false;
+ if(half=="top") isTopLayer=true;
+ else if(half=="bottom") isTopLayer = false;
+ else throw new RuntimeException("no half found from " + name);
+ boolean isAxial = isAxialFromName(name);
+ return getOldLayerDefinition(isTopLayer, l, isAxial);
+ }
+
+
+ /**
+ * Get the layer number consistent with the old geometry definition.
+ * @param module name that contains layer and half information.
+ * @return the layer.
+ */
+ public int getOldLayerDefinition(boolean isTopLayer, int l, boolean isAxial) {
int layer=-1;
if(isAxial) {
if(isTopLayer) {
@@ -505,7 +537,16 @@
}
return layer;
}
-
+
+ /**
+ * Definition of the millepede layer number.
+ * @param name of half-module or sensor
+ * @return millepede layer number.
+ */
+ abstract public int getMillepedeLayer(String name);
+
+
+
Modified: projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/HPSTrackerGeometryDefinition.java
=============================================================================
--- projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/HPSTrackerGeometryDefinition.java (original)
+++ projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/HPSTrackerGeometryDefinition.java Tue Dec 2 11:21:55 2014
@@ -99,12 +99,13 @@
boolean isAxial = isAxialFromName(volName);
// find layer according to old definition
- int oldLayer = getOldLayerDefinition(isTopLayer, layer, isAxial);
+ int millepedeLayer = getMillepedeLayer(volName);
+
//if(isDebug()) System.out.printf("%s: half? %s layer %d oldlayer %d axial? %s\n",
// this.getClass().getSimpleName(), isTopLayer?"top":"bottom", layer,oldLayer,isAxial?"yes":"no");
// find alignment correction to this volume
- AlignmentCorrection alignmentCorrection = getHalfModuleAlignmentCorrection(isTopLayer, oldLayer);
+ AlignmentCorrection alignmentCorrection = getHalfModuleAlignmentCorrection(isTopLayer, millepedeLayer);
// find the module bundle that it will be added to
@@ -248,6 +249,8 @@
}
+
+
/**
* Tracking volume geometry definition.
*/
Modified: projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/JavaSurveyVolume.java
=============================================================================
--- projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/JavaSurveyVolume.java (original)
+++ projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/JavaSurveyVolume.java Tue Dec 2 11:21:55 2014
@@ -180,18 +180,24 @@
//if(isDebug()) {
- System.out.printf("%s: box_center_base_local %s\n", this.getClass().getSimpleName(), box_center_base_local.toString());
+ System.out.printf("%s: SurveyVolume information for %s:\n", this.getClass().getSimpleName(), base.getName());
+ System.out.printf("%s: box_center_base_local %s\n", this.getClass().getSimpleName(), box_center_base_local.toString());
System.out.printf("%s: box_center_base %s\n", this.getClass().getSimpleName(), box_center_base.toString());
System.out.printf("%s: mother center %s\n", this.getClass().getSimpleName(), base.getMother()==null?" <no mother> ":mother_center.toString());
System.out.printf("%s: box_center %s\n", this.getClass().getSimpleName(), box_center.toString());
System.out.printf("%s: pos %s\n", this.getClass().getSimpleName(), getPos().toString());
- System.out.printf("%s: euler %s\n", this.getClass().getSimpleName(), lcdd_rot_angles.toString());
+ Hep3Vector box_center_tracking_xcheck = HPSTrackerBuilder.transformToTracking(box_center_base_local, base);
+ System.out.printf("%s: box_center_tracking_xcheck %s (for %s)\n", this.getClass().getSimpleName(), box_center_tracking_xcheck==null ? " <null> " : box_center_tracking_xcheck.toString(),base.getName());
+ Hep3Vector box_center_envelope_xcheck2 = HPSTrackerBuilder.transformToParent(box_center_base_local, base, "base");
+ System.out.printf("%s: box_center_base_xcheck2 %s (for %s)\n", this.getClass().getSimpleName(), box_center_envelope_xcheck2==null ? " <null> " : box_center_envelope_xcheck2.toString(),base.getName());
+ if(box_center_envelope_xcheck2!=null) {
+ Hep3Vector box_center_envelope_xcheck2_inch = VecOp.mult(0.0393701, box_center_envelope_xcheck2);
+ System.out.printf("%s: box_center_base_xcheck2_in %s (for %s)\n", this.getClass().getSimpleName(), box_center_envelope_xcheck2_inch==null ? " <null> " : box_center_envelope_xcheck2_inch.toString(),base.getName());
+ }
+ System.out.printf("%s: euler %s\n", this.getClass().getSimpleName(), lcdd_rot_angles.toString());
System.out.printf("%s: rot %s\n", this.getClass().getSimpleName(), getRot().toString());
- //calculate the position in tracking volume separately as a xcheck
- Hep3Vector box_center_tracking_xcheck = HPSTrackerBuilder.transformToTracking(box_center_base_local, base);
- System.out.printf("%s: box_center_tracking_xcheck %s for %s\n", this.getClass().getSimpleName(), box_center_tracking_xcheck.toString(),base.getName());
- //}
+ //}
}
Modified: projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/LCDDSurveyVolume.java
=============================================================================
--- projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/LCDDSurveyVolume.java (original)
+++ projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/LCDDSurveyVolume.java Tue Dec 2 11:21:55 2014
@@ -169,12 +169,13 @@
Hep3Vector lcdd_rot_angles = TransformationUtils.getCardanAngles(base_u, base_v, base_w, unit_u, unit_v, unit_w);
- // Create the LCDD position
+ // Create the LCDD position and rotation
setPos(new Position(getName() + "_position",box_center.x(), box_center.y(), box_center.z()));
-
setRot(new Rotation(getName() + "_rotation",lcdd_rot_angles.x(), lcdd_rot_angles.y(), lcdd_rot_angles.z()));
+
if(isDebug()) {
- System.out.printf("%s: box_center_base_local %s\n", this.getClass().getSimpleName(), box_center_base_local.toString());
+ System.out.printf("%s: SurveyVolume information for %s:\n", this.getClass().getSimpleName(), base.getName());
+ System.out.printf("%s: box_center_base_local %s\n", this.getClass().getSimpleName(), box_center_base_local.toString());
System.out.printf("%s: box_center_base %s\n", this.getClass().getSimpleName(), box_center_base.toString());
System.out.printf("%s: mother center %s\n", this.getClass().getSimpleName(), mother_center.toString());
System.out.printf("%s: box_center %s\n", this.getClass().getSimpleName(), box_center.toString());
@@ -184,7 +185,7 @@
//calculate the position in tracking volume separately as a xcheck
Hep3Vector box_center_tracking_xcheck = HPSTrackerBuilder.transformToTracking(box_center_base_local, base);
- System.out.printf("%s: box_center_tracking_xcheck %s\n", this.getClass().getSimpleName(), box_center_tracking_xcheck.toString());
+ System.out.printf("%s: box_center_tracking_xcheck %s (for %s)\n", this.getClass().getSimpleName(), box_center_tracking_xcheck.toString(), base.getName());
}
}
Modified: projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/MilleParameter.java
=============================================================================
--- projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/MilleParameter.java (original)
+++ projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/MilleParameter.java Tue Dec 2 11:21:55 2014
@@ -107,4 +107,6 @@
public String toString() {
return String.format("Milleparameter id=%d half=%d type=%d dim=%d sensor=%d value=%f", this.getId(), this.getHalf(), this.getType(), this.getDim(), this.getSensor(), this.getValue());
}
+
+
}
Modified: projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/lcdd/HPSTracker2014Base.java
=============================================================================
--- projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/lcdd/HPSTracker2014Base.java (original)
+++ projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/lcdd/HPSTracker2014Base.java Tue Dec 2 11:21:55 2014
@@ -237,7 +237,7 @@
//use the old definition of layer number to be consistent
//int layer = HPSTestRunTracker2014Builder.getLayerFromVolumeName(geometryObject.getName());
- int layer = HPSTrackerBuilder.getOldGeomDefLayerFromVolumeName(geometryObject.getName());
+ int layer = builder._builder.getOldGeomDefLayerFromVolumeName(geometryObject.getName());
if(_debug) System.out.printf("%s: physVolId layer = %d (compare with new layer %d)\n", getClass().getSimpleName(),layer, HPSTrackerBuilder.getLayerFromVolumeName(geometryObject.getName()));
Modified: projects/lcsim/trunk/detector-framework/src/test/resources/org/lcsim/geometry/subdetector/HPSTracker2014.xml
=============================================================================
--- projects/lcsim/trunk/detector-framework/src/test/resources/org/lcsim/geometry/subdetector/HPSTracker2014.xml (original)
+++ projects/lcsim/trunk/detector-framework/src/test/resources/org/lcsim/geometry/subdetector/HPSTracker2014.xml Tue Dec 2 11:21:55 2014
@@ -114,6 +114,14 @@
<millepede_constant name="11108" value="0.0"/>
<millepede_constant name="11109" value="0.0"/>
<millepede_constant name="11110" value="0.0"/>
+ <millepede_constant name="11111" value="0.0"/>
+ <millepede_constant name="11112" value="0.0"/>
+ <millepede_constant name="11113" value="0.0"/>
+ <millepede_constant name="11114" value="0.0"/>
+ <millepede_constant name="11115" value="0.0"/>
+ <millepede_constant name="11116" value="0.0"/>
+ <millepede_constant name="11117" value="0.0"/>
+ <millepede_constant name="11118" value="0.0"/>
<millepede_constant name="11201" value="0.0"/>
<millepede_constant name="11202" value="0.0"/>
@@ -125,6 +133,14 @@
<millepede_constant name="11208" value="0.0"/>
<millepede_constant name="11209" value="0.0"/>
<millepede_constant name="11210" value="0.0"/>
+ <millepede_constant name="11211" value="0.0"/>
+ <millepede_constant name="11212" value="0.0"/>
+ <millepede_constant name="11213" value="0.0"/>
+ <millepede_constant name="11214" value="0.0"/>
+ <millepede_constant name="11215" value="0.0"/>
+ <millepede_constant name="11216" value="0.0"/>
+ <millepede_constant name="11217" value="0.0"/>
+ <millepede_constant name="11218" value="0.0"/>
<millepede_constant name="11301" value="0.0"/>
<millepede_constant name="11302" value="0.0"/>
@@ -136,6 +152,15 @@
<millepede_constant name="11308" value="0.0"/>
<millepede_constant name="11309" value="0.0"/>
<millepede_constant name="11310" value="0.0"/>
+ <millepede_constant name="11311" value="0.0"/>
+ <millepede_constant name="11312" value="0.0"/>
+ <millepede_constant name="11313" value="0.0"/>
+ <millepede_constant name="11314" value="0.0"/>
+ <millepede_constant name="11315" value="0.0"/>
+ <millepede_constant name="11316" value="0.0"/>
+ <millepede_constant name="11317" value="0.0"/>
+ <millepede_constant name="11318" value="0.0"/>
+
<!-- top half-module rotations -->
@@ -149,6 +174,14 @@
<millepede_constant name="12108" value="0.0"/>
<millepede_constant name="12109" value="0.0"/>
<millepede_constant name="12110" value="0.0"/>
+ <millepede_constant name="12111" value="0.0"/>
+ <millepede_constant name="12112" value="0.0"/>
+ <millepede_constant name="12113" value="0.0"/>
+ <millepede_constant name="12114" value="0.0"/>
+ <millepede_constant name="12115" value="0.0"/>
+ <millepede_constant name="12116" value="0.0"/>
+ <millepede_constant name="12117" value="0.0"/>
+ <millepede_constant name="12118" value="0.0"/>
<millepede_constant name="12201" value="0.0"/>
<millepede_constant name="12202" value="0.0"/>
@@ -160,6 +193,14 @@
<millepede_constant name="12208" value="0.0"/>
<millepede_constant name="12209" value="0.0"/>
<millepede_constant name="12210" value="0.0"/>
+ <millepede_constant name="12211" value="0.0"/>
+ <millepede_constant name="12212" value="0.0"/>
+ <millepede_constant name="12213" value="0.0"/>
+ <millepede_constant name="12214" value="0.0"/>
+ <millepede_constant name="12215" value="0.0"/>
+ <millepede_constant name="12216" value="0.0"/>
+ <millepede_constant name="12217" value="0.0"/>
+ <millepede_constant name="12218" value="0.0"/>
<millepede_constant name="12301" value="0.0"/>
<millepede_constant name="12302" value="0.0"/>
@@ -171,6 +212,14 @@
<millepede_constant name="12308" value="0.0"/>
<millepede_constant name="12309" value="0.0"/>
<millepede_constant name="12310" value="0.0"/>
+ <millepede_constant name="12311" value="0.0"/>
+ <millepede_constant name="12312" value="0.0"/>
+ <millepede_constant name="12313" value="0.0"/>
+ <millepede_constant name="12314" value="0.0"/>
+ <millepede_constant name="12315" value="0.0"/>
+ <millepede_constant name="12316" value="0.0"/>
+ <millepede_constant name="12317" value="0.0"/>
+ <millepede_constant name="12318" value="0.0"/>
<!-- bottom half-module translations -->
@@ -184,7 +233,15 @@
<millepede_constant name="21108" value="0.0"/>
<millepede_constant name="21109" value="0.0"/>
<millepede_constant name="21110" value="0.0"/>
-
+ <millepede_constant name="21111" value="0.0"/>
+ <millepede_constant name="21112" value="0.0"/>
+ <millepede_constant name="21113" value="0.0"/>
+ <millepede_constant name="21114" value="0.0"/>
+ <millepede_constant name="21115" value="0.0"/>
+ <millepede_constant name="21116" value="0.0"/>
+ <millepede_constant name="21117" value="0.0"/>
+ <millepede_constant name="21118" value="0.0"/>
+
<millepede_constant name="21201" value="0.0"/>
<millepede_constant name="21202" value="0.0"/>
<millepede_constant name="21203" value="0.0"/>
@@ -195,6 +252,14 @@
<millepede_constant name="21208" value="0.0"/>
<millepede_constant name="21209" value="0.0"/>
<millepede_constant name="21210" value="0.0"/>
+ <millepede_constant name="21211" value="0.0"/>
+ <millepede_constant name="21212" value="0.0"/>
+ <millepede_constant name="21213" value="0.0"/>
+ <millepede_constant name="21214" value="0.0"/>
+ <millepede_constant name="21215" value="0.0"/>
+ <millepede_constant name="21216" value="0.0"/>
+ <millepede_constant name="21217" value="0.0"/>
+ <millepede_constant name="21218" value="0.0"/>
<millepede_constant name="21301" value="0.0"/>
<millepede_constant name="21302" value="0.0"/>
@@ -206,6 +271,14 @@
<millepede_constant name="21308" value="0.0"/>
<millepede_constant name="21309" value="0.0"/>
<millepede_constant name="21310" value="0.0"/>
+ <millepede_constant name="21311" value="0.0"/>
+ <millepede_constant name="21312" value="0.0"/>
+ <millepede_constant name="21313" value="0.0"/>
+ <millepede_constant name="21314" value="0.0"/>
+ <millepede_constant name="21315" value="0.0"/>
+ <millepede_constant name="21316" value="0.0"/>
+ <millepede_constant name="21317" value="0.0"/>
+ <millepede_constant name="21318" value="0.0"/>
<!-- bottom half-module rotations -->
@@ -219,6 +292,14 @@
<millepede_constant name="22108" value="0.0"/>
<millepede_constant name="22109" value="0.0"/>
<millepede_constant name="22110" value="0.0"/>
+ <millepede_constant name="22111" value="0.0"/>
+ <millepede_constant name="22112" value="0.0"/>
+ <millepede_constant name="22113" value="0.0"/>
+ <millepede_constant name="22114" value="0.0"/>
+ <millepede_constant name="22115" value="0.0"/>
+ <millepede_constant name="22116" value="0.0"/>
+ <millepede_constant name="22117" value="0.0"/>
+ <millepede_constant name="22118" value="0.0"/>
<millepede_constant name="22201" value="0.0"/>
<millepede_constant name="22202" value="0.0"/>
@@ -230,6 +311,14 @@
<millepede_constant name="22208" value="0.0"/>
<millepede_constant name="22209" value="0.0"/>
<millepede_constant name="22210" value="0.0"/>
+ <millepede_constant name="22211" value="0.0"/>
+ <millepede_constant name="22212" value="0.0"/>
+ <millepede_constant name="22213" value="0.0"/>
+ <millepede_constant name="22214" value="0.0"/>
+ <millepede_constant name="22215" value="0.0"/>
+ <millepede_constant name="22216" value="0.0"/>
+ <millepede_constant name="22217" value="0.0"/>
+ <millepede_constant name="22218" value="0.0"/>
<millepede_constant name="22301" value="0.0"/>
<millepede_constant name="22302" value="0.0"/>
@@ -241,6 +330,14 @@
<millepede_constant name="22308" value="0.0"/>
<millepede_constant name="22309" value="0.0"/>
<millepede_constant name="22310" value="0.0"/>
+ <millepede_constant name="22311" value="0.0"/>
+ <millepede_constant name="22312" value="0.0"/>
+ <millepede_constant name="22313" value="0.0"/>
+ <millepede_constant name="22314" value="0.0"/>
+ <millepede_constant name="22315" value="0.0"/>
+ <millepede_constant name="22316" value="0.0"/>
+ <millepede_constant name="22317" value="0.0"/>
+ <millepede_constant name="22318" value="0.0"/>
<!-- top support tilt angles -->
########################################################################
Use REPLY-ALL to reply to list
To unsubscribe from the LCDET-SVN list, click the following link:
https://listserv.slac.stanford.edu/cgi-bin/wa?SUBED1=LCDET-SVN&A=1
|