]> git.uio.no Git - u/mrichter/AliRoot.git/blame - MUON/AliMUONLocalTriggerBoard.cxx
Bug fixed in TrigX: switchs zero_down/middle/up activated (Philippe C.)
[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
8af755f4 177//___________________________________________
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
be972727 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);
be972727 1112 }
1113}
1114
1115//___________________________________________
e44235aa 1116Int_t AliMUONLocalTriggerBoard::GetI() const
be972727 1117{
71a2d3aa 1118/// old numbering
1119///
f4678817 1120 const Int_t kMaxfields = 2; char **fields = new char*[kMaxfields];
be972727 1121
1122 char s[100]; strcpy(s, GetName());
1123
1124 Int_t numlines = 0;
1125
1126 for (char *token = strtok(s, "B");
1127 token != NULL;
1128 token = strtok(NULL, " "))
1129 {
1130 fields[numlines] = new char[strlen(token)+1];
1131 strcpy(fields[numlines++], token);
1132 }
1133
1134 TString l(fields[0]);
1135
1136 char copy = l[0];
1137
f4678817 1138 Int_t lL = atoi(&l[4]), cC = atoi(&l[2]), sS = (copy=='R') ? +1 : -1;
be972727 1139
1140 char *b[4] = {"12", "34", "56", "78"};
1141
1142 Int_t ib = 0;
1143
1144 for (Int_t i=0; i<4; i++) if (!strcmp(fields[1],b[i])) {ib = i; break;} ib++;
1145
f4678817 1146// lL=1 ON TOP
1147 lL -= 9; lL = abs(lL); lL++;
be972727 1148
f4678817 1149 Int_t code = 100 * lL + 10 * cC + ib;
be972727 1150
f4678817 1151 code *= sS;
be972727 1152
1153 Int_t ic = 0;
1154
e44235aa 1155 for (Int_t i=0; i<234; i++) if (fgkCircuitId[i] == code) {ic = i; break;}
be972727 1156
1157 return ic;
1158}
1159
1160//___________________________________________
41922e78 1161void AliMUONLocalTriggerBoard::Mask(Int_t index, UShort_t mask)
be972727 1162{
71a2d3aa 1163/// set mask
1164///
41922e78 1165 if ( index >= 0 && index < 2*4 )
1166 {
1167 Int_t i = index/4;
1168 Int_t j = index - i*4;
1169 fMask[i][j]=mask;
1170 }
1171 else
1172 {
1173 AliError(Form("Index %d out of bounds (max %d)",index,8));
1174 }
be972727 1175}
1176
1177//___________________________________________
e44235aa 1178void AliMUONLocalTriggerBoard::Scan(Option_t *option) const
be972727 1179{
71a2d3aa 1180/// full dump
1181///
be972727 1182 TString op = option;
1183
1184 if (op.Contains("CONF")) Conf();
1185
8af755f4 1186 if (op.Contains("BITP")) Pattern();
be972727 1187
1188 if (op.Contains("RESPI")) Resp("I");
1189
1190 if (op.Contains("RESPF")) Resp("F");
1191
1192 if (op.Contains("ALL"))
1193 {
1194 Conf();
1195 Pattern();
1196 Resp("I");
1197 Resp("F");
1198 }
1199}
1200
1201//___________________________________________
e44235aa 1202void AliMUONLocalTriggerBoard::Resp(Option_t *option) const
be972727 1203{
71a2d3aa 1204/// board I/O
1205///
be972727 1206 TString op = option;
1207
1208 if (op.Contains("I"))
1209 {
1210// print Local trigger output before the LuT step
1211 printf("===============================================================\n");
1212 printf("-------- TRIGGER OUTPUT --------\n");
1213 printf("minDevStrip = ");
1214 for (Int_t i=4; i>=0; i--) printf("%i",fMinDevStrip[i]);
1215 printf(" minDev = ");
1216 for (Int_t i=4; i>=0; i--) printf("%i",fMinDev[i]);
1217 printf(" coordY = ");
1218 for (Int_t i=4; i>=0; i--) printf("%i",fCoordY[i]);
1219 printf(" \n");
1220 }
1221
1222 if (op.Contains("F"))
1223 {
1224 Int_t icirc = GetI();
e44235aa 1225 Int_t idCircuit = fgkCircuitId[icirc];
be972727 1226
1227 Int_t deviation = 0, iStripY = 0;
1228
1229 for (Int_t i=0; i<4; i++) iStripY += static_cast<int>( fCoordY[i] << i );
1230
1231 for (Int_t i=0; i<4; i++) deviation += Int_t(fMinDev[i]<<i);
1232
1233 Float_t pt = 0.; //triggerCircuit->PtCal(fStripX11, fDev, fStripY11);
c720a83c 1234 printf("-------------------------------------\n");
be972727 1235 printf(" Local Trigger info for circuit Id %i (number %i ) \n", idCircuit, icirc);
1236 printf(" istripX1 signDev deviation istripY = %i %i %i %i \n", fStripX11, fMinDev[4], deviation, iStripY);
1237 printf(" pt = %f (GeV/c) \n", pt);
c720a83c 1238 printf("-------------------------------------\n");
be972727 1239 printf(" Local Trigger Lut Output = Lpt : ");
1240 for (Int_t i=1; i>=0; i--) printf("%i", fLutLpt[i]);
1241 printf(" Hpt : ");
1242 for (Int_t i=1; i>=0; i--) printf("%i", fLutHpt[i]);
be972727 1243 printf("\n");
c720a83c 1244 printf("-------------------------------------\n");
be972727 1245 }
be972727 1246}
1247
1248//___________________________________________
be972727 1249void AliMUONLocalTriggerBoard::Response()
1250{
71a2d3aa 1251/// algo
1252///
f4678817 1253 Int_t xX1[16], xX2[16], xXX3[32], xXX4[32];
be972727 1254
1255 TBits x1(16), x2(16), x3(16), x4(16);
1256
1257 UShort_t xyv = 0;
1258
1259 xyv = fXY[0][0]; x1.Set(16,&xyv);
1260 xyv = fXY[0][1]; x2.Set(16,&xyv);
1261 xyv = fXY[0][2]; x3.Set(16,&xyv);
1262 xyv = fXY[0][3]; x4.Set(16,&xyv);
1263
1264 TBits x3u(16), x4u(16), x3d(16), x4d(16);
1265
1266 xyv = fXYU[0][2]; x3u.Set(16,&xyv);
1267 xyv = fXYU[0][3]; x4u.Set(16,&xyv);
1268
1269 xyv = fXYD[0][2]; x3d.Set(16,&xyv);
1270 xyv = fXYD[0][3]; x4d.Set(16,&xyv);
1271
1272 for (Int_t i=0;i<16;i++)
1273 {
f4678817 1274 xX1[i] = x1[i];
1275 xX2[i] = x2[i];
be972727 1276
f4678817 1277 xXX3[i+8] = x3[i];
1278 xXX4[i+8] = x4[i];
be972727 1279 }
1280
1281 for (Int_t i=0;i<8;i++)
1282 {
f4678817 1283 xXX3[i] = x3d[i+8];
1284 xXX4[i] = x4d[i+8];
be972727 1285
f4678817 1286 xXX3[i+24] = x3u[i];
1287 xXX4[i+24] = x4u[i];
be972727 1288 }
1289
e93b11d0 1290// Int_t coinc44 = 0;
be972727 1291
e93b11d0 1292 TrigX(xX1, xX2, xXX3, xXX4);
be972727 1293
f4678817 1294 Int_t yY1[16], yY2[16], yY3[16], yY4[16];
be972727 1295
f4678817 1296 Int_t yY3U[16], yY3D[16], yY4U[16], yY4D[16];
be972727 1297
1298 TBits y1(16), y2(16), y3(16), y4(16);
1299
1300 TBits y3u(16), y3d(16), y4u(16), y4d(16);
1301
1302 xyv = fXY[1][0]; y1.Set(16,&xyv);
1303 xyv = fXY[1][1]; y2.Set(16,&xyv);
1304 xyv = fXY[1][2]; y3.Set(16,&xyv);
1305 xyv = fXY[1][3]; y4.Set(16,&xyv);
1306
1307 xyv = fXYU[1][2]; y3u.Set(16,&xyv);
1308 xyv = fXYD[1][2]; y3d.Set(16,&xyv);
1309 xyv = fXYU[1][3]; y4u.Set(16,&xyv);
1310 xyv = fXYD[1][3]; y4d.Set(16,&xyv);
1311
1312 for (Int_t i=0;i<16;i++)
1313 {
f4678817 1314 yY1[i] = y1[i];
1315 yY2[i] = y2[i];
1316 yY3[i] = y3[i];
1317 yY4[i] = y4[i];
be972727 1318
f4678817 1319 yY3U[i] = y3u[i];
1320 yY3D[i] = y3d[i];
be972727 1321
f4678817 1322 yY4U[i] = y4u[i];
1323 yY4D[i] = y4d[i];
be972727 1324 }
1325
e93b11d0 1326 TrigY(yY1, yY2, yY3, yY4, yY3U, yY3D, yY4U, yY4D);
be972727 1327
c720a83c 1328// ASIGN fLutLpt, fLutHpt
abe5ad6f 1329 LocalTrigger();
be972727 1330
c720a83c 1331 fResponse = fLutLpt[0] +
1332 static_cast<int>(fLutLpt[1]<<1) +
1333 static_cast<int>(fLutHpt[0]<<2) +
1334 static_cast<int>(fLutHpt[1]<<3);
be972727 1335}
1336