]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PWG0/trigger/AliTriggerTask.cxx
first draft of physics event selection class
[u/mrichter/AliRoot.git] / PWG0 / trigger / AliTriggerTask.cxx
CommitLineData
ff8c4f30 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>
70fdd197 18#include <AliTriggerAnalysis.h>
ff8c4f30 19
20ClassImp(AliTriggerTask)
21
22AliTriggerTask::AliTriggerTask(const char* opt) :
23 AliAnalysisTask("AliTriggerTask", ""),
24 fESD(0),
25 fOutput(0),
26 fOption(opt),
c8d3e441 27 fStartTime(0),
28 fEndTime(0),
c2fff146 29 fUseOrbits(kFALSE),
30 fFirstOrbit(0),
31 fLastOrbit(0),
ff8c4f30 32 fNTriggers(0),
33 fTriggerList(0),
907972ff 34 fStats(0),
70fdd197 35 fTrigger(0)
ff8c4f30 36{
37 //
38 // Constructor. Initialization of pointers
39 //
40
41 // Define input and output slots here
42 DefineInput(0, TChain::Class());
43 DefineOutput(0, TList::Class());
44
c2fff146 45 fNTriggers = 14;
ff8c4f30 46
c2fff146 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 };
ff8c4f30 48 fTriggerList = triggerList;
49
50 fStats = new TH1*[fNTriggers];
51
70fdd197 52 fTrigger = new AliTriggerAnalysis;
53 fTrigger->EnableHistograms();
907972ff 54
ff8c4f30 55 AliLog::SetClassDebugLevel("AliTriggerTask", AliLog::kWarning);
56}
57
58AliTriggerTask::~AliTriggerTask()
59{
60 //
61 // Destructor
62 //
63
64 // histograms are in the output list and deleted when the output
65 // list is deleted by the TSelector dtor
66
67 if (fOutput) {
68 delete fOutput;
69 fOutput = 0;
70 }
71}
72
73//________________________________________________________________________
74void AliTriggerTask::ConnectInputData(Option_t *)
75{
76 // Connect ESD
77 // Called once
78
79 Printf("AliTriggerTask::ConnectInputData called");
80
81 AliESDInputHandler *esdH = dynamic_cast<AliESDInputHandler*> (AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler());
82
83 if (!esdH) {
84 Printf("ERROR: Could not get ESDInputHandler");
85 } else {
86 fESD = esdH->GetEvent();
87
88 TString branches("AliESDHeader Vertex AliMultiplicity ALIESDVZERO ALIESDZDC FMD");
89
90 // Enable only the needed branches
91 esdH->SetActiveBranches(branches);
92 }
93}
94
95void AliTriggerTask::CreateOutputObjects()
96{
97 // create result objects and add to output list
98
99 Printf("AliTriggerTask::CreateOutputObjects");
100
101 fOutput = new TList;
102 fOutput->SetOwner();
c8d3e441 103
104 if (fStartTime == fEndTime)
105 AliWarning("Start and endtime not set. Automatic binning will be used. This does not work in parallel systems");
ff8c4f30 106
c8d3e441 107 Int_t nBins = 1000;
108 if (fEndTime - fStartTime > 0)
c2fff146 109 nBins = fEndTime - fStartTime + 1;
110 if (nBins > 10000)
111 nBins = 10000;
112
113 Int_t start = 0;
114 Int_t end = fEndTime - fStartTime;
115
116 if (fUseOrbits)
117 {
118 start = fStartTime;
119 end = fEndTime;
120 }
121
ff8c4f30 122 for (Int_t i=0; i<fNTriggers; i++)
123 {
c2fff146 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);
ff8c4f30 125 fOutput->Add(fStats[i]);
126 }
907972ff 127
c2fff146 128 fFirstOrbit = new TParameter<Long_t> ("fFirstOrbit", 0);
129 fLastOrbit = new TParameter<Long_t> ("fLastOrbit", 0);
130 fOutput->Add(fFirstOrbit);
131 fOutput->Add(fLastOrbit);
132
70fdd197 133 fOutput->Add(fTrigger);
ff8c4f30 134}
135
136void AliTriggerTask::Exec(Option_t*)
137{
138 // process the event
139
140 // post the data already here
141 PostData(0, fOutput);
142
143 if (!fESD)
144 {
145 AliError("ESD branch not available");
146 return;
147 }
148
149 // check event type (should be PHYSICS = 7)
150 AliESDHeader* esdHeader = fESD->GetHeader();
151 if (!esdHeader)
152 {
153 Printf("ERROR: esdHeader could not be retrieved");
154 return;
155 }
156
157 UInt_t eventType = esdHeader->GetEventType();
158 if (eventType != 7)
159 {
160 Printf("Skipping event because it is of type %d", eventType);
161 return;
162 }
c01a136b 163
164 Printf("Trigger classes: %s:", fESD->GetFiredTriggerClasses().Data());
165 Printf("Bits: %lx %ld", fESD->GetTriggerMask(), fESD->GetTriggerMask());
166
167 fTrigger->FillTriggerClasses(fESD);
168
169 //if (!fESD->IsTriggerClassFired("CBEAMB-ABCE-NOPF-ALL"))
170 //if (!fESD->IsTriggerClassFired("CSMBB-ABCE-NOPF-ALL"))
171 //if (!fESD->IsTriggerClassFired("CBEAMB-ABCE-NOPF-ALL")) // run 104160
172 //if (!fESD->IsTriggerClassFired("CINT1B-ABCE-NOPF-ALL"))
173/* if (!fESD->IsTriggerClassFired("CINT1A-ABCE-NOPF-ALL"))
174 {
175 Printf("Skipping event because it has not the desired (hardware) trigger. The event has %s", fESD->GetFiredTriggerClasses().Data());
176 return;
177 }*/
ff8c4f30 178
70fdd197 179 fTrigger->FillHistograms(fESD);
907972ff 180
c01a136b 181 Long64_t timeStamp = 0;
c2fff146 182 if (fUseOrbits)
c01a136b 183 {
184 timeStamp = fESD->GetBunchCrossNumber();
185 timeStamp += (Long64_t) 3564 * (fESD->GetOrbitNumber() + fESD->GetPeriodNumber() * 16777215);
186 timeStamp = (Long64_t) (25e-9 * timeStamp);
187 timeStamp -= fStartTime;
188 }
c2fff146 189 else
190 timeStamp = fESD->GetTimeStamp() - fStartTime;
c01a136b 191
192
ff8c4f30 193 //Printf("%d", timeStamp);
194
c01a136b 195 //Annalisa Time (s) = 1440*period + 88*10-6 * orbit + 25*10-9 *bc
196
ff8c4f30 197 for (Int_t i = 0; i < fNTriggers; i++)
198 {
70fdd197 199 Bool_t triggered = fTrigger->IsOfflineTriggerFired(fESD, fTriggerList[i]);
ff8c4f30 200 if (triggered)
201 fStats[i]->Fill(timeStamp);
70fdd197 202 //Printf("%s: %d", AliTriggerAnalysis::GetTriggerName(fTriggerList[i]), triggered);
ff8c4f30 203 }
c2fff146 204
205 if (fFirstOrbit->GetVal() == 0)
c01a136b 206 fFirstOrbit->SetVal(timeStamp);
c2fff146 207 else
c01a136b 208 fFirstOrbit->SetVal(TMath::Min(fFirstOrbit->GetVal(), (Long_t) timeStamp));
c2fff146 209
c01a136b 210 fLastOrbit->SetVal(TMath::Max(fLastOrbit->GetVal(), (Long_t) timeStamp));
ff8c4f30 211}
212
213void AliTriggerTask::Terminate(Option_t *)
214{
215 // The Terminate() function is the last function to be called during
216 // a query. It always runs on the client, it can be used to present
217 // the results graphically or save the results to file.
218
219 fOutput = dynamic_cast<TList*> (GetOutputData(0));
220 if (!fOutput)
221 Printf("ERROR: fOutput not available");
c2fff146 222
223 fOutput->Print();
ff8c4f30 224
225 if (fOutput)
226 {
227 for (Int_t i=0; i<fNTriggers; i++)
228 fStats[i] = dynamic_cast<TH1*> (fOutput->FindObject(Form("fStats_%d", i)));
70fdd197 229 fTrigger = dynamic_cast<AliTriggerAnalysis*> (fOutput->FindObject("AliTriggerAnalysis"));
ff8c4f30 230 }
231
232 TFile* fout = new TFile("trigger.root", "RECREATE");
233
234 for (Int_t i=0; i<fNTriggers; i++)
235 if (fStats[i])
236 fStats[i]->Write();
70fdd197 237 if (fTrigger)
c01a136b 238 {
61899827 239 fTrigger->SaveHistograms();
c01a136b 240 fTrigger->PrintTriggerClasses();
241 }
907972ff 242
c2fff146 243 if (fFirstOrbit)
244 fFirstOrbit->Dump();
245 if (fLastOrbit)
246 fLastOrbit->Dump();
247
ff8c4f30 248 fout->Write();
249 fout->Close();
250
c8d3e441 251 Int_t nX = (Int_t) TMath::Sqrt(fNTriggers);
252 Int_t nY = nX;
253
254 while (nX * nY < fNTriggers)
255 {
256 if (nX == nY)
257 nX++;
258 else
259 nY++;
260 }
261
ff8c4f30 262 TCanvas* c = new TCanvas("c", "c", 800, 800);
c8d3e441 263 c->Divide(nX, nY);
264
265 Printf("+++++++++ TRIGGER STATS:");
7a11141c 266
267 Int_t base = 1;
268 if (fStats[0])
269 base = (Int_t) fStats[0]->Integral();
270
271 Int_t length = fEndTime - fStartTime;
ff8c4f30 272
273 for (Int_t i=0; i<fNTriggers; i++)
274 if (fStats[i])
275 {
276 c->cd(i+1);
277 fStats[i]->Draw();
70fdd197 278 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);
ff8c4f30 279 }
280
281 Printf("Writting result to trigger.root");
282}