]>
Commit | Line | Data |
---|---|---|
e678600d | 1 | #include "AliOADBPWG2Spectra.h" |
6f841c90 | 2 | #include "AliOADBContainer.h" |
e678600d | 3 | #include "TNamed.h" |
4 | #include "TString.h" | |
5 | #include "TH1D.h" | |
6 | #include "TObject.h" | |
7 | #include "TList.h" | |
8 | #include "AliAnalysisManager.h" | |
9 | #include "TBrowser.h" | |
10 | #include "AliLog.h" | |
11 | ||
12 | ClassImp(AliOADBPWG2Spectra) | |
13 | ||
e3c81f72 | 14 | const char * AliOADBPWG2Spectra::fgkDetectorNames[] = {"ITS", "ITSTPC", "TPC", "TOF", "TOFTPC", "Dummy", "Dummy"}; |
15 | const char * AliOADBPWG2Spectra::fgkPidTypeNames[] = {"GaussFit", "NSigma", "Bayes", "Kinks"}; | |
16 | const char * AliOADBPWG2Spectra::fgkChargeTags[] = {"Pos", "Neg"}; | |
17 | const char * AliOADBPWG2Spectra::fgkParticleNames[] = {"Pion", "Kaon", "Proton"}; | |
e678600d | 18 | |
19 | ||
20 | AliOADBPWG2Spectra::AliOADBPWG2Spectra(): | |
21 | TNamed("Dummy", "OADB Object for PWG2 Spectra" ), fHistos(0) | |
22 | { | |
23 | // ctor | |
24 | ||
25 | ||
26 | ||
27 | } | |
e3c81f72 | 28 | AliOADBPWG2Spectra::AliOADBPWG2Spectra(const char* name) : |
e678600d | 29 | TNamed(name, "OADB Object for PWG2 Spectra" ), fHistos(0) |
30 | ||
31 | { | |
32 | // ctor | |
33 | // name is appended to all histos (e.g. "Corrected") | |
34 | ||
35 | Init(); | |
36 | ||
37 | } | |
38 | ||
39 | AliOADBPWG2Spectra::~AliOADBPWG2Spectra() { | |
40 | // dtor | |
41 | if(fHistos) delete fHistos; | |
42 | } | |
43 | ||
44 | void AliOADBPWG2Spectra::Init() { | |
45 | fHistos = new TList(); | |
46 | } | |
47 | ||
48 | ||
49 | const char * AliOADBPWG2Spectra::GetOADBPWG2SpectraFileName() { | |
50 | // get file name to the OADB | |
51 | static TString filename; | |
6f841c90 | 52 | filename.Form("%s/PWG2/SPECTRA/spectraResults.root", AliOADBContainer::GetOADBPath()); |
e678600d | 53 | return filename.Data(); |
54 | ||
55 | } | |
e3c81f72 | 56 | const char * AliOADBPWG2Spectra::GetHistoName(Int_t det, Int_t pidType, Int_t part, |
57 | Int_t charge, const char * centrTag, Int_t centrBin) { | |
e678600d | 58 | |
59 | // Returns histogram name | |
60 | // h[Name]_[Detector(s)]_[PIDType]_[Particle]_[Pos|Neg]_[MultiplicityOrCentralityIndex] | |
61 | // where "name" is the name of this container | |
62 | ||
68037533 | 63 | |
e678600d | 64 | static TString histoName; |
e3c81f72 | 65 | if (centrTag) { |
66 | if(!strcmp(centrTag,"MB")){ | |
67 | // don't put a index for MB spectra | |
68 | histoName.Form("h%s_%s_%s_%s_%s_%s", GetName(), fgkDetectorNames[det], fgkPidTypeNames[pidType], fgkParticleNames[part], fgkChargeTags[charge], centrTag); | |
69 | } | |
70 | else { | |
71 | histoName.Form("h%s_%s_%s_%s_%s_%s_%d", GetName(), fgkDetectorNames[det], fgkPidTypeNames[pidType], fgkParticleNames[part], fgkChargeTags[charge], centrTag, centrBin); | |
72 | } | |
73 | } | |
e678600d | 74 | else |
e3c81f72 | 75 | histoName.Form("h%s_%s_%s_%s_%s", GetName(), fgkDetectorNames[det], fgkPidTypeNames[pidType], fgkParticleNames[part], fgkChargeTags[charge]); |
e678600d | 76 | |
77 | return histoName.Data(); | |
78 | } | |
79 | ||
e3c81f72 | 80 | TH1D * AliOADBPWG2Spectra::GetHisto(Int_t det, Int_t pidType, Int_t part, |
81 | Int_t charge, const char * centrTag, Int_t centrBin){ | |
e678600d | 82 | |
83 | // Get an histogram from the list | |
84 | const char * name = GetHistoName(det,pidType,part,charge,centrTag,centrBin); | |
85 | TH1D * h = (TH1D*) fHistos->FindObject(name); | |
86 | return h; | |
87 | ||
88 | } | |
89 | ||
e3c81f72 | 90 | void AliOADBPWG2Spectra::AddHisto(TH1D * h, Int_t det, Int_t pidType, Int_t part, |
91 | Int_t charge, const char * centrTag, Int_t centrBin) { | |
e678600d | 92 | // Add a histogram to the list |
68037533 | 93 | // Rename and rebinn it if necessary |
94 | ||
95 | if(!h) { | |
96 | AliWarning("Empty pointer to histogram"); | |
97 | return; | |
98 | } | |
99 | ||
68037533 | 100 | static TH1D * htest = BookHisto(kDetDummy, kGaussFit,kPion, kPos); |
e3c81f72 | 101 | const char * name = GetHistoName(det,pidType,part,charge,centrTag,centrBin); |
68037533 | 102 | if(!CompareBinning(h,htest)){ |
13242232 | 103 | AliWarning("Histo have different binning! Rebinning to standard"); |
104 | { | |
68037533 | 105 | h = GetHistoStandardBinning(h,det,pidType,part,charge,centrTag,centrBin); |
106 | } | |
107 | } | |
e3c81f72 | 108 | if(!fHistos) { |
109 | AliError("fHistos not allocated!!"); | |
110 | return; | |
111 | } | |
112 | ||
e678600d | 113 | TH1D * hold = (TH1D*) fHistos->FindObject(name); |
114 | if (hold) fHistos->Remove(hold); | |
115 | delete hold; | |
116 | if(strcmp(h->GetName(),name)){ | |
e3c81f72 | 117 | AliWarning(Form("Histogram names are not consinstent %s-%s, resetting", h->GetName(),name)); |
e678600d | 118 | h->SetName(name); |
119 | } | |
120 | fHistos->Add(h); | |
121 | ||
122 | ||
123 | } | |
124 | ||
e3c81f72 | 125 | TH1D * AliOADBPWG2Spectra::BookHisto(Int_t det, Int_t pidType, Int_t part, |
126 | Int_t charge, const char * centrTag, Int_t centrBin) { | |
e678600d | 127 | |
128 | // book a histogram according to the template. All the histograms | |
129 | // should have the same binning (if possible/reasonable) to | |
130 | // facilitate the compoarison and the combination | |
131 | ||
e3c81f72 | 132 | const Float_t templBins[] = {0.05,0.1,0.12,0.14,0.16,0.18,0.20,0.25,0.30,0.35,0.4,0.45,0.5,0.55,0.6,0.65,0.7,0.75,0.8,0.85,0.9,0.95,1.0,1.1,1.2,1.3,1.4,1.5,1.6,1.7,1.8,1.9,2.0,2.1,2.2,2.3,2.4,2.5,2.6,2.7,2.8,2.9,3.0,3.2,3.4,3.6,3.8,4.0,4.2,4.4,4.6,4.8,5.0}; |
133 | Int_t nbinsTempl=52; | |
e678600d | 134 | const char * name = GetHistoName(det,pidType,part,charge,centrTag,centrBin); |
135 | TH1D * h = new TH1D(name, name, nbinsTempl, templBins); | |
136 | return h; | |
137 | ||
138 | } | |
139 | ||
140 | void AliOADBPWG2Spectra::Browse(TBrowser *b) | |
141 | { | |
142 | // Browse this object. | |
143 | // If b=0, there is no Browse call TObject::Browse(0) instead. | |
144 | // This means TObject::Inspect() will be invoked indirectly | |
145 | ||
146 | ||
147 | if (b) { | |
148 | b->Add(fHistos); | |
149 | } | |
150 | else | |
151 | TObject::Browse(b); | |
152 | } | |
68037533 | 153 | |
e3c81f72 | 154 | TH1D * AliOADBPWG2Spectra::GetHistoStandardBinning(const TH1D* h, Int_t det, Int_t pidType, Int_t part, |
155 | Int_t charge, const char * centrTag, Int_t centrBin) { | |
68037533 | 156 | // Returns a histo with the standard binning and the same content of h |
157 | // if the bins of h are not a subset of the standard binning, it crashes with a fatal error | |
158 | // under and overflows are ignored | |
159 | ||
160 | // 1. Create a histogram with the standard binning | |
161 | TH1D * hStd = BookHisto(det, pidType, part, charge, centrTag, centrBin); | |
162 | Int_t nBinsH1=hStd->GetNbinsX(); | |
163 | Int_t nBinsH2=h->GetNbinsX(); | |
164 | // Loop over standard bins, | |
165 | for(Int_t iBin=1; iBin<=nBinsH1; iBin++){ | |
166 | Float_t lowPtH1 =hStd->GetBinLowEdge(iBin); | |
167 | Float_t binWidH1=hStd->GetBinWidth(iBin); | |
168 | // Loop over H2 bins and find overlapping bins to H1 | |
169 | for(Int_t jBin=1; jBin<=nBinsH2; jBin++){ | |
170 | Float_t lowPtH2=h->GetBinLowEdge(jBin); | |
171 | Float_t binWidH2=h->GetBinWidth(jBin); | |
172 | if(TMath::Abs(lowPtH1-lowPtH2)<0.001 && TMath::Abs(binWidH2-binWidH1)<0.001){ | |
e3c81f72 | 173 | hStd->SetBinContent(iBin, h->GetBinContent(jBin)); |
174 | hStd->SetBinError (iBin, h->GetBinError (jBin)); | |
68037533 | 175 | break; |
176 | } | |
177 | if(TMath::Abs(lowPtH1-lowPtH2)<0.001){ | |
e3c81f72 | 178 | AliError(Form("Found partially overlapping bins! [(%f,%f)(%f,%f)]",lowPtH1,binWidH1,lowPtH2,binWidH2)); |
179 | continue; | |
68037533 | 180 | } |
181 | } | |
182 | } | |
183 | return hStd; | |
184 | } | |
185 | ||
186 | Bool_t AliOADBPWG2Spectra::CompareBinning(TH1 * h1, TH1 * h2) { | |
187 | ||
188 | // returns true if h1 and h2 have the same binning | |
189 | Int_t nbins1 = h1->GetNbinsX(); | |
190 | Int_t nbins2 = h2->GetNbinsX(); | |
191 | ||
192 | if(nbins1 != nbins2) return kFALSE; | |
193 | ||
194 | for(Int_t ibin = 1; ibin <= nbins1; ibin++){ | |
e3c81f72 | 195 | if(TMath::Abs(h1->GetBinLowEdge(ibin) - h2->GetBinLowEdge(ibin))>0.001) return kFALSE; |
196 | if(TMath::Abs(h1->GetBinWidth(ibin) - h2->GetBinWidth(ibin))>0.001) return kFALSE; | |
68037533 | 197 | } |
198 | ||
199 | return kTRUE; | |
200 | } |