200 B2DEBUG(20,
"end run");
207 m_monObj->setVariable(
"comment",
"No ADC histograms of CDC in file");
208 B2INFO(
"Histogram named m_hADC is not found.");
212 TF1* fitFunc[300] = {};
213 for (
int i = 0; i < 300; ++i) {
214 fitFunc[i] =
new TF1(Form(
"f%d", i),
"[0]+[6]*x+[1]*(exp([2]*(x-[3]))/(1+exp(-([4]-x)/[5])))",
215 4921 - 100, 4921 + 100);
216 fitFunc[i]->SetParLimits(6, 0, 0.1);
217 fitFunc[i]->SetParLimits(4, 4850., 5000.0);
218 fitFunc[i]->SetParLimits(5, 0, 50.0);
221 int neve =
m_hTDC->GetEntries();
222 if (neve == 0)neve = 1;
224 B2DEBUG(20,
"adc related");
227 TH1F* hADCMean =
new TH1F(
"hADCMean",
"ADC mean;board;adc mean", 300, 0, 300);
228 TH1F* hADC1000 =
new TH1F(
"ADC1000",
"ADC1000", 300, 0, 300);
229 TH1F* hADC0 =
new TH1F(
"ADC0",
"ADC0", 300, 0, 300);
232 std::vector<float> means = {};
233 std::vector<float> medians = {};
235 for (
int i = 0; i < 300; ++i) {
236 m_hADCs[i] =
m_hADC->ProjectionY(Form(
"hADC%d", i), i + 1, i + 1,
"");
237 m_hADCs[i]->SetTitle(Form(
"hADC%d", i));
238 float n =
static_cast<float>(
m_hADCs[i]->GetEntries());
241 hADC0->SetBinContent(i + 1, -0.1);
243 float n0 =
static_cast<float>(
m_hADCs[i]->GetBinContent(1));
245 B2DEBUG(21,
"bad adc bid " << i <<
" " << n0 <<
" " << n);
248 float bin1 =
m_hADCs[i]->GetBinContent(1);
252 medians.push_back(md);
253 hADCMean->SetBinContent(i + 1, m);
254 hADCMean->SetBinError(i + 1, 0);
255 double overflow =
m_hADCs[i]->GetBinContent(
m_hADCs[i]->GetNbinsX() + 1);
256 hADC1000->SetBinContent(i + 1, overflow / (overflow + n));
257 hADC0->SetBinContent(i + 1, bin1 / (overflow + n));
262 B2DEBUG(20,
"tdc related");
264 TH1F* hTDCEdge =
new TH1F(
"hTDCEdge",
"TDC edge;board;tdc edge [nsec]", 300, 0, 300);
265 TH1F* hTDCSlope =
new TH1F(
"hTDCSlope",
"TDC slope;board;tdc slope [nsec]", 300, 0, 300);
266 std::vector<float> tdcEdges = {};
267 std::vector<float> tdcSlopes = {};
268 for (
int i = 0; i < 300; ++i) {
269 m_hTDCs[i] =
m_hTDC->ProjectionY(Form(
"hTDC%d", i), i + 1, i + 1);
270 m_hTDCs[i]->SetTitle(Form(
"hTDC%d", i));
273 tdcEdges.push_back(0);
274 tdcSlopes.push_back(0);
276 double init_p0 =
m_hTDCs[i]->GetBinContent(700 + 60);
277 fitFunc[i]->SetParameters(init_p0, 100, 0.01, 4700, 4900, 2, 0.01);
278 fitFunc[i]->SetParameter(6, 0.02);
279 fitFunc[i]->SetParLimits(0, init_p0 - 200, init_p0 + 200);
280 int TDCfitstatus = -1;
282 TDCfitstatus =
m_hTDCs[i]->Fit(fitFunc[i],
"qM0",
"", 4850, 5000);
284 TDCfitstatus =
m_hTDCs[i]->Fit(fitFunc[i],
"qM0",
"", 4800, 5000);
286 float p4 = fitFunc[i]->GetParameter(4);
287 float p5 = fitFunc[i]->GetParameter(5);
289 if (TDCfitstatus != -1 && 4850 < p4 && p4 < 5000) {
290 hTDCEdge->SetBinContent(i + 1, p4);
291 hTDCEdge->SetBinError(i + 1, 0);
292 hTDCSlope->SetBinContent(i + 1, p5);
293 hTDCSlope->SetBinError(i + 1, 0);
295 tdcEdges.push_back(p4);
296 tdcSlopes.push_back(p5);
302 B2DEBUG(20,
"hit related");
303 TH1F* hHitPerLayer =
new TH1F(
"hHitPerLayer",
"hit/Layer;layer", 56, 0, 56);
304 TH1F* hHitRatePerWire =
new TH1F(
"hHitRatePerWire",
"hit rate (kHz)/Wire;layer", 56, 0, 56);
306 for (
int i = 0; i < 56; ++i) {
308 double tdcclock = 0.98255764;
309 if (i < 8) tdcwindow = 416;
310 else tdcwindow = 768;
311 m_hHits[i] =
m_hHit->ProjectionY(Form(
"hHit%d", i), i + 1, i + 1);
312 m_hHits[i]->SetTitle(Form(
"hHit%d", i));
316 for (
int j = 0; j < nBins; ++j) {
317 nhitSumL +=
m_hHits[i]->GetBinContent(j + 1);
320 hHitPerLayer->SetBinContent(i + 1, 1.0 * nhitSumL / neve);
321 hHitRatePerWire->SetBinContent(i + 1, (1.0 * nhitSumL / neve) / (1.0 * nBins * tdcwindow * tdcclock * 1e-6));
323 hHitPerLayer->SetBinContent(i + 1, nhitSumL);
324 hHitRatePerWire->SetBinContent(i + 1, (1.0 * nhitSumL) / (1.0 * nBins * tdcwindow * tdcclock * 1e-6));
326 hHitPerLayer->SetBinError(i + 1, 0);
327 hHitRatePerWire->SetBinError(i + 1, 0);
333 B2DEBUG(20,
"bad wire related");
334 hBadChannel =
new TH2F(
"hbadch",
"bad channel map;wire;layer", 400, 0, 400, 56, 0, 56);
335 for (
int i = 0; i < 400; ++i) {
336 for (
int j = 0; j < 56; ++j) {
341 hBadChannelBC =
new TH2F(
"hbadchBC",
"bad channel map per board/channel;board;channel", 300, 0, 300, 48, 0, 48);
342 for (
int i = 0; i < 300; ++i) {
343 for (
int j = 0; j < 48; ++j) {
350 h2p->SetTitle(
"bad wires in xy view");
351 h2p->GetXaxis()->SetTitle(
"X [cm]");
352 h2p->GetYaxis()->SetTitle(
"Y [cm]");
355 const int l = lw.first;
356 const int w = lw.second;
357 B2DEBUG(21,
"l " << l <<
" w " << w);
362 float dPhi =
static_cast<float>(2.0 * M_PI /
m_nSenseWires[l]);
363 float phi = dPhi * (w +
m_offset[l]);
364 float x = r * cos(phi);
365 float y = r * sin(phi);
366 h2p->Fill(x, y, 1.1);
369 B2DEBUG(20,
"writing");
373 hADCMean->SetMinimum(0);
374 hADCMean->SetMaximum(300);
375 hADCMean->DrawCopy();
378 hTDCEdge->SetMinimum(4800);
379 hTDCEdge->SetMaximum(5000);
380 hTDCEdge->DrawCopy();
383 hTDCSlope->SetMinimum(0);
384 hTDCSlope->SetMaximum(50);
385 hTDCSlope->DrawCopy();
394 hADC1000->DrawCopy();
400 hHitPerLayer->DrawCopy();
403 hHitRatePerWire->DrawCopy();
406 for (
int i = 0; i < 56; i++) {
412 m_cADC->Divide(6, 50, 0.0002, 0.0002);
413 m_cTDC->Divide(6, 50, 0.0002, 0.0002);
415 for (
int i = 0; i < 300; i++) {
417 Double_t max =
m_hADCs[i]->GetMaximum();
418 m_hADCs[i]->GetYaxis()->SetRangeUser(0, 3 * max);
423 fitFunc[i]->SetLineColor(kRed);
424 fitFunc[i]->Draw(
"same");
425 max =
m_hTDCs[i]->GetMaximum();
426 TLine* l1 =
new TLine(tdcEdges[i], 0, tdcEdges[i], max * 1.05);
427 l1->SetLineColor(kRed);
428 TLine* l0 =
new TLine(4910, 0, 4910, max * 1.05);
434 h2p->DrawCopy(
"col");
435 float superLayerR[10] = {16.3, 24.3, 35.66, 46.63, 57.55, 68.47,
436 79.39, 90.31, 101.23, 112.05
440 for (
int i = 0; i < 10; ++i) {
441 circs[i] =
new TEllipse(0, 0, superLayerR[i], superLayerR[i]);
442 circs[i]->SetFillStyle(4000);
443 circs[i]->SetLineStyle(kDashed);
444 circs[i]->SetLineColor(0);
445 circs[i]->Draw(
"same");
448 m_monObj->setVariable(
"nEvents", neve);
449 m_monObj->setVariable(
"nHits", nHits / neve);
451 m_monObj->setVariable(
"adcMean", std::accumulate(means.begin(), means.end(), 0.0) / means.size());
452 m_monObj->setVariable(
"adcMeanMedianBoard", std::accumulate(medians.begin(), medians.end(), 0.0) / medians.size());
453 m_monObj->setVariable(
"nDeadADC", nDeadADC);
454 m_monObj->setVariable(
"nBadADC", nBadADC);
455 m_monObj->setVariable(
"tdcEdge", std::accumulate(tdcEdges.begin(), tdcEdges.end(), 0.0) / (tdcEdges.size() - 1 - nDeadTDC));
456 m_monObj->setVariable(
"nDeadTDC", nDeadTDC);
457 m_monObj->setVariable(
"tdcSlope", std::accumulate(tdcSlopes.begin(), tdcSlopes.end(), 0.0) / (tdcSlopes.size() - 1 - nDeadTDC));
465 delete hHitRatePerWire;