////////////////////////////////////////////////////////////////////////
/// \class RAT::DU::SOCReader
///
/// \brief Convenience class for ROOT scripts
///
/// \author P G Jones
/// \author Rob Stainforth -- contact person
///
/// REVISION HISTORY:\n
/// 25/10/2012 : P G Jones - New File.\n
/// 2014-03-26 : P G Jones - Refactor for ds review.
///
/// \details This is the recommended/best way to read a RAT::DS::SOC root file.
/// Use as follows,
/// @verbatim
/// SOCReader socReader("filename.root");
///
/// for( size_t isoc = 0; isoc < socReader.GetSOCCount(); isoc++ )
/// {
/// RAT::DS::SOC rSOC = socReader.GetSOC( isoc );
/// RAT::DS::Run rRun = socReader.GetRun();
/// }
/// @endverbatim
///
////////////////////////////////////////////////////////////////////////
#ifndef __RAT_DU_SOCReader___
#define __RAT_DU_SOCReader___
#include
#include
#include
class TChain;
namespace RAT
{
namespace DS
{
class SOC;
class Run;
}
namespace DU
{
class SOCReader : public TObject
{
public:
/// Construct the SOCReader with a filename (inc path)
///
/// @param[in] filename to open
/// @param[in] useMeta to configure DB or ignore it?
SOCReader( const std::string& filename, const bool useMeta=true );
/// Construct the SOCReader with many files to TChain together
///
/// @param[in] filenames to open
/// @param[in] useMeta to configure DB or ignore it?
SOCReader( const std::vector& filenames, const bool useMeta=true );
/// Destruct the SOCReader, delete TTrees etc...
~SOCReader();
/// Called whenever the run changes
void BeginOfRun();
/// Add a new file to the total (should restart any loops!)
///
/// @param[in] filename to add
void Add( const std::string& filename );
/// Get the soc at index
///
/// @param[in] index of the soc to return
/// @return a constant reference to the soc
/// @throws DataNotFound if event is out of range
const DS::SOC& GetSOC( const size_t index );
/// Get the count of events
///
/// @return the total number of events
size_t GetSOCCount() { return fTotalSOC; }
/// Get the run.
///
/// @return a constant reference to the run
const DS::Run& GetRun();
/// Get the run with run ID
///
/// @param[in] runID runID to find
/// @return a constant reference to the run
/// @throws DataNotFound if not appropriate run can be found
const DS::Run& GetRunByRunID( const size_t runID );
/// Get the run with index
///
/// @param[in] index of the run to return
/// @return a constant reference to the run
/// @throws DataNotFound if index is out of range
const DS::Run& GetRunByIndex( const size_t index );
/// Get the count of runs
///
/// @return the total number of runs
size_t GetRunCount() { return fTotalRuns; }
// This ROOT macro adds dictionary methods to this class.
// The number is 0 as this class is never, and should never be written to disc.
// It assumes this class has no virtual methods, use ClassDef if change this.
ClassDefNV( SOCReader, 0 );
protected:
TChain* fT; ///< The DS T Tree
TChain* fRunT; ///< The DS runT Tree
DS::SOC* fSOC; ///< The current event
DS::Run* fRun; ///< The current run
ULong64_t fCurrentSOC; ///< The current event index
ULong64_t fTotalSOC; ///< The total number of events
ULong64_t fCurrentRun; ///< The current run index
ULong64_t fTotalRuns; ///< The total number of runs
bool fUseMeta; ///< Flag to use or ignore Meta information in file. Default true.
};
} // namespace DU
} // namespace RAT
#endif