ROOT logo
//*-- Author : Ilse Koenig
//*-- Created: 21/02/2003

//_HADES_CLASS_DESCRIPTION 
///////////////////////////////////////////////////////////////////////////////
// HLdFileOutput
//
// Writes HLD events to a file
//
///////////////////////////////////////////////////////////////////////////////

#include "hldfileoutput.h"
#include "hldsource.h"
#include "hldevt.h"
#include <unistd.h>

ClassImp(HldFileOutput)

HldFileOutput::HldFileOutput(void) {
  // Default constructor
  fOption="NEW";
  fileSuffix="f_";
  evt=0;
  numTotal=0;
  numFiltered=0;
  UInt_t i[2]={0,0};
  fout=0;
  memcpy(padding,(UChar_t*)i,64);
}

HldFileOutput::HldFileOutput(HldSource* pSource,const Text_t* pDir,const Text_t* pSuffix,
                             const Option_t* pOption) {
  // Constructor accepts the data source, the file directory and the file option
  setHldSource(pSource);
  setDirectory(pDir);
  setFileSuffix(pSuffix);
  setFileOption(pOption);
  numTotal=0;
  numFiltered=0;
  UInt_t i[2]={0,0};
  fout=0;
  memcpy(padding,(UChar_t*)i,64);
}

HldFileOutput::~HldFileOutput(void) {
  // Destructor
  close();
}

void HldFileOutput::setHldSource(HldSource* pSource) {
  // Sets the pointer to the event in the datasource
  if (!pSource) {
    evt=0;    
    Error("setHldSource","HldSource not defined");
  } else {
    evt=pSource->fReadEvent;
    evt->setWritable();
  }
}

void HldFileOutput::setDirectory(const Text_t* pDir) {
  // Sets the output directory
  fDir=pDir;
  if (fDir.Length()>0 && !fDir.EndsWith("/")) fDir+='/'; 
}

void HldFileOutput::setFileSuffix(const Text_t* pSuffix) {
  // Sets the file suffix (default f_)
  if (strlen(pSuffix)>0) fileSuffix=pSuffix;
  else fileSuffix="f_";
}

void HldFileOutput::setFileOption(const Option_t* option) {
  // Sets the file option:
  // "CREATE" or "NEW": does not overwrite an existing file
  // "RECREATE":        overwrites an existing file
  if (strcmp(option,"CREATE")==0 || strcmp(option,"NEW")==0
        || strcmp(option,"RECREATE")==0) fOption=option;
  else {
    Error("setFileOption(Text_t*,Option_t*)","Invalid option!");
    fOption="NEW";
  }
}

Bool_t HldFileOutput::open(const Text_t* filename) {
  // Opens the output file
  close();
  numTotal=0;
  numFiltered=0;

  if(!fileSuffix.BeginsWith("."))
  {
      fileSuffix="."+fileSuffix;
  }
  TString fileName=filename;
  TString fn=fDir+filename;

  if(!fileName.EndsWith(fileSuffix.Data()))
  {
      fn+=fileSuffix;
  }

  if (fOption.CompareTo("CREATE")==0 || fOption.CompareTo("NEW")==0) {
    if (access(fn.Data(),F_OK)==0) {
      Error("open(Text_t*)","File %s exists already",fn.Data());
      return kFALSE;
    }
  }
  fout=new ofstream(fn.Data());
  if (!fout->is_open())
    Error("open(Text_t*)","File %s cannot be created",fn.Data());
  return fout->is_open() ;  
}

void HldFileOutput::close() {
  // Closes the output file
  if (fout) {
    if(fout->is_open()) fout->close();
    delete fout;
    fout=0;
  }
}

void HldFileOutput::writeEvent() {
  // Writes the event to the output file and increments the counters
  if (evt && fout && fout->is_open()) {
      if(evt->getData()) {
	  fout->write((Char_t*)evt->getHeader(),evt->getHdrSize());
	  fout->write((Char_t*)evt->getData(),evt->getDataSize());
	  fout->write((Char_t*)padding,evt->getPaddedSize()-evt->getSize());
	  numTotal++;
	  if ((evt->getId() & 0xf)==1) numFiltered++;
      } else {
        Warning("HldFileOutput::writeEvent()","NULL pointer for Data received, skipped!");
      }
  }
}
 hldfileoutput.cc:1
 hldfileoutput.cc:2
 hldfileoutput.cc:3
 hldfileoutput.cc:4
 hldfileoutput.cc:5
 hldfileoutput.cc:6
 hldfileoutput.cc:7
 hldfileoutput.cc:8
 hldfileoutput.cc:9
 hldfileoutput.cc:10
 hldfileoutput.cc:11
 hldfileoutput.cc:12
 hldfileoutput.cc:13
 hldfileoutput.cc:14
 hldfileoutput.cc:15
 hldfileoutput.cc:16
 hldfileoutput.cc:17
 hldfileoutput.cc:18
 hldfileoutput.cc:19
 hldfileoutput.cc:20
 hldfileoutput.cc:21
 hldfileoutput.cc:22
 hldfileoutput.cc:23
 hldfileoutput.cc:24
 hldfileoutput.cc:25
 hldfileoutput.cc:26
 hldfileoutput.cc:27
 hldfileoutput.cc:28
 hldfileoutput.cc:29
 hldfileoutput.cc:30
 hldfileoutput.cc:31
 hldfileoutput.cc:32
 hldfileoutput.cc:33
 hldfileoutput.cc:34
 hldfileoutput.cc:35
 hldfileoutput.cc:36
 hldfileoutput.cc:37
 hldfileoutput.cc:38
 hldfileoutput.cc:39
 hldfileoutput.cc:40
 hldfileoutput.cc:41
 hldfileoutput.cc:42
 hldfileoutput.cc:43
 hldfileoutput.cc:44
 hldfileoutput.cc:45
 hldfileoutput.cc:46
 hldfileoutput.cc:47
 hldfileoutput.cc:48
 hldfileoutput.cc:49
 hldfileoutput.cc:50
 hldfileoutput.cc:51
 hldfileoutput.cc:52
 hldfileoutput.cc:53
 hldfileoutput.cc:54
 hldfileoutput.cc:55
 hldfileoutput.cc:56
 hldfileoutput.cc:57
 hldfileoutput.cc:58
 hldfileoutput.cc:59
 hldfileoutput.cc:60
 hldfileoutput.cc:61
 hldfileoutput.cc:62
 hldfileoutput.cc:63
 hldfileoutput.cc:64
 hldfileoutput.cc:65
 hldfileoutput.cc:66
 hldfileoutput.cc:67
 hldfileoutput.cc:68
 hldfileoutput.cc:69
 hldfileoutput.cc:70
 hldfileoutput.cc:71
 hldfileoutput.cc:72
 hldfileoutput.cc:73
 hldfileoutput.cc:74
 hldfileoutput.cc:75
 hldfileoutput.cc:76
 hldfileoutput.cc:77
 hldfileoutput.cc:78
 hldfileoutput.cc:79
 hldfileoutput.cc:80
 hldfileoutput.cc:81
 hldfileoutput.cc:82
 hldfileoutput.cc:83
 hldfileoutput.cc:84
 hldfileoutput.cc:85
 hldfileoutput.cc:86
 hldfileoutput.cc:87
 hldfileoutput.cc:88
 hldfileoutput.cc:89
 hldfileoutput.cc:90
 hldfileoutput.cc:91
 hldfileoutput.cc:92
 hldfileoutput.cc:93
 hldfileoutput.cc:94
 hldfileoutput.cc:95
 hldfileoutput.cc:96
 hldfileoutput.cc:97
 hldfileoutput.cc:98
 hldfileoutput.cc:99
 hldfileoutput.cc:100
 hldfileoutput.cc:101
 hldfileoutput.cc:102
 hldfileoutput.cc:103
 hldfileoutput.cc:104
 hldfileoutput.cc:105
 hldfileoutput.cc:106
 hldfileoutput.cc:107
 hldfileoutput.cc:108
 hldfileoutput.cc:109
 hldfileoutput.cc:110
 hldfileoutput.cc:111
 hldfileoutput.cc:112
 hldfileoutput.cc:113
 hldfileoutput.cc:114
 hldfileoutput.cc:115
 hldfileoutput.cc:116
 hldfileoutput.cc:117
 hldfileoutput.cc:118
 hldfileoutput.cc:119
 hldfileoutput.cc:120
 hldfileoutput.cc:121
 hldfileoutput.cc:122
 hldfileoutput.cc:123
 hldfileoutput.cc:124
 hldfileoutput.cc:125
 hldfileoutput.cc:126
 hldfileoutput.cc:127
 hldfileoutput.cc:128
 hldfileoutput.cc:129
 hldfileoutput.cc:130
 hldfileoutput.cc:131
 hldfileoutput.cc:132
 hldfileoutput.cc:133
 hldfileoutput.cc:134
 hldfileoutput.cc:135
 hldfileoutput.cc:136
 hldfileoutput.cc:137