fSkipTriggerClassSelection(0),
fUsingCustomClasses(0),
fSkipV0(0),
- fSkipZDCTime(0),
fBIFactorA(-1),
fBIFactorC(-1),
fBIFactorAC(-1),
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);
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);
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);
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)
/// 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()));
#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");
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");
//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++)
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());
+ }
+
}
}
// 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();
}