]> git.uio.no Git - u/mrichter/AliRoot.git/blame - MUON/AliMUONLocalTriggerBoard.cxx
- Added class for Global Crate object
[u/mrichter/AliRoot.git] / MUON / AliMUONLocalTriggerBoard.cxx
CommitLineData
be972727 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//-----------------------------------------------------------------------------
71a2d3aa 19/// \class AliMUONLocalTriggerBoard
20/// A local trigger board has as input a bit pattern and returns
21/// the local trigger response after comparison w/ a LUT
22/// \todo Change member functions comments in capital letters to normal text
23///
24/// \author Rachid Guernane (LPCCFd)
3d1463c8 25//-----------------------------------------------------------------------------
be972727 26
27#include "AliMUONLocalTriggerBoard.h"
28#include "AliMUONTriggerLut.h"
f4678817 29
be972727 30#include "AliLog.h"
31
32#include <TBits.h>
be972727 33#include <Riostream.h>
34
71a2d3aa 35/// \cond CLASSIMP
36ClassImp(AliMUONLocalTriggerBoard)
37/// \endcond
38
e44235aa 39const Int_t AliMUONLocalTriggerBoard::fgkCircuitId[234] =
40{
41 111, 121, 131, 141, 151, 161, 171,
42 211, 212, 221, 222, 231, 232, 241, 242, 251, 252, 261, 262, 271,
43 311, 312, 321, 322, 331, 332, 341, 342, 351, 352, 361, 362, 371,
44 411, 412, 413, 421, 422, 423, 424, 431, 432, 433, 434, 441, 442, 451, 452, 461, 462, 471,
45 521, 522, 523, 524, 531, 532, 533, 534, 541, 542, 551, 552, 561, 562, 571,
46 611, 612, 613, 621, 622, 623, 624, 631, 632, 633, 634, 641, 642, 651, 652, 661, 662, 671,
47 711, 712, 721, 722, 731, 732, 741, 742, 751, 752, 761, 762, 771,
48 811, 812, 821, 822, 831, 832, 841, 842, 851, 852, 861, 862, 871,
49 911, 921, 931, 941, 951, 961, 971,
50 -111, -121, -131, -141, -151, -161, -171,
51 -211, -212, -221, -222, -231, -232, -241, -242, -251, -252, -261, -262, -271,
52 -311, -312, -321, -322, -331, -332, -341, -342, -351, -352, -361, -362, -371,
53 -411, -412, -413, -421, -422, -423, -424, -431, -432, -433, -434, -441, -442, -451, -452, -461, -462, -471,
54 -521, -522, -523, -524, -531, -532, -533, -534, -541, -542, -551, -552, -561, -562, -571,
55 -611, -612, -613, -621, -622, -623, -624, -631, -632, -633, -634, -641, -642, -651, -652, -661, -662, -671,
56 -711, -712, -721, -722, -731, -732, -741, -742, -751, -752, -761, -762, -771,
57 -811, -812, -821, -822, -831, -832, -841, -842, -851, -852, -861, -862, -871,
58 -911, -921, -931, -941, -951, -961, -971
59};
60
be972727 61//___________________________________________
62AliMUONLocalTriggerBoard::AliMUONLocalTriggerBoard()
1657f946 63 : AliMUONTriggerBoard(),
ac809573 64 fMpLocalBoard(0x0),
1657f946 65 fStripX11(0),
8aac6cce 66 fStripY11(15),
1657f946 67 fDev(0),
8aac6cce 68 fTrigY(1),
1657f946 69 fOutput(0),
e93b11d0 70 fLUT(0x0),
ac809573 71 fCoinc44(0)
be972727 72{
ac809573 73/// default constructor
71a2d3aa 74///
ac809573 75
be972727 76 for (Int_t i=0; i<2; i++)
77 for (Int_t j=0; j<4; j++)
78 {
79 fXY[i][j] = fXYU[i][j] = fXYD[i][j] = 0;
80
81 fMask[i][j] = 0xFFFF;
82 }
83
be972727 84 for (Int_t i=0; i<5; i++) fMinDevStrip[i] = fMinDev[i] = fCoordY[i] = 0;
85
c720a83c 86 for (Int_t i=0; i<2; i++) fLutLpt[i] = fLutHpt[i] = 0;
be972727 87}
88
89//___________________________________________
ac809573 90AliMUONLocalTriggerBoard::AliMUONLocalTriggerBoard(AliMpLocalBoard* mpLocalBoard)
91 : AliMUONTriggerBoard(mpLocalBoard->GetName(), mpLocalBoard->GetSlot()),
92 fMpLocalBoard(mpLocalBoard),
1657f946 93 fStripX11(0),
8aac6cce 94 fStripY11(15),
1657f946 95 fDev(0),
8aac6cce 96 fTrigY(1),
1657f946 97 fOutput(0),
ac809573 98 fLUT(0x0),
e93b11d0 99 fCoinc44(0)
be972727 100{
71a2d3aa 101/// Standard constructor
102///
be972727 103
104 for (Int_t i=0; i<2; i++)
105 for (Int_t j=0; j<4; j++)
106 {
107 fXY[i][j] = fXYU[i][j] = fXYD[i][j] = 0;
108
109 fMask[i][j] = 0xFFFF;
110 }
111
be972727 112 for (Int_t i=0; i<5; i++) fMinDevStrip[i] = fMinDev[i] = fCoordY[i] = 0;
113
c720a83c 114 for (Int_t i=0; i<2; i++) fLutLpt[i] = fLutHpt[i] = 0;
be972727 115}
116
71a2d3aa 117//___________________________________________
118AliMUONLocalTriggerBoard::~AliMUONLocalTriggerBoard()
884a73f1 119{
71a2d3aa 120/// Destructor
121}
884a73f1 122
ac809573 123
124//___________________________________________
125Int_t AliMUONLocalTriggerBoard::GetNumber() const
126{
127/// return board number for notified boards
128
129 if (fMpLocalBoard->IsNotified())
130 return fMpLocalBoard->GetId();
131 else
132 return 0;
133}
134
be972727 135//___________________________________________
136void AliMUONLocalTriggerBoard::Reset()
137{
71a2d3aa 138/// reset board
139///
be972727 140 for (Int_t i=0; i<2; i++)
141 for (Int_t j=0; j<4; j++)
142 fXY[i][j] = fXYU[i][j] = fXYD[i][j] = 0;
143
144 fResponse = 0;
145
146 for (Int_t i=0; i<5; i++) fMinDevStrip[i] = fMinDev[i] = fCoordY[i] = 0;
147
148 fOutput = 0;
149
8aac6cce 150 fStripX11 = 0;
151 fStripY11 = 15;
152 fDev = 0;
153 fTrigY = 1;
be972727 154
c720a83c 155 for (Int_t i=0; i<2; i++) fLutLpt[i] = fLutHpt[i] = 0;
be972727 156}
157
158//___________________________________________
159void AliMUONLocalTriggerBoard::Setbit(Int_t strip, Int_t cathode, Int_t chamber)
160{
71a2d3aa 161/// 0 .. LBS : N-1 .. MSB
be972727 162 TBits w, m;
163
164 UShort_t xy = fXY[cathode][chamber], mask = fMask[cathode][chamber];
165
166 w.Set(16,&xy);
167 m.Set(16,&mask);
168
169 Int_t s = strip - int(strip / 16) * 16;
170
171 w.SetBitNumber(s);
172
173 w &= m;
174
175 UShort_t value;
176
177 w.Get(&value);
178
179 fXY[cathode][chamber] = value;
180}
181
8af755f4 182//___________________________________________
183void AliMUONLocalTriggerBoard::SetbitM(Int_t strip, Int_t cathode, Int_t chamber)
184{
71a2d3aa 185/// 0 .. LBS : N-1 .. MSB
8af755f4 186 TBits w, m;
187
188 UShort_t xy = fXY[cathode][chamber], mask = fMask[cathode][chamber];
189
190 w.Set(16,&xy);
191 m.Set(16,&mask);
192
8af755f4 193 w.SetBitNumber(strip);
194
195 w &= m;
196
197 UShort_t value;
198
199 w.Get(&value);
200
201 fXY[cathode][chamber] = value;
202}
203
ac809573 204
be972727 205//___________________________________________
e44235aa 206void AliMUONLocalTriggerBoard::Pattern(Option_t *option) const
be972727 207{
71a2d3aa 208/// print bit pattern
209///
be972727 210 TString op = option;
211
212 if (op.Contains("X")) BP("X");
213
214 if (op.Contains("Y")) BP("Y");
215}
216
217
218//___________________________________________
e44235aa 219void AliMUONLocalTriggerBoard::BP(Option_t *option) const
be972727 220{
71a2d3aa 221/// RESPECT THE OLD PRINTOUT FORMAT
e44235aa 222
223 const Int_t kModuleId[126] =
224 {11,12,13,14,15,16,17, // right side of the chamber
225 21,22,23,24,25,26,27,
226 31,32,33,34,35,36,37,
227 41,42,43,44,45,46,47,
228 51,52,53,54,55,56,57,
229 61,62,63,64,65,66,67,
230 71,72,73,74,75,76,77,
231 81,82,83,84,85,86,87,
232 91,92,93,94,95,96,97,
233 -11,-12,-13,-14,-15,-16,-17, // right side of chamber
234 -21,-22,-23,-24,-25,-26,-27,
235 -31,-32,-33,-34,-35,-36,-37,
236 -41,-42,-43,-44,-45,-46,-47,
237 -51,-52,-53,-54,-55,-56,-57,
238 -61,-62,-63,-64,-65,-66,-67,
239 -71,-72,-73,-74,-75,-76,-77,
240 -81,-82,-83,-84,-85,-86,-87,
241 -91,-92,-93,-94,-95,-96,-97};
242
243 const Int_t kNstripY[126]=
244 { 8, 8, 8, 8, 8, 8,16, // right side of the chamber
245 8, 8, 8, 8, 8, 8,16,
246 16,16,16,16,16, 8,16,
247 16,16,16,16,16, 8,16,
248 0, 8,16,16,16, 8,16,
249 16,16,16,16,16, 8,16,
250 16,16,16,16,16, 8,16,
251 8, 8, 8, 8, 8, 8,16,
252 8, 8, 8, 8, 8, 8,16,
253 8, 8, 8, 8, 8, 8,16, // left side of the chamber
254 8, 8, 8, 8, 8, 8,16,
255 16,16,16,16,16, 8,16,
256 16,16,16,16,16, 8,16,
257 0, 8,16,16,16, 8,16,
258 16,16,16,16,16, 8,16,
259 16,16,16,16,16, 8,16,
260 8, 8, 8, 8, 8, 8,16,
261 8, 8, 8, 8, 8, 8,16};
be972727 262
263 TString op = option;
e44235aa 264
265 TString nn = GetName();
8af755f4 266
be972727 267 if (op.Contains("X"))
268 {
269 printf("-------- TRIGGER INPUT ---------\n");
75f27f52 270 printf("--- warning: switchs not activated at this level ---\n");
be972727 271 printf("===============================================================\n");
272 printf(" 5432109876543210");
273
274 char *x[4] = {"XMC11","XMC12","XMC21","XMC22"};
275 char *s[4] = {" ",
276 " ",
277 " ",
278 " "};
279
280 for (Int_t ch=0; ch<4; ch++)
281 {
282 printf("\n %s%s", x[ch], s[ch]);
283
284 UShort_t xy = fXY[0][ch];
285
286 TBits w(16); w.Set(16,&xy);
287
288 if (ch<2) cout << w;
289 else
290 {
291 UShort_t xyd = fXYD[0][ch], xyu = fXYU[0][ch];
292 TBits dw(16), uw(16); dw.Set(16,&xyd); uw.Set(16,&xyu);
293
294 TBits ew(32);
295
296 for (Int_t i=0;i<16;i++) ew[i+8] = w[i];
297
298 for (Int_t i=0;i<8;i++)
299 {
300 ew[i] = dw[i+8]; // 8 MSB
301 ew[i+24] = uw[i]; //
302 }
303
304 cout << ew;
305 }
306 }
307
308 printf("\n ");
309 printf("10987654321098765432109876543210\n");
310 }
311
312 if (op.Contains("Y"))
313 {
314 printf("---------------------------------------------------------------\n");
315 printf(" ");
316
317/* OLD NUMBERING STYLE */
318/**/
8af755f4 319 Int_t idCircuit = 0, absidModule = 0;
320
e44235aa 321 if (!(nn.Contains("Int")))
322 {
323 idCircuit = fgkCircuitId[GetI()];
324 absidModule = TMath::Abs(Int_t(idCircuit/10));
325 }
8af755f4 326
be972727 327 Int_t iModule=0;
8af755f4 328
be972727 329 for (Int_t i=0; i<63; i++)
330 {
e44235aa 331 if (kModuleId[i]==absidModule)
be972727 332 {
333 iModule=i;
334 break;
335 }
336 }
337
e44235aa 338 Int_t nStrip = kNstripY[iModule];
be972727 339 for (Int_t istrip=nStrip-1; istrip>=0; istrip--) {
340 if (istrip>9) printf("%i",istrip-10*Int_t(istrip/10));
341 if (istrip<10) printf("%i",istrip);
342 }
343/**/
344/* */
345
346 UShort_t xyval = 0;
347
ac809573 348 if (GetSwitch(1))
be972727 349 {
350 xyval = fXY[1][0];
351 TBits v11(8); v11.Set(8,&xyval);
352 printf("\n YMC11 ");
353 cout << v11;
354
355 xyval = fXY[1][1];
356 TBits v12(8); v12.Set(8,&xyval);
357 printf("\n YMC12 ");
358 cout << v12;
359
360 xyval = fXY[1][2];
361 TBits v21(8); v21.Set(8,&xyval);
362 printf("\n YMC21 ");
363 cout << v21;
364
365 xyval = fXY[1][3];
366 TBits v22(8); v22.Set(8,&xyval);
367 printf("\n YMC22 ");
368 cout << v22 << endl;
369 }
370 else
371 {
372 xyval = fXY[1][0];
373 TBits v11(16); v11.Set(16,&xyval);
374 printf("\n YMC11 ");
375 cout << v11;
376
377 xyval = fXY[1][1];
378 TBits v12(16); v12.Set(16,&xyval);
379 printf("\n YMC12 ");
380 cout << v12;
381
382 xyval = fXY[1][2];
383 TBits v21(16); v21.Set(16,&xyval);
384 printf("\n YMC21 ");
385 cout << v21;
386
387 xyval = fXY[1][3];
388 TBits v22(16); v22.Set(16,&xyval);
389 printf("\n YMC22 ");
390 cout << v22 << endl;
391 }
392
be972727 393// tmp
394 printf("---------------------------------------------------------------");
395 printf("\n upper part of circuit %i",idCircuit);
396 printf("\n UMC21 ");
397 xyval = fXYU[1][2];
398 TBits wu21(16); wu21.Set(16,&xyval);
399 cout << wu21;
400 printf("\n UMC22 ");
401 xyval = fXYU[1][3];
402 TBits wu22(16); wu22.Set(16,&xyval);
403 cout << wu22;
404 printf("\n lower part of circuit %i",idCircuit);
405 printf("\n LMC21 ");
406 xyval = fXYD[1][2];
407 TBits wl21(16); wl21.Set(16,&xyval);
408 cout << wl21;
409 printf("\n LMC22 ");
410 xyval = fXYD[1][3];
411 TBits wl22(16); wl22.Set(16,&xyval);
412 cout << wl22;
413 printf("\n");
414 printf("===============================================================\n");
415 }
416}
417
be972727 418//___________________________________________
419void AliMUONLocalTriggerBoard::Module(char *mod)
420{
71a2d3aa 421/// get module from name
422///
f4678817 423 const Int_t kMaxfields = 2; char **fields = new char*[kMaxfields];
be972727 424
425 char s[100]; strcpy(s, GetName());
426
427 Int_t numlines = 0;
428
429 for (char *token = strtok(s, "B");
430 token != NULL;
431 token = strtok(NULL, " "))
432 {
433 fields[numlines] = new char[strlen(token)+1];
434 strcpy(fields[numlines++],token);
435 }
436
437 strcpy(mod,fields[0]);
438}
439
440//___________________________________________
e93b11d0 441void AliMUONLocalTriggerBoard::TrigX(Int_t ch1q[16], Int_t ch2q[16], Int_t ch3q[32], Int_t ch4q[32])
be972727 442{
71a2d3aa 443/// note : coinc44 = flag 0 or 1 (0 coincidence -> 3/4, 1 coincidence -> 4/4) \n
444///--------------------------------------------------------- \n
445/// step # 1 : declustering, reduction DS, calculate sgle & dble \n
446///---------------------------------------------------------
be972727 447 Int_t ch1e[19], ch2e[20], ch3e[35], ch4e[36];
448 Int_t sgleHit1[31], sgleHit2[63];
449 Int_t dbleHit1[31], dbleHit2[63];
450
451 Int_t i;
452 Int_t j;
453 Int_t istrip;
454
455 for (i=0; i<31; i++) {
456 sgleHit1[i]=0;
457 dbleHit1[i]=0;
458 }
459 for (i=0; i<63; i++) {
460 sgleHit2[i]=0;
461 dbleHit2[i]=0;
462 }
463
464//--- inititialize che using chq
75f27f52 465//--- switch zero_down, zero_middle & zero_up added 30/05/07
466//--- fSwitch[7/8/9] = zero_down/zero_middle/zero_up
be972727 467 for (i=0; i<19; i++) {
468 if (i<1||i>16) ch1e[i]=0;
469 else ch1e[i]=ch1q[i-1];
470 }
471 for (i=0; i<20; i++) {
472 if (i<2||i>17) ch2e[i]=0;
473 else ch2e[i]=ch2q[i-2];
474 }
475 for (i=0; i<35; i++) {
476 if (i<1||i>32) ch3e[i]=0;
ac809573 477 else if (i>=1 && i<=8) ch3e[i]=ch3q[i-1]&!GetSwitch(7);
478 else if (i>=9 && i<=24) ch3e[i]=ch3q[i-1]&!GetSwitch(8);
479 else if (i>=25 && i<=32) ch3e[i]=ch3q[i-1]&!GetSwitch(9);
be972727 480 }
481 for (i=0; i<36; i++) {
482 if (i<2||i>33) ch4e[i]=0;
ac809573 483 else if (i>=2 && i<=9) ch4e[i]=ch4q[i-2]&!GetSwitch(7);
484 else if (i>=10 && i<=25) ch4e[i]=ch4q[i-2]&!GetSwitch(8);
485 else if (i>=26 && i<=33) ch4e[i]=ch4q[i-2]&!GetSwitch(9);
be972727 486 }
487
be972727 488//--- calculate dble & sgle first station
489 for (i=0; i<=15; i++) {
490 sgleHit1[2*i] = (!ch1e[i+1]|(ch1e[i]^ch1e[i+2])) &
491 (!ch2e[i+2] | (ch2e[i+1]^ch2e[i+3]));
492
493 dbleHit1[2*i] = ch1e[i+1]&!(ch1e[i+2]^ch1e[i]) &
494 (ch2e[i+2] | (!ch2e[i]&ch2e[i+1]) | (ch2e[i+3]&!ch2e[i+4]));
495 }
496
497 for (i=0; i<=14; i++) {
498 sgleHit1[2*i+1] = (!ch1e[i+1]|!ch1e[i+2]|(ch1e[i]^ch1e[i+3])) &
499 (!ch2e[i+2] | !ch2e[i+3] | (ch2e[i+1]^ch2e[i+4]));
500 dbleHit1[2*i+1] = ch1e[i+1]&ch1e[i+2]&!(ch1e[i]^ch1e[i+3]) &
501 (ch2e[i+2]&(!ch2e[i+1]|!ch2e[i]) |
502 ch2e[i+3]&(ch2e[i+2]|!ch2e[i+4]|!ch2e[i+5]));
503 }
504
505//--- calculate dble & sgle second station
506 for (i=0; i<=31; i++) {
507 sgleHit2[2*i] = (!ch3e[i+1]|(ch3e[i]^ch3e[i+2])) &
508 (!ch4e[i+2] | (ch4e[i+1]^ch4e[i+3]));
509 dbleHit2[2*i] = ch3e[i+1]&!(ch3e[i+2]^ch3e[i]) &
510 (ch4e[i+2] | (!ch4e[i]&ch4e[i+1]) | (ch4e[i+3]&!ch4e[i+4]));
511 }
512
513 for (i=0; i<=30; i++) {
514 sgleHit2[2*i+1] = (!ch3e[i+1]|!ch3e[i+2]|(ch3e[i]^ch3e[i+3])) &
515 (!ch4e[i+2] | !ch4e[i+3] | (ch4e[i+1]^ch4e[i+4]));
516 dbleHit2[2*i+1] = ch3e[i+1]&ch3e[i+2]&!(ch3e[i]^ch3e[i+3]) &
517 (ch4e[i+2]&(!ch4e[i+1]|!ch4e[i]) |
518 ch4e[i+3]&(ch4e[i+2]|!ch4e[i+4]|!ch4e[i+5]));
519 }
520
521//---
522 if(AliDebugLevel()==3||AliDebugLevel()==5) {
523 printf("===============================================================\n");
524 printf(" X plane after sgle and dble \n");
525 printf(" 0987654321098765432109876543210");
526 printf("\n SGLE1 ");
527 for (istrip=30; istrip>=0; istrip--) printf("%i",(!sgleHit1[istrip]));
528 printf("\n DBLE1 ");
529 for (istrip=30; istrip>=0; istrip--) printf("%i",dbleHit1[istrip]);
530 printf("\n SGLE2 ");
531 for (istrip=62; istrip>=0; istrip--) printf("%i",(!sgleHit2[istrip]));
532 printf("\n DBLE2 ");
533 for (istrip=62; istrip>=0; istrip--) printf("%i",dbleHit2[istrip]);
534 printf("\n 210987654321098765432109876543210987654321098765432109876543210\n");
535 }
536
537//---------------------------------------------------------
538// step # 2 : coincidence 3/4
539//---------------------------------------------------------
540 Int_t rearImage[31][31];
541 for (i=0; i<31; i++) {
542 for (j=0; j<31; j++) {
543 rearImage[i][j]=0;
544 }
545 }
546
547 Int_t notOr1=!dbleHit1[30] & !dbleHit1[29] & !dbleHit1[28] & !dbleHit1[27] &
548 !dbleHit1[26] & !dbleHit1[25] & !dbleHit1[24] & !dbleHit1[23] &
549 !dbleHit1[22] & !dbleHit1[21] & !dbleHit1[20] & !dbleHit1[19] &
550 !dbleHit1[18] & !dbleHit1[17] & !dbleHit1[16] & !dbleHit1[15] &
551 !dbleHit1[14] & !dbleHit1[13] & !dbleHit1[12] & !dbleHit1[11] &
552 !dbleHit1[10] & !dbleHit1[9] & !dbleHit1[8] & !dbleHit1[7] &
553 !dbleHit1[6] & !dbleHit1[5] & !dbleHit1[4] & !dbleHit1[3] &
e93b11d0 554 !dbleHit1[2] & !dbleHit1[1] & !dbleHit1[0] & !fCoinc44;
be972727 555
556 Int_t notOr2= !dbleHit2[62] & !dbleHit2[61] & !dbleHit2[60] & !dbleHit2[59] &
557 !dbleHit2[58] & !dbleHit2[57] & !dbleHit2[56] & !dbleHit2[55] &
558 !dbleHit2[54] & !dbleHit2[53] & !dbleHit2[52] & !dbleHit2[51] &
559 !dbleHit2[50] & !dbleHit2[49] & !dbleHit2[48] & !dbleHit2[47] &
560 !dbleHit2[46] & !dbleHit2[45] & !dbleHit2[44] & !dbleHit2[43] &
561 !dbleHit2[42] & !dbleHit2[41] & !dbleHit2[40] & !dbleHit2[39] &
562 !dbleHit2[38] & !dbleHit2[37] & !dbleHit2[36] & !dbleHit2[35] &
563 !dbleHit2[34] & !dbleHit2[33] & !dbleHit2[32] & !dbleHit2[31] &
564 !dbleHit2[30] & !dbleHit2[29] & !dbleHit2[28] & !dbleHit2[27] &
565 !dbleHit2[26] & !dbleHit2[25] & !dbleHit2[24] & !dbleHit2[23] &
566 !dbleHit2[22] & !dbleHit2[21] & !dbleHit2[20] & !dbleHit2[19] &
567 !dbleHit2[18] & !dbleHit2[17] & !dbleHit2[16] & !dbleHit2[15] &
568 !dbleHit2[14] & !dbleHit2[13] & !dbleHit2[12] & !dbleHit2[11] &
569 !dbleHit2[10] & !dbleHit2[9] & !dbleHit2[8] & !dbleHit2[7] &
570 !dbleHit2[6] & !dbleHit2[5] & !dbleHit2[4] & !dbleHit2[3] &
e93b11d0 571 !dbleHit2[2] & !dbleHit2[1] & !dbleHit2[0] & !fCoinc44;
be972727 572
573// DS reduction
574 for (i=0; i<31; i++) {
575 sgleHit1[i] = !sgleHit1[i]&notOr1;
576 }
577 for (i=0; i<63; i++) {
578 sgleHit2[i] = !sgleHit2[i]&notOr2;
579 }
580
581// extract rearImage
582 for (i=0; i<31; i++){
583 Int_t tmpSgleHit2[31];
584 Int_t tmpDbleHit2[31];
585 for (j=0; j<31; j++){
586 tmpSgleHit2[j] = sgleHit2[i+j+1];
587 tmpDbleHit2[j] = dbleHit2[i+j+1];
588 }
589
590 for (Int_t k=0; k<31; k++) {
591 rearImage[i][k]=(sgleHit1[i]&tmpDbleHit2[k])|
592 (dbleHit1[i]&(tmpSgleHit2[k]|tmpDbleHit2[k]));
593 }
594 }
595
596 //-----------
597 if(AliDebugLevel()==3||AliDebugLevel()==5) {
598 printf("===============================================================\n");
599 for (i=30; i>=0; i--) {
600 printf("%i \t",i);
601 for (istrip=31; istrip>=0; istrip--) printf("%i",rearImage[i][istrip]);
602 printf("\n");
603 }
604 }
605
606//---------------------------------------------------------
607// step # 3 : calculate deviation
608//---------------------------------------------------------
609 Int_t dev[31][6];
610 for (i=0; i<31; i++) {
611 for (j=0; j<6; j++) {
612 dev[i][j]=0;
613 }
614 }
615
616 for (i=0; i<31; i++){
617 Int_t leftDev[5], rightDev[5];
618 Int_t orL1, andL1, andL2, orR1, orR2, andR1, andR2, andR3;
619
620// calculate Left deviation
621 orL1=rearImage[i][16]|rearImage[i][18]|rearImage[i][20]|rearImage[i][22];
622 andL1=!rearImage[i][17]&!rearImage[i][19]&!rearImage[i][21] & !orL1;
623 andL2=!rearImage[i][23]&!rearImage[i][24]&!rearImage[i][25]&!rearImage[i][26];
624
625 leftDev[0] = (rearImage[i][16]|!rearImage[i][17]) &
626 (rearImage[i][16]|rearImage[i][18]|!rearImage[i][19]&
627 (rearImage[i][20]|!rearImage[i][21])) &
628 (orL1|!rearImage[i][23]&(rearImage[i][24]|!rearImage[i][25])) &
629 (orL1|rearImage[i][24]|rearImage[i][26]|!rearImage[i][27]&
630 (rearImage[i][28]|!rearImage[i][29]));
631
632 leftDev[1] = !rearImage[i][16] &
633 !(!rearImage[i][17]&!rearImage[i][18]&!rearImage[i][21]&!rearImage[i][22] &
634 (!rearImage[i][25]&!rearImage[i][26]&(rearImage[i][27]|rearImage[i][28]))) &
635 (rearImage[i][17]|rearImage[i][18] | !rearImage[i][19]&!rearImage[i][20]) &
636 (rearImage[i][17]|rearImage[i][18]|rearImage[i][21]|rearImage[i][22] |
637 !rearImage[i][23]&!rearImage[i][24]);
638
639 leftDev[2] = (!rearImage[i][16]&!rearImage[i][17]&!rearImage[i][18]) &
640 (rearImage[i][19]|rearImage[i][20]|rearImage[i][21]|rearImage[i][22] | andL2);
641
642 leftDev[3] = andL1;
643
644 leftDev[4] =
645 !rearImage[i][27]&!rearImage[i][28]&!rearImage[i][29]&!rearImage[i][30] &
646 andL1 & andL2;
647
648 // calculate Right deviation
649 orR1=rearImage[i][8]|rearImage[i][10]|rearImage[i][12]|rearImage[i][14];
650 orR2=rearImage[i][8]|rearImage[i][9]|rearImage[i][10]|rearImage[i][11];
651 andR1=!rearImage[i][12]&!rearImage[i][13]&!rearImage[i][14]&!rearImage[i][15];
652 andR2=
653 !rearImage[i][8]&!rearImage[i][9]&!rearImage[i][10]&!rearImage[i][11] & andR1;
654 andR3=!rearImage[i][4]&!rearImage[i][5]&!rearImage[i][6]&!rearImage[i][7];
655
656 rightDev[0] = !rearImage[i][15]&(rearImage[i][14]|!rearImage[i][13]) &
657 ((rearImage[i][12]|rearImage[i][14]|!rearImage[i][11]&
658 (rearImage[i][10]|!rearImage[i][9])) &
659 ((orR1|!rearImage[i][7]&(rearImage[i][6]|!rearImage[i][5])) &
660 (orR1|rearImage[i][4]|rearImage[i][6]|!rearImage[i][3]&(rearImage[i][2]|
661 !rearImage[i][1]))));
662
663 rightDev[1] = !rearImage[i][15]&!rearImage[i][14] &
664 !(!rearImage[i][4]&!rearImage[i][5]&!rearImage[i][8]&!rearImage[i][9] &
665 (!rearImage[i][12]&!rearImage[i][13]&(rearImage[i][2]|rearImage[i][3]))) &
666 (rearImage[i][12]|rearImage[i][13] | !rearImage[i][10]&!rearImage[i][11]) &
667 (rearImage[i][8]|rearImage[i][9]|rearImage[i][12]|rearImage[i][13] |
668 !rearImage[i][6]&!rearImage[i][7]);
669
670 rightDev[2] = andR1 & (orR2 | andR3);
671 rightDev[3] = andR2;
672 rightDev[4] =
673 !rearImage[i][0]&!rearImage[i][1]&!rearImage[i][2]&!rearImage[i][3] &
674 andR2 & andR3 ;
675
676 // compare Left & Right deviations
677 Int_t tmpLeftDev=0, tmpRightDev=0;
678 for (j=0; j<5; j++){
679 tmpLeftDev = tmpLeftDev + Int_t(leftDev[j]<<j);
680 tmpRightDev = tmpRightDev + Int_t(rightDev[j]<<j);
681 }
682
683 // assign mimimum deviation do dev[][]
684 if (tmpLeftDev < tmpRightDev ){
685 for (j=0; j<5; j++){ dev[i][j]=leftDev[j];}
686 dev[i][5]=1;
687 } else {
688 for (j=0; j<5; j++){ dev[i][j]=rightDev[j];}
689 dev[i][5]=0;
690 }
691 }
692
693//---
694 if(AliDebugLevel()==3||AliDebugLevel()==5) {
695 printf("===============================================================\n");
696 for (i=30; i>=0; i--) {
697 printf("%i \t",i);
698 for (istrip=5; istrip>=0; istrip--) printf("%i",dev[i][istrip]);
699 printf(" \n");
700 }
701 }
702
703//---------------------------------------------------------
704// step # 4 : sort deviation
705//---------------------------------------------------------
706 Int_t bga1[16], bga2[8], bga3[4], bga4[2], bga5;
707 Int_t tmpbga1[16][6], tmpbga2[8][6], tmpbga3[4][6], tmpbga4[2][6], tmpbga5[6];
708 Int_t tmpMax[6]={1,1,1,1,1,0};
709
710 for (i=0; i<15; i++) {
711 Sort2x5(dev[2*i],dev[2*i+1],tmpbga1[i],bga1[i]);
712 }
713 Sort2x5(dev[30],tmpMax,tmpbga1[15],bga1[15]);
714
715//--
716 if(AliDebugLevel()==3||AliDebugLevel()==5) {
717 printf("===============================================================\n");
718 printf(" sorting : 1st level \n");
719 for (i=15; i>=0; i--) {
720 printf("\t %i \t",bga1[i]);
721 for (j=5; j>=0; j--) printf("%i",tmpbga1[i][j]);
722 printf(" \n");
723 }
724 }
725
726 for (i=0; i<8; i++) {
727 Sort2x5(tmpbga1[2*i],tmpbga1[2*i+1],tmpbga2[i],bga2[i]);
728 }
729
730//--
731 if(AliDebugLevel()==3||AliDebugLevel()==5) {
732 printf("===============================================================\n");
733 printf(" sorting : 2nd level \n");
734 for (i=7; i>=0; i--) {
735 printf("\t %i \t",bga2[i]);
736 for (j=5; j>=0; j--) printf("%i",tmpbga1[i][j]);
737 printf(" \n");
738 }
739 }
740
741 for (i=0; i<4; i++) {
742 Sort2x5(tmpbga2[2*i],tmpbga2[2*i+1],tmpbga3[i],bga3[i]);
743 }
744
745//--
746 if(AliDebugLevel()==3||AliDebugLevel()==5) {
747 printf("===============================================================\n");
748 printf(" sorting : 3rd level \n");
749 for (i=3; i>=0; i--) {
750 printf("\t %i \t",bga3[i]);
751 for (j=5; j>=0; j--) printf("%i",tmpbga3[i][j]);
752 printf(" \n");
753 }
754 }
755
756 for (i=0; i<2; i++) {
757 Sort2x5(tmpbga3[2*i],tmpbga3[2*i+1],tmpbga4[i],bga4[i]);
758 }
759
760//--
761 if(AliDebugLevel()==3||AliDebugLevel()==5) {
762 printf("===============================================================\n");
763 printf(" sorting : 4th level \n");
764 for (i=1; i>=0; i--) {
765 printf("\t %i \t",bga4[i]);
766 for (j=5; j>=0; j--) printf("%i",tmpbga4[i][j]);
767 printf(" \n");
768 }
769 }
770
771 Sort2x5(tmpbga4[0],tmpbga4[1],tmpbga5,bga5);
772
773 // coding from 6 to 5 bits
774 fMinDev[4] = tmpbga5[5] | tmpbga5[4];
775 for (i=0; i<4; i++) {
776 fMinDev[i]=tmpbga5[i] & !tmpbga5[4];
777 }
778
779 // find address of strip with minimum deviation
780 fMinDevStrip[4]=bga5;
781 if (bga5<=1) fMinDevStrip[3]=bga4[bga5];
782
783 Int_t tmpAd=fMinDevStrip[3]+fMinDevStrip[4]*2;
784 if (tmpAd<=3) fMinDevStrip[2]=bga3[tmpAd];
785
786 tmpAd=fMinDevStrip[2]+fMinDevStrip[3]*2+fMinDevStrip[4]*4;
787 if (tmpAd<=7) fMinDevStrip[1]=bga2[tmpAd];
788
789 tmpAd=fMinDevStrip[1]+fMinDevStrip[2]*2+fMinDevStrip[3]*4+fMinDevStrip[4]*8;
790 if (tmpAd<=15) fMinDevStrip[0]=bga1[tmpAd];
791
792 if(AliDebugLevel()==3||AliDebugLevel()==5) {
793 printf("===============================================================\n");
794 printf("minDevStrip = ");
795 for (i=4; i>=0; i--) printf("%i",fMinDevStrip[i]);
796 printf(" minDev = ");
797 for (i=4; i>=0; i--) printf("%i",fMinDev[i]);
798 printf(" \n");
799 printf("===============================================================\n");
800 }
801
802}
803
804//___________________________________________
805void AliMUONLocalTriggerBoard::Sort2x5(Int_t dev1[6], Int_t dev2[6],
806 Int_t minDev[6], Int_t &dev1GTdev2)
807{
71a2d3aa 808/// returns minimun between dev1 and dev2
be972727 809 Int_t tmpDev1=0, tmpDev2=0;
810
811 for (Int_t j=0; j<5; j++)
812 {
813 tmpDev1 += Int_t(dev1[j]<<j);
814 tmpDev2 += Int_t(dev2[j]<<j);
815 }
816
817 if (tmpDev1<=tmpDev2)
818 {
819 for (Int_t j=0; j<=5; j++) minDev[j]=dev1[j];
820 dev1GTdev2=0;
821 }
822 else
823 {
824 for (Int_t j=0; j<=5; j++) minDev[j]=dev2[j];
825 dev1GTdev2=1;
826 }
827}
828
829//___________________________________________
830void AliMUONLocalTriggerBoard::TrigY(Int_t y1[16], Int_t y2[16], Int_t y3[16], Int_t y4[16],
e93b11d0 831 Int_t y3u[16], Int_t y3d[16], Int_t y4u[16], Int_t y4d[16])
be972727 832{
71a2d3aa 833/// note : resMid = 1 -> cancel \n
834///---------------------------------------------------------\n
835/// step # 1 : prehandling Y \n
836///---------------------------------------------------------
be972727 837 Int_t i;
838 Int_t istrip;
839
840 for (i=0; i<16; i++)
841 {
ac809573 842 y3[i]=y3[i]&!GetSwitch(8);
843 y4[i]=y4[i]&!GetSwitch(8);
be972727 844 }
845
846// 10/29/04 fZeroAllYLSB added
847// for (i=0; i<8; i++)
848// {
849// y1[i] = y1[i]&!fSwitch[6];
850// y2[i] = y2[i]&!fSwitch[6];
851// y3[i] = y3[i]&!fSwitch[6];
852// y4[i] = y4[i]&!fSwitch[6];
853// }
854
855 Int_t ch1[16], ch2[16], ch3[16], ch4[16];
856
857 Int_t tmpy3to16[16], tmpy4to16[16];
858 Int_t tmpy3uto16[16], tmpy3dto16[16], tmpy4uto16[16], tmpy4dto16[16];
859 for (i=0; i<8; i++){
ac809573 860 ch1[2*i] = y1[i]&GetSwitch(1) | y1[2*i]&!GetSwitch(1);
861 ch1[2*i+1] = y1[i]&GetSwitch(1) | y1[2*i+1]&!GetSwitch(1);
be972727 862
ac809573 863 ch2[2*i] = y2[i]&GetSwitch(1) | y2[2*i]&!GetSwitch(1);
864 ch2[2*i+1] = y2[i]&GetSwitch(1) | y2[2*i+1]&!GetSwitch(1);
be972727 865
ac809573 866 tmpy3to16[2*i ] = y3[i]&GetSwitch(1) | y3[2*i ]&!GetSwitch(1);
867 tmpy3to16[2*i+1] = y3[i]&GetSwitch(1) | y3[2*i+1]&!GetSwitch(1);
be972727 868
ac809573 869 tmpy4to16[2*i ] = y4[i]&GetSwitch(1) | y4[2*i ]&!GetSwitch(1);
870 tmpy4to16[2*i+1] = y4[i]&GetSwitch(1) | y4[2*i+1]&!GetSwitch(1);
be972727 871
ac809573 872 tmpy3uto16[2*i ] = y3u[i]&GetSwitch(2) | y3u[2*i ]&!GetSwitch(2);
873 tmpy3uto16[2*i+1] = y3u[i]&GetSwitch(2) | y3u[2*i+1]&!GetSwitch(2);
be972727 874
ac809573 875 tmpy4uto16[2*i ] = y4u[i]&GetSwitch(2) | y4u[2*i ]&!GetSwitch(2);
876 tmpy4uto16[2*i+1] = y4u[i]&GetSwitch(2) | y4u[2*i+1]&!GetSwitch(2);
be972727 877
ac809573 878 tmpy3dto16[2*i ] = y3d[i]&GetSwitch(0) | y3d[2*i ]&!GetSwitch(0);
879 tmpy3dto16[2*i+1] = y3d[i]&GetSwitch(0) | y3d[2*i+1]&!GetSwitch(0);
be972727 880
ac809573 881 tmpy4dto16[2*i ] = y4d[i]&GetSwitch(0) | y4d[2*i ]&!GetSwitch(0);
882 tmpy4dto16[2*i+1] = y4d[i]&GetSwitch(0) | y4d[2*i+1]&!GetSwitch(0);
be972727 883 }
884
ac809573 885 if (GetSwitch(3)==0&&GetSwitch(4)==0){
be972727 886 for (i=0; i<16; i++){
887 ch3[i] = tmpy3to16[i];
888 ch4[i] = tmpy4to16[i];
889 }
890 }
ac809573 891 if (GetSwitch(3)==0&&GetSwitch(4)==1){
be972727 892 for (i=0; i<16; i++){
8af755f4 893 ch3[i] = tmpy3dto16[i]|tmpy3to16[i];
894 ch4[i] = tmpy4dto16[i]|tmpy4to16[i];
be972727 895 }
896 }
ac809573 897 if (GetSwitch(3)==1&&GetSwitch(4)==0){
be972727 898 for (i=0; i<16; i++){
8af755f4 899 ch3[i] = tmpy3uto16[i]|tmpy3to16[i];
900 ch4[i] = tmpy4uto16[i]|tmpy4to16[i];
be972727 901 }
902 }
ac809573 903 if (GetSwitch(3)==1&&GetSwitch(4)==1){
be972727 904 for (i=0; i<16; i++){
905 ch3[i] = tmpy3dto16[i]|tmpy3to16[i]|tmpy3uto16[i];
906 ch4[i] = tmpy4dto16[i]|tmpy4to16[i]|tmpy4uto16[i];
907 }
908 }
909
910// debug
911 if(AliDebugLevel()==4||AliDebugLevel()==5) {
912 printf("===============================================================\n");
913 printf(" Y plane after PreHandling x2m x2u x2d orMud %i %i %i %i %i \n",
ac809573 914 GetSwitch(1),GetSwitch(2), GetSwitch(0),GetSwitch(3),GetSwitch(4));
be972727 915 printf(" ");
916 for (istrip=15; istrip>=0; istrip--) {
917 if (istrip>9) printf("%i",istrip-10*Int_t(istrip/10));
918 if (istrip<10) printf("%i",istrip);
919 }
920 printf("\n YMC11 ");
921 for (istrip=15; istrip>=0; istrip--) printf("%i",ch1[istrip]);
922 printf("\n YMC12 ");
923 for (istrip=15; istrip>=0; istrip--) printf("%i",ch2[istrip]);
924 printf("\n YMC21 ");
925 for (istrip=15; istrip>=0; istrip--) printf("%i",ch3[istrip]);
926 printf("\n YMC22 ");
927 for (istrip=15; istrip>=0; istrip--) printf("%i",ch4[istrip]);
928 printf(" \n");
929 }
930//debug
931
932//---------------------------------------------------------
933// step # 2 : calculate sgle and dble, apply DS reduction
934//---------------------------------------------------------
935 Int_t sgle1[16], dble1[16];
936 Int_t sgle2[16], dble2[16];
937
938 // Calculate simple and double hits
939 for (i=0; i<16; i++) {
940 dble1[i] = ch1[i] & ch2[i];
941 dble2[i] = ch3[i] & ch4[i];
942
943 sgle1[i] = (ch1[i]|ch2[i]);
944 sgle2[i] = (ch3[i]|ch4[i]);
945 }
946
947 //debug
948 if(AliDebugLevel()==4||AliDebugLevel()==5) {
949 printf("===============================================================\n");
950 printf(" Y plane after sgle dble \n");
951 printf(" ");
952 for (istrip=15; istrip>=0; istrip--) {
953 if (istrip>9) printf("%i",istrip-10*Int_t(istrip/10));
954 if (istrip<10) printf("%i",istrip);
955 }
956 printf("\n SGLE1 ");
957 for (istrip=15; istrip>=0; istrip--) printf("%i",sgle1[istrip]);
958 printf("\n DBLE1 ");
959 for (istrip=15; istrip>=0; istrip--) printf("%i",dble1[istrip]);
960 printf("\n SGLE2 ");
961 for (istrip=15; istrip>=0; istrip--) printf("%i",sgle2[istrip]);
962 printf("\n DBLE2 ");
963 for (istrip=15; istrip>=0; istrip--) printf("%i",dble2[istrip]);
964 printf(" \n");
965 }
966 //debug
967
968 // DS Reduction
969 Int_t notOr1, notOr2;
970
971 notOr1=!dble1[15] & !dble1[14] & !dble1[13] & !dble1[12] &
972 !dble1[11] & !dble1[10] & !dble1[9] & !dble1[8] &
973 !dble1[7] & !dble1[6] & !dble1[5] & !dble1[4] &
974 !dble1[3] & !dble1[2] & !dble1[1] & !dble1[0];
975
976 notOr2=!dble2[15] & !dble2[14] & !dble2[13] & !dble2[12] &
977 !dble2[11] & !dble2[10] & !dble2[9] & !dble2[8] &
978 !dble2[7] & !dble2[6] & !dble2[5] & !dble2[4] &
979 !dble2[3] & !dble2[2] & !dble2[1] & !dble2[0];
980
981 for (i=0; i<16; i++) {
e93b11d0 982 sgle1[i] = sgle1[i] & notOr1 & !fCoinc44;
983 sgle2[i] = sgle2[i] & notOr2 & !fCoinc44;
be972727 984 }
985
986//---------------------------------------------------------
987// step # 3 : 3/4 coincidence
988//---------------------------------------------------------
989 Int_t frontImage[16];
990
991 for (i=1; i<15; i++) {
992 frontImage[i] = (dble1[i] | sgle1[i]) &
993 (dble2[i+1] | dble2[i] | dble2[i-1]) |
994 dble1[i] & (sgle2[i+1] | sgle2[i] | sgle2[i-1]);
995 }
996 frontImage[0] = (dble1[0] | sgle1[0]) &
997 (dble2[1] | dble2[0]) | dble1[0] & (sgle2[1] | sgle2[0]);
998
999 frontImage[15] = (dble1[15] | sgle1[15]) &
1000 (dble2[15] | dble2[14]) | dble1[15] & (sgle2[15] | sgle2[14]);
1001
1002
1003//debug
1004 if(AliDebugLevel()==4||AliDebugLevel()==5) {
1005 printf("===============================================================\n");
1006 printf(" Y plane frontImage\n");
1007 printf(" ");
1008 for (istrip=15; istrip>=0; istrip--) {
1009 if (istrip>9) printf("%i",istrip-10*Int_t(istrip/10));
1010 if (istrip<10) printf("%i",istrip);
1011 }
1012 printf("\n ");
1013 for (istrip=15; istrip>=0; istrip--) printf("%i",frontImage[istrip]);
1014 printf("\n");
1015 }
1016//debug
1017
1018//---------------------------------------------------------
1019// step # 4 : Y position
1020//---------------------------------------------------------
1021 Int_t or1, or2, and1, and2, and3;
1022
1023 or1 = frontImage[7]|frontImage[5]|frontImage[3]|frontImage[1];
1024 or2 = frontImage[7]|frontImage[6]|frontImage[5]|frontImage[4];
1025 and1 = !frontImage[3]&!frontImage[2]&!frontImage[1]&!frontImage[0];
1026 and2 = !frontImage[7]&!frontImage[6]&!frontImage[5]&!frontImage[4] & and1;
1027 and3 = !frontImage[11]&!frontImage[10]&!frontImage[9]&!frontImage[8];
1028
1029 fCoordY[0] = !frontImage[0]&(frontImage[1]|!frontImage[2]) &
1030 (frontImage[3]|frontImage[1]|!frontImage[4]&(frontImage[5]|!frontImage[6])) &
1031 (or1|!frontImage[8]&(frontImage[9]|!frontImage[10])) &
1032 (or1|frontImage[11]|frontImage[9]|!frontImage[12]&(frontImage[13]|!frontImage[14]));
1033
1034 fCoordY[1] = !frontImage[0]&!frontImage[1] &
1035 !(!frontImage[11]&!frontImage[10]&!frontImage[7]&!frontImage[6] &
1036 !frontImage[3]&!frontImage[2]&(frontImage[13]|frontImage[12])) &
1037 (frontImage[3]|frontImage[2] | !frontImage[5]&!frontImage[4]) &
1038 (frontImage[7]|frontImage[6]|frontImage[3]|frontImage[2] |
1039 !frontImage[9]&!frontImage[8]);
1040
1041 fCoordY[2] = and1 & (or2 | and3);
1042
1043 fCoordY[3] = and2;
1044
1045 fCoordY[4] = !frontImage[15]&!frontImage[14]&!frontImage[13]&!frontImage[12] &
1046 and2 & and3 ;
1047}
1048
1049//___________________________________________
1050void AliMUONLocalTriggerBoard::LocalTrigger()
1051{
71a2d3aa 1052/// L0 trigger after LUT
1053///
da81e4c2 1054 Int_t deviation=0;
1055 Int_t iStripY=0;
1056 Int_t iStripX=0;
1057 Bool_t xOutput=kFALSE;
1058 Bool_t yOutput=kFALSE;
be972727 1059
1060 for (Int_t i=0; i<4; i++) deviation += static_cast<int>( fMinDev[i] << i );
1061 for (Int_t i=0; i<4; i++) iStripY += static_cast<int>( fCoordY[i] << i );
1062
da81e4c2 1063 if (fMinDev[4]==1 && !deviation) xOutput=kFALSE; // no trigger in X
1064 else xOutput=kTRUE; // trigger in X
1065 if (fCoordY[4]==1 && iStripY==15) yOutput=kFALSE; // no trigger in Y
1066 else yOutput=kTRUE; // trigger in Y
be972727 1067
da81e4c2 1068 if (xOutput) {
1069 for (Int_t i=0; i<5; i++) iStripX += static_cast<int>( fMinDevStrip[i] << i );
be972727 1070 fDev = deviation;
fa8d035f 1071 fStripX11 = iStripX;
da81e4c2 1072 }
1073 if (yOutput) {
1074 fStripY11 = iStripY;
8aac6cce 1075 fTrigY = fCoordY[4];
da81e4c2 1076 }
1077
1078// cout << " Local Trigger " << " " << fNumber << " " <<
1079// xOutput << " " << yOutput << " " << fDev << " " << fStripX11 << " " <<
1080// fTrigY << " " << fStripY11 << "\n";
1081
abe5ad6f 1082 if (xOutput && yOutput){ // trigger in X and Y
da81e4c2 1083 fOutput =1;
1084
1085 Int_t sign = 0;
1086 if ( !fMinDev[4] && deviation ) sign=-1;
1087 if ( !fMinDev[4] && !deviation ) sign= 0;
1088 if ( fMinDev[4] == 1 ) sign=+1;
1089
1090 deviation *= sign;
1091
be972727 1092// calculate deviation in [0;+30]
da81e4c2 1093 deviation += 15;
1094
8af755f4 1095// GET LUT OUTPUT FOR icirc/istripX1/deviation/istripY
ac809573 1096 fLUT->GetLutOutput(GetNumber(), fStripX11, deviation, fStripY11, fLutLpt, fLutHpt);
1097 }
1098
1099 fResponse = fLutLpt[0] +
87280b64 1100 static_cast<int>(fLutLpt[1]<<1) +
1101 static_cast<int>(fLutHpt[0]<<2) +
1102 static_cast<int>(fLutHpt[1]<<3);
1103
be972727 1104}
1105
1106//___________________________________________
e44235aa 1107Int_t AliMUONLocalTriggerBoard::GetI() const
be972727 1108{
71a2d3aa 1109/// old numbering
1110///
f4678817 1111 const Int_t kMaxfields = 2; char **fields = new char*[kMaxfields];
be972727 1112
1113 char s[100]; strcpy(s, GetName());
1114
1115 Int_t numlines = 0;
1116
1117 for (char *token = strtok(s, "B");
1118 token != NULL;
1119 token = strtok(NULL, " "))
1120 {
1121 fields[numlines] = new char[strlen(token)+1];
1122 strcpy(fields[numlines++], token);
1123 }
1124
1125 TString l(fields[0]);
1126
1127 char copy = l[0];
1128
f4678817 1129 Int_t lL = atoi(&l[4]), cC = atoi(&l[2]), sS = (copy=='R') ? +1 : -1;
be972727 1130
1131 char *b[4] = {"12", "34", "56", "78"};
1132
1133 Int_t ib = 0;
1134
1135 for (Int_t i=0; i<4; i++) if (!strcmp(fields[1],b[i])) {ib = i; break;} ib++;
1136
f4678817 1137// lL=1 ON TOP
1138 lL -= 9; lL = abs(lL); lL++;
be972727 1139
f4678817 1140 Int_t code = 100 * lL + 10 * cC + ib;
be972727 1141
f4678817 1142 code *= sS;
be972727 1143
1144 Int_t ic = 0;
1145
e44235aa 1146 for (Int_t i=0; i<234; i++) if (fgkCircuitId[i] == code) {ic = i; break;}
be972727 1147
1148 return ic;
1149}
1150
1151//___________________________________________
41922e78 1152void AliMUONLocalTriggerBoard::Mask(Int_t index, UShort_t mask)
be972727 1153{
71a2d3aa 1154/// set mask
1155///
41922e78 1156 if ( index >= 0 && index < 2*4 )
1157 {
1158 Int_t i = index/4;
1159 Int_t j = index - i*4;
1160 fMask[i][j]=mask;
1161 }
1162 else
1163 {
1164 AliError(Form("Index %d out of bounds (max %d)",index,8));
1165 }
be972727 1166}
1167
1168//___________________________________________
e44235aa 1169void AliMUONLocalTriggerBoard::Scan(Option_t *option) const
be972727 1170{
71a2d3aa 1171/// full dump
1172///
ac809573 1173 TString op = option;
be972727 1174
1175 if (op.Contains("CONF")) Conf();
1176
8af755f4 1177 if (op.Contains("BITP")) Pattern();
be972727 1178
1179 if (op.Contains("RESPI")) Resp("I");
1180
1181 if (op.Contains("RESPF")) Resp("F");
1182
1183 if (op.Contains("ALL"))
1184 {
1185 Conf();
1186 Pattern();
1187 Resp("I");
1188 Resp("F");
1189 }
1190}
1191
ac809573 1192//___________________________________________
1193void AliMUONLocalTriggerBoard::Conf() const
1194{
1195/// board switches
1196///
1197 cout << "Switch(" << GetName() << ")"
1198 << " x2d = " << GetSwitch(0)
1199 << " x2m = " << GetSwitch(1)
1200 << " x2u = " << GetSwitch(2)
1201 << " OR[0] = " << GetSwitch(3)
1202 << " OR[1] = " << GetSwitch(4)
1203 << " EN-Y = " << GetSwitch(5)
1204 << " ZERO-ALLY-LSB = " << GetSwitch(6)
1205 << " ZERO-down = " << GetSwitch(7)
1206 << " ZERO-middle = " << GetSwitch(8)
1207 << " ZERO-up = " << GetSwitch(9)
1208 << " trans. conn. " << GetTC()
1209 << " Slot = " << fSlot
1210 << endl;
1211}
1212
be972727 1213//___________________________________________
e44235aa 1214void AliMUONLocalTriggerBoard::Resp(Option_t *option) const
be972727 1215{
71a2d3aa 1216/// board I/O
1217///
be972727 1218 TString op = option;
1219
1220 if (op.Contains("I"))
1221 {
1222// print Local trigger output before the LuT step
1223 printf("===============================================================\n");
1224 printf("-------- TRIGGER OUTPUT --------\n");
1225 printf("minDevStrip = ");
1226 for (Int_t i=4; i>=0; i--) printf("%i",fMinDevStrip[i]);
1227 printf(" minDev = ");
1228 for (Int_t i=4; i>=0; i--) printf("%i",fMinDev[i]);
1229 printf(" coordY = ");
1230 for (Int_t i=4; i>=0; i--) printf("%i",fCoordY[i]);
1231 printf(" \n");
1232 }
1233
be972727 1234}
1235
1236//___________________________________________
be972727 1237void AliMUONLocalTriggerBoard::Response()
1238{
71a2d3aa 1239/// algo
1240///
f4678817 1241 Int_t xX1[16], xX2[16], xXX3[32], xXX4[32];
be972727 1242
1243 TBits x1(16), x2(16), x3(16), x4(16);
1244
1245 UShort_t xyv = 0;
1246
1247 xyv = fXY[0][0]; x1.Set(16,&xyv);
1248 xyv = fXY[0][1]; x2.Set(16,&xyv);
1249 xyv = fXY[0][2]; x3.Set(16,&xyv);
1250 xyv = fXY[0][3]; x4.Set(16,&xyv);
1251
1252 TBits x3u(16), x4u(16), x3d(16), x4d(16);
1253
1254 xyv = fXYU[0][2]; x3u.Set(16,&xyv);
1255 xyv = fXYU[0][3]; x4u.Set(16,&xyv);
1256
1257 xyv = fXYD[0][2]; x3d.Set(16,&xyv);
1258 xyv = fXYD[0][3]; x4d.Set(16,&xyv);
1259
1260 for (Int_t i=0;i<16;i++)
1261 {
f4678817 1262 xX1[i] = x1[i];
1263 xX2[i] = x2[i];
be972727 1264
f4678817 1265 xXX3[i+8] = x3[i];
1266 xXX4[i+8] = x4[i];
be972727 1267 }
1268
1269 for (Int_t i=0;i<8;i++)
1270 {
f4678817 1271 xXX3[i] = x3d[i+8];
1272 xXX4[i] = x4d[i+8];
be972727 1273
f4678817 1274 xXX3[i+24] = x3u[i];
1275 xXX4[i+24] = x4u[i];
be972727 1276 }
1277
e93b11d0 1278// Int_t coinc44 = 0;
be972727 1279
e93b11d0 1280 TrigX(xX1, xX2, xXX3, xXX4);
be972727 1281
f4678817 1282 Int_t yY1[16], yY2[16], yY3[16], yY4[16];
be972727 1283
f4678817 1284 Int_t yY3U[16], yY3D[16], yY4U[16], yY4D[16];
be972727 1285
1286 TBits y1(16), y2(16), y3(16), y4(16);
1287
1288 TBits y3u(16), y3d(16), y4u(16), y4d(16);
1289
1290 xyv = fXY[1][0]; y1.Set(16,&xyv);
1291 xyv = fXY[1][1]; y2.Set(16,&xyv);
1292 xyv = fXY[1][2]; y3.Set(16,&xyv);
1293 xyv = fXY[1][3]; y4.Set(16,&xyv);
1294
1295 xyv = fXYU[1][2]; y3u.Set(16,&xyv);
1296 xyv = fXYD[1][2]; y3d.Set(16,&xyv);
1297 xyv = fXYU[1][3]; y4u.Set(16,&xyv);
1298 xyv = fXYD[1][3]; y4d.Set(16,&xyv);
1299
1300 for (Int_t i=0;i<16;i++)
1301 {
f4678817 1302 yY1[i] = y1[i];
1303 yY2[i] = y2[i];
1304 yY3[i] = y3[i];
1305 yY4[i] = y4[i];
be972727 1306
f4678817 1307 yY3U[i] = y3u[i];
1308 yY3D[i] = y3d[i];
be972727 1309
f4678817 1310 yY4U[i] = y4u[i];
1311 yY4D[i] = y4d[i];
be972727 1312 }
1313
e93b11d0 1314 TrigY(yY1, yY2, yY3, yY4, yY3U, yY3D, yY4U, yY4D);
be972727 1315
ac809573 1316// ASIGN fLutLpt, fLutHpt
abe5ad6f 1317 LocalTrigger();
be972727 1318}
ac809573 1319