Re: [ROOT] variable length "arrays"

From: Rene Brun (Rene.Brun@cern.ch)
Date: Sun Oct 29 2000 - 22:23:11 MET


A simple one. You must be very careful with the structs.
You can only have in the same branch data types of the same sizeof.

Rene Brun

typedef struct{
  int eventnr;
  int count;
  float meas[100];
} event_struct;

void struct()
{
   TFile f("struct.root","recreate");
   TTree T("T","test struct");
   event_struct event;

   T.Branch("first",&event.eventnr,"eventnr/I:count/I:meas[count]/F");
   for (Int_t i=0;i<1000;i++) {
      event.eventnr = i;
      event.count = 100*gRandom->Rndm();
      for (Int_t j=0;j<event.count;j++) event.meas[j] = i+j;
      T.Fill();
   }
   T.Print();
   T.Write();
}



On Sun, 29 Oct 2000, Stephen Adler wrote:

> Thanks Rene,
> 
> Do you have an example of a structure? .i.e.
> 
> 
>  {
>     TFile *f = new TFile("peter.root","recreate");
>     Int_t nPhot;
>     struct PhotStr {
>       Float_t E;
>       Float_t Px;
>       Float_t Py;
>       Float_t Pz;
>       Float_t Arm;
>       Float_t PhotProb;
>     } Phot[500];
> 
>     TTree* nEmcPhotons = new TTree("nEmcPhotons","EMC Photons");
> 
>     //
>     // How would the branch creation code be modified below?
>     //
> 
>     nEmcPhotons->Branch("nPhot",&nPhot,"nPhot/I");
>     nEmcPhotons->Branch("E",E,"E[nPhot]/F");
>     nEmcPhotons->Branch("Px",Px,"Px[nPhot]/F");
>     nEmcPhotons->Branch("Py",Py,"Py[nPhot]/F");
>     nEmcPhotons->Branch("Pz",Pz,"Pz[nPhot]/F");
>     nEmcPhotons->Branch("Arm", Arm,"Arm[nPhot]/F");
>     nEmcPhotons->Branch("PhotProb", PhotProb,"PhotProb[nPhot]/F");
> 
>     for (Int_t i=0;i<1000;i++) {
>        nPhot = 500*gRandom->Rndm();
>        for (Int_t j=0;j<nPhot;j++) {
>           Phot[j].E = j;
>           Phot[j].Px = j+1;
>           Phot[j].Py = j+2;
>           Phot[j].Pz = j+3;
>           Phot[j].Arm = j+4;
>           Phot[j].PhotProb = j+5;
>        }
>        nEmcPhotons->Fill();
>     }
>     nEmcPhotons->Print();
>     nEmcPhotons->Write();
>     f->Close();
>     delete f;
>  }
> 
> 
> On Oct 29, 10:05pm, Rene Brun wrote:
> > Subject: Re: [ROOT] variable length "arrays"
> > Hi Stephen,
> > You can find an example below
> >
> > Rene Brun
> >
> >
> >
> > {
> >    TFile *f = new TFile("peter.root","recreate");
> >    Int_t nPhot;
> >    Float_t E[500];
> >    Float_t Px[500];
> >    Float_t Py[500];
> >    Float_t Pz[500];
> >    Float_t Arm[500];
> >    Float_t PhotProb[500];
> >
> >    TTree* nEmcPhotons = new TTree("nEmcPhotons","EMC Photons");
> >    nEmcPhotons->Branch("nPhot",&nPhot,"nPhot/I");
> >    nEmcPhotons->Branch("E",E,"E[nPhot]/F");
> >    nEmcPhotons->Branch("Px",Px,"Px[nPhot]/F");
> >    nEmcPhotons->Branch("Py",Py,"Py[nPhot]/F");
> >    nEmcPhotons->Branch("Pz",Pz,"Pz[nPhot]/F");
> >    nEmcPhotons->Branch("Arm", Arm,"Arm[nPhot]/F");
> >    nEmcPhotons->Branch("PhotProb", PhotProb,"PhotProb[nPhot]/F");
> >
> >    for (Int_t i=0;i<1000;i++) {
> >       nPhot = 500*gRandom->Rndm();
> >       for (Int_t j=0;j<nPhot;j++) {
> >          E[j] = j;
> >          Px[j] = j+1;
> >          Py[j] = j+2;
> >          Pz[j] = j+3;
> >          Arm[j] = j+4;
> >          PhotProb[j] = j+5;
> >       }
> >       nEmcPhotons->Fill();
> >    }
> >    nEmcPhotons->Print();
> >    nEmcPhotons->Write();
> >    f->Close();
> >    delete f;
> > }
> >
> > On Sun, 29 Oct 2000, Stephen Adler wrote:
> >
> > > I'm trying to build a root tree with variable length arrays. In the
> > > old days of paw/ntuples, using column wise ntuples, one was able to
> > > define an array with a length as in
> > >
> > >    alen[0:250],tracks[1:alen]
> > >
> > > or something like that. I can't remember the paw/ntuple columb-wise
> > > syntax becuase I haven't used it in years. In anycase, I want to do
> > > the same with a root tree. Do I define a branch inside a branch or
> > > something like that?
> > >
> > > Cheers. Steve.
> > >
> >-- End of excerpt from Rene Brun
> 
> 



This archive was generated by hypermail 2b29 : Tue Jan 02 2001 - 11:50:36 MET