]>
Commit | Line | Data |
---|---|---|
a8ad4709 | 1 | #include<stdio.h> |
2 | #include "AliPIDperfContainer.h" | |
3 | #include "TList.h" | |
4 | ||
5 | ClassImp(AliPIDperfContainer); | |
6 | ||
8190aa9f | 7 | AliPIDperfContainer::AliPIDperfContainer(const char *name, Int_t nvar,const Int_t* binVar) : |
a8ad4709 | 8 | TNamed(name,name), |
9 | fNbinVar(new TArrayI(nvar)), | |
10 | fXmin(new TArrayF(nvar)), | |
11 | fXmax(new TArrayF(nvar)), | |
12 | fNameVar(new TClonesArray("TNamed")), | |
13 | fQA(new TClonesArray("TH2F")) | |
14 | { | |
15 | ||
16 | for(Int_t i=0;i < GetNvar();i++){ | |
17 | (*fNbinVar)[i] = binVar[i]; | |
18 | } | |
19 | ||
20 | for(Int_t i=0; i<GetNvar();i++){ | |
21 | new((*fNameVar)[i]) TNamed("",""); | |
22 | } | |
23 | ||
24 | SetTitleX(""); | |
25 | SetTitleY(""); | |
26 | } | |
27 | ||
28 | AliPIDperfContainer::AliPIDperfContainer() : | |
29 | TNamed("qa","qa"), | |
30 | fNbinVar(new TArrayI(0)), | |
31 | fXmin(new TArrayF(0)), | |
32 | fXmax(new TArrayF(0)), | |
33 | fNameVar(new TClonesArray("TNamed")), | |
34 | fQA(new TClonesArray("TH2F")) | |
35 | { | |
36 | SetTitleX(""); | |
37 | SetTitleY(""); | |
38 | } | |
39 | ||
40 | AliPIDperfContainer::~AliPIDperfContainer(){ | |
41 | for(Int_t i=fNameVar->GetEntries();i>0;i--){ | |
42 | delete fNameVar->At(i-1); | |
43 | fNameVar->RemoveAt(i-1); | |
44 | } | |
45 | ||
46 | for(Int_t i=fQA->GetEntries();i>0;i--){ | |
47 | delete fQA->At(i-1); | |
48 | fQA->RemoveAt(i-1); | |
49 | } | |
50 | ||
51 | delete fNbinVar; | |
52 | delete fXmin; | |
53 | delete fXmax; | |
54 | } | |
55 | ||
56 | void AliPIDperfContainer::Reset(){ | |
57 | for(Int_t i=fNameVar->GetEntries();i>0;i--){ | |
58 | delete fNameVar->At(i-1); | |
59 | fNameVar->RemoveAt(i-1); | |
60 | } | |
61 | ||
62 | for(Int_t i=fQA->GetEntries();i>0;i--){ | |
63 | delete fQA->At(i-1); | |
64 | fQA->RemoveAt(i-1); | |
65 | } | |
66 | ||
67 | delete fNbinVar; | |
68 | delete fXmin; | |
69 | delete fXmax; | |
70 | ||
71 | fNbinVar = new TArrayI(0); | |
72 | fXmin = new TArrayF(0); | |
73 | fXmax = new TArrayF(0); | |
74 | ||
75 | } | |
76 | ||
77 | AliPIDperfContainer::AliPIDperfContainer(const AliPIDperfContainer &old) : | |
78 | TNamed(old), | |
79 | fNbinVar(NULL), | |
80 | fXmin(NULL), | |
81 | fXmax(NULL), | |
82 | fNameVar(new TClonesArray("TNamed")), | |
83 | fQA(new TClonesArray("TH2F")) | |
84 | { | |
85 | ||
86 | fNbinVar = new TArrayI(old.GetNvar()); | |
87 | fXmin = new TArrayF(old.GetNvar()); | |
88 | fXmax = new TArrayF(old.GetNvar()); | |
89 | ||
90 | for(Int_t i=0; i<old.GetNhistos();i++){ | |
91 | new((*fQA)[i]) TH2F(*((TH2F *) old.GetQA(i))); | |
92 | } | |
93 | ||
94 | for(Int_t i=0; i<old.GetNvar();i++){ | |
95 | new((*fNameVar)[i]) TNamed(old.GetVarName(i),old.GetVarName(i)); | |
96 | } | |
97 | ||
98 | for(Int_t i=0;i < GetNvar();i++){ | |
99 | (*fNbinVar)[i] = (*old.fNbinVar)[i]; | |
100 | (*fXmin)[i] = (*old.fXmin)[i]; | |
101 | (*fXmax)[i] = (*old.fXmax)[i]; | |
102 | } | |
103 | ||
f4c4ac9e | 104 | SetTitleX(old.GetTitleX()); |
105 | SetTitleY(old.GetTitleY()); | |
a8ad4709 | 106 | } |
107 | ||
108 | AliPIDperfContainer& AliPIDperfContainer::operator=(const AliPIDperfContainer &old){ | |
109 | ||
110 | if(this != &old){ | |
111 | printf("different\n"); | |
112 | } | |
113 | ||
114 | for(Int_t i=0; i<old.GetNhistos();i++){ | |
115 | new((*fQA)[i]) TH2F(*((TH2F *) old.GetQA(i))); | |
116 | } | |
117 | ||
118 | fNbinVar = new TArrayI(old.GetNvar()); | |
119 | fXmin = new TArrayF(old.GetNvar()); | |
120 | fXmax = new TArrayF(old.GetNvar()); | |
121 | ||
122 | for(Int_t i=0;i < old.GetNvar();i++){ | |
123 | (*fNbinVar)[i] = (*old.fNbinVar)[i]; | |
124 | (*fXmin)[i] = (*old.fXmin)[i]; | |
125 | (*fXmax)[i] = (*old.fXmax)[i]; | |
126 | } | |
127 | ||
128 | fNameVar = new TClonesArray("TNamed"); | |
129 | for(Int_t i=0; i<old.GetNvar();i++){ | |
130 | new((*fNameVar)[i]) TNamed(old.GetVarName(i),old.GetVarName(i)); | |
131 | } | |
132 | ||
133 | return *this; | |
134 | } | |
135 | ||
136 | Int_t AliPIDperfContainer::GetNspecies() const{ | |
137 | Int_t n = fQA->GetEntries(); | |
138 | ||
139 | for(Int_t i=0;i < GetNvar();i++){ | |
140 | n /= (*fNbinVar)[i]; | |
141 | } | |
142 | ||
143 | return n; | |
144 | } | |
145 | ||
146 | void AliPIDperfContainer::AddSpecies(const char *name,Int_t nXbin,const Double_t *xbin,Int_t nYbin,const Double_t *ybin){ | |
147 | ||
148 | Bool_t kErr = kFALSE; | |
149 | for(Int_t i=0;i < GetNvar();i++){ // check the var ranges are set properly | |
150 | if((*fNbinVar)[i] < 1 || (*fXmin)[i] >= (*fXmax)[i]){ | |
151 | printf("var ranges are not set properly for variable %i please chek it before to define the species\n",i); | |
152 | kErr = kTRUE; | |
153 | } | |
154 | } | |
155 | if(kErr){ | |
156 | printf("AddSpecies: NOTHING DONE\n"); | |
157 | return; | |
158 | } | |
159 | ||
160 | Int_t ncomb = 1; | |
161 | for(Int_t i=0;i < GetNvar();i++){ | |
162 | ncomb *= (*fNbinVar)[i]; | |
163 | } | |
164 | ||
165 | char nameHisto[200]; | |
166 | char title[300]; | |
167 | char title2[300]; | |
168 | for(Int_t i=0; i < ncomb;i++){ | |
169 | snprintf(nameHisto,200,"%s_%s_%i",GetName(),name,i); | |
170 | snprintf(title,300,"%s",name); | |
171 | Int_t ncombTemp = i; | |
172 | for(Int_t j=0;j < GetNvar();j++){ | |
173 | Int_t ibin = ncombTemp%(*fNbinVar)[j]; | |
174 | snprintf(title2,300,"%s",title); | |
175 | snprintf(title,300,"%s_%04.1f<%s<%04.1f",title2,(*fXmin)[j] + ((*fXmax)[j]-(*fXmin)[j])/(*fNbinVar)[j]*ibin,fNameVar->At(j)->GetName(),(*fXmin)[j] + ((*fXmax)[j]-(*fXmin)[j])/(*fNbinVar)[j]*(ibin+1)); | |
176 | ncombTemp /= (*fNbinVar)[j]; | |
177 | } | |
178 | ||
179 | new((*fQA)[GetNhistos()]) TH2F(nameHisto,title,nXbin,xbin,nYbin,ybin); | |
180 | ((TH2F *) GetQA(GetNhistos()-1))->GetXaxis()->SetTitle(fTitleX); | |
181 | ((TH2F *) GetQA(GetNhistos()-1))->GetYaxis()->SetTitle(fTitleY); | |
182 | } | |
183 | } | |
184 | ||
185 | Int_t AliPIDperfContainer::Add(const AliPIDperfContainer *oth){ | |
186 | if(GetNhistos() == oth->GetNhistos()){ | |
187 | for(Int_t i=0;i < GetNhistos();i++){ | |
188 | GetQA(i)->Add(oth->GetQA(i)); | |
189 | } | |
190 | return 0; | |
191 | } | |
192 | else{ | |
193 | printf("ADD error: number of objects is different (%i != %i)\n",GetNhistos(),oth->GetNhistos()); | |
194 | return 1; | |
195 | } | |
196 | } | |
197 | ||
198 | void AliPIDperfContainer::SetVarRange(Int_t ivar,Float_t xMin,Float_t xMax){ | |
199 | if(!GetNhistos()){ | |
200 | (*fXmin)[ivar]=xMin; | |
201 | (*fXmax)[ivar]=xMax; | |
202 | } | |
203 | else{ // to avoid different range among the histos | |
204 | printf("Ranges should be set before to define the species\nNOTHING DONE\n"); | |
205 | } | |
206 | ||
207 | } | |
208 | ||
209 | void AliPIDperfContainer::Fill(Int_t species,Float_t var1,Float_t var2,Float_t x[]){ | |
210 | Int_t ncomb = 1; | |
211 | Int_t histo = 0; | |
212 | ||
213 | for(Int_t i=0;i < GetNvar();i++){ | |
214 | Int_t ibin = GetBin(i,x[i]); | |
215 | if(ibin < 0 || ibin >= (*fNbinVar)[i]){ | |
216 | printf("%i) %i not good w.r.t. %i (%f) (%f,%f)\n",i,ibin,(*fNbinVar)[i],x[i],(*fXmin)[i],(*fXmax)[i]); | |
217 | return; | |
218 | } | |
219 | histo += ncomb * ibin; | |
220 | ncomb *= (*fNbinVar)[i]; | |
221 | } | |
222 | histo += species*ncomb; | |
223 | DirectFill(histo,var1,var2); | |
224 | }; | |
225 | ||
226 | TH2F *AliPIDperfContainer::GetQA(Int_t species,Float_t x[]) const{ | |
227 | Int_t ncomb = 1; | |
228 | Int_t histo = 0; | |
229 | ||
230 | for(Int_t i=0;i < GetNvar();i++){ | |
231 | Int_t ibin = GetBin(i,x[i]); | |
232 | if(ibin < 0 || ibin >= (*fNbinVar)[i]){ | |
233 | printf("%i) %i not good w.r.t. %i (%f) (%f,%f)\n",i,ibin,(*fNbinVar)[i],x[i],(*fXmin)[i],(*fXmax)[i]); | |
234 | return NULL; | |
235 | } | |
236 | histo += ncomb * ibin; | |
237 | ncomb *= (*fNbinVar)[i]; | |
238 | } | |
239 | histo += species*ncomb; | |
240 | ||
241 | ||
242 | return GetQA(histo); | |
243 | ||
244 | } | |
245 | ||
246 | TH2F *AliPIDperfContainer::GetQA(Int_t species,Float_t xMin[],Float_t xMax[]) const{ | |
247 | if(GetNvar()){ | |
248 | char title[300]; | |
249 | char title2[300]; | |
250 | Int_t ncomb = 1; | |
251 | for(Int_t i=0;i < GetNvar();i++){ | |
252 | ncomb *= (*fNbinVar)[i]; | |
253 | } | |
254 | ||
255 | TH2F *htemplate = GetQA(species*ncomb); | |
256 | TH2F *temp = new TH2F(*htemplate); | |
257 | temp->SetName("histo"); | |
258 | temp->Reset(); | |
259 | snprintf(title,300,"%i",species); | |
260 | for(Int_t i=0;i < GetNvar();i++){ | |
261 | Int_t imin = GetBin(i,xMin[i]); | |
262 | if(imin < 0) imin = 0; | |
263 | else if(imin >= (*fNbinVar)[i]) imin = (*fNbinVar)[i]-1; | |
264 | Int_t imax = GetBin(i,xMax[i]); | |
265 | if(imax < imin) imax = imin; | |
266 | else if(imax >= (*fNbinVar)[i]) imax = (*fNbinVar)[i]-1; | |
267 | snprintf(title2,300,"%s",title); | |
268 | snprintf(title,300,"%s_%04.1f<%s<%04.1f",title2, | |
269 | (*fXmin)[i] + ((*fXmax)[i]-(*fXmin)[i])/(*fNbinVar)[i]*imin, | |
270 | fNameVar->At(i)->GetName(), | |
271 | (*fXmin)[i] + ((*fXmax)[i]-(*fXmin)[i])/(*fNbinVar)[i]*(imax+1)); | |
272 | } | |
273 | temp->SetTitle(title); | |
274 | ||
275 | for(Int_t i=species*ncomb;i < (species+1)*ncomb;i++){ | |
276 | Bool_t kGood = kTRUE; | |
277 | ||
278 | Int_t ncombTemp = i; | |
279 | for(Int_t j=0;j < GetNvar();j++){ | |
280 | Int_t imin = GetBin(j,xMin[j]); | |
281 | if(imin < 0) imin = 0; | |
282 | else if(imin >= (*fNbinVar)[j]) imin = (*fNbinVar)[j]-1; | |
283 | Int_t imax = GetBin(j,xMax[j]); | |
284 | if(imax < imin) imax = imin; | |
285 | else if(imax >= (*fNbinVar)[j]) imax = (*fNbinVar)[j]-1; | |
286 | ||
287 | Int_t ibin = ncombTemp%(*fNbinVar)[j]; | |
288 | ncombTemp /= (*fNbinVar)[j]; | |
289 | ||
290 | if(ibin < imin || ibin > imax){ | |
291 | kGood = kFALSE; | |
292 | j = GetNvar(); | |
293 | } | |
294 | } | |
295 | ||
296 | if(kGood) temp->Add(GetQA(i)); | |
297 | } | |
298 | return temp; | |
299 | } | |
300 | ||
301 | return GetQA(species); | |
302 | } | |
303 | ||
304 | Long64_t AliPIDperfContainer::Merge(TCollection* list){ | |
305 | Long64_t res=0; | |
306 | if (!list) return 0; | |
307 | if (list->IsEmpty()) return 0; | |
308 | ||
309 | TList *listObj = new TList(); | |
310 | listObj->AddAll(list); | |
311 | ||
312 | for(Int_t i=0;i < listObj->GetEntries();i++){ | |
313 | AliPIDperfContainer *obj = (AliPIDperfContainer *) listObj->At(i); | |
314 | Add(obj); | |
315 | res++; | |
316 | } | |
317 | return res; | |
318 | } |