1 #include "AliJHistManager.h"
4 //////////////////////////////////////////////////////
6 //////////////////////////////////////////////////////
8 AliJNamed::AliJNamed(TString name, TString title, TString opt, int mode) :
17 AliJNamed::~AliJNamed(){
18 // virtual destructor for base class
21 TString AliJNamed::GetOption(TString key){
22 TPMERegexp a("&"+key+"=?([^&]*)","i");
23 int nMatch = a.Match(fOption);
24 if( nMatch < 2 ) return UndefinedOption();
27 void AliJNamed::SetOption( TString key, TString value){
28 TPMERegexp a("&"+key+"=?[^&]*","i");
29 int nMatch = a.Match(fOption);
30 TString newOpt = "&"+key +( value.Length()?"="+value:"");
31 if( value == UndefinedOption() ) newOpt = "";
32 if( nMatch < 1 ) fOption += newOpt;
33 else fOption.ReplaceAll( a[0], newOpt );
35 void AliJNamed::RemoveOption( TString key ){
36 SetOption( key, UndefinedOption() );
38 TString AliJNamed::UndefinedOption(){
39 //static TString undefinedOption = "Undefined";
40 //return undefinedOption;
44 //////////////////////////////////////////////////////
46 //////////////////////////////////////////////////////
48 //_____________________________________________________
50 AliJNamed("AliJBin","%.2f-%2.f", "&Mode=Range", kRange),
57 //_____________________________________________________
58 AliJBin::AliJBin(TString config, AliJHistManager * hmg):
59 AliJNamed("AliJBin","%.2f-%2.f", "&Mode=Range", kRange),
67 std::vector<TString> t = Tokenize(config, " \t,");
72 fTitle.ReplaceAll("\"","" );
73 SetFullOption( t[4] );
74 fMode = GetMode( GetOption("mode") );
77 for( int i=5;i<int(t.size());i++ ) s+=" "+t[i];
81 //_____________________________________________________
82 AliJBin::AliJBin(const AliJBin& obj) :
83 AliJNamed(obj.fName,obj.fTitle,obj.fOption,obj.fMode),
86 fIsFixedBin(obj.fIsFixedBin),
87 fIndexName(obj.fIndexName),
90 // copy constructor TODO: proper handling of pointer data members
93 //_____________________________________________________
94 AliJBin& AliJBin::operator=(const AliJBin& obj)
96 // assignment operator
98 // TODO: proper implementation
103 //_____________________________________________________
104 void AliJBin::FixBin(){
105 if(fIsFixedBin ) return;
107 if(!fHMG) AddToManager( AliJHistManager::CurrentManager());
110 //_____________________________________________________
111 void AliJBin::AddToManager( AliJHistManager* hmg ){
114 //_____________________________________________________
115 AliJBin & AliJBin::Set( TString name, TString iname, TString title, int mode){
116 SetNameTitle( name, title );
119 SetOption("mode",GetModeString(mode));
122 //_____________________________________________________
123 TString AliJBin::GetModeString(int i){
124 static TString mode[] = { "Single","Range","String" };
125 if( i<0 || i>2 ) return "";
128 int AliJBin::GetMode( TString mode ){
129 for( int i=0;i<kNMode;i++ ) if( mode == GetModeString(i) ) return i;
132 //_____________________________________________________
133 AliJBin & AliJBin::SetBin( const int n, const float * v ){
134 for( int i=0;i<n;i++ ) AddBin( v[i] );FixBin();
137 //_____________________________________________________
138 AliJBin & AliJBin::SetBin( const int n, const double * v ){
139 for( int i=0;i<n;i++ ) AddBin( v[i] );FixBin();
142 AliJBin & AliJBin::SetBin( TVector *v ){
143 for( int i=0;i<v->GetNrows();i++ ) AddBin( (v->GetMatrixArray())[i] );FixBin();
146 //_____________________________________________________
147 AliJBin& AliJBin::SetBin(const TString v){
148 std::vector<TString> ar = Tokenize( v, "\t ,");
149 for( UInt_t i=0; i<ar.size();i++ ) AddBin( ar[i] );FixBin();
153 //_____________________________________________________
154 AliJBin& AliJBin::SetBin(const int n){
155 for( UInt_t i=0; i<UInt_t(n);i++ ) AddBin( i );FixBin();
158 //_____________________________________________________
159 void AliJBin::AddBin( const TString& v ){
160 if( fIsFixedBin ) { JERROR( "You can't Add Bini "+GetName()); }
161 fBinStr.push_back( (v=="_")?"":v );
162 fBinD.push_back( v.Atof() );
164 //_____________________________________________________
165 void AliJBin::AddBin( float v ){
166 if( fIsFixedBin ) { JERROR( "You can't Add Bin "+GetName()); }
167 fBinD.push_back( v );
168 fBinStr.push_back(Form("%f",v));
170 //_____________________________________________________
171 TString AliJBin::BuildTitle( int i ){
172 if( i < 0 || i > Size() ) return "";
173 if( fMode == kSingle )
174 return TString(Form(fTitle.Data(), fBinD[i] ));
175 if( fMode == kRange )
176 return TString(Form(fTitle.Data(), fBinD[i], fBinD[i+1]));
177 if( fMode == kString )
178 return TString( Form(fTitle.Data(), fBinStr[i].Data()) );
179 JERROR( TString("Bad Mode of AliJBin type ") + char(fMode) + " in " + fName+ "!!!" );
182 //_____________________________________________________
183 TString AliJBin::GetString(){
184 SetOption( "mode",GetModeString(fMode) );
185 return "AliJBin\t"+fName+"\t"+fIndexName+"\t\""+fTitle+"\""+"\t"+fOption+"\t"+Join(fBinStr," ");
188 //_____________________________________________________
189 void AliJBin::Print(){
190 std::cout<<"*"+GetString()<<std::endl;
193 int AliJBin::GetBin(double x){
194 int i = TMath::BinarySearch( fBinD.size(), &fBinD[0], x );
195 if( fMode == kRange && i+1 >= int(fBinD.size()) ) return -1;
199 //////////////////////////////////////////////////////
201 //////////////////////////////////////////////////////
203 //_____________________________________________________
204 AliJArrayBase::AliJArrayBase():
205 AliJNamed("AliJArayBase","","&Dir=default&Lazy",0),
206 //AliJNamed("AliJArayBase","","&Dir=default&LessLazy",0),
217 //_____________________________________________________
218 AliJArrayBase::~AliJArrayBase(){
220 if(fAlg) delete fAlg;
223 //_____________________________________________________
224 AliJArrayBase::AliJArrayBase(const AliJArrayBase& obj) :
225 AliJNamed(obj.fName,obj.fTitle,obj.fOption,obj.fMode),
228 fArraySize(obj.fArraySize),
229 fNGenerated(obj.fNGenerated),
230 fIsBinFixed(obj.fIsBinFixed),
231 fIsBinLocked(obj.fIsBinLocked),
234 // copy constructor TODO: proper handling of pointer data members
237 //_____________________________________________________
238 AliJArrayBase& AliJArrayBase::operator=(const AliJArrayBase& obj)
240 // assignment operator
242 // TODO: proper implementation
247 //_____________________________________________________
248 void* AliJArrayBase::GetItem(){
249 void * item = fAlg->GetItem();
252 item = fAlg->GetItem();
256 //_____________________________________________________
257 void* AliJArrayBase::GetSingleItem(){
258 if(fMode == kSingle )return GetItem();
259 JERROR("This is not single array");
262 //_____________________________________________________
263 void AliJArrayBase::FixBin(){
264 if( Dimension() == 0 ){
265 AddDim(1);SetOption("Single");
267 if( HasOption("dir","default")) RemoveOption("dir");
270 fAlg = new AliJArrayAlgorithmSimple(this);
271 fArraySize = fAlg->BuildArray();
273 //_____________________________________________________
274 int AliJArrayBase::Index(int d){
275 if( OutOfDim(d) ) JERROR("Wrong Dim");
278 void AliJArrayBase::SetIndex(int i, int d ){
279 if( OutOfSize( i, d ) ) JERROR( "Wrong Index" );
283 void AliJArrayBase::InitIterator(){ fAlg->InitIterator(); }
284 bool AliJArrayBase::Next(void *& item){ return fAlg->Next(item); }
287 //////////////////////////////////////////////////////
288 // AliJArrayAlgorithm
289 //////////////////////////////////////////////////////
291 //_____________________________________________________
292 AliJArrayAlgorithm::AliJArrayAlgorithm(AliJArrayBase * cmd):
297 //_____________________________________________________
298 AliJArrayAlgorithm::~AliJArrayAlgorithm(){
302 //_____________________________________________________
303 AliJArrayAlgorithm::AliJArrayAlgorithm(const AliJArrayAlgorithm& obj) :
306 // copy constructor TODO: proper handling of pointer data members
309 //_____________________________________________________
310 AliJArrayAlgorithm& AliJArrayAlgorithm::operator=(const AliJArrayAlgorithm& obj)
312 // assignment operator
319 //////////////////////////////////////////////////////
320 // AliJArrayAlgorithmSimple
321 //////////////////////////////////////////////////////
323 //_____________________________________________________
324 AliJArrayAlgorithmSimple::AliJArrayAlgorithmSimple(AliJArrayBase * cmd):
325 AliJArrayAlgorithm(cmd),
332 //_____________________________________________________
333 AliJArrayAlgorithmSimple::~AliJArrayAlgorithmSimple(){
334 // Dimension, GetEntries, SizeOf
335 if( fArray ) delete [] (void**)fArray;
338 //_____________________________________________________
339 AliJArrayAlgorithmSimple::AliJArrayAlgorithmSimple(const AliJArrayAlgorithmSimple& obj) :
340 AliJArrayAlgorithm(obj.fCMD),
341 fDimFactor(obj.fDimFactor),
345 // copy constructor TODO: proper handling of pointer data members
348 //_____________________________________________________
349 AliJArrayAlgorithmSimple& AliJArrayAlgorithmSimple::operator=(const AliJArrayAlgorithmSimple& obj)
351 // assignment operator TODO: proper implementation
357 //_____________________________________________________
358 int AliJArrayAlgorithmSimple::BuildArray(){
359 fDimFactor.resize( Dimension(), 1 );
360 for( int i=Dimension()-2; i>=0; i-- ){
361 fDimFactor[i] = fDimFactor[i+1] * SizeOf(i+1);
362 } // TODO split to BuildArray and lazyArray in GetItem
363 int arraySize = fDimFactor[0] * SizeOf(0);
364 fArray = new void*[arraySize];
365 for( int i=0;i<arraySize;i++ ) fArray[i] = NULL;
368 //_____________________________________________________
369 int AliJArrayAlgorithmSimple::GlobalIndex(){
371 for( int i=0;i<Dimension();i++ ) // Index is checked by fCMD
372 iG+= Index(i)*fDimFactor[i];
377 void AliJArrayAlgorithmSimple::ReverseIndex( int iG ){
379 for( int i=0;i<Dimension();i++ ){
380 int n1 = int(n/fDimFactor[i]);
381 fCMD->SetIndex( n1 , i );
385 void * AliJArrayAlgorithmSimple::GetItem(){
386 return fArray[GlobalIndex()];
389 void AliJArrayAlgorithmSimple::SetItem(void * item){
390 fArray[GlobalIndex()] = item;
394 //////////////////////////////////////////////////////
396 //////////////////////////////////////////////////////
397 //_____________________________________________________
405 // default constructor
409 //_____________________________________________________
410 AliJTH1::AliJTH1(TString config, AliJHistManager * hmg):
418 std::vector<TString> t = Tokenize(config, " \t,");
422 fTitle.ReplaceAll("\"","");
423 SetFullOption( t[3] );
424 fMode = HasOption("mode","Single")?kSingle:kNormal;
427 for( int i=4;i<int(t.size());i++ ) s+=" "+t[i];
431 //_____________________________________________________
434 if( fNGenerated == 0 && fTemplate ) delete fTemplate;
437 //_____________________________________________________
438 AliJTH1::AliJTH1(const AliJTH1& obj) :
440 fDirectory(obj.fDirectory),
441 fSubDirectory(obj.fSubDirectory),
443 fTemplate(obj.fTemplate),
446 // copy constructor TODO: proper handling of pointer data members
449 //_____________________________________________________
450 AliJTH1& AliJTH1::operator=(const AliJTH1& obj)
452 // assignment operator
454 // TODO: proper implementation
459 //_____________________________________________________
460 int AliJTH1::AddDim( AliJBin * bin){
461 int ndim = this->AliJArrayBase::AddDim( bin->Size() );
462 fBins.resize( ndim, NULL );
467 int AliJTH1::AddDim(TString v) {
468 if( v == "END" ) { FixBin(); }
470 std::vector<TString> o= Tokenize(v, "\t ,");
471 for( UInt_t i=0;i<o.size();i++ ){
473 if(s.Length() == 0 ) continue;
474 if( s.IsFloat() ) { // TODO IsInt? IsDigit?
479 if( fHMG ) b = fHMG->GetBin(s);
480 if( b ) this->AddDim(b);
481 else {JERROR("Wrong terminator of Array : \"" + s+"\" in " + fName ); }
486 //_____________________________________________________
487 Int_t AliJTH1::Write(){
488 TDirectory *owd = (TDirectory*) gDirectory;
491 if( fSubDirectory ) fSubDirectory->cd();
492 //else fDirectory->cd();
494 if( !item ) continue;
495 TH1 * obj = static_cast<TH1*>(item);
497 //obj->Write( 0, TObject::kOverwrite );
499 if( owd != gDirectory ) owd->cd();
502 //_____________________________________________________
503 TString AliJTH1::GetString( ){
504 TString s = Form( "%s\t%s\t\"%s\"\t%s\t",
505 ClassName(), fName.Data(), fTitle.Data(), fOption.Data() );
506 for( int i=0;i<Dimension();i++ ){
507 if( int(fBins.size()) > i && fBins[i] != NULL ){
508 s+= " "+fBins[i]->GetName();
510 s+= TString(" ")+Form("%d", SizeOf(i));
515 //_____________________________________________________
516 void AliJTH1::FixBin(){
517 this->AliJArrayBase::FixBin();
520 AddToManager( AliJHistManager::CurrentManager() );
522 if(!fDirectory) fDirectory = fHMG->GetDirectory();
525 //_____________________________________________________
526 void AliJTH1::AddToManager(AliJHistManager *hmg){
527 if(fHMG) return; // TODO handle error
531 //_____________________________________________________
532 void AliJTH1::Print(){
533 std::cout<<"*"<<GetString()<<std::endl;
534 // TODO more details.
536 //_____________________________________________________
537 void AliJTH1::SetTemplate(TH1 *h){
538 if( fTemplate ) return; /// TDOO give error
539 fTemplate = (TH1*)h->Clone();
541 fTemplate->SetDirectory(0);
542 fName = h->GetName();
543 fTitle = h->GetTitle();
545 //_____________________________________________________
546 TString AliJTH1::BuildName(){
547 TString name = fName;
548 if( !HasOption("Single") )
549 for( int i=0;i<Dimension();i++ ){
550 name+=((int(fBins.size()) > i && fBins[i] != NULL)?fBins[i]->GetIndexName():"H")
551 +Form("%02d",Index(i));
555 //_____________________________________________________
556 TString AliJTH1::BuildTitle(){
557 TString title = fTitle;
558 for( int i=0;i<Dimension();i++ )
559 title+=((int(fBins.size()) > i && fBins[i] != NULL)?" "+fBins[i]->BuildTitle(Index(i)):"")
560 +Form("%02d",Index(i));
563 //_____________________________________________________
564 void * AliJTH1::BuildItem(){
565 TDirectory * owd = (TDirectory*) gDirectory;
567 TString name = BuildName();
569 if( !fSubDirectory ){
570 if( !HasOption("dir") ) {
571 fSubDirectory = fDirectory;
574 fSubDirectory = fDirectory->GetDirectory(fName);
575 if( !fSubDirectory && !IsLoadMode() ){
576 fSubDirectory = fDirectory->mkdir(fName);
581 //if( fSubDirectory ) JDEBUG(2, fSubDirectory->GetName() );
583 item = dynamic_cast<TH1*>(fSubDirectory->Get( name ));
585 void ** rawItem = fAlg->GetRawItem();
589 item = (TH1*)fSubDirectory->Get(BuildName());
593 item = dynamic_cast<TH1*>((static_cast<TH1*>(item))->Clone(name));
595 item->SetTitle( BuildTitle() );
596 item->SetDirectory(0);
597 *rawItem = (void*)item;
600 if( !item ){ JERROR("Any of "+fName+" doesn't exists. I need at least one");}
604 if(fNGenerated == 0 ) {
607 else titem =(TH1*) fTemplate->Clone();
608 titem->SetDirectory( fSubDirectory );
610 titem->SetName( BuildName() );
611 titem->SetTitle( BuildTitle() );
615 if( item ) fAlg->SetItem(item);
619 //_____________________________________________________
620 bool AliJTH1::IsLoadMode(){
621 return fHMG->IsLoadMode();
625 //////////////////////////////////////////////////////////////////////////
629 //////////////////////////////////////////////////////////////////////////
630 template< typename T>
631 AliJTH1Derived<T>::AliJTH1Derived():
632 AliJTH1(), fPlayer(this)
635 template< typename T>
636 AliJTH1Derived<T>::~AliJTH1Derived(){
642 //////////////////////////////////////////////////////////////////////////
644 // AliJHistManager //
646 // Array Base Class //
648 //////////////////////////////////////////////////////////////////////////
649 AliJHistManager::AliJHistManager(TString name):
650 AliJNamed(name,"","",0),
652 fDirectory(gDirectory),
663 fDirectory = gDirectory;
667 AliJHistManager::AliJHistManager(TString name, TString dirname):
668 AliJNamed(name,"","",0),
670 fDirectory(gDirectory),
681 if( dirname.Length() > 0 ) {
682 fDirectory = (TDirectory*)gDirectory->Get(dirname);
684 fDirectory = gDirectory->mkdir( dirname );
688 fDirectory = gDirectory;
693 //_____________________________________________________
694 AliJHistManager::AliJHistManager(const AliJHistManager& obj) :
695 AliJNamed(obj.fName,obj.fTitle,obj.fOption,obj.fMode),
696 fIsLoadMode(obj.fIsLoadMode),
697 fDirectory(obj.fDirectory),
698 fConfigStr(obj.fConfigStr),
701 fManager(obj.fManager),
702 fBinNames(obj.fBinNames),
703 fBinConfigs(obj.fBinConfigs),
704 fHistNames(obj.fHistNames),
705 fHistConfigs(obj.fHistConfigs)
707 // copy constructor TODO: proper handling of pointer data members
710 //_____________________________________________________
711 AliJHistManager& AliJHistManager::operator=(const AliJHistManager& obj)
713 // assignment operator
715 // TODO: proper implementation
720 AliJHistManager* AliJHistManager::GlobalManager(){
721 static AliJHistManager* singleton = new AliJHistManager("GlobalHistManager");
725 AliJHistManager* AliJHistManager::CurrentManager( AliJHistManager * hmg){
726 static AliJHistManager* currentManager = NULL;//;AliJHistManager::GlobalManager();
727 if( hmg ) currentManager = hmg;
728 return currentManager;
731 AliJBin* AliJHistManager::GetBuiltBin(TString s ){
732 for( int i=0;i<int(fBin.size());i++ )
733 if( fBin[i]->GetName() == s ) return fBin[i];
736 AliJBin* AliJHistManager::GetBin(TString s ){
737 AliJBin* h = GetBuiltBin(s);
739 for( int i=0;i<GetNBin();i++ )
740 if( fBinNames[i] == s ){
741 return new AliJBin( fBinConfigs[i],this );
745 AliJTH1 * AliJHistManager::GetBuiltTH1(TString s ){
746 for( int i=0;i<int(fHist.size());i++ )
747 if( fHist[i]->GetName() == s ) return fHist[i];
750 AliJTH1 * AliJHistManager::GetTH1(TString s ){
751 AliJTH1 * h = GetBuiltTH1(s);
753 for( int i=0;i<GetNHist();i++ )
754 if( fHistNames[i] == s ){
755 if( fHistConfigs[i].BeginsWith("AliJTH1D")) return new AliJTH1D( fHistConfigs[i], this );
756 if( fHistConfigs[i].BeginsWith("AliJTH2D")) return new AliJTH2D( fHistConfigs[i], this );
757 if( fHistConfigs[i].BeginsWith("AliJTProfile")) return new AliJTProfile( fHistConfigs[i], this );
761 void AliJHistManager::Add(AliJBin *o ){
763 if( GetBuiltBin( o->GetName() ) ) return; // TODO error handle
766 void AliJHistManager::Add(AliJTH1 *o ){
768 if( GetBuiltTH1( o->GetName() ) ) return; // TODO error handle
769 fHist.push_back( o );
771 void AliJHistManager::Print(){
773 cout<<fConfigStr<<endl;
776 cout<<"============ AliJHistManager : "<<fName<<" ==================="<<endl;
778 cout<<"---- AliJBin ----"<<endl;
779 for( int i=0;i<GetNBin();i++ ){
783 cout<<"---- AliJTH1 ----"<<endl;
784 for( int i=0;i<GetNHist();i++ ){
788 void AliJHistManager::Write(){
789 for( int i=0;i<GetNHist();i++ )
793 void AliJHistManager::WriteConfig(){
794 TDirectory *owd = gDirectory;
795 cout<<"DEBUG_T1: "<<gDirectory<<endl;
797 TDirectory * fHistConfigDir = fDirectory->mkdir("HistManager");
798 fHistConfigDir->cd();
799 TObjString * config = new TObjString(GetString().Data());
800 config->Write("Config");
804 int AliJHistManager::LoadConfig(){
806 TObjString *strobj = (TObjString*)fDirectory->Get("HistManager/Config");
807 if( !strobj ) return 0; //TODO
808 TString config = strobj->String();
810 vector<TString> lines = Tokenize(config, "\n");
811 cout<< Form("Read Config.%d objects found\n", (int)lines.size() );
812 for( UInt_t i=0;i < lines.size();i++ ){
813 TString line = lines.at(i);
814 std::vector<TString> t = Tokenize(line, " \t,");
815 if(line.BeginsWith("AliJBin")) {
816 fBinNames.push_back( t[1] );
817 fBinConfigs.push_back( line );
818 }else if( line.BeginsWith("AliJ")){
819 fHistNames.push_back( t[1] );
820 fHistConfigs.push_back( line );
827 //////////////////////////////////////////////////////
829 //////////////////////////////////////////////////////
830 vector<TString> Tokenize( TString s, TString d, int quote ){
831 //int nd = d.Length();
832 bool flagBeforeToken = 0;
835 vector<TString> toks;
837 for( int i=0;i<s.Length();i++ ){
838 if( quote == 1 && s[i] == '\"' ){ inQuote = ! inQuote; }
839 if( d.First(s[i]) != kNPOS && !inQuote ){
840 if( flagBeforeToken == 0 && tok.Length()>0){
854 TString Join( vector<TString>& ss , TString del){
855 if( ss.size() < 1 ) return "";
857 for( UInt_t i=1;i<ss.size();i++ ) s+=del+ss[i];
861 bool OutOf( int i, int x, int y ){ return ( i<x || i>y ); }
864 void testAliJArray(){
866 AliJHistManager * fHMG;
880 AliJTH1D fhTriggPtBin;
881 AliJTH1D fhTriggMult;
882 AliJTH1D fhIphiTrigg;
883 AliJTH1D fhIetaTrigg;
887 TFile * f = new TFile("test.root","RECREATE");
888 fHMG = AliJHistManager::GlobalManager();
889 fCentBin .Set("Cent", "C", "C %2.0f-%2.0f%%" ).SetBin( "0 100");
890 fVtxBin .Set("Vtx", "V", "Vtx %.0f-%.0f" ).SetBin("-10 10");
891 fPTtBin .Set("PTt", "T", "p_{Tt} %.1f-%.1f").SetBin("3 5 8 10 15 20");
892 fPTaBin .Set("PTa", "A", "p_{Tt} %.1f-%.1f").SetBin("3 5 8 10 15 20");
895 << TH1D( "hTriggMult", "", 100, -0.5, 99.5)
896 << fCentBin << fPTtBin << "END";
898 << TH1D( "fhIphiTrigg", "", 3, -0.1, 0.1 )
899 << fCentBin << fPTtBin << "END";
901 << TH1D( "hIetaTrigg", "", 80, -5, 5 )
902 << fCentBin << fPTtBin << "END";// inclusive eta
904 << TH1D( "hTriggPtBin", "", 10,0,10 )
905 << fCentBin << fVtxBin << fPTtBin << "END";
907 fhTriggMult[0][0]->Fill(1);