ROOT logo
#ifndef ALIANALYSISDATACONTAINER_H
#define ALIANALYSISDATACONTAINER_H
/* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
 * See cxx source for full Copyright notice                               */

/* $Id$ */
// Author: Andrei Gheata, 31/05/2006

//==============================================================================
//   AliAnalysysDataContainer - Container of data of arbitrary type deriving
//      from TObject used for analysis. A container must be connected to the 
//      output data slot of a single analysis task (producer) , but also as 
//      input slot for possibly several other tasks (consumers). The connected 
//      slots must enforce the same data type as the container (or a derived type).
//      A container becomes the owner of the contained data once this was produced.
//==============================================================================

#ifndef ROOT_TNamed
#include "TNamed.h"
#endif

#ifndef ROOT_TString
#include "TString.h"
#endif

#ifndef ROOT_TStopwatch
#include "TStopwatch.h"
#endif

class TClass;
class TFile;
class TObjArray;
class TCollection;
class AliAnalysisTask;
class AliAnalysisDataWrapper;

using std::ostream;

class AliAnalysisDataContainer : public TNamed {

public:
enum ENotifyMessage {
   kDeleteData,
   kSaveData,
   kFileChange
};   
enum EAnalysisContainerFlags {
   kPostEventLoop = BIT(14),
   kSpecialOutput = BIT(15),
   kRegisterDataset = BIT(16),
   kExchangeData  = BIT(17),
   kTouchedFlag   = BIT(18)
};     
   AliAnalysisDataContainer();
   AliAnalysisDataContainer(const AliAnalysisDataContainer &cont);
   AliAnalysisDataContainer(const char *name, TClass *type);
   virtual ~AliAnalysisDataContainer();

   // Assignment
   AliAnalysisDataContainer &operator=(const AliAnalysisDataContainer &cont);
   // Getters
   TObject                  *GetData() const      {return fData;}
   const char               *GetFileName() const  {return fFileName.Data();}
   const char               *GetFolderName() const {return fFolderName.Data();}
   TFile                    *GetFile() const      {return fFile;}
   TClass                   *GetType() const;
   AliAnalysisTask          *GetProducer() const  {return fProducer;}
   TObjArray                *GetConsumers() const {return fConsumers;}
   virtual void              GetEntry(Long64_t ientry);
   // Setters
   void                      Reset()              {fData = 0; fDataReady = kFALSE; SetTouched(kFALSE);}
   void                      ResetDataReady()     {fDataReady = kFALSE;}
   virtual Bool_t            SetData(TObject *data, Option_t *option="");
   void                      SetDataOwned(Bool_t flag) {fOwnedData = flag;}
   void                      SetExchange(Bool_t flag) {TObject::SetBit(kExchangeData,flag);}
   void                      SetPostEventLoop(Bool_t flag=kTRUE) {TObject::SetBit(kPostEventLoop,flag);}
   void                      SetSpecialOutput(Bool_t flag=kTRUE) {TObject::SetBit(kSpecialOutput,flag);}
   void                      SetRegisterDataset(Bool_t flag=kTRUE) {TObject::SetBit(kRegisterDataset,flag);}
   void                      SetFileName(const char *filename);
   void                      SetFile(TFile *f) {fFile = f;}
   void                      SetProducer(AliAnalysisTask *prod, Int_t islot);
   void                      SetTouched(Bool_t flag=kTRUE)       {TObject::SetBit(kTouchedFlag,flag);}
   void                      AddConsumer(AliAnalysisTask *cons, Int_t islot);
   void                      DeleteData();
   // Wrapping
   AliAnalysisDataWrapper   *ExportData() const;
   void                      ImportData(AliAnalysisDataWrapper *pack);
   // Container status checking
   Bool_t                    IsDataReady() const  {return fDataReady;}
   Bool_t                    IsExchange() const      {return TObject::TestBit(kExchangeData);}
   Bool_t                    IsPostEventLoop() const {return TObject::TestBit(kPostEventLoop);}
   Bool_t                    IsSpecialOutput() const {return TObject::TestBit(kSpecialOutput);}
   Bool_t                    IsRegisterDataset() const {return TObject::TestBit(kRegisterDataset);}
   Bool_t                    IsTouched() const       {return TObject::TestBit(kTouchedFlag);}
   Bool_t                    IsOwnedData() const  {return fOwnedData;}
   Bool_t                    ClientsExecuted() const;
   Bool_t                    HasConsumers() const {return (fConsumers != 0);}
   Bool_t                    HasProducer() const  {return (fProducer != 0);}
   // Container merging
   virtual Long64_t          Merge(TCollection *list);
   // Send a notify signal to the container
   virtual void              NotifyChange(ENotifyMessage /*type*/) {;}
   // Print connected tasks/status
   void                      PrintContainer(Option_t *option="all", Int_t indent=0) const;

private:
   void                      SetType(TClass *type) {fType = type;}   

protected:
   Bool_t                    fDataReady;  // Flag that data is ready
   Bool_t                    fOwnedData;  // Flag data ownership
   TString                   fFileName;   // File storing the data
   TString                   fFolderName; // Folder name in the output file
   TFile                    *fFile;       //! Opened file
   TObject                  *fData;       // Contained data
   TClass                   *fType;       //! Type of contained data
   AliAnalysisTask          *fProducer;   // Analysis task to which the slot belongs
   TObjArray                *fConsumers;  // List of consumers of the data
   
   ClassDef(AliAnalysisDataContainer,2)  // Class describing a data container for analysis
};

//==============================================================================
//   AliAnalysysDataWrapper - A basic wrapper for exchanging via the network
// the data held by AliAnalysisDataContainer between the master and the client
// in PROOF case. 
//==============================================================================

class AliAnalysisDataWrapper : public TNamed {

public:

enum EAnalysisWrapperFlags {
   kDeleteData = BIT(14)
};     
   AliAnalysisDataWrapper() : TNamed(), fData(NULL) {}
   AliAnalysisDataWrapper(TObject *data);
   AliAnalysisDataWrapper(const AliAnalysisDataWrapper &other) 
                        : TNamed(other), fData(other.fData) {}
   virtual ~AliAnalysisDataWrapper();
   
   // Assignment
   AliAnalysisDataWrapper &operator=(const AliAnalysisDataWrapper &other);

   TObject                  *Data() const {return fData;}
   // Merging
   virtual Long64_t          Merge(TCollection *list);
   void                      SetDeleteData(Bool_t flag=kTRUE) {TObject::SetBit(kDeleteData,flag);}

protected:
   TObject                  *fData;       // Wrapped data

   ClassDef(AliAnalysisDataWrapper, 1) // Data wrapper class for exchange via the net
};

//==============================================================================
//   AliAnalysisFileDescriptor - A simple wrapper for data related to accessing
//      an analysis input file.
//==============================================================================
class AliAnalysisFileDescriptor : public TObject {

public:
   AliAnalysisFileDescriptor();
   AliAnalysisFileDescriptor(const TFile *file);
   AliAnalysisFileDescriptor(const AliAnalysisFileDescriptor &other);
   virtual ~AliAnalysisFileDescriptor();

   // Assignment
   AliAnalysisFileDescriptor &operator=(const AliAnalysisFileDescriptor &other);
   
   void         Done();
   
   const char  *GetGUID() const  {return fGUID;}
   Int_t        GetImage() const {return fImage;}
   const char  *GetLfn() const   {return fLfn;}
   Int_t        GetNreplicas() const {return fNreplicas;}
   Long64_t     GetOpenAt() const {return fOpenedAt;}
   Double_t     GetOpenTime() const {return fOpenTime;}
   const char  *GetPfn() const   {return fPfn;}
   Long64_t     GetReadBytes() const {return fReadBytes;}
   Long64_t     GetSize() const   {return fSize;}
   const char  *GetSE() const     {return fSE;}
   Double_t     GetThroughput() const {return fThroughput;}
   Double_t     GetProcessingTime() const {return fProcessingTime;}
   const char  *GetUrl() const    {return fUrl;}
   Bool_t       IsArchive() const {return fIsArchive;}
   virtual void Print(Option_t *option="") const;
   virtual void SavePrimitive(std::ostream &out, Option_t *option = "");
   void         SetOpenTime(Double_t time) {fOpenTime = time;}
   

protected:   
   TString      fLfn;       // logical file name
   TString      fGUID;      // GUID
   TString      fUrl;       // url for the opened copy
   TString      fPfn;       // physical file name
   TString      fSE;        // Storage element
   Bool_t       fIsArchive; // Archive flag
   Int_t        fImage;     // Image number
   Int_t        fNreplicas; // Number of replicas
   Long64_t     fStartBytes;// Total number of read bytes at start
   Long64_t     fReadBytes; // Number of bytes read
   Long64_t     fSize;      // Size of the file in bytes
   Long64_t     fOpenedAt;  // Absolute value for time when opened
   Double_t     fOpenTime;  // Time elapsed to open file
   Double_t     fProcessingTime; // Processing
   Double_t     fThroughput; // Throughput
   TStopwatch   fTimer;     //! Processing time
   
   ClassDef(AliAnalysisFileDescriptor,1)  // Class describing a a file processed in the analysis
};

#endif
 AliAnalysisDataContainer.h:1
 AliAnalysisDataContainer.h:2
 AliAnalysisDataContainer.h:3
 AliAnalysisDataContainer.h:4
 AliAnalysisDataContainer.h:5
 AliAnalysisDataContainer.h:6
 AliAnalysisDataContainer.h:7
 AliAnalysisDataContainer.h:8
 AliAnalysisDataContainer.h:9
 AliAnalysisDataContainer.h:10
 AliAnalysisDataContainer.h:11
 AliAnalysisDataContainer.h:12
 AliAnalysisDataContainer.h:13
 AliAnalysisDataContainer.h:14
 AliAnalysisDataContainer.h:15
 AliAnalysisDataContainer.h:16
 AliAnalysisDataContainer.h:17
 AliAnalysisDataContainer.h:18
 AliAnalysisDataContainer.h:19
 AliAnalysisDataContainer.h:20
 AliAnalysisDataContainer.h:21
 AliAnalysisDataContainer.h:22
 AliAnalysisDataContainer.h:23
 AliAnalysisDataContainer.h:24
 AliAnalysisDataContainer.h:25
 AliAnalysisDataContainer.h:26
 AliAnalysisDataContainer.h:27
 AliAnalysisDataContainer.h:28
 AliAnalysisDataContainer.h:29
 AliAnalysisDataContainer.h:30
 AliAnalysisDataContainer.h:31
 AliAnalysisDataContainer.h:32
 AliAnalysisDataContainer.h:33
 AliAnalysisDataContainer.h:34
 AliAnalysisDataContainer.h:35
 AliAnalysisDataContainer.h:36
 AliAnalysisDataContainer.h:37
 AliAnalysisDataContainer.h:38
 AliAnalysisDataContainer.h:39
 AliAnalysisDataContainer.h:40
 AliAnalysisDataContainer.h:41
 AliAnalysisDataContainer.h:42
 AliAnalysisDataContainer.h:43
 AliAnalysisDataContainer.h:44
 AliAnalysisDataContainer.h:45
 AliAnalysisDataContainer.h:46
 AliAnalysisDataContainer.h:47
 AliAnalysisDataContainer.h:48
 AliAnalysisDataContainer.h:49
 AliAnalysisDataContainer.h:50
 AliAnalysisDataContainer.h:51
 AliAnalysisDataContainer.h:52
 AliAnalysisDataContainer.h:53
 AliAnalysisDataContainer.h:54
 AliAnalysisDataContainer.h:55
 AliAnalysisDataContainer.h:56
 AliAnalysisDataContainer.h:57
 AliAnalysisDataContainer.h:58
 AliAnalysisDataContainer.h:59
 AliAnalysisDataContainer.h:60
 AliAnalysisDataContainer.h:61
 AliAnalysisDataContainer.h:62
 AliAnalysisDataContainer.h:63
 AliAnalysisDataContainer.h:64
 AliAnalysisDataContainer.h:65
 AliAnalysisDataContainer.h:66
 AliAnalysisDataContainer.h:67
 AliAnalysisDataContainer.h:68
 AliAnalysisDataContainer.h:69
 AliAnalysisDataContainer.h:70
 AliAnalysisDataContainer.h:71
 AliAnalysisDataContainer.h:72
 AliAnalysisDataContainer.h:73
 AliAnalysisDataContainer.h:74
 AliAnalysisDataContainer.h:75
 AliAnalysisDataContainer.h:76
 AliAnalysisDataContainer.h:77
 AliAnalysisDataContainer.h:78
 AliAnalysisDataContainer.h:79
 AliAnalysisDataContainer.h:80
 AliAnalysisDataContainer.h:81
 AliAnalysisDataContainer.h:82
 AliAnalysisDataContainer.h:83
 AliAnalysisDataContainer.h:84
 AliAnalysisDataContainer.h:85
 AliAnalysisDataContainer.h:86
 AliAnalysisDataContainer.h:87
 AliAnalysisDataContainer.h:88
 AliAnalysisDataContainer.h:89
 AliAnalysisDataContainer.h:90
 AliAnalysisDataContainer.h:91
 AliAnalysisDataContainer.h:92
 AliAnalysisDataContainer.h:93
 AliAnalysisDataContainer.h:94
 AliAnalysisDataContainer.h:95
 AliAnalysisDataContainer.h:96
 AliAnalysisDataContainer.h:97
 AliAnalysisDataContainer.h:98
 AliAnalysisDataContainer.h:99
 AliAnalysisDataContainer.h:100
 AliAnalysisDataContainer.h:101
 AliAnalysisDataContainer.h:102
 AliAnalysisDataContainer.h:103
 AliAnalysisDataContainer.h:104
 AliAnalysisDataContainer.h:105
 AliAnalysisDataContainer.h:106
 AliAnalysisDataContainer.h:107
 AliAnalysisDataContainer.h:108
 AliAnalysisDataContainer.h:109
 AliAnalysisDataContainer.h:110
 AliAnalysisDataContainer.h:111
 AliAnalysisDataContainer.h:112
 AliAnalysisDataContainer.h:113
 AliAnalysisDataContainer.h:114
 AliAnalysisDataContainer.h:115
 AliAnalysisDataContainer.h:116
 AliAnalysisDataContainer.h:117
 AliAnalysisDataContainer.h:118
 AliAnalysisDataContainer.h:119
 AliAnalysisDataContainer.h:120
 AliAnalysisDataContainer.h:121
 AliAnalysisDataContainer.h:122
 AliAnalysisDataContainer.h:123
 AliAnalysisDataContainer.h:124
 AliAnalysisDataContainer.h:125
 AliAnalysisDataContainer.h:126
 AliAnalysisDataContainer.h:127
 AliAnalysisDataContainer.h:128
 AliAnalysisDataContainer.h:129
 AliAnalysisDataContainer.h:130
 AliAnalysisDataContainer.h:131
 AliAnalysisDataContainer.h:132
 AliAnalysisDataContainer.h:133
 AliAnalysisDataContainer.h:134
 AliAnalysisDataContainer.h:135
 AliAnalysisDataContainer.h:136
 AliAnalysisDataContainer.h:137
 AliAnalysisDataContainer.h:138
 AliAnalysisDataContainer.h:139
 AliAnalysisDataContainer.h:140
 AliAnalysisDataContainer.h:141
 AliAnalysisDataContainer.h:142
 AliAnalysisDataContainer.h:143
 AliAnalysisDataContainer.h:144
 AliAnalysisDataContainer.h:145
 AliAnalysisDataContainer.h:146
 AliAnalysisDataContainer.h:147
 AliAnalysisDataContainer.h:148
 AliAnalysisDataContainer.h:149
 AliAnalysisDataContainer.h:150
 AliAnalysisDataContainer.h:151
 AliAnalysisDataContainer.h:152
 AliAnalysisDataContainer.h:153
 AliAnalysisDataContainer.h:154
 AliAnalysisDataContainer.h:155
 AliAnalysisDataContainer.h:156
 AliAnalysisDataContainer.h:157
 AliAnalysisDataContainer.h:158
 AliAnalysisDataContainer.h:159
 AliAnalysisDataContainer.h:160
 AliAnalysisDataContainer.h:161
 AliAnalysisDataContainer.h:162
 AliAnalysisDataContainer.h:163
 AliAnalysisDataContainer.h:164
 AliAnalysisDataContainer.h:165
 AliAnalysisDataContainer.h:166
 AliAnalysisDataContainer.h:167
 AliAnalysisDataContainer.h:168
 AliAnalysisDataContainer.h:169
 AliAnalysisDataContainer.h:170
 AliAnalysisDataContainer.h:171
 AliAnalysisDataContainer.h:172
 AliAnalysisDataContainer.h:173
 AliAnalysisDataContainer.h:174
 AliAnalysisDataContainer.h:175
 AliAnalysisDataContainer.h:176
 AliAnalysisDataContainer.h:177
 AliAnalysisDataContainer.h:178
 AliAnalysisDataContainer.h:179
 AliAnalysisDataContainer.h:180
 AliAnalysisDataContainer.h:181
 AliAnalysisDataContainer.h:182
 AliAnalysisDataContainer.h:183
 AliAnalysisDataContainer.h:184
 AliAnalysisDataContainer.h:185
 AliAnalysisDataContainer.h:186
 AliAnalysisDataContainer.h:187
 AliAnalysisDataContainer.h:188
 AliAnalysisDataContainer.h:189
 AliAnalysisDataContainer.h:190
 AliAnalysisDataContainer.h:191
 AliAnalysisDataContainer.h:192
 AliAnalysisDataContainer.h:193
 AliAnalysisDataContainer.h:194
 AliAnalysisDataContainer.h:195
 AliAnalysisDataContainer.h:196
 AliAnalysisDataContainer.h:197
 AliAnalysisDataContainer.h:198
 AliAnalysisDataContainer.h:199
 AliAnalysisDataContainer.h:200
 AliAnalysisDataContainer.h:201
 AliAnalysisDataContainer.h:202
 AliAnalysisDataContainer.h:203
 AliAnalysisDataContainer.h:204
 AliAnalysisDataContainer.h:205
 AliAnalysisDataContainer.h:206
 AliAnalysisDataContainer.h:207
 AliAnalysisDataContainer.h:208
 AliAnalysisDataContainer.h:209
 AliAnalysisDataContainer.h:210
 AliAnalysisDataContainer.h:211
 AliAnalysisDataContainer.h:212
 AliAnalysisDataContainer.h:213