Re: [ROOT] tree splitting

From: Susan Kasahara (schubert@physics.umn.edu)
Date: Thu Mar 29 2001 - 03:32:15 MEST


Hi Rene and Pasha,
Thank you both for your advice.  I tried the TTree::Bronch method
as you suggested and it did successfully write out the enumerated
fDetector data member.  I did notice that when I switched to the
TTree::Bronch method, i.e. from
  tree -> Branch("Validity","VldContext",&valid,32000,1);
to
  tree -> Bronch("Validity","VldContext",&valid,32000,1);
that the TObject base class of VldContext was not longer split
into two separate branches for the fUniqueId and fBits data members
as it was using TTree::Branch.
Is this to be expected?

I have another TTree splitting question.  I've noticed that when
I attempt to store a class in split mode that has a TObjArray data member , e.g.
class Event {
public:
...
private:
  TObjArray fData;
   Int_t          fEvtNumber;
};

And store it on a tree in split mode:
  TTree* tree = new TTree("TestTree","test tree");
  Event* event = 0;
  tree -> Branch("EventBranch","Event",&event,32000,1);

That ROOT will attempt to split the TObjArray (to 7 branches), and since the
data member of the TObjArray which contains the array's data has been "!" out, ROOT will
not write the actual data of the TObjArray to the TTree.
On the other hand, storing the TObjArray by pointer as a data member of the
Event class, e.g.
class Event {
public:
...
private:
  TObjArray* fData;
   Int_t          fEvtNumber;
};
does seem to work since the customized Streamer of the TObjArray is invoked
to stream the TObjArray data out to a single ROOT TBranch.
I guess what I'd like is to preserve the Event structure of the first case (with
the fData TObjArray stored by value), but have the  Event splitting results of the
second case, with the TObjArray data streamed out to a single ROOT TBranch.
Is this possible?
Thanks again,
-Sue


Rene Brun wrote:

> Hi Sue, Pasha,
>
> enums are not recognized by TTree::Branch in split mode.
> They are supported by TTree::Bronch in 3.00/06. You can make a test
> by replacing the line:
>   tree -> Branch("Validity","VldContext",&valid,32000,1);
> by:
>   tree -> Bronch("Validity","VldContext",&valid,32000,1);
>
> Read TTree::Bronch for more info.
> I am now finishing the implementation of the new split mode. The new split
> mode (Bronch) has no limitation compared to the non-split mode.
> With the next major release 3.01 scheduled for early June, Bronch will
> be renamed Branch. The new split/no-split mode in Trees will have several
> new features. In addition to the extended C++ support described
> at http://root.cern.ch/root/SchemaEvolution.html , the new Trees will also
> be connected with the TFolder structure. Trees can be generated automatically
> from an existing TFolder hierarchy and vice-versa a TFolder hierarchy
> automatically generated from a Tree structure.
> This new functionality will be included in the first development releases
> of 3.01 in 2 or 3 weeks.
>
> Rene Brun
>
> 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 : Fri Jun 08 2001 - 11:51:21 MEST