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 <AliPhysicsSelection.h>
20 ClassImp(AliTriggerTask)
22 AliTriggerTask::AliTriggerTask(const char* opt) :
23 AliAnalysisTask("AliTriggerTask", ""),
35 fTriggerClassesList(0),
40 // Constructor. Initialization of pointers
43 // Define input and output slots here
44 DefineInput(0, TChain::Class());
45 DefineOutput(0, TList::Class());
49 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 };
50 fTriggerList = triggerList;
53 static const char* triggerClassesList[] = { "CINT1B-ABCE-NOPF-ALL", "CINT1C-ABCE-NOPF-ALL", "CINT1A-ABCE-NOPF-ALL", "CINT1-E-NOPF-ALL" };
54 fTriggerClassesList = triggerClassesList;
56 fStats = new TH1**[fNTriggerClasses];
57 for (Int_t i=0; i<fNTriggerClasses; i++)
58 fStats[i] = new TH1*[fNTriggers];
61 AliTriggerTask::~AliTriggerTask()
67 // histograms are in the output list and deleted when the output
68 // list is deleted by the TSelector dtor
76 //________________________________________________________________________
77 void AliTriggerTask::ConnectInputData(Option_t *)
82 Printf("AliTriggerTask::ConnectInputData called");
84 AliESDInputHandler *esdH = dynamic_cast<AliESDInputHandler*> (AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler());
87 Printf("ERROR: Could not get ESDInputHandler");
89 fESD = esdH->GetEvent();
91 TString branches("AliESDHeader Vertex AliMultiplicity ALIESDVZERO ALIESDZDC FMD");
93 // Enable only the needed branches
94 esdH->SetActiveBranches(branches);
98 void AliTriggerTask::CreateOutputObjects()
100 // create result objects and add to output list
102 Printf("AliTriggerTask::CreateOutputObjects");
107 if (fStartTime == fEndTime)
108 AliWarning("Start and endtime not set. Automatic binning will be used. This does not work in parallel systems");
111 if (fEndTime - fStartTime > 0)
112 nBins = fEndTime - fStartTime + 1;
117 Int_t end = fEndTime - fStartTime;
125 for (Int_t j=0; j<fNTriggerClasses; j++)
127 for (Int_t i=0; i<fNTriggers; i++)
129 fStats[j][i] = new TH1F(Form("fStats_%d_%d", j, i), Form("%s %s;%s;counts", fTriggerClassesList[j], AliTriggerAnalysis::GetTriggerName(fTriggerList[i]), (fUseOrbits) ? "orbit number" : "time"), nBins, start - 0.5, end + 0.5);
130 fOutput->Add(fStats[j][i]);
134 fFirstOrbit = new TParameter<Long_t> ("fFirstOrbit", 0);
135 fLastOrbit = new TParameter<Long_t> ("fLastOrbit", 0);
136 fOutput->Add(fFirstOrbit);
137 fOutput->Add(fLastOrbit);
139 fOutput->Add(fPhysicsSelection);
141 AliLog::SetClassDebugLevel("AliPhysicsSelection", AliLog::kDebug);
144 void AliTriggerTask::Exec(Option_t*)
148 // post the data already here
149 PostData(0, fOutput);
153 AliError("ESD branch not available");
158 fPhysicsSelection->IsCollisionCandidate(fESD);
160 // check event type (should be PHYSICS = 7)
161 AliESDHeader* esdHeader = fESD->GetHeader();
164 Printf("ERROR: esdHeader could not be retrieved");
168 UInt_t eventType = esdHeader->GetEventType();
171 Printf("Skipping event because it is of type %d", eventType);
175 // TODO select on hardware trigger for histograms...
176 Int_t triggerClass = 0;
177 while (triggerClass < fNTriggerClasses && !fESD->IsTriggerClassFired(fTriggerClassesList[triggerClass]))
179 if (triggerClass == fNTriggerClasses)
181 Printf("Unknown trigger class %s. Skipping event", fESD->GetFiredTriggerClasses().Data());
185 Long64_t timeStamp = 0;
188 timeStamp = fESD->GetBunchCrossNumber();
189 timeStamp += (Long64_t) 3564 * (fESD->GetOrbitNumber() + fESD->GetPeriodNumber() * 16777215);
190 timeStamp = (Long64_t) (25e-9 * timeStamp);
191 timeStamp -= fStartTime;
194 timeStamp = fESD->GetTimeStamp() - fStartTime;
196 //Printf("%d", timeStamp);
198 //Annalisa Time (s) = 1440*period + 88*10-6 * orbit + 25*10-9 *bc
200 for (Int_t i = 0; i < fNTriggers; i++)
202 Bool_t triggered = fPhysicsSelection->GetTriggerAnalysis()->IsOfflineTriggerFired(fESD, fTriggerList[i]);
204 fStats[triggerClass][i]->Fill(timeStamp);
205 //Printf("%s: %d", AliTriggerAnalysis::GetTriggerName(fTriggerList[i]), triggered);
208 if (fFirstOrbit->GetVal() == 0)
209 fFirstOrbit->SetVal(timeStamp);
211 fFirstOrbit->SetVal(TMath::Min(fFirstOrbit->GetVal(), (Long_t) timeStamp));
213 fLastOrbit->SetVal(TMath::Max(fLastOrbit->GetVal(), (Long_t) timeStamp));
216 void AliTriggerTask::Terminate(Option_t *)
218 // The Terminate() function is the last function to be called during
219 // a query. It always runs on the client, it can be used to present
220 // the results graphically or save the results to file.
222 fOutput = dynamic_cast<TList*> (GetOutputData(0));
224 Printf("ERROR: fOutput not available");
230 for (Int_t j=0; j<fNTriggerClasses; j++)
231 for (Int_t i=0; i<fNTriggers; i++)
232 fStats[j][i] = dynamic_cast<TH1*> (fOutput->FindObject(Form("fStats_%d_%d", j, i)));
233 fPhysicsSelection = dynamic_cast<AliPhysicsSelection*> (fOutput->FindObject("AliPhysicsSelection"));
236 TFile* fout = new TFile("trigger.root", "RECREATE");
238 for (Int_t j=0; j<fNTriggerClasses; j++)
239 for (Int_t i=0; i<fNTriggers; i++)
241 fStats[j][i]->Write();
243 if (fPhysicsSelection)
245 fPhysicsSelection->SaveHistograms("physics_selection");
246 fPhysicsSelection->Print();
257 Int_t nX = (Int_t) TMath::Sqrt(fNTriggers);
260 while (nX * nY < fNTriggers)
268 TCanvas* c = new TCanvas("c", "c", 800, 800);
271 Printf("+++++++++ TRIGGER STATS:");
273 Int_t triggerClass = 0;
276 if (fStats[triggerClass][0])
277 base = (Int_t) fStats[triggerClass][0]->Integral();
279 Int_t length = fEndTime - fStartTime;
281 for (Int_t i=0; i<fNTriggers; i++)
282 if (fStats[triggerClass][i])
285 fStats[triggerClass][i]->Draw();
286 Printf("%s: %d triggers | %f %% of all triggered | Rate: %f Hz", AliTriggerAnalysis::GetTriggerName(fTriggerList[i]), (UInt_t) fStats[triggerClass][i]->Integral(), 100.0 * fStats[triggerClass][i]->Integral() / base, (length > 0) ? (fStats[triggerClass][i]->Integral() / length) : -1);
289 Printf("Writting result to trigger.root");