// Implementation of local trigger board objects
// A local trigger board has as input a bit pattern and returns
// the local trigger response after comparison w/ a LUT
-//
//*-- Author: Rachid Guernane (LPCCFd)
+//*
+//*
#include "AliMUONLocalTriggerBoard.h"
#include "AliMUONTriggerLut.h"
-#include "AliMUONTriggerConstants.h"
+
#include "AliLog.h"
#include <TBits.h>
-
#include <Riostream.h>
+const Int_t AliMUONLocalTriggerBoard::fgkCircuitId[234] =
+{
+ 111, 121, 131, 141, 151, 161, 171,
+ 211, 212, 221, 222, 231, 232, 241, 242, 251, 252, 261, 262, 271,
+ 311, 312, 321, 322, 331, 332, 341, 342, 351, 352, 361, 362, 371,
+ 411, 412, 413, 421, 422, 423, 424, 431, 432, 433, 434, 441, 442, 451, 452, 461, 462, 471,
+ 521, 522, 523, 524, 531, 532, 533, 534, 541, 542, 551, 552, 561, 562, 571,
+ 611, 612, 613, 621, 622, 623, 624, 631, 632, 633, 634, 641, 642, 651, 652, 661, 662, 671,
+ 711, 712, 721, 722, 731, 732, 741, 742, 751, 752, 761, 762, 771,
+ 811, 812, 821, 822, 831, 832, 841, 842, 851, 852, 861, 862, 871,
+ 911, 921, 931, 941, 951, 961, 971,
+ -111, -121, -131, -141, -151, -161, -171,
+ -211, -212, -221, -222, -231, -232, -241, -242, -251, -252, -261, -262, -271,
+ -311, -312, -321, -322, -331, -332, -341, -342, -351, -352, -361, -362, -371,
+ -411, -412, -413, -421, -422, -423, -424, -431, -432, -433, -434, -441, -442, -451, -452, -461, -462, -471,
+ -521, -522, -523, -524, -531, -532, -533, -534, -541, -542, -551, -552, -561, -562, -571,
+ -611, -612, -613, -621, -622, -623, -624, -631, -632, -633, -634, -641, -642, -651, -652, -661, -662, -671,
+ -711, -712, -721, -722, -731, -732, -741, -742, -751, -752, -761, -762, -771,
+ -811, -812, -821, -822, -831, -832, -841, -842, -851, -852, -861, -862, -871,
+ -911, -921, -931, -941, -951, -961, -971
+};
+
//___________________________________________
AliMUONLocalTriggerBoard::AliMUONLocalTriggerBoard()
+ : AliMUONTriggerBoard(),
+ fNumber(0),
+ fCrate(0),
+ fTC(kTRUE),
+ fStripX11(0),
+ fStripY11(0),
+ fDev(0),
+ fOutput(0),
+ fLUT(0x0),
+ fCoinc44(0)
{
- fNumber = 0;
+//* constructor
+//*
for (Int_t i=0; i<2; i++)
for (Int_t j=0; j<4; j++)
for (Int_t i=0; i<10; i++) fSwitch[i] = 0;
- fTC = kTRUE;
-
- fLUT = 0x0;
-
for (Int_t i=0; i<5; i++) fMinDevStrip[i] = fMinDev[i] = fCoordY[i] = 0;
- fOutput = 0;
-
- fStripX11 = fStripY11 = fDev = 0;
-
- for (Int_t i=0; i<2; i++) fLutLpt[i] = fLutHpt[i] = fLutApt[i] = 0;
+ for (Int_t i=0; i<2; i++) fLutLpt[i] = fLutHpt[i] = 0;
}
//___________________________________________
-AliMUONLocalTriggerBoard::AliMUONLocalTriggerBoard(const char *name, Int_t a) : AliMUONTriggerBoard(name, a)
+AliMUONLocalTriggerBoard::AliMUONLocalTriggerBoard(const char *name, Int_t a,
+ AliMUONTriggerLut* lut)
+ : AliMUONTriggerBoard(name, a),
+ fNumber(0),
+ fCrate(0),
+ fTC(kTRUE),
+ fStripX11(0),
+ fStripY11(0),
+ fDev(0),
+ fOutput(0),
+ fLUT(lut),
+ fCoinc44(0)
{
- fNumber = 0;
+//* constructor
+//*
for (Int_t i=0; i<2; i++)
for (Int_t j=0; j<4; j++)
for (Int_t i=0; i<10; i++) fSwitch[i] = 0;
- fTC = kTRUE;
-
- fLUT = new AliMUONTriggerLut();
-
for (Int_t i=0; i<5; i++) fMinDevStrip[i] = fMinDev[i] = fCoordY[i] = 0;
- fOutput = 0;
-
- fStripX11 = fStripY11 = fDev = 0;
+ for (Int_t i=0; i<2; i++) fLutLpt[i] = fLutHpt[i] = 0;
+}
- for (Int_t i=0; i<2; i++) fLutLpt[i] = fLutHpt[i] = fLutApt[i] = 0;
+//______________________________________________________________________________
+AliMUONLocalTriggerBoard::AliMUONLocalTriggerBoard(const AliMUONLocalTriggerBoard& right)
+ : AliMUONTriggerBoard(right),
+ fNumber(right.fNumber),
+ fCrate(right.fCrate),
+ fTC(right.fTC),
+ fStripX11(right.fStripX11),
+ fStripY11(right.fStripY11),
+ fDev(right.fDev),
+ fOutput(right.fOutput),
+ fLUT(right.fLUT),
+ fCoinc44(right.fCoinc44)
+{
+/// Protected copy constructor (not implemented)
+
+ AliFatal("Copy constructor not provided.");
}
+//______________________________________________________________________________
+AliMUONLocalTriggerBoard&
+AliMUONLocalTriggerBoard::operator=(const AliMUONLocalTriggerBoard& right)
+{
+/// Protected assignement operator (not implemented)
+
+ // check assignement to self
+ if (this == &right) return *this;
+
+ AliFatal("Assignement operator not provided.");
+
+ return *this;
+}
+
//___________________________________________
void AliMUONLocalTriggerBoard::Reset()
{
+//* reset board
+//*
for (Int_t i=0; i<2; i++)
for (Int_t j=0; j<4; j++)
fXY[i][j] = fXYU[i][j] = fXYD[i][j] = 0;
fStripX11 = fStripY11 = fDev = 0;
- for (Int_t i=0; i<2; i++) fLutLpt[i] = fLutHpt[i] = fLutApt[i] = 0;
+ for (Int_t i=0; i<2; i++) fLutLpt[i] = fLutHpt[i] = 0;
}
//___________________________________________
}
//___________________________________________
-void AliMUONLocalTriggerBoard::Pattern(Option_t *option)
+void AliMUONLocalTriggerBoard::SetbitM(Int_t strip, Int_t cathode, Int_t chamber)
+{
+// 0 .. LBS : N-1 .. MSB
+ TBits w, m;
+
+ UShort_t xy = fXY[cathode][chamber], mask = fMask[cathode][chamber];
+
+ w.Set(16,&xy);
+ m.Set(16,&mask);
+
+ w.SetBitNumber(strip);
+
+ w &= m;
+
+ UShort_t value;
+
+ w.Get(&value);
+
+ fXY[cathode][chamber] = value;
+}
+
+//___________________________________________
+void AliMUONLocalTriggerBoard::Pattern(Option_t *option) const
{
+//* print bit pattern
+//*
TString op = option;
if (op.Contains("X")) BP("X");
//___________________________________________
-void AliMUONLocalTriggerBoard::BP(Option_t *option)
+void AliMUONLocalTriggerBoard::BP(Option_t *option) const
{
// RESPECT THE OLD PRINTOUT FORMAT
+
+ const Int_t kModuleId[126] =
+ {11,12,13,14,15,16,17, // right side of the chamber
+ 21,22,23,24,25,26,27,
+ 31,32,33,34,35,36,37,
+ 41,42,43,44,45,46,47,
+ 51,52,53,54,55,56,57,
+ 61,62,63,64,65,66,67,
+ 71,72,73,74,75,76,77,
+ 81,82,83,84,85,86,87,
+ 91,92,93,94,95,96,97,
+ -11,-12,-13,-14,-15,-16,-17, // right side of chamber
+ -21,-22,-23,-24,-25,-26,-27,
+ -31,-32,-33,-34,-35,-36,-37,
+ -41,-42,-43,-44,-45,-46,-47,
+ -51,-52,-53,-54,-55,-56,-57,
+ -61,-62,-63,-64,-65,-66,-67,
+ -71,-72,-73,-74,-75,-76,-77,
+ -81,-82,-83,-84,-85,-86,-87,
+ -91,-92,-93,-94,-95,-96,-97};
+
+ const Int_t kNstripY[126]=
+ { 8, 8, 8, 8, 8, 8,16, // right side of the chamber
+ 8, 8, 8, 8, 8, 8,16,
+ 16,16,16,16,16, 8,16,
+ 16,16,16,16,16, 8,16,
+ 0, 8,16,16,16, 8,16,
+ 16,16,16,16,16, 8,16,
+ 16,16,16,16,16, 8,16,
+ 8, 8, 8, 8, 8, 8,16,
+ 8, 8, 8, 8, 8, 8,16,
+ 8, 8, 8, 8, 8, 8,16, // left side of the chamber
+ 8, 8, 8, 8, 8, 8,16,
+ 16,16,16,16,16, 8,16,
+ 16,16,16,16,16, 8,16,
+ 0, 8,16,16,16, 8,16,
+ 16,16,16,16,16, 8,16,
+ 16,16,16,16,16, 8,16,
+ 8, 8, 8, 8, 8, 8,16,
+ 8, 8, 8, 8, 8, 8,16};
TString op = option;
+
+ TString nn = GetName();
if (op.Contains("X"))
{
/* OLD NUMBERING STYLE */
/**/
- Int_t absidModule=TMath::Abs(Int_t(GetI()/10));
+ Int_t idCircuit = 0, absidModule = 0;
+
+ if (!(nn.Contains("Int")))
+ {
+ idCircuit = fgkCircuitId[GetI()];
+ absidModule = TMath::Abs(Int_t(idCircuit/10));
+ }
+
Int_t iModule=0;
+
for (Int_t i=0; i<63; i++)
{
- if (AliMUONTriggerConstants::ModuleId(i)==absidModule)
+ if (kModuleId[i]==absidModule)
{
iModule=i;
break;
}
}
- Int_t nStrip = AliMUONTriggerConstants::NstripY(iModule);
+ Int_t nStrip = kNstripY[iModule];
for (Int_t istrip=nStrip-1; istrip>=0; istrip--) {
if (istrip>9) printf("%i",istrip-10*Int_t(istrip/10));
if (istrip<10) printf("%i",istrip);
cout << v22 << endl;
}
- Int_t idCircuit = AliMUONTriggerConstants::CircuitId(GetI());
-
// tmp
printf("---------------------------------------------------------------");
printf("\n upper part of circuit %i",idCircuit);
}
//___________________________________________
-void AliMUONLocalTriggerBoard::Conf()
+void AliMUONLocalTriggerBoard::Conf() const
{
+//* board switches
+//*
cout << "Switch(" << GetName() << ")"
<< " x2d = " << fSwitch[0]
<< " x2m = " << fSwitch[1]
//___________________________________________
void AliMUONLocalTriggerBoard::Module(char *mod)
{
- const Int_t maxfields = 2; char **fields = new char*[maxfields];
+//* get module from name
+//*
+ const Int_t kMaxfields = 2; char **fields = new char*[kMaxfields];
char s[100]; strcpy(s, GetName());
}
//___________________________________________
-void AliMUONLocalTriggerBoard::TrigX(Int_t ch1q[16], Int_t ch2q[16], Int_t ch3q[32], Int_t ch4q[32],
- Int_t coinc44)
+void AliMUONLocalTriggerBoard::TrigX(Int_t ch1q[16], Int_t ch2q[16], Int_t ch3q[32], Int_t ch4q[32])
{
// note : coinc44 = flag 0 or 1 (0 coincidence -> 3/4, 1 coincidence -> 4/4)
//---------------------------------------------------------
!dbleHit1[14] & !dbleHit1[13] & !dbleHit1[12] & !dbleHit1[11] &
!dbleHit1[10] & !dbleHit1[9] & !dbleHit1[8] & !dbleHit1[7] &
!dbleHit1[6] & !dbleHit1[5] & !dbleHit1[4] & !dbleHit1[3] &
- !dbleHit1[2] & !dbleHit1[1] & !dbleHit1[0] & !coinc44;
+ !dbleHit1[2] & !dbleHit1[1] & !dbleHit1[0] & !fCoinc44;
Int_t notOr2= !dbleHit2[62] & !dbleHit2[61] & !dbleHit2[60] & !dbleHit2[59] &
!dbleHit2[58] & !dbleHit2[57] & !dbleHit2[56] & !dbleHit2[55] &
!dbleHit2[14] & !dbleHit2[13] & !dbleHit2[12] & !dbleHit2[11] &
!dbleHit2[10] & !dbleHit2[9] & !dbleHit2[8] & !dbleHit2[7] &
!dbleHit2[6] & !dbleHit2[5] & !dbleHit2[4] & !dbleHit2[3] &
- !dbleHit2[2] & !dbleHit2[1] & !dbleHit2[0] & !coinc44;
+ !dbleHit2[2] & !dbleHit2[1] & !dbleHit2[0] & !fCoinc44;
// DS reduction
for (i=0; i<31; i++) {
//___________________________________________
void AliMUONLocalTriggerBoard::TrigY(Int_t y1[16], Int_t y2[16], Int_t y3[16], Int_t y4[16],
- Int_t y3u[16], Int_t y3d[16], Int_t y4u[16], Int_t y4d[16],
- Int_t coinc44)
+ Int_t y3u[16], Int_t y3d[16], Int_t y4u[16], Int_t y4d[16])
{
// note : resMid = 1 -> cancel
//---------------------------------------------------------
}
if (fSwitch[3]==0&&fSwitch[4]==1){
for (i=0; i<16; i++){
- ch3[i] = tmpy3uto16[i]|tmpy3to16[i];
- ch4[i] = tmpy4uto16[i]|tmpy4to16[i];
+ ch3[i] = tmpy3dto16[i]|tmpy3to16[i];
+ ch4[i] = tmpy4dto16[i]|tmpy4to16[i];
}
}
if (fSwitch[3]==1&&fSwitch[4]==0){
for (i=0; i<16; i++){
- ch3[i] = tmpy3dto16[i]|tmpy3to16[i];
- ch4[i] = tmpy4dto16[i]|tmpy4to16[i];
+ ch3[i] = tmpy3uto16[i]|tmpy3to16[i];
+ ch4[i] = tmpy4uto16[i]|tmpy4to16[i];
}
}
if (fSwitch[3]==1&&fSwitch[4]==1){
!dble2[3] & !dble2[2] & !dble2[1] & !dble2[0];
for (i=0; i<16; i++) {
- sgle1[i] = sgle1[i] & notOr1 & !coinc44;
- sgle2[i] = sgle2[i] & notOr2 & !coinc44;
+ sgle1[i] = sgle1[i] & notOr1 & !fCoinc44;
+ sgle2[i] = sgle2[i] & notOr2 & !fCoinc44;
}
//---------------------------------------------------------
//___________________________________________
void AliMUONLocalTriggerBoard::LocalTrigger()
{
- Int_t deviation=0, iStripY=0;
+//* L0 trigger after LUT
+//*
+ Int_t deviation=0, iStripY=0, iStripX=0;
for (Int_t i=0; i<4; i++) deviation += static_cast<int>( fMinDev[i] << i );
for (Int_t i=0; i<4; i++) iStripY += static_cast<int>( fCoordY[i] << i );
if (fOutput)
{
- for (Int_t i=0; i<5; i++) fStripX11 += static_cast<int>( fMinDevStrip[i] << i );
+ for (Int_t i=0; i<5; i++) iStripX += static_cast<int>( fMinDevStrip[i] << i );
fDev = deviation;
- fStripY11 = iStripY / 2;
+ fStripY11 = iStripY;
+ fStripX11 = iStripX;
Int_t sign = 0;
if ( !fMinDev[4] && deviation ) sign=-1;
if ( !fMinDev[4] && !deviation ) sign= 0;
- if ( fMinDev[4]==1) sign=+1;
+ if ( fMinDev[4] == 1 ) sign=+1;
fDev *= sign;
// calculate deviation in [0;+30]
fDev += 15;
- Int_t icirc = GetI();
-
-// get Lut output for circuit/istripX/idev/istripY
- fLUT->GetLutOutput(icirc, fStripX11, fDev, fStripY11, fLutLpt, fLutHpt, fLutApt);
+// GET LUT OUTPUT FOR icirc/istripX1/deviation/istripY
+ fLUT->GetLutOutput(fNumber, fStripX11, fDev, fStripY11, fLutLpt, fLutHpt);
}
}
//___________________________________________
-Int_t AliMUONLocalTriggerBoard::GetI()
+Int_t AliMUONLocalTriggerBoard::GetI() const
{
- const Int_t maxfields = 2; char **fields = new char*[maxfields];
+//* old numbering
+//*
+ const Int_t kMaxfields = 2; char **fields = new char*[kMaxfields];
char s[100]; strcpy(s, GetName());
char copy = l[0];
- Int_t L = atoi(&l[4]), C = atoi(&l[2]), S = (copy=='R') ? +1 : -1;
+ Int_t lL = atoi(&l[4]), cC = atoi(&l[2]), sS = (copy=='R') ? +1 : -1;
char *b[4] = {"12", "34", "56", "78"};
for (Int_t i=0; i<4; i++) if (!strcmp(fields[1],b[i])) {ib = i; break;} ib++;
-// L=1 ON TOP
- L -= 9; L = abs(L); L++;
+// lL=1 ON TOP
+ lL -= 9; lL = abs(lL); lL++;
- Int_t code = 100 * L + 10 * C + ib;
+ Int_t code = 100 * lL + 10 * cC + ib;
- code *= S;
+ code *= sS;
Int_t ic = 0;
- for (Int_t i=0; i<234; i++) if (AliMUONTriggerConstants::CircuitId(i) == code) {ic = i; break;}
+ for (Int_t i=0; i<234; i++) if (fgkCircuitId[i] == code) {ic = i; break;}
return ic;
}
//___________________________________________
-void AliMUONLocalTriggerBoard::Mask(UShort_t M[2][4])
+void AliMUONLocalTriggerBoard::Mask(Int_t index, UShort_t mask)
{
- for (Int_t i=0; i<2; i++)
- for (Int_t j=0; j<4; j++)
- fMask[i][j] = M[i][j];
+//* set mask
+//*
+ if ( index >= 0 && index < 2*4 )
+ {
+ Int_t i = index/4;
+ Int_t j = index - i*4;
+ fMask[i][j]=mask;
+ }
+ else
+ {
+ AliError(Form("Index %d out of bounds (max %d)",index,8));
+ }
}
//___________________________________________
-void AliMUONLocalTriggerBoard::Scan(Option_t *option)
+void AliMUONLocalTriggerBoard::Scan(Option_t *option) const
{
+//* full dump
+//*
TString op = option;
if (op.Contains("CONF")) Conf();
- if (op.Contains("BITP")) Pattern("X Y");
+ if (op.Contains("BITP")) Pattern();
if (op.Contains("RESPI")) Resp("I");
}
//___________________________________________
-void AliMUONLocalTriggerBoard::Resp(Option_t *option)
+void AliMUONLocalTriggerBoard::Resp(Option_t *option) const
{
+//* board I/O
+//*
TString op = option;
if (op.Contains("I"))
if (op.Contains("F"))
{
Int_t icirc = GetI();
- Int_t idCircuit = AliMUONTriggerConstants::CircuitId(icirc);
+ Int_t idCircuit = fgkCircuitId[icirc];
Int_t deviation = 0, iStripY = 0;
for (Int_t i=0; i<4; i++) deviation += Int_t(fMinDev[i]<<i);
Float_t pt = 0.; //triggerCircuit->PtCal(fStripX11, fDev, fStripY11);
- printf("-------------------------------------------\n");
+ printf("-------------------------------------\n");
printf(" Local Trigger info for circuit Id %i (number %i ) \n", idCircuit, icirc);
printf(" istripX1 signDev deviation istripY = %i %i %i %i \n", fStripX11, fMinDev[4], deviation, iStripY);
printf(" pt = %f (GeV/c) \n", pt);
- printf("-------------------------------------------\n");
+ printf("-------------------------------------\n");
printf(" Local Trigger Lut Output = Lpt : ");
for (Int_t i=1; i>=0; i--) printf("%i", fLutLpt[i]);
printf(" Hpt : ");
for (Int_t i=1; i>=0; i--) printf("%i", fLutHpt[i]);
- printf(" Apt : ");
- for (Int_t i=1; i>=0; i--) printf("%i", fLutApt[i]);
printf("\n");
- printf("-------------------------------------------\n");
+ printf("-------------------------------------\n");
}
-// else
-// {
-
-// }
-}
-
-//___________________________________________
-void AliMUONLocalTriggerBoard::Mask(char *chan, UShort_t M)
-{
- char *cath[2] = {"X", "Y"};
-
- char *cham[4] = {"1", "2", "3", "4"};
-
- for (Int_t i=0; i<2; i++)
- for (Int_t j=0; j<4; j++)
- {
- strcat(cath[i],cham[j]);
-
- if (!strcmp(cath[i],chan)) fMask[i][j] = M;
- }
}
//___________________________________________
void AliMUONLocalTriggerBoard::Response()
{
- Int_t X1[16], X2[16], XX3[32], XX4[32];
+//* algo
+//*
+ Int_t xX1[16], xX2[16], xXX3[32], xXX4[32];
TBits x1(16), x2(16), x3(16), x4(16);
for (Int_t i=0;i<16;i++)
{
- X1[i] = x1[i];
- X2[i] = x2[i];
+ xX1[i] = x1[i];
+ xX2[i] = x2[i];
- XX3[i+8] = x3[i];
- XX4[i+8] = x4[i];
+ xXX3[i+8] = x3[i];
+ xXX4[i+8] = x4[i];
}
for (Int_t i=0;i<8;i++)
{
- XX3[i] = x3d[i+8];
- XX4[i] = x4d[i+8];
+ xXX3[i] = x3d[i+8];
+ xXX4[i] = x4d[i+8];
- XX3[i+24] = x3u[i];
- XX4[i+24] = x4u[i];
+ xXX3[i+24] = x3u[i];
+ xXX4[i+24] = x4u[i];
}
- Int_t coinc44 = 0;
+// Int_t coinc44 = 0;
- TrigX(X1, X2, XX3, XX4, coinc44);
+ TrigX(xX1, xX2, xXX3, xXX4);
- Int_t Y1[16], Y2[16], Y3[16], Y4[16];
+ Int_t yY1[16], yY2[16], yY3[16], yY4[16];
- Int_t Y3U[16], Y3D[16], Y4U[16], Y4D[16];
+ Int_t yY3U[16], yY3D[16], yY4U[16], yY4D[16];
TBits y1(16), y2(16), y3(16), y4(16);
for (Int_t i=0;i<16;i++)
{
- Y1[i] = y1[i];
- Y2[i] = y2[i];
- Y3[i] = y3[i];
- Y4[i] = y4[i];
+ yY1[i] = y1[i];
+ yY2[i] = y2[i];
+ yY3[i] = y3[i];
+ yY4[i] = y4[i];
- Y3U[i] = y3u[i];
- Y3D[i] = y3d[i];
+ yY3U[i] = y3u[i];
+ yY3D[i] = y3d[i];
- Y4U[i] = y4u[i];
- Y4D[i] = y4d[i];
+ yY4U[i] = y4u[i];
+ yY4D[i] = y4d[i];
}
- TrigY(Y1, Y2, Y3, Y4, Y3U, Y3D, Y4U, Y4D, coinc44);
+ TrigY(yY1, yY2, yY3, yY4, yY3U, yY3D, yY4U, yY4D);
-// ASIGN fLutLpt, fLutHpt, fLutApt
+// ASIGN fLutLpt, fLutHpt
LocalTrigger();
- fResponse = fLutApt[0] +
- static_cast<int>(fLutApt[1]<<1) +
- static_cast<int>(fLutLpt[0]<<2) +
- static_cast<int>(fLutLpt[1]<<3) +
- static_cast<int>(fLutHpt[0]<<4) +
- static_cast<int>(fLutHpt[1]<<5);
+ fResponse = fLutLpt[0] +
+ static_cast<int>(fLutLpt[1]<<1) +
+ static_cast<int>(fLutHpt[0]<<2) +
+ static_cast<int>(fLutHpt[1]<<3);
}
ClassImp(AliMUONLocalTriggerBoard)