#include <TPRegexp.h>
#include "AliJConst.h"
#include "AliJBaseCard.h"
AliJBaseCard::AliJBaseCard() :
fnentry(0),
fKeyWordVector(0),
fValuesVector(0),
fValueString(0),
fKeyTable(0)
{
}
AliJBaseCard::AliJBaseCard(const char *filename) :
fnentry(0),
fKeyWordVector(0),
fValuesVector(0),
fValueString(0),
fKeyTable(0)
{
strcpy(fcardname, filename);
if( strlen( filename ) > 0 ){
ReadInputCard();
}
}
AliJBaseCard& AliJBaseCard::operator=(const AliJBaseCard& obj){
JUNUSED(obj);
return *this;
}
AliJBaseCard::~AliJBaseCard(){
}
unsigned int AliJBaseCard::GetTVectorIndex(TString keyword, int tol){
UInt_t i;
Int_t ind;
i = 0;
ind = -1;
TNamed * ko = (TNamed*)fKeyTable.FindObject( keyword.Data() );
if(ko) ind = ko->GetUniqueID();
if( ind == -1 ){
for( UInt_t ii=0;ii<fKeyWordVector.size();ii++ ){
if( fKeyWordVector[ii] == keyword ) return i;
}
if( tol == 0 ){
cout << "ERROR: \""<<keyword.Data()<<"\" must be defined "<< endl;
exit(1);
}else if ( tol == 1 ){
cout << "Warning: \""<<keyword.Data()<<"\" is not exist. return default value "<< endl;
return -1;
}else{
return -1;
}
}
return ind;
}
int AliJBaseCard::GetN(TString keyword){
unsigned int findex = GetTVectorIndex(keyword);
return (int) fValuesVector[findex].GetNrows();
}
TVector * AliJBaseCard::GetVector(TString keyword ){
int findex = GetTVectorIndex(keyword);
return &fValuesVector[findex];
}
float AliJBaseCard::Get(TString keyword, int VectorComponent){
int findex = GetTVectorIndex(keyword);
if(0<=VectorComponent && VectorComponent<GetNwithIndex(findex)){
return fValuesVector[findex](VectorComponent+1);
}else{
cout<<"ERROR: fValuesVector findex out of range "<<keyword.Data()<<endl;
cout << " Max findex: " << GetN(keyword) - 1<< " Asked: " << VectorComponent << endl;
exit(1);
}
}
TString AliJBaseCard::GetStr(TString keyword ){
int findex = GetTVectorIndex(keyword, 1);
if( findex < 0 ) return TString("");
return fValueString[findex];
}
void AliJBaseCard::InitCard(){
}
void AliJBaseCard::FinishCard(){
}
void AliJBaseCard::ReadInputCard(){
char buffer[kMaxDimBuffer];
ifstream incard;
cout << "Reading fcard from file: " << fcardname << endl;
incard.open(fcardname,ios::in);
if(!incard){
cout<<"ERROR: Config file <"<<fcardname<<"> not found!"<<endl;
exit(1);
}
InitCard();
while(!incard.eof()){
incard.getline(buffer,kMaxDimBuffer);
if(fnentry > 1000){
cout<<"Maximum number of 1000 lines reached in AliJBaseCard.C"<<endl;
exit(1);
}
ReadInputLine( buffer );
fnentry++;
}
FinishCard();
return;
}
void AliJBaseCard::ReadLine( const char * buffer ){
TString tstr(buffer);
TPMERegexp rsp(";");
TPMERegexp csp1("=");
TPMERegexp csp2(",");
int nrow = rsp.Split( tstr );
for( int i=0;i<nrow;i++ ){
TString row = rsp[i];
int nst = csp1.Split(row);
if( nst!=2 ) continue;
TString key = csp1[0];
TString val = csp1[1];
int nc = csp2.Split( val );
vector< float > items;
for(int j=0; j<nc; j++){
TString token = csp2[j];
if(token.IsFloat()){
items.push_back(token.Atof());
}else{
items.push_back(0);
}
}
int index = GetTVectorIndex( key, 2 );
if( index > -1 ){
fValuesVector[index].ResizeTo( 1, items.size()) ;
for( unsigned int ii=0;ii< items.size(); ii ++ ){
fValuesVector[index][ii+1] = items[ii];
}
fValueString[index] = val;
}else{
fKeyWordVector.push_back( key.Data() );
fValuesVector.push_back( TVector( 1, items.size(), &items[0]) );
fValueString.push_back( val );
AddToKeyTable( key, fValuesVector.size()-1 );
}
}
}
void AliJBaseCard::ReadInputLine( const char *buffer ){
TString tstr(buffer);
if( tstr.BeginsWith("#") ) return;
tstr.ReplaceAll("\t"," ");
Ssiz_t startOFcomment = tstr.First('#');
if(startOFcomment>0){
tstr.Remove(startOFcomment,tstr.Length() - startOFcomment);
}
if(tstr.BeginsWith(" ")){
Ssiz_t startOFkeyword = 0;
while(1){
TString s = tstr[startOFkeyword];
if(s.CompareTo(" ")) break;
startOFkeyword++;
}
tstr.Replace(0,startOFkeyword,"",0);
}
TObjArray *lineContents = tstr.Tokenize(" ");
if(lineContents->GetEntriesFast() < 1) return;
TString entryname = ((TObjString*)(lineContents->At(0)))->String();
if(lineContents->GetEntriesFast() == 1){
cout<<"WARNING: single keyword "<<entryname.Data()<<" on line"<<endl;
}else{
vector< float > items;
for(int i=1; i<lineContents->GetEntriesFast(); i++){
TString token = ((TObjString*)(lineContents->At(i)))->String();
if(token.IsFloat()){
items.push_back(token.Atof());
}else{
items.push_back(0);
}
}
fKeyWordVector.push_back( entryname.Data() );
fValuesVector.push_back( TVector( 1, items.size(), &items[0]) );
fValueString.push_back( ((TObjString*)(lineContents->At(1)))->String() );
AddToKeyTable( entryname, fValuesVector.size()-1 );
}
lineContents->~TObjArray();
}
void AliJBaseCard::PrintOut(){
cout<<endl<<"======== "<<fcardname<<" ========="<<endl;
for(unsigned int i=0; i<fValuesVector.size();i++){
cout<<Form("%15s",fKeyWordVector[i].Data());
cout<<" (dim ="<<fValuesVector[i].GetNrows()<<") ";
for(int j=1; j<=fValuesVector[i].GetNrows(); j++){
cout<<fValuesVector[i][j]<<" ";
}
cout<<endl;
}
}
void AliJBaseCard::WriteCard(TDirectory *file){
cout<<endl<<"====== Writing into file ========="<<endl;
if(!file->GetDirectory("JCard")) {
file->mkdir("JCard");
}
file->cd("JCard");
for(unsigned int i=0;i<fValuesVector.size();i++){
fValuesVector[i].Write(fKeyWordVector[i]);
}
}