]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PWGPP/pid/AliPIDperfContainer.cxx
Updates for the centralized automatic QA (Ionut)
[u/mrichter/AliRoot.git] / PWGPP / pid / AliPIDperfContainer.cxx
1 #include<stdio.h>
2 #include "AliPIDperfContainer.h"
3 #include "TList.h"
4
5 ClassImp(AliPIDperfContainer);
6
7 AliPIDperfContainer::AliPIDperfContainer(const char *name, Int_t nvar,const Int_t* binVar) :
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
104   SetTitleX(old.GetTitleX());
105   SetTitleY(old.GetTitleY());
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 }