Re: [ROOT] PAW to ROOT

From: Valeri Fine (fine@bnl.gov)
Date: Thu Sep 06 2001 - 22:06:18 MEST


I agree, good example. operator = was overlooked :-(
However "memcpy" here is useful to show what is going 
on "behind the curtain" :-)
Thank you.

-----
Dr.Valeri Fine
STAR/US Atlas                                    E-mail: fine@bnl.gov
Brookhaven National Lab                   Phone: +1 631 344 7806
Upton, NY 11973-5000                       FAX:     +1 631 344 4206
USA



----- Original Message ----- 
From: "Christian Holm Christensen" <cholm@hehi03.nbi.dk>
To: <fine@bnl.gov>
Cc: <tim.miller@vanderbilt.edu>; <roottalk@pcroot.cern.ch>
Sent: Thursday, September 06, 2001 12:38 PM
Subject: Re: [ROOT] PAW to ROOT


> Hi, 
> 
> On Wed, 5 Sep 2001 18:10:37 -0400
> "Valeri Fine" <fine@bnl.gov> wrote
> concerning "Re: [ROOT] PAW to ROOT":
> > Since both classes TH1F as well as TH2F ( http://root.cern.ch/root/htmldoc/TH2F.html )  are
> > derived from TArrayF (http://root.cern.ch/root/htmldoc/TArrayF.html)
> > all methods of the last one are available.
> 
> > 
> > TH2F *hist = (TH2F*)file->Get("hist_id");
> > int dimX = (int)hist->GetNbinsX();
> > int dimY = (int)hist->GetNbinsY();
> > 
> > float *vect = new float[dimX*dimY];
> > memcpy(vect,hist->fArray,sizeof(vector)); 
> > 
> > > Whether there is a clean, simple function call in a ROOT
> > > class, I'm not sure (haven't look at recent versions)
> >
> > One one needs no special function. 
> > The function "memcpy" can do job.
> 
> One can do it even simpler than that: 
> 
>   TRandom* r = new TRandom;
>   TH1F* h1 = new TH1F("h1", "Hello World", 100, 0, 10); 
>   for (Int_t i = 0; i < 1000; i++) h->Fill(r->Gaus(5,2)); 
>   TH2F* h2 = new TH2F("h2", "Hello World", 100, 0, 10, 100, 0, 10); 
>   for (Int_t i = 0; i < 1000; i++) h->Fill(r->Gaus(5,2),r->Gaus(5,2)); 
>   TArrayF* a1 = new TArrayF(*h1); 
>   TArrayF* a2 = new TArrayF(*h2); 
> 
> Now you have the bounds checking TArray class instead of the low-level
> float** type to play around with.  IMHO, much simpler.  You can
> probably write the above as 
> 
>   TArrayF a1 = *h1; 
>   TArrayF a2 = *h2; 
> 
> I'm personally not really keen on C functions like memcpy, and the
> like.  memcpy is especially "bad", since it just copies bit for bit
> the input to the output, and hence surcumvents the C++ strong typing,
> which is one of the reasons for using C++ in the first place.  This is
> also the reason why one should strive to use classes like string (or
> in case of ROOT TString) rather than pointers to const char, and so
> on.  Much cleaner OOP.  Perhaps, the methods like TNamed::SetName
> should really take a string/TString reference as argument, rather than
> a const Char_t pointer (I know it's probably not gonna happen, but IMHO
> it's cleaner - maybe for ROOT 4 :-). 
> 
> Yours, 
> 
> Christian Holm Christensen -------------------------------------------
> Address: Sankt Hansgade 23, 1. th.           Phone:  (+45) 35 35 96 91 
>          DK-2200 Copenhagen N                Cell:   (+45) 28 82 16 23
>          Denmark                             Office: (+45) 353  25 305 
> Email:   cholm@nbi.dk                        Web:    www.nbi.dk/~cholm
> 



This archive was generated by hypermail 2b29 : Tue Jan 01 2002 - 17:50:59 MET