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