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 "AliMpVSegmentation.h"
44 #include "AliLoader.h"
47 //#include "Riostream.h"
52 ClassImp(AliMUONTriggerElectronics)
55 //___________________________________________
56 AliMUONTriggerElectronics::AliMUONTriggerElectronics(AliMUONData *Data, AliMUONCalibrationData* calibData)
57 : TTask("AliMUONTriggerElectronics",
58 "From trigger digits to Local and Global Trigger objects"),
60 fCrates(new AliMUONTriggerCrateStore),
61 fGlobalTriggerBoard(new AliMUONGlobalTriggerBoard),
63 fLocalTrigger(new AliMUONLocalTrigger()),
64 fGlobalTrigger(new AliMUONGlobalTrigger())
71 AliFatal("NO MUON TRIGGER DATA");
79 //___________________________________________
80 AliMUONTriggerElectronics::~AliMUONTriggerElectronics()
84 delete fGlobalTriggerBoard;
87 delete fGlobalTrigger;
91 //___________________________________________
92 void AliMUONTriggerElectronics::Factory(AliMUONCalibrationData* calibData)
94 /// BUILD ALL ELECTRONICS
97 // get coinc44 from AliMUON (added 12/09/06)
98 AliMUON *pMUON = (AliMUON*)gAlice->GetModule("MUON");
99 Int_t coinc44 = pMUON->GetTriggerCoinc44();
100 if (coinc44 != 0 && coinc44 != 1) {
101 AliFatal("Coinc 44 should be equal to 0 or 1");
105 fCrates->ReadFromFile(gSystem->ExpandPathName(fSourceFileName.Data()));
107 if ( !calibData ) return;
109 AliMUONTriggerLut* lut = calibData->TriggerLut();
113 AliMUONLocalTriggerBoard* localBoard;
115 fCrates->FirstLocalBoard();
117 while ( (localBoard=fCrates->NextLocalBoard()) )
119 localBoard->SetLUT(lut);
120 localBoard->SetCoinc44(coinc44);
124 //___________________________________________
125 void AliMUONTriggerElectronics::FeedM()
129 for (Int_t ichamber=10; ichamber<14; ichamber++)
131 TClonesArray *muonDigits = fMUONData->Digits(ichamber);
132 Int_t ndigits = muonDigits->GetEntriesFast();
134 for (Int_t digit=0; digit<ndigits; digit++)
136 AliMUONDigit *mdig = static_cast<AliMUONDigit*>(muonDigits->UncheckedAt(digit));
138 // CHECKME ! The TrackCharge is not ok with new digitizerV3 !
139 // for (Int_t ichg=0; ichg<10; ichg++) schg += mdig->TrackCharge(ichg);
140 // assert(schg==mdig->Signal());
141 Int_t schg = mdig->Signal();
143 // APPLY CONDITION ON SOFT BACKGROUND
144 Int_t tchg = schg - (Int_t(schg/10))*10;
146 if (schg<=10 || tchg>0)
150 Int_t digitindex = digit;
151 Int_t detElemId = mdig->DetElemId();
152 Int_t cathode = mdig->Cathode();
154 const AliMpVSegmentation *seg =
155 ((AliMUON*)gAlice->GetDetector("MUON"))->GetSegmentation()->GetMpSegmentation(detElemId,cathode);
157 Int_t ix = mdig->PadX(), iy = mdig->PadY();
159 AliDebug(3,Form("cathode %d ix %d iy %d ",cathode,ix,iy));
161 AliMpPad pad = seg->PadByIndices(AliMpIntPair(ix,iy),kTRUE);
163 for (Int_t i=0; i<pad.GetNofLocations(); i++)
165 AliMpIntPair location = pad.GetLocation(i);
167 Int_t nboard = location.GetFirst();
169 Int_t ibitxy = location.GetSecond();
171 AliMUONLocalTriggerBoard *b = fCrates->LocalBoard(nboard);
175 if (cathode && b->GetSwitch(6)) ibitxy += 8;
177 b->SetbitM(ibitxy,cathode,ichamber-10);
179 DigitFiredCircuit(b->GetI(), cathode, ichamber, digitindex);
183 AliError(Form("Could not get local board number %d",b->GetNumber()));
190 // Particular case of the columns with 22 local boards (2R(L) 3R(L))
191 AliMUONTriggerCrate *crate = 0x0; TObjArray *bs = 0x0;
193 char *scratess[4] = { "2R", "2L", "3L", "3R"};
194 char *scratesd[4] = {"2-3R", "2-3L", "2-3L", "2-3R"};
195 Int_t slotf[4] = { 2, 2, 10, 10};
196 Int_t slotd[4] = { 1, 1, 9, 9};
198 for (Int_t i = 0; i < 4; i++)
200 crate = fCrates->Crate(scratess[i]);
201 bs = crate->Boards();
202 AliMUONLocalTriggerBoard *desybb = (AliMUONLocalTriggerBoard*)bs->At(14);
203 AliMUONLocalTriggerBoard *fromcb = (AliMUONLocalTriggerBoard*)bs->At(15);
204 AliMUONLocalTriggerBoard *desxbb = (AliMUONLocalTriggerBoard*)bs->At(16);
206 crate = fCrates->Crate(scratesd[i]);
207 bs = crate->Boards();
208 AliMUONLocalTriggerBoard *frombb = (AliMUONLocalTriggerBoard*)bs->At(slotf[i]);
209 AliMUONLocalTriggerBoard *desycb = (AliMUONLocalTriggerBoard*)bs->At(slotd[i]);
213 // COPY X3-4 FROM BOARD 2 OF CRATE 2-3 TO BOARD 16 OF CRATE 2
214 // COPY X3-4 FROM BOARD 10 OF CRATE 2-3 TO BOARD 16 OF CRATE 3
215 frombb->GetX34(cX); desxbb->SetX34(cX);
217 // COPY X3-4 FROM BOARD 15 OF CRATE 2 TO BOARD 1 OF CRATE 2-3
218 // COPY X3-4 FROM BOARD 15 OF CRATE 3 TO BOARD 9 OF CRATE 2-3
219 fromcb->GetX34(cX); desycb->SetX34(cX);
223 desybb->GetY(cY); frombb->SetY(cY);
225 frombb->GetY(cY); desxbb->SetY(cY);
226 fromcb->GetY(cY); desycb->SetY(cY);
229 // FILL UP/DOWN OF CURRENT BOARD (DONE VIA J3 BUS IN REAL LIFE)
230 AliMUONTriggerCrate* cr;
232 fCrates->FirstCrate();
234 while ( ( cr = fCrates->NextCrate() ) )
236 TObjArray *boards = cr->Boards();
238 for (Int_t j = 1; j < boards->GetEntries()-1; j++)
240 TObject *o = boards->At(j);
244 AliMUONLocalTriggerBoard *currboard = (AliMUONLocalTriggerBoard*)o;
246 AliMUONLocalTriggerBoard *neighbour = (AliMUONLocalTriggerBoard*)boards->At(j+1);
250 if (j==1) {neighbour->GetXY(cXY); currboard->SetXYU(cXY);}
252 // LAST BOARD IN THE CRATE HAS NO UP EXCEPT FOR CRATES 2 & 3
253 if (j < boards->GetEntries()-2)
255 AliMUONLocalTriggerBoard *nextboard = (AliMUONLocalTriggerBoard*)boards->At(j+2);
257 currboard->GetXY(cXY); neighbour->SetXYD(cXY);
258 nextboard->GetXY(cXY); neighbour->SetXYU(cXY);
260 if (j==boards->GetEntries()-3) {neighbour->GetXY(cXY); nextboard->SetXYD(cXY);}
266 //___________________________________________
267 void AliMUONTriggerElectronics::Feed(UShort_t pattern[2][4])
271 AliMUONTriggerCrate* cr;
273 fCrates->FirstCrate();
275 while ( ( cr = fCrates->NextCrate() ) )
277 TObjArray *boards = cr->Boards();
279 for (Int_t j = 1; j < boards->GetEntries(); j++)
281 TObject *o = boards->At(j);
285 AliMUONLocalTriggerBoard *board = (AliMUONLocalTriggerBoard*)o;
287 board->SetXY(pattern);
292 //___________________________________________
293 void AliMUONTriggerElectronics::DumpOS()
295 /// DUMP IN THE OLD WAY
297 for (Int_t i= 0; i < 234;i++)
299 AliMUONLocalTriggerBoard *board = fCrates->LocalBoard(i);
301 if (board) board->Scan("ALL");
305 //___________________________________________
306 void AliMUONTriggerElectronics::Scan(Option_t *option)
311 AliMUONTriggerCrate* cr;
313 fCrates->FirstCrate();
315 while ( ( cr = fCrates->NextCrate() ) )
317 TObjArray *boards = cr->Boards();
319 for (Int_t j = 0; j < boards->GetEntries(); j++)
321 TObject *o = boards->At(j);
325 Bool_t cdtion = kFALSE;
327 if (op.Contains("LOCAL")) cdtion = o->IsA() == AliMUONLocalTriggerBoard::Class();
328 if (op.Contains("REGIONAL")) cdtion = o->IsA() == AliMUONRegionalTriggerBoard::Class();
329 if (op.Contains("GLOBAL")) cdtion = o->IsA() == AliMUONGlobalTriggerBoard::Class();
331 if (!o || !cdtion) continue;
333 AliMUONLocalTriggerBoard *board = (AliMUONLocalTriggerBoard*)o;
340 //___________________________________________
341 void AliMUONTriggerElectronics::Reset()
346 AliMUONTriggerCrate* cr;
348 fCrates->FirstCrate();
350 while ( ( cr = fCrates->NextCrate() ) )
352 TObjArray *boards = cr->Boards();
354 for (Int_t j=0; j<boards->GetEntries(); j++)
356 AliMUONTriggerBoard *b = (AliMUONTriggerBoard*)boards->At(j);
363 //_______________________________________________________________________
364 void AliMUONTriggerElectronics::LoadMasks(AliMUONCalibrationData* calibData)
366 // LOAD MASKS FROM CDB
371 AliMUONTriggerCrate* cr;
373 fCrates->FirstCrate();
377 while ( ( cr = fCrates->NextCrate() ) )
379 TObjArray *boards = cr->Boards();
381 AliMUONRegionalTriggerBoard *regb =
382 (AliMUONRegionalTriggerBoard*)boards->At(0);
384 AliMUONVCalibParam* regionalBoardMasks = calibData->RegionalTriggerBoardMasks(irb);
386 for ( Int_t i = 0; i < regionalBoardMasks->Size(); ++i )
388 UShort_t rmask = static_cast<UShort_t>(regionalBoardMasks->ValueAsInt(i) & 0x3F);
392 for (Int_t j = 1; j < boards->GetEntries(); j++)
394 AliMUONLocalTriggerBoard *b = (AliMUONLocalTriggerBoard*)boards->At(j);
396 Int_t cardNumber = b->GetNumber();
398 if (cardNumber) // interface board are not interested
400 AliMUONVCalibParam* localBoardMasks = calibData->LocalTriggerBoardMasks(cardNumber);
401 for ( Int_t i = 0; i < localBoardMasks->Size(); ++i )
403 UShort_t lmask = static_cast<UShort_t>(localBoardMasks->ValueAsInt(i) & 0xFFFF);
411 AliMUONVCalibParam* globalBoardMasks = calibData->GlobalTriggerBoardMasks();
412 for ( Int_t i = 0; i < globalBoardMasks->Size(); ++i )
414 UShort_t gmask = static_cast<UShort_t>(globalBoardMasks->ValueAsInt(i) & 0xFFF);
415 fGlobalTriggerBoard->Mask(i,gmask);
420 //___________________________________________
421 void AliMUONTriggerElectronics::LocalResponse()
423 /// \todo add comment
425 AliMUONTriggerCrate* cr;
427 fCrates->FirstCrate();
429 while ( ( cr = fCrates->NextCrate() ) )
432 TObjArray *boards = cr->Boards();
434 AliMUONRegionalTriggerBoard *regb = (AliMUONRegionalTriggerBoard*)boards->At(0);
436 UShort_t thisl[16]; for (Int_t j=0; j<16; j++) thisl[j] = 0;
438 for (Int_t j = 1; j < boards->GetEntries(); j++)
440 TObject *o = boards->At(j);
444 AliMUONLocalTriggerBoard *board = (AliMUONLocalTriggerBoard*)o;
446 if (board) // check if empty slot
450 UShort_t response = board->GetResponse();
452 // CRATE CONTAINING INTERFACE BOARD
453 if (board->GetNumber() == 0) // copy boards
456 AliWarning(Form("Interface board %s in slot %d of crate %s has a non zero response",
457 board->GetName(),j,cr->GetName()));
458 AliDebug(1, Form("local slot %d, number %d in crate %s\n", j, board->GetNumber(), cr->GetName()));
462 thisl[j-1] = response;
466 regb->SetLocalResponse(thisl);
470 //___________________________________________
471 void AliMUONTriggerElectronics::RegionalResponse()
473 /// Compute the response for all regional cards.
474 AliMUONTriggerCrate* cr;
476 fCrates->FirstCrate();
478 while ( ( cr = fCrates->NextCrate() ) )
480 TObjArray *boards = cr->Boards();
482 AliMUONRegionalTriggerBoard *regb = (AliMUONRegionalTriggerBoard*)boards->At(0);
491 //___________________________________________
492 void AliMUONTriggerElectronics::GlobalResponse()
494 /// Compute the global response
496 UShort_t regional[16];
498 AliMUONTriggerCrate* cr;
500 fCrates->FirstCrate();
503 if ( !fCrates->NumberOfCrates() >= 16 )
505 AliFatal(Form("Something is wrong : too many crates %d",
506 fCrates->NumberOfCrates()));
509 while ( ( cr = fCrates->NextCrate() ) )
511 AliMUONTriggerBoard* rb =
512 static_cast<AliMUONTriggerBoard*>(cr->Boards()->At(0));
513 regional[irb] = rb->GetResponse();
517 fGlobalTriggerBoard->SetRegionalResponse(regional);
518 fGlobalTriggerBoard->Response();
521 //___________________________________________
522 void AliMUONTriggerElectronics::BoardName(Int_t ix, Int_t iy, char *name)
524 /// BOARD NAME FROM PAD INFO (OLD MAPPING)
526 TString s = (ix>0) ? "R" : "L";
528 Int_t board = iy / 16, bid[4] = {12,34,56,78};
532 Int_t line = ix / 10, column = ix - 10 * line;
534 // old scheme: line==1 is line==9
535 line -= 9; line = TMath::Abs(line); line++;
537 sprintf(name,"%sC%dL%dB%d", s.Data(), column, line, bid[board]);
539 AliDebug(3, Form("Strip ( %d , %d ) connected to board %s ", ix, iy, name));
542 //___________________________________________
543 void AliMUONTriggerElectronics::BuildName(Int_t icirc, char name[20])
545 /// GET BOARD NAME FROM OLD NUMBERING
547 const Int_t kCircuitId[234] =
549 111, 121, 131, 141, 151, 161, 171,
550 211, 212, 221, 222, 231, 232, 241, 242, 251, 252, 261, 262, 271,
551 311, 312, 321, 322, 331, 332, 341, 342, 351, 352, 361, 362, 371,
552 411, 412, 413, 421, 422, 423, 424, 431, 432, 433, 434, 441, 442, 451, 452, 461, 462, 471,
553 521, 522, 523, 524, 531, 532, 533, 534, 541, 542, 551, 552, 561, 562, 571,
554 611, 612, 613, 621, 622, 623, 624, 631, 632, 633, 634, 641, 642, 651, 652, 661, 662, 671,
555 711, 712, 721, 722, 731, 732, 741, 742, 751, 752, 761, 762, 771,
556 811, 812, 821, 822, 831, 832, 841, 842, 851, 852, 861, 862, 871,
557 911, 921, 931, 941, 951, 961, 971,
558 -111, -121, -131, -141, -151, -161, -171,
559 -211, -212, -221, -222, -231, -232, -241, -242, -251, -252, -261, -262, -271,
560 -311, -312, -321, -322, -331, -332, -341, -342, -351, -352, -361, -362, -371,
561 -411, -412, -413, -421, -422, -423, -424, -431, -432, -433, -434, -441, -442, -451, -452, -461, -462, -471,
562 -521, -522, -523, -524, -531, -532, -533, -534, -541, -542, -551, -552, -561, -562, -571,
563 -611, -612, -613, -621, -622, -623, -624, -631, -632, -633, -634, -641, -642, -651, -652, -661, -662, -671,
564 -711, -712, -721, -722, -731, -732, -741, -742, -751, -752, -761, -762, -771,
565 -811, -812, -821, -822, -831, -832, -841, -842, -851, -852, -861, -862, -871,
566 -911, -921, -931, -941, -951, -961, -971
569 Int_t b[4] = {12, 34, 56, 78};
571 Int_t code = TMath::Abs(kCircuitId[icirc]);
573 Int_t lL = code / 100;
575 Int_t cC = ( code - 100 * lL ) / 10;
577 Int_t bB = code - 100 * lL - 10 * cC;
579 const char *side = (kCircuitId[icirc]>0) ? "R" : "L";
582 lL -= 9; lL = abs(lL); lL++;
584 sprintf(name,"%sC%dL%dB%d",side,cC,lL,b[bB-1]);
587 //_______________________________________________________________________
589 AliMUONTriggerElectronics::Exec(Option_t*)
591 /// \todo add comment
596 //_______________________________________________________________________
597 void AliMUONTriggerElectronics::Trigger()
599 /// \todo add comment
607 //_______________________________________________________________________
608 void AliMUONTriggerElectronics::Digits2Trigger()
610 /// Main method to go from digits to trigger decision
612 AliMUONRegionalTrigger *pRegTrig = new AliMUONRegionalTrigger();
616 fMUONData->ResetTrigger();
618 // RUN THE FULL BEE CHAIN
622 AliMUONTriggerCrate* cr;
624 fCrates->FirstCrate();
626 while ( ( cr = fCrates->NextCrate() ) )
628 TObjArray *boards = cr->Boards();
630 UInt_t regInpLpt = 0;
631 UInt_t regInpHpt = 0;
632 UShort_t localMask = 0x0;
634 AliMUONRegionalTriggerBoard *regBoard = (AliMUONRegionalTriggerBoard*)boards->At(0);
636 for (Int_t j = 1; j < boards->GetEntries(); j++)
638 TObject *o = boards->At(j);
642 AliMUONLocalTriggerBoard *board = (AliMUONLocalTriggerBoard*)o;
647 if (board->Triggered())
650 Int_t icirc = board->GetNumber();
652 fLocalTrigger->SetLoCircuit(icirc);
653 fLocalTrigger->SetLoStripX(board->GetStripX11());
654 fLocalTrigger->SetLoDev(board->GetDev());
655 fLocalTrigger->SetLoStripY(board->GetStripY11());
658 UShort_t response = board->GetResponse();
659 fLocalTrigger->SetLoHpt((response & 12) >> 2);
660 fLocalTrigger->SetLoLpt(response & 3);
662 // calculates regional inputs from local for the moment
663 UInt_t hPt = (response >> 4) & 0x3;
664 UInt_t lPt = (response >> 2) & 0x3;
666 regInpHpt |= hPt << (30 - (j-1)*2);
667 regInpLpt |= lPt << (30 - (j-1)*2);
668 localMask |= (0x1 << (j-1)); // local mask
672 rrr.Set(6,&response);
675 fLocalTrigger->SetX1Pattern(board->GetXY(0,0));
676 fLocalTrigger->SetX2Pattern(board->GetXY(0,1));
677 fLocalTrigger->SetX3Pattern(board->GetXY(0,2));
678 fLocalTrigger->SetX4Pattern(board->GetXY(0,3));
680 fLocalTrigger->SetY1Pattern(board->GetXY(1,0));
681 fLocalTrigger->SetY2Pattern(board->GetXY(1,1));
682 fLocalTrigger->SetY3Pattern(board->GetXY(1,2));
683 fLocalTrigger->SetY4Pattern(board->GetXY(1,3));
685 fLocalTrigger->SetDigits(fDigitNumbers[icirc]);
687 // ADD A NEW LOCAL TRIGGER
688 fMUONData->AddLocalTrigger(*fLocalTrigger);
692 pRegTrig->SetLocalOutput(regInpLpt, 0);
693 pRegTrig->SetLocalOutput(regInpHpt, 1);
694 pRegTrig->SetLocalMask(localMask);
695 pRegTrig->SetOutput((regBoard->GetResponse() >> 4) & 0xF); // to be uniformized (oct06 ?)
697 fMUONData->AddRegionalTrigger(*pRegTrig);
702 // GLOBAL TRIGGER INFORMATION
703 UShort_t global = fGlobalTriggerBoard->GetResponse();
704 fGlobalTrigger->SetGlobalPattern(global);
707 // ADD A LOCAL TRIGGER IN THE LIST
708 fMUONData->AddGlobalTrigger(*fGlobalTrigger);
710 // NOW RESET ELECTRONICS
714 //_______________________________________________________________________
715 void AliMUONTriggerElectronics::ClearDigitNumbers()
717 // RESET fDigitNumbers
718 for (Int_t i=0; i<AliMUONConstants::NTriggerCircuit(); i++) fDigitNumbers[i].Set(0);
721 //_______________________________________________________________________
722 void AliMUONTriggerElectronics::DigitFiredCircuit(Int_t circuit, Int_t cathode,
723 Int_t chamber, Int_t digit)
725 // REGISTERS THAT THE SPECIFIED DIGIT FIRED THE SPECIFIED CIRCUIT
726 // THIS DIGIT GETS ADDED TO AN ARRAY WHICH WILL BE COPIED TO
727 // AliMUONLocalTrigger WHEN SUCH AN OBJECT IS CREATED FOR EACH CIRCUIT
728 Int_t digitnumber = AliMUONLocalTrigger::EncodeDigitNumber(chamber, cathode, digit);
729 Int_t last = fDigitNumbers[circuit].GetSize();
730 fDigitNumbers[circuit].Set(last + 1);
731 fDigitNumbers[circuit][last] = digitnumber;