2 // Author: Beonsu Chang 26/12/94
3 #ifndef UTILS_ALIJARRAY_H
4 #define UTILS_ALIJARRAY_H
9 #include <TDirectory.h>
17 #include <TObjString.h>
21 #define JERROR(x) {std::cout<<"!!! JERROR : "<<x<<" "<<__LINE__<<" "<<__FILE__<<" "<<std::endl , gSystem->Exit(100); }
22 #define JDEBUG(x,y) if(x<100){std::cout<<"JDEBUG : "<<#x<<" : "<<(y)<<" "<<__LINE__<<" "<<__FILE__<<" "<<std::endl;}
27 class AliJArrayAlgorithm;
28 class AliJArrayAlgorithmSimple;
30 class AliJHistManager;
31 template<typename t> class AliJTH1Derived;
32 template<typename t> class AliJTH1DerivedPlayer;
34 //////////////////////////////////////////////////////
36 //////////////////////////////////////////////////////
37 std::vector<TString> Tokenize( TString s, TString d, int quote=1 );
38 TString Join( std::vector<TString>& ss , TString del=" ");
39 bool OutOf( int, int, int );
41 typedef std::vector<int> ArrayInt;
42 typedef std::vector<double> ArrayDouble;
43 //typedef AliJArray<void*> ArrayVoid*;
45 //////////////////////////////////////////////////////////////////////////
51 //////////////////////////////////////////////////////////////////////////
52 //________________________________________________________________________
55 AliJNamed( TString name, TString title, TString opt, int mode );
57 TString GetName(){ return fName; }
58 TString GetTitle(){ return fTitle; }
59 TString GetOption(){ return fOption; }
60 TString GetOption(TString key);
61 bool HasOption(TString key){ return GetOption(key)!=UndefinedOption(); }
62 bool HasOption(TString key, TString val){ return GetOption(key)==val; } // TODO sensitive?
63 void SetName( const char * s ) { fName=s; }
64 void SetTitle( const char * s ) { fTitle=s; }
65 void SetNameTitle( TString n, TString t ){ SetName(n);SetTitle(t); }
66 void SetFullOption( const char * s ) { fOption=s; }
67 void SetOption( TString key, TString value="" );
68 void RemoveOption( TString key ); // TODO
69 //void SetOptionWithString( TString s );// TODO
70 static TString UndefinedOption();
78 //////////////////////////////////////////////////////////////////////////
84 //////////////////////////////////////////////////////////////////////////
85 //________________________________________________________________________
86 class AliJBin : public AliJNamed {
88 enum { kSingle, kRange, kString , kNMode};
90 AliJBin(TString config, AliJHistManager * hmg);
91 AliJBin(const AliJBin& obj);
92 AliJBin& operator=(const AliJBin& obj);
93 AliJBin & Set( TString name, TString iname, TString Title, int mode=kRange);
94 void AddToManager( AliJHistManager* hmg );
95 AliJBin & SetBin( const int n, const float * v );
96 AliJBin & SetBin( const int n, const double * v );
97 AliJBin & SetBin( TVector * v );
98 AliJBin & SetBin( const TString v );
99 AliJBin & SetBin( const int n );
101 int GetBin( double x );
103 double GetMin(){ return fBinD[0]; }
104 double GetMax(){ return fBinD[RawSize()-1]; }
106 TString BuildTitle( int i );
107 int RawSize(){ return fBinD.size(); }
108 int Size(){ return fMode==kRange?fBinD.size()-1:fBinD.size(); }
109 double At(int i){ return fBinD[i]; }
110 TString GetIndexName(){ return fIndexName; }
115 operator int(){ return Size(); }
117 static TString GetModeString(int i);
118 static int GetMode( TString mode );
120 void AddBin( const TString & v );
121 void AddBin( float v );
122 virtual void FixBin();
124 std::vector<double> fBinD;
125 std::vector<TString> fBinStr;
128 AliJHistManager * fHMG;
133 //////////////////////////////////////////////////////////////////////////
137 // Array Base Class //
139 //////////////////////////////////////////////////////////////////////////
141 //________________________________________________________________________
142 class AliJArrayBase : public AliJNamed{
144 enum { kNormal, kSingle };
145 virtual ~AliJArrayBase();
146 AliJArrayBase& operator=(const AliJArrayBase& obj);
148 int AddDim( int i){ fDim.push_back(i);return fDim.size();}
149 int Dimension(){ return fDim.size(); }
150 int GetEntries(){ return fArraySize; }
151 int SizeOf(int i) { return fDim.at(i); }
153 ArrayInt& Index(){ return fIndex; }
155 void SetIndex( int i, int d );
156 void ClearIndex(){ fIndex.clear();fIndex.resize( Dimension(), 0 ); }
159 void * GetSingleItem();
161 ///void LockBin(bool is=true){}//TODO
162 //bool IsBinLocked(){ return fIsBinLocked; }
164 virtual void FixBin();
165 bool IsBinFixed(){ return fIsBinFixed; }
167 bool OutOfDim( int d ){ return OutOf( d, 0, Dimension()-1 ); }
168 bool OutOfSize( int i, int d ){ return OutOfDim(d) || OutOf( i, 0, SizeOf(d)-1); }
172 virtual void * BuildItem()=0;
173 virtual TString BuildName()=0;
174 virtual TString BuildTitle()=0;
175 virtual void Print()=0;
176 virtual TString GetString()=0;
178 //int Resize( int size, int dim=-1 ); // NextStep
180 bool Next(void *& item );
183 AliJArrayBase(); // Prevent direct creation of AliJArrayBase
184 AliJArrayBase(const AliJArrayBase& obj);
186 ArrayInt fDim; // Comment test
187 ArrayInt fIndex; /// Comment test
188 int fArraySize; /// Comment test3
192 AliJArrayAlgorithm * fAlg;
193 friend class AliJArrayAlgorithm;
197 //________________________________________________________________________
198 class AliJArrayAlgorithm {
200 AliJArrayAlgorithm(AliJArrayBase * cmd); //TODO Move to private
201 AliJArrayAlgorithm(const AliJArrayAlgorithm& obj);
202 AliJArrayAlgorithm& operator=(const AliJArrayAlgorithm& obj);
203 virtual ~AliJArrayAlgorithm();
204 int Dimension(){ return fCMD->Dimension(); }
205 int SizeOf(int i){ return fCMD->SizeOf(i); }
206 int GetEntries(){ return fCMD->GetEntries(); }
207 int Index(int i){ return fCMD->Index(i); }
208 virtual int BuildArray()=0;
209 virtual void * GetItem()=0;
210 virtual void SetItem(void * item)=0;
211 virtual void InitIterator()=0;
212 virtual bool Next(void *& item) = 0;
213 virtual void ** GetRawItem()=0;
214 virtual void * GetPosition()=0;
215 virtual bool IsCurrentPosition(void * pos)=0;
216 virtual void SetPosition(void * pos )=0;
217 virtual void DeletePosition( void * pos ) =0;
219 AliJArrayBase * fCMD;
222 //________________________________________________________________________
223 class AliJArrayAlgorithmSimple : public AliJArrayAlgorithm {
225 AliJArrayAlgorithmSimple( AliJArrayBase * cmd);
226 AliJArrayAlgorithmSimple(const AliJArrayAlgorithmSimple& obj);
227 AliJArrayAlgorithmSimple& operator=(const AliJArrayAlgorithmSimple& obj);
228 virtual ~AliJArrayAlgorithmSimple();
229 virtual int BuildArray();
231 void ReverseIndex(int iG );
232 virtual void * GetItem();
233 virtual void SetItem(void * item);
234 virtual void InitIterator(){ fPos = 0; }
235 virtual void ** GetRawItem(){ return &fArray[GlobalIndex()]; }
236 virtual bool Next(void *& item){
237 item = fPos<GetEntries()?(void*)fArray[fPos]:NULL;
238 if( fPos<GetEntries() ) ReverseIndex(fPos);
239 return fPos++<GetEntries();
241 virtual void * GetPosition(){ return static_cast<void*> (new int( fPos )); }
242 virtual bool IsCurrentPosition(void * pos){ return *static_cast<int*>(pos)==fPos; }
243 virtual void SetPosition(void *pos){ fPos=*static_cast<int*>(pos);ReverseIndex(fPos); }
244 virtual void DeletePosition(void *pos){ delete static_cast<int*>(pos); }
252 //////////////////////////////////////////////////////////////////////////
256 // Array Base Class //
258 //////////////////////////////////////////////////////////////////////////
259 //________________________________________________________________________
260 class AliJTH1 : public AliJArrayBase{
263 AliJTH1(TString config, AliJHistManager * hmg);
264 AliJTH1(const AliJTH1& obj);
265 AliJTH1& operator=(const AliJTH1& obj);
268 int AddDim( int i){ fDim.push_back(i);return fDim.size();}
269 int AddDim( AliJBin * bin );
270 int AddDim( TString v);
271 void AddToManager( AliJHistManager * hmg );
273 // Virtual from AliJArrayBase
274 virtual void * BuildItem() ;
275 virtual TString GetString();
276 virtual void Print();
277 virtual void FixBin();
279 virtual Int_t Write();
280 //virtual Int_t WriteAll();
281 virtual const char * ClassName(){ return "AliJTH1"; }
284 virtual TString BuildName();
285 virtual TString BuildTitle();
287 void SetTemplate(TH1* h);
293 TDirectory *fDirectory;
294 TDirectory *fSubDirectory;
295 AliJHistManager *fHMG;
297 std::vector<AliJBin*> fBins;
299 //////////////////////////////////////////////////////////////////////////
303 // Array Base Class //
305 //////////////////////////////////////////////////////////////////////////
306 template< typename T >
307 class AliJTH1Derived : public AliJTH1 {
311 AliJTH1Derived(TString config, AliJHistManager *hmg):
312 AliJTH1(config, hmg),fPlayer(this){}
313 virtual ~AliJTH1Derived();
315 //AliJTH1DerivedPlayer<T> & operator[](int i){ fPlayer.Init();return fPlayer[i]; }
316 // AliJTH1DerivedPlayer<T> & operator[](int i){ fPlayer.Init();fPlayer[i];return fPlayer; }
317 AliJTH1DerivedPlayer<T> & operator[](int i){ fPlayer.Init();fPlayer[i];return fPlayer; }
318 T * operator->(){ return static_cast<T*>(GetSingleItem()); }
319 operator T*(){ return static_cast<T*>(GetSingleItem()); }
320 // Virtual from AliJArrayBase
322 // Virtual from AliJTH1
323 virtual const char * ClassName(){ return Form("AliJ%s",T::Class()->GetName()); }
325 AliJTH1Derived<T>& operator<<(int i){ AddDim(i);return *this; }
326 AliJTH1Derived<T>& operator<<(AliJBin& v){ AddDim(&v);return *this; }
327 AliJTH1Derived<T>& operator<<(TString v){ AddDim(v);return *this; }
328 AliJTH1Derived<T>& operator<<(T v){ SetTemplate(&v);return *this; }
330 AliJTH1DerivedPlayer<T> fPlayer;
335 //////////////////////////////////////////////////////////////////////////
336 // AliJTH1DerivedPlayer //
337 //////////////////////////////////////////////////////////////////////////
338 template< typename T>
339 class AliJTH1DerivedPlayer {
341 AliJTH1DerivedPlayer( AliJTH1Derived<T> * cmd ):fLevel(0),fCMD(cmd){};
342 AliJTH1DerivedPlayer<T>& operator[](int i){
343 if( fLevel > fCMD->Dimension() ) { JERROR("Exceed Dimension"); }
344 if( OutOf( i, 0, fCMD->SizeOf(fLevel)-1) ){ JERROR(Form("wrong Index %d of %dth in ",i, fLevel)+fCMD->GetName()); }
345 fCMD->SetIndex(i, fLevel++);
348 void Init(){ fLevel=0;fCMD->ClearIndex(); }
349 T* operator->(){ return static_cast<T*>(fCMD->GetItem()); }
350 operator T*(){ return static_cast<T*>(fCMD->GetItem()); }
351 operator TObject*(){ return static_cast<TObject*>(fCMD->GetItem()); }
352 operator TH1*(){ return static_cast<TH1*>(fCMD->GetItem()); }
355 AliJTH1Derived<T> * fCMD;
358 typedef AliJTH1Derived<TH1D> AliJTH1D;
359 typedef AliJTH1Derived<TH2D> AliJTH2D;
360 typedef AliJTH1Derived<TProfile> AliJTProfile;
363 //////////////////////////////////////////////////////////////////////////
365 // AliJHistManager //
367 // Array Base Class //
369 //////////////////////////////////////////////////////////////////////////
370 class AliJHistManager: public AliJNamed{
372 AliJHistManager(TString name );
373 AliJHistManager(TString name, TString dirname );
374 AliJHistManager(const AliJHistManager& obj);
375 AliJHistManager& operator=(const AliJHistManager& obj);
376 void Add( AliJBin * o );
377 void Add( AliJTH1 * o );
379 int GetNBin(){ return fBin.size()>fBinNames.size()?fBin.size():fBinNames.size(); } // TODO
380 int GetNHist(){ return fHist.size()>fHistNames.size()?fHist.size():fHistNames.size(); } // TODO
383 TDirectory * GetDirectory(){ return fDirectory;}
384 void SetDirectory(TDirectory* d){ fDirectory = d; }
385 static AliJHistManager* GlobalManager();
386 static AliJHistManager* CurrentManager( AliJHistManager * hmg=NULL);
387 AliJHistManager * cd(){ return AliJHistManager::CurrentManager(this); }
388 void SetLoadMode(bool b=true){ fIsLoadMode = b; }
389 bool IsLoadMode(){ return fIsLoadMode; }
392 for( int i=0;i<GetNBin();i++ ) st+=fBin[i]->GetString()+"\n";
393 for( int i=0;i<GetNHist();i++ ){
394 st+=fHist[i]->GetString()+"\n";
401 AliJBin * GetBin( TString name);
402 AliJBin * GetBuiltBin( TString name);
403 AliJTH1 * GetTH1( TString name );
404 AliJTH1 * GetBuiltTH1( TString name );
405 AliJTProfile& GetTProfile( TString name){ return dynamic_cast<AliJTProfile&>(*GetTH1(name)); }
406 AliJTH1D& GetTH1D( TString name){ return dynamic_cast<AliJTH1D&>(*GetTH1(name)); }
407 AliJTH2D& GetTH2D( TString name){ return dynamic_cast<AliJTH2D&>(*GetTH1(name)); }
410 TString GetHistName(int i){ return fHistNames[i]; }
412 AliJTH1 * GetAliJTH1(int i){ return GetTH1(fHistNames[i]); }
413 int GetNAliJTH1(){ return fHistNames.size(); }
416 TDirectory * fDirectory; // TODO move to private?
420 std::vector<AliJBin*> fBin;
421 std::vector<AliJTH1*> fHist;
422 std::vector<AliJHistManager*> fManager;
423 std::vector<TString> fBinNames;
424 std::vector<TString> fBinConfigs;
425 std::vector<TString> fHistNames;
426 std::vector<TString> fHistConfigs;