//  $Id: BrGeantData.cxx,v 1.3 1998/04/06 21:12:11 videbaek Exp $
//  $Log: BrGeantData.cxx,v $
//  Revision 1.3  1998/04/06 21:12:11  videbaek
//  Clean up and additions for Win95
//
//  Revision 1.2  1998/03/06 22:10:01  videbaek
//  Working update
//
//  Revision 1.1.1.1  1998/03/04 21:33:10  brahmlib
//  Brat geant
//
//
#include <stdlib.h>
#include <math.h>
#ifdef UNIX
#include <unistd.h>
#endif

// #include "BratDefines.h"
#include "BrGeantData.h"
#include "BrDataTable.h"
#include "BrGeantHit.h"
#include "BrGeantTrack.h"
#include "BrEvent.h"
#include <iostream.h>


ClassImp(BrGeantData)

const int END_OF_STREAM_EVENT = -1;
const int EVENT_STREAM_HEADER = 1;
const int EVENT_STREAM_HIT = 2;
const int EVENT_STREAM_TRACK =  3;


//#define _BRDEBUG

////////////////////////////////////////////////////////////////
//                                                            //
// BrGeantData provides an interface to GBRAHMS output       //
//                                                            //
////////////////////////////////////////////////////////////////

  BrGeantData::BrGeantData()
{
//  Constructor. Set fFilePointer and fEventCounter to NULL
#ifdef _BRDEBUG
  cout << "Ctor : BrGeantData " << endl;
#endif
    fFilePointer  = NULL;
    fEventCounter = 0;
    rHeader = kFALSE;
    
}

  BrGeantData::BrGeantData(Char_t *filename)
{
  // Constructor. Set fFilePointer and fEventCounter to NULL
  // and open the file pointed to by *filename. Open also
  // reads the file header.
  // This is a problem. A constructor cannot return a type and thus not
  // assign any reasonable value.
  // 

    fFilePointer  = NULL;
    fEventCounter = 0;
    rHeader = kFALSE;
    Open(filename);
}

  Bool_t BrGeantData::Open(Char_t *fname)
{
// Open the ASCII data file *fname. Returns kFALSE
// if the file can't be opened.
// Otherwise the fFileName data member is set to the 
// corresponding filepointer. The file header is read

    if(!fname)
    {
        printf("Can't open file NULLn");
        return kFALSE;
    }

#ifdef _BRDEBUG
    cout << "Opening File "<< fname << endl;
#endif
    sprintf(fFileName,"%s",fname);
    fFilePointer = new ifstream();
    if(!fFilePointer) {
       printf("Can't create fFilePointer object %s\n",fFileName);
       return kFALSE;
       }
    fFilePointer->open(fFileName,ios::binary|ios::in);
    if(fFilePointer->fail()) {
      printf("Can't open File %s\n",fFileName);
      delete fFilePointer;
      fFilePointer = NULL;
      return kFALSE;
    }
    else {
      return ReadStreamHeader();
    }
}

  Bool_t BrGeantData::Close()
{
// Close the file pointed to by fFilePointer. Returns 
// kFALSE if no file was open.

    if(fFilePointer)
    {
        fFilePointer->close();
	delete fFilePointer;
        fFilePointer = NULL;
        return kTRUE;
    }
    else
    {
        return kFALSE;
    }
}

 Bool_t BrGeantData::ReadStreamHeader()
{
  Int_t i, ivol;
  Int_t nb = 4;
  
  Char_t*  VolumeName;
  
  
  Char_t * numvol = (Char_t *) (&fNumberOfVolumes);

  fFilePointer->read(numvol,nb);
#ifdef _BRDEBUG
    int ik= fFilePointer->eof();
    cout << ik << " " << fNumberOfVolumes << endl;
#endif
  if(fNumberOfVolumes > MAXGVOLU){
    cout << "Try to convert file first " << endl;
    return kFALSE;
  };

  for(ivol=0; ivol<fNumberOfVolumes; ivol++) {
    Char_t *bufp = (Char_t*) (&fVolume[ivol]);
    int vsize = sizeof(GeantVolume);

    fFilePointer->read(bufp, vsize);
#ifdef _BRDEBUG
    int ik= fFilePointer->eof();
    cout << "Reading volume #"<< ivol << " " << ik << endl;
#endif

    VolumeName = fVolume[ivol].Name;
    VolumeName[sizeof(fVolume[ivol].Name)] = 0;
    //   VolumeName[sizeof(fVolume[ivol].Name)] = 0;
    //need to do this because fortran(geant?) pads with blank (32)
    for(i=0;i<sizeof(fVolume[ivol].Name);i++) {
      if(fVolume[ivol].Name[i] == 32) fVolume[ivol].Name[i] = 0;
    }

  }
SetrHeader( kTRUE );
return kTRUE;
}

 BrEvent* BrGeantData::GetNextEvent()
{
// Reads one event from the stream i/o data file. A BrEvent 
// object is created and the hitlist and tracklist for 
// this object is filled with data read from the file. 
// 
// Releasing the memory for this event is the responsibility
// of the function/macro calling GetNextEvent()
// The memory
// is completely released by a call to the BrEvent destructor
// (e.g. delete event;)

  Int_t      rectyp=0,nb,ivol;
  Char_t*    bufp;
  Int_t      EventHeader[2];

  Char_t     name[64];
  
  GeantStreamHits fHits;
  GeantStreamTracks fTracks;
  
  BrDataTable *HitBuffer[20];
#ifdef _BRDEBUG  
  printf("Create new event\n");
  cout << "Number of Volumes " << fNumberOfVolumes << endl;
#endif  
  BrEvent *event = new BrEvent("Geant",0,0);
  //
  // Create new data container for Geant Tracks and
  // Geant Hits (for each of the possible volumes
  //
  BrDataTable *TrackBuffer = new BrDataTable("GeantTracks");
  for(ivol=0;ivol<fNumberOfVolumes;ivol++) {
    if(fVolume[ivol].Active == 1 ){
      sprintf(name,"GeantHits %sx0",fVolume[ivol].Name);
#ifdef _BRDEBUG
      cout << " Adding Object " << name << endl;
#endif
      HitBuffer[ivol] = new BrDataTable(name);
      event->AddObject(HitBuffer[ivol]);
    }
  }
  
  event->AddObject(TrackBuffer);
  event->GetEventHeader()->SetRunNumber(0);
  event->GetEventHeader()->SetEventNumber(fEventCounter);
  
  while(rectyp != END_OF_STREAM_EVENT) {
    nb = 4;
    bufp = (char*) &rectyp;
    fFilePointer->read(bufp, nb);
    int ik = fFilePointer->eof();
#ifdef _BRDEBUG
    cout << ik << endl;
#endif
    if(fFilePointer->eof()) {
      cout<<"End of STREAM file found: closing file"<<endl;
      delete event;		//clean up since not returning it
      fFilePointer->close();
      fFilePointer = NULL;
      return NULL;
    }
    if(fFilePointer->bad()) cout << "Unexpected Bad file\n";

    switch (rectyp) {
    case END_OF_STREAM_EVENT:
      break;
    case  EVENT_STREAM_HEADER:
      nb = sizeof(EventHeader);
      bufp = (char*) EventHeader;
      fFilePointer->read(bufp,nb);
      break;
    case  EVENT_STREAM_TRACK:
      nb = sizeof(GeantStreamTracks);
      bufp = (char*) &fTracks;
      fFilePointer->read(bufp,nb);
      if(fFilePointer->bad()) cout<<"1Bad status"<<endl;
      if(fFilePointer->eof()) cout<<"1EOF status"<<endl;
      if(fFilePointer->fail()) cout<<"1Fail status"<<endl;
      TrackBuffer->Add(new BrGeantTrack(fTracks));
      break;
    case  EVENT_STREAM_HIT:
      nb = sizeof(GeantStreamHits);
      bufp = (char*) & fHits;
      fFilePointer->read(bufp,nb);
      if(fFilePointer->bad()) cout<<"Bad status"<<endl;
      if(fFilePointer->eof()) cout<<"EOF status"<<endl;
      if(fFilePointer->fail()) cout<<"Fail status"<<endl;
      ivol = fHits.DetectorId - 1; //-1 needed because indices start at 0
      if( fHits.dedx > 0 ) {
	HitBuffer[ivol]->Add(new BrGeantHit(fHits));
      }
      else {
	int ijk = 0;//for debugger
      }
      break;
    default:
      //          This should not happen!!!
      cout<<"*** Problem in data:" << endl;
      cout << "rectype in stream file is " << rectyp<< endl;
      break;
    }
  }
  
  sprintf(name,"event_%d_%d",event->GetRunNumber(),event->GetEventNumber());
  event->SetName(name);
  sprintf(name,"BRAHMS  Event %d %d",event->GetRunNumber(),event->GetEventNumber());
  event->SetTitle(name);
//  printf("Event %d has %d tracks n",
//	 event->EventNumber(),
//	 TrackBuffer->GetEntries());

  fEventCounter++;
  return event;
}






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.