]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - ITS/AliITSQAChecker.cxx
Fixes for reading zero-suppressed data. These should be propagated to
[u/mrichter/AliRoot.git] / ITS / AliITSQAChecker.cxx
index 12f0de1f6a7f51c8c09232e4104ca8c38cdc656f..73a4926aa93f75b59ae307a96398865139d91b82 100644 (file)
@@ -46,6 +46,7 @@ fSPDChecker(0),  // SPD Checker
 fSDDChecker(0),  // SDD Checker
 fSSDChecker(0)  // SSD Checker
 {
+  // Standard constructor
   fkOnline = kMode; fDet = subDet; fLDC = ldc;
   if(fDet == 0 || fDet == 1) {
     AliDebug(1,"AliITSQAChecker::Create SPD Checker\n");
@@ -59,12 +60,26 @@ fSSDChecker(0)  // SSD Checker
 
 }
 
-//__________________________________________________________________
-AliITSQAChecker& AliITSQAChecker::operator = (const AliITSQAChecker& qac )
-{
-  // Equal operator.
+//____________________________________________________________________________
+AliITSQAChecker::AliITSQAChecker(const AliITSQAChecker& qac):
+AliQACheckerBase(qac.GetName(), qac.GetTitle()), 
+fkOnline(qac.fkOnline), 
+fDet(qac.fDet), 
+fLDC(qac.fLDC), 
+fSPDOffset(qac.fSPDOffset), 
+fSDDOffset(qac.fSDDOffset), 
+fSSDOffset(qac.fSSDOffset), 
+fSPDChecker(0), 
+fSDDChecker(0), 
+fSSDChecker(0) {
+  // copy constructor
+  AliError("Copy should not be used with this class\n");
+}
+//____________________________________________________________________________
+AliITSQAChecker& AliITSQAChecker::operator=(const AliITSQAChecker& qac){
+  // assignment operator
   this->~AliITSQAChecker();
-  new(this) AliITSQAChecker(qac);
+  new(this)AliITSQAChecker(qac);
   return *this;
 }
 
@@ -74,8 +89,142 @@ const Double_t AliITSQAChecker::Check(AliQA::ALITASK_t index, TObjArray * list)
   
   // Super-basic check on the QA histograms on the input list:
   // look whether they are empty!
+  if(index == AliQA::kESD){
+    AliDebug(1,"Checker for ESD");
+    Int_t tested = 0;
+    Int_t empty = 0;
+    Double_t rv = 0.;
+    // The following flags are set to kTRUE if the corresponding
+    // QA histograms exceed a given quality threshold
+    Bool_t cluMapSA = kFALSE;
+    Bool_t cluMapMI = kFALSE;
+    Bool_t cluMI = kFALSE;
+    Bool_t cluSA = kFALSE;
+    Bool_t verSPDZ = kFALSE;
+    if (list->GetEntries() == 0) {
+      rv = 0.; // nothing to check
+    }
+    else {
+      TIter next1(list);
+      TH1 * hdata;
+      Int_t nskipped=0;
+      Bool_t skipped[6]={kFALSE,kFALSE,kFALSE,kFALSE,kFALSE,kFALSE};
+      // look for layers that we wanted to skip
+      while ( (hdata = dynamic_cast<TH1 *>(next1())) ) {
+       if(!hdata) continue;
+       TString hname = hdata->GetName();
+       if(!hname.Contains("hESDSkippedLayers")) continue;
+       for(Int_t k=1; k<7; k++) {
+         if(hdata->GetBinContent(k)>0) { 
+           nskipped++; 
+           skipped[k-1]=kTRUE; 
+         } 
+       } 
+      }
+      TIter next(list);
+      while ( (hdata = dynamic_cast<TH1 *>(next())) ) {
+       if(hdata){
+         TString hname = hdata->GetName();
+         Double_t entries = hdata->GetEntries();
+         ++tested;
+         if(!(entries>0.))++empty;
+         AliDebug(1,Form("ESD hist name %s - entries %12.1g",hname.Data(),entries));
+
+         if(hname.Contains("hESDClusterMapSA") && entries>0.){
+           cluMapSA = kTRUE;
+           AliDebug(1,Form("Processing histogram %s",hname.Data()));
+           // Check if there are layers with anomalously low 
+           // contributing points to SA reconstructed tracks
+           for(Int_t k=1;k<7;k++){
+             // check if the layer was skipped
+             if(skipped[k-1]) continue;
+             if(hdata->GetBinContent(k)<0.5*(entries/6.)){
+               cluMapSA = kFALSE;
+               AliInfo(Form("SA tracks have few points on layer %d - look at histogram hESDClustersSA",k));
+             }
+           }  
+         }
+
+         else if(hname.Contains("hESDClusterMapMI") && entries>0.){
+           // Check if there are layers with anomalously low 
+           // contributing points to MI reconstructed tracks
+           AliDebug(1,Form("Processing histogram %s",hname.Data()));
+           cluMapMI = kTRUE;
+           for(Int_t k=1;k<7;k++){
+             // check if the layer was skipped
+             if(skipped[k-1]) continue;
+             if(hdata->GetBinContent(k)<0.5*(entries/6.)){
+               cluMapMI = kFALSE;
+               AliInfo(Form("MI tracks have few points on layer %d - look at histogram hESDClustersMI",k));
+             }
+           }  
+         }
+
+         else if(hname.Contains("hESDClustersMI") && entries>0.){
+           // Check if 6 clusters MI tracks are the majority
+           AliDebug(1,Form("Processing histogram %s",hname.Data()));
+           cluMI = kTRUE;
+           Double_t maxlaytracks = hdata->GetBinContent(7-nskipped);
+           for(Int_t k=2; k<7-nskipped; k++){
+             if(hdata->GetBinContent(k)>maxlaytracks){
+               cluMI = kFALSE;
+               AliInfo(Form("MI Tracks with %d clusters are more than tracks with %d clusters. Look at histogram hESDClustersMI",k-1,6-nskipped));
+             }
+           }
+         }
+
+         else if(hname.Contains("hESDClustersSA") && entries>0.){
+           // Check if 6 clusters SA tracks are the majority
+           AliDebug(1,Form("Processing histogram %s",hname.Data()));
+           cluSA = kTRUE;
+           Double_t maxlaytracks = hdata->GetBinContent(7-nskipped);
+           for(Int_t k=2; k<7-nskipped; k++){
+             if(hdata->GetBinContent(k)>maxlaytracks){
+               cluSA = kFALSE;
+               AliInfo(Form("SA Tracks with %d clusters are more than tracks with %d clusters. Look at histogram hESDClustersSA",k-1,6-nskipped));
+             }
+           }
+         }
+
+         else if(hname.Contains("hSPDVertexZ") && entries>0.){
+           // Check if average Z vertex coordinate is -5 < z < 5 cm
+           AliDebug(1,Form("Processing histogram %s",hname.Data()));
+           verSPDZ = kTRUE;
+           if(hdata->GetMean()<-5. && hdata->GetMean()>5.){
+             verSPDZ = kFALSE;
+             AliInfo(Form("Average z vertex coordinate is at z= %10.4g cm",hdata->GetMean()));
+           }
+         }
+
+       }
+       else{
+         AliError("ESD Checker - invalid data type");
+       }
+         
+       rv = 0.;
+       if(tested>0){
+         if(tested == empty){
+           rv = 0.1;
+           AliWarning("All ESD histograms are empty");
+         }
+         else {
+           rv = 0.1+0.4*(static_cast<Double_t>(tested-empty)/static_cast<Double_t>(tested));
+           if(cluMapSA)rv+=0.1;
+           if(cluMapMI)rv+=0.1;
+           if(cluMI)rv+=0.1;
+           if(cluSA)rv+=0.1;
+           if(verSPDZ)rv+=0.1;
+         }
+       }
+  
+      }
+    }  
+    AliInfo(Form("ESD - Tested %d histograms, Return value %f \n",tested,rv));
+    return rv;
+  }  // end of ESD QA
+
   Double_t spdCheck, sddCheck, ssdCheck;
-  Double_t retval = 0.;
+  Double_t retval = 1.;
   if(fDet == 0 || fDet == 1) {
     AliDebug(1,"AliITSQAChecker::Create SPD Checker\n");
     if(!fSPDChecker) {
@@ -83,7 +232,7 @@ const Double_t AliITSQAChecker::Check(AliQA::ALITASK_t index, TObjArray * list)
     }
     fSPDChecker->SetTaskOffset(fSPDOffset);
     spdCheck = fSPDChecker->Check(index, list);
-    if(spdCheck>retval)retval = spdCheck;
+    if(spdCheck<retval)retval = spdCheck;
   }
   if(fDet == 0 || fDet == 2) {
     AliDebug(1,"AliITSQAChecker::Create SDD Checker\n");
@@ -92,8 +241,8 @@ const Double_t AliITSQAChecker::Check(AliQA::ALITASK_t index, TObjArray * list)
     }
     fSDDChecker->SetTaskOffset(fSDDOffset);
     sddCheck = fSDDChecker->Check(index, list);
-    if(sddCheck>retval)retval = sddCheck;
- }
+    if(sddCheck<retval)retval = sddCheck;
 }
   if(fDet == 0 || fDet == 3) {
     AliDebug(1,"AliITSQAChecker::Create SSD Checker\n");
     if(!fSSDChecker) {
@@ -102,7 +251,7 @@ const Double_t AliITSQAChecker::Check(AliQA::ALITASK_t index, TObjArray * list)
     }
     fSSDChecker->SetTaskOffset(fSSDOffset);
     ssdCheck = fSSDChecker->Check(index, list);
-    if(ssdCheck>retval)retval = ssdCheck;  }
+    if(ssdCheck<retval)retval = ssdCheck;  }
   // here merging part for common ITS QA result
   // 
   AliDebug(1,Form("AliITSQAChecker::QAChecker returned value is %f \n",retval));