Re: [ROOT] tree splitting

From: Pasha Murat (630)840-8237@169G ((630)840-8237@169G)
Date: Wed Mar 28 2001 - 06:02:51 MEST


I faced the same problem a while ago. The workaround I ended up with looked 
like this:

class VldContext {
  enum {         // for detector type
    kSVX = 1,
    kCOT = 3,
    kCALOR = 5   // ... etc
  };
  Int_t fDetector;   / kSVX, kCOT etc
  Int_t fTimeStamp;
};

It looks like using enumerated types bites earlier or later almost 
in every case: at a certain point one wants to plot a histogram for 
the detector type and this is where it happens. On the contrary, enum
constants seem to be convenient and they don't have side effects

					best, Pasha



Susan Kasahara wrote:
> 
> 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