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