Back to index

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); 
} 

Back to index