void chipSummary(const char *dirName, int chipId, int TrimVcal) { if (f && f->IsOpen()) f->Close(); // if (f1 && f1->IsOpen()) f1->Close(); if (g && g->IsOpen()) g->Close(); gROOT->SetStyle("Plain"); gStyle->SetPalette(1); gStyle->SetOptStat(0); gStyle->SetTitle(0); gStyle->SetStatFont(132); gStyle->SetTextFont(132); gStyle->SetLabelFont(132, "X"); gStyle->SetLabelFont(132, "Y"); gStyle->SetLabelSize(0.08, "X"); gStyle->SetLabelSize(0.08, "Y"); gStyle->SetNdivisions(6, "X"); gStyle->SetNdivisions(8, "Y"); gStyle->SetTitleFont(132); gROOT->ForceStyle(); tl = new TLatex; tl->SetNDC(kTRUE); tl->SetTextSize(0.09); ts = new TLatex; ts->SetNDC(kTRUE); ts->SetTextSize(0.08); line = new TLine; line->SetLineColor(kRed); line->SetLineStyle(kSolid); box = new TBox; box->SetFillColor(kRed); box->SetFillStyle(3002); f = new TFile(Form("%s/%s", dirName, fileName), "READ"); // if (strcmp(fileName, adFileName) == 0) f1 = f; // else f1 = new TFile(Form("%s/%s", dirName, adFileName), "READ"); sprintf(trimFileName,"Trim%i.root",TrimVcal); if (strcmp(fileName, trimFileName) == 0) g = f; else g = new TFile(Form("%s/%s", dirName, trimFileName), "READ"); //sprintf(fname, "%s/../../criteria.dat", dirName); sprintf(fname, "criteria.dat", dirName); if ( !readCriteria(fname) ) { printf("\nchipSummary> ----> COULD NOT READ GRADING CRITERIA !!!"); printf("chipSummary> ----> Aborting execution of chipgSummaryPage.C ... \n\n", fileName, dirName); break; } TH1D *h1; TH2D *h2; c1 = new TCanvas("c1", "", 800, 800); c1->Clear(); c1->Divide(4,4, 0.01, 0.04); // shrinkPad(0.1, 0.1, 0.1, 0.3); TString noslash(dirName); noslash.ReplaceAll("/", " "); noslash.ReplaceAll(".. ", ""); // %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% // Row 1 // %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% // -- Dead pixels TH2D *hpm = new TH2D("hpm", "", 80, 0., 80., 52, 0., 52.); int nDeadPixel(0); int nMaskDefect(0); int nNoisyPixel(0); int nRootFileProblems(0); c1->cd(1); h2 = (TH2D*)f->Get(Form("PixelMap_C%i", chipId)); if (h2) { for (int icol = 0; icol < 52; ++icol) { for (int irow = 0; irow < 80; ++irow) { hpm->SetBinContent(irow+1, icol+1, h2->GetBinContent(icol+1, irow+1)); if (h2->GetBinContent(icol+1, irow+1) == 0) { ++nDeadPixel; } if (h2->GetBinContent(icol+1, irow+1) > 10) { ++nNoisyPixel; } if (h2->GetBinContent(icol+1, irow+1) < 0) { ++nMaskDefect; } } } h2->SetTitle(""); h2->Draw("colz"); tl->DrawLatex(0.1, 0.92, "Pixel Map"); } else { ++nRootFileProblems; } // -- sCurve width and noise level TH1D *hw = new TH1D("hw", "", 100, 0., 600.); TH1D *hd = new TH1D("hd", "", 100, 0., 600.); // Noise in unbonded pixel (not displayed) TH2D *ht = new TH2D("ht", "", 52, 0., 52., 80, 0., 80.); TH1D *htmp; float mN(0.), sN(0.), nN(0.), nN_entries(0.); int over(0), under(0); double htmax(255.), htmin(0.); float thr, sig; int a,b; FILE *inputFile; char string[200]; sprintf(string, "%s/SCurve_C0%i.dat", dirName, TrimVcal); inputFile = fopen(string, "r"); double minThrDiff(-5.); double maxThrDiff(5.); h2 = (TH2D*)f->Get(Form("vcals_xtalk_C%i", chipId)); if (!inputFile) { printf("chipSummary> !!!!!!!!! ----> SCurve: Could not open file %s to read fit results\n", string); } else { for (int i = 0; i < 2; i++) fgets(string, 200, inputFile); for (int icol = 0; icol < 52; ++icol) { for (int irow = 0; irow < 80; ++irow) { fscanf(inputFile, "%e %e %s %2i %2i", &thr, &sig, string, &a, &b); //comment // printf("chipSummary> sig %e thr %e\n", sig, thr); hw->Fill(sig); thr = thr / 65; ht->SetBinContent(icol+1, irow+1, thr); if ( h2 ) { if( h2->GetBinContent(icol+1, irow+1) > minThrDiff) { hd->Fill(sig); } } } } c1->cd(2); hw->Draw(); tl->DrawLatex(0.1, 0.92, "S-Curve widths: Noise (e^{-})"); /* c1->cd(15); hd->SetLineColor(kRed); hd->Draw(); tl->DrawLatex(0.1, 0.92, "S-Curve widths of dead bumps"); if ( hd->GetEntries() > 0 ) { ts->DrawLatex(0.55, 0.82, Form("entries: %4.0f", hd->GetEntries())); ts->DrawLatex(0.55, 0.74, Form("#mu:%4.2f", hd->GetMean())); ts->DrawLatex(0.55, 0.66, Form("#sigma: %4.2f", hd->GetRMS())); } */ mN = hw->GetMean(); sN = hw->GetRMS(); nN = hw->Integral(hw->GetXaxis()->GetFirst(), hw->GetXaxis()->GetLast()); nN_entries = hw->GetEntries(); under = hw->GetBinContent(0); over = hw->GetBinContent(hw->GetNbinsX()+1); ts->DrawLatex(0.65, 0.82, Form("N: %4.0f", nN)); ts->DrawLatex(0.65, 0.74, Form("#mu: %4.1f", mN)); ts->DrawLatex(0.65, 0.66, Form("#sigma: %4.1f", sN)); if ( under ) ts->DrawLatex(0.15, 0.55, Form("<= %i", under)); if ( over ) ts->DrawLatex(0.75, 0.55, Form("%i =>", over )); c1->cd(3); if ( ht->GetMaximum() < htmax ) { htmax = ht->GetMaximum(); } if ( ht->GetMinimum() > htmin ) { htmin = ht->GetMinimum(); } ht->GetZaxis()->SetRangeUser(htmin,htmax); ht->Draw("colz"); tl->DrawLatex(0.1, 0.92, "Vcal Threshold from SCurve"); } // -- Noise level map c1->cd(4); gPad->SetLogy(1); gStyle->SetOptStat(1); float mV(0.), sV(0.), nV(0.), nV_entries(0.); over = 0.; under = 0.; if (!g->IsZombie()) { h1 = (TH1D*)g->Get(Form("VcalThresholdMap_C%iDistribution;7", chipId)); if (h1) { h1->SetTitle(""); h1->SetAxisRange(0., 100.); h1->Draw(); mV = h1->GetMean(); sV = h1->GetRMS(); nV = h1->Integral(h1->GetXaxis()->GetFirst(), h1->GetXaxis()->GetLast()); nV_entries = h1->GetEntries(); under = h1->GetBinContent(0); over = h1->GetBinContent(h1->GetNbinsX()+1); } else { ++nRootFileProblems; mV = 0.; sV = 0.; } ts->DrawLatex(0.15, 0.82, Form("N: %4.0f", nV)); ts->DrawLatex(0.15, 0.74, Form("#mu: %4.1f", mV)); ts->DrawLatex(0.15, 0.66, Form("#sigma: %4.1f", sV)); if ( under ) ts->DrawLatex(0.15, 0.55, Form("<= %i", under)); if ( over ) ts->DrawLatex(0.75, 0.55, Form("%i =>", over )); } tl->DrawLatex(0.1, 0.92, "Vcal Threshold Trimmed"); // %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% // Row 2 // %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% // -- Bump Map TH2D *hbm = new TH2D("hbm", "", 80, 0., 80., 52, 0., 52.); int nDeadBumps(0); c1->cd(5); gStyle->SetOptStat(0); h2 = (TH2D*)f->Get(Form("vcals_xtalk_C%i", chipId)); if (h2) { for (int icol = 0; icol < 52; ++icol) { for (int irow = 0; irow < 80; ++irow) { hbm->SetBinContent(irow+1, icol+1, h2->GetBinContent(icol+1, irow+1)); if ( h2->GetBinContent(icol+1, irow+1) >= minThrDiff ) { cout << Form("chipSummary> dead %3d %3d: %7.5f", icol, irow, h2->GetBinContent(icol, irow)) << endl; ++nDeadBumps; } } } h2->SetTitle(""); h2->GetZaxis()->SetRangeUser(minThrDiff, maxThrDiff); h2->Draw("colz"); tl->DrawLatex(0.1, 0.92, "Bump Bonding Problems"); } else { ++nRootFileProblems; } // -- Bump Map c1->cd(6); gPad->SetLogy(1); //gStyle->SetOptStat(1); h1 = (TH1D*)f->Get(Form("vcals_xtalk_C%iDistribution", chipId)); if (h1) { h1->SetTitle(""); h1->SetAxisRange(-50., 50.); //DOES NOT WORK!!!??? h1->Draw(); tl->DrawLatex(0.1, 0.92, "Bump Bonding"); } else { ++nRootFileProblems; } // -- Trim bits int trimbitbins(3); int nDeadTrimbits(0); c1->cd(7); gPad->SetLogy(1); h1 = (TH1D*)f->Get(Form("TrimBit14_C%i", chipId)); if (h1) { h1->SetTitle(""); h1->SetAxisRange(0., 60.); h1->SetMinimum(0.5); h1->Draw(""); tl->DrawLatex(0.1, 0.92, "Trim Bit Test"); for (int i = 1; i <= trimbitbins; ++i) nDeadTrimbits += h1->GetBinContent(i); } else { ++nRootFileProblems; } h1 = (TH1D*)f->Get(Form("TrimBit13_C%i", chipId)); if (h1) { h1->SetLineColor(kRed); h1->Draw("same"); for (int i = 1; i <= trimbitbins; ++i) nDeadTrimbits += h1->GetBinContent(i); } else { ++nRootFileProblems; } h1 = (TH1D*)f->Get(Form("TrimBit11_C%i", chipId)); if (h1) { h1->SetLineColor(kBlue); h1->Draw("same"); for (int i = 1; i <= trimbitbins; ++i) nDeadTrimbits += h1->GetBinContent(i); } else { ++nRootFileProblems; } h1 = (TH1D*)f->Get(Form("TrimBit7_C%i", chipId)); if (h1) { h1->SetLineColor(kGreen); h1->Draw("same"); for (int i = 1; i <= trimbitbins; ++i) nDeadTrimbits += h1->GetBinContent(i); } else { ++nRootFileProblems; } // -- For numerics and titels see at end // %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% // Row 3 // %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% // -- Address decoding TH2D *ham = new TH2D("ham", "", 80, 0., 80., 52, 0., 52.); int nAddressProblems(0); c1->cd(9); gStyle->SetOptStat(0); h2 = (TH2D*)f->Get(Form("AddressDecoding_C%i", chipId)); if (h2) { for (int icol = 0; icol < 52; ++icol) { for (int irow = 0; irow < 80; ++irow) { ham->SetBinContent(irow+1, icol+1, h2->GetBinContent(icol+1, irow+1)); if (h2 && h2->GetBinContent(icol+1, irow+1) < 1) { cout << Form("chipSummary> address problem %3d %3d: %7.5f", icol, irow, h2->GetBinContent(icol, irow)) << endl; ++nAddressProblems; } } } h2->SetTitle(""); h2->Draw("colz"); tl->DrawLatex(0.1, 0.92, "Address decoding"); } else { ++nRootFileProblems; } // -- Address levels c1->cd(10); gPad->SetLogy(1); h1 = (TH1D*)f->Get(Form("AddressLevels_C%i", chipId)); if (h1) { h1->SetTitle(""); h1->SetAxisRange(-1200., 1000.); h1->Draw(); tl->DrawLatex(0.1, 0.92, "Address Levels"); } else { ++nRootFileProblems; } // -- PHCalibration (Gain & Pedesdtal) TH1D *hg = new TH1D("hg", "", 250, -1., 5.5); TH2D *hgm = new TH2D("hgm", "", 52, 0., 52., 80, 0., 80.); TH1D *hp1 = new TH1D("hp", "", 100,0,5); TH1D *hp = new TH1D("hp", "", 900, -600., 600.); hp->StatOverflows(kTRUE); TH1D *rp = new TH1D("rp", "", 900, -600., 600.); rp->StatOverflows(kFALSE); TH1D *htmp; float mG(0.), sG(0.), nG(0.), nG_entries(0.); float mP(0.), sP(0.), nP(0.), nP_entries(0.); over = 0.; under = 0.; float par0, par1, par2, par3, par4, par5; // Parameters of Vcal vs. Pulse Height Fit float ped, gain; int a,b; int mPbin(0), xlow(-100), xup(255), extra(0); // for restricted RMS double integral(0.); FILE *inputFile; char string[200]; sprintf(string, "%s/phCalibrationFitTan_C0%i.dat", dirName, TrimVcal); inputFile = fopen(string, "r"); if (!inputFile) { printf("chipSummary> !!!!!!!!! ----> phCal: Could not open file %s to read fit results\n", string); } else { for (int i = 0; i < 2; i++) fgets(string, 200, inputFile); for (int icol = 0; icol < 52; ++icol) { for (int irow = 0; irow < 80; ++irow) { // fscanf(inputFile, "%e %e %e %e %e %e %s %2i %2i", &par0, &par1, &par2, &par3, &par4, &par5, string, &a, &b); fscanf(inputFile, "%e %e %e %e %s %2i %2i", &par0, &par1, &par2, &par3, string, &a, &b); if (par2 != 0.) // dead pixels have par2 == 0. { // ped = -par3/par2; gain = 1./par2; // ped = par3; ped=par3+par2*(tanh(-par1)); hp->Fill(ped); hg->Fill(gain); hp1->Fill(par1); // cout <<gain<<" " << ped<<endl; hgm->SetBinContent(icol + 1, irow + 1, gain); } } } mG = hg->GetMean(); sG = hg->GetRMS(); nG = hg->Integral(hg->GetXaxis()->GetFirst(), hg->GetXaxis()->GetLast()); nG_entries = hg->GetEntries(); under = hg->GetBinContent(0); over = hg->GetBinContent(hp->GetNbinsX()+1); c1->cd(11); // hg->Draw(); tl->DrawLatex(0.1, 0.92, "PH Calibration: Gain (ADC/DAC)"); if ( hg->GetMean() > 1.75 ) { ts->DrawLatex(0.15, 0.82, Form("N: %4.0f", nG)); ts->DrawLatex(0.15, 0.74, Form("#mu: %4.2f", mG)); ts->DrawLatex(0.15, 0.66, Form("#sigma: %4.2f", sG)); if ( under ) ts->DrawLatex(0.15, 0.82, Form("<= %i", under)); if ( over ) ts->DrawLatex(0.75, 0.82, Form("%i =>", over )); } else { ts->DrawLatex(0.65, 0.82, Form("N: %4.0f", nG)); ts->DrawLatex(0.65, 0.74, Form("#mu: %4.2f", mG)); ts->DrawLatex(0.65, 0.66, Form("#sigma: %4.2f", sG)); if ( under ) ts->DrawLatex(0.15, 0.82, Form("<= %i", under)); if ( over ) ts->DrawLatex(0.75, 0.82, Form("%i =>", over )); } mP = hp->GetMean(); sP = hp->GetRMS(); nP = hp->Integral(hp->GetXaxis()->GetFirst(), hp->GetXaxis()->GetLast()); nP_entries = hp->GetEntries(); if ( nP > 0 ) { // -- restricted RMS integral = 0.; mPbin = -1000; xlow = -1000; xup = 1000; over = 0.; under = 0.; mPbin = hp->GetXaxis()->FindBin(mP); for (int i = 0; integral < pedDistr; i++) { xlow = mPbin-i; xup = mPbin+i; integral = hp->Integral(xlow, xup)/nP; } extra = xup - xlow; } else { xlow = -300; xup = 600; extra = 0; over = 0.; under = 0.; } hp->GetXaxis()->SetRange(xlow - extra, xup + extra); nP = hp->Integral(hp->GetXaxis()->GetFirst(), hp->GetXaxis()->GetLast()); under = hp->GetBinContent(0); over = hp->GetBinContent(hp->GetNbinsX()+1); c1->cd(15); // hgm->Draw("colz"); hp1->Draw(); tl->DrawLatex(0.1, 0.92, "PH Calibration: P1"); c1->cd(12); hp->DrawCopy(); rp->Add(hp); rp->GetXaxis()->SetRange(xlow, xup); mP = rp->GetMean(); sP = rp->GetRMS(); // box->DrawBox( rp->GetBinCenter(xlow), 0, rp->GetBinCenter(xup), 1.05*rp->GetMaximum()); rp->SetFillColor(kRed); rp->SetFillStyle(3002); rp->Draw("same"); line->DrawLine(rp->GetBinCenter(xlow), 0, rp->GetBinCenter(xlow), 0.6*rp->GetMaximum()); line->DrawLine(rp->GetBinCenter(xup), 0, rp->GetBinCenter(xup), 0.6*rp->GetMaximum()); tl->DrawLatex(0.1, 0.92, "PH Calibration: Pedestal (DAC)"); if ( hp->GetMean() < 126. ) { ts->DrawLatex(0.65, 0.82, Form("N: %4.0f", nP)); ts->SetTextColor(kRed); ts->DrawLatex(0.65, 0.74, Form("#mu: %4.1f", mP)); ts->DrawLatex(0.65, 0.66, Form("#sigma: %4.1f", sP)); ts->SetTextColor(kBlack); if ( under ) ts->DrawLatex(0.15, 0.55, Form("<= %i", under)); if ( over ) ts->DrawLatex(0.75, 0.55, Form("%i =>", over )); } else { ts->DrawLatex(0.16, 0.82, Form("N: %4.0f", nP)); ts->SetTextColor(kRed); ts->DrawLatex(0.16, 0.74, Form("#mu: %4.1f", mP)); ts->DrawLatex(0.16, 0.66, Form("#sigma: %4.1f", sP)); ts->SetTextColor(kBlack); if ( under ) ts->DrawLatex(0.15, 0.55, Form("<= %i", under)); if ( over ) ts->DrawLatex(0.75, 0.55, Form("%i =>", over )); } } // %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% // Numerics and Titles // %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% // -- Compute the final verdict on this chip //?? FIXME (below is pure randomness) char finalVerdict(0); if (nDeadTrimbits > 40) finalVerdict += 1; if (nDeadPixel > 40) finalVerdict += 10; if (nNoisyPixel > 40) finalVerdict += 10; if (nAddressProblems > 40) finalVerdict += 10; if (nDeadBumps > 40) finalVerdict += 100; // -- Defects c1->cd(8); tl->SetTextSize(0.10); tl->SetTextFont(22); double y = 0.92; y -= 0.11; tl->DrawLatex(0.1, y, "Summary"); tl->DrawLatex(0.7, y, Form("%d", finalVerdict)); tl->SetTextFont(132); tl->SetTextSize(0.09); y -= 0.11; tl->DrawLatex(0.1, y, Form("Dead Pixels: ")); tl->DrawLatex(0.7, y, Form("%4d", nDeadPixel)); y -= 0.10; tl->DrawLatex(0.1, y, Form("Noisy Pixels: ")); tl->DrawLatex(0.7, y, Form("%4d", nNoisyPixel)); y -= 0.10; tl->DrawLatex(0.1, y, "Mask defects: "); tl->DrawLatex(0.7, y, Form("%4d", nMaskDefect)); y -= 0.10; tl->DrawLatex(0.1, y, "Dead Bumps: "); tl->DrawLatex(0.7, y, Form("%4d", nDeadBumps)); y -= 0.10; tl->DrawLatex(0.1, y, "Dead Trimbits: "); tl->DrawLatex(0.7, y, Form("%4d", nDeadTrimbits)); y -= 0.10; tl->DrawLatex(0.1, y, "Address Probl: "); tl->DrawLatex(0.7, y, Form("%4d", nAddressProblems)); // %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% // Row 4 // %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TH2D *htm = new TH2D("htm", "", 80, 0., 80., 52, 0., 52.); c1->cd(13); gStyle->SetOptStat(0); h2 = (TH2D*)g->Get(Form("TrimMap_C%i;8", chipId)); if (h2) { for (int icol = 0; icol < 52; ++icol) { for (int irow = 0; irow < 80; ++irow) { htm->SetBinContent(irow+1, icol+1, h2->GetBinContent(icol+1, irow+1)); } } h2->SetTitle(""); h2->GetZaxis()->SetRangeUser(0., 16.); h2->Draw("colz"); } else { ++nRootFileProblems; } tl->DrawLatex(0.1, 0.92, "Trim Bits"); FILE *tCalFile; sprintf(string, "%s/../T-calibration/TemperatureCalibration_C%i.dat", dirName, chipId); tCalFile = fopen(string, "r"); char tCalDir[200]; sprintf(tCalDir, "%s/../T-calibration", dirName); if ( tCalFile ) { analyse(tCalDir, chipId); } else { c1->cd(14); TGraph *graph = (TGraph*)f->Get(Form("TempCalibration_C%i", chipId)); if ( graph ) { graph->Draw("A*"); } else { ++nRootFileProblems; } tl->DrawLatex(0.1, 0.92, "Temperature calibration"); } // -- Operation Parameters c1->cd(16); y = 0.92; tl->SetTextSize(0.10); tl->SetTextFont(22); y -= 0.11; tl->DrawLatex(0.1, y, Form("Op. Parameters")); tl->SetTextFont(132); tl->SetTextSize(0.09); y -= 0.11; int vana(-1.); vana = dac_findParameter(dirName, "Vana", chipId); tl->DrawLatex(0.1, y, "VANA: "); if (vana >= 0.) tl->DrawLatex(0.6, y, Form("%3i DAC", vana)); else tl->DrawLatex(0.7, y, "N/A"); y -= 0.10; int caldel(-1.); caldel = dac_findParameter(dirName, "CalDel", chipId); tl->DrawLatex(0.1, y, "CALDEL: "); if (vana >= 0.) tl->DrawLatex(0.6, y, Form("%3d DAC", caldel)); else tl->DrawLatex(0.7, y, "N/A"); y -= 0.10; int vthrcomp(-1.); vthrcomp = dac_findParameter(dirName, "VthrComp", chipId); tl->DrawLatex(0.1, y, "VTHR: "); if (vana >= 0.) tl->DrawLatex(0.6, y, Form("%3d DAC", vthrcomp)); else tl->DrawLatex(0.7, y, "N/A"); y -= 0.10; int vtrim(-1.); vtrim = dac_findParameter(dirName, "Vtrim", chipId); tl->DrawLatex(0.1, y, "VTRIM: "); if (vana >= 0.) tl->DrawLatex(0.6, y, Form("%3d DAC", vtrim)); else tl->DrawLatex(0.7, y, "N/A"); y -= 0.10; int ibias(-1.); ibias = dac_findParameter(dirName, "Ibias_DAC", chipId); tl->DrawLatex(0.1, y, "IBIAS_DAC: "); if (vana >= 0.) tl->DrawLatex(0.6, y, Form("%3d DAC", ibias)); else tl->DrawLatex(0.7, y, "N/A"); y -= 0.10; int voffset(-1.); voffset = dac_findParameter(dirName, "VoffsetOp", chipId); tl->DrawLatex(0.1, y, "VOFFSETOP: "); if (vana >= 0.) tl->DrawLatex(0.6, y, Form("%3d DAC", voffset)); else tl->DrawLatex(0.7, y, "N/A"); // -- Page title c1->cd(0); tl->SetTextSize(0.025); tl->SetTextFont(22); tl->DrawLatex(0.02, 0.97, Form("%s (Trim%i)", noslash.Data(),TrimVcal)); TDatime date; tl->SetTextSize(0.02); tl->DrawLatex(0.75, 0.97, Form("%s", date.AsString())); c1->SaveAs(Form("%s/chipSummary_C%i_%i.ps", dirName, chipId,TrimVcal)); c1->SaveAs(Form("%s/C%i_%i.gif", dirName, chipId,TrimVcal)); // -- Dump into logfile ofstream OUT(Form("%s/summary_C%i_%i.txt", dirName, chipId,TrimVcal)); OUT << "nDeadPixel: " << nDeadPixel << endl; OUT << "nNoisyPixel: " << nNoisyPixel << endl; OUT << "nDeadTrimbits: " << nDeadTrimbits << endl; OUT << "nDeadBumps: " << nDeadBumps << endl; OUT << "nMaskDefect: " << nMaskDefect << endl; OUT << "nAddressProblems: " << nAddressProblems << endl; OUT << "nRootFileProblems: " << nRootFileProblems << endl; OUT << "SCurve " << nN_entries << " " << mN << " " << sN << endl; OUT << "Threshold " << nV_entries << " " << mV << " " << sV << endl; OUT << "Gain " << nG_entries << " " << mG << " " << sG << endl; OUT << "Pedestal " << nP_entries << " " << mP << " " << sP << endl; OUT.close(); }
void chipSummary(const char *dirName, int chipId) { directory = TString(dirName); if (f && f->IsOpen()) f->Close(); if (f1 && f1->IsOpen()) f1->Close(); if (g && g->IsOpen()) g->Close(); gROOT->SetStyle("Plain"); gStyle->SetPalette(1); gStyle->SetOptStat(0); gStyle->SetTitle(0); gStyle->SetStatFont(132); gStyle->SetTextFont(132); gStyle->SetLabelFont(132, "X"); gStyle->SetLabelFont(132, "Y"); gStyle->SetLabelSize(0.08, "X"); gStyle->SetLabelSize(0.08, "Y"); gStyle->SetNdivisions(6, "X"); gStyle->SetNdivisions(8, "Y"); gStyle->SetTitleFont(132); gROOT->ForceStyle(); tl = new TLatex; tl->SetNDC(kTRUE); tl->SetTextSize(0.09); ts = new TLatex; ts->SetNDC(kTRUE); ts->SetTextSize(0.08); line = new TLine; line->SetLineColor(kRed); line->SetLineStyle(kSolid); box = new TBox; box->SetFillColor(kRed); box->SetFillStyle(3002); f = new TFile(Form("%s/%s", dirName, fileName), "READ"); if (strcmp(fileName, adFileName) == 0) f1 = f; else f1 = new TFile(Form("%s/%s", dirName, adFileName), "READ"); if (strcmp(fileName, trimFileName) == 0) g = f; else g = new TFile(Form("%s/%s", dirName, trimFileName), "READ"); sprintf(fname, "%s/../../macros/criteria-full.dat", dirName); if ( !readCriteria(fname) ) { printf("\nchipSummary> ----> COULD NOT READ GRADING CRITERIA !!!"); printf("chipSummary> ----> Aborting execution of chipgSummaryPage.C ... \n\n", fileName, dirName); break; } TH1D *h1; TH2D *h2; c1 = new TCanvas("c1", "", 800, 800); c1->Clear(); c1->Divide(4,4, 0.01, 0.04); // shrinkPad(0.1, 0.1, 0.1, 0.3); FILE *sCurveFile, *phLinearFile, *phTanhFile; TString noslash(dirName); noslash.ReplaceAll("/", " "); noslash.ReplaceAll(".. ", ""); char string[200]; int pixel_alive; int nDeadPixel(0); int nIneffPixel(0); int nMaskDefect(0); int nNoisy1Pixel(0); int nDeadBumps(0); int nDeadTrimbits(0); int nAddressProblems(0); int nNoisy2Pixel(0); int nThrDefect(0); int nGainDefect(0); int nPedDefect(0); int nPar1Defect(0); int nRootFileProblems(0); int nDoubleFunctCounts(0); int nDoublePerfCounts(0); int nDoubleCounts(0); int nDoubleTrims(0); int nDoublePHs(0); int vcal = dac_findParameter(dirName, "Vcal", chipId); // %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% // Row 1 // %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% // -- Dead pixels c1->cd(1); TH2D *hpm; hpm = (TH2D*)f->Get(Form("PixelMap_C%i", chipId)); if (hpm) { for (int icol = 0; icol < 52; ++icol) { for (int irow = 0; irow < 80; ++irow) { hpm->SetTitle(""); hpm->Draw("colz"); tl->DrawLatex(0.1, 0.92, "Pixel Map"); } } } else { ++nRootFileProblems; } // -- sCurve width and noise level TH1D *hw = new TH1D("hw", "", 100, 0., 600.); TH1D *hd = new TH1D("hd", "", 100, 0., 600.); // Noise in unbonded pixel (not displayed) TH2D *ht = new TH2D("ht", "", 52, 0., 52., 80, 0., 80.); TH1D *htmp; float mN(0.), sN(0.), nN(0.), nN_entries(0.); int over(0), under(0); double htmax(255.), htmin(0.); float thr, sig; int a,b; double minThrDiff(-5.); double maxThrDiff(5.); h2 = (TH2D*)f->Get(Form("vcals_xtalk_C%i", chipId)); sprintf(string, "%s/SCurve_C%i.dat", dirName, chipId); sCurveFile = fopen(string, "r"); if (!sCurveFile) { printf("chipSummary> !!!!!!!!! ----> SCurve: Could not open file %s to read fit results\n", string); } else { for (int i = 0; i < 2; i++) fgets(string, 200, sCurveFile); for (int icol = 0; icol < 52; ++icol) { for (int irow = 0; irow < 80; ++irow) { fscanf(sCurveFile, "%e %e %s %2i %2i", &thr, &sig, string, &a, &b); // printf("chipSummary> sig %e thr %e\n", sig, thr); hw->Fill(sig); thr = thr / 65.; ht->SetBinContent(icol+1, irow+1, thr); if ( h2 ) { if( h2->GetBinContent(icol+1, irow+1) >= minThrDiff) { hd->Fill(sig); } } } } fclose(sCurveFile); c1->cd(2); hw->Draw(); tl->DrawLatex(0.1, 0.92, "S-Curve widths: Noise (e^{-})"); /* c1->cd(15); hd->SetLineColor(kRed); hd->Draw(); tl->DrawLatex(0.1, 0.92, "S-Curve widths of dead bumps"); if ( hd->GetEntries() > 0 ) { ts->DrawLatex(0.55, 0.82, Form("entries: %4.0f", hd->GetEntries())); ts->DrawLatex(0.55, 0.74, Form("#mu:%4.2f", hd->GetMean())); ts->DrawLatex(0.55, 0.66, Form("#sigma: %4.2f", hd->GetRMS())); } */ mN = hw->GetMean(); sN = hw->GetRMS(); nN = hw->Integral(hw->GetXaxis()->GetFirst(), hw->GetXaxis()->GetLast()); nN_entries = hw->GetEntries(); under = hw->GetBinContent(0); over = hw->GetBinContent(hw->GetNbinsX()+1); ts->DrawLatex(0.65, 0.82, Form("N: %4.0f", nN)); ts->DrawLatex(0.65, 0.74, Form("#mu: %4.1f", mN)); ts->DrawLatex(0.65, 0.66, Form("#sigma: %4.1f", sN)); if ( under ) ts->DrawLatex(0.15, 0.55, Form("<= %i", under)); if ( over ) ts->DrawLatex(0.75, 0.55, Form("%i =>", over )); c1->cd(3); if ( ht->GetMaximum() < htmax ) { htmax = ht->GetMaximum(); } if ( ht->GetMinimum() > htmin ) { htmin = ht->GetMinimum(); } ht->GetZaxis()->SetRangeUser(htmin,htmax); ht->Draw("colz"); tl->DrawLatex(0.1, 0.92, "Vcal Threshold Untrimmed"); } // -- Noise level map c1->cd(4); gPad->SetLogy(1); gStyle->SetOptStat(1); float mV(0.), sV(0.), nV(0.), nV_entries(0.); over = 0.; under = 0.; if (!g->IsZombie()) { h1 = (TH1D*)g->Get(Form("VcalThresholdMap_C%iDistribution;7", chipId)); if (h1) { h1->SetTitle(""); h1->SetAxisRange(0., 100.); h1->Draw(); mV = h1->GetMean(); sV = h1->GetRMS(); nV = h1->Integral(h1->GetXaxis()->GetFirst(), h1->GetXaxis()->GetLast()); nV_entries = h1->GetEntries(); under = h1->GetBinContent(0); over = h1->GetBinContent(h1->GetNbinsX()+1); } else { ++nRootFileProblems; mV = 0.; sV = 0.; } ts->DrawLatex(0.15, 0.82, Form("N: %4.0f", nV)); ts->DrawLatex(0.15, 0.74, Form("#mu: %4.1f", mV)); ts->DrawLatex(0.15, 0.66, Form("#sigma: %4.1f", sV)); if ( under ) ts->DrawLatex(0.15, 0.55, Form("<= %i", under)); if ( over ) ts->DrawLatex(0.75, 0.55, Form("%i =>", over )); } tl->DrawLatex(0.1, 0.92, "Vcal Threshold Trimmed"); // %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% // Row 2 // %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% // -- Bump Map TH2D *hbm; c1->cd(5); gStyle->SetOptStat(0); hbm = (TH2D*)f->Get(Form("vcals_xtalk_C%i", chipId)); if (hbm) { h2->SetTitle(""); h2->GetZaxis()->SetRangeUser(minThrDiff, maxThrDiff); h2->Draw("colz"); tl->DrawLatex(0.1, 0.92, "Bump Bonding Problems"); } else { ++nRootFileProblems; } // -- Bump Map c1->cd(6); gPad->SetLogy(1); //gStyle->SetOptStat(1); h1 = (TH1D*)f->Get(Form("vcals_xtalk_C%iDistribution", chipId)); if (h1) { h1->SetTitle(""); h1->GetXaxis()->SetRangeUser(-50., 50.); h1->GetYaxis()->SetRangeUser(0.5, 5.0*h1->GetMaximum()); h1->DrawCopy(); tl->DrawLatex(0.1, 0.92, "Bump Bonding"); } else { ++nRootFileProblems; } // -- Trim bits int trimbitbins(3); c1->cd(7); gPad->SetLogy(1); h1 = (TH1D*)f->Get(Form("TrimBit14_C%i", chipId)); if (h1) { h1->SetTitle(""); h1->SetAxisRange(0., 60.); h1->SetMinimum(0.5); h1->Draw(""); tl->DrawLatex(0.1, 0.92, "Trim Bit Test"); } else { ++nRootFileProblems; } h1 = (TH1D*)f->Get(Form("TrimBit13_C%i", chipId)); if (h1) { h1->SetLineColor(kRed); h1->Draw("same"); } else { ++nRootFileProblems; } h1 = (TH1D*)f->Get(Form("TrimBit11_C%i", chipId)); if (h1) { h1->SetLineColor(kBlue); h1->Draw("same"); } else { ++nRootFileProblems; } h1 = (TH1D*)f->Get(Form("TrimBit7_C%i", chipId)); if (h1) { h1->SetLineColor(kGreen); h1->Draw("same"); } else { ++nRootFileProblems; } // -- For numerics and titels see at end // %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% // Row 3 // %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% // -- Address decoding // -------------------- TH2D *ham; ham = (TH2D*)f1->Get(Form("AddressDecoding_C%i", chipId)); c1->cd(9); gStyle->SetOptStat(0); if (ham) { ham->SetTitle(""); ham->Draw("colz"); tl->DrawLatex(0.1, 0.92, "Address decoding"); } else { ++nRootFileProblems; } // -- Address levels c1->cd(10); gPad->SetLogy(1); h1 = (TH1D*)f1->Get(Form("AddressLevels_C%i", chipId)); if (h1) { h1->SetTitle(""); h1->SetAxisRange(-1500., 1500.); h1->Draw(); tl->DrawLatex(0.1, 0.92, "Address Levels"); } else { ++nRootFileProblems; } // -- PHCalibration: Linear Fit (Gain & Pedesdtal) // ----------------------------------------------- TH1D *hg = new TH1D("hg", "", 300, -2.0, 5.5); TH2D *hgm = new TH2D("hgm", "", 52, 0., 52., 80, 0., 80.); TH1D *hp = new TH1D("hp", "", 900, -300., 600.); hp->StatOverflows(kTRUE); TH1D *rp = new TH1D("rp", "", 900, -300., 600.); rp->StatOverflows(kFALSE); TH1D *htmp; float par0, par1, par2, par3, par4, par5; // Parameters of Vcal vs. Pulse Height Fit float mG(0.), sG(0.), nG(0.), nG_entries(0.); float mP(0.), sP(0.), nP(0.), nP_entries(0.); over = 0.; under = 0.; float ped, gain; int a,b; int mPbin(0), xlow(-100), xup(255), extra(0); // for restricted RMS float pedMin(0), pedMax(1000); double integral(0.); sprintf(string, "%s/phCalibrationFit_C%i.dat", dirName, chipId); phLinearFile = fopen(string, "r"); if (!phLinearFile) { printf("chipSummary> !!!!!!!!! ----> phCal: Could not open file %s to read fit results\n", string); } else { for (int i = 0; i < 2; i++) fgets(string, 200, phLinearFile); for (int icol = 0; icol < 52; ++icol) { for (int irow = 0; irow < 80; ++irow) { fscanf(phLinearFile, "%e %e %e %e %e %e %s %2i %2i", &par0, &par1, &par2, &par3, &par4, &par5, string, &a, &b); if (par2 != 0.) { // dead pixels have par2 == 0. gain = 1./par2; ped = par3; hp->Fill(ped); hg->Fill(gain); hgm->SetBinContent(icol + 1, irow + 1, gain); } } } fclose(phLinearFile); // -- Gain c1->cd(11); mG = hg->GetMean(); sG = hg->GetRMS(); nG = hg->Integral(hg->GetXaxis()->GetFirst(), hg->GetXaxis()->GetLast()); nG_entries = hg->GetEntries(); under = hg->GetBinContent(0); over = hg->GetBinContent(hp->GetNbinsX()+1); gPad->SetLogy(1); hg->GetYaxis()->SetRangeUser(0.5, 5.0*hg->GetMaximum()); hg->Draw(); tl->DrawLatex(0.1, 0.92, "PH Calibration: Gain (ADC/DAC)"); if ( hg->GetMean() > 1.75 ) { ts->DrawLatex(0.15, 0.80, Form("N: %4.0f", nG)); ts->DrawLatex(0.15, 0.72, Form("#mu: %4.2f", mG)); ts->DrawLatex(0.15, 0.64, Form("#sigma: %4.2f", sG)); } else { ts->DrawLatex(0.65, 0.80, Form("N: %4.0f", nG)); ts->DrawLatex(0.65, 0.72, Form("#mu: %4.2f", mG)); ts->DrawLatex(0.65, 0.64, Form("#sigma: %4.2f", sG)); } if ( under ) ts->DrawLatex(0.15, 0.55, Form("<= %i", under)); if ( over ) ts->DrawLatex(0.75, 0.55, Form("%i =>", over )); c1->cd(15); hgm->Draw("colz"); tl->DrawLatex(0.1, 0.92, "PH Calibration: Gain (ADC/DAC)"); // -- Pedestal c1->cd(12); mP = hp->GetMean(); sP = hp->GetRMS(); nP = hp->Integral(hp->GetXaxis()->GetFirst(), hp->GetXaxis()->GetLast()); nP_entries = hp->GetEntries(); if ( nP > 0 ) { // -- restricted RMS integral = 0.; mPbin = -1000; xlow = -1000; xup = 1000; over = 0.; under = 0.; mPbin = hp->GetXaxis()->FindBin(mP); for (int i = 0; integral < pedDistr; i++) { xlow = mPbin-i; xup = mPbin+i; integral = hp->Integral(xlow, xup)/nP; } extra = xup - xlow; } else { xlow = -300; xup = 600; extra = 0; over = 0.; under = 0.; } under = hp->Integral(0, xlow - extra); over = hp->Integral(xup + 1.5*extra, hp->GetNbinsX()); hp->GetXaxis()->SetRange(xlow - extra, xup + 1.5*extra); nP = hp->Integral(hp->GetXaxis()->GetFirst(), hp->GetXaxis()->GetLast()); pedMin = hp->GetBinCenter(xlow-extra); pedMax = hp->GetBinCenter(xup+1.5*extra); cout<< " ========> Ped min " << pedMin << " Ped max " << pedMax << ", over: " << over << " under: " << under << endl; hp->DrawCopy(); rp->Add(hp); rp->GetXaxis()->SetRange(xlow, xup); mP = rp->GetMean(); sP = rp->GetRMS(); // box->DrawBox( rp->GetBinCenter(xlow), 0, rp->GetBinCenter(xup), 1.05*rp->GetMaximum()); rp->SetFillColor(kRed); rp->SetFillStyle(3002); rp->Draw("same"); line->DrawLine(rp->GetBinCenter(xlow), 0, rp->GetBinCenter(xlow), 0.6*rp->GetMaximum()); line->DrawLine(rp->GetBinCenter(xup), 0, rp->GetBinCenter(xup), 0.6*rp->GetMaximum()); tl->DrawLatex(0.1, 0.92, "PH Calibration: Pedestal (DAC)"); if ( hp->GetMean() < 126. ) { ts->DrawLatex(0.65, 0.82, Form("N: %4.0f", nP)); ts->SetTextColor(kRed); ts->DrawLatex(0.65, 0.74, Form("#mu: %4.1f", mP)); ts->DrawLatex(0.65, 0.66, Form("#sigma: %4.1f", sP)); } else { ts->DrawLatex(0.16, 0.82, Form("N: %4.0f", nP)); ts->SetTextColor(kRed); ts->DrawLatex(0.16, 0.74, Form("#mu: %4.1f", mP)); ts->DrawLatex(0.16, 0.66, Form("#sigma: %4.1f", sP)); } if ( under ) ts->DrawLatex(0.15, 0.55, Form("<= %i", under)); if ( over ) ts->DrawLatex(0.75, 0.55, Form("%i =>", over )); ts->SetTextColor(kBlack); } // -- PHCalibration: Tanh Fit (Parameter1) // ---------------------------------------- c1->cd(11); over = 0.; under = 0.; float nPar1(0.), nPar1_entries(0.), mPar1(0.), sPar1(0.); TH1D *hPar1 = new TH1D("par1", "", 350, -1., 6.); sprintf(string, "%s/phCalibrationFitTan_C%i.dat", dirName, chipId); phTanhFile = fopen(string, "r"); if (!phTanhFile) { printf("chipSummary> !!!!!!!!! ----> phCal: Could not open file %s to read fit results\n", string); } else { for (int i = 0; i < 2; i++) fgets(string, 200, phTanhFile); for (int icol = 0; icol < 52; ++icol) { for (int irow = 0; irow < 80; ++irow) { fscanf(phTanhFile, "%e %e %e %e %s %2i %2i", &par0, &par1, &par2, &par3, string, &a, &b); hPar1->Fill(par1); } } fclose(phTanhFile); // -- Parameter 1 hPar1->SetLineColor(kBlue); hPar1->Draw("same"); mPar1 = hPar1->GetMean(); sPar1 = hPar1->GetRMS(); nPar1 = hPar1->Integral(hPar1->GetXaxis()->GetFirst(), hPar1->GetXaxis()->GetLast()); nPar1_entries = hPar1->GetEntries(); under = hPar1->GetBinContent(0); over = hPar1->GetBinContent(hPar1->GetNbinsX()+1); ts->SetTextColor(kBlue); if ( hg->GetMean() > 1.75 ) { ts->DrawLatex(0.15, 0.40, "Par1:"); ts->DrawLatex(0.15, 0.30, Form("N: %4.0f", nPar1)); ts->DrawLatex(0.15, 0.22, Form("#mu: %4.2f", mPar1)); ts->DrawLatex(0.15, 0.14, Form("#sigma: %4.2f", sPar1)); } else { ts->DrawLatex(0.65, 0.40, "Par1:"); ts->DrawLatex(0.65, 0.30, Form("N: %4.0f", nPar1)); ts->DrawLatex(0.65, 0.22, Form("#mu: %4.2f", mPar1)); ts->DrawLatex(0.65, 0.14, Form("#sigma: %4.2f", sPar1)); } if ( under ) ts->DrawLatex(0.15, 0.48, Form("<= %i", under)); if ( over ) ts->DrawLatex(0.75, 0.48, Form("%i =>", over )); ts->SetTextColor(kBlack); } // %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% // Row 4 // %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% // Trim Bits // ---------- TH2D *htm = new TH2D("htm", "", 80, 0., 80., 52, 0., 52.); c1->cd(13); gStyle->SetOptStat(0); h2 = (TH2D*)f->Get(Form("TrimMap_C%i;8", chipId)); if (h2) { for (int icol = 0; icol < 52; ++icol) { for (int irow = 0; irow < 80; ++irow) { htm->SetBinContent(irow+1, icol+1, h2->GetBinContent(icol+1, irow+1)); } } h2->SetTitle(""); h2->GetZaxis()->SetRangeUser(0., 16.); h2->Draw("colz"); } else { ++nRootFileProblems; } tl->DrawLatex(0.1, 0.92, "Trim Bits"); FILE *tCalFile; sprintf(string, "%s/../T-calibration/TemperatureCalibration_C%i.dat", dirName, chipId); tCalFile = fopen(string, "r"); char tCalDir[200]; sprintf(tCalDir, "%s/../T-calibration", dirName); if ( tCalFile ) { analyse(tCalDir, chipId); } else { c1->cd(14); TGraph *graph = (TGraph*)f->Get(Form("TempCalibration_C%i", chipId)); if ( graph ) { graph->Draw("A*"); } else { ++nRootFileProblems; } tl->DrawLatex(0.1, 0.92, "Temperature calibration"); } // %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% // -- Count defects and double counting // %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% float fl0, fl1, fl2, fl3, fl4, fl5, tmp; int i1, i2; char hname[200]; // TH2D *get = 0, *hget = 0, *htb0 = 0, *htb1 = 0, *htb2 = 0, *htb3 = 0, *htb4 = 0; // for (int i = 1; i < 6; ++i) { // get = (TH2D*)f->Get(Form("CalThresholdMap_C%i;%i", chipId, i)); // if (get) { // hget = (TH2D*)get->Clone(); // hget->SetName(Form("TB0C%i", i)); // if (i == 1) htb0 = hget; // if (i == 2) htb1 = hget; // if (i == 3) htb2 = hget; // if (i == 4) htb3 = hget; // if (i == 5) htb4 = hget; // } // } TH2D *htb[5]; for (int i = 0; i < 5; ++i) { htb[i] = (TH2D*)f->Get(Form("CalThresholdMap_C%i;%i", chipId, i+1)); htb[i]->SetName(Form("tbC%i%i", chipId, i+1)); } TH2D *htthr = 0; htthr = (TH2D*)f->Get(Form("VcalThresholdMap_C%d;8", chipId)); sprintf(string, "%s/SCurve_C%i.dat", dirName, chipId); sCurveFile = fopen(string, "r"); sprintf(string, "%s/phCalibrationFit_C%i.dat", dirName, chipId); phLinearFile = fopen(string, "r"); sprintf(string, "%s/phCalibrationFitTan_C%i.dat", dirName, chipId); phTanhFile = fopen(string, "r"); if (sCurveFile) for (int i = 0; i < 2; i++) fgets(string, 200, sCurveFile); if (phLinearFile) for (int i = 0; i < 2; i++) fgets(string, 200, phLinearFile); if (phTanhFile) for (int i = 0; i < 2; i++) fgets(string, 200, phTanhFile); int px_counted = 0; int px_funct_counted = 0; int px_perf_counted = 0; int trim_counted = 0; int ph_counted = 0; float tb_diff = 0; float tb, tb0; for (int icol = 0; icol < 52; ++icol) { for (int irow = 0; irow < 80; ++irow) { pixel_alive = 1; px_funct_counted = 0; px_perf_counted = 0; px_counted = 0; trim_counted = 0; ph_counted = 0; // -- Pixel alive if (hpm && hpm->GetBinContent(icol+1, irow+1) == 0) { pixel_alive = 0; ++nDeadPixel; cout << Form("chipSummary> dead pixel %3d %3d: %7.5f", icol, irow, hpm->GetBinContent(icol+1, irow+1)) << endl; } if (hpm && hpm->GetBinContent(icol+1,irow+1) > 10) { ++nNoisy1Pixel; px_counted = 1; px_funct_counted = 1;} if (hpm && hpm->GetBinContent(icol+1, irow+1) < 0) { ++nMaskDefect; px_counted = 1; px_funct_counted = 1;} if (hpm && (hpm->GetBinContent(icol+1, irow+1) < 10) && (hpm->GetBinContent(icol+1, irow+1) > 0) ) { ++nIneffPixel; px_counted = 1; px_funct_counted = 1;} // -- Bump bonding if ( pixel_alive && hbm ) { if ( hbm->GetBinContent(icol+1, irow+1) >= minThrDiff ) { if ( px_counted ) nDoubleCounts++; px_counted = 1; if ( px_funct_counted ) nDoubleFunctCounts++; px_funct_counted = 1; ++nDeadBumps; cout << Form("chipSummary> bump defect %3d %3d: %7.5f", icol, irow, hbm->GetBinContent(icol+1, irow+1)) << endl; } } // -- Trim bits 1 - 4 if ( pixel_alive && htb[0] ) { tb0 = htb[0]->GetBinContent(icol+1, irow+1); for ( int i = 1; i <= 4; i++ ) { if ( htb[i] ) { tb = htb[i]->GetBinContent(icol+1, irow+1); tb_diff = TMath::Abs(tb-tb0); if (tb_diff <= 2) { if ( px_counted ) nDoubleCounts++; px_counted = 1; if ( px_funct_counted ) nDoubleFunctCounts++; px_funct_counted = 1; if ( trim_counted ) nDoubleTrims++; trim_counted = 1; ++nDeadTrimbits; cout << Form("chipSummary> trim bit defect %3d %3d: %4.2f", icol, irow, tb_diff) << endl; } } } } // -- Address decoding if (pixel_alive && ham) { if( ham->GetBinContent(icol+1, irow+1) < 1 ) { if ( px_counted ) nDoubleCounts++; px_counted = 1; if ( px_funct_counted ) nDoubleFunctCounts++; px_funct_counted = 1; ++nAddressProblems; cout << Form("chipSummary> address problem %3d %3d: %7.5f", icol, irow, ham->GetBinContent(icol+1, irow+1)) << endl; } } // -- Threshold if (pixel_alive && htthr) { if ( TMath::Abs(htthr->GetBinContent(icol+1, irow+1) - vcalTrim) > tthrTol ) { if ( px_counted ) nDoubleCounts++; px_counted = 1; if ( px_perf_counted ) nDoublePerfCounts++; px_perf_counted = 1; ++nThrDefect; cout << Form("chipSummary> threshold problem %3d %3d: %7.5f", icol, irow, htthr->GetBinContent(icol+1, irow+1)) << endl; } } // -- Noise fscanf(sCurveFile, "%e %e %s %2i %2i", &fl1, &fl2, string, &i1, &i2); if (pixel_alive) { if ( (fl2 < noiseMin) || (fl2 > noiseMax) ) { if ( px_counted ) nDoubleCounts++; px_counted = 1; if ( px_perf_counted ) nDoublePerfCounts++; px_perf_counted = 1; ++nNoisy2Pixel; cout << Form("chipSummary> noise defect %3d %3d: %7.5f (%2i %2i)", icol, irow, fl2, i1, i2) << endl; } } // -- Gain & Pedestal fscanf(phLinearFile, "%e %e %e %e %e %e %s %2i %2i", &fl0, &fl1, &fl2, &fl3, &fl4, &fl5, string, &i1, &i2); if (pixel_alive) { if (fl2 != 0) gain = 1./fl2; ped = fl3; if ( (gain < gainMin) || (gain > gainMax) ) { if ( px_counted ) nDoubleCounts++; px_counted = 1; if ( px_perf_counted ) nDoublePerfCounts++; px_perf_counted = 1; if ( ph_counted ) nDoublePHs++; ph_counted = 1; ++nGainDefect; cout << Form("chipSummary> gain defect %3d %3d: %7.5f (%2i %2i)", icol, irow, gain, i1, i2) << endl; } if ( (ped < pedMin) || (ped > pedMax) ) { if ( px_counted ) nDoubleCounts++; px_counted = 1; if ( px_perf_counted ) nDoublePerfCounts++; px_perf_counted = 1; if ( ph_counted ) nDoublePHs++; ph_counted = 1; ++nPedDefect; cout << Form("chipSummary> pedestal defect %3d %3d: %7.5f (%2i %2i)", icol, irow, ped, i1, i2) << endl; } } // -- Par1 fscanf(phTanhFile, "%e %e %e %e %s %2i %2i", &fl0, &fl1, &fl2, &fl3, string, &i1, &i2); if (pixel_alive && phTanhFile) { if ( (fl1 < par1Min) || (fl1 > par1Max) ) { if ( px_counted ) nDoubleCounts++; px_counted = 1; if ( px_perf_counted ) nDoublePerfCounts++; px_perf_counted = 1; if ( ph_counted ) nDoublePHs++; ph_counted = 1; ++nPar1Defect; cout << Form("chipSummary> par1 defect %3d %3d: %7.5f (%2i %2i)", icol, irow, par1, i1, i2) << endl; } } } } fclose(sCurveFile); fclose(phLinearFile); fclose(phTanhFile); // %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% // Numerics and Titles // %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% // -- Compute the final verdict on this chip //?? FIXME (below is pure randomness) float finalVerdict(0); if (nDeadTrimbits > 0) finalVerdict += 1; if (nDeadPixel > 0) finalVerdict += 10; if (nNoisy1Pixel > 0) finalVerdict += 10; if (nAddressProblems > 0) finalVerdict += 10; if (nDeadBumps > 0) finalVerdict += 100; if (nNoisy2Pixel > 0) finalVerdict += 1000; if (nThrDefect > 0) finalVerdict += 10000; if (nGainDefect > 0) finalVerdict += 100000; if (nPedDefect > 0) finalVerdict += 100000; if (nPar1Defect > 0) finalVerdict += 100000; // -- Defects c1->cd(8); tl->SetTextSize(0.10); tl->SetTextFont(22); double y = 0.98; y -= 0.11; tl->DrawLatex(0.1, y, "Summary"); // tl->DrawLatex(0.6, y, Form("%06d", finalVerdict)); tl->SetTextFont(132); tl->SetTextSize(0.09); y -= 0.11; tl->DrawLatex(0.1, y, Form("Dead Pixels: ")); tl->DrawLatex(0.7, y, Form("%4d", nDeadPixel)); // y -= 0.10; // tl->DrawLatex(0.1, y, Form("Noisy Pixels 1: ")); // tl->DrawLatex(0.7, y, Form("%4d", nNoisy1Pixel)); y -= 0.10; tl->DrawLatex(0.1, y, "Mask defects: "); tl->DrawLatex(0.7, y, Form("%4d", nMaskDefect)); y -= 0.10; tl->DrawLatex(0.1, y, "Dead Bumps: "); tl->DrawLatex(0.7, y, Form("%4d", nDeadBumps)); y -= 0.10; tl->DrawLatex(0.1, y, "Dead Trimbits: "); tl->DrawLatex(0.7, y, Form("%4d", nDeadTrimbits)); y -= 0.10; tl->DrawLatex(0.1, y, "Address Probl: "); tl->DrawLatex(0.7, y, Form("%4d", nAddressProblems)); y -= 0.10; tl->DrawLatex(0.1, y, Form("Noisy Pixels 2: ")); tl->DrawLatex(0.7, y, Form("%4d", nNoisy2Pixel)); y -= 0.10; tl->DrawLatex(0.1, y, Form("Trim Probl.: ")); tl->DrawLatex(0.7, y, Form("%4d", nThrDefect)); y -= 0.10; tl->DrawLatex(0.1, y, Form("PH defects: ")); tl->DrawLatex(0.5, y, Form("%4d/", nGainDefect)); tl->SetTextColor(kRed); tl->DrawLatex(0.6, y, Form("%4d/",nPedDefect)); tl->SetTextColor(kBlack); tl->SetTextColor(kBlue); tl->DrawLatex(0.7, y, Form("%4d",nPar1Defect)); tl->SetTextColor(kBlack); // y -= 0.10; // tl->DrawLatex(0.1, y, Form("Par1 defect: ")); // tl->DrawLatex(0.7, y, Form("%4d", nPar1Defect)); // -- Operation Parameters c1->cd(16); y = 0.92; tl->SetTextSize(0.10); tl->SetTextFont(22); y -= 0.11; tl->DrawLatex(0.1, y, Form("Op. Parameters")); tl->SetTextFont(132); tl->SetTextSize(0.09); y -= 0.11; int vana(-1.); vana = dac_findParameter(dirName, "Vana", chipId); tl->DrawLatex(0.1, y, "VANA: "); if (vana >= 0.) tl->DrawLatex(0.6, y, Form("%3i DAC", vana)); else tl->DrawLatex(0.7, y, "N/A"); y -= 0.10; int caldel(-1.); caldel = dac_findParameter(dirName, "CalDel", chipId); tl->DrawLatex(0.1, y, "CALDEL: "); if (vana >= 0.) tl->DrawLatex(0.6, y, Form("%3d DAC", caldel)); else tl->DrawLatex(0.7, y, "N/A"); y -= 0.10; int vthrcomp(-1.); vthrcomp = dac_findParameter(dirName, "VthrComp", chipId); tl->DrawLatex(0.1, y, "VTHR: "); if (vana >= 0.) tl->DrawLatex(0.6, y, Form("%3d DAC", vthrcomp)); else tl->DrawLatex(0.7, y, "N/A"); y -= 0.10; int vtrim(-1.); vtrim = dac_findParameter(dirName, "Vtrim", chipId); tl->DrawLatex(0.1, y, "VTRIM: "); if (vana >= 0.) tl->DrawLatex(0.6, y, Form("%3d DAC", vtrim)); else tl->DrawLatex(0.7, y, "N/A"); y -= 0.10; int ibias(-1.); ibias = dac_findParameter(dirName, "Ibias_DAC", chipId); tl->DrawLatex(0.1, y, "IBIAS_DAC: "); if (vana >= 0.) tl->DrawLatex(0.6, y, Form("%3d DAC", ibias)); else tl->DrawLatex(0.7, y, "N/A"); y -= 0.10; int voffset(-1.); voffset = dac_findParameter(dirName, "VoffsetOp", chipId); tl->DrawLatex(0.1, y, "VOFFSETOP: "); if (vana >= 0.) tl->DrawLatex(0.6, y, Form("%3d DAC", voffset)); else tl->DrawLatex(0.7, y, "N/A"); // -- Page title c1->cd(0); tl->SetTextSize(0.04); tl->SetTextFont(22); tl->DrawLatex(0.02, 0.97, Form("%s (C%i)", noslash.Data(), chipId)); TDatime date; tl->SetTextSize(0.02); tl->DrawLatex(0.75, 0.97, Form("%s", date.AsString())); c1->SaveAs(Form("%s/chipSummary_C%i.ps", dirName, chipId)); c1->SaveAs(Form("%s/C%i.png", dirName, chipId)); // -- Dump into logfile ofstream OUT(Form("%s/summary_C%i.txt", dirName, chipId)); OUT << "nDeadPixel: " << nDeadPixel << endl; OUT << "nNoisy1Pixel: " << nNoisy1Pixel << endl; OUT << "nDeadTrimbits: " << nDeadTrimbits << endl; OUT << "nDeadBumps: " << nDeadBumps << endl; OUT << "nMaskDefect: " << nMaskDefect << endl; OUT << "nAddressProblems: " << nAddressProblems << endl; OUT << "nNoisy2Pixel: " << nNoisy2Pixel << endl; OUT << "nTThrDefect: " << nThrDefect << endl; OUT << "nGainDefect: " << nGainDefect << endl; OUT << "nPedDefect: " << nPedDefect << endl; OUT << "nParDefect: " << nPar1Defect << endl; OUT << "nDoubleCounts: " << nDoubleCounts << endl; OUT << "nDoubleFunctCounts: " << nDoubleFunctCounts << endl; OUT << "nDoublePerfCounts: " << nDoublePerfCounts << endl; OUT << "nDoubleTrims: " << nDoubleTrims << endl; OUT << "nDoublePHs: " << nDoublePHs << endl; OUT << "nRootFileProblems: " << nRootFileProblems << endl; OUT << "SCurve " << nN_entries << " " << mN << " " << sN << endl; OUT << "Threshold " << nV_entries << " " << mV << " " << sV << endl; OUT << "Gain " << nG_entries << " " << mG << " " << sG << endl; OUT << "Pedestal " << nP_entries << " " << mP << " " << sP << endl; OUT << "Parameter1 " << nPar1_entries << " " << mPar1 << " " << sPar1 << endl; OUT.close(); }
void Template::makeResidualsControlPlot(const string& tag, unsigned int rebin) /*****************************************************************/ { if(numberOfDimensions()>0 && m_template->GetNbinsX()%rebin!=0) return; if(numberOfDimensions()>1 && m_template->GetNbinsY()%rebin!=0) return; if(numberOfDimensions()>2 && m_template->GetNbinsZ()%rebin!=0) return; stringstream cpName, cpRawName, resMapName, resDistName, relErrDistName; cpName << m_name << "_cp"; cpRawName << m_name << "_rawcp"; resMapName << m_name << "_resmap_" << tag << "_rebin" << rebin; resDistName << m_name << "_resdist_" << tag << "_rebin" << rebin; relErrDistName << m_name << "_relerrdist_" << tag << "_rebin" << rebin; TH1* cpTmp = NULL; TH1* cpRawTmp = NULL; if(rebin==1) { cpTmp = dynamic_cast<TH1*>(m_template->Clone(cpName.str().c_str())); cpRawTmp = dynamic_cast<TH1*>(m_rawTemplate->Clone(cpRawName.str().c_str())); } else { if(numberOfDimensions()==2) { cpTmp = dynamic_cast<TH2F*>(m_template)->Rebin2D(rebin, rebin, cpName.str().c_str()); cpRawTmp = dynamic_cast<TH2F*>(m_rawTemplate)->Rebin2D(rebin, rebin, cpName.str().c_str()); } else if(numberOfDimensions()==3) { cpTmp = dynamic_cast<TH3F*>(m_template)->Rebin3D(rebin, rebin, rebin, cpName.str().c_str()); cpRawTmp = dynamic_cast<TH3F*>(m_rawTemplate)->Rebin3D(rebin, rebin, rebin, cpName.str().c_str()); } } TH1* resMap = dynamic_cast<TH1*>(cpTmp->Clone(resMapName.str().c_str())); TH1D* resDist = new TH1D(resDistName.str().c_str(), resDistName.str().c_str(), 30, -3, 3); resDist->StatOverflows(); TH1D* relErrDist = new TH1D(relErrDistName.str().c_str(), relErrDistName.str().c_str(), 200, -1, 1); relErrDist->StatOverflows(); unsigned int nbins1 = cpTmp->GetNbinsX(); unsigned int nbins2 = cpTmp->GetNbinsY(); unsigned int nbins3 = cpTmp->GetNbinsZ(); for(unsigned int b1=1;b1<=nbins1;b1++) { for(unsigned int b2=1;b2<=nbins2;b2++) { for(unsigned int b3=1;b3<=nbins3;b3++) { double tmpValue = cpTmp->GetBinContent(b1,b2,b3); double tmpRawValue = cpRawTmp->GetBinContent(b1,b2,b3); double tmpRawError = cpRawTmp->GetBinError(b1,b2,b3); if(tmpValue>0. && tmpRawValue>0. && tmpRawError>0.) { double res = (tmpRawValue-tmpValue)/tmpRawError; double relErr = (tmpRawValue-tmpValue)/tmpRawValue; if(numberOfDimensions()==2) { resMap->SetBinContent(b1,b2,b3, res); resMap->SetBinError(b1,b2,b3, 0.); } resDist->Fill(res); relErrDist->Fill(relErr); } } } } stringstream plotMapName, plotDistName, plotErrDistName; plotMapName << "control_" << getName() << "_resMap" << "_" << tag << "_rebin" << rebin; plotDistName << "control_" << getName() << "_resDist" << "_" << tag << "_rebin" << rebin; plotErrDistName << "control_" << getName() << "_relErrDist" << "_" << tag << "_rebin" << rebin; if(numberOfDimensions()==2) { TCanvas* c = new TCanvas(plotMapName.str().c_str(),plotMapName.str().c_str(), 700,700); resMap->SetContour(99); resMap->SetAxisRange(-3., 3., "z"); resMap->Draw("color z"); resMap->SetXTitle(getVariable(0).c_str()); resMap->SetYTitle(getVariable(1).c_str()); addControlPlot(c); } TCanvas* c2 = new TCanvas(plotDistName.str().c_str(),plotDistName.str().c_str(), 700,700); resDist->SetLineColor(kBlack); resDist->SetLineWidth(2); resDist->SetMarkerColor(kBlack); resDist->SetMarkerStyle(20); resDist->SetXTitle("(raw-template)/error_{raw}"); resDist->Draw(); addControlPlot(c2); TCanvas* c3 = new TCanvas(plotErrDistName.str().c_str(),plotErrDistName.str().c_str(), 700,700); relErrDist->SetLineColor(kBlack); relErrDist->SetLineWidth(2); relErrDist->SetMarkerColor(kBlack); relErrDist->SetMarkerStyle(20); relErrDist->SetXTitle("(raw-template)/raw"); relErrDist->Draw(); addControlPlot(c3); if(cpTmp) delete cpTmp; if(cpRawTmp) delete cpRawTmp; }