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 double GetMin(){ return fBinD[0]; }
102 double GetMax(){ return fBinD[RawSize()-1]; }
104 TString BuildTitle( int i );
105 int RawSize(){ return fBinD.size(); }
106 int Size(){ return fMode==kRange?fBinD.size()-1:fBinD.size(); }
107 double At(int i){ return fBinD[i]; }
108 TString GetIndexName(){ return fIndexName; }
113 operator int(){ return Size(); }
115 static TString GetModeString(int i);
116 static int GetMode( TString mode );
118 void AddBin( const TString & v );
119 void AddBin( float v );
120 virtual void FixBin();
122 std::vector<double> fBinD;
123 std::vector<TString> fBinStr;
126 AliJHistManager * fHMG;
131 //////////////////////////////////////////////////////////////////////////
135 // Array Base Class //
137 //////////////////////////////////////////////////////////////////////////
139 //________________________________________________________________________
140 class AliJArrayBase : public AliJNamed{
142 enum { kNormal, kSingle };
143 virtual ~AliJArrayBase();
144 AliJArrayBase& operator=(const AliJArrayBase& obj);
146 int AddDim( int i){ fDim.push_back(i);return fDim.size();}
147 int Dimension(){ return fDim.size(); }
148 int GetEntries(){ return fArraySize; }
149 int SizeOf(int i) { return fDim.at(i); }
151 ArrayInt& Index(){ return fIndex; }
153 void SetIndex( int i, int d );
154 void ClearIndex(){ fIndex.clear();fIndex.resize( Dimension(), 0 ); }
157 void * GetSingleItem();
159 ///void LockBin(bool is=true){}//TODO
160 //bool IsBinLocked(){ return fIsBinLocked; }
162 virtual void FixBin();
163 bool IsBinFixed(){ return fIsBinFixed; }
165 bool OutOfDim( int d ){ return OutOf( d, 0, Dimension()-1 ); }
166 bool OutOfSize( int i, int d ){ return OutOfDim(d) || OutOf( i, 0, SizeOf(d)-1); }
170 virtual void * BuildItem()=0;
171 virtual TString BuildName()=0;
172 virtual TString BuildTitle()=0;
173 virtual void Print()=0;
174 virtual TString GetString()=0;
176 //int Resize( int size, int dim=-1 ); // NextStep
178 bool Next(void *& item );
181 AliJArrayBase(); // Prevent direct creation of AliJArrayBase
182 AliJArrayBase(const AliJArrayBase& obj);
184 ArrayInt fDim; // Comment test
185 ArrayInt fIndex; /// Comment test
186 int fArraySize; /// Comment test3
190 AliJArrayAlgorithm * fAlg;
191 friend class AliJArrayAlgorithm;
195 //________________________________________________________________________
196 class AliJArrayAlgorithm {
198 AliJArrayAlgorithm(AliJArrayBase * cmd); //TODO Move to private
199 AliJArrayAlgorithm(const AliJArrayAlgorithm& obj);
200 AliJArrayAlgorithm& operator=(const AliJArrayAlgorithm& obj);
201 virtual ~AliJArrayAlgorithm();
202 int Dimension(){ return fCMD->Dimension(); }
203 int SizeOf(int i){ return fCMD->SizeOf(i); }
204 int GetEntries(){ return fCMD->GetEntries(); }
205 int Index(int i){ return fCMD->Index(i); }
206 virtual int BuildArray()=0;
207 virtual void * GetItem()=0;
208 virtual void SetItem(void * item)=0;
209 virtual void InitIterator()=0;
210 virtual bool Next(void *& item) = 0;
211 virtual void ** GetRawItem()=0;
212 virtual void * GetPosition()=0;
213 virtual bool IsCurrentPosition(void * pos)=0;
214 virtual void SetPosition(void * pos )=0;
215 virtual void DeletePosition( void * pos ) =0;
217 AliJArrayBase * fCMD;
220 //________________________________________________________________________
221 class AliJArrayAlgorithmSimple : public AliJArrayAlgorithm {
223 AliJArrayAlgorithmSimple( AliJArrayBase * cmd);
224 AliJArrayAlgorithmSimple(const AliJArrayAlgorithmSimple& obj);
225 AliJArrayAlgorithmSimple& operator=(const AliJArrayAlgorithmSimple& obj);
226 virtual ~AliJArrayAlgorithmSimple();
227 virtual int BuildArray();
229 void ReverseIndex(int iG );
230 virtual void * GetItem();
231 virtual void SetItem(void * item);
232 virtual void InitIterator(){ fPos = 0; }
233 virtual void ** GetRawItem(){ return &fArray[GlobalIndex()]; }
234 virtual bool Next(void *& item){
235 item = fPos<GetEntries()?(void*)fArray[fPos]:NULL;
236 if( fPos<GetEntries() ) ReverseIndex(fPos);
237 return fPos++<GetEntries();
239 virtual void * GetPosition(){ return static_cast<void*> (new int( fPos )); }
240 virtual bool IsCurrentPosition(void * pos){ return *static_cast<int*>(pos)==fPos; }
241 virtual void SetPosition(void *pos){ fPos=*static_cast<int*>(pos);ReverseIndex(fPos); }
242 virtual void DeletePosition(void *pos){ delete static_cast<int*>(pos); }
250 //////////////////////////////////////////////////////////////////////////
254 // Array Base Class //
256 //////////////////////////////////////////////////////////////////////////
257 //________________________________________________________________________
258 class AliJTH1 : public AliJArrayBase{
261 AliJTH1(TString config, AliJHistManager * hmg);
262 AliJTH1(const AliJTH1& obj);
263 AliJTH1& operator=(const AliJTH1& obj);
266 int AddDim( int i){ fDim.push_back(i);return fDim.size();}
267 int AddDim( AliJBin * bin );
268 int AddDim( TString v);
269 void AddToManager( AliJHistManager * hmg );
271 // Virtual from AliJArrayBase
272 virtual void * BuildItem() ;
273 virtual TString GetString();
274 virtual void Print();
275 virtual void FixBin();
277 virtual Int_t Write();
278 //virtual Int_t WriteAll();
279 virtual const char * ClassName(){ return "AliJTH1"; }
282 virtual TString BuildName();
283 virtual TString BuildTitle();
285 void SetTemplate(TH1* h);
291 TDirectory *fDirectory;
292 TDirectory *fSubDirectory;
293 AliJHistManager *fHMG;
295 std::vector<AliJBin*> fBins;
297 //////////////////////////////////////////////////////////////////////////
301 // Array Base Class //
303 //////////////////////////////////////////////////////////////////////////
304 template< typename T >
305 class AliJTH1Derived : public AliJTH1 {
309 AliJTH1Derived(TString config, AliJHistManager *hmg):
310 AliJTH1(config, hmg),fPlayer(this){}
311 virtual ~AliJTH1Derived();
313 //AliJTH1DerivedPlayer<T> & operator[](int i){ fPlayer.Init();return fPlayer[i]; }
314 // AliJTH1DerivedPlayer<T> & operator[](int i){ fPlayer.Init();fPlayer[i];return fPlayer; }
315 AliJTH1DerivedPlayer<T> & operator[](int i){ fPlayer.Init();fPlayer[i];return fPlayer; }
316 T * operator->(){ return static_cast<T*>(GetSingleItem()); }
317 operator T*(){ return static_cast<T*>(GetSingleItem()); }
318 // Virtual from AliJArrayBase
320 // Virtual from AliJTH1
321 virtual const char * ClassName(){ return Form("AliJ%s",T::Class()->GetName()); }
323 AliJTH1Derived<T>& operator<<(int i){ AddDim(i);return *this; }
324 AliJTH1Derived<T>& operator<<(AliJBin& v){ AddDim(&v);return *this; }
325 AliJTH1Derived<T>& operator<<(TString v){ AddDim(v);return *this; }
326 AliJTH1Derived<T>& operator<<(T v){ SetTemplate(&v);return *this; }
328 AliJTH1DerivedPlayer<T> fPlayer;
333 //////////////////////////////////////////////////////////////////////////
334 // AliJTH1DerivedPlayer //
335 //////////////////////////////////////////////////////////////////////////
336 template< typename T>
337 class AliJTH1DerivedPlayer {
339 AliJTH1DerivedPlayer( AliJTH1Derived<T> * cmd ):fLevel(0),fCMD(cmd){};
340 AliJTH1DerivedPlayer<T>& operator[](int i){
341 if( fLevel > fCMD->Dimension() ) { JERROR("Exceed Dimension"); }
342 if( OutOf( i, 0, fCMD->SizeOf(fLevel)-1) ){ JERROR(Form("wrong Index %d of %dth in ",i, fLevel)+fCMD->GetName()); }
343 fCMD->SetIndex(i, fLevel++);
346 void Init(){ fLevel=0;fCMD->ClearIndex(); }
347 T* operator->(){ return static_cast<T*>(fCMD->GetItem()); }
348 operator T*(){ return static_cast<T*>(fCMD->GetItem()); }
349 operator TObject*(){ return static_cast<TObject*>(fCMD->GetItem()); }
350 operator TH1*(){ return static_cast<TH1*>(fCMD->GetItem()); }
353 AliJTH1Derived<T> * fCMD;
356 typedef AliJTH1Derived<TH1D> AliJTH1D;
357 typedef AliJTH1Derived<TH2D> AliJTH2D;
358 typedef AliJTH1Derived<TProfile> AliJTProfile;
361 //////////////////////////////////////////////////////////////////////////
363 // AliJHistManager //
365 // Array Base Class //
367 //////////////////////////////////////////////////////////////////////////
368 class AliJHistManager: public AliJNamed{
370 AliJHistManager(TString name );
371 AliJHistManager(const AliJHistManager& obj);
372 AliJHistManager& operator=(const AliJHistManager& obj);
373 void Add( AliJBin * o );
374 void Add( AliJTH1 * o );
376 int GetNBin(){ return fBin.size()>fBinNames.size()?fBin.size():fBinNames.size(); } // TODO
377 int GetNHist(){ return fHist.size()>fHistNames.size()?fHist.size():fHistNames.size(); } // TODO
380 TDirectory * GetDirectory(){ return fDirectory;}
381 void SetDirectory(TDirectory* d){ fDirectory = d; }
382 static AliJHistManager* GlobalManager();
383 static AliJHistManager* CurrentManager( AliJHistManager * hmg=NULL);
384 void SetLoadMode(bool b=true){ fIsLoadMode = b; }
385 bool IsLoadMode(){ return fIsLoadMode; }
388 for( int i=0;i<GetNBin();i++ ) st+=fBin[i]->GetString()+"\n";
389 for( int i=0;i<GetNHist();i++ ){
390 st+=fHist[i]->GetString()+"\n";
397 AliJBin * GetBin( TString name);
398 AliJBin * GetBuiltBin( TString name);
399 AliJTH1 * GetTH1( TString name );
400 AliJTH1 * GetBuiltTH1( TString name );
401 AliJTProfile& GetTProfile( TString name){ return dynamic_cast<AliJTProfile&>(*GetTH1(name)); }
402 AliJTH1D& GetTH1D( TString name){ return dynamic_cast<AliJTH1D&>(*GetTH1(name)); }
403 AliJTH2D& GetTH2D( TString name){ return dynamic_cast<AliJTH2D&>(*GetTH1(name)); }
405 TDirectory * fDirectory;
407 TString GetHistName(int i){ return fHistNames[i]; }
409 AliJTH1 * GetAliJTH1(int i){ return GetTH1(fHistNames[i]); }
410 int GetNAliJTH1(){ return fHistNames.size(); }
415 std::vector<AliJBin*> fBin;
416 std::vector<AliJTH1*> fHist;
417 std::vector<AliJHistManager*> fManager;
418 std::vector<TString> fBinNames;
419 std::vector<TString> fBinConfigs;
420 std::vector<TString> fHistNames;
421 std::vector<TString> fHistConfigs;