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