Re: Pb in reading Trees...

From: Rene Brun (Rene.Brun@cern.ch)
Date: Wed Oct 13 1999 - 14:57:05 MEST


Hi Olivier,
Mea culpa, sorry. I was too fast to answer your mail this morning.
I did not see that your data member fSpectrum was a pointer to a
FlashSpectrum class.

What you do is correct for both split and non-split mode.
BUT, you have a problem in your class FlasSpectrum. In your default
constructor you allocate something. This is fine providing you control
the situation in FlashSpectrum::Streamer !!
You run the risk to allocate twice your array of UShort_t.
You did not send this function, so I cannot be more precise.

In general, it is bad practice to have a default constructor allocating
objects or arrays of basic types. The default constructor should only
preset pointers to 0 (protected in the destructor).

In Root, the default constructor is autonatically called by the system
for I/O and the user/interface context menu.

Rene Brun

Olivier Meplan wrote:
> 
> Hi Rooters!
> 
> I have a pb in reading (and perhaps in filling) a tree.
> The tree declaration I used is:
>         TTree *ptree_flash   = new TTree("FLASH",argv[1]);
>         event_flash = new EventFlash();
>         TBranch *b_flash
> =ptree_flash->Branch("EventFlash","EventFlash",
> &event_flash,bufsize,split);
> Then I fill the tree with:
>         event_flash=new EventFlash(dim_bloc,nb_burst,&buf[i]);
>         ptree_flash->Fill();
> where buf is UShort_t *buf=new UShort_t[lgb], (lgb being a given
> dimension).
> When I fill the tree, I used the method
>         event_flash->GetFlashSpectrum()->Show();
> in order to check what I am reading (and so what I hope to put in the
> tree).
> But when I try to read again the tree, the GetFlashSpectrum()->Show()
> method give me numbers which are completly different from the one I
> (hope to) fill in the tree.
> Is there some one who can tell me what I am doing wrong?
> Thanks very much,
> Olivier Meplan.
> -----------------------------------------------------------------------------
> 
> The definition of the class EventFlash is given in the file
> flash_flash.h, flash_spectrum.h (and the corresponding .C files):
> 
> // ========== flash_flash.h ===========
> class EventFlash : public TObject
> {
>  private:
>  Int_t  fNo_burst;  //Numero de burst
>  UShort_t fNo_voie_flash;  //Numero de la voie du flash touche
>         Int_t  fTps_avt_stockage; //Nb canaux entre l'origne et le 1er
> canal stocke
>         FlashSpectrum *fSpectrum;  //Amplitude=f(tps des coups par
> rapport au burst) pour chaque voie flash
> 
>  public:
> 
> EventFlash():fNo_burst(0),fNo_voie_flash(0),fTps_avt_stockage(0){fSpectrum=new
> FlashSpectrum();}
>         EventFlash(Int_t dim,Int_t burst,UShort_t *event);
>         ~EventFlash(){delete fSpectrum;}
> 
>         Int_t  GetNbBurt() const { return fNo_burst; }
>  UShort_t GetNumVoie() const {return fNo_voie_flash; }
>  Int_t  GetTemps_Avant_Stokage() const {return fTps_avt_stockage; }
>         FlashSpectrum *GetFlashSpectrum()  {return fSpectrum; }
> 
>  ClassDef(EventFlash,1)
> 
> };
> // ========== flash_flash.C ===========
> #include "flash_flash.h"
> 
> ClassImp(EventFlash)
> EventFlash::EventFlash(Int_t dim,Int_t burst,UShort_t *event) :
> TObject()
> {
>         fNo_burst=burst;
>         fSpectrum=new FlashSpectrum(dim);
> 
>         fNo_voie_flash=(*event & 0x00FF);
>         fTps_avt_stockage=*(event+1);
>         for(Int_t i=0 ; i<dim ; i++)
>         {
>                 GetFlashSpectrum()->FillSpectrum(i,(event[i+2] &
> 0x0FFF));
> 
>         }
> }
> // ========== flash_spectrum.h ===========
> class FlashSpectrum : public TObject
> {
>  private:
>         UShort_t *fFlashSpectrum;
>         Int_t  fSize;
> 
>  public:
>  FlashSpectrum(): fSize(10)
>         {
>                 fFlashSpectrum = new UShort_t[fSize];
>        }
>         FlashSpectrum( Int_t size)
>         {
>                 fSize=size;
>                 fFlashSpectrum = new UShort_t[fSize];
>         }
> 
>  ~FlashSpectrum(){delete [] fFlashSpectrum;}
>         void  FillSpectrum(UShort_t *spectrum)
>           {
>                                 for(Int_t i=0; i<fSize ; i++)
> fFlashSpectrum[i]=spectrum[i];
>           }
>         void  FillSpectrum(Int_t i,UShort_t val)
>           {
>            fFlashSpectrum[i]=val;
>           }
>         UShort_t *GetSpectrum(){return fFlashSpectrum;}
>         Int_t  GetSize(){return fSize;}
>         void  Show()
>           {
>                          for(Int_t i=0; i<GetSize(); i++)
>                                  cout<<"AMP:"<<fFlashSpectrum[i]<<endl;
>            }
>    ClassDef(FlashSpectrum,1)
> };
> //===============================
> 
> --
> =========================================================
> |Olivier Meplan             |E-mail:meplan@isn.in2p3.fr
> |                           |
> |ISN, 53 avenue des Martyrs |  Tel +33(0)4 76-28-41-90
> |F-38026 GRENOBLE cedex     |  Fax +33(0)4 76-28-40-04
> =========================================================



This archive was generated by hypermail 2b29 : Tue Jan 04 2000 - 00:43:40 MET