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 "AliMUONTriggerCrateStore.h"
27 #include "AliMUONConstants.h"
28 #include "AliMUONLocalTriggerBoard.h"
29 #include "AliMUONRegionalTriggerBoard.h"
30 #include "AliMUONGlobalTriggerBoard.h"
31 #include "AliMUONLocalTrigger.h"
32 #include "AliMUONRegionalTrigger.h"
33 #include "AliMUONGlobalTrigger.h"
35 #include "AliMUONData.h"
36 #include "AliMUONDigit.h"
37 #include "AliMUONSegmentation.h"
38 #include "AliMUONCalibrationData.h"
39 #include "AliMUONVCalibParam.h"
41 #include "AliMpSegmentation.h"
42 #include "AliMpVSegmentation.h"
45 #include "AliLoader.h"
48 //#include "Riostream.h"
53 ClassImp(AliMUONTriggerElectronics)
56 //___________________________________________
57 AliMUONTriggerElectronics::AliMUONTriggerElectronics(AliMUONData *Data, AliMUONCalibrationData* calibData)
58 : TTask("AliMUONTriggerElectronics",
59 "From trigger digits to Local and Global Trigger objects"),
61 fCrates(new AliMUONTriggerCrateStore),
62 fGlobalTriggerBoard(new AliMUONGlobalTriggerBoard),
64 fLocalTrigger(new AliMUONLocalTrigger()),
65 fGlobalTrigger(new AliMUONGlobalTrigger())
72 AliFatal("NO MUON TRIGGER DATA");
80 //___________________________________________
81 AliMUONTriggerElectronics::~AliMUONTriggerElectronics()
85 delete fGlobalTriggerBoard;
88 delete fGlobalTrigger;
92 //___________________________________________
93 void AliMUONTriggerElectronics::Factory(AliMUONCalibrationData* calibData)
95 /// BUILD ALL ELECTRONICS
98 // get coinc44 from AliMUON (added 12/09/06)
99 AliMUON *pMUON = (AliMUON*)gAlice->GetModule("MUON");
100 Int_t coinc44 = pMUON->GetTriggerCoinc44();
101 if (coinc44 != 0 && coinc44 != 1) {
102 AliFatal("Coinc 44 should be equal to 0 or 1");
106 fCrates->ReadFromFile(gSystem->ExpandPathName(fSourceFileName.Data()));
108 if ( !calibData ) return;
110 AliMUONTriggerLut* lut = calibData->TriggerLut();
114 AliMUONLocalTriggerBoard* localBoard;
116 fCrates->FirstLocalBoard();
118 while ( (localBoard=fCrates->NextLocalBoard()) )
120 localBoard->SetLUT(lut);
121 localBoard->SetCoinc44(coinc44);
125 //___________________________________________
126 void AliMUONTriggerElectronics::FeedM()
130 for (Int_t ichamber=10; ichamber<14; ichamber++)
132 TClonesArray *muonDigits = fMUONData->Digits(ichamber);
133 Int_t ndigits = muonDigits->GetEntriesFast();
135 for (Int_t digit=0; digit<ndigits; digit++)
137 AliMUONDigit *mdig = static_cast<AliMUONDigit*>(muonDigits->UncheckedAt(digit));
139 // CHECKME ! The TrackCharge is not ok with new digitizerV3 !
140 // for (Int_t ichg=0; ichg<10; ichg++) schg += mdig->TrackCharge(ichg);
141 // assert(schg==mdig->Signal());
142 Int_t schg = (Int_t)(mdig->Signal() + 0.5);
144 // APPLY CONDITION ON SOFT BACKGROUND
145 Int_t tchg = schg - (Int_t(schg/10))*10;
147 if (schg<=10 || tchg>0)
151 Int_t digitindex = digit;
152 Int_t detElemId = mdig->DetElemId();
153 Int_t cathode = mdig->Cathode();
155 const AliMpVSegmentation *seg =
156 AliMpSegmentation::Instance()->GetMpSegmentation(detElemId,cathode);
158 Int_t ix = mdig->PadX(), iy = mdig->PadY();
160 AliDebug(3,Form("cathode %d ix %d iy %d ",cathode,ix,iy));
162 AliMpPad pad = seg->PadByIndices(AliMpIntPair(ix,iy),kTRUE);
164 for (Int_t i=0; i<pad.GetNofLocations(); i++)
166 AliMpIntPair location = pad.GetLocation(i);
168 Int_t nboard = location.GetFirst();
170 Int_t ibitxy = location.GetSecond();
172 AliMUONLocalTriggerBoard *b = fCrates->LocalBoard(nboard);
176 if (cathode && b->GetSwitch(6)) ibitxy += 8;
178 b->SetbitM(ibitxy,cathode,ichamber-10);
180 DigitFiredCircuit(b->GetI(), cathode, ichamber, digitindex);
184 AliError(Form("Could not get local board number %d",b->GetNumber()));
191 // Particular case of the columns with 22 local boards (2R(L) 3R(L))
192 AliMUONTriggerCrate *crate = 0x0; TObjArray *bs = 0x0;
194 char *scratess[4] = { "2R", "2L", "3L", "3R"};
195 char *scratesd[4] = {"2-3R", "2-3L", "2-3L", "2-3R"};
196 Int_t slotf[4] = { 2, 2, 10, 10};
197 Int_t slotd[4] = { 1, 1, 9, 9};
199 for (Int_t i = 0; i < 4; i++)
201 crate = fCrates->Crate(scratess[i]);
202 bs = crate->Boards();
203 AliMUONLocalTriggerBoard *desybb = (AliMUONLocalTriggerBoard*)bs->At(14);
204 AliMUONLocalTriggerBoard *fromcb = (AliMUONLocalTriggerBoard*)bs->At(15);
205 AliMUONLocalTriggerBoard *desxbb = (AliMUONLocalTriggerBoard*)bs->At(16);
207 crate = fCrates->Crate(scratesd[i]);
208 bs = crate->Boards();
209 AliMUONLocalTriggerBoard *frombb = (AliMUONLocalTriggerBoard*)bs->At(slotf[i]);
210 AliMUONLocalTriggerBoard *desycb = (AliMUONLocalTriggerBoard*)bs->At(slotd[i]);
214 // COPY X3-4 FROM BOARD 2 OF CRATE 2-3 TO BOARD 16 OF CRATE 2
215 // COPY X3-4 FROM BOARD 10 OF CRATE 2-3 TO BOARD 16 OF CRATE 3
216 frombb->GetX34(cX); desxbb->SetX34(cX);
218 // COPY X3-4 FROM BOARD 15 OF CRATE 2 TO BOARD 1 OF CRATE 2-3
219 // COPY X3-4 FROM BOARD 15 OF CRATE 3 TO BOARD 9 OF CRATE 2-3
220 fromcb->GetX34(cX); desycb->SetX34(cX);
224 desybb->GetY(cY); frombb->SetY(cY);
226 frombb->GetY(cY); desxbb->SetY(cY);
227 fromcb->GetY(cY); desycb->SetY(cY);
230 // FILL UP/DOWN OF CURRENT BOARD (DONE VIA J3 BUS IN REAL LIFE)
231 AliMUONTriggerCrate* cr;
233 fCrates->FirstCrate();
235 while ( ( cr = fCrates->NextCrate() ) )
237 TObjArray *boards = cr->Boards();
239 for (Int_t j = 1; j < boards->GetEntries()-1; j++)
241 TObject *o = boards->At(j);
245 AliMUONLocalTriggerBoard *currboard = (AliMUONLocalTriggerBoard*)o;
247 AliMUONLocalTriggerBoard *neighbour = (AliMUONLocalTriggerBoard*)boards->At(j+1);
251 if (j==1) {neighbour->GetXY(cXY); currboard->SetXYU(cXY);}
253 // LAST BOARD IN THE CRATE HAS NO UP EXCEPT FOR CRATES 2 & 3
254 if (j < boards->GetEntries()-2)
256 AliMUONLocalTriggerBoard *nextboard = (AliMUONLocalTriggerBoard*)boards->At(j+2);
258 currboard->GetXY(cXY); neighbour->SetXYD(cXY);
259 nextboard->GetXY(cXY); neighbour->SetXYU(cXY);
261 if (j==boards->GetEntries()-3) {neighbour->GetXY(cXY); nextboard->SetXYD(cXY);}
267 //___________________________________________
268 void AliMUONTriggerElectronics::Feed(UShort_t pattern[2][4])
272 AliMUONTriggerCrate* cr;
274 fCrates->FirstCrate();
276 while ( ( cr = fCrates->NextCrate() ) )
278 TObjArray *boards = cr->Boards();
280 for (Int_t j = 1; j < boards->GetEntries(); j++)
282 TObject *o = boards->At(j);
286 AliMUONLocalTriggerBoard *board = (AliMUONLocalTriggerBoard*)o;
288 board->SetXY(pattern);
293 //___________________________________________
294 void AliMUONTriggerElectronics::DumpOS()
296 /// DUMP IN THE OLD WAY
298 for (Int_t i= 0; i < 234;i++)
300 AliMUONLocalTriggerBoard *board = fCrates->LocalBoard(i);
302 if (board) board->Scan("ALL");
306 //___________________________________________
307 void AliMUONTriggerElectronics::Scan(Option_t *option)
312 AliMUONTriggerCrate* cr;
314 fCrates->FirstCrate();
316 while ( ( cr = fCrates->NextCrate() ) )
318 TObjArray *boards = cr->Boards();
320 for (Int_t j = 0; j < boards->GetEntries(); j++)
322 TObject *o = boards->At(j);
326 Bool_t cdtion = kFALSE;
328 if (op.Contains("LOCAL")) cdtion = o->IsA() == AliMUONLocalTriggerBoard::Class();
329 if (op.Contains("REGIONAL")) cdtion = o->IsA() == AliMUONRegionalTriggerBoard::Class();
330 if (op.Contains("GLOBAL")) cdtion = o->IsA() == AliMUONGlobalTriggerBoard::Class();
332 if (!o || !cdtion) continue;
334 AliMUONLocalTriggerBoard *board = (AliMUONLocalTriggerBoard*)o;
341 //___________________________________________
342 void AliMUONTriggerElectronics::Reset()
347 AliMUONTriggerCrate* cr;
349 fCrates->FirstCrate();
351 while ( ( cr = fCrates->NextCrate() ) )
353 TObjArray *boards = cr->Boards();
355 for (Int_t j=0; j<boards->GetEntries(); j++)
357 AliMUONTriggerBoard *b = (AliMUONTriggerBoard*)boards->At(j);
364 //_______________________________________________________________________
365 void AliMUONTriggerElectronics::LoadMasks(AliMUONCalibrationData* calibData)
367 // LOAD MASKS FROM CDB
372 AliMUONTriggerCrate* cr;
374 fCrates->FirstCrate();
378 while ( ( cr = fCrates->NextCrate() ) )
380 TObjArray *boards = cr->Boards();
382 AliMUONRegionalTriggerBoard *regb =
383 (AliMUONRegionalTriggerBoard*)boards->At(0);
385 AliMUONVCalibParam* regionalBoardMasks = calibData->RegionalTriggerBoardMasks(irb);
387 for ( Int_t i = 0; i < regionalBoardMasks->Size(); ++i )
389 UShort_t rmask = static_cast<UShort_t>(regionalBoardMasks->ValueAsInt(i) & 0x3F);
393 for (Int_t j = 1; j < boards->GetEntries(); j++)
395 AliMUONLocalTriggerBoard *b = (AliMUONLocalTriggerBoard*)boards->At(j);
397 Int_t cardNumber = b->GetNumber();
399 if (cardNumber) // interface board are not interested
401 AliMUONVCalibParam* localBoardMasks = calibData->LocalTriggerBoardMasks(cardNumber);
402 for ( Int_t i = 0; i < localBoardMasks->Size(); ++i )
404 UShort_t lmask = static_cast<UShort_t>(localBoardMasks->ValueAsInt(i) & 0xFFFF);
412 AliMUONVCalibParam* globalBoardMasks = calibData->GlobalTriggerBoardMasks();
413 for ( Int_t i = 0; i < globalBoardMasks->Size(); ++i )
415 UShort_t gmask = static_cast<UShort_t>(globalBoardMasks->ValueAsInt(i) & 0xFFF);
416 fGlobalTriggerBoard->Mask(i,gmask);
421 //___________________________________________
422 void AliMUONTriggerElectronics::LocalResponse()
424 /// \todo add comment
426 AliMUONTriggerCrate* cr;
428 fCrates->FirstCrate();
430 while ( ( cr = fCrates->NextCrate() ) )
433 TObjArray *boards = cr->Boards();
435 AliMUONRegionalTriggerBoard *regb = (AliMUONRegionalTriggerBoard*)boards->At(0);
437 UShort_t thisl[16]; for (Int_t j=0; j<16; j++) thisl[j] = 0;
439 for (Int_t j = 1; j < boards->GetEntries(); j++)
441 TObject *o = boards->At(j);
445 AliMUONLocalTriggerBoard *board = (AliMUONLocalTriggerBoard*)o;
447 if (board) // check if empty slot
451 UShort_t response = board->GetResponse();
453 // CRATE CONTAINING INTERFACE BOARD
454 if (board->GetNumber() == 0) // copy boards
457 AliWarning(Form("Interface board %s in slot %d of crate %s has a non zero response",
458 board->GetName(),j,cr->GetName()));
459 AliDebug(1, Form("local slot %d, number %d in crate %s\n", j, board->GetNumber(), cr->GetName()));
463 thisl[j-1] = response;
467 regb->SetLocalResponse(thisl);
471 //___________________________________________
472 void AliMUONTriggerElectronics::RegionalResponse()
474 /// Compute the response for all regional cards.
475 AliMUONTriggerCrate* cr;
477 fCrates->FirstCrate();
479 while ( ( cr = fCrates->NextCrate() ) )
481 TObjArray *boards = cr->Boards();
483 AliMUONRegionalTriggerBoard *regb = (AliMUONRegionalTriggerBoard*)boards->At(0);
492 //___________________________________________
493 void AliMUONTriggerElectronics::GlobalResponse()
495 /// Compute the global response
497 UShort_t regional[16];
499 AliMUONTriggerCrate* cr;
501 fCrates->FirstCrate();
504 if ( !fCrates->NumberOfCrates() >= 16 )
506 AliFatal(Form("Something is wrong : too many crates %d",
507 fCrates->NumberOfCrates()));
510 while ( ( cr = fCrates->NextCrate() ) )
512 AliMUONTriggerBoard* rb =
513 static_cast<AliMUONTriggerBoard*>(cr->Boards()->At(0));
514 regional[irb] = rb->GetResponse();
518 fGlobalTriggerBoard->SetRegionalResponse(regional);
519 fGlobalTriggerBoard->Response();
522 //_______________________________________________________________________
524 AliMUONTriggerElectronics::Exec(Option_t*)
526 /// \todo add comment
531 //_______________________________________________________________________
532 void AliMUONTriggerElectronics::Trigger()
534 /// \todo add comment
542 //_______________________________________________________________________
543 void AliMUONTriggerElectronics::Digits2Trigger()
545 /// Main method to go from digits to trigger decision
546 AliMUONRegionalTrigger *pRegTrig = new AliMUONRegionalTrigger();
548 fMUONData->ResetTrigger();
549 // RUN THE FULL BEE CHAIN
553 AliMUONTriggerCrate* cr;
554 fCrates->FirstCrate();
556 while ( ( cr = fCrates->NextCrate() ) )
558 TObjArray *boards = cr->Boards();
560 UInt_t regInpLpt = 0;
561 UInt_t regInpHpt = 0;
562 UShort_t localMask = 0x0;
564 AliMUONRegionalTriggerBoard *regBoard = (AliMUONRegionalTriggerBoard*)boards->At(0);
566 for (Int_t j = 1; j < boards->GetEntries(); j++)
568 TObject *o = boards->At(j);
572 AliMUONLocalTriggerBoard *board = (AliMUONLocalTriggerBoard*)o;
577 if (board->Triggered())
580 Int_t icirc = board->GetNumber();
582 fLocalTrigger->SetLoCircuit(icirc);
583 fLocalTrigger->SetLoStripX(board->GetStripX11());
584 fLocalTrigger->SetLoDev(board->GetDev());
585 fLocalTrigger->SetLoStripY(board->GetStripY11());
588 UShort_t response = board->GetResponse();
589 fLocalTrigger->SetLoHpt((response & 12) >> 2);
590 fLocalTrigger->SetLoLpt(response & 3);
592 // calculates regional inputs from local for the moment
593 UInt_t hPt = (response >> 4) & 0x3;
594 UInt_t lPt = (response >> 2) & 0x3;
596 regInpHpt |= hPt << (30 - (j-1)*2);
597 regInpLpt |= lPt << (30 - (j-1)*2);
598 localMask |= (0x1 << (j-1)); // local mask
601 rrr.Set(6,&response);
604 fLocalTrigger->SetX1Pattern(board->GetXY(0,0));
605 fLocalTrigger->SetX2Pattern(board->GetXY(0,1));
606 fLocalTrigger->SetX3Pattern(board->GetXY(0,2));
607 fLocalTrigger->SetX4Pattern(board->GetXY(0,3));
609 fLocalTrigger->SetY1Pattern(board->GetXY(1,0));
610 fLocalTrigger->SetY2Pattern(board->GetXY(1,1));
611 fLocalTrigger->SetY3Pattern(board->GetXY(1,2));
612 fLocalTrigger->SetY4Pattern(board->GetXY(1,3));
614 fLocalTrigger->SetDigits(fDigitNumbers[icirc]);
616 // ADD A NEW LOCAL TRIGGER
617 fMUONData->AddLocalTrigger(*fLocalTrigger);
622 pRegTrig->SetLocalOutput(regInpLpt, 0);
623 pRegTrig->SetLocalOutput(regInpHpt, 1);
624 pRegTrig->SetLocalMask(localMask);
625 pRegTrig->SetOutput((regBoard->GetResponse() >> 4) & 0xF); // to be uniformized (oct06 ?)
627 fMUONData->AddRegionalTrigger(*pRegTrig);
632 // GLOBAL TRIGGER INFORMATION
633 UShort_t global = fGlobalTriggerBoard->GetResponse();
634 fGlobalTrigger->SetFromGlobalResponse(global);
637 // ADD A LOCAL TRIGGER IN THE LIST
638 fMUONData->AddGlobalTrigger(*fGlobalTrigger);
640 // NOW RESET ELECTRONICS
644 //_______________________________________________________________________
645 void AliMUONTriggerElectronics::ClearDigitNumbers()
647 // RESET fDigitNumbers
648 for (Int_t i=0; i<AliMUONConstants::NTriggerCircuit(); i++) fDigitNumbers[i].Set(0);
651 //_______________________________________________________________________
652 void AliMUONTriggerElectronics::DigitFiredCircuit(Int_t circuit, Int_t cathode,
653 Int_t chamber, Int_t digit)
655 // REGISTERS THAT THE SPECIFIED DIGIT FIRED THE SPECIFIED CIRCUIT
656 // THIS DIGIT GETS ADDED TO AN ARRAY WHICH WILL BE COPIED TO
657 // AliMUONLocalTrigger WHEN SUCH AN OBJECT IS CREATED FOR EACH CIRCUIT
658 Int_t digitnumber = AliMUONLocalTrigger::EncodeDigitNumber(chamber, cathode, digit);
659 Int_t last = fDigitNumbers[circuit].GetSize();
660 fDigitNumbers[circuit].Set(last + 1);
661 fDigitNumbers[circuit][last] = digitnumber;