]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - MUON/AliMUONTriggerDecision.cxx
Suppressed warning from fkSegmentation->PadByPosition(...)
[u/mrichter/AliRoot.git] / MUON / AliMUONTriggerDecision.cxx
index 7c25b613bcce3186c65881087b1272e80ea245ce..8a487c182fdc9bee118dcf29978a3e4444fd00c7 100644 (file)
  * about the suitability of this software for any purpose. It is          *
  * provided "as is" without express or implied warranty.                  *
  **************************************************************************/
-/*
-$Log$
-Revision 1.10  2002/10/23 07:24:56  alibrary
-Introducing Riostream.h
 
-Revision 1.9  2001/03/23 17:31:32  pcrochet
-correct access to digits in SetBit()
+/* $Id$ */
 
-Revision 1.8  2001/03/20 16:13:01  pcrochet
-bug fixed in the rejection of soft background (thanks to FM)
-
-Revision 1.7  2001/03/20 13:32:37  egangler
-includes cleanup
-
-Revision 1.6  2001/01/26 21:57:09  morsch
-Use access functions to AliMUONDigit member data.
-
-Revision 1.5  2000/10/02 16:58:29  egangler
-Cleaning of the code :
--> coding conventions
--> void Streamers
--> some useless includes removed or replaced by "class" statement
-
-Revision 1.4  2000/07/03 11:54:57  morsch
-AliMUONSegmentation and AliMUONHitMap have been replaced by AliSegmentation and AliHitMap in STEER
-The methods GetPadIxy and GetPadXxy of AliMUONSegmentation have changed name to GetPadI and GetPadC.
-
-Revision 1.3  2000/06/25 17:02:19  pcrochet
-scope problem on HP, i declared once, pow replaced by TMath::Power (PH)
-
-Revision 1.2  2000/06/15 07:58:49  morsch
-Code from MUON-dev joined
-
-Revision 1.1.2.8  2000/06/14 14:54:34  morsch
-Complete redesign, make use of TriggerCircuit and TriggerLut (PC)
-
-Revision 1.1.2.5  2000/04/26 19:59:57  morsch
-Constructor added.
-
-Revision 1.1.2.4  2000/04/26 12:31:30  morsch
-Modifications by P. Crochet:
-- adapted to the new Trigger chamber geometry
-- condition on soft background added
-- contructor added in AliMUONTriggerDecision.h
-- single-undefined taken into account in the output of GlobalTrigger()
-- some bugs fixed
-
-Revision 1.1.2.3  2000/03/21 09:29:58  morsch
-Put back comments
-
-Revision 1.1.2.2  2000/03/21 09:24:34  morsch
-Author and responsible for the code: Philippe Crochet
-*/
+#include <TError.h>
 
 #include "AliMUONTriggerCircuit.h"
 #include "AliMUONTriggerDecision.h"
 #include "AliMUONTriggerLut.h"
-#include "AliMUONHitMapA1.h"
-#include "AliRun.h"
 #include "AliMUON.h"
-#include "AliSegmentation.h"
-#include "AliMUONResponse.h"
-#include "AliMUONChamber.h"
 #include "AliMUONDigit.h"
+#include "AliMUONConstants.h"
+#include "AliMUONGlobalTrigger.h"
+#include "AliMUONLocalTrigger.h"
+#include "AliRun.h"
+#include "AliRunLoader.h"
+#include "AliLoader.h"
+#include "AliRawReader.h" // for raw data
+#include "AliLog.h"
 
 
-#include <TF1.h>
-#include <TTree.h>
-#include <TCanvas.h>
-#include <TH1.h>
-#include <TPad.h>
-#include <TGraph.h> 
-#include <TPostScript.h> 
-#include <TMinuit.h> 
-#include <Riostream.h> 
-
 //----------------------------------------------------------------------
 ClassImp(AliMUONTriggerDecision)
 
 //----------------------------------------------------------------------
-AliMUONTriggerDecision::AliMUONTriggerDecision(Int_t iprint)
+AliMUONTriggerDecision::AliMUONTriggerDecision(AliLoader* loader, Int_t iprint, AliMUONData* data)
+  : TObject()
 {
 // Constructor 
   fDebug = iprint;            // print option
@@ -139,14 +84,129 @@ AliMUONTriggerDecision::AliMUONTriggerDecision(Int_t iprint)
       fXbit21[icirc][istrip]=fXbit22[icirc][istrip]=0;
     }
   }
+
+  fTriggerCircuit = new TObjArray(AliMUONConstants::NTriggerCircuit());
+
+  // initialize loader's
+  fLoader = loader;
+
+  // initialize container
+  if (data == 0){
+    AliError("No MUONdata for trigger");
+  }else{
+    fMUONData = data;
+  }
+
+  // getting MUON
+  fMUON = (AliMUON*) gAlice->GetDetector("MUON");
+
+  // setting circuit
+  for (icirc = 0; icirc < AliMUONConstants::NTriggerCircuit(); icirc++) {
+    AliMUONTriggerCircuit* pCir = 0;
+    pCir = &(fMUON->TriggerCircuit(icirc));
+    fTriggerCircuit->AddAt(pCir, icirc);
+  }
+
+  // setting digits
+  fDigits = new TObjArray(AliMUONConstants::NCh()); //NTriggerCh
+  for (Int_t i=0; i<AliMUONConstants::NCh() ;i++) 
+    fDigits->AddAt(new TClonesArray("AliMUONDigit",10000),i);
+  fDigitIndices = new TArrayI[AliMUONConstants::NCh()];
+}
+
+//----------------------------------------------------------------------
+AliMUONTriggerDecision::AliMUONTriggerDecision()
+  : TObject(),
+    fLoader(0),
+    fTriggerCircuit(0),
+    fMUONData(0),
+    fMUON(0)
+{
+// Default constructor
+  fDigitIndices = NULL;
+}
+
+//----------------------------------------------------------------------
+AliMUONTriggerDecision::AliMUONTriggerDecision(const AliMUONTriggerDecision& rhs)
+  : TObject(rhs) 
+{
+// Protected copy constructor
+
+  AliFatal("Not implemented.");
+}
+
+//----------------------------------------------------------------------
+void AliMUONTriggerDecision::ClearDigits()
+{
+  for ( int i=0;i<AliMUONConstants::NCh();i++ )
+  {
+    if ((*fDigits)[i]) ((TClonesArray*)fDigits->At(i))->Clear();
+    fDigitIndices[i].Set(0);
+  };
+}
+
+//----------------------------------------------------------------------
+TClonesArray* AliMUONTriggerDecision::Digits(Int_t DetectionPlane)
+{
+  //Getting List of Digits
+  if (fDigits)
+    return ((TClonesArray*) fDigits->At(DetectionPlane));
+  else
+    return NULL;
+}
+
+//_____________________________________________________________________________
+void AliMUONTriggerDecision::AddDigit(
+               Int_t id, Int_t *tracks, Int_t *charges, Int_t *digits,
+               Int_t digitindex
+       )
+{
+  //
+  // Add a MUON digit to the list of Digits of the detection plane id
+  // Also adds the digit index to the corresponding fDigitIndices arrays.
+  //
+  TClonesArray &ldigits = *Digits(id); 
+  new(ldigits[ldigits.GetEntriesFast()]) AliMUONDigit(tracks,charges,digits);
+
+  TArrayI& indices = fDigitIndices[id];
+  indices.Set(indices.GetSize() + 1);
+  indices[indices.GetSize() - 1] = digitindex;
 }
 
 //----------------------------------------------------------------------
 AliMUONTriggerDecision::~AliMUONTriggerDecision()
 {
 // Destructor
+  if (fTriggerCircuit){
+    fTriggerCircuit->Clear();// Sets pointers to 0 since it is not the owner
+    delete fTriggerCircuit;
+  } 
+//   if (fMUONData)
+//     delete fMUONData;
+
+  if (fDigits) {
+    fDigits->Delete();
+    delete fDigits;
+  }
+
+  if (fDigitIndices)
+    delete [] fDigitIndices;
 }
 
+//----------------------------------------------------------------------
+AliMUONTriggerDecision& 
+AliMUONTriggerDecision::operator=(const AliMUONTriggerDecision& rhs)
+{
+// Protected assignement operator
+
+  if (this == &rhs) return *this;
+
+  AliFatal("Not implemented.");
+    
+  return *this;  
+}    
+          
+
 //----------------------------------------------------------------------
 void AliMUONTriggerDecision::Trigger(){
 // main method of the class which calls the overall Trigger procedure
@@ -157,11 +217,10 @@ void AliMUONTriggerDecision::Trigger(){
 
   Int_t coinc44=0, resetMid=0; // initialize coincidence
 
-  AliMUON *pMUON  = (AliMUON*)gAlice->GetModule("MUON");  
   AliMUONTriggerCircuit* triggerCircuit;
 
   for (Int_t icirc=0; icirc<234; icirc++) {  // loop on circuits
-    triggerCircuit = &(pMUON->TriggerCircuit(icirc));            
+    triggerCircuit = (AliMUONTriggerCircuit*)fTriggerCircuit->At(icirc);         
     //    Int_t idCircuit=triggerCircuit->GetIdCircuit(); 
     
     Int_t minDevStrip[5], minDev[5], coordY[5];
@@ -240,48 +299,34 @@ void AliMUONTriggerDecision::SetBit(){
 // 3) remove soft background
 // 4) set the bit patterns
 
-  AliMUON *pMUON  = (AliMUON*)gAlice->GetModule("MUON");  
+  Int_t cathode;
   AliMUONTriggerCircuit* triggerCircuit;
 
-  for (Int_t chamber=11; chamber<15; chamber++){
-    for (Int_t cathode=1; cathode<3; cathode++){
-      
-      AliMUONChamber*   iChamber;
-      AliSegmentation*  segmentation;
-      
-      TClonesArray *muonDigits  = pMUON->DigitsAddress(chamber-1);
-      if (muonDigits == 0) return;
-      
-      gAlice->ResetDigits();
-      Int_t nent = 0;
-      
-      if (gAlice->TreeD()) {
-       nent = (Int_t) gAlice->TreeD()->GetEntries();
-       //printf(" entries %d \n", nent);
-       //     gAlice->TreeD()->GetEvent(nent-2+cathode-1);
-       gAlice->TreeD()->GetEvent(cathode-1);
-      }
-      
+  for (Int_t chamber = 11; chamber < 15; chamber++){
+
+      TClonesArray *muonDigits = Digits(chamber-1);
       Int_t ndigits = muonDigits->GetEntriesFast();
-      if (ndigits == 0) return;
-      
-      iChamber = &(pMUON->Chamber(chamber-1));
-      segmentation=iChamber->SegmentationModel(cathode);
+      AliDebug(3,Form("Found %d digits in %p %d", ndigits, (void*)muonDigits,chamber-1));
+
       AliMUONDigit  *mdig;
       
-      for (Int_t digit=0; digit<ndigits; digit++) {
+      for (Int_t digit = 0; digit < ndigits; digit++) {
        mdig    = (AliMUONDigit*)muonDigits->UncheckedAt(digit);
 // get the center of the pad Id 
        Int_t ix=mdig->PadX();
        Int_t iy=mdig->PadY();
+       cathode = mdig->Cathode() + 1;
+       AliDebug(3,Form("cathode %d ix %d iy %d ",cathode,ix,iy));
+
 // get the sum of the coded charge 
 // see coding convention in AliMUONChamberTrigger::DisIntegration      
        Int_t sumCharge=0;
        for (Int_t icharge=0; icharge<10; icharge++) {
          sumCharge=sumCharge+mdig->TrackCharge(icharge);
        }
+
 // apply condition on soft background  
-       Int_t testCharge=sumCharge-(Int_t(sumCharge/10))*10;
+       Int_t testCharge=sumCharge-(Int_t(sumCharge/10))*10;    
        if(sumCharge<=10||testCharge>0) {         
 // code pad
          Int_t code=TMath::Abs(ix)*100+iy;
@@ -291,42 +336,59 @@ void AliMUONTriggerDecision::SetBit(){
          Int_t istrip;
          Int_t nStrip;
 
+          // If I want to fetch the digits as in MUONCheck.C then I need to
+          // know the correct digit index. These were stored in fDigitIndices
+          // by the digitizer so we just need to fetch the correct value.
+          Int_t digitindex = fDigitIndices[chamber-1][digit];
+
          if (cathode==1) {
            switch (chamber)
              {
              case 11:
                for (icirc=0; icirc<234; icirc++) {               
-                 triggerCircuit = &(pMUON->TriggerCircuit(icirc));       
+                 triggerCircuit = (AliMUONTriggerCircuit*) fTriggerCircuit->At(icirc);  
                  for (istrip=0; istrip<16; istrip++) {
-                   if (triggerCircuit->GetXcode(0,istrip)==code) 
+                   if (triggerCircuit->GetXcode(0,istrip)==code)
+                    {
                      fXbit11[icirc][istrip]=1;
+                      DigitFiredCircuit(icirc, cathode-1, chamber-1, digitindex);
+                    };
                  }
                }
                break;
              case 12:
                for (icirc=0; icirc<234; icirc++) {
-                 triggerCircuit = &(pMUON->TriggerCircuit(icirc));       
+                 triggerCircuit = (AliMUONTriggerCircuit*)fTriggerCircuit->At(icirc);
                  for (istrip=0; istrip<16; istrip++) {
                    if (triggerCircuit->GetXcode(1,istrip)==code) 
+                    {
                      fXbit12[icirc][istrip]=1;
+                      DigitFiredCircuit(icirc, cathode-1, chamber-1, digitindex);
+                    };
                  }
                }
                break;
              case 13:
                for (icirc=0; icirc<234; icirc++) {
-                 triggerCircuit = &(pMUON->TriggerCircuit(icirc));       
+                 triggerCircuit = (AliMUONTriggerCircuit*)fTriggerCircuit->At(icirc); 
                  for (istrip=0; istrip<32; istrip++) {
                    if (triggerCircuit->GetXcode(2,istrip)==code) 
+                    {
                      fXbit21[icirc][istrip]=1;
+                      DigitFiredCircuit(icirc, cathode-1, chamber-1, digitindex);
+                    };
                  }
                }
                break;
              case 14:
                for (icirc=0; icirc<234; icirc++) {
-                 triggerCircuit = &(pMUON->TriggerCircuit(icirc));       
+                 triggerCircuit = (AliMUONTriggerCircuit*)fTriggerCircuit->At(icirc);
                  for (istrip=0; istrip<32; istrip++) {
                    if (triggerCircuit->GetXcode(3,istrip)==code) 
+                    {
                      fXbit22[icirc][istrip]=1;             
+                      DigitFiredCircuit(icirc, cathode-1, chamber-1, digitindex);
+                    };
                  }
                }               
                break;
@@ -337,41 +399,53 @@ void AliMUONTriggerDecision::SetBit(){
              {
              case 11:
                for (icirc=0; icirc<234; icirc++) {
-                 triggerCircuit = &(pMUON->TriggerCircuit(icirc));       
+                 triggerCircuit = (AliMUONTriggerCircuit*)fTriggerCircuit->At(icirc);
                  nStrip=triggerCircuit->GetNstripY();
                  for (istrip=0; istrip<nStrip; istrip++) {
                    if (triggerCircuit->GetYcode(0,istrip)==code) 
+                    {
                      fYbit11[icirc][istrip]=1;
+                      DigitFiredCircuit(icirc, cathode-1, chamber-1, digitindex);
+                    };
                  }
                }
                break;
              case 12:
                for (icirc=0; icirc<234; icirc++) {
-                 triggerCircuit = &(pMUON->TriggerCircuit(icirc));       
+                 triggerCircuit = (AliMUONTriggerCircuit*)fTriggerCircuit->At(icirc);
                  nStrip=triggerCircuit->GetNstripY(); 
                  for (istrip=0; istrip<nStrip; istrip++) {
                    if (triggerCircuit->GetYcode(1,istrip)==code) 
+                    {
                      fYbit12[icirc][istrip]=1;
+                      DigitFiredCircuit(icirc, cathode-1, chamber-1, digitindex);
+                    };
                  }
                }
                break;
              case 13:
                for (icirc=0; icirc<234; icirc++) {
-                 triggerCircuit = &(pMUON->TriggerCircuit(icirc));       
+                 triggerCircuit = (AliMUONTriggerCircuit*)fTriggerCircuit->At(icirc);
                  nStrip=triggerCircuit->GetNstripY();    
                  for (istrip=0; istrip<nStrip; istrip++) {
                    if (triggerCircuit->GetYcode(2,istrip)==code) 
+                    {
                      fYbit21[icirc][istrip]=1;
+                      DigitFiredCircuit(icirc, cathode-1, chamber-1, digitindex);
+                    };
                  }
                }
                break;
              case 14:
                for (icirc=0; icirc<234; icirc++) {
-                 triggerCircuit = &(pMUON->TriggerCircuit(icirc));       
+                 triggerCircuit = (AliMUONTriggerCircuit*)fTriggerCircuit->At(icirc);
                  nStrip=triggerCircuit->GetNstripY();    
                  for (istrip=0; istrip<nStrip; istrip++) {
                    if (triggerCircuit->GetYcode(3,istrip)==code) 
+                    {
                      fYbit22[icirc][istrip]=1;                          
+                      DigitFiredCircuit(icirc, cathode-1, chamber-1, digitindex);
+                    };
                  }
                }               
                break;
@@ -379,7 +453,8 @@ void AliMUONTriggerDecision::SetBit(){
          } // if cathode
        }  // remove soft background
       }   // end loop on digit
-    }    // end loop on cathode
+      fMUONData->ResetDigits();
+//  }    // end loop on cathode
   }     // end loop on chamber
 }  
 
@@ -388,7 +463,6 @@ void AliMUONTriggerDecision::SetBitUpDownY(){
 // Set Y bit for up and down parts of circuits
   Int_t idModule, nStripX, nStripY, iPosCircuit;
 
-  AliMUON *pMUON  = (AliMUON*)gAlice->GetModule("MUON");
   
   for (Int_t icirc=0; icirc<234; icirc++) {
 
@@ -396,7 +470,7 @@ void AliMUONTriggerDecision::SetBitUpDownY(){
     AliMUONTriggerCircuit* circuitD;  // circuit Down
     AliMUONTriggerCircuit* circuitU;  // circuit Up
 
-    circuit = &(pMUON->TriggerCircuit(icirc));  
+    circuit = (AliMUONTriggerCircuit*)fTriggerCircuit->At(icirc);  
     idModule=circuit->GetIdModule();      // corresponding module Id.
     nStripX=circuit->GetNstripX();        // number of X strips
     nStripY=circuit->GetNstripY();        // number of Y strips
@@ -406,7 +480,7 @@ void AliMUONTriggerDecision::SetBitUpDownY(){
     if (iPosCircuit==1) {               // need to scan lower module       
       if(idModule<91&&TMath::Abs(idModule)!=41&&idModule>-91) { 
        Int_t icircD=circuit->GetICircuitD();
-       circuitD = &(pMUON->TriggerCircuit(icircD));  
+       circuitD = (AliMUONTriggerCircuit*)fTriggerCircuit->At(icircD);  
        Int_t nStripD=circuitD->GetNstripY();
                
        if (TMath::Abs(idModule)==42) { // shift of +8 bits
@@ -438,7 +512,7 @@ void AliMUONTriggerDecision::SetBitUpDownY(){
        (iPosCircuit==3&&nStripX==48)||(iPosCircuit==4&&nStripX==64)) {   
       if ((idModule>17||idModule<-17)&&TMath::Abs(idModule)!=61) {  
        Int_t icircU=circuit->GetICircuitU();
-       circuitU = &(pMUON->TriggerCircuit(icircU));  
+       circuitU = (AliMUONTriggerCircuit*)fTriggerCircuit->At(icircU);  
        Int_t nStripU=circuitU->GetNstripY();           
        
        if (TMath::Abs(idModule)==62) { // shift of +8 bits
@@ -706,8 +780,8 @@ void AliMUONTriggerDecision::TrigX(Int_t ch1q[16], Int_t ch2q[16],
  // compare Left & Right deviations
  Int_t tmpLeftDev=0, tmpRightDev=0;
  for (j=0; j<5; j++){
-   tmpLeftDev  = tmpLeftDev + Int_t(leftDev[j]*TMath::Power(2,j)); 
-   tmpRightDev = tmpRightDev + Int_t(rightDev[j]*TMath::Power(2,j)); 
+   tmpLeftDev  = tmpLeftDev + Int_t(leftDev[j]<<j); 
+   tmpRightDev = tmpRightDev + Int_t(rightDev[j]<<j); 
  }
 
  // assign mimimum deviation do dev[][]
@@ -837,8 +911,8 @@ void AliMUONTriggerDecision::Sort2x5(Int_t dev1[6], Int_t dev2[6],
 // returns minimun between dev1 and dev2
  Int_t tmpDev1=0, tmpDev2=0;
  for (Int_t j=0; j<5; j++){
-   tmpDev1 = tmpDev1 + Int_t(dev1[j]*TMath::Power(2,j)); 
-   tmpDev2 = tmpDev2 + Int_t(dev2[j]*TMath::Power(2,j)); 
+   tmpDev1 = tmpDev1 + Int_t(dev1[j]<<j); 
+   tmpDev2 = tmpDev2 + Int_t(dev2[j]<<j); 
  }
  if (tmpDev1 <= tmpDev2 ){
    for (Int_t j=0; j<=5; j++) { minDev[j]=dev1[j];}
@@ -1078,25 +1152,24 @@ void AliMUONTriggerDecision::LocalTrigger(Int_t icirc,
 // returns local trigger answer for circuit icirc
   Int_t i;
 
-  AliMUON *pMUON  = (AliMUON*)gAlice->GetModule("MUON");  
   AliMUONTriggerCircuit* triggerCircuit;
-  triggerCircuit = &(pMUON->TriggerCircuit(icirc));      
+  triggerCircuit = (AliMUONTriggerCircuit*) fTriggerCircuit->At(icirc);          
   Int_t idCircuit=triggerCircuit->GetIdCircuit();
   
   Int_t signDev=minDev[4];   
   Int_t deviation=0;
   for (i=0; i<4; i++) {          // extract deviation
-    deviation = deviation+Int_t(minDev[i]*TMath::Power(2,i));   
+    deviation = deviation+Int_t(minDev[i]<<i);   
   }
   
   Int_t istripX1Circ=0;
   for (i=0; i<5; i++) {          // extract X1 strip fired 
-    istripX1Circ = istripX1Circ+Int_t(minDevStrip[i]*TMath::Power(2,i));   
+    istripX1Circ = istripX1Circ+Int_t(minDevStrip[i]<<i);   
   }
   
   Int_t iStripY=0;
   for (i=0; i<4; i++) {          // extract Y strip fired 
-    iStripY = iStripY+Int_t(coordY[i]*TMath::Power(2,i));   
+      iStripY = iStripY+Int_t(coordY[i]<<i);   
   }
 
 // trigger or not 
@@ -1199,7 +1272,6 @@ void AliMUONTriggerDecision::GlobalTrigger(){
   }
   
   if (fDebug>=1) {
-    printf("\n");
     printf("===================================================\n");
     printf(" Global Trigger output       Low pt  High pt   All\n");
     printf(" number of Single Plus      :\t");
@@ -1218,6 +1290,7 @@ void AliMUONTriggerDecision::GlobalTrigger(){
     for (i=0; i<3; i++) printf("%i\t",fGlobalPairLike[i]);
     printf("\n");
     printf("===================================================\n");
+    printf("\n");
   }
 }
 
@@ -1248,9 +1321,8 @@ void AliMUONTriggerDecision::PrintBitPatYInput(Int_t icirc){
 
     Int_t istrip;
 
-  AliMUON *pMUON  = (AliMUON*)gAlice->GetModule("MUON");  
   AliMUONTriggerCircuit* triggerCircuit;
-  triggerCircuit = &(pMUON->TriggerCircuit(icirc));      
+  triggerCircuit = (AliMUONTriggerCircuit*) fTriggerCircuit->At(icirc);          
   Int_t idCircuit=triggerCircuit->GetIdCircuit();
   Int_t nStrip=triggerCircuit->GetNstripY();
 
@@ -1289,6 +1361,7 @@ void AliMUONTriggerDecision::PrintBitPatYInput(Int_t icirc){
   printf("\n");
   printf("===============================================================\n");
 }
+
 //----------------------------------------------------------------------
 void AliMUONTriggerDecision::PrintLocalOutput(Int_t minDevStrip[5], 
                                              Int_t minDev[5], 
@@ -1311,28 +1384,28 @@ void AliMUONTriggerDecision::PrintLocalOutput(Int_t minDevStrip[5],
 //----------------------------------------------------------------------
 //--- methods which return member data related info
 //----------------------------------------------------------------------
-Int_t AliMUONTriggerDecision::GetITrigger(Int_t icirc){
+Int_t AliMUONTriggerDecision::GetITrigger(Int_t icirc) const{
 // returns Local Trigger Status
   return fTrigger[icirc];
 }
 //----------------------------------------------------------------------
-Int_t AliMUONTriggerDecision::GetStripX11(Int_t icirc){
+Int_t AliMUONTriggerDecision::GetStripX11(Int_t icirc) const{
 // returns fStripX11
   return fStripX11[icirc];
 }
 //----------------------------------------------------------------------
-Int_t AliMUONTriggerDecision::GetDev(Int_t icirc){
+Int_t AliMUONTriggerDecision::GetDev(Int_t icirc) const{
 // returns idev
   return fDev[icirc];
 }
 //----------------------------------------------------------------------
-Int_t AliMUONTriggerDecision::GetStripY11(Int_t icirc){
+Int_t AliMUONTriggerDecision::GetStripY11(Int_t icirc) const{
 // returns fStripY11;
    return fStripY11[icirc];
 }
 //----------------------------------------------------------------------
 void AliMUONTriggerDecision::GetLutOutput(Int_t icirc, Int_t lpt[2], 
-                                         Int_t hpt[2], Int_t apt[2]){
+                                         Int_t hpt[2], Int_t apt[2]) const {
 // returns Look up Table output
   for (Int_t i=0; i<2; i++) {
     lpt[i]=fLutLpt[icirc][i];
@@ -1345,8 +1418,9 @@ void AliMUONTriggerDecision::GetGlobalTrigger(Int_t singlePlus[3],
                                              Int_t singleMinus[3], 
                                              Int_t singleUndef[3],
                                              Int_t pairUnlike[3], 
-                                             Int_t pairLike[3]){
+                                             Int_t pairLike[3]) const {
 // returns Global Trigger information (0,1,2 : Lpt,Hpt,Apt)
+// should not be used anymore.
   for (Int_t i=0; i<3; i++) { 
     singlePlus[i]  = fGlobalSinglePlus[i];
     singleMinus[i] = fGlobalSingleMinus[i];
@@ -1355,15 +1429,78 @@ void AliMUONTriggerDecision::GetGlobalTrigger(Int_t singlePlus[3],
     pairLike[i]    = fGlobalPairLike[i];    
   }
 }
-//----------------------------------------------------------------------
-//--- end of methods which return member data related info
-//----------------------------------------------------------------------
-//----------------------------------------------------------------------
-/*
-void AliMUONTriggerDecision::AddLocalTrigger(const AliMUONLocalTrigger c){
-// Add a Local Trigger copy to the list
-  AliMUON *MUON=(AliMUON*)gAlice->GetModule("MUON");
-  MUON->AddLocalTrigger(c); 
-  fNLocalTriggers++;
+
+//_______________________________________________________________________
+void AliMUONTriggerDecision::Digits2Trigger(){
+// call the Trigger Algorithm and fill TreeD
+
+  ClearDigitNumbers();
+
+  fMUONData->ResetTrigger();
+  Trigger();   
+  AliMUONGlobalTrigger* pGloTrig = new AliMUONGlobalTrigger(fGlobalSinglePlus, fGlobalSingleMinus,
+                                                      fGlobalSingleUndef, fGlobalPairUnlike, 
+                                                      fGlobalPairLike);  
+  // add a local trigger in the list 
+  fMUONData->AddGlobalTrigger(*pGloTrig);
+  
+  for (Int_t icirc=0; icirc<AliMUONConstants::NTriggerCircuit(); icirc++) { 
+    if(GetITrigger(icirc)==1) {
+      Int_t localtr[15]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};      
+      Int_t loLpt[2]={0,0}; Int_t loHpt[2]={0,0}; Int_t loApt[2]={0,0};
+      GetLutOutput(icirc, loLpt, loHpt, loApt);
+      localtr[0] = icirc;
+      localtr[1] = GetStripX11(icirc);
+      localtr[2] = GetDev(icirc);
+      localtr[3] = GetStripY11(icirc);
+      for (Int_t i = 0; i < 2; i++) {    // convert the Lut output in 1 digit 
+       localtr[4] += Int_t(loLpt[i]<<i);
+       localtr[5] += Int_t(loHpt[i]<<i);
+       localtr[6] += Int_t(loApt[i]<<i);
+      }
+
+      for (Int_t i = 0; i < 16; i++) {    // convert X/Y bit in bit pattern
+       localtr[7]  |= (fXbit11[icirc][i] << i);
+       localtr[8]  |= (fXbit12[icirc][i] << i);
+
+       // 8 first and last elts correspond to neighbouring cards
+       localtr[9]  |= (fXbit21[icirc][i+8] << i);
+       localtr[10] |= (fXbit22[icirc][i+8] << i);
+
+       localtr[11] |= (fYbit11[icirc][i] << i);
+       localtr[12] |= (fYbit12[icirc][i] << i);
+       localtr[13] |= (fYbit21[icirc][i] << i);
+       localtr[14] |= (fYbit22[icirc][i] << i);
+      }
+
+      AliMUONLocalTrigger* pLocTrig = new AliMUONLocalTrigger(localtr, fDigitNumbers[icirc]);
+      fMUONData->AddLocalTrigger(*pLocTrig);  // add a local trigger in the list
+    }
+  }
 }
-*/
+
+//_______________________________________________________________________
+void AliMUONTriggerDecision::ClearDigitNumbers()
+{
+// Clears the fDigitNumbers arrays so that they are all empty.
+
+       for (Int_t i = 0; i < AliMUONConstants::NTriggerCircuit(); i++)
+               fDigitNumbers[i].Set(0);
+}
+
+//_______________________________________________________________________
+void AliMUONTriggerDecision::DigitFiredCircuit(
+               Int_t circuit, Int_t cathode,
+               Int_t chamber, Int_t digit
+       )
+{
+// Registers that the specified digit fired the specified circuit.
+// This digit gets added to an array which will be copied to
+// AliMUONLocalTrigger when such an object is created for each circuit.
+
+       Int_t digitnumber = AliMUONLocalTrigger::EncodeDigitNumber(chamber, cathode, digit);
+       Int_t last = fDigitNumbers[circuit].GetSize();
+       fDigitNumbers[circuit].Set(last + 1);
+       fDigitNumbers[circuit][last] = digitnumber;
+}
+