Changes in QA to be able to process separately different triggers (Ruben)
[u/mrichter/AliRoot.git] / ZDC / AliZDCQAChecker.cxx
1 /**************************************************************************
2  * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3  *                                                                        *
4  * Author: The ALICE Off-line Project.                                    *
5  * Contributors are mentioned in the code where appropriate.              *
6  *                                                                        *
7  * Permission to use, copy, modify and distribute this software and its   *
8  * documentation strictly for non-commercial purposes is hereby granted   *
9  * without fee, provided that the above copyright notice appears in all   *
10  * copies and that both the copyright notice and this permission notice   *
11  * appear in the supporting documentation. The authors make no claims     *
12  * about the suitability of this software for any purpose. It is          *
13  * provided "as is" without express or implied warranty.                  *
14  **************************************************************************/
15
16
17 // --- ROOT system ---
18 #include <TH1F.h> 
19 #include <TIterator.h> 
20 #include <TString.h> 
21 #include <TPaveText.h> 
22 #include <TObjArray.h>
23 #include "TList.h"
24
25 // --- Standard library ---
26
27 // --- AliRoot header files ---
28 #include "AliLog.h"
29 #include "AliZDCQAChecker.h"
30
31 ClassImp(AliZDCQAChecker)
32
33 //____________________________________________________________________________
34 void AliZDCQAChecker::Check(Double_t *  test, AliQAv1::ALITASK_t index, TObjArray ** list,
35       const AliDetectorRecoParam * /*recoParam*/) 
36 {
37   // Checks the QA histograms on the input list: 
38   //
39   const char* taskName = AliQAv1::GetAliTaskName(index);
40   //printf("\n\tAliZDCQAChecker -> checking QA histos for task %s\n",taskName);
41   //
42   Int_t ihitHisto=0, idigHisto=0;
43   Int_t irecHisto=0, irawHisto=0, esdInd=0;
44
45   TObjArray messages;
46   messages.SetOwner(kTRUE);
47
48   for(Int_t specie = 0; specie<AliRecoParam::kNSpecies; specie++){
49     Int_t count = 0; 
50     if(!AliQAv1::Instance(AliQAv1::GetDetIndex(GetName()))->IsEventSpecieSet(AliRecoParam::ConvertIndex(specie))) 
51       continue ;
52     //printf("\tAliZDCQAChecker -> specie %d, AliRecoParam::ConvertIndex(specie) %d, AliRecoParam::kLowMult %d, IsEventSpecieSet(specie) %d\n",
53     //  specie, AliRecoParam::ConvertIndex(specie) ,AliRecoParam::kLowMult,
54     //  AliQAv1::Instance(AliQAv1::GetDetIndex(GetName()))->IsEventSpecieSet(AliRecoParam::ConvertIndex(specie)));
55     
56     // ====================================================================
57     //  Checks for p-p events
58     // ====================================================================
59     if(AliRecoParam::ConvertIndex(specie) == AliRecoParam::kLowMult){
60       if(list[specie]->GetEntries()==0){  
61         AliWarning("\t The list to be checked is empty!"); // nothing to check
62         return;
63       }
64       //AliDebug(AliQAv1::GetQADebugLevel(), Form("\n\tAliZDCQAChecker-> checking QA histograms for task %s\n\n",taskName));
65       TIter next(list[specie]); 
66       count = 0; 
67       TH1 * hdata;        
68       
69       Float_t res=0., percentageDiff=0.30;
70       Float_t meanZNA=0., meanZNC=0., meanZPA=0., meanZPC=0.;
71       Float_t pmCZNA=0., pmCZNC=0., pmCZPA=0., pmCZPC=0.;
72       Float_t pmQZNA=0., pmQZNC=0., pmQZPA=0., pmQZPC=0.;
73       Float_t sumADCZNA=0., sumADCZNC=0., sumADCZPA=0., sumADCZPC=0.;
74       Float_t adcCZNA=0., adcCZNC=0., adcCZPA=0., adcCZPC=0.;
75       Float_t adcQZNA=0., adcQZNC=0., adcQZPA=0., adcQZPC=0.;
76       
77       while((hdata = dynamic_cast<TH1 *>(next()))){
78         if(hdata){ 
79           // -------------------------------------------------------------------
80           if(index == AliQAv1::kSIM){
81             //AliDebug(AliQAv1::GetQADebugLevel(), Form("\tAliZDCQAChecker-> checking histo %s",hdata->GetName()));
82             // Check HITS histos
83             //
84             if(!(strncmp(hdata->GetName(),"hHits",5))){
85               if(hdata->GetEntries()>0){
86                 if(ihitHisto==0)      meanZNC = hdata->GetMean();
87                 else if(ihitHisto==1) meanZNA = hdata->GetMean();
88                 else if(ihitHisto==2) meanZPC = hdata->GetMean();
89                 else if(ihitHisto==3) meanZPA = hdata->GetMean();
90                 else if(ihitHisto==4) pmQZNC = hdata->GetMean();
91                 else if(ihitHisto==5) pmQZNA = hdata->GetMean();
92                 else if(ihitHisto==6) pmQZPC = hdata->GetMean();
93                 else if(ihitHisto==7) pmQZPA = hdata->GetMean();
94                 else if(ihitHisto==8)  pmCZNC = hdata->GetMean();
95                 else if(ihitHisto==9)  pmCZNA = hdata->GetMean();
96                 else if(ihitHisto==10) pmCZPC = hdata->GetMean();
97                 else if(ihitHisto==11) pmCZPA = hdata->GetMean();
98               }
99               //
100               // --- Check whether (sum PMQi - PMC)/PMC < percentageDiff
101               if(ihitHisto==11){
102                 if(TMath::Abs(meanZNC)>1.e-10){
103                   if((TMath::Abs(pmQZNC-pmCZNC)/pmCZNC)<percentageDiff) 
104                     res=1.;
105                   else 
106                     res=.5;
107                   test[specie] += res;
108                   count++;
109                 }
110                 if(TMath::Abs(meanZNA)>1.e-10){
111                   if((TMath::Abs(pmQZNA-pmCZNA)/pmCZNA)<percentageDiff) 
112                     res=1.;
113                   else percentageDiff=
114                     res=.5;
115                   test[specie] += res;
116                   count++;
117                 }
118                 if(TMath::Abs(meanZPC)>1.e-10){
119                   if((TMath::Abs(pmQZPC-pmCZPC)/pmCZPC)<percentageDiff) 
120                     res=1.;
121                   else 
122                     res=.5;
123                   test[specie] += res;
124                   count++;
125                 }
126                 if(TMath::Abs(meanZPA)>1.e-10){
127                   if((TMath::Abs(pmQZPA-pmCZPA)/pmCZPA)<percentageDiff) 
128                     res=1.;
129                   else 
130                     res=.5;
131                   test[specie] += res;
132                   count++;
133                 }
134               }
135               ihitHisto++;
136             }
137             // Check DIGIT HIGH GAIN CHAIN histos
138             else if(!(strncmp(hdata->GetName(),"hDig",4))){ 
139               if(hdata->GetEntries()>0){
140                 if(idigHisto==0)      sumADCZNC = hdata->GetMean();
141                 else if(idigHisto==1) sumADCZNA = hdata->GetMean();
142                 else if(idigHisto==2) sumADCZPC = hdata->GetMean();
143                 else if(idigHisto==3) sumADCZPA = hdata->GetMean();
144                 else if(idigHisto==4) pmQZNC = hdata->GetMean();
145                 else if(idigHisto==5) pmQZNA = hdata->GetMean();
146                 else if(idigHisto==6) pmQZPC = hdata->GetMean();
147                 else if(idigHisto==7) pmQZPA = hdata->GetMean();
148                 else if(idigHisto==8)  pmCZNC = hdata->GetMean();
149                 else if(idigHisto==9)  pmCZNA = hdata->GetMean();
150                 else if(idigHisto==10) pmCZPC = hdata->GetMean();
151                 else if(idigHisto==11) pmCZPA = hdata->GetMean();
152               }
153               //
154               // --- Check whether (sum PMQi - PMC)/PMC < percentageDiff
155               if(idigHisto==11){
156                 if(TMath::Abs(sumADCZNC)>1.e-10){
157                   if((TMath::Abs(adcQZNC-adcCZNC)/adcCZNC)<percentageDiff) 
158                     res=1.;
159                   else 
160                     res=.5;
161                   test[specie] += res;
162                   count++;
163                 }
164                 if(TMath::Abs(sumADCZNA)>1.e-10){
165                   if((TMath::Abs(adcQZNA-adcCZNA)/adcCZNA)<percentageDiff) 
166                     res=1.;
167                   else 
168                     res=.5;
169                   test[specie] += res;
170                   count++;
171                 }
172                 if(TMath::Abs(sumADCZPC)>1.e-10){
173                   if((TMath::Abs(adcQZPC-adcCZPC)/adcCZPC)<percentageDiff) 
174                     res=1.;
175                   else 
176                     res=.5;
177                   test[specie] += res;
178                   count++;
179                 }
180                 if(TMath::Abs(sumADCZPA)>1.e-10){
181                   if((TMath::Abs(adcQZPA-adcCZPA)/adcCZPA)<percentageDiff) 
182                     res=1.;
183                   else 
184                     res=.5;
185                   test[specie] += res;
186                   count++;
187                 }
188               }
189               idigHisto++;            
190             }
191           } 
192           // -------------------------------------------------------------------
193           else if(index == AliQAv1::kRAW) {
194             //
195             // Check RAW HIGH GAIN CHAIN histos
196             
197             messages.Clear();
198             
199             Bool_t iDetPM = kTRUE;
200             // --- Checks
201             if(irawHisto==18){ 
202               Float_t resADC=0.;
203               for(int ibin=1; ibin<=hdata->GetNbinsX(); ibin++){
204                  if((hdata->GetBinContent(ibin))>10.){
205                    res=1.;
206                  }
207                  else if((hdata->GetBinContent(ibin))<10.){
208                    res=0.5;
209                    if(ibin==1 || ibin==6 || ibin==11 || ibin==12 || ibin==13 || ibin==18){
210                      iDetPM = kFALSE;
211                    }
212                  }
213                  //
214                  resADC += res;
215                  test[specie] += res;
216                  count++;
217               }
218               Float_t rv=1.;
219               if(hdata->GetNbinsX() != 0) rv = resADC/hdata->GetNbinsX();
220               if(rv == 1.) messages.Add(new TObjString("ADCs are OK!")); 
221               else if(iDetPM==kFALSE){
222                 messages.Add(new TObjString("Problem with ADCs!"));
223                 messages.Add(new TObjString("IF THIS IS NOT A TECHNICAL"));
224                 messages.Add(new TObjString("OR A STANDALONE_PEDESTAL RUN"));
225               }
226               else if(iDetPM==kTRUE) messages.Add(new TObjString("Minor problem with ADCs"));
227               SetupHisto(messages, *hdata, rv);
228             }
229             else if(irawHisto==19){
230               // Reference values from RUN 145456
231               Double_t refTDCs[6] = {-322.5,-319.1,-320.9,-319.2,-319.7,-319.2};
232               Float_t resTDC=0.;
233               for(int ibin=1; ibin<=hdata->GetNbinsX(); ibin++){
234                  if(TMath::Abs((hdata->GetBinContent(ibin))-refTDCs[ibin-1])<3.){
235                    res=1.;
236                  }
237                  else if(TMath::Abs((hdata->GetBinContent(ibin))-refTDCs[ibin-1])<5.){
238                    res=0.8;
239                  }
240                  else res=0.5;
241                  //
242                  resTDC += res;
243                  test[specie] += res;
244                  count++;
245               }
246               Float_t rv=1.;
247               if(hdata->GetNbinsX() != 0) rv = resTDC/hdata->GetNbinsX();
248               if(rv == 1.) messages.Add(new TObjString("TDCs are OK!")); 
249               else if(rv<1. && rv>0.75) messages.Add(new TObjString("Minor problem with TDCs"));
250               else{
251                 messages.Add(new TObjString("Serious problem in ZDC timing"));
252                 messages.Add(new TObjString("IF THIS IS NOT A TECHNICAL RUN"));
253               }
254               SetupHisto(messages, *hdata, rv);
255             }
256             irawHisto++;
257             
258           } 
259           // -------------------------------------------------------------------
260           else if(index == AliQAv1::kREC) {
261             //
262             // Check REC HIGH GAIN CHAIN histos
263             if(hdata->GetEntries()>0){
264               if(irecHisto==0)       meanZNC = hdata->GetMean();
265               else if(irecHisto==1)  meanZNA = hdata->GetMean();
266               else if(irecHisto==2)  meanZPC = hdata->GetMean();
267               else if(irecHisto==3)  meanZPA = hdata->GetMean();
268               else if(irecHisto==4)  pmQZNC = hdata->GetMean();
269               else if(irecHisto==5)  pmQZNA = hdata->GetMean();
270               else if(irecHisto==6)  pmQZPC = hdata->GetMean();
271               else if(irecHisto==7)  pmQZPA = hdata->GetMean();
272               else if(irecHisto==8)  pmCZNC = hdata->GetMean();
273               else if(irecHisto==9)  pmCZNA = hdata->GetMean();
274               else if(irecHisto==10) pmCZPC = hdata->GetMean();
275               else if(irecHisto==11) pmCZPA = hdata->GetMean();
276             }
277             //
278             // --- Check whether (sum PMQi - PMC)/PMC < percentageDiff
279             if(irecHisto==11){
280               if(TMath::Abs(meanZNC)>1.e-10){
281                 if((TMath::Abs(pmQZNC-pmCZNC)/pmCZNC)<percentageDiff) 
282                   res=1.;
283                 else 
284                   res=.5;
285                 test[specie] += res;
286                 count++;
287               }
288               if(TMath::Abs(meanZNA)>1.e-10){
289                 if((TMath::Abs(pmQZNA-pmCZNA)/pmCZNA)<percentageDiff) 
290                   res=1.;
291                 else 
292                   res=.5;
293                 test[specie] += res;
294                 count++;
295               }
296               if(TMath::Abs(meanZPC)>1.e-10){
297                 if((TMath::Abs(pmQZPC-pmCZPC)/pmCZPC)<percentageDiff) 
298                   res=1.;
299                 else 
300                   res=.5;
301                 test[specie] += res;
302                 count++;
303               }
304               if(TMath::Abs(meanZPA)>1.e-10){
305                 if((TMath::Abs(pmQZPA-pmCZPA)/pmCZPA)<percentageDiff) 
306                   res=1.;
307                 else 
308                   res=.5;
309                 test[specie] += res;
310                 count++;
311               }
312             }
313             irecHisto++;            
314           } 
315           // -------------------------------------------------------------------
316           else if(index == AliQAv1::kESD) {
317             //
318             // Check ESD HIGH GAIN CHAIN histos
319             if(hdata->GetEntries()>0){
320               if(esdInd==0)      sumADCZNC = hdata->GetMean();
321               else if(esdInd==1) sumADCZNA = hdata->GetMean();
322               else if(esdInd==2) sumADCZPC = hdata->GetMean();
323               else if(esdInd==3) sumADCZPA = hdata->GetMean();
324               else if(esdInd==6)  pmQZNC = hdata->GetMean();
325               else if(esdInd==7)  pmQZNA = hdata->GetMean();
326               else if(esdInd==8)  pmQZPC = hdata->GetMean();
327               else if(esdInd==9) pmQZPA = hdata->GetMean();
328               else if(esdInd==10) pmCZNC = hdata->GetMean();
329               else if(esdInd==11) pmCZNA = hdata->GetMean();
330               else if(esdInd==12) pmCZPC = hdata->GetMean();
331               else if(esdInd==13) pmCZPA = hdata->GetMean();
332             }
333             //
334             // --- Check whether (sum PMQi - PMC)/PMC < percentageDiff
335             if(esdInd==15){
336               if(TMath::Abs(sumADCZNC)>1.e-10){
337                 if((TMath::Abs(pmQZNC-pmCZNC)/pmCZNC)<percentageDiff) 
338                   res=1.;
339                 else 
340                   res=.5;
341                 test[specie] += res;
342                 count++;
343               }
344               if(TMath::Abs(sumADCZNA)>1.e-10){
345                 if((TMath::Abs(pmQZNA-pmCZNA)/pmCZNA)<percentageDiff) 
346                   res=1.;
347                 else 
348                   res=.5;
349                 test[specie] += res;
350                 count++;
351               }
352               if(TMath::Abs(sumADCZPC)>1.e-10){
353                 if((TMath::Abs(pmQZPC-pmCZPC)/pmCZPC)<percentageDiff) 
354                   res=1.;
355                 else 
356                   res=.5;
357                 test[specie] += res;
358                 count++;
359               }
360               if(TMath::Abs(sumADCZPA)>1.e-10){
361                 if((TMath::Abs(pmQZPA-pmCZPA)/pmCZPA)<percentageDiff) 
362                   res=1.;
363                 else 
364                   res=.5;
365                 test[specie] += res;
366                 count++;
367               }
368             }
369             esdInd++;
370          }  
371          else {
372            AliWarning(Form("\n\t No ZDC QA for %s task\n",taskName)); 
373            return ;
374          }
375         }//if(hdata) 
376         else AliError("AliZDCQAChecker-> No histos!!!\n");
377       }
378     } // LowMult (p-p)
379     // ====================================================================
380     //  Checks for A-A events
381     // ====================================================================
382     else if (AliRecoParam::ConvertIndex(specie) == AliRecoParam::kHighMult) {
383       if(list[specie]->GetEntries()==0){  
384         AliWarning("\t The list to be checked is empty!");
385         return ;
386       }
387       //AliDebug(AliQAv1::GetQADebugLevel(), Form("\n\tAliZDCQAChecker-> checking QA histograms for task %s\n\n",taskName));
388       //
389       TIter next(list[specie]); 
390       count = 0; 
391       TH1 * hdata;        
392       
393       Float_t res=0., percentageDiff=0.10;
394       Float_t meanZNA=0., meanZNC=0., meanZPA=0., meanZPC=0.;
395       Float_t pmCZNA=0., pmCZNC=0., pmCZPA=0., pmCZPC=0.;
396       Float_t pmQZNA=0., pmQZNC=0., pmQZPA=0., pmQZPC=0.;
397       Float_t sumADCZNA=0., sumADCZNC=0., sumADCZPA=0., sumADCZPC=0.;
398       Float_t adcCZNA=0., adcCZNC=0., adcCZPA=0., adcCZPC=0.;
399       Float_t adcQZNA=0., adcQZNC=0., adcQZPA=0., adcQZPC=0.;
400       
401       while((hdata = dynamic_cast<TH1 *>(next()))){
402         if(hdata){ 
403           //AliDebug(AliQAv1::GetQADebugLevel(), Form("\tAliZDCQAChecker-> checking histo %s",hdata->GetName()));
404           // -------------------------------------------------------------------
405           if(index == AliQAv1::kSIM){
406             // Check HITS histos
407             if (!(strncmp(hdata->GetName(),"hHits",5))){
408               if(hdata->GetEntries()>0){
409                 if(ihitHisto==0)      meanZNC = hdata->GetMean();
410                 else if(ihitHisto==1) meanZNA = hdata->GetMean();
411                 else if(ihitHisto==2) meanZPC = hdata->GetMean();
412                 else if(ihitHisto==3) meanZPA = hdata->GetMean();
413                 else if(ihitHisto==4) pmQZNC = hdata->GetMean();
414                 else if(ihitHisto==5) pmQZNA = hdata->GetMean();
415                 else if(ihitHisto==6) pmQZPC = hdata->GetMean();
416                 else if(ihitHisto==7) pmQZPA = hdata->GetMean();
417                 else if(ihitHisto==8)  pmCZNC = hdata->GetMean();
418                 else if(ihitHisto==9)  pmCZNA = hdata->GetMean();
419                 else if(ihitHisto==10) pmCZPC = hdata->GetMean();
420                 else if(ihitHisto==11) pmCZPA = hdata->GetMean();
421               }
422               //
423               // --- Check whether 2*|Mean ZNA - Mean ZNC|/(Mean ZNA + Mean ZNC) < percentageDiff
424               // --- and 2*|Mean ZPA - Mean ZPC|/(Mean ZPA + Mean ZPC) < 2*percentageDiff
425               if(ihitHisto==3){
426                 if(TMath::Abs(meanZNC)>1.e-10 && TMath::Abs(meanZNA)>1.e-10){
427                   if((2*TMath::Abs(meanZNC-meanZNA)/(meanZNA+meanZNC))<percentageDiff) 
428                     res=1.;
429                   else 
430                     res=.5;
431                   test[specie] += res;
432                   count++;
433                 }
434                 if(TMath::Abs(meanZPC)>1.e-10 && TMath::Abs(meanZPA)>1.e-10){
435                   if((TMath::Abs(meanZPC-meanZPA)/(meanZPA+meanZPC))<percentageDiff) 
436                     res=1.;
437                   else 
438                     res=.5;
439                   test[specie] += res;
440                   count++;
441                 }
442               }
443               // --- Check whether (mean PMQi - PMC)/PMC < percentageDiff
444               if(ihitHisto==11){
445                 if(TMath::Abs(meanZNC)>1.e-10){
446                   if((TMath::Abs(pmQZNC-pmCZNC)/pmCZNC)<percentageDiff) 
447                     res=1.;
448                   else 
449                     res=.5;
450                   test[specie] += res;
451                   count++;
452                 }
453                 if(TMath::Abs(meanZNA)>1.e-10){
454                   if((TMath::Abs(pmQZNA-pmCZNA)/pmCZNA)<percentageDiff) 
455                     res=1.;
456                   else 
457                     res=.5;
458                   test[specie] += res;
459                   count++;
460                 }
461                 if(TMath::Abs(meanZPC)>1.e-10){
462                   if((TMath::Abs(pmQZPC-pmCZPC)/pmCZPC)<percentageDiff) 
463                     res=1.;
464                   else 
465                     res=.5;
466                   test[specie] += res;
467                   count++;
468                 }
469                 if(TMath::Abs(meanZPA)>1.e-10){
470                   if((TMath::Abs(pmQZPA-pmCZPA)/pmCZPA)<percentageDiff) 
471                     res=1.;
472                   else 
473                     res=.5;
474                   test[specie] += res;
475                   count++;
476                 }
477               }
478               ihitHisto++;
479             }
480             // Check DIGITS histos
481             else if (!(strncmp(hdata->GetName(),"hDig",4))){
482               if(hdata->GetEntries()>0){
483                 if(idigHisto==0)      sumADCZNC = hdata->GetMean();
484                 else if(idigHisto==1) sumADCZNA = hdata->GetMean();
485                 else if(idigHisto==2) sumADCZPC = hdata->GetMean();
486                 else if(idigHisto==3) sumADCZPA = hdata->GetMean();
487                 else if(idigHisto==4) adcQZNC = hdata->GetMean();
488                 else if(idigHisto==5) adcQZNA = hdata->GetMean();
489                 else if(idigHisto==6) adcQZPC = hdata->GetMean();
490                 else if(idigHisto==7) adcQZPA = hdata->GetMean();
491                 else if(idigHisto==8)  adcCZNC = hdata->GetMean();
492                 else if(idigHisto==9)  adcCZNA = hdata->GetMean();
493                 else if(idigHisto==10) adcCZPC = hdata->GetMean();
494                 else if(idigHisto==11) adcCZPA = hdata->GetMean();
495               }
496               //
497               // --- Check whether 2*|Mean ZNA - Mean ZNC|/(Mean ZNA + Mean ZNC) < percentageDiff
498               // --- and 2*|Mean ZPA - Mean ZPC|/(Mean ZPA + Mean ZPC) < 2*percentageDiff
499               if(idigHisto==3){
500                 if(TMath::Abs(sumADCZNC)>1.e-10 && TMath::Abs(sumADCZNA)>1.e-10){
501                   if((2*TMath::Abs(sumADCZNC-sumADCZNA)/(sumADCZNA+sumADCZNC))<percentageDiff) 
502                     res=1.;
503                   else 
504                     res=.5;
505                   test[specie] += res;
506                   count++;
507                 }
508                 if(TMath::Abs(sumADCZPC)>1.e-10 && TMath::Abs(sumADCZPA)>1.e-10){
509                   if((TMath::Abs(sumADCZPC-sumADCZPA)/(sumADCZPA+sumADCZPC))<percentageDiff) 
510                     res=1.;
511                   else 
512                     res=.5;
513                   test[specie] += res;
514                   count++;
515                 }
516               }
517               // --- Check whether (sumADC PMQi - PMC)/PMC < percentageDiff
518               if(idigHisto==11){
519                 if(TMath::Abs(sumADCZNC)>1.e-10){
520                   if((TMath::Abs(adcQZNC-adcCZNC)/adcCZNC)<percentageDiff) 
521                     res=1.;
522                   else 
523                     res=.5;
524                   test[specie] += res;
525                   count++;
526                 }
527                 if(TMath::Abs(sumADCZNA)>1.e-10){
528                   if((TMath::Abs(adcQZNA-adcCZNA)/adcCZNA)<percentageDiff) 
529                     res=1.;
530                   else 
531                     res=.5;
532                   test[specie] += res;
533                   count++;
534                 }
535                 if(TMath::Abs(sumADCZPC)>1.e-10){
536                   if((TMath::Abs(adcQZPC-adcCZPC)/adcCZPC)<percentageDiff) 
537                     res=1.;
538                   else 
539                     res=.5;
540                   test[specie] += res;
541                   count++;
542                 }
543                 if(TMath::Abs(sumADCZPA)>1.e-10){
544                   if((TMath::Abs(adcQZPA-adcCZPA)/adcCZPA)<percentageDiff) 
545                     res=1.;
546                   else 
547                     res=.5;
548                   test[specie] += res;
549                   count++;
550                 }
551               }
552               idigHisto++;
553             }
554           }
555           // -------------------------------------------------------------------
556           else if(index == AliQAv1::kRAW){
557             //
558             // Check RAW HIGH GAIN CHAIN histos
559             
560             messages.Clear();
561             
562             Bool_t iDetPM = kTRUE;
563             // --- Checks
564             if(irawHisto==18){ 
565               Float_t resADC=0.;
566               for(int ibin=1; ibin<=hdata->GetNbinsX(); ibin++){
567                  if((hdata->GetBinContent(ibin))>10.){
568                    res=1.;
569                  }
570                  else if((hdata->GetBinContent(ibin))<10. && 
571                    (ibin==1 || ibin==6 || ibin==11 || ibin==12 || ibin==13 || ibin==18)){
572                    res=0.5;
573                    iDetPM = kFALSE;
574                  }
575                  //
576                  resADC += res;
577                  test[specie] += res;
578                  count++;
579               }
580               Float_t rv=1.;
581               if(hdata->GetNbinsX() != 0) rv = resADC/hdata->GetNbinsX();
582               if(rv == 1.) messages.Add(new TObjString("ADCs are OK!")); 
583               else if(iDetPM==kFALSE){
584                 messages.Add(new TObjString("Problem with ADCs!"));
585                 messages.Add(new TObjString("IF THIS IS NOT A TECHNICAL RUN"));
586               }
587               else if(iDetPM==kTRUE) messages.Add(new TObjString("Minor problem with ADCs"));
588               SetupHisto(messages, *hdata, rv);
589             }
590             else if(irawHisto==19){
591               Double_t refTDCs[6] = {-322.5,-319.1,-320.9,-319.2,-319.7,-319.2};
592               Float_t resTDC=0.;
593               for(int ibin=1; ibin<=hdata->GetNbinsX(); ibin++){
594                  if(TMath::Abs((hdata->GetBinContent(ibin))-refTDCs[ibin-1])<4.){
595                    res=1.;
596                  }
597                  else{
598                    res=0.5;
599                  }
600                  //
601                  resTDC += res;
602                  test[specie] += res;
603                  count++;
604               }
605               Float_t rv=1.;
606               if(hdata->GetNbinsX() != 0) rv = resTDC/hdata->GetNbinsX();
607               if(rv == 1.) messages.Add(new TObjString("TDCs are OK!")); 
608               else if(rv<1 && rv>0.9) messages.Add(new TObjString("Minor problem with TDCs"));
609               else{
610                 messages.Add(new TObjString("Serious problem in ZDC timing"));
611                 messages.Add(new TObjString("IF THIS IS NOT A TECHNICAL RUN"));
612               }
613               SetupHisto(messages, *hdata, rv);
614             }
615             irawHisto++;
616             
617           }   
618           // -------------------------------------------------------------------
619           else if(index == AliQAv1::kREC){
620             //
621             // Check RAW HIGH GAIN CHAIN histos
622             if(hdata->GetEntries()>0){
623               if(irecHisto==0)       meanZNC = hdata->GetMean();
624               else if(irecHisto==1)  meanZNA = hdata->GetMean();
625               else if(irecHisto==2)  meanZPC = hdata->GetMean();
626               else if(irecHisto==3)  meanZPA = hdata->GetMean();
627               else if(irecHisto==4)  pmQZNC = hdata->GetMean();
628               else if(irecHisto==5)  pmQZNA = hdata->GetMean();
629               else if(irecHisto==6)  pmQZPC = hdata->GetMean();
630               else if(irecHisto==7)  pmQZPA = hdata->GetMean();
631               else if(irecHisto==8)  pmCZNC = hdata->GetMean();
632               else if(irecHisto==9)  pmCZNA = hdata->GetMean();
633               else if(irecHisto==10) pmCZPC = hdata->GetMean();
634               else if(irecHisto==11) pmCZPA = hdata->GetMean();
635             }
636             //
637             // --- Check whether 2*|Mean ZNA - Mean ZNC|/(Mean ZNA + Mean ZNC) < percentageDiff
638             // --- and 2*|Mean ZPA - Mean ZPC|/(Mean ZPA + Mean ZPC) < 2*percentageDiff
639             if(irecHisto==3){
640               if(TMath::Abs(meanZNC)>1.e-10 && TMath::Abs(meanZNA)>1.e-10){
641                 if((2*TMath::Abs(meanZNC-meanZNA)/(meanZNA+meanZNC))<percentageDiff) 
642                   res=1.;
643                 else 
644                   res=.5;
645                 test[specie] += res;
646                 count++;
647               }
648               if(TMath::Abs(meanZPC)>1.e-10 && TMath::Abs(meanZPA)>1.e-10){
649                 if((TMath::Abs(meanZPC-meanZPA)/(meanZPA+meanZPC))<percentageDiff) 
650                   res=1.;
651                 else 
652                   res=.5;
653                 test[specie] += res;
654                 count++;
655               }
656             }
657             // --- Check whether (sum PMQi - PMC)/PMC < percentageDiff
658             if(irecHisto==11){
659               if((TMath::Abs(meanZNC)>1.e-10) && (pmCZNC>1.e-10)){
660                 if((TMath::Abs(pmQZNC-pmCZNC)/pmCZNC)<percentageDiff) 
661                   res=1.;
662                 else 
663                   res=.5;
664                 test[specie] += res;
665                 count++;
666               }
667               if((TMath::Abs(meanZNA)>1.e-10) && (pmCZNA>1.e-10)){
668                 if((TMath::Abs(pmQZNA-pmCZNA)/pmCZNA)<percentageDiff) 
669                   res=1.;
670                 else 
671                   res=.5;
672                 test[specie] += res;
673                 count++;
674               }
675               if((TMath::Abs(meanZPC)>1.e-10) && (pmCZPC>1.e-10)){
676                 if((TMath::Abs(pmQZPC-pmCZPC)/pmCZPC)<percentageDiff) 
677                   res=1.;
678                 else 
679                   res=.5;
680                 test[specie] += res;
681                 count++;
682               }
683               if((TMath::Abs(meanZPA)>1.e-10) && (pmCZPA>1.e-10)){
684                 if((TMath::Abs(pmQZPA-pmCZPA)/pmCZPA)<percentageDiff) 
685                   res=1.;
686                 else 
687                   res=.5;
688                 test[specie] += res;
689                 count++;
690               }
691             }
692             irecHisto++;         
693           }   
694           // -------------------------------------------------------------------
695           else if(index == AliQAv1::kESD){
696             //
697             // Check ESD HIGH GAIN CHAIN histos
698             if(hdata->GetEntries()>0){
699               if(esdInd==0)      sumADCZNC = hdata->GetMean();
700               else if(esdInd==1) sumADCZNA = hdata->GetMean();
701               else if(esdInd==2) sumADCZPC = hdata->GetMean();
702               else if(esdInd==3) sumADCZPA = hdata->GetMean();
703               else if(esdInd==6)  pmQZNC = hdata->GetMean();
704               else if(esdInd==7)  pmQZNA = hdata->GetMean();
705               else if(esdInd==8) pmQZPC = hdata->GetMean();
706               else if(esdInd==9) pmQZPA = hdata->GetMean();
707               else if(esdInd==10) pmCZNC = hdata->GetMean();
708               else if(esdInd==11) pmCZNA = hdata->GetMean();
709               else if(esdInd==12) pmCZPC = hdata->GetMean();
710               else if(esdInd==13) pmCZPA = hdata->GetMean();
711             }
712             //
713             // --- Check whether 2*|Mean ZNA - Mean ZNC|/(Mean ZNA + Mean ZNC) < percentageDiff
714             // --- and 2*|Mean ZPA - Mean ZPC|/(Mean ZPA + Mean ZPC) < 2*percentageDiff
715             if(esdInd==5){
716               if(TMath::Abs(sumADCZNC)>1.e-10 && TMath::Abs(sumADCZNA)>1.e-10){
717                 if((2*TMath::Abs(sumADCZNC-sumADCZNA)/(sumADCZNA+sumADCZNC))<percentageDiff) 
718                   res=1.;
719                 else 
720                   res=.5;
721                 test[specie] += res;
722                 count++;
723               }
724               if(TMath::Abs(sumADCZPC)>1.e-10 && TMath::Abs(sumADCZPA)>1.e-10){
725                 if((TMath::Abs(sumADCZPC-sumADCZPA)/(sumADCZPA+sumADCZPC))<percentageDiff) 
726                   res=1.;
727                 else 
728                   res=.5;
729                 test[specie] += res;
730                 count++;
731               }
732             }
733             // --- Check whether (sum PMQi - PMC)/PMC < percentageDiff
734             if(esdInd==15){
735               if(TMath::Abs(sumADCZNC)>1.e-10){
736                 if((TMath::Abs(pmQZNC-pmCZNC)/pmCZNC)<percentageDiff) 
737                   res=1.;
738                 else 
739                   res=.5;
740                 test[specie] += res;
741                 count++;
742               }
743               if(TMath::Abs(sumADCZNA)>1.e-10){
744                 if((TMath::Abs(pmQZNA-pmCZNA)/pmCZNA)<percentageDiff) 
745                   res=1.;
746                 else 
747                   res=.5;
748                 test[specie] += res;
749                 count++;
750               }
751 /*            if(TMath::Abs(sumADCZPC)>1.e-10){
752                 if((TMath::Abs(pmQZPC-pmCZPC)/pmCZPC)<percentageDiff) 
753                   res=1.;
754                 else 
755                   res=.5;
756                 test[specie] += res;
757                 count++;
758               }
759               if(TMath::Abs(sumADCZPA)>1.e-10){
760                 if((TMath::Abs(pmQZPA-pmCZPA)/pmCZPA)<percentageDiff) 
761                   res=1.;
762                 else 
763                   res=.5;
764                 test[specie] += res;
765                 count++;
766               }
767 */
768             }
769             esdInd++;
770           }  
771           else {
772             AliWarning(Form("\n\t No ZDC QA for %s task\n",taskName)); 
773             return ;
774           } 
775         }//if(hdata) 
776         else AliError("\t  No histos found for ZDC!!!\n");
777       }
778     } // HighMult (Pb-Pb) 
779     // ====================================================================
780     //  Checks for Calibration events
781     // ====================================================================
782     else if (AliRecoParam::ConvertIndex(specie) == AliRecoParam::kCalib) {
783       AliWarning(Form("\n\t No check implemented in ZDC QA for %s task\n",taskName)); 
784       return ;
785     } // Calibration
786     // ====================================================================
787     //  Checks for cosmic events
788     // ====================================================================
789     else if (AliRecoParam::ConvertIndex(specie) == AliRecoParam::kCosmic) {
790       AliWarning(Form("\n\t No check needed in ZDC QA for %s task\n",taskName)); 
791       return ; 
792     } // Cosmic
793     if(TMath::Abs(count)>1.e-10) test[specie] = test[specie]/count;
794     AliDebug(AliQAv1::GetQADebugLevel(), Form("\n\t ZDC QA check result = %1.2f\n",test[specie]));
795   } // Loop on species
796 }  
797
798 //___________________________________________________________________ 
799 void AliZDCQAChecker::SetupHisto(const TObjArray& messages, TH1& histo, Float_t& code)
800 {
801   //
802   /// Add text to histos
803   //
804
805   TPaveText* text = new TPaveText(0.70,0.70,0.99,0.99,"NDC");
806     
807   TIter next(&messages);
808   TObjString* str;
809     
810   while ( ( str = static_cast<TObjString*>(next()) ) ){
811     text->AddText(str->String());
812   }
813
814   TString defaultText = "";
815
816   Int_t color = 0;
817   if(code==1.){
818     color = kGreen;
819     defaultText = "Everything is fine!";
820   }  
821   else if(code<1. && code>=0.9){  
822     color = kYellow;
823     defaultText = "To be monitored in next runs";
824   }
825   else if(code<0.9 && code>=0.6){
826     color = kOrange;
827     defaultText = "notify the expert DURING THE DAY!";
828   }
829   else if(code<0.6){
830     color = kRed;
831     defaultText = "CALL THE EXPERT!!!!";
832   }
833
834
835   text->AddText(defaultText.Data());
836   text->SetFillColor(color);
837                       
838   //histo.SetFillStyle(1001);
839   //histo.SetFillColor(color);
840
841   histo.SetStats(kFALSE);
842     
843   histo.GetListOfFunctions()->Add(text);
844 }