]> git.uio.no Git - u/mrichter/AliRoot.git/blame - MUON/AliMUONTriggerElectronics.cxx
Add a protection to avoid array boundary error in IntSpecGeant
[u/mrichter/AliRoot.git] / MUON / AliMUONTriggerElectronics.cxx
CommitLineData
516d3280 1/**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3 * *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
6 * *
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 **************************************************************************/
15
16/* $Id$ */
17
3d1463c8 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
25//
26// Author: Rachid Guernane (LPCCFd)
27//-----------------------------------------------------------------------------
516d3280 28
257091b1 29#include "AliLoader.h"
30#include "AliLog.h"
31#include "AliMUON.h"
32#include "AliMUONCalibrationData.h"
33#include "AliMUONVDigit.h"
34#include "AliMUONVDigitStore.h"
35#include "AliMUONGlobalTrigger.h"
516d3280 36#include "AliMUONGlobalTriggerBoard.h"
37#include "AliMUONLocalTrigger.h"
257091b1 38#include "AliMUONLocalTriggerBoard.h"
47dc4ee7 39#include "AliMUONRegionalTrigger.h"
257091b1 40#include "AliMUONRegionalTriggerBoard.h"
41#include "AliMUONTriggerCrate.h"
42#include "AliMUONTriggerCrateStore.h"
43#include "AliMUONTriggerElectronics.h"
44#include "AliMUONVTriggerStore.h"
4c0f0f5d 45#include "AliMUONVCalibParam.h"
257091b1 46#include "AliMpCathodType.h"
47#include "AliMpDEManager.h"
666ada1e 48#include "AliMpSegmentation.h"
f4678817 49#include "AliMpVSegmentation.h"
866c3232 50#include "AliMpCathodType.h"
fd19a819 51#include "AliMpTriggerCrate.h"
52#include "AliMpLocalBoard.h"
53#include "AliMpDDLStore.h"
54#include "AliMpExMap.h"
55#include "AliMpIntPair.h"
f4678817 56
57#include "AliLog.h"
58#include "AliLoader.h"
59#include "AliRun.h"
257091b1 60#include <TBits.h>
61#include <TSystem.h>
f4678817 62
516d3280 63
6014107b 64/// \cond CLASSIMP
63ed9c6b 65ClassImp(AliMUONTriggerElectronics)
6014107b 66/// \endcond
63ed9c6b 67
516d3280 68//___________________________________________
257091b1 69AliMUONTriggerElectronics::AliMUONTriggerElectronics(AliMUONCalibrationData* calibData)
70: TObject(),
f1e8d46c 71 fCrates(new AliMUONTriggerCrateStore),
257091b1 72 fGlobalTriggerBoard(new AliMUONGlobalTriggerBoard)
516d3280 73{
257091b1 74 /// CONSTRUCTOR
6014107b 75///
fd19a819 76
77 for (Int_t i = 0; i < 2; ++i) {
78 fCopyXInput[i] = new TList();
79 fCopyXInput[i]->SetOwner();
80 fCopyYInput[i] = new TList();
81 fCopyYInput[i]->SetOwner();
82 }
83
84 SetCopyInput();
f1e8d46c 85 Factory(calibData);
86 LoadMasks(calibData);
516d3280 87}
88
89//___________________________________________
90AliMUONTriggerElectronics::~AliMUONTriggerElectronics()
91{
6014107b 92/// DESTRUCTOR
93///
516d3280 94 delete fGlobalTriggerBoard;
95 delete fCrates;
fd19a819 96 for (Int_t i = 0; i < 2; ++i) {
97 delete fCopyXInput[i];
98 delete fCopyYInput[i];
99 }
100
101}
102//___________________________________________
103void AliMUONTriggerElectronics::SetCopyInput()
104{
105/// set list of copy input
106
107 for (Int_t iDDL = 0; iDDL < 2; ++iDDL) {
108
109 for(Int_t iReg = 0; iReg < 8; ++iReg){ //reg loop
110
111 AliMpTriggerCrate* crateMapping = AliMpDDLStore::Instance()->GetTriggerCrate(iDDL, iReg);
112
113 for(Int_t iLocal = 0; iLocal < crateMapping->GetNofLocalBoards(); ++iLocal) {
114
115 Int_t localBoardFromId = crateMapping->GetLocalBoardId(iLocal);
116 if (!localBoardFromId) continue; //empty slot, should not happen
117
118 AliMpLocalBoard* localBoardFrom = AliMpDDLStore::Instance()->GetLocalBoard(localBoardFromId);
119 Int_t localBoardToId;
120 if ((localBoardToId = localBoardFrom->GetInputXto())) {
121 AliMpLocalBoard* localBoardTo = AliMpDDLStore::Instance()->GetLocalBoard(localBoardToId);
122 TString crateFrom = localBoardFrom->GetCrate();
123 Int_t slotFrom = localBoardFrom->GetSlot();
124 TString crateTo = localBoardTo->GetCrate();
125 Int_t slotTo = localBoardTo->GetSlot();
126
127 fCopyXInput[0]->Add(new AliMpIntPair(AliMpExMap::GetIndex(crateFrom), slotFrom));
128 fCopyXInput[1]->Add(new AliMpIntPair(AliMpExMap::GetIndex(crateTo), slotTo));
129 AliDebug(3, Form("copy xInputs from local %s_%d to %s_%d\n", crateFrom.Data(), slotFrom,
130 crateTo.Data(), slotTo));
131 }
132
133 if ((localBoardToId = localBoardFrom->GetInputYto())) {
134 AliMpLocalBoard* localBoardTo = AliMpDDLStore::Instance()->GetLocalBoard(localBoardToId);
135 TString crateFrom = localBoardFrom->GetCrate();
136 Int_t slotFrom = localBoardFrom->GetSlot();
137 TString crateTo = localBoardTo->GetCrate();
138 Int_t slotTo = localBoardTo->GetSlot();
139
140 fCopyYInput[0]->Add(new AliMpIntPair(AliMpExMap::GetIndex(crateFrom), slotFrom));
141 fCopyYInput[1]->Add(new AliMpIntPair(AliMpExMap::GetIndex(crateTo), slotTo));
142 AliDebug(3, Form("copy yInputs from local %s_%d to %s_%d\n", crateFrom.Data(), slotFrom,
143 crateTo.Data(), slotTo));
144
145 }
146
147 }
148 }
149 }
516d3280 150}
151
152//___________________________________________
4c0f0f5d 153void AliMUONTriggerElectronics::Factory(AliMUONCalibrationData* calibData)
516d3280 154{
6014107b 155 /// BUILD ALL ELECTRONICS
156 ///
e93b11d0 157
158// get coinc44 from AliMUON (added 12/09/06)
159 AliMUON *pMUON = (AliMUON*)gAlice->GetModule("MUON");
160 Int_t coinc44 = pMUON->GetTriggerCoinc44();
161 if (coinc44 != 0 && coinc44 != 1) {
162 AliFatal("Coinc 44 should be equal to 0 or 1");
163 return;
164 }
165
fd19a819 166 fCrates->ReadFromFile();
f1e8d46c 167
168 if ( !calibData ) return;
169
170 AliMUONTriggerLut* lut = calibData->TriggerLut();
171
172 if (!lut) return;
173
174 AliMUONLocalTriggerBoard* localBoard;
175
176 fCrates->FirstLocalBoard();
177
178 while ( (localBoard=fCrates->NextLocalBoard()) )
179 {
180 localBoard->SetLUT(lut);
e93b11d0 181 localBoard->SetCoinc44(coinc44);
f1e8d46c 182 }
8af755f4 183}
516d3280 184
8af755f4 185//___________________________________________
257091b1 186void AliMUONTriggerElectronics::Feed(const AliMUONVDigitStore& digitStore)
8af755f4 187{
257091b1 188 /// FILL INPUTS
189 ///
190
191 TIter next(digitStore.CreateTriggerIterator());
192 AliMUONVDigit* mdig;
193
194 while ( ( mdig = static_cast<AliMUONVDigit*>(next()) ) )
195 {
196 // CHECKME ! The TrackCharge is not ok with new digitizerV3 !
197 // for (Int_t ichg=0; ichg<10; ichg++) schg += mdig->TrackCharge(ichg);
198 Int_t ichamber = AliMpDEManager::GetChamberId(mdig->DetElemId());
199 Int_t schg = (Int_t)(mdig->Charge() + 0.5);
200
201 // APPLY CONDITION ON SOFT BACKGROUND
202 Int_t tchg = schg - (Int_t(schg/10))*10;
203
204 if (schg<=10 || tchg>0)
43368512 205 {
257091b1 206 Int_t detElemId = mdig->DetElemId();
207 Int_t cathode = mdig->Cathode();
fd19a819 208
209 const AliMpVSegmentation* seg =
210 AliMpSegmentation::Instance()
211 ->GetMpSegmentation(detElemId,AliMp::GetCathodType(cathode));
212
257091b1 213 Int_t ix = mdig->PadX(), iy = mdig->PadY();
214
215 AliDebug(3,Form("cathode %d ix %d iy %d ",cathode,ix,iy));
fd19a819 216
257091b1 217 AliMpPad pad = seg->PadByIndices(AliMpIntPair(ix,iy),kTRUE);
218
219 for (Int_t i=0; i<pad.GetNofLocations(); i++)
43368512 220 {
257091b1 221 AliMpIntPair location = pad.GetLocation(i);
222
223 Int_t nboard = location.GetFirst();
224
225 Int_t ibitxy = location.GetSecond();
226
227 AliMUONLocalTriggerBoard *b = fCrates->LocalBoard(nboard);
228
229 if (b)
230 {
231 if (cathode && b->GetSwitch(6)) ibitxy += 8;
232
233 b->SetbitM(ibitxy,cathode,ichamber-10);
234 }
235 else
236 {
237 AliError(Form("Could not get local board number %d",b->GetNumber()));
238 }
43368512 239 }
257091b1 240 }
241 }
fd19a819 242
43368512 243 // Particular case of the columns with 22 local boards (2R(L) 3R(L))
fd19a819 244 // fill copy input from mapping instead of hardcoded valued (Ch.F)
43368512 245 AliMUONTriggerCrate *crate = 0x0; TObjArray *bs = 0x0;
fd19a819 246
247 for (Int_t i = 0; i < fCopyXInput[0]->GetEntries(); ++i)
43368512 248 {
fd19a819 249 AliMpIntPair* pair = (AliMpIntPair*)fCopyXInput[0]->At(i);
250 TString crateFrom = AliMpExMap::GetString(pair->GetFirst());
251 Int_t slotFrom = pair->GetSecond();
252
253 pair = (AliMpIntPair*)fCopyXInput[1]->At(i);
254 TString crateTo = AliMpExMap::GetString(pair->GetFirst());
255 Int_t slotTo = pair->GetSecond();
256
257 AliDebug(3, Form("copy xInputs from local %s_%d to %s_%d\n", crateFrom.Data(), slotFrom,
258 crateTo.Data(), slotTo));
259
260 UShort_t cX[2];
261 crate = fCrates->Crate(crateFrom);
257091b1 262 bs = crate->Boards();
fd19a819 263 AliMUONLocalTriggerBoard *fromxb = (AliMUONLocalTriggerBoard*)bs->At(slotFrom);
264 crate = fCrates->Crate(crateTo);
257091b1 265 bs = crate->Boards();
fd19a819 266 AliMUONLocalTriggerBoard *desxb = (AliMUONLocalTriggerBoard*)bs->At(slotTo);
267 fromxb->GetX34(cX); desxb->SetX34(cX);
268
269
270 }
271
272 for (Int_t i = 0; i < fCopyYInput[0]->GetEntries(); ++i)
273 {
274 AliMpIntPair* pair = (AliMpIntPair*)fCopyYInput[0]->At(i);
275 TString crateFrom = AliMpExMap::GetString(pair->GetFirst());
276 Int_t slotFrom = pair->GetSecond();
277
278 pair = (AliMpIntPair*)fCopyYInput[1]->At(i);
279 TString crateTo = AliMpExMap::GetString(pair->GetFirst());
280 Int_t slotTo = pair->GetSecond();
281
282 AliDebug(3, Form("copy yInputs from local %s_%d to %s_%d\n", crateFrom.Data(), slotFrom,
283 crateTo.Data(), slotTo));
284
257091b1 285 UShort_t cY[4];
fd19a819 286 crate = fCrates->Crate(crateFrom);
287 bs = crate->Boards();
288 AliMUONLocalTriggerBoard *fromyb = (AliMUONLocalTriggerBoard*)bs->At(slotFrom);
289 crate = fCrates->Crate(crateTo);
290 bs = crate->Boards();
291 AliMUONLocalTriggerBoard *desyb = (AliMUONLocalTriggerBoard*)bs->At(slotTo);
292 fromyb->GetY(cY); desyb->SetY(cY);
43368512 293 }
257091b1 294
43368512 295 // FILL UP/DOWN OF CURRENT BOARD (DONE VIA J3 BUS IN REAL LIFE)
296 AliMUONTriggerCrate* cr;
257091b1 297
43368512 298 fCrates->FirstCrate();
257091b1 299
43368512 300 while ( ( cr = fCrates->NextCrate() ) )
301 {
257091b1 302 TObjArray *boards = cr->Boards();
303
304 for (Int_t j = 1; j < boards->GetEntries()-1; j++)
305 {
306 TObject *o = boards->At(j);
8af755f4 307
257091b1 308 if (!o) break;
8af755f4 309
257091b1 310 AliMUONLocalTriggerBoard *currboard = (AliMUONLocalTriggerBoard*)o;
8af755f4 311
257091b1 312 AliMUONLocalTriggerBoard *neighbour = (AliMUONLocalTriggerBoard*)boards->At(j+1);
1fe8c19b 313
257091b1 314 UShort_t cXY[2][4];
8af755f4 315
257091b1 316 if (j==1) {neighbour->GetXY(cXY); currboard->SetXYU(cXY);}
8af755f4 317
257091b1 318 // LAST BOARD IN THE CRATE HAS NO UP EXCEPT FOR CRATES 2 & 3
319 if (j < boards->GetEntries()-2)
320 {
43368512 321 AliMUONLocalTriggerBoard *nextboard = (AliMUONLocalTriggerBoard*)boards->At(j+2);
8af755f4 322
43368512 323 currboard->GetXY(cXY); neighbour->SetXYD(cXY);
324 nextboard->GetXY(cXY); neighbour->SetXYU(cXY);
8af755f4 325
1fe8c19b 326 if (j==boards->GetEntries()-3) {neighbour->GetXY(cXY); nextboard->SetXYD(cXY);}
43368512 327 }
257091b1 328 }
43368512 329 }
fd19a819 330
257091b1 331}
1fe8c19b 332
516d3280 333
334//___________________________________________
335void AliMUONTriggerElectronics::Feed(UShort_t pattern[2][4])
336{
6014107b 337 /// FILL INPUTS
338 ///
f1e8d46c 339 AliMUONTriggerCrate* cr;
340
341 fCrates->FirstCrate();
342
343 while ( ( cr = fCrates->NextCrate() ) )
344 {
345 TObjArray *boards = cr->Boards();
346
43368512 347 for (Int_t j = 1; j < boards->GetEntries(); j++)
f1e8d46c 348 {
349 TObject *o = boards->At(j);
350
351 if (!o) break;
352
353 AliMUONLocalTriggerBoard *board = (AliMUONLocalTriggerBoard*)o;
354
355 board->SetXY(pattern);
356 }
516d3280 357 }
358}
359
360//___________________________________________
361void AliMUONTriggerElectronics::DumpOS()
362{
6014107b 363/// DUMP IN THE OLD WAY
364///
43368512 365 for (Int_t i= 0; i < 234;i++)
516d3280 366 {
f1e8d46c 367 AliMUONLocalTriggerBoard *board = fCrates->LocalBoard(i);
516d3280 368
43368512 369 if (board) board->Scan("ALL");
516d3280 370 }
371}
372
373//___________________________________________
374void AliMUONTriggerElectronics::Scan(Option_t *option)
375{
6014107b 376 /// SCAN
377 ///
516d3280 378
f1e8d46c 379 AliMUONTriggerCrate* cr;
380
381 fCrates->FirstCrate();
382
383 while ( ( cr = fCrates->NextCrate() ) )
43368512 384 {
f1e8d46c 385 TObjArray *boards = cr->Boards();
386
43368512 387 for (Int_t j = 0; j < boards->GetEntries(); j++)
f1e8d46c 388 {
389 TObject *o = boards->At(j);
390
391 TString op = option;
392
393 Bool_t cdtion = kFALSE;
394
395 if (op.Contains("LOCAL")) cdtion = o->IsA() == AliMUONLocalTriggerBoard::Class();
396 if (op.Contains("REGIONAL")) cdtion = o->IsA() == AliMUONRegionalTriggerBoard::Class();
397 if (op.Contains("GLOBAL")) cdtion = o->IsA() == AliMUONGlobalTriggerBoard::Class();
398
399 if (!o || !cdtion) continue;
400
401 AliMUONLocalTriggerBoard *board = (AliMUONLocalTriggerBoard*)o;
402
403 board->Scan();
404 }
405 }
516d3280 406}
407
408//___________________________________________
409void AliMUONTriggerElectronics::Reset()
410{
6014107b 411 /// RESET
412 ///
f1e8d46c 413
414 AliMUONTriggerCrate* cr;
415
416 fCrates->FirstCrate();
417
418 while ( ( cr = fCrates->NextCrate() ) )
516d3280 419 {
516d3280 420 TObjArray *boards = cr->Boards();
421
422 for (Int_t j=0; j<boards->GetEntries(); j++)
423 {
424 AliMUONTriggerBoard *b = (AliMUONTriggerBoard*)boards->At(j);
425
426 if (b) b->Reset();
427 }
428 }
429}
430
4c0f0f5d 431//_______________________________________________________________________
432void AliMUONTriggerElectronics::LoadMasks(AliMUONCalibrationData* calibData)
433{
71a2d3aa 434 /// LOAD MASKS FROM CDB
4c0f0f5d 435
436
437 // SET MASKS
f1e8d46c 438
439 AliMUONTriggerCrate* cr;
440
441 fCrates->FirstCrate();
442
443 Int_t irb(0);
444
445 while ( ( cr = fCrates->NextCrate() ) )
43368512 446 {
4c0f0f5d 447 TObjArray *boards = cr->Boards();
448
449 AliMUONRegionalTriggerBoard *regb =
450 (AliMUONRegionalTriggerBoard*)boards->At(0);
451
f1e8d46c 452 AliMUONVCalibParam* regionalBoardMasks = calibData->RegionalTriggerBoardMasks(irb);
4c0f0f5d 453
454 for ( Int_t i = 0; i < regionalBoardMasks->Size(); ++i )
455 {
456 UShort_t rmask = static_cast<UShort_t>(regionalBoardMasks->ValueAsInt(i) & 0x3F);
457 regb->Mask(i,rmask);
458 }
459
43368512 460 for (Int_t j = 1; j < boards->GetEntries(); j++)
4c0f0f5d 461 {
462 AliMUONLocalTriggerBoard *b = (AliMUONLocalTriggerBoard*)boards->At(j);
463
464 Int_t cardNumber = b->GetNumber();
465
466 if (cardNumber) // interface board are not interested
467 {
468 AliMUONVCalibParam* localBoardMasks = calibData->LocalTriggerBoardMasks(cardNumber);
469 for ( Int_t i = 0; i < localBoardMasks->Size(); ++i )
470 {
471 UShort_t lmask = static_cast<UShort_t>(localBoardMasks->ValueAsInt(i) & 0xFFFF);
472 b->Mask(i,lmask);
473 }
474 }
475 }
f1e8d46c 476 ++irb;
4c0f0f5d 477 }
478
479 AliMUONVCalibParam* globalBoardMasks = calibData->GlobalTriggerBoardMasks();
480 for ( Int_t i = 0; i < globalBoardMasks->Size(); ++i )
481 {
482 UShort_t gmask = static_cast<UShort_t>(globalBoardMasks->ValueAsInt(i) & 0xFFF);
483 fGlobalTriggerBoard->Mask(i,gmask);
484 }
485}
486
487
516d3280 488//___________________________________________
489void AliMUONTriggerElectronics::LocalResponse()
490{
6014107b 491/// \todo add comment
516d3280 492
f1e8d46c 493 AliMUONTriggerCrate* cr;
494
495 fCrates->FirstCrate();
496
497 while ( ( cr = fCrates->NextCrate() ) )
43368512 498 {
f1e8d46c 499
500 TObjArray *boards = cr->Boards();
501
502 AliMUONRegionalTriggerBoard *regb = (AliMUONRegionalTriggerBoard*)boards->At(0);
503
504 UShort_t thisl[16]; for (Int_t j=0; j<16; j++) thisl[j] = 0;
29e3f51e 505
506 for (Int_t j = 1; j < boards->GetEntries(); j++)
f1e8d46c 507 {
43368512 508 TObject *o = boards->At(j);
f1e8d46c 509
43368512 510 if (!o) break;
f1e8d46c 511
43368512 512 AliMUONLocalTriggerBoard *board = (AliMUONLocalTriggerBoard*)o;
f1e8d46c 513
29e3f51e 514 if (board) // check if empty slot
43368512 515 {
516 board->Response();
516d3280 517
29e3f51e 518 UShort_t response = board->GetResponse();
f1e8d46c 519
29e3f51e 520 // CRATE CONTAINING INTERFACE BOARD
521 if (board->GetNumber() == 0) // copy boards
522 {
523 if ( response != 0 )
524 AliWarning(Form("Interface board %s in slot %d of crate %s has a non zero response",
43368512 525 board->GetName(),j,cr->GetName()));
29e3f51e 526 AliDebug(1, Form("local slot %d, number %d in crate %s\n", j, board->GetNumber(), cr->GetName()));
527
528 }
f1e8d46c 529
29e3f51e 530 thisl[j-1] = response;
43368512 531 }
516d3280 532 }
f1e8d46c 533
534 regb->SetLocalResponse(thisl);
535 }
516d3280 536}
537
538//___________________________________________
539void AliMUONTriggerElectronics::RegionalResponse()
540{
f1e8d46c 541 /// Compute the response for all regional cards.
542 AliMUONTriggerCrate* cr;
543
544 fCrates->FirstCrate();
545
546 while ( ( cr = fCrates->NextCrate() ) )
43368512 547 {
516d3280 548 TObjArray *boards = cr->Boards();
549
550 AliMUONRegionalTriggerBoard *regb = (AliMUONRegionalTriggerBoard*)boards->At(0);
551
552 if (regb)
553 {
554 regb->Response();
516d3280 555 }
556 }
557}
558
559//___________________________________________
560void AliMUONTriggerElectronics::GlobalResponse()
561{
f1e8d46c 562 /// Compute the global response
516d3280 563
f1e8d46c 564 UShort_t regional[16];
565
566 AliMUONTriggerCrate* cr;
567
568 fCrates->FirstCrate();
569 Int_t irb(0);
570
571 if ( !fCrates->NumberOfCrates() >= 16 )
572 {
573 AliFatal(Form("Something is wrong : too many crates %d",
574 fCrates->NumberOfCrates()));
575 }
576
577 while ( ( cr = fCrates->NextCrate() ) )
43368512 578 {
f1e8d46c 579 AliMUONTriggerBoard* rb =
580 static_cast<AliMUONTriggerBoard*>(cr->Boards()->At(0));
581 regional[irb] = rb->GetResponse();
582 ++irb;
583 }
584
585 fGlobalTriggerBoard->SetRegionalResponse(regional);
586 fGlobalTriggerBoard->Response();
516d3280 587}
588
516d3280 589//_______________________________________________________________________
257091b1 590void AliMUONTriggerElectronics::Digits2Trigger(const AliMUONVDigitStore& digitStore,
591 AliMUONVTriggerStore& triggerStore)
516d3280 592{
f1e8d46c 593 /// Main method to go from digits to trigger decision
257091b1 594 AliMUONRegionalTrigger pRegTrig;
595
596 triggerStore.Clear();
597
f1e8d46c 598 // RUN THE FULL BEE CHAIN
257091b1 599 Feed(digitStore);
600 LocalResponse();
601 RegionalResponse();
602 GlobalResponse();
603 // DumpOS();
8af755f4 604
f1e8d46c 605 AliMUONTriggerCrate* cr;
257091b1 606 AliMUONLocalTrigger localTrigger;
607
6a6a56b4 608 // stored in right order
609 // do not used iterator order
257091b1 610
6a6a56b4 611 for (Int_t iSide = 0; iSide < 2; iSide++) // right & left side
f1e8d46c 612 {
6a6a56b4 613 for (Int_t iReg = 0; iReg < 8; iReg++) // 8 crates/regional boards for each side.
614 {
615 cr = fCrates->Crate(iSide, iReg);
616 TObjArray *boards = cr->Boards();
257091b1 617
6a6a56b4 618 UInt_t regInpLpt = 0;
619 UInt_t regInpHpt = 0;
257091b1 620
6a6a56b4 621 AliMUONRegionalTriggerBoard *regBoard = (AliMUONRegionalTriggerBoard*)boards->At(0);
257091b1 622
6a6a56b4 623 for (Int_t j = 1; j < boards->GetEntries(); j++)
624 {
257091b1 625 TObject *o = boards->At(j);
626
627 if (!o) break;
628
629 AliMUONLocalTriggerBoard *board = (AliMUONLocalTriggerBoard*)o;
630
631 if (board)
632 {
633 // L0 TRIGGER
634 // pcrochet 181206: MOOD needs ALL boards
635 // if (board->Triggered())
636 // {
f1e8d46c 637
257091b1 638 Int_t icirc = board->GetNumber();
639 if (icirc != 0) { // pcrochet 181206: MOOD needs ALL boards
640
641 localTrigger.SetLoCircuit(icirc);
642 localTrigger.SetLoStripX(board->GetStripX11());
643 localTrigger.SetLoDev(board->GetDev());
644 localTrigger.SetLoSdev(board->GetSdev());
645 localTrigger.SetLoTrigY(board->GetTrigY());
646 localTrigger.SetLoStripY(board->GetStripY11());
647
648 // SAVE LUT OUTPUT
649 UShort_t response = board->GetResponse();
650 localTrigger.SetLoHpt((response & 12) >> 2);
651 localTrigger.SetLoLpt(response & 3);
652
653 // calculates regional inputs from local for the moment
654 UInt_t hPt = (response >> 2) & 0x3;
655 UInt_t lPt = response & 0x3;
656
657 regInpHpt |= hPt << (30 - (j-1)*2);
658 regInpLpt |= lPt << (30 - (j-1)*2);
659
660 TBits rrr;
661 rrr.Set(6,&response);
662
663 // SAVE BIT PATTERN
664 localTrigger.SetX1Pattern(board->GetXY(0,0));
665 localTrigger.SetX2Pattern(board->GetXY(0,1));
666 localTrigger.SetX3Pattern(board->GetXY(0,2));
667 localTrigger.SetX4Pattern(board->GetXY(0,3));
668
669 localTrigger.SetY1Pattern(board->GetXY(1,0));
670 localTrigger.SetY2Pattern(board->GetXY(1,1));
671 localTrigger.SetY3Pattern(board->GetXY(1,2));
672 localTrigger.SetY4Pattern(board->GetXY(1,3));
673
674 // ADD A NEW LOCAL TRIGGER
675 triggerStore.Add(localTrigger);
676
677 }
678 }
679 }
680 pRegTrig.SetId(iReg + 8*iSide);
681 pRegTrig.SetLocalOutput(regInpLpt, 0);
682 pRegTrig.SetLocalOutput(regInpHpt, 1);
683 pRegTrig.SetOutput(regBoard->GetResponse());
684
685 triggerStore.Add(pRegTrig);
516d3280 686 }
6a6a56b4 687 }
f1e8d46c 688
1908473e 689 // GLOBAL TRIGGER INFORMATION
f1e8d46c 690 UShort_t global = fGlobalTriggerBoard->GetResponse();
f1e8d46c 691
257091b1 692 AliMUONGlobalTrigger globalTrigger;
693
694 globalTrigger.SetFromGlobalResponse(global);
f1e8d46c 695 // ADD A LOCAL TRIGGER IN THE LIST
257091b1 696 triggerStore.SetGlobal(globalTrigger);
697
f1e8d46c 698 // NOW RESET ELECTRONICS
699 Reset();
516d3280 700}