PHRawOManager.C
//-----------------------------------------------------------------------------
// $Header: /afs/rhic/phenix/cvsroot/offline/framework/phool/PHRawOManager.C,v 1.7 2000/06/22 19:35:19 messer Exp $
//
// The PHOOL's Software
// Copyright (C) PHENIX collaboration, 1999
//
// Implementation of class PHRawOManager
//
// Author: Matthias Messer
//-----------------------------------------------------------------------------
#include "PHRawOManager.h"
#include "PHCompositeNode.h"
#include "PHRawDataNode.h"
#include "ogzBuffer.h"
#include "EventTypes.h"
#include "packetConstants.h"
PHRawOManager::PHRawOManager(const PHString & newFile, int run, int bufl, int evtl, int complvl)
{
if (!setFile(newFile, run, bufl, evtl, complvl)) {
filename = "file open failed";
file = 0;
memBuffer = 0;
fileBuffer = 0;
compressionLevel = 0;
}
}
PHRawOManager::PHRawOManager()
{
file = 0;
memBuffer = 0;
fileBuffer = 0;
compressionLevel = 0;
}
PHRawOManager::~PHRawOManager()
{
closeFile();
}
void PHRawOManager::closeFile()
{
delete fileBuffer;
delete memBuffer;
fileBuffer = 0;
memBuffer = 0;
if (file) {
fclose(file);
file = 0;
}
}
PHBoolean PHRawOManager::setFile(const PHString & setFile, int setRun, int setBufl, int setEvtl, int complvl)
{
filename = setFile;
runNumber = setRun;
bufferSize = setBufl;
compressionLevel = complvl;
if (setEvtl == -1)
eventLength = bufferSize / 4;
else
eventLength = setEvtl;
closeFile();
file = fopen (filename.getString(), "w");
if (!file) {
PHMessage("PHRawOManager::setFile", PHError, "could not open file");
return False;
}
memBuffer = new DWORD[bufferSize];
if (compressionLevel == 0) {
fileBuffer = new oBuffer(file, memBuffer, bufferSize, runNumber);
}
else if (1 <= compressionLevel && compressionLevel <= 9) {
fileBuffer = new ogzBuffer(file, memBuffer, bufferSize, compressionLevel, runNumber);
}
else
PHMessage("PHRawOManager::setFile", PHWarning, "illegal compression level, no compression done");
return True;
}
PHBoolean PHRawOManager::write(PHCompositeNode* topNode)
{
//
// The write function of the PHCompositeNode topNode will
// recursively call the write functions of its subnodes.
// The PHRawDataNodes among them call the write function found
// below.
//
if (file && fileBuffer) {
fileBuffer->nextEvent(eventLength, DATAEVENT);
topNode->write(this);
eventNumber++;
return True;
}
return False;
}
PHBoolean PHRawOManager::write(PHRawDataNode* node)
{
if(file && fileBuffer) {
int bytesAddedToBuffer = fileBuffer->addUnstructPacketData(node->getData(), node->getLength(), node->getID(),
node->getWordLength(), node->getHitFormat());
if (bytesAddedToBuffer <= 0) {
PHMessage("PHRawOManager::write", PHError, "Zero bytes added to buffer");
return False;
}
return True;
}
return False;
}
void PHRawOManager::print() const
{
cout << "File attached : " << filename << endl;
cout << "Buffer size : " << bufferSize << endl;
cout << "Event Length : " << eventLength << endl;
cout << "Run number : " << runNumber << endl;
cout << "Events written: " << eventNumber << endl;
}