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