]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - PWG0/trigger/AliTriggerTask.cxx
Update (Andrea)
[u/mrichter/AliRoot.git] / PWG0 / trigger / AliTriggerTask.cxx
index cb2a6e3c3d5bf1dbc903640b01885b0628923af5..495126de2fb6cdaa04897dbb9ae92562ce4d914a 100644 (file)
@@ -15,6 +15,7 @@
 #include <AliAnalysisManager.h>
 #include <AliESDInputHandler.h>
 #include <AliESDHeader.h>
+#include <AliPhysicsSelection.h>
 
 ClassImp(AliTriggerTask)
 
@@ -25,9 +26,15 @@ AliTriggerTask::AliTriggerTask(const char* opt) :
   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
@@ -37,14 +44,18 @@ AliTriggerTask::AliTriggerTask(const char* opt) :
   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()
@@ -98,12 +109,36 @@ void AliTriggerTask::CreateOutputObjects()
 
   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*)
@@ -119,6 +154,9 @@ void AliTriggerTask::Exec(Option_t*)
     return;
   }
   
+  // fill histograms
+  fPhysicsSelection->IsCollisionCandidate(fESD);
+  
   // check event type (should be PHYSICS = 7)
   AliESDHeader* esdHeader = fESD->GetHeader();
   if (!esdHeader)
@@ -133,19 +171,46 @@ void AliTriggerTask::Exec(Option_t*)
     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 *)
@@ -157,19 +222,35 @@ 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();
   
@@ -189,18 +270,20 @@ void AliTriggerTask::Terminate(Option_t *)
   
   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");