#include "AliJHistManager.h" using namespace std; ////////////////////////////////////////////////////// // AliJBin ////////////////////////////////////////////////////// AliJNamed::AliJNamed(TString name, TString title, TString opt, int mode) : fName(name), fTitle(title), fOption(opt), fMode(mode) { // constructor } AliJNamed::~AliJNamed(){ // virtual destructor for base class } TString AliJNamed::GetOption(TString key){ TPMERegexp a("&"+key+"=?([^&]*)","i"); int nMatch = a.Match(fOption); if( nMatch < 2 ) return UndefinedOption(); return a[1]; } void AliJNamed::SetOption( TString key, TString value){ TPMERegexp a("&"+key+"=?[^&]*","i"); int nMatch = a.Match(fOption); TString newOpt = "&"+key +( value.Length()?"="+value:""); if( value == UndefinedOption() ) newOpt = ""; if( nMatch < 1 ) fOption += newOpt; else fOption.ReplaceAll( a[0], newOpt ); } void AliJNamed::RemoveOption( TString key ){ SetOption( key, UndefinedOption() ); } TString AliJNamed::UndefinedOption(){ //static TString undefinedOption = "Undefined"; //return undefinedOption; return "Undefined"; } ////////////////////////////////////////////////////// // AliJBin ////////////////////////////////////////////////////// //_____________________________________________________ AliJBin::AliJBin(): AliJNamed("AliJBin","%.2f-%2.f", "&Mode=Range", kRange), fBinD(0), fBinStr(0), fIsFixedBin(false), fIndexName("H"), fHMG(NULL) {;} //_____________________________________________________ AliJBin::AliJBin(TString config, AliJHistManager * hmg): AliJNamed("AliJBin","%.2f-%2.f", "&Mode=Range", kRange), fBinD(0), fBinStr(0), fIsFixedBin(false), fIndexName("H"), fHMG(NULL) { cout<< config< t = Tokenize(config, " \t,"); TString type = t[0]; SetName( t[1] ); fIndexName = t[2] ; SetTitle( t[3] ); fTitle.ReplaceAll("\"","" ); SetFullOption( t[4] ); fMode = GetMode( GetOption("mode") ); AddToManager( hmg ); TString s; for( int i=5;iAdd(this); } //_____________________________________________________ AliJBin & AliJBin::Set( TString name, TString iname, TString title, int mode){ SetNameTitle( name, title ); fIndexName = iname; fMode = mode; SetOption("mode",GetModeString(mode)); return *this; } //_____________________________________________________ TString AliJBin::GetModeString(int i){ static TString mode[] = { "Single","Range","String" }; if( i<0 || i>2 ) return ""; return mode[i]; } int AliJBin::GetMode( TString mode ){ for( int i=0;iGetNrows();i++ ) AddBin( (v->GetMatrixArray())[i] );FixBin(); return *this; } //_____________________________________________________ AliJBin& AliJBin::SetBin(const TString v){ std::vector ar = Tokenize( v, "\t ,"); for( UInt_t i=0; i Size() ) return ""; if( fMode == kSingle ) return TString(Form(fTitle.Data(), fBinD[i] )); if( fMode == kRange ) return TString(Form(fTitle.Data(), fBinD[i], fBinD[i+1])); if( fMode == kString ) return TString( Form(fTitle.Data(), fBinStr[i].Data()) ); JERROR( TString("Bad Mode of AliJBin type ") + char(fMode) + " in " + fName+ "!!!" ); return ""; } //_____________________________________________________ TString AliJBin::GetString(){ SetOption( "mode",GetModeString(fMode) ); return "AliJBin\t"+fName+"\t"+fIndexName+"\t\""+fTitle+"\""+"\t"+fOption+"\t"+Join(fBinStr," "); } //_____________________________________________________ void AliJBin::Print(){ std::cout<<"*"+GetString()<GetItem(); if( !item ){ BuildItem() ; item = fAlg->GetItem(); } return item; } //_____________________________________________________ void* AliJArrayBase::GetSingleItem(){ if(fMode == kSingle )return GetItem(); JERROR("This is not single array"); return NULL; } //_____________________________________________________ void AliJArrayBase::FixBin(){ if( Dimension() == 0 ){ AddDim(1);SetOption("Single"); fMode = kSingle; if( HasOption("dir","default")) RemoveOption("dir"); } ClearIndex(); fAlg = new AliJArrayAlgorithmSimple(this); fArraySize = fAlg->BuildArray(); } //_____________________________________________________ int AliJArrayBase::Index(int d){ if( OutOfDim(d) ) JERROR("Wrong Dim"); return fIndex[d]; } void AliJArrayBase::SetIndex(int i, int d ){ if( OutOfSize( i, d ) ) JERROR( "Wrong Index" ); fIndex[d] = i; } void AliJArrayBase::InitIterator(){ fAlg->InitIterator(); } bool AliJArrayBase::Next(void *& item){ return fAlg->Next(item); } ////////////////////////////////////////////////////// // AliJArrayAlgorithm ////////////////////////////////////////////////////// //_____________________________________________________ AliJArrayAlgorithm::AliJArrayAlgorithm(AliJArrayBase * cmd): fCMD(cmd) { // constructor } //_____________________________________________________ AliJArrayAlgorithm::~AliJArrayAlgorithm(){ // destructor } //_____________________________________________________ AliJArrayAlgorithm::AliJArrayAlgorithm(const AliJArrayAlgorithm& obj) : fCMD(obj.fCMD) { // copy constructor TODO: proper handling of pointer data members } //_____________________________________________________ AliJArrayAlgorithm& AliJArrayAlgorithm::operator=(const AliJArrayAlgorithm& obj) { // assignment operator if(this != &obj){ *fCMD = *(obj.fCMD); } return *this; } ////////////////////////////////////////////////////// // AliJArrayAlgorithmSimple ////////////////////////////////////////////////////// //_____________________________________________________ AliJArrayAlgorithmSimple::AliJArrayAlgorithmSimple(AliJArrayBase * cmd): AliJArrayAlgorithm(cmd), fDimFactor(0), fArray(NULL), fPos(0) { // constructor } //_____________________________________________________ AliJArrayAlgorithmSimple::~AliJArrayAlgorithmSimple(){ // Dimension, GetEntries, SizeOf if( fArray ) delete [] (void**)fArray; } //_____________________________________________________ AliJArrayAlgorithmSimple::AliJArrayAlgorithmSimple(const AliJArrayAlgorithmSimple& obj) : AliJArrayAlgorithm(obj.fCMD), fDimFactor(obj.fDimFactor), fArray(obj.fArray), fPos(obj.fPos) { // copy constructor TODO: proper handling of pointer data members } //_____________________________________________________ AliJArrayAlgorithmSimple& AliJArrayAlgorithmSimple::operator=(const AliJArrayAlgorithmSimple& obj) { // assignment operator TODO: proper implementation if(this != &obj){ *fCMD = *(obj.fCMD); } return *this; } //_____________________________________________________ int AliJArrayAlgorithmSimple::BuildArray(){ fDimFactor.resize( Dimension(), 1 ); for( int i=Dimension()-2; i>=0; i-- ){ fDimFactor[i] = fDimFactor[i+1] * SizeOf(i+1); } // TODO split to BuildArray and lazyArray in GetItem int arraySize = fDimFactor[0] * SizeOf(0); fArray = new void*[arraySize]; for( int i=0;iSetIndex( n1 , i ); n-=n1*fDimFactor[i]; } } void * AliJArrayAlgorithmSimple::GetItem(){ return fArray[GlobalIndex()]; } void AliJArrayAlgorithmSimple::SetItem(void * item){ fArray[GlobalIndex()] = item; } ////////////////////////////////////////////////////// // AliJTH1 ////////////////////////////////////////////////////// //_____________________________________________________ AliJTH1::AliJTH1(): fDirectory(NULL), fSubDirectory(NULL), fHMG(NULL), fTemplate(NULL), fBins(0) { // default constructor fName="AliJTH1"; } //_____________________________________________________ AliJTH1::AliJTH1(TString config, AliJHistManager * hmg): fDirectory(NULL), fSubDirectory(NULL), fHMG(NULL), fTemplate(NULL), fBins(0) { // constructor std::vector t = Tokenize(config, " \t,"); TString type = t[0]; SetName( t[1] ); SetTitle( t[2] ); fTitle.ReplaceAll("\"",""); SetFullOption( t[3] ); fMode = HasOption("mode","Single")?kSingle:kNormal; AddToManager( hmg ); TString s; for( int i=4;iAliJArrayBase::AddDim( bin->Size() ); fBins.resize( ndim, NULL ); fBins[ndim-1] = bin; return ndim; } int AliJTH1::AddDim(TString v) { if( v == "END" ) { FixBin(); } else{ std::vector o= Tokenize(v, "\t ,"); for( UInt_t i=0;iGetBin(s); if( b ) this->AddDim(b); else {JERROR("Wrong terminator of Array : \"" + s+"\" in " + fName ); } } } return Dimension(); } //_____________________________________________________ Int_t AliJTH1::Write(){ TDirectory *owd = (TDirectory*) gDirectory; InitIterator(); void * item; if( fSubDirectory ) fSubDirectory->cd(); //else fDirectory->cd(); while( Next(item) ){ if( !item ) continue; TH1 * obj = static_cast(item); obj->Write( ); //obj->Write( 0, TObject::kOverwrite ); } if( owd != gDirectory ) owd->cd(); return 0; } //_____________________________________________________ TString AliJTH1::GetString( ){ TString s = Form( "%s\t%s\t\"%s\"\t%s\t", ClassName(), fName.Data(), fTitle.Data(), fOption.Data() ); for( int i=0;i i && fBins[i] != NULL ){ s+= " "+fBins[i]->GetName(); }else{ s+= TString(" ")+Form("%d", SizeOf(i)); } } return s; } //_____________________________________________________ void AliJTH1::FixBin(){ this->AliJArrayBase::FixBin(); if(!fHMG) { AddToManager( AliJHistManager::CurrentManager() ); } if(!fDirectory) fDirectory = fHMG->GetDirectory(); } //_____________________________________________________ void AliJTH1::AddToManager(AliJHistManager *hmg){ if(fHMG) return; // TODO handle error fHMG = hmg; hmg->Add(this); } //_____________________________________________________ void AliJTH1::Print(){ std::cout<<"*"<Clone(); fTemplate->Sumw2(); fTemplate->SetDirectory(0); fName = h->GetName(); fTitle = h->GetTitle(); } //_____________________________________________________ TString AliJTH1::BuildName(){ TString name = fName; if( !HasOption("Single") ) for( int i=0;i i && fBins[i] != NULL)?fBins[i]->GetIndexName():"H") +Form("%02d",Index(i)); } return name; } //_____________________________________________________ TString AliJTH1::BuildTitle(){ TString title = fTitle; for( int i=0;i i && fBins[i] != NULL)?" "+fBins[i]->BuildTitle(i):"") +Form("%02d",Index(i)); return title; } //_____________________________________________________ void * AliJTH1::BuildItem(){ TDirectory * owd = (TDirectory*) gDirectory; gROOT->cd(); TString name = BuildName(); TH1 * item = NULL; if( !fSubDirectory ){ if( !HasOption("dir") ) { fSubDirectory = fDirectory; } else { fSubDirectory = fDirectory->GetDirectory(fName); if( !fSubDirectory && !IsLoadMode() ){ fSubDirectory = fDirectory->mkdir(fName); } } } if( IsLoadMode() ){ //if( fSubDirectory ) JDEBUG(2, fSubDirectory->GetName() ); if( fSubDirectory ) item = dynamic_cast(fSubDirectory->Get( name )); if( !item ){ void ** rawItem = fAlg->GetRawItem(); InitIterator(); void * tmp; while( Next(tmp) ){ item = (TH1*)fSubDirectory->Get(BuildName()); if(item ) break; } if( item ) { item = dynamic_cast((static_cast(item))->Clone(name)); item->Reset(); item->SetTitle( BuildTitle() ); item->SetDirectory(0); *rawItem = (void*)item; } } if( !item ){ JERROR("Any of "+fName+" doesn't exists. I need at least one");} } else{ // Gen Mode TH1 * titem = NULL; if(fNGenerated == 0 ) { titem = fTemplate; } else titem =(TH1*) fTemplate->Clone(); titem->SetDirectory( fSubDirectory ); titem->Reset(); titem->SetName( BuildName() ); titem->SetTitle( BuildTitle() ); fNGenerated++; item=titem; } if( item ) fAlg->SetItem(item); owd->cd(); return (void*)item; } //_____________________________________________________ bool AliJTH1::IsLoadMode(){ return fHMG->IsLoadMode(); } ////////////////////////////////////////////////////////////////////////// // // // AliJTH1Derived // // // ////////////////////////////////////////////////////////////////////////// template< typename T> AliJTH1Derived::AliJTH1Derived(): AliJTH1(), fPlayer(this) { } template< typename T> AliJTH1Derived::~AliJTH1Derived(){ } ////////////////////////////////////////////////////////////////////////// // // // AliJHistManager // // // // Array Base Class // // // ////////////////////////////////////////////////////////////////////////// AliJHistManager::AliJHistManager(TString name): AliJNamed(name,"","",0), fIsLoadMode(false), fDirectory(gDirectory), fConfigStr(), fBin(0), fHist(0), fManager(0), fBinNames(0), fBinConfigs(0), fHistNames(0), fHistConfigs(0) { // constructor fDirectory = gDirectory; this->cd(); } //_____________________________________________________ AliJHistManager::AliJHistManager(const AliJHistManager& obj) : AliJNamed(obj.fName,obj.fTitle,obj.fOption,obj.fMode), fIsLoadMode(obj.fIsLoadMode), fDirectory(obj.fDirectory), fConfigStr(obj.fConfigStr), fBin(obj.fBin), fHist(obj.fHist), fManager(obj.fManager), fBinNames(obj.fBinNames), fBinConfigs(obj.fBinConfigs), fHistNames(obj.fHistNames), fHistConfigs(obj.fHistConfigs) { // copy constructor TODO: proper handling of pointer data members } //_____________________________________________________ AliJHistManager& AliJHistManager::operator=(const AliJHistManager& obj) { // assignment operator if(this != &obj){ // TODO: proper implementation } return *this; } AliJHistManager* AliJHistManager::GlobalManager(){ static AliJHistManager* singleton = new AliJHistManager("GlobalHistManager"); return singleton; } AliJHistManager* AliJHistManager::CurrentManager( AliJHistManager * hmg){ static AliJHistManager* currentManager = NULL;//;AliJHistManager::GlobalManager(); if( hmg ) currentManager = hmg; return currentManager; } AliJBin* AliJHistManager::GetBuiltBin(TString s ){ for( int i=0;iGetName() == s ) return fBin[i]; return NULL; } AliJBin* AliJHistManager::GetBin(TString s ){ AliJBin* h = GetBuiltBin(s); if(h) return h; for( int i=0;iGetName() == s ) return fHist[i]; return NULL; } AliJTH1 * AliJHistManager::GetTH1(TString s ){ AliJTH1 * h = GetBuiltTH1(s); if( h ) return h; for( int i=0;iGetName() ) ) return; // TODO error handle fBin.push_back( o ); } void AliJHistManager::Add(AliJTH1 *o ){ if( !o ) return; if( GetBuiltTH1( o->GetName() ) ) return; // TODO error handle fHist.push_back( o ); } void AliJHistManager::Print(){ if( IsLoadMode() ) { cout<Print(); } cout<Print(); } } void AliJHistManager::Write(){ for( int i=0;iWrite(); } void AliJHistManager::WriteConfig(){ TDirectory *owd = gDirectory; TDirectory * fHistConfigDir = fDirectory->mkdir("HistManager"); fHistConfigDir->cd(); TObjString * config = new TObjString(GetString().Data()); config->Write("Config"); owd->cd(); } int AliJHistManager::LoadConfig(){ SetLoadMode(true); TObjString *strobj = (TObjString*)fDirectory->Get("HistManager/Config"); if( !strobj ) return 0; //TODO TString config = strobj->String(); fConfigStr = config; vector lines = Tokenize(config, "\n"); cout<< Form("Read Config.%d objects found\n", (int)lines.size() ); for( UInt_t i=0;i < lines.size();i++ ){ TString line = lines.at(i); std::vector t = Tokenize(line, " \t,"); if(line.BeginsWith("AliJBin")) { fBinNames.push_back( t[1] ); fBinConfigs.push_back( line ); }else if( line.BeginsWith("AliJ")){ fHistNames.push_back( t[1] ); fHistConfigs.push_back( line ); } } return 1; } ////////////////////////////////////////////////////// // Utils ////////////////////////////////////////////////////// vector Tokenize( TString s, TString d, int quote ){ //int nd = d.Length(); bool flagBeforeToken = 0; bool inQuote = 0; TString tok=""; vector toks; s += d[0]; for( int i=0;i0){ toks.push_back(tok); tok.Clear(); flagBeforeToken = 1; } }else{ tok+=s[i]; flagBeforeToken = 0; } } return toks; } TString Join( vector& ss , TString del){ if( ss.size() < 1 ) return ""; TString s = ss[0]; for( UInt_t i=1;iy ); } #include void testAliJArray(){ cout<<"START"<Fill(1); fHMG->Print(); f->Write(); fHMG->Write(); fHMG->WriteConfig(); }