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.6 2001/01/26 21:57:09 morsch
18 Use access functions to AliMUONDigit member data.
20 Revision 1.5 2000/10/02 16:58:29 egangler
21 Cleaning of the code :
24 -> some useless includes removed or replaced by "class" statement
26 Revision 1.4 2000/07/03 11:54:57 morsch
27 AliMUONSegmentation and AliMUONHitMap have been replaced by AliSegmentation and AliHitMap in STEER
28 The methods GetPadIxy and GetPadXxy of AliMUONSegmentation have changed name to GetPadI and GetPadC.
30 Revision 1.3 2000/06/25 17:02:19 pcrochet
31 scope problem on HP, i declared once, pow replaced by TMath::Power (PH)
33 Revision 1.2 2000/06/15 07:58:49 morsch
34 Code from MUON-dev joined
36 Revision 1.1.2.8 2000/06/14 14:54:34 morsch
37 Complete redesign, make use of TriggerCircuit and TriggerLut (PC)
39 Revision 1.1.2.5 2000/04/26 19:59:57 morsch
42 Revision 1.1.2.4 2000/04/26 12:31:30 morsch
43 Modifications by P. Crochet:
44 - adapted to the new Trigger chamber geometry
45 - condition on soft background added
46 - contructor added in AliMUONTriggerDecision.h
47 - single-undefined taken into account in the output of GlobalTrigger()
50 Revision 1.1.2.3 2000/03/21 09:29:58 morsch
53 Revision 1.1.2.2 2000/03/21 09:24:34 morsch
54 Author and responsible for the code: Philippe Crochet
57 #include "AliMUONTriggerCircuit.h"
58 #include "AliMUONTriggerDecision.h"
59 #include "AliMUONTriggerLut.h"
60 #include "AliMUONHitMapA1.h"
63 #include "AliSegmentation.h"
64 #include "AliMUONResponse.h"
65 #include "AliMUONChamber.h"
66 #include "AliMUONDigit.h"
75 #include <TPostScript.h>
79 //----------------------------------------------------------------------
80 ClassImp(AliMUONTriggerDecision)
82 //----------------------------------------------------------------------
83 AliMUONTriggerDecision::AliMUONTriggerDecision(Int_t iprint)
86 fDebug = iprint; // print option
87 // iprint = 0 : don't print anything
88 // iprint = 1 : print Global Trigger Output
89 // iprint = 2 : print Local and Global Trigger Outputs
90 // iprint = 3 : iprint = 2 + detailed info on X strips
91 // iprint = 4 : iprint = 2 + detailed info on Y strip
92 // iprint = 5 : iprint = 2 + detailed info on X and Y strips
93 // Note : with iprint>2, the strips detailed info is given for all circuits
95 // Global Trigger information
100 for (i=0; i<3; i++) { // [0] : Low pt, [1] : High pt, [2] : All pt
101 fGlobalSinglePlus[i]=0; // tot num of single plus
102 fGlobalSingleMinus[i]=0; // tot num of single minus
103 fGlobalSingleUndef[i]=0; // tot num of single undefined
104 fGlobalPairUnlike[i]=0; // tot num of unlike-sign pairs
105 fGlobalPairLike[i]=0; // tot num of like-sign pairs
107 // Local Trigger information
108 for (icirc=0; icirc<234; icirc++){
109 fTrigger[icirc]=0; // trigger or not
110 fStripX11[icirc]=0; // X strip in MC11 which triggers
111 fDev[icirc]=0; // deviation which triggers
112 fStripY11[icirc]=0; // Y strip in MC11 which triggers
113 for (i=0; i<2; i++) { // pt information via LuT
114 fLutLpt[icirc][i]=fLutHpt[icirc][i]=fLutApt[icirc][i]=0;
118 for (icirc=0; icirc<234; icirc++) {
119 for (istrip=0; istrip<16; istrip++) {
120 fXbit11[icirc][istrip]=fXbit12[icirc][istrip]=0;
121 fYbit11[icirc][istrip]=fYbit12[icirc][istrip]=0;
122 fYbit21[icirc][istrip]=fYbit22[icirc][istrip]=0;
123 fYbit21U[icirc][istrip]=fYbit22U[icirc][istrip]=0;
124 fYbit21D[icirc][istrip]=fYbit22D[icirc][istrip]=0;
126 for (istrip=0; istrip<32; istrip++) {
127 fXbit21[icirc][istrip]=fXbit22[icirc][istrip]=0;
132 //----------------------------------------------------------------------
133 AliMUONTriggerDecision::~AliMUONTriggerDecision()
138 //----------------------------------------------------------------------
139 void AliMUONTriggerDecision::Trigger(){
140 // main method of the class which calls the overall Trigger procedure
141 // cout << " In AliMUONTriggerDecision::Trigger " << "\n";
147 Int_t coinc44=0, resetMid=0; // initialize coincidence
149 AliMUON *pMUON = (AliMUON*)gAlice->GetModule("MUON");
150 AliMUONTriggerCircuit* triggerCircuit;
152 for (Int_t icirc=0; icirc<234; icirc++) { // loop on circuits
153 triggerCircuit = &(pMUON->TriggerCircuit(icirc));
154 // Int_t idCircuit=triggerCircuit->GetIdCircuit();
156 Int_t minDevStrip[5], minDev[5], coordY[5];
157 for (Int_t i=0; i<5; i++) {
158 minDevStrip[i]=minDev[i]=coordY[i]=0;
160 Int_t x2m=triggerCircuit->GetX2m();
161 Int_t x2ud=triggerCircuit->GetX2ud();
162 Int_t orMud[2]={0,0};
163 triggerCircuit->GetOrMud(orMud);
166 TrigX(fXbit11[icirc],fXbit12[icirc],fXbit21[icirc],fXbit22[icirc],
167 coinc44, minDevStrip, minDev);
169 TrigY(fYbit11[icirc],fYbit12[icirc],fYbit21[icirc],fYbit22[icirc],
170 fYbit21U[icirc],fYbit21D[icirc],fYbit22U[icirc],fYbit22D[icirc],
171 x2m,x2ud,orMud,resetMid,coinc44,coordY);
174 LocalTrigger(icirc, minDevStrip, minDev, coordY, iTrigger);
176 if (iTrigger==1&&fDebug>1) {
177 PrintBitPatXInput(icirc);
178 PrintBitPatYInput(icirc);
179 PrintLocalOutput(minDevStrip, minDev, coordY);
181 } // end loop on circuits
183 // call Global Trigger
185 // cout << " Leaving AliMUONTriggerDecision::Trigger " << "\n";
188 //----------------------------------------------------------------------
189 void AliMUONTriggerDecision::ResetBit(){
190 // reset bit pattern, global and local trigger output tables to 0
196 for (icirc=0; icirc<234; icirc++) {
197 for (istrip=0; istrip<16; istrip++) {
198 fXbit11[icirc][istrip]=fXbit12[icirc][istrip]=0;
199 fYbit11[icirc][istrip]=fYbit12[icirc][istrip]=0;
200 fYbit21[icirc][istrip]=fYbit22[icirc][istrip]=0;
201 fYbit21U[icirc][istrip]=fYbit22U[icirc][istrip]=0;
202 fYbit21D[icirc][istrip]=fYbit22D[icirc][istrip]=0;
204 for (istrip=0; istrip<32; istrip++) {
205 fXbit21[icirc][istrip]=fXbit22[icirc][istrip]=0;
208 for (i=0; i<3; i++) {
209 fGlobalSinglePlus[i]=0;
210 fGlobalSingleMinus[i]=0;
211 fGlobalSingleUndef[i]=0;
212 fGlobalPairLike[i]=0;
213 fGlobalPairLike[i]=0;
215 for (icirc=0; icirc<234; icirc++){
220 for (i=0; i<2; i++) {
221 fLutLpt[icirc][i]=fLutHpt[icirc][i]=fLutApt[icirc][i]=0;
226 //----------------------------------------------------------------------
227 void AliMUONTriggerDecision::SetBit(){
228 // 1) loop over chambers and cathodes
230 // 3) remove soft background
231 // 4) set the bit patterns
233 AliMUON *pMUON = (AliMUON*)gAlice->GetModule("MUON");
234 AliMUONTriggerCircuit* triggerCircuit;
236 for (Int_t chamber=11; chamber<15; chamber++){
237 for (Int_t cathode=1; cathode<3; cathode++){
239 AliMUONChamber* iChamber;
240 AliSegmentation* segmentation;
242 TClonesArray *muonDigits = pMUON->DigitsAddress(chamber-1);
243 if (muonDigits == 0) return;
245 gAlice->ResetDigits();
247 Int_t nent=(Int_t)gAlice->TreeD()->GetEntries();
248 gAlice->TreeD()->GetEvent(nent-2+cathode-1);
249 Int_t ndigits = muonDigits->GetEntriesFast();
250 if (ndigits == 0) return;
252 iChamber = &(pMUON->Chamber(chamber-1));
253 segmentation=iChamber->SegmentationModel(cathode);
256 for (Int_t digit=0; digit<ndigits; digit++) {
257 mdig = (AliMUONDigit*)muonDigits->UncheckedAt(digit);
258 // get the center of the pad Id
259 Int_t ix=mdig->PadX();
260 Int_t iy=mdig->PadY();
261 // get the sum of the coded charge
262 // see coding convention in AliMUONChamberTrigger::DisIntegration
264 for (Int_t icharge=0; icharge<10; icharge++) {
265 sumCharge=sumCharge+mdig->TrackCharge(icharge);
267 // apply condition on soft background
268 Int_t testCharge=sumCharge-(Int_t(sumCharge/10))*10;
269 testCharge=sumCharge-testCharge*10;
270 if(sumCharge<=10||testCharge>0) {
272 Int_t code=TMath::Abs(ix)*100+iy;
273 if (ix<0) { code=-code; }
283 for (icirc=0; icirc<234; icirc++) {
284 triggerCircuit = &(pMUON->TriggerCircuit(icirc));
285 for (istrip=0; istrip<16; istrip++) {
286 if (triggerCircuit->GetXcode(0,istrip)==code)
287 fXbit11[icirc][istrip]=1;
292 for (icirc=0; icirc<234; icirc++) {
293 triggerCircuit = &(pMUON->TriggerCircuit(icirc));
294 for (istrip=0; istrip<16; istrip++) {
295 if (triggerCircuit->GetXcode(1,istrip)==code)
296 fXbit12[icirc][istrip]=1;
301 for (icirc=0; icirc<234; icirc++) {
302 triggerCircuit = &(pMUON->TriggerCircuit(icirc));
303 for (istrip=0; istrip<32; istrip++) {
304 if (triggerCircuit->GetXcode(2,istrip)==code)
305 fXbit21[icirc][istrip]=1;
310 for (icirc=0; icirc<234; icirc++) {
311 triggerCircuit = &(pMUON->TriggerCircuit(icirc));
312 for (istrip=0; istrip<32; istrip++) {
313 if (triggerCircuit->GetXcode(3,istrip)==code)
314 fXbit22[icirc][istrip]=1;
324 for (icirc=0; icirc<234; icirc++) {
325 triggerCircuit = &(pMUON->TriggerCircuit(icirc));
326 nStrip=triggerCircuit->GetNstripY();
327 for (istrip=0; istrip<nStrip; istrip++) {
328 if (triggerCircuit->GetYcode(0,istrip)==code)
329 fYbit11[icirc][istrip]=1;
334 for (icirc=0; icirc<234; icirc++) {
335 triggerCircuit = &(pMUON->TriggerCircuit(icirc));
336 nStrip=triggerCircuit->GetNstripY();
337 for (istrip=0; istrip<nStrip; istrip++) {
338 if (triggerCircuit->GetYcode(1,istrip)==code)
339 fYbit12[icirc][istrip]=1;
344 for (icirc=0; icirc<234; icirc++) {
345 triggerCircuit = &(pMUON->TriggerCircuit(icirc));
346 nStrip=triggerCircuit->GetNstripY();
347 for (istrip=0; istrip<nStrip; istrip++) {
348 if (triggerCircuit->GetYcode(2,istrip)==code)
349 fYbit21[icirc][istrip]=1;
354 for (icirc=0; icirc<234; icirc++) {
355 triggerCircuit = &(pMUON->TriggerCircuit(icirc));
356 nStrip=triggerCircuit->GetNstripY();
357 for (istrip=0; istrip<nStrip; istrip++) {
358 if (triggerCircuit->GetYcode(3,istrip)==code)
359 fYbit22[icirc][istrip]=1;
365 } // remove soft background
366 } // end loop on digit
367 } // end loop on cathode
368 } // end loop on chamber
371 //----------------------------------------------------------------------
372 void AliMUONTriggerDecision::SetBitUpDownY(){
373 // Set Y bit for up and down parts of circuits
374 Int_t idModule, nStripX, nStripY, iPosCircuit;
376 AliMUON *pMUON = (AliMUON*)gAlice->GetModule("MUON");
378 for (Int_t icirc=0; icirc<234; icirc++) {
380 AliMUONTriggerCircuit* circuit; // current circuit
381 AliMUONTriggerCircuit* circuitD; // circuit Down
382 AliMUONTriggerCircuit* circuitU; // circuit Up
384 circuit = &(pMUON->TriggerCircuit(icirc));
385 idModule=circuit->GetIdModule(); // corresponding module Id.
386 nStripX=circuit->GetNstripX(); // number of X strips
387 nStripY=circuit->GetNstripY(); // number of Y strips
388 iPosCircuit=circuit->GetPosCircuit(); // position of circuit in module
391 if (iPosCircuit==1) { // need to scan lower module
392 if(idModule<91&&TMath::Abs(idModule)!=41&&idModule>-91) {
393 Int_t icircD=circuit->GetICircuitD();
394 circuitD = &(pMUON->TriggerCircuit(icircD));
395 Int_t nStripD=circuitD->GetNstripY();
397 if (TMath::Abs(idModule)==42) { // shift of +8 bits
398 for (Int_t istrip=0; istrip<nStripD; istrip++) {
399 fYbit21D[icirc][istrip+8]=fYbit21[icircD][istrip];
400 fYbit22D[icirc][istrip+8]=fYbit22[icircD][istrip];
402 } else if (TMath::Abs(idModule)==52) { // shift of -8 bits
403 for (Int_t istrip=0; istrip<nStripD; istrip++) {
404 fYbit21D[icirc][istrip]=fYbit21[icircD][istrip+8];
405 fYbit22D[icirc][istrip]=fYbit22[icircD][istrip+8];
408 for (Int_t istrip=0; istrip<nStripD; istrip++) {
409 fYbit21D[icirc][istrip]=fYbit21[icircD][istrip];
410 fYbit22D[icirc][istrip]=fYbit22[icircD][istrip];
414 } else { // lower strips within same module
415 for (Int_t istrip=0; istrip<nStripY; istrip++) {
416 fYbit21D[icirc][istrip]=fYbit21[icirc][istrip];
417 fYbit22D[icirc][istrip]=fYbit22[icirc][istrip];
422 if ((iPosCircuit==1&&nStripX==16)||(iPosCircuit==2&&nStripX==32)||
423 (iPosCircuit==3&&nStripX==48)||(iPosCircuit==4&&nStripX==64)) {
424 if ((idModule>17||idModule<-17)&&TMath::Abs(idModule)!=61) {
425 Int_t icircU=circuit->GetICircuitU();
426 circuitU = &(pMUON->TriggerCircuit(icircU));
427 Int_t nStripU=circuitU->GetNstripY();
429 if (TMath::Abs(idModule)==62) { // shift of +8 bits
430 for (Int_t istrip=0; istrip<nStripU; istrip++) {
431 fYbit21U[icirc][istrip+8]=fYbit21[icircU][istrip];
432 fYbit22U[icirc][istrip+8]=fYbit22[icircU][istrip];
434 } else if (TMath::Abs(idModule)==52) { // shift of -8 bits
435 for (Int_t istrip=0; istrip<nStripU; istrip++) {
436 fYbit21U[icirc][istrip]=fYbit21[icircU][istrip+8];
437 fYbit22U[icirc][istrip]=fYbit22[icircU][istrip+8];
440 for (Int_t istrip=0; istrip<nStripU; istrip++) {
441 fYbit21U[icirc][istrip]=fYbit21[icircU][istrip];
442 fYbit22U[icirc][istrip]=fYbit22[icircU][istrip];
446 } else { // upper strips within same module
447 for (Int_t istrip=0; istrip<nStripY; istrip++) {
448 fYbit21U[icirc][istrip]=fYbit21[icirc][istrip];
449 fYbit22U[icirc][istrip]=fYbit22[icirc][istrip];
455 //----------------------------------------------------------------------
456 // x part of trigger Algo
457 //----------------------------------------------------------------------
458 //----------------------------------------------------------------------
459 void AliMUONTriggerDecision::TrigX(Int_t ch1q[16], Int_t ch2q[16],
460 Int_t ch3q[32], Int_t ch4q[32],
461 Int_t coinc44, Int_t minDevStrip[5],
463 // note : coinc44 = flag 0 or 1 (0 coincidence -> 3/4, 1 coincidence -> 4/4)
464 //---------------------------------------------------------
465 // step # 1 : declustering, reduction DS, calculate sgle & dble
466 //---------------------------------------------------------
467 Int_t ch1e[19], ch2e[20], ch3e[35], ch4e[36];
468 Int_t sgleHit1[31], sgleHit2[63];
469 Int_t dbleHit1[31], dbleHit2[63];
475 for (i=0; i<31; i++) {
479 for (i=0; i<63; i++) {
484 //--- inititialize che using chq
485 for (i=0; i<19; i++) {
486 if (i<1||i>16) ch1e[i]=0;
487 else ch1e[i]=ch1q[i-1];
489 for (i=0; i<20; i++) {
490 if (i<2||i>17) ch2e[i]=0;
491 else ch2e[i]=ch2q[i-2];
493 for (i=0; i<35; i++) {
494 if (i<1||i>32) ch3e[i]=0;
495 else ch3e[i]=ch3q[i-1];
497 for (i=0; i<36; i++) {
498 if (i<2||i>33) ch4e[i]=0;
499 else ch4e[i]=ch4q[i-2];
503 //--- calculate dble & sgle first station
504 for (i=0; i<=15; i++) {
505 sgleHit1[2*i] = (!ch1e[i+1]|(ch1e[i]^ch1e[i+2])) &
506 (!ch2e[i+2] | (ch2e[i+1]^ch2e[i+3]));
508 dbleHit1[2*i] = ch1e[i+1]&!(ch1e[i+2]^ch1e[i]) &
509 (ch2e[i+2] | (!ch2e[i]&ch2e[i+1]) | (ch2e[i+3]&!ch2e[i+4]));
512 for (i=0; i<=14; i++) {
513 sgleHit1[2*i+1] = (!ch1e[i+1]|!ch1e[i+2]|(ch1e[i]^ch1e[i+3])) &
514 (!ch2e[i+2] | !ch2e[i+3] | (ch2e[i+1]^ch2e[i+4]));
515 dbleHit1[2*i+1] = ch1e[i+1]&ch1e[i+2]&!(ch1e[i]^ch1e[i+3]) &
516 (ch2e[i+2]&(!ch2e[i+1]|!ch2e[i]) |
517 ch2e[i+3]&(ch2e[i+2]|!ch2e[i+4]|!ch2e[i+5]));
520 //--- calculate dble & sgle second station
521 for (i=0; i<=31; i++) {
522 sgleHit2[2*i] = (!ch3e[i+1]|(ch3e[i]^ch3e[i+2])) &
523 (!ch4e[i+2] | (ch4e[i+1]^ch4e[i+3]));
524 dbleHit2[2*i] = ch3e[i+1]&!(ch3e[i+2]^ch3e[i]) &
525 (ch4e[i+2] | (!ch4e[i]&ch4e[i+1]) | (ch4e[i+3]&!ch4e[i+4]));
528 for (i=0; i<=30; i++) {
529 sgleHit2[2*i+1] = (!ch3e[i+1]|!ch3e[i+2]|(ch3e[i]^ch3e[i+3])) &
530 (!ch4e[i+2] | !ch4e[i+3] | (ch4e[i+1]^ch4e[i+4]));
531 dbleHit2[2*i+1] = ch3e[i+1]&ch3e[i+2]&!(ch3e[i]^ch3e[i+3]) &
532 (ch4e[i+2]&(!ch4e[i+1]|!ch4e[i]) |
533 ch4e[i+3]&(ch4e[i+2]|!ch4e[i+4]|!ch4e[i+5]));
537 if(fDebug==3||fDebug==5) {
538 cout << "===============================================================" << "\n";
539 cout << " X plane after sgle and dble " << " \n";
540 cout << " 0987654321098765432109876543210";
542 for (istrip=30; istrip>=0; istrip--) { cout << (!sgleHit1[istrip]); }
544 for (istrip=30; istrip>=0; istrip--) { cout << dbleHit1[istrip]; }
546 for (istrip=62; istrip>=0; istrip--) { cout << (!sgleHit2[istrip]); }
548 for (istrip=62; istrip>=0; istrip--) { cout << dbleHit2[istrip]; }
549 cout << "\n 210987654321098765432109876543210987654321098765432109876543210" << "\n";
552 //---------------------------------------------------------
553 // step # 2 : coincidence 3/4
554 //---------------------------------------------------------
555 Int_t rearImage[31][31];
556 for (i=0; i<31; i++) {
557 for (j=0; j<31; j++) {
562 Int_t notOr1=!dbleHit1[30] & !dbleHit1[29] & !dbleHit1[28] & !dbleHit1[27] &
563 !dbleHit1[26] & !dbleHit1[25] & !dbleHit1[24] & !dbleHit1[23] &
564 !dbleHit1[22] & !dbleHit1[21] & !dbleHit1[20] & !dbleHit1[19] &
565 !dbleHit1[18] & !dbleHit1[17] & !dbleHit1[16] & !dbleHit1[15] &
566 !dbleHit1[14] & !dbleHit1[13] & !dbleHit1[12] & !dbleHit1[11] &
567 !dbleHit1[10] & !dbleHit1[9] & !dbleHit1[8] & !dbleHit1[7] &
568 !dbleHit1[6] & !dbleHit1[5] & !dbleHit1[4] & !dbleHit1[3] &
569 !dbleHit1[2] & !dbleHit1[1] & !dbleHit1[0] & !coinc44;
571 Int_t notOr2= !dbleHit2[62] & !dbleHit2[61] & !dbleHit2[60] & !dbleHit2[59] &
572 !dbleHit2[58] & !dbleHit2[57] & !dbleHit2[56] & !dbleHit2[55] &
573 !dbleHit2[54] & !dbleHit2[53] & !dbleHit2[52] & !dbleHit2[51] &
574 !dbleHit2[50] & !dbleHit2[49] & !dbleHit2[48] & !dbleHit2[47] &
575 !dbleHit2[46] & !dbleHit2[45] & !dbleHit2[44] & !dbleHit2[43] &
576 !dbleHit2[42] & !dbleHit2[41] & !dbleHit2[40] & !dbleHit2[39] &
577 !dbleHit2[38] & !dbleHit2[37] & !dbleHit2[36] & !dbleHit2[35] &
578 !dbleHit2[34] & !dbleHit2[33] & !dbleHit2[32] & !dbleHit2[31] &
579 !dbleHit2[30] & !dbleHit2[29] & !dbleHit2[28] & !dbleHit2[27] &
580 !dbleHit2[26] & !dbleHit2[25] & !dbleHit2[24] & !dbleHit2[23] &
581 !dbleHit2[22] & !dbleHit2[21] & !dbleHit2[20] & !dbleHit2[19] &
582 !dbleHit2[18] & !dbleHit2[17] & !dbleHit2[16] & !dbleHit2[15] &
583 !dbleHit2[14] & !dbleHit2[13] & !dbleHit2[12] & !dbleHit2[11] &
584 !dbleHit2[10] & !dbleHit2[9] & !dbleHit2[8] & !dbleHit2[7] &
585 !dbleHit2[6] & !dbleHit2[5] & !dbleHit2[4] & !dbleHit2[3] &
586 !dbleHit2[2] & !dbleHit2[1] & !dbleHit2[0] & !coinc44;
589 for (i=0; i<31; i++) {
590 sgleHit1[i] = !sgleHit1[i]¬Or1;
592 for (i=0; i<63; i++) {
593 sgleHit2[i] = !sgleHit2[i]¬Or2;
597 for (i=0; i<31; i++){
598 Int_t tmpSgleHit2[31];
599 Int_t tmpDbleHit2[31];
600 for (j=0; j<31; j++){
601 tmpSgleHit2[j] = sgleHit2[i+j+1];
602 tmpDbleHit2[j] = dbleHit2[i+j+1];
605 for (Int_t k=0; k<31; k++) {
606 rearImage[i][k]=(sgleHit1[i]&tmpDbleHit2[k])|
607 (dbleHit1[i]&(tmpSgleHit2[k]|tmpDbleHit2[k]));
612 if(fDebug==3||fDebug==5) {
613 cout << "===============================================================" << "\n";
614 for (i=30; i>=0; i--) {
616 for (istrip=31; istrip>=0; istrip--) {
617 cout << rearImage[i][istrip];
624 //---------------------------------------------------------
625 // step # 3 : calculate deviation
626 //---------------------------------------------------------
628 for (i=0; i<31; i++) {
629 for (j=0; j<6; j++) {
634 for (i=0; i<31; i++){
635 Int_t leftDev[5], rightDev[5];
636 Int_t orL1, andL1, andL2, orR1, orR2, andR1, andR2, andR3;
638 // calculate Left deviation
639 orL1=rearImage[i][16]|rearImage[i][18]|rearImage[i][20]|rearImage[i][22];
640 andL1=!rearImage[i][17]&!rearImage[i][19]&!rearImage[i][21] & !orL1;
641 andL2=!rearImage[i][23]&!rearImage[i][24]&!rearImage[i][25]&!rearImage[i][26];
643 leftDev[0] = (rearImage[i][16]|!rearImage[i][17]) &
644 (rearImage[i][16]|rearImage[i][18]|!rearImage[i][19]&
645 (rearImage[i][20]|!rearImage[i][21])) &
646 (orL1|!rearImage[i][23]&(rearImage[i][24]|!rearImage[i][25])) &
647 (orL1|rearImage[i][24]|rearImage[i][26]|!rearImage[i][27]&
648 (rearImage[i][28]|!rearImage[i][29]));
650 leftDev[1] = !rearImage[i][16] &
651 !(!rearImage[i][17]&!rearImage[i][18]&!rearImage[i][21]&!rearImage[i][22] &
652 (!rearImage[i][25]&!rearImage[i][26]&(rearImage[i][27]|rearImage[i][28]))) &
653 (rearImage[i][17]|rearImage[i][18] | !rearImage[i][19]&!rearImage[i][20]) &
654 (rearImage[i][17]|rearImage[i][18]|rearImage[i][21]|rearImage[i][22] |
655 !rearImage[i][23]&!rearImage[i][24]);
657 leftDev[2] = (!rearImage[i][16]&!rearImage[i][17]&!rearImage[i][18]) &
658 (rearImage[i][19]|rearImage[i][20]|rearImage[i][21]|rearImage[i][22] | andL2);
663 !rearImage[i][27]&!rearImage[i][28]&!rearImage[i][29]&!rearImage[i][30] &
666 // calculate Right deviation
667 orR1=rearImage[i][8]|rearImage[i][10]|rearImage[i][12]|rearImage[i][14];
668 orR2=rearImage[i][8]|rearImage[i][9]|rearImage[i][10]|rearImage[i][11];
669 andR1=!rearImage[i][12]&!rearImage[i][13]&!rearImage[i][14]&!rearImage[i][15];
671 !rearImage[i][8]&!rearImage[i][9]&!rearImage[i][10]&!rearImage[i][11] & andR1;
672 andR3=!rearImage[i][4]&!rearImage[i][5]&!rearImage[i][6]&!rearImage[i][7];
674 rightDev[0] = !rearImage[i][15]&(rearImage[i][14]|!rearImage[i][13]) &
675 ((rearImage[i][12]|rearImage[i][14]|!rearImage[i][11]&
676 (rearImage[i][10]|!rearImage[i][9])) &
677 ((orR1|!rearImage[i][7]&(rearImage[i][6]|!rearImage[i][5])) &
678 (orR1|rearImage[i][4]|rearImage[i][6]|!rearImage[i][3]&(rearImage[i][2]|
679 !rearImage[i][1]))));
681 rightDev[1] = !rearImage[i][15]&!rearImage[i][14] &
682 !(!rearImage[i][4]&!rearImage[i][5]&!rearImage[i][8]&!rearImage[i][9] &
683 (!rearImage[i][12]&!rearImage[i][13]&(rearImage[i][2]|rearImage[i][3]))) &
684 (rearImage[i][12]|rearImage[i][13] | !rearImage[i][10]&!rearImage[i][11]) &
685 (rearImage[i][8]|rearImage[i][9]|rearImage[i][12]|rearImage[i][13] |
686 !rearImage[i][6]&!rearImage[i][7]);
688 rightDev[2] = andR1 & (orR2 | andR3);
691 !rearImage[i][0]&!rearImage[i][1]&!rearImage[i][2]&!rearImage[i][3] &
694 // compare Left & Right deviations
695 Int_t tmpLeftDev=0, tmpRightDev=0;
697 tmpLeftDev = tmpLeftDev + Int_t(leftDev[j]*TMath::Power(2,j));
698 tmpRightDev = tmpRightDev + Int_t(rightDev[j]*TMath::Power(2,j));
701 // assign mimimum deviation do dev[][]
702 if (tmpLeftDev < tmpRightDev ){
703 for (j=0; j<5; j++){ dev[i][j]=leftDev[j];}
706 for (j=0; j<5; j++){ dev[i][j]=rightDev[j];}
712 if(fDebug==3||fDebug==5) {
713 cout << "===============================================================" << "\n";
714 for (i=30; i>=0; i--) {
716 for (istrip=5; istrip>=0; istrip--) { cout << dev[i][istrip]; }
721 //---------------------------------------------------------
722 // step # 4 : sort deviation
723 //---------------------------------------------------------
724 Int_t bga1[16], bga2[8], bga3[4], bga4[2], bga5;
725 Int_t tmpbga1[16][6], tmpbga2[8][6], tmpbga3[4][6], tmpbga4[2][6], tmpbga5[6];
726 Int_t tmpMax[6]={1,1,1,1,1,0};
728 for (i=0; i<15; i++) {
729 Sort2x5(dev[2*i],dev[2*i+1],tmpbga1[i],bga1[i]);
731 Sort2x5(dev[30],tmpMax,tmpbga1[15],bga1[15]);
734 if(fDebug==3||fDebug==5) {
735 cout << "===============================================================" << "\n";
736 cout << " sorting : 1st level " << "\n";
737 for (i=15; i>=0; i--) {
738 cout << i << "\t " << bga1[i] << "\t";
739 for (j=5; j>=0; j--) {
740 cout << tmpbga1[i][j];
746 for (i=0; i<8; i++) {
747 Sort2x5(tmpbga1[2*i],tmpbga1[2*i+1],tmpbga2[i],bga2[i]);
751 if(fDebug==3||fDebug==5) {
752 cout << "===============================================================" << "\n";
753 cout << " sorting : 2nd level " << "\n";
754 for (i=7; i>=0; i--) {
755 cout << i << "\t " << bga2[i] << "\t";
756 for (j=5; j>=0; j--) {
757 cout << tmpbga2[i][j];
763 for (i=0; i<4; i++) {
764 Sort2x5(tmpbga2[2*i],tmpbga2[2*i+1],tmpbga3[i],bga3[i]);
768 if(fDebug==3||fDebug==5) {
769 cout << "===============================================================" << "\n";
770 cout << " sorting : 3rd level " << "\n";
771 for (i=3; i>=0; i--) {
772 cout << i << "\t " << bga3[i] << "\t";
773 for (j=5; j>=0; j--) {
774 cout << tmpbga3[i][j];
780 for (i=0; i<2; i++) {
781 Sort2x5(tmpbga3[2*i],tmpbga3[2*i+1],tmpbga4[i],bga4[i]);
785 if(fDebug==3||fDebug==5) {
786 cout << "===============================================================" << "\n";
787 cout << " sorting : 4th level " << "\n";
788 for (i=1; i>=0; i--) {
789 cout << i << "\t " << bga4[i] << "\t";
790 for (j=5; j>=0; j--) {
791 cout << tmpbga4[i][j];
797 Sort2x5(tmpbga4[0],tmpbga4[1],tmpbga5,bga5);
799 // coding from 6 to 5 bits
800 minDev[4] = tmpbga5[5] | tmpbga5[4];
801 for (i=0; i<4; i++) {
802 minDev[i]=tmpbga5[i] & !tmpbga5[4];
805 // find address of strip with minimum deviation
807 if (bga5<=1) minDevStrip[3]=bga4[bga5];
809 Int_t tmpAd=minDevStrip[3]+minDevStrip[4]*2;
810 if (tmpAd<=3) minDevStrip[2]=bga3[tmpAd];
812 tmpAd=minDevStrip[2]+minDevStrip[3]*2+minDevStrip[4]*4;
813 if (tmpAd<=7) minDevStrip[1]=bga2[tmpAd];
815 tmpAd=minDevStrip[1]+minDevStrip[2]*2+minDevStrip[3]*4+minDevStrip[4]*8;
816 if (tmpAd<=15) minDevStrip[0]=bga1[tmpAd];
818 if(fDebug==3||fDebug==5) {
819 cout << "===============================================================" << "\n";
820 cout << "minDevStrip = ";
821 for (i=4; i>=0; i--) {cout << minDevStrip[i];}
822 cout << " minDev = ";
823 for (i=4; i>=0; i--) {cout << minDev[i];}
825 cout << "===============================================================" << "\n";
830 //---------------------------------------------
831 void AliMUONTriggerDecision::Sort2x5(Int_t dev1[6], Int_t dev2[6],
832 Int_t minDev[6], Int_t &dev1GTdev2){
833 // returns minimun between dev1 and dev2
834 Int_t tmpDev1=0, tmpDev2=0;
835 for (Int_t j=0; j<5; j++){
836 tmpDev1 = tmpDev1 + Int_t(dev1[j]*TMath::Power(2,j));
837 tmpDev2 = tmpDev2 + Int_t(dev2[j]*TMath::Power(2,j));
839 if (tmpDev1 <= tmpDev2 ){
840 for (Int_t j=0; j<=5; j++) { minDev[j]=dev1[j];}
843 for (Int_t j=0; j<=5; j++) { minDev[j]=dev2[j];}
848 //----------------------------------------------------------------------
849 // y part of trigger Algo
850 //----------------------------------------------------------------------
851 //----------------------------------------------------------------------
852 void AliMUONTriggerDecision::TrigY(Int_t y1[16], Int_t y2[16],
853 Int_t y3[16], Int_t y4[16],
854 Int_t y3u[16], Int_t y3d[16],
855 Int_t y4u[16], Int_t y4d[16],
856 Int_t x2m, Int_t x2ud, Int_t orMud[2],
857 Int_t resetMid, Int_t coinc44,
859 // note : resMid = 1 -> cancel
860 //---------------------------------------------------------
861 // step # 1 : prehandling Y
862 //---------------------------------------------------------
866 for (i=0; i<16; i++){
867 y3[i]=y3[i]&!resetMid;
868 y4[i]=y4[i]&!resetMid;
871 Int_t ch1[16], ch2[16], ch3[16], ch4[16];
873 Int_t tmpy3to16[16], tmpy4to16[16];
874 Int_t tmpy3uto16[16], tmpy3dto16[16], tmpy4uto16[16], tmpy4dto16[16];
876 ch1[2*i] = y1[i]&x2m | y1[2*i]&!x2m;
877 ch1[2*i+1] = y1[i]&x2m | y1[2*i+1]&!x2m;
879 ch2[2*i] = y2[i]&x2m | y2[2*i]&!x2m;
880 ch2[2*i+1] = y2[i]&x2m | y2[2*i+1]&!x2m;
882 tmpy3to16[2*i] = y3[i]&x2m | y3[2*i]&!x2m;
883 tmpy3to16[2*i+1] = y3[i]&x2m | y3[2*i+1]&!x2m;
885 tmpy4to16[2*i] = y4[i]&x2m | y4[2*i]&!x2m;
886 tmpy4to16[2*i+1] = y4[i]&x2m | y4[2*i+1]&!x2m;
888 tmpy3uto16[2*i] = y3u[i]&x2ud | y3u[2*i]&!x2ud;
889 tmpy3uto16[2*i+1] = y3u[i]&x2ud | y3u[2*i+1]&!x2ud;
891 tmpy4uto16[2*i] = y4u[i]&x2ud | y4u[2*i]&!x2ud;
892 tmpy4uto16[2*i+1] = y4u[i]&x2ud | y4u[2*i+1]&!x2ud;
894 tmpy3dto16[2*i] = y3d[i]&x2ud | y3d[2*i]&!x2ud;
895 tmpy3dto16[2*i+1] = y3d[i]&x2ud | y3d[2*i+1]&!x2ud;
897 tmpy4dto16[2*i] = y4d[i]&x2ud | y4d[2*i]&!x2ud;
898 tmpy4dto16[2*i+1] = y4d[i]&x2ud | y4d[2*i+1]&!x2ud;
901 if (orMud[0]==0&&orMud[1]==0){
902 for (i=0; i<16; i++){
903 ch3[i] = tmpy3to16[i];
904 ch4[i] = tmpy4to16[i];
907 if (orMud[0]==0&&orMud[1]==1){
908 for (i=0; i<16; i++){
909 ch3[i] = tmpy3uto16[i]|tmpy3to16[i];
910 ch4[i] = tmpy4uto16[i]|tmpy4to16[i];
913 if (orMud[0]==1&&orMud[1]==0){
914 for (i=0; i<16; i++){
915 ch3[i] = tmpy3dto16[i]|tmpy3to16[i];
916 ch4[i] = tmpy4dto16[i]|tmpy4to16[i];
919 if (orMud[0]==1&&orMud[1]==1){
920 for (i=0; i<16; i++){
921 ch3[i] = tmpy3dto16[i]|tmpy3to16[i]|tmpy3uto16[i];
922 ch4[i] = tmpy4dto16[i]|tmpy4to16[i]|tmpy4uto16[i];
927 if(fDebug==4||fDebug==5) {
928 cout << "===============================================================" << "\n";
929 cout << " Y plane after PreHandling x2m x2ud orMud "
930 << x2m << " , " << x2ud << " , " << orMud[0] << orMud[1] << "\n";
932 for (istrip=15; istrip>=0; istrip--) {
933 if (istrip>9) cout << istrip-10*Int_t(istrip/10);
934 if (istrip<10) cout << istrip;
937 for (istrip=15; istrip>=0; istrip--) {
941 for (istrip=15; istrip>=0; istrip--) {
945 for (istrip=15; istrip>=0; istrip--) {
949 for (istrip=15; istrip>=0; istrip--) {
956 //---------------------------------------------------------
957 // step # 2 : calculate sgle and dble, apply DS reduction
958 //---------------------------------------------------------
959 Int_t sgle1[16], dble1[16];
960 Int_t sgle2[16], dble2[16];
962 // Calculate simple and double hits
963 for (i=0; i<16; i++) {
964 dble1[i] = ch1[i] & ch2[i];
965 dble2[i] = ch3[i] & ch4[i];
967 sgle1[i] = (ch1[i]|ch2[i]);
968 sgle2[i] = (ch3[i]|ch4[i]);
972 if(fDebug==4||fDebug==5) {
973 cout << "===============================================================" << "\n";
974 cout << " Y plane after sgle dble " << "\n";
976 for (istrip=15; istrip>=0; istrip--) {
977 if (istrip>9) { cout << istrip-10*Int_t(istrip/10);}
978 if (istrip<10) { cout << istrip;}
981 for (istrip=15; istrip>=0; istrip--) {
982 cout << sgle1[istrip];
985 for (istrip=15; istrip>=0; istrip--) {
986 cout << dble1[istrip];
989 for (istrip=15; istrip>=0; istrip--) {
990 cout << sgle2[istrip];
993 for (istrip=15; istrip>=0; istrip--) {
994 cout << dble2[istrip];
1001 Int_t notOr1, notOr2;
1003 notOr1=!dble1[15] & !dble1[14] & !dble1[13] & !dble1[12] &
1004 !dble1[11] & !dble1[10] & !dble1[9] & !dble1[8] &
1005 !dble1[7] & !dble1[6] & !dble1[5] & !dble1[4] &
1006 !dble1[3] & !dble1[2] & !dble1[1] & !dble1[0];
1008 notOr2=!dble2[15] & !dble2[14] & !dble2[13] & !dble2[12] &
1009 !dble2[11] & !dble2[10] & !dble2[9] & !dble2[8] &
1010 !dble2[7] & !dble2[6] & !dble2[5] & !dble2[4] &
1011 !dble2[3] & !dble2[2] & !dble2[1] & !dble2[0];
1013 for (i=0; i<16; i++) {
1014 sgle1[i] = sgle1[i] & notOr1 & !coinc44;
1015 sgle2[i] = sgle2[i] & notOr2 & !coinc44;
1018 //---------------------------------------------------------
1019 // step # 3 : 3/4 coincidence
1020 //---------------------------------------------------------
1021 Int_t frontImage[16];
1023 for (i=1; i<15; i++) {
1024 frontImage[i] = (dble1[i] | sgle1[i]) &
1025 (dble2[i+1] | dble2[i] | dble2[i-1]) |
1026 dble1[i] & (sgle2[i+1] | sgle2[i] | sgle2[i-1]);
1028 frontImage[0] = (dble1[0] | sgle1[0]) &
1029 (dble2[1] | dble2[0]) | dble1[0] & (sgle2[1] | sgle2[0]);
1031 frontImage[15] = (dble1[15] | sgle1[15]) &
1032 (dble2[15] | dble2[14]) | dble1[15] & (sgle2[15] | sgle2[14]);
1036 if(fDebug==4||fDebug==5) {
1037 cout << "===============================================================" << "\n";
1038 cout << " Y plane frontImage\n";
1040 for (istrip=15; istrip>=0; istrip--) {
1041 if (istrip>9) cout << istrip-10*Int_t(istrip/10);
1042 if (istrip<10) cout << istrip;
1045 for (istrip=15; istrip>=0; istrip--) {
1046 cout << frontImage[istrip];
1052 //---------------------------------------------------------
1053 // step # 4 : Y position
1054 //---------------------------------------------------------
1055 Int_t or1, or2, and1, and2, and3;
1057 or1 = frontImage[7]|frontImage[5]|frontImage[3]|frontImage[1];
1058 or2 = frontImage[7]|frontImage[6]|frontImage[5]|frontImage[4];
1059 and1 = !frontImage[3]&!frontImage[2]&!frontImage[1]&!frontImage[0];
1060 and2 = !frontImage[7]&!frontImage[6]&!frontImage[5]&!frontImage[4] & and1;
1061 and3 = !frontImage[11]&!frontImage[10]&!frontImage[9]&!frontImage[8];
1063 coordY[0] = !frontImage[0]&(frontImage[1]|!frontImage[2]) &
1064 (frontImage[3]|frontImage[1]|!frontImage[4]&(frontImage[5]|!frontImage[6])) &
1065 (or1|!frontImage[8]&(frontImage[9]|!frontImage[10])) &
1066 (or1|frontImage[11]|frontImage[9]|!frontImage[12]&(frontImage[13]|!frontImage[14]));
1068 coordY[1] = !frontImage[0]&!frontImage[1] &
1069 !(!frontImage[11]&!frontImage[10]&!frontImage[7]&!frontImage[6] &
1070 !frontImage[3]&!frontImage[2]&(frontImage[13]|frontImage[12])) &
1071 (frontImage[3]|frontImage[2] | !frontImage[5]&!frontImage[4]) &
1072 (frontImage[7]|frontImage[6]|frontImage[3]|frontImage[2] |
1073 !frontImage[9]&!frontImage[8]);
1075 coordY[2] = and1 & (or2 | and3);
1079 coordY[4] = !frontImage[15]&!frontImage[14]&!frontImage[13]&!frontImage[12] &
1083 //----------------------------------------------------------------------
1084 // end of trigger Algo
1085 //----------------------------------------------------------------------
1087 //----------------------------------------------------------------------
1088 void AliMUONTriggerDecision::LocalTrigger(Int_t icirc,
1089 Int_t minDevStrip[5],
1090 Int_t minDev[5], Int_t coordY[5],
1092 // returns local trigger answer for circuit icirc
1095 AliMUON *pMUON = (AliMUON*)gAlice->GetModule("MUON");
1096 AliMUONTriggerCircuit* triggerCircuit;
1097 triggerCircuit = &(pMUON->TriggerCircuit(icirc));
1098 Int_t idCircuit=triggerCircuit->GetIdCircuit();
1100 Int_t signDev=minDev[4];
1102 for (i=0; i<4; i++) { // extract deviation
1103 deviation = deviation+Int_t(minDev[i]*TMath::Power(2,i));
1106 Int_t istripX1Circ=0;
1107 for (i=0; i<5; i++) { // extract X1 strip fired
1108 istripX1Circ = istripX1Circ+Int_t(minDevStrip[i]*TMath::Power(2,i));
1112 for (i=0; i<4; i++) { // extract Y strip fired
1113 iStripY = iStripY+Int_t(coordY[i]*TMath::Power(2,i));
1117 if (signDev==1&&deviation==0) { // something in X ?
1120 if (coordY[4]==1&&iStripY==15) { // something in Y ?
1128 // fill fTrigger fStripX11 fStripY11
1129 fTrigger[icirc] = 1;
1130 fStripX11[icirc] = istripX1Circ;
1131 fStripY11[icirc] = iStripY;
1133 // calculate deviation in [0+30]
1135 if (signDev==0&&deviation!=0) sign=-1;
1136 if (signDev==0&&deviation==0) sign=0;
1137 if (signDev==1) sign=1;
1138 fDev[icirc] = sign * deviation + 15; // fill fDev
1140 // get Lut output for circuit/istripX/idev/istripY
1141 AliMUONTriggerLut* lut = new AliMUONTriggerLut;
1142 // lut->StartEvent();
1143 lut->GetLutOutput(icirc,fStripX11[icirc],fDev[icirc],fStripY11[icirc],
1144 fLutLpt[icirc],fLutHpt[icirc],fLutApt[icirc]);
1145 // lut->FinishEvent();
1149 Float_t pt= // get ptCal corresponding to istripX1Circ/idev/iStripY
1150 triggerCircuit->PtCal(fStripX11[icirc],fDev[icirc],fStripY11[icirc]);
1151 cout << "-------------------------------------------" << "\n";
1152 cout << " Local Trigger info for circuit Id " << idCircuit
1153 << " (number " << icirc << ")" << "\n";
1154 cout << " istripX1 signDev deviation istripY = "
1155 << istripX1Circ << " , " << signDev
1156 << " , " << deviation << " , " << iStripY << "\n";
1157 cout << " pt = " << pt << " (GeV/c) " << "\n";
1158 cout << "-------------------------------------------" << "\n";
1159 cout << " Local Trigger Lut Output = Lpt : " ;
1160 for (i=1; i>=0; i--) { cout << fLutLpt[icirc][i] ; }
1162 for (i=1; i>=0; i--) { cout << fLutHpt[icirc][i] ; }
1164 for (i=1; i>=0; i--) { cout << fLutApt[icirc][i] ; }
1166 cout << "-------------------------------------------" << "\n";
1168 } // local trigger = 1
1171 //----------------------------------------------------------------------
1172 void AliMUONTriggerDecision::GlobalTrigger(){
1173 // loop on Lut[icirc] and give Global Trigger output
1176 for (Int_t icirc=0; icirc<234; icirc++){
1177 if (fLutLpt[icirc][0]==1&&fLutLpt[icirc][1]==1)
1178 fGlobalSingleUndef[0] = fGlobalSingleUndef[0] + 1;
1179 if (fLutHpt[icirc][0]==1&&fLutHpt[icirc][1]==1)
1180 fGlobalSingleUndef[1] = fGlobalSingleUndef[1] + 1;
1181 if (fLutApt[icirc][0]==1&&fLutApt[icirc][1]==1)
1182 fGlobalSingleUndef[2] = fGlobalSingleUndef[2] + 1;
1184 if (fLutLpt[icirc][0]==0&&fLutLpt[icirc][1]==1)
1185 fGlobalSinglePlus[0] = fGlobalSinglePlus[0] + 1;
1186 if (fLutHpt[icirc][0]==0&&fLutHpt[icirc][1]==1)
1187 fGlobalSinglePlus[1] = fGlobalSinglePlus[1] + 1;
1188 if (fLutApt[icirc][0]==0&&fLutApt[icirc][1]==1)
1189 fGlobalSinglePlus[2] = fGlobalSinglePlus[2] + 1;
1191 if (fLutLpt[icirc][0]==1&&fLutLpt[icirc][1]==0)
1192 fGlobalSingleMinus[0] = fGlobalSingleMinus[0] + 1;
1193 if (fLutHpt[icirc][0]==1&&fLutHpt[icirc][1]==0)
1194 fGlobalSingleMinus[1] = fGlobalSingleMinus[1] + 1;
1195 if (fLutApt[icirc][0]==1&&fLutApt[icirc][1]==0)
1196 fGlobalSingleMinus[2] = fGlobalSingleMinus[2] + 1;
1199 // like sign low, high and all pt
1200 for (i=0; i<3; i++) {
1201 fGlobalPairLike[i]=fGlobalSingleMinus[i]*(fGlobalSingleMinus[i]-1)/2 +
1202 fGlobalSinglePlus[i]*(fGlobalSinglePlus[i]-1)/2 +
1203 fGlobalSingleUndef[i]*(fGlobalSingleUndef[i]-1)/2 +
1204 fGlobalSingleUndef[i]*fGlobalSinglePlus[i] +
1205 fGlobalSingleUndef[i]*fGlobalSingleMinus[i];
1208 // unlike sign low, high and all pt
1209 for (i=0; i<3; i++) {
1210 fGlobalPairUnlike[i]=fGlobalSingleMinus[i]*fGlobalSinglePlus[i] +
1211 fGlobalSingleUndef[i]*(fGlobalSingleUndef[i]-1)/2 +
1212 fGlobalSingleUndef[i]*fGlobalSinglePlus[i] +
1213 fGlobalSingleUndef[i]*fGlobalSingleMinus[i];
1218 cout << "===================================================" << "\n";
1219 cout << " Global Trigger output " << "Low pt High pt All" << "\n";
1220 cout << " number of Single Plus :\t";
1221 for (i=0; i<3; i++) { cout << fGlobalSinglePlus[i] <<"\t";}
1223 cout << " number of Single Minus :\t";
1224 for (i=0; i<3; i++) { cout << fGlobalSingleMinus[i] <<"\t";}
1226 cout << " number of Single Undefined :\t";
1227 for (i=0; i<3; i++) { cout << fGlobalSingleUndef[i] <<"\t";}
1229 cout << " number of UnlikeSign pair :\t";
1230 for (i=0; i<3; i++) { cout << fGlobalPairUnlike[i] <<"\t";}
1232 cout << " number of LikeSign pair :\t";
1233 for (i=0; i<3; i++) { cout << fGlobalPairLike[i] <<"\t";}
1235 cout << "===================================================" << "\n";
1239 //----------------------------------------------------------------------
1240 void AliMUONTriggerDecision::PrintBitPatXInput(Int_t icirc){
1241 // print bit pattern for X strips
1245 cout << "-------- TRIGGER INPUT ---------" << "\n";
1246 cout << "===============================================================" << "\n";
1247 cout << " 5432109876543210";
1248 cout << "\n XMC11 ";
1249 for (istrip=15; istrip>=0; istrip--) {
1250 cout << fXbit11[icirc][istrip];
1252 cout << "\n XMC12 ";
1253 for (istrip=15; istrip>=0; istrip--) {
1254 cout << fXbit12[icirc][istrip];
1256 cout << "\n XMC21 ";
1257 for (istrip=31; istrip>=0; istrip--) {
1258 cout << fXbit21[icirc][istrip];
1260 cout << "\n XMC22 ";
1261 for (istrip=31; istrip>=0; istrip--) {
1262 cout << fXbit22[icirc][istrip];
1265 cout << "10987654321098765432109876543210" << "\n";
1268 //----------------------------------------------------------------------
1269 void AliMUONTriggerDecision::PrintBitPatYInput(Int_t icirc){
1270 // print bit pattern for Y strips
1274 AliMUON *pMUON = (AliMUON*)gAlice->GetModule("MUON");
1275 AliMUONTriggerCircuit* triggerCircuit;
1276 triggerCircuit = &(pMUON->TriggerCircuit(icirc));
1277 Int_t idCircuit=triggerCircuit->GetIdCircuit();
1278 Int_t nStrip=triggerCircuit->GetNstripY();
1280 cout << "---------------------------------------------------------------" << "\n";
1282 for (istrip=nStrip-1; istrip>=0; istrip--) {
1283 if (istrip>9) { cout << istrip-10*Int_t(istrip/10);}
1284 if (istrip<10) { cout << istrip;}
1286 cout << "\n YMC11 ";
1287 for (istrip=nStrip-1; istrip>=0; istrip--) {
1288 cout << fYbit11[icirc][istrip];
1290 cout << "\n YMC12 ";
1291 for (istrip=nStrip-1; istrip>=0; istrip--) {
1292 cout << fYbit12[icirc][istrip];
1294 cout << "\n YMC21 ";
1295 for (istrip=nStrip-1; istrip>=0; istrip--) {
1296 cout << fYbit21[icirc][istrip];
1298 cout << "\n YMC22 ";
1299 for (istrip=nStrip-1; istrip>=0; istrip--) {
1300 cout << fYbit22[icirc][istrip];
1304 cout << "---------------------------------------------------------------";
1305 cout << "\n upper part of circuit " << idCircuit ;
1306 cout << "\n UMC21 ";
1307 for (istrip=15; istrip>=0; istrip--) {
1308 cout << fYbit21U[icirc][istrip];
1310 cout << "\n UMC22 ";
1311 for (istrip=15; istrip>=0; istrip--) {
1312 cout << fYbit22U[icirc][istrip];
1315 cout << "\n lower part of circuit " << idCircuit ;
1316 cout << "\n LMC21 ";
1317 for (istrip=15; istrip>=0; istrip--) {
1318 cout << fYbit21D[icirc][istrip];
1320 cout << "\n LMC22 ";
1321 for (istrip=15; istrip>=0; istrip--) {
1322 cout << fYbit22D[icirc][istrip];
1325 cout << "===============================================================" << "\n";
1327 //----------------------------------------------------------------------
1328 void AliMUONTriggerDecision::PrintLocalOutput(Int_t minDevStrip[5],
1331 // print Local trigger output before the LuT step
1335 cout << "===============================================================" << "\n";
1336 cout << "-------- TRIGGER OUTPUT --------" << "\n";
1337 cout << "minDevStrip = ";
1338 for (i=4; i>=0; i--) {cout << minDevStrip[i];}
1339 cout << " minDev = ";
1340 for (i=4; i>=0; i--) {cout << minDev[i];}
1341 cout << " coordY = ";
1342 for (i=4; i>=0; i--) {cout << coordY[i];}
1343 cout << " " << "\n";
1346 //----------------------------------------------------------------------
1347 //--- methods which return member data related info
1348 //----------------------------------------------------------------------
1349 Int_t AliMUONTriggerDecision::GetITrigger(Int_t icirc){
1350 // returns Local Trigger Status
1351 return fTrigger[icirc];
1353 //----------------------------------------------------------------------
1354 Int_t AliMUONTriggerDecision::GetStripX11(Int_t icirc){
1355 // returns fStripX11
1356 return fStripX11[icirc];
1358 //----------------------------------------------------------------------
1359 Int_t AliMUONTriggerDecision::GetDev(Int_t icirc){
1363 //----------------------------------------------------------------------
1364 Int_t AliMUONTriggerDecision::GetStripY11(Int_t icirc){
1365 // returns fStripY11;
1366 return fStripY11[icirc];
1368 //----------------------------------------------------------------------
1369 void AliMUONTriggerDecision::GetLutOutput(Int_t icirc, Int_t lpt[2],
1370 Int_t hpt[2], Int_t apt[2]){
1371 // returns Look up Table output
1372 for (Int_t i=0; i<2; i++) {
1373 lpt[i]=fLutLpt[icirc][i];
1374 hpt[i]=fLutHpt[icirc][i];
1375 apt[i]=fLutApt[icirc][i];
1378 //----------------------------------------------------------------------
1379 void AliMUONTriggerDecision::GetGlobalTrigger(Int_t singlePlus[3],
1380 Int_t singleMinus[3],
1381 Int_t singleUndef[3],
1382 Int_t pairUnlike[3],
1384 // returns Global Trigger information (0,1,2 : Lpt,Hpt,Apt)
1385 for (Int_t i=0; i<3; i++) {
1386 singlePlus[i] = fGlobalSinglePlus[i];
1387 singleMinus[i] = fGlobalSingleMinus[i];
1388 singleUndef[i] = fGlobalSingleUndef[i];
1389 pairUnlike[i] = fGlobalPairUnlike[i];
1390 pairLike[i] = fGlobalPairLike[i];
1393 //----------------------------------------------------------------------
1394 //--- end of methods which return member data related info
1395 //----------------------------------------------------------------------
1396 //----------------------------------------------------------------------
1398 void AliMUONTriggerDecision::AddLocalTrigger(const AliMUONLocalTrigger c){
1399 // Add a Local Trigger copy to the list
1400 AliMUON *MUON=(AliMUON*)gAlice->GetModule("MUON");
1401 MUON->AddLocalTrigger(c);