Re: [ROOT] reduction

From: Rene Brun (Rene.Brun@cern.ch)
Date: Wed Jan 16 2002 - 19:15:04 MET


Hi Karl,

Interesting observation.
I have optimized this case in the current version in CVS.
It would be nice if you could try this version to see the effect
in your case.
Let me know

Rene Brun

K. Hauschild wrote:
> 
> Hi All,
> 
> I want to make my root Data files smaller : here is what I do, but I would like
> to know if the is a more space efficient way of storing the data.
> 
> I have the following class to store/access data for a particular detector type.
> 
> //Class for CsI Detectors
> class DetectorCsI : public TObject {
> 
>  private:
>   UShort_t    fId;       //Detector Id
>   UShort_t    fPId;      //Detector Particle Id
>   UShort_t    fChan;     //Detector chan
>   UShort_t    fTac;      //Detector TAC
> 
>  public:
>   DetectorCsI()  {;}
>   DetectorCsI(UShort_t id, UShort_t pid, UShort_t chan, UShort_t tac);
>   virtual ~DetectorCsI() {;}
> 
>   //setters and getters
>   inline UShort_t GetId()    {return fId;  }
>   inline UShort_t GetPId()   {return fPId; }
>   inline UShort_t GetChan()  {return fChan;}
>   inline UShort_t GetTac()   {return fTac; }
> 
>   ClassDef (DetectorCsI,1)  //CsI Detector class
> };
> 
> In an event there are a variable number of CsI detectors hit, so I
> use TClonesArrays, eg :
> 
> OrsayData::OrsayData()
> {
>   // Create a Data object for the Orsay experiment
>   //class static variable are 0 for first time call
>   if (fgGes == 0)
>     fgGes    = new TClonesArray("DetectorGe", N_GE);     //Ge/BGO data array
> 
>   if (fgSaphir == 0)
>     fgSaphir = new TClonesArray("Detector", N_SAPHIR);   //array for Saphir
> 
>   if (fgCsIs == 0)
>     fgCsIs   = new TClonesArray("DetectorCsI",N_DIAMANT);//array for CsI
> 
>   fGes    = fgGes;
>   fSaphir = fgSaphir;
>   fCsIs   = fgCsIs;
> 
>   fSumBus1 = fSumBus2 = 0;
>   fNGe     = fNCsI    = fNSaphir    = 0;
> }
> 
> (I have similar TClonesArrays for the Ge/BGO and Saphir data.)
> 
> The event saved to a tree is given by :
> 
> ///////////////////////////////////////////////////////////////////////////////
> // Class to store/extract processed data
> //
> class OrsayData : public TObject{
>  private:
>   UChar_t      fSumBus1;        //Saphir Trigger
>   UChar_t      fSumBus2;        //Ge/BGO Trigger
> 
>   int           fNGe;            //! HPGe multiplicity : this info is stored in
>   int           fNBGO;           //! BGO  multiplicity : the TClonesArray below
>   int           fNCsI;           //! CsI  multiplicity : so not wirtten to file
>   int           fNSaphir;        //! Saphir multiplicity
> 
>   TClonesArray *fGes;            // Ge  Data
>   TClonesArray *fSaphir;         // Saphir Data
>   TClonesArray *fCsIs;           // CsI Data
> 
>   static TClonesArray *fgGes;    // these are used for
>   static TClonesArray *fgSaphir; // of TClonesArray
>   static TClonesArray *fgCsIs;   // of TClonesArray
> 
>  public:
>   OrsayData();
>   virtual ~OrsayData();
> 
>   void        Clear(Option_t *option = "");
>   static void Reset(Option_t *option = "");
> 
>   //setters
>   void SetSumBus1(int SumBus1) {fSumBus1 = SumBus1;}
>   void SetSumBus2(int SumBus2) {fSumBus2 = SumBus2;}
> 
>   void AddGe(     UShort_t id, UShort_t chan, UShort_t tac,
>                   UShort_t bgo_chan, UShort_t bgo_tac);
>   void AddSaphir( UShort_t id, UShort_t chan, UShort_t tac);
>   void AddCsI(    UShort_t id, UShort_t chan, UShort_t tac, UShort_t pid);
> 
>   //getters : processed data
>   inline int  GetSumBus1()    { return fSumBus1; }
>   inline int  GetSumBus2()    { return fSumBus2; }
>   inline int  GetNGe()        { return fNGe;     }
>   inline int  GetNBGO()       { return fNBGO;    }
>   inline int  GetNCsI()       { return fNCsI;    }
>   inline int  GetNSaphir()    { return fNSaphir; }
> 
>   TClonesArray   *GetGes()    const {return fGes;}
>   TClonesArray   *GetSaphir() const {return fSaphir;}
>   TClonesArray   *GetCsIs()   const {return fCsIs;}
> 
>   ClassDef (OrsayData,1)  //Orsay Data class
>     };
> 
> 
> Using ->Print() on my TTree I have :
> 
> *Br   10 :fCsIs     : fCsIs_                                                 *
> *Entries : 48523408 : Total  Size=  388477911 bytes  File Size  =  113153367 *
> *Baskets :     4551 : Basket Size=     128000 bytes  Compression=   3.43     *
> *............................................................................*
> *Br   11 :fCsIs.fId : fId[fCsIs_]                                            *
> *Entries : 48523408 : Total  Size=  205360612 bytes  File Size  =   17502009 *
> *Baskets :     3120 : Basket Size=     128000 bytes  Compression=  11.73     *
> *............................................................................*
> *Br   12 :fCsIs.fPId : fPId[fCsIs_]                                          *
> *Entries : 48523408 : Total  Size=  205360396 bytes  File Size  =   20880526 *
> *Baskets :     3120 : Basket Size=     128000 bytes  Compression=   9.84     *
> *............................................................................*
> *Br   13 :fCsIs.fChan : fChan[fCsIs_]                                        *
> *Entries : 48523408 : Total  Size=  205363516 bytes  File Size  =   21180885 *
> *Baskets :     3120 : Basket Size=     128000 bytes  Compression=   9.70     *
> *............................................................................*
> *Br   14 :fCsIs.fTac : fTac[fCsIs_]                                          *
> *Entries : 48523408 : Total  Size=  205360396 bytes  File Size  =   20198629 *
> *Baskets :     3120 : Basket Size=     128000 bytes  Compression=  10.17     *
> *............................................................................*
> 
> So, in this case "fCsIs_" is a large overhead. I presume this is where
> the number of CsI elements hit is stored per event entry. From the numbers
> above it would seem this is 8 bytes per event entry. In my particular
> case this need only be 8 bits since I have less than 255 CsI detectors.
> Why is the overhead needed by ROOT so large ?. Is there any way to define
> the size of "fCsIs_" ?
> 
> Or, am I barking up the wrong tree and there is a more space
> efficient way of handling this ?
> 
> Many thanks,
> 
> Karl
> 
> ==========================================================================
> 
> CEA Saclay, DAPNIA/SPhN                Phone  : (33) 01 69 08 7553
> Bat 703 - l'Orme des Merisiers         Fax    : (33) 01 69 08 7584
> F-91191 Gif-sur-Yvette                 E-mail :  khauschild@cea.fr
> France                                           karl_hauschild@yahoo.co.uk
>                                        WWW: http://www-dapnia.cea.fr/Sphn



This archive was generated by hypermail 2b29 : Sat Jan 04 2003 - 23:50:38 MET