GeomConverter/src/org/lcsim/geometry/subdetector
diff -u -r1.1 -r1.2
--- HPSEcal.java 3 May 2011 00:41:30 -0000 1.1
+++ HPSEcal.java 17 May 2011 23:10:46 -0000 1.2
@@ -6,6 +6,8 @@
import org.jdom.Element;
import org.jdom.JDOMException;
+import org.lcsim.geometry.IDDecoder;
+import org.lcsim.geometry.util.IDEncoder;
/**
* @author jeremym
@@ -91,6 +93,56 @@
}
}
+ /**
+ * Get the neighbors for a given cell ID. Each crystal not on an edge
+ * has 8 neighbors. Edge crystals have fewer.
+ * @param id The cell ID.
+ * @return A <code>Set</code> containing the cell's neighbors.
+ */
+ public Set<Long> getNeighbors(Long id)
+ {
+ // Get the IDDecoder.
+ IDDecoder dec = getIDDecoder();
+
+ // Set the ID.
+ dec.setID(id);
+
+ // Get ID field values.
+ int x = dec.getValue("ix");
+ int y = dec.getValue("iy");
+ int side = dec.getValue("side");
+
+ // Get field indices.
+ int ix = dec.getFieldIndex("ix");
+ int iy = dec.getFieldIndex("iy");
+ int iside = dec.getFieldIndex("side");
+
+ // Get X, Y, & side neighbor data for this crystal.
+ Set<XYSide> neighbors = getNeighbors(x, y, side);
+
+ // Get buffer with values from current ID.
+ int[] buffer = new int[dec.getFieldCount()];
+ dec.getValues(buffer);
+
+ // Create an encoder to make neighbor IDs.
+ IDEncoder enc = new IDEncoder(dec.getIDDescription());
+
+ // Set to hold neighbor IDs.
+ Set<Long> ids = new HashSet<Long>();
+
+ // Loop over neighbor objects to make IDs.
+ for (XYSide xyside : neighbors)
+ {
+ buffer[ix] = xyside.x;
+ buffer[iy] = xyside.y;
+ buffer[iside] = xyside.side;
+ long nId = enc.setValues(buffer);
+ ids.add(nId);
+ }
+
+ return ids;
+ }
+
public Set<XYSide> getNeighbors(int ix, int iy, int side)
{
Set<Integer> xneighbors = getXNeighbors(ix);