#include<fstream>
#include<TH1.h>
#include<TH2.h>
#include<TFile.h>
#include<TTree.h>
#include<TCanvas.h>
#include<parameter.h>
#include<math.h>
//#include<iostream>
#include<iostream> using namespace std;
//ここまでで使うライブラリをincludeしてます.parameter.hというのは自分でつくってヘッダファイルで,キャリブレーション用のパラメターが書いてあります.
void macro_calb_lin(){ //Last modified 2011/11/22
//difference from macro_calb_oka:
//fit by Gaussian but not draw it,
//and fit again by "Gaussian + linear" and draw it
char filename[99];//root file name
//sprintf(filname,"22na20111104.001.root");
sprintf(filename
,"22na-10.03.001-002.root"); //sprintf(filename,"22na-11.10.20-21.root");
//sprintf(filename,"22na-20111028.002.root");
// sprintf(filename,"22na20111104.001.root");
// sprintf(filename,"22na-20111111.001.root");
// sprintf(filename,"22na-20111118.001.root");
// sprintf(filename,"22na-20111201.001.root");
//filenameという変数を宣言して,そこにファイル名を代入してます.この変数はファイルを開くのと,あとでPDFファイルをつくるときに使います.sprintfはprintfと似た関数で,変数に文字列をいれることができます.ROOTのマクロを書くときにはけっこう便利です.あと、文字列をいれるときは,charというクラスでその文字数以上の配列として宣言するみたいです。
TFile *f1=new TFile(filename);//opening root file
//ファイルを開いています。
Double_t p[9][9][9];
//pというDouble_t クラスの配列は、フィッティングのときに使うパラメターです。p[i][j][k]はチャネルiのj番目のピークのk番目のパラメターを意味しています。j=1は511keVのピーク、j=2は1275のピーク、j=3はサムピークです。k=0はガウシアン全体にかかる定数(使わない)k=1はMean,k=2はSigmaです。
TH1F *h[99];
h[1]=h101;
h[2]=h102;
h[3]=h103;
h[4]=h104;
h[5]=h105;
h[6]=h106;
//TH1Fは1次のFloatのHistgramのクラスです。ROOTファイルに入っているh101~h106までのヒストグラムをプログラム中で扱いやすいようにh[i]という配列を宣言して、そこに代入しています。
// end of front matter
//gStyle->SetOptFit(0001);
gStyle->SetOptFit(0000);
//ここはフィッティングのパラメータをどのようにキャンバスに出力するか決めています
TCanvas *c1 = new TCanvas("c1","Raw Data and Fitting");
c1->Divide(2,3);
TCanvas *c2 = new TCanvas("c2","Enegy Calibration");
c2->Divide(2,3);
TCanvas *c3 = new TCanvas("c3","Calibrated Hist");
c3->Divide(2,3);
TCanvas *c4 = new TCanvas("c4","Fitting with Gaussian and Linear function");
c4->Divide(2,3);
TCanvas *c5 = new TCanvas("c5","Energy Calibration with G+L");
c5->Divide(2,3);
TCanvas *c6 = new TCanvas("c6","Calibrated Hist with G+L");
c6->Divide(2,3);
TCanvas *c7 = new TCanvas("c7","Energy dependence of Sigma");
c7->Divide(2,3);
TCanvas *c8 = new TCanvas("c8","E dependence of Sigma with G+L");
c8->Divide(2,3);
//TCanvasというクラスはヒストグラムとかを出力するためのクラスです.キャンバスをDivideするとキャンバスを複数に分けることができます
for(Int_t ch=1;ch<=6;ch++){
char hclone[256];
TH1F *hoge=h[ch]->Clone(hclone);
h[ch+10]=hoge;
TH1F *hoge2=h[ch]->Clone(hclone);
h[ch+20]=hoge2;
//h101-h106を違う目的で使いたいので複製しています
}
Double_t sigma1[3],sigma2[3];
Double_t sigmae1[3],sigmae2[3];
for(Int_t ch=1;ch<=6;ch++){
c1->cd(ch)->SetLogy();
h[ch]->Draw();
//まず,キャンバスc1の6つに分割したうちの1番目に移動し,ch=1のときはh[1]=h101をDrawします.
//Preparation of Fitting function
//ここからはピークをフィッティングするための関数を準備しています.
TF1 *fit1;
char fname[256];
char mean1[256],mean2[256],mean3[256];
char resol1[256],resol2[256],resol3[256];
//fnameは関数の名前で,ひとつめのピークにはチャネルごとにf[1]-f[6]をフィッティングします
fit1 = new TF1(fname,"gaus",p1start[ch],p1end[ch]);
//この行ではフィッティングのための関数fit1をつくっています.名前はfnameに入っている値,種類はガウシアン,定義域はp1startとp1endに入っている値です
h[ch]->Fit(fit1,"","",p1start[ch],p1end[ch]);
//h[ch]にfit1をフィッティングします
fit1->GetParameters(p[ch][1]);
sigmae1[0]=fit1->GetParError(2);
//フィットしたfit1について,そのフィッティングパラメータを得ます.これによってp[ch][1][1]にはMeanが,p[ch][1][2]にはSigmaが入ります.
sprintf(mean1
," Mean =%lf",p
[ch
][1][1]); sprintf(resol1
,"Resol.=%lf",2*sqrt(2*log(2.0))*p
[ch
][1][2]/p
[ch
][1][1]); //凡例に表示するための文字列を準備しています
//同じことを2つ目,3つ目のピークについても行います.
TF1 *fit2;
fit2 = new TF1(fname,"gaus",p2start[ch],p2end[ch]);
h[ch]->Fit(fit2,"+","",p2start[ch],p2end[ch]);
fit2->GetParameters(p[ch][2]);
sigmae1[1]=fit2->GetParError(2);
sprintf(mean2
," Mean =%lf",p
[ch
][2][1]); sprintf(resol2
,"Resol.=%lf",2*sqrt(2*log(2.0))*p
[ch
][2][2]/p
[ch
][2][1]);
TF1 *fit3;
fit3 = new TF1(fname,"gaus",p3start[ch],p3end[ch]);
h[ch]->Fit(fname,"+","",p3start[ch],p3end[ch]);
fit3->GetParameters(p[ch][3]);
sigmae1[2]=fit3->GetParError(2);
sprintf(mean3
," Mean =%lf",p
[ch
][3][1]); sprintf(resol3
,"Resol.=%lf",2*sqrt(2*log(2.0))*p
[ch
][3][2]/p
[ch
][3][1]);
h[ch]->Draw();//もう1回Drawします.なぜかこうしないとうまくいかなかったきがする
// fit1->Draw("sames");//fit1をDrawします."sames"と書くと上書きされます.
// fit2->SetLineColor(3);
//fit2->Draw("sames");//fit2の線の色を設定したのち,上書きします
//fit3->SetLineColor(7);
// fit3->Draw("sames");
//ここからは凡例(Legend)の設定です
TLegend *l = new TLegend(0.6255,0.75,0.875,0.45);
//TLegendクラスの変数 l を宣言しました
l->AddEntry(fit1,"511 keV","lp");
//lにfit1を追加し,その表示名を511 keVとしました
l->AddEntry((TObject*)0, mean1,"");
//文字列mean1をlに追加しました
l->AddEntry((TObject*)0, resol1,"");
l->AddEntry(fit2,"1274 keV","lp");
l->AddEntry((TObject*)0, mean2,"");
l->AddEntry((TObject*)0, resol2,"");
l->AddEntry(fit3,"511+1274 keV","lp");
l->AddEntry((TObject*)0, mean3,"");
l->AddEntry((TObject*)0, resol3,"");
l->SetFillColor(0);// l の背景を白にします
l->Draw();//lをキャンバスに描きます
// Graph of calibration
//エネルギーキャリブレーションの式を求めるグラフをつくります
c2->cd(ch);
//xとyの散布図をつくるために,値を準備しておきます
Double_t x[3],y[3];
x[0]=510.9989;
x[1]=1274.58;
x[2]=510.9989+1274.58;
y[0]=p[ch][1][1];
y[1]=p[ch][2][1];
y[2]=p[ch][3][1];
TGraph *g=new TGraph(3,x,y);//gをxとyの散布図として宣言してつくります
char gtitle[256];
sprintf(gtitle
, "Calibration for ADC%d",ch
); //グラフのタイトルを準備します
g->SetTitle(gtitle);//グラフのタイトルをgtitleに入っている値にしました
g->SetMarkerStyle(5);//グラフのデータ点の設定
g->SetMarkerSize(3);//データ点の大きさ
g->SetMarkerColor(1);//データ点の色
g->GetYaxis()->SetTitle("ADC Channel");//x軸の名前
g->GetXaxis()->SetTitle("Energy (keV)");
g->Draw("AP");//グラフをDrawします.APってオプションはなんだか忘れました
char fgname[256];
// TF1 *fg = new TF1(fgname,"pol1",0,4000);
TF1 *fg = new TF1(fgname,"[1]*x+[0]",0,4000);
g->Fit(fg,"","",0,4000);
//つくったグラフに対して1次元の1次関数fgをfitします
char func[256];
Double_t pcal[9][5];
fg->GetParameters(pcal[ch]);
sprintf(func
,"y=%lfx+%lf",pcal
[ch
][1],pcal
[ch
][0]); //fitしたfgに対してパラメータを取得し,funcという文字列に式を書いておきます
TLegend *lg = new TLegend(0.5255,0.40,0.875,0.15);
lg->AddEntry(g,"Data Point","p");
lg->AddEntry(fg,"Fitted line","l");
lg->AddEntry((TObject*)0, func, "");
lg->SetFillColor(0);
lg->Draw();
//canvas2にもlgというlegendをつくりました.
//次にヒストグラムの軸をkeVで書き直したものをつくります
c3->cd(ch)->SetLogy();
//hstartとhendは最後に横軸をkeVで書き換えたあと、各チャンネルのプロットする範囲を決める変数です。
double hstart, hend;
hstart=pcal[ch][1]*0+pcal[ch][0];
hend=pcal[ch][1]*4000.0+pcal[ch][0];
h[ch+10]->SetBins(4000,hstart,hend);
h[ch+10]->Draw();
//x軸を書き直す作業はこれだけで終わりです
//あとはさっきと同じことをしてる
//Gaussian: Resolution=FWHM/Mean
//FWHM=2*Sigma*sqrt(2*log2)
// 分解能出すときにcalibrationの後もう一度フィッティングしてからのほうがいいのかも
sprintf(mean1
," Mean =%lf keV",1/pcal
[ch
][1]*p
[ch
][1][1]-pcal
[ch
][0]/pcal
[ch
][1]); sprintf(resol1
,"Sigma/mean=%lf",(1/pcal
[ch
][1]*p
[ch
][1][2])/(1/pcal
[ch
][1]*p
[ch
][1][1]-pcal
[ch
][0]/pcal
[ch
][1])); sprintf(mean2
," Mean =%lf keV",1/pcal
[ch
][1]*p
[ch
][2][1]-pcal
[ch
][0]/pcal
[ch
][1]); sprintf(resol2
,"Sigma/mean=%lf",(1/pcal
[ch
][1]*p
[ch
][2][2])/(1/pcal
[ch
][1]*p
[ch
][2][1]-pcal
[ch
][0]/pcal
[ch
][1])); sprintf(mean3
," Mean =%lf keV",1/pcal
[ch
][1]*p
[ch
][3][1]-pcal
[ch
][0]/pcal
[ch
][1]); sprintf(resol3
,"Sigma/mean=%lf",(1/pcal
[ch
][1]*p
[ch
][3][2])/(1/pcal
[ch
][1]*p
[ch
][3][1]-pcal
[ch
][0]/pcal
[ch
][1]));
TLegend *lc = new TLegend(0.6255,0.75,0.875,0.45);
lc->AddEntry(fit1,"511 keV","lp");
lc->AddEntry((TObject*)0, mean1,"");
lc->AddEntry((TObject*)0, resol1,"");
lc->AddEntry(fit2,"1274 keV","lp");
lc->AddEntry((TObject*)0, mean2,"");
lc->AddEntry((TObject*)0, resol2,"");
lc->AddEntry(fit3,"511+1274 keV","lp");
lc->AddEntry((TObject*)0, mean3,"");
lc->AddEntry((TObject*)0, resol3,"");
lc->SetFillColor(0);
lc->Draw();
//こっからは新機能
//1次式+ガウシアンでフィットし直す
char fglname[99];
Double_t paratest[5];
Double_t ex[3];
c4->cd(ch)->SetLogy();
//c4->cd(ch);
h[ch+20]->Draw();
TLegend *l3 = new TLegend(0.6255,0.75,0.875,0.45);
TF1 *fit4;
fit4 = new TF1(fglname,"[0]/sqrt(2.0*3.14)/[1]*exp(-(x-[2])*(x-[2])/2.0/[1]/[1])+[3]*x+[4]");//[0]:constant ,[1]:sigma, [2]:mean
fit4->SetParameters(p[ch][1][0],p[ch][1][2],p[ch][1][1],0,0);//パラメータの初期値の設定
h[ch+20]->Fit(fglname,"","",p1start[ch],p1end[ch]);
fit4 = h[ch+20]->GetFunction(fglname);
fit4->GetParameters(paratest);// parameterをgetしてこれを使えば直線の式が
x[0]=paratest[2];
ex[0]=fit4->GetParError(2);
sigma2[0]=paratest[1];
sigmae2[0]=fit4->GetParError(1);
TF1 *flin1= new TF1("flin1","[0]*x+[1]",p1start[ch],p1end[ch]);
flin1->FixParameter(0,paratest[3]);
flin1->FixParameter(1,paratest[4]);//"fix" is proper, not "set"
h[ch+20]->Fit(flin1,"Q0+","",p1start[ch],p1end[ch]);
flin1=h[ch+20]->GetFunction("flin1");
char caption[32];
l3->AddEntry(fit4,"511 keV","lp");
sprintf(caption
,"mean=%lf",paratest
[2]); l3->AddEntry((TObject*)0, caption,"");
sprintf(caption
,"sigma=%lf",paratest
[1]); l3->AddEntry((TObject*)0, caption,"");
TF1 *fit5;
fit5 = new TF1(fglname,"[0]/sqrt(2.0*3.14)/[1]*exp(-(x-[2])*(x-[2])/2.0/[1]/[1])+[3]*x+[4]");//[0]:constant ,[1]:sigma, [2]:mean
fit5->SetParameters(p[ch][2][0],p[ch][2][2],p[ch][2][1],0,0);
h[ch+20]->Fit(fglname,"0+","",p2start[ch],p2end[ch]);
fit5 = h[ch+20]->GetFunction(fglname);
fit5->GetParameters(paratest);
x[1]=paratest[2];
ex[1]=fit5->GetParError(2);
sigma2[1]=paratest[1];
sigmae2[1]=fit5->GetParError(1);
TF1 *flin2= new TF1("flin2","[0]*x+[1]",p2start[ch],p2end[ch]);
flin2->FixParameter(0,paratest[3]);
flin2->FixParameter(1,paratest[4]);//"fix" is proper, not "set"
h[ch+20]->Fit(flin2,"Q0+","",p2start[ch],p2end[ch]);
flin2=h[ch+20]->GetFunction("flin2");
char caption[32];
l3->AddEntry(fit5,"1274.5 keV","lp");
sprintf(caption
,"mean=%lf",paratest
[2]); l3->AddEntry((TObject*)0, caption,"");
sprintf(caption
,"sigma=%lf",paratest
[1]); l3->AddEntry((TObject*)0, caption,"");
TF1 *fit6;
fit6 = new TF1(fglname,"[0]/sqrt(2.0*3.14)/[1]*exp(-(x-[2])*(x-[2])/2.0/[1]/[1])+[3]*x+[4]");//[0]:constant ,[1]:sigma, [2]:mean
fit6->SetParameters(p[ch][3][0],p[ch][3][2],p[ch][3][1],0,0);
h[ch+20]->Fit(fglname,"0+","",p3start[ch],p3end[ch]);
fit6 = h[ch+20]->GetFunction(fglname);
fit6->GetParameters(paratest);
x[2]=paratest[2];
ex[2]=fit6->GetParError(2);
sigma2[2]=paratest[1];
sigmae2[2]=fit6->GetParError(1);
TF1 *flin3= new TF1("flin3","[0]*x+[1]",p3start[ch],p3end[ch]);
flin3->FixParameter(0,paratest[3]);
flin3->FixParameter(1,paratest[4]);//"fix" is proper, not "set"
h[ch+20]->Fit(flin3,"Q0+","",p3start[ch],p3end[ch]);
flin3=h[ch+20]->GetFunction("flin3");
char caption[32];
l3->AddEntry(fit6,"511+1274 keV","lp");
sprintf(caption
,"mean=%lf",paratest
[2]); l3->AddEntry((TObject*)0, caption,"");
sprintf(caption
,"sigma=%lf",paratest
[1]); l3->AddEntry((TObject*)0, caption,"");
h[ch+20]->Draw("same");
fit4->Draw("same");
flin1->Draw("same");
fit5->SetLineColor(3);
fit5->Draw("same");
flin2->SetLineColor(3);
flin2->Draw("same");
fit6->SetLineColor(7);
fit6->Draw("same");
flin3->SetLineColor(7);
flin3->Draw("same");
l3->SetFillColor(0);// l の背景を白にします
l3->Draw();//lをキャンバスに描きます
/* Energy Calibration*/
c5->cd(ch);
// TGraph *g=new TGraphErrors(3,x,y,ex,0);//なぜかxだけ誤差ありだとフィッティングできない
// TGraph *g=new TGraph(3,x,y);
TGraph *g=new TGraphErrors(3,y,x,0,ex);//なぜかxだけ誤差ありだとフィッティングできない
char gtitle[256];
sprintf(gtitle
, "Calibration for ADC%d",ch
); //グラフのタイトルを準備します
g->SetTitle(gtitle);//グラフのタイトルをgtitleに入っている値にしました
g->SetMarkerStyle(5);//グラフのデータ点の設定
g->SetMarkerSize(2);//データ点の大きさ
g->SetMarkerColor(1);//データ点の色
g->GetYaxis()->SetTitle("ADC Channel");//x軸の名前
g->GetXaxis()->SetTitle("Energy (keV)");
g->Draw("AP");//グラフをDrawします.APってオプションはなんだか忘れました
char fgname[256];
// TF1 *fg2 = new TF1(fgname,"[2]*x**2+[1]*x+[0]",0,4000);
TF1 *fg2 = new TF1(fgname,"[1]*x+[0]",0,4000);
g->Fit(fg2,"","",0,4000);
fg=g->GetFunction("fg2");
char func[256];
Double_t pcal2[9][5];
fg->GetParameters(pcal2[ch]);
// sprintf(func,"y=%lfx^2+%lfx+%lf",pcal2[ch][2],pcal2[ch][1],pcal2[ch][0]);
sprintf(func
,"y=%lfx+%lf",pcal2
[ch
][1],pcal2
[ch
][0]);
TLegend *lg = new TLegend(0.5255,0.40,0.875,0.15);
lg->AddEntry(g,"Data Point","p");
lg->AddEntry(fg,"Fitted line","l");
lg->AddEntry((TObject*)0, func, "");
lg->SetFillColor(0);
lg->Draw();
fg->Draw("same");
c6->cd(ch);
sprintf(mean1
," Mean =%lf keV",1/pcal2
[ch
][1]*p
[ch
][1][1]-pcal2
[ch
][0]/pcal2
[ch
][1]); sprintf(resol1
,"Sigma/mean=%lf",(1/pcal2
[ch
][1]*p
[ch
][1][2])/(1/pcal2
[ch
][1]*p
[ch
][1][1]-pcal2
[ch
][0]/pcal2
[ch
][1])); sprintf(mean2
," Mean =%lf keV",1/pcal2
[ch
][1]*p
[ch
][2][1]-pcal2
[ch
][0]/pcal2
[ch
][1]); sprintf(resol2
,"Sigma/mean=%lf",(1/pcal2
[ch
][1]*p
[ch
][2][2])/(1/pcal2
[ch
][1]*p
[ch
][2][1]-pcal2
[ch
][0]/pcal2
[ch
][1])); sprintf(mean3
," Mean =%lf keV",1/pcal2
[ch
][1]*p
[ch
][3][1]-pcal2
[ch
][0]/pcal2
[ch
][1]); sprintf(resol3
,"Sigma/mean=%lf",(1/pcal2
[ch
][1]*p
[ch
][3][2])/(1/pcal2
[ch
][1]*p
[ch
][3][1]-pcal2
[ch
][0]/pcal2
[ch
][1]));
TLegend *lc = new TLegend(0.6255,0.75,0.875,0.45);
lc->AddEntry(fit1,"511 keV","lp");
lc->AddEntry((TObject*)0, mean1,"");
lc->AddEntry((TObject*)0, resol1,"");
lc->AddEntry(fit2,"1274 keV","lp");
lc->AddEntry((TObject*)0, mean2,"");
lc->AddEntry((TObject*)0, resol2,"");
lc->AddEntry(fit3,"511+1274 keV","lp");
lc->AddEntry((TObject*)0, mean3,"");
lc->AddEntry((TObject*)0, resol3,"");
lc->SetFillColor(0);
lc->Draw();
c7->cd(ch);
//y is already set for energy
sigma1[0]= p[ch][1][2] / pcal[ch][1];
sigma1[1]= p[ch][2][2] / pcal[ch][1];
sigma1[2]= p[ch][3][2] / pcal[ch][1];
y[0]= p[ch][1][1] / pcal[ch][1] -pcal[ch][0] / pcal[ch][1];
y[1]= p[ch][2][1] / pcal[ch][1] -pcal[ch][0] / pcal[ch][1];
y[2]= p[ch][3][1] / pcal[ch][1] -pcal[ch][0] / pcal[ch][1];
sigmae1[0]= sigmae1[0] / pcal[ch][1];
sigmae1[1]= sigmae1[1] / pcal[ch][1];
sigmae1[2]= sigmae1[2] / pcal[ch][1];
/*
sigma1[0]=4.611 / pcal[1][1];//using pedestal of ch1
sigma1[0]=12.0 / pcal[2][1];//using pedestal of ch2
// sigma1[0]=3.37 / pcal[3][1];//using pedestal of ch3
// sigma1[0]=3.88945 / pcal[4][1];//using pedestal of ch4
// sigma1[0]=3.24 / pcal[5][1];//using pedestal of ch5
// sigma1[0]=6 / pcal[6][1];//using pedestal of ch6
*/
sigma1[0]=39;//using Cs of ch1
// sigma1[0]=44;//using Cs of ch2
// sigma1[0]=37;//using Cs of ch3
// sigma1[0]=46;//using Cs of ch4
sigma1[0]=40;//using Cs of ch5
// sigma1[0]=57;//using Cs of ch6
y[0]=662;
sigmae1[0]= sigmae1[1] ;
TGraph *g=new TGraphErrors(3,y,sigma1,0,sigmae1);
sprintf(gtitle
, "Sigma(E) of ADC%d (Gaussian Only)",ch
); //グラフのタイトルを準備します
g->SetTitle(gtitle);//グラフのタイトルをgtitleに入っている値にしました
g->SetMarkerStyle(1);//グラフのデータ点の設定
g->SetMarkerSize(1);//データ点の大きさ
g->SetMarkerColor(1);//データ点の色
g->GetXaxis()->SetTitle("Energy (keV)");//x軸の名前
g->GetYaxis()->SetTitle("Sigma (keV)");
g->Draw("AP");//グラフをDrawします.APってオプションはなんだか忘れました
char fgname[256];
TF1 *fg2 = new TF1(fgname,"[1]*x**(0.5)+[0]",0,4000);
g->Fit(fg2,"","",0,4000);
fg=g->GetFunction("fg2");
char func[256];
Double_t psigma1[9][5];
fg->GetParameters(psigma1[ch]);
sprintf(func
,"y=+%lf*sqrt(x)+%lf",psigma1
[ch
][1],psigma1
[ch
][0]);
TLegend *lg = new TLegend(0.5255,0.40,0.875,0.15);
lg->AddEntry(g,"Data Point","p");
lg->AddEntry(fg,"Fitted line","l");
lg->AddEntry((TObject*)0, func, "");
lg->SetFillColor(0);
lg->Draw();
fg->Draw("same");
/*
Canvas No. 8
*/
c8->cd(ch);
sigma2[0] = sigma2[0] / pcal2[ch][1];
sigma2[1] = sigma2[1] / pcal2[ch][1];
sigma2[2] = sigma2[2] / pcal2[ch][1];
x[0] = x[0] / pcal2[ch][1] - pcal2[ch][0] / pcal2[ch][1];
x[1] = x[1] / pcal2[ch][1] - pcal2[ch][0] / pcal2[ch][1];
x[2] = x[2] / pcal2[ch][1] - pcal2[ch][0] / pcal2[ch][1];
sigmae2[0] = sigmae2[0] / pcal2[ch][1];
sigmae2[1] = sigmae2[1] / pcal2[ch][1];
sigmae2[2] = sigmae2[2] / pcal2[ch][1];
TGraph *g=new TGraphErrors(3,x,sigma2,0,sigmae2);
sprintf(gtitle
, "Sigma(E) of ADC%d (G + Linear)",ch
); //グラフのタイトルを準備します
g->SetTitle(gtitle);//グラフのタイトルをgtitleに入っている値にしました
g->SetMarkerStyle(1);//グラフのデータ点の設定
g->SetMarkerSize(1);//データ点の大きさ
g->SetMarkerColor(1);//データ点の色
g->GetXaxis()->SetTitle("Energy (keV)");//x軸の名前
g->GetYaxis()->SetTitle("Sigma (keV)");
g->Draw("AP");//グラフをDrawします.APってオプションはなんだか忘れました
char fgname[256];
TF1 *fg2 = new TF1(fgname,"[1]*x**(0.5)+[0]",0,4000);
g->Fit(fg2,"","",0,4000);
fg=g->GetFunction("fg2");
char func[256];
Double_t psigma1[9][5];
fg->GetParameters(psigma1[ch]);
sprintf(func
,"y=+%lf*sqrt(x)+%lf",psigma1
[ch
][1],psigma1
[ch
][0]);
TLegend *lg = new TLegend(0.5255,0.40,0.875,0.15);
lg->AddEntry(g,"Data Point","p");
lg->AddEntry(fg,"Fitted line","l");
lg->AddEntry((TObject*)0, func, "");
lg->SetFillColor(0);
lg->Draw();
fg->Draw("same");
}
//キャンバスをPDFに出力します
//Print
char pdfstart[99];
sprintf(pdfstart
,"%s.pdf(",filename
); char pdfmiddle[99];
sprintf(pdfmiddle
,"%s.pdf",filename
); char pdfend[99];
sprintf(pdfend
,"%s.pdf)",filename
);
c1->Print(pdfstart);
c2->Print(pdfmiddle);
c3->Print(pdfmiddle);
c4->Print(pdfend);
//この下では別のプログラムで使うためのヘッダファイルをつくっています.あんまりきにしなくてもいいはず
//フィッティングパラメーターをファイルに書きこむ
char pfile[99];
sprintf(pfile
,"parameter%s.h",filename
); FILE *fp;
fprintf(fp
,"Double_t para1[7], para2[7],para3[7],para4[7];\nDouble_t para12,para13,para14,para15,para16, para23,para24,para25,para26,para34,para35,para36,para45,para46,para56;\n\n"); fprintf(fp
,"//Energy = Naiadc[ch]*para1[ch]+para2[ch]\n");
//Writing ADC Parameters
char para1[99];
char para2[99];
for(Int_t ch=1; ch<7; ch++){
sprintf(para1
,"para1[%d]=%lf;\n",ch
,pcal
[ch
-1][3]); sprintf(para2
,"para2[%d]=%lf;\n",ch
,pcal
[ch
-1][2]); }
//Writing TDC Parameters
fprintf(fp
,"para3[1]=0.5707;\npara4[1]=42.063;\npara3[2]=0.5679;\npara4[2]=47.576;\npara3[3]=0.5361;\npara4[3]=67.592;\npara3[4]=0.6024;\npara4[4]=12.809;\npara3[5]=0.5663;\npara4[5]=50.119;\npara3[6]=0.56559;\npara4[6]=45.407;\n\n"); fprintf(fp
,"para12=0;\npara13=0;\npara14=0;\npara15=0;\npara16=0;\npara23=0;\npara24=0;\npara25=0;\npara26=0;\npara34=0;\npara35=0;\npara36=0;\npara45=0;\npara46=0;\npara56=0;\n");
}