00001 void ge_eu152_calib() {
00002
00003 TFile* f = new TFile("calib_ge.root", "READ");
00004 TSpectrum* s = new TSpectrum(100, 3.);
00005 TH1* spec = (TH1*)f->Get("PlotTAP_Amplitude/hGe-S#FirstComplete#{constant_fraction=0.60}{no_time_shift=true}_Amplitude");
00006 spec->Sumw2();
00007
00008
00009 unsigned int src_date[] = {1, 3, 2000};
00010 unsigned int meas_date[] = {19, 12, 2013};
00011 Double_t age = 13.8;
00012 Double_t halflife = 13.537;
00013 Double_t activity0 = 46.4e3;
00014 TTimeStamp t0(src_date[2], src_date[1], src_date[0], 0, 0, 0);
00015 TTimeStamp t(meas_date[2], meas_date[1], meas_date[0], 0, 0, 0);
00016 Double_t dt = (t.GetSec() - t0.GetSec())/60./60./24./365.2425;
00017 Double_t activity = activity0*TMath::Power(0.5,dt/halflife);
00018 Double_t livetime = 3245.5;
00019 Double_t events = activity*livetime;
00020
00021
00022 const unsigned int NPeaks = 15;
00023 const unsigned int Peak511Index = 5, Peak122Index = 0;
00024 Double_t Energy[NPeaks] = {121.7817, 244.6975, 344.2785, 411.1163, 443.965, 510.999, 778.9040, 867.378, 964.079, 1085.869, 1089.737, 1112.074, 1212.948, 1299.140, 1408.006};
00025 Double_t RedEn[NPeaks-1] = {121.7817, 244.6975, 344.2785, 411.1163, 443.965, 778.9040, 867.378, 964.079, 1085.869, 1089.737, 1112.074, 1212.948, 1299.140, 1408.006};
00026 Double_t Intensity[NPeaks-1] = {0.2858, 0.07583, 0.265, 0.02234, 0.02821, 0.12942, 0.04245, 0.14605, 0.10207, 0.01726, 0.13644, 0.01422, 0.01623, 0.21005};
00027 Double_t LogEnergy[NPeaks]; for (unsigned int i = 0; i < NPeaks; ++i) LogEnergy[i] = TMath::Log(Energy[i]);
00028 Double_t ExpectedCounts[NPeaks-1]; for (unsigned int i = 0; i < NPeaks-1; ++i) ExpectedCounts[i] = events*Intensity[i];
00029 Double_t ADC[NPeaks] = {1000.75, 2015.48, 2831.37, 3379.41, 3648.90, 4196.38, 6392.91, 7118.00, 7909.78, 8907.53, 8941.08, 9121.85, 9948.85, 10654.3, 11547.5};
00030 Double_t ADC_Meas[NPeaks];
00031 const char* Functions[NPeaks] = { "gaus(0)+[3]*x+[4]",
00032 "gaus(0)+gaus(3)+[6]*x+[7]",
00033 "gaus(0)+gaus(3)+[6]*x+[7]",
00034 "gaus(0)+[3]*x+[4]",
00035 "gaus(0)+[3]*x+[4]",
00036 "gaus(0)+[3]*x+[4]",
00037 "gaus(0)+[3]*x+[4]",
00038 "gaus(0)+[3]*x+[4]",
00039 "gaus(0)+[3]*x+[4]",
00040 "gaus(0)+gaus(3)+[6]*x+[7]",
00041 "gaus(0)+gaus(3)+[6]*x+[7]",
00042 "gaus(0)+gaus(3)+[6]*x+[7]",
00043 "gaus(0)+[3]*x+[4]",
00044 "gaus(0)+gaus(3)+[6]*x+[7]",
00045 "gaus(0)+[3]*x+[4]" };
00046 const unsigned int NParam[NPeaks] = { 5, 8, 8, 5, 5, 5, 5, 5, 5, 8, 8, 8, 5, 8, 5 };
00047 const Double_t FitParam[NPeaks][11] = { {1250., ADC[0], 8., 0., 0., 0., 0., 0., 0., 0., 0.},
00048 {200., ADC[1], 8., 20., 1966., 8., 0., 100., 0., 0., 0.},
00049 {70., ADC[2], 8., 10., 2894., 8., 0., 70., 0., 0., 0.},
00050 {50., ADC[3], 8., 0., 40., 0., 0., 0., 0., 0., 0.},
00051 {55., ADC[4], 8., 0., 35., 0., 0., 0., 0., 0., 0.},
00052 {450., ADC[5], 10., 0., 25., 0., 0., 0., 0., 0., 0.},
00053 {125., ADC[6], 8., 0., 15., 0., 0., 0., 0., 0., 0.},
00054 {40., ADC[7], 8., 0., 10., 0., 0., 0., 0., 0., 0.},
00055 {120., ADC[8], 8., 0., 10., 0., 0., 0., 0., 0., 0.},
00056 {75., ADC[9], 8., 15., ADC[10], 8., 0., 5., 0., 0., 0.},
00057 {15., ADC[10], 8., 75., ADC[9], 8., 0., 5., 0., 0., 0.},
00058 {95., ADC[11], 8., 10., 9170., 8., 0., 5., 0., 0., 0.},
00059 {10., ADC[12], 8., 0., 5., 0.. 0., 0., 0., 0., 0.},
00060 {10., ADC[13], 8., 25., 10610., 8., 0., 2., 0., 0., 0.},
00061 {120., ADC[14], 8., 0., 0., 0., 0., 0., 0., 0., 0.} };
00062 Double_t FitParamRes[NPeaks][11];
00063 Double_t FitParamErr[NPeaks][11];
00064 Double_t Counts[NPeaks-1];
00065 Double_t Efficiency[NPeaks-1];
00066 Double_t LogEfficiency[NPeaks-1];
00067
00068
00069 Double_t Chi2Ndf[NPeaks];
00070 Double_t Error_ADC[NPeaks];
00071 Double_t Error_Counts[NPeaks-1];
00072 Double_t Error_Eff[NPeaks-1];
00073 Double_t Error_LogEff[NPeaks-1];
00074
00075
00076 const Double_t rt2pi = TMath::Sqrt(2.*TMath::Pi());
00077 for (unsigned int i = 0; i < NPeaks; ++i) {
00078 TF1* fit = new TF1("fit", Functions[i]);
00079 const Double_t fit_window = 100.;
00080 spec->GetXaxis()->SetRangeUser(ADC[i] - fit_window, ADC[i] + fit_window);
00081 fit->SetParameters(FitParam[i]);
00082 TFitResultPtr res = spec->Fit(fit,"SMENQ");
00083 Chi2Ndf[i] = res->Chi2()/(Double_t)res->Ndf();
00084 for (unsigned int j = 0; j < NParam[i]; ++j) {
00085 FitParamRes[i][j] = res->Value(j);
00086 FitParamErr[i][j] = res->ParError(j);
00087 }
00088 }
00089 for (unsigned int i = 0; i < NPeaks; ++i) {
00090
00091 ADC_Meas[i] = FitParamRes[i][1];
00092 Error_ADC[i] = FitParamErr[i][1];
00093
00094
00095 unsigned int j = i;
00096 if (i == Peak511Index)
00097 continue;
00098 else if (i > Peak511Index)
00099 --j;
00100 Counts[j] = FitParamRes[i][0]*FitParamRes[i][2]*rt2pi;
00101 Error_Counts[j] = Counts[j]*TMath::Sqrt(TMath::Power(FitParamErr[i][0]/FitParamRes[i][0],2.)+TMath::Power(FitParamErr[i][2]/FitParamRes[i][2],2.));
00102 Efficiency[j] = Counts[j] / ExpectedCounts[j];
00103 Error_Eff[j] = Error_Counts[j] / ExpectedCounts[j];
00104 LogEfficiency[j] = TMath::Log(Efficiency[j]);
00105 Error_LogEff[j] = Error_Eff[j] / Efficiency[j];
00106 }
00107
00108
00109 Double_t en_par[2], en_par_err[2];
00110 Double_t eff_par[2], eff_par_err[2], Chi2[2];
00111 unsigned int Ndf[2];
00112
00113 TGraphErrors* e_cal = new TGraphErrors(NPeaks-1, ADC_Meas+1, Energy+1, Error_ADC+1, 0);
00114
00115 TGraphErrors* eff_cal = new TGraphErrors(NPeaks-1, Energy+1, Efficiency+1, 0, Error_Eff+1);
00116 e_cal->SetTitle("Ge Energy Calibration"); e_cal->GetXaxis()->SetTitle("ADC Value [ADC]"); e_cal->GetYaxis()->SetTitle("Energy [keV]");
00117 eff_cal->SetTitle("Ge Efficiency Calibration"); eff_cal->GetXaxis()->SetTitle("Energy [keV]"); eff_cal->GetYaxis()->SetTitle("Counts / Expected Counts");
00118 TCanvas* c_en = new TCanvas("c_en");
00119 TF1* fit = new TF1("fit", "[0] + [1]*x");
00120 fit->SetParameter(0, 0);
00121 fit->SetParameter(1, 100);
00122 fit->SetParName(0, "Offset");
00123 fit->SetParName(1, "Gradient");
00124 TFitResultPtr res = e_cal->Fit(fit,"SME"); e_cal->Draw("A*");
00125 TPaveText* text_en = new TPaveText(0.2, 0.65, 0.5, 0.75, "nb NDC"); text_en->SetBorderSize(0); text_en->SetTextSize(0.04); text_en->SetFillColor(kWhite); text_en->AddText("Energy = Offset + Gradient * ADC"); text_en->Draw();
00126 Chi2[0] = res->Chi2(); Ndf[0] = res->Ndf();
00127 en_par[0] = res->Value(0); en_par[1] = res->Value(1);
00128 en_par_err[0] = res->ParError(0); en_par_err[1] = res->ParError(1);
00129 TCanvas* c_eff = new TCanvas("c_eff");
00130
00131 TF1* logfit = new TF1("func", "[0]*(x**[1])");
00132 logfit->SetParName(0, "Coefficient");
00133 logfit->SetParName(1, "Exponent");
00134 logfit->SetParameters(TMath::Exp(-2.6), -0.84);
00135 res = eff_cal->Fit(logfit, "SME"); eff_cal->Draw("A*");
00136 TPaveText* text_eff = new TPaveText(0.5, 0.5, 0.65, 0.6, "nb NDC"); text_eff->SetBorderSize(0); text_eff->SetTextSize(0.05); text_eff->AddText("#varepsilon = aE^{b}"); text_eff->SetFillColor(kWhite); text_eff->Draw();
00137
00138 Chi2[1] = res->Chi2(); Ndf[1] = res->Ndf();
00139 eff_par[0] = res->Value(0); eff_par[1] = res->Value(1);
00140 eff_par_err[0] = res->ParError(0); eff_par_err[1] = res->ParError(1);
00141
00142 printf("\n");
00143 printf(" %-10s | %-8s | %-5s | %-10s | %-5s | %-7s\n", "Energy", "ADC", "+/-", "Eff", "+/-", "Chi2");
00144 for (unsigned int i = 0; i < NPeaks; ++i) {
00145 int adc_exp = TMath::Floor(TMath::Log10(Error_ADC[i]));
00146 int eff_exp = TMath::Floor(TMath::Log10(Error_Eff[i]));
00147 printf(" %-10.10g | %-8.10g | %-5.1g | %-10.10g | %-5.1g | %-7.3g\n",
00148 Energy[i],
00149 TMath::Floor(ADC_Meas[i] / TMath::Power(10., adc_exp)) * TMath::Power(10., adc_exp),
00150 Error_ADC[i],
00151 TMath::Floor(Efficiency[i] / TMath::Power(10., eff_exp)) * TMath::Power(10., eff_exp),
00152 Error_Eff[i],
00153 Chi2Ndf[i]);
00154 }
00155 printf("\n");
00156 printf("ADC = %g(%g) * Energy + %g(%g) (%g/%u)\n", en_par[1], en_par_err[1], en_par[0], en_par_err[0], Chi2[0], Ndf[0]);
00157
00158 printf("Eff = %g(%g)*Energy^[%g(%g)] (%g/%u)\n", eff_par[0], eff_par_err[0], eff_par[1], eff_par_err[1], Chi2[1], Ndf[1]);
00159
00160
00161
00162
00163 double si_peak = 400.177;
00164 double al_peak = 346.828;
00165 std::cout << "Eff(" << si_peak << ") = " << logfit->Eval(si_peak) << std::endl;
00166 std::cout << "Eff(" << al_peak << ") = " << logfit->Eval(al_peak) << std::endl;
00167 }
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192