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