projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/detector/converter/compact
--- projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/detector/converter/compact/HPSTestRunTracker2014JavaBuilder.java 2014-09-04 05:41:48 UTC (rev 3305)
+++ projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/detector/converter/compact/HPSTestRunTracker2014JavaBuilder.java 2014-09-04 05:44:17 UTC (rev 3306)
@@ -60,8 +60,8 @@
*/
public class HPSTestRunTracker2014JavaBuilder extends HPSTestRunTracker2014Builder {
- protected JavaBaseGeom baseTrackerGeometry;
- protected List<JavaBaseGeom> java_objects;
+ protected JavaBaseGeometry baseTrackerGeometry;
+ protected List<JavaBaseGeometry> java_objects;
protected DetectorIdentifierHelper detectorIdentifierHelper;
protected IIdentifierDictionary identifierDictionary;
protected Subdetector subdet;
@@ -81,7 +81,7 @@
* Add to list of objects.
* @param geom - object to add.
*/
- private void add(JavaBaseGeom geom) {
+ private void add(JavaBaseGeometry geom) {
java_objects.add(geom);
}
@@ -95,24 +95,25 @@
if(isDebug()) System.out.printf("%s: build the JAVA geometry objects\n", getClass().getSimpleName());
// initialize the list to store a reference to each object
- java_objects = new ArrayList<JavaBaseGeom>();
+ java_objects = new ArrayList<JavaBaseGeometry>();
// Go through the list of volumes to build that is created in the generic builder class
- JavaBaseGeom trackingGeometry = new JavaBaseGeom(getItem(TrackingBase.class), trackingVolume);
+ JavaBaseGeometry trackingGeometry = new JavaBaseGeometry(getBaseGeometry(TrackingBase.class), trackingVolume);
add(trackingGeometry);
- baseTrackerGeometry = new GhostJavaBaseGeom(getItem(Base.class), trackingGeometry);
+ baseTrackerGeometry = new GhostJavaBaseGeom(getBaseGeometry(Base.class), trackingGeometry);
add(baseTrackerGeometry);
- JavaBaseGeom basePlateGeometry = new GhostJavaBaseGeom(getItem(BasePlate.class), baseTrackerGeometry);
+ JavaBaseGeometry basePlateGeometry = new GhostJavaBaseGeom(getBaseGeometry(BasePlate.class), baseTrackerGeometry);
add(basePlateGeometry);
- JavaBaseGeom cSupportGeometry = new GhostJavaBaseGeom(getItem(CSupport.class), baseTrackerGeometry);
- add(cSupportGeometry);
- JavaBaseGeom supportBottomGeometry = new GhostJavaBaseGeom(getItem(SupportBottom.class), baseTrackerGeometry);
+ // skip the c-support, this is purely a reference volume in the builder so should have no use here!?
+ //JavaBaseGeometry cSupportGeometry = new GhostJavaBaseGeom(getBaseGeometry(CSupport.class), baseTrackerGeometry);
+ //add(cSupportGeometry);
+ JavaBaseGeometry supportBottomGeometry = new GhostJavaBaseGeom(getBaseGeometry(SupportBottom.class), baseTrackerGeometry);
add(supportBottomGeometry);
- JavaBaseGeom supportPlateBottomGeometry = new GhostJavaBaseGeom(getItem(SupportPlateBottom.class), baseTrackerGeometry);
+ JavaBaseGeometry supportPlateBottomGeometry = new GhostJavaBaseGeom(getBaseGeometry(SupportPlateBottom.class), baseTrackerGeometry);
add(supportPlateBottomGeometry);
- JavaBaseGeom supportTopGeometry = new GhostJavaBaseGeom(getItem(SupportTop.class), baseTrackerGeometry);
+ JavaBaseGeometry supportTopGeometry = new GhostJavaBaseGeom(getBaseGeometry(SupportTop.class), baseTrackerGeometry);
add(supportTopGeometry);
- JavaBaseGeom supportPlateTopGeometry = new GhostJavaBaseGeom(getItem(SupportPlateTop.class), baseTrackerGeometry);
+ JavaBaseGeometry supportPlateTopGeometry = new GhostJavaBaseGeom(getBaseGeometry(SupportPlateTop.class), baseTrackerGeometry);
add(supportPlateTopGeometry);
// build modules
@@ -123,7 +124,7 @@
for(ModuleBundle m : modules) {
// Do only L1?
- if(m.getLayer()!=1) continue;
+ //if(m.getLayer()!=1) continue;
if(isDebug()) {
System.out.printf("%s: module layer %d half %s\n", getClass().getSimpleName(),m.getLayer(),m.getHalf());
@@ -132,8 +133,8 @@
// Find the mother among the objects using its name, should probably have a better way...
String name_mother = m.getMother().getName();
- JavaBaseGeom mother = null;
- for(JavaBaseGeom g : java_objects) {
+ JavaBaseGeometry mother = null;
+ for(JavaBaseGeometry g : java_objects) {
if(g.getName().equals(name_mother)) {
mother = g;
break;
@@ -164,7 +165,7 @@
* @param bundle - module to be added
* @param mother - mother JAVA geometry object
*/
- private void addModule(ModuleBundle bundle, JavaBaseGeom mother) {
+ private void addModule(ModuleBundle bundle, JavaBaseGeometry mother) {
if(isDebug()) {
System.out.printf("%s: addModule %s containing:\n",this.getClass().getSimpleName(), bundle.module.getName());
@@ -172,7 +173,7 @@
}
// Create the module
- JavaBaseGeom lcddM = new GhostJavaBaseGeom(bundle.module, mother);
+ JavaBaseGeometry lcddM = new GhostJavaBaseGeom(bundle.module, mother);
add(lcddM);
// add half modules
@@ -192,13 +193,13 @@
* @param bundle - module to be added
* @param mother - mother JAVA geometry object
*/
- private void addHalfModule(HalfModuleBundle bundle, JavaBaseGeom mother) {
+ private void addHalfModule(HalfModuleBundle bundle, JavaBaseGeometry mother) {
// Create the half-module
// This is not a ghost element but reflects the module
// concept in the old compact description
// TODO fix the layer IDs
int oldCompactModuleId = 0;
- JavaBaseGeom lcddHM = new JavaBaseGeom(bundle.halfModule, mother,oldCompactModuleId);
+ JavaBaseGeometry lcddHM = new JavaBaseGeometry(bundle.halfModule, mother,oldCompactModuleId);
add(lcddHM);
// ComponentNumber is taken from old geometry where it is simply a counter when adding the xml daughters to the TestRunModule.
@@ -206,11 +207,11 @@
int componentNumber = bundle.sensor.getId();
// create the sensor
- JavaBaseGeom lcddS = new JavaBaseGeom(bundle.sensor, lcddHM, componentNumber);
+ JavaBaseGeometry lcddS = new JavaBaseGeometry(bundle.sensor, lcddHM, componentNumber);
add(lcddS);
// create the active sensor
- JavaBaseGeom lcddAS = new JavaBaseGeom(bundle.activeSensor, lcddS, componentNumber);
+ JavaBaseGeometry lcddAS = new JavaBaseGeometry(bundle.activeSensor, lcddS, componentNumber);
add(lcddAS);
}
@@ -250,20 +251,7 @@
* @author Per Hansson Adrian <[log in to unmask]>
*
*/
- protected static class GhostJavaBaseGeom extends JavaBaseGeom {
-
- /**
- * Initialize this object with a known volume and no mother. Typically the tracking volume would use this.
- * @param base - object used to get geometry definitions
- * @param vol - given volume
- */
- public GhostJavaBaseGeom(BaseGeometry base, ILogicalVolume volume) {
- super();
- if(isDebug()) System.out.printf("%s: constructing JAVA ghost object %s\n", this.getClass().getSimpleName(),base.getName());
- setName(base.getName());
- setVolume(volume);
- if(isDebug()) System.out.printf("%s: DONE constructing JAVA object %s\n", this.getClass().getSimpleName(),base.getName());
- }
+ protected static class GhostJavaBaseGeom extends JavaBaseGeometry {
/**
* Initialize with base and mother. This is typically for a reference geometry object
@@ -271,12 +259,13 @@
* @param base - object used to get geometry definitions
* @param mother - mother object
*/
- public GhostJavaBaseGeom(BaseGeometry base, JavaBaseGeom mother) {
+ public GhostJavaBaseGeom(BaseGeometry base, JavaBaseGeometry mother) {
super();
if(isDebug()) System.out.printf("%s: constructing JAVA ghost object %s with mother %s\n", this.getClass().getSimpleName(),base.getName(),mother==null?"null":mother.getName());
setName(base.getName());
setMother(mother);
mother.addDaughter(this);
+ setPosAndRot(base);
if(isDebug()) System.out.printf("%s: DONE constructing JAVA object %s\n", this.getClass().getSimpleName(),base.getName());
}
@@ -289,7 +278,7 @@
*
* @author Per Hansson Adrian <[log in to unmask]>
*/
- protected static class JavaBaseGeom {
+ protected static class JavaBaseGeometry {
private boolean debug = true;
private String name;
private Box box= null;
@@ -297,20 +286,29 @@
private ITranslation3D pos = null;
private IRotation3D rot = null;
private IPhysicalVolume physVolume = null;
- private JavaBaseGeom mother = null;
- public List<JavaBaseGeom> daughters = new ArrayList<JavaBaseGeom>();
+ private JavaBaseGeometry mother = null;
+ public List<JavaBaseGeometry> daughters = new ArrayList<JavaBaseGeometry>();
private int componentId = -1;
/**
* Default constructor
*/
- public JavaBaseGeom() {
+ public JavaBaseGeometry() {
}
- public JavaBaseGeom(BaseGeometry geomObject, ILogicalVolume vol) {
+ public JavaBaseGeometry(BaseGeometry geomObject, ILogicalVolume vol) {
if(isDebug()) System.out.printf("%s: constructing JAVA object %s with volume (name %s)\n", this.getClass().getSimpleName(),geomObject.getName(),vol.getName());
setName(geomObject.getName());
setVolume(vol);
+ // this must be tracking volume. May change in the future and is probably weird to make this requirement here.
+ if(!geomObject.getName().contains("tracking")) throw new RuntimeException("this constructor is only used with the tracking volume!?");
+ // since it's tracking volume, set the pos and rotation trivially
+ Hep3Vector box_center = new BasicHep3Vector(0,0,0);
+ Hep3Vector lcdd_rot_angles = HPSTestRunTracker2014.getEulerAngles(geomObject.getCoord().v(), geomObject.getCoord().w(), new BasicHep3Vector(0,1,0),new BasicHep3Vector(0,0,1));
+ // Create the LCDD position
+ setPos(new Translation3D(box_center.x(), box_center.y(), box_center.z()));
+ setRot(new RotationGeant(lcdd_rot_angles.x(), lcdd_rot_angles.y(), lcdd_rot_angles.z()));
+ //setPosAndRot(geomObject);
if(isDebug()) System.out.printf("%s: DONE constructing JAVA object %s with volume (name %s)\n", this.getClass().getSimpleName(),geomObject.getName(),vol.getName());
}
@@ -320,7 +318,7 @@
* @param mother - reference to mother JAVA definition
* @param volumeId - component id number
*/
- public JavaBaseGeom(BaseGeometry geomObject, JavaBaseGeom mother, int volumeId) {
+ public JavaBaseGeometry(BaseGeometry geomObject, JavaBaseGeometry mother, int volumeId) {
if(isDebug()) System.out.printf("%s: constructing JAVA object %s (volumeID %d) with mother %s\n", this.getClass().getSimpleName(),geomObject.getName(),volumeId,mother==null?"null":mother.getName());
setName(geomObject.getName());
setComponentId(volumeId);
@@ -333,25 +331,15 @@
if(isDebug()) System.out.printf("%s: DONE constructing JAVA object %s\n", this.getClass().getSimpleName(),geomObject.getName());
}
+ protected boolean hasCoordinateSystemInfo() {
+ return pos!=null && rot!=null;
+ }
+
protected void buildPhysVolume() {
- if(isDebug()) System.out.printf("%s: build phys volume for %s\n", this.getClass().getSimpleName(),getName());
- if(isDebug()) System.out.printf("%s: mother %s \n", this.getClass().getSimpleName(),getMother().getName());
- // The physical volume needs to be built with a physical mother i.e. anot a ghost volume
- // Find the closest physical mother
- JavaBaseGeom physMother = getPhysMother();
- if(isDebug()) System.out.printf("%s: physical mother %s \n", this.getClass().getSimpleName(),physMother.getName());
- // similarly, if the mother is not the physical mother the positions and rotations of the
- // mother needs to be updated
- Transform3D tOld = new Transform3D(getPos(), getRot());
- if(isDebug()) System.out.printf("%s: transform before update of transform to physical mother\n%s\n", this.getClass().getSimpleName(),tOld.toString());
- ITransform3D t = getParentTransform(tOld, getMother(), physMother.getName());
- setPos(t.getTranslation());
- setRot(t.getRotation());
- Transform3D tNew = new Transform3D(getPos(), getRot());
- if(isDebug()) System.out.printf("%s: transform after update of transform to physical mother\n%s\n", this.getClass().getSimpleName(),tNew.toString());
- // TODO this seems dangerous to change it here, should this be done in the generic builder somehow?
- setPhysVolume(new PhysicalVolume(tNew, name, volume, physMother.getVolume(),getComponentId()));
+ if(isDebug()) System.out.printf("%s: build phys volume for %s with mother %s and physical mother %s\n", this.getClass().getSimpleName(),getName(),getMother().getName(),getPhysMother().getName());
+ JavaBaseGeometry physMother = getPhysMother();
+ setPhysVolume(new PhysicalVolume(new Transform3D(getPos(), getRot()), name, volume, physMother.getVolume(),getComponentId()));
}
protected void buildBox(BaseGeometry base) {
if(isDebug()) System.out.printf("%s: build box for %s\n", this.getClass().getSimpleName(),getName());
@@ -365,42 +353,85 @@
}
protected void setPosAndRot(BaseGeometry base) {
if(isDebug()) System.out.printf("%s: set position and rotation for volume %s\n", this.getClass().getSimpleName(),getName());
+
+ // no mother, this must be the world/tracking volume!?
+ if(base.getMother()==null) throw new RuntimeException("trying to set coordinates w/o mother defined for "+base.getName());
+
// Vector from origin to center of box locally
Hep3Vector box_center_base_local = base.getCenter();
- //translate to the mother coordinate system
- Hep3Vector box_center_base = base.getCoord().getTransformation().transformed(box_center_base_local);
- // find the position of the center in the mother coord
- Hep3Vector box_center = VecOp.sub(box_center_base, base.getMother().getCenter());
+
+ // find the physical mother i.e. not a ghost volume and compound transformations to it
+ JavaBaseGeometry physMother = getPhysMother();
+ if(isDebug()) System.out.printf("%s: physical mother to transform to is %s; find the transform to it\n", this.getClass().getSimpleName(),physMother.getName());
+ Transform3D trf = getTransform(base.getCoord().getTransformation(),base.getMother(),physMother.getName());
+ if(isDebug()) System.out.printf("%s: found transform to physical mother \n%s\n\n", this.getClass().getSimpleName(),trf.toString());
+
+ // find the position of the center in the physical mother coord
+ Hep3Vector box_center_base = trf.transformed(box_center_base_local);
+
+ // find the position of the center of the box in the mother coordinate system, make sure to use the physical mother coordinates
+ if(isDebug()) System.out.printf("%s: find center of box in physical mother coord %s \n", this.getClass().getSimpleName(),physMother.getName());
+ // hack since my getTransform function needs a mother TODO Fix this!
+ BaseGeometry gm = base;
+ if(isDebug()) System.out.printf("%s: look for physical mother %s starting from mother \n", this.getClass().getSimpleName(),physMother.getName(),gm.getMother());
+ while((gm=gm.getMother()).getName()!=physMother.getName()) {
+ if(isDebug()) System.out.printf("%s: gm is %s \n", this.getClass().getSimpleName(),gm.getName());
+ //gm = gm.getMother();
+ }
+ if(isDebug()) System.out.printf("%s: found physical mother %s with center at %s \n", this.getClass().getSimpleName(),gm.getName(), gm.getCenter());
+
+ Hep3Vector mother_center = gm.getCenter();
+
+ // now calculate the position of this box center in the mother LCDD coordinates
+ Hep3Vector box_center = VecOp.sub(box_center_base, mother_center);
+
//Find LCDD Euler rotation angles from coordinate system unit vectors
Hep3Vector lcdd_rot_angles = HPSTestRunTracker2014.getEulerAngles(base.getCoord().v(), base.getCoord().w(), new BasicHep3Vector(0,1,0),new BasicHep3Vector(0,0,1));
+
// Check if there are explicit rotations built into the object itself which overrides
// TODO this should be included in the definition of the coordinate system. Fix this for the affected components.
if (base.explicit_rot_angles!=null) {
+ if(isDebug()) System.out.printf("%s: explicit angles to be applied %s\n", this.getClass().getSimpleName(),base.explicit_rot_angles.toString());
// there are explicit rotations I need to apply.
// Find the displacement of the box center due to rotation about different origin
- Hep3Vector box_center_base_rot = HPSTestRunTracker2014.getRotationDisplacement(base.getCoord().origin(), box_center_base, base.explicit_rot_angles);
+ // Find the origin in the physical mother coord
+ if(isDebug()) System.out.printf("%s: transform origin %s to physical mother %s\n", this.getClass().getSimpleName(),base.getCoord().origin(),physMother.getName());
+ Transform3D tpm = getTransform(base.getMother().getCoord().getTransformation(),base.getMother().getMother(),physMother.getName());
+ if(isDebug()) System.out.printf("%s: found transform to physical mother \n%s\n\n", this.getClass().getSimpleName(),tpm.toString());
+ Hep3Vector origin_mother = tpm.transformed(base.getCoord().origin());
+ if(isDebug()) System.out.printf("%s: origin in physical mother coord is %s\n", this.getClass().getSimpleName(),origin_mother.toString());
+ Hep3Vector box_center_base_rot = HPSTestRunTracker2014.getRotationDisplacement(origin_mother, box_center_base, base.explicit_rot_angles);
if(isDebug()) {
System.out.printf("%s: explicit_rot_angles %s\n", this.getClass().getSimpleName(),lcdd_rot_angles);
System.out.printf("%s: explicit_rot_angles_2 %s\n", this.getClass().getSimpleName(),base.explicit_rot_angles);
+ System.out.printf("%s: origin %s\n", this.getClass().getSimpleName(), base.getCoord().origin().toString());
+ System.out.printf("%s: origin_mother %s\n", this.getClass().getSimpleName(), origin_mother.toString());
System.out.printf("%s: box_center_base %s\n", this.getClass().getSimpleName(), box_center_base.toString());
System.out.printf("%s: box_center_base_rot %s\n", this.getClass().getSimpleName(), box_center_base_rot.toString());
}
// update the rotation angles
lcdd_rot_angles = base.explicit_rot_angles;
// update the position of the center in the mother coord
- box_center = VecOp.sub(box_center_base_rot, base.getMother().getCenter());
+ box_center = VecOp.sub(box_center_base_rot, mother_center);
}
+
// Create the LCDD position
setPos(new Translation3D(box_center.x(), box_center.y(), box_center.z()));
setRot(new RotationGeant(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: 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().getCenter().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());
- System.out.printf("%s: rot %s\n", this.getClass().getSimpleName(), getRot().toString());
+
+ 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());
+ 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 = transformToTracking(box_center_base_local, base);
+ System.out.printf("%s: box_center_tracking_xcheck %s\n", this.getClass().getSimpleName(), box_center_tracking_xcheck.toString());
}
}
@@ -409,7 +440,7 @@
* Find the first non-ghost volume among parents.
* @return mother object
*/
- public JavaBaseGeom getPhysMother() {
+ public JavaBaseGeometry getPhysMother() {
//if(isDebug()) System.out.printf("%s: finding physical mother to %s\n", this.getClass().getSimpleName(), getName());
if(mother==null) throw new RuntimeException("Trying to get phys mother but there is no mother!");
if(mother instanceof GhostJavaBaseGeom) {
@@ -451,10 +482,10 @@
protected void setRot(IRotation3D iRotation3D) {
this.rot = iRotation3D;
}
- protected JavaBaseGeom getMother() {
+ protected JavaBaseGeometry getMother() {
return mother;
}
- protected void setMother(JavaBaseGeom mother) {
+ protected void setMother(JavaBaseGeometry mother) {
this.mother = mother;
}
protected IPhysicalVolume getPhysVolume() {
@@ -467,11 +498,11 @@
return debug;
}
- protected List<JavaBaseGeom> getDaughters() {
+ protected List<JavaBaseGeometry> getDaughters() {
return daughters;
}
- protected void addDaughter(JavaBaseGeom o) {
+ protected void addDaughter(JavaBaseGeometry o) {
getDaughters().add(o);
}
@@ -487,58 +518,39 @@
- public Hep3Vector transformToMotherCoord(Hep3Vector vec, JavaBaseGeom mother, String targetMotherName) {
- if(isDebug()) System.out.printf("transformToMotherCoord vec %s mother %s target %s\n", vec.toString(), mother.name, targetMotherName);
- if(mother.name.equals(targetMotherName)) {
- if(isDebug()) System.out.printf(String.format("found the transformed vec %s\n", vec.toString()));
- return vec;
- } else {
- if(mother.name.equals("trackingVolume")) {
- if(isDebug()) System.out.print("reached tracking volume. return null?!\n");
- return null;
- }
- Transform3D trans = new Transform3D(mother.pos, mother.rot);
- Hep3Vector vec_t = trans.transformed(vec);
- if(isDebug()) System.out.print("continue searching\n");
- return transformToMotherCoord(vec_t, mother.mother, targetMotherName);
- }
-
- }
+// /**
+// * Find the transform to a given parent volume.
+// * @param t transformation of the object.
+// * @param mother of the object
+// * @param targetMotherName is the name of the parent volume to transform to.
+// * @return translation to the target mother volume.
+// */
+// public static ITransform3D getParentTransform(Transform3D t, JavaBaseGeometry mother, String targetMotherName) {
+// boolean debug = true;
+// if(mother==null) throw new RuntimeException("Trying to get mother transform but there is no mother?!");
+// if(debug) System.out.printf("getParentTransform for mother %s target mother %s with current transform\n%s\n",mother.getName(), targetMotherName, t.toString());
+// if(mother.getName().equals(targetMotherName)) {
+// if(debug) System.out.printf("found the target object\n");
+// return t;
+// } else {
+// // Compound the transforms
+// ITranslation3D p = mother.getPos();
+// IRotation3D r = mother.getRot();
+// if(p==null) throw new RuntimeException("cannot compound transform since the mother " + mother.getName() + " has no translation!?");
+// if(r==null) throw new RuntimeException("cannot compound transform since the mother " + mother.getName() + " has no rotation!?");
+// Transform3D tM = new Transform3D(p, r);
+// if(debug) System.out.printf("add transform\n%s\n",tM.toString());
+// t.multiplyBy(tM);
+// if(debug) System.out.printf("resulting transform\n%s\n",((Transform3D)t).toString());
+// if(debug) System.out.printf("continue searching\n");
+// return getParentTransform(t, mother.getMother(), targetMotherName);
+// }
+// }
+//
- /**
- * Find the transform to a given parent volume.
- * @param t transformation of the object.
- * @param mother of the object
- * @param targetMotherName is the name of the parent volume to transform to.
- * @return translation to the target mother volume.
- */
- public static ITransform3D getParentTransform(Transform3D t, JavaBaseGeom mother, String targetMotherName) {
- boolean debug = true;
- if(mother==null) throw new RuntimeException("Trying to get mother transform but there is no mother?!");
- if(debug) System.out.printf("getParentTransform for mother %s target mother %s with current transform\n%s\n",mother.getName(), targetMotherName, t.toString());
- if(mother.getName().equals(targetMotherName)) {
- if(debug) System.out.printf("found the target object\n");
- return t;
- } else {
- // Compound the transforms
- ITranslation3D p = mother.getPos();
- IRotation3D r = mother.getRot();
- if(p==null) throw new RuntimeException("cannot compound transform since the mother " + mother.getName() + " has no translation!?");
- if(r==null) throw new RuntimeException("cannot compound transform since the mother " + mother.getName() + " has no rotation!?");
- Transform3D tM = new Transform3D(p, r);
- if(debug) System.out.printf("add transform\n%s\n",tM.toString());
- t.multiplyBy(tM);
- if(debug) System.out.printf("resulting transform\n%s\n",((Transform3D)t).toString());
- if(debug) System.out.printf("continue searching\n");
- return getParentTransform(t, mother.getMother(), targetMotherName);
- }
- }
-
-
-
// This finds specific type. I would like to use the ID for this but can't, I think.
// TODO there must be a factory instance to do this