]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - ANALYSIS/AliPhysicsSelection.cxx
TrainSetup version of official QA train
[u/mrichter/AliRoot.git] / ANALYSIS / AliPhysicsSelection.cxx
index ef9306edc982476522f0fe10d67a8d8c7c103a66..db8662faf4d0c938eb7b0f92625baf8176f21388 100644 (file)
@@ -141,7 +141,6 @@ AliPhysicsSelection::AliPhysicsSelection() :
   fSkipTriggerClassSelection(0),
   fUsingCustomClasses(0),
   fSkipV0(0),
-  fSkipZDCTime(0),
   fBIFactorA(-1),
   fBIFactorC(-1),
   fBIFactorAC(-1), 
@@ -506,9 +505,9 @@ UInt_t AliPhysicsSelection::IsCollisionCandidate(const AliESDEvent* aEsd)
       Bool_t v0BG = v0ABG || v0CBG;
 
       // 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;
+      // 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);
@@ -520,6 +519,8 @@ UInt_t AliPhysicsSelection::IsCollisionCandidate(const AliESDEvent* aEsd)
       Bool_t zdcC    = triggerAnalysis->EvaluateTrigger(aEsd, (AliTriggerAnalysis::Trigger) (AliTriggerAnalysis::kOfflineFlag | AliTriggerAnalysis::kZDCTDCC));
       Bool_t zdcTime = triggerAnalysis->EvaluateTrigger(aEsd, (AliTriggerAnalysis::Trigger) (AliTriggerAnalysis::kOfflineFlag | AliTriggerAnalysis::kZDCTime));
 
+      Bool_t laserCut = triggerAnalysis->EvaluateTrigger(aEsd, (AliTriggerAnalysis::Trigger) (AliTriggerAnalysis::kOfflineFlag | AliTriggerAnalysis::kTPCLaserWarmUp));
+
       // Some "macros"
       Bool_t mb1 = (fastOROffline > 0 || v0A || v0C) && (!v0BG);
       Bool_t mb1prime = (fastOROffline > 1 || (fastOROffline > 0 && (v0A || v0C)) || (v0A && v0C) ) && (!v0BG);
@@ -591,8 +592,8 @@ UInt_t AliPhysicsSelection::IsCollisionCandidate(const AliESDEvent* aEsd)
        if (mb1prime)
          fHistStatistics[iHistStat]->Fill(kStatMB1Prime, i);
 
-       if (fmd)
-         fHistStatistics[iHistStat]->Fill(kStatFMD, i);
+       if (laserCut)
+         fHistStatistics[iHistStat]->Fill(kStatLaserCut, i);
 
        //if(ntrig >= 2 && !v0BG) 
        //  fHistStatistics[iHistStat]->Fill(kStatAny2Hits, i);
@@ -641,6 +642,10 @@ UInt_t AliPhysicsSelection::IsCollisionCandidate(const AliESDEvent* aEsd)
                    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);
+
                    // 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)
@@ -871,7 +876,7 @@ Bool_t AliPhysicsSelection::Initialize(Int_t runNumber)
   /// Open OADB file and fetch OADB objects
   TString oadbfilename = AliPhysicsSelection::GetOADBFileName();
 
-  TFile * foadb = new TFile (oadbfilename); 
+  TFile * foadb = TFile::Open(oadbfilename);
   if(!foadb->IsOpen()) AliFatal(Form("Cannot open OADB file %s", oadbfilename.Data()));
 
 
@@ -1091,7 +1096,7 @@ TH2F * AliPhysicsSelection::BookHistStatistics(const char * tag) {
 #else
   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);
+  TH2F * h = new TH2F(Form("fHistStatistics%s",tag), Form("fHistStatistics - %s ;;",tag), kStatAcceptedPileUp, 0.5, kStatAcceptedPileUp+0.5, count+extrarows, -0.5, -0.5 + count+extrarows);
 
   h->GetXaxis()->SetBinLabel(kStatTriggerClass,  "Trigger class");
   h->GetXaxis()->SetBinLabel(kStatHWTrig,       "Hardware trigger");
@@ -1100,7 +1105,7 @@ TH2F * AliPhysicsSelection::BookHistStatistics(const char * tag) {
   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(kStatLaserCut,      "TPC Laser Wup Cut");
   h->GetXaxis()->SetBinLabel(kStatV0ABG,        "V0A BG");
   h->GetXaxis()->SetBinLabel(kStatV0CBG,        "V0C BG");
   h->GetXaxis()->SetBinLabel(kStatZDCA,          "ZDCA");
@@ -1115,6 +1120,8 @@ TH2F * AliPhysicsSelection::BookHistStatistics(const char * tag) {
   //h->GetXaxis()->SetBinLabel(kStatAny2Hits,   "2 Hits & !V0 BG");
   h->GetXaxis()->SetBinLabel(kStatBG,           "Background identification");
   h->GetXaxis()->SetBinLabel(kStatAccepted,      "Accepted");
+  h->GetXaxis()->SetBinLabel(kStatAcceptedPileUp, "Pile up (in accepted)");
+
 
   Int_t n = 1;
   for (Int_t i=0; i < fCollTrigClasses.GetEntries(); i++)
@@ -1173,19 +1180,83 @@ void AliPhysicsSelection::Print(const Option_t *option) const
     Printf("\nTotal available events:");
     
     triggerAnalysis->PrintTriggerClasses();
+    // Check if all triggers with counts are known to the physics selection. If not, print a WARNING (only for MC) 
+    if(!fMC) {
+      TMap * triggers = triggerAnalysis->GetTriggerClasses();
+      TIterator* iter = triggers->MakeIterator();
+      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"; // 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;
+    }
   }
   
   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());
       msg += Form("\nSelection statistics for collision trigger %s:\n", ((TObjString*) fCollTrigClasses.At(i))->String().Data());
       
+      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));
       msg += Form("Selected collision candidates: %d\n", (Int_t) fHistStatistics[kStatIdxAll]->GetBinContent(fHistStatistics[kStatIdxAll]->GetXaxis()->FindBin("Accepted"), i+1));
+      
+      // 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());
+      }
+
     }
   }
   
@@ -1290,22 +1361,23 @@ Long64_t AliPhysicsSelection::Merge(TCollection* list)
     // With the same strategy update fBGStatOffset
     Int_t bgstatoffset = entry->GetBGStatOffset();
     
-    // Nothing to merge with since run number was not initialized.
-    if (bgstatoffset < 0) continue;
-    if (fBGStatOffset < 0) 
-    {
-      fBGStatOffset = bgstatoffset;
+    // Nothing to merge with since BG was not initialized.
+    if (!(bgstatoffset < 0)){
+      if (fBGStatOffset < 0) 
+       {
+         fBGStatOffset = bgstatoffset;
+       }
     }
     if (fBGStatOffset != bgstatoffset)
-       AliWarning(Form("Current run %d not matching the one to be merged with %d", 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) {
+    if (!fPSOADB && entry->GetOADBPhysicsSelection()) {
       fPSOADB = (AliOADBPhysicsSelection*) entry->GetOADBPhysicsSelection()->Clone();
     }
-    if (!fFillOADB){
+    if (!fFillOADB && entry->GetOADBFillingScheme()){
       fFillOADB = (AliOADBFillingScheme*) entry->GetOADBFillingScheme()->Clone();
     }