#include "THaEvent.h"
#include "THaVarList.h"
#include "THaGlobals.h"
#include "TROOT.h"
#include "TMath.h"
#include "TClass.h"
#include <cstring>
#include <cstdlib>
#include <fstream>
#include <string>
#include <vector>
#include <iomanip>
ClassImp(THaEventHeader)
ClassImp(THaEvent)
THaEvent::THaEvent() : fInit(kFALSE), fDataMap(NULL)
{
Class()->IgnoreTObjectStreamer();
}
THaEvent::~THaEvent()
{
delete [] fDataMap; fDataMap = NULL;
}
void THaEvent::Clear( Option_t* )
{
}
Int_t THaEvent::Fill()
{
static const char* const here = "Fill()";
if( !fInit ) {
Int_t status = Init();
if( status )
return status;
}
Int_t nvar = 0;
Int_t ncopy;
THaVar* pvar;
if( DataMap* datamap = fDataMap ) {
while( datamap->ncopy ) {
if( (pvar = datamap->pvar) ) {
if( datamap->ncopy>0 )
ncopy = datamap->ncopy;
else if( datamap->ncopyvar )
ncopy = *datamap->ncopyvar;
else {
ncopy = pvar->GetLen();
if( ncopy == THaVar::kInvalidInt )
continue;
}
Int_t type = pvar->GetType();
size_t size = pvar->GetTypeSize();
const void* src = pvar->GetValuePointer();
if( !src ) continue;
if( pvar->IsBasic() ) {
if( type >= kDoubleP ) {
void** loc = (void**)src;
src = (const void*)(*loc);
}
if( !src ) continue;
if( !pvar->IsPointerArray() )
memcpy( datamap->dest, src, ncopy*size );
else {
for( int i=0; i<ncopy; i++ ) {
const int** psrc = (const int**)src;
int* dest = static_cast<int*>( datamap->dest );
memcpy( dest+i, *(psrc+i), size );
}
}
} else {
for( int i=0, j=0; i<ncopy; i++, j++ ) {
Double_t val = pvar->GetValue(i);
if( val == THaVar::kInvalid )
continue;
switch( type ) {
case kDouble: case kDoubleP:
*(((Double_t*)datamap->dest)+j) = val;
break;
case kFloat: case kFloatP:
*(((Float_t*)datamap->dest)+j) = static_cast<Float_t>(val);
break;
case kInt: case kIntP:
*(((Int_t*)datamap->dest)+j) = static_cast<Int_t>(val);
break;
case kUInt: case kUIntP:
*(((UInt_t*)datamap->dest)+j) = static_cast<UInt_t>(val);
break;
case kShort: case kShortP:
*(((Short_t*)datamap->dest)+j) = static_cast<Short_t>(val);
break;
case kUShort: case kUShortP:
*(((UShort_t*)datamap->dest)+j) = static_cast<UShort_t>(val);
break;
case kLong: case kLongP:
*(((Long64_t*)datamap->dest)+j) = static_cast<Long64_t>(val);
break;
case kULong: case kULongP:
*(((ULong64_t*)datamap->dest)+j)= static_cast<ULong64_t>(val);
break;
case kChar: case kCharP:
*(((Char_t*)datamap->dest)+j) = static_cast<Char_t>(val);
break;
case kByte: case kByteP:
*(((Byte_t*)datamap->dest)+j) = static_cast<Byte_t>(val);
break;
default:
Warning( here, "Unknown type for variable %s "
"Not filled.", pvar->GetName() );
j--; nvar--;
break;
}
}
}
nvar += ncopy;
}
datamap++;
}
}
return nvar;
}
Int_t THaEvent::Init()
{
if( !gHaVars ) return -2;
if( DataMap* datamap = fDataMap ) {
while( datamap->ncopy ) {
if( THaVar* pvar = gHaVars->Find( datamap->name )) {
datamap->pvar = pvar;
} else {
Warning("Init()", "Global variable %s not found. "
"Will be filled with zero.", datamap->name );
datamap->pvar = NULL;
}
datamap++;
}
}
fInit = kTRUE;
return 0;
}
void THaEvent::Reset( Option_t* )
{
fInit = kFALSE;
}
Last change: Sat Nov 7 21:26:46 2009
Last generated: 2009-11-07 21:26
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.