Commit in lcsim/src/org/lcsim/contrib/proulx/gangedhits on MAIN
GangedCalorimeterHit.java+1-11.2 -> 1.3
GangedHitsExampleDriver.java+4-41.1 -> 1.2
GangedIDDecoder.java+243-391.1 -> 1.2
+248-44
3 modified files


lcsim/src/org/lcsim/contrib/proulx/gangedhits
GangedCalorimeterHit.java 1.2 -> 1.3
diff -u -r1.2 -r1.3
--- GangedCalorimeterHit.java	28 Jul 2006 23:22:27 -0000	1.2
+++ GangedCalorimeterHit.java	17 Aug 2006 17:46:55 -0000	1.3
@@ -60,7 +60,7 @@
       position[0] = position[1] = position[2] = 0;
 
       gangedIDDecoder.updateDecoder(this);
-      long [] contributingHitIDs = gangedIDDecoder.gangedCellIDs(id);
+      long [] contributingHitIDs = gangedIDDecoder.gangedCellIDs(this);
       for (int i=0; i<contributingHitIDs.length; ++i) {
 	idDecoder.setID(contributingHitIDs[i]);
 	position[0] += idDecoder.getX();

lcsim/src/org/lcsim/contrib/proulx/gangedhits
GangedHitsExampleDriver.java 1.1 -> 1.2
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
GangedIDDecoder.java 1.1 -> 1.2
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;
+    }
+  }
 }
CVSspam 0.2.8