ROOT logo
/**************************************************************************
 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
 *                                                                        *
 * Author: The ALICE Off-line Project.                                    *
 * Contributors are mentioned in the code where appropriate.              *
 *                                                                        *
 * Permission to use, copy, modify and distribute this software and its   *
 * documentation strictly for non-commercial purposes is hereby granted   *
 * without fee, provided that the above copyright notice appears in all   *
 * copies and that both the copyright notice and this permission notice   *
 * appear in the supporting documentation. The authors make no claims     *
 * about the suitability of this software for any purpose. It is          *
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/

///////////////////////////////////////////////////////////////////////////////
//                                                                           //
//  Class for Parsing simple text configuration files                        //
//  It produces a TList for the TObjArrays with the name of the Key
//    the TObjArray contain the Values, split from kommas, as found in the   //
//  Configutation file.                                                      //
//                                                                           //
// The configuration file has a simple structure:                            //
// * Lines starting with a # or empty lines are ignored                      //
// * Key and Value are separated either by a <tab> or <space>es              //
//                                                                           //
//  Currently the class is used in the TPC DAs to allow an adjustment of     //
//  the most relevant parameters without recompiling the DAs                 //
///////////////////////////////////////////////////////////////////////////////


#include <fstream>
//Root includes
#include <TObjString.h>
#include <TObjArray.h>
#include <TString.h>
#include <TIterator.h>
#include <TList.h>
#include <TSystem.h>
//AliRoot includes

//header
#include "AliTPCConfigParser.h"

using std::ifstream;

AliTPCConfigParser::AliTPCConfigParser() :
TObject(),
fConfigMap(new TList),
fKeyIter(0),
fValIter(0)
{
 //
 // default constructor
 //
  fConfigMap->SetOwner();
} 
//_____________________________________________________________________
AliTPCConfigParser::AliTPCConfigParser(const AliTPCConfigParser &cfg) :
TObject(),
fConfigMap((TList*)cfg.fConfigMap->Clone()),
fKeyIter(0),
fValIter(0)
{
  //
  // copy constructor
  //
  fConfigMap->SetOwner();
}

//_____________________________________________________________________
AliTPCConfigParser::AliTPCConfigParser(const char* cfgfile) :
TObject(),
fConfigMap(new TList),
fKeyIter(0),
fValIter(0)
{
  //
  // default constructor using the config file name as input parameter
  //
  fConfigMap->SetOwner();
  if ( !cfgfile ) return;
  ParseConfigFileTxt(cfgfile);
}
//_____________________________________________________________________
AliTPCConfigParser& AliTPCConfigParser::operator = (const  AliTPCConfigParser &source)
{
  //
  // assignment operator
  //
  if (&source == this) return *this;
  new (this) AliTPCConfigParser(source);
  
  return *this;
}
//_____________________________________________________________________
AliTPCConfigParser::~AliTPCConfigParser()
{
 //
 // dtor
 //
  delete fConfigMap;
  delete fKeyIter;
  delete fValIter;
}
//_____________________________________________________________________
Int_t AliTPCConfigParser::ParseConfigFileTxt(const char* cfgfile)
{
 //
 // Function to parse a configuration file
 //
  ResetMap();
  ifstream file(gSystem->ExpandPathName(cfgfile));
  if ( !file.is_open() ){
    Error("ParseConfigFileTxt","File '%s' could not be opened!", cfgfile);
    return 1;
  }
  TString strFile;
  strFile.ReadFile(file);
  TObjArray *arr=strFile.Tokenize("\n");
  if ( !arr ) {
    file.close();
    return 2;
  }
  TIter nextLine(arr);
  while (TObject *l=nextLine()){
    TString line(((TObjString*)l)->GetString());
  //remove whitespcaces
    line.Remove(TString::kBoth,' ');
    line.Remove(TString::kBoth,'\t');
    if ( line.BeginsWith("#") || line=="" ) continue;
    line.ReplaceAll(", ",",");
    TObjArray *arrValues=line.Tokenize(" \t");
  //currently only name => Value is supported
  //and            name => 'nothing'
  //value may be a comma separated list, in which case a TObjArray
  //of the list will be created and stored as the value
    Int_t nentries=arrValues->GetEntries();
    if (nentries>2){
      Error("AliTPCConfigParser","ParseConfigFileTxt: Cannot parse line '%s'\n",line.Data());
      delete arrValues;
      continue;
    }
    TObjArray  *objArr=0x0;
    if (nentries==2){
      TObject *objVal=arrValues->At(1);
      const TString str=objVal->GetName();
      if (str.Contains(","))
        objArr=str.Tokenize(",");
      else{
        objArr=new TObjArray;
        objArr->Add(objVal->Clone());
      }
      objArr->SetOwner(kTRUE);
    } else {
      objArr=new TObjArray;
    }
    objArr->SetName(arrValues->At(0)->GetName());
    fConfigMap->AddLast(objArr);
    delete arrValues;
  }
  
  delete arr;
  return 0;
}
//_____________________________________________________________________
Float_t AliTPCConfigParser::GetValue(const char *key, UInt_t position)
{
  //
  //Get value for the speciefied key
  //
  TObject *val=((TObjArray*)fConfigMap->FindObject(key))->At(position);
  if ( !val ) return -999.;
  TString sval(((TObjString*)val)->GetString());
  return sval.Atof();
}
//_____________________________________________________________________
const char* AliTPCConfigParser::GetData(const char *key, UInt_t position)
{
  //
  //Get value for the speciefied key
  //
  TObjArray *arr=((TObjArray*)fConfigMap->FindObject(key));
  if (position>=(UInt_t)(arr->GetEntries())) return "";
  TObject *val=arr->At(position);
  if ( !val ) return "";
  return val->GetName();
}
//_____________________________________________________________________
Float_t AliTPCConfigParser::GetValue(const TObject *key, UInt_t position)
{
  //
  //Get value for the speciefied key
  //
  TObject *val=((TObjArray*)fConfigMap->FindObject(key))->At(position);
  if ( !val ) return -999.;
  TString sval(((TObjString*)val)->GetString());
  return sval.Atof();
}
//_____________________________________________________________________
const char* AliTPCConfigParser::GetData(const TObject *key, UInt_t position)
{
  //
  //Get value for the speciefied key
  //
  TObjArray *arr=((TObjArray*)fConfigMap->FindObject(key));
  if (position>=((UInt_t)arr->GetEntries())) return "";
  TObject *val=arr->At(position);
  if ( !val ) return "";
  return val->GetName();
}
//_____________________________________________________________________
Int_t AliTPCConfigParser::GetNumberOfValues(const char* key) const
{
  //
  // return the number of values for key
  //
  return ((TObjArray*)fConfigMap->FindObject(key))->GetEntries();
}
//_____________________________________________________________________
Int_t AliTPCConfigParser::GetNumberOfValues(TObject* key) const
{
  //
  // return the number of values for key
  //
  return ((TObjArray*)fConfigMap->FindObject(key))->GetEntries();
}
//_____________________________________________________________________
TObject* AliTPCConfigParser::NextKey(){
  if (!fKeyIter) fKeyIter=fConfigMap->MakeIterator();
  TObject *obj=fKeyIter->Next();
  if (!obj) {
    delete fKeyIter;
    fKeyIter=0;
  }
  return obj;
}
//_____________________________________________________________________
TObject* AliTPCConfigParser::NextValue(const char *key){
  return NextValueIter((TObjArray*)fConfigMap->FindObject(key));
}
//_____________________________________________________________________
TObject* AliTPCConfigParser::NextValue(TObject *key){
  return NextValueIter((TObjArray*)fConfigMap->FindObject(key));
}
//_____________________________________________________________________
TObject* AliTPCConfigParser::NextValueIter(TObjArray *key){
  if (!key) return 0;
  //check if the collection has changed
  if (fValIter && key!=fValIter->GetCollection()) {
    delete fValIter;
    fValIter=0x0;
  }
  if (!fValIter) fValIter=key->MakeIterator();
  TObject *value=fValIter->Next();
  if (!value) {
    delete fValIter;
    fValIter=0;
  }
  return value;
}
//_____________________________________________________________________
void AliTPCConfigParser::ResetMap()
{
  //
  // Reset the map with the configuration values
  //
  fConfigMap->Delete();
}
 AliTPCConfigParser.cxx:1
 AliTPCConfigParser.cxx:2
 AliTPCConfigParser.cxx:3
 AliTPCConfigParser.cxx:4
 AliTPCConfigParser.cxx:5
 AliTPCConfigParser.cxx:6
 AliTPCConfigParser.cxx:7
 AliTPCConfigParser.cxx:8
 AliTPCConfigParser.cxx:9
 AliTPCConfigParser.cxx:10
 AliTPCConfigParser.cxx:11
 AliTPCConfigParser.cxx:12
 AliTPCConfigParser.cxx:13
 AliTPCConfigParser.cxx:14
 AliTPCConfigParser.cxx:15
 AliTPCConfigParser.cxx:16
 AliTPCConfigParser.cxx:17
 AliTPCConfigParser.cxx:18
 AliTPCConfigParser.cxx:19
 AliTPCConfigParser.cxx:20
 AliTPCConfigParser.cxx:21
 AliTPCConfigParser.cxx:22
 AliTPCConfigParser.cxx:23
 AliTPCConfigParser.cxx:24
 AliTPCConfigParser.cxx:25
 AliTPCConfigParser.cxx:26
 AliTPCConfigParser.cxx:27
 AliTPCConfigParser.cxx:28
 AliTPCConfigParser.cxx:29
 AliTPCConfigParser.cxx:30
 AliTPCConfigParser.cxx:31
 AliTPCConfigParser.cxx:32
 AliTPCConfigParser.cxx:33
 AliTPCConfigParser.cxx:34
 AliTPCConfigParser.cxx:35
 AliTPCConfigParser.cxx:36
 AliTPCConfigParser.cxx:37
 AliTPCConfigParser.cxx:38
 AliTPCConfigParser.cxx:39
 AliTPCConfigParser.cxx:40
 AliTPCConfigParser.cxx:41
 AliTPCConfigParser.cxx:42
 AliTPCConfigParser.cxx:43
 AliTPCConfigParser.cxx:44
 AliTPCConfigParser.cxx:45
 AliTPCConfigParser.cxx:46
 AliTPCConfigParser.cxx:47
 AliTPCConfigParser.cxx:48
 AliTPCConfigParser.cxx:49
 AliTPCConfigParser.cxx:50
 AliTPCConfigParser.cxx:51
 AliTPCConfigParser.cxx:52
 AliTPCConfigParser.cxx:53
 AliTPCConfigParser.cxx:54
 AliTPCConfigParser.cxx:55
 AliTPCConfigParser.cxx:56
 AliTPCConfigParser.cxx:57
 AliTPCConfigParser.cxx:58
 AliTPCConfigParser.cxx:59
 AliTPCConfigParser.cxx:60
 AliTPCConfigParser.cxx:61
 AliTPCConfigParser.cxx:62
 AliTPCConfigParser.cxx:63
 AliTPCConfigParser.cxx:64
 AliTPCConfigParser.cxx:65
 AliTPCConfigParser.cxx:66
 AliTPCConfigParser.cxx:67
 AliTPCConfigParser.cxx:68
 AliTPCConfigParser.cxx:69
 AliTPCConfigParser.cxx:70
 AliTPCConfigParser.cxx:71
 AliTPCConfigParser.cxx:72
 AliTPCConfigParser.cxx:73
 AliTPCConfigParser.cxx:74
 AliTPCConfigParser.cxx:75
 AliTPCConfigParser.cxx:76
 AliTPCConfigParser.cxx:77
 AliTPCConfigParser.cxx:78
 AliTPCConfigParser.cxx:79
 AliTPCConfigParser.cxx:80
 AliTPCConfigParser.cxx:81
 AliTPCConfigParser.cxx:82
 AliTPCConfigParser.cxx:83
 AliTPCConfigParser.cxx:84
 AliTPCConfigParser.cxx:85
 AliTPCConfigParser.cxx:86
 AliTPCConfigParser.cxx:87
 AliTPCConfigParser.cxx:88
 AliTPCConfigParser.cxx:89
 AliTPCConfigParser.cxx:90
 AliTPCConfigParser.cxx:91
 AliTPCConfigParser.cxx:92
 AliTPCConfigParser.cxx:93
 AliTPCConfigParser.cxx:94
 AliTPCConfigParser.cxx:95
 AliTPCConfigParser.cxx:96
 AliTPCConfigParser.cxx:97
 AliTPCConfigParser.cxx:98
 AliTPCConfigParser.cxx:99
 AliTPCConfigParser.cxx:100
 AliTPCConfigParser.cxx:101
 AliTPCConfigParser.cxx:102
 AliTPCConfigParser.cxx:103
 AliTPCConfigParser.cxx:104
 AliTPCConfigParser.cxx:105
 AliTPCConfigParser.cxx:106
 AliTPCConfigParser.cxx:107
 AliTPCConfigParser.cxx:108
 AliTPCConfigParser.cxx:109
 AliTPCConfigParser.cxx:110
 AliTPCConfigParser.cxx:111
 AliTPCConfigParser.cxx:112
 AliTPCConfigParser.cxx:113
 AliTPCConfigParser.cxx:114
 AliTPCConfigParser.cxx:115
 AliTPCConfigParser.cxx:116
 AliTPCConfigParser.cxx:117
 AliTPCConfigParser.cxx:118
 AliTPCConfigParser.cxx:119
 AliTPCConfigParser.cxx:120
 AliTPCConfigParser.cxx:121
 AliTPCConfigParser.cxx:122
 AliTPCConfigParser.cxx:123
 AliTPCConfigParser.cxx:124
 AliTPCConfigParser.cxx:125
 AliTPCConfigParser.cxx:126
 AliTPCConfigParser.cxx:127
 AliTPCConfigParser.cxx:128
 AliTPCConfigParser.cxx:129
 AliTPCConfigParser.cxx:130
 AliTPCConfigParser.cxx:131
 AliTPCConfigParser.cxx:132
 AliTPCConfigParser.cxx:133
 AliTPCConfigParser.cxx:134
 AliTPCConfigParser.cxx:135
 AliTPCConfigParser.cxx:136
 AliTPCConfigParser.cxx:137
 AliTPCConfigParser.cxx:138
 AliTPCConfigParser.cxx:139
 AliTPCConfigParser.cxx:140
 AliTPCConfigParser.cxx:141
 AliTPCConfigParser.cxx:142
 AliTPCConfigParser.cxx:143
 AliTPCConfigParser.cxx:144
 AliTPCConfigParser.cxx:145
 AliTPCConfigParser.cxx:146
 AliTPCConfigParser.cxx:147
 AliTPCConfigParser.cxx:148
 AliTPCConfigParser.cxx:149
 AliTPCConfigParser.cxx:150
 AliTPCConfigParser.cxx:151
 AliTPCConfigParser.cxx:152
 AliTPCConfigParser.cxx:153
 AliTPCConfigParser.cxx:154
 AliTPCConfigParser.cxx:155
 AliTPCConfigParser.cxx:156
 AliTPCConfigParser.cxx:157
 AliTPCConfigParser.cxx:158
 AliTPCConfigParser.cxx:159
 AliTPCConfigParser.cxx:160
 AliTPCConfigParser.cxx:161
 AliTPCConfigParser.cxx:162
 AliTPCConfigParser.cxx:163
 AliTPCConfigParser.cxx:164
 AliTPCConfigParser.cxx:165
 AliTPCConfigParser.cxx:166
 AliTPCConfigParser.cxx:167
 AliTPCConfigParser.cxx:168
 AliTPCConfigParser.cxx:169
 AliTPCConfigParser.cxx:170
 AliTPCConfigParser.cxx:171
 AliTPCConfigParser.cxx:172
 AliTPCConfigParser.cxx:173
 AliTPCConfigParser.cxx:174
 AliTPCConfigParser.cxx:175
 AliTPCConfigParser.cxx:176
 AliTPCConfigParser.cxx:177
 AliTPCConfigParser.cxx:178
 AliTPCConfigParser.cxx:179
 AliTPCConfigParser.cxx:180
 AliTPCConfigParser.cxx:181
 AliTPCConfigParser.cxx:182
 AliTPCConfigParser.cxx:183
 AliTPCConfigParser.cxx:184
 AliTPCConfigParser.cxx:185
 AliTPCConfigParser.cxx:186
 AliTPCConfigParser.cxx:187
 AliTPCConfigParser.cxx:188
 AliTPCConfigParser.cxx:189
 AliTPCConfigParser.cxx:190
 AliTPCConfigParser.cxx:191
 AliTPCConfigParser.cxx:192
 AliTPCConfigParser.cxx:193
 AliTPCConfigParser.cxx:194
 AliTPCConfigParser.cxx:195
 AliTPCConfigParser.cxx:196
 AliTPCConfigParser.cxx:197
 AliTPCConfigParser.cxx:198
 AliTPCConfigParser.cxx:199
 AliTPCConfigParser.cxx:200
 AliTPCConfigParser.cxx:201
 AliTPCConfigParser.cxx:202
 AliTPCConfigParser.cxx:203
 AliTPCConfigParser.cxx:204
 AliTPCConfigParser.cxx:205
 AliTPCConfigParser.cxx:206
 AliTPCConfigParser.cxx:207
 AliTPCConfigParser.cxx:208
 AliTPCConfigParser.cxx:209
 AliTPCConfigParser.cxx:210
 AliTPCConfigParser.cxx:211
 AliTPCConfigParser.cxx:212
 AliTPCConfigParser.cxx:213
 AliTPCConfigParser.cxx:214
 AliTPCConfigParser.cxx:215
 AliTPCConfigParser.cxx:216
 AliTPCConfigParser.cxx:217
 AliTPCConfigParser.cxx:218
 AliTPCConfigParser.cxx:219
 AliTPCConfigParser.cxx:220
 AliTPCConfigParser.cxx:221
 AliTPCConfigParser.cxx:222
 AliTPCConfigParser.cxx:223
 AliTPCConfigParser.cxx:224
 AliTPCConfigParser.cxx:225
 AliTPCConfigParser.cxx:226
 AliTPCConfigParser.cxx:227
 AliTPCConfigParser.cxx:228
 AliTPCConfigParser.cxx:229
 AliTPCConfigParser.cxx:230
 AliTPCConfigParser.cxx:231
 AliTPCConfigParser.cxx:232
 AliTPCConfigParser.cxx:233
 AliTPCConfigParser.cxx:234
 AliTPCConfigParser.cxx:235
 AliTPCConfigParser.cxx:236
 AliTPCConfigParser.cxx:237
 AliTPCConfigParser.cxx:238
 AliTPCConfigParser.cxx:239
 AliTPCConfigParser.cxx:240
 AliTPCConfigParser.cxx:241
 AliTPCConfigParser.cxx:242
 AliTPCConfigParser.cxx:243
 AliTPCConfigParser.cxx:244
 AliTPCConfigParser.cxx:245
 AliTPCConfigParser.cxx:246
 AliTPCConfigParser.cxx:247
 AliTPCConfigParser.cxx:248
 AliTPCConfigParser.cxx:249
 AliTPCConfigParser.cxx:250
 AliTPCConfigParser.cxx:251
 AliTPCConfigParser.cxx:252
 AliTPCConfigParser.cxx:253
 AliTPCConfigParser.cxx:254
 AliTPCConfigParser.cxx:255
 AliTPCConfigParser.cxx:256
 AliTPCConfigParser.cxx:257
 AliTPCConfigParser.cxx:258
 AliTPCConfigParser.cxx:259
 AliTPCConfigParser.cxx:260
 AliTPCConfigParser.cxx:261
 AliTPCConfigParser.cxx:262
 AliTPCConfigParser.cxx:263
 AliTPCConfigParser.cxx:264
 AliTPCConfigParser.cxx:265
 AliTPCConfigParser.cxx:266
 AliTPCConfigParser.cxx:267
 AliTPCConfigParser.cxx:268
 AliTPCConfigParser.cxx:269