// ----------------------------------------------------------------------------
// $Id: LCDreadSIOFile.cxx,v 1.1 2001/05/10 22:06:37 toshi Exp $
// ----------------------------------------------------------------------------
//
// $Log: LCDreadSIOFile.cxx,v $
// Revision 1.1  2001/05/10 22:06:37  toshi
// File IO (stdHEP, SIO,...) utilities.
//
//
#include "LCDreadSIOFile.h"

#include <iostream.h>

// ----------------------------------------------------------------------------
// CVS $Id: LCDreadSIOFile.cxx,v 1.1 2001/05/10 22:06:37 toshi Exp $
// ----------------------------------------------------------------------------
//
// General Description:
//
// ----------------------------------------------------------------------------

#ifdef _MSC_VER
#   pragma warning(disable:4786)        // >255 characters in debug information
#endif

ClassImp(LCDreadSIOFile)

// ----------------------------------------------------------------------------
 LCDreadSIOFile::LCDreadSIOFile() {
  Init();
}
// ----------------------------------------------------------------------------

// ----------------------------------------------------------------------------
 LCDreadSIOFile::LCDreadSIOFile(Char_t* siofilename, LCDEvent* event) {
  Init();
  if (event == 0) {
    m_event = new LCDEvent();
    m_ownevent=kTRUE;
  } else {
    m_event = event;
    m_ownevent=kFALSE;
  }
  SetSIOFileName(siofilename);
}
// ----------------------------------------------------------------------------

// ----------------------------------------------------------------------------
 LCDreadSIOFile::~LCDreadSIOFile() {
  if (m_ownevent) {
    m_event->Delete();
    delete m_event;
  }
}
// ----------------------------------------------------------------------------

// ----------------------------------------------------------------------------
 void LCDreadSIOFile::SetSIOFileName(Char_t* siofilename) {
  i_file=siofilename;
  InitSIO();
}
// ----------------------------------------------------------------------------

// ----------------------------------------------------------------------------
//
// Put thes in global scope so the block readers can use them.
//
// ----------------------------------------------------------------------------
 void LCDreadSIOFile::Init() {
  m_ownevent=kFALSE;
  ParticleList = new TMap( 17, 0 );
  stream = NULL;
    
  recred = NULL;
  header = NULL;
  record = NULL;
    
  //bufsize = 64000;
  //comp    = 1;
  //split   = 1;
    
  status  = 0;
    
  i_file  = 0;

  det_ID=0;
  det_CVS=0;

  f_debug=0;
}
// ----------------------------------------------------------------------------

// ----------------------------------------------------------------------------
// Deal with SIO
// ----------------------------------------------------------------------------
 Int_t LCDreadSIOFile::InitSIO() {
  //
  // Look at SIO errors
  //
  //SIO_streamManager::setVerbosity( SIO_ALL );
  //SIO_recordManager::setVerbosity( SIO_ALL );
  //SIO_blockManager::setVerbosity(  SIO_ALL );
  SIO_streamManager::setVerbosity( SIO_ERRORS );
  SIO_recordManager::setVerbosity( SIO_ERRORS );
  SIO_blockManager::setVerbosity(  SIO_ERRORS );
  
  //
  // Make header I/O blocks.
  //
  det_ID  = new LCD_detector_ID(   "LCD_detector_ID"   );
  det_CVS = new LCD_detector_CVS(  "LCD_detector_CVS"  );

  SIO_blockManager::add(det_ID);
  SIO_blockManager::add(det_CVS);

  //
  // Make I/O blocks.
  //
  EMCalorimeter = 
    new S2R_EMCalorimeter( "EMCalorimeter" ,&m_event,&ParticleList);
  HADCalorimeter= 
    new S2R_HADCalorimeter("HADCalorimeter",&m_event,&ParticleList);
  LUMCalorimeter= 
    new S2R_LUMCalorimeter("LUMCalorimeter",&m_event,&ParticleList);
  MUCalorimeter = 
    new S2R_MUCalorimeter( "MUCalorimeter" ,&m_event,&ParticleList);
  Tracker       = 
    new S2R_Tracker(       "Tracker"       ,&m_event,&ParticleList);
  VXD           = 
    new S2R_VXD(           "VXD"           ,&m_event,&ParticleList);
  MCPrint       = 
    new S2R_MCPrint(       "MCPrint"       ,&m_event,&ParticleList);
  EventMarker   = 
    new S2R_EventMarker(   "EventMarker"   ,&m_event,&ParticleList);

  SIO_blockManager::add(  EMCalorimeter );
  SIO_blockManager::add( HADCalorimeter );
  SIO_blockManager::add( LUMCalorimeter );
  SIO_blockManager::add(  MUCalorimeter );
  SIO_blockManager::add( Tracker        );
  SIO_blockManager::add( VXD            );
  SIO_blockManager::add( MCPrint        );
  SIO_blockManager::add( EventMarker    );

  //
  // Add an input stream and open the input file on it.
  //
  stream = SIO_streamManager::add( "input" );
  if( !stream )
    return( 1 );

  if( !( (status = stream->open( i_file, SIO_MODE_READ )) & 1 ) )
    return( 1 );

  //
  // Set up to interpret records of type "LCD_Gismo_Detector".
  //
  header = SIO_recordManager::add( "LCD_Gismo_Detector" );
  if( !header )
    return( 1 );

  header->setUnpack( true );

  //
  // Set up to interpret records of type "LCD_Gismo_Event".
  //
  record = SIO_recordManager::add( "LCD_Gismo_Event" );
  if( !record )
    return( 1 );

  record->setUnpack( true );

  return( 0 );
}

// ----------------------------------------------------------------------------
// Do the conversion
// ----------------------------------------------------------------------------
 Int_t LCDreadSIOFile::GetEvent(LCDEvent* event) {
  LCDEvent* event_save=m_event;
  if (event) {
    m_event=event;
  }

  m_event->Clean();

  if (f_debug > 0)
    cout<<"LCDreadSIOFile::GetEvent event->Clean()...";
  m_event->Clean();
  if (f_debug > 0)
    cout<<"done"<<endl;


  if (f_debug > 0)
    cout<<"LCDreadSIOFile::GetEvent stream->read...start"<<endl;;
  status = stream->read( &recred );
  if (f_debug > 0)
    cout<<"LCDreadSIOFile::GetEvent stream->read...done status="<<status<<endl;
  if( !(status & 1) ) {
    if( status != SIO_STREAM_EOF ) {
      printf("------------------------------------------------------n");
      printf("Error reading SIO recordn" );
      printf("------------------------------------------------------n");
    }
    m_event=event_save;
    return 0;
  }

  if( recred == header ) {
    printf("n");
    printf("LCD Gismo Header Record Read                              n");
    printf("----------------------------------------------------------n");
    printf("Detector ID    type: %sn",    det_ID->getType()             );
    printf("              major: %dn",    det_ID->getMajor()            );
    printf("              minor: %dn",    det_ID->getMinor()            );
    printf("n");
    printf("Detector CVS header: %sn",    det_CVS->getHeader()          );
    printf("                CRC: 0x%8xn", det_CVS->getCRC()             );
    printf("n");
    printf("----------------------------------------------------------n");

    if (f_debug > 0)
      cout<<"LCDreadSIOFile::GetEvent stream->read...";
    status = stream->read( &recred );
    if (f_debug > 0)
      cout<<"done status="<<status<<endl;

    if( !(status & 1) ) {
      if( status != SIO_STREAM_EOF ) {
	printf("--------------------------------------------------n");
	printf("Error reading SIO recordn" );
	printf("--------------------------------------------------n");
      }
      m_event=event_save;
      return 0;
    }

    if( recred != record ) {
      printf("------------------------------------------------------n");
      printf("Error reading SIO record ... expected event recordn" );
      printf("------------------------------------------------------n");
      m_event=event_save;
      return 0;
    }
  }

  //event->Clean();
  ParticleList->Delete();

  if (event) {
    m_event=event_save;
  }
  return 1;
}

// ----------------------------------------------------------------------------
// SetDebugLevel
// ----------------------------------------------------------------------------
 void LCDreadSIOFile::SetDebugLevel(Int_t a) {
  f_debug=a;
  if ( EMCalorimeter)  EMCalorimeter->SetDebugLevel(a);
  if (HADCalorimeter) HADCalorimeter->SetDebugLevel(a);
  if (LUMCalorimeter) LUMCalorimeter->SetDebugLevel(a);
  if ( MUCalorimeter)  MUCalorimeter->SetDebugLevel(a);
  if (       Tracker)        Tracker->SetDebugLevel(a);
  if (           VXD)            VXD->SetDebugLevel(a);
  if (       MCPrint)        MCPrint->SetDebugLevel(a);
  if (   EventMarker)    EventMarker->SetDebugLevel(a);
}


ROOT page - Class index - Top of the page

This page has been automatically generated. If you have any comments or suggestions about the page layout send a mail to ROOT support, or contact the developers with any questions or problems regarding ROOT.