TKLugReaderVF - source file
#include "TKLugIOVF.hh"

#include "TKLDataObject.hh"
#include "TKLTrack.hh"

#include <TString.h>

const Int_t kVFLowEnergyEventSize = 40; // bytes
const Int_t kVFMuonEventSize = 48; // bytes

ClassImp(TKLugReaderVF)
////////////////////////////////////////////////////////////////////////
//
// $Id: TKLugIOVF.cc,v 1.4 2002/10/25 01:10:43 kamland0 Exp $
//
// Interface to the vector-file format, used by the RCNS analysis group 
//
// Author: Patrick Decowski
//

 TKLugReaderVF::TKLugReaderVF(const char *filename)
  : fCheckEventNumber(kFALSE), fCheckTimeStamp(kFALSE), 
  fCheckTriggerType(kFALSE), fBuffer(0)
{
  // normal constructor
  Open(filename);
}

 TKLugReaderVF::~TKLugReaderVF()
{
  Close();
}

 Bool_t TKLugReaderVF::Open(const char *filename)
{
  // Open a vector-file file
  // Files with extension .lvf or .cvf are 'LowEnergy' vector-files
  // Files with extension .mvf are 'Muon' vector-files
  // (the events in these files have different sizes and therefore don't
  // mix). 

  TString f(filename);
  if(f.EndsWith(".mvf")) {
    fFileType = kMuonFile;
    fEventSize = kVFMuonEventSize;
  } else {
    fFileType = kLowEnergyFile;
    fEventSize = kVFLowEnergyEventSize;
  }
  fBuffer = new char[fEventSize];

  fFD = new ifstream(filename);  
  if(fFD)
    return fFD->is_open();
  else
    return kFALSE;
}

 void TKLugReaderVF::Close()
{
  // Close file
  fFD->close();
  delete fFD;
  delete[] fBuffer;
  fBuffer = 0;
}

 Bool_t TKLugReaderVF::IsOpen()
{
  // Return kTRUE if file is open
  return fFD->is_open();
}

 void TKLugReaderVF::Seek(Int_t entry)
{
  // Seek to an entry in the file (counted from the beginning)
  fFD->seekg(fEventSize * entry, ios::beg);
}

 Int_t TKLugReaderVF::Tell()
{
  // return the current entry
  return fFD->tellg() / fEventSize;
}

 Int_t TKLugReaderVF::ReadEvent(TKLEvent *evtptr)
{
  // Read one event from the vector-file

  if(fFD->eof())
    return kFail;

  Int_t ret = kFail;

  switch(fFileType) {
  case kLowEnergyFile:
    ret = ReadLowEnergyEvent(evtptr);
    break;
  case kMuonFile:
    ret = ReadMuonEvent(evtptr);
    break;
  default:
    Error("ReadEvent", "Unknown filetype");
  }
  return ret;
}

 Int_t TKLugReaderVF::ReadLowEnergyEvent(TKLEvent *evtptr)
{
  // Read a low energy event from a file

  fFD->read(fBuffer, fEventSize);
  
  // This is a direct copy from KVFLowEnergyEvent.hh
  // 8byte
  short                  RunNumber; // 16bit
  unsigned long long int TimeStamp; // 48bit

  // 8byte
  unsigned int           UnixTime; // 32bit
  int                    EventNumber; // 32bit

  // 8byte
  int                    PID; // 7bit
  float                  Energy; // 17bit
  int                    EventStatus; // 4bit
  unsigned long long int TriggerType; // 36bit

  // 8byte
  float  TotalChargeID; // 32bit
  float  TotalChargeOD; // 32bit

  // 8byte
  //  float  X; // 11bit
  //  float  Y; // 11bit
  //  float  Z; // 11bit

  Float_t X[4];
  unsigned int    N100; // 11bit
  unsigned int    NhitID; // 11bit
  unsigned int    NhitOD; // 8bit

  unsigned long long int L = 0;

  Int_t offset = 0;

  // In the following data fields that are labeled 'NA' don't have 
  // an equivalent (yet?) in AKat... 
  Restore(&L, fBuffer, offset);
  offset += sizeof(L);
  RunNumber = (short)( (L >> 48) & 0x0FFFF );
  unsigned long long int HigherTimeStamp 
    = (unsigned long long int)( (L >> 32) & 0x0FFFF );
  unsigned long long int LowerTimeStamp 
    = (unsigned long long int)( L & 0x0FFFFFFFF );
  TimeStamp = (HigherTimeStamp << 32) + LowerTimeStamp;

  Restore(&L, fBuffer, offset);
  offset += sizeof(L);
  EventNumber = (int)( L & 0x0FFFFFFFF );
  UnixTime = (unsigned int)( (L >> 32) & 0x0FFFFFFFF ); // NA
  
  Restore(&L, fBuffer, offset);
  offset += sizeof(L);
  PID = (int)( (L>>60) & 0x0F ); // NA
  Energy = (float)( ( (unsigned int)( (L >> 40) & 0x0FFFFF ) )/5000.0 );
  //  EventStatus = (int)( (L >> 40) & 0x0F );
  EventStatus = (int)( (L >> 36) & 0x0F );
  unsigned long long int HigherTriggerType = (unsigned int)( (L >> 32) & 0x0F );  TriggerType = ( (HigherTriggerType << 32) | ( L & 0x0FFFFFFFF ) );
  
  Restore(&L, fBuffer, offset);
  offset += sizeof(L);
  TotalChargeOD = (float)( (L >> 32) & 0x0FFFFFFFF )/100.0; // NA
  TotalChargeID = (float)( L & 0x0FFFFFFFF )/100.0; // NA

  Restore(&L, fBuffer, offset);
  offset += sizeof(L);
  X[0] = (float)( (int)((L >> 52) & 0x07FF) - 1024);
  X[1] = (float)( (int)((L >> 41) & 0x07FF) - 1024);
  X[2] = (float)( (int)((L >> 30) & 0x07FF) - 1024);
  X[3] = 0; // T in TKLVertex
  N100 = (unsigned int)( (L >> 19) & 0x07FF ); // NA
  NhitID = (unsigned int)( (L >> 8) & 0x07FF ); // NA
  NhitOD = (unsigned int)( L  & 0x0FF ); // NA

  //  Energy /= (KVFConstHandler::RunDependenceOfVisibleEnergy(RunNumber));

  // FIXME: is this it??
  evtptr->fEventHeader.fRunNumber = RunNumber;
  evtptr->fEventHeader.fEventNumber = EventNumber;
  evtptr->fEventHeader.fTimeStamp = Double_t(TimeStamp);
  evtptr->fEventHeader.fTriggerType = TriggerType;
  evtptr->fEventHeader.fStatus = EventStatus;
  
  for(Int_t i = 0; i < 3; i++)
    X[i] *= 10; // cm -> mm 

  TKLVertex *vtx = evtptr->GimmeVertex("vector_vtx");
  vtx->SetXYZT(X);
  vtx->SetEnergy(Energy);
  // Exclude bad events
  if((vtx->GetX() == 0 && vtx->GetY() == 0 && vtx->GetZ() == 0)
     || vtx->GetX() < -9000 && vtx->GetY() < -9000) 
    vtx->SetStatus(TKLVertex::kBadFitVertex);
  else
    vtx->SetStatus(TKLVertex::kValidVertex);

  return kHasEventData;
}

 Int_t TKLugReaderVF::ReadMuonEvent(TKLEvent *evtptr)
{
  // Read a muon event
  // 
  fFD->read(fBuffer, fEventSize);

  // 8byte
  short                  RunNumber; // 16bit
  unsigned long long int TimeStamp; // 64bit

  // 8byte
  unsigned int           UnixTime; // 32bit
  int                    EventNumber; // 32bit


  // 8byte
  unsigned int           Nhit5inch; // 3bit
  unsigned int           NhitOD; // 8bit
  unsigned int           NhitID; // 11bit
  int                    EventStatus; // 4bit
  unsigned long long int TriggerType; // 36bit

  // 8byte
  //  float                  EntranceX; // 11bit
  //  float                  EntranceY; // 11bit
  //  float                  EntranceZ; // 11bit
  float                  TotalChargeID; // 31bit

  // 8byte
  unsigned int           Badness; // 28bit
  float                  DirectionX; // 12bit
  float                  DirectionY; // 12bit
  float                  DirectionZ; // 12bit

  // 8byte
  float  TotalCharge5inch; // 32bit
  float  TotalChargeOD; // 32bit

  Int_t offset=0;
  unsigned long long int L = 0;

  Restore(&L, fBuffer, offset);
  offset += sizeof(L);
  RunNumber = (short)( (L >> 48) & 0x0FFFF );
  unsigned long long int HigherTimeStamp 
    = (unsigned long long int)( (L >> 32) & 0x0FFFF );
  unsigned long long int LowerTimeStamp 
    = (unsigned long long int)( L & 0x0FFFFFFFF );
  TimeStamp = (HigherTimeStamp << 32) + LowerTimeStamp;

  Restore(&L, fBuffer, offset);
  offset += sizeof(L);
  EventNumber = (int)( L & 0x0FFFFFFFF );
  UnixTime = (unsigned int)( (L >> 32) & 0x0FFFFFFFF ); // NA
  
  Restore(&L, fBuffer, offset);
  offset += sizeof(L);
  Nhit5inch = (unsigned int)( (L>>59) & 0x07 ); // NA
  NhitOD = (unsigned int)( (L>>51) & 0x0FF );   // NA
  NhitID = (unsigned int)( (L>>40) & 0x07FF );  // NA
  EventStatus = (int)( (L>>36) & 0x0F );
  //  EventStatus = (int)( (L >> 40) & 0x0F );
  unsigned long long int HigherTriggerType = (unsigned int)( (L >> 32) & 0x0F );  TriggerType = ( (HigherTriggerType << 32) | (L & 0x0FFFFFFFF) );

  Restore(&L, fBuffer, offset);
  offset += sizeof(L);
  Float_t X[4];
  X[0] = (float)( (int)((L >> 53) & 0x07FF) - 1024);
  X[1] = (float)( (int)((L >> 42) & 0x07FF) - 1024);
  X[2] = (float)( (int)((L >> 31) & 0x07FF) - 1024);
  X[3] = 0;

  TotalChargeID = (float)( L & 0x07FFFFFFF )/10.0;

  Restore(&L, fBuffer, offset);
  offset += sizeof(L);
  Float_t dX[4];
  Badness   = (unsigned int)( (L >> 36) & 0x0FFFFFFF );
  dX[0] = (float)((int)((L >> 24) & 0x0FFF) - 2048)/2048.0;
  dX[1] = (float)((int)((L >> 12) & 0x0FFF) - 2048)/2048.0;
  dX[2] = (float)((int)(   L      & 0x0FFF) - 2048)/2048.0;
  dX[3] = 0;

  Restore(&L, fBuffer, offset);
  offset += sizeof(L);
  TotalCharge5inch = (float)( (L >> 32) & 0x0FFFFFFFF )/10.0; // NA
  TotalChargeOD = (float)( L & 0x0FFFFFFFF )/10.0; // NA

  // FIXME: is this it??
  evtptr->fEventHeader.fRunNumber = RunNumber;
  evtptr->fEventHeader.fEventNumber = EventNumber;
  evtptr->fEventHeader.fTimeStamp = Double_t(TimeStamp);
  evtptr->fEventHeader.fTriggerType = TriggerType;
  evtptr->fEventHeader.fStatus = EventStatus;

  TKLTrack *track = evtptr->GimmeTrack("vector_track");
  Double_t vpm = X[0]*dX[0] + X[1]*dX[1] + X[2]*dX[2];
  Double_t norm = -2*vpm;
  for(Int_t i = 0; i < 4; i++) {
    track->fEntrance[i] = 10.*X[i]; // cm -> mm
    track->fExit[i] = 10.*(X[i] + norm*dX[i]);
  }
  track->fStatus = 0; // means valid track
  track->fReconStatus = Int_t(Badness); // (only 28bits used)
  track->fEnergy = 0.458 * TotalChargeID; // ARBITRARY Conversion, to match AKAT Units!

  return kHasEventData;
}

unsigned long long int TKLugReaderVF::Swap(unsigned long long int value)
{
  unsigned long long int swaped;
  unsigned char* p = (unsigned char*)(&swaped);
  unsigned char* org = (unsigned char*)(&value);

  for(int i=0; i<(int)sizeof(value); i++){
    p[i] = org[sizeof(value) - i -1];
  }
  return swaped;
}

 void TKLugReaderVF::Restore(unsigned long long int* L, 
			    const char* buf, int whence) 
{
  memcpy( (void*)L, (const void*)&(buf[whence]), sizeof((*L)) );
  // FIXME: test if swapping is needed
  *L = Swap(*L);
}

 Int_t TKLugReaderVF::ReadEventOrHistory(TKLEvent* evptr)
{
  Warning("ReadEventOrHistory", "Not Implemented");
  return 0;
}

 Bool_t TKLugReaderVF::ReadOneTrigger(TKLEventHeader* trigptr)
{
  Warning("ReadOneTrigger", "Not Implemented");
  return kFALSE;
}

 Bool_t TKLugReaderVF::ReadOneWaveform(TKLOneFEEChannel* fbeptr)
{
  Warning("ReadOneWaveform", "Not Implemented");
  return kFALSE;
}

 void TKLugReaderVF::Rewind()
{
  fFD->seekg(0, ios::beg);
}


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.

Privacy and Security Notice