// @(#)root/proofplayer:$Id$
// Author: Maarten Ballintijn   24/09/2003

/*************************************************************************
 * Copyright (C) 1995-2003, Rene Brun and Fons Rademakers.               *
 * All rights reserved.                                                  *
 *                                                                       *
 * For the licensing terms see $ROOTSYS/LICENSE.                         *
 * For the list of contributors see $ROOTSYS/README/CREDITS.             *
 *************************************************************************/

#ifndef ROOT_TProofDraw
#define ROOT_TProofDraw


//////////////////////////////////////////////////////////////////////////
//                                                                      //
// TProofDraw                                                           //
//                                                                      //
// Implement Tree drawing using PROOF.                                  //
//                                                                      //
//////////////////////////////////////////////////////////////////////////

#ifndef ROOT_TSelector
#include "TSelector.h"
#endif

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

#ifndef ROOT_TTreeDrawArgsParser
#include "TTreeDrawArgsParser.h"
#endif

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

#include <vector>


class TTree;
class TTreeFormulaManager;
class TTreeFormula;
class TStatus;
class TH1;
class TEventList;
class TEntryList;
class TProfile;
class TProfile2D;
class TGraph;
class TPolyMarker3D;
class TCollection;


class TProofDraw : public TSelector {

friend class TProofPlayer;

protected:
   TTreeDrawArgsParser  fTreeDrawArgsParser;
   TStatus             *fStatus;
   TString              fSelection;
   TString              fInitialExp;
   TTreeFormulaManager *fManager;
   TTree               *fTree;
   TTreeFormula        *fVar[4];         //  Pointer to variable formula
   TTreeFormula        *fSelect;         //  Pointer to selection formula
   Int_t                fMultiplicity;   //  Indicator of the variability of the size of entries
   Bool_t               fObjEval;        //  true if fVar1 returns an object (or pointer to).
   Int_t                fDimension;      //  Dimension of the current expression
   Double_t             fWeight;         //  Global weight for fill actions

   void     FillWeight();
   void     SetCanvas(const char *objname);
   void     SetDrawAtt(TObject *o);
   void     SetError(const char *sub, const char *mesg);

protected:
   enum { kWarn = BIT(12) };

   virtual Bool_t      CompileVariables();
   virtual void        ClearFormula();
   virtual Bool_t      ProcessSingle(Long64_t /*entry*/, Int_t /*i*/);
   virtual void        DoFill(Long64_t entry, Double_t w, const Double_t *v) = 0;
   virtual void        DefVar() = 0;

public:
   TProofDraw();
   virtual            ~TProofDraw();
   virtual int         Version() const { return 1; }
   virtual void        Init(TTree *);
   virtual void        Begin(TTree *);
   virtual void        SlaveBegin(TTree *);
   virtual Bool_t      Notify();
   virtual Bool_t      Process(Long64_t /*entry*/);
   virtual void        SlaveTerminate();
   virtual void        Terminate();

   ClassDef(TProofDraw,0)  //Tree drawing selector for PROOF
};


class TProofDrawHist : public TProofDraw {

private:
   void                DefVar1D();
   void                DefVar2D();
   void                DefVar3D();

protected:
   TH1                *fHistogram;

   virtual void        Begin1D(TTree *t);
   virtual void        Begin2D(TTree *t);
   virtual void        Begin3D(TTree *t);
   virtual void        DoFill(Long64_t entry, Double_t w, const Double_t *v);
   virtual void        DefVar();

public:
   TProofDrawHist() : fHistogram(0) { }
   virtual void        Begin(TTree *t);
   virtual void        Init(TTree *);
   virtual void        SlaveBegin(TTree *);
   virtual void        Terminate();

   ClassDef(TProofDrawHist,0)  //Tree drawing selector for PROOF
};


class TProofDrawEventList : public TProofDraw {

protected:
   TEventList*    fElist;          //  event list
   TList*         fEventLists;     //  a list of EventLists

   virtual void   DoFill(Long64_t entry, Double_t w, const Double_t *v);
   virtual void   DefVar() { }

public:
   TProofDrawEventList() : fElist(0), fEventLists(0) {}
   ~TProofDrawEventList();

   virtual void        Init(TTree *);
   virtual void        SlaveBegin(TTree *);
   virtual void        SlaveTerminate();
   virtual void        Terminate();

   ClassDef(TProofDrawEventList,0)  //Tree drawing selector for PROOF
};

class TProofDrawEntryList : public TProofDraw {
 protected:
   TEntryList *fElist;

   virtual void DoFill(Long64_t entry, Double_t w, const Double_t *v);
   virtual void DefVar() {}

 public:
   TProofDrawEntryList() : fElist(0) {};
   ~TProofDrawEntryList();

   virtual void Init(TTree *);
   virtual void SlaveBegin(TTree *);
   virtual void SlaveTerminate();
   virtual void Terminate();

   ClassDef(TProofDrawEntryList, 0)  //A Selectoor to fill a TEntryList from TTree::Draw
};


class TProofDrawProfile : public TProofDraw {

protected:
   TProfile           *fProfile;

   virtual void        DoFill(Long64_t entry, Double_t w, const Double_t *v);
   virtual void        DefVar();

public:
   TProofDrawProfile() : fProfile(0) { }
   virtual void        Init(TTree *);
   virtual void        Begin(TTree *t);
   virtual void        SlaveBegin(TTree *);
   virtual void        Terminate();

   ClassDef(TProofDrawProfile,0)  //Tree drawing selector for PROOF
};


class TProofDrawProfile2D : public TProofDraw {

protected:
   TProfile2D         *fProfile;

   virtual void        DoFill(Long64_t entry, Double_t w, const Double_t *v);
   virtual void        DefVar();

public:
   TProofDrawProfile2D() : fProfile(0) { }
   virtual void        Init(TTree *);
   virtual void        Begin(TTree *t);
   virtual void        SlaveBegin(TTree *);
   virtual void        Terminate();

   ClassDef(TProofDrawProfile2D,0)  //Tree drawing selector for PROOF
};


class TProofDrawGraph : public TProofDraw {

protected:
   TGraph             *fGraph;

   virtual void        DoFill(Long64_t entry, Double_t w, const Double_t *v);
   virtual void        DefVar() { }

public:
   TProofDrawGraph() : fGraph(0) { }
   virtual void        Init(TTree *tree);
   virtual void        SlaveBegin(TTree *);
   virtual void        Terminate();

   ClassDef(TProofDrawGraph,0)  //Tree drawing selector for PROOF
};


class TProofDrawPolyMarker3D : public TProofDraw {

protected:
   TPolyMarker3D      *fPolyMarker3D;

   virtual void        DoFill(Long64_t entry, Double_t w, const Double_t *v);
   virtual void        DefVar() { }

public:
   TProofDrawPolyMarker3D() : fPolyMarker3D(0) { }
   virtual void        Init(TTree *tree);
   virtual void        SlaveBegin(TTree *);
   virtual void        Terminate();

   ClassDef(TProofDrawPolyMarker3D,0)  //Tree drawing selector for PROOF
};

template <typename T>
class TProofVectorContainer : public TNamed {
   // Owns an std::vector<T>.
   // Implements Merge(TCollection*) which merges vectors holded
   // by all the TProofVectorContainers in the collection.
protected:
   std::vector<T> *fVector;   // vector

public:
   TProofVectorContainer(std::vector<T>* anVector) : fVector(anVector) { }
   TProofVectorContainer() : fVector(0) { }
   ~TProofVectorContainer() { delete fVector; }

   std::vector<T> *GetVector() const { return fVector; }
   Long64_t        Merge(TCollection* list);

   ClassDef(TProofVectorContainer,1) //Class describing a vector container
};

class TProofDrawListOfGraphs : public TProofDraw {

public:
   struct Point3D_t {
   public:
      Double_t fX, fY, fZ;
      Point3D_t(Double_t x, Double_t y, Double_t z) : fX(x), fY(y), fZ(z) { }
      Point3D_t() : fX(0), fY(0), fZ(0) { }
   };

protected:
   TProofVectorContainer<Point3D_t> *fPoints;
   virtual void        DoFill(Long64_t entry, Double_t w, const Double_t *v);
   virtual void        DefVar() { }

public:
   TProofDrawListOfGraphs() : fPoints(0) { }
   virtual void        SlaveBegin(TTree *);
   virtual void        Terminate();

   ClassDef(TProofDrawListOfGraphs,0)  //Tree drawing selector for PROOF
};


class TProofDrawListOfPolyMarkers3D : public TProofDraw {

public:
   struct Point4D_t {
   public:
      Double_t fX, fY, fZ, fT;
      Point4D_t(Double_t x, Double_t y, Double_t z, Double_t t) : fX(x), fY(y), fZ(z), fT(t) { }
      Point4D_t() : fX(0), fY(0), fZ(0), fT(0) { }
   };

protected:
   TProofVectorContainer<Point4D_t> *fPoints;
   virtual void        DoFill(Long64_t entry, Double_t w, const Double_t *v);
   virtual void        DefVar() { }

public:
   TProofDrawListOfPolyMarkers3D() : fPoints(0) { }
   virtual void        SlaveBegin(TTree *);
   virtual void        Terminate();

   ClassDef(TProofDrawListOfPolyMarkers3D,0)  //Tree drawing selector for PROOF
};

#ifndef __CINT__
template <typename T>
Long64_t TProofVectorContainer<T>::Merge(TCollection* li)
{
   // Adds all vectors holded by all TProofVectorContainers in the collection
   // the vector holded by this TProofVectorContainer.
   // Returns the total number of poins in the result or -1 in case of an error.

   TIter next(li);

   std::back_insert_iterator<std::vector<T> > ii(*fVector);
   while (TObject* o = next()) {
      TProofVectorContainer<T> *vh = dynamic_cast<TProofVectorContainer<T>*> (o);
      if (!vh) {
         Error("Merge",
             "Cannot merge - an object which doesn't inherit from TProofVectorContainer<T> found in the list");
         return -1;
      }
      std::copy(vh->GetVector()->begin(), vh->GetVector()->end(), ii);
   }
   return fVector->size();
}
#endif

#endif
 TProofDraw.h:1
 TProofDraw.h:2
 TProofDraw.h:3
 TProofDraw.h:4
 TProofDraw.h:5
 TProofDraw.h:6
 TProofDraw.h:7
 TProofDraw.h:8
 TProofDraw.h:9
 TProofDraw.h:10
 TProofDraw.h:11
 TProofDraw.h:12
 TProofDraw.h:13
 TProofDraw.h:14
 TProofDraw.h:15
 TProofDraw.h:16
 TProofDraw.h:17
 TProofDraw.h:18
 TProofDraw.h:19
 TProofDraw.h:20
 TProofDraw.h:21
 TProofDraw.h:22
 TProofDraw.h:23
 TProofDraw.h:24
 TProofDraw.h:25
 TProofDraw.h:26
 TProofDraw.h:27
 TProofDraw.h:28
 TProofDraw.h:29
 TProofDraw.h:30
 TProofDraw.h:31
 TProofDraw.h:32
 TProofDraw.h:33
 TProofDraw.h:34
 TProofDraw.h:35
 TProofDraw.h:36
 TProofDraw.h:37
 TProofDraw.h:38
 TProofDraw.h:39
 TProofDraw.h:40
 TProofDraw.h:41
 TProofDraw.h:42
 TProofDraw.h:43
 TProofDraw.h:44
 TProofDraw.h:45
 TProofDraw.h:46
 TProofDraw.h:47
 TProofDraw.h:48
 TProofDraw.h:49
 TProofDraw.h:50
 TProofDraw.h:51
 TProofDraw.h:52
 TProofDraw.h:53
 TProofDraw.h:54
 TProofDraw.h:55
 TProofDraw.h:56
 TProofDraw.h:57
 TProofDraw.h:58
 TProofDraw.h:59
 TProofDraw.h:60
 TProofDraw.h:61
 TProofDraw.h:62
 TProofDraw.h:63
 TProofDraw.h:64
 TProofDraw.h:65
 TProofDraw.h:66
 TProofDraw.h:67
 TProofDraw.h:68
 TProofDraw.h:69
 TProofDraw.h:70
 TProofDraw.h:71
 TProofDraw.h:72
 TProofDraw.h:73
 TProofDraw.h:74
 TProofDraw.h:75
 TProofDraw.h:76
 TProofDraw.h:77
 TProofDraw.h:78
 TProofDraw.h:79
 TProofDraw.h:80
 TProofDraw.h:81
 TProofDraw.h:82
 TProofDraw.h:83
 TProofDraw.h:84
 TProofDraw.h:85
 TProofDraw.h:86
 TProofDraw.h:87
 TProofDraw.h:88
 TProofDraw.h:89
 TProofDraw.h:90
 TProofDraw.h:91
 TProofDraw.h:92
 TProofDraw.h:93
 TProofDraw.h:94
 TProofDraw.h:95
 TProofDraw.h:96
 TProofDraw.h:97
 TProofDraw.h:98
 TProofDraw.h:99
 TProofDraw.h:100
 TProofDraw.h:101
 TProofDraw.h:102
 TProofDraw.h:103
 TProofDraw.h:104
 TProofDraw.h:105
 TProofDraw.h:106
 TProofDraw.h:107
 TProofDraw.h:108
 TProofDraw.h:109
 TProofDraw.h:110
 TProofDraw.h:111
 TProofDraw.h:112
 TProofDraw.h:113
 TProofDraw.h:114
 TProofDraw.h:115
 TProofDraw.h:116
 TProofDraw.h:117
 TProofDraw.h:118
 TProofDraw.h:119
 TProofDraw.h:120
 TProofDraw.h:121
 TProofDraw.h:122
 TProofDraw.h:123
 TProofDraw.h:124
 TProofDraw.h:125
 TProofDraw.h:126
 TProofDraw.h:127
 TProofDraw.h:128
 TProofDraw.h:129
 TProofDraw.h:130
 TProofDraw.h:131
 TProofDraw.h:132
 TProofDraw.h:133
 TProofDraw.h:134
 TProofDraw.h:135
 TProofDraw.h:136
 TProofDraw.h:137
 TProofDraw.h:138
 TProofDraw.h:139
 TProofDraw.h:140
 TProofDraw.h:141
 TProofDraw.h:142
 TProofDraw.h:143
 TProofDraw.h:144
 TProofDraw.h:145
 TProofDraw.h:146
 TProofDraw.h:147
 TProofDraw.h:148
 TProofDraw.h:149
 TProofDraw.h:150
 TProofDraw.h:151
 TProofDraw.h:152
 TProofDraw.h:153
 TProofDraw.h:154
 TProofDraw.h:155
 TProofDraw.h:156
 TProofDraw.h:157
 TProofDraw.h:158
 TProofDraw.h:159
 TProofDraw.h:160
 TProofDraw.h:161
 TProofDraw.h:162
 TProofDraw.h:163
 TProofDraw.h:164
 TProofDraw.h:165
 TProofDraw.h:166
 TProofDraw.h:167
 TProofDraw.h:168
 TProofDraw.h:169
 TProofDraw.h:170
 TProofDraw.h:171
 TProofDraw.h:172
 TProofDraw.h:173
 TProofDraw.h:174
 TProofDraw.h:175
 TProofDraw.h:176
 TProofDraw.h:177
 TProofDraw.h:178
 TProofDraw.h:179
 TProofDraw.h:180
 TProofDraw.h:181
 TProofDraw.h:182
 TProofDraw.h:183
 TProofDraw.h:184
 TProofDraw.h:185
 TProofDraw.h:186
 TProofDraw.h:187
 TProofDraw.h:188
 TProofDraw.h:189
 TProofDraw.h:190
 TProofDraw.h:191
 TProofDraw.h:192
 TProofDraw.h:193
 TProofDraw.h:194
 TProofDraw.h:195
 TProofDraw.h:196
 TProofDraw.h:197
 TProofDraw.h:198
 TProofDraw.h:199
 TProofDraw.h:200
 TProofDraw.h:201
 TProofDraw.h:202
 TProofDraw.h:203
 TProofDraw.h:204
 TProofDraw.h:205
 TProofDraw.h:206
 TProofDraw.h:207
 TProofDraw.h:208
 TProofDraw.h:209
 TProofDraw.h:210
 TProofDraw.h:211
 TProofDraw.h:212
 TProofDraw.h:213
 TProofDraw.h:214
 TProofDraw.h:215
 TProofDraw.h:216
 TProofDraw.h:217
 TProofDraw.h:218
 TProofDraw.h:219
 TProofDraw.h:220
 TProofDraw.h:221
 TProofDraw.h:222
 TProofDraw.h:223
 TProofDraw.h:224
 TProofDraw.h:225
 TProofDraw.h:226
 TProofDraw.h:227
 TProofDraw.h:228
 TProofDraw.h:229
 TProofDraw.h:230
 TProofDraw.h:231
 TProofDraw.h:232
 TProofDraw.h:233
 TProofDraw.h:234
 TProofDraw.h:235
 TProofDraw.h:236
 TProofDraw.h:237
 TProofDraw.h:238
 TProofDraw.h:239
 TProofDraw.h:240
 TProofDraw.h:241
 TProofDraw.h:242
 TProofDraw.h:243
 TProofDraw.h:244
 TProofDraw.h:245
 TProofDraw.h:246
 TProofDraw.h:247
 TProofDraw.h:248
 TProofDraw.h:249
 TProofDraw.h:250
 TProofDraw.h:251
 TProofDraw.h:252
 TProofDraw.h:253
 TProofDraw.h:254
 TProofDraw.h:255
 TProofDraw.h:256
 TProofDraw.h:257
 TProofDraw.h:258
 TProofDraw.h:259
 TProofDraw.h:260
 TProofDraw.h:261
 TProofDraw.h:262
 TProofDraw.h:263
 TProofDraw.h:264
 TProofDraw.h:265
 TProofDraw.h:266
 TProofDraw.h:267
 TProofDraw.h:268
 TProofDraw.h:269
 TProofDraw.h:270
 TProofDraw.h:271
 TProofDraw.h:272
 TProofDraw.h:273
 TProofDraw.h:274
 TProofDraw.h:275
 TProofDraw.h:276
 TProofDraw.h:277
 TProofDraw.h:278
 TProofDraw.h:279
 TProofDraw.h:280
 TProofDraw.h:281
 TProofDraw.h:282
 TProofDraw.h:283
 TProofDraw.h:284
 TProofDraw.h:285
 TProofDraw.h:286
 TProofDraw.h:287
 TProofDraw.h:288
 TProofDraw.h:289
 TProofDraw.h:290
 TProofDraw.h:291
 TProofDraw.h:292
 TProofDraw.h:293
 TProofDraw.h:294
 TProofDraw.h:295
 TProofDraw.h:296
 TProofDraw.h:297
 TProofDraw.h:298
 TProofDraw.h:299
 TProofDraw.h:300
 TProofDraw.h:301
 TProofDraw.h:302
 TProofDraw.h:303
 TProofDraw.h:304
 TProofDraw.h:305
 TProofDraw.h:306
 TProofDraw.h:307
 TProofDraw.h:308
 TProofDraw.h:309
 TProofDraw.h:310
 TProofDraw.h:311
 TProofDraw.h:312
 TProofDraw.h:313
 TProofDraw.h:314
 TProofDraw.h:315
 TProofDraw.h:316
 TProofDraw.h:317
 TProofDraw.h:318
 TProofDraw.h:319
 TProofDraw.h:320
 TProofDraw.h:321
 TProofDraw.h:322
 TProofDraw.h:323
 TProofDraw.h:324
 TProofDraw.h:325
 TProofDraw.h:326
 TProofDraw.h:327
 TProofDraw.h:328
 TProofDraw.h:329
 TProofDraw.h:330
 TProofDraw.h:331
 TProofDraw.h:332
 TProofDraw.h:333
 TProofDraw.h:334
 TProofDraw.h:335
 TProofDraw.h:336