]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PWGLF/ThermalFits/AliParticleYield.h
Bug fix: clone data member pointers in assignment operator
[u/mrichter/AliRoot.git] / PWGLF / ThermalFits / AliParticleYield.h
1 #ifndef _ALIPARTICLEYIELD_H_
2 #define _ALIPARTICLEYIELD_H_
3
4 // AliParticleYield
5 // This class implements a container for particle yields results, to
6 // be used e.g. in thermal model fits, with utility methods to
7 // read/write to ASCII files or root trees
8 // Author: Michele Floris, michele.floris@cern.ch
9
10 #include "TObject.h"
11 #include "TString.h"
12 #include "TCut.h"
13
14 class TClonesArray;
15 class TTree;
16 class AliParticleYield : public TObject
17 {
18 public:
19
20   enum AliPYCSystem_t {kCSpp   = 0, 
21                        kCSpPb  = 1, 
22                        kCSPbPb = 2 } ;
23
24   static const char * kSystemString[];
25
26   enum AliPYStatusCode_t {
27     kSCPublished   = 0,
28     kSCPreliminary = 1,
29     kSCFinalNotPublished = 2,
30     kSCMayChange   = 3,
31   };
32
33   static const char * kStatusString[];
34
35   enum AliPYMeasurementType_t { // this is a bit mask: more than one bit can be one (be careful not to set mutually exclusive ones).
36     // Type of measurements
37     kTypeLinearInterpolation = 0x1,
38     kTypeParticleRatio       = 0x2,  // If true, this is a ratio of 2 particles where the propagation of uncertainty was properly taken into account. 
39     kTypeAverageAndRefit     = 0x4,  // this means that the measurement has been obtained summing several spectra in smaller centality bins (weihgted by the width of the centrality bin) and refitting them
40     kTypeExtrPionRatio       = 0x8,  // Extrapolated from a different centrality bin, assumin the ratio to pions is constant
41     kTypeExtrFit             = 0x20, // Extrapolated fitting the centrality dependence vs npart
42
43     // Type of errors
44     kTypeOnlyTotError        = 0x10, // If on, only the total error is returned as "GetSystError". GetStatError should be set to 0;
45
46     // Additional flags
47     kTypeAveragePartAntiPart = 0x100, // Can only be set if isSum = 1. It indicates that it is an averrage rather than a sum TODO: add separate bits for different averages (e.g. quadratic)?           
48
49   };
50   
51   AliParticleYield();
52   AliParticleYield(Int_t pdg, Int_t system, Float_t sqrts, Float_t value, Float_t stat, Float_t syst, Float_t norm, Float_t ymin, Float_t ymax, Int_t status, Int_t type, TString centr, Int_t isSum = 0, TString tag = "ALICE");
53   AliParticleYield(Int_t pdg, Int_t system, Float_t sqrts, Float_t value, Float_t stat, Float_t syst, Float_t normPos, Float_t normNeg, Float_t ymin, Float_t ymax, Int_t status, Int_t type, TString centr, Int_t isSum = 0, TString tag = "ALICE");
54   virtual ~AliParticleYield();
55   AliParticleYield(const AliParticleYield& part); 
56   
57   // IO
58   static TClonesArray * ReadFromASCIIFile(const char * fileName, const char * separators = " \t");
59   static TTree * ReadFromASCIIFileAsTree(const char * fileName, const char * separators = " \t");
60   static void SaveAsASCIIFile(TClonesArray * arr, const char * filename, const char * separator = " ", Int_t colWidth = 7);  
61   static void WriteThermusFile(TClonesArray * arr, const char * filename, Int_t colWidth = 10);
62   static TClonesArray * GetEntriesMatchingSelection(TTree * tree, TCut selection); 
63   static TTree * GetTreeFromArray(TClonesArray * arr) ;
64
65   // Misc helpers
66   Bool_t CheckTypeConsistency() const;
67   Bool_t CheckForDuplicates(TClonesArray * arr) ;
68   virtual void Print (Option_t * opt = "") const;
69   static Float_t GetError(TString error, Float_t yield) ;
70   static const char * FormatCol(const char * text, Int_t width,  const char * sep =" ") ;
71   static Double_t RoundToSignificantFigures(double num, int n) ;  
72   static AliParticleYield * FindParticle(TClonesArray * arr, Int_t pdg, Int_t system, Float_t sqrts, TString centrality = "", Int_t isSum = -1, Int_t status = -1, Int_t pdg2 = 0);
73   static AliParticleYield * FindRatio   (TClonesArray * arr, Int_t pdg, Int_t pdg2, Int_t system, Float_t sqrts, TString centrality="", Int_t isSum = -1, Int_t status = -1) { return FindParticle(arr, pdg, system, sqrts, centrality, isSum, status, pdg2); }
74   Bool_t operator==(const AliParticleYield& rhs);
75   Bool_t IsTheSameMeasurement(AliParticleYield &rhs);
76   static AliParticleYield * Divide(AliParticleYield * part1, AliParticleYield * part2, Double_t correlatedError = 0, Option_t * opt="");
77   static AliParticleYield * Add   (AliParticleYield * part1, AliParticleYield * part2, Double_t correlatedError = 0, Option_t * opt="");
78   void Scale(Float_t scale) ;
79
80   // Getters
81   TString GetCentr()           const{ return fCentr           ;}
82   Int_t   GetCollisionSystem() const{ return fCollisionSystem ;}
83   Int_t   GetIsSum()           const{ return fIsSum           ;}
84   Int_t   GetPdgCode()         const{ return fPdgCode         ;}
85   Int_t   GetPdgCode2()        const{ return fPdgCode2; }
86   Float_t GetSqrtS()           const{ return fSqrtS           ;}
87   Float_t GetYield()           const{ return fYield           ;}
88   Float_t GetNormError()       const;
89   Float_t GetNormErrorNeg()    const{ return fNormErrorNeg; }
90   Float_t GetNormErrorPos()    const{ return fNormErrorPos; }
91
92   TString GetPartName()        const{ return fPartName        ;}
93   Float_t GetStatError()       const{ return fStatError       ;}
94   Int_t   GetStatus()          const{ return fStatus          ;}
95   Float_t GetSystError()       const{ return fSystError       ;}
96   Float_t GetYMax()            const{ return fYMax            ;}
97   Float_t GetYMin()            const{ return fYMin            ;}
98   UInt_t  GetMeasurementType() const{ return fMeasurementType ;}
99   TString GetTag()             const{ return fTag; }
100
101   const char * GetLatexName(Int_t pdg = 0)  const;
102   Float_t GetTotalError(Bool_t includeNormalization = kFALSE) const;
103
104   Bool_t  IsTypeMeasured()     const{ CheckTypeConsistency(); return (!(fMeasurementType & kTypeLinearInterpolation) && !(fMeasurementType & kTypeExtrPionRatio));}
105   Bool_t  IsTypeRatio()        const{ CheckTypeConsistency(); return (fMeasurementType & kTypeParticleRatio);}
106   Bool_t  IsTypeExtrapolatedWithPionRatio() const { CheckTypeConsistency(); return (fMeasurementType & kTypeExtrPionRatio);}
107   Bool_t  IsTypeLinearInterp() const{ CheckTypeConsistency(); return fMeasurementType & kTypeLinearInterpolation;}
108   Bool_t  IsTypeOnlyTotErr()   const{ CheckTypeConsistency(); return fMeasurementType & kTypeOnlyTotError;       }
109   Bool_t  IsTypeAverage()       const{CheckTypeConsistency(); return fMeasurementType & kTypeAveragePartAntiPart;}
110
111   static Int_t   GetSignificantDigits()  { return fSignificantDigits; }
112
113   // Setters
114   void SetCentr           (TString var           ) { fCentr = var           ;}
115   void SetCollisionSystem (AliPYCSystem_t var    ) { fCollisionSystem = var ;}
116   void SetIsSum           (Int_t var             ) { fIsSum = var           ;}
117   void SetPdgCode         (Int_t var             ) { fPdgCode = var ; SetPartName(var);}
118   void SetPdgCode2        (Int_t var             ) { fPdgCode2 = var;        }  
119   void SetSqrtS           (Float_t var           ) { fSqrtS = var           ;}
120   void SetYield           (Float_t var           ) { fYield = var           ;}
121   void SetNormError       (Float_t var           ) { fNormErrorPos = var    ; fNormErrorNeg=0;};
122   void SetNormErrorNeg    (Float_t var           ) { fNormErrorNeg = var;}
123   void SetNormErrorPos    (Float_t var           ) { fNormErrorPos = var;}
124   void SetPartName        (TString var           ) { fPartName = var; SetPdgCode(var); }
125   void SetStatError       (Float_t var           ) { fStatError = var       ;}
126   void SetStatus          (AliPYStatusCode_t var ) { fStatus = var          ;}
127   void SetSystError       (Float_t var           ) { fSystError = var       ;}
128   void SetYMax            (Float_t var           ) { fYMax = var            ;}
129   void SetYMin            (Float_t var           ) { fYMin = var            ;}
130   void SetMeasurementType (UInt_t var            ) { fMeasurementType = var ;}
131   void SetTag             (TString var           ) { fTag = var;}
132   //This 2 additional setters will ensure consistency between the pdg code and the name of the particle
133   void SetPartName(Int_t pdgCode);
134   void SetPdgCode (TString partName);
135
136   void SetTypeBits(UInt_t mask) { fMeasurementType |= mask; } // This switches on the bits passed. Does not affect the others! If you want to set the Whole mask, use SetMeasurementType
137
138   static void SetSignificantDigits (Int_t var) { fSignificantDigits = var;}
139   
140
141
142
143 private:
144
145   static Bool_t   Compare2Floats(Float_t a, Float_t b) ;
146   static Double_t SumErrors(AliParticleYield * part1, AliParticleYield * part2, Int_t error, Option_t * opt) ;
147   void CombineMetadata(AliParticleYield *part1, AliParticleYield*part2, const char * pdgSep) ;
148
149
150   Int_t   fPdgCode;         // PdgCode
151   Int_t   fPdgCode2;        // The PdgCode of the second particle, only needed in case of a ratio
152   TString fPartName;        // Particle name (redundant, we also have PDG code)
153   Int_t   fCollisionSystem; // Collision System, see the AliPYCSystem_t enum for possible values
154   Float_t fSqrtS;           // center of mass energy, in GeV
155   Float_t fYield;           // The yield
156   Float_t fStatError;       // StatError
157   Float_t fSystError;       // SystError
158   Float_t fNormErrorPos;    // Normalization error, if the error is simmetric, this is used as the symmetric error. Otherwise it is just the positive one
159   Float_t fNormErrorNeg;    // Normalization error (negative)
160   Float_t fYMin;            // min rapidity cut
161   Float_t fYMax;            // max rapidity cut
162   Int_t   fStatus;          // Status code, to determine the quality of the measurement, see AliPYStatusCode_t for possible values
163
164
165
166   UInt_t  fMeasurementType; // Measurement Type, e.g. actually measured, interpolated from 2 centrality bins  or only total error given, etc. THIS IS A BIT MASK see AliPYMeasurementType_t for possible values and the IsType* Methods for easy access. Be carefull not to set mutually exclusive values
167
168   TString fCentr;           // Centrality. The format is estimator 3-digits id, bin low-edge 2 digits, bin hi-edge 2 digits , e.g. V0A0005
169   Int_t   fIsSum;           // A flag which indicates if the yield is for a single charge or for the sum. 0 = single charge, 1 = particle + antiparticle
170   TString fTag;             // Generic text tag (to be used e.g. for the name of the experiment)
171
172
173   static Int_t fSignificantDigits; // Significant Digits to be used in values and errors
174   static Float_t fEpsilon; // Used for float conparisons
175
176   ClassDef(AliParticleYield,2)
177 };
178
179
180 #endif /* _ALIPARTICLEYIELD_H_ */