]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PWG0/trigger/AliTriggerTask.cxx
b9ba5493a3c98bf25c1c868c15a977fd4270ea1f
[u/mrichter/AliRoot.git] / PWG0 / trigger / AliTriggerTask.cxx
1 /* $Id: AliTriggerTask.cxx 35782 2009-10-22 11:54:31Z jgrosseo $ */
2
3 #include "AliTriggerTask.h"
4
5 #include <TCanvas.h>
6 #include <TFile.h>
7 #include <TChain.h>
8 #include <TH1F.h>
9 #include <TH2F.h>
10 #include <TH3F.h>
11
12 #include <AliLog.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>
19
20 ClassImp(AliTriggerTask)
21
22 AliTriggerTask::AliTriggerTask(const char* opt) :
23   AliAnalysisTask("AliTriggerTask", ""),
24   fESD(0),
25   fOutput(0),
26   fOption(opt),
27   fStartTime(0),
28   fEndTime(0),
29   fNTriggers(0),
30   fTriggerList(0),
31   fStats(0),
32   fTrigger(0)
33 {
34   //
35   // Constructor. Initialization of pointers
36   //
37
38   // Define input and output slots here
39   DefineInput(0, TChain::Class());
40   DefineOutput(0, TList::Class());
41   
42   fNTriggers = 13;
43   
44   static AliTriggerAnalysis::Trigger triggerList[] = { AliTriggerAnalysis::kAcceptAll, AliTriggerAnalysis::kFPANY, AliTriggerAnalysis::kMB1, AliTriggerAnalysis::kMB2, AliTriggerAnalysis::kMB3, AliTriggerAnalysis::kSPDGFO, AliTriggerAnalysis::kV0A, AliTriggerAnalysis::kV0C, AliTriggerAnalysis::kZDC, AliTriggerAnalysis::kZDCA, AliTriggerAnalysis::kZDCC, AliTriggerAnalysis::kFMDA, AliTriggerAnalysis::kFMDC };
45   fTriggerList = triggerList;
46   
47   fStats = new TH1*[fNTriggers];
48   
49   fTrigger = new AliTriggerAnalysis;
50   fTrigger->EnableHistograms();
51   
52   AliLog::SetClassDebugLevel("AliTriggerTask", AliLog::kWarning);
53 }
54
55 AliTriggerTask::~AliTriggerTask()
56 {
57   //
58   // Destructor
59   //
60
61   // histograms are in the output list and deleted when the output
62   // list is deleted by the TSelector dtor
63
64   if (fOutput) {
65     delete fOutput;
66     fOutput = 0;
67   }
68 }
69
70 //________________________________________________________________________
71 void AliTriggerTask::ConnectInputData(Option_t *)
72 {
73   // Connect ESD
74   // Called once
75
76   Printf("AliTriggerTask::ConnectInputData called");
77
78   AliESDInputHandler *esdH = dynamic_cast<AliESDInputHandler*> (AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler());
79
80   if (!esdH) {
81     Printf("ERROR: Could not get ESDInputHandler");
82   } else {
83     fESD = esdH->GetEvent();
84     
85     TString branches("AliESDHeader Vertex AliMultiplicity ALIESDVZERO ALIESDZDC FMD");
86
87     // Enable only the needed branches
88     esdH->SetActiveBranches(branches);
89   }
90 }
91
92 void AliTriggerTask::CreateOutputObjects()
93 {
94   // create result objects and add to output list
95
96   Printf("AliTriggerTask::CreateOutputObjects");
97
98   fOutput = new TList;
99   fOutput->SetOwner();
100   
101   if (fStartTime == fEndTime)
102     AliWarning("Start and endtime not set. Automatic binning will be used. This does not work in parallel systems");
103
104   Int_t nBins = 1000;
105   if (fEndTime - fStartTime > 0)
106     nBins = fEndTime - fStartTime;
107   for (Int_t i=0; i<fNTriggers; i++)
108   {
109     fStats[i] = new TH1F(Form("fStats_%d", i), Form("%s;time;counts", AliTriggerAnalysis::GetTriggerName(fTriggerList[i])), nBins, 0, fEndTime - fStartTime);
110     fOutput->Add(fStats[i]);
111   }
112   
113   fOutput->Add(fTrigger);
114 }
115
116 void AliTriggerTask::Exec(Option_t*)
117 {
118   // process the event
119
120   // post the data already here
121   PostData(0, fOutput);
122
123   if (!fESD)
124   {
125     AliError("ESD branch not available");
126     return;
127   }
128   
129   // check event type (should be PHYSICS = 7)
130   AliESDHeader* esdHeader = fESD->GetHeader();
131   if (!esdHeader)
132   {
133     Printf("ERROR: esdHeader could not be retrieved");
134     return;
135   }
136   
137   UInt_t eventType = esdHeader->GetEventType();
138   if (eventType != 7)
139   {
140     Printf("Skipping event because it is of type %d", eventType);
141     return;
142   }
143
144   //Printf("Trigger classes: %s:", fESD->GetFiredTriggerClasses().Data());
145   
146   fTrigger->FillHistograms(fESD);
147   
148   UInt_t timeStamp = fESD->GetTimeStamp() - fStartTime;
149   //Printf("%d", timeStamp);
150   
151   for (Int_t i = 0; i < fNTriggers; i++)
152   {
153     Bool_t triggered = fTrigger->IsOfflineTriggerFired(fESD, fTriggerList[i]);
154     if (triggered)
155       fStats[i]->Fill(timeStamp);
156     //Printf("%s: %d", AliTriggerAnalysis::GetTriggerName(fTriggerList[i]), triggered);
157   }
158 }
159
160 void AliTriggerTask::Terminate(Option_t *)
161 {
162   // The Terminate() function is the last function to be called during
163   // a query. It always runs on the client, it can be used to present
164   // the results graphically or save the results to file.
165
166   fOutput = dynamic_cast<TList*> (GetOutputData(0));
167   if (!fOutput)
168     Printf("ERROR: fOutput not available");
169
170   if (fOutput)
171   {
172     for (Int_t i=0; i<fNTriggers; i++)
173       fStats[i] = dynamic_cast<TH1*> (fOutput->FindObject(Form("fStats_%d", i)));
174     fTrigger = dynamic_cast<AliTriggerAnalysis*> (fOutput->FindObject("AliTriggerAnalysis"));
175   }
176
177   TFile* fout = new TFile("trigger.root", "RECREATE");
178
179   for (Int_t i=0; i<fNTriggers; i++)
180     if (fStats[i])
181       fStats[i]->Write();
182   if (fTrigger)
183     fTrigger->WriteHistograms();
184     
185   fout->Write();
186   fout->Close();
187   
188   Int_t nX = (Int_t) TMath::Sqrt(fNTriggers);
189   Int_t nY = nX;
190   
191   while (nX * nY < fNTriggers)
192   {
193     if (nX == nY)
194       nX++;
195     else
196       nY++;
197   }
198   
199   TCanvas* c = new TCanvas("c", "c", 800, 800);
200   c->Divide(nX, nY);
201   
202   Printf("+++++++++ TRIGGER STATS:");
203
204   Int_t base = 1;
205   if (fStats[0])
206     base = (Int_t) fStats[0]->Integral();
207
208   Int_t length = fEndTime - fStartTime;
209   
210   for (Int_t i=0; i<fNTriggers; i++)
211     if (fStats[i])
212     {
213       c->cd(i+1);
214       fStats[i]->Draw();
215       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);
216     }
217
218   Printf("Writting result to trigger.root");
219 }