]>
Commit | Line | Data |
---|---|---|
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 | |
20 | ClassImp(AliTriggerTask) | |
21 | ||
22 | AliTriggerTask::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 | ||
58 | AliTriggerTask::~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 | //________________________________________________________________________ | |
74 | void 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 | ||
95 | void 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 | ||
136 | void 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 | ||
213 | void 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 | } |