]>
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"), | |
afae9650 | 57 | fTextSM(new TText*[fgknSM]), |
8a38cd34 | 58 | fLineCol(new TLine(47.5,-0.5,47.5,119.5)), |
00957c37 | 59 | fText(new TPaveText(0.2,0.7,0.8,0.9,"NDC")) |
9e47432c | 60 | { |
38986b78 | 61 | // ctor |
62 | fLineCol->SetLineColor(1); | |
63 | fLineCol->SetLineWidth(2); | |
38986b78 | 64 | |
65 | fTextSM[0]= new TText(20, 12, "SM A0"); | |
8a38cd34 | 66 | fTextSM[1]= new TText(20, 36, "SM A1"); |
67 | fTextSM[2]= new TText(20, 60, "SM A2"); | |
68 | fTextSM[3]= new TText(20, 84, "SM A3"); | |
69 | fTextSM[4]= new TText(20, 108,"SM A4"); | |
70 | ||
71 | fTextSM[5]= new TText(64, 12, "SM C0"); | |
72 | fTextSM[6]= new TText(64, 36, "SM C1"); | |
73 | fTextSM[7]= new TText(64, 60, "SM C2"); | |
74 | fTextSM[8]= new TText(64, 84, "SM C3"); | |
75 | fTextSM[9]= new TText(64, 108,"SM C4"); | |
76 | ||
77 | for(int i = 0; i < 4; i++) { | |
78 | fLineRow[i] = new TLine(-0.5,23.5+(24*i),95.5,23.5+(24*i)); | |
79 | fLineRow[i]->SetLineColor(1); | |
80 | fLineRow[i]->SetLineWidth(2); | |
81 | } | |
82 | ||
83 | ||
9e47432c | 84 | } |
85 | ||
86 | //__________________________________________________________________ | |
87 | AliEMCALQAChecker::~AliEMCALQAChecker() | |
88 | { | |
89 | /// dtor | |
38986b78 | 90 | delete [] fTextSM ; |
a42ceb0e | 91 | delete fLineCol ; |
b08d5260 | 92 | for (Int_t i=0; i<4; ++i) delete fLineRow[i] ; |
a42ceb0e | 93 | delete fText ; |
9e47432c | 94 | } |
95 | ||
96 | //__________________________________________________________________ | |
97 | AliEMCALQAChecker::AliEMCALQAChecker(const AliEMCALQAChecker& qac) : | |
98 | AliQACheckerBase(qac.GetName(), qac.GetTitle()), | |
afae9650 | 99 | fTextSM(new TText*[fgknSM]) , |
38986b78 | 100 | fLineCol(static_cast<TLine*>(qac.fLineCol->Clone())) , |
00957c37 | 101 | fText(new TPaveText(0.2,0.7,0.8,0.9,"NDC")) |
9e47432c | 102 | { |
38986b78 | 103 | // copy ctor |
afae9650 | 104 | for (Int_t sm = 0 ; sm < fgknSM ; sm++){ |
38986b78 | 105 | fTextSM[sm] = static_cast<TText *>(qac.fTextSM[sm]->Clone()) ; |
9e47432c | 106 | } |
8a38cd34 | 107 | for(Int_t i = 0 ; i < 4 ; i++) { |
a42ceb0e | 108 | |
8a38cd34 | 109 | fLineRow[i] = static_cast<TLine*>(qac.fLineRow[i]->Clone()) ; |
110 | } | |
9e47432c | 111 | } |
112 | //__________________________________________________________________ | |
38986b78 | 113 | AliEMCALQAChecker& AliEMCALQAChecker::operator = (const AliEMCALQAChecker &qac) |
dab4328c | 114 | { // assignment operator; use copy ctor |
115 | if (&qac == this) return *this; | |
8a38cd34 | 116 | |
dab4328c | 117 | new (this) AliEMCALQAChecker(qac); |
118 | return *this; | |
9e47432c | 119 | } |
120 | ||
121 | //______________________________________________________________________________ | |
a42ceb0e | 122 | void AliEMCALQAChecker::Check(Double_t * test, AliQAv1::ALITASK_t index, TObjArray ** list, const AliDetectorRecoParam * /*recoParam*/) |
9e47432c | 123 | { |
124 | /// Check objects in list | |
125 | ||
126 | if ( index == AliQAv1::kRAW ) | |
127 | { | |
a42ceb0e | 128 | CheckRaws(test, list); |
9e47432c | 129 | printf ("checkers for task %d \n", index) ; |
130 | } | |
131 | ||
132 | if ( index == AliQAv1::kREC) | |
133 | { | |
a42ceb0e | 134 | CheckRecPoints(test, list); |
9e47432c | 135 | } |
136 | ||
137 | if ( index == AliQAv1::kESD ) | |
138 | { | |
a42ceb0e | 139 | CheckESD(test, list); |
9e47432c | 140 | } |
141 | AliWarning(Form("Checker for task %d not implement for the moment",index)); | |
9e47432c | 142 | } |
143 | ||
144 | //______________________________________________________________________________ | |
145 | TH1* | |
146 | AliEMCALQAChecker::GetHisto(TObjArray* list, const char* hname, Int_t specie) const | |
147 | { | |
148 | /// Get a given histo from the list | |
149 | TH1* h = static_cast<TH1*>(list->FindObject(Form("%s_%s",AliRecoParam::GetEventSpecieName(specie),hname))); | |
150 | if (!h) | |
151 | { | |
152 | AliError(Form("Did not find expected histo %s",hname)); | |
153 | } | |
154 | return h; | |
155 | } | |
156 | ||
157 | //______________________________________________________________________________ | |
158 | Double_t | |
159 | AliEMCALQAChecker::MarkHisto(TH1& histo, Double_t value) const | |
160 | { | |
161 | /// Mark histo as originator of some QA error/warning | |
162 | ||
163 | if ( value != 1.0 ) | |
164 | { | |
165 | histo.SetBit(AliQAv1::GetQABit()); | |
166 | } | |
167 | ||
168 | return value; | |
169 | } | |
170 | ||
171 | ||
172 | //______________________________________________________________________________ | |
a42ceb0e | 173 | void AliEMCALQAChecker::CheckRaws(Double_t * test, TObjArray ** list) |
9e47432c | 174 | { |
f05c8877 | 175 | // Check RAW QA histograms |
176 | // -- Yaxian Mao, CCNU/CERN/LPSC | |
177 | //adding new checking method: 25/04/2010, Yaxian Mao | |
178 | //Comparing the amplitude from current run to the reference run, if the ratio in the range [0.8, .12], count as a good tower. | |
179 | //If more than 90% towers are good, EMCAL works fine, otherwise experts should be contacted. | |
6a754398 | 180 | |
38986b78 | 181 | |
182 | //Float_t kThreshold = 80. ; | |
183 | Int_t nTowersPerSM = 24*48; // number of towers in a SuperModule; 24x48 | |
afae9650 | 184 | Double_t nTot = fgknSM * nTowersPerSM ; |
180c431b | 185 | TList *lstF = 0; |
a2655076 | 186 | for (Int_t specie = 0 ; specie < AliRecoParam::kNSpecies ; specie++) { |
a42ceb0e | 187 | test[specie] = 0.0 ; |
a2655076 | 188 | if ( !AliQAv1::Instance()->IsEventSpecieSet(specie)) |
189 | continue ; | |
190 | if (list[specie]->GetEntries() == 0) | |
a42ceb0e | 191 | test[specie] = 0. ; // nothing to check |
a2655076 | 192 | else { |
38986b78 | 193 | TH2F * hdata = (TH2F*)list[specie]->At(k2DRatioAmp) ; |
194 | TH1F * ratio = (TH1F*)list[specie]->At(kRatioDist) ; | |
195 | if(hdata->GetEntries()==0 || ratio->GetEntries()==0) | |
196 | continue; | |
197 | //adding the lines to distinguish different SMs | |
180c431b | 198 | lstF = hdata->GetListOfFunctions(); |
199 | { // RS: clean list of functions | |
200 | if (lstF) { | |
201 | TObject *stats = lstF->FindObject("stats"); lstF->Remove(stats); | |
202 | TObject *obj; | |
203 | while ((obj = lstF->First())) { while(lstF->Remove(obj)) { } delete obj; } | |
204 | if (stats) lstF->Add(stats); | |
9ae19208 | 205 | } |
206 | else { | |
207 | AliWarning(Form("Checker : empty list of data functions; returning")); | |
208 | return; | |
209 | } | |
f05c8877 | 210 | } |
180c431b | 211 | lstF->Add(fLineCol->Clone()); |
212 | for(Int_t iLine = 0; iLine < 4; iLine++) { | |
213 | lstF->Add(fLineRow[iLine]->Clone()); | |
214 | } | |
215 | //Now adding the text to for each SM | |
afae9650 | 216 | for(Int_t iSM = 0 ; iSM < fgknSM ; iSM++){ //number of SMs loop start |
180c431b | 217 | lstF->Add(fTextSM[iSM]->Clone()); |
218 | } | |
219 | // | |
220 | lstF = ratio->GetListOfFunctions(); | |
221 | { // RS: clean list of functions | |
222 | if (lstF) { | |
223 | TObject *stats = lstF->FindObject("stats"); lstF->Remove(stats); | |
224 | TObject *obj; | |
225 | while ((obj = lstF->First())) { while(lstF->Remove(obj)) { } delete obj; } | |
226 | if (stats) lstF->Add(stats); | |
9ae19208 | 227 | } |
228 | else { | |
229 | AliWarning(Form("Checker : empty list of ratio functions; returning")); | |
230 | return; | |
180c431b | 231 | } |
232 | } | |
233 | lstF->Add(fText->Clone()) ; | |
234 | // | |
38986b78 | 235 | //now check the ratio histogram |
236 | Double_t binContent = 0. ; | |
237 | Int_t NGoodTower = 0 ; | |
f05c8877 | 238 | Double_t rv = 0. ; |
38986b78 | 239 | for(Int_t ix = 1; ix <= hdata->GetNbinsX(); ix++) { |
240 | for(Int_t iy = 1; iy <= hdata->GetNbinsY(); iy++) { | |
241 | binContent = hdata->GetBinContent(ix, iy) ; | |
242 | if (binContent < 1.2 && binContent > 0.8) | |
243 | NGoodTower++ ; | |
6a754398 | 244 | } |
6a754398 | 245 | } |
38986b78 | 246 | rv = NGoodTower/nTot ; |
f05c8877 | 247 | printf("%2.2f %% towers out of range [0.8, 1.2]\n", (1-rv)*100); |
248 | if(fText){ | |
f05c8877 | 249 | fText->Clear() ; |
7e1d9a9b | 250 | |
251 | fText->AddText(Form("%2.2f %% towers out of range [0.8, 1.2]", (1-rv)*100)); | |
252 | if (rv < 0.9) { | |
253 | test[specie] = 0.9 ; | |
254 | // 2 lines text info for quality | |
255 | fText->SetFillColor(2) ; | |
256 | fText->AddText(Form("EMCAL = NOK, CALL EXPERTS!!!")); | |
257 | } | |
258 | else { | |
259 | test[specie] = 0.1 ; | |
260 | fText->SetFillColor(3) ; | |
261 | fText->AddText(Form("EMCAL = OK, ENJOY...")); | |
262 | } | |
263 | //hdata->Reset("ICE"); | |
264 | //ratio->Reset("ICE"); | |
265 | }//fText | |
180c431b | 266 | } |
267 | } //finish the checking | |
9e47432c | 268 | } |
269 | ||
270 | //______________________________________________________________________________ | |
271 | void AliEMCALQAChecker::Init(const AliQAv1::DETECTORINDEX_t det) | |
272 | { | |
273 | /// intialises QA and QA checker settings | |
274 | AliQAv1::Instance(det) ; | |
275 | Float_t hiValue[AliQAv1::kNBIT] ; | |
276 | Float_t lowValue[AliQAv1::kNBIT] ; | |
277 | lowValue[AliQAv1::kINFO] = 0.0 ; | |
278 | hiValue[AliQAv1::kINFO] = 0.1 ; | |
9e47432c | 279 | lowValue[AliQAv1::kWARNING] = 0.1 ; |
6a754398 | 280 | hiValue[AliQAv1::kWARNING] = 0.5 ; |
9e47432c | 281 | lowValue[AliQAv1::kERROR] = 0.5 ; |
282 | hiValue[AliQAv1::kERROR] = 0.8 ; | |
283 | lowValue[AliQAv1::kFATAL] = 0.8 ; | |
284 | hiValue[AliQAv1::kFATAL] = 1.0 ; | |
285 | SetHiLo(&hiValue[0], &lowValue[0]) ; | |
286 | } | |
94594e5d | 287 |