]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PWGPP/pid/AliPIDperfContainer.cxx
Added protection against failed fit, for automatic QA trending.
[u/mrichter/AliRoot.git] / PWGPP / pid / AliPIDperfContainer.cxx
CommitLineData
a8ad4709 1#include<stdio.h>
2#include "AliPIDperfContainer.h"
3#include "TList.h"
4
5ClassImp(AliPIDperfContainer);
6
8190aa9f 7AliPIDperfContainer::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
28AliPIDperfContainer::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
40AliPIDperfContainer::~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
56void 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
77AliPIDperfContainer::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
108AliPIDperfContainer& 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
136Int_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
146void 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
185Int_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
198void 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
209void 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
226TH2F *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
246TH2F *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
304Long64_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}