Hello Rooters,
I have a question concerning the ownership of some ROOT objects.
In the below attached example I have a class derived from TFile which
contains a TBranch and a TTree object. The class is used either for
reading or for writing.
Do I have to release the storage for the TTree object in the case of
TMirrorEventFile::WriteMirrorEvent() ?
Obviously not, because I get a SEGV when doing delete fTree. But if this
is handled somewhere internally then delete fTree should do nothing ?
I am using Root 2.24/05 (root_v2.24.Linux.2.2.14).
Thanks
Hermann-Josef
-----------------------------------------------------------------------
#include <stdlib.h>
#include <stream.h>
#include <TFile.h>
#include <TTree.h>
#include "MiEventFile.hh"
TMirrorEventFile::TMirrorEventFile() : TFile("data.root"),
fBranch(0),
fEvent(0),
fFileName("data.root"),
fTree(0) {}
TMirrorEventFile::TMirrorEventFile( const char *fname, Option_t *option="",
const char *ftitle="", Int_t compress=1 ) :
TFile(fname, option, ftitle, compress),
fBranch(0),
fEvent(0),
fFileName(fname),
fTree(0) {}
TMirrorEventFile::~TMirrorEventFile()
{
// Obviously the TFile is the owner of these objects
if ( fTree ) delete fTree;
}
void TMirrorEventFile::Close( Option_t *option="" )
{
// file was opened in write mode ...
if ( TFile::GetBytesWritten() ) {
TFile::Write();
// fTree = 0;
fBranch = 0;
}
// cout << TFile::GetBytesWritten() << endl;
// cout << TFile::GetBytesRead() << endl;
// file was opened in read mode ...
if ( TFile::GetBytesRead() ) {
fTree = 0;
fBranch = 0;
}
TFile::Close( option );
fEvent = 0; // now this address is invalid
}
Bool_t TMirrorEventFile::ReadMirrorEvent( TMirrorEvent** event )
{
Bool_t valid_event = kFALSE, file_end = kFALSE;
if ( !fTree ) {
fTree = (TTree *)fFile->Get( "EventTree" );
if ( !fTree ) {
cerr << "No Tree with given name found !" << endl;
return kFALSE;
}
fNentries = (Int_t)fTree->GetEntries();
}
fBranch = fTree->GetBranch( "EventBranch" );
if ( !fBranch ) {
cerr << "No branch with name 'EventBranch' found !" << endl;
return kFALSE;
}
while ( fBranch && !valid_event && !file_end ) {
fBranch->SetAddress( event );
if ( fCurrentEvent < fNentries ) {
valid_event = kTRUE;
fTree->GetEvent( fCurrentEvent );
fCurrentEvent++;
}
else {
cout << "End of file reached !" << endl;
file_end = kTRUE;
}
}
if ( valid_event )
return kTRUE;
else
return kFALSE;
}
Bool_t TMirrorEventFile::WriteMirrorEvent( TMirrorEvent** event )
{
if ( !fTree ) {
fEvent = *event;
fTree = new TTree( "EventTree", "simple save tree" );
if ( !fTree ) {
cerr << "Could not create Tree !" << endl;
return kFALSE;
}
fTree->SetAutoSave( 1000000 ); // autosave when 1M written
// create branch not in split mode !
// Note: this calls internally TMirrorEvent() and ~TMirrorEvent()
// which is not quite clear to me ...
fTree->Branch( "EventBranch", "TMirrorEvent", event, 64000, 0 );
}
if ( *event != fEvent ) {
cerr << "Changed address of data buffer !" << endl;
return kFALSE;
// fTree->Branch( "EventBranch", "TMirrorEvent", event, 64000, 0 );
}
fTree->Fill();
return kTRUE;
}
**************************************************************************
* *
* Dr. Hermann-Josef Mathes *
* KASCADE & AUGER Collaboration *
* Forschungszentrum Karlsruhe Phone: +49 7247 822429 *
* Institut fuer Kernphysik FAX: +49 7247 824075 *
* POB 3640 *
* D-76021 Karlsruhe/Germany Mail: mathes@ik3.fzk.de *
* hjmathes@web.de *
* *
**************************************************************************
* Feel free to visit my homepage: *
* http://www-ik3.fzk.de/~mathes/Welcome.html *
* My software project page for DAQ: *
* http://www-ik3.fzk.de/~mathes/software/software.html *
* *
* Visit the institute and project homepages: *
* http://www-ik3.fzk.de/ *
* http://www-ik1.fzk.de/KASCADE_home.html *
**************************************************************************
This archive was generated by hypermail 2b29 : Tue Jan 02 2001 - 11:50:34 MET