[ROOT] tree splitting

From: Susan Kasahara (schubert@physics.umn.edu)
Date: Wed Mar 28 2001 - 01:22:49 MEST


Hi rooters,
I am having a problem with the ROOT tree splitting method.
I have a simple class "VldContext" with just two data members:

   DetectorType::Detector_t   fDetector;
   Int_t                      fTimeStamp;

The first data member is of an enumerated type Detector_t defined
in a separate class DetectorType.  What I would like is to have these
two data members, fDetector and fTimeStamp, be stored on two separate
subbranches of the same TTree.

I set up a tree with one main branch to hold these VldContext objects
in split mode (split level = 1), using the form:


  TTree* tree = new TTree("TestTree","test tree");
  VldContext* valid = 0;
  tree -> Branch("Validity","VldContext",&valid,32000,1);


And have noticed that although a subbranch is created for the fTimeStamp
data member as expected, no subbranch is created for the fDetector
data member.  I am assuming the problem has something to do with
fDetector's specialized enumerated data type that is somehow not being
recognized by ROOT.

I am attaching the code for the test driver program, the VldContext
class, and the DetectorType class.  These tests are being run on a
RH Linux system using gcc 2.95.2 and ROOT version 3.00.04.

Any ideas as to how to fix this?

Thanks,
Sue Kasahara

**************** The test driver program **********************************
#include <iostream.h>
#include "TROOT.h"
#include "TFile.h"
#include "TTree.h"
#include "VldContext.h"

TROOT root("TestWrt","MINOS Persistency Package Test Write");

int main() {

  TFile* file = TFile::Open("test.root","RECREATE","test file");
  TTree* tree = new TTree("TestTree","test tree");

  VldContext* valid = 0;
  tree -> Branch("Validity","VldContext",&valid,32000,1);

  // Begin entry loop
  Int_t nent = 100;
  for (Int_t ient=0; ient < nent; ient++) {
    DetectorType::Detector_t dtype = DetectorType::kCalib;  // detector type
    Int_t tstamp = 100;
    VldContext* valid = new VldContext(dtype,tstamp);
    if (valid) {
       tree -> Fill();
    }
    delete valid; // clean up validity object
  }

  tree -> Write();
  tree -> Print();
  file -> Close();

  return 0;

}

**************** The VldContext class **********************************

#include "TObject.h"
#include "DetectorType.h"

class VldContext : public TObject {

 public:

   VldContext();
   VldContext(const DetectorType::Detector_t &detector,
              const Int_t &time);
   virtual ~VldContext();

 protected:

   DetectorType::Detector_t   fDetector;
   Int_t                      fTimeStamp;

 private:

   ClassDef(VldContext,1)  // VldContext version 1
};

#include "VldContext.h"

ClassImp(VldContext)

VldContext::VldContext()
{
   // Default constructor
}

VldContext::VldContext(const DetectorType::Detector_t &detector,
                       const Int_t &tstamp)
   : fDetector(detector), fTimeStamp(tstamp)
{
   // normal constructor
}

VldContext::~VldContext()
{
   // delete all the owned sub-objects

}

********************The DetectorType class**********************************

#include "Rtypes.h"

class DetectorType {
 public:
   typedef enum EDetectorType {
      kNear      = 0x01,
      kFar       = 0x02,
      kCalib     = 0x04,
      kTestStand = 0x08,
      kMapper    = 0x10
   } Detector_t;

   // no ctor or dtor's - this class consists of only static members

   // Translation from enum to character strings

   static char *AsString(Detector_t detector) {
      switch (detector) {
      case kNear:      return "Near";       break;
      case kFar:       return "Far";        break;
      case kCalib:     return "Calib";      break;
      case kTestStand: return "TestStand";  break;
      case kMapper:    return "Mapper";     break;
      default:         return "Unknown";    break;
      }
   }

   ClassDef(DetectorType,1)

};

#include "DetectorType.h"

ClassImp(DetectorType)



This archive was generated by hypermail 2b29 : Tue Jan 01 2002 - 17:50:40 MET