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(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 //_____________________________________________________
668 AliJHistManager::AliJHistManager(const AliJHistManager& obj) :
669 AliJNamed(obj.fName,obj.fTitle,obj.fOption,obj.fMode),
670 fIsLoadMode(obj.fIsLoadMode),
671 fDirectory(obj.fDirectory),
672 fConfigStr(obj.fConfigStr),
675 fManager(obj.fManager),
676 fBinNames(obj.fBinNames),
677 fBinConfigs(obj.fBinConfigs),
678 fHistNames(obj.fHistNames),
679 fHistConfigs(obj.fHistConfigs)
681 // copy constructor TODO: proper handling of pointer data members
684 //_____________________________________________________
685 AliJHistManager& AliJHistManager::operator=(const AliJHistManager& obj)
687 // assignment operator
689 // TODO: proper implementation
694 AliJHistManager* AliJHistManager::GlobalManager(){
695 static AliJHistManager* singleton = new AliJHistManager("GlobalHistManager");
699 AliJHistManager* AliJHistManager::CurrentManager( AliJHistManager * hmg){
700 static AliJHistManager* currentManager = NULL;//;AliJHistManager::GlobalManager();
701 if( hmg ) currentManager = hmg;
702 return currentManager;
705 AliJBin* AliJHistManager::GetBuiltBin(TString s ){
706 for( int i=0;i<int(fBin.size());i++ )
707 if( fBin[i]->GetName() == s ) return fBin[i];
710 AliJBin* AliJHistManager::GetBin(TString s ){
711 AliJBin* h = GetBuiltBin(s);
713 for( int i=0;i<GetNBin();i++ )
714 if( fBinNames[i] == s ){
715 return new AliJBin( fBinConfigs[i],this );
719 AliJTH1 * AliJHistManager::GetBuiltTH1(TString s ){
720 for( int i=0;i<int(fHist.size());i++ )
721 if( fHist[i]->GetName() == s ) return fHist[i];
724 AliJTH1 * AliJHistManager::GetTH1(TString s ){
725 AliJTH1 * h = GetBuiltTH1(s);
727 for( int i=0;i<GetNHist();i++ )
728 if( fHistNames[i] == s ){
729 if( fHistConfigs[i].BeginsWith("AliJTH1D")) return new AliJTH1D( fHistConfigs[i], this );
730 if( fHistConfigs[i].BeginsWith("AliJTH2D")) return new AliJTH2D( fHistConfigs[i], this );
731 if( fHistConfigs[i].BeginsWith("AliJTProfile")) return new AliJTProfile( fHistConfigs[i], this );
735 void AliJHistManager::Add(AliJBin *o ){
737 if( GetBuiltBin( o->GetName() ) ) return; // TODO error handle
740 void AliJHistManager::Add(AliJTH1 *o ){
742 if( GetBuiltTH1( o->GetName() ) ) return; // TODO error handle
743 fHist.push_back( o );
745 void AliJHistManager::Print(){
747 cout<<fConfigStr<<endl;
750 cout<<"============ AliJHistManager : "<<fName<<" ==================="<<endl;
752 cout<<"---- AliJBin ----"<<endl;
753 for( int i=0;i<GetNBin();i++ ){
757 cout<<"---- AliJTH1 ----"<<endl;
758 for( int i=0;i<GetNHist();i++ ){
762 void AliJHistManager::Write(){
763 for( int i=0;i<GetNHist();i++ )
767 void AliJHistManager::WriteConfig(){
768 TDirectory *owd = gDirectory;
769 TDirectory * fHistConfigDir = fDirectory->mkdir("HistManager");
770 fHistConfigDir->cd();
771 TObjString * config = new TObjString(GetString().Data());
772 config->Write("Config");
776 int AliJHistManager::LoadConfig(){
778 TObjString *strobj = (TObjString*)fDirectory->Get("HistManager/Config");
779 if( !strobj ) return 0; //TODO
780 TString config = strobj->String();
782 vector<TString> lines = Tokenize(config, "\n");
783 cout<< Form("Read Config.%d objects found\n", (int)lines.size() );
784 for( UInt_t i=0;i < lines.size();i++ ){
785 TString line = lines.at(i);
786 std::vector<TString> t = Tokenize(line, " \t,");
787 if(line.BeginsWith("AliJBin")) {
788 fBinNames.push_back( t[1] );
789 fBinConfigs.push_back( line );
790 }else if( line.BeginsWith("AliJ")){
791 fHistNames.push_back( t[1] );
792 fHistConfigs.push_back( line );
799 //////////////////////////////////////////////////////
801 //////////////////////////////////////////////////////
802 vector<TString> Tokenize( TString s, TString d, int quote ){
803 //int nd = d.Length();
804 bool flagBeforeToken = 0;
807 vector<TString> toks;
809 for( int i=0;i<s.Length();i++ ){
810 if( quote == 1 && s[i] == '\"' ){ inQuote = ! inQuote; }
811 if( d.First(s[i]) != kNPOS && !inQuote ){
812 if( flagBeforeToken == 0 && tok.Length()>0){
826 TString Join( vector<TString>& ss , TString del){
827 if( ss.size() < 1 ) return "";
829 for( UInt_t i=1;i<ss.size();i++ ) s+=del+ss[i];
833 bool OutOf( int i, int x, int y ){ return ( i<x || i>y ); }
836 void testAliJArray(){
838 AliJHistManager * fHMG;
852 AliJTH1D fhTriggPtBin;
853 AliJTH1D fhTriggMult;
854 AliJTH1D fhIphiTrigg;
855 AliJTH1D fhIetaTrigg;
859 TFile * f = new TFile("test.root","RECREATE");
860 fHMG = AliJHistManager::GlobalManager();
861 fCentBin .Set("Cent", "C", "C %2.0f-%2.0f%%" ).SetBin( "0 100");
862 fVtxBin .Set("Vtx", "V", "Vtx %.0f-%.0f" ).SetBin("-10 10");
863 fPTtBin .Set("PTt", "T", "p_{Tt} %.1f-%.1f").SetBin("3 5 8 10 15 20");
864 fPTaBin .Set("PTa", "A", "p_{Tt} %.1f-%.1f").SetBin("3 5 8 10 15 20");
867 << TH1D( "hTriggMult", "", 100, -0.5, 99.5)
868 << fCentBin << fPTtBin << "END";
870 << TH1D( "fhIphiTrigg", "", 3, -0.1, 0.1 )
871 << fCentBin << fPTtBin << "END";
873 << TH1D( "hIetaTrigg", "", 80, -5, 5 )
874 << fCentBin << fPTtBin << "END";// inclusive eta
876 << TH1D( "hTriggPtBin", "", 10,0,10 )
877 << fCentBin << fVtxBin << fPTtBin << "END";
879 fhTriggMult[0][0]->Fill(1);