Universita' di GenovaINFN Sezione di Genova  
AIRWATCH / EUSO Genova

EEvTreeLink - source file

// $Id: EEvent.cc,v 1.23 2005/11/14 22:42:00 thea Exp $
// Author: M. Pallavicini , 12 2002

/*****************************************************************************
 * ESAF: Euso Simulation and Analysis Framework                              *
 *                                                                           *
 *  Id: EEvent                                                               *
 *  Package: SimuEvent                                                       *
 *  Coordinator: Alessandro.Thea                                             *
 *                                                                           *
 *****************************************************************************/

#include "EEvent.hh"
#include "Etypes.hh"

#include "ETruth.hh"
#include "EHeader.hh"
#include "EGeometry.hh"
#include "EDetector.hh"
#include "EShower.hh"
#include "EAtmosphere.hh"
#include "EChipTrackTrigger.hh"
#include "ELblTrackTrigger.hh"
#include "ERunParameters.hh"

ClassImp(EEvent)
ClassImp(EEvTreeLink)

EEvent* EEvent::fgCurrent = 0;

// class EEvent
//______________________________________________________________________________
EEvent::EEvent( Int_t branches ) : fTreeLink(0) {
    //
    // Costructor
    // 

    // branches
    fHeader     = new EHeader();
    fTruth      = new ETruth();
    fGeometry   = new EGeometry();

    fShower           = (branches & kShower) ? new EShower() : 0 ;
    fAtmosphere       = (branches & kAtmosphere) ? new EAtmosphere() : 0;
    fDetector         = (branches & kDetector) ? new EDetector() : 0; 
    fChipTrackTrigger = (branches & kChipTrackTrigger) ? new EChipTrackTrigger() : 0; 
    fLblTrackTrigger  = (branches & kLblTrackTrigger) ? new ELblTrackTrigger() : 0; 

    // build pars
    fRunPars    = new ERunParameters();

}

//______________________________________________________________________________
EEvent::EEvent(const EEvent& other) : TObject() {
    // copy ctor

    other.Copy ( *this );
}

//______________________________________________________________________________
EEvent::~EEvent() {
    // destructor
    
    Delete();

    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, Bool_t link ) {
    // 
    // Branch tree on EEvent data members 
    //

    Bool_t branched = kTRUE;

    // add capability not to branch on a subevent if requested
    // branches
    if ( fHeader )             t->Branch("header","EHeader",&fHeader);
    if ( fTruth )              t->Branch("truth","ETruth",&fTruth);
    if ( fGeometry )           t->Branch("geometry","EGeometry",&fGeometry);
    
    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);
    if ( fLblTrackTrigger )    t->Branch("lbltrigger","ELblTrackTrigger",&fLblTrackTrigger);

    // pars
    if ( link ) {
        t->GetUserInfo()->Add(fRunPars);
        LinkTree(t);
    }
    return branched;

}

//______________________________________________________________________________
Bool_t EEvent::SetBranches( TTree *t, Bool_t clone ) {
    // 
    // Sets branches addresses for reading. Returns kTRUE if any of the
    // container exists in the tree. If one of the data member is 0 and
    // corresponding branch is found, it is automatically allocated.
    // If clone is true, a clone of ERunParameters (and the other eventual data
    // stored in the etree)is created and the tree is not linked.
    //
    
    if (!t) return kFALSE;

    Delete();
    
    Bool_t branched = kFALSE;
    
    TBranch *branch;
    
    // branches
    if ( (branch = t->GetBranch( "header" )) )
       t->SetBranchAddress("header", &fHeader );
    branched |= ( branch != 0 );
    
    if ( (branch = t->GetBranch( "truth" )) )
       t->SetBranchAddress("truth", &fTruth );
    branched |= ( branch != 0 );

    if ( (branch = t->GetBranch( "geometry" )) )
       t->SetBranchAddress("geometry", &fGeometry );
    branched |= ( branch != 0 );
    
    if ( (branch = t->GetBranch( "shower" )) )
       t->SetBranchAddress("shower", &fShower );
    branched |= ( branch != 0 );

    if ( (branch = t->GetBranch( "atmosphere" )) )
       t->SetBranchAddress("atmosphere", &fAtmosphere );
    branched |= ( branch != 0 );
    
    if ( (branch = t->GetBranch( "detector" )) )
       t->SetBranchAddress("detector", &fDetector );
    branched |= ( branch != 0 );

    if ( (branch = t->GetBranch( "trigger" )) )
       t->SetBranchAddress("trigger", &fChipTrackTrigger );
    branched |= ( branch != 0 );
    
    if ( (branch = t->GetBranch( "lbltrigger" )) )
       t->SetBranchAddress("lbltrigger", &fLblTrackTrigger );
    branched |= ( branch != 0 );
    
    // pars
    SafeDelete(fRunPars);

    // FIXME: temporary workaround for old rootfiles
    if ( t->GetDirectory() ) {
        TTree* runtree = (TTree*)t->GetDirectory()->Get("runtree");

        if (runtree) {
            
            runtree->SetBranchAddress("runpars", &fRunPars);
            runtree->GetEntry();
        }
    }
    
    // if runpars is still null, look for it in UserInfo
    if ( !fRunPars ) {
        ERunParameters* pars = (ERunParameters*)t->GetUserInfo()->FindObject("ERunParameters");
        if ( pars && clone )
            fRunPars = (ERunParameters*)pars->Clone();
        else {
            fRunPars = pars;
            LinkTree(t);
        }
    }
        

    return branched;

}


//______________________________________________________________________________
void EEvent::LinkTree( TTree* t ) {
    //
    //
    //

    if (!t) return;

    fTreeLink = (EEvTreeLink*)t->GetUserInfo()->FindObject("EEvTreeLink");

    if (!fTreeLink) {
        fTreeLink = new EEvTreeLink(t,this);
        t->GetUserInfo()->Add(fTreeLink);
    } else
        fTreeLink->SetEvent(this);

}

//______________________________________________________________________________
void EEvent::UnlinkTree() {
    //
    // Disconnect tree from the event. This is required before deleting the tree
    // If the tree holds ERunParameters, they are cloned and the clone is
    // stored in the tree
    // 
    
    if ( !fTreeLink ) return;

    fTreeLink->SetEvent(0);
    // runpars are hold by the tree
    fRunPars = 0;
    // and linktree as well
    fTreeLink = 0;


//    if ( !GetTree() ) return;
//
//    TList* user = GetTree()->GetUserInfo();
//
//    Bool_t clone=kTRUE;
//    TTree *fTree = GetTree(); 
//    if ( user->FindObject(fRunPars) && clone ) {
//       user->Remove(fRunPars);
//       user->Add(fRunPars->Clone());
//    }
//
//    fTreeLink = 0;
//    
//    if ( fTree && fRunPars && fTree->GetUserInfo()->FindObject(fRunPars) )
//        fTree->GetUserInfo()->Remove(fRunPars);
//
//    fTree = 0;
}

//______________________________________________________________________________
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);

    // branches
    if ( fHeader )             fHeader->Clear( opt );
    if ( fTruth )              fTruth->Clear( opt );
    if ( fGeometry )           fGeometry->Clear( opt );

    if ( fShower )             fShower->Clear( opt );
    if ( fAtmosphere )         fAtmosphere->Clear( opt );
    if ( fDetector )           fDetector->Clear( opt );
    if ( fChipTrackTrigger )   fChipTrackTrigger->Clear( opt );
    if ( fLblTrackTrigger )    fLblTrackTrigger->Clear( opt );

    // pars
    if ( fRunPars && options.Contains("C") )
        fRunPars->Clear( opt );

//    if ( options.Contains("C") )
//        Delete();  
}


//______________________________________________________________________________
void EEvent::Delete( Option_t* ) {
    //
    // Delete all containers
    // 

    // branches
    SafeDelete(fHeader);
    SafeDelete(fTruth);
    SafeDelete(fGeometry);

    SafeDelete(fShower);
    SafeDelete(fAtmosphere);
    SafeDelete(fDetector);
    SafeDelete(fChipTrackTrigger);
    SafeDelete(fLblTrackTrigger);

    // pars
    if ( IsLinked() ) 
        //
        // ERunParamters are owned by the tree.
        // Just forget about them
        //
        UnlinkTree();
    else
       SafeDelete(fRunPars); 
 
}

//______________________________________________________________________________
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 == "EGeometry" ) {
        fillable = fGeometry;
    } 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 if ( target == "ELblTrackTrigger" ) {
        fillable = fLblTrackTrigger;
    } 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; 
        
}


//______________________________________________________________________________
 EEvTreeLink::EEvTreeLink() : fEvent(0) {
    //
    // Default constructor
    //

}


//______________________________________________________________________________
 EEvTreeLink::EEvTreeLink( TTree* t ) : fEvent(0) {
    //
    //
    //

    fTreeRef = t; 
}


//______________________________________________________________________________
 EEvTreeLink::EEvTreeLink( TTree* t, EEvent* ev ) : fEvent(ev) {
    //
    // Destructor
    //

    fTreeRef = t; 
}

//______________________________________________________________________________
 EEvTreeLink::~EEvTreeLink() {
    //
    // Destructor
    //

    if ( fEvent ) fEvent->UnlinkTree();
}

About Us | EUSO Official Website | Web pages created by Roberto Pesce and Alessandro Thea - Last Update Wed Nov 16 16:57:39 2005 Wed Nov 16 16:29:22 2005