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