Author: phansson Date: Fri Oct 31 16:08:02 2014 New Revision: 3407 Log: Abstracting out converters Added: 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/lcdd/HPSTracker2014Base.java 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/geometry/compact/converter/lcdd/HPSTestRunTracker2014.java 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 Fri Oct 31 16:08:02 2014 @@ -4,419 +4,27 @@ package org.lcsim.detector.converter.compact; import org.jdom.Element; -import org.lcsim.detector.DetectorElement; -import org.lcsim.detector.DetectorElementStore; -import org.lcsim.detector.DetectorIdentifierHelper; -import org.lcsim.detector.DetectorIdentifierHelper.SystemMap; -import org.lcsim.detector.IDetectorElement; -import org.lcsim.detector.IGeometryInfo; -import org.lcsim.detector.ILogicalVolume; -import org.lcsim.detector.IPhysicalVolume; -import org.lcsim.detector.PhysicalVolume; -import org.lcsim.detector.Transform3D; -import org.lcsim.detector.identifier.ExpandedIdentifier; -import org.lcsim.detector.identifier.IExpandedIdentifier; -import org.lcsim.detector.identifier.IIdentifier; -import org.lcsim.detector.identifier.IIdentifierDictionary; -import org.lcsim.detector.identifier.IIdentifierHelper; -import org.lcsim.detector.material.IMaterial; -import org.lcsim.detector.material.MaterialStore; -import org.lcsim.detector.tracker.silicon.HpsSiSensor; -import org.lcsim.detector.tracker.silicon.SiTrackerIdentifierHelper; -import org.lcsim.detector.tracker.silicon.SiTrackerModule; -import org.lcsim.geometry.compact.Detector; -import org.lcsim.geometry.compact.Subdetector; -import org.lcsim.geometry.compact.converter.JavaGhostSurveyVolume; 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; /** * Converters the HPSTestRunTracker2014 compact description into Java runtime objects * @author Per Hansson Adrian <[log in to unmask]> * */ -public class HPSTestRunTracker2014Converter extends AbstractSubdetectorConverter { - - private boolean _debug = true; - private IMaterial trackingMaterial = null; - private static HPSTrackerJavaBuilder builder; - - public IIdentifierHelper makeIdentifierHelper(Subdetector subdetector, SystemMap systemMap) { - return new SiTrackerIdentifierHelper(subdetector.getDetectorElement(), makeIdentifierDictionary(subdetector), systemMap); - } - - - public Class getSubdetectorType() { - return HPSTestRunTracker2014.class; - } +public class HPSTestRunTracker2014Converter extends HPSTracker2014ConverterBase { public HPSTestRunTracker2014Converter() { super(); - - - } - public void convert(Subdetector subdet, Detector detector) { - - if(_debug) System.out.printf("%s: convert %s \n", getClass().getSimpleName(), subdet.getName()); - - - // check tracking material - trackingMaterial = MaterialStore.getInstance().get("Vacuum"); - //trackingMaterial = MaterialStore.getInstance().get("Vacuum"); - if(trackingMaterial==null) { - System.out.printf("%s: error the tracking material was not found!\n", this.getClass().getSimpleName()); - System.exit(1); - } - - // Get XML node for this subdetector. - Element node = subdet.getNode(); - - // Get the tracking volume for module placement. - ILogicalVolume trackingVolume = detector.getTrackingVolume().getLogicalVolume(); - - - - // build the local geometry - builder = new HPSTestRunTracker2014JavaBuilder(_debug,node); - - - // Set subdetector for later reference - builder.setSubdetector(subdet); - - // Get ID helper and dictionary for subdetector. - builder.setDetectorIdentifierHelper( (DetectorIdentifierHelper) subdet.getDetectorElement().getIdentifierHelper()); - builder.setIdentifierDictionary(subdet.getDetectorElement().getIdentifierHelper().getIdentifierDictionary()); - - - - // Build the detector here - // setup and build the LCDD geometry - if(_debug) System.out.printf("%s: setup and build the JAVA geometry\n", getClass().getSimpleName()); - - builder.build(trackingVolume); - - if(_debug) System.out.printf("%s: DONE setup and build the JAVA geometry\n", getClass().getSimpleName()); - - setupPhysicalVolumes(); - - 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()); - - } - } - } - } - } - } - + /* (non-Javadoc) + * @see org.lcsim.detector.converter.compact.HPSTracker2014ConverterBase#initializeBuilder(org.jdom.Element) + */ + protected HPSTrackerJavaBuilder initializeBuilder(Element node) { + return new HPSTestRunTracker2014JavaBuilder(_debug,node); + } + - - /** - * Setup relations between detector elements. - */ - private void setupPhysicalVolumes() { - - if(_debug) System.out.printf("%s: setup the detector elements\n", getClass().getSimpleName()); - - setupPhysicalVolumes(builder.getBaseTrackerGeometry()); - - if(_debug) System.out.printf("%s: DONE setup the detector elements\n", getClass().getSimpleName()); - - - } - - /** - * Setup the detector element for a geometry object. - * @param geometryObject - volume to process. - */ - private void setupPhysicalVolumes(JavaSurveyVolume geometryObject) { - - if(_debug) System.out.printf("%s: setupDetectorElement for %s\n", getClass().getSimpleName(),geometryObject.getName()); - - // Only certain objects are setup as detector elements - // Ghost volumes are never setup - - // I do this recursively for daughters now as I wanted it to be generic - // but for now since I know what the daughters are I could manually - // go and add:layer->module->sensor detector elements similar to - // the old setup. I wanted this to be more generic in case more structures - // 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()); - } else { - - // build the physical volume - geometryObject.buildPhysVolume(); - PhysicalVolume physVol = (PhysicalVolume) geometryObject.getPhysVolume(); - - // create detector element - // create detector element - if(HPSTrackerBuilder.isBase(geometryObject.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!?"); - } - 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; - } - } - } - - - 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()); - - - } - - - - - - - - } Added: 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 (added) +++ projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/detector/converter/compact/HPSTracker2014ConverterBase.java Fri Oct 31 16:08:02 2014 @@ -0,0 +1,427 @@ +package org.lcsim.detector.converter.compact; + +import org.jdom.Element; +import org.lcsim.detector.DetectorElement; +import org.lcsim.detector.DetectorElementStore; +import org.lcsim.detector.DetectorIdentifierHelper; +import org.lcsim.detector.IDetectorElement; +import org.lcsim.detector.IGeometryInfo; +import org.lcsim.detector.ILogicalVolume; +import org.lcsim.detector.IPhysicalVolume; +import org.lcsim.detector.PhysicalVolume; +import org.lcsim.detector.Transform3D; +import org.lcsim.detector.DetectorIdentifierHelper.SystemMap; +import org.lcsim.detector.identifier.ExpandedIdentifier; +import org.lcsim.detector.identifier.IExpandedIdentifier; +import org.lcsim.detector.identifier.IIdentifier; +import org.lcsim.detector.identifier.IIdentifierDictionary; +import org.lcsim.detector.identifier.IIdentifierHelper; +import org.lcsim.detector.material.IMaterial; +import org.lcsim.detector.material.MaterialStore; +import org.lcsim.detector.tracker.silicon.HpsSiSensor; +import org.lcsim.detector.tracker.silicon.SiTrackerIdentifierHelper; +import org.lcsim.detector.tracker.silicon.SiTrackerModule; +import org.lcsim.geometry.compact.Detector; +import org.lcsim.geometry.compact.Subdetector; +import org.lcsim.geometry.compact.converter.HPSTrackerBuilder; +import org.lcsim.geometry.compact.converter.HPSTrackerJavaBuilder; +import org.lcsim.geometry.compact.converter.JavaGhostSurveyVolume; +import org.lcsim.geometry.compact.converter.JavaSurveyVolume; +import org.lcsim.geometry.subdetector.HPSTestRunTracker2014; + +/** + * Converters the compact description into Java runtime objects + * @author Per Hansson Adrian <[log in to unmask]> + * + */ +public abstract class HPSTracker2014ConverterBase extends + AbstractSubdetectorConverter { + + protected boolean _debug = true; + protected IMaterial trackingMaterial = null; + protected static HPSTrackerJavaBuilder builder; + + public HPSTracker2014ConverterBase() { + super(); + } + + /** + * Initialize builder for this converter. + * @param node + * @return builder. + */ + abstract protected HPSTrackerJavaBuilder initializeBuilder(Element node); + + + public IIdentifierHelper makeIdentifierHelper(Subdetector subdetector, SystemMap systemMap) { + return new SiTrackerIdentifierHelper(subdetector.getDetectorElement(), makeIdentifierDictionary(subdetector), systemMap); + } + + public Class getSubdetectorType() { + return HPSTestRunTracker2014.class; + } + + /* (non-Javadoc) + * @see org.lcsim.detector.converter.compact.AbstractSubdetectorConverter#convert(org.lcsim.geometry.compact.Subdetector, org.lcsim.geometry.compact.Detector) + */ + public void convert(Subdetector subdet, Detector detector) { + + if(_debug) System.out.printf("%s: convert %s \n", getClass().getSimpleName(), subdet.getName()); + + + // check tracking material + trackingMaterial = MaterialStore.getInstance().get("Vacuum"); + //trackingMaterial = MaterialStore.getInstance().get("Vacuum"); + if(trackingMaterial==null) { + System.out.printf("%s: error the tracking material was not found!\n", this.getClass().getSimpleName()); + System.exit(1); + } + + // Get XML node for this subdetector. + Element node = subdet.getNode(); + + // Get the tracking volume for module placement. + ILogicalVolume trackingVolume = detector.getTrackingVolume().getLogicalVolume(); + + + + // build the local geometry + builder = initializeBuilder(node); + //builder = new HPSTestRunTracker2014JavaBuilder(_debug,node); + + + // Set subdetector for later reference + builder.setSubdetector(subdet); + + // Get ID helper and dictionary for subdetector. + builder.setDetectorIdentifierHelper( (DetectorIdentifierHelper) subdet.getDetectorElement().getIdentifierHelper()); + builder.setIdentifierDictionary(subdet.getDetectorElement().getIdentifierHelper().getIdentifierDictionary()); + + + + // Build the detector here + // setup and build the LCDD geometry + if(_debug) System.out.printf("%s: setup and build the JAVA geometry\n", getClass().getSimpleName()); + + builder.build(trackingVolume); + + if(_debug) System.out.printf("%s: DONE setup and build the JAVA geometry\n", getClass().getSimpleName()); + + setupPhysicalVolumes(); + + 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 + */ + private void setupPhysicalVolumes() { + + if(_debug) System.out.printf("%s: setup the detector elements\n", getClass().getSimpleName()); + + 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()); + + // Only certain objects are setup as detector elements + // Ghost volumes are never setup + + // I do this recursively for daughters now as I wanted it to be generic + // but for now since I know what the daughters are I could manually + // go and add:layer->module->sensor detector elements similar to + // the old setup. I wanted this to be more generic in case more structures + // 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()); + } else { + + // build the physical volume + geometryObject.buildPhysVolume(); + PhysicalVolume physVol = (PhysicalVolume) geometryObject.getPhysVolume(); + + // create detector element + // create detector element + if(HPSTrackerBuilder.isBase(geometryObject.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!?"); + } + 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; + } + } + } + + + 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/lcdd/HPSTestRunTracker2014.java ============================================================================= --- projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/lcdd/HPSTestRunTracker2014.java (original) +++ projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/lcdd/HPSTestRunTracker2014.java Fri Oct 31 16:08:02 2014 @@ -4,19 +4,11 @@ import hep.physics.vec.BasicHep3Vector; import hep.physics.vec.Hep3Vector; -import java.util.Iterator; - -import org.jdom.DataConversionException; import org.jdom.Element; import org.jdom.JDOMException; -import org.lcsim.detector.Transform3D; import org.lcsim.geometry.compact.converter.HPSTestRunTracker2014GeometryDefinition; import org.lcsim.geometry.compact.converter.HPSTestRunTracker2014LCDDBuilder; -import org.lcsim.geometry.compact.converter.HPSTrackerBuilder; import org.lcsim.geometry.compact.converter.HPSTrackerLCDDBuilder; -import org.lcsim.geometry.compact.converter.LCDDGhostSurveyVolume; -import org.lcsim.geometry.compact.converter.LCDDSurveyVolume; -import org.lcsim.geometry.compact.converter.SurveyCoordinateSystem; import org.lcsim.geometry.compact.converter.lcdd.util.Box; import org.lcsim.geometry.compact.converter.lcdd.util.LCDD; import org.lcsim.geometry.compact.converter.lcdd.util.PhysVol; @@ -29,359 +21,47 @@ /** * - * Convert the HPS Test run tracker to the LCDD format. + * Convert the HPS Test run tracker 2014 to the LCDD format. * * @author Per Hansson <[log in to unmask]> * */ -public class HPSTestRunTracker2014 extends LCDDSubdetector +public class HPSTestRunTracker2014 extends HPSTracker2014Base { - private boolean _debug = true; - private final boolean buildBeamPlane = false; - // Builder class to handle all geometry information - private static HPSTrackerLCDDBuilder builder; - - - - /** - * Default constructor - * @param node - * @throws JDOMException - */ public HPSTestRunTracker2014(Element node) throws JDOMException { super(node); - - - } - - public boolean isTracker() { - return true; + /* (non-Javadoc) + * @see org.lcsim.geometry.compact.converter.lcdd.HPSTracker2014Base#initializeBuilder(org.lcsim.geometry.compact.converter.lcdd.util.LCDD, org.lcsim.geometry.compact.converter.lcdd.util.SensitiveDetector) + */ + protected HPSTrackerLCDDBuilder initializeBuilder(LCDD lcdd, SensitiveDetector sens) { + HPSTrackerLCDDBuilder b = new HPSTestRunTracker2014LCDDBuilder(_debug,node,lcdd,sens); + return b; } - /** - * Build the LCDD for the subdetector. - * @param lcdd - the LCDD file being created. - * @param sens - the SD for this subdetector. - */ - public void addToLCDD(LCDD lcdd, SensitiveDetector sens) throws JDOMException - { - - - - /** General comments - // Roll: rotation around x - // pitch: rotation around y - // yaw: rotation around z - - // kinematic mounts: - // ball (constraints x,y,z) - // vee (constraints pitch & yaw) - // flat (constraints roll) - **/ - - - - // ID of the detector. - int id = this.node.getAttribute("id").getIntValue(); - - // Name of the detector. - String detector_name = this.node.getAttributeValue("name"); - - if(_debug) System.out.printf("%s: detector id %d name %s",getClass().getSimpleName(), id,detector_name); - - - // Pick the mother volume (tracking volume). - Volume trackingVolume = lcdd.pickMotherVolume(this); - - - // setup and build the LCDD geometry - if(_debug) System.out.printf("%s: setup and build the LCDD geometry\n", getClass().getSimpleName()); - - builder = new HPSTestRunTracker2014LCDDBuilder(_debug,node,lcdd,sens); - - //builder.setLCDD(lcdd); - //builder.setSensitiveDetector(sens); - builder.build(trackingVolume); - - if(_debug) System.out.printf("%s: DONE setup and build the LCDD geometry\n", getClass().getSimpleName()); - - /* - makeExample(lcdd,sens); - //makeExample2(lcdd,sens); - makeExample3(lcdd,sens); - makeExample4(lcdd,sens); - makeExample5(lcdd,sens); - makeExample3b(lcdd,sens); - makeExample5b(lcdd,sens); - makeExample6(lcdd,sens); - makeExample66(lcdd,sens); - makeExample7(lcdd,sens); - makeExample77(lcdd,sens); - makeExample8(lcdd, sens); - makeExample9(lcdd, sens); - makeExample10(lcdd, sens); - */ - - if(buildBeamPlane ) { - // beam plane at global z=0 - Hep3Vector ball_pos_beamplane = new BasicHep3Vector(-1.0*HPSTestRunTracker2014GeometryDefinition.BasePlate.base_plate_width/2.0,0.0,HPSTestRunTracker2014GeometryDefinition.BasePlate.base_plate_length/2.0); - Hep3Vector vee_pos_beamplane = new BasicHep3Vector(ball_pos_beamplane.x()+HPSTestRunTracker2014GeometryDefinition.BasePlate.base_plate_width,ball_pos_beamplane.y(),ball_pos_beamplane.z()); - Hep3Vector flat_pos_beamplane = new BasicHep3Vector(ball_pos_beamplane.x(), ball_pos_beamplane.y(), ball_pos_beamplane.z()-HPSTestRunTracker2014GeometryDefinition.BasePlate.base_plate_length/2.0); - makeBeamPlane(trackingVolume, ball_pos_beamplane, vee_pos_beamplane, flat_pos_beamplane, lcdd, sens); - } - - - // Actually build the LCDD - buildLCDD(); - - - } - - - /** - * Top function to add objects to the LCDD file using the geometry builder class. - */ - private void buildLCDD() { - - if(_debug) System.out.printf("%s: buildLCDD\n", getClass().getSimpleName()); - - // Get a reference to the LCDD - LCDD lcdd = builder.getLCDD(); - SensitiveDetector sd = builder.getSensitiveDetector(); - - // Reference to the top level object in the builder class - // In this case it is the base volume holding the entire tracker - LCDDSurveyVolume lcddObj = (LCDDSurveyVolume) builder.getBaseLCDD(); - - // Add the base volume and all its daughters to the LCDD - addToLCDD(lcddObj,lcdd,sd); - - if(_debug) System.out.printf("%s: buildLCDD DONE\n", getClass().getSimpleName()); - - } - - - - /** - * Add a @LCDDBaseGeom geometry object to the LCDD file. - * @param lcddObj to add - * @param lcdd file - */ - private void addToLCDD(LCDDSurveyVolume lcddObj, LCDD lcdd, SensitiveDetector sd) { - - if(_debug) System.out.printf("%s: adding %s to LCDD\n", getClass().getSimpleName(),lcddObj.getName()); - - boolean doAdd = true; - if(lcddObj.getName().contains("tracking")) doAdd=false; - - if(doAdd) { - - // only world/tracking volume can be ghost here?! - if(lcddObj instanceof LCDDGhostSurveyVolume ) { - System.out.printf("%s: trying to add a ghost volume: %s ??\n", getClass().getSimpleName(),lcddObj.getName()); - throw new RuntimeException("adding a ghost volume (" + lcddObj.getName() + ") to LCDD is not allowed."); - } - // add box, pos, rotation and create phys volume - lcdd.add(lcddObj.getBox()); - lcdd.add(lcddObj.getPos()); - lcdd.add(lcddObj.getRot()); - lcddObj.buildPhysVolume(); - // Set the phys volume Id's - // Since the builder don't have access to the system ID - // I keep the phys volume ID's outside. I think these - // should belong to the builder to avoid repeating it in - // the java converter - // TODO move this to the builder for each volume - try { - setPhysicalVolumeProperties(lcddObj, sd); - } catch (DataConversionException e) { - e.printStackTrace(); - } - } else { - if(_debug) System.out.printf("%s: skip building anything (name=%s)\n", getClass().getSimpleName(),lcddObj.getName()); - } - - // add daughters - if(_debug) System.out.printf("%s: add %d daughters to %s\n", getClass().getSimpleName(),lcddObj.getDaughters().size(),lcddObj.getName()); - for(LCDDSurveyVolume daughter : lcddObj.getDaughters()) { - addToLCDD(daughter,lcdd, sd); - } - - // finally add volume - if(doAdd) { - if(_debug) System.out.printf("%s: adding volume %s\n", getClass().getSimpleName(),lcddObj.getName()); - if(!lcddObj.getVisName().isEmpty()) lcddObj.getVolume().setVisAttributes(lcdd.getVisAttributes(lcddObj.getVisName())); - lcdd.add(lcddObj.getVolume()); - } else { - if(_debug) System.out.printf("%s: skip adding volume %s\n", getClass().getSimpleName(),lcddObj.getName()); - } - if(_debug) System.out.printf("%s: DONE adding %s\n", getClass().getSimpleName(),lcddObj.getName()); - } - - - /** - * Set properties of the physical volume. - * @param geometryObject - */ - private void setPhysicalVolumeProperties(LCDDSurveyVolume geometryObject, SensitiveDetector sd) throws DataConversionException { - - if(_debug) System.out.printf("%s: setPhysVolumeProperties for name %s\n", getClass().getSimpleName(),geometryObject.getName()); - - // the physical vol ID's here are for the <module_placement> TestRunModules - // which is essentially the sensor objects - String name = geometryObject.getName(); - if(name.endsWith("halfmodule_axial") || name.endsWith("halfmodule_stereo") ) { - PhysVol physVol = geometryObject.getPhysVolume(); - int sysId = node.getAttribute("id").getIntValue(); - physVol.addPhysVolID("system", sysId); - physVol.addPhysVolID("barrel", 0); - - //use the old definition of layer number to be consistent - //int layer = HPSTestRunTracker2014Builder.getLayerFromVolumeName(geometryObject.getName()); - int layer = HPSTrackerBuilder.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())); - - - geometryObject.getPhysVolume().addPhysVolID("layer", layer); - String half = HPSTrackerBuilder.getHalfFromName(geometryObject.getName()); - if(half.equals("")) throw new RuntimeException("no half was found for name " + geometryObject.getName()); - int moduleId = half.equals("top") ? 0 : 1; - geometryObject.getPhysVolume().addPhysVolID("module", moduleId); - } - - //TODO this is always 0 in old geometry? Is the id0 really needed? - else if(name.endsWith("sensor_active")) { - geometryObject.getPhysVolume().addPhysVolID("sensor", 0); - geometryObject.getVolume().setSensitiveDetector(sd); - } - //TODO are the component id's really needed? - else if(name.endsWith("sensor")) { - geometryObject.getPhysVolume().addPhysVolID("component", 0); - } - else if(name.endsWith("lamination")) { - geometryObject.getPhysVolume().addPhysVolID("component", 2); - } - else if(name.endsWith("cf")) { - geometryObject.getPhysVolume().addPhysVolID("component", 1); - } - else if(name.endsWith("hybrid")) { - geometryObject.getPhysVolume().addPhysVolID("component", 3); - } - - if(_debug) { - System.out.printf("%s: %d physvolid's\n", getClass().getSimpleName(),geometryObject.getPhysVolume().getChildren("physvolid").size()); - //geomObj.getPhysVolume().getChildren("physvolid field_name="sensor" value="0"") - for (Iterator i = geometryObject.getPhysVolume().getChildren("physvolid").iterator(); i.hasNext();) { - Element e = (Element)i.next(); - System.out.printf("%s: %s %d\n", getClass().getSimpleName(),e.getAttributeValue("field_name"),e.getAttribute("value").getIntValue()); - } - - if(_debug) System.out.printf("%s: DONE setPhysVolumeProperties for name %s\n", getClass().getSimpleName(),geometryObject.getName()); - - } - - - } - - - - - - - private void print(String str) { - System.out.printf("%s: %s\n", this.getClass().getSimpleName(),str); - } - - - - - private void makeBeamPlane(Volume motherVolume, Hep3Vector ball_pos_base_plate, Hep3Vector vee_pos_base_plate,Hep3Vector flat_pos_base_plate, LCDD lcdd, SensitiveDetector sens) throws JDOMException { + + + + + + + + + + + + + + + + + private void makeExample(LCDD lcdd, SensitiveDetector sens) throws JDOMException { if(_debug) { - print("--- makeBeamPlane ----"); - - } - - // create the coordinate system of the beam plane in the tracking volume - // since this is a dummy volume it is based on the position of the base plate coordinate system - // width - u - // length - v - // thickness - w - Hep3Vector ball_pos_beamplane = ball_pos_base_plate; - Hep3Vector vee_pos_beamplane = vee_pos_base_plate; - Hep3Vector flat_pos_beamplane = flat_pos_base_plate; - SurveyCoordinateSystem beamplane_coord = new SurveyCoordinateSystem(ball_pos_beamplane, vee_pos_beamplane, flat_pos_beamplane); - Transform3D trans_beamplane_to_tracking = beamplane_coord.getTransformation(); - - final double beamPlaneThickness = 0.00000001; - String volName = "beamPlaneVol"; - Box box = new Box(volName + "Box", HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_width, HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_length*2, beamPlaneThickness); - lcdd.add(box); - Volume volume = new Volume(volName + "_volume", box, lcdd.getMaterial("Vacuum")); - - - if(_debug) { - print(String.format("ball_pos_beamplane %s", ball_pos_beamplane.toString())); - print(String.format("vee_pos_beamplane %s", vee_pos_beamplane.toString())); - print(String.format("flat_pos_beamplane %s", flat_pos_beamplane.toString())); - print(String.format("beamplane_coord:\n%s", beamplane_coord.toString())); - } - - - // Find distance to center in the local coordinate system - Hep3Vector box_center_base_local = new BasicHep3Vector(HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_width/2.0, HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_length/2.0, beamPlaneThickness/2.0); - - //translate to the mother coordinate system - Hep3Vector box_center_base = trans_beamplane_to_tracking.transformed(box_center_base_local); - - if(_debug) { - print(String.format("box_center_base_local %s", box_center_base_local.toString())); - print(String.format("box_center_base %s", box_center_base.toString())); - } - - // Create the LCDD position - Position pos = new Position(volName + "_position",box_center_base.x(), box_center_base.y(), box_center_base.z()); - - //Find LCDD Euler rotation angles from coordinate system unit vectors - Hep3Vector lcdd_rot_angles = TransformationUtils.getCardanAngles(beamplane_coord.v(), beamplane_coord.w(), new BasicHep3Vector(0,1,0),new BasicHep3Vector(0,0,1)); - Rotation rot = new Rotation(volName + "_rotation",lcdd_rot_angles.x(), lcdd_rot_angles.y(), lcdd_rot_angles.z()); - lcdd.add(pos); - lcdd.add(rot); - - // Create the physical volume - PhysVol basePV = new PhysVol(volume, motherVolume, pos, rot); - if(_debug) { - print("Created physical vomume " + basePV.getName()); - } - - - - volume.setVisAttributes(lcdd.getVisAttributes("BeamPlaneVis")); - - - - lcdd.add(volume); - - - - - } - - - - - - - - private void makeExample(LCDD lcdd, SensitiveDetector sens) throws JDOMException { - - - if(_debug) { - print("--- makeExample ----"); + System.out.println("--- makeExample ----"); } @@ -448,7 +128,7 @@ PhysVol basePV = new PhysVol(volume, lcdd.pickMotherVolume(this), pos, rot); if(_debug) { - print("Created physical vomume " + basePV.getName()); + System.out.println("Created physical vomume " + basePV.getName()); } @@ -464,7 +144,7 @@ lcdd.add(subRot); PhysVol subBasePV = new PhysVol(volumeSub, volume, subPos, subRot); if(_debug) { - print("Created physical vomume " + subBasePV.getName()); + System.out.println("Created physical vomume " + subBasePV.getName()); } lcdd.add(volumeSub); @@ -483,7 +163,7 @@ if(_debug) { - print("--- makeExample2 ----"); + System.out.println("--- makeExample2 ----"); } @@ -531,7 +211,7 @@ PhysVol basePV = new PhysVol(volume, lcdd.pickMotherVolume(this), pos, rot); if(_debug) { - print("Created physical vomume " + basePV.getName()); + System.out.println("Created physical vomume " + basePV.getName()); } @@ -546,7 +226,7 @@ lcdd.add(subRot); PhysVol subBasePV = new PhysVol(volumeSub, volume, subPos, subRot); if(_debug) { - print("Created physical vomume " + subBasePV.getName()); + System.out.println("Created physical vomume " + subBasePV.getName()); } lcdd.add(volumeSub); @@ -565,7 +245,7 @@ if(_debug) { - print("--- makeExample3 ----"); + System.out.println("--- makeExample3 ----"); } @@ -677,7 +357,7 @@ PhysVol basePV = new PhysVol(volume, lcdd.pickMotherVolume(this), pos, rot); if(_debug) { - print("Created physical vomume " + basePV.getName()); + System.out.println("Created physical vomume " + basePV.getName()); } @@ -692,7 +372,7 @@ lcdd.add(subRot); PhysVol subBasePV = new PhysVol(volumeSub, volume, subPos, subRot); if(_debug) { - print("Created physical vomume " + subBasePV.getName()); + System.out.println("Created physical vomume " + subBasePV.getName()); } lcdd.add(volumeSub); @@ -710,7 +390,7 @@ if(_debug) { - print("--- makeExample4 ----"); + System.out.println("--- makeExample4 ----"); } @@ -768,7 +448,7 @@ PhysVol basePV = new PhysVol(volume, lcdd.pickMotherVolume(this), pos, rot); if(_debug) { - print("Created physical vomume " + basePV.getName()); + System.out.println("Created physical vomume " + basePV.getName()); } @@ -784,7 +464,7 @@ lcdd.add(subRot); PhysVol subBasePV = new PhysVol(volumeSub, volume, subPos, subRot); if(_debug) { - print("Created physical vomume " + subBasePV.getName()); + System.out.println("Created physical vomume " + subBasePV.getName()); } lcdd.add(volumeSub); @@ -802,7 +482,7 @@ if(_debug) { - print("--- makeExample5 ----"); + System.out.println("--- makeExample5 ----"); } @@ -875,7 +555,7 @@ PhysVol basePV = new PhysVol(volume, lcdd.pickMotherVolume(this), pos, rot); if(_debug) { - print("Created physical vomume " + basePV.getName()); + System.out.println("Created physical vomume " + basePV.getName()); } @@ -889,7 +569,7 @@ lcdd.add(subRot); PhysVol subBasePV = new PhysVol(volumeSub, volume, subPos, subRot); if(_debug) { - print("Created physical vomume " + subBasePV.getName()); + System.out.println("Created physical vomume " + subBasePV.getName()); } lcdd.add(volumeSub); @@ -909,7 +589,7 @@ if(_debug) { - print("--- makeExample5b ----"); + System.out.println("--- makeExample5b ----"); } @@ -966,7 +646,7 @@ PhysVol basePV = new PhysVol(volume, lcdd.pickMotherVolume(this), pos, rot); if(_debug) { - print("Created physical vomume " + basePV.getName()); + System.out.println("Created physical vomume " + basePV.getName()); } @@ -980,7 +660,7 @@ lcdd.add(subRot); PhysVol subBasePV = new PhysVol(volumeSub, volume, subPos, subRot); if(_debug) { - print("Created physical vomume " + subBasePV.getName()); + System.out.println("Created physical vomume " + subBasePV.getName()); } lcdd.add(volumeSub); @@ -997,7 +677,7 @@ if(_debug) { - print("--- makeExample3b ----"); + System.out.println("--- makeExample3b ----"); } @@ -1117,7 +797,7 @@ PhysVol basePV = new PhysVol(volume, lcdd.pickMotherVolume(this), pos, rot); if(_debug) { - print("Created physical vomume " + basePV.getName()); + System.out.println("Created physical vomume " + basePV.getName()); } @@ -1132,7 +812,7 @@ lcdd.add(subRot); PhysVol subBasePV = new PhysVol(volumeSub, volume, subPos, subRot); if(_debug) { - print("Created physical vomume " + subBasePV.getName()); + System.out.println("Created physical vomume " + subBasePV.getName()); } lcdd.add(volumeSub); @@ -1150,7 +830,7 @@ if(_debug) { - print("--- makeExample6 ----"); + System.out.println("--- makeExample6 ----"); } @@ -1181,7 +861,7 @@ PhysVol basePV = new PhysVol(volume, lcdd.pickMotherVolume(this), pos, rot); if(_debug) { - print("Created physical vomume " + basePV.getName()); + System.out.println("Created physical vomume " + basePV.getName()); } @@ -1197,7 +877,7 @@ lcdd.add(subRot); PhysVol subBasePV = new PhysVol(volumeSub, volume, subPos, subRot); if(_debug) { - print("Created physical vomume " + subBasePV.getName()); + System.out.println("Created physical vomume " + subBasePV.getName()); } lcdd.add(volumeSub); @@ -1216,7 +896,7 @@ if(_debug) { - print("--- makeExample66 ----"); + System.out.println("--- makeExample66 ----"); } @@ -1274,7 +954,7 @@ PhysVol basePV = new PhysVol(volume, lcdd.pickMotherVolume(this), pos, rot); if(_debug) { - print("Created physical vomume " + basePV.getName()); + System.out.println("Created physical vomume " + basePV.getName()); } @@ -1290,7 +970,7 @@ lcdd.add(subRot); PhysVol subBasePV = new PhysVol(volumeSub, volume, subPos, subRot); if(_debug) { - print("Created physical vomume " + subBasePV.getName()); + System.out.println("Created physical vomume " + subBasePV.getName()); } lcdd.add(volumeSub); @@ -1312,7 +992,7 @@ if(_debug) { - print("--- makeExample7 ----"); + System.out.println("--- makeExample7 ----"); } @@ -1343,7 +1023,7 @@ PhysVol basePV = new PhysVol(volume, lcdd.pickMotherVolume(this), pos, rot); if(_debug) { - print("Created physical vomume " + basePV.getName()); + System.out.println("Created physical vomume " + basePV.getName()); } @@ -1359,7 +1039,7 @@ lcdd.add(subRot); PhysVol subBasePV = new PhysVol(volumeSub, volume, subPos, subRot); if(_debug) { - print("Created physical vomume " + subBasePV.getName()); + System.out.println("Created physical vomume " + subBasePV.getName()); } lcdd.add(volumeSub); @@ -1378,7 +1058,7 @@ if(_debug) { - print("--- makeExample77 ----"); + System.out.println("--- makeExample77 ----"); } @@ -1459,7 +1139,7 @@ PhysVol basePV = new PhysVol(volume, lcdd.pickMotherVolume(this), pos, rot); if(_debug) { - print("Created physical vomume " + basePV.getName()); + System.out.println("Created physical vomume " + basePV.getName()); } @@ -1475,7 +1155,7 @@ lcdd.add(subRot); PhysVol subBasePV = new PhysVol(volumeSub, volume, subPos, subRot); if(_debug) { - print("Created physical vomume " + subBasePV.getName()); + System.out.println("Created physical vomume " + subBasePV.getName()); } lcdd.add(volumeSub); @@ -1495,7 +1175,7 @@ if(_debug) { - print("--- makeExample8 ----"); + System.out.println("--- makeExample8 ----"); } @@ -1541,7 +1221,7 @@ PhysVol basePV = new PhysVol(volume, lcdd.pickMotherVolume(this), pos, rot); if(_debug) { - print("Created physical vomume " + basePV.getName()); + System.out.println("Created physical vomume " + basePV.getName()); } @@ -1557,7 +1237,7 @@ lcdd.add(subRot); PhysVol subBasePV = new PhysVol(volumeSub, volume, subPos, subRot); if(_debug) { - print("Created physical vomume " + subBasePV.getName()); + System.out.println("Created physical vomume " + subBasePV.getName()); } lcdd.add(volumeSub); @@ -1576,7 +1256,7 @@ if(_debug) { - print("--- makeExample9 ----"); + System.out.println("--- makeExample9 ----"); } @@ -1622,7 +1302,7 @@ PhysVol basePV = new PhysVol(volume, lcdd.pickMotherVolume(this), pos, rot); if(_debug) { - print("Created physical vomume " + basePV.getName()); + System.out.println("Created physical vomume " + basePV.getName()); } @@ -1638,7 +1318,7 @@ lcdd.add(subRot); PhysVol subBasePV = new PhysVol(volumeSub, volume, subPos, subRot); if(_debug) { - print("Created physical vomume " + subBasePV.getName()); + System.out.println("Created physical vomume " + subBasePV.getName()); } lcdd.add(volumeSub); @@ -1659,7 +1339,7 @@ if(_debug) { - print("--- makeExample10 ----"); + System.out.println("--- makeExample10 ----"); } @@ -1705,7 +1385,7 @@ PhysVol basePV = new PhysVol(volume, lcdd.pickMotherVolume(this), pos, rot); if(_debug) { - print("Created physical vomume " + basePV.getName()); + System.out.println("Created physical vomume " + basePV.getName()); } @@ -1721,7 +1401,7 @@ lcdd.add(subRot); PhysVol subBasePV = new PhysVol(volumeSub, volume, subPos, subRot); if(_debug) { - print("Created physical vomume " + subBasePV.getName()); + System.out.println("Created physical vomume " + subBasePV.getName()); } lcdd.add(volumeSub); @@ -1733,7 +1413,8 @@ } - + + Added: 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 (added) +++ projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/lcdd/HPSTracker2014Base.java Fri Oct 31 16:08:02 2014 @@ -0,0 +1,366 @@ +package org.lcsim.geometry.compact.converter.lcdd; + +import hep.physics.vec.BasicHep3Vector; +import hep.physics.vec.Hep3Vector; + +import java.util.Iterator; + +import org.jdom.DataConversionException; +import org.jdom.Element; +import org.jdom.JDOMException; +import org.lcsim.detector.Transform3D; +import org.lcsim.geometry.compact.converter.HPSTrackerBuilder; +import org.lcsim.geometry.compact.converter.HPSTrackerLCDDBuilder; +import org.lcsim.geometry.compact.converter.LCDDGhostSurveyVolume; +import org.lcsim.geometry.compact.converter.LCDDSurveyVolume; +import org.lcsim.geometry.compact.converter.SurveyCoordinateSystem; +import org.lcsim.geometry.compact.converter.lcdd.util.Box; +import org.lcsim.geometry.compact.converter.lcdd.util.LCDD; +import org.lcsim.geometry.compact.converter.lcdd.util.PhysVol; +import org.lcsim.geometry.compact.converter.lcdd.util.Position; +import org.lcsim.geometry.compact.converter.lcdd.util.Rotation; +import org.lcsim.geometry.compact.converter.lcdd.util.SensitiveDetector; +import org.lcsim.geometry.compact.converter.lcdd.util.Volume; +import org.lcsim.geometry.util.TransformationUtils; + +/** + * + * Convert an HPS tracker "2014" to the LCDD format. + * + * @author Per Hansson <[log in to unmask]> + * + */ +public abstract class HPSTracker2014Base extends LCDDSubdetector { + + protected boolean _debug = true; + protected static HPSTrackerLCDDBuilder builder; + private final boolean buildBeamPlane = false; + private final double beamPlaneWidth = 385.00; + private final double beamPlaneLength = 1216.00; + private final double beamPlaneThickness = 0.00000001; + + public HPSTracker2014Base(Element c) throws JDOMException { + super(c); + } + + + /** + * Set the @HPSTrackerLCDDBuilder for this converter. + * @param lcdd + * @param sens + * @return the builder. + */ + abstract protected HPSTrackerLCDDBuilder initializeBuilder(LCDD lcdd, SensitiveDetector sens); + + + public boolean isTracker() { + return true; + } + + /** + * Build the LCDD for the subdetector. + * @param lcdd - the LCDD file being created. + * @param sens - the SD for this subdetector. + */ + + public void addToLCDD(LCDD lcdd, SensitiveDetector sens) throws JDOMException + { + + + + /// General comments + // Roll: rotation around x + // pitch: rotation around y + // yaw: rotation around z + + // kinematic mounts: + // ball (constraints x,y,z) + // vee (constraints pitch & yaw) + // flat (constraints roll) + /// + + + + // ID of the detector. + int id = node.getAttribute("id").getIntValue(); + + // Name of the detector. + String detector_name = node.getAttributeValue("name"); + + if(_debug) System.out.printf("%s: detector id %d name %s",getClass().getSimpleName(), id,detector_name); + + + // Pick the mother volume (tracking volume). + Volume trackingVolume = lcdd.pickMotherVolume(this); + + + if(_debug) System.out.printf("%s: setup and build the LCDD geometry\n", getClass().getSimpleName()); + + // setup and build the LCDD geometry + builder = initializeBuilder(lcdd, sens); + //builder = new HPSTestRunTracker2014LCDDBuilder(_debug,node,lcdd,sens); + + //builder.setLCDD(lcdd); + //builder.setSensitiveDetector(sens); + builder.build(trackingVolume); + + if(_debug) System.out.printf("%s: DONE setup and build the LCDD geometry\n", getClass().getSimpleName()); + + +// makeExample(lcdd,sens); +// //makeExample2(lcdd,sens); +// makeExample3(lcdd,sens); +// makeExample4(lcdd,sens); +// makeExample5(lcdd,sens); +// makeExample3b(lcdd,sens); +// makeExample5b(lcdd,sens); +// makeExample6(lcdd,sens); +// makeExample66(lcdd,sens); +// makeExample7(lcdd,sens); +// makeExample77(lcdd,sens); +// makeExample8(lcdd, sens); +// makeExample9(lcdd, sens); +// makeExample10(lcdd, sens); +// + + if(buildBeamPlane ) { + makeBeamPlane(trackingVolume, lcdd, sens); + } + + + // Actually build the LCDD + buildLCDD(); + + + } + + + + + /** + * Top function to add objects to the LCDD file using the geometry builder class. + */ + protected void buildLCDD() { + + if(_debug) System.out.printf("%s: buildLCDD\n", getClass().getSimpleName()); + + // Get a reference to the LCDD + LCDD lcdd = builder.getLCDD(); + SensitiveDetector sd = builder.getSensitiveDetector(); + + // Reference to the top level object in the builder class + // In this case it is the base volume holding the entire tracker + LCDDSurveyVolume lcddObj = (LCDDSurveyVolume) builder.getBaseLCDD(); + + // Add the base volume and all its daughters to the LCDD + addToLCDD(lcddObj,lcdd,sd); + + if(_debug) System.out.printf("%s: buildLCDD DONE\n", getClass().getSimpleName()); + + } + + + + /** + * Add a @LCDDBaseGeom geometry object to the LCDD file. + * @param lcddObj to add + * @param lcdd file + */ + private void addToLCDD(LCDDSurveyVolume lcddObj, LCDD lcdd, SensitiveDetector sd) { + + if(_debug) System.out.printf("%s: adding %s to LCDD\n", getClass().getSimpleName(),lcddObj.getName()); + + boolean doAdd = true; + if(lcddObj.getName().contains("tracking")) doAdd=false; + + if(doAdd) { + + // only world/tracking volume can be ghost here?! + if(lcddObj instanceof LCDDGhostSurveyVolume ) { + System.out.printf("%s: trying to add a ghost volume: %s ??\n", getClass().getSimpleName(),lcddObj.getName()); + throw new RuntimeException("adding a ghost volume (" + lcddObj.getName() + ") to LCDD is not allowed."); + } + // add box, pos, rotation and create phys volume + lcdd.add(lcddObj.getBox()); + lcdd.add(lcddObj.getPos()); + lcdd.add(lcddObj.getRot()); + lcddObj.buildPhysVolume(); + // Set the phys volume Id's + // Since the builder don't have access to the system ID + // I keep the phys volume ID's outside. I think these + // should belong to the builder to avoid repeating it in + // the java converter + // TODO move this to the builder for each volume + try { + setPhysicalVolumeProperties(lcddObj, sd); + } catch (DataConversionException e) { + e.printStackTrace(); + } + } else { + if(_debug) System.out.printf("%s: skip building anything (name=%s)\n", getClass().getSimpleName(),lcddObj.getName()); + } + + // add daughters + if(_debug) System.out.printf("%s: add %d daughters to %s\n", getClass().getSimpleName(),lcddObj.getDaughters().size(),lcddObj.getName()); + for(LCDDSurveyVolume daughter : lcddObj.getDaughters()) { + addToLCDD(daughter,lcdd, sd); + } + + // finally add volume + if(doAdd) { + if(_debug) System.out.printf("%s: adding volume %s\n", getClass().getSimpleName(),lcddObj.getName()); + if(!lcddObj.getVisName().isEmpty()) lcddObj.getVolume().setVisAttributes(lcdd.getVisAttributes(lcddObj.getVisName())); + lcdd.add(lcddObj.getVolume()); + } else { + if(_debug) System.out.printf("%s: skip adding volume %s\n", getClass().getSimpleName(),lcddObj.getName()); + } + if(_debug) System.out.printf("%s: DONE adding %s\n", getClass().getSimpleName(),lcddObj.getName()); + } + + + /** + * Set properties of the physical volume. + * @param geometryObject + */ + private void setPhysicalVolumeProperties(LCDDSurveyVolume geometryObject, SensitiveDetector sd) throws DataConversionException { + + if(_debug) System.out.printf("%s: setPhysVolumeProperties for name %s\n", getClass().getSimpleName(),geometryObject.getName()); + + // the physical vol ID's here are for the <module_placement> TestRunModules + // which is essentially the sensor objects + String name = geometryObject.getName(); + if(name.endsWith("halfmodule_axial") || name.endsWith("halfmodule_stereo") ) { + PhysVol physVol = geometryObject.getPhysVolume(); + int sysId = node.getAttribute("id").getIntValue(); + physVol.addPhysVolID("system", sysId); + physVol.addPhysVolID("barrel", 0); + + //use the old definition of layer number to be consistent + //int layer = HPSTestRunTracker2014Builder.getLayerFromVolumeName(geometryObject.getName()); + int layer = HPSTrackerBuilder.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())); + + + geometryObject.getPhysVolume().addPhysVolID("layer", layer); + String half = HPSTrackerBuilder.getHalfFromName(geometryObject.getName()); + if(half.equals("")) throw new RuntimeException("no half was found for name " + geometryObject.getName()); + int moduleId = half.equals("top") ? 0 : 1; + geometryObject.getPhysVolume().addPhysVolID("module", moduleId); + } + + //TODO this is always 0 in old geometry? Is the id0 really needed? + else if(name.endsWith("sensor_active")) { + geometryObject.getPhysVolume().addPhysVolID("sensor", 0); + geometryObject.getVolume().setSensitiveDetector(sd); + } + //TODO are the component id's really needed? + else if(name.endsWith("sensor")) { + geometryObject.getPhysVolume().addPhysVolID("component", 0); + } + else if(name.endsWith("lamination")) { + geometryObject.getPhysVolume().addPhysVolID("component", 2); + } + else if(name.endsWith("cf")) { + geometryObject.getPhysVolume().addPhysVolID("component", 1); + } + else if(name.endsWith("hybrid")) { + geometryObject.getPhysVolume().addPhysVolID("component", 3); + } + + if(_debug) { + System.out.printf("%s: %d physvolid's\n", getClass().getSimpleName(),geometryObject.getPhysVolume().getChildren("physvolid").size()); + //geomObj.getPhysVolume().getChildren("physvolid field_name="sensor" value="0"") + for (Iterator i = geometryObject.getPhysVolume().getChildren("physvolid").iterator(); i.hasNext();) { + Element e = (Element)i.next(); + System.out.printf("%s: %s %d\n", getClass().getSimpleName(),e.getAttributeValue("field_name"),e.getAttribute("value").getIntValue()); + } + + if(_debug) System.out.printf("%s: DONE setPhysVolumeProperties for name %s\n", getClass().getSimpleName(),geometryObject.getName()); + + } + + + } + + + protected void makeBeamPlane(Volume motherVolume, LCDD lcdd, SensitiveDetector sens) throws JDOMException { + Hep3Vector ball_pos_beamplane = new BasicHep3Vector(-1.0*beamPlaneWidth/2.0,0.0,beamPlaneLength/2.0); + Hep3Vector vee_pos_beamplane = new BasicHep3Vector(ball_pos_beamplane.x()+beamPlaneWidth,ball_pos_beamplane.y(),ball_pos_beamplane.z()); + Hep3Vector flat_pos_beamplane = new BasicHep3Vector(ball_pos_beamplane.x(), ball_pos_beamplane.y(), ball_pos_beamplane.z()-beamPlaneLength/2.0); + makeBeamPlane(motherVolume, ball_pos_beamplane, vee_pos_beamplane, flat_pos_beamplane, lcdd, sens); + } + + + + protected void makeBeamPlane(Volume motherVolume, Hep3Vector ball_pos_base_plate, Hep3Vector vee_pos_base_plate,Hep3Vector flat_pos_base_plate, LCDD lcdd, SensitiveDetector sens) throws JDOMException { + + + if(_debug) { + System.out.println("--- makeBeamPlane ----"); + + } + + // create the coordinate system of the beam plane in the tracking volume + // since this is a dummy volume it is based on the position of the base plate coordinate system + // width - u + // length - v + // thickness - w + Hep3Vector ball_pos_beamplane = ball_pos_base_plate; + Hep3Vector vee_pos_beamplane = vee_pos_base_plate; + Hep3Vector flat_pos_beamplane = flat_pos_base_plate; + SurveyCoordinateSystem beamplane_coord = new SurveyCoordinateSystem(ball_pos_beamplane, vee_pos_beamplane, flat_pos_beamplane); + Transform3D trans_beamplane_to_tracking = beamplane_coord.getTransformation(); + + String volName = "beamPlaneVol"; + //Box box = new Box(volName + "Box", HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_width, HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_length*2, beamPlaneThickness); + Box box = new Box(volName + "Box", beamPlaneWidth, beamPlaneLength*2, beamPlaneThickness); + lcdd.add(box); + Volume volume = new Volume(volName + "_volume", box, lcdd.getMaterial("Vacuum")); + + + if(_debug) { + System.out.println(String.format("ball_pos_beamplane %s", ball_pos_beamplane.toString())); + System.out.println(String.format("vee_pos_beamplane %s", vee_pos_beamplane.toString())); + System.out.println(String.format("flat_pos_beamplane %s", flat_pos_beamplane.toString())); + System.out.println(String.format("beamplane_coord:\n%s", beamplane_coord.toString())); + } + + + // Find distance to center in the local coordinate system + Hep3Vector box_center_base_local = new BasicHep3Vector(beamPlaneWidth/2.0, beamPlaneLength/2.0, beamPlaneThickness/2.0); + + //translate to the mother coordinate system + Hep3Vector box_center_base = trans_beamplane_to_tracking.transformed(box_center_base_local); + + if(_debug) { + System.out.println(String.format("box_center_base_local %s", box_center_base_local.toString())); + System.out.println(String.format("box_center_base %s", box_center_base.toString())); + } + + // Create the LCDD position + Position pos = new Position(volName + "_position",box_center_base.x(), box_center_base.y(), box_center_base.z()); + + //Find LCDD Euler rotation angles from coordinate system unit vectors + Hep3Vector lcdd_rot_angles = TransformationUtils.getCardanAngles(beamplane_coord.v(), beamplane_coord.w(), new BasicHep3Vector(0,1,0),new BasicHep3Vector(0,0,1)); + Rotation rot = new Rotation(volName + "_rotation",lcdd_rot_angles.x(), lcdd_rot_angles.y(), lcdd_rot_angles.z()); + lcdd.add(pos); + lcdd.add(rot); + + // Create the physical volume + PhysVol basePV = new PhysVol(volume, motherVolume, pos, rot); + if(_debug) { + System.out.println("Created physical vomume " + basePV.getName()); + } + + volume.setVisAttributes(lcdd.getVisAttributes("BeamPlaneVis")); + + lcdd.add(volume); + + } + + + + + + +} ######################################################################## 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