]>
Commit | Line | Data |
---|---|---|
94594e5d | 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 | Checks the quality assurance. | |
18 | By comparing with reference data | |
19 | ||
20 | Based on PHOS code written by | |
21 | Y. Schutz CERN July 2007 | |
9e47432c | 22 | |
a2655076 | 23 | For the moment we only implement the checking of raw data QA. |
24 | The checked for ESD and RecPoints will be implemented later. | |
9e47432c | 25 | |
26 | ||
9e47432c | 27 | */ |
28 | ||
94594e5d | 29 | |
30 | // --- ROOT system --- | |
31 | #include <TClass.h> | |
9e47432c | 32 | #include <TH1.h> |
33 | #include <TF1.h> | |
94594e5d | 34 | #include <TH1I.h> |
38986b78 | 35 | #include <TH2F.h> |
94594e5d | 36 | #include <TIterator.h> |
37 | #include <TKey.h> | |
38 | #include <TFile.h> | |
9e47432c | 39 | #include <TLine.h> |
38986b78 | 40 | #include <TText.h> |
9e47432c | 41 | #include <TPaveText.h> |
42 | #include <TMath.h> | |
94594e5d | 43 | |
44 | // --- Standard library --- | |
45 | ||
46 | // --- AliRoot header files --- | |
47 | #include "AliLog.h" | |
4e25ac79 | 48 | #include "AliQAv1.h" |
94594e5d | 49 | #include "AliQAChecker.h" |
50 | #include "AliEMCALQAChecker.h" | |
51 | ||
52 | ClassImp(AliEMCALQAChecker) | |
53 | ||
9e47432c | 54 | //__________________________________________________________________ |
55 | AliEMCALQAChecker::AliEMCALQAChecker() : | |
56 | AliQACheckerBase("EMCAL","EMCAL Quality Assurance Data Maker"), | |
38986b78 | 57 | fTextSM(new TText*[fknSM]), |
58 | fLineCol(new TLine(47.5,-0.5,47.5,47.5)), | |
59 | fLineRow(new TLine(-0.5,23.5,95.5,23.5)), | |
60 | fText(new TPaveText(0.2,1000.,0.7,2000.,"NDC")), | |
61 | fTest(new Double_t[AliRecoParam::kNSpecies]) | |
9e47432c | 62 | { |
38986b78 | 63 | // ctor |
64 | fLineCol->SetLineColor(1); | |
65 | fLineCol->SetLineWidth(2); | |
66 | fLineRow->SetLineColor(1); | |
67 | fLineRow->SetLineWidth(2); | |
68 | ||
69 | fTextSM[0]= new TText(20, 12, "SM A0"); | |
70 | fTextSM[1]= new TText(20, 38, "SM A1"); | |
71 | fTextSM[2]= new TText(64, 12, "SM C0"); | |
72 | fTextSM[3]= new TText(64, 38, "SM A0"); | |
73 | ||
9e47432c | 74 | for (Int_t sm = 0 ; sm < fknSM ; sm++){ |
38986b78 | 75 | // fLine[sm] = NULL ; |
76 | // fHref[sm] = NULL ; | |
9e47432c | 77 | } |
38986b78 | 78 | for (Int_t es = 0 ; es < AliRecoParam::kNSpecies ; es++) { |
79 | fTest[es] = 1.0 ; | |
80 | } | |
9e47432c | 81 | } |
82 | ||
83 | //__________________________________________________________________ | |
84 | AliEMCALQAChecker::~AliEMCALQAChecker() | |
85 | { | |
86 | /// dtor | |
38986b78 | 87 | // delete [] fLine ; |
88 | // delete [] fHref ; | |
89 | delete [] fTextSM ; | |
90 | if (fLineCol) | |
91 | delete fLineCol ; | |
92 | if (fLineRow) | |
93 | delete fLineRow ; | |
9e47432c | 94 | if (fText) |
38986b78 | 95 | delete fText ; |
96 | if (fTest) | |
97 | delete [] fTest ; | |
9e47432c | 98 | } |
99 | ||
100 | //__________________________________________________________________ | |
101 | AliEMCALQAChecker::AliEMCALQAChecker(const AliEMCALQAChecker& qac) : | |
102 | AliQACheckerBase(qac.GetName(), qac.GetTitle()), | |
38986b78 | 103 | fTextSM(new TText*[fknSM]) , |
104 | fLineCol(static_cast<TLine*>(qac.fLineCol->Clone())) , | |
105 | fLineRow(static_cast<TLine*>(qac.fLineRow->Clone())) , | |
106 | fText(new TPaveText(0.2,1000.,0.7,2000.,"NDC")), | |
107 | fTest(new Double_t[AliRecoParam::kNSpecies]) | |
9e47432c | 108 | { |
38986b78 | 109 | // copy ctor |
9e47432c | 110 | for (Int_t sm = 0 ; sm < fknSM ; sm++){ |
38986b78 | 111 | // fLine[sm] = new TLine(qac.fLine[sm]) ; |
112 | // fHref[sm] = new TLine(qac.fHref[sm]) ; | |
113 | fTextSM[sm] = static_cast<TText *>(qac.fTextSM[sm]->Clone()) ; | |
9e47432c | 114 | } |
38986b78 | 115 | for (Int_t es = 0 ; es < AliRecoParam::kNSpecies ; es++) { |
116 | fTest[es] = 0.0 ; | |
117 | } | |
9e47432c | 118 | } |
119 | //__________________________________________________________________ | |
38986b78 | 120 | AliEMCALQAChecker& AliEMCALQAChecker::operator = (const AliEMCALQAChecker &qac) |
9e47432c | 121 | { |
38986b78 | 122 | fTextSM = new TText*[fknSM] ; |
123 | fLineCol = static_cast<TLine*>(qac.fLineCol->Clone()) ; | |
124 | fLineRow = static_cast<TLine*>(qac.fLineRow->Clone()) ; | |
125 | fText = new TPaveText(0.2,1000.,0.7,2000.,"NDC") ; | |
126 | fTest = new Double_t[AliRecoParam::kNSpecies] ; | |
9e47432c | 127 | for (Int_t sm = 0 ; sm < fknSM ; sm++){ |
38986b78 | 128 | fTextSM[sm] = static_cast<TText *>(qac.fTextSM[sm]->Clone()) ; |
9e47432c | 129 | } |
38986b78 | 130 | for (Int_t es = 0 ; es < AliRecoParam::kNSpecies ; es++) { |
131 | fTest[es] = 0.0 ; | |
132 | } | |
9e47432c | 133 | return *this ; |
134 | } | |
135 | ||
136 | //______________________________________________________________________________ | |
137 | Double_t * | |
486788fc | 138 | AliEMCALQAChecker::Check(AliQAv1::ALITASK_t index, TObjArray ** list, const AliDetectorRecoParam * /*recoParam*/) |
9e47432c | 139 | { |
140 | /// Check objects in list | |
141 | ||
142 | if ( index == AliQAv1::kRAW ) | |
143 | { | |
144 | return CheckRaws(list); | |
145 | printf ("checkers for task %d \n", index) ; | |
146 | } | |
147 | ||
148 | if ( index == AliQAv1::kREC) | |
149 | { | |
150 | return CheckRecPoints(list); | |
151 | } | |
152 | ||
153 | if ( index == AliQAv1::kESD ) | |
154 | { | |
155 | return CheckESD(list); | |
156 | } | |
157 | AliWarning(Form("Checker for task %d not implement for the moment",index)); | |
158 | return NULL; | |
159 | } | |
160 | ||
161 | //______________________________________________________________________________ | |
162 | TH1* | |
163 | AliEMCALQAChecker::GetHisto(TObjArray* list, const char* hname, Int_t specie) const | |
164 | { | |
165 | /// Get a given histo from the list | |
166 | TH1* h = static_cast<TH1*>(list->FindObject(Form("%s_%s",AliRecoParam::GetEventSpecieName(specie),hname))); | |
167 | if (!h) | |
168 | { | |
169 | AliError(Form("Did not find expected histo %s",hname)); | |
170 | } | |
171 | return h; | |
172 | } | |
173 | ||
174 | //______________________________________________________________________________ | |
175 | Double_t | |
176 | AliEMCALQAChecker::MarkHisto(TH1& histo, Double_t value) const | |
177 | { | |
178 | /// Mark histo as originator of some QA error/warning | |
179 | ||
180 | if ( value != 1.0 ) | |
181 | { | |
182 | histo.SetBit(AliQAv1::GetQABit()); | |
183 | } | |
184 | ||
185 | return value; | |
186 | } | |
187 | ||
188 | ||
189 | //______________________________________________________________________________ | |
38986b78 | 190 | Double_t * AliEMCALQAChecker::CheckRaws(TObjArray ** list) |
9e47432c | 191 | { |
a2655076 | 192 | // Check RAW QA histograms |
193 | // We count the times of the response for each tower, the propability for all towers should be the same (average is given value). | |
194 | // We skip the first few cycles since the statistics is not enough, the average should be always larger than 1 at least. | |
195 | // By calculating the difference between the counts for each tower and the average, we decide whether we should recalculate | |
196 | // the average depending the the gaus fitting on the divation distribution. | |
197 | // During the recalutation of the average, we count how many towers are used for the calculation. | |
198 | // From the fraction of towers used, we decide whether each SM works fine or not | |
199 | // From the divation of average, we set the QA flag for the full detetcor as INFO, WARNING, ERROR or FATAL. | |
6a754398 | 200 | |
a2655076 | 201 | // -- Yaxian Mao, CCNU/CERN/LPSC |
38986b78 | 202 | |
203 | //Float_t kThreshold = 80. ; | |
204 | Int_t nTowersPerSM = 24*48; // number of towers in a SuperModule; 24x48 | |
205 | Double_t nTot = fknSM * nTowersPerSM ; | |
206 | Double_t rv = 0. ; | |
a2655076 | 207 | for (Int_t specie = 0 ; specie < AliRecoParam::kNSpecies ; specie++) { |
a2655076 | 208 | if ( !AliQAv1::Instance()->IsEventSpecieSet(specie)) |
209 | continue ; | |
210 | if (list[specie]->GetEntries() == 0) | |
38986b78 | 211 | fTest[specie] = 0. ; // nothing to check |
a2655076 | 212 | else { |
38986b78 | 213 | TH2F * hdata = (TH2F*)list[specie]->At(k2DRatioAmp) ; |
214 | TH1F * ratio = (TH1F*)list[specie]->At(kRatioDist) ; | |
215 | if(hdata->GetEntries()==0 || ratio->GetEntries()==0) | |
216 | continue; | |
217 | //adding the lines to distinguish different SMs | |
218 | if ( hdata->GetListOfFunctions()->GetEntries() == 0 ){ | |
219 | hdata->GetListOfFunctions()->Add(fLineCol); | |
220 | hdata->GetListOfFunctions()->Add(fLineRow); | |
221 | //Now adding the text to for each SM | |
222 | for(Int_t iSM = 0 ; iSM < fknSM ; iSM++){ //number of SMs loop start | |
223 | hdata->GetListOfFunctions()->Add(fTextSM[iSM]); | |
224 | } | |
225 | } | |
226 | if ( ratio->GetListOfFunctions()->GetEntries() == 0 ){ | |
227 | ratio->GetListOfFunctions()->Add(fText) ; | |
9e47432c | 228 | } |
38986b78 | 229 | |
230 | //now check the ratio histogram | |
231 | Double_t binContent = 0. ; | |
232 | Int_t NGoodTower = 0 ; | |
233 | for(Int_t ix = 1; ix <= hdata->GetNbinsX(); ix++) { | |
234 | for(Int_t iy = 1; iy <= hdata->GetNbinsY(); iy++) { | |
235 | binContent = hdata->GetBinContent(ix, iy) ; | |
236 | if (binContent < 1.2 && binContent > 0.8) | |
237 | NGoodTower++ ; | |
6a754398 | 238 | } |
6a754398 | 239 | } |
38986b78 | 240 | rv = NGoodTower/nTot ; |
a2655076 | 241 | |
a2655076 | 242 | |
38986b78 | 243 | if (rv < 0.9) { |
244 | fTest[specie] = 0.9 ; | |
245 | // 2 lines text info for quality | |
246 | fText->Clear() ; | |
247 | fText->AddText(Form("%2.2f %% towers out of range [0.8, 1.2]", (1-rv)*100)); | |
248 | fText->AddText(Form("EMCAL = NOK, CALL EXPERTS!!!")); | |
6a754398 | 249 | } |
38986b78 | 250 | else { |
251 | fTest[specie] = 0.1 ; | |
252 | fText->Clear() ; | |
253 | fText->AddText(Form("%2.2f %% towers out of range [0.8, 1.2]", (1-rv)*100)); | |
254 | fText->AddText(Form("EMCAL = OK")); | |
6a754398 | 255 | } |
38986b78 | 256 | } |
257 | } //finish the checking | |
258 | return fTest ; | |
9e47432c | 259 | } |
260 | ||
261 | //______________________________________________________________________________ | |
262 | void AliEMCALQAChecker::Init(const AliQAv1::DETECTORINDEX_t det) | |
263 | { | |
264 | /// intialises QA and QA checker settings | |
265 | AliQAv1::Instance(det) ; | |
266 | Float_t hiValue[AliQAv1::kNBIT] ; | |
267 | Float_t lowValue[AliQAv1::kNBIT] ; | |
268 | lowValue[AliQAv1::kINFO] = 0.0 ; | |
269 | hiValue[AliQAv1::kINFO] = 0.1 ; | |
9e47432c | 270 | lowValue[AliQAv1::kWARNING] = 0.1 ; |
6a754398 | 271 | hiValue[AliQAv1::kWARNING] = 0.5 ; |
9e47432c | 272 | lowValue[AliQAv1::kERROR] = 0.5 ; |
273 | hiValue[AliQAv1::kERROR] = 0.8 ; | |
274 | lowValue[AliQAv1::kFATAL] = 0.8 ; | |
275 | hiValue[AliQAv1::kFATAL] = 1.0 ; | |
276 | SetHiLo(&hiValue[0], &lowValue[0]) ; | |
277 | } | |
94594e5d | 278 |