Apologies again if you experience long delays to answer your mails.
I am now in a totally divergent process with my mail folders.
Rene Brun
Witold Przygoda wrote:
>
> Hallo,
>
> excuse me if I repeat the well known question but this is
> a very important problem to me.
>
> I will show it on an easy example.
> Imagine that I have hit class like this:
>
> class MyHits : public TObject {
>
> public:
>
> int SimpleType;
> MyDataClass finalData[3];
>
> // of course Streamer function defined in .cc file
>
> MyHits();
> virtual ~MyHits();
> ClassDef(MyHits,1)
>
> };
>
> MyDataClass : public TObject {
>
> int SimpleType;
> int someData[10];
> float *myArrayPtr;
>
> // again I provide Streamer which takes care of pointer also
>
> MyDataClass();
> virtual ~MyDataClass();
> ClassDef(MyDataClass,1)
> };
>
> What I know:
> I can write it to one branch (just dumping data into one solid
> block without spliting). This works fine and I can read so
> created file, fill back data structure, make loops over events
> and fill some histograms.
>
> What I would like and donīt know:
> It is demanded by some people to provide them much easier (and faster!)
> way to access all data. I do not want to define the detailed (leaf by
> leaf) structure of my branch(es) but to stay with Streamer-mechanism.
> I know I can set up split mode and each variable will create another
> branch.
>
> My question: I failed with having access to array myData (of type
> MyDataClass). The branch seems to be not created. Is it possible
> (and how) finally to have the access like
> T.Draw("simpleType");
>
> also to T.Draw("myData[0].SimpleType");
> T.Draw("myData[1].someData");
> T.Draw("myData[1].someData[3]");
> (I know it is wrong what I write above but I hope it explains
> my wish). In other words how to use Streamer method of storing
> of my Class(es) into root-file (branch) and the pointers (keys) to all
> fields of my Class (and also fields of component which is of another
> class type).
>
> Thank you a lot in advance,
>
> Witek Przygoda
The rules for the split mode are described at URL:
http://root.cern.ch/root/HowtoWritTree.html
In particular, the split mode cannot support yet the case
of an array of objects. In your case, you also have a pointer
to an array of floats.
I have modified your classes, such that , at least, you can run
rootcint and use the non-split mode.
I also show an example of macro to generate a file with a Tree (wit.C)
and another macro to analyze this tree (wit2.C)
//file witold.h
#ifndef ROOT_event
#define ROOT_event
#include <TObject.h>
class MyDataClass : public TObject {
public:
int event;
int SimpleType;
int someData[10];
float *myArrayPtr;
// again I provide Streamer which takes care of pointer also
MyDataClass();
MyDataClass(const MyDataClass &dc);
virtual ~MyDataClass();
void SetType(int typ);
ClassDef(MyDataClass,1)
};
class MyHits : public TObject {
public:
int SimpleType;
MyDataClass finalData[3];
// of course Streamer function defined in .cc file
MyHits();
MyHits(const MyHits &mh);
virtual ~MyHits();
int Type(int n) {return finalData[n].SimpleType;}
int Data(int n, int i=0) {return finalData[n].someData[i];}
float ArrayPtr(int n, int i = 0) {return finalData[n].myArrayPtr[i];}
ClassDef(MyHits,1)
};
#endif
//--------file witold.C
#include "witold.h"
Int_t event = 0;
ClassImp(MyDataClass)
MyDataClass::MyDataClass()
{
SimpleType = 1;
for (int i=0;i<10;i++) someData[i]=i;
myArrayPtr = new float[8];
for (int j=0;j<8;j++) myArrayPtr[j] = 1.1+10.*j;
}
MyDataClass::MyDataClass(const MyDataClass &dc)
{
}
MyDataClass::~MyDataClass()
{
delete [] myArrayPtr;
myArrayPtr = 0;
}
void MyDataClass::SetType(int typ)
{
SimpleType = typ;
}
ClassImp(MyHits)
MyHits::MyHits()
{
SimpleType = 2;
}
MyHits::MyHits(const MyHits &mh)
{
}
MyHits::~MyHits()
{
}
//______________________________________________________________________________
void MyDataClass::Streamer(TBuffer &R__b)
{
// Stream an object of class MyDataClass.
if (R__b.IsReading()) {
Version_t R__v = R__b.ReadVersion(); if (R__v) { }
TObject::Streamer(R__b);
R__b >> SimpleType;
R__b.ReadFastArray(someData,10);
if (!myArrayPtr) myArrayPtr = new float[8];
R__b.ReadFastArray(myArrayPtr,8);
} else {
R__b.WriteVersion(MyDataClass::IsA());
TObject::Streamer(R__b);
R__b << SimpleType;
R__b.WriteFastArray(someData, 10);
R__b.WriteFastArray(myArrayPtr, 8); // I put a constant here
}
}
//______________________________________________________________________________
void MyHits::Streamer(TBuffer &R__b)
{
// Stream an object of class MyHits.
if (R__b.IsReading()) {
Version_t R__v = R__b.ReadVersion(); if (R__v) { }
TObject::Streamer(R__b);
R__b >> SimpleType;
int R__i;
for (R__i=0; R__i < 3; R__i++)
finalData[R__i].Streamer(R__b);
} else {
R__b.WriteVersion(MyHits::IsA());
TObject::Streamer(R__b);
R__b << SimpleType;
int R__i;
for (R__i=0; R__i < 3; R__i++)
finalData[R__i].Streamer(R__b);
}
}
//--------file wLinkDef.h
#ifdef __CINT__
#pragma link off all globals;
#pragma link off all classes;
#pragma link off all functions;
#pragma link C++ class MyDataClass-;
#pragma link C++ class MyHits-;
#endif
//--example of commands to run rootcint/compile on hp-ux
rootcint -f wcint.C -c witold.h wLinkDef.h
CC +a1 +z -I$ROOTSYS/include -c wcint.C witold.C
CC -b -g +a1 -z wcint.o witold.o -o witold.so
//------example of macro to generate a Tree (wit.C)
{
gROOT->Reset();
gSystem->Load("witold.so");
TFile f("witold.root","recreate");
MyHits *mh = new MyHits();
TTree *T = new TTree("T","witold tree");
T->Branch("hits","MyHits",&mh,32000,0);
for (Int_t i=0;i<100;i++) {
mh->finalData[0].SetType(i);
mh->finalData[1].SetType(1000+i);
mh->finalData[2].SetType(2000+i);
T->Fill();
}
T->Print();
T->Write();
}
//------example of macro toanalyze the Tree (wit2.C)
{
gROOT->Reset();
gSystem->Load("witold.so");
TFile f("witold.root");
MyHits *mh = new MyHits();
TTree *T = (TTree*)f.Get("T");
T->SetBranchAddress("hits",&mh);
TH1F *h1 = new TH1F("h1","Types",100,0,3000);
Int_t nentries = T->GetEntries();
for (Int_t i=0;i<nentries;i++) {
T->GetEvent(i);
h1->Fill(mh->Type(0));
h1->Fill(mh->Type(1));
h1->Fill(mh->Type(2));
}
h1->Draw();
}
This archive was generated by hypermail 2b29 : Tue Jan 04 2000 - 00:34:31 MET