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.10 2002/10/23 07:24:56 alibrary
18 Introducing Riostream.h
20 Revision 1.9 2001/03/23 17:31:32 pcrochet
21 correct access to digits in SetBit()
23 Revision 1.8 2001/03/20 16:13:01 pcrochet
24 bug fixed in the rejection of soft background (thanks to FM)
26 Revision 1.7 2001/03/20 13:32:37 egangler
29 Revision 1.6 2001/01/26 21:57:09 morsch
30 Use access functions to AliMUONDigit member data.
32 Revision 1.5 2000/10/02 16:58:29 egangler
33 Cleaning of the code :
36 -> some useless includes removed or replaced by "class" statement
38 Revision 1.4 2000/07/03 11:54:57 morsch
39 AliMUONSegmentation and AliMUONHitMap have been replaced by AliSegmentation and AliHitMap in STEER
40 The methods GetPadIxy and GetPadXxy of AliMUONSegmentation have changed name to GetPadI and GetPadC.
42 Revision 1.3 2000/06/25 17:02:19 pcrochet
43 scope problem on HP, i declared once, pow replaced by TMath::Power (PH)
45 Revision 1.2 2000/06/15 07:58:49 morsch
46 Code from MUON-dev joined
48 Revision 1.1.2.8 2000/06/14 14:54:34 morsch
49 Complete redesign, make use of TriggerCircuit and TriggerLut (PC)
51 Revision 1.1.2.5 2000/04/26 19:59:57 morsch
54 Revision 1.1.2.4 2000/04/26 12:31:30 morsch
55 Modifications by P. Crochet:
56 - adapted to the new Trigger chamber geometry
57 - condition on soft background added
58 - contructor added in AliMUONTriggerDecision.h
59 - single-undefined taken into account in the output of GlobalTrigger()
62 Revision 1.1.2.3 2000/03/21 09:29:58 morsch
65 Revision 1.1.2.2 2000/03/21 09:24:34 morsch
66 Author and responsible for the code: Philippe Crochet
69 #include "AliMUONTriggerCircuit.h"
70 #include "AliMUONTriggerDecision.h"
71 #include "AliMUONTriggerLut.h"
72 #include "AliMUONHitMapA1.h"
75 #include "AliSegmentation.h"
76 #include "AliMUONResponse.h"
77 #include "AliMUONChamber.h"
78 #include "AliMUONDigit.h"
87 #include <TPostScript.h>
89 #include <Riostream.h>
91 //----------------------------------------------------------------------
92 ClassImp(AliMUONTriggerDecision)
94 //----------------------------------------------------------------------
95 AliMUONTriggerDecision::AliMUONTriggerDecision(Int_t iprint)
98 fDebug = iprint; // print option
99 // iprint = 0 : don't print anything
100 // iprint = 1 : print Global Trigger Output
101 // iprint = 2 : print Local and Global Trigger Outputs
102 // iprint = 3 : iprint = 2 + detailed info on X strips
103 // iprint = 4 : iprint = 2 + detailed info on Y strip
104 // iprint = 5 : iprint = 2 + detailed info on X and Y strips
105 // Note : with iprint>2, the strips detailed info is given for all circuits
107 // Global Trigger information
112 for (i=0; i<3; i++) { // [0] : Low pt, [1] : High pt, [2] : All pt
113 fGlobalSinglePlus[i]=0; // tot num of single plus
114 fGlobalSingleMinus[i]=0; // tot num of single minus
115 fGlobalSingleUndef[i]=0; // tot num of single undefined
116 fGlobalPairUnlike[i]=0; // tot num of unlike-sign pairs
117 fGlobalPairLike[i]=0; // tot num of like-sign pairs
119 // Local Trigger information
120 for (icirc=0; icirc<234; icirc++){
121 fTrigger[icirc]=0; // trigger or not
122 fStripX11[icirc]=0; // X strip in MC11 which triggers
123 fDev[icirc]=0; // deviation which triggers
124 fStripY11[icirc]=0; // Y strip in MC11 which triggers
125 for (i=0; i<2; i++) { // pt information via LuT
126 fLutLpt[icirc][i]=fLutHpt[icirc][i]=fLutApt[icirc][i]=0;
130 for (icirc=0; icirc<234; icirc++) {
131 for (istrip=0; istrip<16; istrip++) {
132 fXbit11[icirc][istrip]=fXbit12[icirc][istrip]=0;
133 fYbit11[icirc][istrip]=fYbit12[icirc][istrip]=0;
134 fYbit21[icirc][istrip]=fYbit22[icirc][istrip]=0;
135 fYbit21U[icirc][istrip]=fYbit22U[icirc][istrip]=0;
136 fYbit21D[icirc][istrip]=fYbit22D[icirc][istrip]=0;
138 for (istrip=0; istrip<32; istrip++) {
139 fXbit21[icirc][istrip]=fXbit22[icirc][istrip]=0;
144 //----------------------------------------------------------------------
145 AliMUONTriggerDecision::~AliMUONTriggerDecision()
150 //----------------------------------------------------------------------
151 void AliMUONTriggerDecision::Trigger(){
152 // main method of the class which calls the overall Trigger procedure
158 Int_t coinc44=0, resetMid=0; // initialize coincidence
160 AliMUON *pMUON = (AliMUON*)gAlice->GetModule("MUON");
161 AliMUONTriggerCircuit* triggerCircuit;
163 for (Int_t icirc=0; icirc<234; icirc++) { // loop on circuits
164 triggerCircuit = &(pMUON->TriggerCircuit(icirc));
165 // Int_t idCircuit=triggerCircuit->GetIdCircuit();
167 Int_t minDevStrip[5], minDev[5], coordY[5];
168 for (Int_t i=0; i<5; i++) {
169 minDevStrip[i]=minDev[i]=coordY[i]=0;
171 Int_t x2m=triggerCircuit->GetX2m();
172 Int_t x2ud=triggerCircuit->GetX2ud();
173 Int_t orMud[2]={0,0};
174 triggerCircuit->GetOrMud(orMud);
177 TrigX(fXbit11[icirc],fXbit12[icirc],fXbit21[icirc],fXbit22[icirc],
178 coinc44, minDevStrip, minDev);
180 TrigY(fYbit11[icirc],fYbit12[icirc],fYbit21[icirc],fYbit22[icirc],
181 fYbit21U[icirc],fYbit21D[icirc],fYbit22U[icirc],fYbit22D[icirc],
182 x2m,x2ud,orMud,resetMid,coinc44,coordY);
185 LocalTrigger(icirc, minDevStrip, minDev, coordY, iTrigger);
187 if (iTrigger==1&&fDebug>1) {
188 PrintBitPatXInput(icirc);
189 PrintBitPatYInput(icirc);
190 PrintLocalOutput(minDevStrip, minDev, coordY);
192 } // end loop on circuits
194 // call Global Trigger
198 //----------------------------------------------------------------------
199 void AliMUONTriggerDecision::ResetBit(){
200 // reset bit pattern, global and local trigger output tables to 0
206 for (icirc=0; icirc<234; icirc++) {
207 for (istrip=0; istrip<16; istrip++) {
208 fXbit11[icirc][istrip]=fXbit12[icirc][istrip]=0;
209 fYbit11[icirc][istrip]=fYbit12[icirc][istrip]=0;
210 fYbit21[icirc][istrip]=fYbit22[icirc][istrip]=0;
211 fYbit21U[icirc][istrip]=fYbit22U[icirc][istrip]=0;
212 fYbit21D[icirc][istrip]=fYbit22D[icirc][istrip]=0;
214 for (istrip=0; istrip<32; istrip++) {
215 fXbit21[icirc][istrip]=fXbit22[icirc][istrip]=0;
218 for (i=0; i<3; i++) {
219 fGlobalSinglePlus[i]=0;
220 fGlobalSingleMinus[i]=0;
221 fGlobalSingleUndef[i]=0;
222 fGlobalPairLike[i]=0;
223 fGlobalPairLike[i]=0;
225 for (icirc=0; icirc<234; icirc++){
230 for (i=0; i<2; i++) {
231 fLutLpt[icirc][i]=fLutHpt[icirc][i]=fLutApt[icirc][i]=0;
236 //----------------------------------------------------------------------
237 void AliMUONTriggerDecision::SetBit(){
238 // 1) loop over chambers and cathodes
240 // 3) remove soft background
241 // 4) set the bit patterns
243 AliMUON *pMUON = (AliMUON*)gAlice->GetModule("MUON");
244 AliMUONTriggerCircuit* triggerCircuit;
246 for (Int_t chamber=11; chamber<15; chamber++){
247 for (Int_t cathode=1; cathode<3; cathode++){
249 AliMUONChamber* iChamber;
250 AliSegmentation* segmentation;
252 TClonesArray *muonDigits = pMUON->DigitsAddress(chamber-1);
253 if (muonDigits == 0) return;
255 gAlice->ResetDigits();
258 if (gAlice->TreeD()) {
259 nent = (Int_t) gAlice->TreeD()->GetEntries();
260 //printf(" entries %d \n", nent);
261 // gAlice->TreeD()->GetEvent(nent-2+cathode-1);
262 gAlice->TreeD()->GetEvent(cathode-1);
265 Int_t ndigits = muonDigits->GetEntriesFast();
266 if (ndigits == 0) return;
268 iChamber = &(pMUON->Chamber(chamber-1));
269 segmentation=iChamber->SegmentationModel(cathode);
272 for (Int_t digit=0; digit<ndigits; digit++) {
273 mdig = (AliMUONDigit*)muonDigits->UncheckedAt(digit);
274 // get the center of the pad Id
275 Int_t ix=mdig->PadX();
276 Int_t iy=mdig->PadY();
277 // get the sum of the coded charge
278 // see coding convention in AliMUONChamberTrigger::DisIntegration
280 for (Int_t icharge=0; icharge<10; icharge++) {
281 sumCharge=sumCharge+mdig->TrackCharge(icharge);
283 // apply condition on soft background
284 Int_t testCharge=sumCharge-(Int_t(sumCharge/10))*10;
285 if(sumCharge<=10||testCharge>0) {
287 Int_t code=TMath::Abs(ix)*100+iy;
288 if (ix<0) { code=-code; }
298 for (icirc=0; icirc<234; icirc++) {
299 triggerCircuit = &(pMUON->TriggerCircuit(icirc));
300 for (istrip=0; istrip<16; istrip++) {
301 if (triggerCircuit->GetXcode(0,istrip)==code)
302 fXbit11[icirc][istrip]=1;
307 for (icirc=0; icirc<234; icirc++) {
308 triggerCircuit = &(pMUON->TriggerCircuit(icirc));
309 for (istrip=0; istrip<16; istrip++) {
310 if (triggerCircuit->GetXcode(1,istrip)==code)
311 fXbit12[icirc][istrip]=1;
316 for (icirc=0; icirc<234; icirc++) {
317 triggerCircuit = &(pMUON->TriggerCircuit(icirc));
318 for (istrip=0; istrip<32; istrip++) {
319 if (triggerCircuit->GetXcode(2,istrip)==code)
320 fXbit21[icirc][istrip]=1;
325 for (icirc=0; icirc<234; icirc++) {
326 triggerCircuit = &(pMUON->TriggerCircuit(icirc));
327 for (istrip=0; istrip<32; istrip++) {
328 if (triggerCircuit->GetXcode(3,istrip)==code)
329 fXbit22[icirc][istrip]=1;
339 for (icirc=0; icirc<234; icirc++) {
340 triggerCircuit = &(pMUON->TriggerCircuit(icirc));
341 nStrip=triggerCircuit->GetNstripY();
342 for (istrip=0; istrip<nStrip; istrip++) {
343 if (triggerCircuit->GetYcode(0,istrip)==code)
344 fYbit11[icirc][istrip]=1;
349 for (icirc=0; icirc<234; icirc++) {
350 triggerCircuit = &(pMUON->TriggerCircuit(icirc));
351 nStrip=triggerCircuit->GetNstripY();
352 for (istrip=0; istrip<nStrip; istrip++) {
353 if (triggerCircuit->GetYcode(1,istrip)==code)
354 fYbit12[icirc][istrip]=1;
359 for (icirc=0; icirc<234; icirc++) {
360 triggerCircuit = &(pMUON->TriggerCircuit(icirc));
361 nStrip=triggerCircuit->GetNstripY();
362 for (istrip=0; istrip<nStrip; istrip++) {
363 if (triggerCircuit->GetYcode(2,istrip)==code)
364 fYbit21[icirc][istrip]=1;
369 for (icirc=0; icirc<234; icirc++) {
370 triggerCircuit = &(pMUON->TriggerCircuit(icirc));
371 nStrip=triggerCircuit->GetNstripY();
372 for (istrip=0; istrip<nStrip; istrip++) {
373 if (triggerCircuit->GetYcode(3,istrip)==code)
374 fYbit22[icirc][istrip]=1;
380 } // remove soft background
381 } // end loop on digit
382 } // end loop on cathode
383 } // end loop on chamber
386 //----------------------------------------------------------------------
387 void AliMUONTriggerDecision::SetBitUpDownY(){
388 // Set Y bit for up and down parts of circuits
389 Int_t idModule, nStripX, nStripY, iPosCircuit;
391 AliMUON *pMUON = (AliMUON*)gAlice->GetModule("MUON");
393 for (Int_t icirc=0; icirc<234; icirc++) {
395 AliMUONTriggerCircuit* circuit; // current circuit
396 AliMUONTriggerCircuit* circuitD; // circuit Down
397 AliMUONTriggerCircuit* circuitU; // circuit Up
399 circuit = &(pMUON->TriggerCircuit(icirc));
400 idModule=circuit->GetIdModule(); // corresponding module Id.
401 nStripX=circuit->GetNstripX(); // number of X strips
402 nStripY=circuit->GetNstripY(); // number of Y strips
403 iPosCircuit=circuit->GetPosCircuit(); // position of circuit in module
406 if (iPosCircuit==1) { // need to scan lower module
407 if(idModule<91&&TMath::Abs(idModule)!=41&&idModule>-91) {
408 Int_t icircD=circuit->GetICircuitD();
409 circuitD = &(pMUON->TriggerCircuit(icircD));
410 Int_t nStripD=circuitD->GetNstripY();
412 if (TMath::Abs(idModule)==42) { // shift of +8 bits
413 for (Int_t istrip=0; istrip<nStripD; istrip++) {
414 fYbit21D[icirc][istrip+8]=fYbit21[icircD][istrip];
415 fYbit22D[icirc][istrip+8]=fYbit22[icircD][istrip];
417 } else if (TMath::Abs(idModule)==52) { // shift of -8 bits
418 for (Int_t istrip=0; istrip<nStripD; istrip++) {
419 fYbit21D[icirc][istrip]=fYbit21[icircD][istrip+8];
420 fYbit22D[icirc][istrip]=fYbit22[icircD][istrip+8];
423 for (Int_t istrip=0; istrip<nStripD; istrip++) {
424 fYbit21D[icirc][istrip]=fYbit21[icircD][istrip];
425 fYbit22D[icirc][istrip]=fYbit22[icircD][istrip];
429 } else { // lower strips within same module
430 for (Int_t istrip=0; istrip<nStripY; istrip++) {
431 fYbit21D[icirc][istrip]=fYbit21[icirc][istrip];
432 fYbit22D[icirc][istrip]=fYbit22[icirc][istrip];
437 if ((iPosCircuit==1&&nStripX==16)||(iPosCircuit==2&&nStripX==32)||
438 (iPosCircuit==3&&nStripX==48)||(iPosCircuit==4&&nStripX==64)) {
439 if ((idModule>17||idModule<-17)&&TMath::Abs(idModule)!=61) {
440 Int_t icircU=circuit->GetICircuitU();
441 circuitU = &(pMUON->TriggerCircuit(icircU));
442 Int_t nStripU=circuitU->GetNstripY();
444 if (TMath::Abs(idModule)==62) { // shift of +8 bits
445 for (Int_t istrip=0; istrip<nStripU; istrip++) {
446 fYbit21U[icirc][istrip+8]=fYbit21[icircU][istrip];
447 fYbit22U[icirc][istrip+8]=fYbit22[icircU][istrip];
449 } else if (TMath::Abs(idModule)==52) { // shift of -8 bits
450 for (Int_t istrip=0; istrip<nStripU; istrip++) {
451 fYbit21U[icirc][istrip]=fYbit21[icircU][istrip+8];
452 fYbit22U[icirc][istrip]=fYbit22[icircU][istrip+8];
455 for (Int_t istrip=0; istrip<nStripU; istrip++) {
456 fYbit21U[icirc][istrip]=fYbit21[icircU][istrip];
457 fYbit22U[icirc][istrip]=fYbit22[icircU][istrip];
461 } else { // upper strips within same module
462 for (Int_t istrip=0; istrip<nStripY; istrip++) {
463 fYbit21U[icirc][istrip]=fYbit21[icirc][istrip];
464 fYbit22U[icirc][istrip]=fYbit22[icirc][istrip];
470 //----------------------------------------------------------------------
471 // x part of trigger Algo
472 //----------------------------------------------------------------------
473 //----------------------------------------------------------------------
474 void AliMUONTriggerDecision::TrigX(Int_t ch1q[16], Int_t ch2q[16],
475 Int_t ch3q[32], Int_t ch4q[32],
476 Int_t coinc44, Int_t minDevStrip[5],
478 // note : coinc44 = flag 0 or 1 (0 coincidence -> 3/4, 1 coincidence -> 4/4)
479 //---------------------------------------------------------
480 // step # 1 : declustering, reduction DS, calculate sgle & dble
481 //---------------------------------------------------------
482 Int_t ch1e[19], ch2e[20], ch3e[35], ch4e[36];
483 Int_t sgleHit1[31], sgleHit2[63];
484 Int_t dbleHit1[31], dbleHit2[63];
490 for (i=0; i<31; i++) {
494 for (i=0; i<63; i++) {
499 //--- inititialize che using chq
500 for (i=0; i<19; i++) {
501 if (i<1||i>16) ch1e[i]=0;
502 else ch1e[i]=ch1q[i-1];
504 for (i=0; i<20; i++) {
505 if (i<2||i>17) ch2e[i]=0;
506 else ch2e[i]=ch2q[i-2];
508 for (i=0; i<35; i++) {
509 if (i<1||i>32) ch3e[i]=0;
510 else ch3e[i]=ch3q[i-1];
512 for (i=0; i<36; i++) {
513 if (i<2||i>33) ch4e[i]=0;
514 else ch4e[i]=ch4q[i-2];
518 //--- calculate dble & sgle first station
519 for (i=0; i<=15; i++) {
520 sgleHit1[2*i] = (!ch1e[i+1]|(ch1e[i]^ch1e[i+2])) &
521 (!ch2e[i+2] | (ch2e[i+1]^ch2e[i+3]));
523 dbleHit1[2*i] = ch1e[i+1]&!(ch1e[i+2]^ch1e[i]) &
524 (ch2e[i+2] | (!ch2e[i]&ch2e[i+1]) | (ch2e[i+3]&!ch2e[i+4]));
527 for (i=0; i<=14; i++) {
528 sgleHit1[2*i+1] = (!ch1e[i+1]|!ch1e[i+2]|(ch1e[i]^ch1e[i+3])) &
529 (!ch2e[i+2] | !ch2e[i+3] | (ch2e[i+1]^ch2e[i+4]));
530 dbleHit1[2*i+1] = ch1e[i+1]&ch1e[i+2]&!(ch1e[i]^ch1e[i+3]) &
531 (ch2e[i+2]&(!ch2e[i+1]|!ch2e[i]) |
532 ch2e[i+3]&(ch2e[i+2]|!ch2e[i+4]|!ch2e[i+5]));
535 //--- calculate dble & sgle second station
536 for (i=0; i<=31; i++) {
537 sgleHit2[2*i] = (!ch3e[i+1]|(ch3e[i]^ch3e[i+2])) &
538 (!ch4e[i+2] | (ch4e[i+1]^ch4e[i+3]));
539 dbleHit2[2*i] = ch3e[i+1]&!(ch3e[i+2]^ch3e[i]) &
540 (ch4e[i+2] | (!ch4e[i]&ch4e[i+1]) | (ch4e[i+3]&!ch4e[i+4]));
543 for (i=0; i<=30; i++) {
544 sgleHit2[2*i+1] = (!ch3e[i+1]|!ch3e[i+2]|(ch3e[i]^ch3e[i+3])) &
545 (!ch4e[i+2] | !ch4e[i+3] | (ch4e[i+1]^ch4e[i+4]));
546 dbleHit2[2*i+1] = ch3e[i+1]&ch3e[i+2]&!(ch3e[i]^ch3e[i+3]) &
547 (ch4e[i+2]&(!ch4e[i+1]|!ch4e[i]) |
548 ch4e[i+3]&(ch4e[i+2]|!ch4e[i+4]|!ch4e[i+5]));
552 if(fDebug==3||fDebug==5) {
553 printf("===============================================================\n");
554 printf(" X plane after sgle and dble \n");
555 printf(" 0987654321098765432109876543210");
557 for (istrip=30; istrip>=0; istrip--) printf("%i",(!sgleHit1[istrip]));
559 for (istrip=30; istrip>=0; istrip--) printf("%i",dbleHit1[istrip]);
561 for (istrip=62; istrip>=0; istrip--) printf("%i",(!sgleHit2[istrip]));
563 for (istrip=62; istrip>=0; istrip--) printf("%i",dbleHit2[istrip]);
564 printf("\n 210987654321098765432109876543210987654321098765432109876543210\n");
567 //---------------------------------------------------------
568 // step # 2 : coincidence 3/4
569 //---------------------------------------------------------
570 Int_t rearImage[31][31];
571 for (i=0; i<31; i++) {
572 for (j=0; j<31; j++) {
577 Int_t notOr1=!dbleHit1[30] & !dbleHit1[29] & !dbleHit1[28] & !dbleHit1[27] &
578 !dbleHit1[26] & !dbleHit1[25] & !dbleHit1[24] & !dbleHit1[23] &
579 !dbleHit1[22] & !dbleHit1[21] & !dbleHit1[20] & !dbleHit1[19] &
580 !dbleHit1[18] & !dbleHit1[17] & !dbleHit1[16] & !dbleHit1[15] &
581 !dbleHit1[14] & !dbleHit1[13] & !dbleHit1[12] & !dbleHit1[11] &
582 !dbleHit1[10] & !dbleHit1[9] & !dbleHit1[8] & !dbleHit1[7] &
583 !dbleHit1[6] & !dbleHit1[5] & !dbleHit1[4] & !dbleHit1[3] &
584 !dbleHit1[2] & !dbleHit1[1] & !dbleHit1[0] & !coinc44;
586 Int_t notOr2= !dbleHit2[62] & !dbleHit2[61] & !dbleHit2[60] & !dbleHit2[59] &
587 !dbleHit2[58] & !dbleHit2[57] & !dbleHit2[56] & !dbleHit2[55] &
588 !dbleHit2[54] & !dbleHit2[53] & !dbleHit2[52] & !dbleHit2[51] &
589 !dbleHit2[50] & !dbleHit2[49] & !dbleHit2[48] & !dbleHit2[47] &
590 !dbleHit2[46] & !dbleHit2[45] & !dbleHit2[44] & !dbleHit2[43] &
591 !dbleHit2[42] & !dbleHit2[41] & !dbleHit2[40] & !dbleHit2[39] &
592 !dbleHit2[38] & !dbleHit2[37] & !dbleHit2[36] & !dbleHit2[35] &
593 !dbleHit2[34] & !dbleHit2[33] & !dbleHit2[32] & !dbleHit2[31] &
594 !dbleHit2[30] & !dbleHit2[29] & !dbleHit2[28] & !dbleHit2[27] &
595 !dbleHit2[26] & !dbleHit2[25] & !dbleHit2[24] & !dbleHit2[23] &
596 !dbleHit2[22] & !dbleHit2[21] & !dbleHit2[20] & !dbleHit2[19] &
597 !dbleHit2[18] & !dbleHit2[17] & !dbleHit2[16] & !dbleHit2[15] &
598 !dbleHit2[14] & !dbleHit2[13] & !dbleHit2[12] & !dbleHit2[11] &
599 !dbleHit2[10] & !dbleHit2[9] & !dbleHit2[8] & !dbleHit2[7] &
600 !dbleHit2[6] & !dbleHit2[5] & !dbleHit2[4] & !dbleHit2[3] &
601 !dbleHit2[2] & !dbleHit2[1] & !dbleHit2[0] & !coinc44;
604 for (i=0; i<31; i++) {
605 sgleHit1[i] = !sgleHit1[i]¬Or1;
607 for (i=0; i<63; i++) {
608 sgleHit2[i] = !sgleHit2[i]¬Or2;
612 for (i=0; i<31; i++){
613 Int_t tmpSgleHit2[31];
614 Int_t tmpDbleHit2[31];
615 for (j=0; j<31; j++){
616 tmpSgleHit2[j] = sgleHit2[i+j+1];
617 tmpDbleHit2[j] = dbleHit2[i+j+1];
620 for (Int_t k=0; k<31; k++) {
621 rearImage[i][k]=(sgleHit1[i]&tmpDbleHit2[k])|
622 (dbleHit1[i]&(tmpSgleHit2[k]|tmpDbleHit2[k]));
627 if(fDebug==3||fDebug==5) {
628 printf("===============================================================\n");
629 for (i=30; i>=0; i--) {
631 for (istrip=31; istrip>=0; istrip--) printf("%i",rearImage[i][istrip]);
636 //---------------------------------------------------------
637 // step # 3 : calculate deviation
638 //---------------------------------------------------------
640 for (i=0; i<31; i++) {
641 for (j=0; j<6; j++) {
646 for (i=0; i<31; i++){
647 Int_t leftDev[5], rightDev[5];
648 Int_t orL1, andL1, andL2, orR1, orR2, andR1, andR2, andR3;
650 // calculate Left deviation
651 orL1=rearImage[i][16]|rearImage[i][18]|rearImage[i][20]|rearImage[i][22];
652 andL1=!rearImage[i][17]&!rearImage[i][19]&!rearImage[i][21] & !orL1;
653 andL2=!rearImage[i][23]&!rearImage[i][24]&!rearImage[i][25]&!rearImage[i][26];
655 leftDev[0] = (rearImage[i][16]|!rearImage[i][17]) &
656 (rearImage[i][16]|rearImage[i][18]|!rearImage[i][19]&
657 (rearImage[i][20]|!rearImage[i][21])) &
658 (orL1|!rearImage[i][23]&(rearImage[i][24]|!rearImage[i][25])) &
659 (orL1|rearImage[i][24]|rearImage[i][26]|!rearImage[i][27]&
660 (rearImage[i][28]|!rearImage[i][29]));
662 leftDev[1] = !rearImage[i][16] &
663 !(!rearImage[i][17]&!rearImage[i][18]&!rearImage[i][21]&!rearImage[i][22] &
664 (!rearImage[i][25]&!rearImage[i][26]&(rearImage[i][27]|rearImage[i][28]))) &
665 (rearImage[i][17]|rearImage[i][18] | !rearImage[i][19]&!rearImage[i][20]) &
666 (rearImage[i][17]|rearImage[i][18]|rearImage[i][21]|rearImage[i][22] |
667 !rearImage[i][23]&!rearImage[i][24]);
669 leftDev[2] = (!rearImage[i][16]&!rearImage[i][17]&!rearImage[i][18]) &
670 (rearImage[i][19]|rearImage[i][20]|rearImage[i][21]|rearImage[i][22] | andL2);
675 !rearImage[i][27]&!rearImage[i][28]&!rearImage[i][29]&!rearImage[i][30] &
678 // calculate Right deviation
679 orR1=rearImage[i][8]|rearImage[i][10]|rearImage[i][12]|rearImage[i][14];
680 orR2=rearImage[i][8]|rearImage[i][9]|rearImage[i][10]|rearImage[i][11];
681 andR1=!rearImage[i][12]&!rearImage[i][13]&!rearImage[i][14]&!rearImage[i][15];
683 !rearImage[i][8]&!rearImage[i][9]&!rearImage[i][10]&!rearImage[i][11] & andR1;
684 andR3=!rearImage[i][4]&!rearImage[i][5]&!rearImage[i][6]&!rearImage[i][7];
686 rightDev[0] = !rearImage[i][15]&(rearImage[i][14]|!rearImage[i][13]) &
687 ((rearImage[i][12]|rearImage[i][14]|!rearImage[i][11]&
688 (rearImage[i][10]|!rearImage[i][9])) &
689 ((orR1|!rearImage[i][7]&(rearImage[i][6]|!rearImage[i][5])) &
690 (orR1|rearImage[i][4]|rearImage[i][6]|!rearImage[i][3]&(rearImage[i][2]|
691 !rearImage[i][1]))));
693 rightDev[1] = !rearImage[i][15]&!rearImage[i][14] &
694 !(!rearImage[i][4]&!rearImage[i][5]&!rearImage[i][8]&!rearImage[i][9] &
695 (!rearImage[i][12]&!rearImage[i][13]&(rearImage[i][2]|rearImage[i][3]))) &
696 (rearImage[i][12]|rearImage[i][13] | !rearImage[i][10]&!rearImage[i][11]) &
697 (rearImage[i][8]|rearImage[i][9]|rearImage[i][12]|rearImage[i][13] |
698 !rearImage[i][6]&!rearImage[i][7]);
700 rightDev[2] = andR1 & (orR2 | andR3);
703 !rearImage[i][0]&!rearImage[i][1]&!rearImage[i][2]&!rearImage[i][3] &
706 // compare Left & Right deviations
707 Int_t tmpLeftDev=0, tmpRightDev=0;
709 tmpLeftDev = tmpLeftDev + Int_t(leftDev[j]*TMath::Power(2,j));
710 tmpRightDev = tmpRightDev + Int_t(rightDev[j]*TMath::Power(2,j));
713 // assign mimimum deviation do dev[][]
714 if (tmpLeftDev < tmpRightDev ){
715 for (j=0; j<5; j++){ dev[i][j]=leftDev[j];}
718 for (j=0; j<5; j++){ dev[i][j]=rightDev[j];}
724 if(fDebug==3||fDebug==5) {
725 printf("===============================================================\n");
726 for (i=30; i>=0; i--) {
728 for (istrip=5; istrip>=0; istrip--) printf("%i",dev[i][istrip]);
733 //---------------------------------------------------------
734 // step # 4 : sort deviation
735 //---------------------------------------------------------
736 Int_t bga1[16], bga2[8], bga3[4], bga4[2], bga5;
737 Int_t tmpbga1[16][6], tmpbga2[8][6], tmpbga3[4][6], tmpbga4[2][6], tmpbga5[6];
738 Int_t tmpMax[6]={1,1,1,1,1,0};
740 for (i=0; i<15; i++) {
741 Sort2x5(dev[2*i],dev[2*i+1],tmpbga1[i],bga1[i]);
743 Sort2x5(dev[30],tmpMax,tmpbga1[15],bga1[15]);
746 if(fDebug==3||fDebug==5) {
747 printf("===============================================================\n");
748 printf(" sorting : 1st level \n");
749 for (i=15; i>=0; i--) {
750 printf("\t %i \t",bga1[i]);
751 for (j=5; j>=0; j--) printf("%i",tmpbga1[i][j]);
756 for (i=0; i<8; i++) {
757 Sort2x5(tmpbga1[2*i],tmpbga1[2*i+1],tmpbga2[i],bga2[i]);
761 if(fDebug==3||fDebug==5) {
762 printf("===============================================================\n");
763 printf(" sorting : 2nd level \n");
764 for (i=7; i>=0; i--) {
765 printf("\t %i \t",bga2[i]);
766 for (j=5; j>=0; j--) printf("%i",tmpbga1[i][j]);
771 for (i=0; i<4; i++) {
772 Sort2x5(tmpbga2[2*i],tmpbga2[2*i+1],tmpbga3[i],bga3[i]);
776 if(fDebug==3||fDebug==5) {
777 printf("===============================================================\n");
778 printf(" sorting : 3rd level \n");
779 for (i=3; i>=0; i--) {
780 printf("\t %i \t",bga3[i]);
781 for (j=5; j>=0; j--) printf("%i",tmpbga3[i][j]);
786 for (i=0; i<2; i++) {
787 Sort2x5(tmpbga3[2*i],tmpbga3[2*i+1],tmpbga4[i],bga4[i]);
791 if(fDebug==3||fDebug==5) {
792 printf("===============================================================\n");
793 printf(" sorting : 4th level \n");
794 for (i=1; i>=0; i--) {
795 printf("\t %i \t",bga4[i]);
796 for (j=5; j>=0; j--) printf("%i",tmpbga4[i][j]);
801 Sort2x5(tmpbga4[0],tmpbga4[1],tmpbga5,bga5);
803 // coding from 6 to 5 bits
804 minDev[4] = tmpbga5[5] | tmpbga5[4];
805 for (i=0; i<4; i++) {
806 minDev[i]=tmpbga5[i] & !tmpbga5[4];
809 // find address of strip with minimum deviation
811 if (bga5<=1) minDevStrip[3]=bga4[bga5];
813 Int_t tmpAd=minDevStrip[3]+minDevStrip[4]*2;
814 if (tmpAd<=3) minDevStrip[2]=bga3[tmpAd];
816 tmpAd=minDevStrip[2]+minDevStrip[3]*2+minDevStrip[4]*4;
817 if (tmpAd<=7) minDevStrip[1]=bga2[tmpAd];
819 tmpAd=minDevStrip[1]+minDevStrip[2]*2+minDevStrip[3]*4+minDevStrip[4]*8;
820 if (tmpAd<=15) minDevStrip[0]=bga1[tmpAd];
822 if(fDebug==3||fDebug==5) {
823 printf("===============================================================\n");
824 printf("minDevStrip = ");
825 for (i=4; i>=0; i--) printf("%i",minDevStrip[i]);
826 printf(" minDev = ");
827 for (i=4; i>=0; i--) printf("%i",minDev[i]);
829 printf("===============================================================\n");
834 //---------------------------------------------
835 void AliMUONTriggerDecision::Sort2x5(Int_t dev1[6], Int_t dev2[6],
836 Int_t minDev[6], Int_t &dev1GTdev2){
837 // returns minimun between dev1 and dev2
838 Int_t tmpDev1=0, tmpDev2=0;
839 for (Int_t j=0; j<5; j++){
840 tmpDev1 = tmpDev1 + Int_t(dev1[j]*TMath::Power(2,j));
841 tmpDev2 = tmpDev2 + Int_t(dev2[j]*TMath::Power(2,j));
843 if (tmpDev1 <= tmpDev2 ){
844 for (Int_t j=0; j<=5; j++) { minDev[j]=dev1[j];}
847 for (Int_t j=0; j<=5; j++) { minDev[j]=dev2[j];}
852 //----------------------------------------------------------------------
853 // y part of trigger Algo
854 //----------------------------------------------------------------------
855 //----------------------------------------------------------------------
856 void AliMUONTriggerDecision::TrigY(Int_t y1[16], Int_t y2[16],
857 Int_t y3[16], Int_t y4[16],
858 Int_t y3u[16], Int_t y3d[16],
859 Int_t y4u[16], Int_t y4d[16],
860 Int_t x2m, Int_t x2ud, Int_t orMud[2],
861 Int_t resetMid, Int_t coinc44,
863 // note : resMid = 1 -> cancel
864 //---------------------------------------------------------
865 // step # 1 : prehandling Y
866 //---------------------------------------------------------
870 for (i=0; i<16; i++){
871 y3[i]=y3[i]&!resetMid;
872 y4[i]=y4[i]&!resetMid;
875 Int_t ch1[16], ch2[16], ch3[16], ch4[16];
877 Int_t tmpy3to16[16], tmpy4to16[16];
878 Int_t tmpy3uto16[16], tmpy3dto16[16], tmpy4uto16[16], tmpy4dto16[16];
880 ch1[2*i] = y1[i]&x2m | y1[2*i]&!x2m;
881 ch1[2*i+1] = y1[i]&x2m | y1[2*i+1]&!x2m;
883 ch2[2*i] = y2[i]&x2m | y2[2*i]&!x2m;
884 ch2[2*i+1] = y2[i]&x2m | y2[2*i+1]&!x2m;
886 tmpy3to16[2*i] = y3[i]&x2m | y3[2*i]&!x2m;
887 tmpy3to16[2*i+1] = y3[i]&x2m | y3[2*i+1]&!x2m;
889 tmpy4to16[2*i] = y4[i]&x2m | y4[2*i]&!x2m;
890 tmpy4to16[2*i+1] = y4[i]&x2m | y4[2*i+1]&!x2m;
892 tmpy3uto16[2*i] = y3u[i]&x2ud | y3u[2*i]&!x2ud;
893 tmpy3uto16[2*i+1] = y3u[i]&x2ud | y3u[2*i+1]&!x2ud;
895 tmpy4uto16[2*i] = y4u[i]&x2ud | y4u[2*i]&!x2ud;
896 tmpy4uto16[2*i+1] = y4u[i]&x2ud | y4u[2*i+1]&!x2ud;
898 tmpy3dto16[2*i] = y3d[i]&x2ud | y3d[2*i]&!x2ud;
899 tmpy3dto16[2*i+1] = y3d[i]&x2ud | y3d[2*i+1]&!x2ud;
901 tmpy4dto16[2*i] = y4d[i]&x2ud | y4d[2*i]&!x2ud;
902 tmpy4dto16[2*i+1] = y4d[i]&x2ud | y4d[2*i+1]&!x2ud;
905 if (orMud[0]==0&&orMud[1]==0){
906 for (i=0; i<16; i++){
907 ch3[i] = tmpy3to16[i];
908 ch4[i] = tmpy4to16[i];
911 if (orMud[0]==0&&orMud[1]==1){
912 for (i=0; i<16; i++){
913 ch3[i] = tmpy3uto16[i]|tmpy3to16[i];
914 ch4[i] = tmpy4uto16[i]|tmpy4to16[i];
917 if (orMud[0]==1&&orMud[1]==0){
918 for (i=0; i<16; i++){
919 ch3[i] = tmpy3dto16[i]|tmpy3to16[i];
920 ch4[i] = tmpy4dto16[i]|tmpy4to16[i];
923 if (orMud[0]==1&&orMud[1]==1){
924 for (i=0; i<16; i++){
925 ch3[i] = tmpy3dto16[i]|tmpy3to16[i]|tmpy3uto16[i];
926 ch4[i] = tmpy4dto16[i]|tmpy4to16[i]|tmpy4uto16[i];
931 if(fDebug==4||fDebug==5) {
932 printf("===============================================================\n");
933 printf(" Y plane after PreHandling x2m x2ud orMud %i %i %i %i \n",
934 x2m,x2ud,orMud[0],orMud[1]);
936 for (istrip=15; istrip>=0; istrip--) {
937 if (istrip>9) printf("%i",istrip-10*Int_t(istrip/10));
938 if (istrip<10) printf("%i",istrip);
941 for (istrip=15; istrip>=0; istrip--) printf("%i",ch1[istrip]);
943 for (istrip=15; istrip>=0; istrip--) printf("%i",ch2[istrip]);
945 for (istrip=15; istrip>=0; istrip--) printf("%i",ch3[istrip]);
947 for (istrip=15; istrip>=0; istrip--) printf("%i",ch4[istrip]);
952 //---------------------------------------------------------
953 // step # 2 : calculate sgle and dble, apply DS reduction
954 //---------------------------------------------------------
955 Int_t sgle1[16], dble1[16];
956 Int_t sgle2[16], dble2[16];
958 // Calculate simple and double hits
959 for (i=0; i<16; i++) {
960 dble1[i] = ch1[i] & ch2[i];
961 dble2[i] = ch3[i] & ch4[i];
963 sgle1[i] = (ch1[i]|ch2[i]);
964 sgle2[i] = (ch3[i]|ch4[i]);
968 if(fDebug==4||fDebug==5) {
969 printf("===============================================================\n");
970 printf(" Y plane after sgle dble \n");
972 for (istrip=15; istrip>=0; istrip--) {
973 if (istrip>9) printf("%i",istrip-10*Int_t(istrip/10));
974 if (istrip<10) printf("%i",istrip);
977 for (istrip=15; istrip>=0; istrip--) printf("%i",sgle1[istrip]);
979 for (istrip=15; istrip>=0; istrip--) printf("%i",dble1[istrip]);
981 for (istrip=15; istrip>=0; istrip--) printf("%i",sgle2[istrip]);
983 for (istrip=15; istrip>=0; istrip--) printf("%i",dble2[istrip]);
989 Int_t notOr1, notOr2;
991 notOr1=!dble1[15] & !dble1[14] & !dble1[13] & !dble1[12] &
992 !dble1[11] & !dble1[10] & !dble1[9] & !dble1[8] &
993 !dble1[7] & !dble1[6] & !dble1[5] & !dble1[4] &
994 !dble1[3] & !dble1[2] & !dble1[1] & !dble1[0];
996 notOr2=!dble2[15] & !dble2[14] & !dble2[13] & !dble2[12] &
997 !dble2[11] & !dble2[10] & !dble2[9] & !dble2[8] &
998 !dble2[7] & !dble2[6] & !dble2[5] & !dble2[4] &
999 !dble2[3] & !dble2[2] & !dble2[1] & !dble2[0];
1001 for (i=0; i<16; i++) {
1002 sgle1[i] = sgle1[i] & notOr1 & !coinc44;
1003 sgle2[i] = sgle2[i] & notOr2 & !coinc44;
1006 //---------------------------------------------------------
1007 // step # 3 : 3/4 coincidence
1008 //---------------------------------------------------------
1009 Int_t frontImage[16];
1011 for (i=1; i<15; i++) {
1012 frontImage[i] = (dble1[i] | sgle1[i]) &
1013 (dble2[i+1] | dble2[i] | dble2[i-1]) |
1014 dble1[i] & (sgle2[i+1] | sgle2[i] | sgle2[i-1]);
1016 frontImage[0] = (dble1[0] | sgle1[0]) &
1017 (dble2[1] | dble2[0]) | dble1[0] & (sgle2[1] | sgle2[0]);
1019 frontImage[15] = (dble1[15] | sgle1[15]) &
1020 (dble2[15] | dble2[14]) | dble1[15] & (sgle2[15] | sgle2[14]);
1024 if(fDebug==4||fDebug==5) {
1025 printf("===============================================================\n");
1026 printf(" Y plane frontImage\n");
1028 for (istrip=15; istrip>=0; istrip--) {
1029 if (istrip>9) printf("%i",istrip-10*Int_t(istrip/10));
1030 if (istrip<10) printf("%i",istrip);
1033 for (istrip=15; istrip>=0; istrip--) printf("%i",frontImage[istrip]);
1038 //---------------------------------------------------------
1039 // step # 4 : Y position
1040 //---------------------------------------------------------
1041 Int_t or1, or2, and1, and2, and3;
1043 or1 = frontImage[7]|frontImage[5]|frontImage[3]|frontImage[1];
1044 or2 = frontImage[7]|frontImage[6]|frontImage[5]|frontImage[4];
1045 and1 = !frontImage[3]&!frontImage[2]&!frontImage[1]&!frontImage[0];
1046 and2 = !frontImage[7]&!frontImage[6]&!frontImage[5]&!frontImage[4] & and1;
1047 and3 = !frontImage[11]&!frontImage[10]&!frontImage[9]&!frontImage[8];
1049 coordY[0] = !frontImage[0]&(frontImage[1]|!frontImage[2]) &
1050 (frontImage[3]|frontImage[1]|!frontImage[4]&(frontImage[5]|!frontImage[6])) &
1051 (or1|!frontImage[8]&(frontImage[9]|!frontImage[10])) &
1052 (or1|frontImage[11]|frontImage[9]|!frontImage[12]&(frontImage[13]|!frontImage[14]));
1054 coordY[1] = !frontImage[0]&!frontImage[1] &
1055 !(!frontImage[11]&!frontImage[10]&!frontImage[7]&!frontImage[6] &
1056 !frontImage[3]&!frontImage[2]&(frontImage[13]|frontImage[12])) &
1057 (frontImage[3]|frontImage[2] | !frontImage[5]&!frontImage[4]) &
1058 (frontImage[7]|frontImage[6]|frontImage[3]|frontImage[2] |
1059 !frontImage[9]&!frontImage[8]);
1061 coordY[2] = and1 & (or2 | and3);
1065 coordY[4] = !frontImage[15]&!frontImage[14]&!frontImage[13]&!frontImage[12] &
1069 //----------------------------------------------------------------------
1070 // end of trigger Algo
1071 //----------------------------------------------------------------------
1073 //----------------------------------------------------------------------
1074 void AliMUONTriggerDecision::LocalTrigger(Int_t icirc,
1075 Int_t minDevStrip[5],
1076 Int_t minDev[5], Int_t coordY[5],
1078 // returns local trigger answer for circuit icirc
1081 AliMUON *pMUON = (AliMUON*)gAlice->GetModule("MUON");
1082 AliMUONTriggerCircuit* triggerCircuit;
1083 triggerCircuit = &(pMUON->TriggerCircuit(icirc));
1084 Int_t idCircuit=triggerCircuit->GetIdCircuit();
1086 Int_t signDev=minDev[4];
1088 for (i=0; i<4; i++) { // extract deviation
1089 deviation = deviation+Int_t(minDev[i]*TMath::Power(2,i));
1092 Int_t istripX1Circ=0;
1093 for (i=0; i<5; i++) { // extract X1 strip fired
1094 istripX1Circ = istripX1Circ+Int_t(minDevStrip[i]*TMath::Power(2,i));
1098 for (i=0; i<4; i++) { // extract Y strip fired
1099 iStripY = iStripY+Int_t(coordY[i]*TMath::Power(2,i));
1103 if (signDev==1&&deviation==0) { // something in X ?
1106 if (coordY[4]==1&&iStripY==15) { // something in Y ?
1114 // fill fTrigger fStripX11 fStripY11
1115 fTrigger[icirc] = 1;
1116 fStripX11[icirc] = istripX1Circ;
1117 fStripY11[icirc] = iStripY;
1119 // calculate deviation in [0+30]
1121 if (signDev==0&&deviation!=0) sign=-1;
1122 if (signDev==0&&deviation==0) sign=0;
1123 if (signDev==1) sign=1;
1124 fDev[icirc] = sign * deviation + 15; // fill fDev
1126 // get Lut output for circuit/istripX/idev/istripY
1127 AliMUONTriggerLut* lut = new AliMUONTriggerLut;
1128 // lut->StartEvent();
1129 lut->GetLutOutput(icirc,fStripX11[icirc],fDev[icirc],fStripY11[icirc],
1130 fLutLpt[icirc],fLutHpt[icirc],fLutApt[icirc]);
1131 // lut->FinishEvent();
1135 Float_t pt= // get ptCal corresponding to istripX1Circ/idev/iStripY
1136 triggerCircuit->PtCal(fStripX11[icirc],fDev[icirc],fStripY11[icirc]);
1137 printf("-------------------------------------------\n");
1138 printf(" Local Trigger info for circuit Id %i (number %i ) \n",
1140 printf(" istripX1 signDev deviation istripY = %i %i %i %i \n",
1141 istripX1Circ,signDev,deviation,iStripY);
1142 printf(" pt = %f (GeV/c) \n",pt);
1143 printf("-------------------------------------------\n");
1144 printf(" Local Trigger Lut Output = Lpt : ");
1145 for (i=1; i>=0; i--) printf("%i",fLutLpt[icirc][i]);
1147 for (i=1; i>=0; i--) printf("%i",fLutHpt[icirc][i]);
1149 for (i=1; i>=0; i--) printf("%i",fLutApt[icirc][i]);
1151 printf("-------------------------------------------\n");
1153 } // local trigger = 1
1156 //----------------------------------------------------------------------
1157 void AliMUONTriggerDecision::GlobalTrigger(){
1158 // loop on Lut[icirc] and give Global Trigger output
1161 for (Int_t icirc=0; icirc<234; icirc++){
1162 if (fLutLpt[icirc][0]==1&&fLutLpt[icirc][1]==1)
1163 fGlobalSingleUndef[0] = fGlobalSingleUndef[0] + 1;
1164 if (fLutHpt[icirc][0]==1&&fLutHpt[icirc][1]==1)
1165 fGlobalSingleUndef[1] = fGlobalSingleUndef[1] + 1;
1166 if (fLutApt[icirc][0]==1&&fLutApt[icirc][1]==1)
1167 fGlobalSingleUndef[2] = fGlobalSingleUndef[2] + 1;
1169 if (fLutLpt[icirc][0]==0&&fLutLpt[icirc][1]==1)
1170 fGlobalSinglePlus[0] = fGlobalSinglePlus[0] + 1;
1171 if (fLutHpt[icirc][0]==0&&fLutHpt[icirc][1]==1)
1172 fGlobalSinglePlus[1] = fGlobalSinglePlus[1] + 1;
1173 if (fLutApt[icirc][0]==0&&fLutApt[icirc][1]==1)
1174 fGlobalSinglePlus[2] = fGlobalSinglePlus[2] + 1;
1176 if (fLutLpt[icirc][0]==1&&fLutLpt[icirc][1]==0)
1177 fGlobalSingleMinus[0] = fGlobalSingleMinus[0] + 1;
1178 if (fLutHpt[icirc][0]==1&&fLutHpt[icirc][1]==0)
1179 fGlobalSingleMinus[1] = fGlobalSingleMinus[1] + 1;
1180 if (fLutApt[icirc][0]==1&&fLutApt[icirc][1]==0)
1181 fGlobalSingleMinus[2] = fGlobalSingleMinus[2] + 1;
1184 // like sign low, high and all pt
1185 for (i=0; i<3; i++) {
1186 fGlobalPairLike[i]=fGlobalSingleMinus[i]*(fGlobalSingleMinus[i]-1)/2 +
1187 fGlobalSinglePlus[i]*(fGlobalSinglePlus[i]-1)/2 +
1188 fGlobalSingleUndef[i]*(fGlobalSingleUndef[i]-1)/2 +
1189 fGlobalSingleUndef[i]*fGlobalSinglePlus[i] +
1190 fGlobalSingleUndef[i]*fGlobalSingleMinus[i];
1193 // unlike sign low, high and all pt
1194 for (i=0; i<3; i++) {
1195 fGlobalPairUnlike[i]=fGlobalSingleMinus[i]*fGlobalSinglePlus[i] +
1196 fGlobalSingleUndef[i]*(fGlobalSingleUndef[i]-1)/2 +
1197 fGlobalSingleUndef[i]*fGlobalSinglePlus[i] +
1198 fGlobalSingleUndef[i]*fGlobalSingleMinus[i];
1203 printf("===================================================\n");
1204 printf(" Global Trigger output Low pt High pt All\n");
1205 printf(" number of Single Plus :\t");
1206 for (i=0; i<3; i++) printf("%i\t",fGlobalSinglePlus[i]);
1208 printf(" number of Single Minus :\t");
1209 for (i=0; i<3; i++) printf("%i\t",fGlobalSingleMinus[i]);
1211 printf(" number of Single Undefined :\t");
1212 for (i=0; i<3; i++) printf("%i\t",fGlobalSingleUndef[i]);
1214 printf(" number of UnlikeSign pair :\t");
1215 for (i=0; i<3; i++) printf("%i\t",fGlobalPairUnlike[i]);
1217 printf(" number of LikeSign pair :\t");
1218 for (i=0; i<3; i++) printf("%i\t",fGlobalPairLike[i]);
1220 printf("===================================================\n");
1224 //----------------------------------------------------------------------
1225 void AliMUONTriggerDecision::PrintBitPatXInput(Int_t icirc){
1226 // print bit pattern for X strips
1230 printf("-------- TRIGGER INPUT ---------\n");
1231 printf("===============================================================\n");
1232 printf(" 5432109876543210");
1233 printf("\n XMC11 ");
1234 for (istrip=15; istrip>=0; istrip--) printf("%i",fXbit11[icirc][istrip]);
1235 printf("\n XMC12 ");
1236 for (istrip=15; istrip>=0; istrip--) printf("%i",fXbit12[icirc][istrip]);
1237 printf("\n XMC21 ");
1238 for (istrip=31; istrip>=0; istrip--) printf("%i",fXbit21[icirc][istrip]);
1239 printf("\n XMC22 ");
1240 for (istrip=31; istrip>=0; istrip--) printf("%i",fXbit22[icirc][istrip]);
1242 printf("10987654321098765432109876543210\n");
1245 //----------------------------------------------------------------------
1246 void AliMUONTriggerDecision::PrintBitPatYInput(Int_t icirc){
1247 // print bit pattern for Y strips
1251 AliMUON *pMUON = (AliMUON*)gAlice->GetModule("MUON");
1252 AliMUONTriggerCircuit* triggerCircuit;
1253 triggerCircuit = &(pMUON->TriggerCircuit(icirc));
1254 Int_t idCircuit=triggerCircuit->GetIdCircuit();
1255 Int_t nStrip=triggerCircuit->GetNstripY();
1257 printf("---------------------------------------------------------------\n");
1259 for (istrip=nStrip-1; istrip>=0; istrip--) {
1260 if (istrip>9) printf("%i",istrip-10*Int_t(istrip/10));
1261 if (istrip<10) printf("%i",istrip);
1263 printf("\n YMC11 ");
1264 for (istrip=nStrip-1; istrip>=0; istrip--)
1265 printf("%i",fYbit11[icirc][istrip]);
1266 printf("\n YMC12 ");
1267 for (istrip=nStrip-1; istrip>=0; istrip--)
1268 printf("%i",fYbit12[icirc][istrip]);
1269 printf("\n YMC21 ");
1270 for (istrip=nStrip-1; istrip>=0; istrip--)
1271 printf("%i",fYbit21[icirc][istrip]);
1272 printf("\n YMC22 ");
1273 for (istrip=nStrip-1; istrip>=0; istrip--)
1274 printf("%i",fYbit22[icirc][istrip]);
1277 printf("---------------------------------------------------------------");
1278 printf("\n upper part of circuit %i",idCircuit);
1279 printf("\n UMC21 ");
1280 for (istrip=15; istrip>=0; istrip--) printf("%i",fYbit21U[icirc][istrip]);
1281 printf("\n UMC22 ");
1282 for (istrip=15; istrip>=0; istrip--) printf("%i", fYbit22U[icirc][istrip]);
1284 printf("\n lower part of circuit %i",idCircuit);
1285 printf("\n LMC21 ");
1286 for (istrip=15; istrip>=0; istrip--) printf("%i",fYbit21D[icirc][istrip]);
1287 printf("\n LMC22 ");
1288 for (istrip=15; istrip>=0; istrip--) printf("%i",fYbit22D[icirc][istrip]);
1290 printf("===============================================================\n");
1292 //----------------------------------------------------------------------
1293 void AliMUONTriggerDecision::PrintLocalOutput(Int_t minDevStrip[5],
1296 // print Local trigger output before the LuT step
1300 printf("===============================================================\n");
1301 printf("-------- TRIGGER OUTPUT --------\n");
1302 printf("minDevStrip = ");
1303 for (i=4; i>=0; i--) printf("%i",minDevStrip[i]);
1304 printf(" minDev = ");
1305 for (i=4; i>=0; i--) printf("%i",minDev[i]);
1306 printf(" coordY = ");
1307 for (i=4; i>=0; i--) printf("%i",coordY[i]);
1311 //----------------------------------------------------------------------
1312 //--- methods which return member data related info
1313 //----------------------------------------------------------------------
1314 Int_t AliMUONTriggerDecision::GetITrigger(Int_t icirc){
1315 // returns Local Trigger Status
1316 return fTrigger[icirc];
1318 //----------------------------------------------------------------------
1319 Int_t AliMUONTriggerDecision::GetStripX11(Int_t icirc){
1320 // returns fStripX11
1321 return fStripX11[icirc];
1323 //----------------------------------------------------------------------
1324 Int_t AliMUONTriggerDecision::GetDev(Int_t icirc){
1328 //----------------------------------------------------------------------
1329 Int_t AliMUONTriggerDecision::GetStripY11(Int_t icirc){
1330 // returns fStripY11;
1331 return fStripY11[icirc];
1333 //----------------------------------------------------------------------
1334 void AliMUONTriggerDecision::GetLutOutput(Int_t icirc, Int_t lpt[2],
1335 Int_t hpt[2], Int_t apt[2]){
1336 // returns Look up Table output
1337 for (Int_t i=0; i<2; i++) {
1338 lpt[i]=fLutLpt[icirc][i];
1339 hpt[i]=fLutHpt[icirc][i];
1340 apt[i]=fLutApt[icirc][i];
1343 //----------------------------------------------------------------------
1344 void AliMUONTriggerDecision::GetGlobalTrigger(Int_t singlePlus[3],
1345 Int_t singleMinus[3],
1346 Int_t singleUndef[3],
1347 Int_t pairUnlike[3],
1349 // returns Global Trigger information (0,1,2 : Lpt,Hpt,Apt)
1350 for (Int_t i=0; i<3; i++) {
1351 singlePlus[i] = fGlobalSinglePlus[i];
1352 singleMinus[i] = fGlobalSingleMinus[i];
1353 singleUndef[i] = fGlobalSingleUndef[i];
1354 pairUnlike[i] = fGlobalPairUnlike[i];
1355 pairLike[i] = fGlobalPairLike[i];
1358 //----------------------------------------------------------------------
1359 //--- end of methods which return member data related info
1360 //----------------------------------------------------------------------
1361 //----------------------------------------------------------------------
1363 void AliMUONTriggerDecision::AddLocalTrigger(const AliMUONLocalTrigger c){
1364 // Add a Local Trigger copy to the list
1365 AliMUON *MUON=(AliMUON*)gAlice->GetModule("MUON");
1366 MUON->AddLocalTrigger(c);