[ROOT] TClonesArray of TPolyLine3D in a Branch

From: Sean Liddick (liddick@nscl.msu.edu)
Date: Wed Feb 04 2004 - 21:55:34 MET


I am relatively new to root and am trying to create a simple example for
the use of TClonesArray.  What I am trying to do is create a TClonesArray
of TPolyline3D objects and store this array into a branch of a tree.  I
then want to read in the root file that is created and access the different
TPolyLine3D objects.

The macros that are run to create and then read a root file follow:

void write()
{
        TFile *hfile = new TFile("event.root","RECREATE","benchmark");
        TTree *tree = new TTree("T","Tree example");
        TClonesArray *a = new TClonesArray("TPolyLine3D");
        TClonesArray &aa = *a;

        tree->Branch("test",&a,32000,0);

        Double_t x[5] = {0.2,0.7,0.7,0.1,1};
        Double_t y[5] = {0.2,0.7,0.7,0.1,1};
        Double_t z[5] = {0.2,0.7,0.7,0.1,1};

        for(int i=0; i<10;i++){
          new(aa[i]) TPolyLine3D(5,x,y,z);
        }

        TPolyLine3D *line = (TPolyLine3D*)a->At(5);
        cout << line->GetN() << endl;

        tree->Fill();
        tree->Print();
        hfile->Write();
        hfile->Close();
}

void read()
{
  TClonesArray *clones = new TClonesArray("TPolyLine3D",10);
  TFile *infile = new TFile("event.root","READ");
  TTree *t2 = (TTree*)infile->Get("T");
  TBranch *branch = t2->GetBranch("test");
  branch->SetAddress(&clones);

  int nevent = T->GetEntries();
  T->Print();
    TPolyLine3D *line = (TPolyLine3D*)clones->At(1);
    line->GetN();
    printf("number of points = %d\n",line->GetN());
}

After executing the write macro in ROOT 3.10/01 I get the following
output.

>root [1] write()
>5
>Error in <TStreamerInfo::Build>: TPolyLine3D, discarding: Float_t* fP,
illegal [3*fN] Array of 3-D >>coordinates  (x,y,z)
>
>******************************************************************************
>*Tree    :T         : Tree example
*
>*Entries :        1 : Total =           13663 bytes  File  Size =
0 *
>*        :          : Tree compression factor =   1.00
*
>******************************************************************************
>*Br    0 :test      :
*
>*Entries :        1 : Total  Size=      13411 bytes  One basket in memory
*
>*Baskets :        0 : Basket Size=      64000 bytes  Compression=   1.00
*
>*............................................................................*

When I run write() a second time, the "error in <TStreamerInfo::Build>
..." disappears and I do not understand why.

Secondly when I run the read script the output produced is:

>root [3] read()
>******************************************************************************
>*Tree    :T         : Tree example
*
>*Entries :        1 : Total =           13710 bytes  File  Size =
4044 *
>*        :          : Tree compression factor =   1.00
*
>******************************************************************************
>*Br    0 :test      :
*
>*Entries :        1 : Total  Size=      13411 bytes  One basket in memory
*
>*Baskets :        0 : Basket Size=      64000 bytes  Compression=   1.00
*
>*............................................................................*
>Error: illegal pointer to class object line 0x0 116  FILE:root.C LINE:40
>*** Interpreter error recovered ***

What am I doing wrong in the read macro that prevents me from accessing
the TPolyLine objects?
Thanks for the help.

Sean Liddick
National Superconducting Cyclotron Laboratory
Michigan State University
East Lansing, Mi 48824
Email : liddick@nscl.msu.edu



This archive was generated by hypermail 2b29 : Sun Jan 02 2005 - 05:50:05 MET