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