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;
}
//___________________________________________
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;
}
//___________________________________________
usLpt = ((t[0] & 0x2 ) != 0);
usHpt = ((t[0] & 0x20) != 0);
- sHpt <<= 1;
- lsLpt <<= 2;
- lsHpt <<= 3;
- usLpt <<= 4;
- usHpt <<= 5;
+ // LSB is zero (trigger choice to send to CTP: sLpt or sHpt)
+
+ sLpt <<= 1;
+ sHpt <<= 2;
+ lsLpt <<= 3;
+ lsHpt <<= 4;
+ usLpt <<= 5;
+ usHpt <<= 6;
fResponse = sLpt | sHpt | lsLpt | lsHpt | usLpt |usHpt;
for (Int_t i=0;i< 4;i++) fGlobalInput[i] = 0;
UShort_t regRespInv;
- TBits rs(8), rsi(8);
for (Int_t iReg = 0; iReg < 16; iReg++) {
- // invert bit in regional response
- rs.Set(8,&fRegionalResponse[iReg]);
- for (Int_t i = 0; i < 4; i++) {
- rsi[2*i] = rs[2*i+1];
- rsi[2*i+1] = rs[2*i];
- }
- regRespInv = 0;
- rsi.Get(®RespInv);
+ regRespInv = InvertPairBits(iReg);
if (iReg < 8) { // right
// Lpt word
/// Apply masks to global input and recalculate regional inputs before
/// applying the global response
- UShort_t regRespInv;
- TBits rs(8), rsi(8);
-
- // global input with masks applied
UInt_t gitmp[4];
-
for (Int_t i = 0; i < 4; i++) {
+ fGlobalInput[i] &= fMask[i];
gitmp[i] = fGlobalInput[i];
- gitmp[i] &= fMask[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
// Hpt
fRegionalResponse[iReg] |= ((gitmp[3] >> (4*(iReg-8))) & 0xF) << 4;
}
- // invert bit in regional response
- rs.Set(8,&fRegionalResponse[iReg]);
- for (Int_t i = 0; i < 4; i++) {
- rsi[2*i] = rs[2*i+1];
- rsi[2*i+1] = rs[2*i];
- }
- regRespInv = 0;
- rsi.Get(®RespInv);
- fRegionalResponse[iReg] = regRespInv;
- }
+ fRegionalResponse[iReg] = InvertPairBits(iReg);
+ }
}
//___________________________________________
void AliMUONGlobalTriggerBoard::Scan(Option_t*) const
{
/// print global trigger output
- TBits w(6); w.Set(6,&fResponse);
+ TBits w(7); w.Set(7,&fResponse);
// TRG[1:0]
// 00 noth
Int_t iS[2] = {0,0};
- iS[0] = (Int_t)w.TestBitNumber(0);
- iS[1] = (Int_t)w.TestBitNumber(1);
+ iS[0] = (Int_t)w.TestBitNumber(1);
+ iS[1] = (Int_t)w.TestBitNumber(2);
- Int_t iPU[2] = {w[4],w[5]};
- Int_t iPL[2] = {w[2],w[3]};
+ Int_t iPU[2] = {w[5],w[6]};
+ Int_t iPL[2] = {w[3],w[4]};
printf("============================================\n");
printf(" Global Trigger output Low pt High pt\n");
printf("\n");
}
+
+//___________________________________________
+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;
+}