d3106602 |
1 | #ifndef ALIANALYSISDATACONTAINER_H |
2 | #define ALIANALYSISDATACONTAINER_H |
3 | /* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. * |
4 | * See cxx source for full Copyright notice */ |
5 | |
6 | /* $Id$ */ |
7 | // Author: Andrei Gheata, 31/05/2006 |
8 | |
9 | //============================================================================== |
10 | // AliAnalysysDataContainer - Container of data of arbitrary type deriving |
11 | // from TObject used for analysis. A container must be connected to the |
12 | // output data slot of a single analysis task (producer) , but also as |
13 | // input slot for possibly several other tasks (consumers). The connected |
14 | // slots must enforce the same data type as the container (or a derived type). |
15 | // A container becomes the owner of the contained data once this was produced. |
16 | //============================================================================== |
17 | |
18 | #ifndef ROOT_TNamed |
19 | #include "TNamed.h" |
20 | #endif |
21 | |
c52c2132 |
22 | #ifndef ROOT_TString |
23 | #include "TString.h" |
24 | #endif |
25 | |
d3106602 |
26 | class TClass; |
d3106602 |
27 | class TObjArray; |
c52c2132 |
28 | class TCollection; |
d3106602 |
29 | class AliAnalysisTask; |
981f2614 |
30 | class AliAnalysisDataWrapper; |
d3106602 |
31 | class AliESD; |
32 | |
33 | class AliAnalysisDataContainer : public TNamed { |
34 | |
35 | public: |
36 | enum ENotifyMessage { |
37 | kDeleteData, |
38 | kSaveData, |
39 | kFileChange |
40 | }; |
41 | AliAnalysisDataContainer(); |
37a26056 |
42 | AliAnalysisDataContainer(const AliAnalysisDataContainer &cont); |
d3106602 |
43 | AliAnalysisDataContainer(const char *name, TClass *type); |
44 | virtual ~AliAnalysisDataContainer(); |
45 | |
37a26056 |
46 | // Assignment |
47 | AliAnalysisDataContainer &operator=(const AliAnalysisDataContainer &cont); |
d3106602 |
48 | // Getters |
49 | TObject *GetData() const {return fData;} |
c52c2132 |
50 | const char *GetFileName() const {return fFileName.Data();} |
51 | TClass *GetType() const; |
d3106602 |
52 | AliAnalysisTask *GetProducer() const {return fProducer;} |
53 | TObjArray *GetConsumers() const {return fConsumers;} |
54 | virtual void GetEntry(Long64_t ientry); |
55 | // Setters |
327eaf46 |
56 | void ResetDataReady() {fDataReady = kFALSE;} |
d3106602 |
57 | virtual Bool_t SetData(TObject *data, Option_t *option=""); |
58 | void SetDataOwned(Bool_t flag) {fOwnedData = flag;} |
c52c2132 |
59 | void SetFileName(const char *filename) {fFileName = filename;} |
d3106602 |
60 | void SetProducer(AliAnalysisTask *prod, Int_t islot); |
61 | void AddConsumer(AliAnalysisTask *cons, Int_t islot); |
62 | void DeleteData(); |
981f2614 |
63 | // Wrapping |
64 | AliAnalysisDataWrapper *ExportData() const; |
65 | void ImportData(AliAnalysisDataWrapper *pack); |
d3106602 |
66 | // Container status checking |
67 | Bool_t IsDataReady() const {return fDataReady;} |
68 | Bool_t IsOwnedData() const {return fOwnedData;} |
69 | Bool_t ClientsExecuted() const; |
70 | Bool_t HasConsumers() const {return (fConsumers != 0);} |
71 | Bool_t HasProducer() const {return (fProducer != 0);} |
c52c2132 |
72 | // Container merging |
73 | virtual Long64_t Merge(TCollection *list); |
d3106602 |
74 | // Send a notify signal to the container |
75 | virtual void NotifyChange(ENotifyMessage /*type*/) {;} |
76 | // Print connected tasks/status |
77 | void PrintContainer(Option_t *option="all", Int_t indent=0) const; |
c52c2132 |
78 | |
79 | private: |
80 | void SetType(TClass *type) {fType = type;} |
81 | |
d3106602 |
82 | protected: |
83 | Bool_t fDataReady; // Flag that data is ready |
84 | Bool_t fOwnedData; // Flag data ownership |
c52c2132 |
85 | TString fFileName; // File storing the data |
d3106602 |
86 | TObject *fData; // Contained data |
c52c2132 |
87 | TClass *fType; //! Type of contained data |
d3106602 |
88 | AliAnalysisTask *fProducer; // Analysis task to which the slot belongs |
89 | TObjArray *fConsumers; // List of consumers of the data |
90 | |
91 | ClassDef(AliAnalysisDataContainer,1) // Class describing a data container for analysis |
92 | }; |
981f2614 |
93 | |
94 | //============================================================================== |
95 | // AliAnalysysDataWrapper - A basic wrapper for exchanging via the network |
96 | // the data held by AliAnalysisDataContainer between the master and the client |
97 | // in PROOF case. |
98 | //============================================================================== |
99 | |
100 | class AliAnalysisDataWrapper : public TNamed { |
101 | |
102 | public: |
103 | AliAnalysisDataWrapper() : TNamed(), fData(NULL) {} |
104 | AliAnalysisDataWrapper(TObject *data) : TNamed(), fData(data) {} |
105 | AliAnalysisDataWrapper(const AliAnalysisDataWrapper &other) |
106 | : TNamed(other), fData(other.fData) {} |
107 | virtual ~AliAnalysisDataWrapper() {} |
108 | |
109 | // Assignment |
110 | AliAnalysisDataWrapper &operator=(const AliAnalysisDataWrapper &other); |
111 | |
112 | TObject *Data() const {return fData;} |
113 | // Merging |
114 | virtual Long64_t Merge(TCollection *list); |
115 | |
116 | protected: |
117 | TObject *fData; // Wrapped data |
118 | |
119 | ClassDef(AliAnalysisDataWrapper, 1) // Data wrapper class for exchange via the net |
120 | }; |
121 | |
d3106602 |
122 | #endif |