Commit in lcsim-contrib/src/main/java/org/lcsim/contrib/Cassell on MAIN
EcalGlobalGridXY.java+106added 1.1
EcalRegularNgonCartesianGridXZ.java+260added 1.1
+366
2 added files
Code to hadle different slice field for layer 0.

lcsim-contrib/src/main/java/org/lcsim/contrib/Cassell
EcalGlobalGridXY.java added at 1.1
diff -N EcalGlobalGridXY.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ EcalGlobalGridXY.java	12 Feb 2010 19:43:26 -0000	1.1
@@ -0,0 +1,106 @@
+package org.lcsim.contrib.Cassell;
+import org.lcsim.geometry.segmentation.*;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.jdom.DataConversionException;
+import org.jdom.Element;
+import org.lcsim.geometry.util.IDDescriptor;
+import org.lcsim.geometry.util.BaseIDDecoder;
+import org.lcsim.geometry.util.IDEncoder;
+
+/**
+ * XZ Cartesian grid segmentation, with ugly problem of active
+ * slice index different for layer 0 than the rest of the layers
+ * 
+ * @author  cassell
+ */
+public class EcalGlobalGridXY extends GlobalGridXY
+{	
+	private int xIndex = -1;
+	private int yIndex = -1;
+	private int sliceIndex = -1;
+        private int defSliceVal = 2;
+        private int l0SliceVal = 0;
+	public EcalGlobalGridXY(Element node) throws DataConversionException
+	{
+		super(node);
+
+
+	}
+
+	public long[] getNeighbourIDs(int layerRange, int xRange, int yRange)
+	{
+		if (this.getDecoder().getID() == 0)
+			throw new RuntimeException("No current ID is set.");
+        IDEncoder gnEncoder = new IDEncoder(descriptor);
+        BaseIDDecoder gnDecoder = new BaseIDDecoder(descriptor);
+        gnEncoder.setValues(values);
+        gnDecoder.setID(gnEncoder.getID());
+
+		// Get number of layers.
+		int nlayers = this.getNumberOfLayers();
+
+		// Set values for current id.
+		int currLayer = values[layerIndex];
+		int currU = gnDecoder.getValue(xIndex);
+		int currV = gnDecoder.getValue(yIndex);
+
+		// Create return array.
+		List<Long> neighbors = new ArrayList<Long>();
+
+		// Loop over layer range.
+		for (int ilayer=-layerRange; ilayer<=layerRange; ilayer++)
+		{
+			// Compute layer value.
+			int neighborLayer = currLayer + ilayer;
+
+			if (neighborLayer >= 0 && neighborLayer < nlayers)
+			{
+				gnEncoder.setValue(layerIndex, neighborLayer);
+                                if(neighborLayer == 0)gnEncoder.setValue(sliceIndex,l0SliceVal);
+                                else gnEncoder.setValue(sliceIndex,defSliceVal);
+                // Loop over X range.
+                for (int iu=-xRange; iu<=xRange; iu++)
+                {
+					// Compute x value.
+					int neighborU = currU + iu;
+					gnEncoder.setValue(xIndex, neighborU);
+
+                    // Loop over Y range.
+                    for (int iv=-yRange; iv<=yRange; iv++)
+                    {
+						// Compute y value.
+						int neighborV = currV + iv;
+
+						// Set the neighbor fields.
+						gnEncoder.setValue(yIndex, neighborV);
+
+						// Add the neighbor id to the return array.
+						if( this.getDecoder().getID()!= gnEncoder.getID())neighbors.add(gnEncoder.getID());
+					}
+				}
+			}
+		}
+
+		long result[] = new long[neighbors.size()];
+		int i = 0;
+		for (Long id : neighbors)
+		{
+			result[i] = id;
+			i++;
+		}
+		return result;
+    }
+	protected void setupGeomFields(IDDescriptor id)
+	{
+        super.setupGeomFields(id);
+		xIndex = id.indexOf("x");
+		yIndex = id.indexOf("y");
+		layerIndex = id.indexOf("layer");
+		sliceIndex = id.indexOf("slice");
+
+	}
+		
+}
\ No newline at end of file

lcsim-contrib/src/main/java/org/lcsim/contrib/Cassell
EcalRegularNgonCartesianGridXZ.java added at 1.1
diff -N EcalRegularNgonCartesianGridXZ.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ EcalRegularNgonCartesianGridXZ.java	12 Feb 2010 19:43:26 -0000	1.1
@@ -0,0 +1,260 @@
+package org.lcsim.contrib.Cassell;
+import org.lcsim.geometry.segmentation.*;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.jdom.DataConversionException;
+import org.jdom.Element;
+import org.lcsim.detector.IDetectorElement;
+import org.lcsim.detector.IDetectorElementContainer;
+import org.lcsim.detector.identifier.IExpandedIdentifier;
+import org.lcsim.detector.identifier.ExpandedIdentifier;
+import org.lcsim.detector.identifier.IIdentifier;
+import org.lcsim.detector.identifier.IIdentifierHelper;
+import org.lcsim.detector.identifier.Identifier;
+import org.lcsim.detector.solids.Trd;
+import org.lcsim.geometry.util.IDDescriptor;
+import org.lcsim.geometry.util.BaseIDDecoder;
+import org.lcsim.geometry.util.IDEncoder;
+import org.lcsim.geometry.subdetector.AbstractPolyhedraCalorimeter;
+
+/**
+ * XZ Cartesian grid segmentation, with ugly problem of active
+ * slice index different for layer 0 than the rest of the layers
+ * 
+ * @author  cassell
+ */
+public class EcalRegularNgonCartesianGridXZ extends CartesianGridXZ
+{	
+	private double gridSizeX = 0;
+	private double gridSizeZ = 0;
+    private int nmodules = 12;
+
+	private int xIndex = -1;
+	private int zIndex = -1;
+	private int moduleIndex = -1;
+	private int barrelIndex = -1;
+	private int sliceIndex = -1;
+
+    private int nzbins = 0;
+    private int zbinmax = 0;
+    private int zbinmin = 0;
+    private int[] nvalidx;
+    private boolean[] borderCellIsDuplicate;
+
+    private double xhl0 = 0.;
+    private double xslope = 0.;
+
+    private int ecsign = -1;
+	public EcalRegularNgonCartesianGridXZ(Element node) throws DataConversionException
+	{
+		super(node);
+
+		if (node.getAttribute("gridSizeX") != null)
+		{
+			gridSizeX = node.getAttribute("gridSizeX").getDoubleValue();
+		}
+		else
+		{
+			throw new RuntimeException("Missing gridSizeX parameter.");
+		}
+
+		if (node.getAttribute("gridSizeZ") != null)
+		{
+			gridSizeZ = node.getAttribute("gridSizeZ").getDoubleValue();
+		}
+		else
+		{
+			throw new RuntimeException("Missing gridSizeZ parameter.");
+		}
+	}
+
+	public long[] getNeighbourIDs(int layerRange, int xRange, int zRange)
+	{
+		if (this.getDecoder().getID() == 0)
+			throw new RuntimeException("No current ID is set.");
+        IDEncoder gnEncoder = new IDEncoder(descriptor);
+        BaseIDDecoder gnDecoder = new BaseIDDecoder(descriptor);
+        gnEncoder.setValues(values);
+        gnDecoder.setID(gnEncoder.getID());
+        IDEncoder dupEncoder = new IDEncoder(descriptor);
+        BaseIDDecoder dupDecoder = new BaseIDDecoder(descriptor);
+        dupEncoder.setValues(values);
+        dupDecoder.setID(dupEncoder.getID());
+
+		// Get number of layers.
+		int nlayers = this.getNumberOfLayers();
+
+        // Initialize the border arrays the first time in
+        if (nvalidx == null)
+        {
+            initializeBorders();
+        }
+		// Set values for current id.
+		int currLayer = gnDecoder.getValue(layerIndex);
+		int currX = gnDecoder.getValue(xIndex);
+		int currZ = gnDecoder.getValue(zIndex);
+		int currModule = gnDecoder.getValue(moduleIndex);
+		// Create return array.
+		List<Long> neighbors = new ArrayList<Long>();
+
+        // Loop over Z range.
+        for (int iz=-zRange; iz<=zRange; iz++)
+        {
+            // Compute y value.
+            int neighborZ = currZ + iz;
+            if(neighborZ >= zbinmin && neighborZ <= zbinmax)
+            {
+                gnEncoder.setValue(zIndex, neighborZ);
+                int Zindex = neighborZ + nzbins/2;
+                // Loop over X range.
+                for (int ix=-xRange; ix<=xRange; ix++)
+                {
+                    // Need to check border
+                    int neighborX = currX + ix;
+                    int neighborModule = currModule;
+                    int dupX = neighborX;
+                    int dupModule = neighborModule;
+                    boolean dup = false;
+                    if(neighborX < -nvalidx[Zindex]+1)
+                    {
+                        if(neighborX == -nvalidx[Zindex])
+                        {
+                            if(borderCellIsDuplicate[Zindex])
+                            {
+                                dup = true;
+                                dupX = -neighborX -1;
+                                dupModule = (nmodules + neighborModule -ecsign)%nmodules;
+                            }
+                        }
+                        else
+                        {
+                            neighborModule = (nmodules + neighborModule -ecsign)%nmodules;
+                            neighborX = 2*nvalidx[Zindex] + neighborX;
+                            if(borderCellIsDuplicate[Zindex])neighborX--;
+                        }
+                    }
+                    else if(neighborX > nvalidx[Zindex]-2)
+                    {
+                        if(neighborX == nvalidx[Zindex]-1)
+                        {
+                            if(borderCellIsDuplicate[Zindex])
+                            {
+                                dup = true;
+                                dupX = -neighborX -1;
+                                dupModule = (nmodules + neighborModule +ecsign)%nmodules;
+                            }
+                        }
+                        else
+                        {
+                            neighborModule = (nmodules + neighborModule +ecsign)%nmodules;
+                            neighborX = -2*nvalidx[Zindex] + neighborX;
+                            if(borderCellIsDuplicate[Zindex])neighborX++;
+                        }
+                    }
+                    gnEncoder.setValue(xIndex, neighborX);
+                    gnEncoder.setValue(moduleIndex, neighborModule);
+                    // Loop over layer range.
+                    for (int ilayer=-layerRange; ilayer<=layerRange; ilayer++)
+                    {
+                        // Compute layer value.
+                        int neighborLayer = currLayer + ilayer;
+
+                        if (neighborLayer >= 0 && neighborLayer < nlayers)
+                        {
+
+                            // Set the neighbor fields.
+                            gnEncoder.setValue(layerIndex, neighborLayer);
+                            int iSlice = 2;
+                            if(neighborLayer == 0)iSlice = 0;
+                            gnEncoder.setValue(sliceIndex, iSlice);
+                            // Add the neighbor id to the return array.
+                            if( this.getDecoder().getID()!= gnEncoder.getID())neighbors.add(gnEncoder.getID());
+                            // If we have a duplicate cell, add it
+                            if(dup)
+                            {
+                                dupEncoder.setValue(zIndex, neighborZ);
+                                dupEncoder.setValue(xIndex, dupX);
+                                dupEncoder.setValue(layerIndex, neighborLayer);
+                                dupEncoder.setValue(sliceIndex, iSlice);
+                                dupEncoder.setValue(moduleIndex, dupModule);
+                                neighbors.add(dupEncoder.getID());
+                            }
+                        }
+					}
+				}
+			}
+        }
+
+		long result[] = new long[neighbors.size()];
+		int i = 0;
+		for (Long id : neighbors)
+		{
+			result[i] = id;
+			i++;
+		}
+		return result;
+    }
+    protected void initializeBorders()
+    {
+        nmodules = ((AbstractPolyhedraCalorimeter)getSubdetector()).getNumberOfSides();
+		IIdentifierHelper helper = detector.getDetectorElement().getIdentifierHelper();
+		// Current packed id.
+		IIdentifier currId = new Identifier(this.getDecoder().getID());
+		// Create an ExpandedIdentifier for the current id.
+		IExpandedIdentifier thisId = helper.unpack(currId);
+        IIdentifier id = new Identifier(this.getDecoder().getID());
+        ExpandedIdentifier testId = new ExpandedIdentifier(thisId);
+        int barrelVal = helper.getValue(id, barrelIndex);
+        ecsign = 1;
+        if(barrelVal == 2)ecsign = -1;
+        testId.setValue(xIndex, 0);
+        testId.setValue(layerIndex, 0);
+        testId.setValue(sliceIndex, 0);
+        IIdentifier geomId = makeGeometryIdentifier(helper.pack(testId).getValue());
+        IDetectorElementContainer deSrch = getSubdetector().getDetectorElement().findDetectorElement(geomId);
+        IDetectorElement de = deSrch.get(0);
+        if (de.getGeometry().getLogicalVolume().getSolid() instanceof Trd)
+        {
+            Trd sensorTrd = (Trd)de.getGeometry().getLogicalVolume().getSolid();
+            double zhl = sensorTrd.getZHalfLength();
+            double xhl1 = sensorTrd.getXHalfLength1();
+            double xhl2 = sensorTrd.getXHalfLength2();
+            System.out.println("From Trd: zhl = "+zhl+": xhl1,xhl2 = "+xhl1+", "+xhl2);
+            xhl0 = (xhl1+xhl2)/2.;
+            xslope = (xhl2 - xhl0)*gridSizeZ/zhl;
+            nzbins = 2*((int)(zhl/gridSizeZ) + 1);
+            zbinmax = nzbins/2 -1;
+            zbinmin = -nzbins/2;
+            nvalidx = new int[nzbins];
+            borderCellIsDuplicate = new boolean[nzbins];
+            for(int zi=0;zi<nzbins;zi++)
+            {
+                int zbin = zi - nzbins/2;
+                double xhl = xhl0 + xslope*(zbin + .5);
+                nvalidx[zi] = (int)(xhl/gridSizeX) + 1;
+                double bcw = (nvalidx[zi]*gridSizeX - xhl)/gridSizeX;
+                borderCellIsDuplicate[zi] = false;
+                if(bcw < .5)borderCellIsDuplicate[zi] = true;
+            }
+        }
+        else
+        {
+            throw new RuntimeException("Don't know how to bounds check solid " + de.getGeometry().getLogicalVolume().getSolid().getName() + ".");
+        }
+    }
+	 	
+	protected void setupGeomFields(IDDescriptor id)
+	{
+        super.setupGeomFields(id);
+		xIndex = id.indexOf("x");
+		zIndex = id.indexOf("z");
+		moduleIndex = id.indexOf("module");
+		layerIndex = id.indexOf("layer");
+		barrelIndex = id.indexOf("barrel");
+		sliceIndex = id.indexOf("slice");
+
+	}
+		
+}
\ No newline at end of file
CVSspam 0.2.8