ROOT logo
//*-- AUTHOR : Ilse Koenig
//*-- modified : 06/12/2009 by Ilse Koenig

//_HADES_CLASS_DESCRIPTION 
/////////////////////////////////////////////////////////////
//
// HSpecParAsciiFileIo
//
// Class for parameter input/output from/into Ascii file for
// the spectrometer (not related to a special detector)
//
/////////////////////////////////////////////////////////////

#include "hspecparasciifileio.h"
#include "hgeomvolume.h"
#include "hgeomshapes.h"
#include "hspecgeompar.h"
#include "htrblookup.h"
#include "htrbnetaddressmapping.h"
#include "htrb2correction.h"
#include "hslowpar.h"

ClassImp(HSpecParAsciiFileIo)

HSpecParAsciiFileIo::HSpecParAsciiFileIo(fstream* f) : HDetParAsciiFileIo(f) {
  // constructor calls the base class constructor
  fName="HSpecParIo";
}


Bool_t HSpecParAsciiFileIo::init(HParSet* pPar,Int_t* set) {
  // calls the appropriate read function of the container
  const  Text_t* name=pPar->GetName();
  if (pFile) {
    if (strcmp(name,"SpecGeomPar")==0)
      return read((HSpecGeomPar*)pPar,set);
    if (strcmp(name,"TrbLookup")==0)
      return readFile((HTrbLookup*)pPar);
    if (strcmp(name,"TrbnetAddressMapping")==0)
      return read((HTrbnetAddressMapping*)pPar);
    if (strcmp(name,"SlowPar")==0)
      return readFile((HSlowPar*)pPar);
  }
  cerr<<"initialization of "<<name<<" not possible from file!"<<endl;
  return kFALSE;
}

Int_t HSpecParAsciiFileIo::write(HParSet* pPar) {
  // calls the appropriate write function of the container
  const  Text_t* name=pPar->GetName();
  if (pFile) {
    if (strcmp(name,"SpecGeomPar")==0)
      return writeGeom((HSpecGeomPar*)pPar);
    if (strcmp(name,"TrbLookup")==0)
      return writeFile((HTrbLookup*)pPar);
    if (strcmp(name,"TrbnetAddressMapping")==0)
      return writeFile((HTrbnetAddressMapping*)pPar);
    if (strcmp(name,"SlowPar")==0)
      return writeFile((HSlowPar*)pPar);
  }
  cerr<<name<<" could not be written to Ascii file"<<endl;
  return kFALSE;
}


Bool_t HSpecParAsciiFileIo::read(HSpecGeomPar* pPar,Int_t* set) {
  // Reads the geometry parameter container SpecGeomPar from ASCII file
  if (!pFile) return kFALSE;
  TString key[3]={"GeomParCave","GeomParSectors","GeomParTargets"};
  Int_t n1=0;
  if (!pPar->isFirstInitialization()) n1=2;
  Bool_t allFound=kTRUE;
  const Int_t maxbuf=1550;
  Text_t buf[maxbuf];
  HGeomVolume volu;
  HGeomTransform transform;
  HGeomShapes* shapes=pPar->getShapes();
  for(Int_t i=n1;i<3;i++) {
    pFile->clear();
    pFile->seekg(0,ios::beg);
    Int_t k=0;
    Bool_t all=kFALSE;
    while (!all && !pFile->eof()) {
      pFile->getline(buf,maxbuf);
      if( (buf[0]=='[')) {
        if (strstr(buf,(const Char_t*)key[i])!=0) {
          while (!all && !pFile->eof()) {
            pFile->getline(buf,maxbuf);
            if (buf[0]=='#') all=kTRUE;   
            else {
              if (buf[0]=='/') continue;
              if (strstr(buf,":")) readComment(buf,pPar);
              else {
                if (readVolume(&volu,shapes,buf)==kFALSE) return kFALSE;
                if (set[i]) {
                  switch(i) {
	            case 0: { pPar->addCave(&volu); break; }
	            case 1: { pPar->addSector(&volu); break; }
	            case 2: { pPar->addTarget(&volu); break; }
                  }
                  k++;
                } 
              }
	    }
          }
        }
      }
    }
    if (k) set[i]=0;
    else allFound=kFALSE;
  }
  if (allFound) {
    pPar->setInputVersion(1,inputNumber);
    pPar->setChanged();
    pPar->setNotFirstInit();
    printf("%s initialized from Ascii file\n",pPar->GetName());
  }
  return allFound;  
}


Int_t HSpecParAsciiFileIo::writeGeom(HSpecGeomPar* pPar) {
  // Writes the geometry parameter container SpecGeomPar to the ASCII file
  if (pFile) {
    Text_t buf[1000];
    Text_t com1[]=
        "#########################################################\n"
        "# Parameters describing the geometry of the cave,\n"
        "# the sector(s) and the target(s)\n"
        "#\n"
        "#   [GeomParCave] parameters of the cave:\n"
        "#      name of volume   shape\n";
    Text_t com2[]=
        "#   [GeomParSectors] parameters of the sectors:\n"
        "#      name of volume   shape   name of mother\n";
    Text_t com3[]=
        "#   [GeomParTargets] parameters of the targets:\n"
        "#      name of volume   shape   name of mother\n";
    Text_t com4[]=
        "#      x, y and z components of points \n"
        "#      rotation matrix\n"
        "#      translation vector\n"
        "#\n";
    Text_t com5[]=
        "#########################################################\n";
    sprintf(buf,"%s%s%s",
         com1,com4,com5);
    pFile->write(buf,strlen(buf));
    sprintf(buf,"[GeomParCave]\n");
    pFile->write(buf,strlen(buf));
    writeComment(pPar);
    HGeomShapes* shapes=pPar->getShapes();
    HGeomVolume* volu=pPar->getCave();
    if (volu) writeVolume(volu,shapes);
    sprintf(buf,"%s%s%s%s[GeomParSectors]\n",com5,com2,com4,com5);
    pFile->write(buf,strlen(buf));
    for(Int_t i=0;i<pPar->getNumSectors();i++) {
      volu=pPar->getSector(i);
      if (volu) writeVolume(volu,shapes);
    }
    sprintf(buf,"%s%s%s%s[GeomParTargets]\n",com5,com3,com4,com5);
    pFile->write(buf,strlen(buf));
    for(Int_t i=0;i<pPar->getNumTargets();i++) {
      volu=pPar->getTarget(i);
      if (volu) writeVolume(volu,shapes);
    }
    pFile->write(com5,strlen(com5));
    pPar->setChanged(kFALSE);
    return 1;
  }
  cerr<<"Output is not writable"<<endl;
  return -1;
}

Bool_t HSpecParAsciiFileIo::read(HTrbnetAddressMapping* pPar) {
  if (!findContainer(pPar->GetName())) return kFALSE;
  pPar->clear();
  const Int_t maxbuf=155;
  Text_t buf[maxbuf], key[80], tempSensor[80];
  Bool_t rc=kTRUE;
  const Char_t delim[]=" ";
  HTrb2Correction* pTrb=0;
  Int_t nData=0, nChan=0, nChannels=0;
  Float_t* corrData=0;
  while (!pFile->eof()&&rc) {
    pFile->getline(buf, maxbuf);
    if (buf[0]=='#') break;
    if (buf[0]!='/' && buf[0]!='\0') {
      rc=pPar->readline(buf);
    }
  }
  if (rc&&findContainer("Trb2Corrections")) {
    while (!pFile->eof()&&rc) {
      pFile->getline(buf, maxbuf);
      if (buf[0]=='#') break;
      if (buf[0]!='/' && buf[0]!='\0') {
        if (strstr(buf,"temperatureSensor")) {
          sscanf(buf,"%s%s",key,tempSensor);
          pTrb=pPar->getBoard(tempSensor);
          if (pTrb) {
            corrData=pTrb->makeArray();
            if (corrData) {
              nData=pTrb->getSize();
              nChannels=pTrb->getNChannels();
              nChan=0;
              Int_t l=0;
              do {
                pFile->getline(buf,maxbuf);
                if (strstr(buf,"temperatureSensor")) break;
		if (strstr(buf,"channel")) {
                  nChan++;
                } else {
                  Char_t* ss=strtok(buf,delim);
                  while (ss!=0 && l<nData) {
                    sscanf(ss,"%f",&corrData[l]);
                    l++;
                    ss=strtok(NULL,delim);
                  }
                }
	      } while (l<nData && buf[0]!='#' && buf[0]!='/' && !pFile->eof());
              if (l<nData||nChan<nChannels) {
                Warning("read(HTrbnetAddressMapping*)",
                      "Only %i data for temperatureSensor %s",l,tempSensor);
              }
            } else {
              rc=kFALSE;
            }
          } else {
            Warning("read(HTrbnetAddressMapping*)",
                  "Board for temperatureSensor %s not found",tempSensor);
          }
        }
      }
    }
  }
  if (rc) {
    pPar->setInputVersion(1,inputNumber);
    pPar->setChanged();
    printf("%s initialized from Ascii file\n",pPar->GetName());
  }
  return rc;
}


template<class T> Bool_t HSpecParAsciiFileIo::readFile(T* pPar) {
  // template function for parameter containers
  // searches the container in the file, reads the data line by line and
  // called the member function readline(...) of the container class
  if (!findContainer(pPar->GetName())) return kFALSE;
  pPar->clear();
  const Int_t maxbuf=400;
  Text_t buf[maxbuf];
  Bool_t rc=kTRUE;
  while (!pFile->eof()&&rc) {
    pFile->getline(buf, maxbuf);
    if (buf[0]=='#') break;
    if (buf[0]!='/' && buf[0]!='\0') rc=pPar->readline(buf);
  }
  if (rc) {
    pPar->setInputVersion(1,inputNumber);
    pPar->setChanged();
    printf("%s initialized from Ascii file\n",pPar->GetName());
  }
  return rc;
}

template<class T> Int_t HSpecParAsciiFileIo::writeFile(T* pPar) {
  // template function for parameter containers 
  // calls the function putAsciiHeader(TString&) of the parameter container,
  // writes the header and calls the function write(fstream&) of the class
  if (pFile) {
    pPar->putAsciiHeader(fHeader);
    writeHeader(pPar->GetName(),pPar->getParamContext());
    pPar->write(*pFile);
    pFile->write(sepLine,strlen(sepLine));
    pPar->setChanged(kFALSE);
    return 1;
  }
  Error("writeFile(T*)","Output is not writable");
  return -1;
}
 hspecparasciifileio.cc:1
 hspecparasciifileio.cc:2
 hspecparasciifileio.cc:3
 hspecparasciifileio.cc:4
 hspecparasciifileio.cc:5
 hspecparasciifileio.cc:6
 hspecparasciifileio.cc:7
 hspecparasciifileio.cc:8
 hspecparasciifileio.cc:9
 hspecparasciifileio.cc:10
 hspecparasciifileio.cc:11
 hspecparasciifileio.cc:12
 hspecparasciifileio.cc:13
 hspecparasciifileio.cc:14
 hspecparasciifileio.cc:15
 hspecparasciifileio.cc:16
 hspecparasciifileio.cc:17
 hspecparasciifileio.cc:18
 hspecparasciifileio.cc:19
 hspecparasciifileio.cc:20
 hspecparasciifileio.cc:21
 hspecparasciifileio.cc:22
 hspecparasciifileio.cc:23
 hspecparasciifileio.cc:24
 hspecparasciifileio.cc:25
 hspecparasciifileio.cc:26
 hspecparasciifileio.cc:27
 hspecparasciifileio.cc:28
 hspecparasciifileio.cc:29
 hspecparasciifileio.cc:30
 hspecparasciifileio.cc:31
 hspecparasciifileio.cc:32
 hspecparasciifileio.cc:33
 hspecparasciifileio.cc:34
 hspecparasciifileio.cc:35
 hspecparasciifileio.cc:36
 hspecparasciifileio.cc:37
 hspecparasciifileio.cc:38
 hspecparasciifileio.cc:39
 hspecparasciifileio.cc:40
 hspecparasciifileio.cc:41
 hspecparasciifileio.cc:42
 hspecparasciifileio.cc:43
 hspecparasciifileio.cc:44
 hspecparasciifileio.cc:45
 hspecparasciifileio.cc:46
 hspecparasciifileio.cc:47
 hspecparasciifileio.cc:48
 hspecparasciifileio.cc:49
 hspecparasciifileio.cc:50
 hspecparasciifileio.cc:51
 hspecparasciifileio.cc:52
 hspecparasciifileio.cc:53
 hspecparasciifileio.cc:54
 hspecparasciifileio.cc:55
 hspecparasciifileio.cc:56
 hspecparasciifileio.cc:57
 hspecparasciifileio.cc:58
 hspecparasciifileio.cc:59
 hspecparasciifileio.cc:60
 hspecparasciifileio.cc:61
 hspecparasciifileio.cc:62
 hspecparasciifileio.cc:63
 hspecparasciifileio.cc:64
 hspecparasciifileio.cc:65
 hspecparasciifileio.cc:66
 hspecparasciifileio.cc:67
 hspecparasciifileio.cc:68
 hspecparasciifileio.cc:69
 hspecparasciifileio.cc:70
 hspecparasciifileio.cc:71
 hspecparasciifileio.cc:72
 hspecparasciifileio.cc:73
 hspecparasciifileio.cc:74
 hspecparasciifileio.cc:75
 hspecparasciifileio.cc:76
 hspecparasciifileio.cc:77
 hspecparasciifileio.cc:78
 hspecparasciifileio.cc:79
 hspecparasciifileio.cc:80
 hspecparasciifileio.cc:81
 hspecparasciifileio.cc:82
 hspecparasciifileio.cc:83
 hspecparasciifileio.cc:84
 hspecparasciifileio.cc:85
 hspecparasciifileio.cc:86
 hspecparasciifileio.cc:87
 hspecparasciifileio.cc:88
 hspecparasciifileio.cc:89
 hspecparasciifileio.cc:90
 hspecparasciifileio.cc:91
 hspecparasciifileio.cc:92
 hspecparasciifileio.cc:93
 hspecparasciifileio.cc:94
 hspecparasciifileio.cc:95
 hspecparasciifileio.cc:96
 hspecparasciifileio.cc:97
 hspecparasciifileio.cc:98
 hspecparasciifileio.cc:99
 hspecparasciifileio.cc:100
 hspecparasciifileio.cc:101
 hspecparasciifileio.cc:102
 hspecparasciifileio.cc:103
 hspecparasciifileio.cc:104
 hspecparasciifileio.cc:105
 hspecparasciifileio.cc:106
 hspecparasciifileio.cc:107
 hspecparasciifileio.cc:108
 hspecparasciifileio.cc:109
 hspecparasciifileio.cc:110
 hspecparasciifileio.cc:111
 hspecparasciifileio.cc:112
 hspecparasciifileio.cc:113
 hspecparasciifileio.cc:114
 hspecparasciifileio.cc:115
 hspecparasciifileio.cc:116
 hspecparasciifileio.cc:117
 hspecparasciifileio.cc:118
 hspecparasciifileio.cc:119
 hspecparasciifileio.cc:120
 hspecparasciifileio.cc:121
 hspecparasciifileio.cc:122
 hspecparasciifileio.cc:123
 hspecparasciifileio.cc:124
 hspecparasciifileio.cc:125
 hspecparasciifileio.cc:126
 hspecparasciifileio.cc:127
 hspecparasciifileio.cc:128
 hspecparasciifileio.cc:129
 hspecparasciifileio.cc:130
 hspecparasciifileio.cc:131
 hspecparasciifileio.cc:132
 hspecparasciifileio.cc:133
 hspecparasciifileio.cc:134
 hspecparasciifileio.cc:135
 hspecparasciifileio.cc:136
 hspecparasciifileio.cc:137
 hspecparasciifileio.cc:138
 hspecparasciifileio.cc:139
 hspecparasciifileio.cc:140
 hspecparasciifileio.cc:141
 hspecparasciifileio.cc:142
 hspecparasciifileio.cc:143
 hspecparasciifileio.cc:144
 hspecparasciifileio.cc:145
 hspecparasciifileio.cc:146
 hspecparasciifileio.cc:147
 hspecparasciifileio.cc:148
 hspecparasciifileio.cc:149
 hspecparasciifileio.cc:150
 hspecparasciifileio.cc:151
 hspecparasciifileio.cc:152
 hspecparasciifileio.cc:153
 hspecparasciifileio.cc:154
 hspecparasciifileio.cc:155
 hspecparasciifileio.cc:156
 hspecparasciifileio.cc:157
 hspecparasciifileio.cc:158
 hspecparasciifileio.cc:159
 hspecparasciifileio.cc:160
 hspecparasciifileio.cc:161
 hspecparasciifileio.cc:162
 hspecparasciifileio.cc:163
 hspecparasciifileio.cc:164
 hspecparasciifileio.cc:165
 hspecparasciifileio.cc:166
 hspecparasciifileio.cc:167
 hspecparasciifileio.cc:168
 hspecparasciifileio.cc:169
 hspecparasciifileio.cc:170
 hspecparasciifileio.cc:171
 hspecparasciifileio.cc:172
 hspecparasciifileio.cc:173
 hspecparasciifileio.cc:174
 hspecparasciifileio.cc:175
 hspecparasciifileio.cc:176
 hspecparasciifileio.cc:177
 hspecparasciifileio.cc:178
 hspecparasciifileio.cc:179
 hspecparasciifileio.cc:180
 hspecparasciifileio.cc:181
 hspecparasciifileio.cc:182
 hspecparasciifileio.cc:183
 hspecparasciifileio.cc:184
 hspecparasciifileio.cc:185
 hspecparasciifileio.cc:186
 hspecparasciifileio.cc:187
 hspecparasciifileio.cc:188
 hspecparasciifileio.cc:189
 hspecparasciifileio.cc:190
 hspecparasciifileio.cc:191
 hspecparasciifileio.cc:192
 hspecparasciifileio.cc:193
 hspecparasciifileio.cc:194
 hspecparasciifileio.cc:195
 hspecparasciifileio.cc:196
 hspecparasciifileio.cc:197
 hspecparasciifileio.cc:198
 hspecparasciifileio.cc:199
 hspecparasciifileio.cc:200
 hspecparasciifileio.cc:201
 hspecparasciifileio.cc:202
 hspecparasciifileio.cc:203
 hspecparasciifileio.cc:204
 hspecparasciifileio.cc:205
 hspecparasciifileio.cc:206
 hspecparasciifileio.cc:207
 hspecparasciifileio.cc:208
 hspecparasciifileio.cc:209
 hspecparasciifileio.cc:210
 hspecparasciifileio.cc:211
 hspecparasciifileio.cc:212
 hspecparasciifileio.cc:213
 hspecparasciifileio.cc:214
 hspecparasciifileio.cc:215
 hspecparasciifileio.cc:216
 hspecparasciifileio.cc:217
 hspecparasciifileio.cc:218
 hspecparasciifileio.cc:219
 hspecparasciifileio.cc:220
 hspecparasciifileio.cc:221
 hspecparasciifileio.cc:222
 hspecparasciifileio.cc:223
 hspecparasciifileio.cc:224
 hspecparasciifileio.cc:225
 hspecparasciifileio.cc:226
 hspecparasciifileio.cc:227
 hspecparasciifileio.cc:228
 hspecparasciifileio.cc:229
 hspecparasciifileio.cc:230
 hspecparasciifileio.cc:231
 hspecparasciifileio.cc:232
 hspecparasciifileio.cc:233
 hspecparasciifileio.cc:234
 hspecparasciifileio.cc:235
 hspecparasciifileio.cc:236
 hspecparasciifileio.cc:237
 hspecparasciifileio.cc:238
 hspecparasciifileio.cc:239
 hspecparasciifileio.cc:240
 hspecparasciifileio.cc:241
 hspecparasciifileio.cc:242
 hspecparasciifileio.cc:243
 hspecparasciifileio.cc:244
 hspecparasciifileio.cc:245
 hspecparasciifileio.cc:246
 hspecparasciifileio.cc:247
 hspecparasciifileio.cc:248
 hspecparasciifileio.cc:249
 hspecparasciifileio.cc:250
 hspecparasciifileio.cc:251
 hspecparasciifileio.cc:252
 hspecparasciifileio.cc:253
 hspecparasciifileio.cc:254
 hspecparasciifileio.cc:255
 hspecparasciifileio.cc:256
 hspecparasciifileio.cc:257
 hspecparasciifileio.cc:258
 hspecparasciifileio.cc:259
 hspecparasciifileio.cc:260
 hspecparasciifileio.cc:261
 hspecparasciifileio.cc:262
 hspecparasciifileio.cc:263
 hspecparasciifileio.cc:264
 hspecparasciifileio.cc:265
 hspecparasciifileio.cc:266
 hspecparasciifileio.cc:267
 hspecparasciifileio.cc:268
 hspecparasciifileio.cc:269
 hspecparasciifileio.cc:270
 hspecparasciifileio.cc:271
 hspecparasciifileio.cc:272
 hspecparasciifileio.cc:273
 hspecparasciifileio.cc:274
 hspecparasciifileio.cc:275
 hspecparasciifileio.cc:276
 hspecparasciifileio.cc:277
 hspecparasciifileio.cc:278
 hspecparasciifileio.cc:279
 hspecparasciifileio.cc:280
 hspecparasciifileio.cc:281