Add sign of deviation & trigger Y, setters & getters (Philippe C.)
[u/mrichter/AliRoot.git] / MUON / AliMUONLocalTriggerBoard.cxx
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
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)
24
25 #include "AliMUONLocalTriggerBoard.h"
26 #include "AliMUONTriggerLut.h"
27
28 #include "AliLog.h"
29
30 #include <TBits.h>
31 #include <Riostream.h>
32
33 /// \cond CLASSIMP
34 ClassImp(AliMUONLocalTriggerBoard)
35 /// \endcond
36
37 const 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
59 //___________________________________________
60 AliMUONLocalTriggerBoard::AliMUONLocalTriggerBoard()
61     : AliMUONTriggerBoard(),
62       fNumber(0),
63       fCrate(0),
64       fTC(kTRUE),
65       fStripX11(0),
66       fStripY11(15),
67       fDev(0),
68       fTrigY(1),
69       fOutput(0),
70       fLUT(0x0),
71       fCoinc44(0)      
72 {
73 /// Default constructor
74 ///
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
86    for (Int_t i=0; i<5; i++) fMinDevStrip[i] = fMinDev[i] = fCoordY[i] = 0;
87
88    for (Int_t i=0; i<2; i++) fLutLpt[i] = fLutHpt[i] = 0;
89 }
90
91 //___________________________________________
92 AliMUONLocalTriggerBoard::AliMUONLocalTriggerBoard(const char *name, Int_t a,
93                                                    AliMUONTriggerLut* lut) 
94     : AliMUONTriggerBoard(name, a),
95       fNumber(0),
96       fCrate(0),
97       fTC(kTRUE),
98       fStripX11(0),
99       fStripY11(15),
100       fDev(0),
101       fTrigY(1),
102       fOutput(0),
103       fLUT(lut),
104       fCoinc44(0)
105 {
106 /// Standard constructor
107 ///
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
119    for (Int_t i=0; i<5; i++) fMinDevStrip[i] = fMinDev[i] = fCoordY[i] = 0;
120
121    for (Int_t i=0; i<2; i++) fLutLpt[i] = fLutHpt[i] = 0;
122 }
123
124 //___________________________________________
125 AliMUONLocalTriggerBoard::~AliMUONLocalTriggerBoard()
126 {
127 /// Destructor
128 }
129
130 //___________________________________________
131 void AliMUONLocalTriggerBoard::Reset()
132 {
133 /// reset board
134 ///
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    
145    fStripX11 = 0;
146    fStripY11 = 15;
147    fDev = 0;
148    fTrigY = 1;
149
150    for (Int_t i=0; i<2; i++) fLutLpt[i] = fLutHpt[i] = 0;
151 }
152
153 //___________________________________________
154 void AliMUONLocalTriggerBoard::Setbit(Int_t strip, Int_t cathode, Int_t chamber)
155 {
156 /// 0 .. LBS   :   N-1 .. MSB
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 //___________________________________________
178 void AliMUONLocalTriggerBoard::SetbitM(Int_t strip, Int_t cathode, Int_t chamber)
179 {
180 /// 0 .. LBS   :   N-1 .. MSB
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
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 //___________________________________________
200 void AliMUONLocalTriggerBoard::Pattern(Option_t *option) const
201 {
202 /// print bit pattern
203 ///
204    TString op = option;
205    
206    if (op.Contains("X")) BP("X");
207
208    if (op.Contains("Y")) BP("Y");
209 }
210
211
212 //___________________________________________
213 void AliMUONLocalTriggerBoard::BP(Option_t *option) const
214 {
215 /// RESPECT THE OLD PRINTOUT FORMAT
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};
256
257    TString op = option;
258         
259    TString nn = GetName();
260
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 /**/
312       Int_t idCircuit = 0, absidModule = 0;
313
314       if (!(nn.Contains("Int"))) 
315       { 
316         idCircuit   = fgkCircuitId[GetI()];
317         absidModule = TMath::Abs(Int_t(idCircuit/10));
318       }
319                 
320       Int_t iModule=0;
321
322       for (Int_t i=0; i<63; i++) 
323       {
324         if (kModuleId[i]==absidModule) 
325          { 
326             iModule=i;
327             break;
328          }
329       }
330
331       Int_t nStrip = kNstripY[iModule];
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
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 //___________________________________________
412 void AliMUONLocalTriggerBoard::Conf() const
413 {
414 /// board switches
415 ///
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 //___________________________________________
433 void AliMUONLocalTriggerBoard::Module(char *mod)
434 {
435 /// get module from name
436 ///
437    const Int_t kMaxfields = 2; char **fields = new char*[kMaxfields];
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 //___________________________________________
455 void AliMUONLocalTriggerBoard::TrigX(Int_t ch1q[16], Int_t ch2q[16], Int_t ch3q[32], Int_t ch4q[32])
456 {
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 ///---------------------------------------------------------
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]  & 
563       !dbleHit1[2]  & !dbleHit1[1]  & !dbleHit1[0]  & !fCoinc44;
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]  & 
580       !dbleHit2[2]  & !dbleHit2[1]  & !dbleHit2[0]  & !fCoinc44;        
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 //___________________________________________
814 void AliMUONLocalTriggerBoard::Sort2x5(Int_t dev1[6], Int_t dev2[6],
815                                        Int_t minDev[6], Int_t &dev1GTdev2)
816
817 /// returns minimun between dev1 and dev2
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 //___________________________________________
839 void AliMUONLocalTriggerBoard::TrigY(Int_t y1[16], Int_t y2[16], Int_t y3[16], Int_t y4[16],
840                                      Int_t y3u[16], Int_t y3d[16], Int_t y4u[16], Int_t y4d[16])
841 {
842 /// note : resMid = 1 -> cancel                             \n
843 ///---------------------------------------------------------\n
844 /// step # 1 : prehandling Y                                \n
845 ///--------------------------------------------------------- 
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++){
902          ch3[i] = tmpy3dto16[i]|tmpy3to16[i];
903          ch4[i] = tmpy4dto16[i]|tmpy4to16[i];
904       }
905    }
906    if (fSwitch[3]==1&&fSwitch[4]==0){
907       for (i=0; i<16; i++){
908          ch3[i] = tmpy3uto16[i]|tmpy3to16[i];
909          ch4[i] = tmpy4uto16[i]|tmpy4to16[i];
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++) {
991       sgle1[i] = sgle1[i] & notOr1 & !fCoinc44;
992       sgle2[i] = sgle2[i] & notOr2 & !fCoinc44;
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 //___________________________________________
1059 void AliMUONLocalTriggerBoard::LocalTrigger()
1060 {
1061 /// L0 trigger after LUT
1062 ///
1063     Int_t deviation=0, iStripY=0, iStripX=0;
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    { 
1078       for (Int_t i=0; i<5; i++) iStripX += static_cast<int>( fMinDevStrip[i] << i );
1079
1080       fDev      = deviation;
1081       fStripY11 = iStripY;
1082       fStripX11 = iStripX;
1083       fTrigY    = fCoordY[4];
1084
1085       Int_t sign = 0;
1086
1087       if ( !fMinDev[4] &&  deviation ) sign=-1;
1088       if ( !fMinDev[4] && !deviation ) sign= 0;
1089       if (  fMinDev[4] == 1 )          sign=+1;    
1090
1091       deviation *= sign; 
1092
1093 //    calculate deviation in [0;+30]
1094       deviation += 15;
1095
1096 //    GET LUT OUTPUT FOR icirc/istripX1/deviation/istripY
1097       fLUT->GetLutOutput(fNumber, fStripX11, deviation, fStripY11, fLutLpt, fLutHpt);
1098    }  
1099 }
1100
1101 //___________________________________________
1102 Int_t AliMUONLocalTriggerBoard::GetI() const
1103 {
1104 /// old numbering
1105 ///
1106    const Int_t kMaxfields = 2; char **fields = new char*[kMaxfields];
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
1124    Int_t lL = atoi(&l[4]), cC = atoi(&l[2]), sS = (copy=='R') ? +1 : -1;
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
1132 // lL=1 ON TOP
1133    lL -= 9; lL = abs(lL); lL++;
1134
1135    Int_t code = 100 * lL + 10 * cC + ib;
1136
1137    code *= sS;
1138
1139    Int_t ic = 0;
1140
1141    for (Int_t i=0; i<234; i++) if (fgkCircuitId[i] == code) {ic = i; break;}
1142
1143    return ic;
1144 }
1145
1146 //___________________________________________
1147 void AliMUONLocalTriggerBoard::Mask(Int_t index, UShort_t mask)
1148 {
1149 /// set mask
1150 ///
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   }
1161 }
1162
1163 //___________________________________________
1164 void AliMUONLocalTriggerBoard::Scan(Option_t *option) const
1165 {
1166 /// full dump
1167 ///
1168    TString op = option;
1169
1170    if (op.Contains("CONF")) Conf();
1171
1172    if (op.Contains("BITP")) Pattern();
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 //___________________________________________
1188 void AliMUONLocalTriggerBoard::Resp(Option_t *option) const
1189 {
1190 /// board I/O
1191 ///
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();
1211       Int_t idCircuit = fgkCircuitId[icirc];
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);
1220       printf("-------------------------------------\n");
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);
1224       printf("-------------------------------------\n");
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]);
1229       printf("\n");
1230       printf("-------------------------------------\n");
1231    }      
1232 }
1233
1234 //___________________________________________
1235 void AliMUONLocalTriggerBoard::Response()
1236 {
1237 /// algo
1238 ///
1239    Int_t xX1[16], xX2[16], xXX3[32], xXX4[32];
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    {
1260       xX1[i] = x1[i];
1261       xX2[i] = x2[i];
1262       
1263       xXX3[i+8] = x3[i];
1264       xXX4[i+8] = x4[i];  
1265    }
1266
1267    for (Int_t i=0;i<8;i++)
1268    {
1269       xXX3[i] = x3d[i+8];
1270       xXX4[i] = x4d[i+8];
1271
1272       xXX3[i+24] = x3u[i];
1273       xXX4[i+24] = x4u[i];
1274    }
1275    
1276 //   Int_t coinc44 = 0;
1277    
1278    TrigX(xX1, xX2, xXX3, xXX4);   
1279
1280    Int_t yY1[16], yY2[16], yY3[16], yY4[16];
1281    
1282    Int_t yY3U[16], yY3D[16], yY4U[16], yY4D[16];
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    {
1300       yY1[i] = y1[i];
1301       yY2[i] = y2[i];
1302       yY3[i] = y3[i];
1303       yY4[i] = y4[i];
1304       
1305       yY3U[i] = y3u[i];
1306       yY3D[i] = y3d[i];
1307       
1308       yY4U[i] = y4u[i];
1309       yY4D[i] = y4d[i];
1310    }
1311
1312    TrigY(yY1, yY2, yY3, yY4, yY3U, yY3D, yY4U, yY4D);
1313    
1314 // ASIGN fLutLpt, fLutHpt
1315    LocalTrigger(); 
1316
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);
1321 }
1322