1 /* $Id: AliTriggerTask.cxx 35782 2009-10-22 11:54:31Z jgrosseo $ */
3 #include "AliTriggerTask.h"
13 #include <AliESDEvent.h>
14 #include <AliHeader.h>
15 #include <AliAnalysisManager.h>
16 #include <AliESDInputHandler.h>
17 #include <AliESDHeader.h>
18 #include <AliTriggerAnalysis.h>
20 ClassImp(AliTriggerTask)
22 AliTriggerTask::AliTriggerTask(const char* opt) :
23 AliAnalysisTask("AliTriggerTask", ""),
38 // Constructor. Initialization of pointers
41 // Define input and output slots here
42 DefineInput(0, TChain::Class());
43 DefineOutput(0, TList::Class());
47 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 };
48 fTriggerList = triggerList;
50 fStats = new TH1*[fNTriggers];
52 fTrigger = new AliTriggerAnalysis;
53 fTrigger->EnableHistograms();
55 AliLog::SetClassDebugLevel("AliTriggerTask", AliLog::kWarning);
58 AliTriggerTask::~AliTriggerTask()
64 // histograms are in the output list and deleted when the output
65 // list is deleted by the TSelector dtor
73 //________________________________________________________________________
74 void AliTriggerTask::ConnectInputData(Option_t *)
79 Printf("AliTriggerTask::ConnectInputData called");
81 AliESDInputHandler *esdH = dynamic_cast<AliESDInputHandler*> (AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler());
84 Printf("ERROR: Could not get ESDInputHandler");
86 fESD = esdH->GetEvent();
88 TString branches("AliESDHeader Vertex AliMultiplicity ALIESDVZERO ALIESDZDC FMD");
90 // Enable only the needed branches
91 esdH->SetActiveBranches(branches);
95 void AliTriggerTask::CreateOutputObjects()
97 // create result objects and add to output list
99 Printf("AliTriggerTask::CreateOutputObjects");
104 if (fStartTime == fEndTime)
105 AliWarning("Start and endtime not set. Automatic binning will be used. This does not work in parallel systems");
108 if (fEndTime - fStartTime > 0)
109 nBins = fEndTime - fStartTime + 1;
114 Int_t end = fEndTime - fStartTime;
122 for (Int_t i=0; i<fNTriggers; i++)
124 fStats[i] = new TH1F(Form("fStats_%d", i), Form("%s;%s;counts", AliTriggerAnalysis::GetTriggerName(fTriggerList[i]), (fUseOrbits) ? "orbit number" : "time"), nBins, start - 0.5, end + 0.5);
125 fOutput->Add(fStats[i]);
128 fFirstOrbit = new TParameter<Long_t> ("fFirstOrbit", 0);
129 fLastOrbit = new TParameter<Long_t> ("fLastOrbit", 0);
130 fOutput->Add(fFirstOrbit);
131 fOutput->Add(fLastOrbit);
133 fOutput->Add(fTrigger);
136 void AliTriggerTask::Exec(Option_t*)
140 // post the data already here
141 PostData(0, fOutput);
145 AliError("ESD branch not available");
149 // check event type (should be PHYSICS = 7)
150 AliESDHeader* esdHeader = fESD->GetHeader();
153 Printf("ERROR: esdHeader could not be retrieved");
158 UInt_t eventType = esdHeader->GetEventType();
161 Printf("Skipping event because it is of type %d", eventType);
165 //Printf("Trigger classes: %s:", fESD->GetFiredTriggerClasses().Data());
167 fTrigger->FillHistograms(fESD);
169 UInt_t timeStamp = 0;
171 timeStamp = fESD->GetOrbitNumber();
173 timeStamp = fESD->GetTimeStamp() - fStartTime;
174 //Printf("%d", timeStamp);
176 for (Int_t i = 0; i < fNTriggers; i++)
178 Bool_t triggered = fTrigger->IsOfflineTriggerFired(fESD, fTriggerList[i]);
180 fStats[i]->Fill(timeStamp);
181 //Printf("%s: %d", AliTriggerAnalysis::GetTriggerName(fTriggerList[i]), triggered);
184 if (fFirstOrbit->GetVal() == 0)
185 fFirstOrbit->SetVal(esdHeader->GetOrbitNumber());
187 fFirstOrbit->SetVal(TMath::Min(fFirstOrbit->GetVal(), (Long_t) esdHeader->GetOrbitNumber()));
189 fLastOrbit->SetVal(TMath::Max(fLastOrbit->GetVal(), (Long_t) esdHeader->GetOrbitNumber()));
192 void AliTriggerTask::Terminate(Option_t *)
194 // The Terminate() function is the last function to be called during
195 // a query. It always runs on the client, it can be used to present
196 // the results graphically or save the results to file.
198 fOutput = dynamic_cast<TList*> (GetOutputData(0));
200 Printf("ERROR: fOutput not available");
206 for (Int_t i=0; i<fNTriggers; i++)
207 fStats[i] = dynamic_cast<TH1*> (fOutput->FindObject(Form("fStats_%d", i)));
208 fTrigger = dynamic_cast<AliTriggerAnalysis*> (fOutput->FindObject("AliTriggerAnalysis"));
211 TFile* fout = new TFile("trigger.root", "RECREATE");
213 for (Int_t i=0; i<fNTriggers; i++)
217 fTrigger->WriteHistograms();
227 Int_t nX = (Int_t) TMath::Sqrt(fNTriggers);
230 while (nX * nY < fNTriggers)
238 TCanvas* c = new TCanvas("c", "c", 800, 800);
241 Printf("+++++++++ TRIGGER STATS:");
245 base = (Int_t) fStats[0]->Integral();
247 Int_t length = fEndTime - fStartTime;
249 for (Int_t i=0; i<fNTriggers; i++)
254 Printf("%s: %d triggers | %f %% of all triggered | Rate: %f Hz", AliTriggerAnalysis::GetTriggerName(fTriggerList[i]), (UInt_t) fStats[i]->Integral(), 100.0 * fStats[i]->Integral() / base, (length > 0) ? (fStats[i]->Integral() / length) : -1);
257 Printf("Writting result to trigger.root");