From 9bf8924dc828c983c38c565342d642b6d34bbe37 Mon Sep 17 00:00:00 2001 From: redford_s Date: Mon, 25 Feb 2019 10:48:57 +0100 Subject: [PATCH] Removed the pixel masks. no_calib are now accurate, and things aren't hidden. --- CS_analysis.cpp | 1258 +++++++++++++++++++++++------------------------ 1 file changed, 602 insertions(+), 656 deletions(-) diff --git a/CS_analysis.cpp b/CS_analysis.cpp index 52e9c87..5a22647 100644 --- a/CS_analysis.cpp +++ b/CS_analysis.cpp @@ -218,50 +218,6 @@ int main(int argc, char* argv[]) { // calculate pixel mask pixelMaskObject->initialisePixelMask(pixel_mask); - if (module_str == "032") { - pixelMaskObject->maskChip(2,pixel_mask); - pixelMaskObject->maskChip(3,pixel_mask); - pixelMaskObject->maskChip(4,pixel_mask); - } else if (module_str == "002" || module_str == "003") { - pixelMaskObject->maskChip(3, pixel_mask); - } else if (module_str == "006") { - pixelMaskObject->maskChip(6, pixel_mask); - pixelMaskObject->maskSupercolumn(4,1, pixel_mask); - pixelMaskObject->maskSupercolumn(4,2, pixel_mask); - } else if (module_str == "029") { - pixelMaskObject->maskChip(2, pixel_mask); - } else if (module_str == "035") { - pixelMaskObject->maskSupercolumn(2, 2, pixel_mask); - } else if (module_str == "039") { - pixelMaskObject->maskChip(7, pixel_mask); - } else if (module_str == "040") { - pixelMaskObject->maskSupercolumn(4,2, pixel_mask); - } else if (module_str == "064") { - pixelMaskObject->maskSupercolumn(3,4,pixel_mask); - } else if (module_str == "065") { - pixelMaskObject->maskChip(5,pixel_mask); - } else if (module_str == "067") { - pixelMaskObject->maskChip(1,pixel_mask); - pixelMaskObject->maskChip(2,pixel_mask); - pixelMaskObject->maskChip(3,pixel_mask); - pixelMaskObject->maskChip(4,pixel_mask); - } else if (module_str == "086") { - pixelMaskObject->maskChip(8,pixel_mask); - } else if (module_str == "094") { - pixelMaskObject->maskChip(6,pixel_mask); - } else if (module_str == "121") { - pixelMaskObject->maskChip(1,pixel_mask); - } else if (module_str == "124") { - pixelMaskObject->maskChip(1,pixel_mask); - } else if (module_str == "125") { - pixelMaskObject->maskChip(7,pixel_mask); - } else if (module_str == "209") { - pixelMaskObject->maskChip(8,pixel_mask); - } else if (module_str == "223") { - pixelMaskObject->maskChip(2,pixel_mask); - } else if (module_str == "233") { - pixelMaskObject->maskChip(7,pixel_mask); - } for (int i = 0; i < 640; i++) { thisfile->readNextFrame(); @@ -500,39 +456,35 @@ int main(int argc, char* argv[]) { for (int i = 0; i < NCH; i++) { if ((j-1) < 10 || (j > 8075 && j < 8085)) { - if (pixel_mask[i] == true) { - uint16_t adc = imagedptr[i]&0x3fff; - uint16_t gain = (imagedptr[i]&0xc000) >> 14; - adcmap_all->Fill(i%NC,i/NC,adc); - gainmap_all->Fill(i%NC,i/NC,gain); - } + uint16_t adc = imagedptr[i]&0x3fff; + uint16_t gain = (imagedptr[i]&0xc000) >> 14; + adcmap_all->Fill(i%NC,i/NC,adc); + gainmap_all->Fill(i%NC,i/NC,gain); } if (((i/NC <= 255) && (i%64 == (j-1)%64)) || ((i/NC >= 256) &&((-1*(i-524287))%64 == (j-1)%64))) { - if (pixel_mask[i] == true) { - uint16_t adc = imagedptr[i]&0x3fff; - uint16_t gain = (imagedptr[i]&0xc000) >> 14; + uint16_t adc = imagedptr[i]&0x3fff; + uint16_t gain = (imagedptr[i]&0xc000) >> 14; - gain_histos[i]->Fill(gain); - if (gain == 0) { - adc_histos_g0[i]->Fill(adc); - } else if (gain == 1) { - adc_histos_g1[i]->Fill(adc); - } else if (gain == 3) { - adc_histos_g2[i]->Fill(adc); - if (adc == 0) { - saturation_mask[i] = false; - } + gain_histos[i]->Fill(gain); + if (gain == 0) { + adc_histos_g0[i]->Fill(adc); + } else if (gain == 1) { + adc_histos_g1[i]->Fill(adc); + } else if (gain == 3) { + adc_histos_g2[i]->Fill(adc); + if (adc == 0) { + saturation_mask[i] = false; } - - if ((j-1) < 10 || (j > 8075 && j < 8085)) { - adcmap_sel->Fill(i%NC,i/NC,adc); - gainmap_sel->Fill(i%NC,i/NC,gain); - } - } + + if ((j-1) < 10 || (j > 8075 && j < 8085)) { + adcmap_sel->Fill(i%NC,i/NC,adc); + gainmap_sel->Fill(i%NC,i/NC,gain); + } + } } if (createPerStepHistos && ((j-1) < 10 || (j > 8075 && j < 8085))) { @@ -586,38 +538,36 @@ int main(int argc, char* argv[]) { } for (int i = 0; i < NCH; i++) { - if (pixel_mask[i] == true) { - gainmap_avg->Fill(i%NC,i/NC,gain_histos[i]->GetMean()); - adcmap_avg_g0[j/640-1]->Fill(i%NC,i/NC,adc_histos_g0[i]->GetMean()); - adcermap_avg_g0[j/640-1]->Fill(i%NC,i/NC,adc_histos_g0[i]->GetMeanError()); - adcmap_avg_g1[j/640-1]->Fill(i%NC,i/NC,adc_histos_g1[i]->GetMean()); - adcermap_avg_g1[j/640-1]->Fill(i%NC,i/NC,adc_histos_g1[i]->GetMeanError()); - if (saturation_mask[i] == true) { - adcmap_avg_g2[j/640-1]->Fill(i%NC,i/NC,adc_histos_g2[i]->GetMean()); - adcermap_avg_g2[j/640-1]->Fill(i%NC,i/NC,adc_histos_g2[i]->GetMeanError()); - } - - if (gain_histos[i]->GetEntries() > 0) { - gain_avg->Fill(gain_histos[i]->GetMean()); - } - if (adc_histos_g0[i]->GetEntries() > 0) { - adc_avg_g0->Fill(adc_histos_g0[i]->GetMean()); - } - if (adc_histos_g1[i]->GetEntries() > 0) { - adc_avg_g1->Fill(adc_histos_g1[i]->GetMean()); - } - if (adc_histos_g2[i]->GetEntries() > 0) { - if (saturation_mask[i] == true) { - adc_avg_g2->Fill(adc_histos_g2[i]->GetMean()); - } - } - - gain_histos[i]->Reset(); - adc_histos_g0[i]->Reset(); - adc_histos_g1[i]->Reset(); - adc_histos_g2[i]->Reset(); + gainmap_avg->Fill(i%NC,i/NC,gain_histos[i]->GetMean()); + adcmap_avg_g0[j/640-1]->Fill(i%NC,i/NC,adc_histos_g0[i]->GetMean()); + adcermap_avg_g0[j/640-1]->Fill(i%NC,i/NC,adc_histos_g0[i]->GetMeanError()); + adcmap_avg_g1[j/640-1]->Fill(i%NC,i/NC,adc_histos_g1[i]->GetMean()); + adcermap_avg_g1[j/640-1]->Fill(i%NC,i/NC,adc_histos_g1[i]->GetMeanError()); + if (saturation_mask[i] == true) { + adcmap_avg_g2[j/640-1]->Fill(i%NC,i/NC,adc_histos_g2[i]->GetMean()); + adcermap_avg_g2[j/640-1]->Fill(i%NC,i/NC,adc_histos_g2[i]->GetMeanError()); } + + if (gain_histos[i]->GetEntries() > 0) { + gain_avg->Fill(gain_histos[i]->GetMean()); + } + if (adc_histos_g0[i]->GetEntries() > 0) { + adc_avg_g0->Fill(adc_histos_g0[i]->GetMean()); + } + if (adc_histos_g1[i]->GetEntries() > 0) { + adc_avg_g1->Fill(adc_histos_g1[i]->GetMean()); + } + if (adc_histos_g2[i]->GetEntries() > 0) { + if (saturation_mask[i] == true) { + adc_avg_g2->Fill(adc_histos_g2[i]->GetMean()); + } + } + + gain_histos[i]->Reset(); + adc_histos_g0[i]->Reset(); + adc_histos_g1[i]->Reset(); + adc_histos_g2[i]->Reset(); } if (createPerStepHistos == 1) { @@ -911,567 +861,563 @@ int main(int argc, char* argv[]) { for (int i = 0; i < NCH; i++) { - if (pixel_mask[i] == true) { + vector r0_adc; + vector r0_filter; + vector r0_adcerr; + vector r0_ferr; - vector r0_adc; - vector r0_filter; - vector r0_adcerr; - vector r0_ferr; + vector r1_adc; + vector r1_filter; + vector r1_adcerr; + vector r1_ferr; - vector r1_adc; - vector r1_filter; - vector r1_adcerr; - vector r1_ferr; + vector r2_adc; + vector r2_filter; + vector r2_adcerr; + vector r2_ferr; - vector r2_adc; - vector r2_filter; - vector r2_adcerr; - vector r2_ferr; - - // filter out points at zero and points with 0 error (mean taken from one entry in hist) - int m_max = 0; - if (find(scan_v2.begin(), scan_v2.end(), module_str) != scan_v2.end()) { - m_max = 27; - } else if (find(scan_v4.begin(), scan_v4.end(), module_str) != scan_v4.end()) { - m_max = 31; - } else if (find(scan_v3.begin(), scan_v3.end(), module_str) != scan_v3.end()) { - m_max = 35; - } else if (find(scan_v5.begin(), scan_v5.end(), module_str) != scan_v5.end()) { - m_max = 51; - } else if (find(scan_v6.begin(), scan_v6.end(), module_str) != scan_v6.end()) { - m_max = 97; - } else if (find(scan_v1.begin(), scan_v1.end(), module_str) != scan_v1.end()) { - m_max = 90; - } - - for (int m = 0; m < m_max; m++) { - - double this_g0avg = adcmap_avg_g0[m]->GetBinContent((i%NC)+1,(i/NC)+1); - double this_g1avg = adcmap_avg_g1[m]->GetBinContent((i%NC)+1,(i/NC)+1); - double this_g2avg = adcmap_avg_g2[m]->GetBinContent((i%NC)+1,(i/NC)+1); - double this_g0avger = adcermap_avg_g0[m]->GetBinContent((i%NC)+1,(i/NC)+1); - double this_g1avger = adcermap_avg_g1[m]->GetBinContent((i%NC)+1,(i/NC)+1); - double this_g2avger = adcermap_avg_g2[m]->GetBinContent((i%NC)+1,(i/NC)+1); - - if (this_g0avg != 0) { - r0_filter.push_back(filter[m]); - r0_ferr.push_back(0.); - r0_adc.push_back(this_g0avg); - r0_adcerr.push_back(this_g0avger); - } - if (this_g1avg != 0) { - r1_filter.push_back(filter[m]); - r1_ferr.push_back(0.); - r1_adc.push_back(this_g1avg); - r1_adcerr.push_back(this_g1avger); - } - if (this_g2avg != 0) { - r2_filter.push_back(filter[m]); - r2_ferr.push_back(0.); - r2_adc.push_back(this_g2avg); - r2_adcerr.push_back(this_g2avger); - } - } - - TGraphErrors *grap_g0 = 0; - TGraphErrors *grap_g1 = 0; - TGraphErrors *grap_g2 = 0; - - TF1 *fit_g0 = 0; - TF1 *fit_g1 = 0; - TF1 *fit_g2 = 0; - - double rangemin_g0 = 0; - double rangemax_g0 = 0; - double rangemin_g1 = 0; - double rangemax_g1 = 0; - double rangemin_g2 = 0; - double rangemax_g2 = 0; - - // define graphs - if (r0_adc.size() > 1) { - grap_g0 = new TGraphErrors(r0_adc.size(),&(r0_filter[0]),&(r0_adc[0]),&(r0_ferr[0]),&(r0_adcerr[0])); - grap_g0->SetMarkerStyle(20); - grap_g0->SetMarkerColor(kBlue); - grap_g0->SetLineColor(kBlue); - } - - if (r1_adc.size() > 1) { - grap_g1 = new TGraphErrors(r1_adc.size(),&(r1_filter[0]),&(r1_adc[0]),&(r1_ferr[0]),&(r1_adcerr[0])); - grap_g1->SetMarkerStyle(20); - grap_g1->SetMarkerColor(kGreen+2); - grap_g1->SetLineColor(kGreen+2); - } - - if (r2_adc.size() > 1) { - grap_g2 = new TGraphErrors(r2_adc.size(),&(r2_filter[0]),&(r2_adc[0]),&(r2_ferr[0]),&(r2_adcerr[0])); - grap_g2->SetMarkerStyle(20); - grap_g2->SetMarkerColor(kRed); - grap_g2->SetLineColor(kRed); - } - - // plot the datapoints - if (r1_adc.size() > 1) { - - if ((i >= 58000 && i < 58000+10) || // bulk - (i >= 10 && i < 10+10) || // edge - (i >= 1024+10 && i < 1024+10+10) || // inner edge - (i >= (256*1024)+10 && i < (256*1024)+10+10) || // double - (i >= (257*1024)+10 && i < (257*1024)+10+10) || // next to double - (i == (255*1024)+255) // quad - ) { - - string pixel_type = "x"; - if (i >= 58000 && i < 58000+10) { - pixel_type = "b"; - } else if (i >= 10 && i < 10+10) { - pixel_type = "e"; - } else if (i >= 1024+10 && i < 1024+10+10) { - pixel_type = "ie"; - } else if (i >= (256*1024)+10 && i < (256*1024)+10+10) { - pixel_type = "d"; - } else if (i >= (257*1024)+10 && i < (257*1024)+10+10) { - pixel_type = "ntd"; - } else if (i == (255*1024)+255) { - pixel_type = "q"; - } - - if (find(scan_v6.begin(), scan_v6.end(), module_str) != scan_v6.end()) { - grap_g1->GetXaxis()->SetLimits(0.009,5E2); - } else if (find(scan_v1.begin(), scan_v1.end(), module_str) != scan_v1.end()) { - grap_g1->GetXaxis()->SetLimits(0.09,1.1E3); - } else { - grap_g1->GetXaxis()->SetLimits(0.009,1.1E2); - } - grap_g1->SetMinimum(0); - grap_g1->SetMaximum(16000); - grap_g1->GetXaxis()->SetTitle("Integration time [#mus]"); - grap_g1->GetYaxis()->SetTitle("ADC [ADU]"); - grap_g1->GetYaxis()->SetTitleOffset(0.9); - grap_g1->Draw("AP"); - if (r2_adc.size() > 1) { - grap_g2->Draw("P"); - } - if (r0_adc.size() > 1) { - grap_g0->Draw("P"); - } - mapcanvas->SetLogx(); - sprintf(savename,"plots/M%s/CurrentSource/pixel_%s_%d_M%s.png", module_str.c_str(), pixel_type.c_str(), i, module_str.c_str()); - mapcanvas->SaveAs((const char *)(savename)); - mapcanvas->SetLogx(0); - - } - } - - // define fit ranges and fit - if (r0_adc.size() > 1) { - - rangemin_g0 = *min_element(r0_filter.begin(),r0_filter.end()); - rangemin_g0 = checkRangeMinForRCEffect(rangemin_g0); - - rangemax_g0 = highestPointBeforeSwitching(r0_filter, r1_filter); - - if (rangemax_g0 > rangemin_g0) { - - fit_g0 = new TF1("fit_g0","[0]+[1]*x",rangemin_g0, rangemax_g0); - fit_g0->SetParameter(0, 3000.); - fit_g0->SetParameter(1, 30000.); - fit_g0->SetLineColor(kBlue); - fit_g0->SetParName(0,"G0 const"); - fit_g0->SetParName(1,"G0 grad"); - grap_g0->Fit(fit_g0,"QR+",""); - - g0hist->Fill(fit_g0->GetParameter(1)); - g0map->Fill(i%NC,i/NC,fit_g0->GetParameter(1)); - g0erhist->Fill(fit_g0->GetParError(1)); - g0ermap->Fill(i%NC,i/NC,fit_g0->GetParError(1)); - - if ((i >= 58000 && i < 58000+10) || // bulk - (i >= 10 && i < 10+10) || // edge - (i >= 1024+10 && i < 1024+10+10) || // inner edge - (i >= (256*1024)+10 && i < (256*1024)+10+10) || // double - (i >= (257*1024)+10 && i < (257*1024)+10+10) || // next to double - (i == (255*1024)+255) // quad - ) { - - string pixel_type = "x"; - if (i >= 58000 && i < 58000+10) { - pixel_type = "b"; - } else if (i >= 10 && i < 10+10) { - pixel_type = "e"; - } else if (i >= 1024+10 && i < 1024+10+10) { - pixel_type = "ie"; - } else if (i >= (256*1024)+10 && i < (256*1024)+10+10) { - pixel_type = "d"; - } else if (i >= (257*1024)+10 && i < (257*1024)+10+10) { - pixel_type = "ntd"; - } else if (i == (255*1024)+255) { - pixel_type = "q"; - } - - grap_g0->SetMinimum(0); - grap_g0->SetMaximum(16000); - grap_g0->GetXaxis()->SetTitle("Integration time [#mus]"); - grap_g0->GetYaxis()->SetTitle("ADC [ADU]"); - grap_g0->GetYaxis()->SetTitleOffset(0.9); - grap_g0->GetXaxis()->SetLimits(*min_element(r0_filter.begin(),r0_filter.end()),*max_element(r0_filter.begin(),r0_filter.end())); - grap_g0->Draw("AP"); - fit_g0->Draw("same"); - mapcanvas->Update(); - TPaveStats *st0 = (TPaveStats*)grap_g0->FindObject("stats"); - st0->SetX1NDC(0.2); - st0->SetX2NDC(0.54); - st0->SetY1NDC(0.71); - st0->SetY2NDC(0.90); - st0->SetBorderSize(0); - st0->SetTextColor(kBlue); - mapcanvas->SetLogx(); - sprintf(savename,"plots/M%s/CurrentSource/pixel_%s_%d_g0_M%s.png", module_str.c_str(), pixel_type.c_str(), i, module_str.c_str()); - mapcanvas->SaveAs((const char *)(savename)); - mapcanvas->SetLogx(0); - - vector r0_adc_norm; - for (size_t j = 0; j < r0_adc.size(); j++) { - r0_adc_norm.push_back(r0_adc[j] - fit_g0->Eval(r0_filter[j])); - } - - TGraphErrors *norm_g0 = new TGraphErrors(r0_adc.size(),&(r0_filter[0]),&(r0_adc_norm[0]),&(r0_ferr[0]),&(r0_adcerr[0])); - norm_g0->SetMarkerColor(kBlue); - norm_g0->SetLineColor(kBlue); - - TF1* flat_g0 = new TF1("flat_g0","0",rangemin_g0, rangemax_g0); - flat_g0->SetLineColor(kBlue); - - norm_g0->GetXaxis()->SetTitle("Integration time [#mus]"); - norm_g0->GetYaxis()->SetTitle("Normalised ADC [ADU]"); - norm_g0->GetYaxis()->SetTitleOffset(0.9); - norm_g0->GetXaxis()->SetLimits(*min_element(r0_filter.begin(),r0_filter.end()),*max_element(r0_filter.begin(),r0_filter.end())); - norm_g0->SetMinimum(-100); - norm_g0->SetMaximum(100); - norm_g0->Draw("AP"); - flat_g0->Draw("same"); - sprintf(savename,"plots/M%s/CurrentSource/pixel_%s_%d_g0norm_M%s.png", module_str.c_str(), pixel_type.c_str(), i, module_str.c_str()); - mapcanvas->SaveAs((const char *)(savename)); - - delete norm_g0; - delete flat_g0; - } - } - } - - if (r1_adc.size() > 1) { - - rangemin_g1 = lowestPointAfterSwitching(r1_filter, r0_filter); - rangemin_g1 = checkRangeMinForRCEffect(rangemin_g1); - - rangemax_g1 = highestPointBeforeSwitching(r1_filter, r2_filter); - - if (rangemax_g1 > rangemin_g1) { - - fit_g1 = new TF1("fit_g1","[0]+[1]*x",rangemin_g1,rangemax_g1); - fit_g1->SetParameter(0, 10000.); - fit_g1->SetParameter(1, -0.1); - fit_g1->SetLineColor(kGreen+2); - fit_g1->SetParName(0,"G1 const"); - fit_g1->SetParName(1,"G1 grad"); - grap_g1->Fit(fit_g1,"QR",""); - - g1hist->Fill(fit_g1->GetParameter(1)); - g1map->Fill(i%NC,i/NC,fit_g1->GetParameter(1)); - g1erhist->Fill(fit_g1->GetParError(1)); - g1ermap->Fill(i%NC,i/NC,fit_g1->GetParError(1)); - - if ((i >= 58000 && i < 58000+10) || // bulk - (i >= 10 && i < 10+10) || // edge - (i >= 1024+10 && i < 1024+10+10) || // inner edge - (i >= (256*1024)+10 && i < (256*1024)+10+10) || // double - (i >= (257*1024)+10 && i < (257*1024)+10+10) || // next to double - (i == (255*1024)+255) // quad - ) { - - string pixel_type = "x"; - if (i >= 58000 && i < 58000+10) { - pixel_type = "b"; - } else if (i >= 10 && i < 10+10) { - pixel_type = "e"; - } else if (i >= 1024+10 && i < 1024+10+10) { - pixel_type = "ie"; - } else if (i >= (256*1024)+10 && i < (256*1024)+10+10) { - pixel_type = "d"; - } else if (i >= (257*1024)+10 && i < (257*1024)+10+10) { - pixel_type = "ntd"; - } else if (i == (255*1024)+255) { - pixel_type = "q"; - } - - grap_g1->SetMinimum(0); - grap_g1->SetMaximum(16000); - grap_g1->GetXaxis()->SetTitle("Integration time [#mus]"); - grap_g1->GetYaxis()->SetTitle("ADC [ADU]"); - grap_g1->GetYaxis()->SetTitleOffset(0.9); - grap_g1->GetXaxis()->SetLimits(*min_element(r1_filter.begin(),r1_filter.end()),*max_element(r1_filter.begin(),r1_filter.end())); - grap_g1->Draw("AP"); - fit_g1->Draw("same"); - mapcanvas->Update(); - TPaveStats *st0 = (TPaveStats*)grap_g1->FindObject("stats"); - st0->SetX1NDC(0.2); - st0->SetX2NDC(0.54); - st0->SetY1NDC(0.17); - st0->SetY2NDC(0.36); - st0->SetBorderSize(0); - st0->SetTextColor(kGreen+2); - mapcanvas->SetLogx(); - sprintf(savename,"plots/M%s/CurrentSource/pixel_%s_%d_g1_M%s.png", module_str.c_str(), pixel_type.c_str(), i, module_str.c_str()); - mapcanvas->SaveAs((const char *)(savename)); - mapcanvas->SetLogx(0); - - vector r1_adc_norm; - for (size_t j = 0; j < r1_adc.size(); j++) { - r1_adc_norm.push_back(r1_adc[j] - fit_g1->Eval(r1_filter[j])); - } - - TGraphErrors *norm_g1 = new TGraphErrors(r1_adc.size(),&(r1_filter[0]),&(r1_adc_norm[0]),&(r1_ferr[0]),&(r1_adcerr[0])); - norm_g1->SetMarkerColor(kGreen+2); - norm_g1->SetLineColor(kGreen+2); - - TF1* flat_g1 = new TF1("flat_g1","0",rangemin_g1, rangemax_g1); - flat_g1->SetLineColor(kGreen+2); - - TF1* lin_g1_p02pc = new TF1("lin_g1_p02pc","[0]+[1]*x",rangemin_g1,rangemax_g1); - lin_g1_p02pc->SetParameter(0,fit_g1->GetParameter(0)/500.); - lin_g1_p02pc->SetParameter(1,fit_g1->GetParameter(1)/500.); - lin_g1_p02pc->SetLineColor(kOrange); - - TF1* lin_g1_p05pc = new TF1("lin_g1_p05pc","[0]+[1]*x",rangemin_g1,rangemax_g1); - lin_g1_p05pc->SetParameter(0,fit_g1->GetParameter(0)/200.); - lin_g1_p05pc->SetParameter(1,fit_g1->GetParameter(1)/200.); - lin_g1_p05pc->SetLineColor(kOrange+1); - - TF1* lin_g1_m02pc = new TF1("lin_g1_m02pc","[0]+[1]*x",rangemin_g1,rangemax_g1); - lin_g1_m02pc->SetParameter(0,fit_g1->GetParameter(0)/-500.); - lin_g1_m02pc->SetParameter(1,fit_g1->GetParameter(1)/-500.); - lin_g1_m02pc->SetLineColor(kOrange); - - TF1* lin_g1_m05pc = new TF1("lin_g1_m05pc","[0]+[1]*x",rangemin_g1,rangemax_g1); - lin_g1_m05pc->SetParameter(0,fit_g1->GetParameter(0)/-200.); - lin_g1_m05pc->SetParameter(1,fit_g1->GetParameter(1)/-200.); - lin_g1_m05pc->SetLineColor(kOrange+1); - - norm_g1->GetXaxis()->SetTitle("Integration time [#mus]"); - norm_g1->GetYaxis()->SetTitle("Normalised ADC [ADU]"); - norm_g1->GetYaxis()->SetTitleOffset(0.9); - norm_g1->GetXaxis()->SetLimits(*min_element(r1_filter.begin(),r1_filter.end()),*max_element(r1_filter.begin(),r1_filter.end())); - norm_g1->SetMinimum(1.5*lin_g1_m05pc->Eval(rangemin_g1)); - norm_g1->SetMaximum(1.5*lin_g1_p05pc->Eval(rangemin_g1)); - norm_g1->Draw("AP"); - flat_g1->Draw("same"); - lin_g1_p02pc->Draw("same"); - lin_g1_p05pc->Draw("same"); - lin_g1_m02pc->Draw("same"); - lin_g1_m05pc->Draw("same"); - norm_g1->Draw("P"); - sprintf(savename,"plots/M%s/CurrentSource/pixel_%s_%d_g1norm_M%s.png", module_str.c_str(), pixel_type.c_str(), i, module_str.c_str()); - mapcanvas->SaveAs((const char *)(savename)); - - delete norm_g1; - delete flat_g1; - } - } - } - - if (r2_adc.size() > 1) { - - rangemin_g2 = lowestPointAfterSwitching(r2_filter, r1_filter); - rangemin_g2 = checkRangeMinForRCEffect(rangemin_g2); - - rangemax_g2 = *max_element(r2_filter.begin(),r2_filter.end()); - - if (rangemax_g2 > rangemin_g2) { - - fit_g2 = new TF1("fit_g2","[0]+[1]*x",rangemin_g2, rangemax_g2); - fit_g2->SetParameter(0, 10000.); - fit_g2->SetParameter(1, -0.01); - fit_g2->SetLineColor(kRed); - fit_g2->SetParName(0,"G2 const"); - fit_g2->SetParName(1,"G2 grad"); - grap_g2->Fit(fit_g2,"QR+",""); - - g2hist->Fill(fit_g2->GetParameter(1)); - g2map->Fill(i%NC,i/NC,fit_g2->GetParameter(1)); - g2erhist->Fill(fit_g2->GetParError(1)); - g2ermap->Fill(i%NC,i/NC,fit_g2->GetParError(1)); - - if ((i >= 58000 && i < 58000+10) || // bulk - (i >= 10 && i < 10+10) || // edge - (i >= 1024+10 && i < 1024+10+10) || // inner edge - (i >= (256*1024)+10 && i < (256*1024)+10+10) || // double - (i >= (257*1024)+10 && i < (257*1024)+10+10) || // next to double - (i == (255*1024)+255) // quad - ) { - - string pixel_type = "x"; - if (i >= 58000 && i < 58000+10) { - pixel_type = "b"; - } else if (i >= 10 && i < 10+10) { - pixel_type = "e"; - } else if (i >= 1024+10 && i < 1024+10+10) { - pixel_type = "ie"; - } else if (i >= (256*1024)+10 && i < (256*1024)+10+10) { - pixel_type = "d"; - } else if (i >= (257*1024)+10 && i < (257*1024)+10+10) { - pixel_type = "ntd"; - } else if (i == (255*1024)+255) { - pixel_type = "q"; - } - - grap_g2->SetMinimum(0); - grap_g2->SetMaximum(16000); - grap_g2->GetXaxis()->SetTitle("Integration time [#mus]"); - grap_g2->GetYaxis()->SetTitle("ADC [ADU]"); - grap_g2->GetYaxis()->SetTitleOffset(0.9); - grap_g2->GetXaxis()->SetLimits(*min_element(r2_filter.begin(),r2_filter.end()),*max_element(r2_filter.begin(),r2_filter.end())); - grap_g2->Draw("AP"); - fit_g2->Draw("same"); - mapcanvas->Update(); - TPaveStats *st0 = (TPaveStats*)grap_g2->FindObject("stats"); - st0->SetX1NDC(0.2); - st0->SetX2NDC(0.54); - st0->SetY1NDC(0.17); - st0->SetY2NDC(0.36); - st0->SetBorderSize(0); - st0->SetTextColor(kRed); - mapcanvas->SetLogx(); - sprintf(savename,"plots/M%s/CurrentSource/pixel_%s_%d_g2_M%s.png", module_str.c_str(), pixel_type.c_str(), i, module_str.c_str()); - mapcanvas->SaveAs((const char *)(savename)); - mapcanvas->SetLogx(0); - - vector r2_adc_norm; - for (size_t j = 0; j < r2_adc.size(); j++) { - r2_adc_norm.push_back(r2_adc[j] - fit_g2->Eval(r2_filter[j])); - } - - TGraphErrors *norm_g2 = new TGraphErrors(r2_adc.size(),&(r2_filter[0]),&(r2_adc_norm[0]),&(r2_ferr[0]),&(r2_adcerr[0])); - norm_g2->SetMarkerColor(kRed); - norm_g2->SetLineColor(kRed); - - TF1* flat_g2 = new TF1("flat_g2","0",rangemin_g2, rangemax_g2); - flat_g2->SetLineColor(kRed); - - TF1* lin_g2_p02pc = new TF1("lin_g2_p02pc","[0]+[1]*x",rangemin_g2,rangemax_g2); - lin_g2_p02pc->SetParameter(0,fit_g2->GetParameter(0)/500.); - lin_g2_p02pc->SetParameter(1,fit_g2->GetParameter(1)/500.); - lin_g2_p02pc->SetLineColor(kOrange); - - TF1* lin_g2_p05pc = new TF1("lin_g2_p05pc","[0]+[1]*x",rangemin_g2,rangemax_g2); - lin_g2_p05pc->SetParameter(0,fit_g2->GetParameter(0)/200.); - lin_g2_p05pc->SetParameter(1,fit_g2->GetParameter(1)/200.); - lin_g2_p05pc->SetLineColor(kOrange+1); - - TF1* lin_g2_m02pc = new TF1("lin_g2_m02pc","[0]+[1]*x",rangemin_g2,rangemax_g2); - lin_g2_m02pc->SetParameter(0,fit_g2->GetParameter(0)/-500.); - lin_g2_m02pc->SetParameter(1,fit_g2->GetParameter(1)/-500.); - lin_g2_m02pc->SetLineColor(kOrange); - - TF1* lin_g2_m05pc = new TF1("lin_g2_m05pc","[0]+[1]*x",rangemin_g2,rangemax_g2); - lin_g2_m05pc->SetParameter(0,fit_g2->GetParameter(0)/-200.); - lin_g2_m05pc->SetParameter(1,fit_g2->GetParameter(1)/-200.); - lin_g2_m05pc->SetLineColor(kOrange+1); - - norm_g2->GetXaxis()->SetTitle("Integration time [#mus]"); - norm_g2->GetYaxis()->SetTitle("Normalised ADC [ADU]"); - norm_g2->GetYaxis()->SetTitleOffset(0.9); - norm_g2->GetXaxis()->SetLimits(*min_element(r2_filter.begin(),r2_filter.end()),*max_element(r2_filter.begin(),r2_filter.end())); - norm_g2->SetMinimum(1.5*lin_g2_m05pc->Eval(rangemin_g2)); - norm_g2->SetMaximum(1.5*lin_g2_p05pc->Eval(rangemin_g2)); - norm_g2->Draw("AP"); - flat_g2->Draw("same"); - lin_g2_p02pc->Draw("same"); - lin_g2_p05pc->Draw("same"); - lin_g2_m02pc->Draw("same"); - lin_g2_m05pc->Draw("same"); - norm_g2->Draw("P"); - sprintf(savename,"plots/M%s/CurrentSource/pixel_%s_%d_g2norm_M%s.png", module_str.c_str(), pixel_type.c_str(), i, module_str.c_str()); - mapcanvas->SaveAs((const char *)(savename)); - - delete norm_g2; - delete flat_g2; - } - } - } - - // get ratio measurements - if (rangemax_g0 > rangemin_g0 && rangemax_g1 > rangemin_g1) { - - double this_g0overg1 = fit_g0->GetParameter(1)/fit_g1->GetParameter(1); - double this_g0overg1er = abs(fit_g0->GetParameter(1)/fit_g1->GetParameter(1))*sqrt(pow((fit_g0->GetParError(1)/fit_g0->GetParameter(1)),2) + pow((fit_g1->GetParError(1)/fit_g1->GetParameter(1)),2)); - - g0overg1map->Fill(i%NC,i/NC,this_g0overg1); - g0overg1hist->Fill(this_g0overg1); - g0overg1ermap->Fill(i%NC,i/NC,this_g0overg1er); - g0overg1erhist->Fill(this_g0overg1er); - - if (isEdge(i)) { - g0overg1_isEdge->Fill(this_g0overg1); - } - if (isInnerEdge(i)) { - g0overg1_isInnerEdge->Fill(this_g0overg1); - } - if (isDouble(i)) { - g0overg1_isDouble->Fill(this_g0overg1); - } - if (isNextToDouble(i)) { - g0overg1_isNextToDouble->Fill(this_g0overg1); - } - if (isQuad(i)) { - g0overg1_isQuad->Fill(this_g0overg1); - } - if (isBulk(i)) { - g0overg1_isBulk->Fill(this_g0overg1); - } - } else { - no_g0g1_calib_map->Fill(i%NC,i/NC,1); - } - - if (rangemax_g1 > rangemin_g1 && rangemax_g2 > rangemin_g2) { - - double this_g1overg2 = fit_g1->GetParameter(1)/fit_g2->GetParameter(1); - double this_g1overg2er = abs(fit_g1->GetParameter(1)/fit_g2->GetParameter(1))*sqrt(pow((fit_g1->GetParError(1)/fit_g1->GetParameter(1)),2) + pow((fit_g2->GetParError(1)/fit_g2->GetParameter(1)),2)); - - g1overg2map->Fill(i%NC,i/NC,this_g1overg2); - g1overg2hist->Fill(this_g1overg2); - g1overg2ermap->Fill(i%NC,i/NC,this_g1overg2er); - g1overg2erhist->Fill(this_g1overg2er); - - if (isEdge(i)) { - g1overg2_isEdge->Fill(this_g1overg2); - } - if (isInnerEdge(i)) { - g1overg2_isInnerEdge->Fill(this_g1overg2); - } - if (isDouble(i)) { - g1overg2_isDouble->Fill(this_g1overg2); - } - if (isNextToDouble(i)) { - g1overg2_isNextToDouble->Fill(this_g1overg2); - } - if (isQuad(i)) { - g1overg2_isQuad->Fill(this_g1overg2); - } - if (isBulk(i)) { - g1overg2_isBulk->Fill(this_g1overg2); - } - } else { - no_g1g2_calib_map->Fill(i%NC,i/NC,1); - } - - delete fit_g0; - delete fit_g1; - delete fit_g2; - delete grap_g0; - delete grap_g1; - delete grap_g2; - + // filter out points at zero and points with 0 error (mean taken from one entry in hist) + int m_max = 0; + if (find(scan_v2.begin(), scan_v2.end(), module_str) != scan_v2.end()) { + m_max = 27; + } else if (find(scan_v4.begin(), scan_v4.end(), module_str) != scan_v4.end()) { + m_max = 31; + } else if (find(scan_v3.begin(), scan_v3.end(), module_str) != scan_v3.end()) { + m_max = 35; + } else if (find(scan_v5.begin(), scan_v5.end(), module_str) != scan_v5.end()) { + m_max = 51; + } else if (find(scan_v6.begin(), scan_v6.end(), module_str) != scan_v6.end()) { + m_max = 97; + } else if (find(scan_v1.begin(), scan_v1.end(), module_str) != scan_v1.end()) { + m_max = 90; } + + for (int m = 0; m < m_max; m++) { + + double this_g0avg = adcmap_avg_g0[m]->GetBinContent((i%NC)+1,(i/NC)+1); + double this_g1avg = adcmap_avg_g1[m]->GetBinContent((i%NC)+1,(i/NC)+1); + double this_g2avg = adcmap_avg_g2[m]->GetBinContent((i%NC)+1,(i/NC)+1); + double this_g0avger = adcermap_avg_g0[m]->GetBinContent((i%NC)+1,(i/NC)+1); + double this_g1avger = adcermap_avg_g1[m]->GetBinContent((i%NC)+1,(i/NC)+1); + double this_g2avger = adcermap_avg_g2[m]->GetBinContent((i%NC)+1,(i/NC)+1); + + if (this_g0avg != 0) { + r0_filter.push_back(filter[m]); + r0_ferr.push_back(0.); + r0_adc.push_back(this_g0avg); + r0_adcerr.push_back(this_g0avger); + } + if (this_g1avg != 0) { + r1_filter.push_back(filter[m]); + r1_ferr.push_back(0.); + r1_adc.push_back(this_g1avg); + r1_adcerr.push_back(this_g1avger); + } + if (this_g2avg != 0) { + r2_filter.push_back(filter[m]); + r2_ferr.push_back(0.); + r2_adc.push_back(this_g2avg); + r2_adcerr.push_back(this_g2avger); + } + } + + TGraphErrors *grap_g0 = 0; + TGraphErrors *grap_g1 = 0; + TGraphErrors *grap_g2 = 0; + + TF1 *fit_g0 = 0; + TF1 *fit_g1 = 0; + TF1 *fit_g2 = 0; + + double rangemin_g0 = 0; + double rangemax_g0 = 0; + double rangemin_g1 = 0; + double rangemax_g1 = 0; + double rangemin_g2 = 0; + double rangemax_g2 = 0; + + // define graphs + if (r0_adc.size() > 1) { + grap_g0 = new TGraphErrors(r0_adc.size(),&(r0_filter[0]),&(r0_adc[0]),&(r0_ferr[0]),&(r0_adcerr[0])); + grap_g0->SetMarkerStyle(20); + grap_g0->SetMarkerColor(kBlue); + grap_g0->SetLineColor(kBlue); + } + + if (r1_adc.size() > 1) { + grap_g1 = new TGraphErrors(r1_adc.size(),&(r1_filter[0]),&(r1_adc[0]),&(r1_ferr[0]),&(r1_adcerr[0])); + grap_g1->SetMarkerStyle(20); + grap_g1->SetMarkerColor(kGreen+2); + grap_g1->SetLineColor(kGreen+2); + } + + if (r2_adc.size() > 1) { + grap_g2 = new TGraphErrors(r2_adc.size(),&(r2_filter[0]),&(r2_adc[0]),&(r2_ferr[0]),&(r2_adcerr[0])); + grap_g2->SetMarkerStyle(20); + grap_g2->SetMarkerColor(kRed); + grap_g2->SetLineColor(kRed); + } + + // plot the datapoints + if (r1_adc.size() > 1) { + + if ((i >= 58000 && i < 58000+10) || // bulk + (i >= 10 && i < 10+10) || // edge + (i >= 1024+10 && i < 1024+10+10) || // inner edge + (i >= (256*1024)+10 && i < (256*1024)+10+10) || // double + (i >= (257*1024)+10 && i < (257*1024)+10+10) || // next to double + (i == (255*1024)+255) // quad + ) { + + string pixel_type = "x"; + if (i >= 58000 && i < 58000+10) { + pixel_type = "b"; + } else if (i >= 10 && i < 10+10) { + pixel_type = "e"; + } else if (i >= 1024+10 && i < 1024+10+10) { + pixel_type = "ie"; + } else if (i >= (256*1024)+10 && i < (256*1024)+10+10) { + pixel_type = "d"; + } else if (i >= (257*1024)+10 && i < (257*1024)+10+10) { + pixel_type = "ntd"; + } else if (i == (255*1024)+255) { + pixel_type = "q"; + } + + if (find(scan_v6.begin(), scan_v6.end(), module_str) != scan_v6.end()) { + grap_g1->GetXaxis()->SetLimits(0.009,5E2); + } else if (find(scan_v1.begin(), scan_v1.end(), module_str) != scan_v1.end()) { + grap_g1->GetXaxis()->SetLimits(0.09,1.1E3); + } else { + grap_g1->GetXaxis()->SetLimits(0.009,1.1E2); + } + grap_g1->SetMinimum(0); + grap_g1->SetMaximum(16000); + grap_g1->GetXaxis()->SetTitle("Integration time [#mus]"); + grap_g1->GetYaxis()->SetTitle("ADC [ADU]"); + grap_g1->GetYaxis()->SetTitleOffset(0.9); + grap_g1->Draw("AP"); + if (r2_adc.size() > 1) { + grap_g2->Draw("P"); + } + if (r0_adc.size() > 1) { + grap_g0->Draw("P"); + } + mapcanvas->SetLogx(); + sprintf(savename,"plots/M%s/CurrentSource/pixel_%s_%d_M%s.png", module_str.c_str(), pixel_type.c_str(), i, module_str.c_str()); + mapcanvas->SaveAs((const char *)(savename)); + mapcanvas->SetLogx(0); + + } + } + + // define fit ranges and fit + if (r0_adc.size() > 1) { + + rangemin_g0 = *min_element(r0_filter.begin(),r0_filter.end()); + rangemin_g0 = checkRangeMinForRCEffect(rangemin_g0); + + rangemax_g0 = highestPointBeforeSwitching(r0_filter, r1_filter); + + if (rangemax_g0 > rangemin_g0) { + + fit_g0 = new TF1("fit_g0","[0]+[1]*x",rangemin_g0, rangemax_g0); + fit_g0->SetParameter(0, 3000.); + fit_g0->SetParameter(1, 30000.); + fit_g0->SetLineColor(kBlue); + fit_g0->SetParName(0,"G0 const"); + fit_g0->SetParName(1,"G0 grad"); + grap_g0->Fit(fit_g0,"QR+",""); + + g0hist->Fill(fit_g0->GetParameter(1)); + g0map->Fill(i%NC,i/NC,fit_g0->GetParameter(1)); + g0erhist->Fill(fit_g0->GetParError(1)); + g0ermap->Fill(i%NC,i/NC,fit_g0->GetParError(1)); + + if ((i >= 58000 && i < 58000+10) || // bulk + (i >= 10 && i < 10+10) || // edge + (i >= 1024+10 && i < 1024+10+10) || // inner edge + (i >= (256*1024)+10 && i < (256*1024)+10+10) || // double + (i >= (257*1024)+10 && i < (257*1024)+10+10) || // next to double + (i == (255*1024)+255) // quad + ) { + + string pixel_type = "x"; + if (i >= 58000 && i < 58000+10) { + pixel_type = "b"; + } else if (i >= 10 && i < 10+10) { + pixel_type = "e"; + } else if (i >= 1024+10 && i < 1024+10+10) { + pixel_type = "ie"; + } else if (i >= (256*1024)+10 && i < (256*1024)+10+10) { + pixel_type = "d"; + } else if (i >= (257*1024)+10 && i < (257*1024)+10+10) { + pixel_type = "ntd"; + } else if (i == (255*1024)+255) { + pixel_type = "q"; + } + + grap_g0->SetMinimum(0); + grap_g0->SetMaximum(16000); + grap_g0->GetXaxis()->SetTitle("Integration time [#mus]"); + grap_g0->GetYaxis()->SetTitle("ADC [ADU]"); + grap_g0->GetYaxis()->SetTitleOffset(0.9); + grap_g0->GetXaxis()->SetLimits(*min_element(r0_filter.begin(),r0_filter.end()),*max_element(r0_filter.begin(),r0_filter.end())); + grap_g0->Draw("AP"); + fit_g0->Draw("same"); + mapcanvas->Update(); + TPaveStats *st0 = (TPaveStats*)grap_g0->FindObject("stats"); + st0->SetX1NDC(0.2); + st0->SetX2NDC(0.54); + st0->SetY1NDC(0.71); + st0->SetY2NDC(0.90); + st0->SetBorderSize(0); + st0->SetTextColor(kBlue); + mapcanvas->SetLogx(); + sprintf(savename,"plots/M%s/CurrentSource/pixel_%s_%d_g0_M%s.png", module_str.c_str(), pixel_type.c_str(), i, module_str.c_str()); + mapcanvas->SaveAs((const char *)(savename)); + mapcanvas->SetLogx(0); + + vector r0_adc_norm; + for (size_t j = 0; j < r0_adc.size(); j++) { + r0_adc_norm.push_back(r0_adc[j] - fit_g0->Eval(r0_filter[j])); + } + + TGraphErrors *norm_g0 = new TGraphErrors(r0_adc.size(),&(r0_filter[0]),&(r0_adc_norm[0]),&(r0_ferr[0]),&(r0_adcerr[0])); + norm_g0->SetMarkerColor(kBlue); + norm_g0->SetLineColor(kBlue); + + TF1* flat_g0 = new TF1("flat_g0","0",rangemin_g0, rangemax_g0); + flat_g0->SetLineColor(kBlue); + + norm_g0->GetXaxis()->SetTitle("Integration time [#mus]"); + norm_g0->GetYaxis()->SetTitle("Normalised ADC [ADU]"); + norm_g0->GetYaxis()->SetTitleOffset(0.9); + norm_g0->GetXaxis()->SetLimits(*min_element(r0_filter.begin(),r0_filter.end()),*max_element(r0_filter.begin(),r0_filter.end())); + norm_g0->SetMinimum(-100); + norm_g0->SetMaximum(100); + norm_g0->Draw("AP"); + flat_g0->Draw("same"); + sprintf(savename,"plots/M%s/CurrentSource/pixel_%s_%d_g0norm_M%s.png", module_str.c_str(), pixel_type.c_str(), i, module_str.c_str()); + mapcanvas->SaveAs((const char *)(savename)); + + delete norm_g0; + delete flat_g0; + } + } + } + + if (r1_adc.size() > 1) { + + rangemin_g1 = lowestPointAfterSwitching(r1_filter, r0_filter); + rangemin_g1 = checkRangeMinForRCEffect(rangemin_g1); + + rangemax_g1 = highestPointBeforeSwitching(r1_filter, r2_filter); + + if (rangemax_g1 > rangemin_g1) { + + fit_g1 = new TF1("fit_g1","[0]+[1]*x",rangemin_g1,rangemax_g1); + fit_g1->SetParameter(0, 10000.); + fit_g1->SetParameter(1, -0.1); + fit_g1->SetLineColor(kGreen+2); + fit_g1->SetParName(0,"G1 const"); + fit_g1->SetParName(1,"G1 grad"); + grap_g1->Fit(fit_g1,"QR",""); + + g1hist->Fill(fit_g1->GetParameter(1)); + g1map->Fill(i%NC,i/NC,fit_g1->GetParameter(1)); + g1erhist->Fill(fit_g1->GetParError(1)); + g1ermap->Fill(i%NC,i/NC,fit_g1->GetParError(1)); + + if ((i >= 58000 && i < 58000+10) || // bulk + (i >= 10 && i < 10+10) || // edge + (i >= 1024+10 && i < 1024+10+10) || // inner edge + (i >= (256*1024)+10 && i < (256*1024)+10+10) || // double + (i >= (257*1024)+10 && i < (257*1024)+10+10) || // next to double + (i == (255*1024)+255) // quad + ) { + + string pixel_type = "x"; + if (i >= 58000 && i < 58000+10) { + pixel_type = "b"; + } else if (i >= 10 && i < 10+10) { + pixel_type = "e"; + } else if (i >= 1024+10 && i < 1024+10+10) { + pixel_type = "ie"; + } else if (i >= (256*1024)+10 && i < (256*1024)+10+10) { + pixel_type = "d"; + } else if (i >= (257*1024)+10 && i < (257*1024)+10+10) { + pixel_type = "ntd"; + } else if (i == (255*1024)+255) { + pixel_type = "q"; + } + + grap_g1->SetMinimum(0); + grap_g1->SetMaximum(16000); + grap_g1->GetXaxis()->SetTitle("Integration time [#mus]"); + grap_g1->GetYaxis()->SetTitle("ADC [ADU]"); + grap_g1->GetYaxis()->SetTitleOffset(0.9); + grap_g1->GetXaxis()->SetLimits(*min_element(r1_filter.begin(),r1_filter.end()),*max_element(r1_filter.begin(),r1_filter.end())); + grap_g1->Draw("AP"); + fit_g1->Draw("same"); + mapcanvas->Update(); + TPaveStats *st0 = (TPaveStats*)grap_g1->FindObject("stats"); + st0->SetX1NDC(0.2); + st0->SetX2NDC(0.54); + st0->SetY1NDC(0.17); + st0->SetY2NDC(0.36); + st0->SetBorderSize(0); + st0->SetTextColor(kGreen+2); + mapcanvas->SetLogx(); + sprintf(savename,"plots/M%s/CurrentSource/pixel_%s_%d_g1_M%s.png", module_str.c_str(), pixel_type.c_str(), i, module_str.c_str()); + mapcanvas->SaveAs((const char *)(savename)); + mapcanvas->SetLogx(0); + + vector r1_adc_norm; + for (size_t j = 0; j < r1_adc.size(); j++) { + r1_adc_norm.push_back(r1_adc[j] - fit_g1->Eval(r1_filter[j])); + } + + TGraphErrors *norm_g1 = new TGraphErrors(r1_adc.size(),&(r1_filter[0]),&(r1_adc_norm[0]),&(r1_ferr[0]),&(r1_adcerr[0])); + norm_g1->SetMarkerColor(kGreen+2); + norm_g1->SetLineColor(kGreen+2); + + TF1* flat_g1 = new TF1("flat_g1","0",rangemin_g1, rangemax_g1); + flat_g1->SetLineColor(kGreen+2); + + TF1* lin_g1_p02pc = new TF1("lin_g1_p02pc","[0]+[1]*x",rangemin_g1,rangemax_g1); + lin_g1_p02pc->SetParameter(0,fit_g1->GetParameter(0)/500.); + lin_g1_p02pc->SetParameter(1,fit_g1->GetParameter(1)/500.); + lin_g1_p02pc->SetLineColor(kOrange); + + TF1* lin_g1_p05pc = new TF1("lin_g1_p05pc","[0]+[1]*x",rangemin_g1,rangemax_g1); + lin_g1_p05pc->SetParameter(0,fit_g1->GetParameter(0)/200.); + lin_g1_p05pc->SetParameter(1,fit_g1->GetParameter(1)/200.); + lin_g1_p05pc->SetLineColor(kOrange+1); + + TF1* lin_g1_m02pc = new TF1("lin_g1_m02pc","[0]+[1]*x",rangemin_g1,rangemax_g1); + lin_g1_m02pc->SetParameter(0,fit_g1->GetParameter(0)/-500.); + lin_g1_m02pc->SetParameter(1,fit_g1->GetParameter(1)/-500.); + lin_g1_m02pc->SetLineColor(kOrange); + + TF1* lin_g1_m05pc = new TF1("lin_g1_m05pc","[0]+[1]*x",rangemin_g1,rangemax_g1); + lin_g1_m05pc->SetParameter(0,fit_g1->GetParameter(0)/-200.); + lin_g1_m05pc->SetParameter(1,fit_g1->GetParameter(1)/-200.); + lin_g1_m05pc->SetLineColor(kOrange+1); + + norm_g1->GetXaxis()->SetTitle("Integration time [#mus]"); + norm_g1->GetYaxis()->SetTitle("Normalised ADC [ADU]"); + norm_g1->GetYaxis()->SetTitleOffset(0.9); + norm_g1->GetXaxis()->SetLimits(*min_element(r1_filter.begin(),r1_filter.end()),*max_element(r1_filter.begin(),r1_filter.end())); + norm_g1->SetMinimum(1.5*lin_g1_m05pc->Eval(rangemin_g1)); + norm_g1->SetMaximum(1.5*lin_g1_p05pc->Eval(rangemin_g1)); + norm_g1->Draw("AP"); + flat_g1->Draw("same"); + lin_g1_p02pc->Draw("same"); + lin_g1_p05pc->Draw("same"); + lin_g1_m02pc->Draw("same"); + lin_g1_m05pc->Draw("same"); + norm_g1->Draw("P"); + sprintf(savename,"plots/M%s/CurrentSource/pixel_%s_%d_g1norm_M%s.png", module_str.c_str(), pixel_type.c_str(), i, module_str.c_str()); + mapcanvas->SaveAs((const char *)(savename)); + + delete norm_g1; + delete flat_g1; + } + } + } + + if (r2_adc.size() > 1) { + + rangemin_g2 = lowestPointAfterSwitching(r2_filter, r1_filter); + rangemin_g2 = checkRangeMinForRCEffect(rangemin_g2); + + rangemax_g2 = *max_element(r2_filter.begin(),r2_filter.end()); + + if (rangemax_g2 > rangemin_g2) { + + fit_g2 = new TF1("fit_g2","[0]+[1]*x",rangemin_g2, rangemax_g2); + fit_g2->SetParameter(0, 10000.); + fit_g2->SetParameter(1, -0.01); + fit_g2->SetLineColor(kRed); + fit_g2->SetParName(0,"G2 const"); + fit_g2->SetParName(1,"G2 grad"); + grap_g2->Fit(fit_g2,"QR+",""); + + g2hist->Fill(fit_g2->GetParameter(1)); + g2map->Fill(i%NC,i/NC,fit_g2->GetParameter(1)); + g2erhist->Fill(fit_g2->GetParError(1)); + g2ermap->Fill(i%NC,i/NC,fit_g2->GetParError(1)); + + if ((i >= 58000 && i < 58000+10) || // bulk + (i >= 10 && i < 10+10) || // edge + (i >= 1024+10 && i < 1024+10+10) || // inner edge + (i >= (256*1024)+10 && i < (256*1024)+10+10) || // double + (i >= (257*1024)+10 && i < (257*1024)+10+10) || // next to double + (i == (255*1024)+255) // quad + ) { + + string pixel_type = "x"; + if (i >= 58000 && i < 58000+10) { + pixel_type = "b"; + } else if (i >= 10 && i < 10+10) { + pixel_type = "e"; + } else if (i >= 1024+10 && i < 1024+10+10) { + pixel_type = "ie"; + } else if (i >= (256*1024)+10 && i < (256*1024)+10+10) { + pixel_type = "d"; + } else if (i >= (257*1024)+10 && i < (257*1024)+10+10) { + pixel_type = "ntd"; + } else if (i == (255*1024)+255) { + pixel_type = "q"; + } + + grap_g2->SetMinimum(0); + grap_g2->SetMaximum(16000); + grap_g2->GetXaxis()->SetTitle("Integration time [#mus]"); + grap_g2->GetYaxis()->SetTitle("ADC [ADU]"); + grap_g2->GetYaxis()->SetTitleOffset(0.9); + grap_g2->GetXaxis()->SetLimits(*min_element(r2_filter.begin(),r2_filter.end()),*max_element(r2_filter.begin(),r2_filter.end())); + grap_g2->Draw("AP"); + fit_g2->Draw("same"); + mapcanvas->Update(); + TPaveStats *st0 = (TPaveStats*)grap_g2->FindObject("stats"); + st0->SetX1NDC(0.2); + st0->SetX2NDC(0.54); + st0->SetY1NDC(0.17); + st0->SetY2NDC(0.36); + st0->SetBorderSize(0); + st0->SetTextColor(kRed); + mapcanvas->SetLogx(); + sprintf(savename,"plots/M%s/CurrentSource/pixel_%s_%d_g2_M%s.png", module_str.c_str(), pixel_type.c_str(), i, module_str.c_str()); + mapcanvas->SaveAs((const char *)(savename)); + mapcanvas->SetLogx(0); + + vector r2_adc_norm; + for (size_t j = 0; j < r2_adc.size(); j++) { + r2_adc_norm.push_back(r2_adc[j] - fit_g2->Eval(r2_filter[j])); + } + + TGraphErrors *norm_g2 = new TGraphErrors(r2_adc.size(),&(r2_filter[0]),&(r2_adc_norm[0]),&(r2_ferr[0]),&(r2_adcerr[0])); + norm_g2->SetMarkerColor(kRed); + norm_g2->SetLineColor(kRed); + + TF1* flat_g2 = new TF1("flat_g2","0",rangemin_g2, rangemax_g2); + flat_g2->SetLineColor(kRed); + + TF1* lin_g2_p02pc = new TF1("lin_g2_p02pc","[0]+[1]*x",rangemin_g2,rangemax_g2); + lin_g2_p02pc->SetParameter(0,fit_g2->GetParameter(0)/500.); + lin_g2_p02pc->SetParameter(1,fit_g2->GetParameter(1)/500.); + lin_g2_p02pc->SetLineColor(kOrange); + + TF1* lin_g2_p05pc = new TF1("lin_g2_p05pc","[0]+[1]*x",rangemin_g2,rangemax_g2); + lin_g2_p05pc->SetParameter(0,fit_g2->GetParameter(0)/200.); + lin_g2_p05pc->SetParameter(1,fit_g2->GetParameter(1)/200.); + lin_g2_p05pc->SetLineColor(kOrange+1); + + TF1* lin_g2_m02pc = new TF1("lin_g2_m02pc","[0]+[1]*x",rangemin_g2,rangemax_g2); + lin_g2_m02pc->SetParameter(0,fit_g2->GetParameter(0)/-500.); + lin_g2_m02pc->SetParameter(1,fit_g2->GetParameter(1)/-500.); + lin_g2_m02pc->SetLineColor(kOrange); + + TF1* lin_g2_m05pc = new TF1("lin_g2_m05pc","[0]+[1]*x",rangemin_g2,rangemax_g2); + lin_g2_m05pc->SetParameter(0,fit_g2->GetParameter(0)/-200.); + lin_g2_m05pc->SetParameter(1,fit_g2->GetParameter(1)/-200.); + lin_g2_m05pc->SetLineColor(kOrange+1); + + norm_g2->GetXaxis()->SetTitle("Integration time [#mus]"); + norm_g2->GetYaxis()->SetTitle("Normalised ADC [ADU]"); + norm_g2->GetYaxis()->SetTitleOffset(0.9); + norm_g2->GetXaxis()->SetLimits(*min_element(r2_filter.begin(),r2_filter.end()),*max_element(r2_filter.begin(),r2_filter.end())); + norm_g2->SetMinimum(1.5*lin_g2_m05pc->Eval(rangemin_g2)); + norm_g2->SetMaximum(1.5*lin_g2_p05pc->Eval(rangemin_g2)); + norm_g2->Draw("AP"); + flat_g2->Draw("same"); + lin_g2_p02pc->Draw("same"); + lin_g2_p05pc->Draw("same"); + lin_g2_m02pc->Draw("same"); + lin_g2_m05pc->Draw("same"); + norm_g2->Draw("P"); + sprintf(savename,"plots/M%s/CurrentSource/pixel_%s_%d_g2norm_M%s.png", module_str.c_str(), pixel_type.c_str(), i, module_str.c_str()); + mapcanvas->SaveAs((const char *)(savename)); + + delete norm_g2; + delete flat_g2; + } + } + } + + // get ratio measurements + if (rangemax_g0 > rangemin_g0 && rangemax_g1 > rangemin_g1) { + + double this_g0overg1 = fit_g0->GetParameter(1)/fit_g1->GetParameter(1); + double this_g0overg1er = abs(fit_g0->GetParameter(1)/fit_g1->GetParameter(1))*sqrt(pow((fit_g0->GetParError(1)/fit_g0->GetParameter(1)),2) + pow((fit_g1->GetParError(1)/fit_g1->GetParameter(1)),2)); + + g0overg1map->Fill(i%NC,i/NC,this_g0overg1); + g0overg1hist->Fill(this_g0overg1); + g0overg1ermap->Fill(i%NC,i/NC,this_g0overg1er); + g0overg1erhist->Fill(this_g0overg1er); + + if (isEdge(i)) { + g0overg1_isEdge->Fill(this_g0overg1); + } + if (isInnerEdge(i)) { + g0overg1_isInnerEdge->Fill(this_g0overg1); + } + if (isDouble(i)) { + g0overg1_isDouble->Fill(this_g0overg1); + } + if (isNextToDouble(i)) { + g0overg1_isNextToDouble->Fill(this_g0overg1); + } + if (isQuad(i)) { + g0overg1_isQuad->Fill(this_g0overg1); + } + if (isBulk(i)) { + g0overg1_isBulk->Fill(this_g0overg1); + } + } else { + no_g0g1_calib_map->Fill(i%NC,i/NC,1); + } + + if (rangemax_g1 > rangemin_g1 && rangemax_g2 > rangemin_g2) { + + double this_g1overg2 = fit_g1->GetParameter(1)/fit_g2->GetParameter(1); + double this_g1overg2er = abs(fit_g1->GetParameter(1)/fit_g2->GetParameter(1))*sqrt(pow((fit_g1->GetParError(1)/fit_g1->GetParameter(1)),2) + pow((fit_g2->GetParError(1)/fit_g2->GetParameter(1)),2)); + + g1overg2map->Fill(i%NC,i/NC,this_g1overg2); + g1overg2hist->Fill(this_g1overg2); + g1overg2ermap->Fill(i%NC,i/NC,this_g1overg2er); + g1overg2erhist->Fill(this_g1overg2er); + + if (isEdge(i)) { + g1overg2_isEdge->Fill(this_g1overg2); + } + if (isInnerEdge(i)) { + g1overg2_isInnerEdge->Fill(this_g1overg2); + } + if (isDouble(i)) { + g1overg2_isDouble->Fill(this_g1overg2); + } + if (isNextToDouble(i)) { + g1overg2_isNextToDouble->Fill(this_g1overg2); + } + if (isQuad(i)) { + g1overg2_isQuad->Fill(this_g1overg2); + } + if (isBulk(i)) { + g1overg2_isBulk->Fill(this_g1overg2); + } + } else { + no_g1g2_calib_map->Fill(i%NC,i/NC,1); + } + + delete fit_g0; + delete fit_g1; + delete fit_g2; + delete grap_g0; + delete grap_g1; + delete grap_g2; } mapcanvas->SetLeftMargin(0.1);