EMCAL triggers added in AliTriggerAnalysis + code clean-up
authorekryshen <evgeny.kryshen@cern.ch>
Tue, 21 Oct 2014 10:48:17 +0000 (12:48 +0200)
committerekryshen <evgeny.kryshen@cern.ch>
Tue, 21 Oct 2014 10:48:17 +0000 (12:48 +0200)
ANALYSIS/AliPhysicsSelection.cxx
ANALYSIS/AliTriggerAnalysis.cxx
ANALYSIS/AliTriggerAnalysis.h

index fc6e185..5df8b53 100644 (file)
@@ -132,36 +132,36 @@ using std::endl;
 ClassImp(AliPhysicsSelection)
 
 AliPhysicsSelection::AliPhysicsSelection() :
-  AliAnalysisCuts("AliPhysicsSelection", "AliPhysicsSelection"),
-  fPassName(""),
-  fCurrentRun(-1),
-  fMC(kFALSE),
-  fCollTrigClasses(),
-  fBGTrigClasses(),
-  fTriggerAnalysis(),
+AliAnalysisCuts("AliPhysicsSelection", "AliPhysicsSelection"),
+fPassName(""),
+fCurrentRun(-1),
+fMC(kFALSE),
+fCollTrigClasses(),
+fBGTrigClasses(),
+fTriggerAnalysis(),
 //  fHistStatisticsTokens(0),
-  fHistBunchCrossing(0),
-  fHistTriggerPattern(0),
-  fSkipTriggerClassSelection(0),
-  fUsingCustomClasses(0),
-  fSkipV0(0),
-  fBIFactorA(-1),
-  fBIFactorC(-1),
-  fBIFactorAC(-1), 
-  fComputeBG(0),
-  fBGStatOffset(-1),
-  fUseBXNumbers(1),
-  fUseMuonTriggers(0),
-  fFillingScheme(""),
-  fBin0CallBack(""),
-  fBin0CallBackPointer(0),
-  fIsPP(kFALSE),
-  fPSOADB(0),
-  fFillOADB(0),
-  fTriggerOADB(0),
-  fRegexp(0),
-  fCashedTokens(0)
-  
+fHistBunchCrossing(0),
+fHistTriggerPattern(0),
+fSkipTriggerClassSelection(0),
+fUsingCustomClasses(0),
+fSkipV0(0),
+fBIFactorA(-1),
+fBIFactorC(-1),
+fBIFactorAC(-1), 
+fComputeBG(0),
+fBGStatOffset(-1),
+fUseBXNumbers(1),
+fUseMuonTriggers(0),
+fFillingScheme(""),
+fBin0CallBack(""),
+fBin0CallBackPointer(0),
+fIsPP(kFALSE),
+fPSOADB(0),
+fFillOADB(0),
+fTriggerOADB(0),
+fRegexp(0),
+fCashedTokens(0)
+
 {
   // constructor
   
@@ -177,15 +177,15 @@ AliPhysicsSelection::AliPhysicsSelection() :
   
   AliLog::SetClassDebugLevel("AliPhysicsSelection", AliLog::kWarning);
 }
-    
+
 AliPhysicsSelection::~AliPhysicsSelection()
 {
   // destructor
-
+  
   fCollTrigClasses.Delete();
   fBGTrigClasses.Delete();
   fTriggerAnalysis.Delete();
-
+  
   if (fHistStatistics[0])
   {
     delete fHistStatistics[0];
@@ -210,7 +210,7 @@ AliPhysicsSelection::~AliPhysicsSelection()
     delete fHistTriggerPattern;
     fHistTriggerPattern = 0;
   }
-
+  
   if (fPSOADB)
   { 
     delete fPSOADB;
@@ -232,14 +232,14 @@ AliPhysicsSelection::~AliPhysicsSelection()
     delete fRegexp;
     fRegexp = 0;
   }
-    
+  
   if (fCashedTokens)
   {
     delete fCashedTokens;
     fCashedTokens = 0;
   }
-
-
+  
+  
 }
 
 UInt_t AliPhysicsSelection::CheckTriggerClass(const AliESDEvent* aEsd, const char* trigger, Int_t& triggerLogic) const
@@ -302,7 +302,7 @@ UInt_t AliPhysicsSelection::CheckTriggerClass(const AliESDEvent* aEsd, const cha
     else if (str2[0] == '#')
     {
       foundBCRequirement = kTRUE;
-    
+      
       str2.Remove(0, 1);
       
       Int_t bcNumber = str2.Atoi();
@@ -341,14 +341,14 @@ UInt_t AliPhysicsSelection::CheckTriggerClass(const AliESDEvent* aEsd, const cha
 //______________________________________________________________________________
 TObject *AliPhysicsSelection::GetStatistics(const Option_t *option) const
 {
-// Get the statistics histograms ("ALL" and "BIN0" and "TOK")
-   TString opt(option);
-   opt.ToUpper();
-   Int_t ihist = 0;
-   if (opt == "ALL") ihist = kStatIdxAll;
-   if (opt == "BIN0") ihist = kStatIdxBin0;
-   //   if (opt == "TOK") return fHistStatisticsTokens;
-   return fHistStatistics[ihist];
+  // Get the statistics histograms ("ALL" and "BIN0" and "TOK")
+  TString opt(option);
+  opt.ToUpper();
+  Int_t ihist = 0;
+  if (opt == "ALL") ihist = kStatIdxAll;
+  if (opt == "BIN0") ihist = kStatIdxBin0;
+  //   if (opt == "TOK") return fHistStatisticsTokens;
+  return fHistStatistics[ihist];
 }   
 
 //______________________________________________________________________________
@@ -367,10 +367,10 @@ Bool_t AliPhysicsSelection::EvaluateTriggerLogic(const AliESDEvent* aEsd, AliTri
     
     TArrayI pos;
     Int_t nMatches = fRegexp->Match(trigger, "", 0, 2, &pos);
-
+    
     if (nMatches <= 0)
       break;
-      
+    
     TString token(trigger(pos[0], pos[1]-pos[0]+1));
     
     TParameter<Int_t>* param = (TParameter<Int_t>*) fCashedTokens->FindObject(token);
@@ -399,7 +399,7 @@ Bool_t AliPhysicsSelection::EvaluateTriggerLogic(const AliESDEvent* aEsd, AliTri
       //      if(fHistStatisticsTokens)              
     }
   }
-
+  
   TFormula formula("formula", trigger);
   if (formula.Compile() > 0)
     AliFatal(Form("Could not evaluate trigger logic %s (evaluated to %s)", triggerLogic, trigger.Data()));
@@ -423,7 +423,7 @@ UInt_t AliPhysicsSelection::IsCollisionCandidate(const AliESDEvent* aEsd)
   } 
   mgr->LoadBranch("AliESDHeader.");
   mgr->LoadBranch("AliESDRun.");
-
+  
   if (fCurrentRun != aEsd->GetRunNumber()) {
     if (!Initialize(aEsd))
       AliFatal(Form("Could not initialize for run %d", aEsd->GetRunNumber()));
@@ -449,7 +449,7 @@ UInt_t AliPhysicsSelection::IsCollisionCandidate(const AliESDEvent* aEsd)
   }
   
   mgr->LoadBranch("AliMultiplicity.");
-//mgr->LoadBranch("AliESDFMD.");
+  //mgr->LoadBranch("AliESDFMD.");
   mgr->LoadBranch("AliESDVZERO.");
   mgr->LoadBranch("AliESDZDC.");
   mgr->LoadBranch("SPDVertex.");
@@ -457,9 +457,9 @@ UInt_t AliPhysicsSelection::IsCollisionCandidate(const AliESDEvent* aEsd)
   mgr->LoadBranch("TPCVertex.");
   mgr->LoadBranch("Tracks");
   mgr->LoadBranch("SPDPileupVertices");
-
+  
   UInt_t accept = 0;
-    
+  
   Int_t count = fCollTrigClasses.GetEntries() + fBGTrigClasses.GetEntries();
   for (Int_t i=0; i < count; i++)
   {
@@ -468,11 +468,11 @@ UInt_t AliPhysicsSelection::IsCollisionCandidate(const AliESDEvent* aEsd)
       triggerClass = ((TObjString*) fCollTrigClasses.At(i))->String();
     else
       triggerClass = ((TObjString*) fBGTrigClasses.At(i - fCollTrigClasses.GetEntries()))->String();
-  
+    
     AliDebug(AliLog::kDebug+1, Form("Processing trigger class %s", triggerClass));
-  
+    
     AliTriggerAnalysis* triggerAnalysis = static_cast<AliTriggerAnalysis*> (fTriggerAnalysis.At(i));
-  
+    
     triggerAnalysis->FillTriggerClasses(aEsd);
     
     Int_t triggerLogic = 0; 
@@ -481,12 +481,12 @@ UInt_t AliPhysicsSelection::IsCollisionCandidate(const AliESDEvent* aEsd)
     if (singleTriggerResult)
     {
       triggerAnalysis->FillHistograms(aEsd);
-  
+      
       Bool_t isBin0 = kFALSE;
       if (fBin0CallBack != "") {
-         isBin0 = ((AliAnalysisTaskSE*)mgr->GetTask(fBin0CallBack.Data()))->IsEventInBinZero();
+        isBin0 = ((AliAnalysisTaskSE*)mgr->GetTask(fBin0CallBack.Data()))->IsEventInBinZero();
       } else if (fBin0CallBackPointer) {
-         isBin0 = (*fBin0CallBackPointer)(aEsd);
+        isBin0 = (*fBin0CallBackPointer)(aEsd);
       }
       
       // ---->
@@ -494,10 +494,10 @@ UInt_t AliPhysicsSelection::IsCollisionCandidate(const AliESDEvent* aEsd)
       // tables. Decide wethere we are switching to a new stat table
       // (with all AliTriggerAnalysis tokens? Only we the tokens
       // actually used in the selection?) and clean up
-
+      
       AliESDVZERO *esdV0 = aEsd->GetVZEROData();
       if(!esdV0) fSkipV0 = kTRUE;
-
+      
       // hardware trigger
       Int_t fastORHW   = triggerAnalysis->EvaluateTrigger(aEsd, AliTriggerAnalysis::kSPDGFO); // SPD number of chips from trigger bits (!)
       //      Int_t fastORHWL1 = triggerAnalysis->EvaluateTrigger(aEsd, AliTriggerAnalysis::kSPDGFOL1); // SPD number of chips from trigger bits in second layer (!)
@@ -515,12 +515,12 @@ UInt_t AliPhysicsSelection::IsCollisionCandidate(const AliESDEvent* aEsd)
       Bool_t t0       = triggerAnalysis->EvaluateTrigger(aEsd, (AliTriggerAnalysis::Trigger) (AliTriggerAnalysis::kOfflineFlag | AliTriggerAnalysis::kT0    ));
       Bool_t t0BG     = triggerAnalysis->EvaluateTrigger(aEsd, (AliTriggerAnalysis::Trigger) (AliTriggerAnalysis::kOfflineFlag | AliTriggerAnalysis::kT0BG    ));
       Bool_t t0PileUp = triggerAnalysis->EvaluateTrigger(aEsd, (AliTriggerAnalysis::Trigger) (AliTriggerAnalysis::kOfflineFlag | AliTriggerAnalysis::kT0Pileup));
-
+      
       // fmd
       // Bool_t fmdA = triggerAnalysis->EvaluateTrigger(aEsd, (AliTriggerAnalysis::Trigger) (AliTriggerAnalysis::kOfflineFlag | AliTriggerAnalysis::kFMDA));
       // Bool_t fmdC = triggerAnalysis->EvaluateTrigger(aEsd, (AliTriggerAnalysis::Trigger) (AliTriggerAnalysis::kOfflineFlag | AliTriggerAnalysis::kFMDC));
       // Bool_t fmd  = fmdA || fmdC;
-    
+      
       // SSD
       //Int_t ssdClusters = triggerAnalysis->SSDClusters(aEsd);
       
@@ -532,14 +532,14 @@ UInt_t AliPhysicsSelection::IsCollisionCandidate(const AliESDEvent* aEsd)
       Bool_t zdcTime = triggerAnalysis->EvaluateTrigger(aEsd, (AliTriggerAnalysis::Trigger) (AliTriggerAnalysis::kOfflineFlag | AliTriggerAnalysis::kZDCTime));
       Bool_t znABG   = triggerAnalysis->EvaluateTrigger(aEsd, (AliTriggerAnalysis::Trigger) (AliTriggerAnalysis::kOfflineFlag | AliTriggerAnalysis::kZNABG));
       Bool_t znCBG   = triggerAnalysis->EvaluateTrigger(aEsd, (AliTriggerAnalysis::Trigger) (AliTriggerAnalysis::kOfflineFlag | AliTriggerAnalysis::kZNCBG));
-
+      
       Bool_t laserCut = triggerAnalysis->EvaluateTrigger(aEsd, (AliTriggerAnalysis::Trigger) (AliTriggerAnalysis::kOfflineFlag | AliTriggerAnalysis::kTPCLaserWarmUp));
       Bool_t hvDipCut = triggerAnalysis->EvaluateTrigger(aEsd, (AliTriggerAnalysis::Trigger) (AliTriggerAnalysis::kOfflineFlag | AliTriggerAnalysis::kTPCHVdip));
-
+      
       // Some "macros"
       Bool_t mb1 = (fastOROffline > 0 || v0A || v0C) && (!v0BG);
       Bool_t mb1prime = (fastOROffline > 1 || (fastOROffline > 0 && (v0A || v0C)) || (v0A && v0C) ) && (!v0BG);
-
+      
       // Background rejection
       Bool_t bgID = kFALSE;
       bgID = triggerAnalysis->EvaluateTrigger(aEsd,  (AliTriggerAnalysis::Trigger) (AliTriggerAnalysis::kSPDClsVsTrkBG | AliTriggerAnalysis::kOfflineFlag)); // FIXME: temporarily, we keep both ways to validate the new one. if the external BG id is not set, it will use the new one
@@ -549,17 +549,17 @@ UInt_t AliPhysicsSelection::IsCollisionCandidate(const AliESDEvent* aEsd)
       if(v0C)              ntrig += 1; //v0C alone is enough
       if(fmd)              ntrig += 1;
       if(ssdClusters>1)    ntrig += 1;*/
-
+      
       // // EMCAL offline trigger validation
       // Bool_t emcCut = triggerAnalysis->EvaluateTrigger(aEsd, (AliTriggerAnalysis::Trigger) (AliTriggerAnalysis::kOfflineFlag | AliTriggerAnalysis::kEMCAL));
       
       // <---
-
+      
       TString triggerLogicOnline  = fPSOADB->GetHardwareTrigger(triggerLogic);
       TString triggerLogicOffline = fPSOADB->GetOfflineTrigger(triggerLogic);
-
+      
       AliDebug(AliLog::kDebug, Form("Triggers from OADB [0x%x][%d][%s][%s]",singleTriggerResult,AliOADBPhysicsSelection::GetActiveBit(singleTriggerResult),triggerLogicOffline.Data(),triggerLogicOnline.Data()));
-
+      
       // replay hardware trigger (should only remove events for MC)
       Bool_t onlineTrigger  = EvaluateTriggerLogic(aEsd, triggerAnalysis, triggerLogicOnline, kFALSE);
       // offline selection
@@ -567,124 +567,79 @@ UInt_t AliPhysicsSelection::IsCollisionCandidate(const AliESDEvent* aEsd)
       
       // Printf("%s %s", triggerLogicOnline.Data(), triggerLogicOffline.Data());
       // Printf("%d %d", onlineTrigger, offlineTrigger);
-          
-
+      
+      
       // Fill trigger pattern histo
       Int_t tpatt = 0;
       if (fastORHW>0) tpatt+=1;
       if (v0AHW)      tpatt+=2;
       if (v0CHW)      tpatt+=4;
       fHistTriggerPattern->Fill( tpatt );
-
+      
       // fill statistics and return decision
       const Int_t nHistStat = 2;
       for(Int_t iHistStat = 0; iHistStat < nHistStat; iHistStat++){
-       if (iHistStat == kStatIdxBin0 && !isBin0) continue; // skip the filling of bin0 stats if the event is not in the bin0
-      
-       fHistStatistics[iHistStat]->Fill(kStatTriggerClass, i);
-       if(iHistStat == kStatIdxAll) fHistBunchCrossing->Fill(aEsd->GetBunchCrossNumber(), i); // Fill only for all (avoid double counting)
-
-       // We fill the rest only if hw trigger is ok
-       if (!onlineTrigger)
-         {
-           AliDebug(AliLog::kDebug, "Rejecting event because hardware trigger is not fired");
-           continue;
-         } else {       
-         fHistStatistics[iHistStat]->Fill(kStatHWTrig, i);
-       }
-      
-
-       // v0 BG stats
-       if (v0ABG)
-         fHistStatistics[iHistStat]->Fill(kStatV0ABG, i);
-       if (v0CBG)
-         fHistStatistics[iHistStat]->Fill(kStatV0CBG, i);
-
-       // T0 stats
-       if(t0)
-         fHistStatistics[iHistStat]->Fill(kStatT0BB,     i);
-       if(t0BG)
-         fHistStatistics[iHistStat]->Fill(kStatT0BG,     i);
-       if(t0PileUp)
-         fHistStatistics[iHistStat]->Fill(kStatT0PileUp, i);
-
-       // mb 1
-       if (mb1)
-         fHistStatistics[iHistStat]->Fill(kStatMB1, i);
-
-       if (mb1prime)
-         fHistStatistics[iHistStat]->Fill(kStatMB1Prime, i);
-
-       if (laserCut)
-         fHistStatistics[iHistStat]->Fill(kStatLaserCut, i);
-
-       if (hvDipCut)
-         fHistStatistics[iHistStat]->Fill(kHVdipCut, i);
-
-       //if(ntrig >= 2 && !v0BG) 
-       //  fHistStatistics[iHistStat]->Fill(kStatAny2Hits, i);
-
-       if (fastOROffline > 0)
-         fHistStatistics[iHistStat]->Fill(kStatFO1, i);
-       if (fastOROffline > 1)
-         fHistStatistics[iHistStat]->Fill(kStatFO2, i);
-       if (fastOROfflineL1 > 1)
-         fHistStatistics[iHistStat]->Fill(kStatFO2L1, i);
+        if (iHistStat == kStatIdxBin0 && !isBin0) continue; // skip the filling of bin0 stats if the event is not in the bin0
         
-       if (v0A)
-         fHistStatistics[iHistStat]->Fill(kStatV0A, i);
-       if (v0C)
-         fHistStatistics[iHistStat]->Fill(kStatV0C, i);
-         
-       if (zdcA)
-         fHistStatistics[iHistStat]->Fill(kStatZDCA, i);
-       if (zdcC)
-         fHistStatistics[iHistStat]->Fill(kStatZDCC, i);
-       if (zdcA && zdcC)
-         fHistStatistics[iHistStat]->Fill(kStatZDCAC, i);
-
-       if (zdcTime)
-         fHistStatistics[iHistStat]->Fill(kStatZDCTime, i);
-       if (znABG)
-         fHistStatistics[iHistStat]->Fill(kStatZNABG, i);
-       if (znCBG)
-         fHistStatistics[iHistStat]->Fill(kStatZNCBG, i);
-  
-       if (v0A && v0C && !v0BG && (!bgID && fIsPP))
-         fHistStatistics[iHistStat]->Fill(kStatV0, i);
-
-       if (v0A && v0C && !v0BG && (!bgID && fIsPP) && !znABG && !znCBG)
-         fHistStatistics[iHistStat]->Fill(kStatV0ZN, i);
-
-       if (bgID && !v0BG) 
-         fHistStatistics[iHistStat]->Fill(kStatBG, i);
-
-       // FIXME: check lines below
-       if ( offlineTrigger )
-         {
-           if (!v0BG || fSkipV0)
-             {
-               if (!v0BG) fHistStatistics[iHistStat]->Fill(kStatOffline, i);
-               AliDebug(AliLog::kDebug, Form("Accepted event for histograms with trigger logic %d", triggerLogic));
+        fHistStatistics[iHistStat]->Fill(kStatTriggerClass, i);
+        if(iHistStat == kStatIdxAll) fHistBunchCrossing->Fill(aEsd->GetBunchCrossNumber(), i); // Fill only for all (avoid double counting)
+        
+        // We fill the rest only if hw trigger is ok
+        if (!onlineTrigger) {
+          AliDebug(AliLog::kDebug, "Rejecting event because hardware trigger is not fired");
+          continue;
+        } else {
+          fHistStatistics[iHistStat]->Fill(kStatHWTrig, i);
+        }
+        
+        if (v0ABG)               fHistStatistics[iHistStat]->Fill(kStatV0ABG, i);
+        if (v0CBG)               fHistStatistics[iHistStat]->Fill(kStatV0CBG, i);
+        if (t0)                  fHistStatistics[iHistStat]->Fill(kStatT0BB,     i);
+        if (t0BG)                fHistStatistics[iHistStat]->Fill(kStatT0BG,     i);
+        if (t0PileUp)            fHistStatistics[iHistStat]->Fill(kStatT0PileUp, i);
+        if (mb1)                 fHistStatistics[iHistStat]->Fill(kStatMB1, i);
+        if (mb1prime)            fHistStatistics[iHistStat]->Fill(kStatMB1Prime, i);
+        if (laserCut)            fHistStatistics[iHistStat]->Fill(kStatLaserCut, i);
+        if (hvDipCut)            fHistStatistics[iHistStat]->Fill(kHVdipCut, i);
+        if (fastOROffline > 0)   fHistStatistics[iHistStat]->Fill(kStatFO1, i);
+        if (fastOROffline > 1)   fHistStatistics[iHistStat]->Fill(kStatFO2, i);
+        if (fastOROfflineL1 > 1) fHistStatistics[iHistStat]->Fill(kStatFO2L1, i);
+        if (v0A)                 fHistStatistics[iHistStat]->Fill(kStatV0A, i);
+        if (v0C)                 fHistStatistics[iHistStat]->Fill(kStatV0C, i);
+        if (zdcA)                fHistStatistics[iHistStat]->Fill(kStatZDCA, i);
+        if (zdcC)                fHistStatistics[iHistStat]->Fill(kStatZDCC, i);
+        if (zdcA && zdcC)        fHistStatistics[iHistStat]->Fill(kStatZDCAC, i);
+        if (zdcTime)             fHistStatistics[iHistStat]->Fill(kStatZDCTime, i);
+        if (znABG)               fHistStatistics[iHistStat]->Fill(kStatZNABG, i);
+        if (znCBG)               fHistStatistics[iHistStat]->Fill(kStatZNCBG, i);
+        if (bgID && !v0BG)       fHistStatistics[iHistStat]->Fill(kStatBG, i);
+        if (v0A && v0C && !v0BG && (!bgID && fIsPP)) fHistStatistics[iHistStat]->Fill(kStatV0, i);
+        if (v0A && v0C && !v0BG && (!bgID && fIsPP) && !znABG && !znCBG) fHistStatistics[iHistStat]->Fill(kStatV0ZN, i);
+        
+        // FIXME: check lines below
+        if ( offlineTrigger ) {
+          if (!v0BG || fSkipV0) {
+            if (!v0BG) fHistStatistics[iHistStat]->Fill(kStatOffline, i);
+            AliDebug(AliLog::kDebug, Form("Accepted event for histograms with trigger logic %d", triggerLogic));
+            
+            fHistStatistics[iHistStat]->Fill(kStatAccepted, i);
+            
+            if (aEsd->IsPileupFromSPD())
+              fHistStatistics[iHistStat]->Fill(kStatAcceptedPileUp, i);
             
-               fHistStatistics[iHistStat]->Fill(kStatAccepted, i);
-               
-               if (aEsd->IsPileupFromSPD())
-                 fHistStatistics[iHistStat]->Fill(kStatAcceptedPileUp, i);
-               
-                   // if(iHistStat == kStatIdxAll) fHistBunchCrossing->Fill(aEsd->GetBunchCrossNumber(), i); // Fill only for all (avoid double counting)
-               if((i < fCollTrigClasses.GetEntries() || fSkipTriggerClassSelection) && (iHistStat==kStatIdxAll))
-                 accept |= singleTriggerResult; // only set for "all" (should not really matter)
-             }
-           else
-             AliDebug(AliLog::kDebug, "Rejecting event because of V0 BG flag");
-         }
-       else
-         AliDebug(AliLog::kDebug, Form("Rejecting event because trigger logic %d is not fulfilled", triggerLogic));
+            // if(iHistStat == kStatIdxAll) fHistBunchCrossing->Fill(aEsd->GetBunchCrossNumber(), i); // Fill only for all (avoid double counting)
+            if((i < fCollTrigClasses.GetEntries() || fSkipTriggerClassSelection) && (iHistStat==kStatIdxAll))
+              accept |= singleTriggerResult; // only set for "all" (should not really matter)
+          }
+          else
+            AliDebug(AliLog::kDebug, "Rejecting event because of V0 BG flag");
+        }
+        else
+          AliDebug(AliLog::kDebug, Form("Rejecting event because trigger logic %d is not fulfilled", triggerLogic));
       }
     }
   }
+  
   if (accept)
     AliDebug(AliLog::kDebug, Form("Accepted event as collision candidate with bit mask %d", accept));
   
@@ -848,7 +803,7 @@ UInt_t AliPhysicsSelection::IsCollisionCandidate(const AliESDEvent* aEsd)
 //     else if (!strcmp("CINT1C-ABCE-NOPF-ALL",trigger)) return "   #3019  #3119  #3219  #3319  #3519 ";
 //     else if (!strcmp("CINT1-E-NOPF-ALL",trigger)) return " #1835 #2726";
 //     //    else AliError(Form("Unknown trigger: %s", trigger));
-    
+
 //   } 
 //   else if (runNumber >= 130148 && runNumber <= 130375) {
 //     TString triggerString = trigger;
@@ -887,25 +842,25 @@ Bool_t AliPhysicsSelection::Initialize(const AliESDEvent* aEsd)
   fIsPP = kTRUE;
   if (strcmp(aEsd->GetESDRun()->GetBeamType(), "A-A") == 0)
     fIsPP = kFALSE;
-
+  
   return Initialize(aEsd->GetRunNumber());
 }
 
 Bool_t AliPhysicsSelection::Initialize(Int_t runNumber)
 {
   // initializes the object for the given run  
-
-
+  
+  
   Bool_t oldStatus = TH1::AddDirectoryStatus();
   TH1::AddDirectory(kFALSE);
-
+  
   /// Open OADB file and fetch OADB objects
   TString oadbfilename = AliPhysicsSelection::GetOADBFileName();
-
+  
   TFile * foadb = TFile::Open(oadbfilename);
   if(!foadb->IsOpen()) AliFatal(Form("Cannot open OADB file %s", oadbfilename.Data()));
-
-
+  
+  
   if(!fPSOADB || !fUsingCustomClasses) { // if it's already set and custom class is required, we use the one provided by the user
     AliInfo("Using Standard OADB");
     AliOADBContainer * psContainer = (AliOADBContainer*) foadb->Get("physSel");
@@ -928,17 +883,17 @@ Bool_t AliPhysicsSelection::Initialize(Int_t runNumber)
     fTriggerOADB->Print();
     if (!fTriggerOADB) AliFatal(Form("Cannot find  trigger analysis object for run %d", runNumber));
   }
-
+  
   
   if(!fBin0CallBack) 
     AliError("Bin0 Callback not set: will not fill the statistics for the bin 0");
-
+  
   if (fMC) {
     // override BX and bg options in case of MC
     fComputeBG    = kFALSE;
     fUseBXNumbers = kFALSE;
   }
-
+  
   // FIXME: think how to implement this check with the OADB, trigger scheme is not a int number here 
   // Int_t triggerScheme = GetTriggerScheme(runNumber);
   // if (!fUsingCustomClasses && fCurrentRun != -1 && triggerScheme != GetTriggerScheme(fCurrentRun))
@@ -946,15 +901,15 @@ Bool_t AliPhysicsSelection::Initialize(Int_t runNumber)
   
   if(fComputeBG && fCurrentRun != -1 && fCurrentRun != runNumber) 
     AliFatal("Cannot process several runs because BG computation is requested");
-
+  
   if(fComputeBG && !fUseBXNumbers) 
     AliFatal("Cannot compute BG if BX numbers are not used");
   
   if(fUseBXNumbers && fFillingScheme != "" && fFillingScheme != fFillOADB->GetFillingSchemeName())
     AliFatal("Cannot process runs with different filling scheme if usage of BX numbers is requested");
-
+  
   fFillingScheme      = fFillOADB->GetFillingSchemeName();
-
+  
   AliInfo(Form("Initializing for run %d", runNumber));
   
   // initialize first time?
@@ -967,20 +922,20 @@ Bool_t AliPhysicsSelection::Initialize(Int_t runNumber)
       TIterator * bgIter   = fPSOADB->GetBGTrigClass(ibit)->MakeIterator();
       TObjString * obj = 0;
       while((obj = (TObjString*) collIter->Next())){
-       if (obj->String() != "") {
-         fCollTrigClasses.Add(new TObjString(GetTriggerString(obj)));
-       }
+        if (obj->String() != "") {
+          fCollTrigClasses.Add(new TObjString(GetTriggerString(obj)));
+        }
       }
       // BG classes only make sense for real data
       if(!fMC) {
-       obj = 0 ;
-       while((obj = (TObjString*) bgIter->Next())){
-         if (obj->String() != "") {
-           fBGTrigClasses.Add(new TObjString(GetTriggerString(obj)));
-         }
-       }
+        obj = 0 ;
+        while((obj = (TObjString*) bgIter->Next())){
+          if (obj->String() != "") {
+            fBGTrigClasses.Add(new TObjString(GetTriggerString(obj)));
+          }
+        }
       }
-
+      
     }
     // not sure how to handle this in the case of > x cuts
     // // Book the token histo with the tokens actually used here!
@@ -994,23 +949,23 @@ Bool_t AliPhysicsSelection::Initialize(Int_t runNumber)
     //         Int_t ntokens = fCashedTokens->GetEntries();
     //         Int_t count = fCollTrigClasses->GetEntries() + fBGTrigClasses->GetEntries();
     //         fHistStatisticsTokens = new TH2F("fHistStatisticsTokens", "fHistStatisticsTokens", ntokens + 2, 0.5, ntokens+2+0.5, count, -0.5, -0.5 + count);
-       
+    
     //         Int_t nrow = 0;
     //         fHistStatisticsTokens->GetXaxis()->SetBinLabel(nrow++,  "Trigger class");
     //         for(Int_t itoken = 0; itoken < ntoken; itoken++){
     //           TParameter<Int_t> * param = fCashedTokens->At(itoken);
     //           fHistStatisticsTokens->GetXaxis()->SetBinLabel(nrow++,  param->GetName());      
     //         }
-       
+    
     //         fHistStatisticsTokens->GetXaxis()->SetBinLabel(nrow++,      "Accepted");
-
+    
     // }
-
+    
     
     
     // TODO: 
     // Add a new statistics histo containing only the tokens actually used in the selection
-
+    
     Int_t count = fCollTrigClasses.GetEntries() + fBGTrigClasses.GetEntries();
     
     for (Int_t i=0; i<count; i++)
@@ -1022,30 +977,30 @@ Bool_t AliPhysicsSelection::Initialize(Int_t runNumber)
       triggerAnalysis->SetSPDGFOThreshhold(1);
       triggerAnalysis->SetDoFMD(kFALSE);
       triggerAnalysis->SetCorrZDCCutParams(fTriggerOADB->GetZDCCutRefSumCorr(),
-                                          fTriggerOADB->GetZDCCutRefDeltaCorr(), 
-                                          fTriggerOADB->GetZDCCutSigmaSumCorr(),
-                                          fTriggerOADB->GetZDCCutSigmaDeltaCorr());
+          fTriggerOADB->GetZDCCutRefDeltaCorr(), 
+          fTriggerOADB->GetZDCCutSigmaSumCorr(),
+          fTriggerOADB->GetZDCCutSigmaDeltaCorr());
       triggerAnalysis->SetZNCorrCutParams(fTriggerOADB->GetZDCCutZNATimeCorrMin(),fTriggerOADB->GetZDCCutZNATimeCorrMax(),
-                                         fTriggerOADB->GetZDCCutZNCTimeCorrMin(),fTriggerOADB->GetZDCCutZNCTimeCorrMax());
+          fTriggerOADB->GetZDCCutZNCTimeCorrMin(),fTriggerOADB->GetZDCCutZNCTimeCorrMax());
       fTriggerAnalysis.Add(triggerAnalysis);
     }
-
+    
     
     // TODO: shall I really delete this?
     if (fHistStatistics[0])
       delete fHistStatistics[0];
     if (fHistStatistics[1])
       delete fHistStatistics[1];
-  
+    
     fHistStatistics[kStatIdxBin0] = BookHistStatistics("_Bin0");
     fHistStatistics[kStatIdxAll]  = BookHistStatistics("");
     
-
+    
     if (fHistBunchCrossing)
       delete fHistBunchCrossing;
-  
+    
     fHistBunchCrossing = new TH2F("fHistBunchCrossing", "fHistBunchCrossing;bunch crossing number;", 4000, -0.5, 3999.5,  count, -0.5, -0.5 + count);
-
+    
     // TODO: remove fHistTriggerPattern
     if (fHistTriggerPattern)
       delete fHistTriggerPattern;
@@ -1053,9 +1008,9 @@ Bool_t AliPhysicsSelection::Initialize(Int_t runNumber)
     const int ntrig=3;
     Int_t n = 1;
     const Int_t nbinTrig = TMath::Nint(TMath::Power(2,ntrig));
-
+    
     fHistTriggerPattern = new TH1F("fHistTriggerPattern", "Trigger pattern: FO + 2*v0A + 4*v0C", 
-                                  nbinTrig, -0.5, nbinTrig-0.5);    
+        nbinTrig, -0.5, nbinTrig-0.5);    
     fHistTriggerPattern->GetXaxis()->SetBinLabel(1,"NO TRIG");
     fHistTriggerPattern->GetXaxis()->SetBinLabel(2,"FO");
     fHistTriggerPattern->GetXaxis()->SetBinLabel(3,"v0A");
@@ -1064,8 +1019,8 @@ Bool_t AliPhysicsSelection::Initialize(Int_t runNumber)
     fHistTriggerPattern->GetXaxis()->SetBinLabel(6,"FO & v0C");
     fHistTriggerPattern->GetXaxis()->SetBinLabel(7,"v0A & v0C");
     fHistTriggerPattern->GetXaxis()->SetBinLabel(8,"FO & v0A & v0C");
-
-  
+    
+    
     n = 1;
     for (Int_t i=0; i < fCollTrigClasses.GetEntries(); i++)
     {
@@ -1079,31 +1034,31 @@ Bool_t AliPhysicsSelection::Initialize(Int_t runNumber)
       fHistBunchCrossing->GetYaxis()->SetBinLabel(n, ((TObjString*) fBGTrigClasses.At(i))->String());
       n++;
     }
-
     
-
-  }
     
+    
+  }
+  
   Int_t count = fCollTrigClasses.GetEntries() + fBGTrigClasses.GetEntries();
   for (Int_t i=0; i<count; i++)
   {
     
     AliTriggerAnalysis* triggerAnalysis = static_cast<AliTriggerAnalysis*> (fTriggerAnalysis.At(i));
-  
+    
     switch (runNumber)
     {
-      case 104315:
-      case 104316:
-      case 104320:
-      case 104321:
-      case 104439:
-        triggerAnalysis->SetV0TimeOffset(7.5);
-        break;
-      default:
-        triggerAnalysis->SetV0TimeOffset(0);
+    case 104315:
+    case 104316:
+    case 104320:
+    case 104321:
+    case 104439:
+      triggerAnalysis->SetV0TimeOffset(7.5);
+      break;
+    default:
+      triggerAnalysis->SetV0TimeOffset(0);
     }
   }
-    
+  
   fCurrentRun = runNumber;
   
   TH1::AddDirectory(oldStatus);
@@ -1117,7 +1072,7 @@ TH2F * AliPhysicsSelection::BookHistStatistics(const char * tag) {
   // BG and the ratio of BG and accidentals to total +ratio goot to
   // first col + 2 for error on good.
   // TODO: Remember the the indexes of rows for the BG selection. Add new member fBGRows[] and use kStat as indexes
-
+  
   Int_t count = fCollTrigClasses.GetEntries() + fBGTrigClasses.GetEntries();
 #ifdef VERBOSE_STAT
   Int_t extrarows = fComputeBG != 0 ? 11 : 0;
@@ -1125,7 +1080,7 @@ TH2F * AliPhysicsSelection::BookHistStatistics(const char * tag) {
   Int_t extrarows = fComputeBG != 0 ? 6 : 0;
 #endif
   TH2F * h = new TH2F(Form("fHistStatistics%s",tag), Form("fHistStatistics - %s ;;",tag), kStatAccepted, 0.5, kStatAccepted+0.5, count+extrarows, -0.5, -0.5 + count+extrarows);
-
+  
   h->GetXaxis()->SetBinLabel(kStatTriggerClass,  "Trigger class");
   h->GetXaxis()->SetBinLabel(kStatHWTrig,       "Hardware trigger");
   h->GetXaxis()->SetBinLabel(kStatFO1,          "FO >= 1");
@@ -1156,20 +1111,20 @@ TH2F * AliPhysicsSelection::BookHistStatistics(const char * tag) {
   h->GetXaxis()->SetBinLabel(kStatBG,           "Background identification");
   h->GetXaxis()->SetBinLabel(kStatAcceptedPileUp, "Pile up (in accepted)");
   h->GetXaxis()->SetBinLabel(kStatAccepted,      "Accepted");
-
-
+  
+  
   Int_t n = 1;
   for (Int_t i=0; i < fCollTrigClasses.GetEntries(); i++)
-    {
-      h->GetYaxis()->SetBinLabel(n, ((TObjString*) fCollTrigClasses.At(i))->String());
-      n++;
-    }
+  {
+    h->GetYaxis()->SetBinLabel(n, ((TObjString*) fCollTrigClasses.At(i))->String());
+    n++;
+  }
   for (Int_t i=0; i < fBGTrigClasses.GetEntries(); i++)
-    {
-      h->GetYaxis()->SetBinLabel(n, ((TObjString*) fBGTrigClasses.At(i))->String());
-      n++;
-    }
-
+  {
+    h->GetYaxis()->SetBinLabel(n, ((TObjString*) fBGTrigClasses.At(i))->String());
+    n++;
+  }
+  
   if(fComputeBG) {
     fBGStatOffset = n;
     h->GetYaxis()->SetBinLabel(n++, "All B");
@@ -1186,7 +1141,7 @@ TH2F * AliPhysicsSelection::BookHistStatistics(const char * tag) {
 #endif
     h->GetYaxis()->SetBinLabel(n++, "GOOD");
   }
-
+  
   return h;
 }
 
@@ -1204,7 +1159,7 @@ void AliPhysicsSelection::Print(const Option_t *option) const
   Printf("Background trigger classes:");
   for (Int_t i=0; i < fBGTrigClasses.GetEntries(); i++)
     Printf("%s", ((TObjString*) fBGTrigClasses.At(i))->String().Data());
-
+  
   AliTriggerAnalysis* triggerAnalysis = dynamic_cast<AliTriggerAnalysis*> (fTriggerAnalysis.At(0));
   
   if (triggerAnalysis)
@@ -1222,46 +1177,46 @@ void AliPhysicsSelection::Print(const Option_t *option) const
       TObjString* obj = 0;
       static TString alreadyFoundTriggers;
       while ((obj = dynamic_cast<TObjString*> (iter->Next())))
-       {
-         TString strTrigger = obj->GetString();    
-         TParameter<Long64_t>* param = static_cast<TParameter<Long64_t>*> (triggers->GetValue(obj));
-         Long_t counts =  (Long_t)param->GetVal();
-         TObjArray* tokens = obj->String().Tokenize(" ");
-         for (Int_t i=0; i<tokens->GetEntries(); i++)
-           {
-             TString singleTrigStr = ((TObjString*) tokens->At(i))->String();
-             singleTrigStr.Strip(TString::kBoth, ' ' );
-             const char * singleTrig = singleTrigStr.Data();
-             //            Printf("%s", singleTrig);
-             TString singleTrigStrFull;
-             Bool_t found = kFALSE;
-             Int_t nCollTriggers = fCollTrigClasses.GetEntries();
-             for(Int_t iCollTriggers = 0; iCollTriggers < nCollTriggers; iCollTriggers++){
-               singleTrigStrFull = ((TObjString*)fCollTrigClasses.At(iCollTriggers))->String();
-               if(singleTrigStrFull.Contains(singleTrigStr)) {
-                 found = kTRUE;
-                 break;
-               }
-               singleTrigStrFull = singleTrigStr;
-             }
-             Int_t nBGTriggers = fBGTrigClasses.GetEntries();
-             for(Int_t iBGTriggers = 0; iBGTriggers < nBGTriggers; iBGTriggers++){
-               singleTrigStrFull = ((TObjString*)fBGTrigClasses.At(iBGTriggers))->String();
-               if(singleTrigStrFull.Contains(singleTrigStr)) {
-                 found = kTRUE;
-                 break;
-               }
-               singleTrigStrFull = singleTrigStr;
-             }
-             
-             TString blacklist = "CEMC7WU-B-NOPF-ALL, CEMC7WU-AC-NOPF-ALL CEMC7WU-E-NOPF-ALL C0LSR-ABCE-NOPF-TPC CBEAMB-B-NOPF-ALLNOTRD"; // We know we dont support those, so we print no warning           
-             if(counts>0 && !found && !blacklist.Contains(singleTrig) && !singleTrigStr.Contains("WU") && !alreadyFoundTriggers.Contains(singleTrig)) {
-               Printf("WARNING: Found unknown trigger [%s] with %ld counts in the ESD!", singleTrig, counts);
-               alreadyFoundTriggers += singleTrig; // Avoid printing warning twice for the same trigger
-             }       
-           }    
-         delete tokens;        
-       }
+      {
+        TString strTrigger = obj->GetString();    
+        TParameter<Long64_t>* param = static_cast<TParameter<Long64_t>*> (triggers->GetValue(obj));
+        Long_t counts =  (Long_t)param->GetVal();
+        TObjArray* tokens = obj->String().Tokenize(" ");
+        for (Int_t i=0; i<tokens->GetEntries(); i++)
+        {
+          TString singleTrigStr = ((TObjString*) tokens->At(i))->String();
+          singleTrigStr.Strip(TString::kBoth, ' ' );
+          const char * singleTrig = singleTrigStr.Data();
+          //       Printf("%s", singleTrig);
+          TString singleTrigStrFull;
+          Bool_t found = kFALSE;
+          Int_t nCollTriggers = fCollTrigClasses.GetEntries();
+          for(Int_t iCollTriggers = 0; iCollTriggers < nCollTriggers; iCollTriggers++){
+            singleTrigStrFull = ((TObjString*)fCollTrigClasses.At(iCollTriggers))->String();
+            if(singleTrigStrFull.Contains(singleTrigStr)) {
+              found = kTRUE;
+              break;
+            }
+            singleTrigStrFull = singleTrigStr;
+          }
+          Int_t nBGTriggers = fBGTrigClasses.GetEntries();
+          for(Int_t iBGTriggers = 0; iBGTriggers < nBGTriggers; iBGTriggers++){
+            singleTrigStrFull = ((TObjString*)fBGTrigClasses.At(iBGTriggers))->String();
+            if(singleTrigStrFull.Contains(singleTrigStr)) {
+              found = kTRUE;
+              break;
+            }
+            singleTrigStrFull = singleTrigStr;
+          }
+          
+          TString blacklist = "CEMC7WU-B-NOPF-ALL, CEMC7WU-AC-NOPF-ALL CEMC7WU-E-NOPF-ALL C0LSR-ABCE-NOPF-TPC CBEAMB-B-NOPF-ALLNOTRD"; // We know we dont support those, so we print no warning              
+          if(counts>0 && !found && !blacklist.Contains(singleTrig) && !singleTrigStr.Contains("WU") && !alreadyFoundTriggers.Contains(singleTrig)) {
+            Printf("WARNING: Found unknown trigger [%s] with %ld counts in the ESD!", singleTrig, counts);
+            alreadyFoundTriggers += singleTrig; // Avoid printing warning twice for the same trigger
+          }          
+        }    
+        delete tokens; 
+      }
       delete iter;
     }
   }
@@ -1269,7 +1224,7 @@ void AliPhysicsSelection::Print(const Option_t *option) const
   if (fHistStatistics[kStatIdxAll])
   {
     static TString alreadyFoundTriggers; // avoids printing twice the same warning
-       
+    
     for (Int_t i=0; i<fCollTrigClasses.GetEntries(); i++)
     {
       Printf("\nSelection statistics for collision trigger %s:", ((TObjString*) fCollTrigClasses.At(i))->String().Data());
@@ -1277,7 +1232,7 @@ void AliPhysicsSelection::Print(const Option_t *option) const
       
       Float_t allEvents       = fHistStatistics[kStatIdxAll]->GetBinContent(1, i+1); 
       Float_t triggeredEvents = fHistStatistics[kStatIdxAll]->GetBinContent(fHistStatistics[kStatIdxAll]->GetXaxis()->FindBin("Accepted"), i+1); 
-
+      
       Printf("Total events with correct trigger class: %d", (Int_t) fHistStatistics[kStatIdxAll]->GetBinContent(1, i+1));
       msg += Form("Total events with correct trigger class: %d\n", (Int_t) fHistStatistics[kStatIdxAll]->GetBinContent(1, i+1));
       Printf("Selected collision candidates: %d", (Int_t) fHistStatistics[kStatIdxAll]->GetBinContent(fHistStatistics[kStatIdxAll]->GetXaxis()->FindBin("Accepted"), i+1));
@@ -1286,12 +1241,12 @@ void AliPhysicsSelection::Print(const Option_t *option) const
       // If the fraction of accepted events is too low, print a warning.
       Float_t eff = allEvents > 0 ? triggeredEvents/allEvents : 0;
       if(allEvents > 0 && (eff < 0.5) &&  // FIXME: make threshold programmable in OADB
-        !alreadyFoundTriggers.Contains(((TObjString*) fCollTrigClasses.At(i))->String().Data())) {
-       Printf("WARNING: Trigger class %s has a very low efficiency (%d/%d=%.2f)",((TObjString*) fCollTrigClasses.At(i))->String().Data(), (Int_t) triggeredEvents, (Int_t) allEvents, eff);
-       alreadyFoundTriggers += ((TObjString*) fCollTrigClasses.At(i))->String().Data();
-       Printf("%s", alreadyFoundTriggers.Data());
+          !alreadyFoundTriggers.Contains(((TObjString*) fCollTrigClasses.At(i))->String().Data())) {
+        Printf("WARNING: Trigger class %s has a very low efficiency (%d/%d=%.2f)",((TObjString*) fCollTrigClasses.At(i))->String().Data(), (Int_t) triggeredEvents, (Int_t) allEvents, eff);
+        alreadyFoundTriggers += ((TObjString*) fCollTrigClasses.At(i))->String().Data();
+        Printf("%s", alreadyFoundTriggers.Data());
       }
-
+      
     }
   }
   
@@ -1308,7 +1263,7 @@ void AliPhysicsSelection::Print(const Option_t *option) const
       for (Int_t j=1; j<=fHistBunchCrossing->GetNbinsX(); j++)
         if (fHistBunchCrossing->GetBinContent(j, i) > 0)
           str += Form("%d, ", (Int_t) fHistBunchCrossing->GetXaxis()->GetBinCenter(j));
-             
+      
       Printf("%s", str.Data());
       msg += str;
       msg += "\n";
@@ -1332,7 +1287,7 @@ void AliPhysicsSelection::Print(const Option_t *option) const
         Printf("WARNING: Bunch crossing %d has collision and BG trigger classes active. Check BPTX functioning for this run!", (Int_t) fHistBunchCrossing->GetXaxis()->GetBinCenter(j));
     }
   }
-
+  
   if (fUsingCustomClasses)        
     Printf("WARNING: Using custom trigger classes!");
   if (fSkipTriggerClassSelection) 
@@ -1344,8 +1299,8 @@ void AliPhysicsSelection::Print(const Option_t *option) const
   TString opt(option);
   opt.ToUpper();
   if (opt == "STAT") {
-     AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
-     if (mgr) mgr->AddStatisticsMsg(msg);
+    AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
+    if (mgr) mgr->AddStatisticsMsg(msg);
   }
 }
 
@@ -1354,23 +1309,23 @@ Long64_t AliPhysicsSelection::Merge(TCollection* list)
   // Merge a list of AliMultiplicityCorrection objects with this (needed for
   // PROOF).
   // Returns the number of merged objects (including this).
-
+  
   if (!list)
     return 0;
-
+  
   if (list->IsEmpty())
     return 1;
-
+  
   TIterator* iter = list->MakeIterator();
   TObject* obj;
   
   // collections of all histograms
   const Int_t nHists = 8;
   TList collections[nHists];
-
+  
   Int_t count = 0;
   while ((obj = iter->Next())) {
-
+    
     AliPhysicsSelection* entry = dynamic_cast<AliPhysicsSelection*> (obj);
     if (entry == 0) 
       continue;
@@ -1391,22 +1346,22 @@ Long64_t AliPhysicsSelection::Merge(TCollection* list)
         fBGTrigClasses.Add(entry->fBGTrigClasses.At(i)->Clone());
     }
     if (fCurrentRun != currentRun)
-       AliWarning(Form("Current run %d not matching the one to be merged with %d", fCurrentRun, currentRun));
-
+      AliWarning(Form("Current run %d not matching the one to be merged with %d", fCurrentRun, currentRun));
+    
     // With the same strategy update fBGStatOffset
     Int_t bgstatoffset = entry->GetBGStatOffset();
     
     // Nothing to merge with since BG was not initialized.
     if (!(bgstatoffset < 0)){
       if (fBGStatOffset < 0) 
-       {
-         fBGStatOffset = bgstatoffset;
-       }
+      {
+        fBGStatOffset = bgstatoffset;
+      }
     }
     if (fBGStatOffset != bgstatoffset)
       AliWarning(Form("Current run %d not matching the one to be merged with %d", fBGStatOffset, bgstatoffset));
     
-
+    
     
     // Merge the OADBs (Take just the first instance you find
     if (!fPSOADB && entry->GetOADBPhysicsSelection()) {
@@ -1415,7 +1370,7 @@ Long64_t AliPhysicsSelection::Merge(TCollection* list)
     if (!fFillOADB && entry->GetOADBFillingScheme()){
       fFillOADB = (AliOADBFillingScheme*) entry->GetOADBFillingScheme()->Clone();
     }
-
+    
     if (entry->fTriggerAnalysis.GetEntries() > 0)
       collections[0].Add(&(entry->fTriggerAnalysis));
     if (entry->fHistStatistics[0])
@@ -1428,10 +1383,10 @@ Long64_t AliPhysicsSelection::Merge(TCollection* list)
       collections[3].Add(entry->fHistBunchCrossing);
     if (entry->fHistTriggerPattern)
       collections[4].Add(entry->fHistTriggerPattern);
-
+    
     count++;
   }
-
+  
   if (fTriggerAnalysis.GetEntries() == 0 && collections[0].GetEntries() > 0)
   {
     TList* firstList = (TList*) collections[0].First();
@@ -1450,7 +1405,7 @@ Long64_t AliPhysicsSelection::Merge(TCollection* list)
   }
   if (fHistStatistics[0])
     fHistStatistics[0]->Merge(&collections[1]);
-    
+  
   if (!fHistStatistics[1] && collections[2].GetEntries() > 0)
   {
     fHistStatistics[1] = (TH2F*) collections[2].First()->Clone();
@@ -1458,7 +1413,7 @@ Long64_t AliPhysicsSelection::Merge(TCollection* list)
   }
   if (fHistStatistics[1])
     fHistStatistics[1]->Merge(&collections[2]);
-    
+  
   if (!fHistBunchCrossing && collections[3].GetEntries() > 0)
   {
     fHistBunchCrossing = (TH2F*) collections[3].First()->Clone();
@@ -1474,9 +1429,9 @@ Long64_t AliPhysicsSelection::Merge(TCollection* list)
   }
   if (fHistTriggerPattern)
     fHistTriggerPattern->Merge(&collections[4]);
-    
+  
   delete iter;
-
+  
   return count+1;
 }
 
@@ -1486,18 +1441,18 @@ void AliPhysicsSelection::SaveHistograms(const char* folder)
   
   if (!fHistStatistics[0] || !fHistStatistics[1])
     return;
-    
+  
   if (folder)
   {
     gDirectory->mkdir(folder);
     gDirectory->cd(folder);
   }
   
-
+  
   // Fill the last rows of fHistStatistics before saving
   if (fComputeBG) {      
     AliInfo("BG estimate assumes that for a given run you only have A and C triggers separately or"
-           " toghether as a AC class! Make sure this assumption holds in your case"); 
+        " toghether as a AC class! Make sure this assumption holds in your case"); 
     
     // use an anum for the different trigger classes, to make loops easier to read
     enum {kClassB =0 , kClassA, kClassC, kClassAC, kClassE, kNClasses};
@@ -1514,24 +1469,24 @@ void AliPhysicsSelection::SaveHistograms(const char* folder)
     // Those are used to rescale the different classes to the same number of bx ids
     // TODO: pass names of the rows for B, CA and E and look names of the rows. How do I handle the case in which both AC are in the same row?         
     Int_t nBXIds[kNClasses] = {0};
-      //      cout <<"Computing BG:" << endl;
+    //      cout <<"Computing BG:" << endl;
     
     for(Int_t iTrigClass = 0; iTrigClass < kNClasses; iTrigClass++){
       for(Int_t irow = 0; irow < nrows[iTrigClass]; irow++) {
-       if(irow==0) cout << "- Class " << classFlags[iTrigClass] << endl;   
-       for (Int_t j=1; j<=fHistBunchCrossing->GetNbinsX(); j++) {
-         if (fHistBunchCrossing->GetBinContent(j, rows[iTrigClass][irow]) > 0) {
-           nBXIds[iTrigClass]++;        
-         }
-       }
-       if(nBXIds[iTrigClass]>0) cout << "   Using row " << rows[iTrigClass][irow] <<  ": " 
-                                     << fHistBunchCrossing->GetYaxis()->GetBinLabel(rows[iTrigClass][irow]) 
-                                     << " (nBXID "<< nBXIds[iTrigClass] << ")"<< endl;
-
+        if(irow==0) cout << "- Class " << classFlags[iTrigClass] << endl;   
+        for (Int_t j=1; j<=fHistBunchCrossing->GetNbinsX(); j++) {
+          if (fHistBunchCrossing->GetBinContent(j, rows[iTrigClass][irow]) > 0) {
+            nBXIds[iTrigClass]++;       
+          }
+        }
+        if(nBXIds[iTrigClass]>0) cout << "   Using row " << rows[iTrigClass][irow] <<  ": " 
+            << fHistBunchCrossing->GetYaxis()->GetBinLabel(rows[iTrigClass][irow]) 
+            << " (nBXID "<< nBXIds[iTrigClass] << ")"<< endl;
+        
       }
-
+      
     }
-
+    
     Float_t ratioToB[kNClasses];
     ratioToB[kClassE]  = nBXIds[kClassE]  >0 ? Float_t(nBXIds[kClassB])/nBXIds[kClassE]   : 0;
     ratioToB[kClassA]  = nBXIds[kClassA]  >0 ? Float_t(nBXIds[kClassB])/nBXIds[kClassA]   : 0;
@@ -1543,127 +1498,127 @@ void AliPhysicsSelection::SaveHistograms(const char* folder)
     Printf("  B/C  = %d/%d = %f", nBXIds[kClassB],nBXIds[kClassC], ratioToB[kClassC] );
     Printf("  B/AC = %d/%d = %f", nBXIds[kClassB],nBXIds[kClassAC],ratioToB[kClassAC]);
     Int_t nHistStat = 2;
-
+    
     // 1. loop over all cols
     for(Int_t iHistStat = 0; iHistStat < nHistStat; iHistStat++){
       Int_t ncol = fHistStatistics[iHistStat]->GetNbinsX();
       Float_t good1 = 0;      
       for(Int_t icol = 1; icol <= ncol; icol++) {
-       Int_t nEvents[kNClasses] = {0}; // number of events should be reset at every column
-       // For all trigger classes, add up over row matching trigger mask (as selected before)
-       for(Int_t iTrigClass = 0; iTrigClass < kNClasses; iTrigClass++){
-         for(Int_t irow = 0; irow < nrows[iTrigClass]; irow++) {         
-           nEvents[iTrigClass] += (Int_t) fHistStatistics[iHistStat]->GetBinContent(icol,rows[iTrigClass][irow]);      
-         }
-         //        cout << "Events " << classFlags[iTrigClass] << " ("<<icol<<") " << nEvents[iTrigClass] << endl;         
-       }
-       if (nEvents[kClassB]>0) {
-         Float_t acc  = ratioToB[kClassE]*nEvents[kClassE]; 
-         Double_t accErr = TMath::Sqrt(ratioToB[kClassE]*ratioToB[kClassE]*nEvents[kClassE]);
-         //      Int_t bg   = cint1A + cint1C - 2*acc;
-           
-         // If intensity measurements are available, they already
-         // contain the scaling for BX ratios, so we reset the
-         // ratioToB entries
-         if(icol == 1) {
-           if(fBIFactorAC > 0 || fBIFactorA > 0 || fBIFactorC > 0) {
-             if (fBIFactorAC <= 0 && (fBIFactorA <= 0 || fBIFactorC <= 0)) {
-               AliError("Not all intensities set!, assuming equal intensities");
-               fBIFactorA  = 1;
-               fBIFactorC  = 1;
-               fBIFactorAC = 1;
-             } else {
-               AliInfo("Using ratio of number of bunch crossing embedded in the intensity measurements");
-               ratioToB[kClassA]  = ratioToB[kClassA]  >0 ? 1  : 0;
-               ratioToB[kClassC]  = ratioToB[kClassC]  >0 ? 1  : 0;
-               ratioToB[kClassAC] = ratioToB[kClassAC] >0 ? 1  : 0;
-               AliInfo(Form(" - BI Factor A:  %f",  fBIFactorA ));
-               AliInfo(Form(" - BI Factor C:  %f",  fBIFactorC ));
-               AliInfo(Form(" - BI Factor AC: %f",  fBIFactorAC ));
-               
-             }
-           } else {
-             AliWarning("Intensities not set!, assuming equal intensities");
-             fBIFactorA  = 1;
-             fBIFactorC  = 1;
-             fBIFactorAC = 1;
-           }
-         }
-         // Assuming that for a given class the triggers are either recorded as A+C or AC
-         Float_t bg  = nEvents[kClassAC] > 0 ?
-           fBIFactorAC*(ratioToB[kClassAC]*nEvents[kClassAC] - 2*acc):
-           fBIFactorA* (ratioToB[kClassA]*nEvents[kClassA]-acc) + 
-           fBIFactorC* (ratioToB[kClassC]*nEvents[kClassC]-acc) ;
-
-         // cout << "-----------------------" << endl;
-         // cout << "Factors: " << fBIFactorA << " " << fBIFactorC << " " << fBIFactorAC << endl;
-         // cout << "Ratios: "  << ratioToB[kClassA] << " " << ratioToB[kClassC] << " " << ratioToB[kClassAC] << endl;
-         // cout << "Evts:   "  << nEvents[kClassA] << " " << nEvents[kClassC] << " " << nEvents[kClassAC] << " " <<  nEvents[kClassB] << endl;
-         // cout << "Acc: " << acc << endl;
-         // cout << "BG: " << bg << endl;
-         // cout  << "  " <<   fBIFactorA* (ratioToB[kClassA]*nEvents[kClassA]-acc) <<endl;
-         // cout  << "  " <<   fBIFactorC* (ratioToB[kClassC]*nEvents[kClassC]-acc) <<endl;
-         // cout  << "  " <<   fBIFactorAC*(ratioToB[kClassAC]*nEvents[kClassAC] - 2*acc) << endl;
-         // cout << "-----------------------" << endl;
-
-         Float_t good = Float_t(nEvents[kClassB]) - bg - acc;
-         if (icol ==1) good1 = good;
-         //      Float_t errGood     = TMath::Sqrt(2*(nEvents[kClassA]+nEvents[kClassC]+nEvents[kClassE]));// Error on the number of goods assuming only bg fluctuates
-         //      DeltaG^2 = B + FA^2 A + FC^2 C + Ratio^2 (FA+FC-1)^2 E.
-         Float_t errGood     = nEvents[kClassAC] > 0 ? 
-           TMath::Sqrt( nEvents[kClassB] +
-                        fBIFactorAC*fBIFactorAC*ratioToB[kClassAC]*ratioToB[kClassAC]*nEvents[kClassAC] +
-                        ratioToB[kClassE] * ratioToB[kClassE] * 
-                        (fBIFactorAC - 1)*(fBIFactorAC - 1)*nEvents[kClassE]) :  
-           TMath::Sqrt( nEvents[kClassB] + 
-                        fBIFactorA*fBIFactorA*ratioToB[kClassA]*ratioToB[kClassA]*nEvents[kClassA] +
-                        fBIFactorC*fBIFactorC*ratioToB[kClassC]*ratioToB[kClassC]*nEvents[kClassC] +
-                        ratioToB[kClassE] * ratioToB[kClassE] * 
-                        (fBIFactorA + fBIFactorC - 1)*(fBIFactorA + fBIFactorC - 1)*nEvents[kClassE]);
-
-         Float_t errBG = nEvents[kClassAC] > 0 ? 
-           TMath::Sqrt(fBIFactorAC*fBIFactorAC*ratioToB[kClassAC]*ratioToB[kClassAC]*nEvents[kClassAC]+
-                       4*ratioToB[kClassE]*ratioToB[kClassE]*(fBIFactorAC*fBIFactorAC)*nEvents[kClassE]) :
-           TMath::Sqrt(fBIFactorA*fBIFactorA*ratioToB[kClassA]*ratioToB[kClassA]*nEvents[kClassA]+
-                       fBIFactorC*fBIFactorC*ratioToB[kClassC]*ratioToB[kClassC]*nEvents[kClassC]+
-                       ratioToB[kClassE]*ratioToB[kClassE]*(fBIFactorA+fBIFactorC)*(fBIFactorA+fBIFactorC)*nEvents[kClassE]);
-       
-       
-         fHistStatistics[iHistStat]->SetBinContent(icol,fBGStatOffset+kStatRowAllB, nEvents[kClassB]); 
-         fHistStatistics[iHistStat]->SetBinContent(icol,fBGStatOffset+kStatRowAllAC,nEvents[kClassA]+nEvents[kClassC]+nEvents[kClassAC]);      
-         fHistStatistics[iHistStat]->SetBinContent(icol,fBGStatOffset+kStatRowAllE, nEvents[kClassE]); 
-
-         fHistStatistics[iHistStat]->SetBinContent(icol,fBGStatOffset+kStatRowBG,bg);  
-         fHistStatistics[iHistStat]->SetBinError  (icol,fBGStatOffset+kStatRowBG,errBG);       
-         fHistStatistics[iHistStat]->SetBinContent(icol,fBGStatOffset+kStatRowAcc,acc);        
-         fHistStatistics[iHistStat]->SetBinError  (icol,fBGStatOffset+kStatRowAcc,accErr);     
-         fHistStatistics[iHistStat]->SetBinContent(icol,fBGStatOffset+kStatRowGood,good);    
-         fHistStatistics[iHistStat]->SetBinError  (icol,fBGStatOffset+kStatRowGood,errGood);    
-
+        Int_t nEvents[kNClasses] = {0}; // number of events should be reset at every column
+        // For all trigger classes, add up over row matching trigger mask (as selected before)
+        for(Int_t iTrigClass = 0; iTrigClass < kNClasses; iTrigClass++){
+          for(Int_t irow = 0; irow < nrows[iTrigClass]; irow++) {        
+            nEvents[iTrigClass] += (Int_t) fHistStatistics[iHistStat]->GetBinContent(icol,rows[iTrigClass][irow]);     
+          }
+          //       cout << "Events " << classFlags[iTrigClass] << " ("<<icol<<") " << nEvents[iTrigClass] << endl;         
+        }
+        if (nEvents[kClassB]>0) {
+          Float_t acc  = ratioToB[kClassE]*nEvents[kClassE]; 
+          Double_t accErr = TMath::Sqrt(ratioToB[kClassE]*ratioToB[kClassE]*nEvents[kClassE]);
+          //      Int_t bg   = cint1A + cint1C - 2*acc;
+          
+          // If intensity measurements are available, they already
+          // contain the scaling for BX ratios, so we reset the
+          // ratioToB entries
+          if(icol == 1) {
+            if(fBIFactorAC > 0 || fBIFactorA > 0 || fBIFactorC > 0) {
+              if (fBIFactorAC <= 0 && (fBIFactorA <= 0 || fBIFactorC <= 0)) {
+                AliError("Not all intensities set!, assuming equal intensities");
+                fBIFactorA  = 1;
+                fBIFactorC  = 1;
+                fBIFactorAC = 1;
+              } else {
+                AliInfo("Using ratio of number of bunch crossing embedded in the intensity measurements");
+                ratioToB[kClassA]  = ratioToB[kClassA]  >0 ? 1  : 0;
+                ratioToB[kClassC]  = ratioToB[kClassC]  >0 ? 1  : 0;
+                ratioToB[kClassAC] = ratioToB[kClassAC] >0 ? 1  : 0;
+                AliInfo(Form(" - BI Factor A:  %f",  fBIFactorA ));
+                AliInfo(Form(" - BI Factor C:  %f",  fBIFactorC ));
+                AliInfo(Form(" - BI Factor AC: %f",  fBIFactorAC ));
+                
+              }
+            } else {
+              AliWarning("Intensities not set!, assuming equal intensities");
+              fBIFactorA  = 1;
+              fBIFactorC  = 1;
+              fBIFactorAC = 1;
+            }
+          }
+          // Assuming that for a given class the triggers are either recorded as A+C or AC
+          Float_t bg  = nEvents[kClassAC] > 0 ?
+              fBIFactorAC*(ratioToB[kClassAC]*nEvents[kClassAC] - 2*acc):
+              fBIFactorA* (ratioToB[kClassA]*nEvents[kClassA]-acc) + 
+              fBIFactorC* (ratioToB[kClassC]*nEvents[kClassC]-acc) ;
+          
+          // cout << "-----------------------" << endl;
+          // cout << "Factors: " << fBIFactorA << " " << fBIFactorC << " " << fBIFactorAC << endl;
+          // cout << "Ratios: "  << ratioToB[kClassA] << " " << ratioToB[kClassC] << " " << ratioToB[kClassAC] << endl;
+          // cout << "Evts:   "  << nEvents[kClassA] << " " << nEvents[kClassC] << " " << nEvents[kClassAC] << " " <<  nEvents[kClassB] << endl;
+          // cout << "Acc: " << acc << endl;
+          // cout << "BG: " << bg << endl;
+          // cout  << "  " <<   fBIFactorA* (ratioToB[kClassA]*nEvents[kClassA]-acc) <<endl;
+          // cout  << "  " <<   fBIFactorC* (ratioToB[kClassC]*nEvents[kClassC]-acc) <<endl;
+          // cout  << "  " <<   fBIFactorAC*(ratioToB[kClassAC]*nEvents[kClassAC] - 2*acc) << endl;
+          // cout << "-----------------------" << endl;
+          
+          Float_t good = Float_t(nEvents[kClassB]) - bg - acc;
+          if (icol ==1) good1 = good;
+          //      Float_t errGood     = TMath::Sqrt(2*(nEvents[kClassA]+nEvents[kClassC]+nEvents[kClassE]));// Error on the number of goods assuming only bg fluctuates
+          //      DeltaG^2 = B + FA^2 A + FC^2 C + Ratio^2 (FA+FC-1)^2 E.
+          Float_t errGood     = nEvents[kClassAC] > 0 ? 
+              TMath::Sqrt( nEvents[kClassB] +
+                  fBIFactorAC*fBIFactorAC*ratioToB[kClassAC]*ratioToB[kClassAC]*nEvents[kClassAC] +
+                  ratioToB[kClassE] * ratioToB[kClassE] * 
+                  (fBIFactorAC - 1)*(fBIFactorAC - 1)*nEvents[kClassE]) :  
+                  TMath::Sqrt( nEvents[kClassB] + 
+                      fBIFactorA*fBIFactorA*ratioToB[kClassA]*ratioToB[kClassA]*nEvents[kClassA] +
+                      fBIFactorC*fBIFactorC*ratioToB[kClassC]*ratioToB[kClassC]*nEvents[kClassC] +
+                      ratioToB[kClassE] * ratioToB[kClassE] * 
+                      (fBIFactorA + fBIFactorC - 1)*(fBIFactorA + fBIFactorC - 1)*nEvents[kClassE]);
+          
+          Float_t errBG = nEvents[kClassAC] > 0 ? 
+              TMath::Sqrt(fBIFactorAC*fBIFactorAC*ratioToB[kClassAC]*ratioToB[kClassAC]*nEvents[kClassAC]+
+                  4*ratioToB[kClassE]*ratioToB[kClassE]*(fBIFactorAC*fBIFactorAC)*nEvents[kClassE]) :
+                  TMath::Sqrt(fBIFactorA*fBIFactorA*ratioToB[kClassA]*ratioToB[kClassA]*nEvents[kClassA]+
+                      fBIFactorC*fBIFactorC*ratioToB[kClassC]*ratioToB[kClassC]*nEvents[kClassC]+
+                      ratioToB[kClassE]*ratioToB[kClassE]*(fBIFactorA+fBIFactorC)*(fBIFactorA+fBIFactorC)*nEvents[kClassE]);
+          
+          
+          fHistStatistics[iHistStat]->SetBinContent(icol,fBGStatOffset+kStatRowAllB, nEvents[kClassB]);        
+          fHistStatistics[iHistStat]->SetBinContent(icol,fBGStatOffset+kStatRowAllAC,nEvents[kClassA]+nEvents[kClassC]+nEvents[kClassAC]);     
+          fHistStatistics[iHistStat]->SetBinContent(icol,fBGStatOffset+kStatRowAllE, nEvents[kClassE]);        
+          
+          fHistStatistics[iHistStat]->SetBinContent(icol,fBGStatOffset+kStatRowBG,bg); 
+          fHistStatistics[iHistStat]->SetBinError  (icol,fBGStatOffset+kStatRowBG,errBG);      
+          fHistStatistics[iHistStat]->SetBinContent(icol,fBGStatOffset+kStatRowAcc,acc);       
+          fHistStatistics[iHistStat]->SetBinError  (icol,fBGStatOffset+kStatRowAcc,accErr);    
+          fHistStatistics[iHistStat]->SetBinContent(icol,fBGStatOffset+kStatRowGood,good);    
+          fHistStatistics[iHistStat]->SetBinError  (icol,fBGStatOffset+kStatRowGood,errGood);    
+          
 #ifdef VERBOSE_STAT
-         //kStatRowBG=0,kStatRowAcc,kStatRowBGFrac,kStatRowAccFrac,kStatRowErrGoodFrac,kStatRowGoodFrac,kStatRowGood,kStatRowErrGood
-         Float_t accFrac   = Float_t(acc) / nEvents[kClassB]  *100;
-         Float_t errAccFrac= Float_t(accErr) / nEvents[kClassB]  *100;
-         Float_t bgFrac    = Float_t(bg)  / nEvents[kClassB]  *100;
-         Float_t goodFrac  = Float_t(good)  / good1 *100;
-         Float_t errGoodFrac = errGood/good1 * 100;
-         Float_t errFracBG = bg > 0 ? TMath::Sqrt((errBG/bg)*(errBG/bg) + 1/nEvents[kClassB])*bgFrac : 0;
-         fHistStatistics[iHistStat]->SetBinContent(icol,fBGStatOffset+kStatRowBGFrac,bgFrac);  
-         fHistStatistics[iHistStat]->SetBinError  (icol,fBGStatOffset+kStatRowBGFrac,errFracBG);       
-         fHistStatistics[iHistStat]->SetBinContent(icol,fBGStatOffset+kStatRowAccFrac,accFrac);    
-         fHistStatistics[iHistStat]->SetBinError  (icol,fBGStatOffset+kStatRowAccFrac,errAccFrac);    
-         fHistStatistics[iHistStat]->SetBinContent(icol,fBGStatOffset+kStatRowGoodFrac,goodFrac);    
-         fHistStatistics[iHistStat]->SetBinContent(icol,fBGStatOffset+kStatRowErrGoodFrac,errGoodFrac);    
-         fHistStatistics[iHistStat]->SetBinContent(icol,fBGStatOffset+kStatRowErrGood,errGood);    
+          //kStatRowBG=0,kStatRowAcc,kStatRowBGFrac,kStatRowAccFrac,kStatRowErrGoodFrac,kStatRowGoodFrac,kStatRowGood,kStatRowErrGood
+          Float_t accFrac   = Float_t(acc) / nEvents[kClassB]  *100;
+          Float_t errAccFrac= Float_t(accErr) / nEvents[kClassB]  *100;
+          Float_t bgFrac    = Float_t(bg)  / nEvents[kClassB]  *100;
+          Float_t goodFrac  = Float_t(good)  / good1 *100;
+          Float_t errGoodFrac = errGood/good1 * 100;
+          Float_t errFracBG = bg > 0 ? TMath::Sqrt((errBG/bg)*(errBG/bg) + 1/nEvents[kClassB])*bgFrac : 0;
+          fHistStatistics[iHistStat]->SetBinContent(icol,fBGStatOffset+kStatRowBGFrac,bgFrac); 
+          fHistStatistics[iHistStat]->SetBinError  (icol,fBGStatOffset+kStatRowBGFrac,errFracBG);      
+          fHistStatistics[iHistStat]->SetBinContent(icol,fBGStatOffset+kStatRowAccFrac,accFrac);    
+          fHistStatistics[iHistStat]->SetBinError  (icol,fBGStatOffset+kStatRowAccFrac,errAccFrac);    
+          fHistStatistics[iHistStat]->SetBinContent(icol,fBGStatOffset+kStatRowGoodFrac,goodFrac);    
+          fHistStatistics[iHistStat]->SetBinContent(icol,fBGStatOffset+kStatRowErrGoodFrac,errGoodFrac);    
+          fHistStatistics[iHistStat]->SetBinContent(icol,fBGStatOffset+kStatRowErrGood,errGood);    
 #endif
-       }
+        }
       }
     }
     for (Int_t iTrigClass = 0; iTrigClass < kNClasses; iTrigClass++){
       delete [] rows[iTrigClass];
     }  
   } // end of ComputeBackground  
-
+  
   fHistStatistics[0]->Write();
   fHistStatistics[1]->Write();
   if(fHistBunchCrossing ) fHistBunchCrossing ->Write();
@@ -1671,21 +1626,21 @@ void AliPhysicsSelection::SaveHistograms(const char* folder)
   
   Int_t count = fCollTrigClasses.GetEntries() + fBGTrigClasses.GetEntries();
   for (Int_t i=0; i < count; i++)
-    {
-      TString triggerClass = "trigger_histograms_";
-      if (i < fCollTrigClasses.GetEntries())
-       triggerClass += ((TObjString*) fCollTrigClasses.At(i))->String();
-      else
-       triggerClass += ((TObjString*) fBGTrigClasses.At(i - fCollTrigClasses.GetEntries()))->String();
-      
-      gDirectory->mkdir(triggerClass);
-      gDirectory->cd(triggerClass);
-      
-      static_cast<AliTriggerAnalysis*> (fTriggerAnalysis.At(i))->SaveHistograms();
-      
-      gDirectory->cd("..");
-    }
+  {
+    TString triggerClass = "trigger_histograms_";
+    if (i < fCollTrigClasses.GetEntries())
+      triggerClass += ((TObjString*) fCollTrigClasses.At(i))->String();
+    else
+      triggerClass += ((TObjString*) fBGTrigClasses.At(i - fCollTrigClasses.GetEntries()))->String();
     
+    gDirectory->mkdir(triggerClass);
+    gDirectory->cd(triggerClass);
+    
+    static_cast<AliTriggerAnalysis*> (fTriggerAnalysis.At(i))->SaveHistograms();
+    
+    gDirectory->cd("..");
+  }
+  
   if (folder)
     gDirectory->cd("..");
   
@@ -1698,18 +1653,18 @@ Int_t AliPhysicsSelection::GetStatRow(const char * triggerBXClass, UInt_t offlin
   // triggerBXClass can be either "A", "AC", "B" or "E"
   // offlineTriggerType is one of the types defined in AliVEvent
   // User should delete rowIDs if no longer needed
-
+  
   if(!fHistStatistics[0]) {
     AliWarning("Not initialized, returning 0");
     return 0;
   }
   const Int_t nrows = fHistStatistics[0]->GetNbinsY();
-
+  
   // allocate memory for at maximum nrows
   Int_t nMatches = 0;
   (*rowIDs) = new UInt_t[nrows];
-
-
+  
+  
   // Loop over rows and find matching ones, using the PS OADB
   // FIXME: check BG estimates
   for(Int_t irow = 1; irow <= nrows; irow++){
@@ -1720,13 +1675,13 @@ Int_t AliPhysicsSelection::GetStatRow(const char * triggerBXClass, UInt_t offlin
       UInt_t tType = ((TObjString*)arr->At(1))->GetString().Atoi();
       
       if (tType == offlineTriggerType && fPSOADB->GetBeamSide(triggerClassCurrent.Data()) == triggerBXClass) {
-       (*rowIDs)[nMatches] = irow;
-       nMatches++;
+        (*rowIDs)[nMatches] = irow;
+        nMatches++;
       }
-
+      
     }
     delete arr;
-
+    
   }
   
   return nMatches;
@@ -1745,12 +1700,12 @@ void AliPhysicsSelection::SetBIFactors(const AliESDEvent * aESD) {
     Double_t intCB = esdRun->GetMeanIntensityIntecting(1);
     Double_t intAA = esdRun->GetMeanIntensityNonIntecting(0);
     Double_t intCC = esdRun->GetMeanIntensityNonIntecting(1);
-
+    
     // cout << "INT " <<intAB <<endl;
     // cout << "INT " <<intCB <<endl;
     // cout << "INT " <<intAA <<endl;
     // cout << "INT " <<intCC <<endl;
-
+    
     if (intAB > 0 && intAA > 0) {
       fBIFactorA = intAB/intAA;
     } else {
@@ -1762,14 +1717,14 @@ void AliPhysicsSelection::SetBIFactors(const AliESDEvent * aESD) {
     } else {
       AliWarning("Cannot set fBIFactorC");
     }
-      
+    
     if (intAB > 0 && intAA > 0 &&
-       intCB > 0 && intCC > 0) {
+        intCB > 0 && intCC > 0) {
       fBIFactorAC = (intAB+intCB)/(intAA+intCC);
     } else {
       AliWarning("Cannot set fBIFactorAC");
     }
-        
+    
   }  
   else {
     // First runs. Intensities hardcoded
@@ -1891,7 +1846,7 @@ void AliPhysicsSelection::SetBIFactors(const AliESDEvent * aESD) {
       fBIFactorC = 1;
     }
   }
-
+  
 }
 
 const char * AliPhysicsSelection::GetTriggerString(TObjString * obj) { 
@@ -1899,17 +1854,17 @@ const char * AliPhysicsSelection::GetTriggerString(TObjString * obj) {
   static TString retString;
   
   retString.Form("%s%s", 
-                obj->String().Data(), 
-                fUseBXNumbers ? fFillOADB->GetBXIDs(fPSOADB->GetBeamSide(obj->String().Data())) : ""  
-                );
-
+      obj->String().Data(), 
+      fUseBXNumbers ? fFillOADB->GetBXIDs(fPSOADB->GetBeamSide(obj->String().Data())) : ""  
+  );
+  
   if (fMC) {
     TPRegexp stripClasses("\\+\\S* ");
     stripClasses.Substitute(retString,"","g");
     stripClasses=TPRegexp("\\-\\S* ");
     stripClasses.Substitute(retString,"","g");
   }
-
+  
   return retString.Data();
 }
 
@@ -1920,7 +1875,7 @@ void AliPhysicsSelection::AddCollisionTriggerClass(const char* className){
     fPSOADB->SetHardwareTrigger         ( 0,"SPDGFO >= 1 || V0A || V0C");
     fPSOADB->SetOfflineTrigger          ( 0,"(SPDGFO >= 1 || V0A || V0C) && !V0ABG && !V0CBG");
   }
-
+  
   // Strip all which is not needed, if BX ids are provided, they are still used here
   // offline trigger and logics are appended automagically, so we strip-em out if they are provided
   TString classNameStripped = className;
@@ -1928,24 +1883,24 @@ void AliPhysicsSelection::AddCollisionTriggerClass(const char* className){
     classNameStripped.Remove(classNameStripped.Index("*")); // keep only the class name (no bx, offline trigger...)   
   if(classNameStripped.Index("&")>0)
     classNameStripped.Remove(classNameStripped.Index("&")); // keep only the class name (no bx, offline trigger...)   
-
+  
   fPSOADB->AddCollisionTriggerClass   ( AliVEvent::kUserDefined,classNameStripped.Data(),"B",0);
   
   fUsingCustomClasses = kTRUE;
-
-
+  
+  
 }
 
 void AliPhysicsSelection::AddBGTriggerClass(const char* className){
   // Add custom BG trigger class
+  
   AliError("This method is deprecated! Will be removed soon! Please use SetCustomOADBObjects() instead!");
   if(!fPSOADB) {
     fPSOADB = new AliOADBPhysicsSelection("CustomPS");   
     fPSOADB->SetHardwareTrigger         ( 0,"SPDGFO >= 1 || V0A || V0C");
     fPSOADB->SetOfflineTrigger          ( 0,"(SPDGFO >= 1 || V0A || V0C) && !V0ABG && !V0CBG");
   }
-
+  
   // Strip all which is not needed, if BX ids are provided, they are still used here
   // offline trigger and logics are appended automagically, so we strip-em out if they are provided
   TString classNameStripped = className;
@@ -1953,11 +1908,11 @@ void AliPhysicsSelection::AddBGTriggerClass(const char* className){
     classNameStripped.Remove(classNameStripped.Index("*")); // keep only the class name (no bx, offline trigger...)   
   if(classNameStripped.Index("&")>0)
     classNameStripped.Remove(classNameStripped.Index("&")); // keep only the class name (no bx, offline trigger...)   
-
+  
   fPSOADB->AddBGTriggerClass   ( AliVEvent::kUserDefined,classNameStripped.Data(),"AC",0);
-
+  
   fUsingCustomClasses = kTRUE;
-
+  
 }       
 
 
@@ -1981,9 +1936,9 @@ void AliPhysicsSelection::DetectPassName(){
     }
     delete tokens;
   } 
-
+  
   TString passName="";
-
+  
   TObjArray* tokens = filePath.Tokenize("/");
   for (Int_t i=0;i<=tokens->GetLast();i++) {
     TObjString* stObj = (TObjString*) tokens->At(i);
@@ -2003,20 +1958,20 @@ void AliPhysicsSelection::DetectPassName(){
       TObjString* stObj = (TObjString*) tokens2->At(i);
       TString s = stObj->GetString();
       if (s.Contains("pass")) {
-       passName = s;
-       break;
+        passName = s;
+        break;
       }
     }
     delete tokens2;
   }
-
-
+  
+  
   if (!passName.Contains("pass")){
     AliError(" Failed to find reconstruction pass name:");
     AliError(" --> If these are MC data: please set kTRUE first argument of AddTaskPhysicsSelection");
     AliFatal(" --> If these are real data: please insert pass name inside the path of your local file, e.g. /your_path/pass2/AliESDs.root");
   }
-
+  
   AliInfo(Form("pass name: %s\n",passName.Data()));
   fPassName = passName;
 }
index a6fd140..a3afe3c 100644 (file)
 //   Origin: Jan Fiete Grosse-Oetringhaus, CERN
 //-------------------------------------------------------------------------
 
-#include <Riostream.h>
-#include <TH1F.h>
-#include <TH2F.h>
-#include <TList.h>
-#include <TIterator.h>
+#include "TH1F.h"
+#include "TH2F.h"
+#include "TList.h"
+#include "TIterator.h"
 #include "TParameter.h"
-#include <TMap.h>
-#include <TRandom.h>
-
-#include <AliTriggerAnalysis.h>
-
-#include <AliLog.h>
-#include <AliAnalysisManager.h>
-
-#include <AliESDEvent.h>
-
-#include <AliMultiplicity.h>
-#include <AliESDVZERO.h>
-#include <AliESDZDC.h>
-#include <AliESDFMD.h>
-#include <AliESDVertex.h>
-#include <AliESDtrackCuts.h>
-#include <AliDAQ.h>
-#include <AliESDTrdTrack.h>
+#include "TMap.h"
+#include "TRandom.h"
+#include "AliTriggerAnalysis.h"
+#include "AliLog.h"
+#include "AliVEvent.h"
+#include "AliESDEvent.h"
+#include "AliMultiplicity.h"
+#include "AliESDVZERO.h"
+#include "AliESDZDC.h"
+#include "AliESDFMD.h"
+#include "AliESDVertex.h"
+#include "AliESDtrackCuts.h"
+#include "AliDAQ.h"
+#include "AliESDTrdTrack.h"
+#include "AliVCaloTrigger.h"
 
 ClassImp(AliTriggerAnalysis)
 
 AliTriggerAnalysis::AliTriggerAnalysis() :
-  fSPDGFOThreshold(2),
-  fSPDGFOEfficiency(0),
-  fV0TimeOffset(0),
-  fV0AdcThr(0),
-  fV0HwAdcThr(2.5),
-  fV0HwWinLow(61.5),
-  fV0HwWinHigh(86.5),
-  fZDCCutRefSum(-568.5),
-  fZDCCutRefDelta(-2.1),
-  fZDCCutSigmaSum(3.25),
-  fZDCCutSigmaDelta(2.25),
-  fZDCCutRefSumCorr(-65.5),
-  fZDCCutRefDeltaCorr(-2.1),
-  fZDCCutSigmaSumCorr(6.0),
-  fZDCCutSigmaDeltaCorr(1.2),
-  fZDCCutZNATimeCorrMin(0.0),
-  fZDCCutZNATimeCorrMax(2.0),
-  fZDCCutZNCTimeCorrMin(0.0),
-  fZDCCutZNCTimeCorrMax(5.0),
-  fASPDCvsTCut(65),
-  fBSPDCvsTCut(4),
-  fTRDptHSE(3.),
-  fTRDpidHSE(144),
-  fTRDptHQU(2.),
-  fTRDpidHQU(164.),
-  fTRDptHEE(3.),
-  fTRDpidHEE(144),
-  fTRDminSectorHEE(6),
-  fTRDmaxSectorHEE(8),
-  fTRDptHJT(3.),
-  fTRDnHJT(3),
-  fDoFMD(kTRUE),
-  fFMDLowCut(0.2),
-  fFMDHitCut(0.5),
-  fHistBitsSPD(0),
-  fHistFiredBitsSPD(0),
-  fHistSPDClsVsTrk(0),
-  fHistV0A(0),       
-  fHistV0C(0),
-  fHistZDC(0),    
-  fHistTDCZDC(0),    
-  fHistTimeZDC(0),    
-  fHistTimeCorrZDC(0),    
-  fHistFMDA(0),    
-  fHistFMDC(0),   
-  fHistFMDSingle(0),
-  fHistFMDSum(0),
-  fHistT0(0),
-  fTriggerClasses(0),
-  fMC(kFALSE),
-  fEsdTrackCuts(0),
-  fTPCOnly(kFALSE)
+fSPDGFOThreshold(2),
+fSPDGFOEfficiency(0),
+fV0TimeOffset(0),
+fV0AdcThr(0),
+fV0HwAdcThr(2.5),
+fV0HwWinLow(61.5),
+fV0HwWinHigh(86.5),
+fZDCCutRefSum(-568.5),
+fZDCCutRefDelta(-2.1),
+fZDCCutSigmaSum(3.25),
+fZDCCutSigmaDelta(2.25),
+fZDCCutRefSumCorr(-65.5),
+fZDCCutRefDeltaCorr(-2.1),
+fZDCCutSigmaSumCorr(6.0),
+fZDCCutSigmaDeltaCorr(1.2),
+fZDCCutZNATimeCorrMin(0.0),
+fZDCCutZNATimeCorrMax(2.0),
+fZDCCutZNCTimeCorrMin(0.0),
+fZDCCutZNCTimeCorrMax(5.0),
+fASPDCvsTCut(65),
+fBSPDCvsTCut(4),
+fTRDptHSE(3.),
+fTRDpidHSE(144),
+fTRDptHQU(2.),
+fTRDpidHQU(164.),
+fTRDptHEE(3.),
+fTRDpidHEE(144),
+fTRDminSectorHEE(6),
+fTRDmaxSectorHEE(8),
+fTRDptHJT(3.),
+fTRDnHJT(3),
+fDoFMD(kTRUE),
+fFMDLowCut(0.2),
+fFMDHitCut(0.5),
+fHistBitsSPD(0),
+fHistFiredBitsSPD(0),
+fHistSPDClsVsTrk(0),
+fHistV0A(0),
+fHistV0C(0),
+fHistZDC(0),
+fHistTDCZDC(0),
+fHistTimeZDC(0),
+fHistTimeCorrZDC(0),
+fHistFMDA(0),
+fHistFMDC(0),
+fHistFMDSingle(0),
+fHistFMDSum(0),
+fHistT0(0),
+fTriggerClasses(0),
+fMC(kFALSE),
+fEsdTrackCuts(0),
+fTPCOnly(kFALSE)
 {
   // constructor
 }
 
-AliTriggerAnalysis::~AliTriggerAnalysis()
-{
+//-------------------------------------------------------------------------------------------------
+AliTriggerAnalysis::~AliTriggerAnalysis(){
   // destructor
-  
-  if (fHistBitsSPD)
-  {
-    delete fHistBitsSPD;
-    fHistBitsSPD = 0;
-  }
-
-  if (fHistFiredBitsSPD)
-  {
-    delete fHistFiredBitsSPD;
-    fHistFiredBitsSPD = 0;
-  }
-
-  if (fHistSPDClsVsTrk)
-  {
-    delete fHistSPDClsVsTrk;
-    fHistSPDClsVsTrk = 0;
-  }
-
-  if (fHistV0A)
-  {
-    delete fHistV0A;
-    fHistV0A = 0;
-  }
-
-  if (fHistV0C)
-  {
-    delete fHistV0C;
-    fHistV0C = 0;
-  }
-
-  if (fHistZDC)
-  {
-    delete fHistZDC;
-    fHistZDC = 0;
-  }
-  if (fHistTDCZDC)
-  {
-    delete fHistTDCZDC;
-    fHistTDCZDC = 0;
-  }
-  if (fHistTimeZDC)
-  {
-    delete fHistTimeZDC;
-    fHistTimeZDC = 0;
-  }
-  if (fHistTimeCorrZDC)
-  {
-    delete fHistTimeCorrZDC;
-    fHistTimeCorrZDC = 0;
-  }
-
-  if (fHistFMDA)
-  {
-    delete fHistFMDA;
-    fHistFMDA = 0;
-  }
-
-  if (fHistFMDC)
-  {
-    delete fHistFMDC;
-    fHistFMDC = 0;
-  }
-
-  if (fHistFMDSingle)
-  {
-    delete fHistFMDSingle;
-    fHistFMDSingle = 0;
-  }
-
-  if (fHistFMDSum)
-  {
-    delete fHistFMDSum;
-    fHistFMDSum = 0;
-  }
-
-  if (fHistT0)
-  {
-    delete fHistT0;
-    fHistT0 = 0;
-  }
-
-  if (fTriggerClasses)
-  {
-    fTriggerClasses->DeleteAll();
-    delete fTriggerClasses;
-    fTriggerClasses = 0;
-  }
-
-  if (fEsdTrackCuts){
-    delete fEsdTrackCuts;
-    fEsdTrackCuts =0;
-  }
+  if (fHistBitsSPD)      { delete fHistBitsSPD;      fHistBitsSPD = 0;      }
+  if (fHistFiredBitsSPD) { delete fHistFiredBitsSPD; fHistFiredBitsSPD = 0; }
+  if (fHistSPDClsVsTrk)  { delete fHistSPDClsVsTrk;  fHistSPDClsVsTrk = 0;  }
+  if (fHistV0A)          { delete fHistV0A;          fHistV0A = 0;          }
+  if (fHistV0C)          { delete fHistV0C;          fHistV0C = 0;          }
+  if (fHistZDC)          { delete fHistZDC;          fHistZDC = 0;          }
+  if (fHistTDCZDC)       { delete fHistTDCZDC;       fHistTDCZDC = 0;       }
+  if (fHistTimeZDC)      { delete fHistTimeZDC;      fHistTimeZDC = 0;      }
+  if (fHistTimeCorrZDC)  { delete fHistTimeCorrZDC;  fHistTimeCorrZDC = 0;  }
+  if (fHistFMDA)         { delete fHistFMDA;         fHistFMDA = 0;         }
+  if (fHistFMDC)         { delete fHistFMDC;         fHistFMDC = 0;         }
+  if (fHistFMDSingle)    { delete fHistFMDSingle;    fHistFMDSingle = 0;    }
+  if (fHistFMDSum)       { delete fHistFMDSum;       fHistFMDSum = 0;       }
+  if (fHistT0)           { delete fHistT0;           fHistT0 = 0;           }
+  if (fEsdTrackCuts)     { delete fEsdTrackCuts;     fEsdTrackCuts =0;      }
+  if (fTriggerClasses)   { fTriggerClasses->DeleteAll(); delete fTriggerClasses; fTriggerClasses = 0; }
 }
 
-void AliTriggerAnalysis::EnableHistograms(Bool_t isLowFlux)
-{
-  // creates the monitoring histograms (dynamical range of histograms can be adapted for pp and pPb via isLowFlux flag)
+
+//-------------------------------------------------------------------------------------------------
+void AliTriggerAnalysis::EnableHistograms(Bool_t isLowFlux){
+  // creates the monitoring histograms 
+  // dynamical range of histograms can be adapted for pp and pPb via isLowFlux flag)
+  // TODO check limits for FMD
   
-  // do not add this hists to the directory
-  Bool_t oldStatus = TH1::AddDirectoryStatus();
-  TH1::AddDirectory(kFALSE);
-  //
-  Int_t nBins = isLowFlux ? 600 : 1202;
-  fHistBitsSPD = new TH2F("fHistBitsSPD", "SPD GFO;number of fired chips (offline);number of fired chips (hardware)", nBins, -1.5, -1.5 + nBins, nBins, -1.5, -1.5+nBins);
-  //
-  fHistFiredBitsSPD = new TH1F("fHistFiredBitsSPD", "SPD GFO Hardware;chip number;events", 1200, -0.5, 1199.5);
-  //
-  Int_t nBinsX = isLowFlux ? 100  : 300;
-  Int_t nBinsY = isLowFlux ? 500  : 1000;
-  Float_t xMax = isLowFlux ? 400  : 2999.5;
+  Int_t nBins  = isLowFlux ?  600 : 1202;
+  Int_t nBinsX = isLowFlux ?  100 :  300;
+  Int_t nBinsY = isLowFlux ?  500 : 1000;
+  Float_t xMax = isLowFlux ?  400 : 2999.5;
   Float_t yMax = isLowFlux ? 4000 : 9999.5;
-  fHistSPDClsVsTrk = new TH2F("fHistSPDClsVsTrk", "SPD Clusters vs Tracklets; n tracklets; n clusters", nBinsX, -0.5, xMax, nBinsY, -0.5, yMax);
-  //
-  fHistV0A = new TH1F("fHistV0A", "V0A;leading time (ns);events", 400, -100, 100);
-  fHistV0C = new TH1F("fHistV0C", "V0C;leading time (ns);events", 400, -100, 100);
-  fHistZDC = new TH1F("fHistZDC", "ZDC;trigger bits;events", 8, -1.5, 6.5);
-  fHistTDCZDC = new TH1F("fHistTDCZDC", "ZDC;TDC bits;events", 32, -0.5, 32-0.5);
-  fHistTimeZDC = new TH2F("fHistTimeZDC", "ZDC;TDC timing A+C vs C-A; events", 120,-30,30,120,-600,-540);
-  fHistTimeCorrZDC = new TH2F("fHistTimeCorrZDC", "ZDC;Corrected TDC timing A+C vs C-A; events", 120,-30,30,260,-100,30);
-  
-  // TODO check limits
-  fHistFMDA = new TH1F("fHistFMDA", "FMDA;combinations above threshold;events", 102, -1.5, 100.5);
-  fHistFMDC = new TH1F("fHistFMDC", "FMDC;combinations above threshold;events", 102, -1.5, 100.5);
-  fHistFMDSingle = new TH1F("fHistFMDSingle", "FMD single;multiplicity value;counts", 1000, 0, 10);
-  fHistFMDSum = new TH1F("fHistFMDSum", "FMD sum;multiplicity value;counts", 1000, 0, 10);
-  fHistT0 = new TH1F("fHistT0", "T0;time (ns);events", 100, -25, 25);
   
+  // do not add these hists to the directory
+  Bool_t oldStatus = TH1::AddDirectoryStatus();
+  TH1::AddDirectory(kFALSE); 
+  fHistBitsSPD      = new TH2F("fHistBitsSPD", "SPD GFO;number of fired chips (offline);number of fired chips (hardware)", nBins, -1.5, -1.5 + nBins, nBins, -1.5, -1.5+nBins);
+  fHistFiredBitsSPD = new TH1F("fHistFiredBitsSPD", "SPD GFO Hardware;chip number;events", 1200, -0.5, 1199.5);
+  fHistSPDClsVsTrk  = new TH2F("fHistSPDClsVsTrk", "SPD Clusters vs Tracklets; n tracklets; n clusters", nBinsX, -0.5, xMax, nBinsY, -0.5, yMax);
+  fHistV0A          = new TH1F("fHistV0A", "V0A;leading time (ns);events", 400, -100, 100);
+  fHistV0C          = new TH1F("fHistV0C", "V0C;leading time (ns);events", 400, -100, 100);
+  fHistZDC          = new TH1F("fHistZDC", "ZDC;trigger bits;events", 8, -1.5, 6.5);
+  fHistTDCZDC       = new TH1F("fHistTDCZDC", "ZDC;TDC bits;events", 32, -0.5, 32-0.5);
+  fHistTimeZDC      = new TH2F("fHistTimeZDC", "ZDC;TDC timing C-A;TDC timing C+A", 120,-30,30,120,-600,-540);
+  fHistTimeCorrZDC  = new TH2F("fHistTimeCorrZDC", "ZDC;Corrected TDC timing C-A; Corrected TDC timing C+A", 120,-30,30,260,-100,30);
+  fHistFMDA         = new TH1F("fHistFMDA", "FMDA;combinations above threshold;events", 102, -1.5, 100.5);
+  fHistFMDC         = new TH1F("fHistFMDC", "FMDC;combinations above threshold;events", 102, -1.5, 100.5);
+  fHistFMDSingle    = new TH1F("fHistFMDSingle", "FMD single;multiplicity value;counts", 1000, 0, 10);
+  fHistFMDSum       = new TH1F("fHistFMDSum", "FMD sum;multiplicity value;counts", 1000, 0, 10);
+  fHistT0           = new TH1F("fHistT0", "T0;time (ns);events", 100, -25, 25);
   fTriggerClasses = new TMap;
   fTriggerClasses->SetOwner();
-  
   TH1::AddDirectory(oldStatus);
 }
 
-//____________________________________________________________________
-const char* AliTriggerAnalysis::GetTriggerName(Trigger trigger) 
-{
+
+//-------------------------------------------------------------------------------------------------
+const char* AliTriggerAnalysis::GetTriggerName(Trigger trigger){
   // returns the name of the requested trigger
   // the returned string will only be valid until the next call to this function [not thread-safe]
   
@@ -253,914 +168,314 @@ const char* AliTriggerAnalysis::GetTriggerName(Trigger trigger)
   
   UInt_t triggerNoFlags = (UInt_t) trigger % (UInt_t) kStartOfFlags;
   
-  switch (triggerNoFlags)
-  {
-    case kAcceptAll : str = "ACCEPT ALL (bypass!)"; break;
-    case kMB1 : str = "MB1"; break;
-    case kMB2 : str = "MB2"; break;
-    case kMB3 : str = "MB3"; break;
-    case kSPDGFO : str = "SPD GFO"; break;
-    case kSPDGFOBits : str = "SPD GFO Bits"; break;
-    case kSPDGFOL0 : str = "SPD GFO L0 (first layer)"; break;
-    case kSPDGFOL1 : str = "SPD GFO L1 (second layer)"; break;
-    case kSPDClsVsTrkBG :  str = "Cluster vs Tracklets"; break;
-    case kV0A : str = "V0 A BB"; break;
-    case kV0C : str = "V0 C BB"; break;
-    case kV0OR : str = "V0 OR BB"; break;
-    case kV0AND : str = "V0 AND BB"; break;
-    case kV0ABG : str = "V0 A BG"; break;
-    case kV0CBG : str = "V0 C BG"; break;
-    case kZDC : str = "ZDC"; break;
-    case kZDCA : str = "ZDC A"; break;
-    case kZDCC : str = "ZDC C"; break;
-    case kZNA : str = "ZN A"; break;
-    case kZNC : str = "ZN C"; break;
-    case kZNABG : str = "ZN A BG"; break;
-    case kZNCBG : str = "ZN C BG"; break;
-    case kFMDA : str = "FMD A"; break;
-    case kFMDC : str = "FMD C"; break;
-    case kFPANY : str = "SPD GFO | V0 | ZDC | FMD"; break;
-    case kNSD1 : str = "NSD1"; break;
-    case kMB1Prime: str = "MB1prime"; break;
-    case kZDCTDCA : str = "ZDC TDC A"; break;
-    case kZDCTDCC : str = "ZDC TDC C"; break;
-    case kZDCTime : str = "ZDC Time Cut"; break;
-    case kCentral : str = "V0 Central"; break;
-    case kSemiCentral : str = "V0 Semi-central"; break;
-    case kEMCAL : str = "EMCAL"; break;
-    case kTRDHCO : str = "TRD cosmics"; break;
-    case kTRDHJT : str = "TRD Jet"; break;
-    case kTRDHSE : str = "TRD Single Electron"; break;
-    case kTRDHQU : str = "TRD Quarkonia"; break;
-    case kTRDHEE : str = "TRD Dielectron"; break;
-    default: str = ""; break;
-  }
-   
-  if (trigger & kOfflineFlag)
-    str += " OFFLINE";  
-  
-  if (trigger & kOneParticle)
-    str += " OneParticle";  
-
-  if (trigger & kOneTrack)
-    str += " OneTrack";  
-
+  switch (triggerNoFlags)  {
+    case kAcceptAll :      str = "ACCEPT ALL (bypass!)";      break;
+    case kMB1 :            str = "MB1";                       break;
+    case kMB2 :            str = "MB2";                       break;
+    case kMB3 :            str = "MB3";                       break;
+    case kSPDGFO :         str = "SPD GFO";                   break;
+    case kSPDGFOBits :     str = "SPD GFO Bits";              break;
+    case kSPDGFOL0 :       str = "SPD GFO L0 (first layer)";  break;
+    case kSPDGFOL1 :       str = "SPD GFO L1 (second layer)"; break;
+    case kSPDClsVsTrkBG :  str = "Cluster vs Tracklets";      break;
+    case kV0A :            str = "V0 A BB";                   break;
+    case kV0C :            str = "V0 C BB";                   break;
+    case kV0OR :           str = "V0 OR BB";                  break;
+    case kV0AND :          str = "V0 AND BB";                 break;
+    case kV0ABG :          str = "V0 A BG";                   break;
+    case kV0CBG :          str = "V0 C BG";                   break;
+    case kZDC :            str = "ZDC";                       break;
+    case kZDCA :           str = "ZDC A";                     break;
+    case kZDCC :           str = "ZDC C";                     break;
+    case kZNA :            str = "ZN A";                      break;
+    case kZNC :            str = "ZN C";                      break;
+    case kZNABG :          str = "ZN A BG";                   break;
+    case kZNCBG :          str = "ZN C BG";                   break;
+    case kFMDA :           str = "FMD A";                     break;
+    case kFMDC :           str = "FMD C";                     break;
+    case kFPANY :          str = "SPD GFO | V0 | ZDC | FMD";  break;
+    case kNSD1 :           str = "NSD1";                      break;
+    case kMB1Prime:        str = "MB1prime";                  break;
+    case kZDCTDCA :        str = "ZDC TDC A";                 break;
+    case kZDCTDCC :        str = "ZDC TDC C";                 break;
+    case kZDCTime :        str = "ZDC Time Cut";              break;
+    case kCentral :        str = "V0 Central";                break;
+    case kSemiCentral :    str = "V0 Semi-central";           break;
+    case kEmcalL0 :        str = "EMCAL";                     break;
+    case kTRDHCO :         str = "TRD cosmics";               break;
+    case kTRDHJT :         str = "TRD Jet";                   break;
+    case kTRDHSE :         str = "TRD Single Electron";       break;
+    case kTRDHQU :         str = "TRD Quarkonia";             break;
+    case kTRDHEE :         str = "TRD Dielectron";            break;
+    default:               str = "";                          break;
+  }
+  if (trigger & kOfflineFlag) str += " OFFLINE";  
+  if (trigger & kOneParticle) str += " OneParticle";  
+  if (trigger & kOneTrack)    str += " OneTrack";  
   return str;
 }
 
-Bool_t AliTriggerAnalysis::IsTriggerFired(const AliESDEvent* aEsd, Trigger trigger)
-{
-  // checks if an event has been triggered
 
-  if (trigger & kOfflineFlag)
-    return IsOfflineTriggerFired(aEsd, trigger);
-    
+//-------------------------------------------------------------------------------------------------
+Bool_t AliTriggerAnalysis::IsTriggerFired(const AliESDEvent* aEsd, Trigger trigger){
+  // checks if an event has been triggered
+  if (trigger & kOfflineFlag) return IsOfflineTriggerFired(aEsd, trigger);
   return IsTriggerBitFired(aEsd, trigger);
 }
 
-Bool_t AliTriggerAnalysis::IsTriggerBitFired(const AliESDEvent* aEsd, Trigger trigger) const
-{
-  // checks if an event is fired using the trigger bits
 
-  return IsTriggerBitFired(aEsd->GetTriggerMask(), trigger);
+//-------------------------------------------------------------------------------------------------
+Bool_t AliTriggerAnalysis::IsTriggerBitFired(const AliESDEvent* /*aEsd*/, Trigger /*trigger*/) const { 
+  AliFatal("This IsTriggerBitFired function is obsolete.\n"); 
+  return 0; 
 }
 
-Bool_t AliTriggerAnalysis::IsTriggerBitFired(ULong64_t triggerMask, Trigger trigger) const
-{
-  // checks if an event is fired using the trigger bits
-  //
-  // this function needs the branch TriggerMask in the ESD
-  
-  // definitions from p-p.cfg
-  ULong64_t spdFO = (1 << 14);
-  ULong64_t v0left = (1 << 10);
-  ULong64_t v0right = (1 << 11);
-
-  switch (trigger)
-  {
-    case kAcceptAll:
-    {
-      return kTRUE;
-      break;
-    }
-    case kMB1:
-    {
-      if (triggerMask & spdFO || ((triggerMask & v0left) || (triggerMask & v0right)))
-        return kTRUE;
-      break;
-    }
-    case kMB2:
-    {
-      if (triggerMask & spdFO && ((triggerMask & v0left) || (triggerMask & v0right)))
-        return kTRUE;
-      break;
-    }
-    case kMB3:
-    {
-      if (triggerMask & spdFO && (triggerMask & v0left) && (triggerMask & v0right))
-        return kTRUE;
-      break;
-    }
-    case kSPDGFO:
-    {
-      if (triggerMask & spdFO)
-        return kTRUE;
-      break;
-    }
-    default:
-      Printf("IsEventTriggered: ERROR: Trigger type %d not implemented in this method", (Int_t) trigger);
-      break;
-  }
-
-  return kFALSE;
-}
 
-Bool_t AliTriggerAnalysis::IsTriggerBitFired(const AliESDEvent* aEsd, ULong64_t tclass) const
-{
+//-------------------------------------------------------------------------------------------------
+Bool_t AliTriggerAnalysis::IsTriggerBitFired(const AliESDEvent* aEsd, ULong64_t tclass) const {
   // Checks if corresponding bit in mask is on
-  
   ULong64_t trigmask = aEsd->GetTriggerMask();
   return (trigmask & (1ull << (tclass-1)));
 }
-  
-Int_t AliTriggerAnalysis::EvaluateTrigger(const AliESDEvent* aEsd, Trigger trigger)
-{
-  // evaluates a given trigger "offline"
+
+
+//-------------------------------------------------------------------------------------------------
+Int_t AliTriggerAnalysis::EvaluateTrigger(const AliESDEvent* aEsd, Trigger trigger){
+  // evaluates a given trigger
   // trigger combinations are not supported, for that see IsOfflineTriggerFired
-  
+
   UInt_t triggerNoFlags = (UInt_t) trigger % (UInt_t) kStartOfFlags;
-  Bool_t offline = kFALSE;
-  if (trigger & kOfflineFlag)
-    offline = kTRUE;
-  
-  Int_t decision = 0;
-  switch (triggerNoFlags)
-  {
-    case kSPDGFO:
-    {
-      decision = SPDFiredChips(aEsd, (offline) ? 0 : 1);
-      break;
-    }
-    case kSPDGFOL0:
-    {
-      decision = SPDFiredChips(aEsd, (offline) ? 0 : 1, kFALSE, 1);
-      break;
-    }
-    case kSPDGFOL1:
-    {
-      decision = SPDFiredChips(aEsd, (offline) ? 0 : 1, kFALSE, 2);
-      break;
-    } 
-    case kSPDClsVsTrkBG:
-    {
-      if(!offline) 
-        AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
-      decision = IsSPDClusterVsTrackletBG(aEsd);
-      break;
-    }
-    case kV0A:
-    {
-      if (V0Trigger(aEsd, kASide, !offline) == kV0BB)
-        decision = 1;
-      break;
-    }
-    case kV0C:
-    {
-      if (V0Trigger(aEsd, kCSide, !offline) == kV0BB)
-        decision = 1;
-      break;
-    }
-    case kV0ABG:
-    {
-      if (V0Trigger(aEsd, kASide, !offline) == kV0BG)
-        decision = 1;
-      break;
-    }
-    case kV0CBG:
-    {
-      if (V0Trigger(aEsd, kCSide, !offline) == kV0BG)
-        decision = 1;
-      break;
-    }
-    case kT0:
-    {
-      if (T0Trigger(aEsd, !offline) == kT0BB)
-        decision = 1;
-      break;
-    }
-    case kT0BG:
-    {
-      if (!offline)
-        AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
-      if (T0Trigger(aEsd, !offline) == kT0DecBG)
-        decision = 1;
-      break;
-    }
-    case kT0Pileup:
-    {
-      if (!offline)
-        AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
-      if (T0Trigger(aEsd, !offline) == kT0DecPileup)
-        decision = 1;
-      break;
-    }
-    case kZDCA:
-    {
-      if (!offline)
-        AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
-      if (ZDCTrigger(aEsd, kASide))
-        decision = 1;
-      break;
-    }
-    case kZDCC:
-    {
-      if (!offline)
-        AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
-      if (ZDCTrigger(aEsd, kCSide))
-        decision = 1;
-      break;
-    }
-    case kZDCTDCA:
-    {
-      if (!offline)
-        AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
-      if (ZDCTDCTrigger(aEsd, kASide))
-        decision = 1;
-      break;
-    }
-    case kZDCTDCC:
-    {
-      if (!offline)
-        AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
-      if (ZDCTDCTrigger(aEsd, kCSide))
-        decision = 1;
-      break;
-    }
-    case kZDCTime:
-    {
-      if (!offline)
-        AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
-      if (ZDCTimeTrigger(aEsd))
-        decision = 1;
-      break;
-    }
-    case kZNA:
-    {
-      if (!offline)
-        AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
-      if (ZDCTDCTrigger(aEsd,kASide,kTRUE,kFALSE,kFALSE))
-       decision = 1;
-      break;
-    }
-    case kZNC:
-    {
-      if (!offline)
-        AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
-      if (ZDCTDCTrigger(aEsd,kCSide,kTRUE,kFALSE,kFALSE))
-       decision = 1;
-      break;
-    }
-    case kZNABG:
-    {
-      if (!offline)
-        AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
-      if (ZDCTimeBGTrigger(aEsd,kASide))
-       decision = 1;
-      break;
-    }
-    case kZNCBG:
-    {
-      if (!offline)
-        AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
-      if (ZDCTimeBGTrigger(aEsd,kCSide))
-       decision = 1;
-      break;
-    }
-    case kFMDA:
-    {
-      if (!offline)
-        AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
-      if (FMDTrigger(aEsd, kASide))
-        decision = 1;
-      break;
-    }
-    case kFMDC:
-    {
-      if (!offline)
-        AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
-      if (FMDTrigger(aEsd, kCSide))
-        decision = 1;
-      break;
-    }
-    case kCTPV0A:
-    {
-      if (offline)
-        AliFatal(Form("Offline trigger not available for trigger %d", triggerNoFlags));
-      if (IsL0InputFired(aEsd, 2))
-        decision = 1;
-      break;
-    }
-    case kCTPV0C:
-    {
-      if (offline)
-        AliFatal(Form("Offline trigger not available for trigger %d", triggerNoFlags));
-      if (IsL0InputFired(aEsd, 3))
-        decision = 1;
-      break;
-    }
-    case kTPCLaserWarmUp:
-    {
-      if (!offline)
-        AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
-      return IsLaserWarmUpTPCEvent(aEsd);
-    }
-    case kTPCHVdip:
-    {
-      if (!offline)
-        AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
-      return IsHVdipTPCEvent(aEsd);
-    }
-    case kIncompleteEvent:
-    {
-      if (!offline)
-        AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
-      return IsIncompleteEvent(aEsd);
-    }
-    case kCentral:
-    {
-      if (offline)
-        AliFatal(Form("Offline trigger not available for trigger %d - use centrality selection", triggerNoFlags));
-      if (aEsd->GetVZEROData()) {
-       if (aEsd->GetVZEROData()->TestBit(AliESDVZERO::kTriggerChargeBitsFilled)) {
-         if (aEsd->GetVZEROData()->GetTriggerBits() & (1<<AliESDVZERO::kCTA2andCTC2))
-           decision = kTRUE;
-       }
-       else
-         AliWarning("V0 centrality trigger bits were not filled!");
-      }
-      break;
-    }
-    case kSemiCentral:
-    {
-      if (offline)
-        AliFatal(Form("Offline trigger not available for trigger %d - use centrality selection", triggerNoFlags));
-      if (aEsd->GetVZEROData()) {
-       if (aEsd->GetVZEROData()->TestBit(AliESDVZERO::kTriggerChargeBitsFilled)) {
-         if (aEsd->GetVZEROData()->GetTriggerBits() & (1<<AliESDVZERO::kCTA1andCTC1))
-           decision = kTRUE;
-       }
-       else
-         AliWarning("V0 centrality trigger bits were not filled!");
-      }
-      break;
-    }
-  case kEMCAL:
-    {
-      if(!offline) 
-       AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
-      if (EMCALCellsTrigger(aEsd)) 
-       decision = kTRUE;
-      break;
-    }
-  case kTRDHCO:
-    {
-      if(!offline) 
-       AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
-      if(TRDTrigger(aEsd,kTRDHCO))
-       decision = kTRUE;
-      break;
-    }
-  case kTRDHJT:
-    {
-      if(!offline) 
-       AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
-      if(TRDTrigger(aEsd,kTRDHJT))
-       decision = kTRUE;
-      break;
-    }
-  case kTRDHSE:
-    {
-      if(!offline) 
-       AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
-      if(TRDTrigger(aEsd,kTRDHSE))
-       decision = kTRUE;
-      break;
-    }
-  case kTRDHQU:
-    {
-      if(!offline) 
-       AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
-      if(TRDTrigger(aEsd,kTRDHQU))
-       decision = kTRUE;
-      break;
-    }
-  case kTRDHEE:
-    {
-      if(!offline) 
-       AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
-      if(TRDTrigger(aEsd,kTRDHEE))
-       decision = kTRUE;
-      break;
-    }
-    default:
-    {
-      AliFatal(Form("Trigger type %d not implemented", triggerNoFlags));
-    }
-  }  
+  Bool_t offline = trigger & kOfflineFlag;
   
-  return decision;
-}
-
-Bool_t AliTriggerAnalysis::IsLaserWarmUpTPCEvent(const AliESDEvent* esd)
-{
-  //
-  // This function flags noisy TPC events which can happen during laser warm-up.
-  //
+  if (!offline) {
+    if ( triggerNoFlags==kT0BG
+      || triggerNoFlags==kT0Pileup
+      || triggerNoFlags==kSPDClsVsTrkBG
+      || triggerNoFlags==kZDCA
+      || triggerNoFlags==kZDCC
+      || triggerNoFlags==kZDCTDCA
+      || triggerNoFlags==kZDCTDCC
+      || triggerNoFlags==kZDCTime
+      || triggerNoFlags==kZNA
+      || triggerNoFlags==kZNC
+      || triggerNoFlags==kZNABG
+      || triggerNoFlags==kZNCBG
+      || triggerNoFlags==kFMDA
+      || triggerNoFlags==kFMDC
+      || triggerNoFlags==kTPCLaserWarmUp
+      || triggerNoFlags==kTPCHVdip
+      || triggerNoFlags==kIncompleteEvent
+      || triggerNoFlags==kEMCAL
+      || triggerNoFlags==kEmcalL0
+      || triggerNoFlags==kEmcalL1GammaHigh
+      || triggerNoFlags==kEmcalL1GammaLow
+      || triggerNoFlags==kEmcalL1JetHigh
+      || triggerNoFlags==kEmcalL1JetLow
+      || triggerNoFlags==kTRDHCO
+      || triggerNoFlags==kTRDHJT
+      || triggerNoFlags==kTRDHSE
+      || triggerNoFlags==kTRDHQU
+      || triggerNoFlags==kTRDHEE
+      ) AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
+  } else {
+    if (  triggerNoFlags==kCTPV0A 
+        ||triggerNoFlags==kCTPV0C
+        ||triggerNoFlags==kCentral
+        ||triggerNoFlags==kSemiCentral
+      ) AliFatal(Form("Offline trigger not available for trigger %d", triggerNoFlags));
+  }
   
-  Int_t trackCounter = 0;
-  for (Int_t i=0; i<esd->GetNumberOfTracks(); ++i) 
-  {
-    AliESDtrack *track = esd->GetTrack(i);
-    if (!track) 
-      continue;
-      
-    if (track->GetTPCNcls() < 30) continue;
-    if (TMath::Abs(track->Eta()) > 0.005) continue;
-    if (track->Pt() < 4) continue;
-    if (track->GetKinkIndex(0) > 0) continue;
-    
-    UInt_t status = track->GetStatus();
-    if ((status&AliESDtrack::kITSrefit)==AliESDtrack::kITSrefit) continue; // explicitly ask for tracks without ITS refit
-    if ((status&AliESDtrack::kTPCrefit)!=AliESDtrack::kTPCrefit) continue;
-    
-    if (track->GetTPCsignal() > 10) continue;          // explicitly ask for tracks without dE/dx
-    
-    trackCounter++;
+  switch (triggerNoFlags) {
+    case kCTPV0A:          return aEsd->GetHeader()->IsTriggerInputFired("V0A");
+    case kCTPV0C:          return aEsd->GetHeader()->IsTriggerInputFired("V0C");
+    case kSPDGFO:          return SPDFiredChips(aEsd, !offline, kFALSE, 0); 
+    case kSPDGFOL0:        return SPDFiredChips(aEsd, !offline, kFALSE, 1);
+    case kSPDGFOL1:        return SPDFiredChips(aEsd, !offline, kFALSE, 2);
+    case kSPDClsVsTrkBG:   return IsSPDClusterVsTrackletBG(aEsd);
+    case kV0A:             return V0Trigger(aEsd, kASide, !offline) == kV0BB; 
+    case kV0C:             return V0Trigger(aEsd, kCSide, !offline) == kV0BB;
+    case kV0ABG:           return V0Trigger(aEsd, kASide, !offline) == kV0BG;
+    case kV0CBG:           return V0Trigger(aEsd, kCSide, !offline) == kV0BG;
+    case kT0:              return T0Trigger(aEsd, !offline) == kT0BB;
+    case kT0BG:            return T0Trigger(aEsd, !offline) == kT0DecBG;
+    case kT0Pileup:        return T0Trigger(aEsd, !offline) == kT0DecPileup;
+    case kZDCA:            return ZDCTrigger(aEsd, kASide);
+    case kZDCC:            return ZDCTrigger(aEsd, kCSide);
+    case kZDCTDCA:         return ZDCTDCTrigger(aEsd, kASide);
+    case kZDCTDCC:         return ZDCTDCTrigger(aEsd, kCSide);
+    case kZDCTime:         return ZDCTimeTrigger(aEsd);
+    case kZNA:             return ZDCTDCTrigger(aEsd,kASide,kTRUE,kFALSE,kFALSE);
+    case kZNC:             return ZDCTDCTrigger(aEsd,kCSide,kTRUE,kFALSE,kFALSE);
+    case kZNABG:           return ZDCTimeBGTrigger(aEsd,kASide);
+    case kZNCBG:           return ZDCTimeBGTrigger(aEsd,kCSide);
+    case kFMDA:            return FMDTrigger(aEsd, kASide);
+    case kFMDC:            return FMDTrigger(aEsd, kCSide);
+    case kTPCLaserWarmUp:  return IsLaserWarmUpTPCEvent(aEsd);
+    case kTPCHVdip:        return IsHVdipTPCEvent(aEsd);
+    case kIncompleteEvent: return IsIncompleteEvent(aEsd);
+    case kEMCAL:           return EMCALCellsTrigger(aEsd);
+    case kEmcalL0:         return EMCALTrigger(aEsd,kEmcalL0);
+    case kEmcalL1GammaHigh:return EMCALTrigger(aEsd,kEmcalL1GammaHigh);
+    case kEmcalL1GammaLow: return EMCALTrigger(aEsd,kEmcalL1GammaLow);
+    case kEmcalL1JetHigh:  return EMCALTrigger(aEsd,kEmcalL1JetHigh);
+    case kEmcalL1JetLow:   return EMCALTrigger(aEsd,kEmcalL1JetLow);
+    case kTRDHCO:          return TRDTrigger(aEsd,kTRDHCO);
+    case kTRDHJT:          return TRDTrigger(aEsd,kTRDHJT);
+    case kTRDHSE:          return TRDTrigger(aEsd,kTRDHSE);
+    case kTRDHQU:          return TRDTrigger(aEsd,kTRDHQU);
+    case kTRDHEE:          return TRDTrigger(aEsd,kTRDHEE);
+    case kCentral: {
+      if (!aEsd->GetVZEROData()) { AliWarning("V0 centrality trigger bits were not filled!"); return kFALSE; }
+      if (!aEsd->GetVZEROData()->TestBit(AliESDVZERO::kTriggerChargeBitsFilled)) return kFALSE;
+      return aEsd->GetVZEROData()->GetTriggerBits() & (1<<AliESDVZERO::kCTA2andCTC2);
+    }
+    case kSemiCentral: {
+      if (!aEsd->GetVZEROData()) { AliWarning("V0 centrality trigger bits were not filled!"); return kFALSE; }
+      if (!aEsd->GetVZEROData()->TestBit(AliESDVZERO::kTriggerChargeBitsFilled)) return kFALSE;
+      return aEsd->GetVZEROData()->GetTriggerBits() & (1<<AliESDVZERO::kCTA1andCTC1);
+    }
+    default: AliFatal(Form("Trigger type %d not implemented", triggerNoFlags));
   }
-  if (trackCounter > 15) 
-    return kTRUE;
-  return kFALSE;
-}
-
-Bool_t AliTriggerAnalysis::IsHVdipTPCEvent(const AliESDEvent* esd) {
-  //
-  // This function flags events in which the TPC chamber HV is not at its nominal value
-  //
-  if (fMC) return kFALSE; // there are no dip events in MC
-  if (!esd->IsDetectorOn(AliDAQ::kTPC)) return kTRUE;
-  return kFALSE;
-
-}
-
-Bool_t AliTriggerAnalysis::IsIncompleteEvent(const AliESDEvent* esd) 
-{
-  //
-  // Check whether the event is incomplete 
-  // (due to DAQ-HLT issues, it could be only part of the event was saved)
-  //
-  if (fMC) return kFALSE; // there are no incomplete events on MC
-  if ((esd->GetEventType() == 7) &&
-      (esd->GetDAQDetectorPattern() & (1<<4)) &&
-     !(esd->GetDAQAttributes() & (1<<7))) return kTRUE;
-
   return kFALSE;
 }
 
 
-Bool_t AliTriggerAnalysis::IsOfflineTriggerFired(const AliESDEvent* aEsd, Trigger trigger)
-{
+//-------------------------------------------------------------------------------------------------
+Bool_t AliTriggerAnalysis::IsOfflineTriggerFired(const AliESDEvent* aEsd, Trigger trigger){
   // checks if an event has been triggered "offline"
-
   UInt_t triggerNoFlags = (UInt_t) trigger % (UInt_t) kStartOfFlags;
   
   Bool_t decision = kFALSE;
-  switch (triggerNoFlags)
-  {
-    case kAcceptAll:
-    {
-      decision = kTRUE;
-      break;
-    }
-    case kMB1:
-    {
-      if (SPDGFOTrigger(aEsd, 0) || V0Trigger(aEsd, kASide, kFALSE) == kV0BB || V0Trigger(aEsd, kCSide, kFALSE) == kV0BB)
-        decision = kTRUE;
-      break;
-    }
-    case kMB2:
-    {
-      if (SPDGFOTrigger(aEsd, 0) && (V0Trigger(aEsd, kASide, kFALSE) == kV0BB || V0Trigger(aEsd, kCSide, kFALSE) == kV0BB))
-        decision = kTRUE;
-      break;
-    }
-    case kMB3:
-    {
-      if (SPDGFOTrigger(aEsd, 0) && V0Trigger(aEsd, kASide, kFALSE) == kV0BB && V0Trigger(aEsd, kCSide, kFALSE) == kV0BB)
-        decision = kTRUE;
-      break;
-    }
-    case kSPDGFO:
-    {
-      if (SPDGFOTrigger(aEsd, 0))
-        decision = kTRUE;
-      break;
-    }
-    case kSPDGFOBits:
-    {
-      if (SPDGFOTrigger(aEsd, 1))
-        decision = kTRUE;
-      break;
-    }
-    case kV0A:
-    {
-      if (V0Trigger(aEsd, kASide, kFALSE) == kV0BB)
-        decision = kTRUE;
-      break;
-    }
-    case kV0C:
-    {
-      if (V0Trigger(aEsd, kCSide, kFALSE) == kV0BB)
-        decision = kTRUE;
-      break;
-    }
-    case kV0OR:
-    {
-      if (V0Trigger(aEsd, kASide, kFALSE) == kV0BB || V0Trigger(aEsd, kCSide, kFALSE) == kV0BB)
-        decision = kTRUE;
-      break;
-    }
-    case kV0AND:
-    {
-      if (V0Trigger(aEsd, kASide, kFALSE) == kV0BB && V0Trigger(aEsd, kCSide, kFALSE) == kV0BB)
-        decision = kTRUE;
-      break;
-    }
-    case kV0ABG:
-    {
-      if (V0Trigger(aEsd, kASide, kFALSE) == kV0BG)
-        decision = kTRUE;
-      break;
-    }
-    case kV0CBG:
-    {
-      if (V0Trigger(aEsd, kCSide, kFALSE) == kV0BG)
-        decision = kTRUE;
-      break;
-    }
-    case kZDC:
-    {
-      if (ZDCTrigger(aEsd, kASide) || ZDCTrigger(aEsd, kCentralBarrel) || ZDCTrigger(aEsd, kCSide))
-        decision = kTRUE;
-      break;
-    }
-    case kZDCA:
-    {
-      if (ZDCTrigger(aEsd, kASide))
-        decision = kTRUE;
-      break;
-    }
-    case kZDCC:
-    {
-      if (ZDCTrigger(aEsd, kCSide))
-        decision = kTRUE;
-      break;
-    }
-    case kZNA:
-    {
-      if (ZDCTDCTrigger(aEsd,kASide,kTRUE,kFALSE,kFALSE))
-       decision = kTRUE;
-      break;
-    }
-    case kZNC:
-    {
-      if (ZDCTDCTrigger(aEsd,kCSide,kTRUE,kFALSE,kFALSE))
-       decision = kTRUE;
-      break;
-    }
-    case kZNABG:
-    {
-      if (ZDCTimeBGTrigger(aEsd,kASide))
-       decision = kTRUE;
-      break;
-    }
-    case kZNCBG:
-    {
-      if (ZDCTimeBGTrigger(aEsd,kCSide))
-       decision = kTRUE;
-      break;
-    }
-    case kFMDA:
-    {
-      if (FMDTrigger(aEsd, kASide))
-        decision = kTRUE;
-      break;
-    }
-    case kFMDC:
-    {
-      if (FMDTrigger(aEsd, kCSide))
-        decision = kTRUE;
-      break;
-    }
-    case kFPANY:
-    {
-      if (SPDGFOTrigger(aEsd, 0) || V0Trigger(aEsd, kASide, kFALSE) == kV0BB || V0Trigger(aEsd, kCSide, kFALSE) == kV0BB || ZDCTrigger(aEsd, kASide) || ZDCTrigger(aEsd, kCentralBarrel) || ZDCTrigger(aEsd, kCSide) || FMDTrigger(aEsd, kASide) || FMDTrigger(aEsd, kCSide))
-        decision = kTRUE;
-      break;
-    }
-    case kNSD1:
-    {
-      if (SPDFiredChips(aEsd, 0) >= 5 || (V0Trigger(aEsd, kASide, kFALSE) == kV0BB && V0Trigger(aEsd, kCSide, kFALSE) == kV0BB))
-        decision = kTRUE;
-       break;
-    }
-    case kMB1Prime:
-    {
-      Int_t count = 0;
-      if (SPDGFOTrigger(aEsd, 0))
-        count++;
-      if (V0Trigger(aEsd, kASide, kFALSE) == kV0BB)
-        count++;
-      if (V0Trigger(aEsd, kCSide, kFALSE) == kV0BB)
-        count++;
-      
-      if (count >= 2)
-        decision = kTRUE;
-        
-      break;
-    }
-  case kEMCAL:
-    {
-      if (EMCALCellsTrigger(aEsd))
-       decision = kTRUE;
-      break;
-    }  
-  case kTRDHCO:
-    {
-      if(TRDTrigger(aEsd,kTRDHCO))
-       decision = kTRUE;
-      break;
-    }
-  case kTRDHJT:
-    {
-      if(TRDTrigger(aEsd,kTRDHJT))
-       decision = kTRUE;
-      break;
-    }
-  case kTRDHSE:
-    {
-      if(TRDTrigger(aEsd,kTRDHSE))
-       decision = kTRUE;
-      break;
-    }
-  case kTRDHQU:
-    {
-      if(TRDTrigger(aEsd,kTRDHQU))
-       decision = kTRUE;
-      break;
-    }
-  case kTRDHEE:
-    {
-      if(TRDTrigger(aEsd,kTRDHEE))
-       decision = kTRUE;
-      break;
-    }
-  default:
-      {
-      AliFatal(Form("Trigger type %d not implemented", triggerNoFlags));
-    }
+  switch (triggerNoFlags) {
+    case kAcceptAll:        decision = kTRUE; break;
+    case kMB1:              decision = SPDGFOTrigger(aEsd, 0) ||  V0Trigger(aEsd, kASide, kFALSE) == kV0BB || V0Trigger(aEsd, kCSide, kFALSE) == kV0BB;  break;
+    case kMB2:              decision = SPDGFOTrigger(aEsd, 0) && (V0Trigger(aEsd, kASide, kFALSE) == kV0BB || V0Trigger(aEsd, kCSide, kFALSE) == kV0BB); break;
+    case kMB3:              decision = SPDGFOTrigger(aEsd, 0) &&  V0Trigger(aEsd, kASide, kFALSE) == kV0BB && V0Trigger(aEsd, kCSide, kFALSE) == kV0BB;  break;
+    case kSPDGFO:           decision = SPDGFOTrigger(aEsd, 0); break;
+    case kSPDGFOBits:       decision = SPDGFOTrigger(aEsd, 1); break;
+    case kV0A:              decision = V0Trigger(aEsd, kASide, kFALSE) == kV0BB; break;
+    case kV0C:              decision = V0Trigger(aEsd, kCSide, kFALSE) == kV0BB; break;
+    case kV0OR:             decision = V0Trigger(aEsd, kASide, kFALSE) == kV0BB || V0Trigger(aEsd, kCSide, kFALSE) == kV0BB; break;
+    case kV0AND:            decision = V0Trigger(aEsd, kASide, kFALSE) == kV0BB && V0Trigger(aEsd, kCSide, kFALSE) == kV0BB; break;
+    case kV0ABG:            decision = V0Trigger(aEsd, kASide, kFALSE) == kV0BG; break;
+    case kV0CBG:            decision = V0Trigger(aEsd, kCSide, kFALSE) == kV0BG; break;
+    case kZDC:              decision = ZDCTrigger(aEsd, kASide) || ZDCTrigger(aEsd, kCentralBarrel) || ZDCTrigger(aEsd, kCSide); break;
+    case kZDCA:             decision = ZDCTrigger(aEsd, kASide); break;
+    case kZDCC:             decision = ZDCTrigger(aEsd, kCSide); break;
+    case kZNA:              decision = ZDCTDCTrigger(aEsd,kASide,kTRUE,kFALSE,kFALSE); break;
+    case kZNC:              decision = ZDCTDCTrigger(aEsd,kCSide,kTRUE,kFALSE,kFALSE); break;
+    case kZNABG:            decision = ZDCTimeBGTrigger(aEsd,kASide); break;
+    case kZNCBG:            decision = ZDCTimeBGTrigger(aEsd,kCSide); break;
+    case kFMDA:             decision = FMDTrigger(aEsd, kASide); break;
+    case kFMDC:             decision = FMDTrigger(aEsd, kCSide); break;
+    case kEMCAL:            decision = EMCALCellsTrigger(aEsd); break;
+    case kEmcalL0:          decision = EMCALTrigger(aEsd,kEmcalL0);          break;
+    case kEmcalL1GammaHigh: decision = EMCALTrigger(aEsd,kEmcalL1GammaHigh); break;
+    case kEmcalL1GammaLow:  decision = EMCALTrigger(aEsd,kEmcalL1GammaLow);  break;
+    case kEmcalL1JetHigh:   decision = EMCALTrigger(aEsd,kEmcalL1JetHigh);   break;
+    case kEmcalL1JetLow:    decision = EMCALTrigger(aEsd,kEmcalL1JetLow);    break;
+    case kTRDHCO:           decision = TRDTrigger(aEsd,kTRDHCO); break;
+    case kTRDHJT:           decision = TRDTrigger(aEsd,kTRDHJT); break;
+    case kTRDHSE:           decision = TRDTrigger(aEsd,kTRDHSE); break;
+    case kTRDHQU:           decision = TRDTrigger(aEsd,kTRDHQU); break;
+    case kTRDHEE:           decision = TRDTrigger(aEsd,kTRDHEE); break;
+    case kNSD1:             decision = SPDFiredChips(aEsd, 0) >= 5 || (V0Trigger(aEsd, kASide, kFALSE) == kV0BB && V0Trigger(aEsd, kCSide, kFALSE) == kV0BB); break;
+    case kFPANY:            decision |= SPDGFOTrigger(aEsd, 0); 
+                            decision |= V0Trigger(aEsd, kASide, kFALSE) == kV0BB;
+                            decision |= V0Trigger(aEsd, kCSide, kFALSE) == kV0BB;
+                            decision |= ZDCTrigger(aEsd, kASide);
+                            decision |= ZDCTrigger(aEsd, kCentralBarrel);
+                            decision |= ZDCTrigger(aEsd, kCSide);
+                            decision |= FMDTrigger(aEsd, kASide);
+                            decision |= FMDTrigger(aEsd, kCSide);
+                            break; 
+    case kMB1Prime:         decision |= SPDGFOTrigger(aEsd, 0) && V0Trigger(aEsd, kASide, kFALSE) == kV0BB;
+                            decision |= SPDGFOTrigger(aEsd, 0) && V0Trigger(aEsd, kCSide, kFALSE) == kV0BB;
+                            decision |= V0Trigger(aEsd, kASide, kFALSE) == kV0BB && V0Trigger(aEsd, kCSide, kFALSE) == kV0BB;
+                            break; 
+    default:                AliFatal(Form("Trigger type %d not implemented", triggerNoFlags));
   }
   
-  // hadron-level requirement
-  if (decision && (trigger & kOneParticle))
-  {
+  // hadron-level requirement: SPD tracklets
+  if (decision && (trigger & kOneParticle))  {
     decision = kFALSE;
     
     const AliESDVertex* vertex = aEsd->GetPrimaryVertexSPD();
     const AliMultiplicity* mult = aEsd->GetMultiplicity();
-
-    if (mult && vertex && vertex->GetNContributors() > 0 && (!vertex->IsFromVertexerZ() || vertex->GetDispersion() < 0.02) && TMath::Abs(vertex->GetZv()) < 5.5) 
-    {
-      for (Int_t i=0; i<mult->GetNumberOfTracklets(); ++i)
-      {
-        if (TMath::Abs(mult->GetEta(i)) < 1)
-        {
+    
+    if (mult && vertex && vertex->GetNContributors() > 0 && (!vertex->IsFromVertexerZ() || vertex->GetDispersion() < 0.02) && TMath::Abs(vertex->GetZv()) < 5.5)    {
+      for (Int_t i=0; i<mult->GetNumberOfTracklets(); ++i) {
+        if (TMath::Abs(mult->GetEta(i)) < 1) {
           decision = kTRUE;
           break;
         }
       }
     }
   }
-
-  // hadron level definition for TPC tracks
-
-  if (decision && (trigger & kOneTrack))
-  {
+  
+  // hadron level requirement: TPC tracks
+  if (decision && (trigger & kOneTrack)) {
     decision = kFALSE;
     const AliESDVertex* vertex =0x0;
     vertex = aEsd->GetPrimaryVertexTracks();
-    if (!vertex || vertex->GetNContributors() <= 0)
-    {
-      vertex = aEsd->GetPrimaryVertexSPD();
-    }
+    if (!vertex || vertex->GetNContributors() <= 0) vertex = aEsd->GetPrimaryVertexSPD();
     Float_t ptmin, ptmax;
     fEsdTrackCuts->GetPtRange(ptmin,ptmax);
     AliDebug(3, Form("ptmin = %f, ptmax = %f\n",ptmin, ptmax));
-
+    
     if (vertex && vertex->GetNContributors() > 0 && (!vertex->IsFromVertexerZ() || vertex->GetDispersion() < 0.02) && TMath::Abs(vertex->GetZv()) < 10.) {
       AliDebug(3,Form("Check on the vertex passed\n"));
       for (Int_t i=0; i<aEsd->GetNumberOfTracks(); ++i){
-       if (fTPCOnly == kFALSE){
+        if (fTPCOnly == kFALSE){
           if (fEsdTrackCuts->AcceptTrack(aEsd->GetTrack(i))){
-           AliDebug(2, Form("pt of track = %f --> check passed\n",aEsd->GetTrack(i)->Pt()));
-           decision = kTRUE;
-            break;
+            AliDebug(2, Form("pt of track = %f --> check passed\n",aEsd->GetTrack(i)->Pt()));
+            decision = kTRUE;
+            break;
+          }
+        }
+        else {
+          // TPC only tracks
+          AliESDtrack *tpcTrack = fEsdTrackCuts->GetTPCOnlyTrack((AliESDEvent*)aEsd, i);
+          if (!tpcTrack){
+            AliDebug(3,Form("track %d is NOT a TPC track",i));
+            continue;
           }
-       }
-       else {
-         // TPC only tracks
-         AliESDtrack *tpcTrack = fEsdTrackCuts->GetTPCOnlyTrack((AliESDEvent*)aEsd, i);
-         if (!tpcTrack){
-           AliDebug(3,Form("track %d is NOT a TPC track",i));
-           continue;
-         }
-         else{
-           AliDebug(3,Form("track %d IS a TPC track",i));
-           if (!(fEsdTrackCuts->AcceptTrack(tpcTrack))) {
-             AliDebug(2, Form("TPC track %d NOT ACCEPTED, pt = %f, eta = %f",i,tpcTrack->Pt(), tpcTrack->Eta()));
-             delete tpcTrack; tpcTrack = 0x0;
-             continue;
-           } // end if the TPC track is not accepted
-           else{
-             AliDebug(2, Form("TPC track %d ACCEPTED, pt = %f, eta = %f",i,tpcTrack->Pt(), tpcTrack->Eta()));
-             decision = kTRUE;
-             delete tpcTrack; tpcTrack = 0x0;
-             break;
-           } // end if the TPC track is accepted
-         } // end if it is a TPC track
-       } // end if you are looking at TPC only tracks                  
+          else{
+            AliDebug(3,Form("track %d IS a TPC track",i));
+            if (!(fEsdTrackCuts->AcceptTrack(tpcTrack))) {
+              AliDebug(2, Form("TPC track %d NOT ACCEPTED, pt = %f, eta = %f",i,tpcTrack->Pt(), tpcTrack->Eta()));
+              delete tpcTrack; tpcTrack = 0x0;
+              continue;
+            } // end if the TPC track is not accepted
+            else{
+              AliDebug(2, Form("TPC track %d ACCEPTED, pt = %f, eta = %f",i,tpcTrack->Pt(), tpcTrack->Eta()));
+              decision = kTRUE;
+              delete tpcTrack; tpcTrack = 0x0;
+              break;
+            } // end if the TPC track is accepted
+          } // end if it is a TPC track
+        } // end if you are looking at TPC only tracks                 
       } // end loop on tracks
     } // end check on vertex
     else{
       AliDebug(4,Form("Check on the vertex not passed\n"));
       for (Int_t i=0; i<aEsd->GetNumberOfTracks(); ++i){
         if (fEsdTrackCuts->AcceptTrack(aEsd->GetTrack(i))){
-         AliDebug(4,Form("pt of track = %f --> check would be passed if the vertex was ok\n",aEsd->GetTrack(i)->Pt()));
-         break;
-       }
+          AliDebug(4,Form("pt of track = %f --> check would be passed if the vertex was ok\n",aEsd->GetTrack(i)->Pt()));
+          break;
+        }
       }
     }
     if (!decision) AliDebug(3,("Check for kOneTrack NOT passed\n"));
   }
-
-  return decision;
-}
-
-Bool_t AliTriggerAnalysis::IsTriggerClassFired(const AliESDEvent* aEsd, const Char_t* tclass) const 
-{
-  // tclass is logical function of inputs, e.g. 01 && 02 || 03 && 11 && 21
-  // = L0 inp 1 && L0 inp 2 || L0 inp 3 && L1 inp 1 && L2 inp 1
-  // NO brackets in logical function !
-  // Spaces between operators and inputs.
-  // Not all logical functions are available in CTP= 
-  // =any function of first 4 inputs; 'AND' of other inputs, check not done
-  // This method will be replaced/complemened by similar one
-  // which works withh class and inputs names as in CTP cfg file
-  
-  TString TClass(tclass);
-  TObjArray* tcltokens = TClass.Tokenize(" ");
-  Char_t level=((TObjString*)tcltokens->At(0))->String()[0];
-  UInt_t input=atoi((((TObjString*)tcltokens->At(0))->String()).Remove(0));
-  Bool_t tcl = IsInputFired(aEsd,level,input);
-  for (Int_t i=1;i<tcltokens->GetEntriesFast();i=i+2) {
-    level=((TObjString*)tcltokens->At(i+1))->String()[0];
-    input=atoi((((TObjString*)tcltokens->At(i+1))->String()).Remove(0));
-    Bool_t inpnext = IsInputFired(aEsd,level,input);
-    Char_t op =((TObjString*)tcltokens->At(i))->String()[0];
-    if (op == '&') tcl=tcl && inpnext;
-    else if (op == '|') tcl =tcl || inpnext;
-    else {
-       AliError(Form("Syntax error in %s", tclass));
-       delete tcltokens;
-       tcltokens = 0;
-       //      tcltokens->Delete();
-       return kFALSE;
-    }
-  }
-  delete tcltokens;
-  tcltokens = 0;
-       //  tcltokens->Delete();
-  return tcl;
-}
-
-Bool_t AliTriggerAnalysis::IsInputFired(const AliESDEvent* aEsd, Char_t level, UInt_t input) const
-{
-  // Checks trigger input of any level
-  
-  switch (level)
-  {
-    case '0': return IsL0InputFired(aEsd,input);
-    case '1': return IsL1InputFired(aEsd,input);
-    case '2': return IsL2InputFired(aEsd,input);
-    default:
-      AliError(Form("Wrong level %i",level));
-      return kFALSE;
-  }
-}
-
-Bool_t AliTriggerAnalysis::IsL0InputFired(const AliESDEvent* aEsd, UInt_t input) const 
-{
-  // Checks if corresponding bit in mask is on
-  
-  UInt_t inpmask = aEsd->GetHeader()->GetL0TriggerInputs();
-  return (inpmask & (1<<(input-1)));
-}
-
-Bool_t AliTriggerAnalysis::IsL1InputFired(const AliESDEvent* aEsd, UInt_t input) const
-{
-  // Checks if corresponding bit in mask is on
-  
-  UInt_t inpmask = aEsd->GetHeader()->GetL1TriggerInputs();
-  return (inpmask & (1<<(input-1)));
-}
-
-Bool_t AliTriggerAnalysis::IsL2InputFired(const AliESDEvent* aEsd, UInt_t input) const 
-{
-  // Checks if corresponding bit in mask is on
-  
-  UInt_t inpmask = aEsd->GetHeader()->GetL2TriggerInputs();
-  return (inpmask & (1<<(input-1)));
-}
-
-void AliTriggerAnalysis::FillHistograms(const AliESDEvent* aEsd) 
-{
-  // fills the histograms with the info from the ESD
-  
-  fHistBitsSPD->Fill(SPDFiredChips(aEsd, 0), SPDFiredChips(aEsd, 1, kTRUE));
-  
-  V0Trigger(aEsd, kASide, kFALSE, kTRUE);
-  V0Trigger(aEsd, kCSide, kFALSE, kTRUE);
-  T0Trigger(aEsd, kFALSE, kTRUE);
-  ZDCTDCTrigger(aEsd,kASide,kFALSE,kFALSE,kTRUE);
-  ZDCTimeTrigger(aEsd,kTRUE);
-  IsSPDClusterVsTrackletBG(aEsd, kTRUE);
-
-  AliESDZDC* zdcData = aEsd->GetESDZDC();
-  if (zdcData)
-  {
-    UInt_t quality = zdcData->GetESDQuality();
-    
-    // from Nora's presentation, general first physics meeting 16.10.09
-    static UInt_t zpc  = 0x20;
-    static UInt_t znc  = 0x10;
-    static UInt_t zem1 = 0x08;
-    static UInt_t zem2 = 0x04;
-    static UInt_t zpa  = 0x02;
-    static UInt_t zna  = 0x01;
-   
-    fHistZDC->Fill(1, (quality & zna)  ? 1 : 0);
-    fHistZDC->Fill(2, (quality & zpa)  ? 1 : 0);
-    fHistZDC->Fill(3, (quality & zem2) ? 1 : 0);
-    fHistZDC->Fill(4, (quality & zem1) ? 1 : 0);
-    fHistZDC->Fill(5, (quality & znc)  ? 1 : 0);
-    fHistZDC->Fill(6, (quality & zpc)  ? 1 : 0);
-  }
-  else
-  {
-    fHistZDC->Fill(-1);
-    AliError("AliESDZDC not available");
-  }
-  
-  if (fDoFMD) {
-    fHistFMDA->Fill(FMDHitCombinations(aEsd, kASide, kTRUE));
-    fHistFMDC->Fill(FMDHitCombinations(aEsd, kCSide, kTRUE));
-  }
-}
-  
-void AliTriggerAnalysis::FillTriggerClasses(const AliESDEvent* aEsd)
-{
-  // fills trigger classes map
   
-  TParameter<Long64_t>* count = dynamic_cast<TParameter<Long64_t>*> (fTriggerClasses->GetValue(aEsd->GetFiredTriggerClasses().Data()));
-  if (!count)
-  {
-    count = new TParameter<Long64_t>(aEsd->GetFiredTriggerClasses(), 0);
-    fTriggerClasses->Add(new TObjString(aEsd->GetFiredTriggerClasses().Data()), count);
-  }
-  count->SetVal(count->GetVal() + 1);
+  return decision;
 }
 
-Int_t AliTriggerAnalysis::SSDClusters(const AliESDEvent* aEsd)
-{
-  // returns the number of clusters in the SSD
-  const AliMultiplicity* mult = aEsd->GetMultiplicity();
-  Int_t clusters = mult->GetNumberOfITSClusters(4)+mult->GetNumberOfITSClusters(5);
-  return clusters;
-}
 
 
-Int_t AliTriggerAnalysis::SPDFiredChips(const AliESDEvent* aEsd, Int_t origin, Bool_t fillHists, Int_t layer)
-{
+//-------------------------------------------------------------------------------------------------
+Int_t AliTriggerAnalysis::SPDFiredChips(const AliESDEvent* aEsd, Int_t origin, Bool_t fillHists, Int_t layer){
   // returns the number of fired chips in the SPD
   //
   // origin = 0 --> aEsd->GetMultiplicity()->GetNumberOfFiredChips() (filled from clusters)
@@ -1170,43 +485,26 @@ Int_t AliTriggerAnalysis::SPDFiredChips(const AliESDEvent* aEsd, Int_t origin, B
   // layer  = 2 --> outer
   
   const AliMultiplicity* mult = aEsd->GetMultiplicity();
-  if (!mult)
-  {
-    AliError("AliMultiplicity not available");
-    return -1;
-  }
+  if (!mult) { AliFatal("AliMultiplicity not available"); }
   
-  if (origin == 0){
-    if (layer == 0) 
-      return mult->GetNumberOfFiredChips(0) + mult->GetNumberOfFiredChips(1);
-
+  if (origin == 0) {
+    if (layer == 0) return mult->GetNumberOfFiredChips(0) + mult->GetNumberOfFiredChips(1);
     return mult->GetNumberOfFiredChips(layer-1); 
   }
-    
-  if (origin == 1)
-  {
+  
+  if (origin == 1) {
     Int_t nChips = 0;
     Int_t firstChip = 0;
     Int_t lastChip  = 1200;
-    if(layer == 1)
-      lastChip  = 400;
-    if(layer == 2)
-      firstChip = 400;
-
-    for (Int_t i=firstChip; i<lastChip; i++)
-    {
-      if (mult->TestFastOrFiredChips(i) == kTRUE)
-      {
+    if(layer == 1) lastChip  = 400;
+    if(layer == 2) firstChip = 400;
+
+    for (Int_t i=firstChip; i<lastChip; i++) {
+      if (mult->TestFastOrFiredChips(i)) {
         // efficiency simulation (if enabled)
-        if (fSPDGFOEfficiency)
-        {
-          if (gRandom->Uniform() > fSPDGFOEfficiency->GetBinContent(i+1))
-            continue;
-        }
-        
+        if (fSPDGFOEfficiency) if (gRandom->Uniform() > fSPDGFOEfficiency->GetBinContent(i+1)) continue;
         nChips++;
-        if (fillHists)
-          fHistFiredBitsSPD->Fill(i);
+        if (fillHists) fHistFiredBitsSPD->Fill(i);
       }
     }
     return nChips;
@@ -1215,47 +513,15 @@ Int_t AliTriggerAnalysis::SPDFiredChips(const AliESDEvent* aEsd, Int_t origin, B
   return -1;
 }
 
-Bool_t AliTriggerAnalysis::SPDGFOTrigger(const AliESDEvent* aEsd, Int_t origin)
-{
-  // Returns if the SPD gave a global Fast OR trigger
-  
-  Int_t firedChips = SPDFiredChips(aEsd, origin);
-  
-  if (firedChips >= fSPDGFOThreshold)
-    return kTRUE;
-  return kFALSE;
-}
-
-Bool_t AliTriggerAnalysis::IsSPDClusterVsTrackletBG(const AliESDEvent* aEsd, Bool_t fillHists){
-  //rejects BG based on the cluster vs tracklet correlation
-  // returns true if the event is BG
-  const AliMultiplicity* mult = aEsd->GetMultiplicity();
-  if (!mult){
-    AliFatal("No multiplicity object"); // TODO: Should this be fatal?
-  }
-  Int_t ntracklet = mult->GetNumberOfTracklets();
-
-  Int_t spdClusters = 0;
-  for(Int_t ilayer = 0; ilayer < 2; ilayer++){
-    spdClusters += mult->GetNumberOfITSClusters(ilayer);
-  }
-
-  if(fillHists) {
-    fHistSPDClsVsTrk->Fill(ntracklet,spdClusters);
-  }
-
-  Bool_t isCvsTOk = kFALSE;
-  Float_t limit = Float_t(fASPDCvsTCut) + Float_t(ntracklet) * fBSPDCvsTCut;  
-  if (spdClusters > limit)        isCvsTOk = kTRUE;
-  else                            isCvsTOk = kFALSE ;
-
-  return isCvsTOk;
 
+//-------------------------------------------------------------------------------------------------
+Int_t AliTriggerAnalysis::SSDClusters(const AliVEvent* event){ 
+  return event->GetNumberOfITSClusters(4)+event->GetNumberOfITSClusters(5); 
 }
-  
 
-AliTriggerAnalysis::V0Decision AliTriggerAnalysis::V0Trigger(const AliESDEvent* aEsd, AliceSide side, Bool_t online, Bool_t fillHists)
-{
+
+//-------------------------------------------------------------------------------------------------
+AliTriggerAnalysis::V0Decision AliTriggerAnalysis::V0Trigger(const AliESDEvent* aEsd, AliceSide side, Bool_t online, Bool_t fillHists){
   // Returns the V0 trigger decision in V0A | V0C
   //
   // Returns kV0Fake if the calculated average time is in a window where neither BB nor BG is expected. 
@@ -1265,93 +531,62 @@ AliTriggerAnalysis::V0Decision AliTriggerAnalysis::V0Trigger(const AliESDEvent*
   // argument 'online' is used as a switch between online and offline trigger algorithms
   //
   // Based on an algorithm by Cvetan Cheshkov
-
+  
   AliESDVZERO* esdV0 = aEsd->GetVZEROData();
-  if (!esdV0)
-  {
-    AliError("AliESDVZERO not available");
-    return kV0Invalid;
-  }
+  if (!esdV0) { AliError("AliESDVZERO not available");  return kV0Invalid; }
+  if (side != kASide && side != kCSide) return kV0Invalid;
+  
   AliDebug(2,Form("In V0Trigger: %f %f",esdV0->GetV0ATime(),esdV0->GetV0CTime()));
-
-  Int_t begin = -1;
-  Int_t end = -1;
   
-  if (side == kASide)
-  {
-    begin = 32;
-    end = 64;
-  } 
-  else if (side == kCSide)
-  {
-    begin = 0;
-    end = 32;
-  }
-  else
-    return kV0Invalid;
-    
-   if (esdV0->TestBit(AliESDVZERO::kDecisionFilled)) {
+  Int_t begin = (side == kASide) ? 32 :  0;
+  Int_t end   = (side == kASide) ? 64 : 32;
+  
+  if (esdV0->TestBit(AliESDVZERO::kDecisionFilled)) {
     if (online) {
       if (esdV0->TestBit(AliESDVZERO::kOnlineBitsFilled)) {
-       for (Int_t i = begin; i < end; ++i) {
-         if (esdV0->GetBBFlag(i)) return kV0BB;
-       }
-       for (Int_t i = begin; i < end; ++i) {
-         if (esdV0->GetBGFlag(i)) return kV0BG;
-       }
-       return kV0Empty;
+        for (Int_t i = begin; i < end; ++i) if (esdV0->GetBBFlag(i)) return kV0BB;
+        for (Int_t i = begin; i < end; ++i) if (esdV0->GetBGFlag(i)) return kV0BG;
+        return kV0Empty;
       }
       else {
-       AliWarning("V0 online trigger analysis is not yet available!");
-       return kV0BB;
+        AliWarning("V0 online trigger analysis is not yet available!");
+        return kV0BB;
       }
     }
     else {
-
       if (fillHists) {
-       if (side == kASide && fHistV0A)
-         fHistV0A->Fill(esdV0->GetV0ATime());
-       if (side == kCSide && fHistV0C)
-         fHistV0C->Fill(esdV0->GetV0CTime());
+        if (side == kASide && fHistV0A) fHistV0A->Fill(esdV0->GetV0ATime());
+        if (side == kCSide && fHistV0C) fHistV0C->Fill(esdV0->GetV0CTime());
       }
-
-      if (side == kASide) return (V0Decision)esdV0->GetV0ADecision();
-      else if (side == kCSide) return (V0Decision)esdV0->GetV0CDecision();
-      else return kV0Invalid;
+      if      (side == kASide) return (V0Decision) esdV0->GetV0ADecision();
+      else if (side == kCSide) return (V0Decision) esdV0->GetV0CDecision();
     }
   }
-
+  
   Float_t time = 0;
   Float_t weight = 0;
-  if (fMC)
-  {
+  if (fMC) {
     Int_t runRange;
-    if (aEsd->GetRunNumber() <= 104803) runRange = 0;
+    if      (aEsd->GetRunNumber() <= 104803) runRange = 0;
     else if (aEsd->GetRunNumber() <= 104876) runRange = 1;
     else runRange = 2;
-
+    
     Float_t factors[3][64] = {
-      // runs: 104792-104803
-      {4.6,5.9,6.3,6.0,4.7,5.9,4.9,5.4,4.8,4.1,4.9,4.6,4.5,5.5,5.1,5.8,4.3,4.0,4.0,3.3,3.1,2.9,3.0,5.6,3.3,4.9,3.9,5.3,4.1,4.4,3.9,5.5,5.7,9.5,5.1,5.3,6.6,7.1,8.9,4.4,4.1,5.9,9.0,4.5,4.1,6.0,4.7,7.1,4.2,4.7,3.9,6.3,5.9,4.8,4.7,4.5,4.7,5.4,5.8,5.0,5.1,5.9,5.3,3.6},
-      // runs: 104841-104876
-      {4.6,4.8,4.9,4.8,4.3,4.9,4.4,4.5,4.6,5.0,4.7,4.6,4.7,4.6,4.6,5.5,4.7,4.5,4.7,5.0,6.5,7.6,5.3,4.9,5.5,4.8,4.6,4.9,4.5,4.5,4.6,4.9,5.7,9.8,4.9,5.2,7.1,7.1,8.1,4.4,4.0,6.0,8.3,4.6,4.2,5.6,4.6,6.4,4.4,4.7,4.5,6.5,6.0,4.7,4.5,4.4,4.8,5.5,5.9,5.3,5.0,5.7,5.1,3.6},
-      // runs: 104890-92
-      {4.7,5.2,4.8,5.0,4.4,5.0,4.4,4.6,4.6,4.5,4.4,4.6,4.5,4.6,4.8,5.5,4.8,4.5,4.4,4.3,5.4,7.7,5.6,5.0,5.4,4.3,4.5,4.8,4.5,4.5,4.6,5.3,5.7,9.6,4.9,5.4,6.1,7.2,8.6,4.4,4.0,5.4,8.8,4.4,4.2,5.8,4.7,6.7,4.3,4.7,4.0,6.1,6.0,4.9,4.8,4.6,4.7,5.2,5.7,5.0,5.0,5.8,5.3,3.6}
+      /*104792-104803*/ {4.6,5.9,6.3,6.0,4.7,5.9,4.9,5.4,4.8,4.1,4.9,4.6,4.5,5.5,5.1,5.8,4.3,4.0,4.0,3.3,3.1,2.9,3.0,5.6,3.3,4.9,3.9,5.3,4.1,4.4,3.9,5.5,5.7,9.5,5.1,5.3,6.6,7.1,8.9,4.4,4.1,5.9,9.0,4.5,4.1,6.0,4.7,7.1,4.2,4.7,3.9,6.3,5.9,4.8,4.7,4.5,4.7,5.4,5.8,5.0,5.1,5.9,5.3,3.6},
+      /*104841-104876*/ {4.6,4.8,4.9,4.8,4.3,4.9,4.4,4.5,4.6,5.0,4.7,4.6,4.7,4.6,4.6,5.5,4.7,4.5,4.7,5.0,6.5,7.6,5.3,4.9,5.5,4.8,4.6,4.9,4.5,4.5,4.6,4.9,5.7,9.8,4.9,5.2,7.1,7.1,8.1,4.4,4.0,6.0,8.3,4.6,4.2,5.6,4.6,6.4,4.4,4.7,4.5,6.5,6.0,4.7,4.5,4.4,4.8,5.5,5.9,5.3,5.0,5.7,5.1,3.6},
+      /*104890-104892*/ {4.7,5.2,4.8,5.0,4.4,5.0,4.4,4.6,4.6,4.5,4.4,4.6,4.5,4.6,4.8,5.5,4.8,4.5,4.4,4.3,5.4,7.7,5.6,5.0,5.4,4.3,4.5,4.8,4.5,4.5,4.6,5.3,5.7,9.6,4.9,5.4,6.1,7.2,8.6,4.4,4.0,5.4,8.8,4.4,4.2,5.8,4.7,6.7,4.3,4.7,4.0,6.1,6.0,4.9,4.8,4.6,4.7,5.2,5.7,5.0,5.0,5.8,5.3,3.6}
     };
     Float_t dA = 77.4 - 11.0;
     Float_t dC = 77.4 - 2.9;
     // Time misalignment
     Float_t timeShift[64] = {0.477957 , 0.0889999 , 0.757669 , 0.205439 , 0.239666 , -0.183705 , 0.442873 , -0.281366 , 0.260976 , 0.788995 , 0.974758 , 0.548532 , 0.495023 , 0.868472 , 0.661167 , 0.358307 , 0.221243 , 0.530179 , 1.26696 , 1.33082 , 1.27086 , 1.77133 , 1.10253 , 0.634806 , 2.14838 , 1.50212 , 1.59253 , 1.66122 , 1.16957 , 1.52056 , 1.47791 , 1.81905 , -1.94123 , -1.29124 , -2.16045 , -1.78939 , -3.11111 , -1.87178 , -1.57671 , -1.70311 , -1.81208 , -1.94475 , -2.53058 , -1.7042 , -2.08109 , -1.84416 , -0.61073 , -1.77145 , 0.16999 , -0.0585339 , 0.00401133 , 0.397726 , 0.851111 , 0.264187 , 0.59573 , -0.158263 , 0.584362 , 1.20835 , 0.927573 , 1.13895 , 0.64648 , 2.18747 , 1.68909 , 0.451194};
     Float_t dA2 = 2.8, dC2 = 3.3;
-
+    
     if (online) {
       for (Int_t i = begin; i < end; ++i) {
         Float_t tempAdc = esdV0->GetAdc(i)/factors[runRange][i];
         Float_t tempTime = (i >= 32) ? esdV0->GetTime(i)+dA+timeShift[i]+dA2 : esdV0->GetTime(i)+dC+timeShift[i]+dC2;
-        if (esdV0->GetTime(i) >= 1e-6 &&
-            tempTime > fV0HwWinLow && tempTime < fV0HwWinHigh &&
-            tempAdc > fV0HwAdcThr)
-          return kV0BB;
+        if (esdV0->GetTime(i) >= 1e-6 && tempTime > fV0HwWinLow && tempTime < fV0HwWinHigh && tempAdc > fV0HwAdcThr) return kV0BB;
       }
       return kV0Empty;
     }
@@ -1360,9 +595,7 @@ AliTriggerAnalysis::V0Decision AliTriggerAnalysis::V0Trigger(const AliESDEvent*
         Float_t tempAdc = esdV0->GetAdc(i)/factors[runRange][i];
         Float_t tempTime = (i >= 32) ? esdV0->GetTime(i)+dA : esdV0->GetTime(i)+dC;
         Float_t tempRawTime = (i >= 32) ? esdV0->GetTime(i)+dA+timeShift[i]+dA2 : esdV0->GetTime(i)+dC+timeShift[i]+dC2;
-        if (esdV0->GetTime(i) >= 1e-6 &&
-            tempRawTime < 125.0 &&
-            tempAdc > fV0AdcThr) {
+        if (esdV0->GetTime(i) >= 1e-6 && tempRawTime < 125.0 && tempAdc > fV0AdcThr) {
           weight += 1.0;
           time += tempTime;
         }
@@ -1372,266 +605,191 @@ AliTriggerAnalysis::V0Decision AliTriggerAnalysis::V0Trigger(const AliESDEvent*
   else {
     if (online) {
       for (Int_t i = begin; i < end; ++i) {
-        if (esdV0->GetTime(i) >= 1e-6 &&
-            esdV0->GetTime(i) > fV0HwWinLow && esdV0->GetTime(i) < fV0HwWinHigh &&
-            esdV0->GetAdc(i) > fV0HwAdcThr)
-          return kV0BB;
+        if (esdV0->GetTime(i) >= 1e-6 && esdV0->GetTime(i) > fV0HwWinLow && esdV0->GetTime(i) < fV0HwWinHigh && esdV0->GetAdc(i) > fV0HwAdcThr) return kV0BB;
       }
       return kV0Empty;
     }
     else {
       for (Int_t i = begin; i < end; ++i) {
-       if (esdV0->GetTime(i) > 1e-6 && esdV0->GetAdc(i) > fV0AdcThr) {
-         Float_t correctedTime = V0CorrectLeadingTime(i, esdV0->GetTime(i), esdV0->GetAdc(i),aEsd->GetRunNumber());
-         Float_t timeWeight = V0LeadingTimeWeight(esdV0->GetAdc(i));
-         time += correctedTime*timeWeight;
-            
-         weight += timeWeight;
-       }
+        if (esdV0->GetTime(i) > 1e-6 && esdV0->GetAdc(i) > fV0AdcThr) {
+          Float_t correctedTime = V0CorrectLeadingTime(i, esdV0->GetTime(i), esdV0->GetAdc(i),aEsd->GetRunNumber());
+          Float_t timeWeight = V0LeadingTimeWeight(esdV0->GetAdc(i));
+          time += correctedTime*timeWeight;
+          weight += timeWeight;
+        }
       }
     }
   }
-
-  if (weight > 0) 
-    time /= weight;
+  
+  if (weight > 0) time /= weight;
   time += fV0TimeOffset;
-
-  if (fillHists)
-  {
-    if (side == kASide && fHistV0A)
-      fHistV0A->Fill(time);
-    if (side == kCSide && fHistV0C)
-      fHistV0C->Fill(time);
-  }
   
-  if (side == kASide)
-  {
-    if (time > 68 && time < 100)
-      return kV0BB;
-    if (time > 54 && time < 57.5) 
-      return kV0BG;
-    if (time > 57.5 && time < 68)
-      return kV0Fake;
+  if (fillHists) {
+    if (side == kASide && fHistV0A) fHistV0A->Fill(time);
+    if (side == kCSide && fHistV0C) fHistV0C->Fill(time);
   }
   
-  if (side == kCSide)
-  {
-    if (time > 75.5 && time < 100)
-      return kV0BB;
-    if (time > 69.5 && time < 73)
-      return kV0BG; 
-    if (time > 55 && time < 69.5)
-      return kV0Fake;
+  if (side == kASide) {
+    if (time > 68 && time < 100)  return kV0BB;
+    if (time > 54 && time < 57.5) return kV0BG;
+    if (time > 57.5 && time < 68) return kV0Fake;
+  }
+  if (side == kCSide) {
+    if (time > 75.5 && time < 100) return kV0BB;
+    if (time > 69.5 && time < 73)  return kV0BG; 
+    if (time > 55 && time < 69.5)  return kV0Fake;
   }
   
   return kV0Empty;
 }
 
-Float_t AliTriggerAnalysis::V0CorrectLeadingTime(Int_t i, Float_t time, Float_t adc, Int_t runNumber) const
-{
+
+//-------------------------------------------------------------------------------------------------
+Float_t AliTriggerAnalysis::V0CorrectLeadingTime(Int_t i, Float_t time, Float_t adc, Int_t runNumber) const {
   // Correct for slewing and align the channels
-  //
   // Authors: Cvetan Cheshkov / Raphael Tieulent
-
   if (time == 0) return 0;
 
   // Time alignment
   Float_t timeShift[64] = {0.477957 , 0.0889999 , 0.757669 , 0.205439 , 0.239666 , -0.183705 , 0.442873 , -0.281366 , 0.260976 , 0.788995 , 0.974758 , 0.548532 , 0.495023 , 0.868472 , 0.661167 , 0.358307 , 0.221243 , 0.530179 , 1.26696 , 1.33082 , 1.27086 , 1.77133 , 1.10253 , 0.634806 , 2.14838 , 1.50212 , 1.59253 , 1.66122 , 1.16957 , 1.52056 , 1.47791 , 1.81905 , -1.94123 , -1.29124 , -2.16045 , -1.78939 , -3.11111 , -1.87178 , -1.57671 , -1.70311 , -1.81208 , -1.94475 , -2.53058 , -1.7042 , -2.08109 , -1.84416 , -0.61073 , -1.77145 , 0.16999 , -0.0585339 , 0.00401133 , 0.397726 , 0.851111 , 0.264187 , 0.59573 , -0.158263 , 0.584362 , 1.20835 , 0.927573 , 1.13895 , 0.64648 , 2.18747 , 1.68909 , 0.451194};
-
-  if(runNumber < 106031)
-    time -= timeShift[i];
-
+  
+  if(runNumber < 106031) time -= timeShift[i];
+  
   // Slewing correction
   if (adc == 0) return time;
-
-  Float_t p1 = 1.57345e1;
-  Float_t p2 =-4.25603e-1;
-
+  
+  Double_t p1 = 1.57345e+1;
+  Double_t p2 =-4.25603e-1;
+  
   if(runNumber >= 106031) adc *= (2.5/4.0);
   return (time - p1*TMath::Power(adc,p2));
 }
 
-Float_t AliTriggerAnalysis::V0LeadingTimeWeight(Float_t adc) const
-{
-  if (adc < 1e-6) return 0;
 
+//-------------------------------------------------------------------------------------------------
+Float_t AliTriggerAnalysis::V0LeadingTimeWeight(Float_t adc) const {
+  if (adc < 1e-6) return 0;
+  
   Float_t p1 = 40.211;
   Float_t p2 =-4.25603e-1;
   Float_t p3 = 0.5646;
-
+  
   return 1./(p1*p1*TMath::Power(adc,2.*(p2-1.))+p3*p3);
 }
 
 
-Bool_t AliTriggerAnalysis::ZDCTDCTrigger(const AliESDEvent* aEsd, AliceSide side, Bool_t useZN, Bool_t useZP, Bool_t fillHists) const
-{
+//-------------------------------------------------------------------------------------------------
+Bool_t AliTriggerAnalysis::ZDCTDCTrigger(const AliESDEvent* aEsd, AliceSide side, Bool_t useZN, Bool_t useZP, Bool_t fillHists) const{
   // Returns if ZDC triggered, based on TDC information 
   
   AliESDZDC *esdZDC = aEsd->GetESDZDC();
-
+  
   Bool_t zdcNA = kFALSE;
   Bool_t zdcNC = kFALSE;
   Bool_t zdcPA = kFALSE;
   Bool_t zdcPC = kFALSE;
-
-  if (fMC) {
-        // If it's MC, we use the energy
+  
+  if (fMC) { // If it's MC, we use the energy
     Double_t minEnergy = 0;
-    Double_t  zNCEnergy = esdZDC->GetZDCN1Energy();
-    Double_t  zPCEnergy = esdZDC->GetZDCP1Energy();
-    Double_t  zNAEnergy = esdZDC->GetZDCN2Energy();
-    Double_t  zPAEnergy = esdZDC->GetZDCP2Energy();
-    zdcNA = (zNAEnergy>minEnergy);
-    zdcNC = (zNCEnergy>minEnergy);
-    zdcPA = (zPAEnergy>minEnergy);
-    zdcPC = (zPCEnergy>minEnergy);
-
+    zdcNA = esdZDC->GetZDCN2Energy()>minEnergy;
+    zdcNC = esdZDC->GetZDCN1Energy()>minEnergy;
+    zdcPA = esdZDC->GetZDCP2Energy()>minEnergy;
+    zdcPC = esdZDC->GetZDCP1Energy()>minEnergy;
   }
   else {
-
     Bool_t tdc[32] = {kFALSE};
     for(Int_t itdc=0; itdc<32; itdc++){
-      for(Int_t i=0; i<4; i++){
-       if (esdZDC->GetZDCTDCData(itdc, i) != 0){
-         tdc[itdc] = kTRUE;
-       }
-      }
-      if(fillHists && tdc[itdc]) {
-       fHistTDCZDC->Fill(itdc);
-      }    
+      for(Int_t i=0; i<4; i++) tdc[itdc] |= esdZDC->GetZDCTDCData(itdc, i)!=0;
+      if(fillHists && tdc[itdc]) fHistTDCZDC->Fill(itdc);
     }
     zdcNA = tdc[12];
     zdcNC = tdc[10];
     zdcPA = tdc[13];
     zdcPC = tdc[11];
   }
-
-  if (side == kASide) return ((useZP&&zdcPA) || (useZN&&zdcNA)); 
-  if (side == kCSide) return ((useZP&&zdcPC) || (useZN&&zdcNC)); 
+  
+  if (side == kASide) return ((useZP && zdcPA) || (useZN && zdcNA)); 
+  if (side == kCSide) return ((useZP && zdcPC) || (useZN && zdcNC)); 
   return kFALSE;
 }
 
-Bool_t AliTriggerAnalysis::ZDCTimeTrigger(const AliESDEvent *aEsd, Bool_t fillHists) const
-{
-  // This method implements a selection
-  // based on the timing in both sides of zdcN
-  // It can be used in order to eliminate
-  // parasitic collisions
-  Bool_t zdcAccept = kFALSE;
-  AliESDZDC *esdZDC = aEsd->GetESDZDC();
 
+//-------------------------------------------------------------------------------------------------
+Bool_t AliTriggerAnalysis::ZDCTimeTrigger(const AliESDEvent *aEsd, Bool_t fillHists) const {
+  // This method implements a selection based on the timing in both sides of zdcN
+  // It can be used in order to eliminate parasitic collisions
+  AliESDZDC *esdZDC = aEsd->GetESDZDC();
+  
   if(fMC) {
-     UInt_t esdFlag =  esdZDC->GetESDQuality();
-
-     Bool_t znaFired=kFALSE, zpaFired=kFALSE;
-     Bool_t zem1Fired=kFALSE, zem2Fired=kFALSE;
-     Bool_t zncFired=kFALSE, zpcFired=kFALSE;
-     //
-     // **** Trigger patterns
-     if((esdFlag & 0x00000001) == 0x00000001) znaFired=kTRUE;
-     if((esdFlag & 0x00000002) == 0x00000002) zpaFired=kTRUE;
-     if((esdFlag & 0x00000004) == 0x00000004) zem1Fired=kTRUE;
-     if((esdFlag & 0x00000008) == 0x00000008) zem2Fired=kTRUE;
-     if((esdFlag & 0x00000010) == 0x00000010) zncFired=kTRUE;
-     if((esdFlag & 0x00000020) == 0x00000020) zpcFired=kTRUE;
-     zdcAccept = (znaFired | zncFired);
+    UInt_t esdFlag =  esdZDC->GetESDQuality();
+    Bool_t znaFired  = (esdFlag & 0x01) == 0x01;
+    Bool_t zncFired  = (esdFlag & 0x10) == 0x10;
+    return znaFired | zncFired;
   }
   else {
-    for(Int_t i = 0; i < 4; ++i) {
-      if (esdZDC->GetZDCTDCData(10,i) != 0) {
-       Float_t tdcC = 0.025*(esdZDC->GetZDCTDCData(10,i)-esdZDC->GetZDCTDCData(14,i)); 
-       Float_t tdcCcorr = esdZDC->GetZDCTDCCorrected(10,i); 
-       for(Int_t j = 0; j < 4; ++j) {
-         if (esdZDC->GetZDCTDCData(12,j) != 0) {
-           Float_t tdcA = 0.025*(esdZDC->GetZDCTDCData(12,j)-esdZDC->GetZDCTDCData(14,j));
-
-           Float_t tdcAcorr = esdZDC->GetZDCTDCCorrected(12,j);
-           if(fillHists) {
-             fHistTimeZDC->Fill(tdcC-tdcA,tdcC+tdcA);
-             fHistTimeCorrZDC->Fill(tdcCcorr-tdcAcorr,tdcCcorr+tdcAcorr);
-           }
-           if (esdZDC->TestBit(AliESDZDC::kCorrectedTDCFilled)) {
-             if (((tdcCcorr-tdcAcorr-fZDCCutRefDeltaCorr)*(tdcCcorr-tdcAcorr-fZDCCutRefDeltaCorr)/(fZDCCutSigmaDeltaCorr*fZDCCutSigmaDeltaCorr) +
-                  (tdcCcorr+tdcAcorr-fZDCCutRefSumCorr)*(tdcCcorr+tdcAcorr-fZDCCutRefSumCorr)/(fZDCCutSigmaSumCorr*fZDCCutSigmaSumCorr))< 1.0)
-               zdcAccept = kTRUE;
-           }
-           else {
-             if (((tdcC-tdcA-fZDCCutRefDelta)*(tdcC-tdcA-fZDCCutRefDelta)/(fZDCCutSigmaDelta*fZDCCutSigmaDelta) +
-                  (tdcC+tdcA-fZDCCutRefSum)*(tdcC+tdcA-fZDCCutRefSum)/(fZDCCutSigmaSum*fZDCCutSigmaSum))< 1.0)
-               zdcAccept = kTRUE;
-           }
-         }
-       }
+    for(Int_t i=0;i<4;++i) {
+      if (esdZDC->GetZDCTDCData(10,i)==0) continue;
+      Float_t tdcC = 0.025*(esdZDC->GetZDCTDCData(10,i)-esdZDC->GetZDCTDCData(14,i)); 
+      Float_t tdcCcorr = esdZDC->GetZDCTDCCorrected(10,i); 
+      for(Int_t j=0;j<4;++j) {
+        if (esdZDC->GetZDCTDCData(12,j)==0) continue;
+        Float_t tdcA = 0.025*(esdZDC->GetZDCTDCData(12,j)-esdZDC->GetZDCTDCData(14,j));
+        Float_t tdcAcorr = esdZDC->GetZDCTDCCorrected(12,j);
+        if(fillHists) {
+          fHistTimeZDC->Fill(tdcC-tdcA,tdcC+tdcA);
+          fHistTimeCorrZDC->Fill(tdcCcorr-tdcAcorr,tdcCcorr+tdcAcorr);
+        }
+        if (esdZDC->TestBit(AliESDZDC::kCorrectedTDCFilled)) {
+          if (TMath::Power((tdcCcorr-tdcAcorr-fZDCCutRefDeltaCorr)/fZDCCutSigmaDeltaCorr,2.)+
+              TMath::Power((tdcCcorr+tdcAcorr-fZDCCutRefSumCorr  )/fZDCCutSigmaSumCorr,2.) < 1.) return kTRUE;
+        }
+        else {
+          if (TMath::Power((tdcC-tdcA-fZDCCutRefDelta)/fZDCCutSigmaDelta,2.)+
+              TMath::Power((tdcC+tdcA-fZDCCutRefSum  )/fZDCCutSigmaSum,2.  )<1.0) return kTRUE;
+        }
       }
     }
   }
-  return zdcAccept;
+  return kFALSE;
 }
 
-Bool_t AliTriggerAnalysis::ZDCTimeBGTrigger(const AliESDEvent *aEsd, AliceSide side) const
-{
-  // This method implements a selection
-  // based on the timing in of zdcN
-  // It can be used in order to flag background
-  // ** So far only implemented for the 2012 pA run **
 
+//-------------------------------------------------------------------------------------------------
+Bool_t AliTriggerAnalysis::ZDCTimeBGTrigger(const AliESDEvent *aEsd, AliceSide side) const{
+  // This method implements a selection based on the timing in zdcN
+  // It can be used in order to flag background
   if(fMC) return kFALSE;
-
-  AliESDZDC *zdcData = aEsd->GetESDZDC();
-  Bool_t zna = kFALSE;
-  Bool_t znc = kFALSE;
+  
+  AliESDZDC* zdcData = aEsd->GetESDZDC();
   Bool_t znabadhit = kFALSE;
   Bool_t zncbadhit = kFALSE;
-
-  //  Float_t tdcC=999, tdcA=999;
+  
   Float_t tdcCcorr=999, tdcAcorr=999;
   for(Int_t i = 0; i < 4; ++i) {
-    if (zdcData->GetZDCTDCData(10,i) != 0) {
-      znc = kTRUE;
-      //      tdcC = 0.025*(zdcData->GetZDCTDCData(10,i)-zdcData->GetZDCTDCData(14,i));
-      tdcCcorr = zdcData->GetZDCTDCCorrected(10,i);
-      if((TMath::Abs(tdcCcorr)<fZDCCutZNCTimeCorrMax) && (TMath::Abs(tdcCcorr)>fZDCCutZNCTimeCorrMin)) zncbadhit = kTRUE;
-    }
-  }
-  for(Int_t j = 0; j < 4; ++j) {
-    if (zdcData->GetZDCTDCData(12,j) != 0) {
-      zna = kTRUE;
-      //      tdcA = 0.025*(zdcData->GetZDCTDCData(12,j)-zdcData->GetZDCTDCData(14,j));
-      tdcAcorr = zdcData->GetZDCTDCCorrected(12,j);
-      if((TMath::Abs(tdcAcorr)<fZDCCutZNATimeCorrMax) && (TMath::Abs(tdcAcorr)>fZDCCutZNATimeCorrMin)) znabadhit = kTRUE;
-    }
+    if (zdcData->GetZDCTDCData(10,i)==0) continue;
+    tdcCcorr = TMath::Abs(zdcData->GetZDCTDCCorrected(10,i));
+    if(tdcCcorr<fZDCCutZNCTimeCorrMax && tdcCcorr>fZDCCutZNCTimeCorrMin) zncbadhit = kTRUE;
   }
-
-  const Int_t runNumber = aEsd->GetRunNumber();
-  if(runNumber<188124 || (runNumber>188374 && runNumber<194713)){ // FIXME: end of pA-run is not known
-    AliDebug(3,Form(" ZN BG time cut not implemented for run %d",runNumber));
-    return kFALSE;
+  for(Int_t i = 0; i < 4; ++i) {
+    if (zdcData->GetZDCTDCData(12,i)==0) continue;
+    tdcAcorr = TMath::Abs(zdcData->GetZDCTDCCorrected(12,i));
+    if(tdcAcorr<fZDCCutZNATimeCorrMax && tdcAcorr>fZDCCutZNATimeCorrMin) znabadhit = kTRUE;
   }
+  
+  if (side == kASide) return znabadhit;
+  if (side == kCSide) return zncbadhit;
 
-  Bool_t znabg = (zna && znabadhit);
-  Bool_t zncbg = (znc && zncbadhit);
-
-  // Printf("Checking ZN background (time) for run %d, A = %d, time=%2.2f, C = %d, time=%2.2f",runNumber,(Int_t)zna,tdcAcorr,(Int_t)znc,tdcCcorr);
-  // Printf("Checking ZN background (time) for run %d, A-BG = %d, C-BG = %d",runNumber,(Int_t)znabg,(Int_t)zncbg);
-
-  if (side == kASide) return znabg;
-  if (side == kCSide) return zncbg;
   return kFALSE;
 }
 
-Bool_t AliTriggerAnalysis::ZDCTrigger(const AliESDEvent* aEsd, AliceSide side) const
-{
+
+//-------------------------------------------------------------------------------------------------
+Bool_t AliTriggerAnalysis::ZDCTrigger(const AliESDEvent* aEsd, AliceSide side) const {
   // Returns if ZDC triggered
   
   AliESDZDC* zdcData = aEsd->GetESDZDC();
-  if (!zdcData)
-  {
-    AliError("AliESDZDC not available");
-    return kFALSE;
-  }
-  
   UInt_t quality = zdcData->GetESDQuality();
-  
+
   // from Nora's presentation, general first physics meeting 16.10.09
   static UInt_t zpc  = 0x20;
   static UInt_t znc  = 0x10;
@@ -1640,36 +798,30 @@ Bool_t AliTriggerAnalysis::ZDCTrigger(const AliESDEvent* aEsd, AliceSide side) c
   static UInt_t zpa  = 0x02;
   static UInt_t zna  = 0x01;
   
-  if (side == kASide && ((quality & zpa) || (quality & zna)))
-    return kTRUE;
-  if (side == kCentralBarrel && ((quality & zem1) || (quality & zem2)))
-    return kTRUE;
-  if (side == kCSide && ((quality & zpc) || (quality & znc)))
-    return kTRUE;
+  if (side == kASide         && ((quality & zpa)  || (quality & zna ))) return kTRUE;
+  if (side == kCentralBarrel && ((quality & zem1) || (quality & zem2))) return kTRUE;
+  if (side == kCSide         && ((quality & zpc)  || (quality & znc ))) return kTRUE;
   
   return kFALSE;
 }
 
-Int_t AliTriggerAnalysis::FMDHitCombinations(const AliESDEvent* aEsd, AliceSide side, Bool_t fillHists)
-{
-  // returns number of hit combinations agove threshold
-  //
-  // Authors: FMD team, Hans Dalsgaard (code merged from FMD/AliFMDOfflineTrigger)
-
-  if (!fDoFMD)
-    return -1;
 
+//-------------------------------------------------------------------------------------------------
+Int_t AliTriggerAnalysis::FMDHitCombinations(const AliESDEvent* aEsd, AliceSide side, Bool_t fillHists){
+  // returns number of hit combinations above threshold
+  // Authors: FMD team, Hans Dalsgaard (code merged from FMD/AliFMDOfflineTrigger)
+  if (!fDoFMD) return -1;
+  
   // Workaround for AliESDEvent::GetFMDData is not const!
   const AliESDFMD* fmdData = (const_cast<AliESDEvent*>(aEsd))->GetFMDData();
-  if (!fmdData)
-  {
+  if (!fmdData) {
     AliError("AliESDFMD not available");
     return -1;
   }
-
+  
   Int_t detFrom = (side == kASide) ? 1 : 3;
   Int_t detTo   = (side == kASide) ? 2 : 3;
-
+  
   Int_t triggers = 0;
   Float_t totalMult = 0;
   for (UShort_t det=detFrom;det<=detTo;det++) {
@@ -1682,70 +834,247 @@ Int_t AliTriggerAnalysis::FMDHitCombinations(const AliESDEvent* aEsd, AliceSide
         for (UShort_t strip = 0; strip < nstr; strip++) {
           Float_t mult = fmdData->Multiplicity(det,ring,sec,strip);
           if (mult == AliESDFMD::kInvalidMult) continue;
-          
-          if (fillHists)
-            fHistFMDSingle->Fill(mult);
-          
+          if (fillHists) fHistFMDSingle->Fill(mult);
           if (mult > fFMDLowCut)
             totalMult = totalMult + mult;
-          else
-          {
-            if (totalMult > fFMDHitCut)
-              triggers++;
-              
-            if (fillHists)
-              fHistFMDSum->Fill(totalMult);
-              
+          else {
+            if (totalMult > fFMDHitCut) triggers++;
+            if (fillHists) fHistFMDSum->Fill(totalMult);
             totalMult = 0;
           }
         }
       }
     }
   }
-  
   return triggers;
 }
 
-Bool_t AliTriggerAnalysis::FMDTrigger(const AliESDEvent* aEsd, AliceSide side)
-{
+
+//-------------------------------------------------------------------------------------------------
+Bool_t AliTriggerAnalysis::FMDTrigger(const AliESDEvent* aEsd, AliceSide side){
   // Returns if the FMD triggered
-  //
   // Authors: FMD team, Hans Dalsgaard (code merged from FMD/AliFMDOfflineTrigger)
+  return FMDHitCombinations(aEsd, side, kFALSE);
+}
+
 
-  Int_t triggers = FMDHitCombinations(aEsd, side, kFALSE);
+//-------------------------------------------------------------------------------------------------
+AliTriggerAnalysis::T0Decision AliTriggerAnalysis::T0Trigger(const AliESDEvent* aEsd, Bool_t online, Bool_t fillHists){
+  // Returns the T0 TVDC trigger decision
+  //  
+  // argument 'online' is used as a switch between online and offline trigger algorithms
+  // in online mode return 0TVX 
+  // in offline mode in addition check pile-up and background :
+  // pile-up readed from ESD: check if TVDC (0TVX module name) has more 1 hit;
+  // backgroud flag readed from ESD : check in given time interval OrA and OrC were correct but TVDC not  
+  // 
+  // Based on an algorithm by Alla Maevskaya 
   
-  if (triggers > 0)
-    return kTRUE;
-    
+  const AliESDTZERO* esdT0 = aEsd->GetESDTZERO();
+  if (!esdT0) {
+    AliError("AliESDTZERO not available");
+    return kT0Invalid;
+  }
+
+  Float_t  tvdc0 = esdT0->GetTVDC(0);
+  if(fillHists) fHistT0->Fill(tvdc0);
+  
+  if (online) {
+    if( aEsd->GetHeader()->IsTriggerInputFired("0TVX")) return kT0BB;
+  }
+  else {
+    if (esdT0->GetPileupFlag()) return kT0DecPileup;
+    if (esdT0->GetBackgroundFlag()) return kT0DecBG;
+    if (tvdc0>-5 && tvdc0<5 && tvdc0!=0) return kT0BB; 
+  }
+  
+  if (fMC) if(esdT0->GetT0zVertex()>-12.3 && esdT0->GetT0zVertex() < 10.3) return kT0BB; 
+  return kT0Empty;
+}
+
+//-------------------------------------------------------------------------------------------------
+Bool_t AliTriggerAnalysis::EMCALCellsTrigger(const AliESDEvent *aEsd){
+  //
+  // Returns the EMCAL trigger decision
+  // so far only implemented for LHC11a data
+  // see http://alisoft.cern.ch/viewvc/trunk/PWGGA/EMCALTasks/AliEmcalPhysicsSelection.cxx?view=markup&root=AliRoot Revision 56136
+  //
+  
+  Bool_t isFired = kTRUE;
+  const Int_t runNumber = aEsd->GetRunNumber();
+  
+  /*
+  // Load EMCAL branches from the manager
+  AliAnalysisManager *am = AliAnalysisManager::GetAnalysisManager();
+  am->LoadBranch("EMCALCells.");
+  am->LoadBranch("CaloClusters");
+   */
+  
+  // Get EMCAL cells
+  AliVCaloCells *cells = aEsd->GetEMCALCells();
+  const Short_t nCells = cells->GetNumberOfCells();
+  
+  // count cells above threshold per sm
+  Int_t nCellCount[10] = {0,0,0,0,0,0,0,0,0,0};
+  for(Int_t iCell=0; iCell<nCells; ++iCell) {
+    Short_t cellId = cells->GetCellNumber(iCell);
+    Double_t cellE = cells->GetCellAmplitude(cellId);
+    Int_t sm       = cellId / (24*48);
+    if (cellE>0.1)
+      ++nCellCount[sm];
+  }
+  
+  // Trigger decision for LHC11a
+  Bool_t isLedEvent = kFALSE;
+  if ((runNumber>=144871) && (runNumber<=146860)) {
+    if (nCellCount[4] > 100)
+      isLedEvent = kTRUE;
+    else {
+      if ((runNumber>=146858) && (runNumber<=146860)) {
+        if (nCellCount[3]>=35)
+          isLedEvent = kTRUE;
+      }
+    }
+  }
+  
+  if (isLedEvent) {
+    isFired = kFALSE;
+  }
+  
+  return isFired;
+}
+
+
+//----------------------------------------------------------------------------------------------------
+Bool_t AliTriggerAnalysis::TRDTrigger(const AliESDEvent *esd, Trigger trigger){
+  // evaluate the TRD trigger conditions,
+  // so far HCO, HSE, HQU, HJT, HEE
+  if(trigger!=kTRDHCO && trigger!=kTRDHJT && trigger!=kTRDHSE && trigger!=kTRDHQU && trigger!=kTRDHEE) {
+    AliWarning("Beware you are erroneously trying to use this function (wrong trigger)");
+    return kFALSE;
+  }
+  
+  Int_t nTrdTracks = esd->GetNumberOfTrdTracks();
+  if (nTrdTracks<=0) return kFALSE;
+  if      (trigger==kTRDHCO) return kTRUE;
+  else if (trigger!=kTRDHJT) {
+    for (Int_t iTrack = 0; iTrack < nTrdTracks; ++iTrack) {
+      AliESDTrdTrack *trdTrack = esd->GetTrdTrack(iTrack);
+      if (!trdTrack) continue;
+      // for the electron triggers we only consider matched tracks
+      if(trigger==kTRDHQU) if (TMath::Abs(trdTrack->Pt())>fTRDptHQU && trdTrack->GetPID()>fTRDpidHQU) return kTRUE;
+      if(trigger==kTRDHSE) if (TMath::Abs(trdTrack->Pt())>fTRDptHSE && trdTrack->GetPID()>fTRDpidHSE) return kTRUE; 
+      if(trigger==kTRDHEE) if (TMath::Abs(trdTrack->Pt())>fTRDptHSE && trdTrack->GetPID()>fTRDpidHSE && trdTrack->GetSector()>=fTRDminSectorHEE && trdTrack->GetSector()<=fTRDmaxSectorHEE) return kTRUE;
+    }
+  } 
+  else if (trigger==kTRDHJT) {
+    Int_t nTracks[90] = { 0 }; // stack-wise counted number of tracks above pt threshold
+    for (Int_t iTrack = 0; iTrack < nTrdTracks; ++iTrack) {
+      AliESDTrdTrack *trdTrack = esd->GetTrdTrack(iTrack);    
+      if (!trdTrack) continue;
+      Int_t globalStack = 5*trdTrack->GetSector() + trdTrack->GetStack();
+      // stack-wise counting of tracks above pt threshold for jet trigger
+      if (TMath::Abs(trdTrack->GetPt()) >= fTRDptHJT) ++nTracks[globalStack];
+    }
+    // check if HJT condition is fulfilled in any stack
+    for (Int_t iStack = 0; iStack < 90; iStack++) if (nTracks[iStack] >= fTRDnHJT) return kTRUE;
+  }
   return kFALSE;
 }
 
-Long64_t AliTriggerAnalysis::Merge(TCollection* list)
-{
-  // Merge a list of AliMultiplicityCorrection objects with this (needed for
-  // PROOF).
-  // Returns the number of merged objects (including this).
 
-  if (!list)
-    return 0;
+//-------------------------------------------------------------------------------------------------
+Bool_t AliTriggerAnalysis::EMCALTrigger(const AliVEvent* event, Trigger trigger){
+  AliVCaloTrigger* emcalTrigger = event->GetCaloTrigger("EMCAL");
+  if (!emcalTrigger) return kFALSE;
+  Int_t emcalTriggerBits = 0;
+  emcalTrigger->GetTriggerBits(emcalTriggerBits);
+  if      (trigger==kEmcalL0         ) { return emcalTriggerBits & 1<<0; }
+  else if (trigger==kEmcalL1GammaHigh) { return emcalTriggerBits & 1<<1; }
+  else if (trigger==kEmcalL1GammaLow ) { return emcalTriggerBits & 1<<2; }
+  else if (trigger==kEmcalL1JetHigh  ) { return emcalTriggerBits & 1<<3; }
+  else if (trigger==kEmcalL1JetLow   ) { return emcalTriggerBits & 1<<4; }
+  else {
+    AliWarning("Beware you are erroneously trying to use this function (wrong trigger)");
+    return kFALSE;
+  }
+  return kFALSE;
+}
+
+
+//-------------------------------------------------------------------------------------------------
+Bool_t AliTriggerAnalysis::IsSPDClusterVsTrackletBG(const AliVEvent* event, Bool_t fillHists){
+  // rejects BG based on the cluster vs tracklet correlation
+  // returns true if the event is BG
+  const AliVMultiplicity* mult = event->GetMultiplicity();
+  if (!mult) { AliFatal("No multiplicity object"); }
+  Int_t ntracklet   = mult->GetNumberOfTracklets();
+  Int_t spdClusters = event->GetNumberOfITSClusters(0) + event->GetNumberOfITSClusters(1);
+  if(fillHists) fHistSPDClsVsTrk->Fill(ntracklet,spdClusters);
+  return spdClusters > Float_t(fASPDCvsTCut) + Float_t(ntracklet)*fBSPDCvsTCut;
+}
+
+
+//-------------------------------------------------------------------------------------------------
+Bool_t AliTriggerAnalysis::IsLaserWarmUpTPCEvent(const AliESDEvent* esd){
+  // This function flags noisy TPC events which can happen during laser warm-up.
+  Int_t trackCounter = 0;
+  for (Int_t i=0; i<esd->GetNumberOfTracks(); ++i) {
+    AliESDtrack *track = esd->GetTrack(i);
+    if (!track) continue;
+    if (track->GetTPCNcls() < 30) continue;
+    if (TMath::Abs(track->Eta()) > 0.005) continue;
+    if (track->Pt() < 4) continue;
+    if (track->GetKinkIndex(0) > 0) continue;
+    UInt_t status = track->GetStatus();
+    if ((status&AliESDtrack::kITSrefit)==AliESDtrack::kITSrefit) continue; // explicitly ask for tracks without ITS refit
+    if ((status&AliESDtrack::kTPCrefit)!=AliESDtrack::kTPCrefit) continue;
+    if (track->GetTPCsignal() > 10) continue;          // explicitly ask for tracks without dE/dx
+    trackCounter++;
+  }
+  if (trackCounter > 15) return kTRUE;
+  return kFALSE;
+}
 
-  if (list->IsEmpty())
-    return 1;
 
+//-------------------------------------------------------------------------------------------------
+Bool_t AliTriggerAnalysis::IsHVdipTPCEvent(const AliESDEvent* esd) {
+  // This function flags events in which the TPC chamber HV is not at its nominal value
+  if (fMC) return kFALSE; // there are no dip events in MC
+  if (!esd->IsDetectorOn(AliDAQ::kTPC)) return kTRUE;
+  return kFALSE;
+}
+
+
+//-------------------------------------------------------------------------------------------------
+Bool_t AliTriggerAnalysis::IsIncompleteEvent(const AliESDEvent* esd){
+  // Check whether the event is incomplete 
+  // (due to DAQ-HLT issues, it could be only part of the event was saved)
+  if (fMC) return kFALSE; // there are no incomplete events on MC
+  if ((esd->GetEventType() == 7) &&
+      (esd->GetDAQDetectorPattern() & (1<<4)) &&
+      !(esd->GetDAQAttributes() & (1<<7))) return kTRUE;
+  return kFALSE;
+}
+
+
+//-------------------------------------------------------------------------------------------------
+Long64_t AliTriggerAnalysis::Merge(TCollection* list){
+  // Merge a list of objects with this (needed for PROOF).
+  // Returns the number of merged objects (including this).
+  if (!list) return 0;
+  if (list->IsEmpty()) return 1;
   TIterator* iter = list->MakeIterator();
   TObject* obj;
-
+  
   // collections of all histograms
   const Int_t nHists = 14;
   TList collections[nHists];
-
+  
   Int_t count = 0;
   while ((obj = iter->Next())) {
-
     AliTriggerAnalysis* entry = dynamic_cast<AliTriggerAnalysis*> (obj);
-    if (entry == 0) 
-      continue;
-
+    if (entry == 0) continue;
     Int_t n = 0;
     collections[n++].Add(entry->fHistV0A);
     collections[n++].Add(entry->fHistV0C);
@@ -1761,44 +1090,30 @@ Long64_t AliTriggerAnalysis::Merge(TCollection* list)
     collections[n++].Add(entry->fHistFiredBitsSPD);
     collections[n++].Add(entry->fHistSPDClsVsTrk);
     collections[n++].Add(entry->fHistT0);
-
+    
     // merge fTriggerClasses
     TIterator* iter2 = entry->fTriggerClasses->MakeIterator();
     TObjString* obj2 = 0;
-    while ((obj2 = dynamic_cast<TObjString*> (iter2->Next())))
-    {
+    while ((obj2 = dynamic_cast<TObjString*> (iter2->Next()))) {
       TParameter<Long64_t>* param2 = static_cast<TParameter<Long64_t>*> (entry->fTriggerClasses->GetValue(obj2));
-      
       TParameter<Long64_t>* param1 = dynamic_cast<TParameter<Long64_t>*> (fTriggerClasses->GetValue(obj2));
-      if (param1)
-      {
-        param1->SetVal(param1->GetVal() + param2->GetVal());
-      }
-      else
-      {
+      if (param1) { param1->SetVal(param1->GetVal() + param2->GetVal()); }
+      else {        
         param1 = dynamic_cast<TParameter<Long64_t>*> (param2->Clone());
         fTriggerClasses->Add(new TObjString(obj2->String()), param1);
       }
     }
-    
     delete iter2;
-  
     count++;
   }
-
+  
   Int_t n = 0;
   fHistV0A->Merge(&collections[n++]);
   fHistV0C->Merge(&collections[n++]);
   fHistZDC->Merge(&collections[n++]);
   fHistTDCZDC->Merge(&collections[n++]);
-  if (fHistTimeZDC)
-    fHistTimeZDC->Merge(&collections[n++]);
-  else
-    n++;
-  if (fHistTimeCorrZDC)
-    fHistTimeCorrZDC->Merge(&collections[n++]);
-  else
-    n++;
+  if (fHistTimeZDC)     fHistTimeZDC->Merge(&collections[n++]);     else n++;
+  if (fHistTimeCorrZDC) fHistTimeCorrZDC->Merge(&collections[n++]); else n++;
   fHistFMDA->Merge(&collections[n++]);
   fHistFMDC->Merge(&collections[n++]);
   fHistFMDSingle->Merge(&collections[n++]);
@@ -1808,279 +1123,120 @@ Long64_t AliTriggerAnalysis::Merge(TCollection* list)
   fHistSPDClsVsTrk->Merge(&collections[n++]);
   fHistT0->Merge(&collections[n++]);
   delete iter;
-
   return count+1;
 }
 
-void AliTriggerAnalysis::SaveHistograms() const
-{
-  // write histograms to current directory
+
+//-------------------------------------------------------------------------------------------------
+void AliTriggerAnalysis::FillHistograms(const AliESDEvent* aEsd){
+  // fills the histograms with the info from the ESD
+  
+  fHistBitsSPD->Fill(SPDFiredChips(aEsd, 0), SPDFiredChips(aEsd, 1, kTRUE));
+  
+  V0Trigger(aEsd, kASide, kFALSE, kTRUE);
+  V0Trigger(aEsd, kCSide, kFALSE, kTRUE);
+  T0Trigger(aEsd, kFALSE, kTRUE);
+  ZDCTDCTrigger(aEsd,kASide,kFALSE,kFALSE,kTRUE);
+  ZDCTimeTrigger(aEsd,kTRUE);
+  IsSPDClusterVsTrackletBG(aEsd, kTRUE);
   
-  if (!fHistBitsSPD)
-    return;
+  AliESDZDC* zdcData = aEsd->GetESDZDC();
+  if (zdcData)  {
+    UInt_t quality = zdcData->GetESDQuality();
     
-  if (fHistBitsSPD) {
-    fHistBitsSPD->Write();
-    //fHistBitsSPD->ProjectionX();
-    //fHistBitsSPD->ProjectionY();
+    // from Nora's presentation, general first physics meeting 16.10.09
+    static UInt_t zpc  = 0x20;
+    static UInt_t znc  = 0x10;
+    static UInt_t zem1 = 0x08;
+    static UInt_t zem2 = 0x04;
+    static UInt_t zpa  = 0x02;
+    static UInt_t zna  = 0x01;
+    
+    fHistZDC->Fill(1, (quality & zna)  ? 1 : 0);
+    fHistZDC->Fill(2, (quality & zpa)  ? 1 : 0);
+    fHistZDC->Fill(3, (quality & zem2) ? 1 : 0);
+    fHistZDC->Fill(4, (quality & zem1) ? 1 : 0);
+    fHistZDC->Fill(5, (quality & znc)  ? 1 : 0);
+    fHistZDC->Fill(6, (quality & zpc)  ? 1 : 0);
   }
-  else Printf("Cannot save fHistBitsSPD");
+  else {
+    fHistZDC->Fill(-1);
+    AliError("AliESDZDC not available");
+  }
+  
+  if (fDoFMD) {
+    fHistFMDA->Fill(FMDHitCombinations(aEsd, kASide, kTRUE));
+    fHistFMDC->Fill(FMDHitCombinations(aEsd, kCSide, kTRUE));
+  }
+}
+
+
+//-------------------------------------------------------------------------------------------------
+void AliTriggerAnalysis::SaveHistograms() const {
+  // write histograms to current directory
+  if (fHistBitsSPD)      fHistBitsSPD->Write();
   if (fHistFiredBitsSPD) fHistFiredBitsSPD->Write();
-  else Printf("Cannot save fHistFiredBitsSPD");
-  if (fHistV0A) fHistV0A->Write();
-  else Printf("Cannot save fHistV0A");
-  if (fHistV0C) fHistV0C->Write();
-  else Printf("Cannot save fHistV0C");
-  if (fHistZDC) fHistZDC->Write();
-  else Printf("Cannot save fHistZDC");
-  if (fHistTDCZDC) fHistTDCZDC->Write();
-  else Printf("Cannot save fHistTDCZDC");
-  if (fHistTimeZDC) fHistTimeZDC->Write();
-  else Printf("Cannot save fHistTimeZDC");
-  if (fHistTimeCorrZDC) fHistTimeCorrZDC->Write();
-  else Printf("Cannot save fHistTimeCorrZDC");
-  if (fHistFMDA) fHistFMDA->Write();
-  else Printf("Cannot save fHistFMDA");
-  if (fHistFMDC) fHistFMDC->Write();
-  else Printf("Cannot save fHistFMDC");
-  if (fHistFMDSingle) fHistFMDSingle->Write();
-  else Printf("Cannot save fHistFMDSingle");
-  if (fHistFMDSum) fHistFMDSum->Write();
-  else Printf("Cannot save fHistFMDSum");
+  if (fHistV0A)          fHistV0A->Write();
+  if (fHistV0C)          fHistV0C->Write();
+  if (fHistZDC)          fHistZDC->Write();
+  if (fHistTDCZDC)       fHistTDCZDC->Write();
+  if (fHistTimeZDC)      fHistTimeZDC->Write();
+  if (fHistTimeCorrZDC)  fHistTimeCorrZDC->Write();
+  if (fHistFMDA)         fHistFMDA->Write();
+  if (fHistFMDC)         fHistFMDC->Write();
+  if (fHistFMDSingle)    fHistFMDSingle->Write();
+  if (fHistFMDSum)       fHistFMDSum->Write();
   if (fSPDGFOEfficiency) fSPDGFOEfficiency->Write("fSPDGFOEfficiency");
-  if (fHistSPDClsVsTrk) fHistSPDClsVsTrk->Write("fHistSPDClsVsTrk");
-  if (fHistT0) fHistT0->Write("fHistT0");
-
-  //  else Printf("Cannot save fSPDGFOEfficiency");
-  
+  if (fHistSPDClsVsTrk)  fHistSPDClsVsTrk->Write("fHistSPDClsVsTrk");
+  if (fHistT0)           fHistT0->Write("fHistT0");
   fTriggerClasses->Write("fTriggerClasses", TObject::kSingleKey);
 }
 
-void AliTriggerAnalysis::PrintTriggerClasses() const
-{
+
+//-------------------------------------------------------------------------------------------------
+void AliTriggerAnalysis::FillTriggerClasses(const AliESDEvent* aEsd){
+  // fills trigger classes map
+  TParameter<Long64_t>* count = dynamic_cast<TParameter<Long64_t>*> (fTriggerClasses->GetValue(aEsd->GetFiredTriggerClasses().Data()));
+  if (!count) {
+    count = new TParameter<Long64_t>(aEsd->GetFiredTriggerClasses(), 0);
+    fTriggerClasses->Add(new TObjString(aEsd->GetFiredTriggerClasses().Data()), count);
+  }
+  count->SetVal(count->GetVal() + 1);
+}
+
+
+//-------------------------------------------------------------------------------------------------
+void AliTriggerAnalysis::PrintTriggerClasses() const {
   // print trigger classes
   
   Printf("Trigger Classes:");
-  
   Printf("Event count for trigger combinations:");
-  
   TMap singleTrigger;
   singleTrigger.SetOwner();
-  
   TIterator* iter = fTriggerClasses->MakeIterator();
   TObjString* obj = 0;
-  while ((obj = dynamic_cast<TObjString*> (iter->Next())))
-  {
+  while ((obj = dynamic_cast<TObjString*> (iter->Next()))) {
     TParameter<Long64_t>* param = static_cast<TParameter<Long64_t>*> (fTriggerClasses->GetValue(obj));
-    
     Printf(" %s: %ld triggers", obj->String().Data(), (Long_t)param->GetVal());
-    
     TObjArray* tokens = obj->String().Tokenize(" ");
-    for (Int_t i=0; i<tokens->GetEntries(); i++)
-    {
+    for (Int_t i=0; i<tokens->GetEntries(); i++) {
       TParameter<Long64_t>* count = dynamic_cast<TParameter<Long64_t>*> (singleTrigger.GetValue(((TObjString*) tokens->At(i))->String().Data()));
-      if (!count)
-      {
+      if (!count) {
         count = new TParameter<Long64_t>(((TObjString*) tokens->At(i))->String().Data(), 0);
         singleTrigger.Add(new TObjString(((TObjString*) tokens->At(i))->String().Data()), count);
       }
       count->SetVal(count->GetVal() + param->GetVal());
     }
-    
     delete tokens;
   }
   delete iter;
   
   Printf("Event count for single trigger:");
-  
   iter = singleTrigger.MakeIterator();
-  while ((obj = dynamic_cast<TObjString*> (iter->Next())))
-  {
+  while ((obj = dynamic_cast<TObjString*> (iter->Next()))) {
     TParameter<Long64_t>* param = static_cast<TParameter<Long64_t>*> (singleTrigger.GetValue(obj));
-    
     Printf("  %s: %ld triggers", obj->String().Data(), (Long_t)param->GetVal());
   }
   delete iter;
-  
   singleTrigger.DeleteAll();
 }
-
-
-//----------------------------------------------------------------------------------------------------
-AliTriggerAnalysis::T0Decision AliTriggerAnalysis::T0Trigger(const AliESDEvent* aEsd, Bool_t online, Bool_t fillHists) 
-{
-  // Returns the T0 TVDC trigger decision
-  //  
-  // argument 'online' is used as a switch between online and offline trigger algorithms
-  // in online mode return 0TVX 
-  // in offline mode in addition check pile-up and background :
-  // pile-up readed from ESD: check if TVDC (0TVX module name) has more 1 hit;
-  // backgroud flag readed from ESD : check in given time interval OrA and OrC were correct but TVDC not  
-  // 
-  // Based on an algorithm by Alla Maevskaya 
-
-  const AliESDTZERO* esdT0 = aEsd->GetESDTZERO();
-  if (!esdT0)
-  {
-    AliError("AliESDTZERO not available");
-    return kT0Invalid;
-  }
-  //????  AliDebug(2,Form("In T0Trigger: %f %f",esdV0->GetV0ATime(),esdV0->GetV0CTime()));
-  Float_t  tvdc[5] ;
-  for (Int_t ii=0; ii<5; ii++)
-    tvdc[ii] = esdT0->GetTVDC(ii);
-  //  Int_t trig=esdT0->GetT0Trig();
-  //  cout<<" T0 trig "<<trig<<endl;   
-
-  if(fillHists) fHistT0->Fill(tvdc[0]);
-    
-  if (online) {
-    if(aEsd->GetHeader()->GetFiredTriggerInputs().Contains("0TVX") ) return kT0BB;
-  }
-  else {
-  
-    if (esdT0->GetPileupFlag()) return kT0DecPileup;
-    if (esdT0->GetBackgroundFlag()) return kT0DecBG;
-    if (tvdc[0]>-5 && tvdc[0]<5 && tvdc[0] != 0) return kT0BB; 
-  }
-
-  if (fMC)
-    if( esdT0->GetT0zVertex()>-12.3 && esdT0->GetT0zVertex() < 10.3) return kT0BB; 
-  return kT0Empty;
-}
-
-//----------------------------------------------------------------------------------------------------
-Bool_t AliTriggerAnalysis::EMCALCellsTrigger(const AliESDEvent *aEsd)
-{
-  //
-  // Returns the EMCAL trigger decision
-  // so far only implemented for LHC11a data
-  // see http://alisoft.cern.ch/viewvc/trunk/PWGGA/EMCALTasks/AliEmcalPhysicsSelection.cxx?view=markup&root=AliRoot Revision 56136
-  //
-
-  Bool_t isFired = kTRUE;
-  const Int_t runNumber = aEsd->GetRunNumber();
-
-  /*
-  // Load EMCAL branches from the manager
-  AliAnalysisManager *am = AliAnalysisManager::GetAnalysisManager();
-  am->LoadBranch("EMCALCells.");
-  am->LoadBranch("CaloClusters");
-  */
-
-  // Get EMCAL cells
-  AliVCaloCells *cells = aEsd->GetEMCALCells();
-  const Short_t nCells = cells->GetNumberOfCells();
-
-  // count cells above threshold per sm
-  Int_t nCellCount[10] = {0,0,0,0,0,0,0,0,0,0};
-  for(Int_t iCell=0; iCell<nCells; ++iCell) {
-    Short_t cellId = cells->GetCellNumber(iCell);
-    Double_t cellE = cells->GetCellAmplitude(cellId);
-    Int_t sm       = cellId / (24*48);
-    if (cellE>0.1)
-      ++nCellCount[sm];
-  }
-
-  // Trigger decision for LHC11a
-  Bool_t isLedEvent = kFALSE;
-  if ((runNumber>=144871) && (runNumber<=146860)) {
-    if (nCellCount[4] > 100)
-      isLedEvent = kTRUE;
-    else {
-      if ((runNumber>=146858) && (runNumber<=146860)) {
-       if (nCellCount[3]>=35)
-         isLedEvent = kTRUE;
-      }
-    }
-  }
-  
-  if (isLedEvent) {
-    isFired = kFALSE;
-  }
-
-  return isFired;
-}
-
-//__________________________________________________________________________________________
-Bool_t AliTriggerAnalysis::TRDTrigger(const AliESDEvent *esd, Trigger trigger)
-{
-  // evaluate the TRD trigger conditions,
-  // so far HCO, HSE, HQU, HJT, HEE
-
-  Bool_t isFired = kFALSE;
-
-  if(trigger!=kTRDHCO && trigger!=kTRDHJT && trigger!=kTRDHSE && trigger!=kTRDHQU && trigger!=kTRDHEE) {
-    AliWarning("Beware you are erroneously trying to use this function (wrong trigger)");
-    return isFired;
-  }
-
-  if (!esd) {
-    AliErrorClass("ESD event pointer is null");
-    return isFired;
-  }
-  
-  Int_t nTrdTracks = esd->GetNumberOfTrdTracks();
-  
-  if (nTrdTracks > 0 && (trigger==kTRDHCO) ) { 
-    isFired = kTRUE;
-    return isFired;
-  }
-
-  if(trigger!=kTRDHJT) {
-    for (Int_t iTrack = 0; iTrack < nTrdTracks; ++iTrack) {
-      
-      AliESDTrdTrack *trdTrack = esd->GetTrdTrack(iTrack);   
-      if (!trdTrack) continue;
-
-      // for the electron triggers we only consider matched tracks
-      if(trigger==kTRDHQU)
-       if ( (TMath::Abs(trdTrack->Pt()) > fTRDptHQU) && (trdTrack->GetPID() > fTRDpidHQU) ) { 
-         isFired = kTRUE;
-         return isFired;
-       }
-
-      if(trigger==kTRDHSE)
-       if ( (TMath::Abs(trdTrack->Pt()) > fTRDptHSE) && (trdTrack->GetPID() > fTRDpidHSE) ) { 
-         isFired = kTRUE;
-         return isFired;
-       }
-      
-      if(trigger==kTRDHEE)
-       if ( (trdTrack->GetSector() >= fTRDminSectorHEE) && (trdTrack->GetSector() <= fTRDmaxSectorHEE) &&
-            (TMath::Abs(trdTrack->Pt()) > fTRDptHSE) && (trdTrack->GetPID() > fTRDpidHSE) ) { 
-         isFired = kTRUE;
-         return isFired;
-       }
-
-    }
-  } else if(trigger==kTRDHJT) {
-
-    Int_t nTracks[90] = { 0 }; // stack-wise counted number of tracks above pt threshold
-
-    for (Int_t iTrack = 0; iTrack < nTrdTracks; ++iTrack) {
-      
-      AliESDTrdTrack *trdTrack = esd->GetTrdTrack(iTrack);    
-      if (!trdTrack) continue;
-      
-      Int_t globalStack = 5*trdTrack->GetSector() + trdTrack->GetStack();
-      
-      // stack-wise counting of tracks above pt threshold for jet trigger
-      if (TMath::Abs(trdTrack->GetPt()) >= fTRDptHJT) {
-       ++nTracks[globalStack];
-      }
-    }
-
-    // check if HJT condition is fulfilled in any stack
-    for (Int_t iStack = 0; iStack < 90; iStack++) {
-      if (nTracks[iStack] >= fTRDnHJT) {
-       isFired = kTRUE;
-       break;
-      }
-    }
-
-  }
-
-  return isFired;
-}
index 85dc2d2..e68ffda 100644 (file)
@@ -15,6 +15,7 @@
 //   Origin: Jan Fiete Grosse-Oetringhaus, CERN
 //-------------------------------------------------------------------------
 
+class AliVEvent;
 class AliESDEvent;
 class AliESDtrackCuts;
 class TH1F;
@@ -22,184 +23,169 @@ class TH2F;
 class TCollection;
 class TMap;
 
-class AliTriggerAnalysis : public TObject
-{
-  public:
-    enum Trigger { kAcceptAll = 1, kMB1 = 2, kMB2, kMB3, kSPDGFO, kSPDGFOBits, kV0A, kV0C, kV0OR, kV0AND, 
-                  kV0ABG, kV0CBG, kZDC, kZDCA, kZDCC, kZNA, kZNC, kZNABG, kZNCBG, kFMDA, kFMDC, kFPANY, kNSD1, kMB1Prime, 
-                  kSPDGFOL0, kSPDGFOL1, kZDCTDCA, kZDCTDCC, kZDCTime, kCTPV0A, kCTPV0C, kTPCLaserWarmUp, kSPDClsVsTrkBG,
-                  kCentral,kSemiCentral, kT0, kT0BG, kT0Pileup, kEMCAL,kTPCHVdip,
-                  kTRDHCO, kTRDHJT, kTRDHSE, kTRDHQU, kTRDHEE,
-                  kIncompleteEvent,
-                  kStartOfFlags = 0x0100, kOfflineFlag = 0x8000, kOneParticle = 0x10000, kOneTrack = 0x20000}; // MB1, MB2, MB3 definition from ALICE-INT-2005-025
-    enum AliceSide { kASide = 1, kCSide, kCentralBarrel };
-    enum V0Decision { kV0Invalid = -1, kV0Empty = 0, kV0BB, kV0BG, kV0Fake };
-    enum T0Decision { kT0Invalid = -1, kT0Empty = 0, kT0BB, kT0DecBG, kT0DecPileup };
-    
-    AliTriggerAnalysis();
-    virtual ~AliTriggerAnalysis();
-    
-    void EnableHistograms(Bool_t isLowFlux = kFALSE);
-    void SetAnalyzeMC(Bool_t flag = kTRUE) { fMC = flag; }
-    
-    Bool_t IsTriggerFired(const AliESDEvent* aEsd, Trigger trigger);
-    Int_t EvaluateTrigger(const AliESDEvent* aEsd, Trigger trigger);
-    
-    // using trigger bits in ESD
-    Bool_t IsTriggerBitFired(const AliESDEvent* aEsd, Trigger trigger) const;
-    Bool_t IsTriggerBitFired(ULong64_t triggerMask, Trigger trigger) const;
-    Bool_t IsTriggerBitFired(const AliESDEvent* aEsd, ULong64_t tclass) const;
-    
-    // using ESD data from detectors
-    Bool_t IsOfflineTriggerFired(const AliESDEvent* aEsd, Trigger trigger);
-
-    // using trigger classes in ESD
-    Bool_t IsTriggerClassFired(const AliESDEvent* aEsd, const Char_t* tclass) const;
-    
-    // some "raw" trigger functions
-    Int_t SPDFiredChips(const AliESDEvent* aEsd, Int_t origin, Bool_t fillHists = kFALSE, Int_t layer = 0);
-    Bool_t SPDGFOTrigger(const AliESDEvent* aEsd, Int_t origin);
-    Bool_t IsSPDClusterVsTrackletBG(const AliESDEvent* esd, Bool_t fillHists = kFALSE);
-    V0Decision V0Trigger(const AliESDEvent* aEsd, AliceSide side, Bool_t online, Bool_t fillHists = kFALSE);
-    T0Decision T0Trigger(const AliESDEvent* aEsd, Bool_t online, Bool_t fillHists = kFALSE);
-    Bool_t ZDCTrigger   (const AliESDEvent* aEsd, AliceSide side) const;
-    Bool_t ZDCTDCTrigger(const AliESDEvent* aEsd, AliceSide side, Bool_t useZN=kTRUE, Bool_t useZP=kFALSE, Bool_t fillHists=kFALSE) const;
-    Bool_t ZDCTimeTrigger(const AliESDEvent *aEsd, Bool_t fillHists=kFALSE) const;
-    Bool_t ZDCTimeBGTrigger(const AliESDEvent *aEsd, AliceSide side) const;
-    Bool_t FMDTrigger(const AliESDEvent* aEsd, AliceSide side);
-    Int_t SSDClusters(const AliESDEvent* aEsd);
-    Bool_t EMCALCellsTrigger(const AliESDEvent *aEsd);
-    static const char* GetTriggerName(Trigger trigger);
-    
-    Bool_t IsLaserWarmUpTPCEvent(const AliESDEvent* esd);
-    Bool_t IsHVdipTPCEvent(const AliESDEvent* esd);
-    Bool_t TRDTrigger(const AliESDEvent* esd, Trigger trigger);
-
-    Bool_t IsIncompleteEvent(const AliESDEvent* esd);
-    
-    void FillHistograms(const AliESDEvent* aEsd);
-    void FillTriggerClasses(const AliESDEvent* aEsd);
-    
-    void SetSPDGFOThreshhold(Int_t t) { fSPDGFOThreshold = t; }
-    void SetSPDGFOEfficiency(TH1F* hist) { fSPDGFOEfficiency = hist; }
-    void SetSPDClustersVsTrackletsParameters(Float_t a, Float_t b) { fASPDCvsTCut = a; fBSPDCvsTCut =b;}
-    void SetV0TimeOffset(Float_t offset) { fV0TimeOffset = offset; }
-    void SetV0AdcThr(Float_t thr) { fV0AdcThr = thr; }
-    void SetV0HwPars(Float_t thr, Float_t winLow, Float_t winHigh) { fV0HwAdcThr = thr; fV0HwWinLow = winLow; fV0HwWinHigh = winHigh; }
-    void SetFMDThreshold(Float_t low, Float_t hit) { fFMDLowCut = low; fFMDHitCut = hit; }
-    void SetDoFMD(Bool_t flag = kTRUE) {fDoFMD = flag;}
-    void SetZDCCutParams(Float_t refSum, Float_t refDelta, Float_t sigmaSum, Float_t sigmaDelta) { fZDCCutRefSum = refSum; fZDCCutRefDelta = refDelta; fZDCCutSigmaSum = sigmaSum; fZDCCutSigmaDelta = sigmaDelta; }
-    void SetCorrZDCCutParams(Float_t refSum, Float_t refDelta, Float_t sigmaSum, Float_t sigmaDelta) { fZDCCutRefSumCorr = refSum; fZDCCutRefDeltaCorr = refDelta; fZDCCutSigmaSumCorr = sigmaSum; fZDCCutSigmaDeltaCorr = sigmaDelta; }
-    void SetZNCorrCutParams(Float_t znaTimeCorrMin, Float_t znaTimeCorrMax, Float_t zncTimeCorrMin, Float_t zncTimeCorrMax)
-    { fZDCCutZNATimeCorrMin = znaTimeCorrMin; fZDCCutZNATimeCorrMax = znaTimeCorrMax; 
-      fZDCCutZNCTimeCorrMin = zncTimeCorrMin; fZDCCutZNCTimeCorrMax = zncTimeCorrMax; }
-
-    void SetTRDTriggerParameters(Float_t ptHSE, UChar_t pidHSE, Float_t ptHQU, UChar_t pidHQU, Float_t ptHEE, UChar_t pidHEE, UChar_t minSectorHEE, UChar_t maxSectorHEE, Float_t ptHJT, UChar_t nHJT) {
-      fTRDptHSE = ptHSE; fTRDpidHSE = pidHSE;
-      fTRDptHQU = ptHQU; fTRDpidHQU = pidHQU;
-      fTRDptHEE = ptHEE; fTRDpidHEE = pidHEE;
-      fTRDminSectorHEE = minSectorHEE; fTRDmaxSectorHEE = maxSectorHEE;
-      fTRDptHJT = ptHJT; fTRDnHJT = nHJT;
-    }
-
-    Int_t GetSPDGFOThreshhold() const { return fSPDGFOThreshold; }
-    Float_t GetV0TimeOffset() const { return fV0TimeOffset; }
-    Float_t GetV0AdcThr()     const { return fV0AdcThr; }
-    Float_t GetFMDLowThreshold() const { return fFMDLowCut; }
-    Float_t GetFMDHitThreshold() const { return fFMDHitCut; }
-    TMap * GetTriggerClasses() const { return fTriggerClasses;}
-
-
-    virtual Long64_t Merge(TCollection* list);
-    void SaveHistograms() const;
-    
-    void PrintTriggerClasses() const;
-    void SetESDTrackCuts(AliESDtrackCuts* cuts) { fEsdTrackCuts = cuts;}
-    AliESDtrackCuts* GetESDTrackCuts() const  {return fEsdTrackCuts;}
-
-    void SetTPCOnly(Bool_t bTPCOnly) {fTPCOnly = bTPCOnly;}
-    Bool_t GetTPCOnly() const {return fTPCOnly;}
-
-  protected:
-    Bool_t IsL0InputFired(const AliESDEvent* aEsd, UInt_t input) const;
-    Bool_t IsL1InputFired(const AliESDEvent* aEsd, UInt_t input) const;
-    Bool_t IsL2InputFired(const AliESDEvent* aEsd, UInt_t input) const;
-    Bool_t IsInputFired(const AliESDEvent* aEsd, Char_t level, UInt_t input) const;
-    
-    Float_t V0CorrectLeadingTime(Int_t i, Float_t time, Float_t adc, Int_t runNumber) const;
-    Float_t V0LeadingTimeWeight(Float_t adc) const;
-    
-    Int_t FMDHitCombinations(const AliESDEvent* aEsd, AliceSide side, Bool_t fillHists = kFALSE);
-
-    Int_t fSPDGFOThreshold;         // number of chips to accept a SPD GF0 trigger
-    TH1F* fSPDGFOEfficiency;         // SPD FASTOR efficiency - is applied in SPDFiredChips. Histogram contains efficiency as function of chip number (bin 1..400: first layer; 401..1200: second layer)
-    
-    Float_t fV0TimeOffset;          // time offset applied to the times read from the V0 (in ns)
-    Float_t fV0AdcThr;              // thresholds applied on V0 ADC data
-    Float_t fV0HwAdcThr;            // online V0 trigger - thresholds applied on ADC data 
-    Float_t fV0HwWinLow;            // online V0 trigger - lower edge of time window
-    Float_t fV0HwWinHigh;           // online V0 trigger - upper edge of time window
-    
-    Float_t fZDCCutRefSum;          // ZDC time cut configuration
-    Float_t fZDCCutRefDelta;        // ZDC time cut configuration
-    Float_t fZDCCutSigmaSum;        // ZDC time cut configuration
-    Float_t fZDCCutSigmaDelta;      // ZDC time cut configuration
-
-    Float_t fZDCCutRefSumCorr;      // Corrected ZDC time cut configuration
-    Float_t fZDCCutRefDeltaCorr;    // Corrected ZDC time cut configuration
-    Float_t fZDCCutSigmaSumCorr;    // Corrected ZDC time cut configuration
-    Float_t fZDCCutSigmaDeltaCorr;  // Corrected ZDC time cut configuration
-
-    Float_t fZDCCutZNATimeCorrMin;  // Corrected ZNA time cut configuration
-    Float_t fZDCCutZNATimeCorrMax;  // Corrected ZNA time cut configuration
-    Float_t fZDCCutZNCTimeCorrMin;  // Corrected ZNA time cut configuration
-    Float_t fZDCCutZNCTimeCorrMax;  // Corrected ZNA time cut configuration
-
-    Float_t fASPDCvsTCut; // constant for the linear cut in SPD clusters vs tracklets
-    Float_t fBSPDCvsTCut; // slope for the linear cut in SPD  clusters vs tracklets
-
-    // Variables for the TRD triggers
-    Float_t fTRDptHSE;         // pt threshold for HSE trigger
-    UChar_t fTRDpidHSE;                // PID threshold for HSE trigger
-    Float_t fTRDptHQU;         // pt threshold for HQU trigger
-    UChar_t fTRDpidHQU;                // PID threshold for HQU trigger
-    Float_t fTRDptHEE;         // pt threshold for HEE trigger
-    UChar_t fTRDpidHEE;                // PID threshold for HEE trigger
-    UChar_t fTRDminSectorHEE;  // min sector for HEE trigger
-    UChar_t fTRDmaxSectorHEE;  // max sector for HEE trigger
-    Float_t fTRDptHJT;         // pt threshold for HJT trigger
-    UChar_t fTRDnHJT;          // no of track threshold for HJT trigger
-
-    Bool_t  fDoFMD;                 // If false, skips the FMD (physics selection runs much faster)
-    Float_t fFMDLowCut;                    // 
-    Float_t fFMDHitCut;                    // 
-    
-    TH2F* fHistBitsSPD;        // offline trigger bits (calculated from clusters) vs hardware trigger bits
-    TH1F* fHistFiredBitsSPD;   // fired hardware bits
-    TH2F* fHistSPDClsVsTrk;    // histogram of clusters vs tracklet BG cut
-    TH1F* fHistV0A;            // histograms that histogram the criterion the cut is applied on: bb triggers
-    TH1F* fHistV0C;            // histograms that histogram the criterion the cut is applied on: bb triggers
-    TH1F* fHistZDC;            //histograms that histogram the criterion the cut is applied on: fired bits (6 bins)
-    TH1F* fHistTDCZDC;         // histograms that histogram the criterion the cut is applied on: TDC bits (32 bins)
-    TH2F* fHistTimeZDC;        // histograms that histogram the criterion the cut is applied on: ZDC TDC timing
-    TH2F* fHistTimeCorrZDC;    // histograms that histogram the criterion the cut is applied on: ZDC Corrected TDC timing
-    TH1F* fHistFMDA;           // histograms that histogram the criterion the cut is applied on: number of hit combination above threshold
-    TH1F* fHistFMDC;           // histograms that histogram the criterion the cut is applied on: number of hit combination above threshold
-    TH1F* fHistFMDSingle;      // histograms that histogram the criterion the cut is applied on: single mult value (more than one entry per event)
-    TH1F* fHistFMDSum;         // histograms that histogram the criterion the cut is applied on: summed mult value (more than one entry per event)
-    TH1F* fHistT0;             // histograms that histogram the criterion the cut is applied on: bb triggers
-    TMap* fTriggerClasses;    // counts the active trigger classes (uses the full string)
-    
-    Bool_t fMC;              // flag if MC is analyzed
-    AliESDtrackCuts* fEsdTrackCuts;  //Track Cuts to select ESD tracks
-
-    Bool_t fTPCOnly;         // flag to set whether TPC only tracks have to be used for the offline trigger 
-
-    ClassDef(AliTriggerAnalysis, 22)
-    
-  private:
-    AliTriggerAnalysis(const AliTriggerAnalysis&);
-    AliTriggerAnalysis& operator=(const AliTriggerAnalysis&);
+class AliTriggerAnalysis : public TObject{
+public:
+  enum Trigger { kAcceptAll = 1, kMB1 = 2, kMB2, kMB3, kSPDGFO, kSPDGFOBits, kV0A, kV0C, kV0OR, kV0AND, 
+    kV0ABG, kV0CBG, kZDC, kZDCA, kZDCC, kZNA, kZNC, kZNABG, kZNCBG, kFMDA, kFMDC, kFPANY, kNSD1, kMB1Prime, 
+    kSPDGFOL0, kSPDGFOL1, kZDCTDCA, kZDCTDCC, kZDCTime, kCTPV0A, kCTPV0C, kTPCLaserWarmUp, kSPDClsVsTrkBG,
+    kCentral,kSemiCentral, kT0, kT0BG, kT0Pileup, kEMCAL, kTPCHVdip,
+    kTRDHCO, kTRDHJT, kTRDHSE, kTRDHQU, kTRDHEE,
+    kEmcalL0,kEmcalL1GammaHigh, kEmcalL1GammaLow, kEmcalL1JetHigh, kEmcalL1JetLow,
+    kIncompleteEvent,
+    kStartOfFlags = 0x0100, kOfflineFlag = 0x8000, kOneParticle = 0x10000, kOneTrack = 0x20000}; // MB1, MB2, MB3 definition from ALICE-INT-2005-025
+  enum AliceSide { kASide = 1, kCSide, kCentralBarrel };
+  enum V0Decision { kV0Invalid = -1, kV0Empty = 0, kV0BB, kV0BG, kV0Fake };
+  enum T0Decision { kT0Invalid = -1, kT0Empty = 0, kT0BB, kT0DecBG, kT0DecPileup };
+  static const char* GetTriggerName(Trigger trigger);
+
+  AliTriggerAnalysis();
+  virtual ~AliTriggerAnalysis();
+  void EnableHistograms(Bool_t isLowFlux = kFALSE);
+  void SetAnalyzeMC(Bool_t flag = kTRUE) { fMC = flag; }
+  
+  Bool_t IsTriggerFired(const AliESDEvent* aEsd, Trigger trigger);
+  Int_t EvaluateTrigger(const AliESDEvent* aEsd, Trigger trigger);
+  Bool_t IsTriggerBitFired(const AliESDEvent* aEsd, Trigger trigger) const; // obsolete
+  Bool_t IsTriggerBitFired(const AliESDEvent* aEsd, ULong64_t tclass) const;
+  Bool_t IsOfflineTriggerFired(const AliESDEvent* aEsd, Trigger trigger);
+  
+  // some "raw" trigger functions
+  V0Decision V0Trigger(const AliESDEvent* aEsd, AliceSide side, Bool_t online, Bool_t fillHists = kFALSE);
+  T0Decision T0Trigger(const AliESDEvent* aEsd, Bool_t online, Bool_t fillHists = kFALSE);
+  Bool_t SPDGFOTrigger(const AliESDEvent* aEsd, Int_t origin) { return SPDFiredChips(aEsd, origin) >= fSPDGFOThreshold; }
+  Bool_t ZDCTrigger   (const AliESDEvent* aEsd, AliceSide side) const;
+  Bool_t ZDCTDCTrigger(const AliESDEvent* aEsd, AliceSide side, Bool_t useZN=kTRUE, Bool_t useZP=kFALSE, Bool_t fillHists=kFALSE) const;
+  Bool_t ZDCTimeTrigger(const AliESDEvent *aEsd, Bool_t fillHists=kFALSE) const;
+  Bool_t ZDCTimeBGTrigger(const AliESDEvent *aEsd, AliceSide side) const;
+  Bool_t FMDTrigger(const AliESDEvent* aEsd, AliceSide side);
+  Bool_t TRDTrigger(const AliESDEvent* esd, Trigger trigger);
+  Bool_t EMCALCellsTrigger(const AliESDEvent *aEsd);
+  Bool_t EMCALTrigger(const AliVEvent* event, Trigger trigger);
+
+  Int_t SSDClusters(const AliVEvent* event);
+  Int_t SPDFiredChips(const AliESDEvent* aEsd, Int_t origin, Bool_t fillHists = kFALSE, Int_t layer = 0);
+  Bool_t IsSPDClusterVsTrackletBG(const AliVEvent* event, Bool_t fillHists = kFALSE);
+  Bool_t IsLaserWarmUpTPCEvent(const AliESDEvent* esd);
+  Bool_t IsHVdipTPCEvent(const AliESDEvent* esd);
+  Bool_t IsIncompleteEvent(const AliESDEvent* esd);
+  
+  void FillHistograms(const AliESDEvent* aEsd);
+  void FillTriggerClasses(const AliESDEvent* aEsd);
+  
+  void SetSPDGFOThreshhold(Int_t t) { fSPDGFOThreshold = t; }
+  void SetSPDGFOEfficiency(TH1F* hist) { fSPDGFOEfficiency = hist; }
+  void SetSPDClustersVsTrackletsParameters(Float_t a, Float_t b) { fASPDCvsTCut = a; fBSPDCvsTCut =b;}
+  void SetV0TimeOffset(Float_t offset) { fV0TimeOffset = offset; }
+  void SetV0AdcThr(Float_t thr) { fV0AdcThr = thr; }
+  void SetV0HwPars(Float_t thr, Float_t winLow, Float_t winHigh) { fV0HwAdcThr = thr; fV0HwWinLow = winLow; fV0HwWinHigh = winHigh; }
+  void SetFMDThreshold(Float_t low, Float_t hit) { fFMDLowCut = low; fFMDHitCut = hit; }
+  void SetDoFMD(Bool_t flag = kTRUE) {fDoFMD = flag;}
+  void SetZDCCutParams(Float_t refSum, Float_t refDelta, Float_t sigmaSum, Float_t sigmaDelta) { fZDCCutRefSum = refSum; fZDCCutRefDelta = refDelta; fZDCCutSigmaSum = sigmaSum; fZDCCutSigmaDelta = sigmaDelta; }
+  void SetCorrZDCCutParams(Float_t refSum, Float_t refDelta, Float_t sigmaSum, Float_t sigmaDelta) { fZDCCutRefSumCorr = refSum; fZDCCutRefDeltaCorr = refDelta; fZDCCutSigmaSumCorr = sigmaSum; fZDCCutSigmaDeltaCorr = sigmaDelta; }
+  void SetZNCorrCutParams(Float_t znaTimeCorrMin, Float_t znaTimeCorrMax, Float_t zncTimeCorrMin, Float_t zncTimeCorrMax)
+  { fZDCCutZNATimeCorrMin = znaTimeCorrMin; fZDCCutZNATimeCorrMax = znaTimeCorrMax; 
+  fZDCCutZNCTimeCorrMin = zncTimeCorrMin; fZDCCutZNCTimeCorrMax = zncTimeCorrMax; }
+  
+  void SetTRDTriggerParameters(Float_t ptHSE, UChar_t pidHSE, Float_t ptHQU, UChar_t pidHQU, Float_t ptHEE, UChar_t pidHEE, UChar_t minSectorHEE, UChar_t maxSectorHEE, Float_t ptHJT, UChar_t nHJT) {
+    fTRDptHSE = ptHSE; fTRDpidHSE = pidHSE;
+    fTRDptHQU = ptHQU; fTRDpidHQU = pidHQU;
+    fTRDptHEE = ptHEE; fTRDpidHEE = pidHEE;
+    fTRDminSectorHEE = minSectorHEE; fTRDmaxSectorHEE = maxSectorHEE;
+    fTRDptHJT = ptHJT; fTRDnHJT = nHJT;
+  }
+  
+  Int_t GetSPDGFOThreshhold() const { return fSPDGFOThreshold; }
+  Float_t GetV0TimeOffset() const { return fV0TimeOffset; }
+  Float_t GetV0AdcThr()     const { return fV0AdcThr; }
+  Float_t GetFMDLowThreshold() const { return fFMDLowCut; }
+  Float_t GetFMDHitThreshold() const { return fFMDHitCut; }
+  TMap * GetTriggerClasses() const { return fTriggerClasses;}
+  
+  
+  virtual Long64_t Merge(TCollection* list);
+  void SaveHistograms() const;
+  
+  void PrintTriggerClasses() const;
+  void SetESDTrackCuts(AliESDtrackCuts* cuts) { fEsdTrackCuts = cuts;}
+  AliESDtrackCuts* GetESDTrackCuts() const  {return fEsdTrackCuts;}
+  
+  void SetTPCOnly(Bool_t bTPCOnly) {fTPCOnly = bTPCOnly;}
+  Bool_t GetTPCOnly() const {return fTPCOnly;}
+  
+protected:
+  Float_t V0CorrectLeadingTime(Int_t i, Float_t time, Float_t adc, Int_t runNumber) const;
+  Float_t V0LeadingTimeWeight(Float_t adc) const;
+  Int_t FMDHitCombinations(const AliESDEvent* aEsd, AliceSide side, Bool_t fillHists = kFALSE);
+  
+  Int_t fSPDGFOThreshold;         // number of chips to accept a SPD GF0 trigger
+  TH1F* fSPDGFOEfficiency;         // SPD FASTOR efficiency - is applied in SPDFiredChips. Histogram contains efficiency as function of chip number (bin 1..400: first layer; 401..1200: second layer)
+  
+  Float_t fV0TimeOffset;          // time offset applied to the times read from the V0 (in ns)
+  Float_t fV0AdcThr;              // thresholds applied on V0 ADC data
+  Float_t fV0HwAdcThr;            // online V0 trigger - thresholds applied on ADC data 
+  Float_t fV0HwWinLow;            // online V0 trigger - lower edge of time window
+  Float_t fV0HwWinHigh;           // online V0 trigger - upper edge of time window
+  
+  Float_t fZDCCutRefSum;          // ZDC time cut configuration
+  Float_t fZDCCutRefDelta;        // ZDC time cut configuration
+  Float_t fZDCCutSigmaSum;        // ZDC time cut configuration
+  Float_t fZDCCutSigmaDelta;      // ZDC time cut configuration
+  
+  Float_t fZDCCutRefSumCorr;      // Corrected ZDC time cut configuration
+  Float_t fZDCCutRefDeltaCorr;    // Corrected ZDC time cut configuration
+  Float_t fZDCCutSigmaSumCorr;    // Corrected ZDC time cut configuration
+  Float_t fZDCCutSigmaDeltaCorr;  // Corrected ZDC time cut configuration
+  
+  Float_t fZDCCutZNATimeCorrMin;  // Corrected ZNA time cut configuration
+  Float_t fZDCCutZNATimeCorrMax;  // Corrected ZNA time cut configuration
+  Float_t fZDCCutZNCTimeCorrMin;  // Corrected ZNA time cut configuration
+  Float_t fZDCCutZNCTimeCorrMax;  // Corrected ZNA time cut configuration
+  
+  Float_t fASPDCvsTCut; // constant for the linear cut in SPD clusters vs tracklets
+  Float_t fBSPDCvsTCut; // slope for the linear cut in SPD  clusters vs tracklets
+  
+  // Variables for the TRD triggers
+  Float_t fTRDptHSE;            // pt threshold for HSE trigger
+  UChar_t fTRDpidHSE;           // PID threshold for HSE trigger
+  Float_t fTRDptHQU;            // pt threshold for HQU trigger
+  UChar_t fTRDpidHQU;           // PID threshold for HQU trigger
+  Float_t fTRDptHEE;            // pt threshold for HEE trigger
+  UChar_t fTRDpidHEE;           // PID threshold for HEE trigger
+  UChar_t fTRDminSectorHEE;     // min sector for HEE trigger
+  UChar_t fTRDmaxSectorHEE;     // max sector for HEE trigger
+  Float_t fTRDptHJT;            // pt threshold for HJT trigger
+  UChar_t fTRDnHJT;             // no of track threshold for HJT trigger
+  
+  Bool_t  fDoFMD;               // If false, skips the FMD (physics selection runs much faster)
+  Float_t fFMDLowCut;           // 
+  Float_t fFMDHitCut;           // 
+  
+  TH2F* fHistBitsSPD;        // offline trigger bits (calculated from clusters) vs hardware trigger bits
+  TH1F* fHistFiredBitsSPD;   // fired hardware bits
+  TH2F* fHistSPDClsVsTrk;    // histogram of clusters vs tracklet BG cut
+  TH1F* fHistV0A;            // histograms that histogram the criterion the cut is applied on: bb triggers
+  TH1F* fHistV0C;            // histograms that histogram the criterion the cut is applied on: bb triggers
+  TH1F* fHistZDC;            //histograms that histogram the criterion the cut is applied on: fired bits (6 bins)
+  TH1F* fHistTDCZDC;         // histograms that histogram the criterion the cut is applied on: TDC bits (32 bins)
+  TH2F* fHistTimeZDC;        // histograms that histogram the criterion the cut is applied on: ZDC TDC timing
+  TH2F* fHistTimeCorrZDC;    // histograms that histogram the criterion the cut is applied on: ZDC Corrected TDC timing
+  TH1F* fHistFMDA;           // histograms that histogram the criterion the cut is applied on: number of hit combination above threshold
+  TH1F* fHistFMDC;           // histograms that histogram the criterion the cut is applied on: number of hit combination above threshold
+  TH1F* fHistFMDSingle;      // histograms that histogram the criterion the cut is applied on: single mult value (more than one entry per event)
+  TH1F* fHistFMDSum;         // histograms that histogram the criterion the cut is applied on: summed mult value (more than one entry per event)
+  TH1F* fHistT0;             // histograms that histogram the criterion the cut is applied on: bb triggers
+  TMap* fTriggerClasses;    // counts the active trigger classes (uses the full string)
+  
+  Bool_t fMC;              // flag if MC is analyzed
+  AliESDtrackCuts* fEsdTrackCuts;  //Track Cuts to select ESD tracks
+  
+  Bool_t fTPCOnly;         // flag to set whether TPC only tracks have to be used for the offline trigger 
+  
+  ClassDef(AliTriggerAnalysis, 23)
+  
+private:
+  AliTriggerAnalysis(const AliTriggerAnalysis&);
+  AliTriggerAnalysis& operator=(const AliTriggerAnalysis&);
 };
 
 #endif