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