#include <AliAnalysisManager.h>
#include <AliESDInputHandler.h>
#include <AliESDHeader.h>
+#include <AliPhysicsSelection.h>
ClassImp(AliTriggerTask)
fOption(opt),
fStartTime(0),
fEndTime(0),
+ fUseOrbits(kFALSE),
+ fFirstOrbit(0),
+ fLastOrbit(0),
fNTriggers(0),
fTriggerList(0),
- fStats(0)
+ fNTriggerClasses(0),
+ fTriggerClassesList(0),
+ fStats(0),
+ fPhysicsSelection(0)
{
//
// Constructor. Initialization of pointers
DefineInput(0, TChain::Class());
DefineOutput(0, TList::Class());
- fNTriggers = 13;
+ fNTriggers = 14;
- static AliPWG0Helper::Trigger triggerList[] = { AliPWG0Helper::kAcceptAll, AliPWG0Helper::kFPANY, AliPWG0Helper::kMB1, AliPWG0Helper::kMB2, AliPWG0Helper::kMB3, AliPWG0Helper::kSPDGFO, AliPWG0Helper::kV0A, AliPWG0Helper::kV0C, AliPWG0Helper::kZDC, AliPWG0Helper::kZDCA, AliPWG0Helper::kZDCC, AliPWG0Helper::kFMDA, AliPWG0Helper::kFMDC };
+ static AliTriggerAnalysis::Trigger triggerList[] = { AliTriggerAnalysis::kAcceptAll, AliTriggerAnalysis::kFPANY, AliTriggerAnalysis::kMB1, AliTriggerAnalysis::kMB2, AliTriggerAnalysis::kMB3, AliTriggerAnalysis::kSPDGFO, AliTriggerAnalysis::kSPDGFOBits, AliTriggerAnalysis::kV0A, AliTriggerAnalysis::kV0C, AliTriggerAnalysis::kZDC, AliTriggerAnalysis::kZDCA, AliTriggerAnalysis::kZDCC, AliTriggerAnalysis::kFMDA, AliTriggerAnalysis::kFMDC };
fTriggerList = triggerList;
- fStats = new TH1*[fNTriggers];
+ fNTriggerClasses = 4;
+ static const char* triggerClassesList[] = { "CINT1B-ABCE-NOPF-ALL", "CINT1C-ABCE-NOPF-ALL", "CINT1A-ABCE-NOPF-ALL", "CINT1-E-NOPF-ALL" };
+ fTriggerClassesList = triggerClassesList;
- AliLog::SetClassDebugLevel("AliTriggerTask", AliLog::kWarning);
+ fStats = new TH1**[fNTriggerClasses];
+ for (Int_t i=0; i<fNTriggerClasses; i++)
+ fStats[i] = new TH1*[fNTriggers];
}
AliTriggerTask::~AliTriggerTask()
Int_t nBins = 1000;
if (fEndTime - fStartTime > 0)
- nBins = fEndTime - fStartTime;
- for (Int_t i=0; i<fNTriggers; i++)
+ nBins = fEndTime - fStartTime + 1;
+ if (nBins > 10000)
+ nBins = 10000;
+
+ Int_t start = 0;
+ Int_t end = fEndTime - fStartTime;
+
+ if (fUseOrbits)
{
- fStats[i] = new TH1F(Form("fStats_%d", i), Form("%s;time;counts", AliPWG0Helper::GetTriggerName(fTriggerList[i])), nBins, 0, fEndTime - fStartTime);
- fOutput->Add(fStats[i]);
+ start = fStartTime;
+ end = fEndTime;
+ }
+
+ for (Int_t j=0; j<fNTriggerClasses; j++)
+ {
+ for (Int_t i=0; i<fNTriggers; i++)
+ {
+ fStats[j][i] = new TH1F(Form("fStats_%d_%d", j, i), Form("%s %s;%s;counts", fTriggerClassesList[j], AliTriggerAnalysis::GetTriggerName(fTriggerList[i]), (fUseOrbits) ? "orbit number" : "time"), nBins, start - 0.5, end + 0.5);
+ fOutput->Add(fStats[j][i]);
+ }
}
+
+ fFirstOrbit = new TParameter<Long_t> ("fFirstOrbit", 0);
+ fLastOrbit = new TParameter<Long_t> ("fLastOrbit", 0);
+ fOutput->Add(fFirstOrbit);
+ fOutput->Add(fLastOrbit);
+
+ fOutput->Add(fPhysicsSelection);
+
+ AliLog::SetClassDebugLevel("AliPhysicsSelection", AliLog::kDebug);
}
void AliTriggerTask::Exec(Option_t*)
return;
}
+ // fill histograms
+ fPhysicsSelection->IsCollisionCandidate(fESD);
+
// check event type (should be PHYSICS = 7)
AliESDHeader* esdHeader = fESD->GetHeader();
if (!esdHeader)
Printf("Skipping event because it is of type %d", eventType);
return;
}
-
- //Printf("Trigger classes: %s:", fESD->GetFiredTriggerClasses().Data());
- UInt_t timeStamp = fESD->GetTimeStamp() - fStartTime;
+ // TODO select on hardware trigger for histograms...
+ Int_t triggerClass = 0;
+ while (triggerClass < fNTriggerClasses && !fESD->IsTriggerClassFired(fTriggerClassesList[triggerClass]))
+ triggerClass++;
+ if (triggerClass == fNTriggerClasses)
+ {
+ Printf("Unknown trigger class %s. Skipping event", fESD->GetFiredTriggerClasses().Data());
+ return;
+ }
+
+ Long64_t timeStamp = 0;
+ if (fUseOrbits)
+ {
+ timeStamp = fESD->GetBunchCrossNumber();
+ timeStamp += (Long64_t) 3564 * (fESD->GetOrbitNumber() + fESD->GetPeriodNumber() * 16777215);
+ timeStamp = (Long64_t) (25e-9 * timeStamp);
+ timeStamp -= fStartTime;
+ }
+ else
+ timeStamp = fESD->GetTimeStamp() - fStartTime;
+
//Printf("%d", timeStamp);
+ //Annalisa Time (s) = 1440*period + 88*10-6 * orbit + 25*10-9 *bc
+
for (Int_t i = 0; i < fNTriggers; i++)
{
- Bool_t triggered = AliPWG0Helper::IsEventTriggered(fESD, (AliPWG0Helper::Trigger) (fTriggerList[i] | AliPWG0Helper::kOfflineFlag));
+ Bool_t triggered = fPhysicsSelection->GetTriggerAnalysis()->IsOfflineTriggerFired(fESD, fTriggerList[i]);
if (triggered)
- fStats[i]->Fill(timeStamp);
- //Printf("%s: %d", AliPWG0Helper::GetTriggerName(fTriggerList[i]), triggered);
+ fStats[triggerClass][i]->Fill(timeStamp);
+ //Printf("%s: %d", AliTriggerAnalysis::GetTriggerName(fTriggerList[i]), triggered);
}
+
+ if (fFirstOrbit->GetVal() == 0)
+ fFirstOrbit->SetVal(timeStamp);
+ else
+ fFirstOrbit->SetVal(TMath::Min(fFirstOrbit->GetVal(), (Long_t) timeStamp));
+
+ fLastOrbit->SetVal(TMath::Max(fLastOrbit->GetVal(), (Long_t) timeStamp));
}
void AliTriggerTask::Terminate(Option_t *)
fOutput = dynamic_cast<TList*> (GetOutputData(0));
if (!fOutput)
Printf("ERROR: fOutput not available");
+
+ //fOutput->Print();
if (fOutput)
{
- for (Int_t i=0; i<fNTriggers; i++)
- fStats[i] = dynamic_cast<TH1*> (fOutput->FindObject(Form("fStats_%d", i)));
+ for (Int_t j=0; j<fNTriggerClasses; j++)
+ for (Int_t i=0; i<fNTriggers; i++)
+ fStats[j][i] = dynamic_cast<TH1*> (fOutput->FindObject(Form("fStats_%d_%d", j, i)));
+ fPhysicsSelection = dynamic_cast<AliPhysicsSelection*> (fOutput->FindObject("AliPhysicsSelection"));
}
TFile* fout = new TFile("trigger.root", "RECREATE");
- for (Int_t i=0; i<fNTriggers; i++)
- if (fStats[i])
- fStats[i]->Write();
-
+ for (Int_t j=0; j<fNTriggerClasses; j++)
+ for (Int_t i=0; i<fNTriggers; i++)
+ if (fStats[j][i])
+ fStats[j][i]->Write();
+
+ if (fPhysicsSelection)
+ {
+ fPhysicsSelection->SaveHistograms("physics_selection");
+ fPhysicsSelection->Print();
+ }
+
+ if (fFirstOrbit)
+ fFirstOrbit->Dump();
+ if (fLastOrbit)
+ fLastOrbit->Dump();
+
fout->Write();
fout->Close();
Printf("+++++++++ TRIGGER STATS:");
+ Int_t triggerClass = 0;
+
Int_t base = 1;
- if (fStats[0])
- base = (Int_t) fStats[0]->Integral();
+ if (fStats[triggerClass][0])
+ base = (Int_t) fStats[triggerClass][0]->Integral();
Int_t length = fEndTime - fStartTime;
for (Int_t i=0; i<fNTriggers; i++)
- if (fStats[i])
+ if (fStats[triggerClass][i])
{
c->cd(i+1);
- fStats[i]->Draw();
- Printf("%s: %d triggers | %f %% of all triggered | Rate: %f Hz", AliPWG0Helper::GetTriggerName(fTriggerList[i]), (UInt_t) fStats[i]->Integral(), fStats[i]->Integral() / base, (length > 0) ? (fStats[i]->Integral() / length) : -1);
+ fStats[triggerClass][i]->Draw();
+ Printf("%s: %d triggers | %f %% of all triggered | Rate: %f Hz", AliTriggerAnalysis::GetTriggerName(fTriggerList[i]), (UInt_t) fStats[triggerClass][i]->Integral(), 100.0 * fStats[triggerClass][i]->Integral() / base, (length > 0) ? (fStats[triggerClass][i]->Integral() / length) : -1);
}
Printf("Writting result to trigger.root");