]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - MUON/AliMUONTriggerDecision.cxx
New parametrization of the geometry and new geometry interface (Working week effort)
[u/mrichter/AliRoot.git] / MUON / AliMUONTriggerDecision.cxx
index 40d98d88537038a3dbe902f458b2cfac72cc0de5..fb29af618e42f9717f68ff639122ae85ab5c0430 100644 (file)
 
 /* $Id$ */
 
+#include <TError.h>
+
 #include "AliMUONTriggerCircuit.h"
 #include "AliMUONTriggerDecision.h"
 #include "AliMUONTriggerLut.h"
-#include "AliMUONHitMapA1.h"
-#include "AliRun.h"
 #include "AliMUON.h"
+#include "AliMUONDigit.h"
+#include "AliMUONConstants.h"
+#include "AliMUONGlobalTrigger.h"
+#include "AliMUONLocalTrigger.h"
+#include "AliRun.h"
 #include "AliRunLoader.h"
 #include "AliLoader.h"
-#include "AliSegmentation.h"
-#include "AliMUONResponse.h"
-#include "AliMUONChamber.h"
-#include "AliMUONDigit.h"
+#include "AliRawReader.h" // for raw data
 
 
-#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
@@ -90,14 +83,118 @@ 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)
+    Error("TriggerDecision","No MUONdata for trigger\n");
+  else
+    fMUONData = data;
+
+  // Loading AliRun master
+  AliRunLoader* runloader = fLoader->GetRunLoader();
+  if (runloader->GetAliRun() == 0x0) runloader->LoadgAlice();
+  gAlice = runloader->GetAliRun();
+
+  // 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);
+}
+
+//----------------------------------------------------------------------
+AliMUONTriggerDecision::AliMUONTriggerDecision()
+  : TObject(),
+    fLoader(0),
+    fTriggerCircuit(0),
+    fMUONData(0),
+    fMUON(0)
+{
+// Default constructor
+}
+
+//----------------------------------------------------------------------
+AliMUONTriggerDecision::AliMUONTriggerDecision(const AliMUONTriggerDecision& rhs)
+  : TObject(rhs) 
+{
+// Protected copy constructor
+
+  Fatal("AliMUONTriggerDecision", "Not implemented.");
+}
+
+//----------------------------------------------------------------------
+void AliMUONTriggerDecision::ClearDigits()
+{
+  for ( int i=0;i<AliMUONConstants::NCh();i++ ) 
+    if ((*fDigits)[i]) ((TClonesArray*)fDigits->At(i))->Clear();
+}
+
+//----------------------------------------------------------------------
+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)
+{
+  //
+  // Add a MUON digit to the list of Digits of the detection plane id
+  //
+  TClonesArray &ldigits = *Digits(id); 
+  new(ldigits[ldigits.GetEntriesFast()]) AliMUONDigit(tracks,charges,digits);
 }
 
 //----------------------------------------------------------------------
 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;
+  }
+
 }
 
+//----------------------------------------------------------------------
+AliMUONTriggerDecision& 
+AliMUONTriggerDecision::operator=(const AliMUONTriggerDecision& rhs)
+{
+// Protected assignement operator
+
+  if (this == &rhs) return *this;
+
+  Fatal("operator=", "Not implemented.");
+    
+  return *this;  
+}    
+          
+
 //----------------------------------------------------------------------
 void AliMUONTriggerDecision::Trigger(){
 // main method of the class which calls the overall Trigger procedure
@@ -108,11 +205,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];
@@ -191,33 +287,28 @@ void AliMUONTriggerDecision::SetBit(){
 // 3) remove soft background
 // 4) set the bit patterns
 
-
-  AliMUON *pMUON  = (AliMUON*)gAlice->GetDetector("MUON");  
+  Int_t cathode;
   AliMUONTriggerCircuit* triggerCircuit;
-  AliRunLoader * rl = AliRunLoader::GetRunLoader();
-  AliLoader * gime  = rl->GetLoader("MUONLoader");
 
-  for (Int_t chamber=11; chamber<15; chamber++){
-    for (Int_t cathode=1; cathode<3; cathode++){
-      
-      AliMUONChamber*   iChamber = &(pMUON->Chamber(chamber-1));
-      AliSegmentation*  segmentation;
-      gime->TreeD()->GetEvent(cathode-1);
-      TClonesArray *muonDigits = pMUON->GetMUONData()->Digits(chamber-1,0);
+  for (Int_t chamber = 11; chamber < 15; chamber++){
+    //    for (Int_t cathode=1; cathode<3; cathode++){  
+    //     fMUONData->GetCathode(cathode-1);
+
+      TClonesArray *muonDigits = Digits(chamber-1);
       Int_t ndigits = muonDigits->GetEntriesFast();
-      printf("\n 1 Found %d digits in %p %d \n ", ndigits, muonDigits,chamber-1);
-//    if (ndigits == 0) return;
-      
-//      iChamber = &(pMUON->Chamber(chamber-1));
-      segmentation=iChamber->SegmentationModel(cathode);
+      if (fDebug>=3)
+       printf("\nFound %d digits in %p %d \n", 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();
-       printf("digits %d ix %d iy %d \n",digit,ix,iy);
+       cathode = mdig->Cathode() + 1;
+       if (fDebug>=3)
+       printf("cathode %d ix %d iy %d \n",cathode,ix,iy);
 
 // get the sum of the coded charge 
 // see coding convention in AliMUONChamberTrigger::DisIntegration      
@@ -241,7 +332,7 @@ void AliMUONTriggerDecision::SetBit(){
              {
              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) 
                      fXbit11[icirc][istrip]=1;
@@ -250,7 +341,7 @@ void AliMUONTriggerDecision::SetBit(){
                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;
@@ -259,7 +350,7 @@ void AliMUONTriggerDecision::SetBit(){
                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;
@@ -268,7 +359,7 @@ void AliMUONTriggerDecision::SetBit(){
                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;             
@@ -282,7 +373,7 @@ 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) 
@@ -292,7 +383,7 @@ void AliMUONTriggerDecision::SetBit(){
                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) 
@@ -302,7 +393,7 @@ void AliMUONTriggerDecision::SetBit(){
                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) 
@@ -312,7 +403,7 @@ void AliMUONTriggerDecision::SetBit(){
                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) 
@@ -324,8 +415,8 @@ void AliMUONTriggerDecision::SetBit(){
          } // if cathode
        }  // remove soft background
       }   // end loop on digit
-      pMUON->GetMUONData()->ResetDigits();
-    }    // end loop on cathode
+      fMUONData->ResetDigits();
+      //    }    // end loop on cathode
   }     // end loop on chamber
 }  
 
@@ -334,7 +425,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++) {
 
@@ -342,7 +432,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
@@ -352,7 +442,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
@@ -384,7 +474,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
@@ -1024,9 +1114,8 @@ 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];   
@@ -1145,7 +1234,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");
@@ -1164,6 +1252,7 @@ void AliMUONTriggerDecision::GlobalTrigger(){
     for (i=0; i<3; i++) printf("%i\t",fGlobalPairLike[i]);
     printf("\n");
     printf("===================================================\n");
+    printf("\n");
   }
 }
 
@@ -1194,9 +1283,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();
 
@@ -1235,6 +1323,7 @@ void AliMUONTriggerDecision::PrintBitPatYInput(Int_t icirc){
   printf("\n");
   printf("===============================================================\n");
 }
+
 //----------------------------------------------------------------------
 void AliMUONTriggerDecision::PrintLocalOutput(Int_t minDevStrip[5], 
                                              Int_t minDev[5], 
@@ -1257,28 +1346,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];
@@ -1291,8 +1380,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];
@@ -1301,15 +1391,69 @@ 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
+
+
+  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]*TMath::Power(2,i));
+       localtr[5] += Int_t(loHpt[i]*TMath::Power(2,i));
+       localtr[6] += Int_t(loApt[i]*TMath::Power(2,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);
+      fMUONData->AddLocalTrigger(*pLocTrig);  // add a local trigger in the list
+    }
+  }
+}
+
+//_______________________________________________________________________
+void AliMUONTriggerDecision::Trigger2Trigger() 
+{
+// copy trigger from TreeD to TreeR
+
+  fMUONData->SetTreeAddress("GLT");
+  fMUONData->GetTriggerD();
+}
+
+//_______________________________________________________________________
+void AliMUONTriggerDecision::Trigger2Trigger(AliRawReader* /*rawReader*/) 
+{
+// call the Trigger Algorithm from raw data and fill TreeR 
+
+   Fatal("Trigger2Trigger","Trigger not implemented for raw data input");
+
 }
-*/