Commit in lcdd/src on MAIN
IdFactory.cc+25-231.23 -> 1.24
Fix for LCDD-22 (possibly).  Runs okay with sidmay05_np + isotropic muons.  Overflow check seems to work fine.  Could still use more testing.

lcdd/src
IdFactory.cc 1.23 -> 1.24
diff -u -r1.23 -r1.24
--- IdFactory.cc	19 Jul 2005 23:04:41 -0000	1.23
+++ IdFactory.cc	22 Jul 2005 01:08:09 -0000	1.24
@@ -1,4 +1,4 @@
-// $Header: /cvs/lcd/lcdd/src/IdFactory.cc,v 1.23 2005/07/19 23:04:41 jeremy Exp $
+// $Header: /cvs/lcd/lcdd/src/IdFactory.cc,v 1.24 2005/07/22 01:08:09 jeremy Exp $
 
 // set for verbose output from this class
 //#define ID_DEBUG 1
@@ -100,6 +100,8 @@
       field_start -= 32;
     }
 
+    Bits field_mask = makeBitMask(field_bit_len);
+
 #ifdef ID_DEBUG
     G4cout << "idspec_idx: " << dec << idspec_idx << G4endl;
     G4cout << "shifting left: " << dec << field_bit_len << G4endl;
@@ -109,25 +111,21 @@
     G4cout << "field_val (dec): " << dec << field_val << G4endl;
     G4cout << "field_val (hex): " << hex << field_val << G4endl;
     G4cout << "field_bit_len: " << dec << field_bit_len << G4endl;
+    G4cout << "field_mask: " << hex << field_mask << G4endl;
 #endif
 
-    Bits field_mask = makeBitMask(field_bit_len);
-
     /* For positive values, check that this value doesn't overflow the assigned length. */
-    /*
-    if ( field_val > 0 ) {
-      if ( checkOverflow(field_val, field_mask) != 0 ) {
-	G4cerr << "Value <" << field_val
-	       << "> is too big for the field <"
-	       << id_field->getLabel() << ">, len <"
-	       << field_bit_len << "> !?" << G4endl;
-	//G4Exception("FATAL ERROR: Id value too large for field.");
-      }
+    //    if ( field_val > 0 ) {
+    if ( checkOverflow(field_val, field_mask) != 0 ) {
+      G4cerr << "Value <" << field_val
+	     << "> is too big for the field <"
+	     << id_field->getLabel() << ">, len <"
+	     << field_bit_len << ">." << G4endl;
+      G4Exception("FATAL ERROR: Id value too large for field.");
     }
-    else {
-
-    }
-*/
+    //    }
+    //    else {
+    //    }
 
 #ifdef ID_DEBUG
     G4cout << "field_mask: " << hex << field_mask << G4endl;
@@ -175,20 +173,24 @@
 {
   Bits xbits = 0x0;
 
-  if ( val >= 0 ) {
-    Bits posMask = (mask ^ MASK_ON);
+  /* get flipped mask of all 1's in positions that should be masked off for this val */
+  Bits flipMask = mask ^ MASK_ON;
 
-#ifdef ID_DEBUG
-    G4cout << "posMsk: " << posMask << G4endl;
-#endif
+  /* mask off all the valid bits, leaving overflow bits */
+  Id64bit::ElementType overflow = (val & flipMask);
 
-    xbits = (Bits)((mask ^ MASK_ON) & val);
+  /* for pos vals, check that no bits past max bit are = 1 */
+  if ( val >= 0 ) {
+    xbits = (Bits) ((flipMask) & overflow);
   }
+  /* for neg vals, check that no bits past max bit are = 0 */
   else {
-    xbits = (Bits)((mask ^ MASK_ON) ^ val);
+    xbits = (Bits) ((flipMask) ^ overflow);
   }
 
 #ifdef ID_DEBUG
+  G4cout << "flipMask: " << hex << flipMask << G4endl;
+  G4cout << "overflow: " << hex << overflow << G4endl;
   G4cout << "overflow bits (hex): " << hex << xbits << G4endl;
 #endif
 
CVSspam 0.2.8