1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
18 //*-- Author: Rachid Guernane (LPCCFd)
20 #include "AliMUONTriggerElectronics.h"
21 #include "AliMUONTriggerCrate.h"
22 #include "AliMUONConstants.h"
23 #include "AliMUONLocalTriggerBoard.h"
24 #include "AliMUONRegionalTriggerBoard.h"
25 #include "AliMUONGlobalTriggerBoard.h"
26 #include "AliMUONLocalTrigger.h"
27 #include "AliMUONGlobalTrigger.h"
28 #include "AliLoader.h"
29 #include "AliMUONData.h"
30 #include "AliMUONDigit.h"
32 #include "AliLoader.h"
34 #include "Riostream.h"
37 ClassImp(AliMUONTriggerElectronics)
39 const Int_t AliMUONTriggerElectronics::fgkNCrates = 16;
41 //___________________________________________
42 AliMUONTriggerElectronics::AliMUONTriggerElectronics(AliMUONData *Data)
43 : TTask("AliMUONTriggerElectronics",
44 "From trigger digits to Local and Global Trigger objects"),
45 fCrates(new TClonesArray("AliMUONTriggerCrate", fgkNCrates)),
46 fGlobalTriggerBoard(new AliMUONGlobalTriggerBoard),
52 AliFatal("NO MUON TRIGGER DATA");
55 for (Int_t i=0;i<16;i++)
58 for (Int_t j=0;j<16;j++) fLocal[i][j] = 0;
66 AliWarning("ZERO-ALLY-LSB TO BE CHECKED!!!");
67 AliWarning("AliMUONLocalTriggerBoard Y_pos DIVIDED BY 2 TO BE CONSISTENT W/ AliMUONTrackReconstructor!!!");
70 //___________________________________________
71 AliMUONTriggerElectronics::~AliMUONTriggerElectronics()
73 delete fGlobalTriggerBoard;
77 //___________________________________________
78 void AliMUONTriggerElectronics::Factory()
80 ifstream myInputFile(gSystem->ExpandPathName(fSourceFileName.Data()), ios::in);
86 AliError("TRIGGER ELECTRONICS CONFIGURATION FILE COULD NOT BE OPENED");
90 while (getline(myInputFile,sLine))
92 if (sLine.empty()) continue; // Ignore empty lines
95 const Int_t maxfields = 15; char **fields = new char*[maxfields];
99 if (sLine.find("Board",0) != string::npos)
101 strcpy(s,sLine.c_str());
105 for (char *token = strtok(s, " ");
107 token = strtok(NULL, " "))
109 fields[numlines] = new char[strlen(token)+1];
110 strcpy(fields[numlines++],token);
113 char str[10]; strcpy(str, fields[6]); strcat(str, fields[7]);
115 AliMUONTriggerCrate *crate = Crate(str);
119 AddCrate(str); crate = Crate(str);
121 AliMUONRegionalTriggerBoard *rboard = new AliMUONRegionalTriggerBoard();
122 crate->AddBoard(rboard, 0);
125 // CONVENTION: SLOT 0 HOLDS THE REGIONAL BOARD
126 Int_t sl = atoi(fields[10]);
128 AliMUONLocalTriggerBoard *board = new AliMUONLocalTriggerBoard(fields[4], sl);
130 crate->AddBoard(board, sl);
132 while (getline(myInputFile,sLine)) if (sLine.find("transv",0) != string::npos) break;
134 strcpy(s,sLine.c_str());
136 for (char *token = strtok(s, " ");
138 token = strtok(NULL, " ")) if (!strcmp(token,"NONE")) board->SetTC(kFALSE);
140 while (getline(myInputFile,sLine)) if (sLine.find("Switch",0) != string::npos) break;
142 while (getline(myInputFile,sLine)) if (!sLine.empty()) break;
144 strcpy(s,sLine.c_str());
148 for (char *token = strtok(s, " ");
150 token = strtok(NULL, " ")) board->SetSwitch(lines++, atoi(token));
152 for (Int_t i = 0; i<numlines; i++)
153 if (fields[i]) {delete [] fields[i]; fields[i] = 0;}
155 delete [] fields; fields = 0;
162 //___________________________________________
163 void AliMUONTriggerElectronics::Feed()
165 for (Int_t ichamber=10; ichamber<14; ichamber++)
167 TClonesArray *MuonDigits = fMUONData->Digits(ichamber);
168 Int_t ndigits = MuonDigits->GetEntriesFast();
170 for (Int_t digit=0; digit<ndigits; digit++)
172 AliMUONDigit *mdig = static_cast<AliMUONDigit*>(MuonDigits->UncheckedAt(digit));
174 Int_t ix = mdig->PadX(), iy = mdig->PadY();
176 // GET THE SUM OF THE CODED CHARGE
177 // SEE CODING CONVENTION IN AliMUONChamberTrigger::DisIntegration
180 // CHECKME ! The TrackCharge is not ok with new digitizerV3 !
181 // for (Int_t ichg=0; ichg<10; ichg++) schg += mdig->TrackCharge(ichg);
182 // assert(schg==mdig->Signal());
183 schg = mdig->Signal();
185 // APPLY CONDITION ON SOFT BACKGROUND
186 Int_t tchg = schg - (Int_t(schg/10))*10;
188 if (schg<=10 || tchg>0)
190 Int_t cathode = mdig->Cathode();
192 // Now identify local board from (ix,iy)
193 char name[10]; BoardName(ix,iy,name);
195 for (Int_t i=0;i<fgkNCrates;i++)
197 AliMUONTriggerCrate *cr = (AliMUONTriggerCrate*)fCrates->UncheckedAt(i);
199 TObjArray *boards = cr->Boards();
201 AliMUONLocalTriggerBoard *b = (AliMUONLocalTriggerBoard*)boards->FindObject(name);
205 Int_t digitindex = digit;
206 // if (b->GetSwitch(6) && cathode)
207 // b->Setbit(iy+8,cathode,ichamber-10);
209 b->Setbit(iy,cathode,ichamber-10);
211 DigitFiredCircuit(b->GetI(), cathode, ichamber, digitindex);
218 // Particular case of the columns with 22 local boards (2R(L) 3R(L))
219 AliMUONTriggerCrate *crate = 0x0; TObjArray *bs = 0x0;
221 char *scratess[4] = { "2R", "2L", "3L", "3R"};
222 char *scratesd[4] = {"2-3R", "2-3L", "2-3L", "2-3R"};
223 Int_t slotf[4] = { 2, 2, 10, 10};
224 Int_t slotd[4] = { 1, 1, 9, 9};
226 for (Int_t i=0; i<4; i++)
228 crate = (AliMUONTriggerCrate*)fCrates->FindObject(scratess[i]);
229 bs = crate->Boards();
230 AliMUONLocalTriggerBoard *desybb = (AliMUONLocalTriggerBoard*)bs->At(14);
231 AliMUONLocalTriggerBoard *fromcb = (AliMUONLocalTriggerBoard*)bs->At(15);
232 AliMUONLocalTriggerBoard *desxbb = (AliMUONLocalTriggerBoard*)bs->At(16);
234 crate = (AliMUONTriggerCrate*)fCrates->FindObject(scratesd[i]);
235 bs = crate->Boards();
236 AliMUONLocalTriggerBoard *frombb = (AliMUONLocalTriggerBoard*)bs->At(slotf[i]);
237 AliMUONLocalTriggerBoard *desycb = (AliMUONLocalTriggerBoard*)bs->At(slotd[i]);
241 // COPY X3-4 FROM BOARD 2 OF CRATE 2-3 TO BOARD 16 OF CRATE 2
242 // COPY X3-4 FROM BOARD 10 OF CRATE 2-3 TO BOARD 16 OF CRATE 3
243 frombb->GetX34(cX); desxbb->SetX34(cX);
245 // COPY X3-4 FROM BOARD 15 OF CRATE 2 TO BOARD 1 OF CRATE 2-3
246 // COPY X3-4 FROM BOARD 15 OF CRATE 3 TO BOARD 9 OF CRATE 2-3
247 fromcb->GetX34(cX); desycb->SetX34(cX);
251 desybb->GetY(cY); frombb->SetY(cY);
254 // TRANSVERSE CONNECTOR TO REPLICATE Y
255 for (Int_t i=0; i<fgkNCrates; i++)
257 AliMUONTriggerCrate *cr = (AliMUONTriggerCrate*)fCrates->UncheckedAt(i);
259 TObjArray *boards = cr->Boards();
261 for (Int_t j=1; j<boards->GetEntries()-1; j++)
263 TObject *o = boards->At(j);
267 AliMUONLocalTriggerBoard *currboard = (AliMUONLocalTriggerBoard*)o;
269 AliMUONLocalTriggerBoard *neighbour = (AliMUONLocalTriggerBoard*)boards->At(j+1);
271 char **names = new char*[2];
273 names[0] = new char[20]; names[1] = new char[20];
275 currboard->Module(names[0]); neighbour->Module(names[1]);
277 // CASCADE Y TO NEIGHBOUR (FROM 12 BOARD TO 34, 56...)
278 if (currboard->GetTC() && !strcmp(names[0],names[1]))
282 currboard->GetY(cY); neighbour->SetY(cY);
287 // FILL UP/DOWN OF CURRENT BOARD (DONE VIA J3 BUS IN REAL LIFE)
288 for (Int_t i=0; i<fgkNCrates; i++)
290 AliMUONTriggerCrate *cr = (AliMUONTriggerCrate*)fCrates->UncheckedAt(i);
292 TObjArray *boards = cr->Boards();
294 for (Int_t j=1; j<boards->GetEntries()-1; j++)
296 TObject *o = boards->At(j);
300 AliMUONLocalTriggerBoard *currboard = (AliMUONLocalTriggerBoard*)o;
302 AliMUONLocalTriggerBoard *neighbour = (AliMUONLocalTriggerBoard*)boards->At(j+1);
306 if (j==1) {neighbour->GetXY(cXY); currboard->SetXYU(cXY);}
308 // LAST BOARD IN THE CRATE HAS NO UP EXCEPT FOR CRATES 2 & 3
309 if (j<boards->GetEntries()-2)
311 AliMUONLocalTriggerBoard *nextboard = (AliMUONLocalTriggerBoard*)boards->At(j+2);
313 currboard->GetXY(cXY); neighbour->SetXYD(cXY);
314 nextboard->GetXY(cXY); neighbour->SetXYU(cXY);
316 if (j==boards->GetEntries()-3) {neighbour->GetXY(cXY); nextboard->SetXYD(cXY);}
321 for (Int_t i=0; i<fgkNCrates; i++)
323 AliMUONTriggerCrate *cr = (AliMUONTriggerCrate*)fCrates->UncheckedAt(i);
325 cout << "+++ CRATE " << cr->GetName() << endl;
327 TObjArray *boards = cr->Boards();
329 for (Int_t j=1; j<boards->GetEntries()-1; j++)
331 TObject *o = boards->At(j);
335 AliMUONLocalTriggerBoard *currboard = (AliMUONLocalTriggerBoard*)o;
337 AliMUONLocalTriggerBoard *neighbour = (AliMUONLocalTriggerBoard*)boards->At(j+1);
339 // LAST BOARD IN THE CRATE HAS NO UP EXCEPT FOR CRATES 2 & 3
340 if (j<boards->GetEntries()-2)
342 AliMUONLocalTriggerBoard *nextboard = (AliMUONLocalTriggerBoard*)boards->At(j+2);
344 cout << "currb: " << currboard->GetName() << endl;
345 cout << "board: " << neighbour->GetName() << endl;
346 cout << "nextb: " << nextboard->GetName() << endl;
347 currboard->Scan("CONF");
348 currboard->Pattern("X");
349 currboard->Pattern("Y");
350 neighbour->Scan("CONF");
351 neighbour->Pattern("X");
352 neighbour->Pattern("Y");
353 nextboard->Scan("CONF");
354 nextboard->Pattern("X");
355 nextboard->Pattern("Y");
362 //___________________________________________
363 void AliMUONTriggerElectronics::Feed(UShort_t pattern[2][4])
365 for (Int_t i=0; i<fgkNCrates; i++)
367 AliMUONTriggerCrate *cr = (AliMUONTriggerCrate*)fCrates->UncheckedAt(i);
369 TObjArray *boards = cr->Boards();
371 for (Int_t j=1; j<boards->GetEntries(); j++)
373 TObject *o = boards->At(j);
377 AliMUONLocalTriggerBoard *board = (AliMUONLocalTriggerBoard*)o;
379 board->SetXY(pattern);
384 //___________________________________________
385 void AliMUONTriggerElectronics::DumpOS()
387 for (Int_t i=0;i<234;i++)
392 for (Int_t i=0; i<fgkNCrates; i++)
394 AliMUONTriggerCrate *cr = (AliMUONTriggerCrate*)fCrates->UncheckedAt(i);
396 TObjArray *boards = cr->Boards();
398 AliMUONLocalTriggerBoard *board = (AliMUONLocalTriggerBoard*)boards->FindObject(name);
400 if (board) board->Scan("CONF RESPI BITP RESPF");
405 //___________________________________________
406 void AliMUONTriggerElectronics::Scan(Option_t *option)
408 for (Int_t i=0; i<fgkNCrates; i++)
410 AliMUONTriggerCrate *cr = (AliMUONTriggerCrate*)fCrates->UncheckedAt(i);
412 TObjArray *boards = cr->Boards();
414 for (Int_t j=0; j<boards->GetEntries(); j++)
416 TObject *o = boards->At(j);
420 Bool_t cdtion = kFALSE;
422 if (op.Contains("LOCAL")) cdtion = o->IsA() == AliMUONLocalTriggerBoard::Class();
423 if (op.Contains("REGIONAL")) cdtion = o->IsA() == AliMUONRegionalTriggerBoard::Class();
424 if (op.Contains("GLOBAL")) cdtion = o->IsA() == AliMUONGlobalTriggerBoard::Class();
426 if (!o || !cdtion) continue;
428 AliMUONLocalTriggerBoard *board = (AliMUONLocalTriggerBoard*)o;
435 //___________________________________________
436 void AliMUONTriggerElectronics::Reset()
438 for (Int_t i=0; i<fgkNCrates; i++)
440 AliMUONTriggerCrate *cr = (AliMUONTriggerCrate*)fCrates->UncheckedAt(i);
442 TObjArray *boards = cr->Boards();
444 for (Int_t j=0; j<boards->GetEntries(); j++)
446 AliMUONTriggerBoard *b = (AliMUONTriggerBoard*)boards->At(j);
453 //___________________________________________
454 void AliMUONTriggerElectronics::LocalResponse()
464 crate[0].name = "2R"; crate[0].ns = 1; crate[0].slots[0] = 16;
465 crate[1].name = "2L"; crate[1].ns = 1; crate[1].slots[0] = 16;
466 crate[2].name = "3L"; crate[2].ns = 1; crate[2].slots[0] = 16;
467 crate[3].name = "3R"; crate[3].ns = 1; crate[3].slots[0] = 16;
468 crate[4].name = "2-3R"; crate[4].ns = 2; crate[4].slots[0] = 1; crate[4].slots[1] = 9;
469 crate[5].name = "2-3L"; crate[5].ns = 2; crate[5].slots[0] = 1; crate[5].slots[1] = 9;
471 for (Int_t i=0; i<fgkNCrates; i++)
475 AliMUONTriggerCrate *cr = (AliMUONTriggerCrate*)fCrates->UncheckedAt(i);
477 for (Int_t icr=0; icr<6; icr++)
479 const char *n = (crate[icr].name).Data();
481 AliMUONTriggerCrate *dcr = (AliMUONTriggerCrate*)fCrates->FindObject(n);
483 // THIS CRATE CONTAINS AN INTERFACE BOARD
484 if ( dcr && !strcmp(cr->GetName(),dcr->GetName()) ) iib = icr;
487 TObjArray *boards = cr->Boards();
489 AliMUONRegionalTriggerBoard *regb = (AliMUONRegionalTriggerBoard*)boards->At(0);
491 for (Int_t j=1; j<boards->GetEntries(); j++)
493 TObject *o = boards->At(j);
497 AliMUONLocalTriggerBoard *board = (AliMUONLocalTriggerBoard*)o;
503 fLocal[i][j-1] = board->GetResponse();
505 // CRATE CONTAINING INTERFACE BOARD
508 for (Int_t iid = 0; iid<crate[iib].ns; iid++)
510 if ( j == crate[iib].slots[iid] )
512 if ( fLocal[i][j-1] != 0 )
513 AliWarning(Form("Interface board %s in slot %d of crate %s has a non zero response",
514 board->GetName(),j,cr->GetName()));
520 UShort_t thisl[16]; for (Int_t j=0; j<16; j++) thisl[j] = 0;
522 for (Int_t j=1; j<boards->GetEntries(); j++) thisl[j] = fLocal[i][j-1];
524 regb->SetLocalResponse(thisl);
529 //___________________________________________
530 void AliMUONTriggerElectronics::RegionalResponse()
532 for (Int_t i=0; i<fgkNCrates; i++)
534 AliMUONTriggerCrate *cr = (AliMUONTriggerCrate*)fCrates->UncheckedAt(i);
536 TObjArray *boards = cr->Boards();
538 AliMUONRegionalTriggerBoard *regb = (AliMUONRegionalTriggerBoard*)boards->At(0);
544 fRegional[i] = regb->GetResponse();
549 //___________________________________________
550 void AliMUONTriggerElectronics::GlobalResponse()
552 fGlobalTriggerBoard->SetRegionalResponse(fRegional);
554 fGlobalTriggerBoard->Response();
556 fGlobal = fGlobalTriggerBoard->GetResponse();
559 //___________________________________________
560 void AliMUONTriggerElectronics::BoardName(Int_t ix, Int_t iy, char *name)
562 TString s = (ix>0) ? "R" : "L";
564 Int_t board = iy / 16, bid[4] = {12,34,56,78};
568 Int_t line = ix / 10, column = ix - 10 * line;
570 // old scheme: line==1 is line==9
571 line -= 9; line = TMath::Abs(line); line++;
573 sprintf(name,"%sC%dL%dB%d", s.Data(), column, line, bid[board]);
575 AliDebug(3, Form("Strip ( %d , %d ) connected to board %s ", ix, iy, name));
578 //___________________________________________
579 void AliMUONTriggerElectronics::AddCrate(char *name)
581 TClonesArray &lcrates = *fCrates;
582 new(lcrates[fNCrates++]) AliMUONTriggerCrate(name,17);
585 //___________________________________________
586 AliMUONTriggerCrate* AliMUONTriggerElectronics::Crate(char *name)
588 return (AliMUONTriggerCrate*)fCrates->FindObject(name);
591 //___________________________________________
592 void AliMUONTriggerElectronics::BuildName(Int_t icirc, char name[20])
594 const Int_t CircuitId[234] =
596 111, 121, 131, 141, 151, 161, 171,
597 211, 212, 221, 222, 231, 232, 241, 242, 251, 252, 261, 262, 271,
598 311, 312, 321, 322, 331, 332, 341, 342, 351, 352, 361, 362, 371,
599 411, 412, 413, 421, 422, 423, 424, 431, 432, 433, 434, 441, 442, 451, 452, 461, 462, 471,
600 521, 522, 523, 524, 531, 532, 533, 534, 541, 542, 551, 552, 561, 562, 571,
601 611, 612, 613, 621, 622, 623, 624, 631, 632, 633, 634, 641, 642, 651, 652, 661, 662, 671,
602 711, 712, 721, 722, 731, 732, 741, 742, 751, 752, 761, 762, 771,
603 811, 812, 821, 822, 831, 832, 841, 842, 851, 852, 861, 862, 871,
604 911, 921, 931, 941, 951, 961, 971,
605 -111, -121, -131, -141, -151, -161, -171,
606 -211, -212, -221, -222, -231, -232, -241, -242, -251, -252, -261, -262, -271,
607 -311, -312, -321, -322, -331, -332, -341, -342, -351, -352, -361, -362, -371,
608 -411, -412, -413, -421, -422, -423, -424, -431, -432, -433, -434, -441, -442, -451, -452, -461, -462, -471,
609 -521, -522, -523, -524, -531, -532, -533, -534, -541, -542, -551, -552, -561, -562, -571,
610 -611, -612, -613, -621, -622, -623, -624, -631, -632, -633, -634, -641, -642, -651, -652, -661, -662, -671,
611 -711, -712, -721, -722, -731, -732, -741, -742, -751, -752, -761, -762, -771,
612 -811, -812, -821, -822, -831, -832, -841, -842, -851, -852, -861, -862, -871,
613 -911, -921, -931, -941, -951, -961, -971
616 Int_t b[4] = {12, 34, 56, 78};
618 Int_t code = TMath::Abs(CircuitId[icirc]);
620 Int_t L = code / 100;
622 Int_t C = ( code - 100 * L ) / 10;
624 Int_t B = code - 100 * L - 10 * C;
626 const char *Side = (CircuitId[icirc]>0) ? "R" : "L";
629 L -= 9; L = abs(L); L++;
631 sprintf(name,"%sC%dL%dB%d",Side,C,L,b[B-1]);
634 //_______________________________________________________________________
636 AliMUONTriggerElectronics::Exec(Option_t*)
641 //_______________________________________________________________________
642 void AliMUONTriggerElectronics::Trigger()
650 //_______________________________________________________________________
651 void AliMUONTriggerElectronics::DisableCrate(Int_t icrate)
653 fRegional[icrate] = 0;
656 //_______________________________________________________________________
657 void AliMUONTriggerElectronics::DisableCrate(char *Name)
661 for (Int_t i=0; i<fgkNCrates; i++)
663 AliMUONTriggerCrate *cr = (AliMUONTriggerCrate*)fCrates->UncheckedAt(i);
664 if (strcmp(cr->GetName(),Name) )
673 fRegional[icrate] = 0;
676 //_______________________________________________________________________
677 void AliMUONTriggerElectronics::DisableBoardInCrate(Int_t icrate, Int_t islot)
679 // BEWARE, REGIONAL BOARD IS IN SLOT 0
680 fLocal[icrate][islot] = 0;
683 //_______________________________________________________________________
684 void AliMUONTriggerElectronics::Digits2Trigger()
688 fMUONData->ResetTrigger();
690 // RUN THE FULL BEE CHAIN
693 // if ( AliDebugLevel() > 1 )
698 for (Int_t i=0; i<fgkNCrates; i++)
700 AliMUONTriggerCrate *cr = (AliMUONTriggerCrate*)fCrates->UncheckedAt(i);
702 TObjArray *boards = cr->Boards();
704 for (Int_t j=1; j<boards->GetEntries(); j++)
706 TObject *o = boards->At(j);
710 AliMUONLocalTriggerBoard *board = (AliMUONLocalTriggerBoard*)o;
715 if (board->Triggered())
717 Int_t localtr[15] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ,0};
719 Int_t icirc = board->GetI();
722 localtr[1] = board->GetStripX11();
723 localtr[2] = board->GetDev();
724 localtr[3] = board->GetStripY11();
727 localtr[4] = (fLocal[i][j-1] & 12) >> 2;
728 localtr[5] = (fLocal[i][j-1] & 48) >> 4;
729 localtr[6] = (fLocal[i][j-1] & 3);
732 localtr[7] = board->GetXY(0,0);
733 localtr[8] = board->GetXY(0,1);
734 localtr[9] = board->GetXY(0,2);
735 localtr[10] = board->GetXY(0,3);
737 localtr[11] = board->GetXY(1,0);
738 localtr[12] = board->GetXY(1,1);
739 localtr[13] = board->GetXY(1,2);
740 localtr[14] = board->GetXY(1,3);
742 // ADD A NEW LOCAL TRIGGER
743 AliMUONLocalTrigger *pLocTrig = new AliMUONLocalTrigger(localtr, fDigitNumbers[icirc]);
745 fMUONData->AddLocalTrigger(*pLocTrig);
751 // GLOBAL TRIGGER INFORMATION: [0] -> LOW PT
754 Int_t GlobalSinglePlus[3], GlobalSingleMinus[3], GlobalSingleUndef[3];
755 Int_t GlobalPairUnlike[3], GlobalPairLike[3];
757 GlobalPairUnlike[0] = (fGlobal & 16) >> 4;
758 GlobalPairUnlike[1] = (fGlobal & 256) >> 8;
759 GlobalPairUnlike[2] = (fGlobal & 1);
761 GlobalPairLike[0] = (fGlobal & 32) >> 5;
762 GlobalPairLike[1] = (fGlobal & 512) >> 9;
763 GlobalPairLike[2] = (fGlobal & 2) >> 1;
765 GlobalSinglePlus[0] = ((fGlobal & 192) >> 6) == 2;
766 GlobalSinglePlus[1] = ((fGlobal & 3072) >> 10) == 2;
767 GlobalSinglePlus[2] = ((fGlobal & 12) >> 2) == 2;
769 GlobalSingleMinus[0] = ((fGlobal & 192) >> 6) == 1;
770 GlobalSingleMinus[1] = ((fGlobal & 3072) >> 10) == 1;
771 GlobalSingleMinus[2] = ((fGlobal & 12) >> 2) == 1;
773 GlobalSingleUndef[0] = ((fGlobal & 192) >> 6) == 3;
774 GlobalSingleUndef[1] = ((fGlobal & 3072) >> 10) == 3;
775 GlobalSingleUndef[2] = ((fGlobal & 12) >> 2) == 3;
777 AliMUONGlobalTrigger *pGloTrig = new AliMUONGlobalTrigger(GlobalSinglePlus, GlobalSingleMinus,
778 GlobalSingleUndef, GlobalPairUnlike,
781 // ADD A LOCAL TRIGGER IN THE LIST
782 fMUONData->AddGlobalTrigger(*pGloTrig);
784 // Now reset electronics
788 //_______________________________________________________________________
789 void AliMUONTriggerElectronics::ClearDigitNumbers()
791 // RESET fDigitNumbers
792 for (Int_t i=0; i<AliMUONConstants::NTriggerCircuit(); i++) fDigitNumbers[i].Set(0);
795 //_______________________________________________________________________
796 void AliMUONTriggerElectronics::DigitFiredCircuit(Int_t circuit, Int_t cathode,
797 Int_t chamber, Int_t digit)
799 // REGISTERS THAT THE SPECIFIED DIGIT FIRED THE SPECIFIED CIRCUIT
800 // THIS DIGIT GETS ADDED TO AN ARRAY WHICH WILL BE COPIED TO
801 // AliMUONLocalTrigger WHEN SUCH AN OBJECT IS CREATED FOR EACH CIRCUIT
802 Int_t digitnumber = AliMUONLocalTrigger::EncodeDigitNumber(chamber, cathode, digit);
803 Int_t last = fDigitNumbers[circuit].GetSize();
804 fDigitNumbers[circuit].Set(last + 1);
805 fDigitNumbers[circuit][last] = digitnumber;