+
+//______________________________________________________________________________
+void AliAnalysisManager::DoLoadBranch(const char *name)
+{
+ // Get tree and load branch if needed.
+ static Long64_t crtEntry = -100;
+
+ if (fAutoBranchHandling || !fTree)
+ return;
+
+ TBranch *br = dynamic_cast<TBranch*>(fTable.FindObject(name));
+ if (!br) {
+ br = fTree->GetBranch(name);
+ if (!br) {
+ Error("DoLoadBranch", "Could not find branch %s",name);
+ return;
+ }
+ fTable.Add(br);
+ }
+ if (br->GetReadEntry()==fCurrentEntry) return;
+ Int_t ret = br->GetEntry(GetCurrentEntry());
+ if (ret<0) {
+ Error("DoLoadBranch", "Could not load entry %lld from branch %s",GetCurrentEntry(), name);
+ if (crtEntry != fCurrentEntry) {
+ CountEvent(1,0,1,0);
+ crtEntry = fCurrentEntry;
+ }
+ } else {
+ if (crtEntry != fCurrentEntry) {
+ CountEvent(1,1,0,0);
+ crtEntry = fCurrentEntry;
+ }
+ }
+}
+
+//______________________________________________________________________________
+void AliAnalysisManager::AddStatisticsTask(UInt_t offlineMask)
+{
+// Add the statistics task to the manager.
+ if (fStatistics) {
+ Info("AddStatisticsTask", "Already added");
+ return;
+ }
+ TString line = Form("AliAnalysisTaskStat::AddToManager(%u);", offlineMask);
+ gROOT->ProcessLine(line);
+}
+
+//______________________________________________________________________________
+void AliAnalysisManager::CountEvent(Int_t ninput, Int_t nprocessed, Int_t nfailed, Int_t naccepted)
+{
+// Bookkeep current event;
+ if (!fStatistics) return;
+ fStatistics->AddInput(ninput);
+ fStatistics->AddProcessed(nprocessed);
+ fStatistics->AddFailed(nfailed);
+ fStatistics->AddAccepted(naccepted);
+}
+
+//______________________________________________________________________________
+void AliAnalysisManager::AddStatisticsMsg(const char *line)
+{
+// Add a line in the statistics message. If available, the statistics message is written
+// at the end of the SlaveTerminate phase on workers AND at the end of Terminate
+// on the client.
+ if (!strlen(line)) return;
+ if (!fStatisticsMsg.IsNull()) fStatisticsMsg += "\n";
+ fStatisticsMsg += line;
+}
+
+//______________________________________________________________________________
+void AliAnalysisManager::WriteStatisticsMsg(Int_t)
+{
+// If fStatistics is present, write the file in the format ninput_nprocessed_nfailed_naccepted.stat
+ static Bool_t done = kFALSE;
+ if (done) return;
+ done = kTRUE;
+ if (!fStatistics) return;
+ ofstream out;
+ AddStatisticsMsg(Form("Number of input events: %lld",fStatistics->GetNinput()));
+ AddStatisticsMsg(Form("Number of processed events: %lld",fStatistics->GetNprocessed()));
+ AddStatisticsMsg(Form("Number of failed events (I/O): %lld",fStatistics->GetNfailed()));
+ AddStatisticsMsg(Form("Number of accepted events for mask %s: %lld", AliAnalysisStatistics::GetMaskAsString(fStatistics->GetOfflineMask()), fStatistics->GetNaccepted()));
+ out.open(Form("%lld_%lld_%lld_%lld.stat",fStatistics->GetNinput(),
+ fStatistics->GetNprocessed(),fStatistics->GetNfailed(),
+ fStatistics->GetNaccepted()), ios::out);
+ out << fStatisticsMsg << endl;
+ out.close();
+}
+
+//______________________________________________________________________________
+const char* AliAnalysisManager::GetOADBPath()
+{
+// returns the path of the OADB
+// this static function just depends on environment variables
+
+ static TString oadbPath;
+
+ if (gSystem->Getenv("OADB_PATH"))
+ oadbPath = gSystem->Getenv("OADB_PATH");
+ else if (gSystem->Getenv("ALICE_ROOT"))
+ oadbPath.Form("%s/OADB", gSystem->Getenv("ALICE_ROOT"));
+ else
+ ::Fatal("AliAnalysisManager::GetOADBPath", "Cannot figure out AODB path. Define ALICE_ROOT or OADB_PATH!");
+
+ return oadbPath;
+}