Print

Print


Commit in GeomConverter/src/org/lcsim/detector on MAIN
IDetectorElementVisitor.java+11added 1.1
DetectorElement.java+961.17 -> 1.18
IDetectorElement.java+27-71.13 -> 1.14
+134-7
1 added + 2 modified, total 3 files
JM: Add methods to help with DetectorElement traversal.

GeomConverter/src/org/lcsim/detector
IDetectorElementVisitor.java added at 1.1
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
DetectorElement.java 1.17 -> 1.18
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
IDetectorElement.java 1.13 -> 1.14
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
CVSspam 0.2.8