]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - MUON/AliMUONGlobalTriggerBoard.cxx
Bug fix (introduced by last commit, sorry about that...)
[u/mrichter/AliRoot.git] / MUON / AliMUONGlobalTriggerBoard.cxx
index 050574760d6866d68b84ecee279725c4e65559ad..f91976789ae3952d8392d41a3c02a67292605e97 100644 (file)
 
 /* $Id$ */
 
-//*-- Author: Rachid Guernane (LPCCFd)
-//    GLOBAL TRIGGER IMPLEMENTATION
-//    INPUTS ARE REGIONAL RESPONSES
-//    OUTPUT IS A 12-BIT WORD
-//    4 BITS PER TRIGGER LEVEL
+//-----------------------------------------------------------------------------
+/// \class AliMUONGlobalTriggerBoard
+/// Global trigger implementation:
+/// - inputs are regional responses
+/// - output is a 12-bit word
+/// - 4 bits per trigger level
+///
+/// \author Rachid Guernane (LPCCFd), 
+/// Corrected by Christian Finck (Subatech)
+//-----------------------------------------------------------------------------
 
 #include "AliMUONGlobalTriggerBoard.h"
 #include "AliLog.h"
 
 #include <Riostream.h>
 
+/// \cond CLASSIMP
 ClassImp(AliMUONGlobalTriggerBoard)
+/// \endcond
 
 //___________________________________________
-AliMUONGlobalTriggerBoard::AliMUONGlobalTriggerBoard()
+AliMUONGlobalTriggerBoard::AliMUONGlobalTriggerBoard(): AliMUONTriggerBoard()
 {
+/// Default constructor
+
    for (Int_t i=0;i<16;i++) fRegionalResponse[i] = 0;
 }
 
 //___________________________________________
 AliMUONGlobalTriggerBoard::AliMUONGlobalTriggerBoard(const char *name, Int_t a) : AliMUONTriggerBoard(name, a)
 {
+/// Standard constructor
+
    for (Int_t i=0;i<16;i++) fRegionalResponse[i] = 0;
 }
 
+//___________________________________________
+AliMUONGlobalTriggerBoard::~AliMUONGlobalTriggerBoard()
+{
+/// Destructor
+}
+
 //___________________________________________
 void AliMUONGlobalTriggerBoard::Mask(Int_t index, UShort_t mask)
 {
-  // MASK GLOBAL TRIGGER BOARD INPUT index WITH VALUE mask
-  if ( index>=0 && index < 16 ) 
+  /// mask global trigger board input index with value mask
+  if ( index>=0 && index < 2 ) 
   {
     fMask[index]=mask;
   }
   else
   {
-    AliError(Form("Index %d out of bounds (max %d)",index,16));
+    AliError(Form("Index %d out of bounds (max %d)",index,2));
   }  
 }
 
 //___________________________________________
 void AliMUONGlobalTriggerBoard::Response()
 {
-   // COMPUTE THE GLOBAL TRIGGER BOARD
-   // RESPONSE ACCORDING TO THE Algo() METHOD
-   Int_t t[16];
+   /// compute the global trigger board
+   /// response according to the algo() method
+// output from global trigger algorithm
+// [+, -, US, LS] * [Hpt, Lpt]
+// transformed to [usHpt, usLpt, lsHpt, lsLpt, sHpt, sLpt] according
+// to Global Trigger Unit user manual
 
-   for (Int_t i=0;i<16;i++) t[i] = fRegionalResponse[i] & fMask[i];
+   Int_t t[16];
 
+   for (Int_t i = 0; i < 16; ++i) 
+   {
+     Int_t index = i/8;
+     Int_t shift = i % 8;
+     UShort_t enable = !((fMask[index] >> shift) & 0x1);
+     if (enable)
+      t[i] = fRegionalResponse[i];
+     else
+       t[i] = 0;
+   }
+   
+   
    Int_t rank = 8;
 
    for (Int_t i=0;i<4;i++)
@@ -83,14 +115,35 @@ void AliMUONGlobalTriggerBoard::Response()
       
       rank /= 2; 
    }
+   UChar_t sLpt, sHpt, lsLpt, lsHpt, usLpt, usHpt;
+   sLpt  = ((t[0] & 0xC)  != 0);
+   sHpt  = ((t[0] & 0xC0) != 0);
+   //lsLpt = ((t[0] & 0x2)  != 0);
+   lsLpt = ((t[0] & 0x1)  != 0);
+   //lsHpt = ((t[0] & 0x20) != 0);
+   lsHpt = ((t[0] & 0x10) != 0);
+   //usLpt = ((t[0] & 0x1 ) != 0);
+   usLpt = ((t[0] & 0x2 ) != 0);
+   //usHpt = ((t[0] & 0x10) != 0);
+   usHpt = ((t[0] & 0x20) != 0);
+
+   sHpt  <<= 1;
+   lsLpt <<= 2;
+   lsHpt <<= 3;
+   usLpt <<= 4;
+   usHpt <<= 5;
+
+   fResponse = sLpt | sHpt | lsLpt | lsHpt | usLpt |usHpt;
+   
 
-   fResponse = t[0]; // 8-bit [H4:L4]
 }
 
 //___________________________________________
 UShort_t AliMUONGlobalTriggerBoard::Algo(UShort_t i, UShort_t j, char *thres)
 {
-   // GLOBAL TRIGGER ALGORITHM
+/// global trigger algorithm
+///   a ,b = reg  response  =  Hpt (+|-|us|ls) |  Lpt (+|-|us|ls)  
+                           
    TBits a(8), b(8); a.Set(8,&i); b.Set(8,&j);
 
    TBits trg1(2), trg2(2), trg(2);
@@ -110,13 +163,17 @@ UShort_t AliMUONGlobalTriggerBoard::Algo(UShort_t i, UShort_t j, char *thres)
 
    if (!strcmp(thres,"LPT"))
    {
-      trgLS1[0] = a[1]; trgUS1[0] = a[0]; 
-      trgLS2[0] = b[1]; trgUS2[0] = b[0];
+      //trgLS1[0] = a[1]; trgUS1[0] = a[0]; 
+      //trgLS2[0] = b[1]; trgUS2[0] = b[0];
+      trgLS1[0] = a[0]; trgUS1[0] = a[1]; 
+      trgLS2[0] = b[0]; trgUS2[0] = b[1];
    }
    else
    {
-      trgLS1[0] = a[5]; trgUS1[0] = a[4]; 
-      trgLS2[0] = b[5]; trgUS2[0] = b[4];         
+      //trgLS1[0] = a[5]; trgUS1[0] = a[4]; 
+      //trgLS2[0] = b[5]; trgUS2[0] = b[4];         
+      trgLS1[0] = a[4]; trgUS1[0] = a[5]; 
+      trgLS2[0] = b[4]; trgUS2[0] = b[5];         
    }
 
    trgLS[0] = ( trg1[0] & trg2[0] ) | ( trg1[1] & trg2[1] ) | trgLS1[0] | trgLS2[0];
@@ -127,8 +184,10 @@ UShort_t AliMUONGlobalTriggerBoard::Algo(UShort_t i, UShort_t j, char *thres)
    
    TBits v(4);
    
-   v[0] = trgUS[0];
-   v[1] = trgLS[0];
+   //v[0] = trgUS[0];
+   //v[1] = trgLS[0];
+   v[0] = trgLS[0];
+   v[1] = trgUS[0];
    v[2] = trg[0];
    v[3] = trg[1];
 
@@ -141,7 +200,7 @@ UShort_t AliMUONGlobalTriggerBoard::Algo(UShort_t i, UShort_t j, char *thres)
 //___________________________________________
 void AliMUONGlobalTriggerBoard::Scan(Option_t*) const
 {
-  // PRINT GLOBAL TRIGGER OUTPUT 
+  /// print global trigger output 
   TBits w(8); w.Set(8,&fResponse);
 
 // TRG[1:0]
@@ -198,4 +257,3 @@ void AliMUONGlobalTriggerBoard::Scan(Option_t*) const
    printf("\n");
 }
 
-ClassImp(AliMUONGlobalTriggerBoard)