BRAT 2.4.5
Class index
Full class index
brahmlib
BRAHMS
ROOT page
// $Id: BrEventIO.cxx,v 1.15 2002/08/30 20:48:01 videbaek Exp $
//____________________________________________________________________
//                                                                   
// BrEventIO                                                      
//                                                                
// Class to write/read BrEvent data on/from a ROOT TFile. 
// The class is derived from the BrIOModule class, so that it conforms
// to the regular BrModule interface. 
//                                                                
// Description:                       
// ------------                            
// This class is meant to simplify writing BRAHMS output in ROOT
// format.  The user simply creates the object which has defaults that
// work.  Several options are also provided in case they are needed.
//                                                                
// Usage (recommended):
// -------------------
// The recommended way of using the class is like using any other
// BrModule:  Create an object and add it to some module container
// (BrModuleContainer), for example the BrMainModule container
// singleton.   
// 
// 1 to any number of files to can be specified (See
// BrIOModule::AddFile).  If more than one file is added to the
// module, one should set the BrIOModule::kBrRunFile flag in the file
// IO mode (see BrIOModule::SetIOMode).  If only one file is opened by
// the module, then the BrIOModule::kBrJobFile flag should be set. 
//
// Here's and example using the BrMainModule container object
// mainModule: 
//
//   BrEventIO* inputModule = new BrEventIO("input", "");
//   inputModule->SetIOMode(BrIOModule::kBrJobFile|BrIOModule::kBrWriteFile);
//   inputModule->AddFile("foo.root");
//   mainModule->AddModule(inputModule);
//
//   ... other modules follow 
// 
//   BrEventIO* outputModule = new BrEventIO("output", "");
//   outputModule->SetIOMode(BrIOModule::kBrJobFile|BrIOModule::kBrWriteFile);
//   outputModule->AddFile("bar.root");
//   mainModule->AddModule(outputModule);
//
// Usage (depreciated):
// -------------------
// The old, and depreciated, way of using this class, is to create an
// object (BrEventIO::BrEventIO), open the file (BrEventIO::Open) and
// then use the BrEventIO::Event(BrEvent* event) method for event by
// event writing of event objects.  Finally, the file must be closed
// using BrEventIO::Close. 
//
// The file can be opened either in READ mode for readonly operations
// or in RECREATE  mode for write operations.  The TFile APPEND option
// is not currently supported.  The default file mode is a ROOT tree.     
// The mode can be manually selected using the SetFileMode(option)
// method.                                                        
//                                                                
// Example:                                                       
//
//   BrEventIO *io = new BrEventIO("input");             
//   if (!input->Open("foo.root","READ"))
//     return;
//
//   ... More modules  
// 
//   while (kTRUE) {
//     BrEvent* inEvent  = new BrEvent("ev,0,0);
//     BrEvent* outEvent = new BrEvent("ev,0,0);
//
//     input->Event(inEvent);
//
//     if (input->IsError())
//       return;
//     if (input->IsEof())
//       return;
//
//     ... More follows here 
//
//     delete inEvent;
//     delete outEvent;
//   }
//   input->Close();                                                   
//

//
// $Id: BrEventIO.cxx,v 1.15 2002/08/30 20:48:01 videbaek Exp $
// $Author: videbaek $
// $Date: 2002/08/30 20:48:01 $
// $Copyright: 2001 BRAHMS Collaboration <brahmlib@rhic.bnl.gov>
//
// Updates
// =======
// April 15, 1999 : Videbaek
//  Changed name of event trees
//  Added include guards
// October 21, 1999: FV
//  Updates fNumBytesWritten
//  fNumBytes.. move to base class BrIOModule
//

#include "BrEventIO.h"
#include "BrEvent.h"
#include "TROOT.h"
#include "TDatime.h"
#include <BrIostream.h>

#ifndef BREVENTIO_NAME
// Was "BRAHMS ROOT I/O File"
#define BREVENTIO_NAME "BRAHMS ROOT IO File"
#endif 
#ifndef BREVENTIO_TREE_NAME
#define BREVENTIO_TREE_NAME "T"
#endif 

ClassImp(BrEventIO);



//___________________________________________________________________
 BrEventIO::BrEventIO()
  : fTopLevel(kTRUE)
{
  // Default constructor
  fNumBytesWritten = 0;
  fNumBytesRead    = 0;
  fEventNumber     = 0;
  fListOfKeys      = 0;
  fROOTFile        = 0;
  fTree            = 0;
  SetTreeParameters();
  SetName(BREVENTIO_NAME);

  for(Int_t ibranch = 0; ibranch < MaxNumEventBranches; ibranch++) 
    fBranch[ibranch] = 0;
}
//___________________________________________________________________
 BrEventIO::BrEventIO(const Char_t *name, const Char_t* title) 
  : BrIOModule(BREVENTIO_NAME, name), fTopLevel(kTRUE)
{
  //
  // Constructor. 
  // name becomes Name and Title for the Module.
  // No data file is opened this has to be done in
  // the Open() method.
  // 
  // Option can by "READ" "RECREATE"
  //

  fNumBytesWritten = 0;
  fNumBytesRead    = 0;
  fEventNumber     = 0;
  fListOfKeys      = 0;
  fROOTFile        = 0; 
  fTree            = 0; 
  SetTreeParameters();

  for(Int_t ibranch = 0; ibranch < MaxNumEventBranches; ibranch++) 
    fBranch[ibranch] = 0;
  
  //Set default file mode.
  fFileMode = BrFileTag::kTree;

#if ROOT_VERSION_CODE >= ROOT_VERSION(2,25,3)
  gROOT->GetListOfSpecials()->Add(this);
#else
  gROOT->GetListOfBrowsables()->Add(this, BREVENTIO_NAME);
#endif
}

//___________________________________________________________________
 BrEventIO::~BrEventIO()
{
  //  Destructor for BrEventIO. Close the file if open. Delete the
  //  TFile object 

  // TFile destructor deletes fTree
  // if(fTree) delete fTree;
  // TTree destructor deletes the branches!
  // for(Int_t ibranch=0;ibranch<MaxNumEventBranches;ibranch++) {
  //  if(fBranch[ibranch]) delete fBranch[ibranch];
  // }

#if ROOT_VERSION_CODE >= ROOT_VERSION(2,25,3)
  gROOT->GetListOfSpecials()->Remove(this);
#else
  gROOT->GetListOfBrowsables()->Remove(this);
#endif

  if(fROOTFile) {
    fROOTFile->Close();
    delete fROOTFile;
    fROOTFile = 0;
  }
}

//___________________________________________________________________
 Bool_t BrEventIO::Open(const Char_t *fname,const Option_t *option)
{
  // Open the file with fname. Returns kFALSE if the file can't be
  // opened. Otherwise the fFileName data member is set to the
  // corresponding filepointer.  
  //
  // Options: READ for readonly mode or RECREATE for write mode.
  //
  // RECREATE mode:
  // If option is RECREATE, a new file is created.  This object is
  // written out to indicate the file mode (Tree or Serial). If file
  // mode is to be different than the default (Tree), the
  // SetFileMode(mode) needs to be used before the Open method. 
  //
  // READ mode:  
  // if option is READ, existing file is opened.  This object is read
  // in to get information on file mode. 
  

  if (DebugLevel() > 3)
    cout << "Inside BrEventIO::Open" << endl;

  //First check to see if fROOTFile already exists, if so see if open
  if(fROOTFile) {
    if(fROOTFile->IsOpen()) {  
      Stop("Open","File %s  is already opened, " 
	   "please close before trying to open", fname);
      return kFALSE;
    }
    
    // delete fROOTFile;
    // fROOTFile = 0;
  }
  
  //Save directory we were in before coming here
  TDirectory *cursav = gDirectory; 
  
  //save option file was opened with
  fFileName   = fname;
  fFileOption = option;		
  
  if(DebugLevel() > 3) 
    cout << "File option is " << fFileOption.Data() << endl;
  
  if(!fFileOption.CompareTo("RECREATE",TString::kIgnoreCase)) {
    // Opening new file for writing, need to set the mode
    fWriteFile = kTRUE;
    
    // extra options needed???
    fROOTFile = new TFile(fFileName,"RECREATE",fFileName,1);
  }
  else {
    // Rendundant case removed 
    // if(!fFileOption.CompareTo("READ",TString::kIgnoreCase)) 
    fWriteFile = kFALSE;
    fROOTFile = new TFile(fFileName,"READ"); //extra options needed???
  }
  // Check if not here 
  //
  if(fROOTFile->IsZombie()){
    Error("Open","File is Zombie");
    fROOTFile =0;
    return kFALSE;
  }

  // Check if the file was opened.
  if (!fROOTFile || !fROOTFile->IsOpen()) {
    Stop("Open", "could not open file "%s"", fFileName.Data()); 
    gDirectory = cursav; 
    delete fROOTFile;
    fROOTFile = 0;
    return kFALSE;
  }

  // Go to the file - which we should be in anyway. 
  fROOTFile->cd();
  
  if (fWriteFile) {
    // Create a tag in the file, and write it to disk straigt away. 
    fTag = new BrFileTag(fFileMode, fROOTFile);
    fTag->Write();
    
    if (Verbose() > 10)
      cout << "Writing fFileMode = " << fFileMode << endl;
    
  }
  else {
    //essentially to read in fFileMode
    fTag = (BrFileTag*)fROOTFile->Get(BRAT_FILE_TAG_NAME);
    if (!fTag) {
      Failure("Open", "No tag found in file"); 
      return kFALSE;
    }

    // Get the file mode from the tag. 
    fFileMode = fTag->GetFileMode();
    fTag->SetFile(fROOTFile);
    if (Verbose() > 9) 
      fTag->Print();
  }
  
  // Show contents of the toplevel directory 
  if (DebugLevel() > 3)
      fROOTFile->ls();

  // Set the status variables 
  fIOStatus        = 1;
  fEof             = kFALSE;
  fError           = kFALSE;
  fNumBytesWritten = 0;
  fNumBytesRead    = 0;
  fEventNumber     = 0;
  SetStatus(kOk);

  // Now try to initialise the thing. 
  Bool_t ret_status = kTRUE;
  if (fFileMode == BrFileTag::kSerial) {
    ret_status = InitializeRootSerialFile();
  } else if (fFileMode == BrFileTag::kTree) 
    ret_status = InitializeRootTreeFile();
  else 
    Stop("Open", "file mode not one of kSerial or kTree");

  // Get back into the directory we were in before we executed this
  // method. 
  cursav->cd();          

  return ret_status;
}

//___________________________________________________________________
 Bool_t BrEventIO::InitializeRootSerialFile() 
{
  // Routine to Initialize ROOT serial file
  // This routine does nothing if in write mode.
  // If in read mode, a list of Keys is found from the event file and
  // stored in fListOfKeys.  The file header key is removed from the
  // list of keys 
 
  // Need this only for reading file
  if (fWriteFile) 
    return kTRUE;

  //Set up the keys
  fListOfKeys   = fROOTFile->GetListOfKeys(); 
  fNextKey      = new TIter(fListOfKeys);

  return kTRUE;
}

//___________________________________________________________________
 void BrEventIO::SetTreeParameters(Int_t bufSize, Int_t split) 
{
  // Set the TTree parameters buffer size and split level.  For the
  // exact meaning of these, please refer to the TTree class
  // description, and the ROOT Users Guide, chapter 12 [1]. The
  // default values should do fine for most applications.
  // 
  /* 
     References: 

[1] ROOT Users Guide */ // // The default used to be 6400 (= 25600 / 4) and 1. fBufsize = bufSize; fSplit = split; } //___________________________________________________________________ Bool_t BrEventIO::InitializeRootTreeFile() { // Routine to initialize ROOT tree file (default writing mode) // if file opened in write mode: // Create the tree // Initialize some counters // Set up a single branch with fSplit=1. Setting branches by hand // is not yet supported. // // if file opened in read mode. // Get the tree object from the file // Set counter of the number of entries in the file // Initialize some counters and flags if(fWriteFile) { // Make a tree in the file fTree = new TTree(BREVENTIO_TREE_NAME,"BRAT Event Tree"); // autosave when 5 Mbyte written fTree->SetAutoSave(5000000); // Reset some counters. fCreateBranch = kTRUE; // Make a dummy event and set that as a branch // I'm not sure we need to actually create the object here. BrEvent *dummy_event = new BrEvent("A dummy event here",0,0); fBranch[0] = fTree->Branch("event","BrEvent", &dummy_event,fBufsize,fSplit); if (DebugLevel() > 4) cout << "Branch basket size: " << fBranch[0]->GetBasketSize() << endl; delete dummy_event; } else { // Try to find the tree in the file fTree = (TTree*)fROOTFile->Get(BREVENTIO_TREE_NAME); if(!fTree) { Stop("InitializeRootTreeFile", "couldn't find TTree "%s"", BREVENTIO_TREE_NAME); return kFALSE; } // Get a pointer to the appropiate branch. fBranch[0] = fTree->GetBranch("event"); fNumEntries = (Int_t)fTree->GetEntries(); if (Verbose() > 5) cout << "Number of entries in tree is " << fNumEntries << endl; } return kTRUE; } //___________________________________________________________________ Bool_t BrEventIO::Close() { // Close the file Opened by the object. Return // kFALSE if no file was open. if (!fROOTFile) { // Failure("Close", "no file opened"); return kFALSE; } if(!fROOTFile->IsOpen()) { // Failure("Close", "file not opened"); return kFALSE; } if(fWriteFile) fROOTFile->Write(); fROOTFile->Flush(); fROOTFile->Close(); if (fListOfKeys) fListOfKeys = 0; delete fROOTFile; fROOTFile = 0; return kTRUE; } //___________________________________________________________________ Bool_t BrEventIO::SkipEvent(Int_t numevt) { // Skip events on input only // if(fWriteFile){ Warning("Skip Event","Not allowed on write"); return kFALSE; } if(fFileMode == BrFileTag::kSerial) { for(Int_t i = 0; i< numevt; i++) { // Loop until we find a BrEvent object. TKey *key = 0; do { // get the next key in the file. key = (TKey *) fNextKey->operator()(); // If no key was found, we're skipped too long if(!key) { if(Verbose() > 20) cout << "No keys left - skipped past EOF" << endl; fEof = kTRUE; return kFALSE; } } while (strcmp(key->GetClassName(), "BrEvent")); } } else if(fFileMode == BrFileTag::kTree) { // Just set the internal counter, so the next Event message will // read that event we want. fEventNumber += numevt; if (fEventNumber > fNumEntries) { if(Verbose() > 20) cout << "Skipped past EOF" << endl; fEof = kTRUE; return kFALSE; } } return kTRUE; } //___________________________________________________________________ void BrEventIO::Event(BrEvent* event) { // Reads or writes one event depending on whether we are in read // mode or write mode if(Verbose() > 20) { cout<<"BrEventIO object list"<<endl; event->ListObjects(); } if (fFileMode == BrFileTag::kSerial) ProcessRootSerialFile(event); else if (fFileMode == BrFileTag::kTree) ProcessRootTreeFile(event); else Stop("Event", "file mode not one of kTree or kSerial. " "Don't know how to read, so giving up"); if (DebugLevel() > 10) cout << "BrEventIO::Event(): at end" << endl; } //___________________________________________________________________ void BrEventIO::ProcessRootSerialFile(BrEvent *event) { // Do Serial File specific actions to read or write the file // depending on mode if write mode, simply write the object and // increment number of events written. if read mode, get the next // key, Create a dummy event using key->ReadObj(); Copy the dummy // event into the event we are passing back. increment number of // events read // Save the current directory TDirectory *cursav = gDirectory; //change to file we want to be in. fROOTFile->cd(); if (fWriteFile) { // should be this simple event->Write(); if (DebugLevel() > 10) { cout << "BrEventIO::ProcessRootSerialFile: Contents of " << fFileName << ": " << endl; gDirectory->ls(); } fEventNumber++; } else { // Loop until we find a BrEvent object. TKey *key = 0; do { // Get the next key. key = (TKey *) fNextKey->operator()(); if (!key) { Stop("ProcessRootSerialFile", "no more keys in file"); fEof = kTRUE; fIOStatus = kFALSE; cursav->cd(); //put back original directory return; } } while (strcmp(key->GetClassName(), "BrEvent")); // Read the event creating a new dummy_event BrEvent *dummy_event = (BrEvent *) key->ReadObj(); // Check and see if we got a valid event back if (dummy_event == 0){ Failure("ProcessRootSerialFile", "returned Null event"); fEof = kTRUE; fIOStatus = kFALSE; cursav->cd(); return; //put back original directory } // This is not very nice, too much time spent in allocation and // deallocation. dummy_event->Copy(*event); fEventNumber++; // Event is copied, but still accesses objects which are now // in event. The data is not actually copied; the pointers to // the data in fObjectList1 are copied to fObjectList2. // Maybe need a more sophisticated copy method. So need to // clear before deleting dummy_event->Clear(); delete dummy_event; } // else // put back original directory cursav->cd(); if (DebugLevel() > 10) cout << "BrEventIO::ProcessRootTreeSerial(): at end" << endl; return; } //___________________________________________________________________ void BrEventIO::ProcessRootTreeFile(BrEvent *event) { // Do Tree File specific actions to read or write the file depending // on mode if Write mode, set the branch address to the event // argument, then fTree->Fill(); if Read mode, set branch address to // event argument, then fTree->GetEvent(fEventNumber); // I'm not sure that is fixed yet. - cholm // #if ROOT_VERSION_CODE <= ROOT_VERSION(3,1,6) // FIXME: // Hack to avoid writting TStreamerInfo to histogram file // Will disappear in later ROOT version TDirectory* savDir = gDirectory; fROOTFile->cd(); // #endif if (fWriteFile) { // Set the address. fBranch[0]->SetAddress(&event); // and then fill the tree fNumBytesWritten+= fTree->Fill(); if (DebugLevel() > 5) cout << "Written " << fNumBytesWritten << " bytes to TTree" << endl; if (DebugLevel() > 30) fROOTFile->ls(); } else { // If we're at the end of the tree, stop if(fEventNumber >= fNumEntries) { Stop ("ProcessRootTreeFile", "At EOF"); fEof = kTRUE; gDirectory = savDir; return; } // Set the address fBranch[0]->SetAddress(&event); // now get the entry in the tree. fNumBytesRead += fTree->GetEvent(fEventNumber); Info(15 ,"ProcessRootTreeFile()", " Read %d bytes", fNumBytesRead ); fEventNumber++; } if (DebugLevel() > 10) cout << "BrEventIO::ProcessRootTreeFile(): at end" << endl; // FIXME: // I'm not sure that is fixed yet. // #if ROOT_VERSION_CODE <= ROOT_VERSION(3,1,6) // Hack to avoid writting TStreamerInfo to histogram file // Will disappear in later ROOT version gDirectory = savDir; gDirectory->cd(); // #endif } //___________________________________________________________________ void BrEventIO::SetFileMode(BrFileTag::EFileMode mode) { // Set file mode. // mode can be either BrFileTag::kTree or BrFileTag::kSerial // mode must be set before opening the file. if(fROOTFile) { Failure("SetFileMode", "File mode must be selected before file is openedn" "File mode has been selected to be %d and will remain so", fFileMode); return; } if (mode != BrFileTag::kSerial && mode != BrFileTag::kTree) { Failure("SetFileMode", "Invalid file mode, can only be kSerial (%d) " "or kTree (%d) was %d", BrFileTag::kSerial, BrFileTag::kTree, mode); return; } fFileMode = mode; } //___________________________________________________________________ void BrEventIO::Browse(TBrowser* b) { if (fTopLevel) ; if (fROOTFile) fROOTFile->Browse(b); } //___________________________________________________________________ void BrEventIO::Print(Option_t* option) const { // Print information on this module // Options: // Z Print file tag // T Print tree info (TTree::Print) // F Print file info (TFile::Print) // See also BrIOModule::Print. TString opt(option); opt.ToLower(); BrIOModule::Print(option); if (opt.Contains("z") && fTag) fTag->Print(option); if (opt.Contains("t") && fTree) fTree->Print(option); if (opt.Contains("f") && fROOTFile) fROOTFile->Print(option); if (opt.Contains("d")) cout << endl << " Original author: Kris Hagel" << endl << " $Author: videbaek $" << endl << " $Date: 2002/08/30 20:48:01 $" << endl << " $Revision: 1.15 $ " << endl << endl << "-------------------------------------------------" << endl; } //___________________________________________________________________________ ostream& operator<< (ostream & os,BrEventIO* io) { os << "Event IO; fFileMode =" << io->GetFileMode() << endl; return os; } //___________________________________________________________________________ ostream& operator<< (ostream & os,BrEventIO& io) { os<< "Event IO; fFileMode =" << io.GetFileMode() << endl; return os; } //___________________________________________________________________________ // // $Log: BrEventIO.cxx,v $ // Revision 1.15 2002/08/30 20:48:01 videbaek // Verbosity level was too low at 1 for listobjects. // Needs to be at least ~10 since 5 will list event number. // // Revision 1.14 2002/08/30 16:21:17 hagel // Label verbosity if so specified // // Revision 1.13 2002/08/06 19:06:21 hagel // Add verbosity to check input objects // // Revision 1.12 2002/06/07 16:08:11 videbaek // Add a check for Zombie files. This was needed when creating a file list // that had did not exist. // // Revision 1.11 2001/12/14 15:37:40 cholm // Modified the classes to allow the concept of file set, introduced via // BrIOModule. Also use new Info method rather than explicit // if (Verbose() > 4) // cout << "Opening file ladida" << endl; // // Revision 1.10 2001/10/15 17:53:16 ouerdane // small error in SkipEvent, changed if (!fWriteFile) to if (fWriteFile) // // Revision 1.9 2001/08/30 15:18:07 brahmlib // Fix for ROOT 3.02/00 // // Revision 1.8 2001/08/22 09:19:00 cholm // Fixed a problem in the Open method, that I accidently introduced when // cleaning up the stuff. fEventNumber was never reset to 0 (zero) which // caused the ProcessTreeFile to fail at some point. // // Revision 1.7 2001/08/21 16:05:53 cholm // Added a method to set the buffer size and split level on the TTrees. // It turned out, that with the default setting (64000, 1), we (@ nbi) // got serious problems reading back files. An investigation gave: // // buffer // split 100 2000 4000 6400 16000 32000 // 0 n/a n/a ok bad n/a n/a // 1 ok ok bad bad bad bad // 2 ok n/a n/a ok ok ok // 3 ok n/a n/a ok ok ok // // n/a means I was lazy and didn't do the test. I've set the default to // 32000/1. See also the ROOT Users Guide chapter 12. // // Revision 1.6 2001/08/13 16:47:15 ouerdane // Added a new fixe for non existing files (mode READ) in the method Open : // It was not enough to check if the pointer existed or not, // TFile::Open always returns a valid pointer even if the // file does NOT exist. One has also to check if the // file is opened with TFile::IsOpen. Now done. // // Revision 1.5 2001/07/27 10:36:30 cholm // Fixed problem when files does not exist. Also added comments in many // places. // // Revision 1.4 2001/06/25 07:38:34 cholm // Removed Eun-Joo's previous erroneous change // // Revision 1.3 2001/06/22 18:02:21 ejkim // Made new BrEventIO compatible with earlier files (while keeping BrFileTag stuffmake install! // // Revision 1.2 2001/06/22 11:19:28 cholm // Removed custom streamer and old code for persistent BrEventIO // // Revision 1.1.1.1 2001/06/21 14:55:07 hagel // Initial revision of brat2 // // Revision 1.27 2001/06/04 13:36:12 cholm // Changes to use BrPathManager, BrVersion, and perpare to use BrFileTag. // // Revision 1.26 2001/05/31 13:12:46 cholm // Minor fixes // // Revision 1.25 2001/05/31 01:37:33 cholm // Fix of TStreamerInfo problem // // Revision 1.24 2001/03/12 18:46:35 cholm // Fixed a few mistakes. Added a hack to histogram module, to make // sure it's file is closed as the very last thing in Finish. // // Revision 1.23 2001/03/07 12:15:42 cholm // * Defined standard BrModule methods in BrIOModule. // * Add the (simple) class BrHistIOModule. // * BrAppOptionManager and BrAppOption classes changed to not use // BrExceptions. // * Added the method Int_t BrMainModule::Main() to do EVERYTHING. // * Made the method BrModule::Info() const obsolete in favour of // BrModule::Print(Option_t* option="B") const. Impact on other classes. // // Revision 1.22 2001/01/23 16:32:26 cholm // Hack to make rootcint (CINT) ignore variadic arguments in BrException // classes. // fixed module stremaers. // // Revision 1.21 2001/01/22 19:58:25 cholm // Corrected const-ness of BrAppOption::Compare for old ROOT versions. // Fixed BrModule::Streamer to work with new ROOT. Changed the avaliable // module status values to kStop, kFailure, kAbort, and updated // BrModuleContainer and BrModule accordingly. Also renamed BrIOModule::fStatus // to BrIOModule::fIOStatus. BrEventIO uses Stop, Failure, and Abort now. // Also fix of BrEventIO::Streamer for ROOT 3.00/00+ // // Revision 1.20 2000/11/15 16:17:39 videbaek // file cleanup // // Revision 1.19 2000/10/03 19:29:58 cholm // Made IsFolder() const (since it is in TObject) which was needed for the // objects to be browsable. Aslo, as of ROOT version 2.25.02 there's a list // of special objects, which BrEventIO now is added to. Some doc to // BrEventNode::Clear() added! Added method BrEventNode::SetOwner(). // Christian Holm // // Revision 1.18 2000/06/28 09:03:01 hagel // Added const to various char's in BrEventIO + BrIOMOdule // // Revision 1.17 2000/06/03 18:20:48 videbaek // Maded BrEbentIO derice from BrModule and related changes. // // Revision 1.16 2000/04/14 22:00:00 cholm // Revisited build system completly. See brahms-dev-l archive // for more information // // Revision 1.15 2000/04/14 15:19:45 cholm // Bug correction of bug introduced in 1.5.5 by me - sorry. No OK. // // Revision 1.14 2000/04/13 00:02:28 cholm // Added methods for browsing BrEvents, either directly or via // a BrEventIO. Also added method GetROOTFile to BrEventIO. // // Revision 1.13 2000/04/08 00:14:31 cholm // Changed the key for stored object from "BRAHMS ROOT I/O File" // to "BRAHMS ROOT IO File", since ROOT's Get() method understands // the '/' as a directory seperator. // // Revision 1.12 2000/04/07 20:29:35 cholm // Added targets "realclean" and "distclean", to _really_ clean up // the working directories. Also made output on stdout conditional on // Verbose(), to minimize output in batch jobs, etc. // // Revision 1.11 2000/04/06 20:17:49 cholm // Added the classes BrAppOption, BrAppOptionManager, and // BrDetectorList. The first two are for command line processing, // the third for easy detector list, can be used for many purposes. // // Revision 1.10 2000/02/17 21:34:46 videbaek // // iNo real change - // // Revision 1.9 1999/12/30 19:43:08 videbaek // Simple cleanup of code // // Revision 1.8 1999/10/22 18:32:59 videbaek // Added code for getting bytes read written properly. // Now all in base Class BrIOModule // // Revision 1.7 1999/04/21 14:48:04 videbaek // Added Methods SetHistOn() .. see comments // Changed name of Tree from example.. // //

This page automatically generated by script docBrat by Christian Holm

Copyright ; 2002 BRAHMS Collaboration <brahmlib@rcf.rhic.bnl.gov>
Last Update on by

Validate HTML
Validate CSS