]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - TOF/AliTOFTrigger.cxx
CreateCTTMMatrix call: moved from CreateLTMMatrixFromDigits to CreateLTMMatrix (F...
[u/mrichter/AliRoot.git] / TOF / AliTOFTrigger.cxx
index e4e0e557d5125e024ad6026a9017157a2e094dbc..30137d4de7510306c948ec856ca2cbf364d0e6e0 100644 (file)
@@ -32,6 +32,8 @@
 /////////////////////////////////////////////////////////////////////
 
 #include <TClonesArray.h>
+#include <TTree.h>
+#include <TMath.h>
 
 #include "AliLoader.h"
 #include "AliLog.h"
 #include "AliTOFdigit.h"
 #include "AliTOFGeometry.h"
 #include "AliTOFTrigger.h"
+#include "AliTOFTriggerMask.h"
+
+#include "AliCDBManager.h"
+#include "AliCDBEntry.h"
+
 
 extern AliRun* gAlice;
 
+AliTOFGeometry* AliTOFTrigger::fgTofGeo = NULL; // TOF geometry needed to get the minimial arrival time for each channel
+
 //-------------------------------------------------------------------------
 ClassImp(AliTOFTrigger)
 
@@ -55,17 +64,31 @@ ClassImp(AliTOFTrigger)
   AliTOFTrigger::AliTOFTrigger() :
     AliTriggerDetector(),
     fHighMultTh(1000),
-    fppMBTh(4),
-    fMultiMuonTh(2),
+    fppMBTh(4),//4:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
+    fMultiMuonTh(4),
     fUPTh(2),
-    fdeltaminpsi(150),
-    fdeltamaxpsi(170),
+    fdeltaminpsi(150), //150
+    fdeltamaxpsi(170), //170
     fdeltaminro(70),
     fdeltamaxro(110),
-    fstripWindow(2)
+    fstripWindow(2),
+    fSel1(0),
+    fSel2(0),
+    fSel3(0),
+    fSel4(0),
+    fNCrateOn(0),
+    fNMaxipadOn(0),
+    fNMaxipadOnAll(0),
+    fTOFTrigMask(0),
+    fStartTimeHit(0.0),
+    fTimeWidthTrigger(25.0)
+
 {
   //main ctor
+  for (Int_t i=0;i<kNCTTM;i++) fLTMarray[i] = kFALSE;
+
   for (Int_t i=0;i<kNLTM;i++){
+
     for (Int_t j=0;j<kNLTMchannels;j++){
       fLTMmatrix[i][j]=kFALSE;
     }
@@ -76,13 +99,20 @@ ClassImp(AliTOFTrigger)
       }
     }
   }
+
+  fPowerMask[0] = 1;
+  for(Int_t i=1;i <= kNCTTMchannels;i++){
+      fPowerMask[i] = fPowerMask[i-1]*2;
+  }
+
   SetName("TOF");
   CreateInputs();
+
 }
 
 //----------------------------------------------------------------------
 
-AliTOFTrigger::AliTOFTrigger(Int_t HighMultTh, Int_t ppMBTh, Int_t MultiMuonTh, Int_t UPTh, Float_t deltaminpsi, Float_t deltamaxpsi, Float_t deltaminro, Float_t deltamaxro, Int_t stripWindow) :
+AliTOFTrigger::AliTOFTrigger(Int_t HighMultTh, Int_t ppMBTh, Int_t MultiMuonTh, Int_t UPTh, Float_t deltaminpsi, Float_t deltamaxpsi, Float_t deltaminro, Float_t deltamaxro, Int_t stripWindow,Float_t startTimeWindow,Float_t widthTimeWindow) :
   AliTriggerDetector(),
   fHighMultTh(HighMultTh),
   fppMBTh(ppMBTh),
@@ -92,10 +122,20 @@ AliTOFTrigger::AliTOFTrigger(Int_t HighMultTh, Int_t ppMBTh, Int_t MultiMuonTh,
   fdeltamaxpsi(deltamaxpsi),
   fdeltaminro(deltaminro),
   fdeltamaxro(deltamaxro),
-  fstripWindow(stripWindow)
-
+  fstripWindow(stripWindow),
+  fSel1(0),
+  fSel2(0),
+  fSel3(0),
+  fSel4(0),
+  fNCrateOn(0),
+  fNMaxipadOn(0),
+  fNMaxipadOnAll(0),
+  fTOFTrigMask(0),
+  fStartTimeHit(startTimeWindow),
+  fTimeWidthTrigger(widthTimeWindow)
 {
   //ctor with thresholds for triggers
+  for (Int_t i=0;i<kNCTTM;i++) fLTMarray[i] = kFALSE;
   for (Int_t i=0;i<kNLTM;i++){
     for (Int_t j=0;j<kNLTMchannels;j++){
       fLTMmatrix[i][j]=kFALSE;
@@ -107,10 +147,18 @@ AliTOFTrigger::AliTOFTrigger(Int_t HighMultTh, Int_t ppMBTh, Int_t MultiMuonTh,
       }
     }
   }
+
+  fPowerMask[0] = 1;
+  for(Int_t i=1;i <= kNCTTMchannels;i++){
+      fPowerMask[i] = fPowerMask[i-1]*2;
+  }
+
   SetName("TOF");
   CreateInputs();
 }
 
+
+#if 0 /*** COPY CONSTRUCTOR SUPPRESSED **/
 //____________________________________________________________________________
 
 AliTOFTrigger::AliTOFTrigger(const AliTOFTrigger & tr):
@@ -123,9 +171,18 @@ AliTOFTrigger::AliTOFTrigger(const AliTOFTrigger & tr):
   fdeltamaxpsi(tr.fdeltamaxpsi),
   fdeltaminro(tr.fdeltaminro),
   fdeltamaxro(tr.fdeltamaxro),
-  fstripWindow(tr.fstripWindow)
+  fstripWindow(tr.fstripWindow),
+  fSel1(tr.fSel1),
+  fSel2(tr.fSel2),
+  fSel3(tr.fSel3),
+  fSel4(tr.fSel4),
+  fNCrateOn(tr.fNCrateOn),
+  fNMaxipadOn(tr.fNMaxipadOn),
+  fNMaxipadOnAll(tr.fNMaxipadOnAll),
+  fTOFTrigMask(0)
 {
   //copy ctor
+  for (Int_t i=0;i<kNCTTM;i++) fLTMarray[i] = kFALSE;
   for (Int_t i=0;i<kNLTM;i++){
     for (Int_t j=0;j<kNLTMchannels;j++){
       fLTMmatrix[i][j]=tr.fLTMmatrix[i][j];
@@ -137,10 +194,23 @@ AliTOFTrigger::AliTOFTrigger(const AliTOFTrigger & tr):
       }
     }
   }
+
+  fPowerMask[0] = 1;
+  for(Int_t i=1;i <= kNCTTMchannels;i++){
+      fPowerMask[i] = fPowerMask[i-1]*2;
+  }
+
+  if(tr.fTOFTrigMask){
+      fTOFTrigMask = new AliTOFTriggerMask();  
+      fTOFTrigMask->SetTriggerMaskArray(tr.fTOFTrigMask->GetTriggerMaskArray());
+  }
+
   SetName(tr.GetName());
-  CreateInputs();
   //fInputs=&(tr.GetInputs());
+  CreateInputs();
+
 }
+#endif /*** COPY CONTRUCTOR SUPPRESSED ***/
 
 //----------------------------------------------------------------------
 
@@ -150,9 +220,14 @@ void AliTOFTrigger::CreateInputs()
   // Do not create inputs again!!
   if( fInputs.GetEntriesFast() > 0 ) return;
 
+  //LoadActiveMask();
+
   fInputs.AddLast(new AliTriggerInput("TOF_Cosmic_MultiMuon_L0","TOF",0));
   fInputs.AddLast(new AliTriggerInput("0OIN","TOF",0)); // was "TOF_pp_MB_L0"
-  fInputs.AddLast(new AliTriggerInput("0OX1","TOF",0)); // was "TOF_UltraPer_Coll_L0"
+  fInputs.AddLast(new AliTriggerInput("0OM2","TOF",0)); // was "TOF_PbPb_MB2_L0"
+  fInputs.AddLast(new AliTriggerInput("0OM3","TOF",0)); // was "TOF_PbPb_MB3_L0"
+  fInputs.AddLast(new AliTriggerInput("0OUP","TOF",0)); // was "TOF_UltraPer_Coll_L0"
+  fInputs.AddLast(new AliTriggerInput("0OMU","TOF",0)); // new trigger (150 < DeltaPhi < 180) and 2 <= N_pad <= 6
 
   fInputs.AddLast(new AliTriggerInput("0OHM","TOF",0)); // was "TOF_High_Mult_L0"
   fInputs.AddLast(new AliTriggerInput("TOF_Jet_L1","TOF",0));
@@ -162,11 +237,19 @@ void AliTOFTrigger::CreateInputs()
 //----------------------------------------------------------------------
 void AliTOFTrigger::Trigger() {
   //triggering method
+  fSel1=0;
+  fSel2=0;
+  fSel3=0;
+  fSel4=0;
 
   CreateLTMMatrix();
+
   Int_t nchonFront = 0;
   Int_t nchonBack = 0;
   Int_t nchonTot = 0;
+  Int_t nSectOn = 0; // °°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
+  Int_t DeSlots = -1;// °°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
+  Int_t AntiDeSlots = -1;// °°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
   Int_t nchonFrontBack = 0;
   Int_t nchonFront1 = 0;
   Int_t nchonBack1 = 0;
@@ -189,15 +272,30 @@ void AliTOFTrigger::Trigger() {
   }
 
   nchonTot = nchonFront + nchonBack;
+//  fNMaxipadOn = nchonTot;
+  for(Int_t i=0;i<kNCTTM;i++) { if(fLTMarray[i]) nSectOn++; } 
 
   //pp Minimum Bias Trigger
   if (nchonTot >= fppMBTh) {
     SetInput("0OIN");
+    fSel1=1;
+    //printf("0OIN - MB\n");
+  }
+
+  // PbPb MB
+  if (nchonTot >= 2) {
+    SetInput("0OM2");
+    fSel2=1;
+  }
+  if (nchonTot >= 3) {
+    SetInput("0OM3");
+    fSel3=1;
   }
 
   //High Multiplicity Trigger
   if (nchonTot >= fHighMultTh) {
     SetInput("0OHM");
+    //printf("0OHM - High Mult\n");
   }
 
 
@@ -270,108 +368,83 @@ void AliTOFTrigger::Trigger() {
        }
       }
       if (fCTTMmatrixBack[i][j]){
-       boolCTTMor = kFALSE;
-       for (Int_t i2=i2min;i2<=i2max;i2++){
-         for (Int_t j2 = j2min;j2<=j2max;j2++){
-           boolCTTMor |= fCTTMmatrixBack[i2][j2];
+         boolCTTMor = kFALSE;
+         for (Int_t i2=i2min;i2<=i2max;i2++){
+             for (Int_t j2 = j2min;j2<=j2max;j2++){
+                 boolCTTMor |= fCTTMmatrixBack[i2][j2];
+             }
+         }
+         if (boolCTTMor) {
+             nchonBack++;
          }
-       }
-       if (boolCTTMor) {
-         nchonBack++;
-       }
       }
     }
   }
-
+  
   nchonFrontBack1 = nchonFront1+nchonBack1;
-
+  
   if (nchonFrontBack >= fMultiMuonTh || nchonFrontBack1 >= fMultiMuonTh) {
-    SetInput("TOF_Cosmic_MultiMuon_L0");
+      SetInput("TOF_Cosmic_MultiMuon_L0");
   }
-
+  
   //Ultra-Peripheral collision Trigger
-  Bool_t boolpsi = kFALSE;
-  Bool_t boolro = kFALSE;
-  if (nchonTot == fUPTh){
-    for (Int_t i=0;i<kNCTTM;i++){
-      for (Int_t j=0;j<kNCTTMchannels;j++){
-       Int_t minipsi = i+mindeltapsi;
-       Int_t maxipsi = i+maxdeltapsi;
-       if (minipsi>=kNCTTM) minipsi = mindeltapsi-((kNCTTM-1)-i)-1;
-       if (maxipsi>=kNCTTM) maxipsi = maxdeltapsi-((kNCTTM-1)-i)-1;
-       Int_t miniro = i+mindeltaro;
-       Int_t maxiro = i+maxdeltaro;
-       if (miniro>=kNCTTM) miniro = mindeltaro-((kNCTTM-1)-i)-1;
-       if (maxiro>=kNCTTM) maxiro = maxdeltaro-((kNCTTM-1)-i)-1;
-       Int_t j2min = j-fstripWindow;
-       Int_t j2max = j+fstripWindow;
-       if (j2min<0) j2min =0;
-       if (j2max>=kNCTTMchannels) j2max =kNCTTMchannels-1;
-       if (fCTTMmatrixFront[i][j]){
-         for (Int_t i2=minipsi;i2<=maxipsi;i2++){
-           for (Int_t j2 = j2min;j2<=j2max;j2++){
-             if (fCTTMmatrixFront[i2][j2]) {
-               SetInput("0OX1");
-               boolpsi = kTRUE;
-               //exiting loops
-               j2 = j2max+1;
-               i2 = maxipsi+1;
-               j=kNCTTMchannels;
-               i=kNCTTM;
-             }
-           }
+  
+  // °°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
+  // DeSlots = (k+1)_Array Element - k_Array Element
+  // AntiDeSlots = kNCTTM - DeSlots
+  
+  if((!fSel1))// && nchonFront < 4 && nchonBack < 4)
+  {  
+      // printf("nHitMaxipad CLASSE: %i \n",fNMaxipadOn);
+      // printf("Total Number per event of Switched-On sectors : %i \n", nSectOn);
+      // printf("mindeltapsi %i \n", mindeltapsi);
+      //printf("maxdeltapsi %i \n", maxdeltapsi); 
+      for(Int_t i = 0; i < kNCTTM; i++){    
+         if(fLTMarray[i]){
+             // printf(" i-sect On:  %i\n",i);
+             for(Int_t j = i+1; j < kNCTTM; j++){
+                 if(fLTMarray[j]) {
+                     //  printf(" j-sect On:  %i\n",j);
+                     DeSlots = j-i;
+                     AntiDeSlots = kNCTTM - DeSlots;
+                     //printf("DeSlots = %i \n",DeSlots);
+                     //printf("AntiDeSlots = %i \n",AntiDeSlots);
+                     if(DeSlots >= mindeltapsi && DeSlots <= maxdeltapsi){
+                         fSel4=1;
+                         SetInput("0OUP");
+                         //printf("trigger On with DeSlot \n");
+                     }
+                     if(AntiDeSlots >= mindeltapsi && AntiDeSlots <= maxdeltapsi){
+                         fSel4=1;
+                         SetInput("0OUP");
+                         //printf("trigger On with AntiDeSlot \n");
+                     }
+                     
+                     
+                     if(DeSlots >= mindeltaro && DeSlots <= maxdeltaro){
+                         fSel4=1;
+                         SetInput("0OUP");
+                         //printf("trigger On with DeSlot \n");
+                     }
+                     if(AntiDeSlots >= mindeltaro && AntiDeSlots <= maxdeltaro){
+                         fSel4=1;
+                         SetInput("0OUP");
+                         //printf("trigger On with AntiDeSlot \n");
+                     } 
+                     
+                     if(nchonTot >= 2 && nchonTot <= 6){
+                       if(DeSlots >= 15 && DeSlots <= 18){
+                         SetInput("0OMU");
+                       }
+                       else if(AntiDeSlots >= 15 && AntiDeSlots <= 18){
+                         SetInput("0OMU");
+                       }       
+                     }               
+                 }
+             }    
          }
-         if (!boolpsi){
-           for (Int_t i2=miniro;i2<=maxiro;i2++){
-             for (Int_t j2 = j2min;j2<=j2max;j2++){
-               if (fCTTMmatrixFront[i2][j2]) {
-                 SetInput("0OX1");
-                 boolro = kTRUE;
-                 //exiting loops
-                 j2 = j2max+1;
-                 i2 = maxiro+1;
-                 j=kNCTTMchannels;
-                 i=kNCTTM;
-               }
-             }
-           }
-         }
-       }
-
-       else if (fCTTMmatrixBack[i][j]){
-         for (Int_t i2=minipsi;i2<=maxipsi;i2++){
-           for (Int_t j2 = j2min;j2<=j2max;j2++){
-             if (fCTTMmatrixBack[i2][j2]) {
-               SetInput("0OX1");
-               boolpsi = kTRUE;
-               //exiting loops
-               j2 = j2max+1;
-               i2 = maxipsi+1;
-               j=kNCTTMchannels;
-               i=kNCTTM;
-             }
-           }
-         }
-         if (!boolpsi){
-           for (Int_t i2=miniro;i2<=maxiro;i2++){
-             for (Int_t j2 = j2min;j2<=j2max;j2++){
-               if (fCTTMmatrixBack[i2][j2]) {
-                 SetInput("0OX1");
-                 boolro = kTRUE;
-                 //exiting loops
-                 j2 = j2max+1;
-                 i2 = maxiro+1;
-                 j=kNCTTMchannels;
-                 i=kNCTTM;
-               }
-             }
-           }
-         } 
-       }
       }
-    }
-  }
-
+  } 
 }
 
 //-----------------------------------------------------------------------------
@@ -379,6 +452,7 @@ void AliTOFTrigger::CreateLTMMatrix() {
   //creating LTMMatrix
   //initialization
   CreateLTMMatrixFromDigits();
+  CreateCTTMMatrix();
 }
 
 //-------------------------------------------------------------------------
@@ -389,11 +463,20 @@ void AliTOFTrigger::CreateLTMMatrixFromDigits() {
   //
 
   //initialization
+  for (Int_t i=0;i<kNCTTM;i++) fLTMarray[i]= kFALSE;
   for (Int_t i=0;i<kNLTM;i++){
     for (Int_t j=0;j<kNLTMchannels;j++){
       fLTMmatrix[i][j]=kFALSE;
     }
   }
+  for (Int_t i=0;i<kNCTTM;i++){
+      for (Int_t j=0;j<kNCTTMchannels;j++){
+         fCTTMmatrixFront[i][j]=kFALSE;
+         fCTTMmatrixBack[i][j]=kFALSE;
+      }
+  }
+
+
   AliRunLoader *rl;
   rl = AliRunLoader::Instance();
 
@@ -404,10 +487,10 @@ void AliTOFTrigger::CreateLTMMatrixFromDigits() {
 
   tofLoader->LoadDigits("read");
   TTree *treeD = tofLoader->TreeD();
-  if (treeD == 0x0)
-    {
-      AliFatal("AliTOFTrigger: Can not get TreeD");
-    }
+  if (treeD == 0x0) {
+    AliFatal("AliTOFTrigger: Can not get TreeD");
+    return;
+  }
 
   TBranch *branch = treeD->GetBranch("TOF");
   if (!branch) {
@@ -419,11 +502,14 @@ void AliTOFTrigger::CreateLTMMatrixFromDigits() {
   treeD->GetEvent(0);
   Int_t ndigits = tofDigits->GetEntriesFast();
   Int_t detind[5]; //detector indexes: 0 -> sector
-  //                                   1 -> plate
+  //                                   1 -> plate(modulo)
   //                                   2 -> strip
   //                                   3 -> padz
   //                                   4 -> padx
 
+  if(! fgTofGeo) fgTofGeo = new AliTOFGeometry();
+
+
   for (Int_t i=0;i<ndigits;i++){
     AliTOFdigit * digit = (AliTOFdigit*)tofDigits->UncheckedAt(i);
     detind[0] = digit->GetSector();
@@ -435,12 +521,25 @@ void AliTOFTrigger::CreateLTMMatrixFromDigits() {
     Int_t indexLTM[2] = {-1,-1};
     GetLTMIndex(detind,indexLTM);
 
-    fLTMmatrix[indexLTM[0]][indexLTM[1]] = kTRUE;
+    //Float_t timedigit = digit->GetTdc()*AliTOFGeometry::TdcBinWidth()*1E-3; // decalibrated time digit in ns
+    Float_t timedigit = digit->GetTdcND()*AliTOFGeometry::TdcBinWidth()*1E-3; // time digit in ns
+
+    Float_t pos[3];
+    fgTofGeo->GetPosPar(detind, pos);
+    Float_t length = 0.;
+    for (Int_t ic = 0; ic < 3; ic++) length += pos[ic] * pos[ic];
+    length = TMath::Sqrt(length);
+    timedigit -= length * 0.0333564095198152043; // subtract the minimal time in ns for the current channel
+
+    if(timedigit > fStartTimeHit - 0.5 && timedigit < fStartTimeHit + fTimeWidthTrigger - 0.5)
+      fLTMmatrix[indexLTM[0]][indexLTM[1]] = kTRUE;
+
+//    fLTMarray[indexLTM[0]%36] = kTRUE; //dimensione MAX array 36 = kNCTTM 
   }
 
+
   tofLoader->UnloadDigits();
   //   rl->UnloadgAlice();
-  CreateCTTMMatrix();
 
 }
 
@@ -457,6 +556,12 @@ void AliTOFTrigger::CreateLTMMatrixFromRaw(AliRawReader *fRawReader) {
       fLTMmatrix[i][j]=kFALSE;
     }
   }
+  for (Int_t i=0;i<kNCTTM;i++){
+      for (Int_t j=0;j<kNCTTMchannels;j++){
+         fCTTMmatrixFront[i][j]=kFALSE;
+         fCTTMmatrixBack[i][j]=kFALSE;
+      }
+  }
 
   if(fRawReader){
     AliTOFRawStream * tofRawStream = new AliTOFRawStream();
@@ -487,7 +592,7 @@ void AliTOFTrigger::CreateLTMMatrixFromRaw(AliRawReader *fRawReader) {
     for (indexDDL=0; indexDDL<AliDAQ::NumberOfDdls("TOF"); indexDDL++) {
       
       fRawReader->Reset();
-      tofRawStream->LoadRawData(indexDDL);
+      tofRawStream->LoadRawDataBuffersV2(indexDDL);
       
       clonesRawData = tofRawStream->GetRawData();
       if (clonesRawData->GetEntriesFast()!=0) AliInfo(Form(" TOF raw data number = %3d", clonesRawData->GetEntriesFast()));
@@ -530,13 +635,15 @@ void AliTOFTrigger::CreateLTMMatrixFromRaw(AliRawReader *fRawReader) {
     //if (fVerbose==2) ftxt.close();
 
     if (inholes) AliWarning(Form("Clusters in the TOF holes: %d",inholes));
+    delete tofRawStream;
+    tofRawStream = NULL;
 
   }
 
 }
 
 //-----------------------------------------------------------------------------
-void AliTOFTrigger::GetLTMIndex(Int_t *detind, Int_t *indexLTM) {
+void AliTOFTrigger::GetLTMIndex(const Int_t * const detind, Int_t *indexLTM) {
   //
   // getting LTMmatrix indexes for current digit
   //
@@ -625,46 +732,86 @@ void AliTOFTrigger::PrintMap()
 */
 //-------------------------------------------------------------------------
 
-void AliTOFTrigger::GetMap(Bool_t **map)
+void AliTOFTrigger::GetMapMatrix(Bool_t map[][24]) const
 {
   //
+  // Returns CTTM map
+  //
+
+  for(Int_t i = 0; i<kNLTM;i++)
+    for(Int_t j = 0; j<kNCTTMchannels;j++)
+      map[i][j]=(i<36)?fCTTMmatrixFront[i][j]:fCTTMmatrixBack[i-36][j];
+
+}
+//-------------------------------------------------------------------------
+
+void AliTOFTrigger::GetMap(Bool_t **map) const
+{
   //
+  // Returns CTTM map
   //
 
   for(Int_t i = 0; i<kNLTM;i++)
     for(Int_t j = 0; j<kNCTTMchannels;j++)
-      map[i][j]=(i<36)?fCTTMmatrixFront[i][j]:fCTTMmatrixBack[i][j];
+      map[i][j]=(i<36)?fCTTMmatrixFront[i][j]:fCTTMmatrixBack[i-36][j];
 
 }
 
+
 //-------------------------------------------------------------------------
-void AliTOFTrigger::GetTRDmap(Bool_t **map)
+void AliTOFTrigger::GetTRDmap(Bool_t **map) const
 {
   //
   // Retriev the bit map sent to the TRD detector
   //
+    
+    for(int i = 0; i<kNLTM;i++)
+       for(int j = 0; j<kNLTMtoTRDchannels;j++){
+           map[i][j]=kFALSE;
+       }
 
-  for(int i = 0; i<kNLTM;i++)
-    for(int j = 0; j<kNLTMtoTRDchannels;j++)
-      map[i][j]=kFALSE;
-
-  for(int i = 0; i<kNLTM/2;i++)
+    for(int i = 0; i<kNLTM/2;i++)
     for(int j = 0; j<AliTOFTrigger::kNCTTMchannels;j++){
-      UInt_t TRDbit=j/3;
-      if(fCTTMmatrixFront[i][j]) map[i][TRDbit]=kTRUE;
+       UInt_t uTRDbit=j/3;
+       if(fCTTMmatrixFront[i][j]) map[i][uTRDbit]=kTRUE;
     }
   for(int i = kNLTM/2; i<kNLTM;i++)
+      for(int j = 0; j<AliTOFTrigger::kNCTTMchannels;j++){
+         UInt_t uTRDbit=j/3;
+         if(fCTTMmatrixBack[i-kNLTM/2][j]) map[i][uTRDbit]=kTRUE;
+    }
+  
+}
+//-------------------------------------------------------------------------
+void AliTOFTrigger::GetTRDmapMatrix(Bool_t map[][8]) const
+{
+  //
+  // Retriev the bit map sent to the TRD detector
+  //
+    
+    for(int i = 0; i<kNLTM;i++)
+       for(int j = 0; j<kNLTMtoTRDchannels;j++){
+           map[i][j]=kFALSE;
+       }
+
+    for(int i = 0; i<kNLTM/2;i++)
     for(int j = 0; j<AliTOFTrigger::kNCTTMchannels;j++){
-      UInt_t TRDbit=j/3;
-      if(fCTTMmatrixBack[i][j]) map[i][TRDbit]=kTRUE;
+       UInt_t uTRDbit=j/3;
+       if(fCTTMmatrixFront[i][j]) map[i][uTRDbit]=kTRUE;
+    }
+  for(int i = kNLTM/2; i<kNLTM;i++)
+      for(int j = 0; j<AliTOFTrigger::kNCTTMchannels;j++){
+         UInt_t uTRDbit=j/3;
+         if(fCTTMmatrixBack[i-kNLTM/2][j]) map[i][uTRDbit]=kTRUE;
     }
+  
 }
 
 //-------------------------------------------------------------------------
 void AliTOFTrigger::SetBit(Int_t *detind)
 {
   //
-  //
+  // Sets CTTM map element corresponding to detector element 'detind'
   //
 
   Int_t index[2];
@@ -672,7 +819,7 @@ void AliTOFTrigger::SetBit(Int_t *detind)
   if(index[0]<36)
     fCTTMmatrixFront[index[0]][index[1]]=kTRUE;
   else
-    fCTTMmatrixBack[index[0]][index[1]]=kTRUE;
+    fCTTMmatrixBack[index[0]-36][index[1]]=kTRUE;
 
 }
 
@@ -681,10 +828,12 @@ void AliTOFTrigger::SetBit(Int_t nDDL, Int_t nTRM, Int_t iChain,
                            Int_t iTDC, Int_t iCH)
 {
   //
-  //
+  // Sets CTTM map element corresponding to equipment ID
+  // labelled by number nDDL, nTRM, iChain, iTDC, iCH
   //
 
-  if(nTRM==3 && iTDC>12 && iTDC<14 && nDDL%2==1){ // DDL number to LTM number mapping
+    if(nTRM==3 && iTDC>=12 && iTDC<=14 && nDDL%2==1){ // DDL number to LTM number mapping
+//       getchar();
     Int_t iLTMindex=-1;
     Int_t iChannelIndex=-1;
     switch(nDDL%AliTOFGeometry::NDDL()){
@@ -705,13 +854,15 @@ void AliTOFTrigger::SetBit(Int_t nDDL, Int_t nTRM, Int_t iChain,
       iLTMindex++;
     iChannelIndex=iCH+iTDC*AliTOFGeometry::NCh()-12*AliTOFGeometry::NCh();
     Int_t index[2]={iLTMindex,iChannelIndex};
-    if (index[0]<36)
+    if (index[0]<36){
       fCTTMmatrixFront[index[0]][index[1]]=kTRUE;
-    else
-      fCTTMmatrixBack[index[0]][index[1]]=kTRUE;
-  }
-  else
-    AliError("Call this function only if(nTRM==3 && iTDC>12 && iTDC<14 && nDDL%2==1) ");
+      fLTMmatrix[index[0]][index[1]*2]=kTRUE;
+    }
+    else{
+       fCTTMmatrixBack[index[0]-36][index[1]]=kTRUE;
+       fLTMmatrix[index[0]][index[1]*2]=kTRUE;
+    }
+    }
 
 }
 //-------------------------------------------------------------------------
@@ -719,7 +870,7 @@ void AliTOFTrigger::SetBit(Int_t nDDL, Int_t nTRM, Int_t iChain,
 void AliTOFTrigger::ResetBit(Int_t *detind)
 {
   //
-  //
+  // Sets CTTM map element corresponding to detector element 'detind'
   //
 
   Int_t index[2];
@@ -727,7 +878,7 @@ void AliTOFTrigger::ResetBit(Int_t *detind)
   if(index[0]<36)
     fCTTMmatrixFront[index[0]][index[1]]=kFALSE;
   else
-    fCTTMmatrixBack[index[0]][index[1]]=kFALSE;
+    fCTTMmatrixBack[index[0]-36][index[1]]=kFALSE;
 
 }
 
@@ -736,7 +887,8 @@ void AliTOFTrigger::ResetBit(Int_t nDDL, Int_t nTRM, Int_t iChain,
                             Int_t iTDC, Int_t iCH)
 {
   //
-  //
+  // Sets CTTM map element corresponding to equipment ID
+  // labelled by number nDDL, nTRM, iChain, iTDC, iCH
   //
 
   if(nTRM==3 && iTDC>12 && iTDC<14 && nDDL%2==1){ // DDL number to LTM number mapping
@@ -760,10 +912,12 @@ void AliTOFTrigger::ResetBit(Int_t nDDL, Int_t nTRM, Int_t iChain,
       iLTMindex++;
     iChannelIndex=iCH+iTDC*AliTOFGeometry::NCh()-12*AliTOFGeometry::NCh();
     Int_t index[2]={iLTMindex,iChannelIndex};
-    if (index[0]<36)
+    if (index[0]<36){
       fCTTMmatrixFront[index[0]][index[1]]=kFALSE;
-    else
-      fCTTMmatrixBack[index[0]][index[1]]=kFALSE;
+    }
+    else{
+      fCTTMmatrixBack[index[0]-36][index[1]]=kFALSE;
+    }
   }
   else
     AliError("Call this function only if(nTRM==3 && iTDC>12 && iTDC<14 && nDDL%2==1) ");
@@ -774,12 +928,12 @@ void AliTOFTrigger::ResetBit(Int_t nDDL, Int_t nTRM, Int_t iChain,
 Bool_t AliTOFTrigger::GetBit(Int_t *detind)
 {
   //
-  //
+  // Returns CTTM map element corresponding to detector element 'detind'
   //
 
   Int_t index[2];
   GetCTTMIndex(detind,index);
-  return (index[0]<36)?fCTTMmatrixFront[index[0]][index[1]]:fCTTMmatrixBack[index[0]][index[1]];
+  return (index[0]<36)?fCTTMmatrixFront[index[0]][index[1]]:fCTTMmatrixBack[index[0]-36][index[1]];
 
 }
 
@@ -788,7 +942,8 @@ Bool_t AliTOFTrigger::GetBit(Int_t nDDL, Int_t nTRM, Int_t iChain,
                              Int_t iTDC, Int_t iCH)
 {
   //
-  //
+  // Returns CTTM map element corresponding to equipment ID
+  // labelled by number nDDL, nTRM, iChain, iTDC, iCH
   //
 
   if ( !(nTRM==3 && iTDC>12 && iTDC<14 && nDDL%2==1) ) {
@@ -820,7 +975,7 @@ Bool_t AliTOFTrigger::GetBit(Int_t nDDL, Int_t nTRM, Int_t iChain,
     iLTMindex++;
   iChannelindex=iCH+iTDC*AliTOFGeometry::NCh()-12*AliTOFGeometry::NCh();
   Int_t index[2]={iLTMindex,iChannelindex};
-  return (index[0]<36)?fCTTMmatrixFront[index[0]][index[1]]:fCTTMmatrixBack[index[0]][index[1]];
+  return (index[0]<36)?fCTTMmatrixFront[index[0]][index[1]]:fCTTMmatrixBack[index[0]-36][index[1]];
 
 }
 
@@ -831,25 +986,100 @@ void AliTOFTrigger::CreateCTTMMatrix() {
   // Create CTTM bit map
   //
 
-  for(Int_t i = 0; i<kNLTM;i++){
-    if(i<kNCTTM){
-      for(Int_t j = 0; j<kNCTTMchannels;j++)
-        fCTTMmatrixFront[i][j]=fLTMmatrix[i][2*j]||fLTMmatrix[i][2*j+1];
-    }
-    else{
-      for(Int_t j = 0; j<kNCTTMchannels;j++)
-        fCTTMmatrixBack[i-kNCTTM][j]=fLTMmatrix[i][2*j]||fLTMmatrix[i][2*j+1];;
+  LoadActiveMask();
+
+    Int_t fromTriggertoDCS[72] = {0,1,4,5,8,9,12,13,16,17,20,21,24,25,28,29,32,33,36,37,40,41,44,45,48,49,52,53,56,57,60,61,64,65,68,69,3,
+                                 2,7,6,11,10,15,14,19,18,23,22,27,26,31,30,35,34,39,38,43,42,47,46,51,50,55,54,59,58,63,62,67,66,71,70};
+
+
+    fNMaxipadOnAll=0;
+    fNMaxipadOn=0;
+
+    for(Int_t i = 0; i<kNLTM;i++){
+       UInt_t currentMask = fPowerMask[kNCTTMchannels]-1;
+       if(fTOFTrigMask) currentMask=fTOFTrigMask->GetTriggerMask(fromTriggertoDCS[i]);
+       if(i<kNCTTM){
+           for(Int_t j = 0; j<kNCTTMchannels;j++){
+               fCTTMmatrixFront[i][j]=fLTMmatrix[i][2*j]||fLTMmatrix[i][2*j+1];
+               if(fCTTMmatrixFront[i][j]) fNMaxipadOnAll++;
+               if(!(currentMask & fPowerMask[j])) fCTTMmatrixFront[i][j]=0;
+               if(fCTTMmatrixFront[i][j]){
+                   fNMaxipadOn++;
+                   fLTMarray[i] = kTRUE;
+               }
+           }
+       }
+       else{
+           for(Int_t j = 0; j<kNCTTMchannels;j++){
+               fCTTMmatrixBack[i-kNCTTM][j]=fLTMmatrix[i][2*j]||fLTMmatrix[i][2*j+1];;
+               if(fCTTMmatrixBack[i-kNCTTM][j]) fNMaxipadOnAll++;
+               if(!(currentMask & fPowerMask[j])) fCTTMmatrixBack[i-kNCTTM][j]=0;
+               if(fCTTMmatrixBack[i-kNCTTM][j]){
+                   fNMaxipadOn++;
+                   fLTMarray[i-kNCTTM] = kTRUE;
+               }
+           }
+       }
     }
-  }
+  
+    fNCrateOn = 0; 
+    for(Int_t j=0; j < kNCTTM; j++) {if(fLTMarray[j]) fNCrateOn++;}
+
 }     
 //-----------------------------------------------------------------------------
 
 void AliTOFTrigger::GetCTTMIndex(Int_t *detind, Int_t *indexCTTM) {
   //
-  //
+  // Returns CTTM index corresponding to the detector element detind
   //
 
   GetLTMIndex(detind,indexCTTM);
   indexCTTM[1]/=2;
 
 }
+//-----------------------------------------------------------------------------
+void AliTOFTrigger::LoadActiveMask(){
+//
+// Load OCDB current mask
+//
+
+    AliCDBManager *cdb = AliCDBManager::Instance();
+    if(cdb->GetRun() < 0 || !(cdb->GetDefaultStorage())){
+       if(!(cdb->GetDefaultStorage())){
+           cdb->SetDefaultStorage("local://$ALICE_ROOT/OCDB");
+           printf("AliTOFTrigger (WARNING): probably CDB first instance - Default Sorage set to \"local://$ALICE_ROOT/OCDB\"\n");
+       }
+       if(cdb->GetRun() < 0){
+           cdb->SetRun(0);
+         printf("AliTOFTrigger (WARNING): probably CDB first instance - number of run set to 0\n");
+       }
+    }
+
+    AliCDBEntry *cdbe = cdb->Get("TRIGGER/TOF/TriggerMask");
+    if(!cdbe) return;
+    fTOFTrigMask= (AliTOFTriggerMask *)cdbe->GetObject();
+    
+//     UInt_t maskArray[kNLTM];
+//     if(fTOFTrigMask == NULL) fTOFTrigMask = new AliTOFTriggerMask();
+//     for (Int_t k = 0; k < kNLTM ; k++) maskArray[k] = fPowerMask[kNCTTMchannels]-1;
+//     //for (Int_t k = 0; k < kNLTM ; k+=2) maskArray[k] = 0;
+    
+//     fTOFTrigMask->SetTriggerMaskArray(maskArray);
+}
+
+
+//-----------------------------------------------------------------------------
+AliTOFTrigger::~AliTOFTrigger()
+{
+  // dtor
+
+}
+
+//-----------------------------------------------------------------------------
+AliTOFTrigger& AliTOFTrigger::operator=(const AliTOFTrigger &/*source*/)
+{
+  // ass. op.
+  return *this;
+
+}
+