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 <AliTriggerAnalysis.h>
20 ClassImp(AliTriggerTask)
22 AliTriggerTask::AliTriggerTask(const char* opt) :
23 AliAnalysisTask("AliTriggerTask", ""),
38 // Constructor. Initialization of pointers
41 // Define input and output slots here
42 DefineInput(0, TChain::Class());
43 DefineOutput(0, TList::Class());
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;
50 fStats = new TH1*[fNTriggers];
52 fTrigger = new AliTriggerAnalysis;
53 fTrigger->EnableHistograms();
55 AliLog::SetClassDebugLevel("AliTriggerTask", AliLog::kWarning);
58 AliTriggerTask::~AliTriggerTask()
64 // histograms are in the output list and deleted when the output
65 // list is deleted by the TSelector dtor
73 //________________________________________________________________________
74 void AliTriggerTask::ConnectInputData(Option_t *)
79 Printf("AliTriggerTask::ConnectInputData called");
81 AliESDInputHandler *esdH = dynamic_cast<AliESDInputHandler*> (AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler());
84 Printf("ERROR: Could not get ESDInputHandler");
86 fESD = esdH->GetEvent();
88 TString branches("AliESDHeader Vertex AliMultiplicity ALIESDVZERO ALIESDZDC FMD");
90 // Enable only the needed branches
91 esdH->SetActiveBranches(branches);
95 void AliTriggerTask::CreateOutputObjects()
97 // create result objects and add to output list
99 Printf("AliTriggerTask::CreateOutputObjects");
104 if (fStartTime == fEndTime)
105 AliWarning("Start and endtime not set. Automatic binning will be used. This does not work in parallel systems");
108 if (fEndTime - fStartTime > 0)
109 nBins = fEndTime - fStartTime + 1;
114 Int_t end = fEndTime - fStartTime;
122 for (Int_t i=0; i<fNTriggers; i++)
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]);
128 fFirstOrbit = new TParameter<Long_t> ("fFirstOrbit", 0);
129 fLastOrbit = new TParameter<Long_t> ("fLastOrbit", 0);
130 fOutput->Add(fFirstOrbit);
131 fOutput->Add(fLastOrbit);
133 fOutput->Add(fTrigger);
136 void AliTriggerTask::Exec(Option_t*)
140 // post the data already here
141 PostData(0, fOutput);
145 AliError("ESD branch not available");
149 // check event type (should be PHYSICS = 7)
150 AliESDHeader* esdHeader = fESD->GetHeader();
153 Printf("ERROR: esdHeader could not be retrieved");
157 UInt_t eventType = esdHeader->GetEventType();
160 Printf("Skipping event because it is of type %d", eventType);
164 Printf("Trigger classes: %s:", fESD->GetFiredTriggerClasses().Data());
165 Printf("Bits: %lx %ld", fESD->GetTriggerMask(), fESD->GetTriggerMask());
167 fTrigger->FillTriggerClasses(fESD);
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"))
175 Printf("Skipping event because it has not the desired (hardware) trigger. The event has %s", fESD->GetFiredTriggerClasses().Data());
179 fTrigger->FillHistograms(fESD);
181 Long64_t timeStamp = 0;
184 timeStamp = fESD->GetBunchCrossNumber();
185 timeStamp += (Long64_t) 3564 * (fESD->GetOrbitNumber() + fESD->GetPeriodNumber() * 16777215);
186 timeStamp = (Long64_t) (25e-9 * timeStamp);
187 timeStamp -= fStartTime;
190 timeStamp = fESD->GetTimeStamp() - fStartTime;
193 //Printf("%d", timeStamp);
195 //Annalisa Time (s) = 1440*period + 88*10-6 * orbit + 25*10-9 *bc
197 for (Int_t i = 0; i < fNTriggers; i++)
199 Bool_t triggered = fTrigger->IsOfflineTriggerFired(fESD, fTriggerList[i]);
201 fStats[i]->Fill(timeStamp);
202 //Printf("%s: %d", AliTriggerAnalysis::GetTriggerName(fTriggerList[i]), triggered);
205 if (fFirstOrbit->GetVal() == 0)
206 fFirstOrbit->SetVal(timeStamp);
208 fFirstOrbit->SetVal(TMath::Min(fFirstOrbit->GetVal(), (Long_t) timeStamp));
210 fLastOrbit->SetVal(TMath::Max(fLastOrbit->GetVal(), (Long_t) timeStamp));
213 void AliTriggerTask::Terminate(Option_t *)
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.
219 fOutput = dynamic_cast<TList*> (GetOutputData(0));
221 Printf("ERROR: fOutput not available");
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"));
232 TFile* fout = new TFile("trigger.root", "RECREATE");
234 for (Int_t i=0; i<fNTriggers; i++)
239 fTrigger->WriteHistograms();
240 fTrigger->PrintTriggerClasses();
251 Int_t nX = (Int_t) TMath::Sqrt(fNTriggers);
254 while (nX * nY < fNTriggers)
262 TCanvas* c = new TCanvas("c", "c", 800, 800);
265 Printf("+++++++++ TRIGGER STATS:");
269 base = (Int_t) fStats[0]->Integral();
271 Int_t length = fEndTime - fStartTime;
273 for (Int_t i=0; i<fNTriggers; i++)
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);
281 Printf("Writting result to trigger.root");