1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
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 **************************************************************************/
18 #include "AliMUONTriggerDecisionV1.h"
21 #include "AliMUONTriggerCircuit.h"
22 #include "AliMUONTriggerLut.h"
24 #include "AliMUONDigit.h"
25 #include "AliMUONConstants.h"
26 #include "AliMUONGlobalTrigger.h"
27 #include "AliMUONLocalTrigger.h"
29 #include "AliRunLoader.h"
30 #include "AliLoader.h"
33 // A note on debug level. Using AliLog facility, you can set the verbosity
37 // 0 : don't print anything
38 // 1 : print Global Trigger Output
39 // 2 : print Local and Global Trigger Outputs
40 // 3 : iprint = 2 + detailed info on X strips
41 // 4 : iprint = 2 + detailed info on Y strip
42 // 5 : iprint = 2 + detailed info on X and Y strips
43 // Note : with DebugLevel>2, the strips detailed info is given for all circuits
45 //----------------------------------------------------------------------
46 ClassImp(AliMUONTriggerDecisionV1)
48 //----------------------------------------------------------------------
49 AliMUONTriggerDecisionV1::AliMUONTriggerDecisionV1(AliMUONData* data)
50 : TTask("AliMUONTriggerDecisionV1",
51 "From trigger digits to Local and Global Trigger objects (old style)"),
57 // initialize container
60 AliFatal("No MUONdata for trigger");
63 // Global Trigger information
69 { // [0] : Low pt, [1] : High pt, [2] : All pt
70 fGlobalSinglePlus[i]=0; // tot num of single plus
71 fGlobalSingleMinus[i]=0; // tot num of single minus
72 fGlobalSingleUndef[i]=0; // tot num of single undefined
73 fGlobalPairUnlike[i]=0; // tot num of unlike-sign pairs
74 fGlobalPairLike[i]=0; // tot num of like-sign pairs
77 // Local Trigger information
78 for (icirc=0; icirc<234; icirc++)
80 fTrigger[icirc]=0; // trigger or not
81 fStripX11[icirc]=0; // X strip in MC11 which triggers
82 fDev[icirc]=0; // deviation which triggers
83 fStripY11[icirc]=0; // Y strip in MC11 which triggers
85 { // pt information via LuT
86 fLutLpt[icirc][i]=fLutHpt[icirc][i]=fLutApt[icirc][i]=0;
91 for (icirc=0; icirc<234; icirc++)
93 for (istrip=0; istrip<16; istrip++)
95 fXbit11[icirc][istrip]=fXbit12[icirc][istrip]=0;
96 fYbit11[icirc][istrip]=fYbit12[icirc][istrip]=0;
97 fYbit21[icirc][istrip]=fYbit22[icirc][istrip]=0;
98 fYbit21U[icirc][istrip]=fYbit22U[icirc][istrip]=0;
99 fYbit21D[icirc][istrip]=fYbit22D[icirc][istrip]=0;
101 for (istrip=0; istrip<32; istrip++)
103 fXbit21[icirc][istrip]=fXbit22[icirc][istrip]=0;
107 fTriggerCircuit = new TObjArray(AliMUONConstants::NTriggerCircuit());
110 fMUON = (AliMUON*) gAlice->GetDetector("MUON");
113 for (icirc = 0; icirc < AliMUONConstants::NTriggerCircuit(); icirc++)
115 AliMUONTriggerCircuit* pCir = 0;
116 pCir = &(fMUON->TriggerCircuit(icirc));
117 fTriggerCircuit->AddAt(pCir, icirc);
121 //----------------------------------------------------------------------
122 AliMUONTriggerDecisionV1::AliMUONTriggerDecisionV1()
123 : TTask("AliMUONTriggerDecisionV1",
124 "From trigger digits to Local and Global Trigger objects (old style)"),
130 // Default constructor
133 //----------------------------------------------------------------------
134 AliMUONTriggerDecisionV1::AliMUONTriggerDecisionV1(const AliMUONTriggerDecisionV1& rhs)
137 // Protected copy constructor
139 AliFatal("Not implemented.");
142 //----------------------------------------------------------------------
143 AliMUONTriggerDecisionV1::~AliMUONTriggerDecisionV1()
148 fTriggerCircuit->Clear();// Sets pointers to 0 since it is not the owner
149 delete fTriggerCircuit;
153 //----------------------------------------------------------------------
154 AliMUONTriggerDecisionV1&
155 AliMUONTriggerDecisionV1::operator=(const AliMUONTriggerDecisionV1& rhs)
157 // Protected assignement operator
159 if (this == &rhs) return *this;
161 AliFatal("Not implemented.");
167 //----------------------------------------------------------------------
168 void AliMUONTriggerDecisionV1::Trigger()
170 // main method of the class which calls the overall Trigger procedure
176 Int_t coinc44=0, resetMid=0; // initialize coincidence
178 AliMUONTriggerCircuit* triggerCircuit;
180 for (Int_t icirc=0; icirc<234; icirc++)
183 triggerCircuit = (AliMUONTriggerCircuit*)fTriggerCircuit->At(icirc);
185 Int_t minDevStrip[5], minDev[5], coordY[5];
186 for (Int_t i=0; i<5; i++)
188 minDevStrip[i]=minDev[i]=coordY[i]=0;
190 Int_t x2m=triggerCircuit->GetX2m();
191 Int_t x2ud=triggerCircuit->GetX2ud();
192 Int_t orMud[2]={0,0};
193 triggerCircuit->GetOrMud(orMud);
196 TrigX(fXbit11[icirc],fXbit12[icirc],fXbit21[icirc],fXbit22[icirc],
197 coinc44, minDevStrip, minDev);
200 TrigY(fYbit11[icirc],fYbit12[icirc],fYbit21[icirc],fYbit22[icirc],
201 fYbit21U[icirc],fYbit21D[icirc],fYbit22U[icirc],fYbit22D[icirc],
202 x2m,x2ud,orMud,resetMid,coinc44,coordY);
206 LocalTrigger(icirc, minDevStrip, minDev, coordY, iTrigger);
211 PrintBitPatXInput(icirc);
212 PrintBitPatYInput(icirc);
213 PrintLocalOutput(minDevStrip, minDev, coordY););
215 } // end loop on circuits
217 // call Global Trigger
221 //----------------------------------------------------------------------
222 void AliMUONTriggerDecisionV1::ResetBit()
224 // reset bit pattern, global and local trigger output tables to 0
230 for (icirc=0; icirc<234; icirc++)
232 for (istrip=0; istrip<16; istrip++)
234 fXbit11[icirc][istrip]=fXbit12[icirc][istrip]=0;
235 fYbit11[icirc][istrip]=fYbit12[icirc][istrip]=0;
236 fYbit21[icirc][istrip]=fYbit22[icirc][istrip]=0;
237 fYbit21U[icirc][istrip]=fYbit22U[icirc][istrip]=0;
238 fYbit21D[icirc][istrip]=fYbit22D[icirc][istrip]=0;
240 for (istrip=0; istrip<32; istrip++)
242 fXbit21[icirc][istrip]=fXbit22[icirc][istrip]=0;
248 fGlobalSinglePlus[i]=0;
249 fGlobalSingleMinus[i]=0;
250 fGlobalSingleUndef[i]=0;
251 fGlobalPairLike[i]=0;
252 fGlobalPairLike[i]=0;
255 for (icirc=0; icirc<234; icirc++)
263 fLutLpt[icirc][i]=fLutHpt[icirc][i]=fLutApt[icirc][i]=0;
268 //----------------------------------------------------------------------
269 void AliMUONTriggerDecisionV1::SetBit()
271 // 1) loop over chambers and cathodes
273 // 3) remove soft background
274 // 4) set the bit patterns
277 AliMUONTriggerCircuit* triggerCircuit;
279 for (Int_t chamber = 11; chamber < 15; ++chamber)
282 TClonesArray* muonDigits = fMUONData->Digits(chamber-1);
283 Int_t ndigits = muonDigits->GetEntriesFast();
284 AliDebug(3,Form("Found %d digits in %p %d", ndigits, muonDigits,chamber-1));
286 for (Int_t digit = 0; digit < ndigits; ++digit)
288 AliMUONDigit* mdig = static_cast<AliMUONDigit*>
289 (muonDigits->UncheckedAt(digit));
291 // get the center of the pad Id
292 Int_t ix=mdig->PadX();
293 Int_t iy=mdig->PadY();
294 cathode = mdig->Cathode() + 1;
295 AliDebug(3,Form("cathode %d ix %d iy %d ",cathode,ix,iy));
297 // get the sum of the coded charge
298 // see coding convention in AliMUONChamberTrigger::DisIntegration
300 for (Int_t icharge=0; icharge<10; ++icharge)
302 sumCharge = sumCharge+mdig->TrackCharge(icharge);
305 // apply condition on soft background
306 Int_t testCharge=sumCharge-(Int_t(sumCharge/10))*10;
307 if(sumCharge<=10||testCharge>0)
310 Int_t code=TMath::Abs(ix)*100+iy;
311 if (ix<0) { code=-code; }
317 // FIXME: if it works like this, rename digitindex to digit simply...
318 Int_t digitindex = digit;
325 for (icirc=0; icirc<234; icirc++)
327 triggerCircuit = (AliMUONTriggerCircuit*) fTriggerCircuit->At(icirc);
328 for (istrip=0; istrip<16; istrip++)
330 if (triggerCircuit->GetXcode(0,istrip)==code)
332 fXbit11[icirc][istrip]=1;
333 DigitFiredCircuit(icirc, cathode-1, chamber-1, digitindex);
339 for (icirc=0; icirc<234; icirc++)
341 triggerCircuit = (AliMUONTriggerCircuit*)fTriggerCircuit->At(icirc);
342 for (istrip=0; istrip<16; istrip++)
344 if (triggerCircuit->GetXcode(1,istrip)==code)
346 fXbit12[icirc][istrip]=1;
347 DigitFiredCircuit(icirc, cathode-1, chamber-1, digitindex);
353 for (icirc=0; icirc<234; icirc++)
355 triggerCircuit = (AliMUONTriggerCircuit*)fTriggerCircuit->At(icirc);
356 for (istrip=0; istrip<32; istrip++)
358 if (triggerCircuit->GetXcode(2,istrip)==code)
360 fXbit21[icirc][istrip]=1;
361 DigitFiredCircuit(icirc, cathode-1, chamber-1, digitindex);
367 for (icirc=0; icirc<234; icirc++)
369 triggerCircuit = (AliMUONTriggerCircuit*)fTriggerCircuit->At(icirc);
370 for (istrip=0; istrip<32; istrip++)
372 if (triggerCircuit->GetXcode(3,istrip)==code)
374 fXbit22[icirc][istrip]=1;
375 DigitFiredCircuit(icirc, cathode-1, chamber-1, digitindex);
387 for (icirc=0; icirc<234; icirc++)
389 triggerCircuit = (AliMUONTriggerCircuit*)fTriggerCircuit->At(icirc);
390 nStrip=triggerCircuit->GetNstripY();
391 for (istrip=0; istrip<nStrip; istrip++)
393 if (triggerCircuit->GetYcode(0,istrip)==code)
395 fYbit11[icirc][istrip]=1;
396 DigitFiredCircuit(icirc, cathode-1, chamber-1, digitindex);
402 for (icirc=0; icirc<234; icirc++)
404 triggerCircuit = (AliMUONTriggerCircuit*)fTriggerCircuit->At(icirc);
405 nStrip=triggerCircuit->GetNstripY();
406 for (istrip=0; istrip<nStrip; istrip++)
408 if (triggerCircuit->GetYcode(1,istrip)==code)
410 fYbit12[icirc][istrip]=1;
411 DigitFiredCircuit(icirc, cathode-1, chamber-1, digitindex);
417 for (icirc=0; icirc<234; icirc++)
419 triggerCircuit = (AliMUONTriggerCircuit*)fTriggerCircuit->At(icirc);
420 nStrip=triggerCircuit->GetNstripY();
421 for (istrip=0; istrip<nStrip; istrip++)
423 if (triggerCircuit->GetYcode(2,istrip)==code)
425 fYbit21[icirc][istrip]=1;
426 DigitFiredCircuit(icirc, cathode-1, chamber-1, digitindex);
432 for (icirc=0; icirc<234; icirc++)
434 triggerCircuit = (AliMUONTriggerCircuit*)fTriggerCircuit->At(icirc);
435 nStrip=triggerCircuit->GetNstripY();
436 for (istrip=0; istrip<nStrip; istrip++)
438 if (triggerCircuit->GetYcode(3,istrip)==code)
440 fYbit22[icirc][istrip]=1;
441 DigitFiredCircuit(icirc, cathode-1, chamber-1, digitindex);
448 } // remove soft background
449 } // end loop on digit
450 } // end loop on chamber
453 //----------------------------------------------------------------------
454 void AliMUONTriggerDecisionV1::SetBitUpDownY()
456 // Set Y bit for up and down parts of circuits
457 Int_t idModule, nStripX, nStripY, iPosCircuit;
459 for (Int_t icirc=0; icirc<234; icirc++)
462 AliMUONTriggerCircuit* circuit; // current circuit
463 AliMUONTriggerCircuit* circuitD; // circuit Down
464 AliMUONTriggerCircuit* circuitU; // circuit Up
466 circuit = (AliMUONTriggerCircuit*)fTriggerCircuit->At(icirc);
467 idModule=circuit->GetIdModule(); // corresponding module Id.
468 nStripX=circuit->GetNstripX(); // number of X strips
469 nStripY=circuit->GetNstripY(); // number of Y strips
470 iPosCircuit=circuit->GetPosCircuit(); // position of circuit in module
474 { // need to scan lower module
475 if(idModule<91&&TMath::Abs(idModule)!=41&&idModule>-91)
477 Int_t icircD=circuit->GetICircuitD();
478 circuitD = (AliMUONTriggerCircuit*)fTriggerCircuit->At(icircD);
479 Int_t nStripD=circuitD->GetNstripY();
481 if (TMath::Abs(idModule)==42)
482 { // shift of +8 bits
483 for (Int_t istrip=0; istrip<nStripD; istrip++)
485 fYbit21D[icirc][istrip+8]=fYbit21[icircD][istrip];
486 fYbit22D[icirc][istrip+8]=fYbit22[icircD][istrip];
488 } else if (TMath::Abs(idModule)==52)
489 { // shift of -8 bits
490 for (Int_t istrip=0; istrip<nStripD; istrip++)
492 fYbit21D[icirc][istrip]=fYbit21[icircD][istrip+8];
493 fYbit22D[icirc][istrip]=fYbit22[icircD][istrip+8];
497 for (Int_t istrip=0; istrip<nStripD; istrip++)
499 fYbit21D[icirc][istrip]=fYbit21[icircD][istrip];
500 fYbit22D[icirc][istrip]=fYbit22[icircD][istrip];
505 { // lower strips within same module
506 for (Int_t istrip=0; istrip<nStripY; istrip++) {
507 fYbit21D[icirc][istrip]=fYbit21[icirc][istrip];
508 fYbit22D[icirc][istrip]=fYbit22[icirc][istrip];
513 if ( (iPosCircuit==1&&nStripX==16)||(iPosCircuit==2&&nStripX==32)||
514 (iPosCircuit==3&&nStripX==48)||(iPosCircuit==4&&nStripX==64))
516 if ((idModule>17||idModule<-17)&&TMath::Abs(idModule)!=61)
518 Int_t icircU=circuit->GetICircuitU();
519 circuitU = (AliMUONTriggerCircuit*)fTriggerCircuit->At(icircU);
520 Int_t nStripU=circuitU->GetNstripY();
522 if (TMath::Abs(idModule)==62)
523 { // shift of +8 bits
524 for (Int_t istrip=0; istrip<nStripU; istrip++)
526 fYbit21U[icirc][istrip+8]=fYbit21[icircU][istrip];
527 fYbit22U[icirc][istrip+8]=fYbit22[icircU][istrip];
529 } else if (TMath::Abs(idModule)==52 )
530 { // shift of -8 bits
531 for (Int_t istrip=0; istrip<nStripU; istrip++)
533 fYbit21U[icirc][istrip]=fYbit21[icircU][istrip+8];
534 fYbit22U[icirc][istrip]=fYbit22[icircU][istrip+8];
537 for (Int_t istrip=0; istrip<nStripU; istrip++)
539 fYbit21U[icirc][istrip]=fYbit21[icircU][istrip];
540 fYbit22U[icirc][istrip]=fYbit22[icircU][istrip];
545 { // upper strips within same module
546 for (Int_t istrip=0; istrip<nStripY; istrip++)
548 fYbit21U[icirc][istrip]=fYbit21[icirc][istrip];
549 fYbit22U[icirc][istrip]=fYbit22[icirc][istrip];
555 //----------------------------------------------------------------------
556 // x part of trigger Algo
557 //----------------------------------------------------------------------
558 //----------------------------------------------------------------------
559 void AliMUONTriggerDecisionV1::TrigX(Int_t ch1q[16], Int_t ch2q[16],
560 Int_t ch3q[32], Int_t ch4q[32],
561 Int_t coinc44, Int_t minDevStrip[5],
563 // note : coinc44 = flag 0 or 1 (0 coincidence -> 3/4, 1 coincidence -> 4/4)
564 //---------------------------------------------------------
565 // step # 1 : declustering, reduction DS, calculate sgle & dble
566 //---------------------------------------------------------
567 Int_t ch1e[19], ch2e[20], ch3e[35], ch4e[36];
568 Int_t sgleHit1[31], sgleHit2[63];
569 Int_t dbleHit1[31], dbleHit2[63];
585 //--- inititialize che using chq
588 if (i<1||i>16) ch1e[i]=0;
589 else ch1e[i]=ch1q[i-1];
593 if (i<2||i>17) ch2e[i]=0;
594 else ch2e[i]=ch2q[i-2];
598 if (i<1||i>32) ch3e[i]=0;
599 else ch3e[i]=ch3q[i-1];
603 if (i<2||i>33) ch4e[i]=0;
604 else ch4e[i]=ch4q[i-2];
608 //--- calculate dble & sgle first station
609 for (i=0; i<=15; i++)
611 sgleHit1[2*i] = (!ch1e[i+1]|(ch1e[i]^ch1e[i+2])) &
612 (!ch2e[i+2] | (ch2e[i+1]^ch2e[i+3]));
614 dbleHit1[2*i] = ch1e[i+1]&!(ch1e[i+2]^ch1e[i]) &
615 (ch2e[i+2] | (!ch2e[i]&ch2e[i+1]) | (ch2e[i+3]&!ch2e[i+4]));
618 for (i=0; i<=14; i++)
620 sgleHit1[2*i+1] = (!ch1e[i+1]|!ch1e[i+2]|(ch1e[i]^ch1e[i+3])) &
621 (!ch2e[i+2] | !ch2e[i+3] | (ch2e[i+1]^ch2e[i+4]));
622 dbleHit1[2*i+1] = ch1e[i+1]&ch1e[i+2]&!(ch1e[i]^ch1e[i+3]) &
623 (ch2e[i+2]&(!ch2e[i+1]|!ch2e[i]) |
624 ch2e[i+3]&(ch2e[i+2]|!ch2e[i+4]|!ch2e[i+5]));
627 //--- calculate dble & sgle second station
628 for (i=0; i<=31; i++)
630 sgleHit2[2*i] = (!ch3e[i+1]|(ch3e[i]^ch3e[i+2])) &
631 (!ch4e[i+2] | (ch4e[i+1]^ch4e[i+3]));
632 dbleHit2[2*i] = ch3e[i+1]&!(ch3e[i+2]^ch3e[i]) &
633 (ch4e[i+2] | (!ch4e[i]&ch4e[i+1]) | (ch4e[i+3]&!ch4e[i+4]));
636 for (i=0; i<=30; i++)
638 sgleHit2[2*i+1] = (!ch3e[i+1]|!ch3e[i+2]|(ch3e[i]^ch3e[i+3])) &
639 (!ch4e[i+2] | !ch4e[i+3] | (ch4e[i+1]^ch4e[i+4]));
640 dbleHit2[2*i+1] = ch3e[i+1]&ch3e[i+2]&!(ch3e[i]^ch3e[i+3]) &
641 (ch4e[i+2]&(!ch4e[i+1]|!ch4e[i]) |
642 ch4e[i+3]&(ch4e[i+2]|!ch4e[i+4]|!ch4e[i+5]));
646 /* FIXME : use AliLog here...
648 if(fDebug==3||fDebug==5)
650 printf("===============================================================\n");
651 printf(" X plane after sgle and dble \n");
652 printf(" 0987654321098765432109876543210");
654 for (istrip=30; istrip>=0; istrip--) printf("%i",(!sgleHit1[istrip]));
656 for (istrip=30; istrip>=0; istrip--) printf("%i",dbleHit1[istrip]);
658 for (istrip=62; istrip>=0; istrip--) printf("%i",(!sgleHit2[istrip]));
660 for (istrip=62; istrip>=0; istrip--) printf("%i",dbleHit2[istrip]);
661 printf("\n 210987654321098765432109876543210987654321098765432109876543210\n");
665 //---------------------------------------------------------
666 // step # 2 : coincidence 3/4
667 //---------------------------------------------------------
668 Int_t rearImage[31][31];
677 Int_t notOr1=!dbleHit1[30] & !dbleHit1[29] & !dbleHit1[28] & !dbleHit1[27] &
678 !dbleHit1[26] & !dbleHit1[25] & !dbleHit1[24] & !dbleHit1[23] &
679 !dbleHit1[22] & !dbleHit1[21] & !dbleHit1[20] & !dbleHit1[19] &
680 !dbleHit1[18] & !dbleHit1[17] & !dbleHit1[16] & !dbleHit1[15] &
681 !dbleHit1[14] & !dbleHit1[13] & !dbleHit1[12] & !dbleHit1[11] &
682 !dbleHit1[10] & !dbleHit1[9] & !dbleHit1[8] & !dbleHit1[7] &
683 !dbleHit1[6] & !dbleHit1[5] & !dbleHit1[4] & !dbleHit1[3] &
684 !dbleHit1[2] & !dbleHit1[1] & !dbleHit1[0] & !coinc44;
686 Int_t notOr2= !dbleHit2[62] & !dbleHit2[61] & !dbleHit2[60] & !dbleHit2[59] &
687 !dbleHit2[58] & !dbleHit2[57] & !dbleHit2[56] & !dbleHit2[55] &
688 !dbleHit2[54] & !dbleHit2[53] & !dbleHit2[52] & !dbleHit2[51] &
689 !dbleHit2[50] & !dbleHit2[49] & !dbleHit2[48] & !dbleHit2[47] &
690 !dbleHit2[46] & !dbleHit2[45] & !dbleHit2[44] & !dbleHit2[43] &
691 !dbleHit2[42] & !dbleHit2[41] & !dbleHit2[40] & !dbleHit2[39] &
692 !dbleHit2[38] & !dbleHit2[37] & !dbleHit2[36] & !dbleHit2[35] &
693 !dbleHit2[34] & !dbleHit2[33] & !dbleHit2[32] & !dbleHit2[31] &
694 !dbleHit2[30] & !dbleHit2[29] & !dbleHit2[28] & !dbleHit2[27] &
695 !dbleHit2[26] & !dbleHit2[25] & !dbleHit2[24] & !dbleHit2[23] &
696 !dbleHit2[22] & !dbleHit2[21] & !dbleHit2[20] & !dbleHit2[19] &
697 !dbleHit2[18] & !dbleHit2[17] & !dbleHit2[16] & !dbleHit2[15] &
698 !dbleHit2[14] & !dbleHit2[13] & !dbleHit2[12] & !dbleHit2[11] &
699 !dbleHit2[10] & !dbleHit2[9] & !dbleHit2[8] & !dbleHit2[7] &
700 !dbleHit2[6] & !dbleHit2[5] & !dbleHit2[4] & !dbleHit2[3] &
701 !dbleHit2[2] & !dbleHit2[1] & !dbleHit2[0] & !coinc44;
706 sgleHit1[i] = !sgleHit1[i]¬Or1;
710 sgleHit2[i] = !sgleHit2[i]¬Or2;
716 Int_t tmpSgleHit2[31];
717 Int_t tmpDbleHit2[31];
720 tmpSgleHit2[j] = sgleHit2[i+j+1];
721 tmpDbleHit2[j] = dbleHit2[i+j+1];
724 for (Int_t k=0; k<31; k++)
726 rearImage[i][k]=(sgleHit1[i]&tmpDbleHit2[k])|
727 (dbleHit1[i]&(tmpSgleHit2[k]|tmpDbleHit2[k]));
732 /* FIXME: use AliLog here
733 if(fDebug==3||fDebug==5) {
734 printf("===============================================================\n");
735 for (i=30; i>=0; i--)
738 for (istrip=31; istrip>=0; istrip--) printf("%i",rearImage[i][istrip]);
744 //---------------------------------------------------------
745 // step # 3 : calculate deviation
746 //---------------------------------------------------------
758 Int_t leftDev[5], rightDev[5];
759 Int_t orL1, andL1, andL2, orR1, orR2, andR1, andR2, andR3;
761 // calculate Left deviation
762 orL1=rearImage[i][16]|rearImage[i][18]|rearImage[i][20]|rearImage[i][22];
763 andL1=!rearImage[i][17]&!rearImage[i][19]&!rearImage[i][21] & !orL1;
764 andL2=!rearImage[i][23]&!rearImage[i][24]&!rearImage[i][25]&!rearImage[i][26];
766 leftDev[0] = (rearImage[i][16]|!rearImage[i][17]) &
767 (rearImage[i][16]|rearImage[i][18]|!rearImage[i][19]&
768 (rearImage[i][20]|!rearImage[i][21])) &
769 (orL1|!rearImage[i][23]&(rearImage[i][24]|!rearImage[i][25])) &
770 (orL1|rearImage[i][24]|rearImage[i][26]|!rearImage[i][27]&
771 (rearImage[i][28]|!rearImage[i][29]));
773 leftDev[1] = !rearImage[i][16] &
774 !(!rearImage[i][17]&!rearImage[i][18]&!rearImage[i][21]&!rearImage[i][22] &
775 (!rearImage[i][25]&!rearImage[i][26]&(rearImage[i][27]|rearImage[i][28]))) &
776 (rearImage[i][17]|rearImage[i][18] | !rearImage[i][19]&!rearImage[i][20]) &
777 (rearImage[i][17]|rearImage[i][18]|rearImage[i][21]|rearImage[i][22] |
778 !rearImage[i][23]&!rearImage[i][24]);
780 leftDev[2] = (!rearImage[i][16]&!rearImage[i][17]&!rearImage[i][18]) &
781 (rearImage[i][19]|rearImage[i][20]|rearImage[i][21]|rearImage[i][22] | andL2);
786 !rearImage[i][27]&!rearImage[i][28]&!rearImage[i][29]&!rearImage[i][30] &
789 // calculate Right deviation
790 orR1=rearImage[i][8]|rearImage[i][10]|rearImage[i][12]|rearImage[i][14];
791 orR2=rearImage[i][8]|rearImage[i][9]|rearImage[i][10]|rearImage[i][11];
792 andR1=!rearImage[i][12]&!rearImage[i][13]&!rearImage[i][14]&!rearImage[i][15];
794 !rearImage[i][8]&!rearImage[i][9]&!rearImage[i][10]&!rearImage[i][11] & andR1;
795 andR3=!rearImage[i][4]&!rearImage[i][5]&!rearImage[i][6]&!rearImage[i][7];
797 rightDev[0] = !rearImage[i][15]&(rearImage[i][14]|!rearImage[i][13]) &
798 ((rearImage[i][12]|rearImage[i][14]|!rearImage[i][11]&
799 (rearImage[i][10]|!rearImage[i][9])) &
800 ((orR1|!rearImage[i][7]&(rearImage[i][6]|!rearImage[i][5])) &
801 (orR1|rearImage[i][4]|rearImage[i][6]|!rearImage[i][3]&(rearImage[i][2]|
802 !rearImage[i][1]))));
804 rightDev[1] = !rearImage[i][15]&!rearImage[i][14] &
805 !(!rearImage[i][4]&!rearImage[i][5]&!rearImage[i][8]&!rearImage[i][9] &
806 (!rearImage[i][12]&!rearImage[i][13]&(rearImage[i][2]|rearImage[i][3]))) &
807 (rearImage[i][12]|rearImage[i][13] | !rearImage[i][10]&!rearImage[i][11]) &
808 (rearImage[i][8]|rearImage[i][9]|rearImage[i][12]|rearImage[i][13] |
809 !rearImage[i][6]&!rearImage[i][7]);
811 rightDev[2] = andR1 & (orR2 | andR3);
814 !rearImage[i][0]&!rearImage[i][1]&!rearImage[i][2]&!rearImage[i][3] &
817 // compare Left & Right deviations
818 Int_t tmpLeftDev=0, tmpRightDev=0;
821 tmpLeftDev = tmpLeftDev + Int_t(leftDev[j]<<j);
822 tmpRightDev = tmpRightDev + Int_t(rightDev[j]<<j);
825 // assign mimimum deviation do dev[][]
826 if (tmpLeftDev < tmpRightDev )
828 for (j=0; j<5; j++){ dev[i][j]=leftDev[j];}
832 for (j=0; j<5; j++){ dev[i][j]=rightDev[j];}
838 /* FIXME: use AliLog here...
839 if(fDebug==3||fDebug==5) {
840 printf("===============================================================\n");
841 for (i=30; i>=0; i--) {
843 for (istrip=5; istrip>=0; istrip--) printf("%i",dev[i][istrip]);
849 //---------------------------------------------------------
850 // step # 4 : sort deviation
851 //---------------------------------------------------------
852 Int_t bga1[16], bga2[8], bga3[4], bga4[2], bga5;
853 Int_t tmpbga1[16][6], tmpbga2[8][6], tmpbga3[4][6], tmpbga4[2][6], tmpbga5[6];
854 Int_t tmpMax[6]={1,1,1,1,1,0};
858 Sort2x5(dev[2*i],dev[2*i+1],tmpbga1[i],bga1[i]);
860 Sort2x5(dev[30],tmpMax,tmpbga1[15],bga1[15]);
863 /* FIXME: use AliLog here...
865 if(fDebug==3||fDebug==5) {
866 printf("===============================================================\n");
867 printf(" sorting : 1st level \n");
868 for (i=15; i>=0; i--) {
869 printf("\t %i \t",bga1[i]);
870 for (j=5; j>=0; j--) printf("%i",tmpbga1[i][j]);
878 Sort2x5(tmpbga1[2*i],tmpbga1[2*i+1],tmpbga2[i],bga2[i]);
882 /* FIXME: use AliLog here...
883 if(fDebug==3||fDebug==5) {
884 printf("===============================================================\n");
885 printf(" sorting : 2nd level \n");
886 for (i=7; i>=0; i--) {
887 printf("\t %i \t",bga2[i]);
888 for (j=5; j>=0; j--) printf("%i",tmpbga1[i][j]);
896 Sort2x5(tmpbga2[2*i],tmpbga2[2*i+1],tmpbga3[i],bga3[i]);
900 /* FIXME: use AliLog here...
901 if(fDebug==3||fDebug==5) {
902 printf("===============================================================\n");
903 printf(" sorting : 3rd level \n");
904 for (i=3; i>=0; i--) {
905 printf("\t %i \t",bga3[i]);
906 for (j=5; j>=0; j--) printf("%i",tmpbga3[i][j]);
914 Sort2x5(tmpbga3[2*i],tmpbga3[2*i+1],tmpbga4[i],bga4[i]);
918 /* FIXME: use AliLog Here...
919 if(fDebug==3||fDebug==5) {
920 printf("===============================================================\n");
921 printf(" sorting : 4th level \n");
922 for (i=1; i>=0; i--) {
923 printf("\t %i \t",bga4[i]);
924 for (j=5; j>=0; j--) printf("%i",tmpbga4[i][j]);
930 Sort2x5(tmpbga4[0],tmpbga4[1],tmpbga5,bga5);
932 // coding from 6 to 5 bits
933 minDev[4] = tmpbga5[5] | tmpbga5[4];
936 minDev[i]=tmpbga5[i] & !tmpbga5[4];
939 // find address of strip with minimum deviation
941 if (bga5<=1) minDevStrip[3]=bga4[bga5];
943 Int_t tmpAd=minDevStrip[3]+minDevStrip[4]*2;
944 if (tmpAd<=3) minDevStrip[2]=bga3[tmpAd];
946 tmpAd=minDevStrip[2]+minDevStrip[3]*2+minDevStrip[4]*4;
947 if (tmpAd<=7) minDevStrip[1]=bga2[tmpAd];
949 tmpAd=minDevStrip[1]+minDevStrip[2]*2+minDevStrip[3]*4+minDevStrip[4]*8;
950 if (tmpAd<=15) minDevStrip[0]=bga1[tmpAd];
952 /* FIXME : use AliLog here...
953 if(fDebug==3||fDebug==5) {
954 printf("===============================================================\n");
955 printf("minDevStrip = ");
956 for (i=4; i>=0; i--) printf("%i",minDevStrip[i]);
957 printf(" minDev = ");
958 for (i=4; i>=0; i--) printf("%i",minDev[i]);
960 printf("===============================================================\n");
965 //---------------------------------------------
966 void AliMUONTriggerDecisionV1::Sort2x5(Int_t dev1[6], Int_t dev2[6],
967 Int_t minDev[6], Int_t &dev1GTdev2)
969 // returns minimun between dev1 and dev2
970 Int_t tmpDev1=0, tmpDev2=0;
971 for (Int_t j=0; j<5; j++)
973 tmpDev1 = tmpDev1 + Int_t(dev1[j]<<j);
974 tmpDev2 = tmpDev2 + Int_t(dev2[j]<<j);
976 if (tmpDev1 <= tmpDev2 )
978 for (Int_t j=0; j<=5; j++) { minDev[j]=dev1[j];}
982 for (Int_t j=0; j<=5; j++) { minDev[j]=dev2[j];}
987 //----------------------------------------------------------------------
988 // y part of trigger Algo
989 //----------------------------------------------------------------------
991 //----------------------------------------------------------------------
992 void AliMUONTriggerDecisionV1::TrigY(Int_t y1[16], Int_t y2[16],
993 Int_t y3[16], Int_t y4[16],
994 Int_t y3u[16], Int_t y3d[16],
995 Int_t y4u[16], Int_t y4d[16],
996 Int_t x2m, Int_t x2ud, Int_t orMud[2],
997 Int_t resetMid, Int_t coinc44,
999 // note : resMid = 1 -> cancel
1000 //---------------------------------------------------------
1001 // step # 1 : prehandling Y
1002 //---------------------------------------------------------
1005 for (i=0; i<16; i++)
1007 y3[i]=y3[i]&!resetMid;
1008 y4[i]=y4[i]&!resetMid;
1011 Int_t ch1[16], ch2[16], ch3[16], ch4[16];
1013 Int_t tmpy3to16[16], tmpy4to16[16];
1014 Int_t tmpy3uto16[16], tmpy3dto16[16], tmpy4uto16[16], tmpy4dto16[16];
1017 ch1[2*i] = y1[i]&x2m | y1[2*i]&!x2m;
1018 ch1[2*i+1] = y1[i]&x2m | y1[2*i+1]&!x2m;
1020 ch2[2*i] = y2[i]&x2m | y2[2*i]&!x2m;
1021 ch2[2*i+1] = y2[i]&x2m | y2[2*i+1]&!x2m;
1023 tmpy3to16[2*i] = y3[i]&x2m | y3[2*i]&!x2m;
1024 tmpy3to16[2*i+1] = y3[i]&x2m | y3[2*i+1]&!x2m;
1026 tmpy4to16[2*i] = y4[i]&x2m | y4[2*i]&!x2m;
1027 tmpy4to16[2*i+1] = y4[i]&x2m | y4[2*i+1]&!x2m;
1029 tmpy3uto16[2*i] = y3u[i]&x2ud | y3u[2*i]&!x2ud;
1030 tmpy3uto16[2*i+1] = y3u[i]&x2ud | y3u[2*i+1]&!x2ud;
1032 tmpy4uto16[2*i] = y4u[i]&x2ud | y4u[2*i]&!x2ud;
1033 tmpy4uto16[2*i+1] = y4u[i]&x2ud | y4u[2*i+1]&!x2ud;
1035 tmpy3dto16[2*i] = y3d[i]&x2ud | y3d[2*i]&!x2ud;
1036 tmpy3dto16[2*i+1] = y3d[i]&x2ud | y3d[2*i+1]&!x2ud;
1038 tmpy4dto16[2*i] = y4d[i]&x2ud | y4d[2*i]&!x2ud;
1039 tmpy4dto16[2*i+1] = y4d[i]&x2ud | y4d[2*i+1]&!x2ud;
1042 if (orMud[0]==0&&orMud[1]==0)
1044 for (i=0; i<16; i++)
1046 ch3[i] = tmpy3to16[i];
1047 ch4[i] = tmpy4to16[i];
1050 if (orMud[0]==0&&orMud[1]==1)
1052 for (i=0; i<16; i++)
1054 ch3[i] = tmpy3uto16[i]|tmpy3to16[i];
1055 ch4[i] = tmpy4uto16[i]|tmpy4to16[i];
1058 if (orMud[0]==1&&orMud[1]==0)
1060 for (i=0; i<16; i++)
1062 ch3[i] = tmpy3dto16[i]|tmpy3to16[i];
1063 ch4[i] = tmpy4dto16[i]|tmpy4to16[i];
1066 if (orMud[0]==1&&orMud[1]==1)
1068 for (i=0; i<16; i++)
1070 ch3[i] = tmpy3dto16[i]|tmpy3to16[i]|tmpy3uto16[i];
1071 ch4[i] = tmpy4dto16[i]|tmpy4to16[i]|tmpy4uto16[i];
1076 /* FIXME: use AliLog here...
1077 if(fDebug==4||fDebug==5) {
1078 printf("===============================================================\n");
1079 printf(" Y plane after PreHandling x2m x2ud orMud %i %i %i %i \n",
1080 x2m,x2ud,orMud[0],orMud[1]);
1082 for (istrip=15; istrip>=0; istrip--) {
1083 if (istrip>9) printf("%i",istrip-10*Int_t(istrip/10));
1084 if (istrip<10) printf("%i",istrip);
1086 printf("\n YMC11 ");
1087 for (istrip=15; istrip>=0; istrip--) printf("%i",ch1[istrip]);
1088 printf("\n YMC12 ");
1089 for (istrip=15; istrip>=0; istrip--) printf("%i",ch2[istrip]);
1090 printf("\n YMC21 ");
1091 for (istrip=15; istrip>=0; istrip--) printf("%i",ch3[istrip]);
1092 printf("\n YMC22 ");
1093 for (istrip=15; istrip>=0; istrip--) printf("%i",ch4[istrip]);
1099 //---------------------------------------------------------
1100 // step # 2 : calculate sgle and dble, apply DS reduction
1101 //---------------------------------------------------------
1102 Int_t sgle1[16], dble1[16];
1103 Int_t sgle2[16], dble2[16];
1105 // Calculate simple and double hits
1106 for (i=0; i<16; i++)
1108 dble1[i] = ch1[i] & ch2[i];
1109 dble2[i] = ch3[i] & ch4[i];
1111 sgle1[i] = (ch1[i]|ch2[i]);
1112 sgle2[i] = (ch3[i]|ch4[i]);
1116 /* FIXME: use AliLog here...
1117 if(fDebug==4||fDebug==5) {
1118 printf("===============================================================\n");
1119 printf(" Y plane after sgle dble \n");
1121 for (istrip=15; istrip>=0; istrip--) {
1122 if (istrip>9) printf("%i",istrip-10*Int_t(istrip/10));
1123 if (istrip<10) printf("%i",istrip);
1125 printf("\n SGLE1 ");
1126 for (istrip=15; istrip>=0; istrip--) printf("%i",sgle1[istrip]);
1127 printf("\n DBLE1 ");
1128 for (istrip=15; istrip>=0; istrip--) printf("%i",dble1[istrip]);
1129 printf("\n SGLE2 ");
1130 for (istrip=15; istrip>=0; istrip--) printf("%i",sgle2[istrip]);
1131 printf("\n DBLE2 ");
1132 for (istrip=15; istrip>=0; istrip--) printf("%i",dble2[istrip]);
1139 Int_t notOr1, notOr2;
1141 notOr1=!dble1[15] & !dble1[14] & !dble1[13] & !dble1[12] &
1142 !dble1[11] & !dble1[10] & !dble1[9] & !dble1[8] &
1143 !dble1[7] & !dble1[6] & !dble1[5] & !dble1[4] &
1144 !dble1[3] & !dble1[2] & !dble1[1] & !dble1[0];
1146 notOr2=!dble2[15] & !dble2[14] & !dble2[13] & !dble2[12] &
1147 !dble2[11] & !dble2[10] & !dble2[9] & !dble2[8] &
1148 !dble2[7] & !dble2[6] & !dble2[5] & !dble2[4] &
1149 !dble2[3] & !dble2[2] & !dble2[1] & !dble2[0];
1151 for (i=0; i<16; i++)
1153 sgle1[i] = sgle1[i] & notOr1 & !coinc44;
1154 sgle2[i] = sgle2[i] & notOr2 & !coinc44;
1157 //---------------------------------------------------------
1158 // step # 3 : 3/4 coincidence
1159 //---------------------------------------------------------
1160 Int_t frontImage[16];
1162 for (i=1; i<15; i++)
1164 frontImage[i] = (dble1[i] | sgle1[i]) &
1165 (dble2[i+1] | dble2[i] | dble2[i-1]) |
1166 dble1[i] & (sgle2[i+1] | sgle2[i] | sgle2[i-1]);
1168 frontImage[0] = (dble1[0] | sgle1[0]) &
1169 (dble2[1] | dble2[0]) | dble1[0] & (sgle2[1] | sgle2[0]);
1171 frontImage[15] = (dble1[15] | sgle1[15]) &
1172 (dble2[15] | dble2[14]) | dble1[15] & (sgle2[15] | sgle2[14]);
1176 /* FIXME: use AliLog here...
1177 if(fDebug==4||fDebug==5) {
1178 printf("===============================================================\n");
1179 printf(" Y plane frontImage\n");
1181 for (istrip=15; istrip>=0; istrip--) {
1182 if (istrip>9) printf("%i",istrip-10*Int_t(istrip/10));
1183 if (istrip<10) printf("%i",istrip);
1186 for (istrip=15; istrip>=0; istrip--) printf("%i",frontImage[istrip]);
1192 //---------------------------------------------------------
1193 // step # 4 : Y position
1194 //---------------------------------------------------------
1195 Int_t or1, or2, and1, and2, and3;
1197 or1 = frontImage[7]|frontImage[5]|frontImage[3]|frontImage[1];
1198 or2 = frontImage[7]|frontImage[6]|frontImage[5]|frontImage[4];
1199 and1 = !frontImage[3]&!frontImage[2]&!frontImage[1]&!frontImage[0];
1200 and2 = !frontImage[7]&!frontImage[6]&!frontImage[5]&!frontImage[4] & and1;
1201 and3 = !frontImage[11]&!frontImage[10]&!frontImage[9]&!frontImage[8];
1203 coordY[0] = !frontImage[0]&(frontImage[1]|!frontImage[2]) &
1204 (frontImage[3]|frontImage[1]|!frontImage[4]&(frontImage[5]|!frontImage[6])) &
1205 (or1|!frontImage[8]&(frontImage[9]|!frontImage[10])) &
1206 (or1|frontImage[11]|frontImage[9]|!frontImage[12]&(frontImage[13]|!frontImage[14]));
1208 coordY[1] = !frontImage[0]&!frontImage[1] &
1209 !(!frontImage[11]&!frontImage[10]&!frontImage[7]&!frontImage[6] &
1210 !frontImage[3]&!frontImage[2]&(frontImage[13]|frontImage[12])) &
1211 (frontImage[3]|frontImage[2] | !frontImage[5]&!frontImage[4]) &
1212 (frontImage[7]|frontImage[6]|frontImage[3]|frontImage[2] |
1213 !frontImage[9]&!frontImage[8]);
1215 coordY[2] = and1 & (or2 | and3);
1219 coordY[4] = !frontImage[15]&!frontImage[14]&!frontImage[13]&!frontImage[12] &
1223 //----------------------------------------------------------------------
1224 // end of trigger Algo
1225 //----------------------------------------------------------------------
1227 //______________________________________________________________________________
1228 void AliMUONTriggerDecisionV1::LocalTrigger(Int_t icirc,
1229 Int_t minDevStrip[5],
1230 Int_t minDev[5], Int_t coordY[5],
1232 // returns local trigger answer for circuit icirc
1235 AliMUONTriggerCircuit* triggerCircuit;
1236 triggerCircuit = (AliMUONTriggerCircuit*) fTriggerCircuit->At(icirc);
1238 Int_t signDev=minDev[4];
1241 { // extract deviation
1242 deviation = deviation+Int_t(minDev[i]<<i);
1245 Int_t istripX1Circ=0;
1247 { // extract X1 strip fired
1248 istripX1Circ = istripX1Circ+Int_t(minDevStrip[i]<<i);
1253 { // extract Y strip fired
1254 iStripY = iStripY+Int_t(coordY[i]<<i);
1258 if (signDev==1&&deviation==0)
1259 { // something in X ?
1263 if (coordY[4]==1&&iStripY==15)
1264 { // something in Y ?
1274 // fill fTrigger fStripX11 fStripY11
1275 fTrigger[icirc] = 1;
1276 fStripX11[icirc] = istripX1Circ;
1277 fStripY11[icirc] = iStripY;
1279 // calculate deviation in [0+30]
1281 if (signDev==0&&deviation!=0) sign=-1;
1282 if (signDev==0&&deviation==0) sign=0;
1283 if (signDev==1) sign=1;
1284 fDev[icirc] = sign * deviation + 15; // fill fDev
1286 // get Lut output for circuit/istripX/idev/istripY
1287 AliMUONTriggerLut lut;
1288 // lut->StartEvent();
1289 lut.GetLutOutput(icirc,fStripX11[icirc],fDev[icirc],fStripY11[icirc],
1290 fLutLpt[icirc],fLutHpt[icirc],fLutApt[icirc]);
1291 // lut->FinishEvent();
1293 /* FIXME : use AliLog here...
1296 Float_t pt= // get ptCal corresponding to istripX1Circ/idev/iStripY
1297 triggerCircuit->PtCal(fStripX11[icirc],fDev[icirc],fStripY11[icirc]);
1298 printf("-------------------------------------------\n");
1299 printf(" Local Trigger info for circuit Id %i (number %i ) \n",
1301 printf(" istripX1 signDev deviation istripY = %i %i %i %i \n",
1302 istripX1Circ,signDev,deviation,iStripY);
1303 printf(" pt = %f (GeV/c) \n",pt);
1304 printf("-------------------------------------------\n");
1305 printf(" Local Trigger Lut Output = Lpt : ");
1306 for (i=1; i>=0; i--) printf("%i",fLutLpt[icirc][i]);
1308 for (i=1; i>=0; i--) printf("%i",fLutHpt[icirc][i]);
1310 for (i=1; i>=0; i--) printf("%i",fLutApt[icirc][i]);
1312 printf("-------------------------------------------\n");
1315 } // local trigger = 1
1318 //----------------------------------------------------------------------
1319 void AliMUONTriggerDecisionV1::GlobalTrigger()
1321 // loop on Lut[icirc] and give Global Trigger output
1324 for (Int_t icirc=0; icirc<234; icirc++)
1326 if (fLutLpt[icirc][0]==1&&fLutLpt[icirc][1]==1)
1327 fGlobalSingleUndef[0] = fGlobalSingleUndef[0] + 1;
1328 if (fLutHpt[icirc][0]==1&&fLutHpt[icirc][1]==1)
1329 fGlobalSingleUndef[1] = fGlobalSingleUndef[1] + 1;
1330 if (fLutApt[icirc][0]==1&&fLutApt[icirc][1]==1)
1331 fGlobalSingleUndef[2] = fGlobalSingleUndef[2] + 1;
1333 if (fLutLpt[icirc][0]==0&&fLutLpt[icirc][1]==1)
1334 fGlobalSinglePlus[0] = fGlobalSinglePlus[0] + 1;
1335 if (fLutHpt[icirc][0]==0&&fLutHpt[icirc][1]==1)
1336 fGlobalSinglePlus[1] = fGlobalSinglePlus[1] + 1;
1337 if (fLutApt[icirc][0]==0&&fLutApt[icirc][1]==1)
1338 fGlobalSinglePlus[2] = fGlobalSinglePlus[2] + 1;
1340 if (fLutLpt[icirc][0]==1&&fLutLpt[icirc][1]==0)
1341 fGlobalSingleMinus[0] = fGlobalSingleMinus[0] + 1;
1342 if (fLutHpt[icirc][0]==1&&fLutHpt[icirc][1]==0)
1343 fGlobalSingleMinus[1] = fGlobalSingleMinus[1] + 1;
1344 if (fLutApt[icirc][0]==1&&fLutApt[icirc][1]==0)
1345 fGlobalSingleMinus[2] = fGlobalSingleMinus[2] + 1;
1348 // like sign low, high and all pt
1351 fGlobalPairLike[i]=fGlobalSingleMinus[i]*(fGlobalSingleMinus[i]-1)/2 +
1352 fGlobalSinglePlus[i]*(fGlobalSinglePlus[i]-1)/2 +
1353 fGlobalSingleUndef[i]*(fGlobalSingleUndef[i]-1)/2 +
1354 fGlobalSingleUndef[i]*fGlobalSinglePlus[i] +
1355 fGlobalSingleUndef[i]*fGlobalSingleMinus[i];
1358 // unlike sign low, high and all pt
1361 fGlobalPairUnlike[i]=fGlobalSingleMinus[i]*fGlobalSinglePlus[i] +
1362 fGlobalSingleUndef[i]*(fGlobalSingleUndef[i]-1)/2 +
1363 fGlobalSingleUndef[i]*fGlobalSinglePlus[i] +
1364 fGlobalSingleUndef[i]*fGlobalSingleMinus[i];
1368 printf("===================================================\n");
1369 printf(" Global Trigger output Low pt High pt All\n");
1370 printf(" number of Single Plus :\t");
1371 for (i=0; i<3; i++) printf("%i\t",fGlobalSinglePlus[i]);
1373 printf(" number of Single Minus :\t");
1374 for (i=0; i<3; i++) printf("%i\t",fGlobalSingleMinus[i]);
1376 printf(" number of Single Undefined :\t");
1377 for (i=0; i<3; i++) printf("%i\t",fGlobalSingleUndef[i]);
1379 printf(" number of UnlikeSign pair :\t");
1380 for (i=0; i<3; i++) printf("%i\t",fGlobalPairUnlike[i]);
1382 printf(" number of LikeSign pair :\t");
1383 for (i=0; i<3; i++) printf("%i\t",fGlobalPairLike[i]);
1385 printf("===================================================\n");
1390 //----------------------------------------------------------------------
1391 void AliMUONTriggerDecisionV1::PrintBitPatXInput(Int_t icirc)
1393 // print bit pattern for X strips
1397 printf("-------- TRIGGER INPUT ---------\n");
1398 printf("===============================================================\n");
1399 printf(" 5432109876543210");
1400 printf("\n XMC11 ");
1401 for (istrip=15; istrip>=0; istrip--) printf("%i",fXbit11[icirc][istrip]);
1402 printf("\n XMC12 ");
1403 for (istrip=15; istrip>=0; istrip--) printf("%i",fXbit12[icirc][istrip]);
1404 printf("\n XMC21 ");
1405 for (istrip=31; istrip>=0; istrip--) printf("%i",fXbit21[icirc][istrip]);
1406 printf("\n XMC22 ");
1407 for (istrip=31; istrip>=0; istrip--) printf("%i",fXbit22[icirc][istrip]);
1409 printf("10987654321098765432109876543210\n");
1412 //----------------------------------------------------------------------
1413 void AliMUONTriggerDecisionV1::PrintBitPatYInput(Int_t icirc)
1415 // print bit pattern for Y strips
1419 AliMUONTriggerCircuit* triggerCircuit;
1420 triggerCircuit = (AliMUONTriggerCircuit*) fTriggerCircuit->At(icirc);
1421 Int_t idCircuit=triggerCircuit->GetIdCircuit();
1422 Int_t nStrip=triggerCircuit->GetNstripY();
1424 printf("---------------------------------------------------------------\n");
1426 for (istrip=nStrip-1; istrip>=0; istrip--) {
1427 if (istrip>9) printf("%i",istrip-10*Int_t(istrip/10));
1428 if (istrip<10) printf("%i",istrip);
1430 printf("\n YMC11 ");
1431 for (istrip=nStrip-1; istrip>=0; istrip--)
1432 printf("%i",fYbit11[icirc][istrip]);
1433 printf("\n YMC12 ");
1434 for (istrip=nStrip-1; istrip>=0; istrip--)
1435 printf("%i",fYbit12[icirc][istrip]);
1436 printf("\n YMC21 ");
1437 for (istrip=nStrip-1; istrip>=0; istrip--)
1438 printf("%i",fYbit21[icirc][istrip]);
1439 printf("\n YMC22 ");
1440 for (istrip=nStrip-1; istrip>=0; istrip--)
1441 printf("%i",fYbit22[icirc][istrip]);
1444 printf("---------------------------------------------------------------");
1445 printf("\n upper part of circuit %i",idCircuit);
1446 printf("\n UMC21 ");
1447 for (istrip=15; istrip>=0; istrip--) printf("%i",fYbit21U[icirc][istrip]);
1448 printf("\n UMC22 ");
1449 for (istrip=15; istrip>=0; istrip--) printf("%i", fYbit22U[icirc][istrip]);
1451 printf("\n lower part of circuit %i",idCircuit);
1452 printf("\n LMC21 ");
1453 for (istrip=15; istrip>=0; istrip--) printf("%i",fYbit21D[icirc][istrip]);
1454 printf("\n LMC22 ");
1455 for (istrip=15; istrip>=0; istrip--) printf("%i",fYbit22D[icirc][istrip]);
1457 printf("===============================================================\n");
1460 //----------------------------------------------------------------------
1461 void AliMUONTriggerDecisionV1::PrintLocalOutput(Int_t minDevStrip[5],
1464 // print Local trigger output before the LuT step
1468 printf("===============================================================\n");
1469 printf("-------- TRIGGER OUTPUT --------\n");
1470 printf("minDevStrip = ");
1471 for (i=4; i>=0; i--) printf("%i",minDevStrip[i]);
1472 printf(" minDev = ");
1473 for (i=4; i>=0; i--) printf("%i",minDev[i]);
1474 printf(" coordY = ");
1475 for (i=4; i>=0; i--) printf("%i",coordY[i]);
1479 //----------------------------------------------------------------------
1480 //--- methods which return member data related info
1481 //----------------------------------------------------------------------
1482 Int_t AliMUONTriggerDecisionV1::GetITrigger(Int_t icirc) const
1484 // returns Local Trigger Status
1485 return fTrigger[icirc];
1487 //----------------------------------------------------------------------
1488 Int_t AliMUONTriggerDecisionV1::GetStripX11(Int_t icirc) const
1490 // returns fStripX11
1491 return fStripX11[icirc];
1493 //----------------------------------------------------------------------
1494 Int_t AliMUONTriggerDecisionV1::GetDev(Int_t icirc) const
1499 //----------------------------------------------------------------------
1500 Int_t AliMUONTriggerDecisionV1::GetStripY11(Int_t icirc) const
1502 // returns fStripY11;
1503 return fStripY11[icirc];
1505 //----------------------------------------------------------------------
1506 void AliMUONTriggerDecisionV1::GetLutOutput(Int_t icirc, Int_t lpt[2],
1507 Int_t hpt[2], Int_t apt[2]) const
1509 // returns Look up Table output
1510 for (Int_t i=0; i<2; i++) {
1511 lpt[i]=fLutLpt[icirc][i];
1512 hpt[i]=fLutHpt[icirc][i];
1513 apt[i]=fLutApt[icirc][i];
1516 //----------------------------------------------------------------------
1517 void AliMUONTriggerDecisionV1::GetGlobalTrigger(Int_t singlePlus[3],
1518 Int_t singleMinus[3],
1519 Int_t singleUndef[3],
1520 Int_t pairUnlike[3],
1521 Int_t pairLike[3]) const
1523 // returns Global Trigger information (0,1,2 : Lpt,Hpt,Apt)
1524 // should not be used anymore.
1525 for (Int_t i=0; i<3; i++)
1527 singlePlus[i] = fGlobalSinglePlus[i];
1528 singleMinus[i] = fGlobalSingleMinus[i];
1529 singleUndef[i] = fGlobalSingleUndef[i];
1530 pairUnlike[i] = fGlobalPairUnlike[i];
1531 pairLike[i] = fGlobalPairLike[i];
1535 //_______________________________________________________________________
1536 void AliMUONTriggerDecisionV1::Exec(Option_t*)
1538 // call the Trigger Algorithm and fill TreeD
1540 ClearDigitNumbers();
1542 fMUONData->ResetTrigger();
1546 AliMUONGlobalTrigger* pGloTrig =
1547 new AliMUONGlobalTrigger(fGlobalSinglePlus, fGlobalSingleMinus,
1548 fGlobalSingleUndef, fGlobalPairUnlike,
1551 // add a local trigger in the list
1552 fMUONData->AddGlobalTrigger(*pGloTrig);
1554 for (Int_t icirc=0; icirc<AliMUONConstants::NTriggerCircuit(); icirc++)
1556 if(GetITrigger(icirc)==1)
1558 Int_t localtr[15]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
1559 Int_t loLpt[2]={0,0}; Int_t loHpt[2]={0,0}; Int_t loApt[2]={0,0};
1560 GetLutOutput(icirc, loLpt, loHpt, loApt);
1562 localtr[1] = GetStripX11(icirc);
1563 localtr[2] = GetDev(icirc);
1564 localtr[3] = GetStripY11(icirc);
1565 for (Int_t i = 0; i < 2; i++)
1566 { // convert the Lut output in 1 digit
1567 localtr[4] += Int_t(loLpt[i]<<i);
1568 localtr[5] += Int_t(loHpt[i]<<i);
1569 localtr[6] += Int_t(loApt[i]<<i);
1572 for (Int_t i = 0; i < 16; i++)
1573 { // convert X/Y bit in bit pattern
1574 localtr[7] |= (fXbit11[icirc][i] << i);
1575 localtr[8] |= (fXbit12[icirc][i] << i);
1577 // 8 first and last elts correspond to neighbouring cards
1578 localtr[9] |= (fXbit21[icirc][i+8] << i);
1579 localtr[10] |= (fXbit22[icirc][i+8] << i);
1581 localtr[11] |= (fYbit11[icirc][i] << i);
1582 localtr[12] |= (fYbit12[icirc][i] << i);
1583 localtr[13] |= (fYbit21[icirc][i] << i);
1584 localtr[14] |= (fYbit22[icirc][i] << i);
1587 AliMUONLocalTrigger* pLocTrig = new AliMUONLocalTrigger(localtr, fDigitNumbers[icirc]);
1588 fMUONData->AddLocalTrigger(*pLocTrig); // add a local trigger in the list
1593 //_______________________________________________________________________
1594 void AliMUONTriggerDecisionV1::ClearDigitNumbers()
1596 // Clears the fDigitNumbers arrays so that they are all empty.
1598 for (Int_t i = 0; i < AliMUONConstants::NTriggerCircuit(); i++)
1600 fDigitNumbers[i].Set(0);
1604 //_______________________________________________________________________
1605 void AliMUONTriggerDecisionV1::DigitFiredCircuit(Int_t circuit, Int_t cathode,
1606 Int_t chamber, Int_t digit)
1608 // Registers that the specified digit fired the specified circuit.
1609 // This digit gets added to an array which will be copied to
1610 // AliMUONLocalTrigger when such an object is created for each circuit.
1612 Int_t digitnumber = AliMUONLocalTrigger::EncodeDigitNumber(chamber, cathode, digit);
1613 Int_t last = fDigitNumbers[circuit].GetSize();
1614 fDigitNumbers[circuit].Set(last + 1);
1615 fDigitNumbers[circuit][last] = digitnumber;