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