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();
19 if (ocdb && ocdb[0] != '\0') cdb->SetDefaultStorage(ocdb);
21 AliFMDParameters* pars = AliFMDParameters::Instance();
25 //____________________________________________________________________
27 AliFMDCalibDrawer::GetHistMax(EWhat what) const
30 case kPedestal: return 150;
31 case kNoise: return 5;
33 case kDead: return 1.5;
35 case kRange: return 128;
36 case kZeroSuppression: return 10;
40 //____________________________________________________________________
42 AliFMDCalibDrawer::GetHistMin(EWhat what) const
45 case kPedestal: return 0;
46 case kNoise: return 0;
48 case kDead: return -.5;
50 case kRange: return -1;
51 case kZeroSuppression: return -1;
56 //____________________________________________________________________
58 AliFMDCalibDrawer::GetHistName(EWhat what) const
61 case kPedestal: return "peds";
62 case kNoise: return "noise";
63 case kGain: return "gain";
64 case kDead: return "dead";
65 case kRate: return "rate";
66 case kRange: return "range";
67 case kZeroSuppression: return "thrs";
71 //____________________________________________________________________
73 AliFMDCalibDrawer::GetHistTitle(EWhat what) const
76 case kPedestal: return "Pedestal & noise";
77 case kNoise: return "Noise";
78 case kGain: return "Gain";
79 case kDead: return "Dead map";
80 case kRate: return "Sample rate";
81 case kRange: return "Strip range";
82 case kZeroSuppression: return "ZS threshold";
87 //____________________________________________________________________
89 AliFMDCalibDrawer::GetRingColor(UShort_t d, Char_t r) const
91 return ((d == 1 ? kRed : (d == 2 ? kGreen : kBlue))
92 + ((r == 'I' || r == 'i') ? 2 : -3));
94 //____________________________________________________________________
96 AliFMDCalibDrawer::SetAttributes(TH1* ret, EWhat what,
97 UShort_t d, Char_t r) const
99 ret->SetFillColor(GetRingColor(d,r));
100 ret->SetMarkerColor(GetRingColor(d,r));
101 ret->SetLineColor(GetRingColor(d,r));
102 ret->SetFillStyle(3001);
103 ret->SetMarkerStyle(20);
104 ret->SetLineStyle(1);
106 ret->SetDirectory(0);
107 ret->SetMinimum(GetHistMin(what));
108 ret->SetMaximum(GetHistMax(what));
110 //____________________________________________________________________
112 AliFMDCalibDrawer::Make2D(EWhat what, UShort_t d, Char_t r) const
114 UShort_t q = (r == 'I' || r == 'i') ? 0 : 1;
115 UShort_t nY = q == 0 ? 20 : 40;
116 UShort_t nX = q == 0 ? 512 : 256;
117 TString n(Form("%s_FMD%d%c", GetHistName(what), d, r));
118 TString t(Form("%s for FMD%d%c", GetHistTitle(what), d, r));
119 TH2D* ret = new TH2D(n, t, nX, 0, nX, nY, 0, nY);
120 ret->SetXTitle("Strip #");
121 ret->SetYTitle("Sector #");
122 ret->SetZTitle(GetHistTitle(what));
123 ret->GetXaxis()->SetNdivisions(1600 + (q == 0 ? 4 : 2),false);
124 ret->GetYaxis()->SetNdivisions(nY, false);
125 SetAttributes(ret, what, d, r);
130 //____________________________________________________________________
132 AliFMDCalibDrawer::Make1D(EWhat what, UShort_t d, Char_t r, UShort_t s) const
134 UShort_t q = (r == 'I' || r == 'i') ? 0 : 1;
135 UShort_t nStr = (r == 'I' || r == 'i') ? 512 : 256;
136 TString n(Form("%s_FMD%d%c_%02d", GetHistName(what), d, r, s));
137 TString t(Form("%s for FMD%d%c[%2d]", GetHistTitle(what), d, r, s));
138 TH1D* ret = new TH1D(n, t, nStr, 0, nStr);
139 ret->SetXTitle("Strip #");
140 ret->SetYTitle(GetHistTitle(what));
141 ret->GetXaxis()->SetNdivisions(1600 + (q == 0 ? 4 : 2),false);
142 SetAttributes(ret, what, d, r);
146 //____________________________________________________________________
148 AliFMDCalibDrawer::GetNumber(EWhat what, UShort_t d, Char_t r, UShort_t s,
149 UShort_t t, Double_t& val, Double_t& err) const
151 AliFMDParameters* pars = AliFMDParameters::Instance();
155 val = pars->GetPedestal(d, r, s, t);
156 err = pars->GetPedestalWidth(d, r, s, t);
158 case kNoise: val = pars->GetPedestalWidth(d, r, s, t); break;
159 case kGain: val = pars->GetPulseGain(d, r, s, t); break;
160 case kDead: val = pars->IsDead(d, r, s, t) ? 0 : 1; break;
161 case kRate: val = pars->GetSampleRate(d, r, s, t); break;
163 val = pars->GetMaxStrip(d,r,s,t);
164 err = pars->GetMinStrip(d,r,s,t);
166 case kZeroSuppression: val = pars->GetZeroSuppression(d,r,s,t); break;
168 AliError(Form("Unknown quantity: %d - nothing returned", what));
173 //____________________________________________________________________
175 AliFMDCalibDrawer::FillRing(EWhat what, UShort_t d, Char_t r) const
177 if (what == kRate || what == kRange) {
178 TH1D* ret = new TH1D(Form("%s_FMD%d%c", GetHistName(what), d, r),
179 Form("%s for FMD%d%c", GetHistTitle(what), d, r),
181 UShort_t nSec = (r == 'I' || r == 'i') ? 20 : 40;
182 ret->GetXaxis()->SetBinLabel(1, Form("Top [%02d-%02d]", 0, nSec/2-1));
183 ret->GetXaxis()->SetBinLabel(2, Form("Bottom [%02d-%02d]",nSec/2-1,nSec-1));
184 ret->SetYTitle(GetHistTitle(what));
185 SetAttributes(ret, what, d, r);
187 ret->SetBarWidth(0.8);
188 ret->SetBarOffset(0.1);
191 ret->SetMarkerSize(0);
192 for (UShort_t s = 0; s < ret->GetNbinsX(); s++) {
195 GetNumber(what, d, r, s*(nSec/2), 0, val, err);
196 if (what == kRange) {
198 err = (val - err) / 2;
201 ret->SetBinContent(s+1, val);
202 ret->SetBinError(s+1, err);
206 if (what == kZeroSuppression) {
207 UShort_t nY = (r == 'I' || r == 'i') ? 20 : 40;
208 UShort_t nX = ((r == 'I' || r == 'i') ? 512 : 256) / 128;
209 TH2D* ret = new TH2D(Form("%s_FMD%d%c", GetHistName(what), d, r),
210 Form("%s for FMD%d%c", GetHistTitle(what), d, r),
211 nX, 0, nX, nY, 0, nY);
212 ret->SetXTitle("Channel #");
213 ret->SetYTitle("Sector #");
214 ret->SetZTitle(GetHistTitle(what));
215 ret->GetXaxis()->SetNdivisions(nX, false);
216 ret->GetYaxis()->SetNdivisions(nY, false);
217 SetAttributes(ret, what, d, r);
218 for (UShort_t s = 0; s < ret->GetNbinsY(); s++) {
219 for (UShort_t t = 0; t < ret->GetNbinsX(); t++) {
222 GetNumber(what, d, r, s, t*128, val, err);
223 ret->SetBinContent(t+1, s+1, val);
224 ret->SetBinError(t+1, s+1, err);
230 TH2D* ret = Make2D(what, d, r);
231 for (UShort_t s = 0; s < ret->GetNbinsY(); s++) {
232 for (UShort_t t = 0; t < ret->GetNbinsX(); t++) {
235 GetNumber(what, d, r, s, t, val, err);
236 ret->SetBinContent(t+1, s+1, val);
237 ret->SetBinError(t+1, s+1, err);
242 //____________________________________________________________________
244 AliFMDCalibDrawer::FillSector(EWhat what,UShort_t d, Char_t r, UShort_t s) const
246 if (what == kZeroSuppression) {
247 UShort_t nX = ((r == 'I' || r == 'i') ? 512 : 256) / 128;
248 TH1D* ret = new TH1D(Form("%s_FMD%d%c[%02d]",
249 GetHistName(what), d, r, s),
250 Form("%s for FMD%d%c[%02d]",
251 GetHistTitle(what), d, r, s),
253 ret->SetXTitle("Channel #");
254 ret->SetYTitle(GetHistTitle(what));
255 SetAttributes(ret, what, d, r);
256 ret->GetXaxis()->SetNdivisions(nX, false);
257 for (UShort_t t = 0; t < ret->GetNbinsX(); t++) {
260 GetNumber(what, d, r, s, t*128, val, err);
261 ret->SetBinContent(t+1, s+1, val);
262 if (err >= 0) ret->SetBinError(t+1, s+1, err);
267 TH1D* ret = Make1D(what, d, r, s);
268 for (UShort_t t = 0; t < ret->GetNbinsX(); t++) {
271 GetNumber(what, d, r, s, t, val, err);
272 ret->SetBinContent(t+1, s+1, val);
273 if (err >= 0) ret->SetBinError(t+1, s+1, err);
278 //____________________________________________________________________
280 AliFMDCalibDrawer::DrawOne(EWhat what, Short_t d, Char_t r,
281 Short_t s, Short_t /*t*/) const
283 Info("DrawOne", "Will draw %s for D=%d, R=%c, S=%d",
284 GetHistTitle(what), d, (r == '\0' ? '-' : r), s);
285 TVirtualPad* tp = gPad;
286 if (!tp) tp = TCanvas::MakeDefCanvas();
287 if (d <= 0 || d > 3) {
288 // All detectors - need to split current pad
290 for (UShort_t dd = 1; dd <= 3; dd++) {
293 DrawOne(what, dd, '\0', -1, -1);
296 else if ((r != 'I' && r != 'i') && (r != 'O' && r != 'o')) {
297 // All rings in a detector. Split current pad in two
298 tp->SetName(Form("FMD%d", d));
300 for (UShort_t q = 0; q < 2; q++) {
302 Char_t rr = q == 0 ? 'I' : 'O';
304 DrawOne(what, d, rr, -1, -1);
307 else if (what == kRate || what == kRange || s < 0 || s > 39) {
308 // A single ring - and special case for sample rate and strip range
309 tp->SetName(Form("FMD%d%c", d, r));
312 tp->SetRightMargin(0.10);
313 if (d == 1 && (r == 'O' || r == 'o')) return;
314 TH1* h = FillRing(what, d, r);
316 case kRate: h->Draw("bar"); break;
317 case kRange: h->Draw("e3"); break;
318 default: h->Draw("colz"); break;
322 // Finally, we're down to a single sector. In this case, we just do
323 // a single 1D histogram
324 TH1* h = FillSector(what, d, r, s);
334 //____________________________________________________________________