rootana/scripts/ge/ge_eu152_calib.c File Reference

Go to the source code of this file.

Functions

void ge_eu152_calib ()

Function Documentation

void ge_eu152_calib (  ) 

Definition at line 1 of file ge_eu152_calib.c.

00001                       {
00002   // The file to run on in the sum of calibration runs 3375, 3378 and 3379.
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   // Activity
00009   unsigned int src_date[] = {1, 3, 2000}; // 1 March 2000?
00010   unsigned int meas_date[] = {19, 12, 2013}; // 19 Dec 2013
00011   Double_t age = 13.8; // Years according to WolframAlpha
00012   Double_t halflife = 13.537;
00013   Double_t activity0 = 46.4e3; // RunPSI2013:661
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; // Analysis-R13:129
00019   Double_t events = activity*livetime;
00020 
00021   // Spectrum
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}; // First guess
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   // Errors
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   // Count the events (integral of fit gaussian)
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     // Get energy calibration
00091     ADC_Meas[i] = FitParamRes[i][1];
00092     Error_ADC[i] = FitParamErr[i][1];
00093     // Get efficiency calibration
00094     // Adjust for lack of prediction for 511 peak
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   // Draw
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   /* TGraphErrors* e_cal   = new TGraphErrors(NPeaks, Energy, ADC_Meas, 0, Error_ADC); */
00113   TGraphErrors* e_cal   = new TGraphErrors(NPeaks-1, ADC_Meas+1, Energy+1, Error_ADC+1, 0);
00114   /* TGraphErrors* eff_cal = new TGraphErrors(NPeaks-1, LogEnergy+1, LogEfficiency+1, 0, Error_LogEff+1); */
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   //  gStyle->SetOptFit(111);
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   /* res = eff_cal->Fit("pol1", "SME"); eff_cal->Draw("A*"); */
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   // Print out
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   /* printf("Eff = %g(%g)*Energy^[%g(%g)]    (%g/%u)\n", TMath::Exp(eff_par[0]), TMath::Exp(eff_par[0])*eff_par_err[0], eff_par[1], eff_par_err[1], Chi2[1], Ndf[1]); */
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   //  c_en->SaveAs("~/plots/ThesisPlots/ge-calibration-curve.pdf");
00161   //  c_eff->SaveAs("~/plots/ThesisPlots/ge-efficiency-curve.pdf");
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 }


Generated on 15 Jun 2016 for AlcapDAQ by  doxygen 1.6.1