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 **************************************************************************/
17 Revision 1.4 2000/07/03 11:54:57 morsch
18 AliMUONSegmentation and AliMUONHitMap have been replaced by AliSegmentation and AliHitMap in STEER
19 The methods GetPadIxy and GetPadXxy of AliMUONSegmentation have changed name to GetPadI and GetPadC.
21 Revision 1.3 2000/06/25 17:02:19 pcrochet
22 scope problem on HP, i declared once, pow replaced by TMath::Power (PH)
24 Revision 1.2 2000/06/15 07:58:49 morsch
25 Code from MUON-dev joined
27 Revision 1.1.2.8 2000/06/14 14:54:34 morsch
28 Complete redesign, make use of TriggerCircuit and TriggerLut (PC)
30 Revision 1.1.2.5 2000/04/26 19:59:57 morsch
33 Revision 1.1.2.4 2000/04/26 12:31:30 morsch
34 Modifications by P. Crochet:
35 - adapted to the new Trigger chamber geometry
36 - condition on soft background added
37 - contructor added in AliMUONTriggerDecision.h
38 - single-undefined taken into account in the output of GlobalTrigger()
41 Revision 1.1.2.3 2000/03/21 09:29:58 morsch
44 Revision 1.1.2.2 2000/03/21 09:24:34 morsch
45 Author and responsible for the code: Philippe Crochet
48 #include "AliMUONTriggerCircuit.h"
49 #include "AliMUONTriggerDecision.h"
50 #include "AliMUONTriggerLut.h"
51 #include "AliMUONHitMapA1.h"
54 #include "AliMUONPoints.h"
55 #include "AliSegmentation.h"
56 #include "AliMUONResponse.h"
57 #include "AliMUONChamber.h"
58 #include "AliMUONDigit.h"
67 #include <TPostScript.h>
71 //----------------------------------------------------------------------
72 ClassImp(AliMUONTriggerDecision)
74 //----------------------------------------------------------------------
75 AliMUONTriggerDecision::AliMUONTriggerDecision(Int_t iprint)
78 fDebug = iprint; // print option
79 // iprint = 0 : don't print anything
80 // iprint = 1 : print Global Trigger Output
81 // iprint = 2 : print Local and Global Trigger Outputs
82 // iprint = 3 : iprint = 2 + detailed info on X strips
83 // iprint = 4 : iprint = 2 + detailed info on Y strip
84 // iprint = 5 : iprint = 2 + detailed info on X and Y strips
85 // Note : with iprint>2, the strips detailed info is given for all circuits
87 // Global Trigger information
92 for (i=0; i<3; i++) { // [0] : Low pt, [1] : High pt, [2] : All pt
93 fGlobalSinglePlus[i]=0; // tot num of single plus
94 fGlobalSingleMinus[i]=0; // tot num of single minus
95 fGlobalSingleUndef[i]=0; // tot num of single undefined
96 fGlobalPairUnlike[i]=0; // tot num of unlike-sign pairs
97 fGlobalPairLike[i]=0; // tot num of like-sign pairs
99 // Local Trigger information
100 for (icirc=0; icirc<234; icirc++){
101 fTrigger[icirc]=0; // trigger or not
102 fStripX11[icirc]=0; // X strip in MC11 which triggers
103 fDev[icirc]=0; // deviation which triggers
104 fStripY11[icirc]=0; // Y strip in MC11 which triggers
105 for (i=0; i<2; i++) { // pt information via LuT
106 fLutLpt[icirc][i]=fLutHpt[icirc][i]=fLutApt[icirc][i]=0;
110 for (icirc=0; icirc<234; icirc++) {
111 for (istrip=0; istrip<16; istrip++) {
112 fXbit11[icirc][istrip]=fXbit12[icirc][istrip]=0;
113 fYbit11[icirc][istrip]=fYbit12[icirc][istrip]=0;
114 fYbit21[icirc][istrip]=fYbit22[icirc][istrip]=0;
115 fYbit21U[icirc][istrip]=fYbit22U[icirc][istrip]=0;
116 fYbit21D[icirc][istrip]=fYbit22D[icirc][istrip]=0;
118 for (istrip=0; istrip<32; istrip++) {
119 fXbit21[icirc][istrip]=fXbit22[icirc][istrip]=0;
124 //----------------------------------------------------------------------
125 AliMUONTriggerDecision::~AliMUONTriggerDecision()
130 //----------------------------------------------------------------------
131 void AliMUONTriggerDecision::Trigger(){
132 // main method of the class which calls the overall Trigger procedure
133 // cout << " In AliMUONTriggerDecision::Trigger " << "\n";
139 Int_t coinc44=0, resetMid=0; // initialize coincidence
141 AliMUON *pMUON = (AliMUON*)gAlice->GetModule("MUON");
142 AliMUONTriggerCircuit* triggerCircuit;
144 for (Int_t icirc=0; icirc<234; icirc++) { // loop on circuits
145 triggerCircuit = &(pMUON->TriggerCircuit(icirc));
146 // Int_t idCircuit=triggerCircuit->GetIdCircuit();
148 Int_t minDevStrip[5], minDev[5], coordY[5];
149 for (Int_t i=0; i<5; i++) {
150 minDevStrip[i]=minDev[i]=coordY[i]=0;
152 Int_t x2m=triggerCircuit->GetX2m();
153 Int_t x2ud=triggerCircuit->GetX2ud();
154 Int_t orMud[2]={0,0};
155 triggerCircuit->GetOrMud(orMud);
158 TrigX(fXbit11[icirc],fXbit12[icirc],fXbit21[icirc],fXbit22[icirc],
159 coinc44, minDevStrip, minDev);
161 TrigY(fYbit11[icirc],fYbit12[icirc],fYbit21[icirc],fYbit22[icirc],
162 fYbit21U[icirc],fYbit21D[icirc],fYbit22U[icirc],fYbit22D[icirc],
163 x2m,x2ud,orMud,resetMid,coinc44,coordY);
166 LocalTrigger(icirc, minDevStrip, minDev, coordY, iTrigger);
168 if (iTrigger==1&&fDebug>1) {
169 PrintBitPatXInput(icirc);
170 PrintBitPatYInput(icirc);
171 PrintLocalOutput(minDevStrip, minDev, coordY);
173 } // end loop on circuits
175 // call Global Trigger
177 // cout << " Leaving AliMUONTriggerDecision::Trigger " << "\n";
180 //----------------------------------------------------------------------
181 void AliMUONTriggerDecision::ResetBit(){
182 // reset bit pattern, global and local trigger output tables to 0
188 for (icirc=0; icirc<234; icirc++) {
189 for (istrip=0; istrip<16; istrip++) {
190 fXbit11[icirc][istrip]=fXbit12[icirc][istrip]=0;
191 fYbit11[icirc][istrip]=fYbit12[icirc][istrip]=0;
192 fYbit21[icirc][istrip]=fYbit22[icirc][istrip]=0;
193 fYbit21U[icirc][istrip]=fYbit22U[icirc][istrip]=0;
194 fYbit21D[icirc][istrip]=fYbit22D[icirc][istrip]=0;
196 for (istrip=0; istrip<32; istrip++) {
197 fXbit21[icirc][istrip]=fXbit22[icirc][istrip]=0;
200 for (i=0; i<3; i++) {
201 fGlobalSinglePlus[i]=0;
202 fGlobalSingleMinus[i]=0;
203 fGlobalSingleUndef[i]=0;
204 fGlobalPairLike[i]=0;
205 fGlobalPairLike[i]=0;
207 for (icirc=0; icirc<234; icirc++){
212 for (i=0; i<2; i++) {
213 fLutLpt[icirc][i]=fLutHpt[icirc][i]=fLutApt[icirc][i]=0;
218 //----------------------------------------------------------------------
219 void AliMUONTriggerDecision::SetBit(){
220 // 1) loop over chambers and cathodes
222 // 3) remove soft background
223 // 4) set the bit patterns
225 AliMUON *pMUON = (AliMUON*)gAlice->GetModule("MUON");
226 AliMUONTriggerCircuit* triggerCircuit;
228 for (Int_t chamber=11; chamber<15; chamber++){
229 for (Int_t cathode=1; cathode<3; cathode++){
231 AliMUONChamber* iChamber;
232 AliSegmentation* segmentation;
234 TClonesArray *muonDigits = pMUON->DigitsAddress(chamber-1);
235 if (muonDigits == 0) return;
237 gAlice->ResetDigits();
239 Int_t nent=(Int_t)gAlice->TreeD()->GetEntries();
240 gAlice->TreeD()->GetEvent(nent-2+cathode-1);
241 Int_t ndigits = muonDigits->GetEntriesFast();
242 if (ndigits == 0) return;
244 iChamber = &(pMUON->Chamber(chamber-1));
245 segmentation=iChamber->SegmentationModel(cathode);
248 for (Int_t digit=0; digit<ndigits; digit++) {
249 mdig = (AliMUONDigit*)muonDigits->UncheckedAt(digit);
250 // get the center of the pad Id
251 Int_t ix=mdig->fPadX;
252 Int_t iy=mdig->fPadY;
253 // get the sum of the coded charge
254 // see coding convention in AliMUONChamberTrigger::DisIntegration
256 for (Int_t icharge=0; icharge<10; icharge++) {
257 sumCharge=sumCharge+mdig->fTcharges[icharge];
259 // apply condition on soft background
260 Int_t testCharge=sumCharge-(Int_t(sumCharge/10))*10;
261 testCharge=sumCharge-testCharge*10;
262 if(sumCharge<=10||testCharge>0) {
264 Int_t code=TMath::Abs(ix)*100+iy;
265 if (ix<0) { code=-code; }
275 for (icirc=0; icirc<234; icirc++) {
276 triggerCircuit = &(pMUON->TriggerCircuit(icirc));
277 for (istrip=0; istrip<16; istrip++) {
278 if (triggerCircuit->GetXcode(0,istrip)==code)
279 fXbit11[icirc][istrip]=1;
284 for (icirc=0; icirc<234; icirc++) {
285 triggerCircuit = &(pMUON->TriggerCircuit(icirc));
286 for (istrip=0; istrip<16; istrip++) {
287 if (triggerCircuit->GetXcode(1,istrip)==code)
288 fXbit12[icirc][istrip]=1;
293 for (icirc=0; icirc<234; icirc++) {
294 triggerCircuit = &(pMUON->TriggerCircuit(icirc));
295 for (istrip=0; istrip<32; istrip++) {
296 if (triggerCircuit->GetXcode(2,istrip)==code)
297 fXbit21[icirc][istrip]=1;
302 for (icirc=0; icirc<234; icirc++) {
303 triggerCircuit = &(pMUON->TriggerCircuit(icirc));
304 for (istrip=0; istrip<32; istrip++) {
305 if (triggerCircuit->GetXcode(3,istrip)==code)
306 fXbit22[icirc][istrip]=1;
316 for (icirc=0; icirc<234; icirc++) {
317 triggerCircuit = &(pMUON->TriggerCircuit(icirc));
318 nStrip=triggerCircuit->GetNstripY();
319 for (istrip=0; istrip<nStrip; istrip++) {
320 if (triggerCircuit->GetYcode(0,istrip)==code)
321 fYbit11[icirc][istrip]=1;
326 for (icirc=0; icirc<234; icirc++) {
327 triggerCircuit = &(pMUON->TriggerCircuit(icirc));
328 nStrip=triggerCircuit->GetNstripY();
329 for (istrip=0; istrip<nStrip; istrip++) {
330 if (triggerCircuit->GetYcode(1,istrip)==code)
331 fYbit12[icirc][istrip]=1;
336 for (icirc=0; icirc<234; icirc++) {
337 triggerCircuit = &(pMUON->TriggerCircuit(icirc));
338 nStrip=triggerCircuit->GetNstripY();
339 for (istrip=0; istrip<nStrip; istrip++) {
340 if (triggerCircuit->GetYcode(2,istrip)==code)
341 fYbit21[icirc][istrip]=1;
346 for (icirc=0; icirc<234; icirc++) {
347 triggerCircuit = &(pMUON->TriggerCircuit(icirc));
348 nStrip=triggerCircuit->GetNstripY();
349 for (istrip=0; istrip<nStrip; istrip++) {
350 if (triggerCircuit->GetYcode(3,istrip)==code)
351 fYbit22[icirc][istrip]=1;
357 } // remove soft background
358 } // end loop on digit
359 } // end loop on cathode
360 } // end loop on chamber
363 //----------------------------------------------------------------------
364 void AliMUONTriggerDecision::SetBitUpDownY(){
365 // Set Y bit for up and down parts of circuits
366 Int_t idModule, nStripX, nStripY, iPosCircuit;
368 AliMUON *pMUON = (AliMUON*)gAlice->GetModule("MUON");
370 for (Int_t icirc=0; icirc<234; icirc++) {
372 AliMUONTriggerCircuit* circuit; // current circuit
373 AliMUONTriggerCircuit* circuitD; // circuit Down
374 AliMUONTriggerCircuit* circuitU; // circuit Up
376 circuit = &(pMUON->TriggerCircuit(icirc));
377 idModule=circuit->GetIdModule(); // corresponding module Id.
378 nStripX=circuit->GetNstripX(); // number of X strips
379 nStripY=circuit->GetNstripY(); // number of Y strips
380 iPosCircuit=circuit->GetPosCircuit(); // position of circuit in module
383 if (iPosCircuit==1) { // need to scan lower module
384 if(idModule<91&&TMath::Abs(idModule)!=41&&idModule>-91) {
385 Int_t icircD=circuit->GetICircuitD();
386 circuitD = &(pMUON->TriggerCircuit(icircD));
387 Int_t nStripD=circuitD->GetNstripY();
389 if (TMath::Abs(idModule)==42) { // shift of +8 bits
390 for (Int_t istrip=0; istrip<nStripD; istrip++) {
391 fYbit21D[icirc][istrip+8]=fYbit21[icircD][istrip];
392 fYbit22D[icirc][istrip+8]=fYbit22[icircD][istrip];
394 } else if (TMath::Abs(idModule)==52) { // shift of -8 bits
395 for (Int_t istrip=0; istrip<nStripD; istrip++) {
396 fYbit21D[icirc][istrip]=fYbit21[icircD][istrip+8];
397 fYbit22D[icirc][istrip]=fYbit22[icircD][istrip+8];
400 for (Int_t istrip=0; istrip<nStripD; istrip++) {
401 fYbit21D[icirc][istrip]=fYbit21[icircD][istrip];
402 fYbit22D[icirc][istrip]=fYbit22[icircD][istrip];
406 } else { // lower strips within same module
407 for (Int_t istrip=0; istrip<nStripY; istrip++) {
408 fYbit21D[icirc][istrip]=fYbit21[icirc][istrip];
409 fYbit22D[icirc][istrip]=fYbit22[icirc][istrip];
414 if ((iPosCircuit==1&&nStripX==16)||(iPosCircuit==2&&nStripX==32)||
415 (iPosCircuit==3&&nStripX==48)||(iPosCircuit==4&&nStripX==64)) {
416 if ((idModule>17||idModule<-17)&&TMath::Abs(idModule)!=61) {
417 Int_t icircU=circuit->GetICircuitU();
418 circuitU = &(pMUON->TriggerCircuit(icircU));
419 Int_t nStripU=circuitU->GetNstripY();
421 if (TMath::Abs(idModule)==62) { // shift of +8 bits
422 for (Int_t istrip=0; istrip<nStripU; istrip++) {
423 fYbit21U[icirc][istrip+8]=fYbit21[icircU][istrip];
424 fYbit22U[icirc][istrip+8]=fYbit22[icircU][istrip];
426 } else if (TMath::Abs(idModule)==52) { // shift of -8 bits
427 for (Int_t istrip=0; istrip<nStripU; istrip++) {
428 fYbit21U[icirc][istrip]=fYbit21[icircU][istrip+8];
429 fYbit22U[icirc][istrip]=fYbit22[icircU][istrip+8];
432 for (Int_t istrip=0; istrip<nStripU; istrip++) {
433 fYbit21U[icirc][istrip]=fYbit21[icircU][istrip];
434 fYbit22U[icirc][istrip]=fYbit22[icircU][istrip];
438 } else { // upper strips within same module
439 for (Int_t istrip=0; istrip<nStripY; istrip++) {
440 fYbit21U[icirc][istrip]=fYbit21[icirc][istrip];
441 fYbit22U[icirc][istrip]=fYbit22[icirc][istrip];
447 //----------------------------------------------------------------------
448 // x part of trigger Algo
449 //----------------------------------------------------------------------
450 //----------------------------------------------------------------------
451 void AliMUONTriggerDecision::TrigX(Int_t ch1q[16], Int_t ch2q[16],
452 Int_t ch3q[32], Int_t ch4q[32],
453 Int_t coinc44, Int_t minDevStrip[5],
455 // note : coinc44 = flag 0 or 1 (0 coincidence -> 3/4, 1 coincidence -> 4/4)
456 //---------------------------------------------------------
457 // step # 1 : declustering, reduction DS, calculate sgle & dble
458 //---------------------------------------------------------
459 Int_t ch1e[19], ch2e[20], ch3e[35], ch4e[36];
460 Int_t sgleHit1[31], sgleHit2[63];
461 Int_t dbleHit1[31], dbleHit2[63];
467 for (i=0; i<31; i++) {
471 for (i=0; i<63; i++) {
476 //--- inititialize che using chq
477 for (i=0; i<19; i++) {
478 if (i<1||i>16) ch1e[i]=0;
479 else ch1e[i]=ch1q[i-1];
481 for (i=0; i<20; i++) {
482 if (i<2||i>17) ch2e[i]=0;
483 else ch2e[i]=ch2q[i-2];
485 for (i=0; i<35; i++) {
486 if (i<1||i>32) ch3e[i]=0;
487 else ch3e[i]=ch3q[i-1];
489 for (i=0; i<36; i++) {
490 if (i<2||i>33) ch4e[i]=0;
491 else ch4e[i]=ch4q[i-2];
495 //--- calculate dble & sgle first station
496 for (i=0; i<=15; i++) {
497 sgleHit1[2*i] = (!ch1e[i+1]|(ch1e[i]^ch1e[i+2])) &
498 (!ch2e[i+2] | (ch2e[i+1]^ch2e[i+3]));
500 dbleHit1[2*i] = ch1e[i+1]&!(ch1e[i+2]^ch1e[i]) &
501 (ch2e[i+2] | (!ch2e[i]&ch2e[i+1]) | (ch2e[i+3]&!ch2e[i+4]));
504 for (i=0; i<=14; i++) {
505 sgleHit1[2*i+1] = (!ch1e[i+1]|!ch1e[i+2]|(ch1e[i]^ch1e[i+3])) &
506 (!ch2e[i+2] | !ch2e[i+3] | (ch2e[i+1]^ch2e[i+4]));
507 dbleHit1[2*i+1] = ch1e[i+1]&ch1e[i+2]&!(ch1e[i]^ch1e[i+3]) &
508 (ch2e[i+2]&(!ch2e[i+1]|!ch2e[i]) |
509 ch2e[i+3]&(ch2e[i+2]|!ch2e[i+4]|!ch2e[i+5]));
512 //--- calculate dble & sgle second station
513 for (i=0; i<=31; i++) {
514 sgleHit2[2*i] = (!ch3e[i+1]|(ch3e[i]^ch3e[i+2])) &
515 (!ch4e[i+2] | (ch4e[i+1]^ch4e[i+3]));
516 dbleHit2[2*i] = ch3e[i+1]&!(ch3e[i+2]^ch3e[i]) &
517 (ch4e[i+2] | (!ch4e[i]&ch4e[i+1]) | (ch4e[i+3]&!ch4e[i+4]));
520 for (i=0; i<=30; i++) {
521 sgleHit2[2*i+1] = (!ch3e[i+1]|!ch3e[i+2]|(ch3e[i]^ch3e[i+3])) &
522 (!ch4e[i+2] | !ch4e[i+3] | (ch4e[i+1]^ch4e[i+4]));
523 dbleHit2[2*i+1] = ch3e[i+1]&ch3e[i+2]&!(ch3e[i]^ch3e[i+3]) &
524 (ch4e[i+2]&(!ch4e[i+1]|!ch4e[i]) |
525 ch4e[i+3]&(ch4e[i+2]|!ch4e[i+4]|!ch4e[i+5]));
529 if(fDebug==3||fDebug==5) {
530 cout << "===============================================================" << "\n";
531 cout << " X plane after sgle and dble " << " \n";
532 cout << " 0987654321098765432109876543210";
534 for (istrip=30; istrip>=0; istrip--) { cout << (!sgleHit1[istrip]); }
536 for (istrip=30; istrip>=0; istrip--) { cout << dbleHit1[istrip]; }
538 for (istrip=62; istrip>=0; istrip--) { cout << (!sgleHit2[istrip]); }
540 for (istrip=62; istrip>=0; istrip--) { cout << dbleHit2[istrip]; }
541 cout << "\n 210987654321098765432109876543210987654321098765432109876543210" << "\n";
544 //---------------------------------------------------------
545 // step # 2 : coincidence 3/4
546 //---------------------------------------------------------
547 Int_t rearImage[31][31];
548 for (i=0; i<31; i++) {
549 for (j=0; j<31; j++) {
554 Int_t notOr1=!dbleHit1[30] & !dbleHit1[29] & !dbleHit1[28] & !dbleHit1[27] &
555 !dbleHit1[26] & !dbleHit1[25] & !dbleHit1[24] & !dbleHit1[23] &
556 !dbleHit1[22] & !dbleHit1[21] & !dbleHit1[20] & !dbleHit1[19] &
557 !dbleHit1[18] & !dbleHit1[17] & !dbleHit1[16] & !dbleHit1[15] &
558 !dbleHit1[14] & !dbleHit1[13] & !dbleHit1[12] & !dbleHit1[11] &
559 !dbleHit1[10] & !dbleHit1[9] & !dbleHit1[8] & !dbleHit1[7] &
560 !dbleHit1[6] & !dbleHit1[5] & !dbleHit1[4] & !dbleHit1[3] &
561 !dbleHit1[2] & !dbleHit1[1] & !dbleHit1[0] & !coinc44;
563 Int_t notOr2= !dbleHit2[62] & !dbleHit2[61] & !dbleHit2[60] & !dbleHit2[59] &
564 !dbleHit2[58] & !dbleHit2[57] & !dbleHit2[56] & !dbleHit2[55] &
565 !dbleHit2[54] & !dbleHit2[53] & !dbleHit2[52] & !dbleHit2[51] &
566 !dbleHit2[50] & !dbleHit2[49] & !dbleHit2[48] & !dbleHit2[47] &
567 !dbleHit2[46] & !dbleHit2[45] & !dbleHit2[44] & !dbleHit2[43] &
568 !dbleHit2[42] & !dbleHit2[41] & !dbleHit2[40] & !dbleHit2[39] &
569 !dbleHit2[38] & !dbleHit2[37] & !dbleHit2[36] & !dbleHit2[35] &
570 !dbleHit2[34] & !dbleHit2[33] & !dbleHit2[32] & !dbleHit2[31] &
571 !dbleHit2[30] & !dbleHit2[29] & !dbleHit2[28] & !dbleHit2[27] &
572 !dbleHit2[26] & !dbleHit2[25] & !dbleHit2[24] & !dbleHit2[23] &
573 !dbleHit2[22] & !dbleHit2[21] & !dbleHit2[20] & !dbleHit2[19] &
574 !dbleHit2[18] & !dbleHit2[17] & !dbleHit2[16] & !dbleHit2[15] &
575 !dbleHit2[14] & !dbleHit2[13] & !dbleHit2[12] & !dbleHit2[11] &
576 !dbleHit2[10] & !dbleHit2[9] & !dbleHit2[8] & !dbleHit2[7] &
577 !dbleHit2[6] & !dbleHit2[5] & !dbleHit2[4] & !dbleHit2[3] &
578 !dbleHit2[2] & !dbleHit2[1] & !dbleHit2[0] & !coinc44;
581 for (i=0; i<31; i++) {
582 sgleHit1[i] = !sgleHit1[i]¬Or1;
584 for (i=0; i<63; i++) {
585 sgleHit2[i] = !sgleHit2[i]¬Or2;
589 for (i=0; i<31; i++){
590 Int_t tmpSgleHit2[31];
591 Int_t tmpDbleHit2[31];
592 for (j=0; j<31; j++){
593 tmpSgleHit2[j] = sgleHit2[i+j+1];
594 tmpDbleHit2[j] = dbleHit2[i+j+1];
597 for (Int_t k=0; k<31; k++) {
598 rearImage[i][k]=(sgleHit1[i]&tmpDbleHit2[k])|
599 (dbleHit1[i]&(tmpSgleHit2[k]|tmpDbleHit2[k]));
604 if(fDebug==3||fDebug==5) {
605 cout << "===============================================================" << "\n";
606 for (i=30; i>=0; i--) {
608 for (istrip=31; istrip>=0; istrip--) {
609 cout << rearImage[i][istrip];
616 //---------------------------------------------------------
617 // step # 3 : calculate deviation
618 //---------------------------------------------------------
620 for (i=0; i<31; i++) {
621 for (j=0; j<6; j++) {
626 for (i=0; i<31; i++){
627 Int_t leftDev[5], rightDev[5];
628 Int_t orL1, andL1, andL2, orR1, orR2, andR1, andR2, andR3;
630 // calculate Left deviation
631 orL1=rearImage[i][16]|rearImage[i][18]|rearImage[i][20]|rearImage[i][22];
632 andL1=!rearImage[i][17]&!rearImage[i][19]&!rearImage[i][21] & !orL1;
633 andL2=!rearImage[i][23]&!rearImage[i][24]&!rearImage[i][25]&!rearImage[i][26];
635 leftDev[0] = (rearImage[i][16]|!rearImage[i][17]) &
636 (rearImage[i][16]|rearImage[i][18]|!rearImage[i][19]&
637 (rearImage[i][20]|!rearImage[i][21])) &
638 (orL1|!rearImage[i][23]&(rearImage[i][24]|!rearImage[i][25])) &
639 (orL1|rearImage[i][24]|rearImage[i][26]|!rearImage[i][27]&
640 (rearImage[i][28]|!rearImage[i][29]));
642 leftDev[1] = !rearImage[i][16] &
643 !(!rearImage[i][17]&!rearImage[i][18]&!rearImage[i][21]&!rearImage[i][22] &
644 (!rearImage[i][25]&!rearImage[i][26]&(rearImage[i][27]|rearImage[i][28]))) &
645 (rearImage[i][17]|rearImage[i][18] | !rearImage[i][19]&!rearImage[i][20]) &
646 (rearImage[i][17]|rearImage[i][18]|rearImage[i][21]|rearImage[i][22] |
647 !rearImage[i][23]&!rearImage[i][24]);
649 leftDev[2] = (!rearImage[i][16]&!rearImage[i][17]&!rearImage[i][18]) &
650 (rearImage[i][19]|rearImage[i][20]|rearImage[i][21]|rearImage[i][22] | andL2);
655 !rearImage[i][27]&!rearImage[i][28]&!rearImage[i][29]&!rearImage[i][30] &
658 // calculate Right deviation
659 orR1=rearImage[i][8]|rearImage[i][10]|rearImage[i][12]|rearImage[i][14];
660 orR2=rearImage[i][8]|rearImage[i][9]|rearImage[i][10]|rearImage[i][11];
661 andR1=!rearImage[i][12]&!rearImage[i][13]&!rearImage[i][14]&!rearImage[i][15];
663 !rearImage[i][8]&!rearImage[i][9]&!rearImage[i][10]&!rearImage[i][11] & andR1;
664 andR3=!rearImage[i][4]&!rearImage[i][5]&!rearImage[i][6]&!rearImage[i][7];
666 rightDev[0] = !rearImage[i][15]&(rearImage[i][14]|!rearImage[i][13]) &
667 ((rearImage[i][12]|rearImage[i][14]|!rearImage[i][11]&
668 (rearImage[i][10]|!rearImage[i][9])) &
669 ((orR1|!rearImage[i][7]&(rearImage[i][6]|!rearImage[i][5])) &
670 (orR1|rearImage[i][4]|rearImage[i][6]|!rearImage[i][3]&(rearImage[i][2]|
671 !rearImage[i][1]))));
673 rightDev[1] = !rearImage[i][15]&!rearImage[i][14] &
674 !(!rearImage[i][4]&!rearImage[i][5]&!rearImage[i][8]&!rearImage[i][9] &
675 (!rearImage[i][12]&!rearImage[i][13]&(rearImage[i][2]|rearImage[i][3]))) &
676 (rearImage[i][12]|rearImage[i][13] | !rearImage[i][10]&!rearImage[i][11]) &
677 (rearImage[i][8]|rearImage[i][9]|rearImage[i][12]|rearImage[i][13] |
678 !rearImage[i][6]&!rearImage[i][7]);
680 rightDev[2] = andR1 & (orR2 | andR3);
683 !rearImage[i][0]&!rearImage[i][1]&!rearImage[i][2]&!rearImage[i][3] &
686 // compare Left & Right deviations
687 Int_t tmpLeftDev=0, tmpRightDev=0;
689 tmpLeftDev = tmpLeftDev + Int_t(leftDev[j]*TMath::Power(2,j));
690 tmpRightDev = tmpRightDev + Int_t(rightDev[j]*TMath::Power(2,j));
693 // assign mimimum deviation do dev[][]
694 if (tmpLeftDev < tmpRightDev ){
695 for (j=0; j<5; j++){ dev[i][j]=leftDev[j];}
698 for (j=0; j<5; j++){ dev[i][j]=rightDev[j];}
704 if(fDebug==3||fDebug==5) {
705 cout << "===============================================================" << "\n";
706 for (i=30; i>=0; i--) {
708 for (istrip=5; istrip>=0; istrip--) { cout << dev[i][istrip]; }
713 //---------------------------------------------------------
714 // step # 4 : sort deviation
715 //---------------------------------------------------------
716 Int_t bga1[16], bga2[8], bga3[4], bga4[2], bga5;
717 Int_t tmpbga1[16][6], tmpbga2[8][6], tmpbga3[4][6], tmpbga4[2][6], tmpbga5[6];
718 Int_t tmpMax[6]={1,1,1,1,1,0};
720 for (i=0; i<15; i++) {
721 Sort2x5(dev[2*i],dev[2*i+1],tmpbga1[i],bga1[i]);
723 Sort2x5(dev[30],tmpMax,tmpbga1[15],bga1[15]);
726 if(fDebug==3||fDebug==5) {
727 cout << "===============================================================" << "\n";
728 cout << " sorting : 1st level " << "\n";
729 for (i=15; i>=0; i--) {
730 cout << i << "\t " << bga1[i] << "\t";
731 for (j=5; j>=0; j--) {
732 cout << tmpbga1[i][j];
738 for (i=0; i<8; i++) {
739 Sort2x5(tmpbga1[2*i],tmpbga1[2*i+1],tmpbga2[i],bga2[i]);
743 if(fDebug==3||fDebug==5) {
744 cout << "===============================================================" << "\n";
745 cout << " sorting : 2nd level " << "\n";
746 for (i=7; i>=0; i--) {
747 cout << i << "\t " << bga2[i] << "\t";
748 for (j=5; j>=0; j--) {
749 cout << tmpbga2[i][j];
755 for (i=0; i<4; i++) {
756 Sort2x5(tmpbga2[2*i],tmpbga2[2*i+1],tmpbga3[i],bga3[i]);
760 if(fDebug==3||fDebug==5) {
761 cout << "===============================================================" << "\n";
762 cout << " sorting : 3rd level " << "\n";
763 for (i=3; i>=0; i--) {
764 cout << i << "\t " << bga3[i] << "\t";
765 for (j=5; j>=0; j--) {
766 cout << tmpbga3[i][j];
772 for (i=0; i<2; i++) {
773 Sort2x5(tmpbga3[2*i],tmpbga3[2*i+1],tmpbga4[i],bga4[i]);
777 if(fDebug==3||fDebug==5) {
778 cout << "===============================================================" << "\n";
779 cout << " sorting : 4th level " << "\n";
780 for (i=1; i>=0; i--) {
781 cout << i << "\t " << bga4[i] << "\t";
782 for (j=5; j>=0; j--) {
783 cout << tmpbga4[i][j];
789 Sort2x5(tmpbga4[0],tmpbga4[1],tmpbga5,bga5);
791 // coding from 6 to 5 bits
792 minDev[4] = tmpbga5[5] | tmpbga5[4];
793 for (i=0; i<4; i++) {
794 minDev[i]=tmpbga5[i] & !tmpbga5[4];
797 // find address of strip with minimum deviation
799 if (bga5<=1) minDevStrip[3]=bga4[bga5];
801 Int_t tmpAd=minDevStrip[3]+minDevStrip[4]*2;
802 if (tmpAd<=3) minDevStrip[2]=bga3[tmpAd];
804 tmpAd=minDevStrip[2]+minDevStrip[3]*2+minDevStrip[4]*4;
805 if (tmpAd<=7) minDevStrip[1]=bga2[tmpAd];
807 tmpAd=minDevStrip[1]+minDevStrip[2]*2+minDevStrip[3]*4+minDevStrip[4]*8;
808 if (tmpAd<=15) minDevStrip[0]=bga1[tmpAd];
810 if(fDebug==3||fDebug==5) {
811 cout << "===============================================================" << "\n";
812 cout << "minDevStrip = ";
813 for (i=4; i>=0; i--) {cout << minDevStrip[i];}
814 cout << " minDev = ";
815 for (i=4; i>=0; i--) {cout << minDev[i];}
817 cout << "===============================================================" << "\n";
822 //---------------------------------------------
823 void AliMUONTriggerDecision::Sort2x5(Int_t dev1[6], Int_t dev2[6],
824 Int_t minDev[6], Int_t &dev1GTdev2){
825 // returns minimun between dev1 and dev2
826 Int_t tmpDev1=0, tmpDev2=0;
827 for (Int_t j=0; j<5; j++){
828 tmpDev1 = tmpDev1 + Int_t(dev1[j]*TMath::Power(2,j));
829 tmpDev2 = tmpDev2 + Int_t(dev2[j]*TMath::Power(2,j));
831 if (tmpDev1 <= tmpDev2 ){
832 for (Int_t j=0; j<=5; j++) { minDev[j]=dev1[j];}
835 for (Int_t j=0; j<=5; j++) { minDev[j]=dev2[j];}
840 //----------------------------------------------------------------------
841 // y part of trigger Algo
842 //----------------------------------------------------------------------
843 //----------------------------------------------------------------------
844 void AliMUONTriggerDecision::TrigY(Int_t y1[16], Int_t y2[16],
845 Int_t y3[16], Int_t y4[16],
846 Int_t y3u[16], Int_t y3d[16],
847 Int_t y4u[16], Int_t y4d[16],
848 Int_t x2m, Int_t x2ud, Int_t orMud[2],
849 Int_t resetMid, Int_t coinc44,
851 // note : resMid = 1 -> cancel
852 //---------------------------------------------------------
853 // step # 1 : prehandling Y
854 //---------------------------------------------------------
858 for (i=0; i<16; i++){
859 y3[i]=y3[i]&!resetMid;
860 y4[i]=y4[i]&!resetMid;
863 Int_t ch1[16], ch2[16], ch3[16], ch4[16];
865 Int_t tmpy3to16[16], tmpy4to16[16];
866 Int_t tmpy3uto16[16], tmpy3dto16[16], tmpy4uto16[16], tmpy4dto16[16];
868 ch1[2*i] = y1[i]&x2m | y1[2*i]&!x2m;
869 ch1[2*i+1] = y1[i]&x2m | y1[2*i+1]&!x2m;
871 ch2[2*i] = y2[i]&x2m | y2[2*i]&!x2m;
872 ch2[2*i+1] = y2[i]&x2m | y2[2*i+1]&!x2m;
874 tmpy3to16[2*i] = y3[i]&x2m | y3[2*i]&!x2m;
875 tmpy3to16[2*i+1] = y3[i]&x2m | y3[2*i+1]&!x2m;
877 tmpy4to16[2*i] = y4[i]&x2m | y4[2*i]&!x2m;
878 tmpy4to16[2*i+1] = y4[i]&x2m | y4[2*i+1]&!x2m;
880 tmpy3uto16[2*i] = y3u[i]&x2ud | y3u[2*i]&!x2ud;
881 tmpy3uto16[2*i+1] = y3u[i]&x2ud | y3u[2*i+1]&!x2ud;
883 tmpy4uto16[2*i] = y4u[i]&x2ud | y4u[2*i]&!x2ud;
884 tmpy4uto16[2*i+1] = y4u[i]&x2ud | y4u[2*i+1]&!x2ud;
886 tmpy3dto16[2*i] = y3d[i]&x2ud | y3d[2*i]&!x2ud;
887 tmpy3dto16[2*i+1] = y3d[i]&x2ud | y3d[2*i+1]&!x2ud;
889 tmpy4dto16[2*i] = y4d[i]&x2ud | y4d[2*i]&!x2ud;
890 tmpy4dto16[2*i+1] = y4d[i]&x2ud | y4d[2*i+1]&!x2ud;
893 if (orMud[0]==0&&orMud[1]==0){
894 for (i=0; i<16; i++){
895 ch3[i] = tmpy3to16[i];
896 ch4[i] = tmpy4to16[i];
899 if (orMud[0]==0&&orMud[1]==1){
900 for (i=0; i<16; i++){
901 ch3[i] = tmpy3uto16[i]|tmpy3to16[i];
902 ch4[i] = tmpy4uto16[i]|tmpy4to16[i];
905 if (orMud[0]==1&&orMud[1]==0){
906 for (i=0; i<16; i++){
907 ch3[i] = tmpy3dto16[i]|tmpy3to16[i];
908 ch4[i] = tmpy4dto16[i]|tmpy4to16[i];
911 if (orMud[0]==1&&orMud[1]==1){
912 for (i=0; i<16; i++){
913 ch3[i] = tmpy3dto16[i]|tmpy3to16[i]|tmpy3uto16[i];
914 ch4[i] = tmpy4dto16[i]|tmpy4to16[i]|tmpy4uto16[i];
919 if(fDebug==4||fDebug==5) {
920 cout << "===============================================================" << "\n";
921 cout << " Y plane after PreHandling x2m x2ud orMud "
922 << x2m << " , " << x2ud << " , " << orMud[0] << orMud[1] << "\n";
924 for (istrip=15; istrip>=0; istrip--) {
925 if (istrip>9) cout << istrip-10*Int_t(istrip/10);
926 if (istrip<10) cout << istrip;
929 for (istrip=15; istrip>=0; istrip--) {
933 for (istrip=15; istrip>=0; istrip--) {
937 for (istrip=15; istrip>=0; istrip--) {
941 for (istrip=15; istrip>=0; istrip--) {
948 //---------------------------------------------------------
949 // step # 2 : calculate sgle and dble, apply DS reduction
950 //---------------------------------------------------------
951 Int_t sgle1[16], dble1[16];
952 Int_t sgle2[16], dble2[16];
954 // Calculate simple and double hits
955 for (i=0; i<16; i++) {
956 dble1[i] = ch1[i] & ch2[i];
957 dble2[i] = ch3[i] & ch4[i];
959 sgle1[i] = (ch1[i]|ch2[i]);
960 sgle2[i] = (ch3[i]|ch4[i]);
964 if(fDebug==4||fDebug==5) {
965 cout << "===============================================================" << "\n";
966 cout << " Y plane after sgle dble " << "\n";
968 for (istrip=15; istrip>=0; istrip--) {
969 if (istrip>9) { cout << istrip-10*Int_t(istrip/10);}
970 if (istrip<10) { cout << istrip;}
973 for (istrip=15; istrip>=0; istrip--) {
974 cout << sgle1[istrip];
977 for (istrip=15; istrip>=0; istrip--) {
978 cout << dble1[istrip];
981 for (istrip=15; istrip>=0; istrip--) {
982 cout << sgle2[istrip];
985 for (istrip=15; istrip>=0; istrip--) {
986 cout << dble2[istrip];
993 Int_t notOr1, notOr2;
995 notOr1=!dble1[15] & !dble1[14] & !dble1[13] & !dble1[12] &
996 !dble1[11] & !dble1[10] & !dble1[9] & !dble1[8] &
997 !dble1[7] & !dble1[6] & !dble1[5] & !dble1[4] &
998 !dble1[3] & !dble1[2] & !dble1[1] & !dble1[0];
1000 notOr2=!dble2[15] & !dble2[14] & !dble2[13] & !dble2[12] &
1001 !dble2[11] & !dble2[10] & !dble2[9] & !dble2[8] &
1002 !dble2[7] & !dble2[6] & !dble2[5] & !dble2[4] &
1003 !dble2[3] & !dble2[2] & !dble2[1] & !dble2[0];
1005 for (i=0; i<16; i++) {
1006 sgle1[i] = sgle1[i] & notOr1 & !coinc44;
1007 sgle2[i] = sgle2[i] & notOr2 & !coinc44;
1010 //---------------------------------------------------------
1011 // step # 3 : 3/4 coincidence
1012 //---------------------------------------------------------
1013 Int_t frontImage[16];
1015 for (i=1; i<15; i++) {
1016 frontImage[i] = (dble1[i] | sgle1[i]) &
1017 (dble2[i+1] | dble2[i] | dble2[i-1]) |
1018 dble1[i] & (sgle2[i+1] | sgle2[i] | sgle2[i-1]);
1020 frontImage[0] = (dble1[0] | sgle1[0]) &
1021 (dble2[1] | dble2[0]) | dble1[0] & (sgle2[1] | sgle2[0]);
1023 frontImage[15] = (dble1[15] | sgle1[15]) &
1024 (dble2[15] | dble2[14]) | dble1[15] & (sgle2[15] | sgle2[14]);
1028 if(fDebug==4||fDebug==5) {
1029 cout << "===============================================================" << "\n";
1030 cout << " Y plane frontImage\n";
1032 for (istrip=15; istrip>=0; istrip--) {
1033 if (istrip>9) cout << istrip-10*Int_t(istrip/10);
1034 if (istrip<10) cout << istrip;
1037 for (istrip=15; istrip>=0; istrip--) {
1038 cout << frontImage[istrip];
1044 //---------------------------------------------------------
1045 // step # 4 : Y position
1046 //---------------------------------------------------------
1047 Int_t or1, or2, and1, and2, and3;
1049 or1 = frontImage[7]|frontImage[5]|frontImage[3]|frontImage[1];
1050 or2 = frontImage[7]|frontImage[6]|frontImage[5]|frontImage[4];
1051 and1 = !frontImage[3]&!frontImage[2]&!frontImage[1]&!frontImage[0];
1052 and2 = !frontImage[7]&!frontImage[6]&!frontImage[5]&!frontImage[4] & and1;
1053 and3 = !frontImage[11]&!frontImage[10]&!frontImage[9]&!frontImage[8];
1055 coordY[0] = !frontImage[0]&(frontImage[1]|!frontImage[2]) &
1056 (frontImage[3]|frontImage[1]|!frontImage[4]&(frontImage[5]|!frontImage[6])) &
1057 (or1|!frontImage[8]&(frontImage[9]|!frontImage[10])) &
1058 (or1|frontImage[11]|frontImage[9]|!frontImage[12]&(frontImage[13]|!frontImage[14]));
1060 coordY[1] = !frontImage[0]&!frontImage[1] &
1061 !(!frontImage[11]&!frontImage[10]&!frontImage[7]&!frontImage[6] &
1062 !frontImage[3]&!frontImage[2]&(frontImage[13]|frontImage[12])) &
1063 (frontImage[3]|frontImage[2] | !frontImage[5]&!frontImage[4]) &
1064 (frontImage[7]|frontImage[6]|frontImage[3]|frontImage[2] |
1065 !frontImage[9]&!frontImage[8]);
1067 coordY[2] = and1 & (or2 | and3);
1071 coordY[4] = !frontImage[15]&!frontImage[14]&!frontImage[13]&!frontImage[12] &
1075 //----------------------------------------------------------------------
1076 // end of trigger Algo
1077 //----------------------------------------------------------------------
1079 //----------------------------------------------------------------------
1080 void AliMUONTriggerDecision::LocalTrigger(Int_t icirc,
1081 Int_t minDevStrip[5],
1082 Int_t minDev[5], Int_t coordY[5],
1084 // returns local trigger answer for circuit icirc
1087 AliMUON *pMUON = (AliMUON*)gAlice->GetModule("MUON");
1088 AliMUONTriggerCircuit* triggerCircuit;
1089 triggerCircuit = &(pMUON->TriggerCircuit(icirc));
1090 Int_t idCircuit=triggerCircuit->GetIdCircuit();
1092 Int_t signDev=minDev[4];
1094 for (i=0; i<4; i++) { // extract deviation
1095 deviation = deviation+Int_t(minDev[i]*TMath::Power(2,i));
1098 Int_t istripX1Circ=0;
1099 for (i=0; i<5; i++) { // extract X1 strip fired
1100 istripX1Circ = istripX1Circ+Int_t(minDevStrip[i]*TMath::Power(2,i));
1104 for (i=0; i<4; i++) { // extract Y strip fired
1105 iStripY = iStripY+Int_t(coordY[i]*TMath::Power(2,i));
1109 if (signDev==1&&deviation==0) { // something in X ?
1112 if (coordY[4]==1&&iStripY==15) { // something in Y ?
1120 // fill fTrigger fStripX11 fStripY11
1121 fTrigger[icirc] = 1;
1122 fStripX11[icirc] = istripX1Circ;
1123 fStripY11[icirc] = iStripY;
1125 // calculate deviation in [0+30]
1127 if (signDev==0&&deviation!=0) sign=-1;
1128 if (signDev==0&&deviation==0) sign=0;
1129 if (signDev==1) sign=1;
1130 fDev[icirc] = sign * deviation + 15; // fill fDev
1132 // get Lut output for circuit/istripX/idev/istripY
1133 AliMUONTriggerLut* lut = new AliMUONTriggerLut;
1134 // lut->StartEvent();
1135 lut->GetLutOutput(icirc,fStripX11[icirc],fDev[icirc],fStripY11[icirc],
1136 fLutLpt[icirc],fLutHpt[icirc],fLutApt[icirc]);
1137 // lut->FinishEvent();
1141 Float_t pt= // get ptCal corresponding to istripX1Circ/idev/iStripY
1142 triggerCircuit->PtCal(fStripX11[icirc],fDev[icirc],fStripY11[icirc]);
1143 cout << "-------------------------------------------" << "\n";
1144 cout << " Local Trigger info for circuit Id " << idCircuit
1145 << " (number " << icirc << ")" << "\n";
1146 cout << " istripX1 signDev deviation istripY = "
1147 << istripX1Circ << " , " << signDev
1148 << " , " << deviation << " , " << iStripY << "\n";
1149 cout << " pt = " << pt << " (GeV/c) " << "\n";
1150 cout << "-------------------------------------------" << "\n";
1151 cout << " Local Trigger Lut Output = Lpt : " ;
1152 for (i=1; i>=0; i--) { cout << fLutLpt[icirc][i] ; }
1154 for (i=1; i>=0; i--) { cout << fLutHpt[icirc][i] ; }
1156 for (i=1; i>=0; i--) { cout << fLutApt[icirc][i] ; }
1158 cout << "-------------------------------------------" << "\n";
1160 } // local trigger = 1
1163 //----------------------------------------------------------------------
1164 void AliMUONTriggerDecision::GlobalTrigger(){
1165 // loop on Lut[icirc] and give Global Trigger output
1168 for (Int_t icirc=0; icirc<234; icirc++){
1169 if (fLutLpt[icirc][0]==1&&fLutLpt[icirc][1]==1)
1170 fGlobalSingleUndef[0] = fGlobalSingleUndef[0] + 1;
1171 if (fLutHpt[icirc][0]==1&&fLutHpt[icirc][1]==1)
1172 fGlobalSingleUndef[1] = fGlobalSingleUndef[1] + 1;
1173 if (fLutApt[icirc][0]==1&&fLutApt[icirc][1]==1)
1174 fGlobalSingleUndef[2] = fGlobalSingleUndef[2] + 1;
1176 if (fLutLpt[icirc][0]==0&&fLutLpt[icirc][1]==1)
1177 fGlobalSinglePlus[0] = fGlobalSinglePlus[0] + 1;
1178 if (fLutHpt[icirc][0]==0&&fLutHpt[icirc][1]==1)
1179 fGlobalSinglePlus[1] = fGlobalSinglePlus[1] + 1;
1180 if (fLutApt[icirc][0]==0&&fLutApt[icirc][1]==1)
1181 fGlobalSinglePlus[2] = fGlobalSinglePlus[2] + 1;
1183 if (fLutLpt[icirc][0]==1&&fLutLpt[icirc][1]==0)
1184 fGlobalSingleMinus[0] = fGlobalSingleMinus[0] + 1;
1185 if (fLutHpt[icirc][0]==1&&fLutHpt[icirc][1]==0)
1186 fGlobalSingleMinus[1] = fGlobalSingleMinus[1] + 1;
1187 if (fLutApt[icirc][0]==1&&fLutApt[icirc][1]==0)
1188 fGlobalSingleMinus[2] = fGlobalSingleMinus[2] + 1;
1191 // like sign low, high and all pt
1192 for (i=0; i<3; i++) {
1193 fGlobalPairLike[i]=fGlobalSingleMinus[i]*(fGlobalSingleMinus[i]-1)/2 +
1194 fGlobalSinglePlus[i]*(fGlobalSinglePlus[i]-1)/2 +
1195 fGlobalSingleUndef[i]*(fGlobalSingleUndef[i]-1)/2 +
1196 fGlobalSingleUndef[i]*fGlobalSinglePlus[i] +
1197 fGlobalSingleUndef[i]*fGlobalSingleMinus[i];
1200 // unlike sign low, high and all pt
1201 for (i=0; i<3; i++) {
1202 fGlobalPairUnlike[i]=fGlobalSingleMinus[i]*fGlobalSinglePlus[i] +
1203 fGlobalSingleUndef[i]*(fGlobalSingleUndef[i]-1)/2 +
1204 fGlobalSingleUndef[i]*fGlobalSinglePlus[i] +
1205 fGlobalSingleUndef[i]*fGlobalSingleMinus[i];
1210 cout << "===================================================" << "\n";
1211 cout << " Global Trigger output " << "Low pt High pt All" << "\n";
1212 cout << " number of Single Plus :\t";
1213 for (i=0; i<3; i++) { cout << fGlobalSinglePlus[i] <<"\t";}
1215 cout << " number of Single Minus :\t";
1216 for (i=0; i<3; i++) { cout << fGlobalSingleMinus[i] <<"\t";}
1218 cout << " number of Single Undefined :\t";
1219 for (i=0; i<3; i++) { cout << fGlobalSingleUndef[i] <<"\t";}
1221 cout << " number of UnlikeSign pair :\t";
1222 for (i=0; i<3; i++) { cout << fGlobalPairUnlike[i] <<"\t";}
1224 cout << " number of LikeSign pair :\t";
1225 for (i=0; i<3; i++) { cout << fGlobalPairLike[i] <<"\t";}
1227 cout << "===================================================" << "\n";
1231 //----------------------------------------------------------------------
1232 void AliMUONTriggerDecision::PrintBitPatXInput(Int_t icirc){
1233 // print bit pattern for X strips
1237 cout << "-------- TRIGGER INPUT ---------" << "\n";
1238 cout << "===============================================================" << "\n";
1239 cout << " 5432109876543210";
1240 cout << "\n XMC11 ";
1241 for (istrip=15; istrip>=0; istrip--) {
1242 cout << fXbit11[icirc][istrip];
1244 cout << "\n XMC12 ";
1245 for (istrip=15; istrip>=0; istrip--) {
1246 cout << fXbit12[icirc][istrip];
1248 cout << "\n XMC21 ";
1249 for (istrip=31; istrip>=0; istrip--) {
1250 cout << fXbit21[icirc][istrip];
1252 cout << "\n XMC22 ";
1253 for (istrip=31; istrip>=0; istrip--) {
1254 cout << fXbit22[icirc][istrip];
1257 cout << "10987654321098765432109876543210" << "\n";
1260 //----------------------------------------------------------------------
1261 void AliMUONTriggerDecision::PrintBitPatYInput(Int_t icirc){
1262 // print bit pattern for Y strips
1266 AliMUON *pMUON = (AliMUON*)gAlice->GetModule("MUON");
1267 AliMUONTriggerCircuit* triggerCircuit;
1268 triggerCircuit = &(pMUON->TriggerCircuit(icirc));
1269 Int_t idCircuit=triggerCircuit->GetIdCircuit();
1270 Int_t nStrip=triggerCircuit->GetNstripY();
1272 cout << "---------------------------------------------------------------" << "\n";
1274 for (istrip=nStrip-1; istrip>=0; istrip--) {
1275 if (istrip>9) { cout << istrip-10*Int_t(istrip/10);}
1276 if (istrip<10) { cout << istrip;}
1278 cout << "\n YMC11 ";
1279 for (istrip=nStrip-1; istrip>=0; istrip--) {
1280 cout << fYbit11[icirc][istrip];
1282 cout << "\n YMC12 ";
1283 for (istrip=nStrip-1; istrip>=0; istrip--) {
1284 cout << fYbit12[icirc][istrip];
1286 cout << "\n YMC21 ";
1287 for (istrip=nStrip-1; istrip>=0; istrip--) {
1288 cout << fYbit21[icirc][istrip];
1290 cout << "\n YMC22 ";
1291 for (istrip=nStrip-1; istrip>=0; istrip--) {
1292 cout << fYbit22[icirc][istrip];
1296 cout << "---------------------------------------------------------------";
1297 cout << "\n upper part of circuit " << idCircuit ;
1298 cout << "\n UMC21 ";
1299 for (istrip=15; istrip>=0; istrip--) {
1300 cout << fYbit21U[icirc][istrip];
1302 cout << "\n UMC22 ";
1303 for (istrip=15; istrip>=0; istrip--) {
1304 cout << fYbit22U[icirc][istrip];
1307 cout << "\n lower part of circuit " << idCircuit ;
1308 cout << "\n LMC21 ";
1309 for (istrip=15; istrip>=0; istrip--) {
1310 cout << fYbit21D[icirc][istrip];
1312 cout << "\n LMC22 ";
1313 for (istrip=15; istrip>=0; istrip--) {
1314 cout << fYbit22D[icirc][istrip];
1317 cout << "===============================================================" << "\n";
1319 //----------------------------------------------------------------------
1320 void AliMUONTriggerDecision::PrintLocalOutput(Int_t minDevStrip[5],
1323 // print Local trigger output before the LuT step
1327 cout << "===============================================================" << "\n";
1328 cout << "-------- TRIGGER OUTPUT --------" << "\n";
1329 cout << "minDevStrip = ";
1330 for (i=4; i>=0; i--) {cout << minDevStrip[i];}
1331 cout << " minDev = ";
1332 for (i=4; i>=0; i--) {cout << minDev[i];}
1333 cout << " coordY = ";
1334 for (i=4; i>=0; i--) {cout << coordY[i];}
1335 cout << " " << "\n";
1338 //----------------------------------------------------------------------
1339 //--- methods which return member data related info
1340 //----------------------------------------------------------------------
1341 Int_t AliMUONTriggerDecision::GetITrigger(Int_t icirc){
1342 // returns Local Trigger Status
1343 return fTrigger[icirc];
1345 //----------------------------------------------------------------------
1346 Int_t AliMUONTriggerDecision::GetStripX11(Int_t icirc){
1347 // returns fStripX11
1348 return fStripX11[icirc];
1350 //----------------------------------------------------------------------
1351 Int_t AliMUONTriggerDecision::GetDev(Int_t icirc){
1355 //----------------------------------------------------------------------
1356 Int_t AliMUONTriggerDecision::GetStripY11(Int_t icirc){
1357 // returns fStripY11;
1358 return fStripY11[icirc];
1360 //----------------------------------------------------------------------
1361 void AliMUONTriggerDecision::GetLutOutput(Int_t icirc, Int_t lpt[2],
1362 Int_t hpt[2], Int_t apt[2]){
1363 // returns Look up Table output
1364 for (Int_t i=0; i<2; i++) {
1365 lpt[i]=fLutLpt[icirc][i];
1366 hpt[i]=fLutHpt[icirc][i];
1367 apt[i]=fLutApt[icirc][i];
1370 //----------------------------------------------------------------------
1371 void AliMUONTriggerDecision::GetGlobalTrigger(Int_t singlePlus[3],
1372 Int_t singleMinus[3],
1373 Int_t singleUndef[3],
1374 Int_t pairUnlike[3],
1376 // returns Global Trigger information (0,1,2 : Lpt,Hpt,Apt)
1377 for (Int_t i=0; i<3; i++) {
1378 singlePlus[i] = fGlobalSinglePlus[i];
1379 singleMinus[i] = fGlobalSingleMinus[i];
1380 singleUndef[i] = fGlobalSingleUndef[i];
1381 pairUnlike[i] = fGlobalPairUnlike[i];
1382 pairLike[i] = fGlobalPairLike[i];
1385 //----------------------------------------------------------------------
1386 //--- end of methods which return member data related info
1387 //----------------------------------------------------------------------
1388 //----------------------------------------------------------------------
1390 void AliMUONTriggerDecision::AddLocalTrigger(const AliMUONLocalTrigger c){
1391 // Add a Local Trigger copy to the list
1392 AliMUON *MUON=(AliMUON*)gAlice->GetModule("MUON");
1393 MUON->AddLocalTrigger(c);