Line data Source code
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 : // Checks the quality assurance for ACORDE.
17 : // Default implementation
18 : // Authors:
19 : // Mario Rodriguez Cahuantzi <mrodrigu@mail.cern.ch> (FCFM-BUAP)
20 : // Luciano Diaz Gonzalez <luciano.diaz@nucleares.unam.mx> (ICN-UNAM)
21 : // Arturo Fernandez <afernan@mail.cern.ch> (FCFM-BUAP)
22 : // Last update: Nov. 14t 2009 --> MRC <mrodrigu@mail.cern.ch> (FCFM-BUAP)
23 : //...
24 :
25 : // --- ROOT system ---
26 : #include <TClass.h>
27 : #include <TH1F.h>
28 : #include <TH1I.h>
29 : #include <TIterator.h>
30 : #include <TKey.h>
31 : #include <TFile.h>
32 : #include <TPaveText.h>
33 : #include <TLine.h>
34 : // --- Standard library ---
35 :
36 : // --- AliRoot header files ---
37 : #include "AliLog.h"
38 : #include "AliQAv1.h"
39 : #include "AliQAChecker.h"
40 : #include "AliACORDEQAChecker.h"
41 : #include "AliCDBEntry.h"
42 : #include "AliQAManager.h"
43 :
44 : /*************************************************************************
45 : Last update: Oct. 10th 2011 from Mario RC, <mrodrigu@mail.cern.ch>
46 : |-> Adding the checker class for raw and esd index
47 : |-> Setting the threshold lines and box for DQM shifter
48 :
49 : *************************************************************************/
50 :
51 12 : ClassImp(AliACORDEQAChecker)
52 :
53 : //____________________________________________________________________________
54 :
55 : AliACORDEQAChecker::AliACORDEQAChecker() :
56 3 : AliQACheckerBase("ACORDE","ACORDE Quality Assurance Data Maker"),
57 9 : fTextDQMShifterInfo(new TPaveText(2.2,0.90,2.9,0.99,"T")),
58 9 : fMax(new TLine(1,0.5,3,0.5))
59 15 : {
60 : // default constructor
61 3 : fMax->SetLineColor(kGreen);
62 3 : fMax->SetLineWidth(3);
63 6 : }
64 : //____________________________________________________________________________
65 : AliACORDEQAChecker::~AliACORDEQAChecker()
66 0 : {
67 : // destructor
68 0 : delete fTextDQMShifterInfo;
69 0 : delete fMax;
70 0 : }
71 : //____________________________________________________________________________
72 : AliACORDEQAChecker::AliACORDEQAChecker(const AliACORDEQAChecker& qac) :
73 0 : AliQACheckerBase(qac.GetName(), qac.GetTitle()),
74 0 : fTextDQMShifterInfo(new TPaveText(2.2,0.90,2.9,0.99,"T")),
75 0 : fMax(static_cast<TLine*>(qac.fMax->Clone()))
76 0 : {
77 : //
78 0 : }
79 : //____________________________________________________________________________
80 : AliACORDEQAChecker& AliACORDEQAChecker::operator = (const AliACORDEQAChecker &qac)
81 : {
82 : // use cpy option from constructor
83 0 : if (&qac==this) return *this;
84 0 : new (this) AliACORDEQAChecker(qac);
85 0 : return *this;
86 0 : }
87 : //____________________________________________________________________________
88 : void AliACORDEQAChecker::Check(Double_t * test, AliQAv1::ALITASK_t /*index*/)
89 : {
90 0 : for (Int_t specie = 0 ; specie < AliRecoParam::kNSpecies ; specie++)
91 0 : test[specie] = 0.0 ;
92 0 : }
93 : //____________________________________________________________________________
94 : void AliACORDEQAChecker::Check(Double_t * test, AliQAv1::ALITASK_t /*index*/, TObjArray ** list, const AliDetectorRecoParam * /*recoParam*/)
95 : {
96 : // Close version to the final one for the ACORDE QA Checker
97 :
98 : // Loop over the run species (for specie!= cosmic by now we set QA to INFO)
99 :
100 117 : for (Int_t specie = 0 ; specie < AliRecoParam::kNSpecies ; specie++)
101 : {
102 45 : test[specie] = 1.0;
103 45 : if ( !AliQAv1::Instance()->IsEventSpecieSet(specie) ) continue ;
104 0 : if (list[specie]->GetEntries() == 0) test[specie] = 1.; // Nothing to check
105 : else
106 : {
107 0 : TIter next(list[specie]) ;
108 : TH1 * hdata ; // Data created by the AliACORDEQADataMakerXXX (Sim/Rec)
109 0 : while ( (hdata = dynamic_cast<TH1 *>(next())) )
110 : {
111 : //if (hdata)
112 0 : if (hdata->GetEntries()!=0)
113 : {
114 : Double_t rv = 0.0 ;
115 0 : if(hdata->GetEntries()>0) rv=1;
116 0 : AliDebug(AliQAv1::GetQADebugLevel(), Form("%s -> %f", hdata->GetName(), rv)) ;
117 0 : TString hdataName = hdata->GetName();
118 : //if (hdata->GetListOfFunctions()->GetEntries() == 0) continue;
119 :
120 0 : if (hdataName.Contains("fhACORDEStatusAMU_DQM"))
121 : {
122 0 : if (!hdata->GetListOfFunctions()->Contains(fTextDQMShifterInfo))
123 0 : hdata->GetListOfFunctions()->Add(fTextDQMShifterInfo);
124 0 : if (!hdata->GetListOfFunctions()->Contains(fMax))
125 0 : hdata->GetListOfFunctions()->Add(fMax);
126 : }
127 : // check with OCDB ref. data
128 0 : if ( (fRefOCDBSubDir[specie]) && (hdataName.Contains("ACORDEBitPattern")) )
129 : {
130 : TH1 * href = NULL;
131 0 : if (fRefSubDir) href = static_cast<TH1*>(fRefSubDir->Get(hdata->GetName()));
132 0 : else if (fRefOCDBSubDir[specie]) href = static_cast<TH1*>(fRefOCDBSubDir[specie]->FindObject(hdata->GetName()));
133 0 : test[specie] = CheckAcordeRefHits(href,hdata);
134 0 : }else
135 : {
136 0 : if (hdataName.Contains("ACORDEBitPattern"))
137 : // Here we use an inner QA Checher without the QAref data
138 : {
139 0 : Float_t acoDataMax = hdata->GetMaximum();
140 : Int_t flagAcoQAChecker = 0;
141 0 : if (acoDataMax == 0) continue;
142 0 : for(Int_t i=0;i<60;i++)
143 : {
144 0 : if ((hdata->GetBinContent(i)/acoDataMax) < 0.75) flagAcoQAChecker++;
145 : }
146 0 : Double_t simpleFlag = 1.-flagAcoQAChecker/60.;
147 0 : if ( (simpleFlag >= 0.90) && (simpleFlag <= 1.0) ) test[specie] = 0.75; // INFO
148 0 : if ( (simpleFlag >= 0.70) && (simpleFlag < 0.90) ) test[specie] = 0.50; // WARNING
149 0 : if ( (simpleFlag >= 0.25) && (simpleFlag < 0.70) ) test[specie] = 0.25; // ERROR
150 0 : if ( (simpleFlag >= 0.0) && (simpleFlag < 0.25) ) test[specie] = -1.0; // FATAL
151 0 : if (test[specie]>0) rv = test[specie];
152 : else rv = 1.0;
153 0 : }
154 0 : if (hdataName.Contains("fhACORDEStatusAMU_DQM"))
155 : {
156 0 : Float_t goodModules = hdata->GetBinContent(1);
157 0 : Float_t badModules = hdata->GetBinContent(2);
158 0 : if (goodModules >= badModules)
159 0 : test[specie] = 0.75;
160 0 : else test[specie] = 0.30;
161 :
162 0 : } // check for DQM condition
163 0 : rv = test[specie];
164 0 : if (fTextDQMShifterInfo) // DQM-flag asignment
165 : {
166 0 : fTextDQMShifterInfo->Clear();
167 0 : if (rv > 0.4){
168 0 : fTextDQMShifterInfo->SetFillColor(kGreen);
169 0 : fTextDQMShifterInfo->AddText("ACORDE: O.K.");
170 : }else{
171 0 : fTextDQMShifterInfo->SetFillColor(kRed);
172 0 : fTextDQMShifterInfo->AddText("ACORDE: Not, O.K.");
173 : }
174 : } // end DQM flag asignment
175 : }// NO OCDB checking
176 0 : } // hdata with entries
177 0 : else AliError("Data type cannot be processed") ;
178 : } // loop over histograms from QADataMaker
179 0 : } // end checker
180 0 : if ( (specie == AliRecoParam::kHighMult) || (specie == AliRecoParam::kLowMult) || (specie == AliRecoParam::kCalib) ) test[specie] = 0.75;
181 : } // end of species
182 9 : }
183 : //____________________________________________________________________________
184 : Double_t AliACORDEQAChecker::CheckAcordeRefHits(const TH1 * href, const TH1 * hdata) const
185 : {
186 : Double_t test = 0.;
187 : Int_t flag=0;
188 0 : for (Int_t i=0;i<60;i++)
189 : {
190 0 : if (TMath::Abs(href->GetBinContent(i)-hdata->GetBinContent(i))>10) flag++;
191 : }
192 0 : if ((flag>50)&&(flag<=60)) test = -1.;
193 0 : if ((flag>30)&&(flag<=50)) test = 0.25;
194 0 : if ((flag>10)&&(flag<=30)) test = 0.5;
195 0 : if ((flag>0)&&(flag<=10)) test = 0.75;
196 0 : return test;
197 : }
|