]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - TRD/AliTRDtrapConfig.cxx
During simulation: fill STU region w/ non null time sums
[u/mrichter/AliRoot.git] / TRD / AliTRDtrapConfig.cxx
index 3619f5ddff0b6ffbaf31307c395612b9acafbba9..bd53e949f4d82f056685ae32aa169cadd80742d6 100644 (file)
@@ -26,6 +26,7 @@
 #include "AliTRDgeometry.h"
 #include "AliTRDfeeParam.h"
 #include "AliTRDtrapConfig.h"
+#include "AliTRDtrapConfigHandler.h"
 
 #include <fstream>
 #include <iostream>
@@ -37,7 +38,7 @@ AliTRDtrapConfig* AliTRDtrapConfig::fgInstance = 0x0;
 const Int_t AliTRDtrapConfig::fgkMaxMcm = AliTRDfeeParam::GetNmcmRob() + 2;
 const Int_t AliTRDtrapConfig::fgkDmemStartAddress = 0xc000;
 
-AliTRDtrapConfig::AliTRDtrapConfig() : 
+AliTRDtrapConfig::AliTRDtrapConfig() :
   TObject(), fScaleQ0(0), fScaleQ1(0)
 {
   // default constructor, initializing array of TRAP registers
@@ -480,7 +481,7 @@ AliTRDtrapConfig::AliTRDtrapConfig() :
 
 
   for(Int_t iAddr = 0; iAddr < fgkDmemWords; iAddr++) {
-     
+
      if(iAddr == fgkDmemAddrDeflCorr - fgkDmemStartAddress) {
        fDmem[iAddr] = new UInt_t[fgkDmemSizeSmIndividual];
        fDmemDepth[iAddr] = fgkDmemSizeSmIndividual;
@@ -492,7 +493,7 @@ AliTRDtrapConfig::AliTRDtrapConfig() :
      }
 
      else if(iAddr >= fgkDmemAddrDeflCutStart-fgkDmemStartAddress && iAddr <= fgkDmemAddrDeflCutEnd-fgkDmemStartAddress) {
-       fDmem[iAddr]  = new UInt_t[fgkDmemSizeSmIndividual];   
+       fDmem[iAddr]  = new UInt_t[fgkDmemSizeSmIndividual];
        fDmemDepth[iAddr] = fgkDmemSizeSmIndividual;
      }
 
@@ -507,15 +508,15 @@ AliTRDtrapConfig::AliTRDtrapConfig() :
     }
 
      else if(iAddr == fgkDmemAddrLUTcor0-fgkDmemStartAddress) {
-       fDmem[iAddr]  = new UInt_t[fgkDmemSizeSmIndividual];   
+       fDmem[iAddr]  = new UInt_t[fgkDmemSizeSmIndividual];
        fDmemDepth[iAddr]  = fgkDmemSizeSmIndividual;
      }
 
      else if(iAddr == fgkDmemAddrLUTcor1-fgkDmemStartAddress) {
-       fDmem[iAddr]  = new UInt_t[fgkDmemSizeSmIndividual];   
+       fDmem[iAddr]  = new UInt_t[fgkDmemSizeSmIndividual];
        fDmemDepth[iAddr]  = fgkDmemSizeSmIndividual;
      }
-       
+
      else if(iAddr == fgkDmemAddrLUTnbins-fgkDmemStartAddress) {
        fDmem[iAddr]  = new UInt_t;   // same value for all MCMs
        fDmemDepth[iAddr] = fgkDmemSizeUniform;
@@ -530,7 +531,7 @@ AliTRDtrapConfig::AliTRDtrapConfig() :
        fDmem[iAddr] = NULL;
        fDmemDepth[iAddr] = fgkDmemSizeEmpty;
      }
-     
+
   }
 
   InitRegs();
@@ -544,7 +545,8 @@ AliTRDtrapConfig* AliTRDtrapConfig::Instance()
 
   if (!fgInstance) {
     fgInstance = new AliTRDtrapConfig();
-    fgInstance->LoadConfig();
+    AliTRDtrapConfigHandler cfgHandler;
+    cfgHandler.LoadConfig();
   }
 
   return fgInstance;
@@ -574,7 +576,7 @@ AliTRDtrapConfig::~AliTRDtrapConfig()
 
      else if(iAddr == fgkDmemAddrLUTcor1-fgkDmemStartAddress)
        delete [] fDmem[iAddr];
-       
+
      else if(iAddr == fgkDmemAddrLUTnbins-fgkDmemStartAddress)
        delete fDmem[iAddr];
 
@@ -631,7 +633,7 @@ void AliTRDtrapConfig::ResetDmem()
 
 Int_t AliTRDtrapConfig::GetTrapReg(TrapReg_t reg, Int_t det, Int_t rob, Int_t mcm) const
 {
-  // get the value of an individual TRAP register 
+  // get the value of an individual TRAP register
   // if it is individual for TRAPs a valid TRAP has to be specified
 
   if ((reg < 0) || (reg >= kLastReg)) {
@@ -643,8 +645,8 @@ Int_t AliTRDtrapConfig::GetTrapReg(TrapReg_t reg, Int_t det, Int_t rob, Int_t mc
       return fRegisterValue[reg].globalValue;
     }
     else if (fRegisterValue[reg].state == RegValue_t::kIndividual) {
-       if((det >= 0 && det < AliTRDgeometry::Ndet()) && 
-          (rob >= 0 && rob < AliTRDfeeParam::GetNrobC1()) && 
+       if((det >= 0 && det < AliTRDgeometry::Ndet()) &&
+          (rob >= 0 && rob < AliTRDfeeParam::GetNrobC1()) &&
           (mcm >= 0 && mcm < fgkMaxMcm)) {
          return fRegisterValue[reg].individualValue[det*AliTRDfeeParam::GetNrobC1()*fgkMaxMcm + rob*fgkMaxMcm + mcm];
        }
@@ -671,7 +673,7 @@ Bool_t AliTRDtrapConfig::SetTrapReg(TrapReg_t reg, Int_t value)
       return kTRUE;
    }
    else {
-      AliError("Register has individual values");
+      AliError(Form("Register %s has individual values", AliTRDtrapConfig::GetRegName(reg)));
    }
    return kFALSE;
 }
@@ -682,47 +684,57 @@ Bool_t AliTRDtrapConfig::SetTrapReg(TrapReg_t reg, Int_t value, Int_t det)
   // set a global value for the given TRAP register,
   // i.e. the same value for all TRAPs
 
-   if (fRegisterValue[reg].state == RegValue_t::kGlobal) {
-      fRegisterValue[reg].globalValue = value;
-      return kTRUE;
-   }
-   else if (fRegisterValue[reg].state == RegValue_t::kIndividual) {
-      // if the register is in idividual mode but a broadcast is requested, the selected register is 
-      // set to value for all MCMs on the chamber
+  if( (det>=0 && det<AliTRDgeometry::Ndet())) {
+    if (fRegisterValue[reg].state == RegValue_t::kGlobal) {
+      Int_t defaultValue = fRegisterValue[reg].globalValue;
+
+      fRegisterValue[reg].state = RegValue_t::kIndividual;
+      fRegisterValue[reg].individualValue = new Int_t[AliTRDgeometry::Ndet()*AliTRDfeeParam::GetNrobC1()*fgkMaxMcm];
+
+      for(Int_t i = 0; i < AliTRDgeometry::Ndet()*AliTRDfeeParam::GetNrobC1()*fgkMaxMcm; i++)
+       fRegisterValue[reg].individualValue[i] = defaultValue; // set the requested register of all MCMs to the value previously stored
 
-      if( (det>=0 && det<AliTRDgeometry::Ndet())) {
-        for(Int_t rob=0; rob<AliTRDfeeParam::GetNrobC1(); rob++) {
-           for(Int_t mcm=0; mcm<fgkMaxMcm; mcm++)
-              fRegisterValue[reg].individualValue[det*AliTRDfeeParam::GetNrobC1()*fgkMaxMcm + rob*fgkMaxMcm + mcm] = value;
-        }
+      for(Int_t rob=0; rob<AliTRDfeeParam::GetNrobC1(); rob++) {
+       for(Int_t mcm=0; mcm<fgkMaxMcm; mcm++)
+         fRegisterValue[reg].individualValue[det*AliTRDfeeParam::GetNrobC1()*fgkMaxMcm + rob*fgkMaxMcm + mcm] = value;
       }
-      else {
-        AliError(Form("Invalid detector number: %i\n", det));
-        return kFALSE;
+    }
+    else if (fRegisterValue[reg].state == RegValue_t::kIndividual) {
+      // if the register is in idividual mode but a broadcast is requested, the selected register is
+      // set to value for all MCMs on the chamber
+
+      for(Int_t rob=0; rob<AliTRDfeeParam::GetNrobC1(); rob++) {
+       for(Int_t mcm=0; mcm<fgkMaxMcm; mcm++)
+         fRegisterValue[reg].individualValue[det*AliTRDfeeParam::GetNrobC1()*fgkMaxMcm + rob*fgkMaxMcm + mcm] = value;
       }
-   }
-   else {  // should never be reached
+    }
+    else {  // should never be reached
       AliError("MCM register status neither kGlobal nor kIndividual");
       return kFALSE;
-   }
-   
-   return kFALSE;
+    }
+  }
+  else {
+    AliError(Form("Invalid detector number: %i\n", det));
+    return kFALSE;
+  }
+
+  return kFALSE;
 }
 
 
 Bool_t AliTRDtrapConfig::SetTrapReg(TrapReg_t reg, Int_t value, Int_t det, Int_t rob, Int_t mcm)
 {
-  // set the value for the given TRAP register of an individual MCM 
+  // set the value for the given TRAP register of an individual MCM
 
-  //std::cout << "-- reg: 0x" << std::hex << fRegs[reg].addr << 
+  //std::cout << "-- reg: 0x" << std::hex << fRegs[reg].addr <<
   //std::dec << ", data " << value << ", det " << det << ", rob " << rob << ", mcm " << mcm << std::endl;
 
-   if( (det >= 0 && det < AliTRDgeometry::Ndet()) && 
-       (rob >= 0 && rob < AliTRDfeeParam::GetNrobC1()) && 
+   if( (det >= 0 && det < AliTRDgeometry::Ndet()) &&
+       (rob >= 0 && rob < AliTRDfeeParam::GetNrobC1()) &&
        (mcm >= 0 && mcm < fgkMaxMcm) ) {
      if (fRegisterValue[reg].state == RegValue_t::kGlobal) {
        Int_t defaultValue = fRegisterValue[reg].globalValue;
-       
+
        fRegisterValue[reg].state = RegValue_t::kIndividual;
        fRegisterValue[reg].individualValue = new Int_t[AliTRDgeometry::Ndet()*AliTRDfeeParam::GetNrobC1()*fgkMaxMcm];
 
@@ -752,7 +764,7 @@ UInt_t AliTRDtrapConfig::Peek(Int_t addr, Int_t det, Int_t rob, Int_t mcm) const
 {
   // reading from given address
 
-  if ( (addr >= fgkDmemStartAddress) && 
+  if ( (addr >= fgkDmemStartAddress) &&
        (addr < (fgkDmemStartAddress + fgkDmemWords)) ) {
     return GetDmemUnsigned(addr, det, rob, mcm);
   }
@@ -771,7 +783,7 @@ Bool_t AliTRDtrapConfig::Poke(Int_t addr, UInt_t value, Int_t det, Int_t rob, In
 {
   // writing to given address
 
-  if ( (addr >= fgkDmemStartAddress) && 
+  if ( (addr >= fgkDmemStartAddress) &&
        (addr < (fgkDmemStartAddress + fgkDmemWords)) ) {
     AliDebug(2, Form("DMEM 0x%08x : %i", addr, value));
     SetDmem(addr, value, det, rob, mcm);
@@ -785,14 +797,14 @@ Bool_t AliTRDtrapConfig::Poke(Int_t addr, UInt_t value, Int_t det, Int_t rob, In
       return kTRUE;
     }
   }
-  
+
   return kFALSE;
 }
 
 
 Bool_t AliTRDtrapConfig::SetDmem(Int_t addr, UInt_t value)
 {
-  // Set the content of the given DMEM address 
+  // Set the content of the given DMEM address
 
    addr = addr - fgkDmemStartAddress;
 
@@ -847,12 +859,12 @@ Bool_t AliTRDtrapConfig::SetDmem(Int_t addr, UInt_t value)
 
 Bool_t AliTRDtrapConfig::SetDmem(Int_t addr, UInt_t value, Int_t det, Int_t rob, Int_t mcm)
 {
-  // Set the content of the given DMEM address 
+  // Set the content of the given DMEM address
 
    addr = addr - fgkDmemStartAddress;
    Int_t roc = det%30;
    Int_t loc;
-   
+
    if(addr < 0 || addr >=  fgkDmemWords) {
       AliError(Form("No DMEM address: 0x%08x", addr+fgkDmemStartAddress));
       return kFALSE;
@@ -890,7 +902,7 @@ Bool_t AliTRDtrapConfig::SetDmem(Int_t addr, UInt_t value, Int_t det, Int_t rob,
       if(loc < fgkDmemSizeTotalIndividual) {
         if(fDmem[addr][loc]!=0)
            AliDebug(5, Form("Warning: Setting new value to DMEM 0x%08x", addr+fgkDmemStartAddress));
-        
+
         fDmem[addr][loc]=value;
       }
       else {
@@ -909,14 +921,14 @@ Bool_t AliTRDtrapConfig::SetDmem(Int_t addr, UInt_t value, Int_t det, Int_t rob,
         AliError(Form("DMEM sub-address %i out of scope", det));
         return kFALSE;
       }
-      
+
       break;
    default:
       AliError(Form("Invalid selection type"));
       return kFALSE;
       break;
    }
-   
+
    return kTRUE;
 }
 
@@ -943,7 +955,7 @@ UInt_t AliTRDtrapConfig::GetDmemUnsigned(Int_t addr, Int_t det, Int_t rob, Int_t
    addr = addr - fgkDmemStartAddress;
    Int_t roc = det%30;
    Int_t loc;
-   
+
    if(addr < 0 || addr >=  fgkDmemWords) {
       AliError(Form("No DMEM address: 0x%08x", addr+fgkDmemStartAddress));
       return 0;
@@ -994,97 +1006,17 @@ UInt_t AliTRDtrapConfig::GetDmemUnsigned(Int_t addr, Int_t det, Int_t rob, Int_t
       return 0;
       break;
    }
-   
-   return 0;
-}
-
 
-Bool_t AliTRDtrapConfig::LoadConfig()
-{
-  // load a set of TRAP register values (configuration)
-  // here a default set is implemented for testing
-  // for a detailed description of the registers see the TRAP manual
-
-  // HC header configuration bits
-  SetTrapReg(kC15CPUA, 0x2102); // zs, deh
-
-  // no. of timebins
-  SetTrapReg(kC13CPUA, 24); 
-
-  // pedestal filter
-  SetTrapReg(kFPNP, 4*10);
-  SetTrapReg(kFPTC, 0);
-  SetTrapReg(kFPBY, 0); // bypassed!
-  
-  // gain filter
-  for (Int_t adc = 0; adc < 20; adc++) {
-    SetTrapReg(TrapReg_t(kFGA0+adc), 40);
-    SetTrapReg(TrapReg_t(kFGF0+adc), 15);
-  }
-  SetTrapReg(kFGTA, 20);
-  SetTrapReg(kFGTB, 2060);
-  SetTrapReg(kFGBY, 0);  // bypassed!
-
-  // tail cancellation
-  SetTrapReg(kFTAL, 267);
-  SetTrapReg(kFTLL, 356);
-  SetTrapReg(kFTLS, 387);
-  SetTrapReg(kFTBY, 0);
-
-  // tracklet calculation
-  SetTrapReg(kTPQS0, 5);
-  SetTrapReg(kTPQE0, 10);
-  SetTrapReg(kTPQS1, 11);
-  SetTrapReg(kTPQE1, 20);
-  SetTrapReg(kTPFS, 5);
-  SetTrapReg(kTPFE, 20);
-  SetTrapReg(kTPVBY, 0);
-  SetTrapReg(kTPVT, 10);
-  SetTrapReg(kTPHT, 150);
-  SetTrapReg(kTPFP, 40);
-  SetTrapReg(kTPCL, 1);
-  SetTrapReg(kTPCT, 10);
-
-  // ndrift (+ 5 binary digits)
-  SetDmem(0xc025, 20 << 5);
-  // deflection + tilt correction
-  SetDmem(0xc022, 0); 
-  // deflection range table
-  for (Int_t iTrklCh = 0; iTrklCh < 18; iTrklCh++) {
-    SetDmem(0xc030 + 2 * iTrklCh, -64); // min. deflection
-    SetDmem(0xc031 + 2 * iTrklCh,  63); // max. deflection
-  }
-  
-  // hit position LUT
-  const UShort_t lutPos[128] = {
-    0,  1,  1,  2,  2,  3,  3,  4,  4,  5,  5,  6,  6,  7,  7,  8,  8,  9,  9, 10, 10, 11, 11, 11, 12, 12, 13, 13, 14, 14, 15, 15,
-    16, 16, 16, 17, 17, 18, 18, 19, 19, 19, 20, 20, 20, 21, 21, 22, 22, 22, 23, 23, 23, 24, 24, 24, 24, 25, 25, 25, 26, 26, 26, 26,
-    27, 27, 27, 27, 27, 27, 27, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 27, 27, 27, 27, 26,
-    26, 26, 26, 25, 25, 25, 24, 24, 23, 23, 22, 22, 21, 21, 20, 20, 19, 18, 18, 17, 17, 16, 15, 14, 13, 12, 11, 10,  9,  8,  7,  7};
-  for (Int_t iCOG = 0; iCOG < 128; iCOG++)
-    SetTrapReg((TrapReg_t) (kTPL00 + iCOG), lutPos[iCOG]);
-
-  // event buffer
-  SetTrapReg(kEBSF, 1);  // 0: store filtered; 1: store unfiltered
-  // zs applied to data stored in event buffer (sel. by EBSF)
-  SetTrapReg(kEBIS, 15 << 2); // single indicator threshold (plus two digits)
-  SetTrapReg(kEBIT, 30 << 2); // sum indicator threshold (plus two digits)
-  SetTrapReg(kEBIL, 0xf0);   // lookup table
-  SetTrapReg(kEBIN, 0);      // neighbour sensitivity
-
-  // raw data
-  SetTrapReg(kNES, (0x0000 << 16) | 0x1000);
-
-  return kTRUE;
+   return 0;
 }
 
 
-Bool_t AliTRDtrapConfig::ReadPackedConfig(Int_t hc, UInt_t *data, Int_t size) 
+Bool_t AliTRDtrapConfig::ReadPackedConfig(Int_t hc, UInt_t *data, Int_t size)
 {
   // Read the packed configuration from the passed memory block
   //
-  // To be used to retrieve the TRAP configuration from the 
-  // configuration as sent in the raw data. 
+  // To be used to retrieve the TRAP configuration from the
+  // configuration as sent in the raw data.
 
   AliDebug(1, "Reading packed configuration");
 
@@ -1093,31 +1025,31 @@ Bool_t AliTRDtrapConfig::ReadPackedConfig(Int_t hc, UInt_t *data, Int_t size)
   Int_t idx = 0;
   Int_t err = 0;
   Int_t step, bwidth, nwords, exitFlag, bitcnt;
-  
+
   UShort_t caddr;
   UInt_t dat, msk, header, dataHi;
-  
+
   while (idx < size && *data != 0x00000000) {
-    
+
     Int_t rob = (*data >> 28) & 0x7;
     Int_t mcm = (*data >> 24) & 0xf;
 
     AliDebug(1, Form("Config of det. %3i MCM %i:%02i (0x%08x)", det, rob, mcm, *data));
     data++;
-    
+
     while (idx < size && *data != 0x00000000) {
-      
+
       header = *data;
       data++;
       idx++;
-      
+
       AliDebug(5, Form("read: 0x%08x", header));
-      
+
       if (header & 0x01) // single data
        {
-         dat   = (header >>  2) & 0xFFFF;       // 16 bit data 
-         caddr = (header >> 18) & 0x3FFF;    // 14 bit address 
-         
+         dat   = (header >>  2) & 0xFFFF;       // 16 bit data
+         caddr = (header >> 18) & 0x3FFF;    // 14 bit address
+
          if (caddr != 0x1FFF)  // temp!!! because the end marker was wrong
            {
              if (header & 0x02) // check if > 16 bits
@@ -1144,18 +1076,18 @@ Bool_t AliTRDtrapConfig::ReadPackedConfig(Int_t hc, UInt_t *data, Int_t size)
              return err;
            }
        }
-      
-      else               // block of data  
+
+      else               // block of data
        {
          step   =  (header >>  1) & 0x0003;
          bwidth = ((header >>  3) & 0x001F) + 1;
          nwords =  (header >>  8) & 0x00FF;
          caddr  =  (header >> 16) & 0xFFFF;
          exitFlag = (step == 0) || (step == 3) || (nwords == 0);
-         
-         if (exitFlag) 
+
+         if (exitFlag)
            break;
-         
+
          switch (bwidth)
            {
            case    15:
@@ -1183,7 +1115,7 @@ Bool_t AliTRDtrapConfig::ReadPackedConfig(Int_t hc, UInt_t *data, Int_t size)
                    AliDebug(5, Form("addr=0x%04x (%s) data=0x%08x\n", caddr, GetRegName(GetRegByAddress(caddr)), header & msk));
                    if ( ! Poke(caddr, header & msk, det, rob, mcm) )
                      AliDebug(5, Form("(single-write): non-existing address 0x%04x containing 0x%08x\n", caddr, header));
-                   
+
                    caddr += step;
                    header = header >> bwidth;
                    if (idx >= size)
@@ -1193,7 +1125,7 @@ Bool_t AliTRDtrapConfig::ReadPackedConfig(Int_t hc, UInt_t *data, Int_t size)
                      }
                  }
                break;
-             } // end case 5-15                                         
+             } // end case 5-15
            case 31:
              {
                while (nwords > 0)
@@ -1204,11 +1136,11 @@ Bool_t AliTRDtrapConfig::ReadPackedConfig(Int_t hc, UInt_t *data, Int_t size)
                    idx++;
                    nwords--;
                    err += (header & 1);
-                   
+
                    AliDebug(5, Form("addr=0x%04x (%s) data=0x%08x", caddr, GetRegName(GetRegByAddress(caddr)), header >> 1));
                    if ( ! Poke(caddr, header >> 1, det, rob, mcm) )
                      AliDebug(5, Form("(single-write): non-existing address 0x%04x containing 0x%08x\n", caddr, header));
-                   
+
                    caddr += step;
                    if (idx >= size)
                      {
@@ -1219,12 +1151,12 @@ Bool_t AliTRDtrapConfig::ReadPackedConfig(Int_t hc, UInt_t *data, Int_t size)
                break;
              }
            default: return err;
-           } // end switch 
+           } // end switch
        } // end block case
     }
   } // end while
   AliDebug(5, Form("no end marker! %d words read", idx));
-  return -err; // only if the max length of the block reached!                       
+  return -err; // only if the max length of the block reached!
 }
 
 
@@ -1234,7 +1166,7 @@ Bool_t AliTRDtrapConfig::PrintTrapReg(TrapReg_t reg, Int_t det, Int_t rob, Int_t
   // if it is individual a valid MCM has to be specified
 
   if (fRegisterValue[reg].state == RegValue_t::kGlobal) {
-    printf("%s (%i bits) at 0x%08x is 0x%08x and resets to: 0x%08x (currently global mode)\n", 
+    printf("%10s (%2i bits) at 0x%04x is 0x%08x and resets to: 0x%08x (currently global mode)\n",
            GetRegName((TrapReg_t) reg),
            GetRegNBits((TrapReg_t) reg),
            GetRegAddress((TrapReg_t) reg),
@@ -1242,10 +1174,10 @@ Bool_t AliTRDtrapConfig::PrintTrapReg(TrapReg_t reg, Int_t det, Int_t rob, Int_t
            GetRegResetValue((TrapReg_t) reg));
   }
   else if (fRegisterValue[reg].state == RegValue_t::kIndividual) {
-    if((det >= 0 && det < AliTRDgeometry::Ndet()) && 
-       (rob >= 0 && rob < AliTRDfeeParam::GetNrobC1()) && 
+    if((det >= 0 && det < AliTRDgeometry::Ndet()) &&
+       (rob >= 0 && rob < AliTRDfeeParam::GetNrobC1()) &&
        (mcm >= 0 && mcm < fgkMaxMcm)) {
-      printf("%s (%i bits) at 0x%08x is 0x%08x and resets to: 0x%08x (currently individual mode)\n", 
+      printf("%10s (%2i bits) at 0x%04x is 0x%08x and resets to: 0x%08x (currently individual mode)\n",
              GetRegName((TrapReg_t) reg),
              GetRegNBits((TrapReg_t) reg),
              GetRegAddress((TrapReg_t) reg),
@@ -1296,15 +1228,21 @@ Bool_t AliTRDtrapConfig::AddValues(UInt_t det, UInt_t cmd, UInt_t extali, Int_t
 
   // configuration registers
   if(mcmReg >= 0 && mcmReg < kLastReg) {
-    
+
     for(Int_t linkPair=0; linkPair<fgkMaxLinkPairs; linkPair++) {
       if(AliTRDfeeParam::ExtAliToAli(extali, linkPair, rocType, mcmList, mcmListSize)!=0) {
        Int_t i=0;
         while(mcmList[i] != -1 && i<mcmListSize) {
-          if(mcmList[i]==127)
+          if(mcmList[i]==127) {
+           AliDebug(1, Form("broadcast write to %s: 0x%08x",
+                            GetRegName((TrapReg_t) mcmReg), data));
             SetTrapReg( (TrapReg_t) mcmReg, data, det);
-          else
-            SetTrapReg( (TrapReg_t) mcmReg, data, det, (mcmList[i]>>7), (mcmList[i]&0x7F));
+         }
+          else {
+           AliDebug(1, Form("individual write to %s (%i, %i): 0x%08x",
+                            GetRegName((TrapReg_t) mcmReg), (mcmList[i]>>7), (mcmList[i]&0x7F), data));
+            SetTrapReg( (TrapReg_t) mcmReg, data, det, (mcmList[i]>>7)&0x7, (mcmList[i]&0x7F));
+         }
           i++;
         }
       }
@@ -1312,7 +1250,7 @@ Bool_t AliTRDtrapConfig::AddValues(UInt_t det, UInt_t cmd, UInt_t extali, Int_t
     return kTRUE;
   }
   // DMEM
-  else if ( (addr >= fgkDmemStartAddress) && 
+  else if ( (addr >= fgkDmemStartAddress) &&
            (addr < (fgkDmemStartAddress + fgkDmemWords))) {
     for(Int_t linkPair=0; linkPair<fgkMaxLinkPairs; linkPair++) {
       if(AliTRDfeeParam::ExtAliToAli(extali, linkPair, rocType, mcmList, mcmListSize)!=0) {
@@ -1328,7 +1266,7 @@ Bool_t AliTRDtrapConfig::AddValues(UInt_t det, UInt_t cmd, UInt_t extali, Int_t
     }
     return kTRUE;
   }
-  else 
+  else
     return kFALSE;
 }
 
@@ -1383,13 +1321,13 @@ void AliTRDtrapConfig::PrintMemDatx(ostream &os, TrapReg_t reg, Int_t det, Int_t
 
 void AliTRDtrapConfig::PrintDatx(ostream &os, UInt_t addr, UInt_t data, Int_t rob, Int_t mcm) const
 {
-   os << std::setw(5) << 10 
+   os << std::setw(5) << 10
       << std::setw(8) << addr
       << std::setw(12) << data;
    if(mcm==127)
       os << std::setw(8) << 127;
    else
       os << std::setw(8) << AliTRDfeeParam::AliToExtAli(rob, mcm);
-   
+
    os << std::endl;
 }