lcsim/src/org/lcsim/contrib/proulx/gangedhits
diff -u -r1.1 -r1.2
--- GangedHitsExampleDriver.java 28 Jul 2006 22:51:29 -0000 1.1
+++ GangedHitsExampleDriver.java 17 Aug 2006 17:46:55 -0000 1.2
@@ -10,11 +10,11 @@
{
// GangedHitMaps for three tile orientations
// 2x2x8 gangs, non-offset
- GangedHitMap evenHitMap = new GangedHitMap(2,2,8,false);
+ GangedHitMap evenHitMap = new GangedHitMap(2,2,4,false);
// 2x2x8 gangs, offset
- GangedHitMap oddHitMap = new GangedHitMap(2,2,8,true);
+ GangedHitMap oddHitMap = new GangedHitMap(2,2,4,true);
// 4x4x4 gangs, non-offset
- GangedHitMap outerHitMap = new GangedHitMap(4,4,4,false);
+ GangedHitMap outerHitMap = new GangedHitMap(4,4,2,false);
// list of hits to go into the three orientations
Vector<SimCalorimeterHit> evenHits = new Vector<SimCalorimeterHit>(100);
@@ -34,7 +34,7 @@
for (SimCalorimeterHit hit : hits) {
hit.getIDDecoder().setID(hit.getCellID());
int layer = hit.getIDDecoder().getLayer();
- if (layer >= 32)
+ if (layer >= 16)
outerHits.add(hit);
else if (layer%2==0)
evenHits.add(hit);
lcsim/src/org/lcsim/contrib/proulx/gangedhits
diff -u -r1.1 -r1.2
--- GangedIDDecoder.java 28 Jul 2006 22:51:29 -0000 1.1
+++ GangedIDDecoder.java 17 Aug 2006 17:46:55 -0000 1.2
@@ -6,35 +6,51 @@
import org.lcsim.event.EventHeader.LCMetaData;
import org.lcsim.geometry.IDDecoder;
+import org.lcsim.geometry.util.IDDescriptor;
import org.lcsim.geometry.util.IDEncoder;
public class GangedIDDecoder
{
private static GangedIDDecoder defaultInstance = new GangedIDDecoder();
- private static int xoffset = 0;
- private static int yoffset = 3;
- private static int loffset = 6;
- private static int ooffset = 9;
-
- private static int xmask = 7 << xoffset;
- private static int ymask = 7 << yoffset;
- private static int lmask = 7 << loffset;
- private static int omask = 1 << ooffset;
+ private static short xoffset = 0;
+ private static short yoffset = 3;
+ private static short loffset = 6;
+ private static short ooffset = 9;
+
+ private static short xmask = (short) (7 << xoffset);
+ private static short ymask = (short) (7 << yoffset);
+ private static short lmask = (short) (7 << loffset);
+ private static short omask = (short) (1 << ooffset);
- private int id = 0;
+ private short id = 0;
private IDDecoder decoder = null;
private IDEncoder encoder = null;
- private int maxBit = 50;
+ private int xLookUp = -1;
+ private int yLookUp = -1;
+
+ private IDHandler idHandler = new IDHandler();
public GangedIDDecoder()
{
}
+ // DEBUG....
+ public IDHandler getIDHandler()
+ {
+ IDHandler idhandler = new IDHandler();
+ try {
+ idhandler.setMask(new IDDescriptor("layer:7,system:3,barrel:3,theta:32:11,phi:11"));
+ } catch (Exception e) {
+ System.out.println("ooops... I did it again.");
+ }
+ return idhandler;
+ }
+
public void setID(int gangID)
{
- id = gangID;
+ id = (short) gangID;
}
public void setID(CalorimeterHit h)
@@ -85,26 +101,26 @@
public void setNXGang(int nxGang)
{
- id = id & (~xmask);
- id = id | ( xmask & ((nxGang-1) << xoffset) );
+ id = (short) (id & (~xmask));
+ id = (short) (id | ( xmask & ((nxGang-1) << xoffset) ));
}
public void setNYGang(int nyGang)
{
- id = id & (~ymask);
- id = id | ( ymask & ((nyGang-1) << yoffset) );
+ id = (short) (id & (~ymask));
+ id = (short) (id | ( ymask & ((nyGang-1) << yoffset) ));
}
public void setNLayers(int nLayers)
{
- id = id & (~lmask);
- id = id | ( lmask & ((nLayers-1) << loffset) );
+ id = (short) (id & (~lmask));
+ id = (short) (id | ( lmask & ((nLayers-1) << loffset) ));
}
public void setOffset(int offset)
{
- id = id & (~omask);
- id = id | ( omask & ((offset) << ooffset) );
+ id = (short) (id & (~omask));
+ id = (short) (id | ( omask & ((offset) << ooffset) ));
}
public void setOffset(boolean offset)
@@ -135,15 +151,16 @@
return ((id & omask) >>> ooffset) == 1;
}
- public int gangID(CalorimeterHit hit)
+ public short gangID(CalorimeterHit hit)
{
updateDecoder(hit);
return gangID(hit.getCellID());
}
- public int gangID(long cellID)
+ public short gangID(long cellID)
{
- return (int) (cellID >>> maxBit);
+ idHandler.setID(cellID);
+ return idHandler.getShortID();
}
public long gangedCellID(CalorimeterHit hit)
@@ -160,27 +177,31 @@
boolean offset = getOffset();
// reset cell id to uniform value for gang
- int x = decoder.getValue("theta");
+ int x = decoder.getValue(xLookUp);
if (offset) x+=xGang/2;
x -= x%xGang;
if (offset) x-=xGang/2;
- encoder.setValue("theta",x);
+ encoder.setValue(xLookUp,x);
- int y = decoder.getValue("phi");
+ int y = decoder.getValue(yLookUp);
if (offset) y+=yGang/2;
y -= y%yGang;
if (offset) y-=yGang/2;
- encoder.setValue("phi",y);
+ encoder.setValue(yLookUp,y);
int l = decoder.getValue("layer");
l -= l%lGang;
encoder.setValue("layer",l);
- long cellID = id;
- cellID = cellID << maxBit;
- cellID = cellID | encoder.getID();
+ //long cellID = id;
+ //cellID = cellID << maxBit;
+ //cellID = cellID | encoder.getID();
+ //
+ //return cellID;
- return cellID;
+ idHandler.setLongID(encoder.getID());
+ idHandler.setShortID(id);
+ return idHandler.getID();
}
public long [] gangedCellIDs(CalorimeterHit h)
@@ -199,19 +220,16 @@
int a = 0;
long gangID = gangedCellID(cellID);
decoder.setID(gangID);
- int xVal = decoder.getValue("theta");
- int yVal = decoder.getValue("phi");
+ int xVal = decoder.getValue(xLookUp);
+ int yVal = decoder.getValue(yLookUp);
int lVal = decoder.getValue("layer");
for (int i=0; i<getNXGang(); ++i) {
- encoder.setValue("theta",xVal+i);
+ encoder.setValue(xLookUp,xVal+i);
for (int j=0; j<getNYGang(); ++j) {
- encoder.setValue("phi",yVal+j);
+ encoder.setValue(yLookUp,yVal+j);
for (int k=0; k<getNLayers(); ++k) {
encoder.setValue("layer",lVal+k);
- //cellIDs[a] = id;
- //cellIDs[a] = cellIDs[a] << maxBit;
- //cellIDs[a] = cellIDs[a] | encoder.getID();
cellIDs[a] = encoder.getID();
++a;
}
@@ -226,7 +244,8 @@
if (hit.getIDDecoder() != decoder) {
decoder = hit.getIDDecoder();
encoder = new IDEncoder(decoder.getIDDescription());
- maxBit = decoder.getIDDescription().getMaxBit();
+ idHandler.setMask(decoder);
+ setLookupStrings();
}
updateDecoder(hit.getCellID());
}
@@ -234,13 +253,198 @@
public void updateDecoder(long cellID)
{
decoder.setID(cellID);
+ idHandler.setLongID(cellID);
for (int i=0; i<decoder.getFieldCount(); ++i) {
encoder.setValue(i,decoder.getValue(i));
}
}
+ private void setLookupStrings()
+ {
+ int fieldCount = decoder.getFieldCount();
+ Vector<String> fieldNames = new Vector<String>(fieldCount);
+ for (int i=0; i<fieldCount; ++i) {
+ fieldNames.add(decoder.getFieldName(i));
+ }
+ xLookUp = yLookUp = -1;
+ if (fieldNames.contains("x")) {
+ xLookUp = decoder.getFieldIndex("x");
+ } else if (fieldNames.contains("z")) {
+ xLookUp = decoder.getFieldIndex("z");
+ } else if (fieldNames.contains("theta")) {
+ xLookUp = decoder.getFieldIndex("theta");
+ }
+ if (fieldNames.contains("y")) {
+ yLookUp = decoder.getFieldIndex("y");
+ } else if (fieldNames.contains("phi")) {
+ yLookUp = decoder.getFieldIndex("phi");
+ }
+ if (xLookUp == -1 || yLookUp == -1) {
+ xLookUp = fieldCount-2;
+ yLookUp = fieldCount-1;
+ System.out.println("Error finding appropriate lookup fields.");
+ System.out.println("Using field indices :");
+ System.out.println(" x: "+xLookUp+" ("+decoder.getFieldName(xLookUp)+")");
+ System.out.println(" y: "+yLookUp+" ("+decoder.getFieldName(yLookUp)+")");
+ }
+ }
+
public static GangedIDDecoder defaultInstance()
{
return defaultInstance;
}
+
+ public class IDHandler
+ {
+ private short shortID = (short) 0xffff;
+ private long longID = 0x0000000000000000l;
+ private long mask = 0x00000000ffff0000l;
+ private IDDescriptor descriptor = null;
+ private int maxFieldSize = 16;
+
+ public short getShortID()
+ {
+ return shortID;
+ }
+
+ public long getLongID()
+ {
+ return longID;
+ }
+
+ public long getID()
+ {
+ return longID;
+ }
+
+ public long getMaskedShortID()
+ {
+ return longID&mask;
+ }
+
+ public long getMaskedLongID()
+ {
+ return longID&(~mask);
+ }
+
+ public long getMask()
+ {
+ return mask;
+ }
+
+ public IDDescriptor getDescriptor()
+ {
+ return descriptor;
+ }
+
+ public int getMaxFieldSize()
+ {
+ return maxFieldSize;
+ }
+
+ public void setShortID(short s)
+ {
+ shortID = s;
+ longID = (longID&(~mask)) | (mapShortOntoLong(s));
+ }
+
+ public void setShortID(long l)
+ {
+ shortID = mapLongOntoShort(l);
+ longID = (longID&(~mask)) | (l&mask);
+ }
+
+ public void setLongID(long l)
+ {
+ longID = (l&(~mask)) | (longID&mask);
+ }
+
+ public void setLongID(short s)
+ {
+ setLongID(mapShortOntoLong(s));
+ }
+
+ public void setID(long l)
+ {
+ this.setLongID(l);
+ this.setShortID(l);
+ }
+
+ public void setMask(IDDecoder d)
+ {
+ this.setMask(decoder.getIDDescription());
+ }
+
+ public void setMask(IDDescriptor d)
+ {
+ if (descriptor == d || d.equals(descriptor))
+ return;
+ descriptor = d;
+ if (d == null)
+ return;
+
+ mask = (long) 0;
+ for (int i=0; i<d.fieldCount(); ++i) {
+ int start = d.fieldStart(i);
+ int length = d.fieldLength(i);
+ int stop = start+length;
+ mask = mask | (((~((long)0))<<64-length)>>>64-stop);
+ }
+ mask = ~mask;
+
+ maxFieldSize = 0;
+ for (long bit = 1; bit!= 0; bit = (long) (bit<<1)) {
+ if ((bit&mask) != 0) maxFieldSize++;
+ }
+ if (maxFieldSize>16) maxFieldSize=16;
+ }
+
+ private short mapLongOntoShort(long l)
+ {
+ long bitLong = (long) 1;
+ short bitShort = (short) 1;
+ short s = (short) 0;
+
+ do {
+ while ((bitLong&mask) == 0) {
+ bitLong = (long) (bitLong<<1);
+ if (bitLong == 0) {
+ return s;
+ }
+ }
+ s = (short) (s | bitShort);
+ if ((bitLong&l) == 0) {
+ s = (short) (s & (~bitShort));
+ }
+ bitLong = (long) (bitLong<<1);
+ bitShort = (short) (bitShort<<1);
+ } while (bitShort != 0);
+
+ return s;
+ }
+
+ private long mapShortOntoLong(short s)
+ {
+ long bitLong = (long) 1;
+ short bitShort = (short) 1;
+ long l = (long) 0;
+
+ do {
+ while ((bitLong&mask) == 0) {
+ bitLong = (long) (bitLong<<1);
+ if (bitLong == 0) {
+ return l;
+ }
+ }
+ l = (long) (l | bitLong);
+ if ((bitShort&s) == 0) {
+ l = (long) (l & (~bitLong));
+ }
+ bitLong = (long) (bitLong<<1);
+ bitShort = (short) (bitShort<<1);
+ } while (bitShort != 0);
+
+ return l;
+ }
+ }
}