17 #include <Riostream.h> 20 #include <TCollection.h> 23 #include <TClonesArray.h> 30 static bool showInfo = !(getenv(
"HLT_ONLINE_MODE") && strcmp(getenv(
"HLT_ONLINE_MODE"),
"on") == 0);
100 if (fTasks) fTasks->Clear();
133 if (&task ==
this)
return *
this;
134 TTask::operator=(task);
165 Error(
"AreSlotsConnected",
"Input slot %d of task %s not defined !",i,GetName());
173 Error(
"AreSlotsConnected",
"Output slot %d of task %s not defined !",i,GetName());
192 for (Int_t islot=0; islot<
fNinputs; islot++) {
201 TDirectory *cursav = gDirectory;
203 if (cursav) cursav->cd();
213 Bool_t dataPosted = kTRUE;
216 for (Int_t islot=0; islot<
fNoutputs; islot++) {
218 if (!coutput)
continue;
221 Error(
"CheckPostData",
"Data not posted for slot #%d of task %s (%s)",
222 islot, GetName(), ClassName());
236 for (Int_t islot=0; islot<
fNoutputs; islot++) {
238 if (outdata && outdata->InheritsFrom(TCollection::Class()) && !outdata->InheritsFrom(TClonesArray::Class())) {
239 TCollection *coll = (TCollection*)outdata;
240 if (!coll->IsOwner()) {
241 Error(
"CheckOwnership",
"####### IMPORTANT! ####### \n\n\n\ 242 Task %s (%s) posts a container that is not owner at output #%d. This may apply for other embedded containers. \n\n\ 243 ####### FIX YOUR CODE, THIS WILL PRODUCE A FATAL ERROR IN FUTURE! ##########", GetName(), ClassName(), islot);
258 if (
showInfo) Error(
"ConnectInput",
"Input slot %i not defined for analysis task %s", islot, GetName());
263 Error(
"ConnectInput",
"Data type %s for input %i of task %s not matching container %s of type %s",input->
GetType()->GetName(), islot, GetName(), cont->GetName(), cont->
GetType()->GetName());
281 if (
showInfo) Error(
"ConnectOutput",
"Output slot %i not defined for analysis task %s", islot, GetName());
286 Error(
"ConnectOutput",
"Data type %s for output %i of task %s not matching container %s of type %s",output->
GetType()->GetName(), islot, GetName(), cont->GetName(), cont->
GetType()->GetName());
306 fInputs->AddAtAndExpand(input, islot);
321 fOutputs->AddAtAndExpand(output, islot);
331 if (
showInfo) Error(
"GetInputType",
"Input slot %d not defined for analysis task %s", islot, GetName());
344 if (
showInfo) Error(
"GetOutputType",
"Output slot %d not defined for analysis task %s", islot, GetName());
358 if (
showInfo) Error(
"GetInputData",
"Input slot %d not defined for analysis task %s", islot, GetName());
372 if (
showInfo) Error(
"GetOutputData",
"Input slot %d not defined for analysis task %s", islot, GetName());
403 if (!input || !input->
GetType()->InheritsFrom(TTree::Class())) {
404 Error(
"EnableBranch",
"Wrong slot type #%d for task %s: not TTree-derived type", islot, GetName());
408 if (!strcmp(bname,
"*")) {
409 tree->SetBranchStatus(
"*",1);
475 Error(
"OpenFile",
"No output slot for task %s with index %d", GetName(), iout);
517 if (
showInfo) Error(
"PostData",
"Output slot %i not defined for analysis task %s", iout, GetName());
521 if (
showInfo) Error(
"PostData",
"Output slot %i of analysis task %s not connected to any data container", iout, GetName());
540 Int_t nd = fTasks->GetSize();
542 for (Int_t i=0; i<nd; i++) {
554 fHasExecuted = kFALSE;
558 for (islot=0; islot<
fNinputs; islot++) {
572 TList *tasks = GetListOfTasks();
573 Int_t ntasks = tasks->GetSize();
575 for (Int_t i=0; i<ntasks; i++) {
590 for (islot=0; islot<
fNinputs; islot++) {
594 if (cont && !cont->
IsTouched())
return kFALSE;
610 Bool_t dep = (opt.Contains(
"dep"))?kTRUE:kFALSE;
612 for (Int_t i=0; i<indent; i++) ind +=
" ";
614 printf(
"______________________________________________________________________________\n");
615 printf(
"%s\n", Form(
"%stask: %s ACTIVE=%i POST_LOOP=%i", ind.Data(), GetName(),IsActive(),
IsPostEventLoop()));
618 for (islot=0; islot<
fNinputs; islot++) {
619 printf(
"%s", Form(
"%s INPUT #%i: %s <- ",ind.Data(),islot,
GetInputType(islot)->GetName()));
621 if (cont)
printf(
" [%s]\n", cont->GetName());
622 else printf(
" [NO CONTAINER]\n");
624 for (islot=0; islot<
fNoutputs; islot++) {
625 printf(
"%s", Form(
"%s OUTPUT #%i: %s -> ",ind.Data(),islot,
GetOutputType(islot)->GetName()));
627 if (cont)
printf(
" [%s]\n", cont->GetName());
628 else printf(
" [NO CONTAINER]\n");
644 for (Int_t i=0; i<indent; i++) ind +=
" ";
646 for (islot=0; islot<
fNoutputs; islot++) {
661 for (islot=0; islot<
fNoutputs; islot++) {
677 if (index1<0)
return;
678 index1 += 1+strlen(type);
AliAnalysysTask - Class representing a basic analysis task. Any user-defined task should derive from...
Bool_t IsExchange() const
Bool_t fReady
Flag if the task is ready.
Bool_t fInitialized
True if Init() was called.
AliAnalysisDataContainer * GetCommonOutputContainer() const
virtual void Terminate(Option_t *option="")
printf("Chi2/npoints = %f\n", TMath::Sqrt(chi2/npoints))
void CheckNotify(Bool_t init=kFALSE)
Bool_t ConnectContainer(AliAnalysisDataContainer *cont)
TClass * GetInputType(Int_t islot) const
Bool_t SetBranchAddress(const char *branch, void *address)
Bool_t CheckCircularDeps()
virtual void FinishTaskOutput()
static TFile * OpenFile(AliAnalysisDataContainer *cont, const char *option, Bool_t ignoreProof=kFALSE)
void SetDataOwned(Bool_t flag)
virtual void PrintTask(Option_t *option="all", Int_t indent=0) const
static AliAnalysisManager * GetAnalysisManager()
Bool_t IsConnected() const
TObject * GetData() const
Getters.
AliAnalysysManager Manager analysis class. Allows creation of several analysis tasks and data contain...
virtual Bool_t CheckOwnership() const
TClass * GetOutputType(Int_t islot) const
void * GetBranchAddress(const char *branch) const
void PrintContainer(Option_t *option="all", Int_t indent=0) const
Print connected tasks/status.
Bool_t PostData(Int_t iout, TObject *data, Option_t *option="")
void SetPostEventLoop(Bool_t flag=kTRUE)
Int_t fNinputs
Number of inputs.
virtual Bool_t NotifyBinChange()
void DefineInput(Int_t islot, TClass *type)
AliAnalysisTask & operator=(const AliAnalysisTask &task)
Bool_t IsOutputReady(Int_t islot) const
char * GetBranchAddress(Int_t islot, const char *branch) const
AliAnalysysDataContainer AliAnalysysDataContainer - Container of data of arbitrary type deriving from...
static Int_t EnableBranch(const char *bname, TTree *tree)
TString fBranchNames
List of input branches that need to be loaded for this task.
void SetChecked(Bool_t flag=kTRUE)
Bool_t IsPostEventLoop() const
virtual void CreateOutputObjects()
Bool_t ConnectOutput(Int_t islot, AliAnalysisDataContainer *cont)
TObject * GetInputData(Int_t islot) const
TObject * GetData() const
virtual ~AliAnalysisTask()
TFile * OpenFile(Int_t iout, Option_t *option="RECREATE") const
virtual void ConnectInputData(Option_t *option="")
Bool_t ProducersTouched() const
AliAnalysysDataSlot Class representing a data slot of an analysis task. An analysis slot enforces a c...
void PrintContainers(Option_t *option="all", Int_t indent=0) const
TObjArray * GetOutputs() const
Bool_t IsInitialized() const
AliAnalysisDataSlot * GetOutputSlot(Int_t islot) const
Bool_t ConnectInput(Int_t islot, AliAnalysisDataContainer *cont)
TObject * GetOutputData(Int_t islot) const
Bool_t SetBranchAddress(Int_t islot, const char *branch, void *address) const
Bool_t IsPostEventLoop() const
AliAnalysisDataSlot * GetInputSlot(Int_t islot) const
void GetBranches(const char *type, TString &result) const
Bool_t * fOutputReady
Flags for output readyness.
void SetPostEventLoop(Bool_t flag=kTRUE)
void SetUsed(Bool_t flag=kTRUE)
virtual Bool_t CheckPostData() const
Int_t GetNoutputs() const
AliAnalysisDataContainer * GetContainer() const
virtual Bool_t SetData(TObject *data, Option_t *option="")
void AddConsumer(AliAnalysisTask *cons, Int_t islot)
void DefineOutput(Int_t islot, TClass *type)
TObject * fPublishedData
! published data
void SetProducer(AliAnalysisTask *prod, Int_t islot)
TObjArray * fInputs
Array of input slots.
void EnableBranch(Int_t islot, const char *bname) const
TObjArray * fOutputs
Array of output slots.
Bool_t AreSlotsConnected()