// ESAF : Euso Simulation and Analysis Framework
// $Id: EEvent.cc,v 1.13 2005/04/18 22:48:34 thea Exp $
// M. Pallavicini created Mar, 13 2002
#include "EEvent.hh"
#include "Etypes.hh"
ClassImp(EEvent)
EEvent* EEvent::fgCurrent = 0;
// class EEvent
//______________________________________________________________________________
EEvent::EEvent( Int_t branches ) : TObject() {
//
// Costructor
//
fHeader = new EHeader();
fTruth = new ETruth ();
fShower = (branches & kShower) ? new EShower() : 0 ;
fAtmosphere = (branches & kAtmosphere) ? new EAtmosphere() : 0;
fDetector = (branches & kDetector) ? new EDetector() : 0;
fChipTrackTrigger = (branches & kChipTrackTrigger) ? new EChipTrackTrigger() : 0;
}
//______________________________________________________________________________
EEvent::EEvent(const EEvent& other) : TObject() {
// copy ctor
other.Copy ( *this );
}
//______________________________________________________________________________
EEvent::~EEvent() {
// destructor
Clear("C");
if ( GetCurrent() == this ) SetCurrent( 0 );
}
//______________________________________________________________________________
void EEvent::Copy( TObject& other) const {
//
// Copy this to other
//
// EEvent& event = (EEvent&)other;
// TODO
}
//______________________________________________________________________________
Bool_t EEvent::BranchTree(TTree *t ) {
//
// Branch tree on EEvent data members
//
Bool_t branched = kTRUE;
// add capability not to branch on a subevent if requested
if ( fHeader ) t->Branch("header","EHeader",&fHeader);
if ( fTruth ) t->Branch("truth","ETruth",&fTruth);
if ( fShower ) t->Branch("shower","EShower",&fShower);
if ( fAtmosphere ) t->Branch("atmosphere","EAtmosphere",&fAtmosphere);
if ( fDetector ) t->Branch("detector","EDetector",&fDetector);
if ( fChipTrackTrigger ) t->Branch("trigger","EChipTrackTrigger",&fChipTrackTrigger);
return branched;
}
//______________________________________________________________________________
Bool_t EEvent::SetBranches(TTree *t ) {
//
// Sets branches addresses for reading. Returns kTRUE if all container exist
// in the tree. If one of the data member is 0 and corresponding branch
// is found, it is automatically allocated
//
Delete();
Bool_t branched = kTRUE;
TBranch *branch;
if ( (branch = t->GetBranch( "header" )) )
branch->SetAddress( &fHeader );
branched &= ( branch != 0 );
if ( (branch = t->GetBranch( "truth" )) )
branch->SetAddress( &fTruth );
branched &= ( branch != 0 );
if ( (branch = t->GetBranch( "shower" )) )
branch->SetAddress( &fShower );
branched &= ( branch != 0 );
if ( (branch = t->GetBranch( "atmosphere" )) )
branch->SetAddress( &fAtmosphere );
branched &= ( branch != 0 );
if ( (branch = t->GetBranch( "detector" )) )
branch->SetAddress( &fDetector );
branched &= ( branch != 0 );
if ( (branch = t->GetBranch( "trigger" )) )
branch->SetAddress( &fChipTrackTrigger );
branched &= ( branch != 0 );
return branched;
}
//______________________________________________________________________________
void EEvent::Build(Int_t run,Int_t ev, const char* name) {
// build header
if ( fHeader ) {
fHeader->SetNum(ev);
fHeader->SetRun(run);
fHeader->SetRunName(name);
}
}
//______________________________________________________________________________
void EEvent::Clear( Option_t* opt ) {
// clear event
TString options(opt);
if ( fHeader ) fHeader->Clear( opt );
if ( fTruth ) fTruth->Clear( opt );
if ( fShower ) fShower->Clear( opt );
if ( fAtmosphere ) fAtmosphere->Clear( opt );
if ( fDetector ) fDetector->Clear( opt );
if ( fChipTrackTrigger ) fChipTrackTrigger->Clear( opt );
if ( options.Contains("C") )
Delete();
}
//______________________________________________________________________________
void EEvent::Delete( Option_t* ) {
//
// Delete all containers
//
if ( fHeader ) delete fHeader; fHeader = 0;
if ( fTruth ) delete fTruth; fTruth = 0;
if ( fShower ) delete fShower; fShower = 0;
if ( fAtmosphere ) delete fAtmosphere; fAtmosphere = 0;
if ( fDetector ) delete fDetector; fDetector = 0;
if ( fChipTrackTrigger ) delete fChipTrackTrigger; fChipTrackTrigger = 0;
}
//______________________________________________________________________________
Bool_t EEvent::Fill( EFiller& f ) {
//
// Deliver filler to its target
//
TString target( f.GetTarget() );
EFillable* fillable;
if ( target == "ETruth" ) {
fillable = fTruth;
} else if ( target == "EShower" ) {
fillable = fShower;
} else if ( target == "EAtmosphere" ) {
fillable = fAtmosphere;
} else if ( target == "EDetector" ) {
fillable = fDetector;
} else if ( target == "EChipTrackTrigger" ) {
fillable = fChipTrackTrigger;
} else {
Error("Fill", "Filler type %s unknown",target.Data());
return kFALSE;
}
// if filled is a null pointer return
if ( !fillable ) return kFALSE;
// try to fill the selected object
Bool_t filled = fillable->Fill( f );
if ( !filled )
Error("Fill", "Unable to fill %s with filler type %s",
fillable->Class_Name(), target.Data());
return filled;
}