Skip to content

Commit

Permalink
This commit was manufactured by cvs2svn to create tag 'v4-05-14'.
Browse files Browse the repository at this point in the history
  • Loading branch information
(no author) committed May 9, 2007
1 parent 524ecd4 commit 66ee624
Show file tree
Hide file tree
Showing 186 changed files with 5,056 additions and 10,583 deletions.
4 changes: 3 additions & 1 deletion ANALYSIS/AliAnalysisDataContainer.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,7 @@ AliAnalysisDataContainer::AliAnalysisDataContainer() : TNamed(),
fConsumers(NULL)
{
// Dummy ctor.
TObject::SetBit(kContEvtByEvt, kTRUE);
}

//______________________________________________________________________________
Expand All @@ -81,6 +82,7 @@ AliAnalysisDataContainer::AliAnalysisDataContainer(const char *name, TClass *typ
{
// Default constructor.
SetTitle(fType->GetName());
TObject::SetBit(kContEvtByEvt, kTRUE);
}

//______________________________________________________________________________
Expand Down Expand Up @@ -266,7 +268,7 @@ void AliAnalysisDataContainer::PrintContainer(Option_t *option, Int_t indent) co
opt.ToLower();
Bool_t dep = (opt.Contains("dep"))?kTRUE:kFALSE;
if (!dep) {
printf("%sContainer: %s type: %s POST_LOOP=%i", ind.Data(), GetName(), GetTitle(), IsPostEventLoop());
printf("%sContainer: %s type: %s", ind.Data(), GetName(), GetTitle());
if (fProducer)
printf("%s = Data producer: task %s",ind.Data(),fProducer->GetName());
else
Expand Down
6 changes: 3 additions & 3 deletions ANALYSIS/AliAnalysisDataContainer.h
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ enum ENotifyMessage {
kFileChange
};
enum EAnalysisContainerFlags {
kPostEventLoop = BIT(14)
kContEvtByEvt
};
AliAnalysisDataContainer();
AliAnalysisDataContainer(const AliAnalysisDataContainer &cont);
Expand All @@ -59,7 +59,7 @@ enum EAnalysisContainerFlags {
void ResetDataReady() {fDataReady = kFALSE;}
virtual Bool_t SetData(TObject *data, Option_t *option="");
void SetDataOwned(Bool_t flag) {fOwnedData = flag;}
void SetPostEventLoop(Bool_t flag=kTRUE) {TObject::SetBit(kPostEventLoop,flag);}
void SetEventByEvent(Bool_t flag=kTRUE) {TObject::SetBit(kContEvtByEvt,flag);}
void SetFileName(const char *filename) {fFileName = filename;}
void SetProducer(AliAnalysisTask *prod, Int_t islot);
void AddConsumer(AliAnalysisTask *cons, Int_t islot);
Expand All @@ -69,7 +69,7 @@ enum EAnalysisContainerFlags {
void ImportData(AliAnalysisDataWrapper *pack);
// Container status checking
Bool_t IsDataReady() const {return fDataReady;}
Bool_t IsPostEventLoop() const {return TObject::TestBit(kPostEventLoop);}
Bool_t IsEventByEvent() const {return TObject::TestBit(kContEvtByEvt);}
Bool_t IsOwnedData() const {return fOwnedData;}
Bool_t ClientsExecuted() const;
Bool_t HasConsumers() const {return (fConsumers != 0);}
Expand Down
35 changes: 11 additions & 24 deletions ANALYSIS/AliAnalysisDataSlot.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -138,30 +138,6 @@ void *AliAnalysisDataSlot::GetBranchAddress(const char *branchname) const
return br->GetAddress();
}

//______________________________________________________________________________
Int_t AliAnalysisDataSlot::EnableBranch(const char *bname, TTree *tree)
{
// Static method to enable recursively a branch in a tree (why this in not in ROOT?)
TBranch *branch = tree->GetBranch(bname);
Int_t count = 0;
// static Int_t indent = 0;
if (!branch) return count;
// TString s;
// for (Int_t i=0; i<indent; i++) s += " ";
count++;
// printf("%sbranch %s: kDoNotProcess=%d\n",s.Data(), branch->GetName(), branch->TestBit(kDoNotProcess));
branch->SetBit(kDoNotProcess, kFALSE);
TIter next(branch->GetListOfBranches());
TBranch *branch_sub;
// Activate all sub-branches
// indent++;
while ((branch_sub=(TBranch*)next())) {
count += AliAnalysisDataSlot::EnableBranch(branch_sub->GetName(), tree);
}
// indent--;
return count;
}

//______________________________________________________________________________
Bool_t AliAnalysisDataSlot::SetBranchAddress(const char *branchname, void *address)
{
Expand All @@ -172,6 +148,17 @@ Bool_t AliAnalysisDataSlot::SetBranchAddress(const char *branchname, void *addre
return kFALSE;
}
TTree *tree = (TTree*)GetData();
// Activate the branch itself
tree->SetBranchStatus(branchname,1);
TBranch *branch = tree->GetBranch(branchname);
if (!branch) return kFALSE;
TIter next(branch->GetListOfLeaves());
TLeaf *leaf;
// Activate all sub-branches
while ((leaf=(TLeaf*)next())) {
branch = (TBranch*)leaf->GetBranch();
tree->SetBranchStatus(branch->GetName(),1);
}
tree->SetBranchAddress(branchname, address);
return kTRUE;
}
Expand Down
2 changes: 0 additions & 2 deletions ANALYSIS/AliAnalysisDataSlot.h
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@
#endif

class TClass;
class TTree;
class AliAnalysisDataContainer;
class AliAnalysisTask;

Expand All @@ -34,7 +33,6 @@ class AliAnalysisDataSlot : public TNamed {
AliAnalysisDataSlot &operator=(const AliAnalysisDataSlot &slot);
// Connect some container to the slot
Bool_t ConnectContainer(AliAnalysisDataContainer *cont);
static Int_t EnableBranch(const char *bname, TTree *tree);
// Getters
void *GetBranchAddress(const char *branch) const;
Bool_t SetBranchAddress(const char *branch, void *address);
Expand Down
72 changes: 27 additions & 45 deletions ANALYSIS/AliAnalysisManager.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,6 @@ AliAnalysisManager::AliAnalysisManager()
{
// Dummy constructor.
fgAnalysisManager = this;
SetEventLoop(kTRUE);
}

//______________________________________________________________________________
Expand All @@ -85,7 +84,6 @@ AliAnalysisManager::AliAnalysisManager(const char *name, const char *title)
fContainers = new TObjArray();
fInputs = new TObjArray();
fOutputs = new TObjArray();
SetEventLoop(kTRUE);
}

//______________________________________________________________________________
Expand Down Expand Up @@ -347,24 +345,6 @@ void AliAnalysisManager::UnpackOutput(TList *source)
AliAnalysisDataContainer *output;
while ((output=(AliAnalysisDataContainer*)next())) {
if (!output->GetData()) continue;
// Check if there are client tasks that run post event loop
if (output->HasConsumers()) {
// Disable event loop semaphore
output->SetPostEventLoop(kTRUE);
TObjArray *list = output->GetConsumers();
Int_t ncons = list->GetEntriesFast();
for (Int_t i=0; i<ncons; i++) {
AliAnalysisTask *task = (AliAnalysisTask*)list->At(i);
task->CheckNotify(kTRUE);
// If task is active, execute it
if (task->IsPostEventLoop() && task->IsActive()) {
if (fDebug > 1) {
cout << "== Executing post event loop task " << task->GetName() << endl;
}
task->ExecuteTask();
}
}
}
// Check if the output need to be written to a file.
const char *filename = output->GetFileName();
if (!filename || !strlen(filename)) continue;
Expand All @@ -381,6 +361,17 @@ void AliAnalysisManager::UnpackOutput(TList *source)
callEnv.Execute(output->GetData());
}
output->GetData()->Write();
// Check if there are client tasks that run in single-shot mode.
if (!output->HasConsumers()) continue;
output->SetEventByEvent(kFALSE);
TObjArray *list = output->GetConsumers();
Int_t ncons = list->GetEntriesFast();
for (Int_t i=0; i<ncons; i++) {
AliAnalysisTask *task = (AliAnalysisTask*)list->At(i);
task->CheckNotify(kTRUE);
// If task is active, execute it
if (task->IsActive()) task->ExecuteTask();
}
}
if (fDebug > 1) {
cout << "<-AliAnalysisManager::UnpackOutput()" << endl;
Expand Down Expand Up @@ -429,17 +420,14 @@ AliAnalysisDataContainer *AliAnalysisManager::CreateContainer(const char *name,
// kExchangeContainer = 0, used to exchange date between tasks
// kInputContainer = 1, used to store input data
// kOutputContainer = 2, used for posting results
if (fContainers->FindObject(name)) {
Error("CreateContainer","A container named %s already defined !\n",name);
return NULL;
}
AliAnalysisDataContainer *cont = new AliAnalysisDataContainer(name, datatype);
fContainers->Add(cont);
switch (type) {
case kInputContainer:
fInputs->Add(cont);
break;
case kOutputContainer:
if (fOutputs->FindObject(name)) printf("CreateContainer: warning: a container named %s existing !\n",name);
fOutputs->Add(cont);
if (filename && strlen(filename)) cont->SetFileName(filename);
break;
Expand Down Expand Up @@ -561,22 +549,6 @@ Bool_t AliAnalysisManager::InitAnalysis()
return kFALSE;
}
}
// Check that all containers feeding post-event loop tasks are in the outputs list
TIter nextcont(fContainers); // loop over all containers
while ((cont=(AliAnalysisDataContainer*)nextcont())) {
if (!cont->IsPostEventLoop() && !fOutputs->FindObject(cont)) {
if (cont->HasConsumers()) {
// Check if one of the consumers is post event loop
TIter nextconsumer(cont->GetConsumers());
while ((task=(AliAnalysisTask*)nextconsumer())) {
if (task->IsPostEventLoop()) {
fOutputs->Add(cont);
break;
}
}
}
}
}
fInitOK = kTRUE;
return kTRUE;
}
Expand Down Expand Up @@ -622,21 +594,31 @@ void AliAnalysisManager::StartAnalysis(const char *type, TTree *tree)
}
char line[128];
SetEventLoop(kFALSE);
// Disable all branches if requested and set event loop mode
// Disable by default all branches and set event loop mode
if (tree) {
if (TestBit(kDisableBranches)) {
printf("Disabling all branches...\n");
// tree->SetBranchStatus("*",0); // not yet working
}
// tree->SetBranchStatus("*",0);
SetEventLoop(kTRUE);
}
AliAnalysisDataContainer *cont = 0;
TIter nextc(fInputs);
// Force top containers have the same event loop type as the analysis
while ((cont=(AliAnalysisDataContainer*)nextc())) cont->SetEventByEvent(IsEventLoop());
AliAnalysisDataContainer *cont_top = (AliAnalysisDataContainer*)fInputs->First();

TChain *chain = dynamic_cast<TChain*>(tree);

// Initialize locally all tasks
TIter next(fTasks);
AliAnalysisTask *task;
while ((task=(AliAnalysisTask*)next())) {
for (Int_t islot=0; islot<task->GetNinputs(); islot++) {
cont = task->GetInputSlot(islot)->GetContainer();
if (cont==cont_top) break;
cont = 0;
}
// All tasks feeding from the top containers must have the same event loop type
// if (cont) task->SetExecPerEvent(IsEventLoop());
// else task->SetExecPerEvent(task->IsExecPerEvent());
task->LocalInit();
}

Expand Down
4 changes: 1 addition & 3 deletions ANALYSIS/AliAnalysisManager.h
Original file line number Diff line number Diff line change
Expand Up @@ -39,8 +39,7 @@ enum EAliAnalysisExecMode {
};

enum EAliAnalysisFlags {
kEventLoop = BIT(14),
kDisableBranches = BIT(15)
kEventLoop = BIT(14)
};

AliAnalysisManager();
Expand Down Expand Up @@ -80,7 +79,6 @@ enum EAliAnalysisFlags {
void SetAnalysisType(EAliAnalysisExecMode mode) {fMode = mode;}
void SetCurrentEntry(Long64_t entry) {fCurrentEntry = entry;}
void SetDebugLevel(UInt_t level) {fDebug = level;}
void SetDisableBranches(Bool_t disable=kTRUE) {TObject::SetBit(kDisableBranches,disable);}

// Container handling
AliAnalysisDataContainer *CreateContainer(const char *name, TClass *datatype,
Expand Down
39 changes: 11 additions & 28 deletions ANALYSIS/AliAnalysisTask.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,6 @@
#include <Riostream.h>
#include <TFile.h>
#include <TClass.h>
#include <TTree.h>

#include "AliAnalysisTask.h"
#include "AliAnalysisDataSlot.h"
Expand All @@ -121,6 +120,7 @@ AliAnalysisTask::AliAnalysisTask()
fOutputs(NULL)
{
// Default constructor.
TObject::SetBit(kTaskEvtByEvt, kTRUE);
}

//______________________________________________________________________________
Expand All @@ -136,6 +136,7 @@ AliAnalysisTask::AliAnalysisTask(const char *name, const char *title)
fOutputs(NULL)
{
// Constructor.
TObject::SetBit(kTaskEvtByEvt, kTRUE);
fInputs = new TObjArray(2);
fOutputs = new TObjArray(2);
}
Expand Down Expand Up @@ -232,11 +233,13 @@ void AliAnalysisTask::CheckNotify(Bool_t init)
// accordingly. This method is called automatically for all tasks connected
// to a container where the data was published.
if (init) fInitialized = kFALSE;
Bool_t single_shot = IsPostEventLoop();
// Bool_t execperevent = IsExecPerEvent();
AliAnalysisDataContainer *cinput;
for (Int_t islot=0; islot<fNinputs; islot++) {
cinput = GetInputSlot(islot)->GetContainer();
if (!cinput->GetData() || (single_shot && !cinput->IsPostEventLoop())) {
if (!cinput) return;
if (!cinput->GetData()) {
// if (!cinput->GetData() || execperevent!=cinput->IsEventByEvent()) {
SetActive(kFALSE);
return;
}
Expand Down Expand Up @@ -287,8 +290,6 @@ Bool_t AliAnalysisTask::ConnectOutput(Int_t islot, AliAnalysisDataContainer *con
}
// Connect the slot to the container as output
if (!output->ConnectContainer(cont)) return kFALSE;
// Set event loop type the same as for the task
cont->SetPostEventLoop(IsPostEventLoop());
// Declare this as the data producer
cont->SetProducer(this, islot);
AreSlotsConnected();
Expand Down Expand Up @@ -384,24 +385,6 @@ Bool_t AliAnalysisTask::SetBranchAddress(Int_t islot, const char *branch, void *
return GetInputSlot(islot)->SetBranchAddress(branch, address);
}

//______________________________________________________________________________
void AliAnalysisTask::EnableBranch(Int_t islot, const char *bname) const
{
// Call this in ConnectInputData() to enable only the branches needed by this
// task. "*" will enable everything.
AliAnalysisDataSlot *input = GetInputSlot(islot);
if (!input || !input->GetType()->InheritsFrom(TTree::Class())) {
Error("EnableBranch", "Wrong slot type #%d for task %s: not TTree-derived type", islot, GetName());
return;
}
TTree *tree = (TTree*)input->GetData();
if (!strcmp(bname, "*")) {
tree->SetBranchStatus("*",1);
return;
}
AliAnalysisDataSlot::EnableBranch(bname, tree);
}

//______________________________________________________________________________
void AliAnalysisTask::ConnectInputData(Option_t *)
{
Expand Down Expand Up @@ -539,7 +522,7 @@ void AliAnalysisTask::PrintTask(Option_t *option, Int_t indent) const
AliAnalysisDataContainer *cont;
for (Int_t i=0; i<indent; i++) ind += " ";
if (!dep || (dep && IsChecked())) {
printf("%s\n", Form("%stask: %s ACTIVE=%i POST_LOOP=%i", ind.Data(), GetName(),IsActive(),IsPostEventLoop()));
printf("%s\n", Form("%stask: %s ACTIVE=%i", ind.Data(), GetName(),IsActive()));
if (dep) thistask->SetChecked(kFALSE);
else {
for (islot=0; islot<fNinputs; islot++) {
Expand Down Expand Up @@ -574,16 +557,16 @@ void AliAnalysisTask::PrintContainers(Option_t *option, Int_t indent) const
}

//______________________________________________________________________________
void AliAnalysisTask::SetPostEventLoop(Bool_t flag)
void AliAnalysisTask::SetExecPerEvent(Bool_t flag)
{
// Set the task execution mode - run after event loop or not. All output
// Set the task execution mode - run in a event loop or single shot. All output
// containers of this task will get the same type.
TObject::SetBit(kTaskPostEventLoop,flag);
TObject::SetBit(kTaskEvtByEvt,flag);
AliAnalysisDataContainer *cont;
Int_t islot;
for (islot=0; islot<fNoutputs; islot++) {
cont = GetOutputSlot(islot)->GetContainer();
if (cont) cont->SetPostEventLoop(flag);
if (cont) cont->SetEventByEvent(flag);
}
}

Loading

0 comments on commit 66ee624

Please sign in to comment.