]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - ANALYSIS/AliPhysicsSelection.cxx
Coverity fix.
[u/mrichter/AliRoot.git] / ANALYSIS / AliPhysicsSelection.cxx
index f03fd1dd597d67461a98e5de890295a2cc1e6b5d..f779c60302503078e2aeaef67137809410674250 100644 (file)
@@ -92,6 +92,8 @@
 // to be present:
 //   AddBGTriggerClass("+CSMBA-ABCE-NOPF-ALL -CSMBB-ABCE-NOPF-ALL");
 //
+// The class also supports the triggers used in heavy ion runs
+//
 //   Origin: Jan Fiete Grosse-Oetringhaus, CERN 
 //           Michele Floris, CERN
 //-------------------------------------------------------------------------
@@ -129,16 +131,18 @@ AliPhysicsSelection::AliPhysicsSelection() :
   fSkipTriggerClassSelection(0),
   fUsingCustomClasses(0),
   fSkipV0(0),
-  fBIFactorA(1),
-  fBIFactorC(1),
-  fBIFactorAC(1), 
+  fSkipZDCTime(0),
+  fBIFactorA(-1),
+  fBIFactorC(-1),
+  fBIFactorAC(-1), 
   fComputeBG(0),
   fBGStatOffset(0),
   fUseBXNumbers(1),
   fUseMuonTriggers(0),
   fFillingScheme(""),
   fBin0CallBack(""),
-  fBin0CallBackPointer(0)
+  fBin0CallBackPointer(0),
+  fIsPP(kFALSE)
 {
   // constructor
   
@@ -187,18 +191,20 @@ AliPhysicsSelection::~AliPhysicsSelection()
   }  
 }
 
-UInt_t AliPhysicsSelection::CheckTriggerClass(const AliESDEvent* aEsd, const char* trigger) const
+UInt_t AliPhysicsSelection::CheckTriggerClass(const AliESDEvent* aEsd, const char* trigger, Int_t& triggerLogic) const
 {
   // checks if the given trigger class(es) are found for the current event
-  // format of trigger: +TRIGGER1 -TRIGGER2 [#XXX] [&YY]
-  //   requires TRIGGER1 and rejects TRIGGER2
+  // format of trigger: +TRIGGER1,TRIGGER1b,TRIGGER1c -TRIGGER2 [#XXX] [&YY] [*ZZ]
+  //   requires one out of TRIGGER1,TRIGGER1b,TRIGGER1c and rejects TRIGGER2
   //   in bunch crossing XXX
   //   if successful, YY is returned (for association between entry in fCollTrigClasses and AliVEvent::EOfflineTriggerTypes)
+  //   triggerLogic is filled with ZZ, defaults to kCINT1
   
   Bool_t foundBCRequirement = kFALSE;
   Bool_t foundCorrectBC = kFALSE;
   
   UInt_t returnCode = AliVEvent::kUserDefined;
+  triggerLogic = kCINT1;
   
   TString str(trigger);
   TObjArray* tokens = str.Tokenize(" ");
@@ -213,15 +219,29 @@ UInt_t AliPhysicsSelection::CheckTriggerClass(const AliESDEvent* aEsd, const cha
       
       str2.Remove(0, 1);
       
-      if (flag && !aEsd->IsTriggerClassFired(str2))
+      TObjArray* tokens2 = str2.Tokenize(",");
+      
+      Bool_t foundTriggerClass = kFALSE;
+      for (Int_t j=0; j < tokens2->GetEntries(); j++)
       {
-        AliDebug(AliLog::kDebug, Form("Rejecting event because trigger class %s is not present", str2.Data()));
-        delete tokens;
-        return kFALSE;
+        TString str3(((TObjString*) tokens2->At(j))->String());
+        
+        if (flag && aEsd->IsTriggerClassFired(str3))
+          foundTriggerClass = kTRUE;
+        if (!flag && aEsd->IsTriggerClassFired(str3))
+        {
+          AliDebug(AliLog::kDebug, Form("Rejecting event because trigger class %s is present", str3.Data()));
+          delete tokens2;
+          delete tokens;
+          return kFALSE;
+        }
       }
-      if (!flag && aEsd->IsTriggerClassFired(str2))
+      
+      delete tokens2;
+      
+      if (!foundTriggerClass)
       {
-        AliDebug(AliLog::kDebug, Form("Rejecting event because trigger class %s is present", str2.Data()));
+        AliDebug(AliLog::kDebug, Form("Rejecting event because (none of the) trigger class(es) %s is present", str2.Data()));
         delete tokens;
         return kFALSE;
       }
@@ -247,6 +267,12 @@ UInt_t AliPhysicsSelection::CheckTriggerClass(const AliESDEvent* aEsd, const cha
       
       returnCode = str2.Atoll();
     }
+    else if (str2[0] == '*')
+    {
+      str2.Remove(0, 1);
+      
+      triggerLogic = str2.Atoi();
+    }
     else
       AliFatal(Form("Invalid trigger syntax: %s", trigger));
   }
@@ -277,9 +303,21 @@ UInt_t AliPhysicsSelection::IsCollisionCandidate(const AliESDEvent* aEsd)
   // checks if the given event is a collision candidate
   //
   // returns a bit word describing the fired offline triggers (see AliVEvent::EOfflineTriggerTypes)
-  
+  AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
+  if (!mgr) {
+    AliError("Cannot get the analysis manager");
+    return 0;
+  } 
+  mgr->LoadBranch("AliESDHeader.");
+  mgr->LoadBranch("AliESDRun.");
+  mgr->LoadBranch("AliMultiplicity.");
+  mgr->LoadBranch("AliESDFMD.");
+  mgr->LoadBranch("AliESDVZERO.");
+  mgr->LoadBranch("AliESDZDC.");
+  mgr->LoadBranch("SPDVertex.");
+  mgr->LoadBranch("PrimaryVertex.");
   if (fCurrentRun != aEsd->GetRunNumber()) {
-    if (!Initialize(aEsd->GetRunNumber()))
+    if (!Initialize(aEsd))
       AliFatal(Form("Could not initialize for run %d", aEsd->GetRunNumber()));
     if(fComputeBG) SetBIFactors(aEsd); // is this safe here?
   }
@@ -319,37 +357,31 @@ UInt_t AliPhysicsSelection::IsCollisionCandidate(const AliESDEvent* aEsd)
   
     triggerAnalysis->FillTriggerClasses(aEsd);
     
-    UInt_t singleTriggerResult = CheckTriggerClass(aEsd, triggerClass);
+    Int_t triggerLogic = 0; 
+    UInt_t singleTriggerResult = CheckTriggerClass(aEsd, triggerClass, triggerLogic);
+    
     if (singleTriggerResult)
     {
       triggerAnalysis->FillHistograms(aEsd);
   
       Bool_t isBin0 = kFALSE;
       if (fBin0CallBack != "") {
-       AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
-       if (!mgr) {
-         AliError("Cannot get the analysis manager");
-       }  
-       else {
          isBin0 = ((AliAnalysisTaskSE*)mgr->GetTask(fBin0CallBack.Data()))->IsEventInBinZero();
-       }
       } else if (fBin0CallBackPointer) {
          isBin0 = (*fBin0CallBackPointer)(aEsd);
-       
       }
       
-
-      
-      // hardware trigger (should only remove events for MC)
-      // replay CINT1B hardware trigger
-      // TODO this has to depend on the actual hardware trigger (and that depends on the run...)
+      // hardware trigger
       Int_t fastORHW = triggerAnalysis->SPDFiredChips(aEsd, 1); // SPD number of chips from trigger bits (!)
-      Bool_t v0A       = fSkipV0 ? 0 :triggerAnalysis->IsOfflineTriggerFired(aEsd, AliTriggerAnalysis::kV0A);
-      Bool_t v0C       = fSkipV0 ? 0 :triggerAnalysis->IsOfflineTriggerFired(aEsd, AliTriggerAnalysis::kV0C);
+      Int_t fastORHWL1 = triggerAnalysis->SPDFiredChips(aEsd, 1, kFALSE, 2); // SPD number of chips from trigger bits in second layer (!)
       Bool_t v0AHW     = fSkipV0 ? 0 :(triggerAnalysis->V0Trigger(aEsd, AliTriggerAnalysis::kASide, kTRUE) == AliTriggerAnalysis::kV0BB);// should replay hw trigger
       Bool_t v0CHW     = fSkipV0 ? 0 :(triggerAnalysis->V0Trigger(aEsd, AliTriggerAnalysis::kCSide, kTRUE) == AliTriggerAnalysis::kV0BB);// should replay hw trigger
+      
       // offline trigger
       Int_t fastOROffline = triggerAnalysis->SPDFiredChips(aEsd, 0); // SPD number of chips from clusters (!)
+      Int_t fastOROfflineL1 = triggerAnalysis->SPDFiredChips(aEsd, 0, kFALSE, 2); // SPD number of chips from clusters in second layer (!)
+      Bool_t v0A       = fSkipV0 ? 0 :triggerAnalysis->IsOfflineTriggerFired(aEsd, AliTriggerAnalysis::kV0A);
+      Bool_t v0C       = fSkipV0 ? 0 :triggerAnalysis->IsOfflineTriggerFired(aEsd, AliTriggerAnalysis::kV0C);
       Bool_t v0ABG = fSkipV0 ? 0 :triggerAnalysis->IsOfflineTriggerFired(aEsd, AliTriggerAnalysis::kV0ABG);
       Bool_t v0CBG = fSkipV0 ? 0 :triggerAnalysis->IsOfflineTriggerFired(aEsd, AliTriggerAnalysis::kV0CBG);
       Bool_t v0BG = v0ABG || v0CBG;
@@ -360,7 +392,14 @@ UInt_t AliPhysicsSelection::IsCollisionCandidate(const AliESDEvent* aEsd)
       Bool_t fmd  = fmdA || fmdC;
     
       // SSD
-      Int_t ssdClusters = triggerAnalysis->SSDClusters(aEsd);
+      //Int_t ssdClusters = triggerAnalysis->SSDClusters(aEsd);
+      
+      // ZDC
+      // Bool_t zdcA = triggerAnalysis->IsOfflineTriggerFired(aEsd, AliTriggerAnalysis::kZDCA);
+      // Bool_t zdcC = triggerAnalysis->IsOfflineTriggerFired(aEsd, AliTriggerAnalysis::kZDCC);
+      Bool_t zdcA    = triggerAnalysis->ZDCTDCTrigger (aEsd, AliTriggerAnalysis::kASide);
+      Bool_t zdcC    = triggerAnalysis->ZDCTDCTrigger (aEsd, AliTriggerAnalysis::kCSide);
+      Bool_t zdcTime = triggerAnalysis->ZDCTimeTrigger(aEsd);
 
       // Some "macros"
       Bool_t mb1 = (fastOROffline > 0 || v0A || v0C) && (!v0BG);
@@ -371,14 +410,25 @@ UInt_t AliPhysicsSelection::IsCollisionCandidate(const AliESDEvent* aEsd)
       if (fBackgroundIdentification)
         bgID = ! fBackgroundIdentification->IsSelected(const_cast<AliESDEvent*> (aEsd));
       
-      Int_t ntrig = fastOROffline; // any 2 hits
+      /*Int_t ntrig = fastOROffline; // any 2 hits
       if(v0A)              ntrig += 1;
       if(v0C)              ntrig += 1; //v0C alone is enough
       if(fmd)              ntrig += 1;
-      if(ssdClusters>1)    ntrig += 1;
-
+      if(ssdClusters>1)    ntrig += 1;*/
 
-      Bool_t hwTrig = fastORHW > 0 || v0AHW || v0CHW;
+      // replay hardware trigger (should only remove events for MC)
+      
+      Bool_t hwTrig = kFALSE;
+      switch (triggerLogic)
+      {
+        case kCINT1:  hwTrig = fastORHW > 0 || v0AHW || v0CHW; break;
+        case kCMBS2A: hwTrig = fastORHWL1 > 1 && v0AHW; break;
+        case kCMBS2C: hwTrig = fastORHWL1 > 1 && v0CHW; break;
+        case kCMBAC:  hwTrig = v0AHW && v0CHW; break;
+        case kCMBACS2: hwTrig = fastORHWL1 > 1 && v0AHW && v0CHW; break;
+        case kHighMultL1: hwTrig = fastORHW >= 100; break;
+        default: AliFatal(Form("Undefined trigger logic %d", triggerLogic)); break;
+      }
 
       // Fill trigger pattern histo
       Int_t tpatt = 0;
@@ -393,8 +443,7 @@ UInt_t AliPhysicsSelection::IsCollisionCandidate(const AliESDEvent* aEsd)
        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 (!hwTrig)
@@ -423,50 +472,71 @@ UInt_t AliPhysicsSelection::IsCollisionCandidate(const AliESDEvent* aEsd)
        if (fmd)
          fHistStatistics[iHistStat]->Fill(kStatFMD, i);
 
-       if(ssdClusters>1)
-         fHistStatistics[iHistStat]->Fill(kStatSSD1, i);
-
-       if(ntrig >= 2 && !v0BG) 
-         fHistStatistics[iHistStat]->Fill(kStatAny2Hits, 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 (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);
+       // We reject the event if the ZDC timing cut is not respected
+       if (zdcTime)
+         fHistStatistics[iHistStat]->Fill(kStatZDCTime, i);
+        else if (!fIsPP && !fSkipZDCTime) 
+         continue;
        //       if (fastOROffline > 1 && !v0BG)
        //         fHistStatistics[iHistStat]->Fill(kStatFO2NoBG, i);
             
-       if (fastOROffline > 0 && (v0A || v0C) && !v0BG)
-         fHistStatistics[iHistStat]->Fill(kStatFO1AndV0, i);
+       //if (fastOROffline > 0 && (v0A || v0C) && !v0BG)
+       //  fHistStatistics[iHistStat]->Fill(kStatFO1AndV0, i);
   
-       if (v0A && v0C && !v0BG && !bgID)
+       if (v0A && v0C && !v0BG && (!bgID && fIsPP))
          fHistStatistics[iHistStat]->Fill(kStatV0, i);
 
+        Bool_t offlineAccepted = kFALSE;
+        
+        switch (triggerLogic)
+        {
+          case kCINT1:  offlineAccepted = mb1; break;
+          case kCMBS2A: offlineAccepted = fastOROfflineL1 > 1 && v0A; break;
+          case kCMBS2C: offlineAccepted = fastOROfflineL1 > 1 && v0C; break;
+          case kCMBAC:  offlineAccepted = v0A && v0C; break;
+          case kCMBACS2: offlineAccepted = fastOROfflineL1 > 1 && v0A && v0C; break;
+          case kHighMultL1: offlineAccepted = fastOROffline >= 100; break;
+          default: AliFatal(Form("Undefined trigger logic %d", triggerLogic)); break;
+        }
 
-       if ( mb1 )
-       
+       if ( offlineAccepted )
          {
            if (!v0BG || fSkipV0)
              {
                if (!v0BG) fHistStatistics[iHistStat]->Fill(kStatOffline, i);
       
-               if (fBackgroundIdentification && bgID)
+               if (fBackgroundIdentification && bgID && fIsPP)
                  {
                    AliDebug(AliLog::kDebug, "Rejecting event because of background identification");
                    fHistStatistics[iHistStat]->Fill(kStatBG, i);
                  }
                else
                  {
-                   AliDebug(AliLog::kDebug, "Accepted event for histograms");
+                   AliDebug(AliLog::kDebug, Form("Accepted event for histograms with trigger logic %d", triggerLogic));
             
                    fHistStatistics[iHistStat]->Fill(kStatAccepted, i);
-                   if(iHistStat == kStatIdxAll) fHistBunchCrossing->Fill(aEsd->GetBunchCrossNumber(), i); // Fill only for all (avoid double counting)
+                   // 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)
                  }
@@ -475,7 +545,7 @@ UInt_t AliPhysicsSelection::IsCollisionCandidate(const AliESDEvent* aEsd)
              AliDebug(AliLog::kDebug, "Rejecting event because of V0 BG flag");
          }
        else
-         AliDebug(AliLog::kDebug, "Rejecting event because trigger condition is not fulfilled");
+         AliDebug(AliLog::kDebug, Form("Rejecting event because trigger logic %d is not fulfilled", triggerLogic));
       }
     }
   }
@@ -504,7 +574,13 @@ Int_t AliPhysicsSelection::GetTriggerScheme(UInt_t runNumber) const
       return 2;
   }
   
-  // default: CINT1 suite
+  if (runNumber >= 136849 && runNumber < 138125) // HI old scheme
+    return 2;
+
+  if (runNumber >= 139328 && runNumber <= 139517) // late HI run 2010 (no TRD wake up)
+    return 3;
+  
+  // defaults
   return 1;
 }  
 
@@ -622,7 +698,8 @@ const char * AliPhysicsSelection::GetBXIDs(UInt_t runNumber, const char * trigge
    //   else AliError(Form("Unknown trigger: %s", trigger));
 
   }
-  else if (runNumber >= 117220 && runNumber <= 119163) {
+  else if ((runNumber >= 117220 && runNumber <= 118555) || (runNumber >= 118784 && runNumber <= 119163)) 
+  {
     //    return "Single_2b_1_1_1";
     if      (!strcmp("CINT1B-ABCE-NOPF-ALL",trigger)) return "   #346 ";
     else if (!strcmp("CINT1A-ABCE-NOPF-ALL",trigger)) return "   #2131 ";
@@ -630,6 +707,15 @@ const char * AliPhysicsSelection::GetBXIDs(UInt_t runNumber, const char * trigge
     else if (!strcmp("CINT1-E-NOPF-ALL",trigger)) return " #1238 ";
     //    else AliError(Form("Unknown trigger: %s", trigger));                                             
   }
+  else if (runNumber >= 118556 && runNumber <= 118783) {
+    //    return "Single_2b_1_1_1"; 
+    // same as previous but was misaligned by 1 BX in fill 1069
+    if      (!strcmp("CINT1B-ABCE-NOPF-ALL",trigger)) return "   #345 ";
+    else if (!strcmp("CINT1A-ABCE-NOPF-ALL",trigger)) return "   #2130 ";
+    else if (!strcmp("CINT1C-ABCE-NOPF-ALL",trigger)) return "   #3018 ";
+    else if (!strcmp("CINT1-E-NOPF-ALL",trigger)) return " #1238 ";
+    //    else AliError(Form("Unknown trigger: %s", trigger));                                             
+  }
   else if (runNumber >= 119837 && runNumber <= 119862) {
     //    return "Single_4b_2_2_2";
     if      (!strcmp("CINT1B-ABCE-NOPF-ALL",trigger)) return "   #669  #3019 ";
@@ -683,8 +769,20 @@ const char * AliPhysicsSelection::GetBXIDs(UInt_t runNumber, const char * trigge
 
   return "";
 }
-    
-Bool_t AliPhysicsSelection::Initialize(Int_t runNumber)
+
+Bool_t AliPhysicsSelection::Initialize(const AliESDEvent* aEsd)
+{
+  // initializes the object for the given ESD
+  
+  AliInfo(Form("Initializing for beam type: %s", aEsd->GetESDRun()->GetBeamType()));
+  fIsPP = kTRUE;
+  if (strcmp(aEsd->GetESDRun()->GetBeamType(), "Pb-Pb") == 0)
+    fIsPP = kFALSE;
+
+  return Initialize(aEsd->GetRunNumber(), fIsPP);
+}
+
+Bool_t AliPhysicsSelection::Initialize(Int_t runNumber, Bool_t pp)
 {
   // initializes the object for the given run
   // TODO having the run number here and parameters hardcoded is clearly temporary, a way needs to be found to have a CDB-like configuration also for analysis
@@ -724,57 +822,133 @@ Bool_t AliPhysicsSelection::Initialize(Int_t runNumber)
     if (fUsingCustomClasses) {
       AliInfo("Using user-provided trigger classes");
     } else {
-      switch (triggerScheme)
+      if (pp)
       {
-      case 0:
-        fCollTrigClasses.Add(new TObjString(Form("&%u", (UInt_t) AliVEvent::kMB)));
-        break;
-        
-      case 1:
-       // trigger classes used before August 2010
-        fCollTrigClasses.Add(new TObjString(Form("%s%s &%u","+CINT1B-ABCE-NOPF-ALL",  GetBXIDs(runNumber,"CINT1B-ABCE-NOPF-ALL"), (UInt_t) AliVEvent::kMB)));
-        fBGTrigClasses.Add  (new TObjString(Form("%s%s &%u","+CINT1A-ABCE-NOPF-ALL",  GetBXIDs(runNumber,"CINT1A-ABCE-NOPF-ALL"), (UInt_t) AliVEvent::kMB)));
-        fBGTrigClasses.Add  (new TObjString(Form("%s%s &%u","+CINT1C-ABCE-NOPF-ALL",  GetBXIDs(runNumber,"CINT1C-ABCE-NOPF-ALL"), (UInt_t) AliVEvent::kMB)));
-        fBGTrigClasses.Add  (new TObjString(Form("%s%s &%u","+CINT1-E-NOPF-ALL",      GetBXIDs(runNumber,"CINT1-E-NOPF-ALL"), (UInt_t) AliVEvent::kMB)));
-
-        // Muon trigger have the same BXIDs of the corresponding CINT triggers
-        fCollTrigClasses.Add(new TObjString(Form("%s%s &%u","+CMUS1B-ABCE-NOPF-MUON",  GetBXIDs(runNumber,"CINT1B-ABCE-NOPF-ALL"), (UInt_t) AliVEvent::kMUON)));
-        fBGTrigClasses.Add  (new TObjString(Form("%s%s &%u","+CMUS1A-ABCE-NOPF-MUON",  GetBXIDs(runNumber,"CINT1A-ABCE-NOPF-ALL"), (UInt_t) AliVEvent::kMUON)));
-        fBGTrigClasses.Add  (new TObjString(Form("%s%s &%u","+CMUS1C-ABCE-NOPF-MUON",  GetBXIDs(runNumber,"CINT1C-ABCE-NOPF-ALL"), (UInt_t) AliVEvent::kMUON)));
-        fBGTrigClasses.Add  (new TObjString(Form("%s%s &%u","+CMUS1-E-NOPF-MUON"    ,  GetBXIDs(runNumber,"CINT1-E-NOPF-ALL"), (UInt_t) AliVEvent::kMUON)));
-        
-        // triggers classes used from August 2010
-        // MB
-        fCollTrigClasses.Add(new TObjString(Form("%s%s &%u", "+CINT1-B-NOPF-ALLNOTRD" , GetBXIDs(runNumber, "B"),  (UInt_t) AliVEvent::kMB)));
-        fBGTrigClasses.Add  (new TObjString(Form("%s%s &%u", "+CINT1-AC-NOPF-ALLNOTRD", GetBXIDs(runNumber, "AC"), (UInt_t) AliVEvent::kMB)));
-        fBGTrigClasses.Add  (new TObjString(Form("%s%s &%u", "+CINT1-E-NOPF-ALLNOTRD" , GetBXIDs(runNumber, "E"),  (UInt_t) AliVEvent::kMB)));
-                                                                                     
-       // MUON                                                                       
-        fCollTrigClasses.Add(new TObjString(Form("%s%s &%u", "+CMUS1-B-NOPF-ALLNOTRD" , GetBXIDs(runNumber, "B"),  (UInt_t) AliVEvent::kMUON)));
-        fBGTrigClasses.Add  (new TObjString(Form("%s%s &%u", "+CMUS1-AC-NOPF-ALLNOTRD", GetBXIDs(runNumber, "AC"), (UInt_t) AliVEvent::kMUON)));
-        fBGTrigClasses.Add  (new TObjString(Form("%s%s &%u", "+CMUS1-E-NOPF-ALLNOTRD" , GetBXIDs(runNumber, "E"),  (UInt_t) AliVEvent::kMUON)));
-                                                                                    
-       // High Multiplicity                                                         
-        fCollTrigClasses.Add(new TObjString(Form("%s%s &%u", "+CSH1-B-NOPF-ALLNOTRD"  , GetBXIDs(runNumber, "B"),  (UInt_t) AliVEvent::kHighMult)));
-        fBGTrigClasses.Add  (new TObjString(Form("%s%s &%u", "+CSH1-AC-NOPF-ALLNOTRD" , GetBXIDs(runNumber, "AC"), (UInt_t) AliVEvent::kHighMult)));
-        fBGTrigClasses.Add  (new TObjString(Form("%s%s &%u", "+CSH1-E-NOPF-ALLNOTRD"  , GetBXIDs(runNumber, "E"),  (UInt_t) AliVEvent::kHighMult)));
-
-       // WARNING: IF YOU ADD MORE TRIGGER CLASSES, PLEASE CHECK THAT THE REGULAR EXPRESSION IN GetStatRow IS STILL VALID
-
-        break;
-        
-      case 2:
-        fCollTrigClasses.Add(new TObjString(Form("+CSMBB-ABCE-NOPF-ALL &%u", (UInt_t) AliVEvent::kMB)));
-        fBGTrigClasses.Add(new TObjString(Form("+CSMBA-ABCE-NOPF-ALL -CSMBB-ABCE-NOPF-ALL &%u", (UInt_t) AliVEvent::kMB)));
-        fBGTrigClasses.Add(new TObjString(Form("+CSMBC-ABCE-NOPF-ALL -CSMBB-ABCE-NOPF-ALL &%u", (UInt_t) AliVEvent::kMB)));
-        break;
+        switch (triggerScheme)
+        {
+        case 0:
+          // MC Proton-Proton
+          
+          fCollTrigClasses.Add(new TObjString(Form("&%u *%d", (UInt_t) AliVEvent::kMB, (Int_t) kCINT1)));
+          break;
+          
+        case 1:
+          // Proton-Proton
+          
+          // trigger classes used before August 2010
+          fCollTrigClasses.Add(new TObjString(Form("%s%s &%u","+CINT1B-ABCE-NOPF-ALL",  GetBXIDs(runNumber,"CINT1B-ABCE-NOPF-ALL"), (UInt_t) AliVEvent::kMB)));
+          fBGTrigClasses.Add  (new TObjString(Form("%s%s &%u","+CINT1A-ABCE-NOPF-ALL",  GetBXIDs(runNumber,"CINT1A-ABCE-NOPF-ALL"), (UInt_t) AliVEvent::kMB)));
+          fBGTrigClasses.Add  (new TObjString(Form("%s%s &%u","+CINT1C-ABCE-NOPF-ALL",  GetBXIDs(runNumber,"CINT1C-ABCE-NOPF-ALL"), (UInt_t) AliVEvent::kMB)));
+          fBGTrigClasses.Add  (new TObjString(Form("%s%s &%u","+CINT1-E-NOPF-ALL",      GetBXIDs(runNumber,"CINT1-E-NOPF-ALL"), (UInt_t) AliVEvent::kMB)));
+  
+          // Muon trigger have the same BXIDs of the corresponding CINT triggers
+          fCollTrigClasses.Add(new TObjString(Form("%s%s &%u","+CMUS1B-ABCE-NOPF-MUON",  GetBXIDs(runNumber,"CINT1B-ABCE-NOPF-ALL"), (UInt_t) AliVEvent::kMUON)));
+          fBGTrigClasses.Add  (new TObjString(Form("%s%s &%u","+CMUS1A-ABCE-NOPF-MUON",  GetBXIDs(runNumber,"CINT1A-ABCE-NOPF-ALL"), (UInt_t) AliVEvent::kMUON)));
+          fBGTrigClasses.Add  (new TObjString(Form("%s%s &%u","+CMUS1C-ABCE-NOPF-MUON",  GetBXIDs(runNumber,"CINT1C-ABCE-NOPF-ALL"), (UInt_t) AliVEvent::kMUON)));
+          fBGTrigClasses.Add  (new TObjString(Form("%s%s &%u","+CMUS1-E-NOPF-MUON"    ,  GetBXIDs(runNumber,"CINT1-E-NOPF-ALL"), (UInt_t) AliVEvent::kMUON)));
+          
+          // triggers classes used from August 2010
+          // MB
+          fCollTrigClasses.Add(new TObjString(Form("%s%s &%u", "+CINT1-B-NOPF-ALLNOTRD" , GetBXIDs(runNumber, "B"),  (UInt_t) AliVEvent::kMB)));
+          fBGTrigClasses.Add  (new TObjString(Form("%s%s &%u", "+CINT1-AC-NOPF-ALLNOTRD", GetBXIDs(runNumber, "AC"), (UInt_t) AliVEvent::kMB)));
+          fBGTrigClasses.Add  (new TObjString(Form("%s%s &%u", "+CINT1-E-NOPF-ALLNOTRD" , GetBXIDs(runNumber, "E"),  (UInt_t) AliVEvent::kMB)));
+                                                                                        
+          // MUON                                                                            
+          fCollTrigClasses.Add(new TObjString(Form("%s%s &%u", "+CMUS1-B-NOPF-ALLNOTRD" , GetBXIDs(runNumber, "B"),  (UInt_t) AliVEvent::kMUON)));
+          fBGTrigClasses.Add  (new TObjString(Form("%s%s &%u", "+CMUS1-AC-NOPF-ALLNOTRD", GetBXIDs(runNumber, "AC"), (UInt_t) AliVEvent::kMUON)));
+          fBGTrigClasses.Add  (new TObjString(Form("%s%s &%u", "+CMUS1-E-NOPF-ALLNOTRD" , GetBXIDs(runNumber, "E"),  (UInt_t) AliVEvent::kMUON)));
+                                                                                      
+          // High Multiplicity                                                      
+          fCollTrigClasses.Add(new TObjString(Form("%s%s &%u", "+CSH1-B-NOPF-ALLNOTRD"  , GetBXIDs(runNumber, "B"),  (UInt_t) AliVEvent::kHighMult)));
+          fBGTrigClasses.Add  (new TObjString(Form("%s%s &%u", "+CSH1-AC-NOPF-ALLNOTRD" , GetBXIDs(runNumber, "AC"), (UInt_t) AliVEvent::kHighMult)));
+          fBGTrigClasses.Add  (new TObjString(Form("%s%s &%u", "+CSH1-E-NOPF-ALLNOTRD"  , GetBXIDs(runNumber, "E"),  (UInt_t) AliVEvent::kHighMult)));
+  
+          // WARNING: IF YOU ADD MORE TRIGGER CLASSES, PLEASE CHECK THAT THE REGULAR EXPRESSION IN GetStatRow IS STILL VALID
+  
+          break;
+          
+        case 2:
+          // Proton-Proton
+          
+          fCollTrigClasses.Add(new TObjString(Form("+CSMBB-ABCE-NOPF-ALL &%u", (UInt_t) AliVEvent::kMB)));
+          fBGTrigClasses.Add(new TObjString(Form("+CSMBA-ABCE-NOPF-ALL -CSMBB-ABCE-NOPF-ALL &%u", (UInt_t) AliVEvent::kMB)));
+          fBGTrigClasses.Add(new TObjString(Form("+CSMBC-ABCE-NOPF-ALL -CSMBB-ABCE-NOPF-ALL &%u", (UInt_t) AliVEvent::kMB)));
+          break;
+          
+        default:
+          AliFatal(Form("Unsupported trigger scheme %d", triggerScheme));
+        }
+      }
+      else
+      {
+        switch (triggerScheme)
+        {
+        case 0:
+          // MC Heavy-Ion
+          
+          fCollTrigClasses.Add(new TObjString(Form("&%u *%d", (UInt_t) AliVEvent::kMB, (Int_t) kCMBS2A)));
+          fCollTrigClasses.Add(new TObjString(Form("&%u *%d", (UInt_t) AliVEvent::kMB, (Int_t) kCMBS2C)));
+          fCollTrigClasses.Add(new TObjString(Form("&%u *%d", (UInt_t) AliVEvent::kMB, (Int_t) kCMBAC)));
+          break;
+          
+        case 1:
+          // Data Heavy-ion (three out of three)
+          
+          fCollTrigClasses.Add(new TObjString(Form("+CMBACS2-B-NOPF-ALL &%u *%d", (UInt_t) AliVEvent::kMB, (Int_t) kCMBACS2)));
+          fBGTrigClasses.Add  (new TObjString(Form("+CMBACS2-A-NOPF-ALL &%u *%d", (UInt_t) AliVEvent::kMB, (Int_t) kCMBACS2)));
+          fBGTrigClasses.Add  (new TObjString(Form("+CMBACS2-C-NOPF-ALL &%u *%d", (UInt_t) AliVEvent::kMB, (Int_t) kCMBACS2)));
+          fBGTrigClasses.Add  (new TObjString(Form("+CMBACS2-E-NOPF-ALL &%u *%d", (UInt_t) AliVEvent::kMB, (Int_t) kCMBACS2)));
+          
+          fCollTrigClasses.Add(new TObjString(Form("+C0SMH-B-NOPF-ALL &%u *%d",  (UInt_t) AliVEvent::kHighMult, (Int_t) kHighMultL1)));
+          fBGTrigClasses.Add  (new TObjString(Form("+C0SMH-A-NOPF-ALL &%u *%d",  (UInt_t) AliVEvent::kHighMult, (Int_t) kHighMultL1)));
+          fBGTrigClasses.Add  (new TObjString(Form("+C0SMH-C-NOPF-ALL &%u *%d",  (UInt_t) AliVEvent::kHighMult, (Int_t) kHighMultL1)));
+          fBGTrigClasses.Add  (new TObjString(Form("+C0SMH-E-NOPF-ALL &%u *%d",  (UInt_t) AliVEvent::kHighMult, (Int_t) kHighMultL1)));
+          
+          break;
         
-      case 3:
-        // 
-        break;
+        case 2:
+          // Data Heavy-ion (early scheme: two out of three)
+          
+          fCollTrigClasses.Add(new TObjString(Form("+CMBS2A-B-NOPF-ALL &%u *%d", (UInt_t) AliVEvent::kMB, (Int_t) kCMBS2A)));
+          fBGTrigClasses.Add  (new TObjString(Form("+CMBS2A-A-NOPF-ALL &%u *%d", (UInt_t) AliVEvent::kMB, (Int_t) kCMBS2A)));
+          fBGTrigClasses.Add  (new TObjString(Form("+CMBS2A-C-NOPF-ALL &%u *%d", (UInt_t) AliVEvent::kMB, (Int_t) kCMBS2A)));
+          fBGTrigClasses.Add  (new TObjString(Form("+CMBS2A-E-NOPF-ALL &%u *%d", (UInt_t) AliVEvent::kMB, (Int_t) kCMBS2A)));
+          
+          fCollTrigClasses.Add(new TObjString(Form("+CMBS2C-B-NOPF-ALL &%u *%d", (UInt_t) AliVEvent::kMB, (Int_t) kCMBS2C)));
+          fBGTrigClasses.Add  (new TObjString(Form("+CMBS2C-A-NOPF-ALL &%u *%d", (UInt_t) AliVEvent::kMB, (Int_t) kCMBS2C)));
+          fBGTrigClasses.Add  (new TObjString(Form("+CMBS2C-C-NOPF-ALL &%u *%d", (UInt_t) AliVEvent::kMB, (Int_t) kCMBS2C)));
+          fBGTrigClasses.Add  (new TObjString(Form("+CMBS2C-E-NOPF-ALL &%u *%d", (UInt_t) AliVEvent::kMB, (Int_t) kCMBS2C)));
+          
+          fCollTrigClasses.Add(new TObjString(Form("+CMBAC-B-NOPF-ALL &%u *%d",  (UInt_t) AliVEvent::kMB, (Int_t) kCMBAC)));
+          fBGTrigClasses.Add  (new TObjString(Form("+CMBAC-A-NOPF-ALL &%u *%d",  (UInt_t) AliVEvent::kMB, (Int_t) kCMBAC)));
+          fBGTrigClasses.Add  (new TObjString(Form("+CMBAC-C-NOPF-ALL &%u *%d",  (UInt_t) AliVEvent::kMB, (Int_t) kCMBAC)));
+          fBGTrigClasses.Add  (new TObjString(Form("+CMBAC-E-NOPF-ALL &%u *%d",  (UInt_t) AliVEvent::kMB, (Int_t) kCMBAC)));
+          
+          fCollTrigClasses.Add(new TObjString(Form("+C0SMH-B-NOPF-ALL &%u *%d",  (UInt_t) AliVEvent::kHighMult, (Int_t) kHighMultL1)));
+          fBGTrigClasses.Add  (new TObjString(Form("+C0SMH-A-NOPF-ALL &%u *%d",  (UInt_t) AliVEvent::kHighMult, (Int_t) kHighMultL1)));
+          fBGTrigClasses.Add  (new TObjString(Form("+C0SMH-C-NOPF-ALL &%u *%d",  (UInt_t) AliVEvent::kHighMult, (Int_t) kHighMultL1)));
+          fBGTrigClasses.Add  (new TObjString(Form("+C0SMH-E-NOPF-ALL &%u *%d",  (UInt_t) AliVEvent::kHighMult, (Int_t) kHighMultL1)));
+          
+          break;
         
-      default:
-        AliFatal(Form("Unsupported trigger scheme %d", triggerScheme));
+       case 3:
+          // Data Heavy-ion, late 2010 run (three out of three NO TRD)
+          fCollTrigClasses.Add(new TObjString(Form("+CMBACS2-B-NOPF-ALLNOTRD &%u *%d", (UInt_t) AliVEvent::kMB, (Int_t) kCMBACS2)));
+          fBGTrigClasses.Add  (new TObjString(Form("+CMBACS2-A-NOPF-ALLNOTRD &%u *%d", (UInt_t) AliVEvent::kMB, (Int_t) kCMBACS2)));
+          fBGTrigClasses.Add  (new TObjString(Form("+CMBACS2-C-NOPF-ALLNOTRD &%u *%d", (UInt_t) AliVEvent::kMB, (Int_t) kCMBACS2)));
+          fBGTrigClasses.Add  (new TObjString(Form("+CMBACS2-E-NOPF-ALLNOTRD &%u *%d", (UInt_t) AliVEvent::kMB, (Int_t) kCMBACS2)));
+          
+          fCollTrigClasses.Add(new TObjString(Form("+C0SMH-B-NOPF-ALLNOTRD &%u *%d",  (UInt_t) AliVEvent::kHighMult, (Int_t) kHighMultL1)));
+          fBGTrigClasses.Add  (new TObjString(Form("+C0SMH-A-NOPF-ALLNOTRD &%u *%d",  (UInt_t) AliVEvent::kHighMult, (Int_t) kHighMultL1)));
+          fBGTrigClasses.Add  (new TObjString(Form("+C0SMH-C-NOPF-ALLNOTRD &%u *%d",  (UInt_t) AliVEvent::kHighMult, (Int_t) kHighMultL1)));
+          fBGTrigClasses.Add  (new TObjString(Form("+C0SMH-E-NOPF-ALLNOTRD &%u *%d",  (UInt_t) AliVEvent::kHighMult, (Int_t) kHighMultL1)));
+          
+          break;
+
+
+        default:
+          AliFatal(Form("Unsupported trigger scheme %d", triggerScheme));
+        }
       }
     }
     
@@ -786,6 +960,7 @@ Bool_t AliPhysicsSelection::Initialize(Int_t runNumber)
       triggerAnalysis->SetAnalyzeMC(fMC);
       triggerAnalysis->EnableHistograms();
       triggerAnalysis->SetSPDGFOThreshhold(1);
+      triggerAnalysis->SetDoFMD(kFALSE);
       fTriggerAnalysis.Add(triggerAnalysis);
     }
       
@@ -872,9 +1047,9 @@ TH2F * AliPhysicsSelection::BookHistStatistics(const char * tag) {
 
   Int_t count = fCollTrigClasses.GetEntries() + fBGTrigClasses.GetEntries();
 #ifdef VERBOSE_STAT
-  Int_t extrarows = fComputeBG != 0 ? 8 : 0;
+  Int_t extrarows = fComputeBG != 0 ? 11 : 0;
 #else
-  Int_t extrarows = fComputeBG != 0 ? 3 : 0;
+  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);
 
@@ -882,18 +1057,22 @@ TH2F * AliPhysicsSelection::BookHistStatistics(const char * tag) {
   h->GetXaxis()->SetBinLabel(kStatHWTrig,       "Hardware trigger");
   h->GetXaxis()->SetBinLabel(kStatFO1,          "FO >= 1");
   h->GetXaxis()->SetBinLabel(kStatFO2,          "FO >= 2");
+  h->GetXaxis()->SetBinLabel(kStatFO2L1,         "FO (L1) >= 2");
   h->GetXaxis()->SetBinLabel(kStatV0A,          "V0A");
   h->GetXaxis()->SetBinLabel(kStatV0C,          "V0C");
   h->GetXaxis()->SetBinLabel(kStatFMD,          "FMD");
-  h->GetXaxis()->SetBinLabel(kStatSSD1,                 "SSD >= 2");
   h->GetXaxis()->SetBinLabel(kStatV0ABG,        "V0A BG");
   h->GetXaxis()->SetBinLabel(kStatV0CBG,        "V0C BG");
+  h->GetXaxis()->SetBinLabel(kStatZDCA,          "ZDCA");
+  h->GetXaxis()->SetBinLabel(kStatZDCC,          "ZDCC");
+  h->GetXaxis()->SetBinLabel(kStatZDCAC,         "ZDCA & ZDCC");
+  h->GetXaxis()->SetBinLabel(kStatZDCTime,       "ZDC Time Cut");
   h->GetXaxis()->SetBinLabel(kStatMB1,          "(FO >= 1 | V0A | V0C) & !V0 BG");
   h->GetXaxis()->SetBinLabel(kStatMB1Prime,      "(FO >= 2 | (FO >= 1 & (V0A | V0C)) | (V0A &v0C) ) & !V0 BG");
-  h->GetXaxis()->SetBinLabel(kStatFO1AndV0,     "FO >= 1 & (V0A | V0C) & !V0 BG");
+  //h->GetXaxis()->SetBinLabel(kStatFO1AndV0,   "FO >= 1 & (V0A | V0C) & !V0 BG");
   h->GetXaxis()->SetBinLabel(kStatV0,           "V0A & V0C & !V0 BG & !BG ID");
   h->GetXaxis()->SetBinLabel(kStatOffline,      "Offline Trigger");
-  h->GetXaxis()->SetBinLabel(kStatAny2Hits,     "2 Hits & !V0 BG");
+  //h->GetXaxis()->SetBinLabel(kStatAny2Hits,   "2 Hits & !V0 BG");
   h->GetXaxis()->SetBinLabel(kStatBG,           "Background identification");
   h->GetXaxis()->SetBinLabel(kStatAccepted,      "Accepted");
 
@@ -911,6 +1090,9 @@ TH2F * AliPhysicsSelection::BookHistStatistics(const char * tag) {
 
   if(fComputeBG) {
     fBGStatOffset = n;
+    h->GetYaxis()->SetBinLabel(n++, "All B");
+    h->GetYaxis()->SetBinLabel(n++, "All A+C");
+    h->GetYaxis()->SetBinLabel(n++, "All E");
     h->GetYaxis()->SetBinLabel(n++, Form("BG (A+C) (Mask [0x%x])", fComputeBG));
     h->GetYaxis()->SetBinLabel(n++, "ACC");
 #ifdef VERBOSE_STAT
@@ -926,11 +1108,12 @@ TH2F * AliPhysicsSelection::BookHistStatistics(const char * tag) {
   return h;
 }
 
-void AliPhysicsSelection::Print(Option_t* /* option */) const
+void AliPhysicsSelection::Print(Option_t *option) const
 {
   // print the configuration
-  
+  TString msg;
   Printf("Configuration initialized for run %d (MC: %d):", fCurrentRun, fMC);
+  msg += Form("Configuration initialized for run %d (MC: %d):\n", fCurrentRun, fMC);
   
   Printf("Collision trigger classes:");
   for (Int_t i=0; i < fCollTrigClasses.GetEntries(); i++)
@@ -957,26 +1140,32 @@ void AliPhysicsSelection::Print(Option_t* /* option */) const
     for (Int_t i=0; i<fCollTrigClasses.GetEntries(); i++)
     {
       Printf("\nSelection statistics for collision trigger %s:", ((TObjString*) fCollTrigClasses.At(i))->String().Data());
+      msg += Form("\nSelection statistics for collision trigger %s:\n", ((TObjString*) fCollTrigClasses.At(i))->String().Data());
       
       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));
+      msg += Form("Selected collision candidates: %d\n", (Int_t) fHistStatistics[kStatIdxAll]->GetBinContent(fHistStatistics[kStatIdxAll]->GetXaxis()->FindBin("Accepted"), i+1));
     }
   }
   
   if (fHistBunchCrossing)
   {
     Printf("\nBunch crossing statistics:");
+    msg += "\nBunch crossing statistics:\n";
     
     for (Int_t i=1; i<=fHistBunchCrossing->GetNbinsY(); i++)
     {
       TString str;
-      str.Form("Trigger %s has accepted events in the bunch crossings: ", fHistBunchCrossing->GetYaxis()->GetBinLabel(i));
+      str.Form("Trigger %s has events in the bunch crossings: ", fHistBunchCrossing->GetYaxis()->GetBinLabel(i));
       
       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";
     }
     
     for (Int_t j=1; j<=fHistBunchCrossing->GetNbinsX(); j++)
@@ -1006,7 +1195,12 @@ void AliPhysicsSelection::Print(Option_t* /* option */) const
     Printf("WARNING: Ignoring V0 information in selection");
   if(!fBin0CallBack) 
     Printf("WARNING: Callback not set: will not fill the statistics for the bin 0");
-
+  TString opt(option);
+  opt.ToUpper();
+  if (opt == "STAT") {
+     AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
+     if (mgr) mgr->AddStatisticsMsg(msg);
+  }
 }
 
 Long64_t AliPhysicsSelection::Merge(TCollection* list)
@@ -1041,11 +1235,20 @@ Long64_t AliPhysicsSelection::Merge(TCollection* list)
     Int_t currentRun = entry->GetCurrentRun();
     // Nothing to merge with since run number was not initialized.
     if (currentRun < 0) continue;
-    if (fCurrentRun < 0) fCurrentRun = currentRun;
+    if (fCurrentRun < 0) 
+    {
+      fCurrentRun = currentRun;
+      fMC = entry->fMC;
+      for (Int_t i=0; i<entry->fCollTrigClasses.GetEntries(); i++)
+        fCollTrigClasses.Add(entry->fCollTrigClasses.At(i)->Clone());
+      for (Int_t i=0; i<entry->fBGTrigClasses.GetEntries(); i++)
+        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));
     
-    collections[0].Add(&(entry->fTriggerAnalysis));
+    if (entry->fTriggerAnalysis.GetEntries() > 0)
+      collections[0].Add(&(entry->fTriggerAnalysis));
     if (entry->fHistStatistics[0])
       collections[1].Add(entry->fHistStatistics[0]);
     if (entry->fHistStatistics[1])
@@ -1060,15 +1263,54 @@ Long64_t AliPhysicsSelection::Merge(TCollection* list)
     count++;
   }
 
+  if (fTriggerAnalysis.GetEntries() == 0 && collections[0].GetEntries() > 0)
+  {
+    TList* firstList = (TList*) collections[0].First();
+    for (Int_t i=0; i<firstList->GetEntries(); i++)
+      fTriggerAnalysis.Add(firstList->At(i)->Clone());
+    
+    collections[0].RemoveAt(0);
+  }
   fTriggerAnalysis.Merge(&collections[0]);
+  
+  // if this instance is empty (not initialized) nothing would be merged here --> copy first entry
+  if (!fHistStatistics[0] && collections[1].GetEntries() > 0)
+  {
+    fHistStatistics[0] = (TH2F*) collections[1].First()->Clone();
+    collections[1].RemoveAt(0);
+  }
   if (fHistStatistics[0])
     fHistStatistics[0]->Merge(&collections[1]);
+    
+  if (!fHistStatistics[1] && collections[2].GetEntries() > 0)
+  {
+    fHistStatistics[1] = (TH2F*) collections[2].First()->Clone();
+    collections[2].RemoveAt(0);
+  }
   if (fHistStatistics[1])
     fHistStatistics[1]->Merge(&collections[2]);
+    
+  if (!fHistBunchCrossing && collections[3].GetEntries() > 0)
+  {
+    fHistBunchCrossing = (TH2F*) collections[3].First()->Clone();
+    collections[3].RemoveAt(0);
+  }
   if (fHistBunchCrossing)
     fHistBunchCrossing->Merge(&collections[3]);
+  
+  if (!fHistTriggerPattern && collections[4].GetEntries() > 0)
+  {
+    fHistTriggerPattern = (TH1F*) collections[4].First()->Clone();
+    collections[4].RemoveAt(0);
+  }
   if (fHistTriggerPattern)
     fHistTriggerPattern->Merge(&collections[4]);
+  
+  if (!fBackgroundIdentification && collections[5].GetEntries() > 0)
+  {
+    fBackgroundIdentification = (AliAnalysisCuts*) collections[5].First()->Clone();
+    collections[5].RemoveAt(0);
+  }
   if (fBackgroundIdentification)
     fBackgroundIdentification->Merge(&collections[5]);
   
@@ -1077,7 +1319,7 @@ Long64_t AliPhysicsSelection::Merge(TCollection* list)
   return count+1;
 }
 
-void AliPhysicsSelection::SaveHistograms(const char* folder) const
+void AliPhysicsSelection::SaveHistograms(const char* folder) 
 {
   // write histograms to current directory
   
@@ -1092,150 +1334,169 @@ void AliPhysicsSelection::SaveHistograms(const char* folder) const
   
 
   // Fill the last rows of fHistStatistics before saving
-  if (fComputeBG) {
-    Int_t triggerScheme = GetTriggerScheme(UInt_t(fCurrentRun));
-    if(triggerScheme != 1){
-      AliWarning("BG estimate only supported for trigger scheme \"1\" (CINT1 suite)");
-    } else if (fUseMuonTriggers) {
-      AliWarning("BG estimate with muon triggers to be implemented");
-    } else {      
-      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"); 
-      
-      // use an anum for the different trigger classes, to make loops easier to read
-      enum {kClassB =0 , kClassA, kClassC, kClassAC, kClassE, kNClasses};
-      const char * classFlags[] = {"B", "A", "C", "AC", "E"}; // labels
-
-      UInt_t * rows[kNClasses] = {0}; // Array of matching rows
-      Int_t nrows[kNClasses] = {0};
-      // Get rows matching the requested trigger bits for all trigger classes
-      for(Int_t iTrigClass = 0; iTrigClass < kNClasses; iTrigClass++){
-       nrows[iTrigClass] = GetStatRow(classFlags[iTrigClass],fComputeBG,&rows[iTrigClass]);    
-      }
-
-      // 0. Determine the ratios of triggers E/B, A/B, C/B from the stat histogram
-      // 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;
-      
-      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 (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"); 
+    
+    // use an anum for the different trigger classes, to make loops easier to read
+    enum {kClassB =0 , kClassA, kClassC, kClassAC, kClassE, kNClasses};
+    const char * classFlags[] = {"B", "A", "C", "AC", "E"}; // labels
+    
+    UInt_t * rows[kNClasses] = {0}; // Array of matching rows
+    Int_t nrows[kNClasses] = {0};
+    // Get rows matching the requested trigger bits for all trigger classes
+    for(Int_t iTrigClass = 0; iTrigClass < kNClasses; iTrigClass++){
+      nrows[iTrigClass] = GetStatRow(classFlags[iTrigClass],fComputeBG,&rows[iTrigClass]);     
+    }
+    
+    // 0. Determine the ratios of triggers E/B, A/B, C/B from the stat histogram
+    // 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;
+    
+    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(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;
-      ratioToB[kClassC]  = nBXIds[kClassC]  >0 ? Float_t(nBXIds[kClassB])/nBXIds[kClassC]   : 0;
-      ratioToB[kClassAC] = nBXIds[kClassAC] >0 ? Float_t(nBXIds[kClassB])/nBXIds[kClassAC]  : 0;
-      Printf("Ratio between the BX ids in the different trigger classes:");
-      Printf("  B/E  = %d/%d = %f", nBXIds[kClassB],nBXIds[kClassE], ratioToB[kClassE] );
-      Printf("  B/A  = %d/%d = %f", nBXIds[kClassB],nBXIds[kClassA], ratioToB[kClassA] );
-      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;         
+    }
+
+    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;
+    ratioToB[kClassC]  = nBXIds[kClassC]  >0 ? Float_t(nBXIds[kClassB])/nBXIds[kClassC]   : 0;
+    ratioToB[kClassAC] = nBXIds[kClassAC] >0 ? Float_t(nBXIds[kClassB])/nBXIds[kClassAC]  : 0;
+    Printf("Ratio between the BX ids in the different trigger classes:");
+    Printf("  B/E  = %d/%d = %f", nBXIds[kClassB],nBXIds[kClassE], ratioToB[kClassE] );
+    Printf("  B/A  = %d/%d = %f", nBXIds[kClassB],nBXIds[kClassA], ratioToB[kClassA] );
+    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]);      
          }
-         if (nEvents[kClassB]>0) {
-           Float_t acc  = ratioToB[kClassE]*nEvents[kClassE]; 
-           Double_t acc_err = TMath::Sqrt(ratioToB[kClassE]*ratioToB[kClassE]*nEvents[kClassE]);
-           //      Int_t bg   = cint1A + cint1C - 2*acc;
+         //        cout << "Events " << classFlags[iTrigClass] << " ("<<icol<<") " << nEvents[iTrigClass] << endl;         
+       }
+       if (nEvents[kClassB]>0) {
+         Float_t acc  = ratioToB[kClassE]*nEvents[kClassE]; 
+         Double_t acc_err = TMath::Sqrt(ratioToB[kClassE]*ratioToB[kClassE]*nEvents[kClassE]);
+         //      Int_t bg   = cint1A + cint1C - 2*acc;
            
-            // 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]);
+         // If intensity measurements are available, they already
+         // contain the scaling for BX ratios, so we reset the
+         // ratioToB entries
+         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;
+           }
+         } 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+kStatRowBG,bg);        
-           fHistStatistics[iHistStat]->SetBinError  (icol,fBGStatOffset+kStatRowBG,errBG);     
-           fHistStatistics[iHistStat]->SetBinContent(icol,fBGStatOffset+kStatRowAcc,acc);      
-           fHistStatistics[iHistStat]->SetBinError  (icol,fBGStatOffset+kStatRowAcc,acc_err);  
-           fHistStatistics[iHistStat]->SetBinContent(icol,fBGStatOffset+kStatRowGood,good);    
-           fHistStatistics[iHistStat]->SetBinError  (icol,fBGStatOffset+kStatRowGood,errGood);    
+         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,acc_err);    
+         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(acc_err) / 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(acc_err) / 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];
-      }  
+    }
+    for (Int_t iTrigClass = 0; iTrigClass < kNClasses; iTrigClass++){
+      delete [] rows[iTrigClass];
     }  
-  }
+  }  
 
   fHistStatistics[0]->Write();
   fHistStatistics[1]->Write();
@@ -1244,30 +1505,30 @@ void AliPhysicsSelection::SaveHistograms(const char* folder) const
   
   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);
+    {
+      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("..");
+    }
   
-    static_cast<AliTriggerAnalysis*> (fTriggerAnalysis.At(i))->SaveHistograms();
-    
-    gDirectory->cd("..");
-  }
   if (fBackgroundIdentification)
-  {
-    gDirectory->mkdir("background_identification");
-    gDirectory->cd("background_identification");
+    {
+      gDirectory->mkdir("background_identification");
+      gDirectory->cd("background_identification");
       
-    fBackgroundIdentification->GetOutput()->Write();
+      fBackgroundIdentification->GetOutput()->Write();
       
-    gDirectory->cd("..");
-  }
+      gDirectory->cd("..");
+    }
   
   if (folder)
     gDirectory->cd("..");
@@ -1297,11 +1558,16 @@ Int_t AliPhysicsSelection::GetStatRow(const char * triggerBXClass, UInt_t offlin
   // a - and then any char (".*") and at the class id ("\\&(\\d)")
   // The class id is stored.
   // WARNING: please check this if the trigger classes change
-  TPRegexp re(Form("\\+\\b[^-]*-?%s-.*\\&(\\d)",triggerBXClass));  
+  // FIXME: change comment above
+  TPRegexp re1(Form("\\+\\b[^-]*-?%s-.*\\&(\\d)",triggerBXClass));  // If the class is with BPTX coincidence 
+  TPRegexp re2(Form("\\+\\b[^-]+-%s-.*\\&(\\d)",triggerBXClass));  // If the class is with BX filtering online 
   // Loop over rows and find matching ones:
   for(Int_t irow = 1; irow <= nrows; irow++){
-    TObjArray * matches = re.MatchS(fHistStatistics[0]->GetYaxis()->GetBinLabel(irow));
-    if (matches->GetEntries()) {
+    TString triggerClassCurrent = fHistStatistics[0]->GetYaxis()->GetBinLabel(irow);
+    TObjArray * matches = 0;
+    if (triggerClassCurrent.Contains ("ABCE")) matches = re1.MatchS(triggerClassCurrent);
+    else                                       matches = re2.MatchS(triggerClassCurrent);
+    if (matches->GetEntries() && (fIsPP || (!fIsPP&&triggerClassCurrent.Contains("CMBAC")))) {
       TString s = ((TObjString*)matches->At(1))->GetString();      
       if(UInt_t(s.Atoi()) & offlineTriggerType) { // bitwise comparison with the requested mask
        //      cout << "Marching " << s.Data() << " " << offlineTriggerType << " " << fHistStatistics[0]->GetYaxis()->GetBinLabel(irow) << endl;       
@@ -1337,20 +1603,20 @@ void AliPhysicsSelection::SetBIFactors(const AliESDEvent * aESD) {
     if (intAB > -1 && intAA > -1) {
       fBIFactorA = intAB/intAA;
     } else {
-      AliWarning("Cannot set fBIFactorA, assuming 1");
+      AliWarning("Cannot set fBIFactorA");
     }
     
     if (intCB > -1 && intCC > -1) {
       fBIFactorC = intCB/intCC;
     } else {
-      AliWarning("Cannot set fBIFactorC, assuming 1");
+      AliWarning("Cannot set fBIFactorC");
     }
       
     if (intAB > -1 && intAA > -1 &&
        intCB > -1 && intCC > -1) {
       fBIFactorAC = (intAB+intCB)/(intAA+intCC);
     } else {
-      AliWarning("Cannot set fBIFactorAC, assuming 1");
+      AliWarning("Cannot set fBIFactorAC");
     }
         
   }