data analysis scripts
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1503 lines
55 KiB

  1. /// to do:
  2. /// 1. correct for gap between arrays
  3. #define convert_cxx
  4. #include "hitutils.h"
  5. #include <string>
  6. #include <stdio.h>
  7. #include <iostream>
  8. #include <vector>
  9. #include <utility>
  10. #include <TH2.h>
  11. #include <TF1.h>
  12. #include <TStyle.h>
  13. #include <TCanvas.h>
  14. #include <TFile.h>
  15. #include <TTree.h>
  16. #include <TSystemDirectory.h>
  17. #include <gsl/gsl_statistics.h>
  18. #include <math.h>
  19. #include <gsl/gsl_errno.h>
  20. #include <gsl/gsl_fft_complex.h>
  21. #include <TF1.h>
  22. #include <TGraphErrors.h>
  23. #include <gsl/gsl_sort.h>
  24. #include <TVector.h>
  25. #include "TStopwatch.h"
  26. #include "Math/MinimizerOptions.h"
  27. #include "TVirtualFitter.h"
  28. #include "TMatrixD.h"
  29. //using namespace std;
  30. bool smooth_on = true;
  31. bool doFit = false;
  32. bool doLinInt = true;
  33. bool ethercat = true;
  34. Double_t S[128], T[128], SumT, SumS, SumS2, SumST, SumT2, SumY, SumYS, SumYT, sigmaABC, muABC,p,c, b, b_den, b_num, SumYYP, SumYYM, MeanY;
  35. TMatrixD M1(3,3);
  36. TMatrixD M1inv(3,3);
  37. TVectorD ABC(3);
  38. TVectorD M2(3);
  39. Double_t M1elements_b0[9] = {0.};
  40. Double_t M1elements_b1[9] = {0.};
  41. Double_t M1elements_b2[9] = {0.};
  42. Double_t M1elements_b3[9] = {0.};
  43. TMatrixD matrix(2,2);
  44. TMatrixD *M1pointer = &M1;
  45. TVectorD *M2pointer = &M2;
  46. TVectorD *ABCpointer = &ABC;
  47. int eventID = 0;
  48. int framestart=0;
  49. int frameend = 0;
  50. double board_b0_ch[128];
  51. double board_b1_ch[128];
  52. double board_b2_ch[128];
  53. double board_b3_ch[128];
  54. double board_b0_ch_bkg[128];
  55. double board_b1_ch_bkg[128];
  56. double board_b2_ch_bkg[128];
  57. double board_b3_ch_bkg[128];
  58. double signal_b0 = 0.;
  59. double signal_b1 = 0.;
  60. double signal_b2 = 0.;
  61. double signal_b3 = 0.;
  62. double signal_cor_b0 = 0.;
  63. double signal_cor_b1 = 0.;
  64. double signal_cor_b2 = 0.;
  65. double signal_cor_b3 = 0.;
  66. double signal_b0_left = 0.;
  67. double signal_b1_left = 0.;
  68. double signal_b2_left = 0.;
  69. double signal_b3_left = 0.;
  70. double signal_b0_right = 0.;
  71. double signal_b1_right = 0.;
  72. double signal_b2_right = 0.;
  73. double signal_b3_right = 0.;
  74. double signal_gsl_b0[128];
  75. double signal_gsl_b1[128];
  76. double signal_gsl_b2[128];
  77. double signal_gsl_b3[128];
  78. double signal_reg[128];
  79. double channellist_gsl_b0[128];
  80. double channellist_gsl_b1[128];
  81. double channellist_gsl_b2[128];
  82. double channellist_gsl_b3[128];
  83. double channellist[128];
  84. double channellist_reg[128];
  85. double pos[128];
  86. double maxchannelamp_b0 =0.;
  87. double maxchannelamp_b1 =0.;
  88. double maxchannelamp_b2 =0.;
  89. double maxchannelamp_b3 =0.;
  90. int maxchannel_b0 =0;
  91. int maxchannel_b1 =0;
  92. int maxchannel_b2 =0;
  93. int maxchannel_b3 =0;
  94. int numtocalc_b0 =0;
  95. int numtocalc_b1 =0;
  96. int numtocalc_b2 =0;
  97. int numtocalc_b3 =0;
  98. int numtocalc_reg =0;
  99. int nfwhm_b0 = 0;
  100. int nfwhm_b1 = 0;
  101. int nfwhm_b2 = 0;
  102. int nfwhm_b3 = 0;
  103. double beamPosX_b0,beamPosX_b1,beamPosX_b2,beamPosX_b3;
  104. double beamFocusX_b0,beamFocusX_b1,beamFocusX_b2,beamFocusX_b3;
  105. double beamPosX_fit_b0,beamPosX_fit_b1,beamPosX_fit_b2,beamPosX_fit_b3;
  106. double beamFocusX_fit_b0,beamFocusX_fit_b1,beamFocusX_fit_b2,beamFocusX_fit_b3;
  107. double beamSkewX_b0,beamSkewX_b1,beamSkewX_b2,beamSkewX_b3;
  108. double beamKurtX_b0,beamKurtX_b1,beamKurtX_b2,beamKurtX_b3;
  109. int beamNumX_b0,beamNumX_b1,beamNumX_b2,beamNumX_b3;
  110. double beamRsqr_b0,beamRsqr_b1,beamRsqr_b2,beamRsqr_b3;
  111. double beamChi2_fit_b0,beamChi2_fit_b1,beamChi2_fit_b2,beamChi2_fit_b3;
  112. double beamPosX_reg_b0,beamPosX_reg_b1,beamPosX_reg_b2,beamPosX_reg_b3;
  113. double beamFocusX_reg_b0,beamFocusX_reg_b1,beamFocusX_reg_b2,beamFocusX_reg_b3;
  114. double beamPeakX_reg_b0,beamPeakX_reg_b1,beamPeakX_reg_b2,beamPeakX_reg_b3;
  115. double beamSidebandNoise_b0, beamSidebandNoise_b1, beamSidebandNoise_b2, beamSidebandNoise_b3 ;
  116. int sidenumtocalc_b0,sidenumtocalc_b1,sidenumtocalc_b2,sidenumtocalc_b3;
  117. size_t size = 5;
  118. const int length = 100; //length of the rolling average
  119. double array_b0[length] = {0.};
  120. double array_b1[length] = {0.};
  121. double array_b2[length] = {0.};
  122. double array_b3[length] = {0.};
  123. double arrayavg_b0 = 0.;
  124. double arrayavg_b1 = 0.;
  125. double arrayavg_b2 = 0.;
  126. double arrayavg_b3 = 0.;
  127. bool graphsaved_b0 = false;
  128. bool graphsaved_b1 = false;
  129. bool graphsaved_b2 = false;
  130. bool graphsaved_b3 = false;
  131. TVector beamontime(0,3,0.,0.,0.,0.,"END");
  132. TVector * beamontime_ptr = &beamontime;
  133. double calibration_b0[128] = {0.};
  134. double calibration_b1[128] = {0.};
  135. double calibration_b2[128] = {0.};
  136. double calibration_b3[128] = {0.};
  137. TF1 * gausfunc_b0 = new TF1("gausfunc_b0","gaus(0)+[3]");
  138. TF1 * gausfunc_b1 = new TF1("gausfunc_b1","gaus(0)+[3]");
  139. TGraphErrors * gausgraph_b0;
  140. TGraphErrors * gausgraph_b1;
  141. Int_t lastfit_b0 = 0;
  142. Int_t lastfit_b1 = 0;
  143. double errorx[128];
  144. double errory[128];
  145. bool samplenoise = false;
  146. bool beam_off = true;
  147. bool beam_wason = false;
  148. int beamoffcounter = 0;
  149. int beamoncounter = 0;
  150. Double_t mybeta = 0.;
  151. Double_t lorentz_gamma = 0.;
  152. Double_t zsqr = 0.;
  153. Double_t sp_air = 0.;
  154. Double_t sp_ps = 0.;
  155. Double_t sp2_air = 0.;
  156. Double_t sp2_ps = 0.;
  157. Double_t intcorr = 1.;
  158. Double_t x, q, median;
  159. TF1 * f_sp_air = new TF1("f_sp_air","[0]*pow(x,[1])+[2]", 50, 250); //stopping power of protons in Air [MeV cm2 /g]
  160. TF1 * f_sp_ps = new TF1("f_sp_ps","[0]*pow(x,[1])+[2]", 50, 250); //stopping power of protons in polystyrene [MeV cm2 /g]
  161. TF1 * f_h2sp_air = new TF1("f_h2sp_air","[0]*pow(x,[1])+[2]", 50, 250); //stopping power of helium in air [MeV cm2 /g]
  162. TF1 * f_h2sp_ps = new TF1("f_h2sp_ps","[0]*pow(x,[1])+[2]", 50, 250); //stopping power of helium in polystyrene [MeV cm2 /g]
  163. TF1 * f_c12sp_air = new TF1("f_c12sp_air","[0]*pow(x,[1])+[2]", 80, 480); //stopping power of carbon in air [MeV cm2 /g]
  164. TF1 * f_c12sp_ps = new TF1("f_c12sp_ps","[0]*pow(x,[1])+[2]", 80, 480); //stopping power of carbon in polystyrene [MeV cm2 /g]
  165. TF1 * f_o16sp_air = new TF1("f_o16sp_air","[0]*pow(x,[1])+[2]", 80, 480); //stopping power of oxygen in air [MeV cm2 /g]
  166. TF1 * f_o16sp_ps = new TF1("f_o16sp_ps","[0]*pow(x,[1])+[2]", 80,480); //stopping power of oxygen in polystyrene [MeV cm2 /g]
  167. ///// ic1/SP intensity correction factor = 19.8E6+/-0.1E6 particles/s per nA/(Mevcm2/g)
  168. /// compile with:
  169. //// $ make clean; make
  170. /// run with:
  171. //// $ ./convert <path to data> <run>
  172. //// $ ./convert /work/leverington/beamprofilemonitor/hitdata/HIT_17_12_2017/ run2
  173. int analyse(int argc, char **argv)
  174. {
  175. f_sp_air->SetParameters(303.746, -0.873697,1.01335); //protons between 50 and 300 MeV
  176. f_sp_ps->SetParameters(361.936, -0.892255, 1.19133); //protons between 50 and 220 MeV
  177. f_h2sp_air->SetParameters(1236.51, -0.880225, 4.17041); //helium between 50 and 300 MeV
  178. f_h2sp_ps->SetParameters(1387.08, -0.882686,4.60833); //heelium between 50 and 300 MeV
  179. f_c12sp_air->SetParameters(13291.2, -0.925464,45.3876); //carbon between 80 and 480 MeV
  180. f_c12sp_ps->SetParameters(14538.9, -0.922423,49.2859); //carbon between 80 and 480 MeV
  181. f_o16sp_air->SetParameters(24624.9, -0.925425,80.6828); //oxygen between 80 and 480 MeV
  182. f_o16sp_ps->SetParameters(26465.6, -0.928309,88.6728); //oxygen between 80 and 480 MeV
  183. // TVirtualFitter::SetDefaultFitter("Minuit2");
  184. // TVirtualFitter::SetPrecision(0.1);
  185. // std::cout << "Default Fitter:" << TVirtualFitter::GetDefaultFitter() << std::endl;
  186. //initialise some values;
  187. for (int i = 0;i<128;i++){
  188. board_b0_ch_bkg[i] = 0.;
  189. board_b1_ch_bkg[i] = 0.;
  190. board_b2_ch_bkg[i] = 0.;
  191. board_b3_ch_bkg[i] = 0.;
  192. channellist_gsl_b0[i] = 0;
  193. channellist_gsl_b1[i] = 0;
  194. channellist_gsl_b2[i] = 0;
  195. channellist_gsl_b3[i] = 0;
  196. calibration_b0[i] = 1.0;
  197. calibration_b1[i] = 1.0;
  198. calibration_b2[i] = 1.0;
  199. calibration_b3[i] = 1.0;
  200. errorx[i]=17.;
  201. errory[i]=17.;
  202. if (i<64) {pos[i] = double(i);}
  203. else {pos[i] = double(i) + 0.2; }
  204. }
  205. if (argc > 1){
  206. //open the file names specified in the command line
  207. char * ethercatfile = argv[3];
  208. // argv[1]= "/work/leverington/beamprofilemonitor/hitdata/HIT_17_12_2017/";
  209. // argv[2]= "Run11"
  210. char * filename = Form("%s%s.dat",argv[1],argv[2]);
  211. char * timestampfilename = Form("%s%s_timestamp.csv",argv[1],argv[2]);
  212. char * rootfilename = Form("%s/root/%s.root",argv[1],argv[2]);
  213. ifstream file(filename, ifstream::in | ifstream::binary);
  214. ifstream timestampfile(timestampfilename, ifstream::in);
  215. if (!file.is_open()){
  216. printf(".dat did not open.\n");
  217. return -1; //file could not be opened
  218. }
  219. if (!timestampfile.is_open()){
  220. printf("timestamp.csv did not open.\n");
  221. ethercat = false;
  222. //return -1; //file could not be opened
  223. }
  224. ///some variables to get the data
  225. // int number_of_records_to_read = 4*10;
  226. // BufferData* buffer = new BufferData[number_of_records_to_read];
  227. //if(argc > 4) {
  228. // framestart = atoi(argv[3]);
  229. // frameend = atoi(argv[4]);
  230. // }
  231. int board_b = -1;
  232. long int fileframesize = getFileSize(filename) / ( 4*sizeof(BufferData) );
  233. BufferData* dataptr = new BufferData();
  234. if (fileframesize>0){
  235. std::cout << "Number of frames:" << fileframesize << std::endl;
  236. //open ROOT file for saving histos and TTree.
  237. TFile *rootFile = new TFile(rootfilename,"RECREATE");
  238. if ( rootFile->IsOpen() ) printf("ROOT file opened successfully\n");
  239. TH2D * th2_signal_vs_channel_b0 = new TH2D("th2_signal_vs_channel_b0","th2_signal_vs_channel_b0",128,0,128,2200,-1000,10000);
  240. TH2D * th2_signal_vs_channel_b1 = new TH2D("th2_signal_vs_channel_b1","th2_signal_vs_channel_b1",128,0,128,2200,-1000,10000);
  241. TH2D * th2_signal_vs_channel_b2 = new TH2D("th2_signal_vs_channel_b2","th2_signal_vs_channel_b2",128,0,128,2200,-1000,10000);
  242. TH2D * th2_signal_vs_channel_b3 = new TH2D("th2_signal_vs_channel_b3","th2_signal_vs_channel_b3",128,0,128,2200,-1000,10000);
  243. TH2D * th2_signal_vs_channel_sub_b0 = new TH2D("th2_signal_vs_channel_sub_b0","th2_signal_vs_channel_sub_b0",128,0,128,2200,-1000,10000);
  244. TH2D * th2_signal_vs_channel_sub_b1 = new TH2D("th2_signal_vs_channel_sub_b1","th2_signal_vs_channel_sub_b1",128,0,128,2200,-1000,10000);
  245. TH2D * th2_signal_vs_channel_sub_b2 = new TH2D("th2_signal_vs_channel_sub_b2","th2_signal_vs_channel_sub_b2",128,0,128,2200,-1000,10000);
  246. TH2D * th2_signal_vs_channel_sub_b3 = new TH2D("th2_signal_vs_channel_sub_b3","th2_signal_vs_channel_sub_b3",128,0,128,2200,-1000,10000);
  247. TH1D * th1_signal_b0 = new TH1D("th1_signal_b0","th1_signal_b0",2200,-10000,50000);
  248. TH1D * th1_signal_b1 = new TH1D("th1_signal_b1","th1_signal_b1",2200,-10000,50000);
  249. TH1D * th1_signal_b2 = new TH1D("th1_signal_b2","th1_signal_b2",2200,-10000,50000);
  250. TH1D * th1_signal_b3 = new TH1D("th1_signal_b3","th1_signal_b3",2200,-10000,50000);
  251. TH1D * h_regresidual_b0 = new TH1D("h_regresidual_b0","h_regresidual_b0", 200,-.20,.20);
  252. TH1D * h_regresidual_b1 = new TH1D("h_regresidual_b1","h_regresidual_b1", 200,-.20,.20);
  253. TH1D * h_regresidual_b2 = new TH1D("h_regresidual_b2","h_regresidual_b2", 200,-.20,.20);
  254. TH1D * h_regresidual_b3 = new TH1D("h_regresidual_b3","h_regresidual_b3", 200,-.20,.20);
  255. TGraph * graph_bkg_b0 = new TGraph();
  256. TGraph * graph_bkg_b1 = new TGraph();
  257. TGraph * graph_bkg_b2 = new TGraph();
  258. TGraph * graph_bkg_b3 = new TGraph();
  259. TGraph * gr_b0;
  260. TGraph * gr_sm_b0;
  261. TGraph * gr_b1;
  262. TGraph * gr_sm_b1;
  263. TGraph * gr_b2;
  264. TGraph * gr_sm_b2;
  265. TGraph * gr_b3;
  266. TGraph * gr_sm_b3;
  267. TH2D * th2_signal_vs_channel_bkg_b0 = new TH2D("th2_signal_vs_channel_bkg_b0","th2_signal_vs_channel_bkg_b0",128,0,128,1000,-500,500);
  268. TH2D * th2_signal_vs_channel_bkg_b1 = new TH2D("th2_signal_vs_channel_bkg_b1","th2_signal_vs_channel_bkg_b1",128,0,128,1000,-500,500);
  269. TH2D * th2_signal_vs_channel_bkg_b2 = new TH2D("th2_signal_vs_channel_bkg_b2","th2_signal_vs_channel_bkg_b2",128,0,128,1000,-500,500);
  270. TH2D * th2_signal_vs_channel_bkg_b3 = new TH2D("th2_signal_vs_channel_bkg_b3","th2_signal_vs_channel_bkg_b3",128,0,128,1000,-500,500);
  271. TH2D * th2_resid_vs_channel_bkg_b0 = new TH2D("th2_resid_vs_channel_bkg_b0","th2_resid_vs_channel_bkg_b0",128,0,128,300,-.15,.15);
  272. TH2D * th2_resid_vs_channel_bkg_b1 = new TH2D("th2_resid_vs_channel_bkg_b1","th2_resid_vs_channel_bkg_b1",128,0,128,300,-.15,.15);
  273. TH2D * th2_resid_vs_channel_bkg_b2 = new TH2D("th2_resid_vs_channel_bkg_b2","th2_resid_vs_channel_bkg_b2",128,0,128,300,-.15,.15);
  274. TH2D * th2_resid_vs_channel_bkg_b3 = new TH2D("th2_resid_vs_channel_bkg_b3","th2_resid_vs_channel_bkg_b3",128,0,128,300,-.15,.15);
  275. TH1D* h_beamSignal_b0[30];
  276. TH1D* h_beamSignal_b1[30];
  277. TH1D* h_beamSignal_b2[30];
  278. TH1D* h_beamSignal_b3[30];
  279. int energy_indexbin = 0;
  280. char histname[30] = "";
  281. TH1D* h_beamSignal_ic1[30];
  282. TH1D* h_beamSignal_cor_b0[30];
  283. TH1D* h_beamSignal_cor_b1[30];
  284. TH1D* h_beamSignal_cor_b2[30];
  285. TH1D* h_beamSignal_cor_b3[30];
  286. Double_t beamSignal_cor_b0_mean[30];
  287. Double_t beamSignal_cor_b1_mean[30];
  288. Double_t beamSignal_cor_b2_mean[30];
  289. Double_t beamSignal_cor_b3_mean[30];
  290. Double_t mybeta_graph[30];
  291. for (int iii=0; iii<=29; iii++){
  292. sprintf(histname,"h_beamSignal_b0_%d",iii);
  293. h_beamSignal_b0[iii] = new TH1D(histname,histname,200,0,100000);
  294. sprintf(histname,"h_beamSignal_b1_%d",iii);
  295. h_beamSignal_b1[iii] = new TH1D(histname,histname,200,0,100000);
  296. sprintf(histname,"h_beamSignal_b2_%d",iii);
  297. h_beamSignal_b2[iii] = new TH1D(histname,histname,200,0,100000);
  298. sprintf(histname,"h_beamSignal_b3_%d",iii);
  299. h_beamSignal_b3[iii] = new TH1D(histname,histname,200,0,100000);
  300. }
  301. for (int iii=0; iii<=29; iii++){
  302. sprintf(histname,"h_beamSignal_cor_b0_%d",iii);
  303. h_beamSignal_cor_b0[iii] = new TH1D(histname,histname,200,0,10);
  304. sprintf(histname,"h_beamSignal_cor_b1_%d",iii);
  305. h_beamSignal_cor_b1[iii] = new TH1D(histname,histname,200,0,10.);
  306. sprintf(histname,"h_beamSignal_cor_b2_%d",iii);
  307. h_beamSignal_cor_b2[iii] = new TH1D(histname,histname,200,0,10.);
  308. sprintf(histname,"h_beamSignal_cor_b3_%d",iii);
  309. h_beamSignal_cor_b3[iii] = new TH1D(histname,histname,200,0,10.);
  310. sprintf(histname,"h_beamSignal_ic1_%d",iii);
  311. h_beamSignal_ic1[iii] = new TH1D(histname,histname,200,0,1000.);
  312. }
  313. TTree *rootTree = new TTree("t","HIT Data Root Tree");
  314. rootTree->Branch("beamPosX_reg_b0",&beamPosX_reg_b0,"beamPosX_reg_b0/D");
  315. rootTree->Branch("beamPosX_reg_b1",&beamPosX_reg_b1,"beamPosX_reg_b1/D");
  316. rootTree->Branch("beamPosX_reg_b2",&beamPosX_reg_b2,"beamPosX_reg_b2/D");
  317. rootTree->Branch("beamPosX_reg_b3",&beamPosX_reg_b3,"beamPosX_reg_b3/D");
  318. rootTree->Branch("beamFocusX_reg_b0",&beamFocusX_reg_b0,"beamFocusX_reg_b0/D");
  319. rootTree->Branch("beamFocusX_reg_b1",&beamFocusX_reg_b1,"beamFocusX_reg_b1/D");
  320. rootTree->Branch("beamFocusX_reg_b2",&beamFocusX_reg_b2,"beamFocusX_reg_b2/D");
  321. rootTree->Branch("beamFocusX_reg_b3",&beamFocusX_reg_b3,"beamFocusX_reg_b3/D");
  322. rootTree->Branch("beamPeakX_reg_b0",&beamPeakX_reg_b0,"beamPeakX_reg_b0/D");
  323. rootTree->Branch("beamPeakX_reg_b1",&beamPeakX_reg_b1,"beamPeakX_reg_b1/D");
  324. rootTree->Branch("beamPeakX_reg_b2",&beamPeakX_reg_b2,"beamPeakX_reg_b2/D");
  325. rootTree->Branch("beamPeakX_reg_b3",&beamPeakX_reg_b3,"beamPeakX_reg_b3/D");
  326. rootTree->Branch("beamRsqr_b0",&beamRsqr_b0,"beamRsqr_b0/D");
  327. rootTree->Branch("beamRsqr_b1",&beamRsqr_b1,"beamRsqr_b1/D");
  328. rootTree->Branch("beamRsqr_b2",&beamRsqr_b2,"beamRsqr_b2/D");
  329. rootTree->Branch("beamRsqr_b3",&beamRsqr_b3,"beamRsqr_b3/D");
  330. rootTree->Branch("sp2_ps",&sp2_ps,"sp2_ps/D");
  331. rootTree->Branch("sp2_air",&sp2_air,"sp2_air/D");
  332. rootTree->Branch("mybeta",&mybeta,"mybeta/D");
  333. rootTree->Branch("beamSkewX_b0",&beamSkewX_b0,"beamSkewX_b0/D");
  334. rootTree->Branch("beamSkewX_b1",&beamSkewX_b1,"beamSkewX_b1/D");
  335. rootTree->Branch("beamSkewX_b2",&beamSkewX_b2,"beamSkewX_b2/D");
  336. rootTree->Branch("beamSkewX_b3",&beamSkewX_b3,"beamSkewX_b3/D");
  337. rootTree->Branch("beamKurtX_b0",&beamKurtX_b0,"beamKurtX_b0/D");
  338. rootTree->Branch("beamKurtX_b1",&beamKurtX_b1,"beamKurtX_b1/D");
  339. rootTree->Branch("beamKurtX_b2",&beamKurtX_b2,"beamKurtX_b2/D");
  340. rootTree->Branch("beamKurtX_b3",&beamKurtX_b3,"beamKurtX_b3/D");
  341. rootTree->Branch("beamNumX_b0",&numtocalc_b0,"beamNumX_b0/I");
  342. rootTree->Branch("beamNumX_b1",&numtocalc_b1,"beamNumX_b1/I");
  343. rootTree->Branch("beamNumX_b2",&numtocalc_b2,"beamNumX_b2/I");
  344. rootTree->Branch("beamNumX_b3",&numtocalc_b3,"beamNumX_b3/I");
  345. rootTree->Branch("beamSignal_b0",&signal_b0,"beamSignal_b0/D");
  346. rootTree->Branch("beamSignal_b1",&signal_b1,"beamSignal_b1/D");
  347. rootTree->Branch("beamSignal_b2",&signal_b2,"beamSignal_b2/D");
  348. rootTree->Branch("beamSignal_b3",&signal_b3,"beamSignal_b3/D");
  349. rootTree->Branch("beamSignal_cor_b0",&signal_cor_b0,"beamSignal_cor_b0/D");
  350. rootTree->Branch("beamSignal_cor_b1",&signal_cor_b1,"beamSignal_cor_b1/D");
  351. rootTree->Branch("beamSignal_cor_b2",&signal_cor_b2,"beamSignal_cor_b2/D");
  352. rootTree->Branch("beamSignal_cor_b3",&signal_cor_b3,"beamSignal_cor_b3/D");
  353. rootTree->Branch("eventID",&eventID,"eventID/I");
  354. //rootTree->Branch("board_b0_ch",&board_b0_ch,"board_b0_ch[128]/D");
  355. //rootTree->Branch("board_b1_ch",&board_b1_ch,"board_b1_ch[128]/D");
  356. //rootTree->Branch("board_b2_ch",&board_b2_ch,"board_b2_ch[128]/D");
  357. //rootTree->Branch("board_b3_ch",&board_b3_ch,"board_b3_ch[128]/D");
  358. rootTree->Branch("arrayavg_b0",&arrayavg_b0,"arrayavg_b0/D");
  359. rootTree->Branch("arrayavg_b1",&arrayavg_b1,"arrayavg_b1/D");
  360. rootTree->Branch("arrayavg_b2",&arrayavg_b2,"arrayavg_b2/D");
  361. rootTree->Branch("arrayavg_b3",&arrayavg_b3,"arrayavg_b3/D");
  362. rootTree->Branch("M1elements_b0",&M1elements_b0,"M1elements_b0[9]/D");
  363. rootTree->Branch("M1elements_b1",&M1elements_b1,"M1elements_b1[9]/D");
  364. rootTree->Branch("M1elements_b2",&M1elements_b2,"M1elements_b2[9]/D");
  365. rootTree->Branch("M1elements_b3",&M1elements_b3,"M1elements_b3[9]/D");
  366. double time;
  367. // import and align matching ethercat data
  368. TTree *tree2 = new TTree("t2", "t2");
  369. if(ethercat){
  370. std::cout << " Loading Ethercat data." << std::endl;
  371. tree2->ReadFile(ethercatfile, "RELTIME2/D:IC1/D:MW1_POSX/D:MW1_POSY/D:ANALOG_IN1/D:ENERGY_INDEX/D:INTENSITY_INDEX/D:ION-SORT/D:TIME2/D", '\t');
  372. std::cout << "Ethercat data loaded." << std::endl;
  373. tree2->Print();
  374. }
  375. int k = 0;
  376. // int count = 0;
  377. double ic1, ic2, mw1_focusx, mw1_focusy, mw2_focusx, mw2_focusy, mw1_posx, mw1_posy, mw2_posx, mw2_posy;
  378. double ic1_avg, ic2_avg, mw1_focusx_avg, mw1_focusy_avg, mw2_focusx_avg, mw2_focusy_avg, mw1_posx_avg, mw1_posy_avg, mw2_posx_avg, mw2_posy_avg;
  379. double analog_in1;
  380. double energy_index;
  381. double energy;
  382. double energy_list_p[27] = {48.12, 59.82, 70.03, 79.17, 87.53, 95.3, 102.61, 109.56, 116.2, 122.57, 128.72, 134.65, 140.41, 146.01, 151.5, 156.89, 162.21, 167.46, 172.62, 177.7, 184.81, 191.87, 198.76, 205.48, 212.06, 218.51, 0.};
  383. double energy_list_he[27] = {50.57, 61.86, 71.73, 80.64, 88.85, 96.52, 103.76, 110.64, 117.23, 123.55, 129.64, 135.55, 141.27, 146.84, 152.26, 157.56, 162.73, 167.8, 172.77, 177.64, 184.56, 191.54, 198.36, 205.03, 211.57, 217.98, 0.};
  384. double energy_list_c[27] = {88.83,110.58,129.79,147.13,163.09,178.01,192.13,205.6,218.52,230.98,243.03,254.71,266.08,277.19,288.1,298.87,309.52,320.07,330.48,340.77,355.22,369.64,383.78,397.66,411.32,424.77,0.};
  385. double energy_list_o[27] = {103.77, 129.65, 152.42, 172.98, 191.96, 209.63, 226.53, 242.58, 258.11, 273.04, 287.5, 301.55, 315.32, 328.61, 341.84, 354.88, 367.94, 380.48, 393.09, 405.65, 423.23, 440.82, 458.11, 475.28, 491.93, 508.38, 0.};
  386. double intensity_index;
  387. double intensity;
  388. double intensity_list_p[16] = {0., 8.00E+07, 1.20E+08, 2.00E+08, 3.20E+08,4.00E+08, 6.00E+08, 8.00E+08, 1.20E+09, 2.00E+09, 3.20E+09, 4.00E+09, 6.00E+09, 8.00E+09, 1.20E+10, 2.00E+10};
  389. double intensity_list_he[16] = { 0., 2.00E+07, 3.00E+07, 5.00E+07, 8.00E+07, 1.00E+08, 1.50E+08, 2.00E+08, 3.00E+08, 5.00E+08, 8.00E+08, 1.00E+09, 1.50E+09, 2.00E+09, 3.00E+09, 5.00E+09};
  390. double intensity_list_c[16] = {0.,2.00E+06, 3.00E+06, 5.00E+06, 8.00E+06, 1.00E+07, 1.50E+07, 2.00E+07, 3.00E+07, 5.00E+07, 8.00E+07, 1.00E+08, 1.50E+08, 2.00E+08, 3.00E+08, 5.00E+08};
  391. double intensity_list_o[16] = {0., 1.00E+06, 1.50E+06, 2.50E+06, 4.00E+06, 5.00E+06, 8.00E+06, 1.00E+07, 1.50E+07, 2.50E+07, 4.00E+07, 5.00E+07, 8.00E+07, 1.00E+08, 1.50E+08, 2.50E+08 };
  392. double ionsort;
  393. double rel_time2,time2;
  394. double timeoffset;
  395. int mwoffset;
  396. double timewindow;
  397. double timeoffset2;
  398. double timewindow2;
  399. if(ethercat){
  400. rootTree->Branch("ic1_avg", &ic1_avg, "ic1_avg/D");
  401. rootTree->Branch("mw1_posx", &mw1_posx_avg, "mw1_posx/D");
  402. rootTree->Branch("mw1_posy", &mw1_posy_avg, "mw1_posy/D");
  403. rootTree->Branch("energy_index", &energy_index, "energy_index/D");
  404. rootTree->Branch("intensity_index", &intensity_index, "intensity_index/D");
  405. rootTree->Branch("ionsort", &ionsort, "ionsort/D");
  406. timeoffset = -0.050; //offset between ic and bpm readouts
  407. mwoffset = 2; // offset for timestamped event. MW chamber position correlation seems to be better in other windows
  408. timewindow = -0.0999; //should be a negative number. window size in time to average over.
  409. timeoffset2 = -0.00; //offset between ic and bpm readouts
  410. timewindow2 = -0.0999; //should be a negative number. window size in time to average over.
  411. //////////////////////////////////////////////////////////////////
  412. ///// ETHERCAT DATA
  413. //////////////////////////////////////////////////////////////////
  414. // tree->SetBranchAddress("time", &time);
  415. tree2->SetBranchAddress("RELTIME2", &rel_time2);
  416. tree2->SetBranchAddress("TIME2", &time2);
  417. tree2->SetBranchAddress("IC1", &ic1);
  418. // tree2->SetBranchAddress("IC2", &ic2);
  419. //tree2->SetBranchAddress("MW1_FOCUSX", &mw1_focusx);
  420. //tree2->SetBranchAddress("MW1_FOCUSY", &mw1_focusy);
  421. ///tree2->SetBranchAddress("MW2_FOCUSX", &mw2_focusx);
  422. ///tree2->SetBranchAddress("MW2_FOCUSY", &mw2_focusy);
  423. tree2->SetBranchAddress("MW1_POSX", &mw1_posx);
  424. tree2->SetBranchAddress("MW1_POSY", &mw1_posy);
  425. //tree2->SetBranchAddress("MW2_POSX", &mw2_posx);
  426. //tree2->SetBranchAddress("MW2_POSY", &mw2_posy);
  427. tree2->SetBranchAddress("ENERGY_INDEX", &energy_index);
  428. tree2->SetBranchAddress("INTENSITY_INDEX", &intensity_index);
  429. tree2->SetBranchAddress("ION-SORT", &ionsort);
  430. tree2->SetBranchAddress("ANALOG_IN1", &analog_in1);
  431. }
  432. int currentEntryTree2 = 1;
  433. // int nevents = tree->GetEntries();
  434. int nevents2 = tree2->GetEntries();
  435. int icCounter = 0;
  436. int count = 0;
  437. int count2 = 0;
  438. //loop through recorded data frames
  439. for (int frame = 0; frame<fileframesize; frame++){
  440. // if (icCounter>10000) break;
  441. // if(frame>2000&&frame<120000) continue;
  442. eventID = frame;
  443. if (ethercat){
  444. if (timestampfile) timestampfile >> time ;
  445. //printf("%i %f\n", eventID, time);
  446. count= 0;
  447. count2 = 0;
  448. ic1_avg = 0.;
  449. mw1_posx_avg = 0.;
  450. mw1_posy_avg = 0.;
  451. tree2->GetEntry(currentEntryTree2);
  452. /* if (frame % 100 == 0)
  453. {
  454. printf("merging event %d ,", frame);
  455. printf("Time %f \n", time);
  456. printf("Entry hit %d ,", currentEntryTree2);
  457. printf("Time hit %f \n", time2);
  458. }
  459. */
  460. while (time2 < time + timeoffset && currentEntryTree2 < nevents2 )
  461. {
  462. if (time2 - time - timeoffset > timewindow)
  463. {
  464. tree2->GetEntry(currentEntryTree2);
  465. if (ic1>0.0) ic1_avg += ic1;
  466. if (ic1>0.0) count++;
  467. // if (frame % 200 == 0) printf("%i %2.3f %2.3f %2.3f %2.3f %2.3f %i \n", count, ic1, time2, time, timeoffset, time2 - time - timeoffset, mwoffset);
  468. }
  469. tree2->GetEntry(currentEntryTree2);
  470. if ( time2 - time - timeoffset2 > timewindow2)
  471. {
  472. tree2->GetEntry(currentEntryTree2 + mwoffset); //why currentEtryTree2-4?
  473. mw1_posx_avg += mw1_posx;
  474. mw1_posy_avg += mw1_posy;
  475. count2++;
  476. // if (i % 2000 == 0) printf("%i %2.3f %2.3f %2.3f %2.3f\n", count2, time, time2, ic1, mw1_posx);
  477. //if (i % 2001 == 0) printf("%i %2.3f %2.3f %2.3f %2.3f\n", count2, time, time2, ic1, mw1_posx);
  478. // if (i % 2002 == 0) printf("%i %2.3f %2.3f %2.3f %2.3f\n", count2, time, time2, ic1, mw1_posx);
  479. // printf("%i %2.3f %2.3f %2.3f %2.3f\n", count2, time, time2, ic1, mw1_posx);
  480. }
  481. // currentEntryTree2++;
  482. tree2->GetEntry(currentEntryTree2);
  483. currentEntryTree2++;
  484. if (count2>0){
  485. mw1_posx_avg /= double(count2); //the positions are weighted by the charge
  486. mw1_posy_avg /= double(count2);
  487. }
  488. if(count>0){
  489. ic1_avg /= double(count);
  490. if (ic1_avg>1.) icCounter++;
  491. // if (frame % 2000 == 0) printf("%i %f.2 %i \n", count, ic1_avg, icCounter);
  492. }
  493. // std::cout << ic1_avg << " " << icCounter << std::endl;
  494. }
  495. /////////end of ethercat matching
  496. if (floor(energy_index/10.)>=0&&floor(energy_index/10)<=26){energy_indexbin = floor(energy_index/10.);}
  497. else {energy_indexbin=27;}
  498. if (ionsort==3){
  499. //protons
  500. energy = energy_list_p[ energy_indexbin];
  501. intensity = intensity_list_p[ int(intensity_index) ];
  502. sp_air = f_sp_air->Eval(energy)*(intensity/1.0E6);
  503. sp_ps = f_sp_ps->Eval(energy)*(intensity/1.0E6);
  504. sp2_air = f_sp_air->Eval(energy);
  505. sp2_ps = f_sp_ps->Eval(energy);
  506. lorentz_gamma = energy/938.272 +1.; // lorentz_gamma = E_u/M_u +1
  507. mybeta = sqrt(1. - 1./(lorentz_gamma*lorentz_gamma));
  508. zsqr = 1.;
  509. }
  510. else if (ionsort==1){
  511. //helium
  512. energy = energy_list_he[ energy_indexbin ];
  513. intensity = intensity_list_he[ int(intensity_index) ];
  514. sp_air = f_h2sp_air->Eval(energy)*(intensity/1.0E6);
  515. sp_ps = f_h2sp_ps->Eval(energy)*(intensity/1.0E6);
  516. sp2_air = f_h2sp_air->Eval(energy);
  517. sp2_ps = f_h2sp_ps->Eval(energy);
  518. lorentz_gamma = energy/932.1055 +1.;// lorentz_gamma = E_u/M_u +1
  519. mybeta = sqrt(1. - 1./(lorentz_gamma*lorentz_gamma));
  520. zsqr = 4.;
  521. }
  522. else if (ionsort==4){
  523. //carbon
  524. energy = energy_list_c[ energy_indexbin];
  525. intensity = intensity_list_c[ int(intensity_index) ];
  526. sp_air = f_c12sp_air->Eval(energy)*(intensity/1.0E6);
  527. sp_ps = f_c12sp_ps->Eval(energy)*(intensity/1.0E6);
  528. sp2_air = f_c12sp_air->Eval(energy);
  529. sp2_ps = f_c12sp_ps->Eval(energy);
  530. lorentz_gamma = energy/932.3539 +1.;// lorentz_gamma = E_u/M_u +1
  531. mybeta = sqrt(1. - 1./(lorentz_gamma*lorentz_gamma));
  532. zsqr = 36.;
  533. }
  534. else if (ionsort==2){
  535. //oxygen
  536. energy = energy_list_o[ energy_indexbin];
  537. intensity = intensity_list_o[ int(intensity_index) ];
  538. sp_air = f_o16sp_air->Eval(energy)*(intensity/1.0E6);
  539. sp_ps = f_o16sp_ps->Eval(energy)*(intensity/1.0E6);
  540. sp2_air = f_o16sp_air->Eval(energy);
  541. sp2_ps = f_o16sp_ps->Eval(energy);
  542. lorentz_gamma = energy/931.4418 +1.;// lorentz_gamma = E_u/M_u +1
  543. mybeta = sqrt(1. - 1./(lorentz_gamma*lorentz_gamma));
  544. zsqr = 64.;
  545. }
  546. else {
  547. sp_air = -1.;
  548. sp_ps = -1.;
  549. sp2_air = -1.;
  550. sp2_ps = -1.;
  551. lorentz_gamma = 0.;
  552. mybeta = 0.;
  553. zsqr = -1.;
  554. }
  555. // intcorr = (Intensity /19.8E6) / (totalcurrent/sp2_air/totaltime);
  556. intcorr = (intensity / 19.8E6) / (ic1_avg/sp2_air)/ 3.11;
  557. // if (frame>2000&&ic1_avg<0.5) continue;
  558. }
  559. ///////////////////////////////////
  560. //// HIT DATA
  561. ///////////////////////////////////
  562. if (frame>2000 && beam_wason == true && beam_off == true) { beamoffcounter++;
  563. // cout << beamoffcounter<< endl;
  564. }
  565. if (samplenoise==false && frame> 2000 && beam_wason == true && beam_off == true && beamoffcounter==5000) {
  566. samplenoise = true;
  567. }
  568. //board_b 0
  569. board_b=0;
  570. signal_b0 = 0.;
  571. maxchannelamp_b0 = 0.;
  572. file.seekg(framestart*sizeof(BufferData)+board_b*sizeof(BufferData)+4*frame*sizeof(BufferData));
  573. file.read ((char*)dataptr ,sizeof(BufferData));
  574. if (dataptr->sync_frame.device_nr==board_b){
  575. // std::cout << frame << " " << dataptr->sync_frame.device_nr << " " << dataptr->sync_frame.local_ctr << " " << dataptr->sync_frame.global_ctr << " " << dataptr->sync_frame.sma_state << std::endl;
  576. if (frame%10000==0) std::cout << "Frame: " << frame << " (" <<double(frame)/double(fileframesize)*100.0 << "%)" << std::endl;
  577. arrayavg_b0 = 0;
  578. //shift the events of the rolling average of the signal one left
  579. for (int j = 1; j<length;j++){
  580. array_b0[j-1] = array_b0[j];
  581. arrayavg_b0 += array_b0[j-1];
  582. // cout << array_b0[j-1] << " ";
  583. }
  584. array_b0[length-1] = 0.;
  585. // cout << endl;
  586. ///loop over the channels
  587. for (int i = 0;i<128;i++){
  588. board_b0_ch[i] = dataptr->sensor_data[i];
  589. if (frame<1000 || samplenoise==true){
  590. if (samplenoise==true&& beamoffcounter==5000) {
  591. board_b0_ch_bkg[i]=0.;
  592. if(i==0) cout << frame << " Resampling noise " << beamoffcounter << endl;
  593. }
  594. board_b0_ch_bkg[i] += board_b0_ch[i]/1000.; //find baseline from the average of first 1000 events
  595. if (samplenoise==true && beamoffcounter==6000) {
  596. beam_wason = false;
  597. samplenoise =false;
  598. cout << frame << " End sampling." << endl;
  599. }
  600. }
  601. else if (frame>=1000&& frame<2000){
  602. board_b0_ch[i] -= board_b0_ch_bkg[i]; //histogram the subtracted baseline in the next 1000 events
  603. th2_signal_vs_channel_bkg_b0->Fill(i,board_b0_ch[i]);
  604. if (i==1) graph_bkg_b0->SetPoint(graph_bkg_b0->GetN(), frame, board_b0_ch[i]);
  605. }
  606. else if (frame>=2000 && samplenoise==false) {
  607. board_b0_ch[i]-=board_b0_ch_bkg[i]; // the rest background subtracted
  608. // board_b0_ch[i]*=calibration_b0[i]; //calibration factor
  609. th2_signal_vs_channel_b0->Fill(i,board_b0_ch[i]);
  610. //find the peak channel
  611. if (board_b0_ch[i]> maxchannelamp_b0) {
  612. maxchannel_b0 = i;
  613. maxchannelamp_b0 = board_b0_ch[i];
  614. // cout << maxchannel_b0 << " " <<maxchannelamp_b0 << endl;
  615. }
  616. ///add new event to the rolling average.
  617. if( board_b0_ch[i]>50.0){
  618. array_b0[length-1] += board_b0_ch[i];
  619. }
  620. ////////////////////////////////////////////
  621. }
  622. }//end of 128
  623. // th1_signal_b0->Fill(signal_b0);
  624. if (frame>2000) {
  625. arrayavg_b0 += array_b0[length-1]/length;
  626. if (arrayavg_b0>= 20000) {
  627. beamoncounter++;
  628. }
  629. if (beamoncounter>1000 && beam_wason == false && arrayavg_b0>= 20000) {
  630. beam_off = false;
  631. beam_wason = true;
  632. cout << frame << " Beam on " << arrayavg_b0 << endl;
  633. }
  634. if (arrayavg_b0< 10000) {
  635. if(beam_wason== true && beam_off==false ) {
  636. cout << frame << "Beam went OFF!" << arrayavg_b0 << endl;
  637. beamoffcounter = 0;
  638. }
  639. beam_off = true;
  640. }
  641. }
  642. // cout << frame << " Rolling average: " << arrayavg_b0 << endl;// " ic: " << ic1_avg << endl;
  643. }
  644. else {
  645. std::cout << "Error." << std::endl;
  646. }
  647. //board_b 1
  648. board_b=1;
  649. signal_b1 = 0.;
  650. maxchannelamp_b1 = 0.;
  651. file.seekg(framestart*sizeof(BufferData)+board_b*sizeof(BufferData)+4*frame*sizeof(BufferData));
  652. file.read ((char*)dataptr ,sizeof(BufferData));
  653. if (dataptr->sync_frame.device_nr==board_b){
  654. // std::cout << frame << " " << dataptr->sync_frame.device_nr << " " << dataptr->sync_frame.local_ctr << " " << dataptr->sync_frame.global_ctr << " " << dataptr->sync_frame.sma_state << std::endl;
  655. arrayavg_b1 = 0;
  656. //shift the events of the rolling average of the signal one left
  657. for (int j = 1; j<length;j++){
  658. array_b1[j-1] = array_b1[j];
  659. arrayavg_b1 += array_b1[j-1];
  660. // cout << array_b1[j-1] << " ";
  661. }
  662. array_b1[length-1] = 0.;
  663. // cout << endl;
  664. ///loop over the channels
  665. for (int i = 0;i<128;i++){
  666. board_b1_ch[i] = dataptr->sensor_data[i];
  667. if (frame<1000){
  668. board_b1_ch_bkg[i] += board_b1_ch[i]/1000.; //find baseline from the average of first 1000 events
  669. }
  670. else if (frame>=1000&& frame<2000){
  671. board_b1_ch[i] -= board_b1_ch_bkg[i]; //histogram the subtracted baseline in the next 1000 events
  672. th2_signal_vs_channel_bkg_b1->Fill(i,board_b1_ch[i]);
  673. if (i==1) graph_bkg_b1->SetPoint(graph_bkg_b1->GetN(), frame, board_b1_ch[i]);
  674. }
  675. else if (frame>=2000) {
  676. board_b1_ch[i]-=board_b1_ch_bkg[i]; // the rest background subtracted
  677. // board_b1_ch[i]*=calibration_b1[i]; //calibration factor
  678. th2_signal_vs_channel_b1->Fill(i,board_b1_ch[i]);
  679. //find the peak channel
  680. if (board_b1_ch[i]> maxchannelamp_b1) {
  681. maxchannel_b1 = i;
  682. maxchannelamp_b1 = board_b1_ch[i];
  683. // cout << maxchannel_b1 << " " <<maxchannelamp_b1 << endl;
  684. }
  685. ///add new event to the rolling average.
  686. if( board_b1_ch[i]>50.0){
  687. array_b1[length-1] += board_b1_ch[i];
  688. }
  689. ////////////////////////////////////////////
  690. }
  691. }//end of 128
  692. // th1_signal_b1->Fill(signal_b1);
  693. arrayavg_b1 += array_b1[length-1]/length;
  694. // cout << frame << " Rolling average: " << arrayavg_b1 << endl;// " ic: " << ic1_avg << endl;
  695. }
  696. else {
  697. std::cout << "Error." << std::endl;
  698. }
  699. //board_b 2
  700. board_b=2;
  701. signal_b2 = 0.;
  702. maxchannelamp_b2 = 0.;
  703. file.seekg(framestart*sizeof(BufferData)+board_b*sizeof(BufferData)+4*frame*sizeof(BufferData));
  704. file.read ((char*)dataptr ,sizeof(BufferData));
  705. if (dataptr->sync_frame.device_nr==board_b){
  706. // std::cout << frame << " " << dataptr->sync_frame.device_nr << " " << dataptr->sync_frame.local_ctr << " " << dataptr->sync_frame.global_ctr << " " << dataptr->sync_frame.sma_state << std::endl;
  707. arrayavg_b2 = 0;
  708. //shift the events of the rolling average of the signal one left
  709. for (int j = 1; j<length;j++){
  710. array_b2[j-1] = array_b2[j];
  711. arrayavg_b2 += array_b2[j-1];
  712. // cout << array_b2[j-1] << " ";
  713. }
  714. array_b2[length-1] = 0.;
  715. // cout << endl;
  716. ///loop over the channels
  717. for (int i = 0;i<128;i++){
  718. board_b2_ch[i] = dataptr->sensor_data[i];
  719. if (frame<1000){
  720. board_b2_ch_bkg[i] += board_b2_ch[i]/1000.; //find baseline from the average of first 1000 events
  721. }
  722. else if (frame>=1000&& frame<2000){
  723. board_b2_ch[i] -= board_b2_ch_bkg[i]; //histogram the subtracted baseline in the next 1000 events
  724. th2_signal_vs_channel_bkg_b2->Fill(i,board_b2_ch[i]);
  725. if (i==1) graph_bkg_b2->SetPoint(graph_bkg_b2->GetN(), frame, board_b2_ch[i]);
  726. }
  727. else if (frame>=2000) {
  728. board_b2_ch[i]-=board_b2_ch_bkg[i]; // the rest background subtracted
  729. // board_b2_ch[i]*=calibration_b2[i]; //calibration factor
  730. th2_signal_vs_channel_b2->Fill(i,board_b2_ch[i]);
  731. //find the peak channel
  732. if (board_b2_ch[i]> maxchannelamp_b2) {
  733. maxchannel_b2 = i;
  734. maxchannelamp_b2 = board_b2_ch[i];
  735. // cout << maxchannel_b2 << " " <<maxchannelamp_b2 << endl;
  736. }
  737. ///add new event to the rolling average.
  738. if( board_b2_ch[i]>50.0){
  739. array_b2[length-1] += board_b2_ch[i];
  740. }
  741. ////////////////////////////////////////////
  742. }
  743. }//end of 128
  744. // th1_signal_b2->Fill(signal_b2);
  745. arrayavg_b2 += array_b2[length-1]/length;
  746. // cout << frame << " Rolling average: " << arrayavg_b2 << endl;// " ic: " << ic1_avg << endl;
  747. }
  748. else {
  749. std::cout << "Error." << std::endl;
  750. }
  751. //board_b 3
  752. board_b=3;
  753. signal_b3 = 0.;
  754. maxchannelamp_b3 = 0.;
  755. file.seekg(framestart*sizeof(BufferData)+board_b*sizeof(BufferData)+4*frame*sizeof(BufferData));
  756. file.read ((char*)dataptr ,sizeof(BufferData));
  757. if (dataptr->sync_frame.device_nr==board_b){
  758. // std::cout << frame << " " << dataptr->sync_frame.device_nr << " " << dataptr->sync_frame.local_ctr << " " << dataptr->sync_frame.global_ctr << " " << dataptr->sync_frame.sma_state << std::endl;
  759. arrayavg_b3 = 0;
  760. //shift the events of the rolling average of the signal one left
  761. for (int j = 1; j<length;j++){
  762. array_b3[j-1] = array_b3[j];
  763. arrayavg_b3 += array_b3[j-1];
  764. // cout << array_b3[j-1] << " ";
  765. }
  766. array_b3[length-1] = 0.;
  767. // cout << endl;
  768. ///loop over the channels
  769. for (int i = 0;i<128;i++){
  770. board_b3_ch[i] = dataptr->sensor_data[i];
  771. if (frame<1000){
  772. board_b3_ch_bkg[i] += board_b3_ch[i]/1000.; //find baseline from the average of first 1000 events
  773. }
  774. else if (frame>=1000&& frame<2000){
  775. board_b3_ch[i] -= board_b3_ch_bkg[i]; //histogram the subtracted baseline in the next 1000 events
  776. th2_signal_vs_channel_bkg_b3->Fill(i,board_b3_ch[i]);
  777. if (i==1) graph_bkg_b3->SetPoint(graph_bkg_b3->GetN(), frame, board_b3_ch[i]);
  778. }
  779. else if (frame>=2000) {
  780. board_b3_ch[i]-=board_b3_ch_bkg[i]; // the rest background subtracted
  781. // board_b3_ch[i]*=calibration_b3[i]; //calibration factor
  782. th2_signal_vs_channel_b3->Fill(i,board_b3_ch[i]);
  783. //find the peak channel
  784. if (board_b3_ch[i]> maxchannelamp_b3) {
  785. maxchannel_b3 = i;
  786. maxchannelamp_b3 = board_b3_ch[i];
  787. // cout << maxchannel_b3 << " " <<maxchannelamp_b3 << endl;
  788. }
  789. ///add new event to the rolling average.
  790. if( board_b3_ch[i]>50.0){
  791. array_b3[length-1] += board_b3_ch[i];
  792. }
  793. ////////////////////////////////////////////
  794. }
  795. }//end of 128
  796. // th1_signal_b3->Fill(signal_b3);
  797. arrayavg_b3 += array_b3[length-1]/length;
  798. // cout << frame << " Rolling average: " << arrayavg_b3 << endl;// " ic: " << ic1_avg << endl;
  799. }
  800. else {
  801. std::cout << "Error." << std::endl;
  802. }
  803. ////////////////////////////////////////////////////////////
  804. ////////////////////////////////////////////////////////////
  805. //start the signal analysis
  806. ////////////////////////////////////////////////////////////
  807. ////////////////////////////////////////////////////////////
  808. if (frame>=2000&&beam_off == false&&beam_wason == true){
  809. ////////////////////////////////////////////////////////////
  810. //find the approx FWHM
  811. ////////////////////////////////////////////////////////////
  812. nfwhm_b0 =0;
  813. nfwhm_b1 =0;
  814. nfwhm_b2 =0;
  815. nfwhm_b3 =0;
  816. for (int i = 0;i<128;i++){
  817. if (board_b0_ch[i] > maxchannelamp_b0/3.) nfwhm_b0++; //switched to a lower threshold 1/3 instead of 1/2
  818. if (board_b1_ch[i] > maxchannelamp_b1/3.) nfwhm_b1++;
  819. if (board_b2_ch[i] > maxchannelamp_b2/3.) nfwhm_b2++;
  820. if (board_b3_ch[i] > maxchannelamp_b3/3.) nfwhm_b3++;
  821. signal_gsl_b0[i] = 0.;
  822. signal_gsl_b1[i] = 0.;
  823. signal_gsl_b2[i] = 0.;
  824. signal_gsl_b3[i] = 0.;
  825. }
  826. ////////////////////////////////////////////////////////////
  827. //integrate under the approximate peak
  828. //build the channel list for statistical analysis
  829. ////////////////////////////////////////////////////////////
  830. numtocalc_b0 = 0;
  831. numtocalc_b1 = 0;
  832. numtocalc_b2 = 0;
  833. numtocalc_b3 = 0;
  834. signal_b0 = 0.;
  835. // cout << energy_indexbin << endl;
  836. for (int i = maxchannel_b0-nfwhm_b0 ; i <= maxchannel_b0 + nfwhm_b0; i++){
  837. if (i>=0 && i<=127 && board_b0_ch[i]>0){
  838. signal_b0 +=board_b0_ch[i];
  839. signal_gsl_b0[numtocalc_b0]=board_b0_ch[i];
  840. // channellist_gsl_b0[numtocalc_b0] = i;
  841. channellist_gsl_b0[numtocalc_b0] = pos[i];
  842. numtocalc_b0++;
  843. }
  844. }
  845. th1_signal_b0->Fill(signal_b0); //cout << signal_b0 << endl;
  846. if (ic1_avg>0.1) h_beamSignal_b0[energy_indexbin]->Fill(signal_b0);
  847. signal_b1 = 0.;
  848. for (int i = maxchannel_b1-nfwhm_b1 ; i <= maxchannel_b1 + nfwhm_b1; i++){
  849. if (i>=0 && i<=127&&board_b1_ch[i]>0){
  850. signal_b1 +=board_b1_ch[i] ;
  851. signal_gsl_b1[numtocalc_b1]=board_b1_ch[i];
  852. // channellist_gsl_b1[numtocalc_b1] = i;
  853. channellist_gsl_b1[numtocalc_b1] = pos[i];
  854. numtocalc_b1++;
  855. }
  856. }
  857. th1_signal_b0->Fill(signal_b1);
  858. if (ic1_avg>0.1) h_beamSignal_b1[energy_indexbin]->Fill(signal_b1);
  859. signal_b2 = 0.;
  860. for (int i = maxchannel_b2-nfwhm_b2 ; i <= maxchannel_b2 + nfwhm_b2; i++){
  861. if (i>=0 && i<=127&&board_b2_ch[i]>0){
  862. signal_b2 +=board_b2_ch[i];
  863. signal_gsl_b2[numtocalc_b2]=board_b2_ch[i];
  864. // channellist_gsl_b2[numtocalc_b2] = i;
  865. channellist_gsl_b2[numtocalc_b2] = pos[i];
  866. numtocalc_b2++;
  867. }
  868. }
  869. th1_signal_b0->Fill(signal_b2);
  870. if (ic1_avg>0.1) h_beamSignal_b2[energy_indexbin]->Fill(signal_b2);
  871. signal_b3 = 0.;
  872. for (int i = maxchannel_b3-nfwhm_b3 ; i <= maxchannel_b3 + nfwhm_b3; i++){
  873. if (i>=0 && i<=127&&board_b3_ch[i]>0){
  874. signal_b3 +=board_b3_ch[i];
  875. signal_gsl_b3[numtocalc_b3]=board_b3_ch[i];
  876. //channellist_gsl_b3[numtocalc_b3] = i;
  877. channellist_gsl_b3[numtocalc_b3] = pos[i];
  878. numtocalc_b3++;
  879. }
  880. }
  881. th1_signal_b0->Fill(signal_b3);
  882. if (ic1_avg>0.1) {h_beamSignal_b3[energy_indexbin]->Fill(signal_b3);
  883. h_beamSignal_ic1[energy_indexbin]->Fill(ic1_avg);
  884. }
  885. signal_cor_b0 = signal_b0*intcorr/(intensity/1.E6)/sp2_ps;
  886. signal_cor_b1 = signal_b1*intcorr/(intensity/1.E6)/sp2_ps;
  887. signal_cor_b2 = signal_b2*intcorr/(intensity/1.E6)/sp2_ps;
  888. signal_cor_b3 = signal_b3*intcorr/(intensity/1.E6)/sp2_ps;
  889. if (signal_cor_b0 >0.05 && signal_cor_b0 < 10.) {h_beamSignal_cor_b0[energy_indexbin]->Fill(signal_cor_b0);}
  890. if (signal_cor_b1 >0.05 && signal_cor_b1 < 10.) {h_beamSignal_cor_b1[energy_indexbin]->Fill(signal_cor_b1);}
  891. if (signal_cor_b2 >0.05 && signal_cor_b2 < 10.) {h_beamSignal_cor_b2[energy_indexbin]->Fill(signal_cor_b2);}
  892. if (signal_cor_b3 >0.05 && signal_cor_b3 < 10.) {h_beamSignal_cor_b3[energy_indexbin]->Fill(signal_cor_b3);}
  893. ///////////////// linear regression using Integration by parts of gaussian function.
  894. if (doLinInt&&numtocalc_b0>=3&&numtocalc_b1>=3&&numtocalc_b2>=3&&numtocalc_b3>=3){
  895. for (int j = 0; j<=4; j++){
  896. if (j== 0) {
  897. copy(signal_gsl_b0,signal_gsl_b0+128, signal_reg);
  898. copy(channellist_gsl_b0,channellist_gsl_b0+128, channellist_reg);
  899. numtocalc_reg = numtocalc_b0;
  900. }
  901. else if (j== 1) {
  902. copy(signal_gsl_b1,signal_gsl_b1+128, signal_reg);
  903. copy(channellist_gsl_b1,channellist_gsl_b1+128, channellist_reg);
  904. numtocalc_reg = numtocalc_b1;
  905. }
  906. else if (j== 2) {
  907. copy(signal_gsl_b2,signal_gsl_b2+128, signal_reg);
  908. copy(channellist_gsl_b2,channellist_gsl_b2+128, channellist_reg);
  909. numtocalc_reg = numtocalc_b2;
  910. }
  911. else if (j== 3) {
  912. copy(signal_gsl_b3,signal_gsl_b3+128, signal_reg);
  913. copy(channellist_gsl_b3,channellist_gsl_b3+128, channellist_reg);
  914. numtocalc_reg = numtocalc_b3;
  915. }
  916. SumY = 0.;
  917. SumS = 0.;
  918. SumT = 0.;
  919. SumS2 = 0.;
  920. SumST = 0.;
  921. SumT2 = 0.;
  922. SumYS = 0.;
  923. SumYT = 0.;
  924. b_den = 0.;
  925. b_num = 0.;
  926. b = 0.;
  927. SumYYM = 0.;
  928. SumYYP = 0.;
  929. MeanY = 0.;
  930. for(int k=0; k<numtocalc_b0;k++){
  931. if (k==0){
  932. S[k]=0.; T[k]=0.;
  933. }
  934. else{
  935. S[k] = S[k-1]+0.5*( signal_reg[k] + signal_reg[k-1] ) * ( channellist_reg[k] - channellist_reg[k-1] );
  936. T[k] = T[k-1]+0.5*( channellist_reg[k] * signal_reg[k] + channellist_reg[k-1] * signal_reg[k-1] ) * ( channellist_reg[k] - channellist_reg[k-1] );
  937. }
  938. // cout << S[k] << " " << T[k] << endl;
  939. SumS += S[k]; SumT += T[k];
  940. SumY += signal_reg[k];
  941. SumS2 += S[k]*S[k]; SumST += S[k]*T[k]; SumT2 += T[k]*T[k];
  942. SumYS += signal_reg[k]*S[k];
  943. SumYT += signal_reg[k]*T[k];
  944. MeanY+=signal_reg[k];
  945. }
  946. MeanY/=numtocalc_reg;
  947. M1(0,0) = SumT2; M1(0,1) = SumST; M1(0,2) = SumT; M1(1,0) = SumST; M1(1,1) = SumS2;
  948. M1(1,2) = SumS; M1(2,0) = SumT; M1(2,1) = SumS;
  949. M1(2,2) = numtocalc_reg;
  950. M2(0) = SumYT; M2(1) = SumYS; M2(2) = SumY;
  951. M1inv = M1.Invert(); ABC = M1inv * M2;
  952. //calculate b,p,c ---> y = b*exp(-p*(x-c)*(x-c))
  953. p = -ABC(0)/2.; c = -ABC(1)/ABC(0);
  954. for(int k=0; k<numtocalc_reg;k++){
  955. b_num += exp(-p*(channellist_reg[k]-c)*(channellist_reg[k]-c)) * signal_reg[k];
  956. b_den += exp(-2*p*(channellist_reg[k]-c)*(channellist_reg[k]-c));
  957. }
  958. b = b_num/b_den;
  959. //calculate R-squared
  960. ///residual plots (should be normally distributed). They are normalised to the standard error of the baseline (17 ADC units)
  961. for(int k=0; k<numtocalc_reg;k++){
  962. SumYYM+= (signal_reg[k]-MeanY)*(signal_reg[k]-MeanY);
  963. SumYYP+= (b*exp(-p*(channellist_reg[k]-c)*(channellist_reg[k]-c)) - MeanY )*(b*exp(-p*(channellist_reg[k]-c)*(channellist_reg[k]-c)) - MeanY );
  964. if (j == 0) {
  965. h_regresidual_b0->Fill((b*exp(-p*(channellist_reg[k]-c)*(channellist_reg[k]-c)) - signal_reg[k])/signal_reg[k]);
  966. th2_resid_vs_channel_bkg_b0->Fill(channellist_reg[k],(b*exp(-p*(channellist_reg[k]-c)*(channellist_reg[k]-c)) - signal_reg[k])/signal_reg[k]);
  967. }
  968. if (j == 1) {
  969. h_regresidual_b1->Fill((b*exp(-p*(channellist_reg[k]-c)*(channellist_reg[k]-c)) - signal_reg[k])/signal_reg[k]);
  970. th2_resid_vs_channel_bkg_b1->Fill(channellist_reg[k],(b*exp(-p*(channellist_reg[k]-c)*(channellist_reg[k]-c)) - signal_reg[k])/signal_reg[k]);
  971. }
  972. if (j == 2) {
  973. h_regresidual_b2->Fill((b*exp(-p*(channellist_reg[k]-c)*(channellist_reg[k]-c)) - signal_reg[k])/signal_reg[k]);
  974. th2_resid_vs_channel_bkg_b2->Fill(channellist_reg[k],(b*exp(-p*(channellist_reg[k]-c)*(channellist_reg[k]-c)) - signal_reg[k])/signal_reg[k]);
  975. }
  976. if (j == 3) {
  977. h_regresidual_b3->Fill((b*exp(-p*(channellist_reg[k]-c)*(channellist_reg[k]-c)) - signal_reg[k])/signal_reg[k]);
  978. th2_resid_vs_channel_bkg_b3->Fill(channellist_reg[k],(b*exp(-p*(channellist_reg[k]-c)*(channellist_reg[k]-c)) - signal_reg[k])/signal_reg[k]);
  979. }
  980. }
  981. // cout << "R-squared = " << SumYYP/SumYYM << endl;
  982. //final results
  983. if (j == 0) {
  984. beamFocusX_reg_b0 = 2.3548/sqrt(2*p);
  985. beamPosX_reg_b0 = -ABC(1)/ ABC(0);
  986. beamPeakX_reg_b0 = b;
  987. beamRsqr_b0 = SumYYP/SumYYM;
  988. beamSkewX_b0 = gsl_stats_wskew_m_sd(signal_reg,1,channellist_reg,1,numtocalc_reg,beamPosX_reg_b0,beamFocusX_reg_b0/2.3548); //skewness (symmetry)
  989. beamKurtX_b0 = gsl_stats_wkurtosis_m_sd(signal_reg,1,channellist_reg,1,numtocalc_reg,beamPosX_reg_b0,beamFocusX_reg_b0/2.3548); //excess kurtosis (well behaved tails)
  990. M1elements_b0[0] = SumT2;
  991. M1elements_b0[1] = SumST;
  992. M1elements_b0[2] = SumT;
  993. M1elements_b0[3] = SumST;
  994. M1elements_b0[4] = SumS2;
  995. M1elements_b0[5] = SumS;
  996. M1elements_b0[6] = SumT;
  997. M1elements_b0[7] = SumS;
  998. M1elements_b0[8] = numtocalc_reg;
  999. }
  1000. else if (j == 1) {
  1001. beamFocusX_reg_b1 = 2.3548/sqrt(2*p);
  1002. beamPosX_reg_b1 = -ABC(1)/ ABC(0);
  1003. beamPeakX_reg_b1 = b;
  1004. beamRsqr_b1 = SumYYP/SumYYM;
  1005. beamSkewX_b1 = gsl_stats_wskew_m_sd(signal_reg,1,channellist_reg,1,numtocalc_reg,beamPosX_reg_b1,beamFocusX_reg_b1/2.3548); //skewness (symmetry)
  1006. beamKurtX_b1 = gsl_stats_wkurtosis_m_sd(signal_reg,1,channellist_reg,1,numtocalc_reg,beamPosX_reg_b1,beamFocusX_reg_b1/2.3548); //excess kurtosis (well behaved tails)
  1007. M1elements_b0[0] = SumT2;
  1008. M1elements_b1[1] = SumST;
  1009. M1elements_b1[2] = SumT;
  1010. M1elements_b1[3] = SumST;
  1011. M1elements_b1[4] = SumS2;
  1012. M1elements_b1[5] = SumS;
  1013. M1elements_b1[6] = SumT;
  1014. M1elements_b1[7] = SumS;
  1015. M1elements_b1[8] = numtocalc_reg;
  1016. }
  1017. else if (j == 2) {
  1018. beamFocusX_reg_b2 = 2.3548/sqrt(2*p);
  1019. beamPosX_reg_b2 = -ABC(1)/ ABC(0);
  1020. beamPeakX_reg_b2 = b;
  1021. beamRsqr_b2 = SumYYP/SumYYM;
  1022. beamSkewX_b2 = gsl_stats_wskew_m_sd(signal_reg,1,channellist_reg,1,numtocalc_reg,beamPosX_reg_b2,beamFocusX_reg_b2/2.3548); //skewness (symmetry)
  1023. beamKurtX_b2 = gsl_stats_wkurtosis_m_sd(signal_reg,1,channellist_reg,1,numtocalc_reg,beamPosX_reg_b2,beamFocusX_reg_b2/2.3548); //excess kurtosis (well behaved tails)
  1024. M1elements_b2[0] = SumT2;
  1025. M1elements_b2[1] = SumST;
  1026. M1elements_b2[2] = SumT;
  1027. M1elements_b2[3] = SumST;
  1028. M1elements_b2[4] = SumS2;
  1029. M1elements_b2[5] = SumS;
  1030. M1elements_b2[6] = SumT;
  1031. M1elements_b2[7] = SumS;
  1032. M1elements_b2[8] = numtocalc_reg;
  1033. }
  1034. else if (j == 3) {
  1035. beamFocusX_reg_b3 = 2.3548/sqrt(2*p);
  1036. beamPosX_reg_b3 = -ABC(1)/ ABC(0);
  1037. beamPeakX_reg_b3 = b;
  1038. beamRsqr_b3 = SumYYP/SumYYM;
  1039. beamSkewX_b3 = gsl_stats_wskew_m_sd(signal_reg,1,channellist_reg,1,numtocalc_reg,beamPosX_reg_b3,beamFocusX_reg_b3/2.3548); //skewness (symmetry)
  1040. beamKurtX_b3 = gsl_stats_wkurtosis_m_sd(signal_reg,1,channellist_reg,1,numtocalc_reg,beamPosX_reg_b3,beamFocusX_reg_b3/2.3548); //excess kurtosis (well behaved tails)
  1041. M1elements_b0[0] = SumT2;
  1042. M1elements_b3[1] = SumST;
  1043. M1elements_b3[2] = SumT;
  1044. M1elements_b3[3] = SumST;
  1045. M1elements_b3[4] = SumS2;
  1046. M1elements_b3[5] = SumS;
  1047. M1elements_b3[6] = SumT;
  1048. M1elements_b3[7] = SumS;
  1049. M1elements_b3[8] = numtocalc_reg;
  1050. }
  1051. }
  1052. }
  1053. else if (numtocalc_b0>0&&numtocalc_b1>0) {
  1054. beamPosX_reg_b0 = gsl_stats_wmean(signal_gsl_b0,1,channellist_gsl_b0,1,numtocalc_b0); //calculate the weighted mean
  1055. beamFocusX_reg_b0 = gsl_stats_wsd_with_fixed_mean(signal_gsl_b0,1,channellist_gsl_b0,1,numtocalc_b0,beamPosX_reg_b0); //Standard Deviation
  1056. beamFocusX_reg_b0 *=2.3548;//SD-->FWHM
  1057. beamPosX_reg_b1 = gsl_stats_wmean(signal_gsl_b1,1,channellist_gsl_b1,1,numtocalc_b1); //calculate the weighted mean
  1058. beamFocusX_reg_b1 = gsl_stats_wsd_with_fixed_mean(signal_gsl_b1,1,channellist_gsl_b1,1,numtocalc_b1,beamPosX_reg_b1); //Standard Deviation
  1059. beamNumX_b1 = numtocalc_b1;
  1060. beamFocusX_reg_b1 *=2.3548;//SD-->FWHM
  1061. beamPosX_reg_b2 = gsl_stats_wmean(signal_gsl_b2,1,channellist_gsl_b2,1,numtocalc_b2); //calculate the weighted mean
  1062. beamFocusX_reg_b2 = gsl_stats_wsd_with_fixed_mean(signal_gsl_b2,1,channellist_gsl_b2,1,numtocalc_b2,beamPosX_reg_b2); //Standard Deviation
  1063. beamNumX_b2 = numtocalc_b2;
  1064. beamFocusX_reg_b2 *=2.3548;//SD-->FWHM
  1065. beamPosX_reg_b3 = gsl_stats_wmean(signal_gsl_b3,1,channellist_gsl_b3,1,numtocalc_b3); //calculate the weighted mean
  1066. beamFocusX_reg_b3 = gsl_stats_wsd_with_fixed_mean(signal_gsl_b3,1,channellist_gsl_b3,1,numtocalc_b3,beamPosX_reg_b3); //Standard Deviation
  1067. beamNumX_b3 = numtocalc_b3;
  1068. beamFocusX_reg_b3 *=2.3548;//SD-->FWHM
  1069. beamRsqr_b0 = .0;
  1070. beamRsqr_b1 = .0;
  1071. beamRsqr_b2 = .0;
  1072. beamRsqr_b3 = .0;
  1073. }
  1074. else
  1075. {
  1076. beamFocusX_reg_b0 = 0.;
  1077. beamFocusX_reg_b1 = 0.;
  1078. beamFocusX_reg_b1 = 0.;
  1079. beamFocusX_reg_b1 = 0.;
  1080. beamPosX_reg_b0 = 0.;
  1081. beamPosX_reg_b1 = 0.;
  1082. beamPosX_reg_b2 = 0.;
  1083. beamPosX_reg_b3 = 0.;
  1084. beamRsqr_b0 = .0;
  1085. beamRsqr_b1 = .0;
  1086. beamRsqr_b2 = .0;
  1087. beamRsqr_b3 = .0;
  1088. }
  1089. rootTree->Fill();
  1090. }
  1091. if (frameend>0 && frame+framestart>=frameend) break;
  1092. }//end of loop over frames
  1093. graph_bkg_b0->SetName("graph_bkg_b0"); // graph_bkg_b0->Write();
  1094. graph_bkg_b1->SetName("graph_bkg_b1"); // graph_bkg_b1->Write();
  1095. graph_bkg_b2->SetName("graph_bkg_b2"); // graph_bkg_b2->Write();
  1096. graph_bkg_b3->SetName("graph_bkg_b3"); // graph_bkg_b3->Write();
  1097. // bic1->Fill();
  1098. // bmw1_posx->Fill();
  1099. //bmw1_posy->Fill();
  1100. ///make reduced signal graph.
  1101. for (int jjj = 0; jjj<23;jjj++) {
  1102. // beamSignal_cor_b0_mean[jjj] = h_beamSignal_cor_b0[jjj]->GetMean();
  1103. // beamSignal_cor_b1_mean[jjj] = h_beamSignal_cor_b1[jjj]->GetMean();
  1104. // beamSignal_cor_b2_mean[jjj] = h_beamSignal_cor_b2[jjj]->GetMean();
  1105. // beamSignal_cor_b3_mean[jjj] = h_beamSignal_cor_b3[jjj]->GetMean();
  1106. //// get the median (0.5 quantile)
  1107. q = 0.5; // 0.5 for "median"
  1108. if (ionsort==3){
  1109. //protons
  1110. energy = energy_list_p[ jjj];
  1111. intensity = intensity_list_p[ int(intensity_index) ];
  1112. sp_air = f_sp_air->Eval(energy)*(intensity/1.0E6);
  1113. sp_ps = f_sp_ps->Eval(energy)*(intensity/1.0E6);
  1114. sp2_air = f_sp_air->Eval(energy);
  1115. sp2_ps = f_sp_ps->Eval(energy);
  1116. lorentz_gamma = energy/938.272 +1.; // lorentz_gamma = E_u/M_u +1
  1117. mybeta = sqrt(1. - 1./(lorentz_gamma*lorentz_gamma));
  1118. zsqr = 1.;
  1119. }
  1120. else if (ionsort==1){
  1121. //helium
  1122. energy = energy_list_he[ jjj ];
  1123. intensity = intensity_list_he[ int(intensity_index) ];
  1124. sp_air = f_h2sp_air->Eval(energy)*(intensity/1.0E6);
  1125. sp_ps = f_h2sp_ps->Eval(energy)*(intensity/1.0E6);
  1126. sp2_air = f_h2sp_air->Eval(energy);
  1127. sp2_ps = f_h2sp_ps->Eval(energy);
  1128. lorentz_gamma = energy/932.1055 +1.;// lorentz_gamma = E_u/M_u +1
  1129. mybeta = sqrt(1. - 1./(lorentz_gamma*lorentz_gamma));
  1130. zsqr = 4.;
  1131. }
  1132. else if (ionsort==4){
  1133. //carbon
  1134. energy = energy_list_c[ jjj];
  1135. intensity = intensity_list_c[ int(intensity_index) ];
  1136. sp_air = f_c12sp_air->Eval(energy)*(intensity/1.0E6);
  1137. sp_ps = f_c12sp_ps->Eval(energy)*(intensity/1.0E6);
  1138. sp2_air = f_c12sp_air->Eval(energy);
  1139. sp2_ps = f_c12sp_ps->Eval(energy);
  1140. lorentz_gamma = energy/932.3539 +1.;// lorentz_gamma = E_u/M_u +1
  1141. mybeta = sqrt(1. - 1./(lorentz_gamma*lorentz_gamma));
  1142. zsqr = 36.;
  1143. }
  1144. else if (ionsort==2){
  1145. //oxygen
  1146. energy = energy_list_o[ jjj];
  1147. intensity = intensity_list_o[ int(intensity_index) ];
  1148. sp_air = f_o16sp_air->Eval(energy)*(intensity/1.0E6);
  1149. sp_ps = f_o16sp_ps->Eval(energy)*(intensity/1.0E6);
  1150. sp2_air = f_o16sp_air->Eval(energy);
  1151. sp2_ps = f_o16sp_ps->Eval(energy);
  1152. lorentz_gamma = energy/931.4418 +1.;// lorentz_gamma = E_u/M_u +1
  1153. mybeta = sqrt(1. - 1./(lorentz_gamma*lorentz_gamma));
  1154. zsqr = 64.;
  1155. }
  1156. else {
  1157. sp_air = -1.;
  1158. sp_ps = -1.;
  1159. sp2_air = -1.;
  1160. sp2_ps = -1.;
  1161. lorentz_gamma = 0.;
  1162. mybeta = 0.;
  1163. zsqr = -1.;
  1164. }
  1165. h_beamSignal_ic1[jjj]->ComputeIntegral(); //just a precaution
  1166. h_beamSignal_ic1[jjj]->GetQuantiles(1,&median, &q);
  1167. //median = h_beamSignal_ic1[jjj]->GetMean();
  1168. // intcorr = (Intensity /19.8E6) / (totalcurrent/sp2_air/totaltime);
  1169. if (median>0&&energy>0) {intcorr = (intensity / 19.8E6) / (median/sp2_air)/ 3.11;}
  1170. // else if (median>0&&energy>0) {intcorr = 0.; median = 0.;}
  1171. else {intcorr = 0.; median = 0.;}
  1172. cout << "energy: " << energy << endl;
  1173. cout << "intensity: " << intensity << endl;
  1174. cout << "sp2_air: " << sp2_air << endl;
  1175. cout << "median: " << median << endl;
  1176. cout << "intcorr: " << intcorr << endl;
  1177. mybeta_graph[jjj] = sqrt(1. - 1./(lorentz_gamma*lorentz_gamma));
  1178. h_beamSignal_b0[jjj]->ComputeIntegral(); //just a precaution
  1179. h_beamSignal_b0[jjj]->GetQuantiles(1,&median, &q);
  1180. beamSignal_cor_b0_mean[jjj] = median*intcorr /(intensity/1.E6)/sp2_ps;
  1181. //beamSignal_cor_b0_mean[jjj] = h_beamSignal_b0[jjj]->GetMean()*intcorr /(intensity/1.E6)/sp2_ps;
  1182. cout << beamSignal_cor_b0_mean[jjj] << endl;
  1183. h_beamSignal_b1[jjj]->ComputeIntegral(); //just a precaution
  1184. h_beamSignal_b1[jjj]->GetQuantiles(1,&median, &q);
  1185. beamSignal_cor_b1_mean[jjj] = median*intcorr /(intensity/1.E6)/sp2_ps;
  1186. //beamSignal_cor_b1_mean[jjj] = h_beamSignal_b1[jjj]->GetMean()*intcorr /(intensity/1.E6)/sp2_ps;
  1187. h_beamSignal_b2[jjj]->ComputeIntegral(); //just a precaution
  1188. h_beamSignal_b2[jjj]->GetQuantiles(1,&median, &q);
  1189. beamSignal_cor_b2_mean[jjj] = median*intcorr /(intensity/1.E6)/sp2_ps;
  1190. // beamSignal_cor_b2_mean[jjj] = h_beamSignal_b2[jjj]->GetMean()*intcorr /(intensity/1.E6)/sp2_ps;
  1191. h_beamSignal_b3[jjj]->ComputeIntegral(); //just a precaution
  1192. h_beamSignal_b3[jjj]->GetQuantiles(1,&median, &q);
  1193. beamSignal_cor_b3_mean[jjj] = median*intcorr /(intensity/1.E6)/sp2_ps;
  1194. //beamSignal_cor_b3_mean[jjj] = h_beamSignal_b3[jjj]->GetMean()*intcorr /(intensity/1.E6)/sp2_ps;
  1195. }
  1196. TGraph * graph_b0 = new TGraph(23,mybeta_graph, beamSignal_cor_b0_mean);
  1197. TGraph * graph_b1 = new TGraph(23,mybeta_graph, beamSignal_cor_b1_mean);
  1198. TGraph * graph_b2 = new TGraph(23,mybeta_graph, beamSignal_cor_b2_mean);
  1199. TGraph * graph_b3 = new TGraph(23,mybeta_graph, beamSignal_cor_b3_mean);
  1200. graph_b0->SetName("graph_b0");graph_b0->Write();
  1201. graph_b1->SetName("graph_b1");graph_b1->Write();
  1202. graph_b2->SetName("graph_b2");graph_b2->Write();
  1203. graph_b3->SetName("graph_b3");graph_b3->Write();
  1204. rootFile->Write();
  1205. rootFile->Close();
  1206. }
  1207. std::cout << eventID << " frames analysed." << std::endl;
  1208. return 0;
  1209. }
  1210. else {
  1211. std::cerr << "Error 1" << std::endl;
  1212. return 1;
  1213. }
  1214. }
  1215. int main(int argc, char **argv){
  1216. analyse(argc, argv);
  1217. }