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