1 #include "AliJHistManager.h"
3 //////////////////////////////////////////////////////
5 //////////////////////////////////////////////////////
7 AliJNamed::AliJNamed(TString name, TString title, TString opt, int mode) :
16 AliJNamed::~AliJNamed(){
17 // virtual destructor for base class
20 TString AliJNamed::GetOption(TString key){
21 TPMERegexp a("&"+key+"=?([^&]*)","i");
22 int nMatch = a.Match(fOption);
23 if( nMatch < 2 ) return UndefinedOption();
26 void AliJNamed::SetOption( TString key, TString value){
27 TPMERegexp a("&"+key+"=?[^&]*","i");
28 int nMatch = a.Match(fOption);
29 TString newOpt = "&"+key +( value.Length()?"="+value:"");
30 if( value == UndefinedOption() ) newOpt = "";
31 if( nMatch < 1 ) fOption += newOpt;
32 else fOption.ReplaceAll( a[0], newOpt );
34 void AliJNamed::RemoveOption( TString key ){
35 SetOption( key, UndefinedOption() );
37 TString AliJNamed::UndefinedOption(){
38 //static TString undefinedOption = "Undefined";
39 //return undefinedOption;
43 //////////////////////////////////////////////////////
45 //////////////////////////////////////////////////////
47 //_____________________________________________________
49 AliJNamed("AliJBin","%.2f-%2.f", "&Mode=Range", kRange),
56 //_____________________________________________________
57 AliJBin::AliJBin(TString config, AliJHistManager * hmg):
58 AliJNamed("AliJBin","%.2f-%2.f", "&Mode=Range", kRange),
66 std::vector<TString> t = Tokenize(config, " \t,");
71 fTitle.ReplaceAll("\"","" );
72 SetFullOption( t[4] );
73 fMode = GetMode( GetOption("mode") );
76 for( int i=5;i<int(t.size());i++ ) s+=" "+t[i];
80 //_____________________________________________________
81 AliJBin::AliJBin(const AliJBin& obj) :
82 AliJNamed(obj.fName,obj.fTitle,obj.fOption,obj.fMode),
85 fIsFixedBin(obj.fIsFixedBin),
86 fIndexName(obj.fIndexName),
89 // copy constructor TODO: proper handling of pointer data members
92 //_____________________________________________________
93 AliJBin& AliJBin::operator=(const AliJBin& obj)
95 // assignment operator
97 // TODO: proper implementation
102 //_____________________________________________________
103 void AliJBin::FixBin(){
104 if(fIsFixedBin ) return;
106 if(!fHMG) AddToManager( AliJHistManager::CurrentManager());
109 //_____________________________________________________
110 void AliJBin::AddToManager( AliJHistManager* hmg ){
113 //_____________________________________________________
114 AliJBin & AliJBin::Set( TString name, TString iname, TString title, int mode){
115 SetNameTitle( name, title );
118 SetOption("mode",GetModeString(mode));
121 //_____________________________________________________
122 TString AliJBin::GetModeString(int i){
123 static TString mode[] = { "Single","Range","String" };
124 if( i<0 || i>2 ) return "";
127 int AliJBin::GetMode( TString mode ){
128 for( int i=0;i<kNMode;i++ ) if( mode == GetModeString(i) ) return i;
131 //_____________________________________________________
132 AliJBin & AliJBin::SetBin( const int n, const float * v ){
133 for( int i=0;i<n;i++ ) AddBin( v[i] );FixBin();
136 //_____________________________________________________
137 AliJBin & AliJBin::SetBin( const int n, const double * v ){
138 for( int i=0;i<n;i++ ) AddBin( v[i] );FixBin();
141 AliJBin & AliJBin::SetBin( TVector *v ){
142 for( int i=0;i<v->GetNrows();i++ ) AddBin( (v->GetMatrixArray())[i] );FixBin();
145 //_____________________________________________________
146 AliJBin& AliJBin::SetBin(const TString v){
147 std::vector<TString> ar = Tokenize( v, "\t ,");
148 for( UInt_t i=0; i<ar.size();i++ ) AddBin( ar[i] );FixBin();
152 //_____________________________________________________
153 AliJBin& AliJBin::SetBin(const int n){
154 for( UInt_t i=0; i<UInt_t(n);i++ ) AddBin( i );FixBin();
157 //_____________________________________________________
158 void AliJBin::AddBin( const TString& v ){
159 if( fIsFixedBin ) { JERROR( "You can't Add Bin"); }
160 fBinStr.push_back( (v=="_")?"":v );
161 fBinD.push_back( v.Atof() );
163 //_____________________________________________________
164 void AliJBin::AddBin( float v ){
165 if( fIsFixedBin ) { JERROR( "You can't Add Bin"); }
166 fBinD.push_back( v );
167 fBinStr.push_back(Form("%f",v));
169 //_____________________________________________________
170 TString AliJBin::BuildTitle( int i ){
171 if( i < 0 || i > Size() ) return "";
172 if( fMode == kSingle )
173 return TString(Form(fTitle.Data(), fBinD[i] ));
174 if( fMode == kRange )
175 return TString(Form(fTitle.Data(), fBinD[i], fBinD[i+1]));
176 if( fMode == kString )
177 return TString( Form(fTitle.Data(), fBinStr[i].Data()) );
178 JERROR( TString("Bad Mode of AliJBin type ") + char(fMode) + " in " + fName+ "!!!" );
181 //_____________________________________________________
182 TString AliJBin::GetString(){
183 SetOption( "mode",GetModeString(fMode) );
184 return "AliJBin\t"+fName+"\t"+fIndexName+"\t\""+fTitle+"\""+"\t"+fOption+"\t"+Join(fBinStr," ");
187 //_____________________________________________________
188 void AliJBin::Print(){
189 std::cout<<"*"+GetString()<<std::endl;
192 //////////////////////////////////////////////////////
194 //////////////////////////////////////////////////////
196 //_____________________________________________________
197 AliJArrayBase::AliJArrayBase():
198 AliJNamed("AliJArayBase","","&Dir=default&Lazy",0),
199 //AliJNamed("AliJArayBase","","&Dir=default&LessLazy",0),
210 //_____________________________________________________
211 AliJArrayBase::~AliJArrayBase(){
213 if(fAlg) delete fAlg;
216 //_____________________________________________________
217 AliJArrayBase::AliJArrayBase(const AliJArrayBase& obj) :
218 AliJNamed(obj.fName,obj.fTitle,obj.fOption,obj.fMode),
221 fArraySize(obj.fArraySize),
222 fNGenerated(obj.fNGenerated),
223 fIsBinFixed(obj.fIsBinFixed),
224 fIsBinLocked(obj.fIsBinLocked),
227 // copy constructor TODO: proper handling of pointer data members
230 //_____________________________________________________
231 AliJArrayBase& AliJArrayBase::operator=(const AliJArrayBase& obj)
233 // assignment operator
235 // TODO: proper implementation
240 //_____________________________________________________
241 void* AliJArrayBase::GetItem(){
242 void * item = fAlg->GetItem();
245 item = fAlg->GetItem();
249 //_____________________________________________________
250 void* AliJArrayBase::GetSingleItem(){
251 if(fMode == kSingle )return GetItem();
252 JERROR("This is not single array");
255 //_____________________________________________________
256 void AliJArrayBase::FixBin(){
257 if( Dimension() == 0 ){
258 AddDim(1);SetOption("Single");
260 if( HasOption("dir","default")) RemoveOption("dir");
263 fAlg = new AliJArrayAlgorithmSimple(this);
264 fArraySize = fAlg->BuildArray();
266 //_____________________________________________________
267 int AliJArrayBase::Index(int d){
268 if( OutOfDim(d) ) JERROR("Wrong Dim");
271 void AliJArrayBase::SetIndex(int i, int d ){
272 if( OutOfSize( i, d ) ) JERROR( "Wrong Index" );
276 void AliJArrayBase::InitIterator(){ fAlg->InitIterator(); }
277 bool AliJArrayBase::Next(void *& item){ return fAlg->Next(item); }
280 //////////////////////////////////////////////////////
281 // AliJArrayAlgorithm
282 //////////////////////////////////////////////////////
284 //_____________________________________________________
285 AliJArrayAlgorithm::AliJArrayAlgorithm(AliJArrayBase * cmd):
290 //_____________________________________________________
291 AliJArrayAlgorithm::~AliJArrayAlgorithm(){
295 //_____________________________________________________
296 AliJArrayAlgorithm::AliJArrayAlgorithm(const AliJArrayAlgorithm& obj) :
299 // copy constructor TODO: proper handling of pointer data members
302 //_____________________________________________________
303 AliJArrayAlgorithm& AliJArrayAlgorithm::operator=(const AliJArrayAlgorithm& obj)
305 // assignment operator
312 //////////////////////////////////////////////////////
313 // AliJArrayAlgorithmSimple
314 //////////////////////////////////////////////////////
316 //_____________________________________________________
317 AliJArrayAlgorithmSimple::AliJArrayAlgorithmSimple(AliJArrayBase * cmd):
318 AliJArrayAlgorithm(cmd),
325 //_____________________________________________________
326 AliJArrayAlgorithmSimple::~AliJArrayAlgorithmSimple(){
327 // Dimension, GetEntries, SizeOf
328 if( fArray ) delete [] (void**)fArray;
331 //_____________________________________________________
332 AliJArrayAlgorithmSimple::AliJArrayAlgorithmSimple(const AliJArrayAlgorithmSimple& obj) :
333 AliJArrayAlgorithm(obj.fCMD),
334 fDimFactor(obj.fDimFactor),
338 // copy constructor TODO: proper handling of pointer data members
341 //_____________________________________________________
342 AliJArrayAlgorithmSimple& AliJArrayAlgorithmSimple::operator=(const AliJArrayAlgorithmSimple& obj)
344 // assignment operator TODO: proper implementation
350 //_____________________________________________________
351 int AliJArrayAlgorithmSimple::BuildArray(){
352 fDimFactor.resize( Dimension(), 1 );
353 for( int i=Dimension()-2; i>=0; i-- ){
354 fDimFactor[i] = fDimFactor[i+1] * SizeOf(i+1);
355 } // TODO split to BuildArray and lazyArray in GetItem
356 int arraySize = fDimFactor[0] * SizeOf(0);
357 fArray = new void*[arraySize];
358 for( int i=0;i<arraySize;i++ ) fArray[i] = NULL;
361 //_____________________________________________________
362 int AliJArrayAlgorithmSimple::GlobalIndex(){
364 for( int i=0;i<Dimension();i++ ) // Index is checked by fCMD
365 iG+= Index(i)*fDimFactor[i];
370 void AliJArrayAlgorithmSimple::ReverseIndex( int iG ){
372 for( int i=0;i<Dimension();i++ ){
373 int n1 = int(n/fDimFactor[i]);
374 fCMD->SetIndex( n1 , i );
378 void * AliJArrayAlgorithmSimple::GetItem(){
379 return fArray[GlobalIndex()];
382 void AliJArrayAlgorithmSimple::SetItem(void * item){
383 fArray[GlobalIndex()] = item;
387 //////////////////////////////////////////////////////
389 //////////////////////////////////////////////////////
390 //_____________________________________________________
398 // default constructor
402 //_____________________________________________________
403 AliJTH1::AliJTH1(TString config, AliJHistManager * hmg):
411 std::vector<TString> t = Tokenize(config, " \t,");
415 fTitle.ReplaceAll("\"","");
416 SetFullOption( t[3] );
417 fMode = HasOption("mode","Single")?kSingle:kNormal;
420 for( int i=4;i<int(t.size());i++ ) s+=" "+t[i];
424 //_____________________________________________________
427 if( fNGenerated == 0 && fTemplate ) delete fTemplate;
430 //_____________________________________________________
431 AliJTH1::AliJTH1(const AliJTH1& obj) :
433 fDirectory(obj.fDirectory),
434 fSubDirectory(obj.fSubDirectory),
436 fTemplate(obj.fTemplate),
439 // copy constructor TODO: proper handling of pointer data members
442 //_____________________________________________________
443 AliJTH1& AliJTH1::operator=(const AliJTH1& obj)
445 // assignment operator
447 // TODO: proper implementation
452 //_____________________________________________________
453 int AliJTH1::AddDim( AliJBin * bin){
454 int ndim = this->AliJArrayBase::AddDim( bin->Size() );
455 fBins.resize( ndim, NULL );
460 int AliJTH1::AddDim(TString v) {
461 if( v == "END" ) { FixBin(); }
463 std::vector<TString> o= Tokenize(v, "\t ,");
464 for( UInt_t i=0;i<o.size();i++ ){
466 if(s.Length() == 0 ) continue;
467 if( s.IsFloat() ) { // TODO IsInt? IsDigit?
472 if( fHMG ) b = fHMG->GetBin(s);
473 if( b ) this->AddDim(b);
474 else {JERROR("Wrong terminator of Array : \"" + s+"\" in " + fName ); }
479 //_____________________________________________________
480 Int_t AliJTH1::Write(){
481 TDirectory *owd = (TDirectory*) gDirectory;
484 if( fSubDirectory ) fSubDirectory->cd();
485 //else fDirectory->cd();
487 if( !item ) continue;
488 TH1 * obj = static_cast<TH1*>(item);
490 //obj->Write( 0, TObject::kOverwrite );
492 if( owd != gDirectory ) owd->cd();
495 //_____________________________________________________
496 TString AliJTH1::GetString( ){
497 TString s = Form( "%s\t%s\t\"%s\"\t%s\t",
498 ClassName(), fName.Data(), fTitle.Data(), fOption.Data() );
499 for( int i=0;i<Dimension();i++ ){
500 if( int(fBins.size()) > i && fBins[i] != NULL ){
501 s+= " "+fBins[i]->GetName();
503 s+= TString(" ")+Form("%d", SizeOf(i));
508 //_____________________________________________________
509 void AliJTH1::FixBin(){
510 this->AliJArrayBase::FixBin();
513 AddToManager( AliJHistManager::CurrentManager() );
515 if(!fDirectory) fDirectory = fHMG->GetDirectory();
518 //_____________________________________________________
519 void AliJTH1::AddToManager(AliJHistManager *hmg){
520 if(fHMG) return; // TODO handle error
524 //_____________________________________________________
525 void AliJTH1::Print(){
526 std::cout<<"*"<<GetString()<<std::endl;
527 // TODO more details.
529 //_____________________________________________________
530 void AliJTH1::SetTemplate(TH1 *h){
531 if( fTemplate ) return; /// TDOO give error
532 fTemplate = (TH1*)h->Clone();
534 fTemplate->SetDirectory(0);
535 fName = h->GetName();
536 fTitle = h->GetTitle();
538 //_____________________________________________________
539 TString AliJTH1::BuildName(){
540 TString name = fName;
541 if( !HasOption("Single") )
542 for( int i=0;i<Dimension();i++ ){
543 name+=((int(fBins.size()) > i && fBins[i] != NULL)?fBins[i]->GetIndexName():"H")
544 +Form("%02d",Index(i));
548 //_____________________________________________________
549 TString AliJTH1::BuildTitle(){
550 TString title = fTitle;
551 for( int i=0;i<Dimension();i++ )
552 title+=((int(fBins.size()) > i && fBins[i] != NULL)?" "+fBins[i]->BuildTitle(i):"")
553 +Form("%02d",Index(i));
556 //_____________________________________________________
557 void * AliJTH1::BuildItem(){
558 TDirectory * owd = (TDirectory*) gDirectory;
560 TString name = BuildName();
562 if( !fSubDirectory ){
563 if( !HasOption("dir") ) {
564 fSubDirectory = fDirectory;
567 fSubDirectory = fDirectory->GetDirectory(fName);
568 if( !fSubDirectory && !IsLoadMode() ){
569 fSubDirectory = fDirectory->mkdir(fName);
574 //if( fSubDirectory ) JDEBUG(2, fSubDirectory->GetName() );
576 item = dynamic_cast<TH1*>(fSubDirectory->Get( name ));
578 void ** rawItem = fAlg->GetRawItem();
582 item = (TH1*)fSubDirectory->Get(BuildName());
586 item = dynamic_cast<TH1*>((static_cast<TH1*>(item))->Clone(name));
588 item->SetTitle( BuildTitle() );
589 item->SetDirectory(0);
590 *rawItem = (void*)item;
593 if( !item ){ JERROR("Any of "+fName+" doesn't exists. I need at least one");}
597 if(fNGenerated == 0 ) {
600 else titem =(TH1*) fTemplate->Clone();
601 titem->SetDirectory( fSubDirectory );
603 titem->SetName( BuildName() );
604 titem->SetTitle( BuildTitle() );
608 if( item ) fAlg->SetItem(item);
612 //_____________________________________________________
613 bool AliJTH1::IsLoadMode(){
614 return fHMG->IsLoadMode();
618 //////////////////////////////////////////////////////////////////////////
622 //////////////////////////////////////////////////////////////////////////
623 template< typename T>
624 AliJTH1Derived<T>::AliJTH1Derived():
625 AliJTH1(), fPlayer(this)
628 template< typename T>
629 AliJTH1Derived<T>::~AliJTH1Derived(){
635 //////////////////////////////////////////////////////////////////////////
637 // AliJHistManager //
639 // Array Base Class //
641 //////////////////////////////////////////////////////////////////////////
642 AliJHistManager::AliJHistManager(TString name):
643 AliJNamed(name,"","",0),
645 fDirectory(gDirectory),
656 //CurrentManager(this);
657 fDirectory = gDirectory;
660 //_____________________________________________________
661 AliJHistManager::AliJHistManager(const AliJHistManager& obj) :
662 AliJNamed(obj.fName,obj.fTitle,obj.fOption,obj.fMode),
663 fIsLoadMode(obj.fIsLoadMode),
664 fDirectory(obj.fDirectory),
665 fConfigStr(obj.fConfigStr),
668 fManager(obj.fManager),
669 fBinNames(obj.fBinNames),
670 fBinConfigs(obj.fBinConfigs),
671 fHistNames(obj.fHistNames),
672 fHistConfigs(obj.fHistConfigs)
674 // copy constructor TODO: proper handling of pointer data members
677 //_____________________________________________________
678 AliJHistManager& AliJHistManager::operator=(const AliJHistManager& obj)
680 // assignment operator
682 // TODO: proper implementation
687 AliJHistManager* AliJHistManager::GlobalManager(){
688 static AliJHistManager* singleton = new AliJHistManager("GlobalHistManager");
692 AliJHistManager* AliJHistManager::CurrentManager( AliJHistManager * hmg){
693 static AliJHistManager* currentManager = AliJHistManager::GlobalManager();
694 if( hmg ) currentManager = hmg;
695 return currentManager;
698 AliJBin* AliJHistManager::GetBuiltBin(TString s ){
699 for( int i=0;i<int(fBin.size());i++ )
700 if( fBin[i]->GetName() == s ) return fBin[i];
703 AliJBin* AliJHistManager::GetBin(TString s ){
704 AliJBin* h = GetBuiltBin(s);
706 for( int i=0;i<GetNBin();i++ )
707 if( fBinNames[i] == s ){
708 return new AliJBin( fBinConfigs[i],this );
712 AliJTH1 * AliJHistManager::GetBuiltTH1(TString s ){
713 for( int i=0;i<int(fHist.size());i++ )
714 if( fHist[i]->GetName() == s ) return fHist[i];
717 AliJTH1 * AliJHistManager::GetTH1(TString s ){
718 AliJTH1 * h = GetBuiltTH1(s);
720 for( int i=0;i<GetNHist();i++ )
721 if( fHistNames[i] == s ){
722 if( fHistConfigs[i].BeginsWith("AliJTH1D")) return new AliJTH1D( fHistConfigs[i], this );
723 if( fHistConfigs[i].BeginsWith("AliJTH2D")) return new AliJTH2D( fHistConfigs[i], this );
724 if( fHistConfigs[i].BeginsWith("AliJTProfile")) return new AliJTProfile( fHistConfigs[i], this );
728 void AliJHistManager::Add(AliJBin *o ){
730 if( GetBuiltBin( o->GetName() ) ) return; // TODO error handle
733 void AliJHistManager::Add(AliJTH1 *o ){
735 if( GetBuiltTH1( o->GetName() ) ) return; // TODO error handle
736 fHist.push_back( o );
738 void AliJHistManager::Print(){
740 cout<<fConfigStr<<endl;
743 cout<<"============ AliJHistManager : "<<fName<<" ==================="<<endl;
745 cout<<"---- AliJBin ----"<<endl;
746 for( int i=0;i<GetNBin();i++ ){
750 cout<<"---- AliJTH1 ----"<<endl;
751 for( int i=0;i<GetNHist();i++ ){
755 void AliJHistManager::Write(){
756 for( int i=0;i<GetNHist();i++ )
760 void AliJHistManager::WriteConfig(){
761 TDirectory *owd = gDirectory;
762 TDirectory * fHistConfigDir = gDirectory->mkdir("HistManager");
763 fHistConfigDir->cd();
764 TObjString * config = new TObjString(GetString().Data());
765 config->Write("Config");
769 int AliJHistManager::LoadConfig(){
771 TObjString *strobj = (TObjString*)fDirectory->Get("HistManager/Config");
772 if( !strobj ) return 0; //TODO
773 TString config = strobj->String();
775 vector<TString> lines = Tokenize(config, "\n");
776 cout<< Form("Read Config.%d objects found\n", (int)lines.size() );
777 for( UInt_t i=0;i < lines.size();i++ ){
778 TString line = lines.at(i);
779 std::vector<TString> t = Tokenize(line, " \t,");
780 if(line.BeginsWith("AliJBin")) {
781 fBinNames.push_back( t[1] );
782 fBinConfigs.push_back( line );
783 }else if( line.BeginsWith("AliJ")){
784 fHistNames.push_back( t[1] );
785 fHistConfigs.push_back( line );
792 //////////////////////////////////////////////////////
794 //////////////////////////////////////////////////////
795 vector<TString> Tokenize( TString s, TString d, int quote ){
796 //int nd = d.Length();
797 bool flagBeforeToken = 0;
800 vector<TString> toks;
802 for( int i=0;i<s.Length();i++ ){
803 if( quote == 1 && s[i] == '\"' ){ inQuote = ! inQuote; }
804 if( d.First(s[i]) != kNPOS && !inQuote ){
805 if( flagBeforeToken == 0 && tok.Length()>0){
819 TString Join( vector<TString>& ss , TString del){
820 if( ss.size() < 1 ) return "";
822 for( UInt_t i=1;i<ss.size();i++ ) s+=del+ss[i];
826 bool OutOf( int i, int x, int y ){ return ( i<x || i>y ); }
829 void testAliJArray(){
831 AliJHistManager * fHMG;
845 AliJTH1D fhTriggPtBin;
846 AliJTH1D fhTriggMult;
847 AliJTH1D fhIphiTrigg;
848 AliJTH1D fhIetaTrigg;
852 TFile * f = new TFile("test.root","RECREATE");
853 fHMG = AliJHistManager::GlobalManager();
854 fCentBin .Set("Cent", "C", "C %2.0f-%2.0f%%" ).SetBin( "0 100");
855 fVtxBin .Set("Vtx", "V", "Vtx %.0f-%.0f" ).SetBin("-10 10");
856 fPTtBin .Set("PTt", "T", "p_{Tt} %.1f-%.1f").SetBin("3 5 8 10 15 20");
857 fPTaBin .Set("PTa", "A", "p_{Tt} %.1f-%.1f").SetBin("3 5 8 10 15 20");
860 << TH1D( "hTriggMult", "", 100, -0.5, 99.5)
861 << fCentBin << fPTtBin << "END";
863 << TH1D( "fhIphiTrigg", "", 3, -0.1, 0.1 )
864 << fCentBin << fPTtBin << "END";
866 << TH1D( "hIetaTrigg", "", 80, -5, 5 )
867 << fCentBin << fPTtBin << "END";// inclusive eta
869 << TH1D( "hTriggPtBin", "", 10,0,10 )
870 << fCentBin << fVtxBin << fPTtBin << "END";
872 fhTriggMult[0][0]->Fill(1);