ROOT logo
//*-- Author : Ilse Koenig
//*-- Modified on 1/3/2000 by R. Holzmann
//*-- Modified : 26/11/98 by Ilse Koenig
//*-- Modified by D.B (Dump of events)
//_HADES_CLASS_DESCRIPTION 
//////////////////////////////////////////////////////////
// HldFileSource
//
//  This "data source" reads the HLD data from files on disk.
//  (further information in base class HldSource)
//
///////////////////////////////////////////////////////////////////////////////

#include "hldfilesource.h"
#include "hrecevent.h"
#include "hldfilevt.h"
#include "hades.h"
#include "hruntimedb.h"
#include <limits.h>
#include <unistd.h>


#include <fstream>

ClassImp(HldFileSource)

HldFileSource::HldFileSource(void)
	: HldFileSourceBase()
{
  // Default constructor for a Lmd file data source.
  fReadEvent=new HldFilEvt;
  iter=0;
  fCurrentFile=0;
  fEventNr = 0;
  fEventLimit = INT_MAX;
}


HldFileSource::~HldFileSource(void) {
  // Destructor for a LMD file data source
  if (fReadEvent) delete fReadEvent;
  fReadEvent=0;
  if (iter)
  {
    delete iter;
    iter = NULL;
  }
}


HldFileSource::HldFileSource(HldFileSource &so) {
#warning warning about baseclass contructor can be ignored!
    fFileList.AddAll(&so.fFileList);
  if (so.fCurrentFile) {
    fCurrentFile=(HldFileDesc *)fFileList.FindObject(so.fCurrentFile->GetName());
    iter=0;
  }
  fReadEvent=so.fReadEvent; //FIXME: Do a real copy!!
  fEventNr = 0;
  fEventLimit = INT_MAX;
}

Int_t HldFileSource::getRunId(const Text_t *fileName) {
  HldFilEvt evt;
  Int_t r=-1;

  if (fCurrentFile && strcmp(fileName,fCurrentFile->GetName())==0) {
    r=fCurrentFile->getRunId();
  } else {
    if (!evt.setFile(fileName)) r=-1;
    else {
      evt.read();
      r=evt.getRunNr();
    }
  }
  return r;
}


EDsState HldFileSource::getNextEvent(Bool_t doUnpack) {
  // loops over the event files in the runtime database
  // Tries to read a new event from the LMD file and put the info into the 
  // HEvent structure:

  if(isDumped) {
    if (dumpEvt()==kDsError) {
	if (getNextFile()==kFALSE) {
            fLastEventStatus = kDsEndData;
	    return kDsEndData;
	}
	else {
	    fLastEventStatus = kDsEndFile;
	    return kDsEndFile;
	}
    }
    fLastEventStatus = kDsOk;
    return kDsOk;
  }

  if (isScanned) {
    if (scanEvt()==kDsError) {
	if (getNextFile()==kFALSE) {
            fLastEventStatus = kDsEndData;
	    return kDsEndData;
	}
	else {
	    fLastEventStatus = kDsEndFile;
	    return kDsEndFile;
	}
    }
    fLastEventStatus = kDsOk;
    return kDsOk; 
  }  

  fEventNr++;

  if ( !((HldFilEvt*)fReadEvent)->execute() || !(fEventNr<fEventLimit)) {
    //End of current file
    fEventNr = 0;
    if (getNextFile()==kFALSE) {
	fLastEventStatus = kDsEndData;
	return kDsEndData;
    }
    else {
	fLastEventStatus = kDsEndFile;
	return kDsEndFile;
    }
  }

  if(doUnpack){
    decodeHeader((*fEventAddr)->getHeader());
    iter->Reset();
    HldUnpack *unpacker;
    while ( (unpacker=(HldUnpack *)iter->Next())!=NULL) {
        Int_t ret=unpacker->execute();
	if(!ret) {
	    fLastEventStatus = kDsError;
	    return kDsError;
	}
	if(ret==kDsSkip) {
	    fLastEventStatus = kDsSkip;
	    return kDsSkip;
	}
    }
  }
  fLastEventStatus = kDsOk;
  return kDsOk;
}
 

Bool_t HldFileSource::getNextFile() {
  if (!fCurrentFile) {
    if (fFileList.IsEmpty()) return kFALSE;
    else fCurrentFile=(HldFileDesc *)fFileList.First();
  } else {
    fCurrentFile=(HldFileDesc *)fFileList.After(fCurrentFile);
    if (!fCurrentFile) return kFALSE;
  }

  ((HldFilEvt *)fReadEvent)->setFile(fCurrentFile->GetName());
  
  return kTRUE;
}

void HldFileSource::addFile(const Text_t *name,Int_t refId) {
  HldFileDesc *desc=0;
  HldFileDesc *newDesc=0;
  TString fileName;
  fileName=fCurrentDir+"/"+name;
  desc=(HldFileDesc *)fFileList.FindObject(fileName);
  if (desc) {
    if (refId==-1) 
      newDesc=new HldFileDesc(fileName.Data(),desc->getRunId(),desc->getRefId());
    else
      newDesc=new HldFileDesc(fileName.Data(),desc->getRunId(),refId);
    fFileList.Add(newDesc);
    Warning("addFile","File %s added more than once\n",fileName.Data());
  } else {
    if (::access(fileName.Data(),F_OK)!=0) { // File does not exist
      Error("addFile","File %s not found\n",fileName.Data());
    } else {
      newDesc=new HldFileDesc(fileName.Data(),getRunId(fileName),refId);
      fFileList.Add(newDesc);
    }
  }
}


Bool_t HldFileSource::rewind() {
  if (fFileList.IsEmpty()) return kFALSE;
  else fCurrentFile=(HldFileDesc *)fFileList.First();
  return ((HldFilEvt *)fReadEvent)->setFile(fCurrentFile->GetName());
}









 hldfilesource.cc:1
 hldfilesource.cc:2
 hldfilesource.cc:3
 hldfilesource.cc:4
 hldfilesource.cc:5
 hldfilesource.cc:6
 hldfilesource.cc:7
 hldfilesource.cc:8
 hldfilesource.cc:9
 hldfilesource.cc:10
 hldfilesource.cc:11
 hldfilesource.cc:12
 hldfilesource.cc:13
 hldfilesource.cc:14
 hldfilesource.cc:15
 hldfilesource.cc:16
 hldfilesource.cc:17
 hldfilesource.cc:18
 hldfilesource.cc:19
 hldfilesource.cc:20
 hldfilesource.cc:21
 hldfilesource.cc:22
 hldfilesource.cc:23
 hldfilesource.cc:24
 hldfilesource.cc:25
 hldfilesource.cc:26
 hldfilesource.cc:27
 hldfilesource.cc:28
 hldfilesource.cc:29
 hldfilesource.cc:30
 hldfilesource.cc:31
 hldfilesource.cc:32
 hldfilesource.cc:33
 hldfilesource.cc:34
 hldfilesource.cc:35
 hldfilesource.cc:36
 hldfilesource.cc:37
 hldfilesource.cc:38
 hldfilesource.cc:39
 hldfilesource.cc:40
 hldfilesource.cc:41
 hldfilesource.cc:42
 hldfilesource.cc:43
 hldfilesource.cc:44
 hldfilesource.cc:45
 hldfilesource.cc:46
 hldfilesource.cc:47
 hldfilesource.cc:48
 hldfilesource.cc:49
 hldfilesource.cc:50
 hldfilesource.cc:51
 hldfilesource.cc:52
 hldfilesource.cc:53
 hldfilesource.cc:54
 hldfilesource.cc:55
 hldfilesource.cc:56
 hldfilesource.cc:57
 hldfilesource.cc:58
 hldfilesource.cc:59
 hldfilesource.cc:60
 hldfilesource.cc:61
 hldfilesource.cc:62
 hldfilesource.cc:63
 hldfilesource.cc:64
 hldfilesource.cc:65
 hldfilesource.cc:66
 hldfilesource.cc:67
 hldfilesource.cc:68
 hldfilesource.cc:69
 hldfilesource.cc:70
 hldfilesource.cc:71
 hldfilesource.cc:72
 hldfilesource.cc:73
 hldfilesource.cc:74
 hldfilesource.cc:75
 hldfilesource.cc:76
 hldfilesource.cc:77
 hldfilesource.cc:78
 hldfilesource.cc:79
 hldfilesource.cc:80
 hldfilesource.cc:81
 hldfilesource.cc:82
 hldfilesource.cc:83
 hldfilesource.cc:84
 hldfilesource.cc:85
 hldfilesource.cc:86
 hldfilesource.cc:87
 hldfilesource.cc:88
 hldfilesource.cc:89
 hldfilesource.cc:90
 hldfilesource.cc:91
 hldfilesource.cc:92
 hldfilesource.cc:93
 hldfilesource.cc:94
 hldfilesource.cc:95
 hldfilesource.cc:96
 hldfilesource.cc:97
 hldfilesource.cc:98
 hldfilesource.cc:99
 hldfilesource.cc:100
 hldfilesource.cc:101
 hldfilesource.cc:102
 hldfilesource.cc:103
 hldfilesource.cc:104
 hldfilesource.cc:105
 hldfilesource.cc:106
 hldfilesource.cc:107
 hldfilesource.cc:108
 hldfilesource.cc:109
 hldfilesource.cc:110
 hldfilesource.cc:111
 hldfilesource.cc:112
 hldfilesource.cc:113
 hldfilesource.cc:114
 hldfilesource.cc:115
 hldfilesource.cc:116
 hldfilesource.cc:117
 hldfilesource.cc:118
 hldfilesource.cc:119
 hldfilesource.cc:120
 hldfilesource.cc:121
 hldfilesource.cc:122
 hldfilesource.cc:123
 hldfilesource.cc:124
 hldfilesource.cc:125
 hldfilesource.cc:126
 hldfilesource.cc:127
 hldfilesource.cc:128
 hldfilesource.cc:129
 hldfilesource.cc:130
 hldfilesource.cc:131
 hldfilesource.cc:132
 hldfilesource.cc:133
 hldfilesource.cc:134
 hldfilesource.cc:135
 hldfilesource.cc:136
 hldfilesource.cc:137
 hldfilesource.cc:138
 hldfilesource.cc:139
 hldfilesource.cc:140
 hldfilesource.cc:141
 hldfilesource.cc:142
 hldfilesource.cc:143
 hldfilesource.cc:144
 hldfilesource.cc:145
 hldfilesource.cc:146
 hldfilesource.cc:147
 hldfilesource.cc:148
 hldfilesource.cc:149
 hldfilesource.cc:150
 hldfilesource.cc:151
 hldfilesource.cc:152
 hldfilesource.cc:153
 hldfilesource.cc:154
 hldfilesource.cc:155
 hldfilesource.cc:156
 hldfilesource.cc:157
 hldfilesource.cc:158
 hldfilesource.cc:159
 hldfilesource.cc:160
 hldfilesource.cc:161
 hldfilesource.cc:162
 hldfilesource.cc:163
 hldfilesource.cc:164
 hldfilesource.cc:165
 hldfilesource.cc:166
 hldfilesource.cc:167
 hldfilesource.cc:168
 hldfilesource.cc:169
 hldfilesource.cc:170
 hldfilesource.cc:171
 hldfilesource.cc:172
 hldfilesource.cc:173
 hldfilesource.cc:174
 hldfilesource.cc:175
 hldfilesource.cc:176
 hldfilesource.cc:177
 hldfilesource.cc:178
 hldfilesource.cc:179
 hldfilesource.cc:180
 hldfilesource.cc:181
 hldfilesource.cc:182
 hldfilesource.cc:183
 hldfilesource.cc:184
 hldfilesource.cc:185
 hldfilesource.cc:186
 hldfilesource.cc:187
 hldfilesource.cc:188
 hldfilesource.cc:189
 hldfilesource.cc:190
 hldfilesource.cc:191
 hldfilesource.cc:192
 hldfilesource.cc:193
 hldfilesource.cc:194
 hldfilesource.cc:195
 hldfilesource.cc:196
 hldfilesource.cc:197
 hldfilesource.cc:198
 hldfilesource.cc:199
 hldfilesource.cc:200
 hldfilesource.cc:201
 hldfilesource.cc:202