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),
TIter next(fOutputs);
AliAnalysisDataContainer *output;
while ((output=(AliAnalysisDataContainer*)next())) {
- if (output->GetData()) {
+ 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);
}
// Special outputs files are closed and copied on the remote location
if (output->IsSpecialOutput() && strlen(output->GetFileName())) {
+ TDirectory *opwd = gDirectory;
TFile *file = (TFile*)gROOT->GetListOfFiles()->FindObject(output->GetFileName());
if (!file) continue;
+ file->cd();
+ if (output->GetData()) output->GetData()->Write();
file->Close();
+ if (opwd) opwd->cd();
if (strlen(fSpecialOutputLocation.Data())) {
TString remote = fSpecialOutputLocation;
remote += "/";
- remote += gSystem->HostName();
+ Int_t gid = gROOT->ProcessLine("gProofServ->GetGroupId();");
+ 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());
AliAnalysisDataWrapper *wrap;
Int_t icont = 0;
while ((cont=(AliAnalysisDataContainer*)next())) {
- if (cont->GetProducer()->IsPostEventLoop()) continue;
+ if (cont->GetProducer()->IsPostEventLoop() ||
+ cont->IsSpecialOutput()) continue;
wrap = (AliAnalysisDataWrapper*)source->FindObject(cont->GetName());
if (!wrap && fDebug>1) {
printf("(WW) ImportWrappers: container %s not found in analysis output !\n", cont->GetName());
//______________________________________________________________________________
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;
}
Warning("StartAnalysis", "GRID analysis mode not implemented. Running local.");
fMode = kLocalAnalysis;
}
- char line[128];
+ char line[256];
SetEventLoop(kFALSE);
// Disable all branches if requested and set event loop mode
if (tree) {
TString ttype = "TTree";
if (tree->IsA() == TChain::Class()) {
chain = (TChain*)tree;
+ if (!chain || !chain->GetListOfFiles()->First()) {
+ Error("StartAnalysis", "Cannot process null or empty chain...");
+ return;
+ }
ttype = "TChain";
}
}
}
+//______________________________________________________________________________
+void AliAnalysisManager::StartAnalysis(const char *type, const char *dataset, Long64_t nentries, Long64_t firstentry)
+{
+// Start analysis for this manager on a given dataset. Analysis task can be:
+// LOCAL, PROOF or GRID. Process nentries starting from firstentry.
+ if (!fInitOK) {
+ Error("StartAnalysis","Analysis manager was not initialized !");
+ return;
+ }
+ if (fDebug>1) {
+ cout << "StartAnalysis: " << GetName() << endl;
+ }
+ TString anaType = type;
+ anaType.ToLower();
+ if (!anaType.Contains("proof")) {
+ Error("Cannot process datasets in %s mode. Try PROOF.", type);
+ return;
+ }
+ fMode = kProofAnalysis;
+ char line[256];
+ SetEventLoop(kTRUE);
+ // Set the dataset flag
+ TObject::SetBit(kUseDataSet);
+ fTree = 0;
+
+ // Initialize locally all tasks
+ TIter next(fTasks);
+ AliAnalysisTask *task;
+ while ((task=(AliAnalysisTask*)next())) {
+ task->LocalInit();
+ }
+
+ if (!gROOT->GetListOfProofs() || !gROOT->GetListOfProofs()->GetEntries()) {
+ printf("StartAnalysis: no PROOF!!!\n");
+ return;
+ }
+ sprintf(line, "gProof->AddInput((TObject*)0x%lx);", (ULong_t)this);
+ gROOT->ProcessLine(line);
+ sprintf(line, "gProof->GetDataSet(\"%s\");", dataset);
+ if (!gROOT->ProcessLine(line)) {
+ Error("StartAnalysis", "Dataset %s not found", dataset);
+ return;
+ }
+ sprintf(line, "gProof->Process(\"%s\", \"AliAnalysisSelector\", \"\", %lld, %lld);",
+ dataset, nentries, firstentry);
+ cout << "===== RUNNING PROOF ANALYSIS " << GetName() << " ON DATASET " << dataset << endl;
+ gROOT->ProcessLine(line);
+}
+
//______________________________________________________________________________
void AliAnalysisManager::ExecAnalysis(Option_t *option)
{
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;