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