1 #include <AliFMDCalibDrawer.h>
6 #include <AliFMDParameters.h>
7 #include <AliCDBManager.h>
9 // #include <AliFMDCalibPedestal.h>
10 // #include <AliFMDCalibSampleRate.h>
11 // #include <AliFMDCalibStripRange.h>
13 //____________________________________________________________________
15 AliFMDCalibDrawer::Init(Int_t runNo, const char* ocdb)
17 AliCDBManager* cdb = AliCDBManager::Instance();
20 if (db.EqualTo("run", TString::kIgnoreCase) || db.IsNull())
21 cdb->SetDefaultStorageFromRun(runNo);
23 cdb->SetDefaultStorage(db);
25 AliFMDParameters* pars = AliFMDParameters::Instance();
29 //____________________________________________________________________
31 AliFMDCalibDrawer::GetHistMax(EWhat what) const
34 case kPedestal: return 150;
35 case kNoise: return 5;
37 case kDead: return 1.5;
39 case kRange: return 128;
40 case kZeroSuppression: return 10;
44 //____________________________________________________________________
46 AliFMDCalibDrawer::GetHistMin(EWhat what) const
49 case kPedestal: return 0;
50 case kNoise: return 0;
52 case kDead: return -.5;
54 case kRange: return -1;
55 case kZeroSuppression: return -1;
60 //____________________________________________________________________
62 AliFMDCalibDrawer::GetHistName(EWhat what) const
65 case kPedestal: return "peds";
66 case kNoise: return "noise";
67 case kGain: return "gain";
68 case kDead: return "dead";
69 case kRate: return "rate";
70 case kRange: return "range";
71 case kZeroSuppression: return "thrs";
75 //____________________________________________________________________
77 AliFMDCalibDrawer::GetHistTitle(EWhat what) const
80 case kPedestal: return "Pedestal & noise";
81 case kNoise: return "Noise";
82 case kGain: return "Gain";
83 case kDead: return "Dead map";
84 case kRate: return "Sample rate";
85 case kRange: return "Strip range";
86 case kZeroSuppression: return "ZS threshold";
91 //____________________________________________________________________
93 AliFMDCalibDrawer::GetRingColor(UShort_t d, Char_t r) const
95 return ((d == 1 ? kRed : (d == 2 ? kGreen : kBlue))
96 + ((r == 'I' || r == 'i') ? 2 : -3));
98 //____________________________________________________________________
100 AliFMDCalibDrawer::SetAttributes(TH1* ret, EWhat what,
101 UShort_t d, Char_t r) const
103 ret->SetFillColor(GetRingColor(d,r));
104 ret->SetMarkerColor(GetRingColor(d,r));
105 ret->SetLineColor(GetRingColor(d,r));
106 ret->SetFillStyle(3001);
107 ret->SetMarkerStyle(20);
108 ret->SetLineStyle(1);
110 ret->SetDirectory(0);
111 ret->SetMinimum(GetHistMin(what));
112 ret->SetMaximum(GetHistMax(what));
114 //____________________________________________________________________
116 AliFMDCalibDrawer::Make2D(EWhat what, UShort_t d, Char_t r) const
118 UShort_t q = (r == 'I' || r == 'i') ? 0 : 1;
119 UShort_t nY = q == 0 ? 20 : 40;
120 UShort_t nX = q == 0 ? 512 : 256;
121 TString n(Form("%s_FMD%d%c", GetHistName(what), d, r));
122 TString t(Form("%s for FMD%d%c", GetHistTitle(what), d, r));
123 TH2D* ret = new TH2D(n, t, nX, 0, nX, nY, 0, nY);
124 ret->SetXTitle("Strip #");
125 ret->SetYTitle("Sector #");
126 ret->SetZTitle(GetHistTitle(what));
127 ret->GetXaxis()->SetNdivisions(1600 + (q == 0 ? 4 : 2),false);
128 ret->GetYaxis()->SetNdivisions(nY, false);
129 SetAttributes(ret, what, d, r);
134 //____________________________________________________________________
136 AliFMDCalibDrawer::Make1D(EWhat what, UShort_t d, Char_t r, UShort_t s) const
138 UShort_t q = (r == 'I' || r == 'i') ? 0 : 1;
139 UShort_t nStr = (r == 'I' || r == 'i') ? 512 : 256;
140 TString n(Form("%s_FMD%d%c_%02d", GetHistName(what), d, r, s));
141 TString t(Form("%s for FMD%d%c[%2d]", GetHistTitle(what), d, r, s));
142 TH1D* ret = new TH1D(n, t, nStr, 0, nStr);
143 ret->SetXTitle("Strip #");
144 ret->SetYTitle(GetHistTitle(what));
145 ret->GetXaxis()->SetNdivisions(1600 + (q == 0 ? 4 : 2),false);
146 SetAttributes(ret, what, d, r);
150 //____________________________________________________________________
152 AliFMDCalibDrawer::GetNumber(EWhat what, UShort_t d, Char_t r, UShort_t s,
153 UShort_t t, Double_t& val, Double_t& err) const
155 AliFMDParameters* pars = AliFMDParameters::Instance();
159 val = pars->GetPedestal(d, r, s, t);
160 err = pars->GetPedestalWidth(d, r, s, t);
162 case kNoise: val = pars->GetPedestalWidth(d, r, s, t); break;
163 case kGain: val = pars->GetPulseGain(d, r, s, t); break;
164 case kDead: val = pars->IsDead(d, r, s, t) ? 0 : 1; break;
165 case kRate: val = pars->GetSampleRate(d, r, s, t); break;
167 val = pars->GetMaxStrip(d,r,s,t);
168 err = pars->GetMinStrip(d,r,s,t);
170 case kZeroSuppression: val = pars->GetZeroSuppression(d,r,s,t); break;
172 AliError(Form("Unknown quantity: %d - nothing returned", what));
177 //____________________________________________________________________
179 AliFMDCalibDrawer::FillRing(EWhat what, UShort_t d, Char_t r) const
181 if (what == kRate || what == kRange) {
182 TH1D* ret = new TH1D(Form("%s_FMD%d%c", GetHistName(what), d, r),
183 Form("%s for FMD%d%c", GetHistTitle(what), d, r),
185 UShort_t nSec = (r == 'I' || r == 'i') ? 20 : 40;
186 ret->GetXaxis()->SetBinLabel(1, Form("Top [%02d-%02d]", 0, nSec/2-1));
187 ret->GetXaxis()->SetBinLabel(2, Form("Bottom [%02d-%02d]",nSec/2-1,nSec-1));
188 ret->SetYTitle(GetHistTitle(what));
189 SetAttributes(ret, what, d, r);
191 ret->SetBarWidth(0.8);
192 ret->SetBarOffset(0.1);
195 ret->SetMarkerSize(0);
196 for (UShort_t s = 0; s < ret->GetNbinsX(); s++) {
199 GetNumber(what, d, r, s*(nSec/2), 0, val, err);
200 if (what == kRange) {
202 err = (val - err) / 2;
205 ret->SetBinContent(s+1, val);
206 ret->SetBinError(s+1, err);
210 if (what == kZeroSuppression) {
211 UShort_t nY = (r == 'I' || r == 'i') ? 20 : 40;
212 UShort_t nX = ((r == 'I' || r == 'i') ? 512 : 256) / 128;
213 TH2D* ret = new TH2D(Form("%s_FMD%d%c", GetHistName(what), d, r),
214 Form("%s for FMD%d%c", GetHistTitle(what), d, r),
215 nX, 0, nX, nY, 0, nY);
216 ret->SetXTitle("Channel #");
217 ret->SetYTitle("Sector #");
218 ret->SetZTitle(GetHistTitle(what));
219 ret->GetXaxis()->SetNdivisions(nX, false);
220 ret->GetYaxis()->SetNdivisions(nY, false);
221 SetAttributes(ret, what, d, r);
222 for (UShort_t s = 0; s < ret->GetNbinsY(); s++) {
223 for (UShort_t t = 0; t < ret->GetNbinsX(); t++) {
226 GetNumber(what, d, r, s, t*128, val, err);
227 ret->SetBinContent(t+1, s+1, val);
228 ret->SetBinError(t+1, s+1, err);
234 TH2D* ret = Make2D(what, d, r);
235 for (UShort_t s = 0; s < ret->GetNbinsY(); s++) {
236 for (UShort_t t = 0; t < ret->GetNbinsX(); t++) {
239 GetNumber(what, d, r, s, t, val, err);
240 ret->SetBinContent(t+1, s+1, val);
241 ret->SetBinError(t+1, s+1, err);
246 //____________________________________________________________________
248 AliFMDCalibDrawer::FillSector(EWhat what,UShort_t d, Char_t r, UShort_t s) const
250 if (what == kZeroSuppression) {
251 UShort_t nX = ((r == 'I' || r == 'i') ? 512 : 256) / 128;
252 TH1D* ret = new TH1D(Form("%s_FMD%d%c[%02d]",
253 GetHistName(what), d, r, s),
254 Form("%s for FMD%d%c[%02d]",
255 GetHistTitle(what), d, r, s),
257 ret->SetXTitle("Channel #");
258 ret->SetYTitle(GetHistTitle(what));
259 SetAttributes(ret, what, d, r);
260 ret->GetXaxis()->SetNdivisions(nX, false);
261 for (UShort_t t = 0; t < ret->GetNbinsX(); t++) {
264 GetNumber(what, d, r, s, t*128, val, err);
265 ret->SetBinContent(t+1, s+1, val);
266 if (err >= 0) ret->SetBinError(t+1, s+1, err);
271 TH1D* ret = Make1D(what, d, r, s);
272 for (UShort_t t = 0; t < ret->GetNbinsX(); t++) {
275 GetNumber(what, d, r, s, t, val, err);
276 ret->SetBinContent(t+1, s+1, val);
277 if (err >= 0) ret->SetBinError(t+1, s+1, err);
282 //____________________________________________________________________
284 AliFMDCalibDrawer::DrawOne(EWhat what, Short_t d, Char_t r,
285 Short_t s, Short_t /*t*/) const
287 Info("DrawOne", "Will draw %s for D=%d, R=%c, S=%d",
288 GetHistTitle(what), d, (r == '\0' ? '-' : r), s);
289 TVirtualPad* tp = gPad;
290 if (!tp) tp = TCanvas::MakeDefCanvas();
291 if (d <= 0 || d > 3) {
292 // All detectors - need to split current pad
294 for (UShort_t dd = 1; dd <= 3; dd++) {
297 DrawOne(what, dd, '\0', -1, -1);
300 else if ((r != 'I' && r != 'i') && (r != 'O' && r != 'o')) {
301 // All rings in a detector. Split current pad in two
302 tp->SetName(Form("FMD%d", d));
304 for (UShort_t q = 0; q < 2; q++) {
306 Char_t rr = q == 0 ? 'I' : 'O';
308 DrawOne(what, d, rr, -1, -1);
311 else if (what == kRate || what == kRange || s < 0 || s > 39) {
312 // A single ring - and special case for sample rate and strip range
313 tp->SetName(Form("FMD%d%c", d, r));
316 tp->SetRightMargin(0.10);
317 if (d == 1 && (r == 'O' || r == 'o')) return;
318 TH1* h = FillRing(what, d, r);
320 case kRate: h->Draw("bar"); break;
321 case kRange: h->Draw("e3"); break;
322 default: h->Draw("colz"); break;
326 // Finally, we're down to a single sector. In this case, we just do
327 // a single 1D histogram
328 TH1* h = FillSector(what, d, r, s);
338 //____________________________________________________________________