#include <TSystem.h>
#include <TROOT.h>
#include <TCanvas.h>
+#include <TStopwatch.h>
#include "AliAnalysisSelector.h"
#include "AliAnalysisGrid.h"
fInputs = new TObjArray();
fOutputs = new TObjArray();
SetEventLoop(kTRUE);
+ TObject::SetObjectStat(kFALSE);
}
//______________________________________________________________________________
fOutputs = new TObjArray(*other.fOutputs);
fgCommonFileName = "AnalysisResults.root";
fgAnalysisManager = this;
+ TObject::SetObjectStat(kFALSE);
}
//______________________________________________________________________________
if (fOutputs) delete fOutputs;
if (fGridHandler) delete fGridHandler;
if (fgAnalysisManager==this) fgAnalysisManager = NULL;
+ TObject::SetObjectStat(kTRUE);
}
//______________________________________________________________________________
while ((cont=(AliAnalysisDataContainer*)next())) {
wrap = 0;
if (cont->GetProducer()->IsPostEventLoop() && !inGrid) continue;
+ if (cont->IsRegisterDataset()) continue;
const char *filename = cont->GetFileName();
Bool_t isManagedByHandler = kFALSE;
if (!(strcmp(filename, "default")) && fOutputEventHandler) {
// the results graphically.
if (fDebug > 0) printf("->AliAnalysisManager::Terminate()\n");
AliAnalysisTask *task;
+ AliAnalysisDataContainer *output;
TIter next(fTasks);
+ TStopwatch timer;
// Call Terminate() for tasks
- while ((task=(AliAnalysisTask*)next())) task->Terminate();
+ while (!IsSkipTerminate() && (task=(AliAnalysisTask*)next())) {
+ // Save all the canvases produced by the Terminate
+ TString pictname = Form("%s_%s", task->GetName(), task->ClassName());
+ task->Terminate();
+ if (TObject::TestBit(kSaveCanvases)) {
+ if (!gROOT->IsBatch()) {
+ Warning("Terminate", "Waiting 5 sec for %s::Terminate() to finish drawing", task->ClassName());
+ timer.Start();
+ while (timer.CpuTime()<5) {
+ timer.Continue();
+ gSystem->ProcessEvents();
+ }
+ }
+ Int_t iend = gROOT->GetListOfCanvases()->GetEntries();
+ if (iend==0) continue;
+ TCanvas *canvas;
+ for (Int_t ipict=0; ipict<iend; ipict++) {
+ canvas = (TCanvas*)gROOT->GetListOfCanvases()->At(ipict);
+ if (!canvas) continue;
+ canvas->SaveAs(Form("%s_%02d.gif", pictname.Data(),ipict));
+ }
+ gROOT->GetListOfCanvases()->Delete();
+ }
+ }
//
TIter next1(fOutputs);
- AliAnalysisDataContainer *output;
while ((output=(AliAnalysisDataContainer*)next1())) {
// Special outputs or grid files have the files already closed and written.
if (fMode == kGridAnalysis) continue;
- if (output->IsSpecialOutput()&&(fMode == kProofAnalysis)) continue;
+ if (fMode == kProofAnalysis) {
+ if (output->IsSpecialOutput() || output->IsRegisterDataset()) continue;
+ }
const char *filename = output->GetFileName();
if (!(strcmp(filename, "default"))) {
if (fOutputEventHandler) filename = fOutputEventHandler->GetOutputFileName();
anaType.ToLower();
fMode = kLocalAnalysis;
Bool_t runlocalinit = kTRUE;
- if (anaType.Contains("file")) runlocalinit = kFALSE;
+ if (anaType.Contains("file")) {
+ runlocalinit = kFALSE;
+ SetSkipTerminate(kTRUE);
+ }
if (anaType.Contains("proof")) fMode = kProofAnalysis;
else if (anaType.Contains("grid")) fMode = kGridAnalysis;
else if (anaType.Contains("mix")) fMode = kMixingAnalysis;
task->CreateOutputObjects();
if (curdir) curdir->cd();
}
+ if (IsExternalLoop()) {
+ Info("StartAnalysis", "Initialization done. Event loop is controlled externally.\
+ \nSetData for top container, call ExecAnalysis in a loop and then Terminate manually");
+ return;
+ }
ExecAnalysis();
Terminate();
return;
// Get the actual file
line = Form("((TProofOutputFile*)0x%lx)->GetFileName();", (ULong_t)pof);
filename = (const char*)gROOT->ProcessLine(line);
+ if (fDebug>1) {
+ printf("File: %s already booked via TProofOutputFile\n", filename.Data());
+ }
f = (TFile*)gROOT->GetListOfFiles()->FindObject(filename);
if (!f) Fatal("OpenProofFile", "Proof output file found but no file opened for %s", filename.Data());
// Check if option "UPDATE" was preserved
if ((opt=="UPDATE") && (opt!=f->GetOption()))
Fatal("OpenProofFile", "File %s already opened, but not in UPDATE mode!", cont->GetFileName());
} else {
- line = Form("TProofOutputFile *pf = new TProofOutputFile(\"%s\");", filename.Data());
+ if (cont->IsRegisterDataset()) {
+ TString dset_name = filename;
+ dset_name.ReplaceAll(".root", cont->GetTitle());
+ dset_name.ReplaceAll(":","_");
+ if (fDebug>1) printf("Booking dataset: %s\n", dset_name.Data());
+ line = Form("TProofOutputFile *pf = new TProofOutputFile(\"%s\", \"DROV\", \"%s\");", filename.Data(), dset_name.Data());
+ } else {
+ if (fDebug>1) printf("Booking TProofOutputFile: %s to be merged\n", filename.Data());
+ line = Form("TProofOutputFile *pf = new TProofOutputFile(\"%s\");", filename.Data());
+ }
if (fDebug > 1) printf("=== %s\n", line.Data());
gROOT->ProcessLine(line);
line = Form("pf->OpenFile(\"%s\");", option);
}
// Add to proof output list
line = Form("((TList*)0x%lx)->Add(pf);",(ULong_t)fSelector->GetOutputList());
- if (fDebug > 1) printf("=== %s", line.Data());
+ if (fDebug > 1) printf("=== %s\n", line.Data());
gROOT->ProcessLine(line);
}
if (f && !f->IsZombie() && !f->TestBit(TFile::kRecovered)) {
TDirectory *cdir = gDirectory;
TString openedFiles;
while ((output=(AliAnalysisDataContainer*)next())) {
+ if (output->IsRegisterDataset()) continue;
TString filename = output->GetFileName();
if (filename == "default") {
if (!fOutputEventHandler) continue;