CRawDataEvent.C
//-----------------------------------------------------------------------------
// $Header: /asis/offline/ceres/cool/project/RCS/CRawDataEvent.C,v 2.3 1997/07/10 10:28:28 messer Exp $
//
// COOL Program Library
// Copyright (C) CERES collaboration, 1996
//
// Implementation of class CRawDataEvent.
//
//-----------------------------------------------------------------------------
#include <iostream.h>
#include "CRawDataEvent.h"
#include "CDataStream.h"
CRawDataEvent::CRawDataEvent()
{
runNumber = 0;
eventType = NoRoot;
rootLabel = 0;
}
CRawDataEvent::~CRawDataEvent()
{
labelList.clearAndDestroy();
}
void CRawDataEvent::readEvent(Cifstream& ist)
{
CLabel *label;
rootLabel = 0;
labelList.clearAndDestroy();
//
// Get root label
//
label = new CLabel;
label->read(ist);
if (CGetEventType(label) == NoRoot) {
cerr << "CRawDataEvent::readEvent():\n";
cerr << "\tWARNING\n";
cerr << "\tNo root label found at expected position.\n";
cerr << "\tSearching for next valid root label in the\n";
cerr << "\tinput stream.\n";
int nskip = 0;
while (ist.good() && CGetEventType(label) == NoRoot) {
nskip++;
label->read(ist);
}
if (CGetEventType(label) == NoRoot) {
cerr << "CRawDataEvent::readEvent():\n";
cerr << "\tERROR\n";
cerr << "\tNo root label found after skipping " << nskip << " labels.\n";
cerr << "\tNothing stored.\n";
delete label;
return;
}
else {
cerr << "CRawDataEvent::readEvent():\n";
cerr << "\tINFORMATION\n";
cerr << "\tNext root label found after skipping " << nskip << " labels.\n";
}
}
rootLabel = label;
eventType = CGetEventType(label);
labelList.insert(label);
//
// Read the root header information
//
const CWord *data = label->getData();
if (data == 0) {
cerr << "CRawDataEvent::readEvent():\n";
cerr << "\tERROR\n";
cerr << "\tLabel contains no data." << endl;
cerr << "\tNothing stored.\n";
delete label;
return;
}
runNumber = (int) data[1];
unsigned year = (unsigned) data[2]/10000;
unsigned month = (unsigned) (data[2]-year*10000)/100;
unsigned day = (unsigned) (data[2]-year*10000-month*100);
unsigned hour = (unsigned) data[3]/10000;
unsigned min = (unsigned) (data[3]-hour*10000)/100;
unsigned sec = (unsigned) (data[3]-hour*10000-min*100);
date = CDate(day, month, year);
time = CTime(date, hour, min, sec);
//
// Get all remaining labels of current root label
//
streampos currentPos;
while (ist.good() && !ist.eof()) {
currentPos = ist.tellg();
label = new CLabel;
label->read(ist);
if (CGetEventType(label) != NoRoot) { // next root label found
ist.seekg(currentPos);
delete label;
break;
}
else {
if (label->getLength() >= 4) // must have at least length of header
labelList.insert(label);
else
delete label;
}
}
}
void CRawDataEvent::listLabels(ostream& ost)
{
RWTPtrDlistIterator<CLabel> iterator(labelList);
CLabel *next;
while (next = iterator()) next->list(ost);
}
int CRawDataEvent::getEventLength()
{
int len = 0;
RWTPtrDlistIterator<CLabel> iterator(labelList);
CLabel *next;
while (next = iterator()) len += next->getLength();
return len;
}
const CLabel* CRawDataEvent::getLabel(CLabelId id)
{
RWTPtrDlistIterator<CLabel> iterator(labelList);
CLabel *next = 0;
while (next = iterator())
if (next->getId() == id) return next;
return (const CLabel*) 0;
}
CEventType CGetEventType(CLabel* label)
{
CEventType type;
switch (label->getId()) {
case EVNT:
type = Evt;
break;
case SORL:
type = SoR;
break;
case EORL:
type = EoR;
break;
case SOBL:
type = SoB;
break;
case EOBL:
type = EoB;
break;
case OOBL:
type = OoB;
break;
default:
type = NoRoot;
break;
}
return type;
}
void CRawDataEvent::writeEvent(Cofstream& ost)
{
#ifdef ARCH_IS_LITTLE_ENDIAN
cerr << "CCRawDataEvent::writeEvent():\n"
<< "\tWARNING\n"
<< "\tDo not (yet) try to read the data written on this architecture.\n"
<< "\tThe correct treatment of data for little-endian architectures "
<< "is implemented, but not yet tested !!!!!!!!!!!!!\n";
#endif
RWTPtrDlistIterator<CLabel> iterator(labelList);
CLabel *next;
if (!rootLabel || labelList.isEmpty()) return; // nothing to do
//
// Write all labels in list.
// Root label must be the first label written.
//
rootLabel->write(ost);
while (next = iterator())
if (next != rootLabel) next->write(ost);
}