fMode(kLocalAnalysis),
fInitOK(kFALSE),
fDebug(0),
+ fSpecialOutputLocation(""),
fTasks(NULL),
fTopTasks(NULL),
fZombies(NULL),
fMode(other.fMode),
fInitOK(other.fInitOK),
fDebug(other.fDebug),
+ fSpecialOutputLocation(""),
fTasks(NULL),
fTopTasks(NULL),
fZombies(NULL),
while ((output=(AliAnalysisDataContainer*)next())) {
if (output->GetData() && !output->IsSpecialOutput()) {
if (output->GetProducer()->IsPostEventLoop()) continue;
+
+ const char *filename = output->GetFileName();
+ if (!(strcmp(filename, "default"))) {
+ if (fOutputEventHandler) filename = fOutputEventHandler->GetOutputFileName();
+ }
+ if (strlen(filename)) {
+ TFile *file = (TFile*)gROOT->GetListOfFiles()->FindObject(filename);
+ TDirectory *opwd = gDirectory;
+ if (file) file->cd();
+ else file = new TFile(filename, "RECREATE");
+ if (file->IsZombie()) continue;
+ // Clear file list to release object ownership to user.
+ // Save data to file, then close.
+ file->Clear();
+ output->GetData()->Write();
+ file->Close();
+ // Set null directory to histograms and trees.
+ TMethodCall callEnv;
+ if (output->GetData()->IsA())
+ callEnv.InitWithPrototype(output->GetData()->IsA(), "SetDirectory", "TDirectory*");
+ if (callEnv.IsValid()) {
+ callEnv.SetParam(Long_t(0));
+ callEnv.Execute(output->GetData());
+ }
+ // Restore current directory
+ if (opwd) opwd->cd();
+ }
AliAnalysisDataWrapper *wrap = output->ExportData();
// Output wrappers must delete data after merging (AG 13/11/07)
wrap->SetDeleteData(kTRUE);
remote += Form("%s_%d_", gSystem->HostName(), gid);
remote += output->GetFileName();
TFile::Cp(output->GetFileName(), remote.Data());
+ } else {
+ // No special location specified-> use TProofFile as merging utility
+ char line[256];
+ sprintf(line, "((TList*)0x%lx)->Add(new TProofFile(\"%s\"));",
+ (ULong_t)target, output->GetFileName());
+ gROOT->ProcessLine(line);
}
}
}
+ // Cleanup tasks on each slave
+ TIter nexttask(fTasks);
+ AliAnalysisTask *task;
+ while ((task=(AliAnalysisTask*)nexttask())) task->Cleanup();
}
if (fDebug > 1) {
printf("<-AliAnalysisManager::PackOutput: output list contains %d containers\n", target->GetSize());
//______________________________________________________________________________
void AliAnalysisManager::UnpackOutput(TList *source)
{
- // Called by AliAnalysisSelector::Terminate. Output containers should
- // be in source in the same order as in fOutputs.
+ // Called by AliAnalysisSelector::Terminate only on the client.
if (fDebug > 1) {
cout << "->AliAnalysisManager::UnpackOutput()" << endl;
}
if (fMCtruthEventHandler) fMCtruthEventHandler->BeginEvent(entry);
//
// Execute the tasks
- TIter next1(cont->GetConsumers());
+// TIter next1(cont->GetConsumers());
+ TIter next1(fTopTasks);
while ((task=(AliAnalysisTask*)next1())) {
if (fDebug >1) {
cout << " Executing task " << task->GetName() << endl;