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