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