/* $Id$ */
+//-----------------------------------------------------------------------------
/// \class AliMUONRegionalTriggerBoard
/// Dimuon regional trigger implementation:
/// - entry are local board responses
/// - algorithm is similar to the global one
///
/// \author Rachid Guernane (LPCCFd)
+/// Corrected by Christian Finck (Subatech)
+//-----------------------------------------------------------------------------
#include "AliMUONRegionalTriggerBoard.h"
#include <Riostream.h>
+/// \cond CLASSIMP
ClassImp(AliMUONRegionalTriggerBoard)
+/// \endcond
//___________________________________________
AliMUONRegionalTriggerBoard::AliMUONRegionalTriggerBoard()
+ : AliMUONTriggerBoard(),
+ fMask(0x0)
{
+/// Default constructor
for (Int_t i=0; i<16; i++) fLocalResponse[i] = 0;
}
//___________________________________________
-AliMUONRegionalTriggerBoard::AliMUONRegionalTriggerBoard(const char *name, Int_t a) : AliMUONTriggerBoard(name, a)
+AliMUONRegionalTriggerBoard::AliMUONRegionalTriggerBoard(const char *name, Int_t a)
+ : AliMUONTriggerBoard(name, a),
+ fMask(0x0)
{
+/// Standard constructor
for (Int_t i=0; i<16; i++) fLocalResponse[i] = 0;
}
+//___________________________________________
+AliMUONRegionalTriggerBoard::~AliMUONRegionalTriggerBoard()
+{
+/// Destructor
+}
+
//___________________________________________
void AliMUONRegionalTriggerBoard::Response()
{
-/*
- RESPONSE IS GIVEN FOLLOWING THE REGIONAL ALGORITHM
-*/
- Int_t t[16];
+/// response is given following the regional algorithm
+// output from local trigger algorithm
+// [+, -] * [Hpt, Lpt]
+// transformed to [+, -, US, LS] * [Hpt, Lpt]
+
+ if ( IsNull() ) return; // Do nothing if all local responses are null
- for (Int_t i=0;i<16;i++) t[i] = fLocalResponse[i] & fMask[i];
+ Int_t t[16];
+ for (Int_t i = 0; i < 16; ++i)
+ {
+ if ((fMask >> i) & 0x1)
+ t[i] = fLocalResponse[i];
+ else
+ t[i] = 0;
+ }
+
Int_t rank = 8;
- for (Int_t i=0;i<4;i++)
+ for (Int_t i = 0; i < 4; ++i)
{
Int_t ip = 0;
- for (Int_t j=0;j<rank;j++)
+ for (Int_t j = 0; j < rank; ++j)
{
UShort_t lthres = Algo(t[2*j],t[2*j+1],"LPT",i);
-
+
UShort_t hthres = Algo(t[2*j],t[2*j+1],"HPT",i); hthres <<= 4;
t[ip] = lthres | hthres;
}
//___________________________________________
-UShort_t AliMUONRegionalTriggerBoard::Algo(UShort_t i, UShort_t j, char *thres, Int_t level)
+UShort_t AliMUONRegionalTriggerBoard::Algo(UShort_t i, UShort_t j, const char *thres, Int_t level)
{
-// IMPLEMENTATION OF THE REGIONAL ALGORITHM
-// SIMILAR TO THE GLOBAL ALGORITHM EXCEPT FOR THE
-// INPUT LAYER
+/// implementation of the regional algorithm
+/// similar to the global algorithm except for the
+/// input layer
+
+/// level = 0 a ,b = local response = Hpt (+|-) | Lpt (+|-)
+/// level > 0 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);
if (!strcmp(thres,"LPT"))
{
- if (!level)
+
+ if (!level)
{
trg1[0] = a[0]; trg1[1] = a[1];
trg2[0] = b[0]; trg2[1] = b[1];
{
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];
}
}
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];
-
UShort_t rv = 0;
v.Get(&rv);
-
return rv;
}
//___________________________________________
void AliMUONRegionalTriggerBoard::Scan(Option_t*) const
{
-/*
- SCAN LOCAL BOARD ENTRIES
-*/
+/// scan local board entries
+
for (Int_t i=0; i<16; i++)
{
TBits b;
}
}
+//___________________________________________
+void AliMUONRegionalTriggerBoard::Mask(UShort_t mask)
+{
+/// mask entry index
+
+ fMask = mask;
+}
//___________________________________________
-void AliMUONRegionalTriggerBoard::Mask(Int_t index, UShort_t mask)
+Bool_t AliMUONRegionalTriggerBoard::IsNull()
{
-// MASK ENTRY index
- if ( index>=0 && index < 16 )
- {
- fMask[index]=mask;
- }
- else
- {
- AliError(Form("Index %d out of bounds (max %d)",index,16));
+ /// Check if all local response are null
+ for (Int_t i=0; i<16; i++) {
+ if ( fLocalResponse[i] ) return kFALSE;
}
+ return kTRUE;
}
-ClassImp(AliMUONRegionalTriggerBoard)
+
+//___________________________________________
+void AliMUONRegionalTriggerBoard::Reset()
+{
+ /// Reset board
+
+ for (Int_t i=0; i<16; ++i) fLocalResponse[i] = 0;
+
+ fResponse = 0;
+
+}