X-Git-Url: http://git.uio.no/git/?p=u%2Fmrichter%2FAliRoot.git;a=blobdiff_plain;f=MUON%2FAliMUONGlobalTriggerBoard.cxx;h=ba237679a1eae2bd01fe2ab7b6c128062f4e4e36;hp=e4fcb7ef0cf795278d9ccd07a3263c2f09de986e;hb=47b3bec5886d47a455e441a252f435016a2451b6;hpb=d15ca731789ea966c93b35f96fb1dd9eb80708a4 diff --git a/MUON/AliMUONGlobalTriggerBoard.cxx b/MUON/AliMUONGlobalTriggerBoard.cxx index e4fcb7ef0cf..ba237679a1e 100644 --- a/MUON/AliMUONGlobalTriggerBoard.cxx +++ b/MUON/AliMUONGlobalTriggerBoard.cxx @@ -15,35 +15,88 @@ /* $Id$ */ -//*-- Author: Rachid Guernane (LPCCFd) +//----------------------------------------------------------------------------- +/// \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 "TBits.h" #include +/// \cond CLASSIMP ClassImp(AliMUONGlobalTriggerBoard) +/// \endcond //___________________________________________ -AliMUONGlobalTriggerBoard::AliMUONGlobalTriggerBoard() +AliMUONGlobalTriggerBoard::AliMUONGlobalTriggerBoard(): AliMUONTriggerBoard() { +/// Default constructor + for (Int_t i=0;i<16;i++) fRegionalResponse[i] = 0; + for (Int_t i=0;i< 4;i++) fGlobalInput[i] = 0; + for (Int_t i=0;i< 4;i++) fMask[i] = 0xffffffff; } //___________________________________________ AliMUONGlobalTriggerBoard::AliMUONGlobalTriggerBoard(const char *name, Int_t a) : AliMUONTriggerBoard(name, a) { +/// Standard constructor + for (Int_t i=0;i<16;i++) fRegionalResponse[i] = 0; + for (Int_t i=0;i< 4;i++) fGlobalInput[i] = 0; + for (Int_t i=0;i< 4;i++) fMask[i] = 0xffffffff; +} + +//___________________________________________ +AliMUONGlobalTriggerBoard::~AliMUONGlobalTriggerBoard() +{ +/// Destructor +} + +//___________________________________________ +void AliMUONGlobalTriggerBoard::Mask(Int_t index, UInt_t mask) +{ + /// mask global trigger board input index with value mask + if ( index >= 0 && index < 4 ) + { + fMask[index]=mask; + } + else + { + AliError(Form("Index %d out of bounds (max %d)",index,3)); + } } //___________________________________________ void AliMUONGlobalTriggerBoard::Response() { + /// 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 + Int_t t[16]; - for (Int_t i=0;i<16;i++) t[i] = fRegionalResponse[i]; + BuildGlobalInput(); + MaskGlobalInput(); + for (Int_t i = 0; i < 16; ++i) + { + t[i] = fRegionalResponse[i]; + } + + Int_t rank = 8; for (Int_t i=0;i<4;i++) @@ -52,62 +105,71 @@ void AliMUONGlobalTriggerBoard::Response() for (Int_t j=0;j> 4) << (4*iReg); + } else { // left + // Lpt word + fGlobalInput[1] |= (regRespInv & 0x0F) << (4*(iReg-8)); + // Hpt word + fGlobalInput[3] |= ((regRespInv & 0xF0) >> 4) << (4*(iReg-8)); + } + + } + +} + +//___________________________________________ +void AliMUONGlobalTriggerBoard::MaskGlobalInput() +{ + /// Apply masks to global input and recalculate regional inputs before + /// applying the global response + + UInt_t gitmp[4]; + for (Int_t i = 0; i < 4; i++) { + fGlobalInput[i] &= fMask[i]; + gitmp[i] = fGlobalInput[i]; + } + + RecomputeRegional(gitmp); +} + + +//___________________________________________ +void AliMUONGlobalTriggerBoard::RecomputeRegional(UInt_t gitmp[4]) +{ + // + /// Recomput regional response from global input + // + for (Int_t iReg = 0; iReg < 16; iReg++) { + fRegionalResponse[iReg] = 0; + if (iReg < 8) { // right + // Lpt + fRegionalResponse[iReg] |= (gitmp[0] >> (4*iReg)) & 0xF; + // Hpt + fRegionalResponse[iReg] |= ((gitmp[2] >> (4*iReg)) & 0xF) << 4; + } else { // left + // Lpt + fRegionalResponse[iReg] |= (gitmp[1] >> (4*(iReg-8))) & 0xF; + // Hpt + fRegionalResponse[iReg] |= ((gitmp[3] >> (4*(iReg-8))) & 0xF) << 4; + } + + fRegionalResponse[iReg] = InvertPairBits(iReg); + } +} + +//___________________________________________ +void AliMUONGlobalTriggerBoard::Scan(Option_t*) const { - TBits w(12); w.Set(12,&fResponse); + /// print global trigger output + TBits w(7); w.Set(7,&fResponse); // TRG[1:0] // 00 noth @@ -140,59 +273,49 @@ void AliMUONGlobalTriggerBoard::Scan(Option_t*) // 10 positive track // 11 undef - Int_t iSP[3] = {0,0,0}, iSM[3] = {0,0,0}, iSU[3] = {0,0,0}; + Int_t iS[2] = {0,0}; - TBits a(2), n(2), p(2), u(2); - - UShort_t val; + iS[0] = (Int_t)w.TestBitNumber(1); + iS[1] = (Int_t)w.TestBitNumber(2); - val = 1; n.Set(2,&val); - val = 2; p.Set(2,&val); - val = 3; u.Set(2,&val); - - a[0] = w[2]; - a[1] = w[3]; - - if (a==p) iSP[0] = 1; - else if (a==n) iSM[0] = 1; - else if (a==u) iSU[0] = 1; - - a[0] = w[6]; - a[1] = w[7]; - - if (a==p) iSP[1] = 1; - else if (a==n) iSM[1] = 1; - else if (a==u) iSU[1] = 1; - - a[0] = w[10]; - a[1] = w[11]; + Int_t iPU[2] = {w[5],w[6]}; + Int_t iPL[2] = {w[3],w[4]}; - if (a==p) iSP[2] = 1; - else if (a==n) iSM[2] = 1; - else if (a==u) iSU[2] = 1; - - Int_t iPU[3] = {w[0],w[4],w[8]}; - Int_t iPL[3] = {w[1],w[5],w[9]}; - - printf("===================================================\n"); - printf(" Global Trigger output Low pt High pt All\n"); - printf(" number of Single Plus :\t"); - for (Int_t i=0; i<3; i++) printf("%i\t",iSP[i]); - printf("\n"); - printf(" number of Single Minus :\t"); - for (Int_t i=0; i<3; i++) printf("%i\t",iSM[i]); - printf("\n"); - printf(" number of Single Undefined :\t"); - for (Int_t i=0; i<3; i++) printf("%i\t",iSU[i]); + printf("============================================\n"); + printf(" Global Trigger output Low pt High pt\n"); + printf(" number of Single :\t"); + for (Int_t i=0; i<2; i++) printf("%i\t",iS[i]); printf("\n"); printf(" number of UnlikeSign pair :\t"); - for (Int_t i=0; i<3; i++) printf("%i\t",iPU[i]); + for (Int_t i=0; i<2; i++) printf("%i\t",iPU[i]); printf("\n"); printf(" number of LikeSign pair :\t"); - for (Int_t i=0; i<3; i++) printf("%i\t",iPL[i]); + for (Int_t i=0; i<2; i++) printf("%i\t",iPL[i]); printf("\n"); printf("===================================================\n"); printf("\n"); } -ClassImp(AliMUONGlobalTriggerBoard) + +//___________________________________________ +UShort_t AliMUONGlobalTriggerBoard::InvertPairBits(Int_t iReg) +{ + // + /// invert "pair" bits in regional response + /// [+, -, US, LS] becomes [+, -, LS, US] + // + TBits rs(8), rsi(8); + rs.Set(8,&fRegionalResponse[iReg]); + for (Int_t i = 0; i < 4; i++) { + if (i%2 == 0) { + rsi[2*i] = rs[2*i+1]; + rsi[2*i+1] = rs[2*i]; + } else { + rsi[2*i] = rs[2*i]; + rsi[2*i+1] = rs[2*i+1]; + } + } + UShort_t regRespInv = 0; + rsi.Get(®RespInv); + return regRespInv; +}