アットウィキロゴ

卒研めも > Calibration > Cs-137 > macro0109

わりと完成版。まず661kevをGaussianだけでフィットして、そのデータを利用してガウシアン+1次式でフィット。出力されるヒストグラムのレジェンドにはmeanとsigmaをchとkeVの単位で書く。あとsigmaのerrorもkeV単位で。
  1. #include<fstream>
  2. #include<TH1.h>
  3. #include<TH2.h>
  4. #include<TFile.h>
  5. #include<TTree.h>
  6. #include<TCanvas.h>
  7. #include<parameter_et.h>
  8. #include<parameter_cs.h>
  9. #include<math.h>
  10. //#include<iostream>
  11.  
  12. #include<iostream> using namespace std;
  13.  
  14. //ここまでで使うライブラリをincludeしてます.parameter.hというのは自分でつくってヘッダファイルで,キャリブレーション用のパラメターが書いてあります.
  15.  
  16.  
  17. void macro_calb_cs(){ //Last modified 2012/01/09
  18. //difference from macro_calb_oka:
  19. //fit by Gaussian but not draw it,
  20. //and fit again by "Gaussian + linear" and draw it
  21. //for 137Cs
  22. char filename[99];//root file name
  23.  
  24. sprintf(filename,"137cs-20111201.001.root");
  25.  
  26.  
  27. //filenameという変数を宣言して,そこにファイル名を代入してます.この変数はファイルを開くのと,あとでPDFファイルをつくるときに使います.sprintfはprintfと似た関数で,変数に文字列をいれることができます.ROOTのマクロを書くときにはけっこう便利です.あと、文字列をいれるときは,charというクラスでその文字数以上の配列として宣言するみたいです。
  28.  
  29.  
  30. TFile *f1=new TFile(filename);//opening root file
  31. //ファイルを開いています。
  32.  
  33. Double_t p[9][9][9];
  34. //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です。
  35.  
  36.  
  37. TH1F *h[99];
  38. h[1]=h101;
  39. h[2]=h102;
  40. h[3]=h103;
  41. h[4]=h104;
  42. h[5]=h105;
  43. h[6]=h106;
  44. //TH1Fは1次のFloatのHistgramのクラスです。ROOTファイルに入っているh101~h106までのヒストグラムをプログラム中で扱いやすいようにh[i]という配列を宣言して、そこに代入しています。
  45.  
  46. // end of front matter
  47.  
  48.  
  49. //gStyle->SetOptFit(0001);
  50. gStyle->SetOptFit(0000);
  51. //ここはフィッティングのパラメータをどのようにキャンバスに出力するか決めています
  52.  
  53.  
  54.  
  55. TCanvas *c1 = new TCanvas("c1","Raw Data and Fitting");
  56. c1->Divide(2,3);
  57.  
  58. TCanvas *ctest = new TCanvas("ctest","Fitting Only With Gaussian");
  59. ctest->Divide(2,3);
  60.  
  61.  
  62.  
  63. for(Int_t ch=1;ch<=6;ch++){
  64.  
  65. char hclone[256];
  66. sprintf(hclone,"hclone%d",ch);
  67. TH1F *hoge=h[ch]->Clone(hclone);
  68. h[ch+10]=hoge;
  69. /*
  70.   sprintf(hclone,"hclone2%d",ch);
  71.   TH1F *hoge2=h[ch]->Clone(hclone);
  72.   h[ch+20]=hoge2;
  73.   //h101-h106を違う目的で使いたいので複製しています
  74.   */
  75. }
  76.  
  77.  
  78.  
  79. Double_t sigma1[3],sigma2[3];
  80. Double_t sigmae1[3],sigmae2[3];
  81. Double_t ene[3];
  82. ene[0]=510.9989;
  83. ene[1]=1274.58;
  84. ene[2]=ene[0]+ene[1];
  85.  
  86.  
  87. for(Int_t ch=1;ch<=6;ch++){
  88.  
  89. ctest->cd(ch)->SetLogy();
  90.  
  91. char fglname[99];
  92. Double_t paratest[5];
  93. Double_t ex[3];
  94.  
  95. h[ch+10]->Draw();
  96. TLegend *l3 = new TLegend(0.6255,0.75,0.875,0.45);
  97.  
  98. TF1 *ftest=new TF1("ftest","gaus",p1start[ch],p1end[ch]);
  99. h[ch+10]->Fit("ftest","","",p1start[ch],p1end[ch]);
  100.  
  101. Double_t parag[9];
  102. ftest->GetParameters(parag);
  103.  
  104. c1->cd(ch)->SetLogy();
  105.  
  106. TF1 *fit4;
  107. sprintf(fglname,"fgl1%d",ch);
  108. fit4 = new TF1(fglname,"[0]/sqrt(2.0*3.141592)/[1]*exp(-(x-[2])*(x-[2])/2.0/[1]/[1])+[3]*x+[4]");//[0]:constant ,[1]:sigma, [2]:mean
  109. fit4->SetParameters(parag[0],parag[2],parag[1],0,0);//パラメータの初期値の設定
  110. h[ch]->Fit(fglname,"","",p1start[ch],p1end[ch]);
  111. fit4 = h[ch]->GetFunction(fglname);
  112. fit4->GetParameters(paratest);// parameterをgetしてこれを使えば直線の式が
  113.  
  114. Double_t Esigma;
  115. Esigma[0]=fit4->GetParError(1);
  116.  
  117. TF1 *flin1= new TF1("flin1","[0]*x+[1]",p1start[ch],p1end[ch]);
  118. flin1->FixParameter(0,paratest[3]);
  119. flin1->FixParameter(1,paratest[4]);//"fix" is proper, not "set"
  120. h[ch]->Fit(flin1,"Q0+","",p1start[ch],p1end[ch]);
  121. flin1=h[ch]->GetFunction("flin1");
  122.  
  123. char caption[32];
  124. sprintf(caption,"mean=%lf(ch)",paratest[2]);
  125. l3->AddEntry((TObject*)0, caption,"");
  126. sprintf(caption,"sigma=%lf(ch)",paratest[1]);
  127. l3->AddEntry((TObject*)0, caption,"");
  128. sprintf(caption,"mean=%lf(keV)",paratest[2]*para1[ch]+para2[ch]);
  129. l3->AddEntry((TObject*)0, caption,"");
  130. sprintf(caption,"sigma=%lf(keV)",paratest[1]*para1[ch]);
  131. l3->AddEntry((TObject*)0, caption,"");
  132. sprintf(caption,"Errsig=%lf(keV)",Esigma*para1[ch]);
  133. l3->AddEntry((TObject*)0, caption,"");
  134.  
  135.  
  136.  
  137. h[ch]->Draw();
  138. fit4->Draw("same");
  139. flin1->Draw("same");
  140.  
  141.  
  142. l3->SetFillColor(0);// l の背景を白にします
  143. l3->Draw();//lをキャンバスに描きます
  144.  
  145.  
  146. }
  147.  
  148.  
  149.  
  150. //キャンバスをPDFに出力します
  151. //Print
  152. /* char pdfstart[99];
  153.   sprintf(pdfstart,"%s.pdf(",filename);
  154.   char pdfmiddle[99];
  155.   sprintf(pdfmiddle,"%s.pdf",filename);
  156.   char pdfend[99];
  157.   sprintf(pdfend,"%s.pdf)",filename);
  158.  
  159.   c1->Print(pdfstart);
  160.   c1->Print(pdfmiddle);
  161.   // c3->Print(pdfmiddle);
  162.   c1->Print(pdfend);
  163.   */
  164.  
  165. }
  166.  
  167.  
  168.  
最終更新:2012年01月09日 23:20