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"
31 #include "AliMUONData.h"
32 #include "AliMUONDigit.h"
34 #include "AliLoader.h"
35 #include "AliMUONTriggerConstants.h"
36 #include "AliMpTriggerSegmentation.h"
37 #include "AliMUONSegmentation.h"
38 #include "AliMpVSegmentation.h"
42 #include "Riostream.h"
45 ClassImp(AliMUONTriggerElectronics)
47 const Int_t AliMUONTriggerElectronics::fgkNCrates = 16;
49 //___________________________________________
50 AliMUONTriggerElectronics::AliMUONTriggerElectronics(AliMUONData *Data)
51 : TTask("AliMUONTriggerElectronics",
52 "From trigger digits to Local and Global Trigger objects"),
53 fCrates(new TClonesArray("AliMUONTriggerCrate", fgkNCrates)),
54 fGlobalTriggerBoard(new AliMUONGlobalTriggerBoard),
60 AliFatal("NO MUON TRIGGER DATA");
63 for (Int_t i=0;i<16;i++)
66 for (Int_t j=0;j<16;j++) fLocal[i][j] = 0;
71 fCrateMap = new char*[234];
72 for (Int_t i=0;i<234;i++) fBoardMap[i] = 0;
77 AliWarning("ZERO-ALLY-LSB TO BE CHECKED!!!");
78 AliWarning("AliMUONLocalTriggerBoard Y_pos DIVIDED BY 2 TO BE CONSISTENT W/ AliMUONTrackReconstructor!!!");
81 //___________________________________________
82 AliMUONTriggerElectronics::~AliMUONTriggerElectronics()
84 delete fGlobalTriggerBoard;
87 for (Int_t i=0;i<234;i++) if (fCrateMap[i]) {delete [] fCrateMap[i]; fCrateMap[i] = NULL;}
90 //___________________________________________
91 void AliMUONTriggerElectronics::Factory()
93 ifstream myInputFile(gSystem->ExpandPathName(fSourceFileName.Data()), ios::in);
99 AliError("TRIGGER ELECTRONICS CONFIGURATION FILE COULD NOT BE OPENED");
103 while (getline(myInputFile,sLine))
105 if (sLine.empty()) continue; // Ignore empty lines
108 const Int_t maxfields = 15; char **fields = new char*[maxfields];
112 if (sLine.find("Board",0) != string::npos)
114 strcpy(s,sLine.c_str());
118 for (char *token = strtok(s, " ");
120 token = strtok(NULL, " "))
122 fields[numlines] = new char[strlen(token)+1];
123 strcpy(fields[numlines++],token);
126 char str[10]; strcpy(str, fields[6]); strcat(str, fields[7]);
128 AliMUONTriggerCrate *crate = Crate(str);
130 // cout << " Manipulating crate " << str << endl;
136 AddCrate(str); crate = Crate(str);
138 AliMUONRegionalTriggerBoard *rboard = new AliMUONRegionalTriggerBoard();
139 crate->AddBoard(rboard, 0);
142 // CONVENTION: SLOT 0 HOLDS THE REGIONAL BOARD
143 Int_t sl = atoi(fields[10]);
145 AliMUONLocalTriggerBoard *board = new AliMUONLocalTriggerBoard(fields[4], sl);
147 if (strcmp(fields[1],"nn"))
149 Int_t sboard = atoi(fields[1]);
151 board->SetNumber(sboard);
153 fCrateMap[sboard-1] = new char[strlen(str)+1]; strcpy(fCrateMap[sboard-1], str);
154 // cout << " fCrateMap[" << sboard-1 << "]: " << fCrateMap[sboard-1] << endl;
156 fBoardMap[sboard-1] = sl;
159 board->SetCrate(str);
161 crate->AddBoard(board, sl);
163 while (getline(myInputFile,sLine)) if (sLine.find("transv",0) != string::npos) break;
165 strcpy(s,sLine.c_str());
167 for (char *token = strtok(s, " ");
169 token = strtok(NULL, " ")) if (!strcmp(token,"NONE")) board->SetTC(kFALSE);
171 while (getline(myInputFile,sLine)) if (sLine.find("Switch",0) != string::npos) break;
173 while (getline(myInputFile,sLine)) if (!sLine.empty()) break;
175 strcpy(s,sLine.c_str());
179 for (char *token = strtok(s, " ");
181 token = strtok(NULL, " ")) board->SetSwitch(lines++, atoi(token));
183 for (Int_t i = 0; i<numlines; i++)
184 if (fields[i]) {delete [] fields[i]; fields[i] = 0;}
186 delete [] fields; fields = 0;
193 //___________________________________________
194 void AliMUONTriggerElectronics::Feed()
196 for (Int_t ichamber=10; ichamber<14; ichamber++)
198 TClonesArray *MuonDigits = fMUONData->Digits(ichamber);
199 Int_t ndigits = MuonDigits->GetEntriesFast();
201 for (Int_t digit=0; digit<ndigits; digit++)
203 AliMUONDigit *mdig = static_cast<AliMUONDigit*>(MuonDigits->UncheckedAt(digit));
205 Int_t ix = mdig->PadX(), iy = mdig->PadY();
207 // GET THE SUM OF THE CODED CHARGE
208 // SEE CODING CONVENTION IN AliMUONChamberTrigger::DisIntegration
210 for (Int_t ichg=0; ichg<10; ichg++) schg += mdig->TrackCharge(ichg);
212 // APPLY CONDITION ON SOFT BACKGROUND
213 Int_t tchg = schg - (Int_t(schg/10))*10;
215 if (schg<=10 || tchg>0)
217 Int_t cathode = mdig->Cathode();
219 // Now identify local board from (ix,iy)
220 char name[10]; BoardName(ix,iy,name);
222 for (Int_t i=0;i<fgkNCrates;i++)
224 AliMUONTriggerCrate *cr = (AliMUONTriggerCrate*)fCrates->UncheckedAt(i);
226 TObjArray *boards = cr->Boards();
228 AliMUONLocalTriggerBoard *b = (AliMUONLocalTriggerBoard*)boards->FindObject(name);
232 Int_t digitindex = digit;
234 // Y STRIP IS FIRED ONCE BUT ALL BOARDS FROM THE SAME MODULE ARE FED
237 if (b->GetSwitch(6)) iy += 8;
239 char M1[20]; b->Module(M1);
241 for (Int_t j=0;j<fgkNCrates;j++)
243 AliMUONTriggerCrate *ca = (AliMUONTriggerCrate*)fCrates->UncheckedAt(j);
245 TObjArray *bs = ca->Boards();
247 for (Int_t k=1; k<bs->GetEntries()-1; k++)
249 AliMUONLocalTriggerBoard *h = (AliMUONLocalTriggerBoard*)bs->At(k);
253 char M2[20]; h->Module(M2);
255 if (!strcmp(M1,M2)) h->Setbit(iy,cathode,ichamber-10);
261 b->Setbit(iy,cathode,ichamber-10);
263 DigitFiredCircuit(b->GetI(), cathode, ichamber, digitindex);
270 // Particular case of the columns with 22 local boards (2R(L) 3R(L))
271 AliMUONTriggerCrate *crate = 0x0; TObjArray *bs = 0x0;
273 char *scratess[4] = { "2R", "2L", "3L", "3R"};
274 char *scratesd[4] = {"2-3R", "2-3L", "2-3L", "2-3R"};
275 Int_t slotf[4] = { 2, 2, 10, 10};
276 Int_t slotd[4] = { 1, 1, 9, 9};
278 for (Int_t i=0; i<4; i++)
280 crate = (AliMUONTriggerCrate*)fCrates->FindObject(scratess[i]);
281 bs = crate->Boards();
282 AliMUONLocalTriggerBoard *desybb = (AliMUONLocalTriggerBoard*)bs->At(14);
283 AliMUONLocalTriggerBoard *fromcb = (AliMUONLocalTriggerBoard*)bs->At(15);
284 AliMUONLocalTriggerBoard *desxbb = (AliMUONLocalTriggerBoard*)bs->At(16);
286 crate = (AliMUONTriggerCrate*)fCrates->FindObject(scratesd[i]);
287 bs = crate->Boards();
288 AliMUONLocalTriggerBoard *frombb = (AliMUONLocalTriggerBoard*)bs->At(slotf[i]);
289 AliMUONLocalTriggerBoard *desycb = (AliMUONLocalTriggerBoard*)bs->At(slotd[i]);
293 // COPY X3-4 FROM BOARD 2 OF CRATE 2-3 TO BOARD 16 OF CRATE 2
294 // COPY X3-4 FROM BOARD 10 OF CRATE 2-3 TO BOARD 16 OF CRATE 3
295 frombb->GetX34(cX); desxbb->SetX34(cX);
297 // COPY X3-4 FROM BOARD 15 OF CRATE 2 TO BOARD 1 OF CRATE 2-3
298 // COPY X3-4 FROM BOARD 15 OF CRATE 3 TO BOARD 9 OF CRATE 2-3
299 fromcb->GetX34(cX); desycb->SetX34(cX);
303 desybb->GetY(cY); frombb->SetY(cY);
306 // FILL UP/DOWN OF CURRENT BOARD (DONE VIA J3 BUS IN REAL LIFE)
307 for (Int_t i=0; i<fgkNCrates; i++)
309 AliMUONTriggerCrate *cr = (AliMUONTriggerCrate*)fCrates->UncheckedAt(i);
311 TObjArray *boards = cr->Boards();
313 for (Int_t j=1; j<boards->GetEntries()-1; j++)
315 TObject *o = boards->At(j);
319 AliMUONLocalTriggerBoard *currboard = (AliMUONLocalTriggerBoard*)o;
321 AliMUONLocalTriggerBoard *neighbour = (AliMUONLocalTriggerBoard*)boards->At(j+1);
325 if (j==1) {neighbour->GetXY(cXY); currboard->SetXYU(cXY);}
327 // LAST BOARD IN THE CRATE HAS NO UP EXCEPT FOR CRATES 2 & 3
328 if (j<boards->GetEntries()-2)
330 AliMUONLocalTriggerBoard *nextboard = (AliMUONLocalTriggerBoard*)boards->At(j+2);
332 currboard->GetXY(cXY); neighbour->SetXYD(cXY);
333 nextboard->GetXY(cXY); neighbour->SetXYU(cXY);
335 if (j==boards->GetEntries()-3) {neighbour->GetXY(cXY); nextboard->SetXYD(cXY);}
341 //___________________________________________
342 void AliMUONTriggerElectronics::FeedM()
344 for (Int_t ichamber=10; ichamber<14; ichamber++)
346 TClonesArray *MuonDigits = fMUONData->Digits(ichamber);
347 Int_t ndigits = MuonDigits->GetEntriesFast();
349 // cout << " ichamber: " << ichamber << " ndigits: " << ndigits << endl;
351 for (Int_t digit=0; digit<ndigits; digit++)
353 AliMUONDigit *mdig = static_cast<AliMUONDigit*>(MuonDigits->UncheckedAt(digit));
355 // CHECKME ! The TrackCharge is not ok with new digitizerV3 !
356 // for (Int_t ichg=0; ichg<10; ichg++) schg += mdig->TrackCharge(ichg);
357 // assert(schg==mdig->Signal());
358 Int_t schg = mdig->Signal();
360 // APPLY CONDITION ON SOFT BACKGROUND
361 Int_t tchg = schg - (Int_t(schg/10))*10;
363 if (schg<=10 || tchg>0)
367 Int_t digitindex = digit;
368 Int_t detElemId = mdig->DetElemId();
369 Int_t cathode = mdig->Cathode();
371 const AliMpVSegmentation *seg = ((AliMUON*)gAlice->GetDetector("MUON"))->GetSegmentation()->GetMpSegmentation(detElemId,cathode);
373 Int_t ix = mdig->PadX(), iy = mdig->PadY();
375 AliDebug(3,Form("cathode %d ix %d iy %d ",cathode,ix,iy));
377 AliMpPad pad = seg->PadByIndices(AliMpIntPair(ix,iy),kTRUE);
379 for (Int_t i=0; i<pad.GetNofLocations(); i++)
381 AliMpIntPair location = pad.GetLocation(i);
383 Int_t nboard = location.GetFirst();
385 Int_t ibitxy = location.GetSecond();
388 AliMUONTriggerCrate *cr = (AliMUONTriggerCrate*)fCrates->FindObject(fCrateMap[nboard-1]);
390 TObjArray *boards = cr->Boards();
392 AliMUONLocalTriggerBoard *b = (AliMUONLocalTriggerBoard*)boards->At(fBoardMap[nboard-1]);
394 // if (b && nboard && b->GetNumber()==nboard)
397 if (cathode && b->GetSwitch(6)) ibitxy += 8;
399 // cout << " nboard:\t" << nboard << " ibitxy:\t" << ibitxy << " schg:\t" << schg << " crate:\t" << fCrateMap[nboard-1] << endl;
401 b->SetbitM(ibitxy,cathode,ichamber-10);
403 DigitFiredCircuit(b->GetI(), cathode, ichamber, digitindex);
407 // for (Int_t j=0; j<fgkNCrates; j++)
409 // AliMUONTriggerCrate *cr = (AliMUONTriggerCrate*)fCrates->UncheckedAt(j);
411 // TObjArray *boards = cr->Boards();
413 // for (Int_t k=1; k<boards->GetEntries()-1; k++)
415 // AliMUONLocalTriggerBoard *b = (AliMUONLocalTriggerBoard*)boards->At(k);
417 // if (b && nboard && b->GetNumber()==nboard)
419 // if (cathode && b->GetSwitch(6)) ibitxy += 8;
421 // b->SetbitM(ibitxy,cathode,ichamber-10);
423 // // cout << "BOARD: " << b->GetName() << " Number: " << b->GetNumber()
424 // // << " ibitxy: " << ibitxy
425 // // << " nboard: " << nboard
426 // // << " ich: " << ichamber-10 << endl;
428 // DigitFiredCircuit(b->GetI(), cathode, ichamber, digitindex);
436 // fMUONData->ResetDigits();
439 // Particular case of the columns with 22 local boards (2R(L) 3R(L))
440 AliMUONTriggerCrate *crate = 0x0; TObjArray *bs = 0x0;
442 char *scratess[4] = { "2R", "2L", "3L", "3R"};
443 char *scratesd[4] = {"2-3R", "2-3L", "2-3L", "2-3R"};
444 Int_t slotf[4] = { 2, 2, 10, 10};
445 Int_t slotd[4] = { 1, 1, 9, 9};
447 for (Int_t i=0; i<4; i++)
449 crate = (AliMUONTriggerCrate*)fCrates->FindObject(scratess[i]);
450 bs = crate->Boards();
451 AliMUONLocalTriggerBoard *desybb = (AliMUONLocalTriggerBoard*)bs->At(14);
452 AliMUONLocalTriggerBoard *fromcb = (AliMUONLocalTriggerBoard*)bs->At(15);
453 AliMUONLocalTriggerBoard *desxbb = (AliMUONLocalTriggerBoard*)bs->At(16);
455 crate = (AliMUONTriggerCrate*)fCrates->FindObject(scratesd[i]);
456 bs = crate->Boards();
457 AliMUONLocalTriggerBoard *frombb = (AliMUONLocalTriggerBoard*)bs->At(slotf[i]);
458 AliMUONLocalTriggerBoard *desycb = (AliMUONLocalTriggerBoard*)bs->At(slotd[i]);
462 // COPY X3-4 FROM BOARD 2 OF CRATE 2-3 TO BOARD 16 OF CRATE 2
463 // COPY X3-4 FROM BOARD 10 OF CRATE 2-3 TO BOARD 16 OF CRATE 3
464 frombb->GetX34(cX); desxbb->SetX34(cX);
466 // COPY X3-4 FROM BOARD 15 OF CRATE 2 TO BOARD 1 OF CRATE 2-3
467 // COPY X3-4 FROM BOARD 15 OF CRATE 3 TO BOARD 9 OF CRATE 2-3
468 fromcb->GetX34(cX); desycb->SetX34(cX);
472 desybb->GetY(cY); frombb->SetY(cY);
474 frombb->GetY(cY); desxbb->SetY(cY);
475 fromcb->GetY(cY); desycb->SetY(cY);
478 // FILL UP/DOWN OF CURRENT BOARD (DONE VIA J3 BUS IN REAL LIFE)
479 for (Int_t i=0; i<fgkNCrates; i++)
481 AliMUONTriggerCrate *cr = (AliMUONTriggerCrate*)fCrates->UncheckedAt(i);
483 TObjArray *boards = cr->Boards();
485 for (Int_t j=1; j<boards->GetEntries()-1; j++)
487 TObject *o = boards->At(j);
491 AliMUONLocalTriggerBoard *currboard = (AliMUONLocalTriggerBoard*)o;
493 AliMUONLocalTriggerBoard *neighbour = (AliMUONLocalTriggerBoard*)boards->At(j+1);
497 if (j==1) {neighbour->GetXY(cXY); currboard->SetXYU(cXY);}
499 // LAST BOARD IN THE CRATE HAS NO UP EXCEPT FOR CRATES 2 & 3
500 if (j<boards->GetEntries()-2)
502 AliMUONLocalTriggerBoard *nextboard = (AliMUONLocalTriggerBoard*)boards->At(j+2);
504 currboard->GetXY(cXY); neighbour->SetXYD(cXY);
505 nextboard->GetXY(cXY); neighbour->SetXYU(cXY);
507 if (j==boards->GetEntries()-3) {neighbour->GetXY(cXY); nextboard->SetXYD(cXY);}
513 //___________________________________________
514 void AliMUONTriggerElectronics::Feed(UShort_t pattern[2][4])
516 for (Int_t i=0; i<fgkNCrates; i++)
518 AliMUONTriggerCrate *cr = (AliMUONTriggerCrate*)fCrates->UncheckedAt(i);
520 TObjArray *boards = cr->Boards();
522 for (Int_t j=1; j<boards->GetEntries(); j++)
524 TObject *o = boards->At(j);
528 AliMUONLocalTriggerBoard *board = (AliMUONLocalTriggerBoard*)o;
530 board->SetXY(pattern);
535 //___________________________________________
536 void AliMUONTriggerElectronics::DumpOS()
538 for (Int_t i=0;i<234;i++)
543 for (Int_t i=0; i<fgkNCrates; i++)
545 AliMUONTriggerCrate *cr = (AliMUONTriggerCrate*)fCrates->UncheckedAt(i);
547 TObjArray *boards = cr->Boards();
549 AliMUONLocalTriggerBoard *board = (AliMUONLocalTriggerBoard*)boards->FindObject(name);
551 if (board) board->Scan("ALL");
556 //___________________________________________
557 void AliMUONTriggerElectronics::Scan(Option_t *option)
559 for (Int_t i=0; i<fgkNCrates; i++)
561 AliMUONTriggerCrate *cr = (AliMUONTriggerCrate*)fCrates->UncheckedAt(i);
563 TObjArray *boards = cr->Boards();
565 for (Int_t j=0; j<boards->GetEntries(); j++)
567 TObject *o = boards->At(j);
571 Bool_t cdtion = kFALSE;
573 if (op.Contains("LOCAL")) cdtion = o->IsA() == AliMUONLocalTriggerBoard::Class();
574 if (op.Contains("REGIONAL")) cdtion = o->IsA() == AliMUONRegionalTriggerBoard::Class();
575 if (op.Contains("GLOBAL")) cdtion = o->IsA() == AliMUONGlobalTriggerBoard::Class();
577 if (!o || !cdtion) continue;
579 AliMUONLocalTriggerBoard *board = (AliMUONLocalTriggerBoard*)o;
586 //___________________________________________
587 void AliMUONTriggerElectronics::Reset()
589 for (Int_t i=0; i<fgkNCrates; i++)
591 AliMUONTriggerCrate *cr = (AliMUONTriggerCrate*)fCrates->UncheckedAt(i);
593 TObjArray *boards = cr->Boards();
595 for (Int_t j=0; j<boards->GetEntries(); j++)
597 AliMUONTriggerBoard *b = (AliMUONTriggerBoard*)boards->At(j);
603 for (Int_t i=0;i<16;i++)
606 for (Int_t j=0;j<16;j++) fLocal[i][j] = 0;
612 //___________________________________________
613 void AliMUONTriggerElectronics::LocalResponse()
623 crate[0].name = "2R"; crate[0].ns = 1; crate[0].slots[0] = 16;
624 crate[1].name = "2L"; crate[1].ns = 1; crate[1].slots[0] = 16;
625 crate[2].name = "3L"; crate[2].ns = 1; crate[2].slots[0] = 16;
626 crate[3].name = "3R"; crate[3].ns = 1; crate[3].slots[0] = 16;
627 crate[4].name = "2-3R"; crate[4].ns = 2; crate[4].slots[0] = 1; crate[4].slots[1] = 9;
628 crate[5].name = "2-3L"; crate[5].ns = 2; crate[5].slots[0] = 1; crate[5].slots[1] = 9;
630 for (Int_t i=0; i<fgkNCrates; i++)
634 AliMUONTriggerCrate *cr = (AliMUONTriggerCrate*)fCrates->UncheckedAt(i);
636 for (Int_t icr=0; icr<6; icr++)
638 const char *n = (crate[icr].name).Data();
640 AliMUONTriggerCrate *dcr = (AliMUONTriggerCrate*)fCrates->FindObject(n);
642 // THIS CRATE CONTAINS AN INTERFACE BOARD
643 if ( dcr && !strcmp(cr->GetName(),dcr->GetName()) ) iib = icr;
646 TObjArray *boards = cr->Boards();
648 AliMUONRegionalTriggerBoard *regb = (AliMUONRegionalTriggerBoard*)boards->At(0);
650 for (Int_t j=1; j<boards->GetEntries(); j++)
652 TObject *o = boards->At(j);
656 AliMUONLocalTriggerBoard *board = (AliMUONLocalTriggerBoard*)o;
662 fLocal[i][j-1] = board->GetResponse();
664 // CRATE CONTAINING INTERFACE BOARD
667 for (Int_t iid = 0; iid<crate[iib].ns; iid++)
669 if ( j == crate[iib].slots[iid] )
671 if ( fLocal[i][j-1] != 0 )
672 AliWarning(Form("Interface board %s in slot %d of crate %s has a non zero response",
673 board->GetName(),j,cr->GetName()));
679 UShort_t thisl[16]; for (Int_t j=0; j<16; j++) thisl[j] = 0;
681 for (Int_t j=1; j<boards->GetEntries(); j++) thisl[j] = fLocal[i][j-1];
683 regb->SetLocalResponse(thisl);
688 //___________________________________________
689 void AliMUONTriggerElectronics::RegionalResponse()
691 for (Int_t i=0; i<fgkNCrates; i++)
693 AliMUONTriggerCrate *cr = (AliMUONTriggerCrate*)fCrates->UncheckedAt(i);
695 TObjArray *boards = cr->Boards();
697 AliMUONRegionalTriggerBoard *regb = (AliMUONRegionalTriggerBoard*)boards->At(0);
703 fRegional[i] = regb->GetResponse();
708 //___________________________________________
709 void AliMUONTriggerElectronics::GlobalResponse()
711 fGlobalTriggerBoard->SetRegionalResponse(fRegional);
713 fGlobalTriggerBoard->Response();
715 fGlobal = fGlobalTriggerBoard->GetResponse();
718 //___________________________________________
719 void AliMUONTriggerElectronics::BoardName(Int_t ix, Int_t iy, char *name)
721 TString s = (ix>0) ? "R" : "L";
723 Int_t board = iy / 16, bid[4] = {12,34,56,78};
727 Int_t line = ix / 10, column = ix - 10 * line;
729 // old scheme: line==1 is line==9
730 line -= 9; line = TMath::Abs(line); line++;
732 sprintf(name,"%sC%dL%dB%d", s.Data(), column, line, bid[board]);
734 AliDebug(3, Form("Strip ( %d , %d ) connected to board %s ", ix, iy, name));
737 //___________________________________________
738 void AliMUONTriggerElectronics::AddCrate(char *name)
740 TClonesArray &lcrates = *fCrates;
741 new(lcrates[fNCrates++]) AliMUONTriggerCrate(name,17);
744 //___________________________________________
745 AliMUONTriggerCrate* AliMUONTriggerElectronics::Crate(char *name)
747 return (AliMUONTriggerCrate*)fCrates->FindObject(name);
750 //___________________________________________
751 void AliMUONTriggerElectronics::BuildName(Int_t icirc, char name[20])
753 const Int_t CircuitId[234] =
755 111, 121, 131, 141, 151, 161, 171,
756 211, 212, 221, 222, 231, 232, 241, 242, 251, 252, 261, 262, 271,
757 311, 312, 321, 322, 331, 332, 341, 342, 351, 352, 361, 362, 371,
758 411, 412, 413, 421, 422, 423, 424, 431, 432, 433, 434, 441, 442, 451, 452, 461, 462, 471,
759 521, 522, 523, 524, 531, 532, 533, 534, 541, 542, 551, 552, 561, 562, 571,
760 611, 612, 613, 621, 622, 623, 624, 631, 632, 633, 634, 641, 642, 651, 652, 661, 662, 671,
761 711, 712, 721, 722, 731, 732, 741, 742, 751, 752, 761, 762, 771,
762 811, 812, 821, 822, 831, 832, 841, 842, 851, 852, 861, 862, 871,
763 911, 921, 931, 941, 951, 961, 971,
764 -111, -121, -131, -141, -151, -161, -171,
765 -211, -212, -221, -222, -231, -232, -241, -242, -251, -252, -261, -262, -271,
766 -311, -312, -321, -322, -331, -332, -341, -342, -351, -352, -361, -362, -371,
767 -411, -412, -413, -421, -422, -423, -424, -431, -432, -433, -434, -441, -442, -451, -452, -461, -462, -471,
768 -521, -522, -523, -524, -531, -532, -533, -534, -541, -542, -551, -552, -561, -562, -571,
769 -611, -612, -613, -621, -622, -623, -624, -631, -632, -633, -634, -641, -642, -651, -652, -661, -662, -671,
770 -711, -712, -721, -722, -731, -732, -741, -742, -751, -752, -761, -762, -771,
771 -811, -812, -821, -822, -831, -832, -841, -842, -851, -852, -861, -862, -871,
772 -911, -921, -931, -941, -951, -961, -971
775 Int_t b[4] = {12, 34, 56, 78};
777 Int_t code = TMath::Abs(CircuitId[icirc]);
779 Int_t L = code / 100;
781 Int_t C = ( code - 100 * L ) / 10;
783 Int_t B = code - 100 * L - 10 * C;
785 const char *Side = (CircuitId[icirc]>0) ? "R" : "L";
788 L -= 9; L = abs(L); L++;
790 sprintf(name,"%sC%dL%dB%d",Side,C,L,b[B-1]);
793 //_______________________________________________________________________
795 AliMUONTriggerElectronics::Exec(Option_t*)
800 //_______________________________________________________________________
801 void AliMUONTriggerElectronics::Trigger()
809 //_______________________________________________________________________
810 void AliMUONTriggerElectronics::DisableCrate(Int_t icrate)
812 fRegional[icrate] = 0;
815 //_______________________________________________________________________
816 void AliMUONTriggerElectronics::DisableCrate(char *Name)
820 for (Int_t i=0; i<fgkNCrates; i++)
822 AliMUONTriggerCrate *cr = (AliMUONTriggerCrate*)fCrates->UncheckedAt(i);
823 if (strcmp(cr->GetName(),Name) )
832 fRegional[icrate] = 0;
835 //_______________________________________________________________________
836 void AliMUONTriggerElectronics::DisableBoardInCrate(Int_t icrate, Int_t islot)
838 // BEWARE, REGIONAL BOARD IS IN SLOT 0
839 fLocal[icrate][islot] = 0;
842 //_______________________________________________________________________
843 void AliMUONTriggerElectronics::Digits2Trigger()
847 fMUONData->ResetTrigger();
849 // RUN THE FULL BEE CHAIN
853 for (Int_t i=0; i<fgkNCrates; i++)
855 AliMUONTriggerCrate *cr = (AliMUONTriggerCrate*)fCrates->UncheckedAt(i);
857 TObjArray *boards = cr->Boards();
859 for (Int_t j=1; j<boards->GetEntries(); j++)
861 TObject *o = boards->At(j);
865 AliMUONLocalTriggerBoard *board = (AliMUONLocalTriggerBoard*)o;
870 if (board->Triggered())
872 Int_t localtr[15] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ,0};
874 Int_t icirc = board->GetI();
877 localtr[1] = board->GetStripX11();
878 localtr[2] = board->GetDev();
879 localtr[3] = board->GetStripY11();
882 localtr[4] = (fLocal[i][j-1] & 12) >> 2;
883 localtr[5] = (fLocal[i][j-1] & 48) >> 4;
884 localtr[6] = (fLocal[i][j-1] & 3);
887 localtr[7] = board->GetXY(0,0);
888 localtr[8] = board->GetXY(0,1);
889 localtr[9] = board->GetXY(0,2);
890 localtr[10] = board->GetXY(0,3);
892 localtr[11] = board->GetXY(1,0);
893 localtr[12] = board->GetXY(1,1);
894 localtr[13] = board->GetXY(1,2);
895 localtr[14] = board->GetXY(1,3);
897 // ADD A NEW LOCAL TRIGGER
898 AliMUONLocalTrigger *pLocTrig = new AliMUONLocalTrigger(localtr, fDigitNumbers[icirc]);
900 fMUONData->AddLocalTrigger(*pLocTrig);
906 // GLOBAL TRIGGER INFORMATION: [0] -> LOW PT
909 Int_t GlobalSinglePlus[3], GlobalSingleMinus[3], GlobalSingleUndef[3];
910 Int_t GlobalPairUnlike[3], GlobalPairLike[3];
912 GlobalPairUnlike[0] = (fGlobal & 16) >> 4;
913 GlobalPairUnlike[1] = (fGlobal & 256) >> 8;
914 GlobalPairUnlike[2] = (fGlobal & 1);
916 GlobalPairLike[0] = (fGlobal & 32) >> 5;
917 GlobalPairLike[1] = (fGlobal & 512) >> 9;
918 GlobalPairLike[2] = (fGlobal & 2) >> 1;
920 GlobalSinglePlus[0] = ((fGlobal & 192) >> 6) == 2;
921 GlobalSinglePlus[1] = ((fGlobal & 3072) >> 10) == 2;
922 GlobalSinglePlus[2] = ((fGlobal & 12) >> 2) == 2;
924 GlobalSingleMinus[0] = ((fGlobal & 192) >> 6) == 1;
925 GlobalSingleMinus[1] = ((fGlobal & 3072) >> 10) == 1;
926 GlobalSingleMinus[2] = ((fGlobal & 12) >> 2) == 1;
928 GlobalSingleUndef[0] = ((fGlobal & 192) >> 6) == 3;
929 GlobalSingleUndef[1] = ((fGlobal & 3072) >> 10) == 3;
930 GlobalSingleUndef[2] = ((fGlobal & 12) >> 2) == 3;
932 AliMUONGlobalTrigger *pGloTrig = new AliMUONGlobalTrigger(GlobalSinglePlus, GlobalSingleMinus,
933 GlobalSingleUndef, GlobalPairUnlike,
936 // ADD A LOCAL TRIGGER IN THE LIST
937 fMUONData->AddGlobalTrigger(*pGloTrig);
939 // NOW RESET ELECTRONICS
943 //_______________________________________________________________________
944 void AliMUONTriggerElectronics::ClearDigitNumbers()
946 // RESET fDigitNumbers
947 for (Int_t i=0; i<AliMUONConstants::NTriggerCircuit(); i++) fDigitNumbers[i].Set(0);
950 //_______________________________________________________________________
951 void AliMUONTriggerElectronics::DigitFiredCircuit(Int_t circuit, Int_t cathode,
952 Int_t chamber, Int_t digit)
954 // REGISTERS THAT THE SPECIFIED DIGIT FIRED THE SPECIFIED CIRCUIT
955 // THIS DIGIT GETS ADDED TO AN ARRAY WHICH WILL BE COPIED TO
956 // AliMUONLocalTrigger WHEN SUCH AN OBJECT IS CREATED FOR EACH CIRCUIT
957 Int_t digitnumber = AliMUONLocalTrigger::EncodeDigitNumber(chamber, cathode, digit);
958 Int_t last = fDigitNumbers[circuit].GetSize();
959 fDigitNumbers[circuit].Set(last + 1);
960 fDigitNumbers[circuit][last] = digitnumber;