GeomConverter/src/org/lcsim/detector
diff -N IDetectorElementVisitor.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ IDetectorElementVisitor.java 2 May 2007 23:45:34 -0000 1.1
@@ -0,0 +1,11 @@
+package org.lcsim.detector;
+/**
+ * COMMENT
+ *
+ * @author Jeremy McCormick
+ * @version $Id: IDetectorElementVisitor.java,v 1.1 2007/05/02 23:45:34 jeremy Exp $
+ */
+
+public interface IDetectorElementVisitor
+extends IVisitor<IDetectorElement>
+{}
GeomConverter/src/org/lcsim/detector
diff -u -r1.17 -r1.18
--- DetectorElement.java 2 May 2007 01:58:18 -0000 1.17
+++ DetectorElement.java 2 May 2007 23:45:34 -0000 1.18
@@ -2,6 +2,9 @@
import hep.physics.vec.Hep3Vector;
+import java.util.ArrayList;
+import java.util.List;
+
import org.lcsim.detector.identifier.IIdentifier;
import org.lcsim.detector.identifier.IIdentifierHelper;
@@ -357,8 +360,101 @@
return isDesc;
}
+ /**
+ * Set the {@see IIdentifierHelper} for encoding and decoding
+ * identifiers of this DetectorElement.
+ *
+ * @param helper The {@see IIdentifierHelper} that has a reference
+ * to this DetectorElement's {@see IIdentifierDictionary}.
+ */
public void setIdentifierHelper( IIdentifierHelper helper )
{
this.helper = helper;
}
+
+ public void traversePreOrder(IDetectorElementVisitor visitor)
+ {
+ traversePreOrder(this,visitor);
+ }
+
+ public void traversePostOrder(IDetectorElementVisitor visitor)
+ {
+ traversePostOrder(this,visitor);
+ }
+
+ public static void traversePreOrder(
+ IDetectorElement detectorElement,
+ IDetectorElementVisitor visitor)
+ {
+ // Visit this node.
+ visitor.visit(detectorElement);
+
+ // Recursively traverse the daughters.
+ if ( detectorElement.hasChildren() )
+ {
+ for ( IDetectorElement child : detectorElement.getChildren() )
+ {
+ traversePreOrder(child, visitor);
+ }
+ }
+ }
+
+ public static void traversePostOrder(
+ IDetectorElement detectorElement,
+ IDetectorElementVisitor visitor)
+ {
+ // Recursively traverse the daughters.
+ if ( detectorElement.hasChildren() )
+ {
+ for ( IDetectorElement child : detectorElement.getChildren() )
+ {
+ traversePreOrder(child, visitor);
+ }
+ }
+
+ // Visit this node.
+ visitor.visit(detectorElement);
+ }
+
+ public void traverseAncestors(IDetectorElementVisitor visitor)
+ {
+ IDetectorElement detelem = this;
+ while ( detelem != null )
+ {
+ visitor.visit( detelem );
+ detelem = detelem.getParent();
+ }
+ }
+
+ private class AncestorSearch<T extends IDetectorElement>
+ implements IDetectorElementVisitor
+ {
+ Class<T> klass;
+ List<T> results = new ArrayList<T>();
+
+ AncestorSearch(Class<T> klass)
+ {
+ this.klass = klass;
+ }
+
+ public void visit(IDetectorElement detectorElement)
+ {
+ if ( detectorElement.getClass().equals( klass ) )
+ {
+ results.add((T)detectorElement);
+ }
+ }
+
+ public List<T> getResult()
+ {
+ return results;
+ }
+ }
+
+ public <T extends IDetectorElement> List<T> getAncestors(Class<T> klass)
+ {
+ AncestorSearch<T> search = new AncestorSearch<T>( klass );
+ traverseAncestors( search );
+ return search.getResult();
+ }
}
\ No newline at end of file
GeomConverter/src/org/lcsim/detector
diff -u -r1.13 -r1.14
--- IDetectorElement.java 2 May 2007 01:58:18 -0000 1.13
+++ IDetectorElement.java 2 May 2007 23:45:34 -0000 1.14
@@ -2,9 +2,10 @@
import hep.physics.vec.Hep3Vector;
+import java.util.List;
+
import org.lcsim.detector.identifier.IIdentifiable;
import org.lcsim.detector.identifier.IIdentifier;
-import org.lcsim.detector.identifier.IIdentifierHelper;
/**
* A class to represent a node in the detector hierarchy,
@@ -26,7 +27,7 @@
*
* @author Tim Nelson
* @author Jeremy McCormick
- * @version $Id: IDetectorElement.java,v 1.13 2007/05/02 01:58:18 jeremy Exp $
+ * @version $Id: IDetectorElement.java,v 1.14 2007/05/02 23:45:34 jeremy Exp $
*/
public interface IDetectorElement
extends IIdentifiable, INamed
@@ -185,13 +186,32 @@
* of this DetectorElement.
*/
public boolean isDescendant(IDetectorElement de);
+
+ /**
+ * Pre-order tree traversal of this and children.
+ *
+ * @param visitor
+ */
+ public void traversePreOrder(IDetectorElementVisitor visitor);
+
+ /**
+ * Post-order tree traversal of this and children.
+ *
+ * @param visitor
+ */
+ public void traversePostOrder(IDetectorElementVisitor visitor);
+
+ /**
+ * Visit this and ancestors.
+ *
+ * @param visitor
+ */
+ public void traverseAncestors(IDetectorElementVisitor visitor);
/**
- * Set the {@see IIdentifierHelper} for encoding and decoding
- * identifiers of this DetectorElement.
+ * Find first ancestor with class of {@param klass}.
*
- * @param helper The {@see IIdentifierHelper} that has a reference
- * to this DetectorElement's {@see IIdentifierDictionary}.
+ * @param klass Class to match.
*/
- public void setIdentifierHelper( IIdentifierHelper helper );
+ public <T extends IDetectorElement> List<T> getAncestors(Class<T> klass);
}
\ No newline at end of file