/* $Id$ */
+//-----------------------------------------------------------------------------
/// \class AliMUONLocalTriggerBoard
/// A local trigger board has as input a bit pattern and returns
/// the local trigger response after comparison w/ a LUT
/// \todo Change member functions comments in capital letters to normal text
///
/// \author Rachid Guernane (LPCCFd)
+//-----------------------------------------------------------------------------
+#include <cstdlib>
#include "AliMUONLocalTriggerBoard.h"
#include "AliMUONTriggerLut.h"
#include <TBits.h>
#include <Riostream.h>
+using std::endl;
+using std::cout;
/// \cond CLASSIMP
ClassImp(AliMUONLocalTriggerBoard)
/// \endcond
//___________________________________________
AliMUONLocalTriggerBoard::AliMUONLocalTriggerBoard()
: AliMUONTriggerBoard(),
- fNumber(0),
- fCrate(0),
- fTC(kTRUE),
+ fMpLocalBoard(0x0),
fStripX11(0),
fStripY11(15),
fDev(0),
fTrigY(1),
fOutput(0),
fLUT(0x0),
- fCoinc44(0)
+ fCoinc44(0)
{
-/// Default constructor
+/// default constructor
///
-
+
for (Int_t i=0; i<2; i++)
for (Int_t j=0; j<4; j++)
{
fMask[i][j] = 0xFFFF;
}
- for (Int_t i=0; i<10; i++) fSwitch[i] = 0;
-
for (Int_t i=0; i<5; i++) fMinDevStrip[i] = fMinDev[i] = fCoordY[i] = 0;
for (Int_t i=0; i<2; i++) fLutLpt[i] = fLutHpt[i] = 0;
}
//___________________________________________
-AliMUONLocalTriggerBoard::AliMUONLocalTriggerBoard(const char *name, Int_t a,
- AliMUONTriggerLut* lut)
- : AliMUONTriggerBoard(name, a),
- fNumber(0),
- fCrate(0),
- fTC(kTRUE),
+AliMUONLocalTriggerBoard::AliMUONLocalTriggerBoard(AliMpLocalBoard* mpLocalBoard)
+ : AliMUONTriggerBoard(mpLocalBoard->GetName(), mpLocalBoard->GetSlot()),
+ fMpLocalBoard(mpLocalBoard),
fStripX11(0),
fStripY11(15),
fDev(0),
fTrigY(1),
fOutput(0),
- fLUT(lut),
+ fLUT(0x0),
fCoinc44(0)
{
/// Standard constructor
fMask[i][j] = 0xFFFF;
}
- for (Int_t i=0; i<10; i++) fSwitch[i] = 0;
-
for (Int_t i=0; i<5; i++) fMinDevStrip[i] = fMinDev[i] = fCoordY[i] = 0;
for (Int_t i=0; i<2; i++) fLutLpt[i] = fLutHpt[i] = 0;
}
+//___________________________________________
+AliMUONLocalTriggerBoard::AliMUONLocalTriggerBoard(const AliMUONLocalTriggerBoard& right) :
+ AliMUONTriggerBoard(right),
+ fMpLocalBoard(right.fMpLocalBoard),
+ fStripX11(right.fStripX11),
+ fStripY11(right.fStripY11),
+ fDev(right.fDev),
+ fTrigY(right.fTrigY),
+ fOutput(right.fOutput),
+ fLUT(right.fLUT),
+ fCoinc44(right.fCoinc44)
+{
+ //
+ /// Copy constructor
+ //
+ for (Int_t i=0; i<2; i++) {
+ for (Int_t j=0; j<4; j++) {
+ fXY[i][j] = right.fXY[i][j];
+ fXYU[i][j] = right.fXYU[i][j];
+ fXYD[i][j] = right.fXYD[i][j];
+
+ fMask[i][j] = right.fMask[i][j];
+ }
+ }
+
+ for (Int_t i=0; i<2; i++) {
+ fLutLpt[i] = right.fLutLpt[i];
+ fLutHpt[i] = right.fLutHpt[i];
+ }
+
+ for (Int_t i=0; i<5; i++) {
+ fMinDevStrip[i] = right.fMinDevStrip[i];
+ fMinDev[i] = right.fMinDev[i];
+ fCoordY[i] = right.fCoordY[i];
+ }
+}
+
+//___________________________________________
+AliMUONLocalTriggerBoard& AliMUONLocalTriggerBoard::operator=(const AliMUONLocalTriggerBoard& right)
+{
+/// Assigment operator;
+/// equal operator
+
+ if (this == &right)
+ return *this;
+
+ // base class assignement
+ AliMUONTriggerBoard::operator=(right);
+
+ fMpLocalBoard = right.fMpLocalBoard;
+ fStripX11 = right.fStripX11;
+ fStripY11 = right.fStripY11;
+ fDev = right.fDev;
+ fTrigY = right.fTrigY;
+ fOutput = right.fOutput;
+ fLUT = right.fLUT;
+ fCoinc44 = right.fCoinc44;
+
+ for (Int_t i=0; i<2; i++) {
+ for (Int_t j=0; j<4; j++) {
+ fXY[i][j] = right.fXY[i][j];
+ fXYU[i][j] = right.fXYU[i][j];
+ fXYD[i][j] = right.fXYD[i][j];
+
+ fMask[i][j] = right.fMask[i][j];
+ }
+ }
+
+ for (Int_t i=0; i<2; i++) {
+ fLutLpt[i] = right.fLutLpt[i];
+ fLutHpt[i] = right.fLutHpt[i];
+ }
+
+ for (Int_t i=0; i<5; i++) {
+ fMinDevStrip[i] = right.fMinDevStrip[i];
+ fMinDev[i] = right.fMinDev[i];
+ fCoordY[i] = right.fCoordY[i];
+ }
+
+ return *this;
+}
+
//___________________________________________
AliMUONLocalTriggerBoard::~AliMUONLocalTriggerBoard()
{
/// Destructor
}
+
//___________________________________________
void AliMUONLocalTriggerBoard::Reset()
{
for (Int_t j=0; j<4; j++)
fXY[i][j] = fXYU[i][j] = fXYD[i][j] = 0;
- fResponse = 0;
-
- for (Int_t i=0; i<5; i++) fMinDevStrip[i] = fMinDev[i] = fCoordY[i] = 0;
-
- fOutput = 0;
-
- fStripX11 = 0;
- fStripY11 = 15;
- fDev = 0;
- fTrigY = 1;
-
- for (Int_t i=0; i<2; i++) fLutLpt[i] = fLutHpt[i] = 0;
+ ResetResponse();
}
//___________________________________________
-void AliMUONLocalTriggerBoard::Setbit(Int_t strip, Int_t cathode, Int_t chamber)
+void AliMUONLocalTriggerBoard::ResetResponse()
{
-/// 0 .. LBS : N-1 .. MSB
- TBits w, m;
-
- UShort_t xy = fXY[cathode][chamber], mask = fMask[cathode][chamber];
+/// reset board response
+//
+ fResponse = 0;
- w.Set(16,&xy);
- m.Set(16,&mask);
+ for (Int_t i=0; i<5; i++) fMinDevStrip[i] = fMinDev[i] = fCoordY[i] = 0;
- Int_t s = strip - int(strip / 16) * 16;
-
- w.SetBitNumber(s);
+ fOutput = 0;
- w &= m;
-
- UShort_t value;
+ fStripX11 = 0;
+ fStripY11 = 15;
+ fDev = 0;
+ fTrigY = 1;
- w.Get(&value);
-
- fXY[cathode][chamber] = value;
+ for (Int_t i=0; i<2; i++) fLutLpt[i] = fLutHpt[i] = 0;
}
+
//___________________________________________
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;
+ UShort_t stripBit = ( (1<<strip) & 0xFFFF );
+ fXY[cathode][chamber] |= ( stripBit & fMask[cathode][chamber] );
}
+
//___________________________________________
-void AliMUONLocalTriggerBoard::Pattern(Option_t *option) const
+void AliMUONLocalTriggerBoard::Pattern(const Option_t *option) const
{
/// print bit pattern
///
//___________________________________________
-void AliMUONLocalTriggerBoard::BP(Option_t *option) const
+void AliMUONLocalTriggerBoard::BP(const Option_t *option) const
{
-/// RESPECT THE OLD PRINTOUT FORMAT
+/// Respect the old printout format
const Int_t kModuleId[126] =
{11,12,13,14,15,16,17, // right side of the chamber
if (op.Contains("X"))
{
printf("-------- TRIGGER INPUT ---------\n");
+ printf("--- warning: switchs not activated at this level ---\n");
printf("===============================================================\n");
printf(" 5432109876543210");
- char *x[4] = {"XMC11","XMC12","XMC21","XMC22"};
- char *s[4] = {" ",
+ const char *x[4] = {"XMC11","XMC12","XMC21","XMC22"};
+ const char *s[4] = {" ",
" ",
" ",
" "};
UShort_t xyval = 0;
- if (fSwitch[1])
+ if (GetSwitch(1))
{
xyval = fXY[1][0];
TBits v11(8); v11.Set(8,&xyval);
}
}
-//___________________________________________
-void AliMUONLocalTriggerBoard::Conf() const
-{
-/// board switches
-///
- cout << "Switch(" << GetName() << ")"
- << " x2d = " << fSwitch[0]
- << " x2m = " << fSwitch[1]
- << " x2u = " << fSwitch[2]
- << " OR[0] = " << fSwitch[3]
- << " OR[1] = " << fSwitch[4]
- << " EN-Y = " << fSwitch[5]
- << " ZERO-ALLY-LSB = " << fSwitch[6]
- << " ZERO-down = " << fSwitch[7]
- << " ZERO-middle = " << fSwitch[8]
- << " ZERO-up = " << fSwitch[9]
- << " trans. conn. " << fTC
- << " Slot = " << fSlot
- << endl;
-}
-
-//___________________________________________
-void AliMUONLocalTriggerBoard::Module(char *mod)
-{
-/// get module from name
-///
- const Int_t kMaxfields = 2; char **fields = new char*[kMaxfields];
-
- char s[100]; strcpy(s, GetName());
-
- Int_t numlines = 0;
-
- for (char *token = strtok(s, "B");
- token != NULL;
- token = strtok(NULL, " "))
- {
- fields[numlines] = new char[strlen(token)+1];
- strcpy(fields[numlines++],token);
- }
-
- strcpy(mod,fields[0]);
-}
-
//___________________________________________
void AliMUONLocalTriggerBoard::TrigX(Int_t ch1q[16], Int_t ch2q[16], Int_t ch3q[32], Int_t ch4q[32])
{
}
//--- inititialize che using chq
+//--- switch zero_down, zero_middle & zero_up added 30/05/07
+//--- fSwitch[7/8/9] = zero_down/zero_middle/zero_up
for (i=0; i<19; i++) {
if (i<1||i>16) ch1e[i]=0;
else ch1e[i]=ch1q[i-1];
}
for (i=0; i<35; i++) {
if (i<1||i>32) ch3e[i]=0;
- else ch3e[i]=ch3q[i-1];
+ else if (i>=1 && i<=8) ch3e[i]=ch3q[i-1]&!GetSwitch(7);
+ else if (i>=9 && i<=24) ch3e[i]=ch3q[i-1]&!GetSwitch(8);
+ else if (i>=25 && i<=32) ch3e[i]=ch3q[i-1]&!GetSwitch(9);
}
for (i=0; i<36; i++) {
if (i<2||i>33) ch4e[i]=0;
- else ch4e[i]=ch4q[i-2];
+ else if (i>=2 && i<=9) ch4e[i]=ch4q[i-2]&!GetSwitch(7);
+ else if (i>=10 && i<=25) ch4e[i]=ch4q[i-2]&!GetSwitch(8);
+ else if (i>=26 && i<=33) ch4e[i]=ch4q[i-2]&!GetSwitch(9);
}
-
//--- calculate dble & sgle first station
for (i=0; i<=15; i++) {
sgleHit1[2*i] = (!ch1e[i+1]|(ch1e[i]^ch1e[i+2])) &
sgleHit1[2*i+1] = (!ch1e[i+1]|!ch1e[i+2]|(ch1e[i]^ch1e[i+3])) &
(!ch2e[i+2] | !ch2e[i+3] | (ch2e[i+1]^ch2e[i+4]));
dbleHit1[2*i+1] = ch1e[i+1]&ch1e[i+2]&!(ch1e[i]^ch1e[i+3]) &
- (ch2e[i+2]&(!ch2e[i+1]|!ch2e[i]) |
- ch2e[i+3]&(ch2e[i+2]|!ch2e[i+4]|!ch2e[i+5]));
+ ((ch2e[i+2]&(!ch2e[i+1]|!ch2e[i])) |
+ (ch2e[i+3]&(ch2e[i+2]|!ch2e[i+4]|!ch2e[i+5])));
}
//--- calculate dble & sgle second station
sgleHit2[2*i+1] = (!ch3e[i+1]|!ch3e[i+2]|(ch3e[i]^ch3e[i+3])) &
(!ch4e[i+2] | !ch4e[i+3] | (ch4e[i+1]^ch4e[i+4]));
dbleHit2[2*i+1] = ch3e[i+1]&ch3e[i+2]&!(ch3e[i]^ch3e[i+3]) &
- (ch4e[i+2]&(!ch4e[i+1]|!ch4e[i]) |
- ch4e[i+3]&(ch4e[i+2]|!ch4e[i+4]|!ch4e[i+5]));
+ ((ch4e[i+2]&(!ch4e[i+1]|!ch4e[i])) |
+ (ch4e[i+3]&((ch4e[i+2]|!ch4e[i+4])|!ch4e[i+5])));
}
//---
andL2=!rearImage[i][23]&!rearImage[i][24]&!rearImage[i][25]&!rearImage[i][26];
leftDev[0] = (rearImage[i][16]|!rearImage[i][17]) &
- (rearImage[i][16]|rearImage[i][18]|!rearImage[i][19]&
- (rearImage[i][20]|!rearImage[i][21])) &
- (orL1|!rearImage[i][23]&(rearImage[i][24]|!rearImage[i][25])) &
- (orL1|rearImage[i][24]|rearImage[i][26]|!rearImage[i][27]&
- (rearImage[i][28]|!rearImage[i][29]));
+ (rearImage[i][16]|rearImage[i][18]|(!rearImage[i][19]&
+ (rearImage[i][20]|!rearImage[i][21]))) &
+ (orL1|(!rearImage[i][23]&(rearImage[i][24]|!rearImage[i][25]))) &
+ (orL1|rearImage[i][24]|rearImage[i][26]|(!rearImage[i][27]&
+ (rearImage[i][28]|!rearImage[i][29])));
leftDev[1] = !rearImage[i][16] &
!(!rearImage[i][17]&!rearImage[i][18]&!rearImage[i][21]&!rearImage[i][22] &
- (!rearImage[i][25]&!rearImage[i][26]&(rearImage[i][27]|rearImage[i][28]))) &
- (rearImage[i][17]|rearImage[i][18] | !rearImage[i][19]&!rearImage[i][20]) &
+ (!rearImage[i][25]&!rearImage[i][26]&(rearImage[i][27]|rearImage[i][28]))) &
+ (rearImage[i][17]|rearImage[i][18] | (!rearImage[i][19]&!rearImage[i][20])) &
(rearImage[i][17]|rearImage[i][18]|rearImage[i][21]|rearImage[i][22] |
- !rearImage[i][23]&!rearImage[i][24]);
+ (!rearImage[i][23]&!rearImage[i][24]));
leftDev[2] = (!rearImage[i][16]&!rearImage[i][17]&!rearImage[i][18]) &
(rearImage[i][19]|rearImage[i][20]|rearImage[i][21]|rearImage[i][22] | andL2);
andR3=!rearImage[i][4]&!rearImage[i][5]&!rearImage[i][6]&!rearImage[i][7];
rightDev[0] = !rearImage[i][15]&(rearImage[i][14]|!rearImage[i][13]) &
- ((rearImage[i][12]|rearImage[i][14]|!rearImage[i][11]&
- (rearImage[i][10]|!rearImage[i][9])) &
- ((orR1|!rearImage[i][7]&(rearImage[i][6]|!rearImage[i][5])) &
- (orR1|rearImage[i][4]|rearImage[i][6]|!rearImage[i][3]&(rearImage[i][2]|
- !rearImage[i][1]))));
+ ((rearImage[i][12]|rearImage[i][14]|(!rearImage[i][11]&
+ (rearImage[i][10]|!rearImage[i][9]))) &
+ ((orR1|(!rearImage[i][7]&(rearImage[i][6]|!rearImage[i][5]))) &
+ (orR1|rearImage[i][4]|rearImage[i][6]|(!rearImage[i][3]&(rearImage[i][2]|
+ !rearImage[i][1])))));
rightDev[1] = !rearImage[i][15]&!rearImage[i][14] &
!(!rearImage[i][4]&!rearImage[i][5]&!rearImage[i][8]&!rearImage[i][9] &
(!rearImage[i][12]&!rearImage[i][13]&(rearImage[i][2]|rearImage[i][3]))) &
- (rearImage[i][12]|rearImage[i][13] | !rearImage[i][10]&!rearImage[i][11]) &
+ (rearImage[i][12]|rearImage[i][13] | (!rearImage[i][10]&!rearImage[i][11])) &
(rearImage[i][8]|rearImage[i][9]|rearImage[i][12]|rearImage[i][13] |
- !rearImage[i][6]&!rearImage[i][7]);
+ (!rearImage[i][6]&!rearImage[i][7]));
rightDev[2] = andR1 & (orR2 | andR3);
rightDev[3] = andR2;
for (i=0; i<16; i++)
{
- y3[i]=y3[i]&!fSwitch[8];
- y4[i]=y4[i]&!fSwitch[8];
+ y3[i]=y3[i]&!GetSwitch(8);
+ y4[i]=y4[i]&!GetSwitch(8);
}
// 10/29/04 fZeroAllYLSB added
Int_t tmpy3to16[16], tmpy4to16[16];
Int_t tmpy3uto16[16], tmpy3dto16[16], tmpy4uto16[16], tmpy4dto16[16];
for (i=0; i<8; i++){
- ch1[2*i] = y1[i]&fSwitch[1] | y1[2*i]&!fSwitch[1];
- ch1[2*i+1] = y1[i]&fSwitch[1] | y1[2*i+1]&!fSwitch[1];
+ ch1[2*i] = (y1[i]&GetSwitch(1)) | (y1[2*i]&!GetSwitch(1));
+ ch1[2*i+1] = (y1[i]&GetSwitch(1)) | (y1[2*i+1]&!GetSwitch(1));
- ch2[2*i] = y2[i]&fSwitch[1] | y2[2*i]&!fSwitch[1];
- ch2[2*i+1] = y2[i]&fSwitch[1] | y2[2*i+1]&!fSwitch[1];
+ ch2[2*i] = (y2[i]&GetSwitch(1)) | (y2[2*i]&!GetSwitch(1));
+ ch2[2*i+1] = (y2[i]&GetSwitch(1)) | (y2[2*i+1]&!GetSwitch(1));
- tmpy3to16[2*i ] = y3[i]&fSwitch[1] | y3[2*i ]&!fSwitch[1];
- tmpy3to16[2*i+1] = y3[i]&fSwitch[1] | y3[2*i+1]&!fSwitch[1];
+ tmpy3to16[2*i ] = (y3[i]&GetSwitch(1)) | (y3[2*i ]&!GetSwitch(1));
+ tmpy3to16[2*i+1] = (y3[i]&GetSwitch(1)) | (y3[2*i+1]&!GetSwitch(1));
- tmpy4to16[2*i ] = y4[i]&fSwitch[1] | y4[2*i ]&!fSwitch[1];
- tmpy4to16[2*i+1] = y4[i]&fSwitch[1] | y4[2*i+1]&!fSwitch[1];
+ tmpy4to16[2*i ] = (y4[i]&GetSwitch(1)) | (y4[2*i ]&!GetSwitch(1));
+ tmpy4to16[2*i+1] = (y4[i]&GetSwitch(1)) | (y4[2*i+1]&!GetSwitch(1));
- tmpy3uto16[2*i ] = y3u[i]&fSwitch[2] | y3u[2*i ]&!fSwitch[2];
- tmpy3uto16[2*i+1] = y3u[i]&fSwitch[2] | y3u[2*i+1]&!fSwitch[2];
+ tmpy3uto16[2*i ] = (y3u[i]&GetSwitch(2)) | (y3u[2*i ]&!GetSwitch(2));
+ tmpy3uto16[2*i+1] = (y3u[i]&GetSwitch(2)) | (y3u[2*i+1]&!GetSwitch(2));
- tmpy4uto16[2*i ] = y4u[i]&fSwitch[2] | y4u[2*i ]&!fSwitch[2];
- tmpy4uto16[2*i+1] = y4u[i]&fSwitch[2] | y4u[2*i+1]&!fSwitch[2];
+ tmpy4uto16[2*i ] = (y4u[i]&GetSwitch(2)) | (y4u[2*i ]&!GetSwitch(2));
+ tmpy4uto16[2*i+1] = (y4u[i]&GetSwitch(2)) | (y4u[2*i+1]&!GetSwitch(2));
- tmpy3dto16[2*i ] = y3d[i]&fSwitch[0] | y3d[2*i ]&!fSwitch[0];
- tmpy3dto16[2*i+1] = y3d[i]&fSwitch[0] | y3d[2*i+1]&!fSwitch[0];
+ tmpy3dto16[2*i ] = (y3d[i]&GetSwitch(0)) | (y3d[2*i ]&!GetSwitch(0));
+ tmpy3dto16[2*i+1] = (y3d[i]&GetSwitch(0)) | (y3d[2*i+1]&!GetSwitch(0));
- tmpy4dto16[2*i ] = y4d[i]&fSwitch[0] | y4d[2*i ]&!fSwitch[0];
- tmpy4dto16[2*i+1] = y4d[i]&fSwitch[0] | y4d[2*i+1]&!fSwitch[0];
+ tmpy4dto16[2*i ] = (y4d[i]&GetSwitch(0)) | (y4d[2*i ]&!GetSwitch(0));
+ tmpy4dto16[2*i+1] = (y4d[i]&GetSwitch(0)) | (y4d[2*i+1]&!GetSwitch(0));
}
- if (fSwitch[3]==0&&fSwitch[4]==0){
+ for (i=0; i<16; i++) ch3[i] = ch4[i] = 0;
+
+ if (GetSwitch(3)==0&&GetSwitch(4)==0){
for (i=0; i<16; i++){
ch3[i] = tmpy3to16[i];
ch4[i] = tmpy4to16[i];
}
}
- if (fSwitch[3]==0&&fSwitch[4]==1){
+ if (GetSwitch(3)==0&&GetSwitch(4)==1){
for (i=0; i<16; i++){
ch3[i] = tmpy3dto16[i]|tmpy3to16[i];
ch4[i] = tmpy4dto16[i]|tmpy4to16[i];
}
}
- if (fSwitch[3]==1&&fSwitch[4]==0){
+ if (GetSwitch(3)==1&&GetSwitch(4)==0){
for (i=0; i<16; i++){
ch3[i] = tmpy3uto16[i]|tmpy3to16[i];
ch4[i] = tmpy4uto16[i]|tmpy4to16[i];
}
}
- if (fSwitch[3]==1&&fSwitch[4]==1){
+ if (GetSwitch(3)==1&&GetSwitch(4)==1){
for (i=0; i<16; i++){
ch3[i] = tmpy3dto16[i]|tmpy3to16[i]|tmpy3uto16[i];
ch4[i] = tmpy4dto16[i]|tmpy4to16[i]|tmpy4uto16[i];
if(AliDebugLevel()==4||AliDebugLevel()==5) {
printf("===============================================================\n");
printf(" Y plane after PreHandling x2m x2u x2d orMud %i %i %i %i %i \n",
- fSwitch[1],fSwitch[2], fSwitch[0],fSwitch[3],fSwitch[4]);
+ GetSwitch(1),GetSwitch(2), GetSwitch(0),GetSwitch(3),GetSwitch(4));
printf(" ");
for (istrip=15; istrip>=0; istrip--) {
if (istrip>9) printf("%i",istrip-10*Int_t(istrip/10));
Int_t frontImage[16];
for (i=1; i<15; i++) {
- frontImage[i] = (dble1[i] | sgle1[i]) &
- (dble2[i+1] | dble2[i] | dble2[i-1]) |
- dble1[i] & (sgle2[i+1] | sgle2[i] | sgle2[i-1]);
+ frontImage[i] = ((dble1[i] | sgle1[i]) &
+ (dble2[i+1] | dble2[i] | dble2[i-1])) |
+ (dble1[i] & (sgle2[i+1] | sgle2[i] | sgle2[i-1]));
}
- frontImage[0] = (dble1[0] | sgle1[0]) &
- (dble2[1] | dble2[0]) | dble1[0] & (sgle2[1] | sgle2[0]);
+ frontImage[0] = ((dble1[0] | sgle1[0]) &
+ (dble2[1] | dble2[0])) | (dble1[0] & (sgle2[1] | sgle2[0]));
- frontImage[15] = (dble1[15] | sgle1[15]) &
- (dble2[15] | dble2[14]) | dble1[15] & (sgle2[15] | sgle2[14]);
+ frontImage[15] = ((dble1[15] | sgle1[15]) &
+ (dble2[15] | dble2[14])) | (dble1[15] & (sgle2[15] | sgle2[14]));
//debug
and3 = !frontImage[11]&!frontImage[10]&!frontImage[9]&!frontImage[8];
fCoordY[0] = !frontImage[0]&(frontImage[1]|!frontImage[2]) &
- (frontImage[3]|frontImage[1]|!frontImage[4]&(frontImage[5]|!frontImage[6])) &
- (or1|!frontImage[8]&(frontImage[9]|!frontImage[10])) &
- (or1|frontImage[11]|frontImage[9]|!frontImage[12]&(frontImage[13]|!frontImage[14]));
+ (frontImage[3]|frontImage[1]|(!frontImage[4]&(frontImage[5]|!frontImage[6]))) &
+ (or1|(!frontImage[8]&(frontImage[9]|!frontImage[10]))) &
+ (or1|frontImage[11]|frontImage[9]|(!frontImage[12]&(frontImage[13]|!frontImage[14])));
fCoordY[1] = !frontImage[0]&!frontImage[1] &
!(!frontImage[11]&!frontImage[10]&!frontImage[7]&!frontImage[6] &
!frontImage[3]&!frontImage[2]&(frontImage[13]|frontImage[12])) &
- (frontImage[3]|frontImage[2] | !frontImage[5]&!frontImage[4]) &
+ (frontImage[3]|frontImage[2] | (!frontImage[5]&!frontImage[4])) &
(frontImage[7]|frontImage[6]|frontImage[3]|frontImage[2] |
- !frontImage[9]&!frontImage[8]);
+ (!frontImage[9]&!frontImage[8]));
fCoordY[2] = and1 & (or2 | and3);
Int_t deviation=0;
Int_t iStripY=0;
Int_t iStripX=0;
- Bool_t xOutput=kFALSE;
- Bool_t yOutput=kFALSE;
-
- 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 (fMinDev[4]==1 && !deviation) xOutput=kFALSE; // no trigger in X
- else xOutput=kTRUE; // trigger in X
- if (fCoordY[4]==1 && iStripY==15) yOutput=kFALSE; // no trigger in Y
- else yOutput=kTRUE; // trigger in Y
+ Bool_t xOutput = IsTrigX();
+ Bool_t yOutput = IsTrigY();
if (xOutput) {
for (Int_t i=0; i<5; i++) iStripX += static_cast<int>( fMinDevStrip[i] << i );
+ for (Int_t i=0; i<4; i++) deviation += static_cast<int>( fMinDev[i] << i );
fDev = deviation;
fStripX11 = iStripX;
}
if (yOutput) {
+ for (Int_t i=0; i<4; i++) iStripY += static_cast<int>( fCoordY[i] << i );
fStripY11 = iStripY;
fTrigY = fCoordY[4];
}
// xOutput << " " << yOutput << " " << fDev << " " << fStripX11 << " " <<
// fTrigY << " " << fStripY11 << "\n";
- if (yOutput && yOutput){ // trigger in X and Y
+ if (xOutput && yOutput){ // trigger in X and Y
fOutput =1;
Int_t sign = 0;
deviation += 15;
// GET LUT OUTPUT FOR icirc/istripX1/deviation/istripY
- fLUT->GetLutOutput(fNumber, fStripX11, deviation, fStripY11, fLutLpt, fLutHpt);
- }
+ fLUT->GetLutOutput(GetNumber(), fStripX11, deviation, fStripY11, fLutLpt, fLutHpt);
+ }
+
+ fResponse = fLutLpt[0] +
+ static_cast<int>(fLutLpt[1]<<1) +
+ static_cast<int>(fLutHpt[0]<<2) +
+ static_cast<int>(fLutHpt[1]<<3);
+
}
//___________________________________________
{
/// old numbering
///
+
const Int_t kMaxfields = 2; char **fields = new char*[kMaxfields];
- char s[100]; strcpy(s, GetName());
+ for (Int_t i = 0; i < kMaxfields; i++)
+ fields[i] = new char[1];
+
+ char s[100]; strncpy(s, GetName(), 99);
Int_t numlines = 0;
token != NULL;
token = strtok(NULL, " "))
{
+ delete [] fields[numlines];
fields[numlines] = new char[strlen(token)+1];
strcpy(fields[numlines++], token);
}
Int_t lL = atoi(&l[4]), cC = atoi(&l[2]), sS = (copy=='R') ? +1 : -1;
- char *b[4] = {"12", "34", "56", "78"};
+ const char *b[4] = {"12", "34", "56", "78"};
Int_t ib = 0;
Int_t ic = 0;
for (Int_t i=0; i<234; i++) if (fgkCircuitId[i] == code) {ic = i; break;}
+
+ delete [] fields;
return ic;
}
if ( index >= 0 && index < 2*4 )
{
Int_t i = index/4;
- Int_t j = index - i*4;
+ Int_t j = index%4;
fMask[i][j]=mask;
}
else
{
/// full dump
///
- TString op = option;
+ TString op = option;
if (op.Contains("CONF")) Conf();
if (op.Contains("RESPF")) Resp("F");
+ if (op.Contains("RESPO")) Resp("O");
+
if (op.Contains("ALL"))
{
Conf();
}
}
+//___________________________________________
+void AliMUONLocalTriggerBoard::Conf() const
+{
+/// board switches
+///
+ cout << "Switch(" << GetName() << ")"
+ << " x2d = " << GetSwitch(0)
+ << " x2m = " << GetSwitch(1)
+ << " x2u = " << GetSwitch(2)
+ << " OR[0] = " << GetSwitch(3)
+ << " OR[1] = " << GetSwitch(4)
+ << " EN-Y = " << GetSwitch(5)
+ << " ZERO-ALLY-LSB = " << GetSwitch(6)
+ << " ZERO-down = " << GetSwitch(7)
+ << " ZERO-middle = " << GetSwitch(8)
+ << " ZERO-up = " << GetSwitch(9)
+ << " trans. conn. " << GetTC()
+ << " Slot = " << fSlot
+ << endl;
+}
+
//___________________________________________
void AliMUONLocalTriggerBoard::Resp(Option_t *option) const
{
for (Int_t i=4; i>=0; i--) printf("%i",fCoordY[i]);
printf(" \n");
}
+ if (op.Contains("O")){
+ printf("-- Output --\n");
+ printf("Coinc44 %i\n", fCoinc44);
+ printf("StripX11 %i StripY11 %i Dev %i TrigY %i\n", fStripX11, fStripY11, fDev, fTrigY);
+ printf("LutLpt %i %i LutHpt %i %i\n", fLutLpt[0], fLutLpt[1], fLutHpt[0], fLutHpt[1]);
+ printf("Response %i\n", fOutput);
+ }
- if (op.Contains("F"))
- {
- Int_t icirc = GetI();
- Int_t idCircuit = fgkCircuitId[icirc];
-
- Int_t deviation = 0, iStripY = 0;
-
- for (Int_t i=0; i<4; i++) iStripY += static_cast<int>( fCoordY[i] << i );
-
- 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(" 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(" 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("\n");
- printf("-------------------------------------\n");
- }
}
//___________________________________________
{
/// algo
///
+ if ( IsNull() ) {
+ fMinDev[4] = 1;
+ for (Int_t i=4; i>=0; i--) fCoordY[i] = 1;
+ return; // Do nothing if strip pattern is null
+ }
+
Int_t xX1[16], xX2[16], xXX3[32], xXX4[32];
TBits x1(16), x2(16), x3(16), x4(16);
TrigY(yY1, yY2, yY3, yY4, yY3U, yY3D, yY4U, yY4D);
// ASIGN fLutLpt, fLutHpt
- LocalTrigger();
+ LocalTrigger();
+}
- fResponse = fLutLpt[0] +
- static_cast<int>(fLutLpt[1]<<1) +
- static_cast<int>(fLutHpt[0]<<2) +
- static_cast<int>(fLutHpt[1]<<3);
+//___________________________________________
+Bool_t AliMUONLocalTriggerBoard::IsTrigY() const
+{
+ /// Return the response of non-bending plane
+ Int_t iStripY = 0;
+ Bool_t output = kFALSE;
+
+ for (Int_t i=0; i<4; i++) iStripY += static_cast<int>( fCoordY[i] << i );
+
+ if (fCoordY[4]==1 && iStripY==15) output=kFALSE; // no trigger in Y
+ else output=kTRUE; // trigger in Y
+
+ return output;
}
+//___________________________________________
+Bool_t AliMUONLocalTriggerBoard::IsTrigX() const
+{
+ /// Return the response of bending plane
+
+ Int_t deviation = 0;
+ Bool_t output = kFALSE;
+
+ for (Int_t i=0; i<4; i++) deviation += static_cast<int>( fMinDev[i] << i );
+
+ if (fMinDev[4]==1 && !deviation) output=kFALSE; // no trigger in X
+ else output=kTRUE; // trigger in X
+
+ return output;
+}
+
+//___________________________________________
+Bool_t AliMUONLocalTriggerBoard::IsNull() const
+{
+ /// Check if board has fired strips in the first station
+ for (Int_t icath=0; icath<2; icath++){
+ for(Int_t ich=0; ich<2; ich++){
+ if ( fXY[icath][ich] ) return kFALSE;
+ }
+ }
+ return kTRUE;
+}