Private Attributes

BCDataSet Class Reference

A class representing a set of data points. More...

#include <BCDataSet.h>

List of all members.

Public Member Functions

Constructors and destructors

 BCDataSet ()
virtual ~BCDataSet ()
Member functions (get)

unsigned int GetNDataPoints ()
unsigned int GetNValuesPerPoint ()
BCDataPointGetDataPoint (unsigned int index)
std::vector< double > GetDataComponents (int index)
Member functions (miscellaneous methods)

int ReadDataFromFile (const char *filename, const char *treename, const char *branchnames)
int ReadDataFromFile (const char *filename, int nvariables)
int ReadDataFromFileTree (const char *filename, const char *treename, const char *branchnames)
int ReadDataFromFileTxt (const char *filename, int nvariables)
void AddDataPoint (BCDataPoint *datapoint)
void Reset ()
void Dump ()

Private Attributes

BCDataVectorfBCDataVector

Detailed Description

A class representing a set of data points.

Author:
Daniel Kollar
Kevin Kröninger
Version:
1.0
Date:
08.2008 This class represents a data set containing a set of data points. The data points are organized in a vector. The class provides functions to read in data from a file.

Definition at line 36 of file BCDataSet.h.


Constructor & Destructor Documentation

BCDataSet::BCDataSet (  ) 

Definition at line 25 of file BCDataSet.cxx.

{
   fBCDataVector = 0;
}

BCDataSet::~BCDataSet (  )  [virtual]

Definition at line 32 of file BCDataSet.cxx.

{
   if (fBCDataVector)
      delete fBCDataVector;
}


Member Function Documentation

void BCDataSet::AddDataPoint ( BCDataPoint datapoint  ) 

Adds a data point to the data set.

Parameters:
datapoint The data point to be added

Definition at line 332 of file BCDataSet.cxx.

{

   // check if memory for the vector has been allocated and
   // allocate if not.
   if (fBCDataVector == 0)
      fBCDataVector = new BCDataVector();

   // add data point to the data set.
   fBCDataVector -> push_back(datapoint);

}

void BCDataSet::Dump (  ) 

Dump the data to the standard output

Definition at line 359 of file BCDataSet.cxx.

{
   if (!fBCDataVector)
   {
      BCLog::Out(BCLog::error, BCLog::error, "BCDataSet::Dump : Data set is empty. Nothing to dump.");
      return;
   }

   std::cout << std::endl
      << "Dumping dataset:" << std::endl
      << "----------------" << std::endl
      << " - number of points:            " << fBCDataVector -> size() << std::endl
      << " - number of values per point:  " << this -> GetDataPoint(0) -> GetNValues() << std::endl
      << " - values:" << std::endl;
   unsigned int n = this -> GetDataPoint(0) -> GetNValues();
   for (unsigned int i=0; i< fBCDataVector -> size(); i++)
   {
      std::cout << Form("%5d :  ", i);
      for (unsigned int j=0; j<n; j++)
         std::cout << Form("%12.5g", this -> GetDataPoint(i) -> GetValue(j));
      std::cout << std::endl;
   }
   std::cout << std::endl;

}

std::vector< double > BCDataSet::GetDataComponents ( int  index  ) 

Viewing the data set as a table with one row per point, this method returns a specified column.

Parameters:
index The index of the component to be returned.
Returns:
The (index)th component of all data points

Definition at line 84 of file BCDataSet.cxx.

{
   unsigned int N = this->GetNDataPoints();
   std::vector<double> components( N , 0.0 );

   BCDataPoint* point=0;
   for (unsigned int i = 0; i < N; ++i) {
      //rely on index checking in Get... methods
      point = this -> GetDataPoint(i);
      components[i] = point -> GetValue(index);
   }

   return components;
}

BCDataPoint * BCDataSet::GetDataPoint ( unsigned int  index  ) 

Definition at line 66 of file BCDataSet.cxx.

{
   if (!fBCDataVector || this -> GetNDataPoints()==0 )
   {
      BCLog::Out(BCLog::error, BCLog::error,"BCDataSet::GetDataPoint : Dataset is empty.");
      return 0;
   }

   // check if index is within range. Return the data point if true ...
   if(index >= 0 && index < this -> GetNDataPoints())
      return fBCDataVector -> at(index);

   // ... or give out warning and return 0 if not.
   BCLog::Out(BCLog::error, BCLog::error,"BCDataSet::GetDataPoint : Index out of range. Return 0.");
   return 0;
}

unsigned int BCDataSet::GetNDataPoints (  ) 

Definition at line 40 of file BCDataSet.cxx.

{
   // check if vector exists. Return number of data points if true ...
   if (fBCDataVector)
      return fBCDataVector -> size();

   // ... or give out warning and return 0 if not.
   BCLog::Out(BCLog::warning, BCLog::warning,"BCDataSet::GetNDataPoints : DataSet not yet created.");
   return 0;
}

unsigned int BCDataSet::GetNValuesPerPoint (  ) 

Definition at line 53 of file BCDataSet.cxx.

{
   // check if vector exists and contains datapoints
   if (fBCDataVector && fBCDataVector -> size() > 0)
      return this -> GetDataPoint(0) -> GetNValues();

   BCLog::Out(BCLog::error, BCLog::error,
         "BCDataSet::GetNValuesPerPoint : Data set doesn't exist yet");
   return 0;
}

int BCDataSet::ReadDataFromFile ( const char *  filename,
const char *  treename,
const char *  branchnames 
) [inline]

Reads data from a file. For a description see the following member functions.

Definition at line 89 of file BCDataSet.h.

         { return this ->  ReadDataFromFileTree(filename, treename, branchnames); };

int BCDataSet::ReadDataFromFile ( const char *  filename,
int  nvariables 
) [inline]

Definition at line 92 of file BCDataSet.h.

         { return this -> ReadDataFromFileTxt(filename, nvariables); };

int BCDataSet::ReadDataFromFileTree ( const char *  filename,
const char *  treename,
const char *  branchnames 
)

Reads a TTree from a .root file. Opens a .root file and gets a TTree. It creates data points containing the values read from the file.

Parameters:
filename The name of the .root file.
treename The name of the TTree.
branchnames A list of the names of the branches separated by a comma
Returns:
An error code.
See also:
ReadDataFromFileTxt(char* filename, int nbranches);
ReadDataFromFileUser(const char * filename, std::vector<int> options_int, std::vector<double> options_double, const char * options_char);

Definition at line 103 of file BCDataSet.cxx.

{
   // open root file
   TFile * file = new TFile(filename, "READ");

   // check if file is open and warn if not.
   if (!file -> IsOpen())
   {
      BCLog::Out(BCLog::error, BCLog::error,
            Form("BCDataSet::ReadDataFromFileTree : Could not open file %s.", filename));
      return ERROR_FILENOTFOUND;
   }

   // get tree
   TTree * tree = (TTree*) file -> Get(treename);

   // check if tree is there and warn if not.
   if (!tree)
   {
      BCLog::Out(BCLog::error, BCLog::error,
            Form("BCDataSet::ReadDataFromFileTree : Could not find TTree %s.", treename));

      // close file
      file -> Close();

      return ERROR_TREENOTFOUND;
   }

   // if data set contains data, clear data object container ...
   if (fBCDataVector != 0)
   {
      fBCDataVector -> clear();

      BCLog::Out(BCLog::detail, BCLog::detail,"BCDataSet::ReadDataFromFileTree : Overwrite existing data.");
   }

   // ... or allocate memory for the vector if not.
   else
      fBCDataVector = new BCDataVector();

   // get branch names.

   // first, copy the branchnames into a std::string.
   std::string branches(branchnames);

   // define a vector of std::strings which contain the tree names.
   std::vector<std::string> * branchnamevector = new std::vector<std::string>;

   // the names are supposed to be separated by commas. find first comma
   // entry in the string.
   int temp_index = branches.find_first_of(",");

   // reset number of branches
   int nbranches = 0;

   // repeat until the is nothing left in the string.
   while(branches.size() > 0)
   {
      // temporary string which contains the name of the current branch
      std::string branchname;

      // get current branch name

      // if there is no comma the current branchname corresponds to the whole string, ...
      if (temp_index == -1)
         branchname = branches;

      // ... if there is a comma, copy that part of the string into the current branchname.
      else
         branchname.assign(branches, 0, temp_index);

      // write branch name to a vector
      branchnamevector -> push_back(branchname);

      // increase the number of branches found
      nbranches++;

      // cut remaining string with branchnames

      // if there is no comma left empty the string, ...
      if (temp_index == -1)
            branches = "";

      // ... if there is a comma remove the current branchname from the string.
      else
         branches.erase(0, temp_index + 1);

      // find the next comma
      temp_index = branches.find_first_of(",");
   }

   // create temporary vector with data and assign some zeros.
   std::vector<double> data;
   data.assign(nbranches, 0.0);

   // set the branch address.
   for (int i = 0; i < nbranches; i++)
      tree -> SetBranchAddress(branchnamevector -> at(i).data(), &data.at(i));

   // calculate maximum number of entries
   int nentries = tree -> GetEntries();

   // check if there are any events in the tree and close file if not.
   if (nentries <= 0)
   {
      BCLog::Out(BCLog::error, BCLog::error,
            Form("BCDataSet::ReadDataFromFileTree : No events in TTree %s.", treename));

      // close file
      file -> Close();

      return ERROR_NOEVENTS;
   }

   // loop over entries
   for (int ientry = 0; ientry < nentries; ientry++)
   {
      // get entry
      tree -> GetEntry(ientry);

      // create data object
      BCDataPoint * datapoint = new BCDataPoint(nbranches);

      // copy data

      for (int i = 0; i < nbranches; i++)
         datapoint -> SetValue(i, data.at(i));

      // add data point to this data set.
      this -> AddDataPoint(datapoint);
   }

   // close file
   file -> Close();

   // remove file pointer.
   if (file)
      delete file;

   return 0;

}

int BCDataSet::ReadDataFromFileTxt ( const char *  filename,
int  nvariables 
)

Reads data from a .txt file. Opens a .txt file and creates data objects containing the values read from the file.

Parameters:
filename The name of the .txt file.
nvariables The number of variables.
See also:
ReadDataFromFileTree(char* filename, char* treename, std::vector<char*> branchnames)
ReadDataFromFileUser(const char * filename, std::vector<int> options_int, std::vector<double> options_double, const char * options_char);

Definition at line 248 of file BCDataSet.cxx.

{
   // open text file.
   std::fstream file;
   file.open(filename, std::fstream::in);

   // check if file is open and warn if not.
   if (!file.is_open())
   {
      BCLog::Out(BCLog::error, BCLog::error,
            Form("BCDataSet::ReadDataFromFileText : Could not open file %s.", filename));

      return ERROR_FILENOTFOUND;
   }

   // if data set contains data, clear data object container ...
   if (fBCDataVector != 0)
   {
      fBCDataVector -> clear();

      BCLog::Out(BCLog::detail, BCLog::detail,"BCDataSet::ReadDataFromFileTxt : Overwrite existing data.");
   }

   // ... or allocate memory for the vector if not.
   else
      fBCDataVector = new BCDataVector();

   // create temporary vector with data and assign some zeros.
   std::vector<double> data;
   data.assign(nbranches, 0.0);

   // reset counter
   int nentries = 0;

   // read data and create data points.
   while (!file.eof())
   {
      // read data from file
      int i=0;
      while(file >> data[i])
      {
         if (i==nbranches-1)
            break;
         i++;
      }

      // create data point.
      if(i == nbranches-1)
      {
         BCDataPoint * datapoint = new BCDataPoint(nbranches);

         // copy data into data point
         for (int i = 0; i < nbranches; i++)
            datapoint -> SetValue(i, data.at(i));

         // add data point to this data set.
         this -> AddDataPoint(datapoint);

         // increase counter
         nentries++;
      }
   }

   // check if there are any events in the tree and close file if not.
   if (nentries <= 0)
   {
      BCLog::Out(BCLog::error, BCLog::error,
            Form("BCDataSet::ReadDataFromFileText : No events in the file %s.", filename));

      // close file
      file.close();

      return ERROR_NOEVENTS;
   }

   // close file
   file.close();

   return 0;

}

void BCDataSet::Reset (  ) 

Resets the content of the data set

Definition at line 347 of file BCDataSet.cxx.

{

   // if memory has been allocated to the data set
   // clear the content.
   if (fBCDataVector != 0)
      fBCDataVector -> clear();

}


Member Data Documentation

Definition at line 138 of file BCDataSet.h.


The documentation for this class was generated from the following files: