]>
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]), |
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()), | |
38986b78 | 99 | fTextSM(new TText*[fknSM]) , |
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 |
9e47432c | 104 | for (Int_t sm = 0 ; sm < fknSM ; 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) |
9e47432c | 114 | { |
38986b78 | 115 | fTextSM = new TText*[fknSM] ; |
116 | fLineCol = static_cast<TLine*>(qac.fLineCol->Clone()) ; | |
00957c37 | 117 | fText = new TPaveText(0.2,0.7,0.8,0.9,"NDC") ; |
9e47432c | 118 | for (Int_t sm = 0 ; sm < fknSM ; sm++){ |
38986b78 | 119 | fTextSM[sm] = static_cast<TText *>(qac.fTextSM[sm]->Clone()) ; |
9e47432c | 120 | } |
8a38cd34 | 121 | for(Int_t i = 0; i < 4; i++) { |
122 | ||
123 | fLineRow[i] = static_cast<TLine*>(qac.fLineRow[i]->Clone()) ; | |
124 | } | |
9e47432c | 125 | return *this ; |
126 | } | |
127 | ||
128 | //______________________________________________________________________________ | |
a42ceb0e | 129 | void AliEMCALQAChecker::Check(Double_t * test, AliQAv1::ALITASK_t index, TObjArray ** list, const AliDetectorRecoParam * /*recoParam*/) |
9e47432c | 130 | { |
131 | /// Check objects in list | |
132 | ||
133 | if ( index == AliQAv1::kRAW ) | |
134 | { | |
a42ceb0e | 135 | CheckRaws(test, list); |
9e47432c | 136 | printf ("checkers for task %d \n", index) ; |
137 | } | |
138 | ||
139 | if ( index == AliQAv1::kREC) | |
140 | { | |
a42ceb0e | 141 | CheckRecPoints(test, list); |
9e47432c | 142 | } |
143 | ||
144 | if ( index == AliQAv1::kESD ) | |
145 | { | |
a42ceb0e | 146 | CheckESD(test, list); |
9e47432c | 147 | } |
148 | AliWarning(Form("Checker for task %d not implement for the moment",index)); | |
9e47432c | 149 | } |
150 | ||
151 | //______________________________________________________________________________ | |
152 | TH1* | |
153 | AliEMCALQAChecker::GetHisto(TObjArray* list, const char* hname, Int_t specie) const | |
154 | { | |
155 | /// Get a given histo from the list | |
156 | TH1* h = static_cast<TH1*>(list->FindObject(Form("%s_%s",AliRecoParam::GetEventSpecieName(specie),hname))); | |
157 | if (!h) | |
158 | { | |
159 | AliError(Form("Did not find expected histo %s",hname)); | |
160 | } | |
161 | return h; | |
162 | } | |
163 | ||
164 | //______________________________________________________________________________ | |
165 | Double_t | |
166 | AliEMCALQAChecker::MarkHisto(TH1& histo, Double_t value) const | |
167 | { | |
168 | /// Mark histo as originator of some QA error/warning | |
169 | ||
170 | if ( value != 1.0 ) | |
171 | { | |
172 | histo.SetBit(AliQAv1::GetQABit()); | |
173 | } | |
174 | ||
175 | return value; | |
176 | } | |
177 | ||
178 | ||
179 | //______________________________________________________________________________ | |
a42ceb0e | 180 | void AliEMCALQAChecker::CheckRaws(Double_t * test, TObjArray ** list) |
9e47432c | 181 | { |
f05c8877 | 182 | // Check RAW QA histograms |
183 | // -- Yaxian Mao, CCNU/CERN/LPSC | |
184 | //adding new checking method: 25/04/2010, Yaxian Mao | |
185 | //Comparing the amplitude from current run to the reference run, if the ratio in the range [0.8, .12], count as a good tower. | |
186 | //If more than 90% towers are good, EMCAL works fine, otherwise experts should be contacted. | |
6a754398 | 187 | |
38986b78 | 188 | |
189 | //Float_t kThreshold = 80. ; | |
190 | Int_t nTowersPerSM = 24*48; // number of towers in a SuperModule; 24x48 | |
191 | Double_t nTot = fknSM * nTowersPerSM ; | |
a2655076 | 192 | for (Int_t specie = 0 ; specie < AliRecoParam::kNSpecies ; specie++) { |
a42ceb0e | 193 | test[specie] = 0.0 ; |
a2655076 | 194 | if ( !AliQAv1::Instance()->IsEventSpecieSet(specie)) |
195 | continue ; | |
196 | if (list[specie]->GetEntries() == 0) | |
a42ceb0e | 197 | test[specie] = 0. ; // nothing to check |
a2655076 | 198 | else { |
38986b78 | 199 | TH2F * hdata = (TH2F*)list[specie]->At(k2DRatioAmp) ; |
200 | TH1F * ratio = (TH1F*)list[specie]->At(kRatioDist) ; | |
201 | if(hdata->GetEntries()==0 || ratio->GetEntries()==0) | |
202 | continue; | |
203 | //adding the lines to distinguish different SMs | |
204 | if ( hdata->GetListOfFunctions()->GetEntries() == 0 ){ | |
205 | hdata->GetListOfFunctions()->Add(fLineCol); | |
8a38cd34 | 206 | for(Int_t iLine = 0; iLine < 4; iLine++) { |
207 | hdata->GetListOfFunctions()->Add(fLineRow[iLine]); | |
208 | } | |
38986b78 | 209 | //Now adding the text to for each SM |
210 | for(Int_t iSM = 0 ; iSM < fknSM ; iSM++){ //number of SMs loop start | |
211 | hdata->GetListOfFunctions()->Add(fTextSM[iSM]); | |
212 | } | |
213 | } | |
00957c37 | 214 | if ( ratio->GetListOfFunctions()->GetEntries() == 0 ){ //adding the object at the beginning |
f05c8877 | 215 | ratio->GetListOfFunctions()->Add(fText) ; |
216 | } | |
38986b78 | 217 | |
218 | //now check the ratio histogram | |
219 | Double_t binContent = 0. ; | |
220 | Int_t NGoodTower = 0 ; | |
f05c8877 | 221 | Double_t rv = 0. ; |
38986b78 | 222 | for(Int_t ix = 1; ix <= hdata->GetNbinsX(); ix++) { |
223 | for(Int_t iy = 1; iy <= hdata->GetNbinsY(); iy++) { | |
224 | binContent = hdata->GetBinContent(ix, iy) ; | |
225 | if (binContent < 1.2 && binContent > 0.8) | |
226 | NGoodTower++ ; | |
6a754398 | 227 | } |
6a754398 | 228 | } |
38986b78 | 229 | rv = NGoodTower/nTot ; |
f05c8877 | 230 | printf("%2.2f %% towers out of range [0.8, 1.2]\n", (1-rv)*100); |
231 | if(fText){ | |
f05c8877 | 232 | fText->Clear() ; |
7e1d9a9b | 233 | |
234 | fText->AddText(Form("%2.2f %% towers out of range [0.8, 1.2]", (1-rv)*100)); | |
235 | if (rv < 0.9) { | |
236 | test[specie] = 0.9 ; | |
237 | // 2 lines text info for quality | |
238 | fText->SetFillColor(2) ; | |
239 | fText->AddText(Form("EMCAL = NOK, CALL EXPERTS!!!")); | |
240 | } | |
241 | else { | |
242 | test[specie] = 0.1 ; | |
243 | fText->SetFillColor(3) ; | |
244 | fText->AddText(Form("EMCAL = OK, ENJOY...")); | |
245 | } | |
246 | //hdata->Reset("ICE"); | |
247 | //ratio->Reset("ICE"); | |
248 | }//fText | |
38986b78 | 249 | } |
250 | } //finish the checking | |
9e47432c | 251 | } |
252 | ||
253 | //______________________________________________________________________________ | |
254 | void AliEMCALQAChecker::Init(const AliQAv1::DETECTORINDEX_t det) | |
255 | { | |
256 | /// intialises QA and QA checker settings | |
257 | AliQAv1::Instance(det) ; | |
258 | Float_t hiValue[AliQAv1::kNBIT] ; | |
259 | Float_t lowValue[AliQAv1::kNBIT] ; | |
260 | lowValue[AliQAv1::kINFO] = 0.0 ; | |
261 | hiValue[AliQAv1::kINFO] = 0.1 ; | |
9e47432c | 262 | lowValue[AliQAv1::kWARNING] = 0.1 ; |
6a754398 | 263 | hiValue[AliQAv1::kWARNING] = 0.5 ; |
9e47432c | 264 | lowValue[AliQAv1::kERROR] = 0.5 ; |
265 | hiValue[AliQAv1::kERROR] = 0.8 ; | |
266 | lowValue[AliQAv1::kFATAL] = 0.8 ; | |
267 | hiValue[AliQAv1::kFATAL] = 1.0 ; | |
268 | SetHiLo(&hiValue[0], &lowValue[0]) ; | |
269 | } | |
94594e5d | 270 |