// @(#)root/proof:$Name:  $:$Id: TEventIter.cxx,v 1.2 2002/02/12 17:53:18 rdm Exp $
// Author: Maarten Ballintijn   07/01/02

/*************************************************************************
 * Copyright (C) 1995-2001, Rene Brun and Fons Rademakers.               *
 * All rights reserved.                                                  *
 *                                                                       *
 * For the licensing terms see $ROOTSYS/LICENSE.                         *
 * For the list of contributors see $ROOTSYS/README/CREDITS.             *
 *************************************************************************/

//////////////////////////////////////////////////////////////////////////
//                                                                      //
// TEventIter                                                           //
//                                                                      //
//////////////////////////////////////////////////////////////////////////

#include "TEventIter.h"

#include "TDSet.h"
#include "TSelector.h"
#include "TKey.h"
#include "TFile.h"
#include "TCollection.h"
#include "TError.h"
#include "TTree.h"


//------------------------------------------------------------------------

ClassImp(TEventIter)


//______________________________________________________________________________
TEventIter::TEventIter()
{
}


//______________________________________________________________________________
TEventIter::~TEventIter()
{
}


//------------------------------------------------------------------------

ClassImp(TEventIterLocal)


//______________________________________________________________________________
TEventIterLocal::TEventIterLocal()
{
   // Default ctor.

   fIsTree   = kFALSE;

   fFiles    = 0;
   fNextFile = 0;
   fFile     = 0;

   fKeys     = 0;
   fNextKey  = 0;
   fObj      = 0;

   fTree     = 0;
}

//______________________________________________________________________________
TEventIterLocal::TEventIterLocal(TDSet *dset)
{

   fIsTree = dset->IsTree();

   fFiles = dset->GetListOfElements();
   fNextFile = new TIter(fFiles);
   fFile     = 0;

   if ( fIsTree ) {
      // ...
   } else {
      fClassName = dset->GetType();
   }

   fKeys     = 0;
   fNextKey  = 0;
   fObj      = 0;

   fTree     = 0;
   fMaxEntry = -1;
}


//______________________________________________________________________________
TEventIterLocal::~TEventIterLocal()
{
   // TODO: check cleanup

   delete fNextFile;
   delete fFile;

   // delete fKeys; ? who owns it?
   delete fNextKey;
   delete fObj;

   // delete fTree; ? who owns it
}


//______________________________________________________________________________
Bool_t TEventIterLocal::Init(TSelector *selector)
{
   if ( fIsTree ) {
      LoadNextTree();
   }

   selector->Begin(fTree);

   return kTRUE;
}


//______________________________________________________________________________
Bool_t TEventIterLocal::GetNextEvent(TSelector *selector)
{
   Bool_t   ok;

   if ( fIsTree ) {
         ok = GetNextEventTree(selector);
   } else {
         ok = GetNextEventObj(selector);
   }

   return ok;
}


//______________________________________________________________________________
Bool_t TEventIterLocal::GetNextEventTree(TSelector *selector)
{

   if ( fFiles == 0 ) {
      ::Warning("TEventIterLocal::GetNextEvent", "Not initialized");
      return kFALSE;
   }

   while ( kTRUE ) {
      if ( fMaxEntry == -1 ) {

         Bool_t ok = LoadNextTree();

         if ( !ok ) return kFALSE;

         selector->Notify();
      }

      if ( ++fEntry < fMaxEntry ) {

         // selector->SetEvent( fIevent );

         fTree->GetEntry(fEntry);
         return kTRUE;

      }

      // Done with this file
      fMaxEntry = -1;

   }

}

//______________________________________________________________________________
Bool_t TEventIterLocal::LoadNextTree()
{
   delete fFile; fFile = 0;
   TDSetElement *elem;
   if ( (elem = (TDSetElement*) fNextFile->Next()) == 0 ) {
         // Done with all files
         return kFALSE;
   }

   Info("TEventIterLocal::LoadNextTree","Next File: %s", elem->GetFileName());

   // need to do possible grid translation

   fFile = new TFile(elem->GetFileName());
   if ( fFile->IsZombie() ) {
      Warning("TEventIterLocal::LoadNextTree","Error opening %s",
               elem->GetFileName());
      return kFALSE;
   }

   if ( elem->GetDirectory() != 0 )
      fFile->Cd(elem->GetDirectory());

   fTree = (TTree *) fFile->Get(elem->GetObjName());

   fMaxEntry = fTree->GetEntries();
   fEntry = -1;

   return kTRUE;
}


//______________________________________________________________________________
Bool_t TEventIterLocal::GetNextEventObj(TSelector *selector)
{
   TKey  *next;

   if ( fFiles == 0 ) {
      ::Warning("TEventIterLocal::GetNextEvent", "Not initialized");
      return kFALSE;
   }

   Info("TEventIterLocal::GetNextEventObj","fkeys %p", fKeys );
   while ( kTRUE ) {
      if ( fKeys == 0 ) {
         delete fFile; fFile = 0;
         TDSetElement *elem;
         if ( (elem = (TDSetElement*) fNextFile->Next()) == 0 ) {
               // Done with all files
               return kFALSE;
         }

         Info("TEventIterLocal::GetNextEventObj","Next File: %s", elem->GetFileName());

         // need to do possible grid translation

         fFile = new TFile(elem->GetFileName());   // TODO: check result

         // cd to dir

         fKeys = fFile->GetListOfKeys();
         fNextKey = new TIter(fKeys);
      }

      if ((next=(TKey*)(*fNextKey)()) ) {
         next->Print();
         if ( fClassName != next->GetClassName() )
            continue;

         delete fObj;
         fObj = next->ReadObj();
         selector->SetObject( fObj );

         return kTRUE;

      }

      // Done with this file
      delete fNextKey; fNextKey = 0;
      fKeys = 0;

   }

}


//------------------------------------------------------------------------

ClassImp(TEventIterSlave)


//______________________________________________________________________________
 TEventIterSlave::TEventIterSlave()
{
   // Default ctor.

   fSocket = 0;
}

//______________________________________________________________________________
 TEventIterSlave::TEventIterSlave(TSocket *socket)
{
   fSocket = socket;
}


//______________________________________________________________________________
 TEventIterSlave::~TEventIterSlave()
{
}


//______________________________________________________________________________
 Bool_t TEventIterSlave::Init(TSelector *selector)
{
   return kFALSE;
}


//______________________________________________________________________________
 Bool_t TEventIterSlave::GetNextEvent(TSelector *selector)
{
   return kFALSE;
}


ROOT page - Class index - Top of the page

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.