]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PWG0/trigger/AliTriggerTask.cxx
adding trigger class analysis
[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   fUseOrbits(kFALSE),
30   fFirstOrbit(0),
31   fLastOrbit(0),
32   fNTriggers(0),
33   fTriggerList(0),
34   fStats(0),
35   fTrigger(0)
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   
45   fNTriggers = 14;
46   
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;
49   
50   fStats = new TH1*[fNTriggers];
51   
52   fTrigger = new AliTriggerAnalysis;
53   fTrigger->EnableHistograms();
54   
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();
103   
104   if (fStartTime == fEndTime)
105     AliWarning("Start and endtime not set. Automatic binning will be used. This does not work in parallel systems");
106
107   Int_t nBins = 1000;
108   if (fEndTime - fStartTime > 0)
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   
122   for (Int_t i=0; i<fNTriggers; i++)
123   {
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]);
126   }
127   
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   
133   fOutput->Add(fTrigger);
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   }
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   }*/
178   
179   fTrigger->FillHistograms(fESD);
180   
181   Long64_t timeStamp = 0;
182   if (fUseOrbits)
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   }
189   else
190     timeStamp = fESD->GetTimeStamp() - fStartTime;
191     
192   
193   //Printf("%d", timeStamp);
194   
195   //Annalisa Time (s) = 1440*period + 88*10-6 * orbit + 25*10-9 *bc
196   
197   for (Int_t i = 0; i < fNTriggers; i++)
198   {
199     Bool_t triggered = fTrigger->IsOfflineTriggerFired(fESD, fTriggerList[i]);
200     if (triggered)
201       fStats[i]->Fill(timeStamp);
202     //Printf("%s: %d", AliTriggerAnalysis::GetTriggerName(fTriggerList[i]), triggered);
203   }
204   
205   if (fFirstOrbit->GetVal() == 0)
206     fFirstOrbit->SetVal(timeStamp);
207   else
208     fFirstOrbit->SetVal(TMath::Min(fFirstOrbit->GetVal(), (Long_t) timeStamp));
209   
210   fLastOrbit->SetVal(TMath::Max(fLastOrbit->GetVal(), (Long_t) timeStamp));
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");
222     
223   fOutput->Print();
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)));
229     fTrigger = dynamic_cast<AliTriggerAnalysis*> (fOutput->FindObject("AliTriggerAnalysis"));
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();
237   if (fTrigger)
238   {
239     fTrigger->WriteHistograms();
240     fTrigger->PrintTriggerClasses();
241   }
242     
243   if (fFirstOrbit)
244     fFirstOrbit->Dump();
245   if (fLastOrbit)
246     fLastOrbit->Dump();
247     
248   fout->Write();
249   fout->Close();
250   
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   
262   TCanvas* c = new TCanvas("c", "c", 800, 800);
263   c->Divide(nX, nY);
264   
265   Printf("+++++++++ TRIGGER STATS:");
266
267   Int_t base = 1;
268   if (fStats[0])
269     base = (Int_t) fStats[0]->Integral();
270
271   Int_t length = fEndTime - fStartTime;
272   
273   for (Int_t i=0; i<fNTriggers; i++)
274     if (fStats[i])
275     {
276       c->cd(i+1);
277       fStats[i]->Draw();
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);
279     }
280
281   Printf("Writting result to trigger.root");
282 }