X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=ANALYSIS%2FAliAnalysisDataContainer.cxx;h=b1afadcaba7174243966a537e281856a68ed8524;hb=fcda1d4e437ffac279126a3ff9543843a3598f75;hp=eb69661268fcac21b7bfa99947ffa6ca27f87936;hpb=12856ea67190ac77205394fad3a38dff72fca090;p=u%2Fmrichter%2FAliRoot.git diff --git a/ANALYSIS/AliAnalysisDataContainer.cxx b/ANALYSIS/AliAnalysisDataContainer.cxx index eb69661268f..b1afadcaba7 100644 --- a/ANALYSIS/AliAnalysisDataContainer.cxx +++ b/ANALYSIS/AliAnalysisDataContainer.cxx @@ -47,6 +47,7 @@ #include #include +#include #include #include "AliAnalysisDataContainer.h" @@ -229,12 +230,12 @@ Long64_t AliAnalysisDataContainer::Merge(TCollection *list) if (!callEnv.IsValid() && !list->IsEmpty()) { cout << "No merge interface for data stored by " << GetName() << ". Merging not possible !" << endl; return 1; - } - + } + if (list->IsEmpty()) return 1; TIter next(list); - AliAnalysisDataContainer *cont; + AliAnalysisDataContainer *cont; // Make a list where to temporary store the data to be merged. TList *collectionData = new TList(); Int_t count = 0; // object counter @@ -248,12 +249,12 @@ Long64_t AliAnalysisDataContainer::Merge(TCollection *list) printf(" ... merging object %s\n", data->GetName()); collectionData->Add(data); count++; - } + } callEnv.SetParam((Long_t) collectionData); callEnv.Execute(fData); delete collectionData; - - return count+1; + + return count+1; } //______________________________________________________________________________ @@ -266,7 +267,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", ind.Data(), GetName(), GetTitle()); + printf("%sContainer: %s type: %s POST_LOOP=%i", ind.Data(), GetName(), GetTitle(), IsPostEventLoop()); if (fProducer) printf("%s = Data producer: task %s",ind.Data(),fProducer->GetName()); else @@ -274,7 +275,8 @@ void AliAnalysisDataContainer::PrintContainer(Option_t *option, Int_t indent) co printf("%s = Consumer tasks: ", ind.Data()); if (!fConsumers || !fConsumers->GetEntriesFast()) printf("-none-\n"); else printf("\n"); - } + } + printf("Filename: %s\n", fFileName.Data()); TIter next(fConsumers); AliAnalysisTask *task; while ((task=(AliAnalysisTask*)next())) task->PrintTask(option, indent+3); @@ -300,7 +302,7 @@ Bool_t AliAnalysisDataContainer::SetData(TObject *data, Option_t *) } } return kTRUE; - } + } // Check if it is the producer who published the data if (fProducer->GetPublishedData()==data) { fData = data; @@ -353,4 +355,92 @@ void AliAnalysisDataContainer::SetProducer(AliAnalysisTask *prod, Int_t islot) if (!prod->GetListOfTasks()->FindObject(cons)) prod->Add(cons); } } + +//______________________________________________________________________________ +AliAnalysisDataWrapper *AliAnalysisDataContainer::ExportData() const +{ +// Wraps data for sending it through the net. + AliAnalysisDataWrapper *pack = 0; + if (!fData) return pack; + pack = new AliAnalysisDataWrapper(fData); + pack->SetName(fName.Data()); + return pack; +} + +//______________________________________________________________________________ +void AliAnalysisDataContainer::ImportData(AliAnalysisDataWrapper *pack) +{ +// Unwraps data from a data wrapper. + if (pack) { + fData = pack->Data(); + fDataReady = kTRUE; + // Imported wrappers do not own data anymore (AG 13-11-07) + pack->SetDeleteData(kFALSE); + } +} +ClassImp (AliAnalysisDataWrapper) + +//______________________________________________________________________________ +AliAnalysisDataWrapper::AliAnalysisDataWrapper(TObject *data) + :TNamed(), + fData(data) +{ +// Ctor. + if (data) SetName(data->GetName()); +} + +//______________________________________________________________________________ +AliAnalysisDataWrapper::~AliAnalysisDataWrapper() +{ +// Dtor. + if (fData && TObject::TestBit(kDeleteData)) delete fData; +} + +//______________________________________________________________________________ +AliAnalysisDataWrapper &AliAnalysisDataWrapper::operator=(const AliAnalysisDataWrapper &other) +{ +// Assignment. + if (&other != this) { + TNamed::operator=(other); + fData = other.fData; + } + return *this; +} + +//______________________________________________________________________________ +Long64_t AliAnalysisDataWrapper::Merge(TCollection *list) +{ +// Merge a list of containers with this one. Containers in the list must have +// data of the same type. + if (TH1::AddDirectoryStatus()) TH1::AddDirectory(kFALSE); + if (!fData) return 0; + if (!list || list->IsEmpty()) return 1; + + TMethodCall callEnv; + if (fData->IsA()) + callEnv.InitWithPrototype(fData->IsA(), "Merge", "TCollection*"); + if (!callEnv.IsValid()) { + cout << "No merge interface for data stored by " << GetName() << ". Merging not possible !" << endl; + return 1; + } + + TIter next1(list); + AliAnalysisDataWrapper *cont; + // Make a list where to temporary store the data to be merged. + TList *collectionData = new TList(); + Int_t count = 0; // object counter + // printf("Wrapper %s 0x%lx (data=%s) merged with:\n", GetName(), (ULong_t)this, fData->ClassName()); + while ((cont=(AliAnalysisDataWrapper*)next1())) { + TObject *data = cont->Data(); + if (!data) continue; + // printf(" - %s 0x%lx (data=%s)\n", cont->GetName(), (ULong_t)cont, data->ClassName()); + collectionData->Add(data); + count++; + } + callEnv.SetParam((Long_t) collectionData); + callEnv.Execute(fData); + delete collectionData; + + return count+1; +}