1 /**************************************************************************
2 * Copyright(c) 2007-2009, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
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 **************************************************************************/
18 // *****************************************
19 // Checks the quality assurance
20 // by comparing with reference data
21 // W.Ferrarese P.Cerello Mag 2008
24 // --- ROOT system ---
26 #include <Riostream.h>
28 // --- AliRoot header files ---
29 #include "AliITSQAChecker.h"
30 #include "AliITSQASPDChecker.h"
31 #include "AliITSQASDDChecker.h"
32 #include "AliITSQASSDChecker.h"
34 ClassImp(AliITSQAChecker)
36 //____________________________________________________________________________
37 AliITSQAChecker::AliITSQAChecker(Bool_t kMode, Short_t subDet, Short_t ldc) :
38 AliQACheckerBase("ITS","SDD Quality Assurance Checker"),
48 fSPDChecker(0), // SPD Checker
49 fSDDChecker(0), // SDD Checker
50 fSSDChecker(0) // SSD Checker
53 // Standard constructor
54 fkOnline = kMode; fDet = subDet; fLDC = ldc;
55 if(fDet == 0 || fDet == 1) {
56 AliDebug(AliQAv1::GetQADebugLevel(),"AliITSQAChecker::Create SPD Checker\n");
57 fSPDChecker = new AliITSQASPDChecker();
59 if(fDet == 0 || fDet == 2) {
60 AliDebug(AliQAv1::GetQADebugLevel(),"AliITSQAChecker::Create SDD Checker\n");
61 fSDDChecker = new AliITSQASDDChecker();
63 if(fDet == 0 || fDet == 3) {
64 AliDebug(AliQAv1::GetQADebugLevel(),"AliITSQAChecker::Create SSD Checker\n");
65 fSSDChecker = new AliITSQASSDChecker();
67 InitQACheckerLimits();
70 //____________________________________________________________________________
71 AliITSQAChecker::AliITSQAChecker(const AliITSQAChecker& qac):
72 AliQACheckerBase(qac.GetName(), qac.GetTitle()),
73 fkOnline(qac.fkOnline),
76 fSPDOffset(qac.fSPDOffset),
77 fSDDOffset(qac.fSDDOffset),
78 fSSDOffset(qac.fSSDOffset),
79 fSPDHisto(qac.fSPDHisto),
80 fSDDHisto(qac.fSDDHisto),
81 fSSDHisto(qac.fSSDHisto),
82 fSPDChecker(qac.fSPDChecker),
83 fSDDChecker(qac.fSDDChecker),
84 fSSDChecker(qac.fSSDChecker)
87 AliError("Copy should not be used with this class\n");
89 //____________________________________________________________________________
90 AliITSQAChecker& AliITSQAChecker::operator=(const AliITSQAChecker& qac){
91 // assignment operator
92 this->~AliITSQAChecker();
93 new(this)AliITSQAChecker(qac);
97 //____________________________________________________________________________
98 Double_t * AliITSQAChecker::Check(AliQAv1::ALITASK_t index, TObjArray ** list, const AliDetectorRecoParam * recoParam)
102 // basic checks on the QA histograms on the input list
103 //for the ITS subdetectorQA (Raws Digits Hits RecPoints SDigits) return the worst value of the three result
104 if(index == AliQAv1::kESD){
106 Double_t * rv = new Double_t[AliRecoParam::kNSpecies] ;
107 for (Int_t specie = 0 ; specie < AliRecoParam::kNSpecies ; specie++) {
109 if ( !AliQAv1::Instance()->IsEventSpecieSet(specie) )
111 AliDebug(AliQAv1::GetQADebugLevel(),"Checker for ESD");
114 // The following flags are set to kTRUE if the corresponding
115 // QA histograms exceed a given quality threshold
116 Bool_t cluMapSA = kFALSE;
117 Bool_t cluMapMI = kFALSE;
118 Bool_t cluMI = kFALSE;
119 Bool_t cluSA = kFALSE;
120 Bool_t verSPDZ = kFALSE;
121 if (list[specie]->GetEntries() == 0) {
122 rv[specie] = 0.; // nothing to check
125 Double_t *stepbit=new Double_t[AliQAv1::kNBIT];
126 Double_t histonumb= list[specie]->GetEntries();
127 CreateStepForBit(histonumb,stepbit);
128 TIter next1(list[specie]);
131 Bool_t skipped[6]={kFALSE,kFALSE,kFALSE,kFALSE,kFALSE,kFALSE};
132 // look for layers that we wanted to skip
133 while ( (hdata = dynamic_cast<TH1 *>(next1())) ) {
135 TString hname = hdata->GetName();
136 if(!hname.Contains("hESDSkippedLayers")) continue;
137 for(Int_t k=1; k<7; k++) {
138 if(hdata->GetBinContent(k)>0) {
144 TIter next(list[specie]);
145 while ( (hdata = dynamic_cast<TH1 *>(next())) ) {
147 TString hname = hdata->GetName();
148 Double_t entries = hdata->GetEntries();
150 if(!(entries>0.))++empty;
151 AliDebug(AliQAv1::GetQADebugLevel(),Form("ESD hist name %s - entries %12.1g",hname.Data(),entries));
152 if(hname.Contains("hESDClusterMapSA") && entries>0.){
154 AliDebug(AliQAv1::GetQADebugLevel(),Form("Processing histogram %s",hname.Data()));
155 // Check if there are layers with anomalously low
156 // contributing points to SA reconstructed tracks
157 for(Int_t k=1;k<7;k++){
158 // check if the layer was skipped
159 if(skipped[k-1]) continue;
160 if(hdata->GetBinContent(k)<0.5*(entries/6.)){
162 AliDebug(AliQAv1::GetQADebugLevel(),Form("SA tracks have few points on layer %d - look at histogram hESDClustersSA",k));
167 else if(hname.Contains("hESDClusterMapMI") && entries>0.){
168 // Check if there are layers with anomalously low
169 // contributing points to MI reconstructed tracks
170 AliDebug(AliQAv1::GetQADebugLevel(),Form("Processing histogram %s",hname.Data()));
172 for(Int_t k=1;k<7;k++){
173 // check if the layer was skipped
174 if(skipped[k-1]) continue;
175 if(hdata->GetBinContent(k)<0.5*(entries/6.)){
177 AliDebug(AliQAv1::GetQADebugLevel(),Form("MI tracks have few points on layer %d - look at histogram hESDClustersMI",k));
182 else if(hname.Contains("hESDClustersMI") && entries>0.){
183 // Check if 6 clusters MI tracks are the majority
184 AliDebug(AliQAv1::GetQADebugLevel(),Form("Processing histogram %s",hname.Data()));
186 Double_t maxlaytracks = hdata->GetBinContent(7-nskipped);
187 for(Int_t k=2; k<7-nskipped; k++){
188 if(hdata->GetBinContent(k)>maxlaytracks){
190 AliDebug(AliQAv1::GetQADebugLevel(),Form("MI Tracks with %d clusters are more than tracks with %d clusters. Look at histogram hESDClustersMI",k-1,6-nskipped));
195 else if(hname.Contains("hESDClustersSA") && entries>0.){
196 // Check if 6 clusters SA tracks are the majority
197 AliDebug(AliQAv1::GetQADebugLevel(),Form("Processing histogram %s",hname.Data()));
199 Double_t maxlaytracks = hdata->GetBinContent(7-nskipped);
200 for(Int_t k=2; k<7-nskipped; k++){
201 if(hdata->GetBinContent(k)>maxlaytracks){
203 AliDebug(AliQAv1::GetQADebugLevel(), Form("SA Tracks with %d clusters are more than tracks with %d clusters. Look at histogram hESDClustersSA",k-1,6-nskipped));
208 else if(hname.Contains("hSPDVertexZ") && entries>0.){
209 // Check if average Z vertex coordinate is -5 < z < 5 cm
210 AliDebug(AliQAv1::GetQADebugLevel(),Form("Processing histogram %s",hname.Data()));
212 if(hdata->GetMean()<-5. && hdata->GetMean()>5.){
214 AliDebug(AliQAv1::GetQADebugLevel(),Form("Average z vertex coordinate is at z= %10.4g cm",hdata->GetMean()));
219 AliError("ESD Checker - invalid data type");
225 rv[specie] = 2500.; // set to error
226 AliWarning(Form("All ESD histograms are empty - specie=%d",specie));
229 rv[specie] = 2500.-1500.*(static_cast<Double_t>(tested-empty)/static_cast<Double_t>(tested)); // INFO if all histos are filled
230 if(cluMapSA)rv[specie]-=200.;
231 if(cluMapMI)rv[specie]-=200.;
232 if(cluMI)rv[specie]-=200.;
233 if(cluSA)rv[specie]-=200.;
234 if(verSPDZ)rv[specie]-=199.; // down to 1 if everything is OK
238 // AliDebug(AliQAv1::GetQADebugLevel(), Form("ESD - Tested %d histograms, Return value %f \n",tested,rv[specie]));
239 AliInfo(Form("ESD - Tested %d histograms, Return value %f \n",tested,rv[specie]));
244 Double_t * retval = new Double_t[AliRecoParam::kNSpecies] ;
245 //____________________________________________________________________________
247 Double_t spdCheck[AliRecoParam::kNSpecies] ;
248 Double_t sddCheck[AliRecoParam::kNSpecies] ;
249 Double_t ssdCheck[AliRecoParam::kNSpecies] ;
253 for (Int_t specie = 0 ; specie < AliRecoParam::kNSpecies ; specie++) {
254 if ( AliQAv1::Instance()->IsEventSpecieSet(specie) ) {
255 Double_t histotot=list[specie]->GetEntries();
261 retval[specie] = 0.0 ;//
263 if(fDet == 0 || fDet == 1) {
264 fSPDChecker->SetTaskOffset(fSPDOffset);
265 //printf("spdoffset = %i \n",fSPDOffset );
266 Double_t histoSPD=double(GetSPDHisto());
268 Double_t *stepSPD=new Double_t[AliQAv1::kNBIT];
269 CreateStepForBit(histoSPD,stepSPD);
270 fSPDChecker->SetStepBit(stepSPD);
271 spdCheck[specie] = fSPDChecker->Check(index, list[specie], recoParam);
272 if(spdCheck[specie]>fUpTestValue[AliQAv1::kFATAL]||spdCheck[specie]<0.)
274 AliInfo(Form("SPD check result for %s is out of range (%f)!!! Retval of specie %s is sit to -1\n ",AliQAv1::GetAliTaskName(index),spdCheck[specie],AliRecoParam::GetEventSpecieName(specie)));
275 spdCheck[specie]=fUpTestValue[AliQAv1::kFATAL];
277 //if(spdCheck[specie]<0.5)AliInfo(Form("SPD check result for %s (%s) is < 0.5 .The result is %f ",AliQAv1::GetAliTaskName(index),AliRecoParam::GetEventSpecieName(specie),spdCheck[specie]) );
279 retval[specie]=spdCheck[specie];
282 if(fDet == 0 || fDet == 2) {
283 fSDDChecker->SetTaskOffset(fSDDOffset);
284 Double_t histoSDD=double(GetSDDHisto());
285 Double_t *stepSDD=new Double_t[AliQAv1::kNBIT];
286 CreateStepForBit(histoSDD,stepSDD);
287 fSDDChecker->SetStepBit(stepSDD);
288 sddCheck[specie] = fSDDChecker->Check(index, list[specie], recoParam);
289 if(sddCheck[specie]>fUpTestValue[AliQAv1::kFATAL]||sddCheck[specie]<0.)
291 AliInfo(Form("SDD check result for %s is out of range (%f)!!! Retval of specie %s is sit to -1\n ",AliQAv1::GetAliTaskName(index),sddCheck[specie],AliRecoParam::GetEventSpecieName(specie)));
292 sddCheck[specie]=fUpTestValue[AliQAv1::kFATAL];
294 //if(sddCheck[specie]<0.5)AliInfo(Form("SDD check result for %s (%s) is < 0.5 .The result is %f\f ",AliQAv1::GetAliTaskName(index),AliRecoParam::GetEventSpecieName(specie),sddCheck[specie]) );
296 if(sddCheck[specie]>retval[specie])retval[specie]=sddCheck[specie];
299 if(fDet == 0 || fDet == 3) {
300 fSSDChecker->SetTaskOffset(fSSDOffset);
301 Double_t histoSSD=double(GetSSDHisto());
302 Double_t *stepSSD=new Double_t[AliQAv1::kNBIT];
303 CreateStepForBit(histoSSD,stepSSD);
304 fSSDChecker->SetStepBit(stepSSD);
305 ssdCheck[specie] = fSSDChecker->Check(index, list[specie], recoParam);
306 if(ssdCheck[specie]>fUpTestValue[AliQAv1::kFATAL]||ssdCheck[specie]<0.)
308 AliInfo(Form("SSD check result for %s is out of range (%f)!!! Retval of specie %s is sit to -1\n ",AliQAv1::GetAliTaskName(index),ssdCheck[specie],AliRecoParam::GetEventSpecieName(specie)));
309 ssdCheck[specie]=fUpTestValue[AliQAv1::kFATAL];
311 //if(ssdCheck[specie]<0.5)AliInfo(Form("SSD check result for %s (%s) is < 0.5 . The result is %f ",AliQAv1::GetAliTaskName(index),AliRecoParam::GetEventSpecieName(specie),ssdCheck[specie]) );
313 if(ssdCheck[specie]>retval[specie])retval[specie]=ssdCheck[specie];
316 AliInfo(Form("Check result for %s: \n\t SPD %f \n\t SDD %f \n\t SSD %f \n Check result %f \n ",AliQAv1::GetAliTaskName(index),spdCheck[specie],sddCheck[specie],ssdCheck[specie],retval[specie]));
317 // here merging part for common ITS QA result
320 }//end if event specie
326 //____________________________________________________________________________
327 void AliITSQAChecker::SetTaskOffset(Int_t SPDOffset, Int_t SDDOffset, Int_t SSDOffset)
329 //Setting the 3 offsets for each task called
330 fSPDOffset = SPDOffset;
331 fSDDOffset = SDDOffset;
332 fSSDOffset = SSDOffset;
335 //____________________________________________________________________________
336 void AliITSQAChecker::SetHisto(Int_t SPDhisto, Int_t SDDhisto, Int_t SSDhisto)
338 //Setting the 3 offsets for each task called
339 fSPDHisto = SPDhisto;
340 fSDDHisto = SDDhisto;
341 fSSDHisto = SSDhisto;
344 //____________________________________________________________________________
345 void AliITSQAChecker::SetDetTaskOffset(Int_t subdet,Int_t offset)
349 SetSPDTaskOffset(offset);
352 SetSDDTaskOffset(offset);
355 SetSSDTaskOffset(offset);
358 AliWarning("No specific (SPD,SDD or SSD) subdetector correspond to to this number!!! all offsets set to zero for all the detectors\n");
359 SetTaskOffset(0, 0, 0);
364 //____________________________________________________________________________
365 void AliITSQAChecker::SetDetHisto(Int_t subdet,Int_t histo)
378 AliWarning("No specific (SPD,SDD or SSD) subdetector correspond to to this number!!! all offsets set to zero for all the detectors\n");
384 //_____________________________________________________________________________
386 void AliITSQAChecker::InitQACheckerLimits()
389 AliInfo("Setting of tolerance values\n");
391 Float_t lowtolerancevalue[AliQAv1::kNBIT];
393 Float_t hightolerancevalue[AliQAv1::kNBIT];
394 for(Int_t bit=0;bit<AliQAv1::kNBIT;bit++)
396 lowtolerancevalue[bit]=(bit*1000.);
397 hightolerancevalue[bit]=((bit+1.)*1000.);
399 SetHiLo(hightolerancevalue,lowtolerancevalue);
400 // AliInfo(Form("Range Value \n INFO -> %f < value < %f \n WARNING -> %f < value <= %f \n ERROR -> %f < value <= %f \n FATAL -> %f <= value < %f \n", fLowTestValue[AliQAv1::kINFO], fUpTestValue[AliQAv1::kINFO], fLowTestValue[AliQAv1::kWARNING], fUpTestValue[AliQAv1::kWARNING], fLowTestValue[AliQAv1::kERROR], fUpTestValue[AliQAv1::kERROR], fLowTestValue[AliQAv1::kFATAL], fUpTestValue[AliQAv1::kFATAL] ));
402 if(fDet == 0 || fDet == 1) {
403 fSPDChecker->SetSPDLimits( lowtolerancevalue,hightolerancevalue );
405 if(fDet == 0 || fDet == 2) {
406 fSDDChecker->SetSDDLimits( lowtolerancevalue,hightolerancevalue );
408 if(fDet == 0 || fDet == 3) {
409 fSSDChecker->SetSSDLimits( lowtolerancevalue,hightolerancevalue );
417 //_____________________________________________________________________________
419 void AliITSQAChecker::CreateStepForBit(Double_t histonumb,Double_t *steprange)
421 for(Int_t bit=0;bit < AliQAv1::kNBIT; bit++)
423 //printf("%i\t %f \t %f \t %f \n",bit, fUpTestValue[bit],fLowTestValue[AliQAv1::kINFO],histonumb);
424 steprange[bit]=double((fUpTestValue[bit] - fLowTestValue[AliQAv1::kINFO])/histonumb);
425 //printf("%i\t %f \t %f \t %f \t %f\n",bit, fUpTestValue[bit],fLowTestValue[AliQAv1::kINFO],histonumb,steprange[bit] );
427 //AliInfo(Form("StepBitValue:numner of histo %f\n\t INFO %f \t WARNING %f \t ERROR %f \t FATAL %f \n",histonumb, steprange[AliQAv1::kINFO],steprange[AliQAv1::kWARNING],steprange[AliQAv1::kERROR],steprange[AliQAv1::kFATAL]));
431 //_____________________________________________________________________________
432 void AliITSQAChecker::SetQA(AliQAv1::ALITASK_t index, Double_t * value) const
435 AliQAv1 * qa = AliQAv1::Instance(index) ;
438 for (Int_t specie = 0 ; specie < AliRecoParam::kNSpecies ; specie++) {
440 if (! qa->IsEventSpecieSet(AliRecoParam::ConvertIndex(specie)))
442 if ( value == NULL ) { // No checker is implemented, set all QA to Fatal
443 qa->Set(AliQAv1::kFATAL, specie) ;
445 if ( value[specie] > fLowTestValue[AliQAv1::kFATAL] && value[specie] <= fUpTestValue[AliQAv1::kFATAL] )
446 qa->Set(AliQAv1::kFATAL, AliRecoParam::ConvertIndex(specie)) ;
447 else if ( value[specie] > fLowTestValue[AliQAv1::kERROR] && value[specie] <= fUpTestValue[AliQAv1::kERROR] )
448 qa->Set(AliQAv1::kERROR, AliRecoParam::ConvertIndex(specie)) ;
449 else if ( value[specie] > fLowTestValue[AliQAv1::kWARNING] && value[specie] <= fUpTestValue[AliQAv1::kWARNING] )
450 qa->Set(AliQAv1::kWARNING, AliRecoParam::ConvertIndex(specie)) ;
451 else if ( value[specie] > fLowTestValue[AliQAv1::kINFO] && value[specie] <= fUpTestValue[AliQAv1::kINFO] )
452 qa->Set(AliQAv1::kINFO, AliRecoParam::ConvertIndex(specie)) ;
453 //else if(value[specie]==0) qa->Set(AliQAv1::kFATAL, AliRecoParam::ConvertIndex(specie)) ; //no ckeck has been done
455 qa->ShowStatus(AliQAv1::kITS,index,AliRecoParam::ConvertIndex(specie));