]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PWGLF/ThermalFits/AliParticleYield.h
Improved computation of ratios for part+antipart
[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   
47   AliParticleYield();
48   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");
49   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");
50   virtual ~AliParticleYield();
51   AliParticleYield(const AliParticleYield& part); 
52   
53   // IO
54   static TClonesArray * ReadFromASCIIFile(const char * fileName, const char * separators = " \t");
55   static TTree * ReadFromASCIIFileAsTree(const char * fileName, const char * separators = " \t");
56   static void SaveAsASCIIFile(TClonesArray * arr, const char * filename, const char * separator = " ", Int_t colWidth = 7);  
57   static void WriteThermusFile(TClonesArray * arr, const char * filename, Int_t colWidth = 10);
58   static TClonesArray * GetEntriesMatchingSelection(TTree * tree, TCut selection); 
59   static TTree * GetTreeFromArray(TClonesArray * arr) ;
60
61   // Misc helpers
62   Bool_t CheckTypeConsistency() const;
63   Bool_t CheckForDuplicates(TClonesArray * arr) ;
64   virtual void Print (Option_t * opt = "") const;
65   static Float_t GetError(TString error, Float_t yield) ;
66   static const char * FormatCol(const char * text, Int_t width,  const char * sep =" ") ;
67   static Double_t RoundToSignificantFigures(double num, int n) ;  
68   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);
69   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); }
70   Bool_t operator==(const AliParticleYield& rhs);
71   Bool_t IsTheSameMeasurement(AliParticleYield &rhs);
72   static AliParticleYield * Divide(AliParticleYield * part1, AliParticleYield * part2, Double_t correlatedError = 0, Option_t * opt="");
73   static AliParticleYield * Add   (AliParticleYield * part1, AliParticleYield * part2, Double_t correlatedError = 0, Option_t * opt="");
74   void Scale(Float_t scale) ;
75
76   // Getters
77   TString GetCentr()           const{ return fCentr           ;}
78   Int_t   GetCollisionSystem() const{ return fCollisionSystem ;}
79   Int_t   GetIsSum()           const{ return fIsSum           ;}
80   Int_t   GetPdgCode()         const{ return fPdgCode         ;}
81   Int_t   GetPdgCode2()        const{ return fPdgCode2; }
82   Float_t GetSqrtS()           const{ return fSqrtS           ;}
83   Float_t GetYield()           const{ return fYield           ;}
84   Float_t GetNormError()       const;
85   Float_t GetNormErrorNeg()    const{ return fNormErrorNeg; }
86   Float_t GetNormErrorPos()    const{ return fNormErrorPos; }
87
88   TString GetPartName()        const{ return fPartName        ;}
89   Float_t GetStatError()       const{ return fStatError       ;}
90   Int_t   GetStatus()          const{ return fStatus          ;}
91   Float_t GetSystError()       const{ return fSystError       ;}
92   Float_t GetYMax()            const{ return fYMax            ;}
93   Float_t GetYMin()            const{ return fYMin            ;}
94   UInt_t  GetMeasurementType() const{ return fMeasurementType ;}
95   TString GetTag()             const{ return fTag; }
96
97   const char * GetLatexName(Int_t pdg = 0)  const;
98   Float_t GetTotalError(Bool_t includeNormalization = kFALSE) const;
99
100   Bool_t  IsTypeMeasured()     const{ CheckTypeConsistency(); return (!(fMeasurementType & kTypeLinearInterpolation) && !(fMeasurementType & kTypeExtrPionRatio));}
101   Bool_t  IsTypeRatio()        const{ CheckTypeConsistency(); return (fMeasurementType & kTypeParticleRatio);}
102   Bool_t  IsTypeExtrapolatedWithPionRatio() const { CheckTypeConsistency(); return (fMeasurementType & kTypeExtrPionRatio);}
103   Bool_t  IsTypeLinearInterp() const{ CheckTypeConsistency(); return fMeasurementType & kTypeLinearInterpolation;}
104   Bool_t  IsTypeOnlyTotErr()   const{ CheckTypeConsistency(); return fMeasurementType & kTypeOnlyTotError;       }
105
106   static Int_t   GetSignificantDigits()  { return fSignificantDigits; }
107
108   // Setters
109   void SetCentr           (TString var           ) { fCentr = var           ;}
110   void SetCollisionSystem (AliPYCSystem_t var    ) { fCollisionSystem = var ;}
111   void SetIsSum           (Int_t var             ) { fIsSum = var           ;}
112   void SetPdgCode         (Int_t var             ) { fPdgCode = var ; SetPartName(var);}
113   void SetPdgCode2        (Int_t var             ) { fPdgCode2 = var;        }  
114   void SetSqrtS           (Float_t var           ) { fSqrtS = var           ;}
115   void SetYield           (Float_t var           ) { fYield = var           ;}
116   void SetNormError       (Float_t var           ) { fNormErrorPos = var    ; fNormErrorNeg=0;};
117   void SetNormErrorNeg    (Float_t var           ) { fNormErrorNeg = var;}
118   void SetNormErrorPos    (Float_t var           ) { fNormErrorPos = var;}
119   void SetPartName        (TString var           ) { fPartName = var; SetPdgCode(var); }
120   void SetStatError       (Float_t var           ) { fStatError = var       ;}
121   void SetStatus          (AliPYStatusCode_t var ) { fStatus = var          ;}
122   void SetSystError       (Float_t var           ) { fSystError = var       ;}
123   void SetYMax            (Float_t var           ) { fYMax = var            ;}
124   void SetYMin            (Float_t var           ) { fYMin = var            ;}
125   void SetMeasurementType (UInt_t var            ) { fMeasurementType = var ;}
126   void SetTag             (TString var           ) { fTag = var;}
127   //This 2 additional setters will ensure consistency between the pdg code and the name of the particle
128   void SetPartName(Int_t pdgCode);
129   void SetPdgCode (TString partName);
130
131   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
132
133   static void SetSignificantDigits (Int_t var) { fSignificantDigits = var;}
134   
135
136
137
138 private:
139
140   static Bool_t   Compare2Floats(Float_t a, Float_t b) ;
141   static Double_t SumErrors(AliParticleYield * part1, AliParticleYield * part2, Int_t error, Option_t * opt) ;
142   void CombineMetadata(AliParticleYield *part1, AliParticleYield*part2, const char * pdgSep) ;
143
144
145   Int_t   fPdgCode;         // PdgCode
146   Int_t   fPdgCode2;        // The PdgCode of the second particle, only needed in case of a ratio
147   TString fPartName;        // Particle name (redundant, we also have PDG code)
148   Int_t   fCollisionSystem; // Collision System, see the AliPYCSystem_t enum for possible values
149   Float_t fSqrtS;           // center of mass energy, in GeV
150   Float_t fYield;           // The yield
151   Float_t fStatError;       // StatError
152   Float_t fSystError;       // SystError
153   Float_t fNormErrorPos;    // Normalization error, if the error is simmetric, this is used as the symmetric error. Otherwise it is just the positive one
154   Float_t fNormErrorNeg;    // Normalization error (negative)
155   Float_t fYMin;            // min rapidity cut
156   Float_t fYMax;            // max rapidity cut
157   Int_t   fStatus;          // Status code, to determine the quality of the measurement, see AliPYStatusCode_t for possible values
158
159
160
161   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
162
163   TString fCentr;           // Centrality. The format is estimator 3-digits id, bin low-edge 2 digits, bin hi-edge 2 digits , e.g. V0A0005
164   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
165   TString fTag;             // Generic text tag (to be used e.g. for the name of the experiment)
166
167
168   static Int_t fSignificantDigits; // Significant Digits to be used in values and errors
169   static Float_t fEpsilon; // Used for float conparisons
170
171   ClassDef(AliParticleYield,2)
172 };
173
174
175 #endif /* _ALIPARTICLEYIELD_H_ */