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)
19 //* Manager class for muon trigger electronics
20 //* Client of trigger board classes
24 #include "AliMUONTriggerElectronics.h"
25 #include "AliMUONTriggerCrate.h"
26 #include "AliMUONConstants.h"
27 #include "AliMUONLocalTriggerBoard.h"
28 #include "AliMUONRegionalTriggerBoard.h"
29 #include "AliMUONGlobalTriggerBoard.h"
30 #include "AliMUONLocalTrigger.h"
31 #include "AliMUONGlobalTrigger.h"
33 #include "AliMUONData.h"
34 #include "AliMUONDigit.h"
35 #include "AliMUONTriggerConstants.h"
36 #include "AliMUONSegmentation.h"
37 #include "AliMUONCalibrationData.h"
38 #include "AliMUONVCalibParam.h"
40 #include "AliMpVSegmentation.h"
43 #include "AliLoader.h"
46 //#include "Riostream.h"
50 ClassImp(AliMUONTriggerElectronics)
52 const Int_t AliMUONTriggerElectronics::fgkNCrates = 16;
54 //___________________________________________
55 AliMUONTriggerElectronics::AliMUONTriggerElectronics(AliMUONData *Data, AliMUONCalibrationData* calibData)
56 : TTask("AliMUONTriggerElectronics",
57 "From trigger digits to Local and Global Trigger objects"),
58 fCrates(new TClonesArray("AliMUONTriggerCrate", fgkNCrates)),
59 fGlobalTriggerBoard(new AliMUONGlobalTriggerBoard),
67 AliFatal("NO MUON TRIGGER DATA");
70 for (Int_t i=0;i<16;i++)
73 for (Int_t j=0;j<16;j++) fLocal[i][j] = 0;
78 fCrateMap = new char*[234];
79 for (Int_t i=0;i<234;i++) fBoardMap[i] = 0;
85 AliWarning("ZERO-ALLY-LSB TO BE CHECKED!!!");
86 AliWarning("AliMUONLocalTriggerBoard Y_pos DIVIDED BY 2 TO BE CONSISTENT W/ AliMUONTrackReconstructor!!!");
89 //______________________________________________________________________________
90 AliMUONTriggerElectronics::AliMUONTriggerElectronics(const AliMUONTriggerElectronics& right)
93 /// Protected copy constructor (not implemented)
95 AliFatal("Copy constructor not provided.");
98 //___________________________________________
99 AliMUONTriggerElectronics::~AliMUONTriggerElectronics()
103 delete fGlobalTriggerBoard;
106 for (Int_t i=0;i<234;i++) if (fCrateMap[i]) {delete [] fCrateMap[i]; fCrateMap[i] = NULL;}
109 //______________________________________________________________________________
110 AliMUONTriggerElectronics&
111 AliMUONTriggerElectronics::operator=(const AliMUONTriggerElectronics& right)
113 /// Protected assignement operator (not implemented)
115 // check assignement to self
116 if (this == &right) return *this;
118 AliFatal("Assignement operator not provided.");
123 //___________________________________________
124 void AliMUONTriggerElectronics::Factory(AliMUONCalibrationData* calibData)
126 //* BUILD ALL ELECTRONICS
128 ifstream myInputFile(gSystem->ExpandPathName(fSourceFileName.Data()), ios::in);
130 string sLine, sValue;
134 AliError("TRIGGER ELECTRONICS CONFIGURATION FILE COULD NOT BE OPENED");
138 while (getline(myInputFile,sLine))
140 if (sLine.empty()) continue; // Ignore empty lines
143 const Int_t kMaxfields = 15; char **fields = new char*[kMaxfields];
147 if (sLine.find("Board",0) != string::npos)
149 strcpy(s,sLine.c_str());
153 for (char *token = strtok(s, " ");
155 token = strtok(NULL, " "))
157 fields[numlines] = new char[strlen(token)+1];
158 strcpy(fields[numlines++],token);
161 char str[10]; strcpy(str, fields[6]); strcat(str, fields[7]);
163 AliMUONTriggerCrate *crate = Crate(str);
167 AddCrate(str); crate = Crate(str);
169 AliMUONRegionalTriggerBoard *rboard = new AliMUONRegionalTriggerBoard();
170 crate->AddBoard(rboard, 0);
173 // CONVENTION: SLOT 0 HOLDS THE REGIONAL BOARD
174 Int_t sl = atoi(fields[10]);
176 AliMUONTriggerLut* lut = calibData->TriggerLut();
178 AliMUONLocalTriggerBoard *board =
179 new AliMUONLocalTriggerBoard(fields[4], sl, lut);
181 if (strcmp(fields[1],"nn"))
183 Int_t sboard = atoi(fields[1]);
185 board->SetNumber(sboard);
187 fCrateMap[sboard-1] = new char[strlen(str)+1]; strcpy(fCrateMap[sboard-1], str);
189 fBoardMap[sboard-1] = sl;
192 board->SetCrate(str);
194 crate->AddBoard(board, sl);
196 while (getline(myInputFile,sLine)) if (sLine.find("transv",0) != string::npos) break;
198 strcpy(s,sLine.c_str());
200 for (char *token = strtok(s, " ");
202 token = strtok(NULL, " ")) if (!strcmp(token,"NONE")) board->SetTC(kFALSE);
204 while (getline(myInputFile,sLine)) if (sLine.find("Switch",0) != string::npos) break;
206 while (getline(myInputFile,sLine)) if (!sLine.empty()) break;
208 strcpy(s,sLine.c_str());
212 for (char *token = strtok(s, " ");
214 token = strtok(NULL, " ")) board->SetSwitch(lines++, atoi(token));
216 for (Int_t i = 0; i<numlines; i++)
217 if (fields[i]) {delete [] fields[i]; fields[i] = 0;}
219 delete [] fields; fields = 0;
226 //___________________________________________
227 void AliMUONTriggerElectronics::Feed()
231 for (Int_t ichamber=10; ichamber<14; ichamber++)
233 TClonesArray *muonDigits = fMUONData->Digits(ichamber);
234 Int_t ndigits = muonDigits->GetEntriesFast();
236 for (Int_t digit=0; digit<ndigits; digit++)
238 AliMUONDigit *mdig = static_cast<AliMUONDigit*>(muonDigits->UncheckedAt(digit));
240 Int_t ix = mdig->PadX(), iy = mdig->PadY();
242 // GET THE SUM OF THE CODED CHARGE
243 // SEE CODING CONVENTION IN AliMUONChamberTrigger::DisIntegration
245 for (Int_t ichg=0; ichg<10; ichg++) schg += mdig->TrackCharge(ichg);
247 // APPLY CONDITION ON SOFT BACKGROUND
248 Int_t tchg = schg - (Int_t(schg/10))*10;
250 if (schg<=10 || tchg>0)
252 Int_t cathode = mdig->Cathode();
254 // Now identify local board from (ix,iy)
255 char name[10]; BoardName(ix,iy,name);
257 for (Int_t i=0;i<fgkNCrates;i++)
259 AliMUONTriggerCrate *cr = (AliMUONTriggerCrate*)fCrates->UncheckedAt(i);
261 TObjArray *boards = cr->Boards();
263 AliMUONLocalTriggerBoard *b = (AliMUONLocalTriggerBoard*)boards->FindObject(name);
267 Int_t digitindex = digit;
269 // Y STRIP IS FIRED ONCE BUT ALL BOARDS FROM THE SAME MODULE ARE FED
272 if (b->GetSwitch(6)) iy += 8;
274 char mM1[20]; b->Module(mM1);
276 for (Int_t j=0;j<fgkNCrates;j++)
278 AliMUONTriggerCrate *ca = (AliMUONTriggerCrate*)fCrates->UncheckedAt(j);
280 TObjArray *bs = ca->Boards();
282 for (Int_t k=1; k<bs->GetEntries()-1; k++)
284 AliMUONLocalTriggerBoard *h = (AliMUONLocalTriggerBoard*)bs->At(k);
288 char mM2[20]; h->Module(mM2);
290 if (!strcmp(mM1,mM2)) h->Setbit(iy,cathode,ichamber-10);
296 b->Setbit(iy,cathode,ichamber-10);
298 DigitFiredCircuit(b->GetI(), cathode, ichamber, digitindex);
305 // Particular case of the columns with 22 local boards (2R(L) 3R(L))
306 AliMUONTriggerCrate *crate = 0x0; TObjArray *bs = 0x0;
308 char *scratess[4] = { "2R", "2L", "3L", "3R"};
309 char *scratesd[4] = {"2-3R", "2-3L", "2-3L", "2-3R"};
310 Int_t slotf[4] = { 2, 2, 10, 10};
311 Int_t slotd[4] = { 1, 1, 9, 9};
313 for (Int_t i=0; i<4; i++)
315 crate = (AliMUONTriggerCrate*)fCrates->FindObject(scratess[i]);
316 bs = crate->Boards();
317 AliMUONLocalTriggerBoard *desybb = (AliMUONLocalTriggerBoard*)bs->At(14);
318 AliMUONLocalTriggerBoard *fromcb = (AliMUONLocalTriggerBoard*)bs->At(15);
319 AliMUONLocalTriggerBoard *desxbb = (AliMUONLocalTriggerBoard*)bs->At(16);
321 crate = (AliMUONTriggerCrate*)fCrates->FindObject(scratesd[i]);
322 bs = crate->Boards();
323 AliMUONLocalTriggerBoard *frombb = (AliMUONLocalTriggerBoard*)bs->At(slotf[i]);
324 AliMUONLocalTriggerBoard *desycb = (AliMUONLocalTriggerBoard*)bs->At(slotd[i]);
328 // COPY X3-4 FROM BOARD 2 OF CRATE 2-3 TO BOARD 16 OF CRATE 2
329 // COPY X3-4 FROM BOARD 10 OF CRATE 2-3 TO BOARD 16 OF CRATE 3
330 frombb->GetX34(cX); desxbb->SetX34(cX);
332 // COPY X3-4 FROM BOARD 15 OF CRATE 2 TO BOARD 1 OF CRATE 2-3
333 // COPY X3-4 FROM BOARD 15 OF CRATE 3 TO BOARD 9 OF CRATE 2-3
334 fromcb->GetX34(cX); desycb->SetX34(cX);
338 desybb->GetY(cY); frombb->SetY(cY);
341 // FILL UP/DOWN OF CURRENT BOARD (DONE VIA J3 BUS IN REAL LIFE)
342 for (Int_t i=0; i<fgkNCrates; i++)
344 AliMUONTriggerCrate *cr = (AliMUONTriggerCrate*)fCrates->UncheckedAt(i);
346 TObjArray *boards = cr->Boards();
348 for (Int_t j=1; j<boards->GetEntries()-1; j++)
350 TObject *o = boards->At(j);
354 AliMUONLocalTriggerBoard *currboard = (AliMUONLocalTriggerBoard*)o;
356 AliMUONLocalTriggerBoard *neighbour = (AliMUONLocalTriggerBoard*)boards->At(j+1);
360 if (j==1) {neighbour->GetXY(cXY); currboard->SetXYU(cXY);}
362 // LAST BOARD IN THE CRATE HAS NO UP EXCEPT FOR CRATES 2 & 3
363 if (j<boards->GetEntries()-2)
365 AliMUONLocalTriggerBoard *nextboard = (AliMUONLocalTriggerBoard*)boards->At(j+2);
367 currboard->GetXY(cXY); neighbour->SetXYD(cXY);
368 nextboard->GetXY(cXY); neighbour->SetXYU(cXY);
370 if (j==boards->GetEntries()-3) {neighbour->GetXY(cXY); nextboard->SetXYD(cXY);}
376 //___________________________________________
377 void AliMUONTriggerElectronics::FeedM()
381 for (Int_t ichamber=10; ichamber<14; ichamber++)
383 TClonesArray *muonDigits = fMUONData->Digits(ichamber);
384 Int_t ndigits = muonDigits->GetEntriesFast();
386 for (Int_t digit=0; digit<ndigits; digit++)
388 AliMUONDigit *mdig = static_cast<AliMUONDigit*>(muonDigits->UncheckedAt(digit));
390 // CHECKME ! The TrackCharge is not ok with new digitizerV3 !
391 // for (Int_t ichg=0; ichg<10; ichg++) schg += mdig->TrackCharge(ichg);
392 // assert(schg==mdig->Signal());
393 Int_t schg = mdig->Signal();
395 // APPLY CONDITION ON SOFT BACKGROUND
396 Int_t tchg = schg - (Int_t(schg/10))*10;
398 if (schg<=10 || tchg>0)
402 Int_t digitindex = digit;
403 Int_t detElemId = mdig->DetElemId();
404 Int_t cathode = mdig->Cathode();
406 const AliMpVSegmentation *seg = ((AliMUON*)gAlice->GetDetector("MUON"))->GetSegmentation()->GetMpSegmentation(detElemId,cathode);
408 Int_t ix = mdig->PadX(), iy = mdig->PadY();
410 AliDebug(3,Form("cathode %d ix %d iy %d ",cathode,ix,iy));
412 AliMpPad pad = seg->PadByIndices(AliMpIntPair(ix,iy),kTRUE);
414 for (Int_t i=0; i<pad.GetNofLocations(); i++)
416 AliMpIntPair location = pad.GetLocation(i);
418 Int_t nboard = location.GetFirst();
420 Int_t ibitxy = location.GetSecond();
423 AliMUONTriggerCrate *cr = (AliMUONTriggerCrate*)fCrates->FindObject(fCrateMap[nboard-1]);
425 TObjArray *boards = cr->Boards();
427 AliMUONLocalTriggerBoard *b = (AliMUONLocalTriggerBoard*)boards->At(fBoardMap[nboard-1]);
429 // if (b && nboard && b->GetNumber()==nboard)
432 if (cathode && b->GetSwitch(6)) ibitxy += 8;
434 b->SetbitM(ibitxy,cathode,ichamber-10);
436 DigitFiredCircuit(b->GetI(), cathode, ichamber, digitindex);
443 // Particular case of the columns with 22 local boards (2R(L) 3R(L))
444 AliMUONTriggerCrate *crate = 0x0; TObjArray *bs = 0x0;
446 char *scratess[4] = { "2R", "2L", "3L", "3R"};
447 char *scratesd[4] = {"2-3R", "2-3L", "2-3L", "2-3R"};
448 Int_t slotf[4] = { 2, 2, 10, 10};
449 Int_t slotd[4] = { 1, 1, 9, 9};
451 for (Int_t i=0; i<4; i++)
453 crate = (AliMUONTriggerCrate*)fCrates->FindObject(scratess[i]);
454 bs = crate->Boards();
455 AliMUONLocalTriggerBoard *desybb = (AliMUONLocalTriggerBoard*)bs->At(14);
456 AliMUONLocalTriggerBoard *fromcb = (AliMUONLocalTriggerBoard*)bs->At(15);
457 AliMUONLocalTriggerBoard *desxbb = (AliMUONLocalTriggerBoard*)bs->At(16);
459 crate = (AliMUONTriggerCrate*)fCrates->FindObject(scratesd[i]);
460 bs = crate->Boards();
461 AliMUONLocalTriggerBoard *frombb = (AliMUONLocalTriggerBoard*)bs->At(slotf[i]);
462 AliMUONLocalTriggerBoard *desycb = (AliMUONLocalTriggerBoard*)bs->At(slotd[i]);
466 // COPY X3-4 FROM BOARD 2 OF CRATE 2-3 TO BOARD 16 OF CRATE 2
467 // COPY X3-4 FROM BOARD 10 OF CRATE 2-3 TO BOARD 16 OF CRATE 3
468 frombb->GetX34(cX); desxbb->SetX34(cX);
470 // COPY X3-4 FROM BOARD 15 OF CRATE 2 TO BOARD 1 OF CRATE 2-3
471 // COPY X3-4 FROM BOARD 15 OF CRATE 3 TO BOARD 9 OF CRATE 2-3
472 fromcb->GetX34(cX); desycb->SetX34(cX);
476 desybb->GetY(cY); frombb->SetY(cY);
478 frombb->GetY(cY); desxbb->SetY(cY);
479 fromcb->GetY(cY); desycb->SetY(cY);
482 // FILL UP/DOWN OF CURRENT BOARD (DONE VIA J3 BUS IN REAL LIFE)
483 for (Int_t i=0; i<fgkNCrates; i++)
485 AliMUONTriggerCrate *cr = (AliMUONTriggerCrate*)fCrates->UncheckedAt(i);
487 TObjArray *boards = cr->Boards();
489 for (Int_t j=1; j<boards->GetEntries()-1; j++)
491 TObject *o = boards->At(j);
495 AliMUONLocalTriggerBoard *currboard = (AliMUONLocalTriggerBoard*)o;
497 AliMUONLocalTriggerBoard *neighbour = (AliMUONLocalTriggerBoard*)boards->At(j+1);
501 if (j==1) {neighbour->GetXY(cXY); currboard->SetXYU(cXY);}
503 // LAST BOARD IN THE CRATE HAS NO UP EXCEPT FOR CRATES 2 & 3
504 if (j<boards->GetEntries()-2)
506 AliMUONLocalTriggerBoard *nextboard = (AliMUONLocalTriggerBoard*)boards->At(j+2);
508 currboard->GetXY(cXY); neighbour->SetXYD(cXY);
509 nextboard->GetXY(cXY); neighbour->SetXYU(cXY);
511 if (j==boards->GetEntries()-3) {neighbour->GetXY(cXY); nextboard->SetXYD(cXY);}
517 //___________________________________________
518 void AliMUONTriggerElectronics::Feed(UShort_t pattern[2][4])
522 for (Int_t i=0; i<fgkNCrates; i++)
524 AliMUONTriggerCrate *cr = (AliMUONTriggerCrate*)fCrates->UncheckedAt(i);
526 TObjArray *boards = cr->Boards();
528 for (Int_t j=1; j<boards->GetEntries(); j++)
530 TObject *o = boards->At(j);
534 AliMUONLocalTriggerBoard *board = (AliMUONLocalTriggerBoard*)o;
536 board->SetXY(pattern);
541 //___________________________________________
542 void AliMUONTriggerElectronics::DumpOS()
544 //* DUMP IN THE OLD WAY
546 for (Int_t i=0;i<234;i++)
551 for (Int_t i=0; i<fgkNCrates; i++)
553 AliMUONTriggerCrate *cr = (AliMUONTriggerCrate*)fCrates->UncheckedAt(i);
555 TObjArray *boards = cr->Boards();
557 AliMUONLocalTriggerBoard *board = (AliMUONLocalTriggerBoard*)boards->FindObject(name);
559 if (board) board->Scan("ALL");
564 //___________________________________________
565 void AliMUONTriggerElectronics::Scan(Option_t *option)
569 for (Int_t i=0; i<fgkNCrates; i++)
571 AliMUONTriggerCrate *cr = (AliMUONTriggerCrate*)fCrates->UncheckedAt(i);
573 TObjArray *boards = cr->Boards();
575 for (Int_t j=0; j<boards->GetEntries(); j++)
577 TObject *o = boards->At(j);
581 Bool_t cdtion = kFALSE;
583 if (op.Contains("LOCAL")) cdtion = o->IsA() == AliMUONLocalTriggerBoard::Class();
584 if (op.Contains("REGIONAL")) cdtion = o->IsA() == AliMUONRegionalTriggerBoard::Class();
585 if (op.Contains("GLOBAL")) cdtion = o->IsA() == AliMUONGlobalTriggerBoard::Class();
587 if (!o || !cdtion) continue;
589 AliMUONLocalTriggerBoard *board = (AliMUONLocalTriggerBoard*)o;
596 //___________________________________________
597 void AliMUONTriggerElectronics::Reset()
601 for (Int_t i=0; i<fgkNCrates; i++)
603 AliMUONTriggerCrate *cr = (AliMUONTriggerCrate*)fCrates->UncheckedAt(i);
605 TObjArray *boards = cr->Boards();
607 for (Int_t j=0; j<boards->GetEntries(); j++)
609 AliMUONTriggerBoard *b = (AliMUONTriggerBoard*)boards->At(j);
615 for (Int_t i=0;i<16;i++)
618 for (Int_t j=0;j<16;j++) fLocal[i][j] = 0;
624 //_______________________________________________________________________
625 void AliMUONTriggerElectronics::LoadMasks(AliMUONCalibrationData* calibData)
627 // LOAD MASKS FROM CDB
631 for (Int_t i=0; i<fgkNCrates; i++)
633 AliMUONTriggerCrate *cr = (AliMUONTriggerCrate*)fCrates->UncheckedAt(i);
635 TObjArray *boards = cr->Boards();
637 AliMUONRegionalTriggerBoard *regb =
638 (AliMUONRegionalTriggerBoard*)boards->At(0);
640 AliMUONVCalibParam* regionalBoardMasks = calibData->RegionalTriggerBoardMasks(i);
642 for ( Int_t i = 0; i < regionalBoardMasks->Size(); ++i )
644 UShort_t rmask = static_cast<UShort_t>(regionalBoardMasks->ValueAsInt(i) & 0x3F);
648 for (Int_t j=1; j<boards->GetEntries(); j++)
650 AliMUONLocalTriggerBoard *b = (AliMUONLocalTriggerBoard*)boards->At(j);
652 Int_t cardNumber = b->GetNumber();
654 if (cardNumber) // interface board are not interested
656 AliMUONVCalibParam* localBoardMasks = calibData->LocalTriggerBoardMasks(cardNumber);
657 for ( Int_t i = 0; i < localBoardMasks->Size(); ++i )
659 UShort_t lmask = static_cast<UShort_t>(localBoardMasks->ValueAsInt(i) & 0xFFFF);
666 AliMUONVCalibParam* globalBoardMasks = calibData->GlobalTriggerBoardMasks();
667 for ( Int_t i = 0; i < globalBoardMasks->Size(); ++i )
669 UShort_t gmask = static_cast<UShort_t>(globalBoardMasks->ValueAsInt(i) & 0xFFF);
670 fGlobalTriggerBoard->Mask(i,gmask);
675 //___________________________________________
676 void AliMUONTriggerElectronics::LocalResponse()
686 crate[0].name = "2R"; crate[0].ns = 1; crate[0].slots[0] = 16;
687 crate[1].name = "2L"; crate[1].ns = 1; crate[1].slots[0] = 16;
688 crate[2].name = "3L"; crate[2].ns = 1; crate[2].slots[0] = 16;
689 crate[3].name = "3R"; crate[3].ns = 1; crate[3].slots[0] = 16;
690 crate[4].name = "2-3R"; crate[4].ns = 2; crate[4].slots[0] = 1; crate[4].slots[1] = 9;
691 crate[5].name = "2-3L"; crate[5].ns = 2; crate[5].slots[0] = 1; crate[5].slots[1] = 9;
693 for (Int_t i=0; i<fgkNCrates; i++)
697 AliMUONTriggerCrate *cr = (AliMUONTriggerCrate*)fCrates->UncheckedAt(i);
699 for (Int_t icr=0; icr<6; icr++)
701 const char *n = (crate[icr].name).Data();
703 AliMUONTriggerCrate *dcr = (AliMUONTriggerCrate*)fCrates->FindObject(n);
705 // THIS CRATE CONTAINS AN INTERFACE BOARD
706 if ( dcr && !strcmp(cr->GetName(),dcr->GetName()) ) iib = icr;
709 TObjArray *boards = cr->Boards();
711 AliMUONRegionalTriggerBoard *regb = (AliMUONRegionalTriggerBoard*)boards->At(0);
713 UShort_t thisl[16]; for (Int_t j=0; j<16; j++) thisl[j] = 0;
715 for (Int_t j=1; j<boards->GetEntries(); j++)
717 TObject *o = boards->At(j);
721 AliMUONLocalTriggerBoard *board = (AliMUONLocalTriggerBoard*)o;
727 fLocal[i][j-1] = board->GetResponse();
729 // CRATE CONTAINING INTERFACE BOARD
732 for (Int_t iid = 0; iid<crate[iib].ns; iid++)
734 if ( j == crate[iib].slots[iid] )
736 if ( fLocal[i][j-1] != 0 )
737 AliWarning(Form("Interface board %s in slot %d of crate %s has a non zero response",
738 board->GetName(),j,cr->GetName()));
743 thisl[j-1] = fLocal[i][j-1];
747 regb->SetLocalResponse(thisl);
751 //___________________________________________
752 void AliMUONTriggerElectronics::RegionalResponse()
756 for (Int_t i=0; i<fgkNCrates; i++)
758 AliMUONTriggerCrate *cr = (AliMUONTriggerCrate*)fCrates->UncheckedAt(i);
760 TObjArray *boards = cr->Boards();
762 AliMUONRegionalTriggerBoard *regb = (AliMUONRegionalTriggerBoard*)boards->At(0);
768 fRegional[i] = regb->GetResponse();
773 //___________________________________________
774 void AliMUONTriggerElectronics::GlobalResponse()
778 fGlobalTriggerBoard->SetRegionalResponse(fRegional);
780 fGlobalTriggerBoard->Response();
782 fGlobal = fGlobalTriggerBoard->GetResponse();
785 //___________________________________________
786 void AliMUONTriggerElectronics::BoardName(Int_t ix, Int_t iy, char *name)
788 //* BOARD NAME FROM PAD INFO (OLD MAPPING)
790 TString s = (ix>0) ? "R" : "L";
792 Int_t board = iy / 16, bid[4] = {12,34,56,78};
796 Int_t line = ix / 10, column = ix - 10 * line;
798 // old scheme: line==1 is line==9
799 line -= 9; line = TMath::Abs(line); line++;
801 sprintf(name,"%sC%dL%dB%d", s.Data(), column, line, bid[board]);
803 AliDebug(3, Form("Strip ( %d , %d ) connected to board %s ", ix, iy, name));
806 //___________________________________________
807 void AliMUONTriggerElectronics::AddCrate(char *name)
811 TClonesArray &lcrates = *fCrates;
812 new(lcrates[fNCrates++]) AliMUONTriggerCrate(name,17);
815 //___________________________________________
816 AliMUONTriggerCrate* AliMUONTriggerElectronics::Crate(char *name)
820 return (AliMUONTriggerCrate*)fCrates->FindObject(name);
823 //___________________________________________
824 void AliMUONTriggerElectronics::BuildName(Int_t icirc, char name[20])
826 //* GET BOARD NAME FROM OLD NUMBERING
828 const Int_t kCircuitId[234] =
830 111, 121, 131, 141, 151, 161, 171,
831 211, 212, 221, 222, 231, 232, 241, 242, 251, 252, 261, 262, 271,
832 311, 312, 321, 322, 331, 332, 341, 342, 351, 352, 361, 362, 371,
833 411, 412, 413, 421, 422, 423, 424, 431, 432, 433, 434, 441, 442, 451, 452, 461, 462, 471,
834 521, 522, 523, 524, 531, 532, 533, 534, 541, 542, 551, 552, 561, 562, 571,
835 611, 612, 613, 621, 622, 623, 624, 631, 632, 633, 634, 641, 642, 651, 652, 661, 662, 671,
836 711, 712, 721, 722, 731, 732, 741, 742, 751, 752, 761, 762, 771,
837 811, 812, 821, 822, 831, 832, 841, 842, 851, 852, 861, 862, 871,
838 911, 921, 931, 941, 951, 961, 971,
839 -111, -121, -131, -141, -151, -161, -171,
840 -211, -212, -221, -222, -231, -232, -241, -242, -251, -252, -261, -262, -271,
841 -311, -312, -321, -322, -331, -332, -341, -342, -351, -352, -361, -362, -371,
842 -411, -412, -413, -421, -422, -423, -424, -431, -432, -433, -434, -441, -442, -451, -452, -461, -462, -471,
843 -521, -522, -523, -524, -531, -532, -533, -534, -541, -542, -551, -552, -561, -562, -571,
844 -611, -612, -613, -621, -622, -623, -624, -631, -632, -633, -634, -641, -642, -651, -652, -661, -662, -671,
845 -711, -712, -721, -722, -731, -732, -741, -742, -751, -752, -761, -762, -771,
846 -811, -812, -821, -822, -831, -832, -841, -842, -851, -852, -861, -862, -871,
847 -911, -921, -931, -941, -951, -961, -971
850 Int_t b[4] = {12, 34, 56, 78};
852 Int_t code = TMath::Abs(kCircuitId[icirc]);
854 Int_t lL = code / 100;
856 Int_t cC = ( code - 100 * lL ) / 10;
858 Int_t bB = code - 100 * lL - 10 * cC;
860 const char *side = (kCircuitId[icirc]>0) ? "R" : "L";
863 lL -= 9; lL = abs(lL); lL++;
865 sprintf(name,"%sC%dL%dB%d",side,cC,lL,b[bB-1]);
868 //_______________________________________________________________________
870 AliMUONTriggerElectronics::Exec(Option_t*)
877 //_______________________________________________________________________
878 void AliMUONTriggerElectronics::Trigger()
888 //_______________________________________________________________________
889 void AliMUONTriggerElectronics::Digits2Trigger()
895 fMUONData->ResetTrigger();
897 // RUN THE FULL BEE CHAIN
901 for (Int_t i=0; i<fgkNCrates; i++)
903 AliMUONTriggerCrate *cr = (AliMUONTriggerCrate*)fCrates->UncheckedAt(i);
905 TObjArray *boards = cr->Boards();
907 for (Int_t j=1; j<boards->GetEntries(); j++)
909 TObject *o = boards->At(j);
913 AliMUONLocalTriggerBoard *board = (AliMUONLocalTriggerBoard*)o;
918 if (board->Triggered())
920 Int_t localtr[15] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ,0};
922 Int_t icirc = board->GetI();
925 localtr[1] = board->GetStripX11();
926 localtr[2] = board->GetDev();
927 localtr[3] = board->GetStripY11();
930 localtr[4] = (fLocal[i][j-1] & 12) >> 2;
931 localtr[5] = (fLocal[i][j-1] & 48) >> 4;
932 localtr[6] = (fLocal[i][j-1] & 3);
935 rrr.Set(6,&fLocal[i][j-1]);
938 localtr[7] = board->GetXY(0,0);
939 localtr[8] = board->GetXY(0,1);
940 localtr[9] = board->GetXY(0,2);
941 localtr[10] = board->GetXY(0,3);
943 localtr[11] = board->GetXY(1,0);
944 localtr[12] = board->GetXY(1,1);
945 localtr[13] = board->GetXY(1,2);
946 localtr[14] = board->GetXY(1,3);
948 // ADD A NEW LOCAL TRIGGER
949 AliMUONLocalTrigger *pLocTrig = new AliMUONLocalTrigger(localtr, fDigitNumbers[icirc]);
951 fMUONData->AddLocalTrigger(*pLocTrig);
957 // GLOBAL TRIGGER INFORMATION: [0] -> LOW PT
960 Int_t globalSinglePlus[3], globalSingleMinus[3], globalSingleUndef[3];
961 Int_t globalPairUnlike[3], globalPairLike[3];
963 globalPairUnlike[0] = (fGlobal & 16) >> 4;
964 globalPairUnlike[1] = (fGlobal & 256) >> 8;
965 globalPairUnlike[2] = (fGlobal & 1);
967 globalPairLike[0] = (fGlobal & 32) >> 5;
968 globalPairLike[1] = (fGlobal & 512) >> 9;
969 globalPairLike[2] = (fGlobal & 2) >> 1;
971 globalSinglePlus[0] = ((fGlobal & 192) >> 6) == 2;
972 globalSinglePlus[1] = ((fGlobal & 3072) >> 10) == 2;
973 globalSinglePlus[2] = ((fGlobal & 12) >> 2) == 2;
975 globalSingleMinus[0] = ((fGlobal & 192) >> 6) == 1;
976 globalSingleMinus[1] = ((fGlobal & 3072) >> 10) == 1;
977 globalSingleMinus[2] = ((fGlobal & 12) >> 2) == 1;
979 globalSingleUndef[0] = ((fGlobal & 192) >> 6) == 3;
980 globalSingleUndef[1] = ((fGlobal & 3072) >> 10) == 3;
981 globalSingleUndef[2] = ((fGlobal & 12) >> 2) == 3;
983 AliMUONGlobalTrigger *pGloTrig = new AliMUONGlobalTrigger(globalSinglePlus, globalSingleMinus,
984 globalSingleUndef, globalPairUnlike,
987 // ADD A LOCAL TRIGGER IN THE LIST
988 fMUONData->AddGlobalTrigger(*pGloTrig);
990 // NOW RESET ELECTRONICS
994 //_______________________________________________________________________
995 void AliMUONTriggerElectronics::ClearDigitNumbers()
997 // RESET fDigitNumbers
998 for (Int_t i=0; i<AliMUONConstants::NTriggerCircuit(); i++) fDigitNumbers[i].Set(0);
1001 //_______________________________________________________________________
1002 void AliMUONTriggerElectronics::DigitFiredCircuit(Int_t circuit, Int_t cathode,
1003 Int_t chamber, Int_t digit)
1005 // REGISTERS THAT THE SPECIFIED DIGIT FIRED THE SPECIFIED CIRCUIT
1006 // THIS DIGIT GETS ADDED TO AN ARRAY WHICH WILL BE COPIED TO
1007 // AliMUONLocalTrigger WHEN SUCH AN OBJECT IS CREATED FOR EACH CIRCUIT
1008 Int_t digitnumber = AliMUONLocalTrigger::EncodeDigitNumber(chamber, cathode, digit);
1009 Int_t last = fDigitNumbers[circuit].GetSize();
1010 fDigitNumbers[circuit].Set(last + 1);
1011 fDigitNumbers[circuit][last] = digitnumber;