X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;ds=sidebyside;f=MUON%2FAliMUONLocalTriggerBoard.cxx;h=25fc4be82cf0a5e7edf09fb329eab98440ec3a17;hb=f6d1b1a77fcdd718c33703de02d44ffeaea466a0;hp=f5dbdae51ab06d4fd922e1bae8fe561f3a36ce80;hpb=b88fed653be829b4aaa18dc1b3ff8b63d94718d5;p=u%2Fmrichter%2FAliRoot.git diff --git a/MUON/AliMUONLocalTriggerBoard.cxx b/MUON/AliMUONLocalTriggerBoard.cxx index f5dbdae51ab..25fc4be82cf 100644 --- a/MUON/AliMUONLocalTriggerBoard.cxx +++ b/MUON/AliMUONLocalTriggerBoard.cxx @@ -33,6 +33,8 @@ #include #include +using std::endl; +using std::cout; /// \cond CLASSIMP ClassImp(AliMUONLocalTriggerBoard) /// \endcond @@ -115,6 +117,88 @@ AliMUONLocalTriggerBoard::AliMUONLocalTriggerBoard(AliMpLocalBoard* mpLocalBoard 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() { @@ -142,20 +226,29 @@ void AliMUONLocalTriggerBoard::Reset() for (Int_t j=0; j<4; j++) fXY[i][j] = fXYU[i][j] = fXYD[i][j] = 0; - fResponse = 0; + ResetResponse(); +} - for (Int_t i=0; i<5; i++) fMinDevStrip[i] = fMinDev[i] = fCoordY[i] = 0; +//___________________________________________ +void AliMUONLocalTriggerBoard::ResetResponse() +{ +/// reset board response +// + fResponse = 0; - fOutput = 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; + fStripX11 = 0; + fStripY11 = 15; + fDev = 0; + fTrigY = 1; - 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] = 0; } + //___________________________________________ void AliMUONLocalTriggerBoard::Setbit(Int_t strip, Int_t cathode, Int_t chamber) { @@ -204,7 +297,7 @@ void AliMUONLocalTriggerBoard::SetbitM(Int_t strip, Int_t cathode, Int_t chamber //___________________________________________ -void AliMUONLocalTriggerBoard::Pattern(Option_t *option) const +void AliMUONLocalTriggerBoard::Pattern(const Option_t *option) const { /// print bit pattern /// @@ -217,7 +310,7 @@ void AliMUONLocalTriggerBoard::Pattern(Option_t *option) const //___________________________________________ -void AliMUONLocalTriggerBoard::BP(Option_t *option) const +void AliMUONLocalTriggerBoard::BP(const Option_t *option) const { /// Respect the old printout format @@ -272,8 +365,8 @@ void AliMUONLocalTriggerBoard::BP(Option_t *option) const 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] = {" ", " ", " ", " "}; @@ -416,28 +509,6 @@ void AliMUONLocalTriggerBoard::BP(Option_t *option) const } } -//___________________________________________ -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]) { @@ -499,7 +570,7 @@ void AliMUONLocalTriggerBoard::TrigX(Int_t ch1q[16], Int_t ch2q[16], Int_t ch3q[ 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+2]&(!ch2e[i+1]|!ch2e[i])) | (ch2e[i+3]&(ch2e[i+2]|!ch2e[i+4]|!ch2e[i+5]))); } @@ -515,7 +586,7 @@ void AliMUONLocalTriggerBoard::TrigX(Int_t ch1q[16], Int_t ch2q[16], Int_t ch3q[ 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+2]&(!ch4e[i+1]|!ch4e[i])) | (ch4e[i+3]&((ch4e[i+2]|!ch4e[i+4])|!ch4e[i+5]))); } @@ -883,6 +954,8 @@ void AliMUONLocalTriggerBoard::TrigY(Int_t y1[16], Int_t y2[16], Int_t y3[16], I tmpy4dto16[2*i+1] = (y4d[i]&GetSwitch(0)) | (y4d[2*i+1]&!GetSwitch(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]; @@ -990,15 +1063,15 @@ void AliMUONLocalTriggerBoard::TrigY(Int_t y1[16], Int_t y2[16], Int_t y3[16], I Int_t frontImage[16]; for (i=1; i<15; i++) { - frontImage[i] = (dble1[i] | sgle1[i]) & - (dble2[i+1] | dble2[i] | dble2[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 @@ -1055,23 +1128,17 @@ void AliMUONLocalTriggerBoard::LocalTrigger() 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( fMinDev[i] << i ); - for (Int_t i=0; i<4; i++) iStripY += static_cast( 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( fMinDevStrip[i] << i ); + for (Int_t i=0; i<4; i++) deviation += static_cast( fMinDev[i] << i ); fDev = deviation; fStripX11 = iStripX; } if (yOutput) { + for (Int_t i=0; i<4; i++) iStripY += static_cast( fCoordY[i] << i ); fStripY11 = iStripY; fTrigY = fCoordY[4]; } @@ -1109,9 +1176,13 @@ Int_t AliMUONLocalTriggerBoard::GetI() const { /// 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; @@ -1119,6 +1190,7 @@ Int_t AliMUONLocalTriggerBoard::GetI() const token != NULL; token = strtok(NULL, " ")) { + delete [] fields[numlines]; fields[numlines] = new char[strlen(token)+1]; strcpy(fields[numlines++], token); } @@ -1129,7 +1201,7 @@ Int_t AliMUONLocalTriggerBoard::GetI() const 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; @@ -1145,6 +1217,8 @@ Int_t AliMUONLocalTriggerBoard::GetI() const Int_t ic = 0; for (Int_t i=0; i<234; i++) if (fgkCircuitId[i] == code) {ic = i; break;} + + delete [] fields; return ic; } @@ -1157,7 +1231,7 @@ void AliMUONLocalTriggerBoard::Mask(Int_t index, UShort_t mask) 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 @@ -1181,6 +1255,8 @@ void AliMUONLocalTriggerBoard::Scan(Option_t *option) const if (op.Contains("RESPF")) Resp("F"); + if (op.Contains("RESPO")) Resp("O"); + if (op.Contains("ALL")) { Conf(); @@ -1231,6 +1307,13 @@ 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); + } } @@ -1239,6 +1322,12 @@ void AliMUONLocalTriggerBoard::Response() { /// 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); @@ -1318,3 +1407,45 @@ void AliMUONLocalTriggerBoard::Response() LocalTrigger(); } +//___________________________________________ +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( 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( 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; +}