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