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 //-----------------------------------------------------------------------------
19 // Class AliMUONTriggerElectronics
20 //--------------------------------
21 // Manager class for muon trigger electronics
22 // Client of trigger board classes
23 // Debugged by Ph. Crochet & Ch. Finck
24 // Interfaced with new mapping Ch. Finck
26 // Author: Rachid Guernane (LPCCFd)
27 //-----------------------------------------------------------------------------
29 #include "AliLoader.h"
32 #include "AliMUONCalibrationData.h"
33 #include "AliMUONVDigit.h"
34 #include "AliMUONVDigitStore.h"
35 #include "AliMUONGlobalTrigger.h"
36 #include "AliMUONGlobalTriggerBoard.h"
37 #include "AliMUONLocalTrigger.h"
38 #include "AliMUONLocalTriggerBoard.h"
39 #include "AliMUONRegionalTrigger.h"
40 #include "AliMUONRegionalTriggerBoard.h"
41 #include "AliMUONTriggerCrate.h"
42 #include "AliMUONTriggerCrateStore.h"
43 #include "AliMUONTriggerElectronics.h"
44 #include "AliMUONTriggerCrateConfig.h"
45 #include "AliMUONRegionalTriggerConfig.h"
46 #include "AliMUONGlobalCrateConfig.h"
47 #include "AliMUONVTriggerStore.h"
48 #include "AliMUONVCalibParam.h"
49 #include "AliMpCathodType.h"
50 #include "AliMpDEManager.h"
51 #include "AliMpSegmentation.h"
52 #include "AliMpVSegmentation.h"
53 #include "AliMpCathodType.h"
54 #include "AliMpTriggerCrate.h"
55 #include "AliMpLocalBoard.h"
56 #include "AliMpDDLStore.h"
57 #include "AliMpExMap.h"
58 #include "AliMpIntPair.h"
61 #include "AliLoader.h"
68 ClassImp(AliMUONTriggerElectronics)
71 //___________________________________________
72 AliMUONTriggerElectronics::AliMUONTriggerElectronics(AliMUONCalibrationData* calibData)
74 fCrates(new AliMUONTriggerCrateStore),
75 fGlobalTriggerBoard(new AliMUONGlobalTriggerBoard)
80 for (Int_t i = 0; i < 2; ++i) {
81 fCopyXInput[i] = new TList();
82 fCopyXInput[i]->SetOwner();
83 fCopyYInput[i] = new TList();
84 fCopyYInput[i]->SetOwner();
93 //___________________________________________
94 AliMUONTriggerElectronics::~AliMUONTriggerElectronics()
98 delete fGlobalTriggerBoard;
100 for (Int_t i = 0; i < 2; ++i) {
101 delete fCopyXInput[i];
102 delete fCopyYInput[i];
107 //___________________________________________
108 void AliMUONTriggerElectronics::SetCopyInput()
110 /// set list of copy input
112 for (Int_t iDDL = 0; iDDL < 2; ++iDDL) {
114 for(Int_t iReg = 0; iReg < 8; ++iReg){ //reg loop
116 AliMpTriggerCrate* crateMapping = AliMpDDLStore::Instance()->GetTriggerCrate(iDDL, iReg);
118 for(Int_t iLocal = 0; iLocal < crateMapping->GetNofLocalBoards(); ++iLocal) {
120 Int_t localBoardFromId = crateMapping->GetLocalBoardId(iLocal);
121 if (!localBoardFromId) continue; //empty slot, should not happen
123 AliMpLocalBoard* localBoardFrom = AliMpDDLStore::Instance()->GetLocalBoard(localBoardFromId);
124 Int_t localBoardToId;
125 if ((localBoardToId = localBoardFrom->GetInputXto())) {
126 AliMpLocalBoard* localBoardTo = AliMpDDLStore::Instance()->GetLocalBoard(localBoardToId);
127 TString crateFrom = localBoardFrom->GetCrate();
128 Int_t slotFrom = localBoardFrom->GetSlot();
129 TString crateTo = localBoardTo->GetCrate();
130 Int_t slotTo = localBoardTo->GetSlot();
132 fCopyXInput[0]->Add(new AliMpIntPair(AliMpExMap::GetIndex(crateFrom), slotFrom));
133 fCopyXInput[1]->Add(new AliMpIntPair(AliMpExMap::GetIndex(crateTo), slotTo));
134 AliDebug(3, Form("copy xInputs from local %s_%d to %s_%d\n", crateFrom.Data(), slotFrom,
135 crateTo.Data(), slotTo));
138 if ((localBoardToId = localBoardFrom->GetInputYto())) {
139 AliMpLocalBoard* localBoardTo = AliMpDDLStore::Instance()->GetLocalBoard(localBoardToId);
140 TString crateFrom = localBoardFrom->GetCrate();
141 Int_t slotFrom = localBoardFrom->GetSlot();
142 TString crateTo = localBoardTo->GetCrate();
143 Int_t slotTo = localBoardTo->GetSlot();
145 fCopyYInput[0]->Add(new AliMpIntPair(AliMpExMap::GetIndex(crateFrom), slotFrom));
146 fCopyYInput[1]->Add(new AliMpIntPair(AliMpExMap::GetIndex(crateTo), slotTo));
147 AliDebug(3, Form("copy yInputs from local %s_%d to %s_%d\n", crateFrom.Data(), slotFrom,
148 crateTo.Data(), slotTo));
157 //___________________________________________
158 void AliMUONTriggerElectronics::Factory(AliMUONCalibrationData* calibData)
160 /// BUILD ALL ELECTRONICS
163 fCrates->ReadFromFile(calibData);
166 //___________________________________________
167 void AliMUONTriggerElectronics::Feed(const AliMUONVDigitStore& digitStore)
172 TIter next(digitStore.CreateTriggerIterator());
175 while ( ( mdig = static_cast<AliMUONVDigit*>(next()) ) )
177 // CHECKME ! The TrackCharge is not ok with new digitizerV3 !
178 // for (Int_t ichg=0; ichg<10; ichg++) schg += mdig->TrackCharge(ichg);
179 Int_t ichamber = AliMpDEManager::GetChamberId(mdig->DetElemId());
180 Int_t schg = (Int_t)(mdig->Charge() + 0.5);
182 // APPLY CONDITION ON SOFT BACKGROUND
183 Int_t tchg = schg - (Int_t(schg/10))*10;
185 if (schg<=10 || tchg>0)
187 Int_t detElemId = mdig->DetElemId();
188 Int_t cathode = mdig->Cathode();
190 const AliMpVSegmentation* seg =
191 AliMpSegmentation::Instance()
192 ->GetMpSegmentation(detElemId,AliMp::GetCathodType(cathode));
194 Int_t ix = mdig->PadX(), iy = mdig->PadY();
196 AliDebug(3,Form("cathode %d ix %d iy %d ",cathode,ix,iy));
198 AliMpPad pad = seg->PadByIndices(AliMpIntPair(ix,iy),kTRUE);
200 for (Int_t i=0; i<pad.GetNofLocations(); i++)
202 AliMpIntPair location = pad.GetLocation(i);
204 Int_t nboard = location.GetFirst();
206 Int_t ibitxy = location.GetSecond();
208 AliMUONLocalTriggerBoard *b = fCrates->LocalBoard(nboard);
212 if (cathode && b->GetSwitch(6)) ibitxy += 8;
214 b->SetbitM(ibitxy,cathode,ichamber-10);
218 AliError(Form("Could not get local board number %d",b->GetNumber()));
224 // Particular case of the columns with 22 local boards (2R(L) 3R(L))
225 // fill copy input from mapping instead of hardcoded valued (Ch.F)
226 AliMUONTriggerCrate *crate = 0x0; TObjArray *bs = 0x0;
228 for (Int_t i = 0; i < fCopyXInput[0]->GetEntries(); ++i)
230 AliMpIntPair* pair = (AliMpIntPair*)fCopyXInput[0]->At(i);
231 TString crateFrom = AliMpExMap::GetString(pair->GetFirst());
232 Int_t slotFrom = pair->GetSecond();
234 pair = (AliMpIntPair*)fCopyXInput[1]->At(i);
235 TString crateTo = AliMpExMap::GetString(pair->GetFirst());
236 Int_t slotTo = pair->GetSecond();
238 AliDebug(3, Form("copy xInputs from local %s_%d to %s_%d\n", crateFrom.Data(), slotFrom,
239 crateTo.Data(), slotTo));
242 crate = fCrates->Crate(crateFrom);
243 bs = crate->Boards();
244 AliMUONLocalTriggerBoard *fromxb = (AliMUONLocalTriggerBoard*)bs->At(slotFrom);
245 crate = fCrates->Crate(crateTo);
246 bs = crate->Boards();
247 AliMUONLocalTriggerBoard *desxb = (AliMUONLocalTriggerBoard*)bs->At(slotTo);
248 fromxb->GetX34(cX); desxb->SetX34(cX);
253 for (Int_t i = 0; i < fCopyYInput[0]->GetEntries(); ++i)
255 AliMpIntPair* pair = (AliMpIntPair*)fCopyYInput[0]->At(i);
256 TString crateFrom = AliMpExMap::GetString(pair->GetFirst());
257 Int_t slotFrom = pair->GetSecond();
259 pair = (AliMpIntPair*)fCopyYInput[1]->At(i);
260 TString crateTo = AliMpExMap::GetString(pair->GetFirst());
261 Int_t slotTo = pair->GetSecond();
263 AliDebug(3, Form("copy yInputs from local %s_%d to %s_%d\n", crateFrom.Data(), slotFrom,
264 crateTo.Data(), slotTo));
267 crate = fCrates->Crate(crateFrom);
268 bs = crate->Boards();
269 AliMUONLocalTriggerBoard *fromyb = (AliMUONLocalTriggerBoard*)bs->At(slotFrom);
270 crate = fCrates->Crate(crateTo);
271 bs = crate->Boards();
272 AliMUONLocalTriggerBoard *desyb = (AliMUONLocalTriggerBoard*)bs->At(slotTo);
273 fromyb->GetY(cY); desyb->SetY(cY);
276 // FILL UP/DOWN OF CURRENT BOARD (DONE VIA J3 BUS IN REAL LIFE)
277 AliMUONTriggerCrate* cr;
278 TIter next2(fCrates->CreateCrateIterator());
280 while ( ( cr = static_cast<AliMUONTriggerCrate*>(next2()) ) )
282 TObjArray *boards = cr->Boards();
284 for (Int_t j = 1; j < boards->GetEntries()-1; j++)
286 TObject *o = boards->At(j);
290 AliMUONLocalTriggerBoard *currboard = (AliMUONLocalTriggerBoard*)o;
292 AliMUONLocalTriggerBoard *neighbour = (AliMUONLocalTriggerBoard*)boards->At(j+1);
296 if (j==1) {neighbour->GetXY(cXY); currboard->SetXYU(cXY);}
298 // LAST BOARD IN THE CRATE HAS NO UP EXCEPT FOR CRATES 2 & 3
299 if (j < boards->GetEntries()-2)
301 AliMUONLocalTriggerBoard *nextboard = (AliMUONLocalTriggerBoard*)boards->At(j+2);
303 currboard->GetXY(cXY); neighbour->SetXYD(cXY);
304 nextboard->GetXY(cXY); neighbour->SetXYU(cXY);
306 if (j==boards->GetEntries()-3) {neighbour->GetXY(cXY); nextboard->SetXYD(cXY);}
314 //___________________________________________
315 void AliMUONTriggerElectronics::Feed(UShort_t pattern[2][4])
319 AliMUONTriggerCrate* cr;
320 TIter next(fCrates->CreateCrateIterator());
322 while ( ( cr = static_cast<AliMUONTriggerCrate*>(next()) ) )
324 TObjArray *boards = cr->Boards();
326 for (Int_t j = 1; j < boards->GetEntries(); j++)
328 TObject *o = boards->At(j);
332 AliMUONLocalTriggerBoard *board = (AliMUONLocalTriggerBoard*)o;
334 board->SetXY(pattern);
339 //___________________________________________
340 void AliMUONTriggerElectronics::DumpOS()
342 /// DUMP IN THE OLD WAY
344 for (Int_t i= 0; i < 234;i++)
346 AliMUONLocalTriggerBoard *board = fCrates->LocalBoard(i);
348 if (board) board->Scan("ALL");
352 //___________________________________________
353 void AliMUONTriggerElectronics::Scan(Option_t *option)
358 AliMUONTriggerCrate* cr;
359 TIter next(fCrates->CreateCrateIterator());
361 while ( ( cr = static_cast<AliMUONTriggerCrate*>(next()) ) )
363 TObjArray *boards = cr->Boards();
365 for (Int_t j = 0; j < boards->GetEntries(); j++)
367 TObject *o = boards->At(j);
371 Bool_t cdtion = kFALSE;
373 if (op.Contains("LOCAL")) cdtion = o->IsA() == AliMUONLocalTriggerBoard::Class();
374 if (op.Contains("REGIONAL")) cdtion = o->IsA() == AliMUONRegionalTriggerBoard::Class();
375 if (op.Contains("GLOBAL")) cdtion = o->IsA() == AliMUONGlobalTriggerBoard::Class();
377 if (!o || !cdtion) continue;
379 AliMUONLocalTriggerBoard *board = (AliMUONLocalTriggerBoard*)o;
386 //___________________________________________
387 void AliMUONTriggerElectronics::Reset()
392 AliMUONTriggerCrate* cr;
393 TIter next(fCrates->CreateCrateIterator());
394 while ( ( cr = static_cast<AliMUONTriggerCrate*>(next()) ) )
396 TObjArray *boards = cr->Boards();
398 for (Int_t j=0; j<boards->GetEntries(); j++)
400 AliMUONTriggerBoard *b = (AliMUONTriggerBoard*)boards->At(j);
408 //_______________________________________________________________________
409 void AliMUONTriggerElectronics::LoadMasks(AliMUONCalibrationData* calibData)
411 /// Load mask from config in CDB
415 AliMUONRegionalTriggerConfig* regionalConfig = calibData->RegionalTriggerConfig();
417 AliWarning("No valid regional trigger configuration in CDB");
420 AliMUONTriggerCrate* cr;
421 TIter next(fCrates->CreateCrateIterator());
425 while ( ( cr = static_cast<AliMUONTriggerCrate*>(next()) ) )
427 TObjArray *boards = cr->Boards();
429 AliMUONRegionalTriggerBoard *regb = (AliMUONRegionalTriggerBoard*)boards->At(0);
431 AliMUONTriggerCrateConfig* crateConfig = regionalConfig->FindTriggerCrate(cr->GetName());
435 AliError(Form("Crate %s not present in configuration !!!", cr->GetName()));
439 UShort_t rmask= crateConfig->GetMask();
443 for (Int_t j = 1; j < boards->GetEntries(); j++)
445 AliMUONLocalTriggerBoard *b = (AliMUONLocalTriggerBoard*)boards->At(j);
447 Int_t cardNumber = b->GetNumber();
449 if (cardNumber) // interface board are not interested
451 AliMUONVCalibParam* localBoardMasks = calibData->LocalTriggerBoardMasks(cardNumber);
452 for ( Int_t i = 0; i < localBoardMasks->Size(); ++i )
454 UShort_t lmask = static_cast<UShort_t>(localBoardMasks->ValueAsInt(i) & 0xFFFF);
462 AliMUONGlobalCrateConfig * globalConfig = calibData->GlobalTriggerCrateConfig();
464 AliWarning("No valid trigger crate configuration in CDB");
467 gmask = globalConfig->GetFirstDarcDisable();
468 fGlobalTriggerBoard->Mask(0,gmask);
470 gmask = globalConfig->GetSecondDarcDisable();
471 fGlobalTriggerBoard->Mask(1,gmask);
474 //___________________________________________
475 void AliMUONTriggerElectronics::LocalResponse()
477 /// Compute the response for local cards
479 AliMUONTriggerCrate* cr;
480 TIter next(fCrates->CreateCrateIterator());
482 while ( ( cr = static_cast<AliMUONTriggerCrate*>(next()) ) )
485 TObjArray *boards = cr->Boards();
487 AliMUONRegionalTriggerBoard *regb = (AliMUONRegionalTriggerBoard*)boards->At(0);
489 UShort_t thisl[16]; for (Int_t j=0; j<16; j++) thisl[j] = 0;
491 for (Int_t j = 1; j < boards->GetEntries(); j++)
493 TObject *o = boards->At(j);
497 AliMUONLocalTriggerBoard *board = (AliMUONLocalTriggerBoard*)o;
499 if (board) // check if empty slot
503 UShort_t response = board->GetResponse();
505 // CRATE CONTAINING INTERFACE BOARD
506 if (board->GetNumber() == 0) // copy boards
509 AliWarning(Form("Interface board %s in slot %d of crate %s has a non zero response",
510 board->GetName(),j,cr->GetName()));
511 AliDebug(1, Form("local slot %d, number %d in crate %s\n", j, board->GetNumber(), cr->GetName()));
515 thisl[j-1] = response;
519 regb->SetLocalResponse(thisl);
523 //___________________________________________
524 void AliMUONTriggerElectronics::RegionalResponse()
526 /// Compute the response for all regional cards.
527 AliMUONTriggerCrate* cr;
528 TIter next(fCrates->CreateCrateIterator());
530 while ( ( cr = static_cast<AliMUONTriggerCrate*>(next()) ) )
532 TObjArray *boards = cr->Boards();
534 AliMUONRegionalTriggerBoard *regb = (AliMUONRegionalTriggerBoard*)boards->At(0);
543 //___________________________________________
544 void AliMUONTriggerElectronics::GlobalResponse()
546 /// Compute the global response
548 UShort_t regional[16];
550 AliMUONTriggerCrate* cr;
553 if ( !fCrates->NumberOfCrates() >= 16 )
555 AliFatal(Form("Something is wrong : too many crates %d",
556 fCrates->NumberOfCrates()));
559 TIter next(fCrates->CreateCrateIterator());
561 while ( ( cr = static_cast<AliMUONTriggerCrate*>(next())))
563 AliMUONTriggerBoard* rb =
564 static_cast<AliMUONTriggerBoard*>(cr->Boards()->At(0));
565 regional[irb] = rb->GetResponse();
569 fGlobalTriggerBoard->SetRegionalResponse(regional);
570 fGlobalTriggerBoard->Response();
573 //_______________________________________________________________________
574 void AliMUONTriggerElectronics::Digits2Trigger(const AliMUONVDigitStore& digitStore,
575 AliMUONVTriggerStore& triggerStore)
577 /// Main method to go from digits to trigger decision
578 AliMUONRegionalTrigger pRegTrig;
580 triggerStore.Clear();
582 // RUN THE FULL BEE CHAIN
589 AliMUONTriggerCrate* cr;
590 AliMUONLocalTrigger localTrigger;
592 // stored in right order
593 // do not used iterator order
595 for (Int_t iSide = 0; iSide < 2; iSide++) // right & left side
597 for (Int_t iReg = 0; iReg < 8; iReg++) // 8 crates/regional boards for each side.
599 cr = fCrates->Crate(iSide, iReg);
600 TObjArray *boards = cr->Boards();
602 UInt_t regInpLpt = 0;
603 UInt_t regInpHpt = 0;
605 AliMUONRegionalTriggerBoard *regBoard = (AliMUONRegionalTriggerBoard*)boards->At(0);
607 for (Int_t j = 1; j < boards->GetEntries(); j++)
609 TObject *o = boards->At(j);
613 AliMUONLocalTriggerBoard *board = (AliMUONLocalTriggerBoard*)o;
618 // pcrochet 181206: MOOD needs ALL boards
619 // if (board->Triggered())
622 Int_t icirc = board->GetNumber();
623 if (icirc != 0) { // pcrochet 181206: MOOD needs ALL boards
625 localTrigger.SetLoCircuit(icirc);
626 localTrigger.SetLoStripX(board->GetStripX11());
627 localTrigger.SetLoDev(board->GetDev());
628 localTrigger.SetLoSdev(board->GetSdev());
629 localTrigger.SetLoTrigY(board->GetTrigY());
630 localTrigger.SetLoStripY(board->GetStripY11());
633 UShort_t response = board->GetResponse();
634 localTrigger.SetLoHpt((response & 12) >> 2);
635 localTrigger.SetLoLpt(response & 3);
637 // calculates regional inputs from local for the moment
638 UInt_t hPt = (response >> 2) & 0x3;
639 UInt_t lPt = response & 0x3;
641 regInpHpt |= hPt << (30 - (j-1)*2);
642 regInpLpt |= lPt << (30 - (j-1)*2);
645 rrr.Set(6,&response);
648 localTrigger.SetX1Pattern(board->GetXY(0,0));
649 localTrigger.SetX2Pattern(board->GetXY(0,1));
650 localTrigger.SetX3Pattern(board->GetXY(0,2));
651 localTrigger.SetX4Pattern(board->GetXY(0,3));
653 localTrigger.SetY1Pattern(board->GetXY(1,0));
654 localTrigger.SetY2Pattern(board->GetXY(1,1));
655 localTrigger.SetY3Pattern(board->GetXY(1,2));
656 localTrigger.SetY4Pattern(board->GetXY(1,3));
658 // ADD A NEW LOCAL TRIGGER
659 triggerStore.Add(localTrigger);
664 pRegTrig.SetId(iReg + 8*iSide);
665 pRegTrig.SetLocalOutput(regInpLpt, 0);
666 pRegTrig.SetLocalOutput(regInpHpt, 1);
667 pRegTrig.SetOutput(regBoard->GetResponse());
669 triggerStore.Add(pRegTrig);
673 // GLOBAL TRIGGER INFORMATION
674 UShort_t global = fGlobalTriggerBoard->GetResponse();
676 AliMUONGlobalTrigger globalTrigger;
678 globalTrigger.SetFromGlobalResponse(global);
679 // ADD A LOCAL TRIGGER IN THE LIST
680 triggerStore.SetGlobal(globalTrigger);
682 // NOW RESET ELECTRONICS