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.

1550 lines
57 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. Double_t signaloffset_b0[30];
  160. Double_t signaloffset_b1[30];
  161. Double_t signaloffset_b2[30];
  162. Double_t signaloffset_b3[30];
  163. 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]
  164. 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]
  165. 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]
  166. 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]
  167. 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]
  168. 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]
  169. 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]
  170. 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]
  171. ///// ic1/SP intensity correction factor = 19.8E6+/-0.1E6 particles/s per nA/(Mevcm2/g)
  172. /// compile with:
  173. //// $ make clean; make
  174. /// run with:
  175. //// $ ./convert <path to data> <run>
  176. //// $ ./convert /work/leverington/beamprofilemonitor/hitdata/HIT_17_12_2017/ run2
  177. int analyse(int argc, char **argv)
  178. {
  179. f_sp_air->SetParameters(303.746, -0.873697,1.01335); //protons between 50 and 300 MeV
  180. f_sp_ps->SetParameters(361.936, -0.892255, 1.19133); //protons between 50 and 220 MeV
  181. f_h2sp_air->SetParameters(1236.51, -0.880225, 4.17041); //helium between 50 and 300 MeV
  182. f_h2sp_ps->SetParameters(1387.08, -0.882686,4.60833); //heelium between 50 and 300 MeV
  183. f_c12sp_air->SetParameters(13291.2, -0.925464,45.3876); //carbon between 80 and 480 MeV
  184. f_c12sp_ps->SetParameters(14538.9, -0.922423,49.2859); //carbon between 80 and 480 MeV
  185. f_o16sp_air->SetParameters(24624.9, -0.925425,80.6828); //oxygen between 80 and 480 MeV
  186. f_o16sp_ps->SetParameters(26465.6, -0.928309,88.6728); //oxygen between 80 and 480 MeV
  187. // TVirtualFitter::SetDefaultFitter("Minuit2");
  188. // TVirtualFitter::SetPrecision(0.1);
  189. // std::cout << "Default Fitter:" << TVirtualFitter::GetDefaultFitter() << std::endl;
  190. //initialise some values;
  191. for (int i = 0;i<128;i++){
  192. board_b0_ch_bkg[i] = 0.;
  193. board_b1_ch_bkg[i] = 0.;
  194. board_b2_ch_bkg[i] = 0.;
  195. board_b3_ch_bkg[i] = 0.;
  196. channellist_gsl_b0[i] = 0;
  197. channellist_gsl_b1[i] = 0;
  198. channellist_gsl_b2[i] = 0;
  199. channellist_gsl_b3[i] = 0;
  200. calibration_b0[i] = 1.0;
  201. calibration_b1[i] = 1.0;
  202. calibration_b2[i] = 1.0;
  203. calibration_b3[i] = 1.0;
  204. errorx[i]=17.;
  205. errory[i]=17.;
  206. if (i<64) {pos[i] = double(i);}
  207. else {pos[i] = double(i) + 0.2; }
  208. }
  209. if (argc > 3){
  210. //open the file names specified in the command line
  211. char * ethercatfile = argv[3];
  212. // argv[1]= "/work/leverington/beamprofilemonitor/hitdata/HIT_17_12_2017/";
  213. // argv[2]= "Run11"
  214. char * filename = Form("%s%s.dat",argv[1],argv[2]);
  215. char * offsetfilename = Form("%s",argv[4]);
  216. char * timestampfilename = Form("%s%s_timestamp.csv",argv[1],argv[2]);
  217. char * rootfilename = Form("%s/root/%s.root",argv[1],argv[2]);
  218. ifstream file(filename, ifstream::in | ifstream::binary);
  219. ifstream timestampfile(timestampfilename, ifstream::in);
  220. ifstream offsetfile(offsetfilename, ifstream::in);
  221. if (!file.is_open()){
  222. printf(".dat did not open.\n");
  223. return -1; //file could not be opened
  224. }
  225. else {
  226. printf("Data file opened.\n");
  227. }
  228. if (!timestampfile.is_open()){
  229. printf("timestamp.csv did not open.\n");
  230. ethercat = false;
  231. //return -1; //file could not be opened
  232. }
  233. if (!offsetfile.is_open()){
  234. printf("no offset.txt file found\n");
  235. // return -1; //file could not be opened
  236. for (int ii = 0; ii<30;ii++) {
  237. signaloffset_b0[ii] = 0.; signaloffset_b1[ii] = 0.; signaloffset_b2[ii] = 0.; signaloffset_b3[ii] = 0.;
  238. }
  239. }
  240. else {
  241. for (int ii = 0; ii<30;ii++) offsetfile >> signaloffset_b0[ii] >> signaloffset_b1[ii] >>signaloffset_b2[ii] >>signaloffset_b3[ii] ;
  242. }
  243. ///read in offsets produced by offsetcor.C script (needs to be run after convert_clean, then repeat convert_clean.)
  244. ///some variables to get the data
  245. // int number_of_records_to_read = 4*10;
  246. // BufferData* buffer = new BufferData[number_of_records_to_read];
  247. //if(argc > 4) {
  248. // framestart = atoi(argv[3]);
  249. // frameend = atoi(argv[4]);
  250. // }
  251. int board_b = -1;
  252. long int fileframesize = getFileSize(filename) / ( 4*sizeof(BufferData) );
  253. BufferData* dataptr = new BufferData();
  254. if (fileframesize>0){
  255. std::cout << "Number of frames:" << fileframesize << std::endl;
  256. //open ROOT file for saving histos and TTree.
  257. TFile *rootFile = new TFile(rootfilename,"RECREATE");
  258. if ( rootFile->IsOpen() ) printf("ROOT file opened successfully\n");
  259. TH2D * th2_signal_vs_channel_b0 = new TH2D("th2_signal_vs_channel_b0","th2_signal_vs_channel_b0",128,0,128,2200,-1000,10000);
  260. TH2D * th2_signal_vs_channel_b1 = new TH2D("th2_signal_vs_channel_b1","th2_signal_vs_channel_b1",128,0,128,2200,-1000,10000);
  261. TH2D * th2_signal_vs_channel_b2 = new TH2D("th2_signal_vs_channel_b2","th2_signal_vs_channel_b2",128,0,128,2200,-1000,10000);
  262. TH2D * th2_signal_vs_channel_b3 = new TH2D("th2_signal_vs_channel_b3","th2_signal_vs_channel_b3",128,0,128,2200,-1000,10000);
  263. 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);
  264. 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);
  265. 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);
  266. 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);
  267. TH1D * th1_signal_b0 = new TH1D("th1_signal_b0","th1_signal_b0",2200,-10000,50000);
  268. TH1D * th1_signal_b1 = new TH1D("th1_signal_b1","th1_signal_b1",2200,-10000,50000);
  269. TH1D * th1_signal_b2 = new TH1D("th1_signal_b2","th1_signal_b2",2200,-10000,50000);
  270. TH1D * th1_signal_b3 = new TH1D("th1_signal_b3","th1_signal_b3",2200,-10000,50000);
  271. TH1D * h_regresidual_b0 = new TH1D("h_regresidual_b0","h_regresidual_b0", 200,-.20,.20);
  272. TH1D * h_regresidual_b1 = new TH1D("h_regresidual_b1","h_regresidual_b1", 200,-.20,.20);
  273. TH1D * h_regresidual_b2 = new TH1D("h_regresidual_b2","h_regresidual_b2", 200,-.20,.20);
  274. TH1D * h_regresidual_b3 = new TH1D("h_regresidual_b3","h_regresidual_b3", 200,-.20,.20);
  275. TGraph * graph_bkg_b0 = new TGraph();
  276. TGraph * graph_bkg_b1 = new TGraph();
  277. TGraph * graph_bkg_b2 = new TGraph();
  278. TGraph * graph_bkg_b3 = new TGraph();
  279. TGraph * gr_b0;
  280. TGraph * gr_sm_b0;
  281. TGraph * gr_b1;
  282. TGraph * gr_sm_b1;
  283. TGraph * gr_b2;
  284. TGraph * gr_sm_b2;
  285. TGraph * gr_b3;
  286. TGraph * gr_sm_b3;
  287. 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);
  288. 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);
  289. 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);
  290. 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);
  291. 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);
  292. 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);
  293. 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);
  294. 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);
  295. TH1D* h_beamSignal_b0[30];
  296. TH1D* h_beamSignal_b1[30];
  297. TH1D* h_beamSignal_b2[30];
  298. TH1D* h_beamSignal_b3[30];
  299. int energy_indexbin = 0;
  300. char histname[30] = "";
  301. TH1D* h_beamSignal_ic1[30];
  302. TH1D* h_beamSignal_cor_b0[30];
  303. TH1D* h_beamSignal_cor_b1[30];
  304. TH1D* h_beamSignal_cor_b2[30];
  305. TH1D* h_beamSignal_cor_b3[30];
  306. Double_t beamSignal_cor_b0_mean[30];
  307. Double_t beamSignal_cor_b1_mean[30];
  308. Double_t beamSignal_cor_b2_mean[30];
  309. Double_t beamSignal_cor_b3_mean[30];
  310. Double_t mybeta_graph[30];
  311. int goodevents_b0=0;
  312. int goodevents_b1=0;
  313. int goodevents_b2=0;
  314. int goodevents_b3=0;
  315. for (int iii=0; iii<=29; iii++){
  316. sprintf(histname,"h_beamSignal_b0_%d",iii);
  317. h_beamSignal_b0[iii] = new TH1D(histname,histname,200,0,100000);
  318. sprintf(histname,"h_beamSignal_b1_%d",iii);
  319. h_beamSignal_b1[iii] = new TH1D(histname,histname,200,0,100000);
  320. sprintf(histname,"h_beamSignal_b2_%d",iii);
  321. h_beamSignal_b2[iii] = new TH1D(histname,histname,200,0,100000);
  322. sprintf(histname,"h_beamSignal_b3_%d",iii);
  323. h_beamSignal_b3[iii] = new TH1D(histname,histname,200,0,100000);
  324. }
  325. for (int iii=0; iii<=29; iii++){
  326. sprintf(histname,"h_beamSignal_cor_b0_%d",iii);
  327. h_beamSignal_cor_b0[iii] = new TH1D(histname,histname,200,0,10);
  328. sprintf(histname,"h_beamSignal_cor_b1_%d",iii);
  329. h_beamSignal_cor_b1[iii] = new TH1D(histname,histname,200,0,10.);
  330. sprintf(histname,"h_beamSignal_cor_b2_%d",iii);
  331. h_beamSignal_cor_b2[iii] = new TH1D(histname,histname,200,0,10.);
  332. sprintf(histname,"h_beamSignal_cor_b3_%d",iii);
  333. h_beamSignal_cor_b3[iii] = new TH1D(histname,histname,200,0,10.);
  334. sprintf(histname,"h_beamSignal_ic1_%d",iii);
  335. h_beamSignal_ic1[iii] = new TH1D(histname,histname,200,0,1000.);
  336. }
  337. TTree *rootTree = new TTree("t","HIT Data Root Tree");
  338. rootTree->Branch("beamPosX_reg_b0",&beamPosX_reg_b0,"beamPosX_reg_b0/D");
  339. rootTree->Branch("beamPosX_reg_b1",&beamPosX_reg_b1,"beamPosX_reg_b1/D");
  340. rootTree->Branch("beamPosX_reg_b2",&beamPosX_reg_b2,"beamPosX_reg_b2/D");
  341. rootTree->Branch("beamPosX_reg_b3",&beamPosX_reg_b3,"beamPosX_reg_b3/D");
  342. rootTree->Branch("beamFocusX_reg_b0",&beamFocusX_reg_b0,"beamFocusX_reg_b0/D");
  343. rootTree->Branch("beamFocusX_reg_b1",&beamFocusX_reg_b1,"beamFocusX_reg_b1/D");
  344. rootTree->Branch("beamFocusX_reg_b2",&beamFocusX_reg_b2,"beamFocusX_reg_b2/D");
  345. rootTree->Branch("beamFocusX_reg_b3",&beamFocusX_reg_b3,"beamFocusX_reg_b3/D");
  346. rootTree->Branch("beamPeakX_reg_b0",&beamPeakX_reg_b0,"beamPeakX_reg_b0/D");
  347. rootTree->Branch("beamPeakX_reg_b1",&beamPeakX_reg_b1,"beamPeakX_reg_b1/D");
  348. rootTree->Branch("beamPeakX_reg_b2",&beamPeakX_reg_b2,"beamPeakX_reg_b2/D");
  349. rootTree->Branch("beamPeakX_reg_b3",&beamPeakX_reg_b3,"beamPeakX_reg_b3/D");
  350. rootTree->Branch("beamRsqr_b0",&beamRsqr_b0,"beamRsqr_b0/D");
  351. rootTree->Branch("beamRsqr_b1",&beamRsqr_b1,"beamRsqr_b1/D");
  352. rootTree->Branch("beamRsqr_b2",&beamRsqr_b2,"beamRsqr_b2/D");
  353. rootTree->Branch("beamRsqr_b3",&beamRsqr_b3,"beamRsqr_b3/D");
  354. rootTree->Branch("sp2_ps",&sp2_ps,"sp2_ps/D");
  355. rootTree->Branch("sp2_air",&sp2_air,"sp2_air/D");
  356. rootTree->Branch("mybeta",&mybeta,"mybeta/D");
  357. rootTree->Branch("beamSkewX_b0",&beamSkewX_b0,"beamSkewX_b0/D");
  358. rootTree->Branch("beamSkewX_b1",&beamSkewX_b1,"beamSkewX_b1/D");
  359. rootTree->Branch("beamSkewX_b2",&beamSkewX_b2,"beamSkewX_b2/D");
  360. rootTree->Branch("beamSkewX_b3",&beamSkewX_b3,"beamSkewX_b3/D");
  361. rootTree->Branch("beamKurtX_b0",&beamKurtX_b0,"beamKurtX_b0/D");
  362. rootTree->Branch("beamKurtX_b1",&beamKurtX_b1,"beamKurtX_b1/D");
  363. rootTree->Branch("beamKurtX_b2",&beamKurtX_b2,"beamKurtX_b2/D");
  364. rootTree->Branch("beamKurtX_b3",&beamKurtX_b3,"beamKurtX_b3/D");
  365. rootTree->Branch("beamNumX_b0",&numtocalc_b0,"beamNumX_b0/I");
  366. rootTree->Branch("beamNumX_b1",&numtocalc_b1,"beamNumX_b1/I");
  367. rootTree->Branch("beamNumX_b2",&numtocalc_b2,"beamNumX_b2/I");
  368. rootTree->Branch("beamNumX_b3",&numtocalc_b3,"beamNumX_b3/I");
  369. rootTree->Branch("beamSignal_b0",&signal_b0,"beamSignal_b0/D");
  370. rootTree->Branch("beamSignal_b1",&signal_b1,"beamSignal_b1/D");
  371. rootTree->Branch("beamSignal_b2",&signal_b2,"beamSignal_b2/D");
  372. rootTree->Branch("beamSignal_b3",&signal_b3,"beamSignal_b3/D");
  373. rootTree->Branch("beamSignal_cor_b0",&signal_cor_b0,"beamSignal_cor_b0/D");
  374. rootTree->Branch("beamSignal_cor_b1",&signal_cor_b1,"beamSignal_cor_b1/D");
  375. rootTree->Branch("beamSignal_cor_b2",&signal_cor_b2,"beamSignal_cor_b2/D");
  376. rootTree->Branch("beamSignal_cor_b3",&signal_cor_b3,"beamSignal_cor_b3/D");
  377. rootTree->Branch("eventID",&eventID,"eventID/I");
  378. //rootTree->Branch("board_b0_ch",&board_b0_ch,"board_b0_ch[128]/D");
  379. //rootTree->Branch("board_b1_ch",&board_b1_ch,"board_b1_ch[128]/D");
  380. //rootTree->Branch("board_b2_ch",&board_b2_ch,"board_b2_ch[128]/D");
  381. //rootTree->Branch("board_b3_ch",&board_b3_ch,"board_b3_ch[128]/D");
  382. rootTree->Branch("arrayavg_b0",&arrayavg_b0,"arrayavg_b0/D");
  383. rootTree->Branch("arrayavg_b1",&arrayavg_b1,"arrayavg_b1/D");
  384. rootTree->Branch("arrayavg_b2",&arrayavg_b2,"arrayavg_b2/D");
  385. rootTree->Branch("arrayavg_b3",&arrayavg_b3,"arrayavg_b3/D");
  386. rootTree->Branch("M1elements_b0",&M1elements_b0,"M1elements_b0[9]/D");
  387. rootTree->Branch("M1elements_b1",&M1elements_b1,"M1elements_b1[9]/D");
  388. rootTree->Branch("M1elements_b2",&M1elements_b2,"M1elements_b2[9]/D");
  389. rootTree->Branch("M1elements_b3",&M1elements_b3,"M1elements_b3[9]/D");
  390. rootTree->Branch("goodevents_b0",&goodevents_b0,"goodevents_b0/I");
  391. rootTree->Branch("goodevents_b1",&goodevents_b1,"goodevents_b1/I");
  392. rootTree->Branch("goodevents_b2",&goodevents_b2,"goodevents_b2/I");
  393. rootTree->Branch("goodevents_b3",&goodevents_b3,"goodevents_b3/I");
  394. double time;
  395. // import and align matching ethercat data
  396. TTree *tree2 = new TTree("t2", "t2");
  397. if(ethercat){
  398. std::cout << " Loading Ethercat data." << std::endl;
  399. 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');
  400. std::cout << "Ethercat data loaded." << std::endl;
  401. tree2->Print();
  402. }
  403. int k = 0;
  404. // int count = 0;
  405. double ic1, ic2, mw1_focusx, mw1_focusy, mw2_focusx, mw2_focusy, mw1_posx, mw1_posy, mw2_posx, mw2_posy;
  406. 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;
  407. double analog_in1;
  408. double energy_index;
  409. double energy;
  410. 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.};
  411. 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.};
  412. 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.};
  413. 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.};
  414. double intensity_index;
  415. double intensity;
  416. 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};
  417. 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};
  418. 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};
  419. 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 };
  420. double ionsort;
  421. double rel_time2,time2;
  422. double timeoffset;
  423. int mwoffset;
  424. double timewindow;
  425. double timeoffset2;
  426. double timewindow2;
  427. if(ethercat){
  428. rootTree->Branch("ic1_avg", &ic1_avg, "ic1_avg/D");
  429. rootTree->Branch("mw1_posx", &mw1_posx_avg, "mw1_posx/D");
  430. rootTree->Branch("mw1_posy", &mw1_posy_avg, "mw1_posy/D");
  431. rootTree->Branch("energy_index", &energy_index, "energy_index/D");
  432. rootTree->Branch("intensity_index", &intensity_index, "intensity_index/D");
  433. rootTree->Branch("ionsort", &ionsort, "ionsort/D");
  434. timeoffset = -0.050; //offset between ic and bpm readouts
  435. mwoffset = 2; // offset for timestamped event. MW chamber position correlation seems to be better in other windows
  436. timewindow = -0.0999; //should be a negative number. window size in time to average over.
  437. timeoffset2 = -0.00; //offset between ic and bpm readouts
  438. timewindow2 = -0.0999; //should be a negative number. window size in time to average over.
  439. //////////////////////////////////////////////////////////////////
  440. ///// ETHERCAT DATA
  441. //////////////////////////////////////////////////////////////////
  442. // tree->SetBranchAddress("time", &time);
  443. tree2->SetBranchAddress("RELTIME2", &rel_time2);
  444. tree2->SetBranchAddress("TIME2", &time2);
  445. tree2->SetBranchAddress("IC1", &ic1);
  446. // tree2->SetBranchAddress("IC2", &ic2);
  447. //tree2->SetBranchAddress("MW1_FOCUSX", &mw1_focusx);
  448. //tree2->SetBranchAddress("MW1_FOCUSY", &mw1_focusy);
  449. ///tree2->SetBranchAddress("MW2_FOCUSX", &mw2_focusx);
  450. ///tree2->SetBranchAddress("MW2_FOCUSY", &mw2_focusy);
  451. tree2->SetBranchAddress("MW1_POSX", &mw1_posx);
  452. tree2->SetBranchAddress("MW1_POSY", &mw1_posy);
  453. //tree2->SetBranchAddress("MW2_POSX", &mw2_posx);
  454. //tree2->SetBranchAddress("MW2_POSY", &mw2_posy);
  455. tree2->SetBranchAddress("ENERGY_INDEX", &energy_index);
  456. tree2->SetBranchAddress("INTENSITY_INDEX", &intensity_index);
  457. tree2->SetBranchAddress("ION-SORT", &ionsort);
  458. tree2->SetBranchAddress("ANALOG_IN1", &analog_in1);
  459. }
  460. int currentEntryTree2 = 1;
  461. // int nevents = tree->GetEntries();
  462. int nevents2 = tree2->GetEntries();
  463. int icCounter = 0;
  464. int count = 0;
  465. int count2 = 0;
  466. //loop through recorded data frames
  467. for (int frame = 0; frame<fileframesize; frame++){
  468. // if (icCounter>10000) break;
  469. // if(frame>2000&&frame<120000) continue;
  470. eventID = frame;
  471. if (ethercat){
  472. if (timestampfile) timestampfile >> time ;
  473. //printf("%i %f\n", eventID, time);
  474. count= 0;
  475. count2 = 0;
  476. ic1_avg = 0.;
  477. mw1_posx_avg = 0.;
  478. mw1_posy_avg = 0.;
  479. tree2->GetEntry(currentEntryTree2);
  480. /* if (frame % 100 == 0)
  481. {
  482. printf("merging event %d ,", frame);
  483. printf("Time %f \n", time);
  484. printf("Entry hit %d ,", currentEntryTree2);
  485. printf("Time hit %f \n", time2);
  486. }
  487. */
  488. while (time2 < time + timeoffset && currentEntryTree2 < nevents2 )
  489. {
  490. if (time2 - time - timeoffset > timewindow)
  491. {
  492. tree2->GetEntry(currentEntryTree2);
  493. if (ic1>0.0) ic1_avg += ic1;
  494. if (ic1>0.0) count++;
  495. // 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);
  496. }
  497. tree2->GetEntry(currentEntryTree2);
  498. if ( time2 - time - timeoffset2 > timewindow2)
  499. {
  500. tree2->GetEntry(currentEntryTree2 + mwoffset); //why currentEtryTree2-4?
  501. mw1_posx_avg += mw1_posx;
  502. mw1_posy_avg += mw1_posy;
  503. count2++;
  504. // if (i % 2000 == 0) printf("%i %2.3f %2.3f %2.3f %2.3f\n", count2, time, time2, ic1, mw1_posx);
  505. //if (i % 2001 == 0) printf("%i %2.3f %2.3f %2.3f %2.3f\n", count2, time, time2, ic1, mw1_posx);
  506. // if (i % 2002 == 0) printf("%i %2.3f %2.3f %2.3f %2.3f\n", count2, time, time2, ic1, mw1_posx);
  507. // printf("%i %2.3f %2.3f %2.3f %2.3f\n", count2, time, time2, ic1, mw1_posx);
  508. }
  509. // currentEntryTree2++;
  510. tree2->GetEntry(currentEntryTree2);
  511. currentEntryTree2++;
  512. if (count2>0){
  513. mw1_posx_avg /= double(count2); //the positions are weighted by the charge
  514. mw1_posy_avg /= double(count2);
  515. }
  516. if(count>0){
  517. ic1_avg /= double(count);
  518. if (ic1_avg>1.) icCounter++;
  519. // if (frame % 2000 == 0) printf("%i %f.2 %i \n", count, ic1_avg, icCounter);
  520. }
  521. // std::cout << ic1_avg << " " << icCounter << std::endl;
  522. }
  523. /////////end of ethercat matching
  524. if (floor(energy_index/10.)>=0&&floor(energy_index/10)<=26){energy_indexbin = floor(energy_index/10.);}
  525. else {energy_indexbin=27;}
  526. if (ionsort==3){
  527. //protons
  528. energy = energy_list_p[ energy_indexbin];
  529. intensity = intensity_list_p[ int(intensity_index) ];
  530. sp_air = f_sp_air->Eval(energy)*(intensity/1.0E6);
  531. sp_ps = f_sp_ps->Eval(energy)*(intensity/1.0E6);
  532. sp2_air = f_sp_air->Eval(energy);
  533. sp2_ps = f_sp_ps->Eval(energy);
  534. lorentz_gamma = energy/938.272 +1.; // lorentz_gamma = E_u/M_u +1
  535. mybeta = sqrt(1. - 1./(lorentz_gamma*lorentz_gamma));
  536. zsqr = 1.;
  537. }
  538. else if (ionsort==1){
  539. //helium
  540. energy = energy_list_he[ energy_indexbin ];
  541. intensity = intensity_list_he[ int(intensity_index) ];
  542. sp_air = f_h2sp_air->Eval(energy)*(intensity/1.0E6);
  543. sp_ps = f_h2sp_ps->Eval(energy)*(intensity/1.0E6);
  544. sp2_air = f_h2sp_air->Eval(energy);
  545. sp2_ps = f_h2sp_ps->Eval(energy);
  546. lorentz_gamma = energy/932.1055 +1.;// lorentz_gamma = E_u/M_u +1
  547. mybeta = sqrt(1. - 1./(lorentz_gamma*lorentz_gamma));
  548. zsqr = 4.;
  549. }
  550. else if (ionsort==4){
  551. //carbon
  552. energy = energy_list_c[ energy_indexbin];
  553. intensity = intensity_list_c[ int(intensity_index) ];
  554. sp_air = f_c12sp_air->Eval(energy)*(intensity/1.0E6);
  555. sp_ps = f_c12sp_ps->Eval(energy)*(intensity/1.0E6);
  556. sp2_air = f_c12sp_air->Eval(energy);
  557. sp2_ps = f_c12sp_ps->Eval(energy);
  558. lorentz_gamma = energy/932.3539 +1.;// lorentz_gamma = E_u/M_u +1
  559. mybeta = sqrt(1. - 1./(lorentz_gamma*lorentz_gamma));
  560. zsqr = 36.;
  561. }
  562. else if (ionsort==2){
  563. //oxygen
  564. energy = energy_list_o[ energy_indexbin];
  565. intensity = intensity_list_o[ int(intensity_index) ];
  566. sp_air = f_o16sp_air->Eval(energy)*(intensity/1.0E6);
  567. sp_ps = f_o16sp_ps->Eval(energy)*(intensity/1.0E6);
  568. sp2_air = f_o16sp_air->Eval(energy);
  569. sp2_ps = f_o16sp_ps->Eval(energy);
  570. lorentz_gamma = energy/931.4418 +1.;// lorentz_gamma = E_u/M_u +1
  571. mybeta = sqrt(1. - 1./(lorentz_gamma*lorentz_gamma));
  572. zsqr = 64.;
  573. }
  574. else {
  575. sp_air = -1.;
  576. sp_ps = -1.;
  577. sp2_air = -1.;
  578. sp2_ps = -1.;
  579. lorentz_gamma = 0.;
  580. mybeta = 0.;
  581. zsqr = -1.;
  582. }
  583. // intcorr = (Intensity /19.8E6) / (totalcurrent/sp2_air/totaltime);
  584. intcorr = (intensity / 19.8E6) / (ic1_avg/sp2_air)/ 3.11;
  585. // if (frame>2000&&ic1_avg<0.5) continue;
  586. }
  587. ///////////////////////////////////
  588. //// HIT DATA
  589. ///////////////////////////////////
  590. if (frame>2000 && beam_wason == true && beam_off == true) { beamoffcounter++;
  591. // cout << beamoffcounter<< endl;
  592. }
  593. if (samplenoise==false && frame> 2000 && beam_wason == true && beam_off == true && beamoffcounter==5000) {
  594. samplenoise = true;
  595. }
  596. //board_b 0
  597. board_b=0;
  598. signal_b0 = 0.;
  599. maxchannelamp_b0 = 0.;
  600. file.seekg(framestart*sizeof(BufferData)+board_b*sizeof(BufferData)+4*frame*sizeof(BufferData));
  601. file.read ((char*)dataptr ,sizeof(BufferData));
  602. if (dataptr->sync_frame.device_nr==board_b){
  603. // 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;
  604. if (frame%10000==0) std::cout << "Frame: " << frame << " (" <<double(frame)/double(fileframesize)*100.0 << "%)" << std::endl;
  605. arrayavg_b0 = 0;
  606. //shift the events of the rolling average of the signal one left
  607. for (int j = 1; j<length;j++){
  608. array_b0[j-1] = array_b0[j];
  609. arrayavg_b0 += array_b0[j-1];
  610. // cout << array_b0[j-1] << " ";
  611. }
  612. array_b0[length-1] = 0.;
  613. // cout << endl;
  614. ///loop over the channels
  615. for (int i = 0;i<128;i++){
  616. board_b0_ch[i] = dataptr->sensor_data[i];
  617. if (frame<1000 || samplenoise==true){
  618. if (samplenoise==true&& beamoffcounter==5000) {
  619. board_b0_ch_bkg[i]=0.;
  620. if(i==0) cout << frame << " Resampling noise " << beamoffcounter << endl;
  621. }
  622. board_b0_ch_bkg[i] += board_b0_ch[i]/1000.; //find baseline from the average of first 1000 events
  623. if (samplenoise==true && beamoffcounter==6000) {
  624. beam_wason = false;
  625. samplenoise =false;
  626. cout << frame << " End sampling." << endl;
  627. }
  628. }
  629. else if (frame>=1000&& frame<2000){
  630. board_b0_ch[i] -= board_b0_ch_bkg[i]; //histogram the subtracted baseline in the next 1000 events
  631. th2_signal_vs_channel_bkg_b0->Fill(i,board_b0_ch[i]);
  632. if (i==1) graph_bkg_b0->SetPoint(graph_bkg_b0->GetN(), frame, board_b0_ch[i]);
  633. }
  634. else if (frame>=2000 && samplenoise==false) {
  635. board_b0_ch[i]-=board_b0_ch_bkg[i]; // the rest background subtracted
  636. // board_b0_ch[i]*=calibration_b0[i]; //calibration factor
  637. th2_signal_vs_channel_b0->Fill(i,board_b0_ch[i]);
  638. //find the peak channel
  639. if (board_b0_ch[i]> maxchannelamp_b0) {
  640. maxchannel_b0 = i;
  641. maxchannelamp_b0 = board_b0_ch[i];
  642. // cout << maxchannel_b0 << " " <<maxchannelamp_b0 << endl;
  643. }
  644. ///add new event to the rolling average.
  645. if( board_b0_ch[i]>50.0){
  646. array_b0[length-1] += board_b0_ch[i];
  647. }
  648. ////////////////////////////////////////////
  649. }
  650. }//end of 128
  651. // th1_signal_b0->Fill(signal_b0);
  652. if (frame>2000) {
  653. arrayavg_b0 += array_b0[length-1]/length;
  654. if (arrayavg_b0>= 20000) {
  655. beamoncounter++;
  656. }
  657. if (beamoncounter>100 && beam_wason == false && arrayavg_b0>= 20000) {
  658. beam_off = false;
  659. beam_wason = true;
  660. cout << frame << " Beam on " << arrayavg_b0 << endl;
  661. }
  662. if (arrayavg_b0< 10000) {
  663. if(beam_wason== true && beam_off==false ) {
  664. cout << frame << "Beam went OFF!" << arrayavg_b0 << endl;
  665. beamoffcounter = 0;
  666. }
  667. beam_off = true;
  668. goodevents_b0=0;
  669. goodevents_b1=0;
  670. goodevents_b2=0;
  671. goodevents_b3=0;
  672. }
  673. }
  674. // cout << frame << " Rolling average: " << arrayavg_b0 << endl;// " ic: " << ic1_avg << endl;
  675. }
  676. else {
  677. std::cout << "Error." << std::endl;
  678. }
  679. //board_b 1
  680. board_b=1;
  681. signal_b1 = 0.;
  682. maxchannelamp_b1 = 0.;
  683. file.seekg(framestart*sizeof(BufferData)+board_b*sizeof(BufferData)+4*frame*sizeof(BufferData));
  684. file.read ((char*)dataptr ,sizeof(BufferData));
  685. if (dataptr->sync_frame.device_nr==board_b){
  686. // 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;
  687. arrayavg_b1 = 0;
  688. //shift the events of the rolling average of the signal one left
  689. for (int j = 1; j<length;j++){
  690. array_b1[j-1] = array_b1[j];
  691. arrayavg_b1 += array_b1[j-1];
  692. // cout << array_b1[j-1] << " ";
  693. }
  694. array_b1[length-1] = 0.;
  695. // cout << endl;
  696. ///loop over the channels
  697. for (int i = 0;i<128;i++){
  698. board_b1_ch[i] = dataptr->sensor_data[i];
  699. if (frame<1000){
  700. board_b1_ch_bkg[i] += board_b1_ch[i]/1000.; //find baseline from the average of first 1000 events
  701. }
  702. else if (frame>=1000&& frame<2000){
  703. board_b1_ch[i] -= board_b1_ch_bkg[i]; //histogram the subtracted baseline in the next 1000 events
  704. th2_signal_vs_channel_bkg_b1->Fill(i,board_b1_ch[i]);
  705. if (i==1) graph_bkg_b1->SetPoint(graph_bkg_b1->GetN(), frame, board_b1_ch[i]);
  706. }
  707. else if (frame>=2000) {
  708. board_b1_ch[i]-=board_b1_ch_bkg[i]; // the rest background subtracted
  709. // board_b1_ch[i]*=calibration_b1[i]; //calibration factor
  710. th2_signal_vs_channel_b1->Fill(i,board_b1_ch[i]);
  711. //find the peak channel
  712. if (board_b1_ch[i]> maxchannelamp_b1) {
  713. maxchannel_b1 = i;
  714. maxchannelamp_b1 = board_b1_ch[i];
  715. // cout << maxchannel_b1 << " " <<maxchannelamp_b1 << endl;
  716. }
  717. ///add new event to the rolling average.
  718. if( board_b1_ch[i]>50.0){
  719. array_b1[length-1] += board_b1_ch[i];
  720. }
  721. ////////////////////////////////////////////
  722. }
  723. }//end of 128
  724. // th1_signal_b1->Fill(signal_b1);
  725. arrayavg_b1 += array_b1[length-1]/length;
  726. // cout << frame << " Rolling average: " << arrayavg_b1 << endl;// " ic: " << ic1_avg << endl;
  727. }
  728. else {
  729. std::cout << "Error." << std::endl;
  730. }
  731. //board_b 2
  732. board_b=2;
  733. signal_b2 = 0.;
  734. maxchannelamp_b2 = 0.;
  735. file.seekg(framestart*sizeof(BufferData)+board_b*sizeof(BufferData)+4*frame*sizeof(BufferData));
  736. file.read ((char*)dataptr ,sizeof(BufferData));
  737. if (dataptr->sync_frame.device_nr==board_b){
  738. // 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;
  739. arrayavg_b2 = 0;
  740. //shift the events of the rolling average of the signal one left
  741. for (int j = 1; j<length;j++){
  742. array_b2[j-1] = array_b2[j];
  743. arrayavg_b2 += array_b2[j-1];
  744. // cout << array_b2[j-1] << " ";
  745. }
  746. array_b2[length-1] = 0.;
  747. // cout << endl;
  748. ///loop over the channels
  749. for (int i = 0;i<128;i++){
  750. board_b2_ch[i] = dataptr->sensor_data[i];
  751. if (frame<1000){
  752. board_b2_ch_bkg[i] += board_b2_ch[i]/1000.; //find baseline from the average of first 1000 events
  753. }
  754. else if (frame>=1000&& frame<2000){
  755. board_b2_ch[i] -= board_b2_ch_bkg[i]; //histogram the subtracted baseline in the next 1000 events
  756. th2_signal_vs_channel_bkg_b2->Fill(i,board_b2_ch[i]);
  757. if (i==1) graph_bkg_b2->SetPoint(graph_bkg_b2->GetN(), frame, board_b2_ch[i]);
  758. }
  759. else if (frame>=2000) {
  760. board_b2_ch[i]-=board_b2_ch_bkg[i]; // the rest background subtracted
  761. // board_b2_ch[i]*=calibration_b2[i]; //calibration factor
  762. th2_signal_vs_channel_b2->Fill(i,board_b2_ch[i]);
  763. //find the peak channel
  764. if (board_b2_ch[i]> maxchannelamp_b2) {
  765. maxchannel_b2 = i;
  766. maxchannelamp_b2 = board_b2_ch[i];
  767. // cout << maxchannel_b2 << " " <<maxchannelamp_b2 << endl;
  768. }
  769. ///add new event to the rolling average.
  770. if( board_b2_ch[i]>50.0){
  771. array_b2[length-1] += board_b2_ch[i];
  772. }
  773. ////////////////////////////////////////////
  774. }
  775. }//end of 128
  776. // th1_signal_b2->Fill(signal_b2);
  777. arrayavg_b2 += array_b2[length-1]/length;
  778. // cout << frame << " Rolling average: " << arrayavg_b2 << endl;// " ic: " << ic1_avg << endl;
  779. }
  780. else {
  781. std::cout << "Error." << std::endl;
  782. }
  783. //board_b 3
  784. board_b=3;
  785. signal_b3 = 0.;
  786. maxchannelamp_b3 = 0.;
  787. file.seekg(framestart*sizeof(BufferData)+board_b*sizeof(BufferData)+4*frame*sizeof(BufferData));
  788. file.read ((char*)dataptr ,sizeof(BufferData));
  789. if (dataptr->sync_frame.device_nr==board_b){
  790. // 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;
  791. arrayavg_b3 = 0;
  792. //shift the events of the rolling average of the signal one left
  793. for (int j = 1; j<length;j++){
  794. array_b3[j-1] = array_b3[j];
  795. arrayavg_b3 += array_b3[j-1];
  796. // cout << array_b3[j-1] << " ";
  797. }
  798. array_b3[length-1] = 0.;
  799. // cout << endl;
  800. ///loop over the channels
  801. for (int i = 0;i<128;i++){
  802. board_b3_ch[i] = dataptr->sensor_data[i];
  803. if (frame<1000){
  804. board_b3_ch_bkg[i] += board_b3_ch[i]/1000.; //find baseline from the average of first 1000 events
  805. }
  806. else if (frame>=1000&& frame<2000){
  807. board_b3_ch[i] -= board_b3_ch_bkg[i]; //histogram the subtracted baseline in the next 1000 events
  808. th2_signal_vs_channel_bkg_b3->Fill(i,board_b3_ch[i]);
  809. if (i==1) graph_bkg_b3->SetPoint(graph_bkg_b3->GetN(), frame, board_b3_ch[i]);
  810. }
  811. else if (frame>=2000) {
  812. board_b3_ch[i]-=board_b3_ch_bkg[i]; // the rest background subtracted
  813. // board_b3_ch[i]*=calibration_b3[i]; //calibration factor
  814. th2_signal_vs_channel_b3->Fill(i,board_b3_ch[i]);
  815. //find the peak channel
  816. if (board_b3_ch[i]> maxchannelamp_b3) {
  817. maxchannel_b3 = i;
  818. maxchannelamp_b3 = board_b3_ch[i];
  819. // cout << maxchannel_b3 << " " <<maxchannelamp_b3 << endl;
  820. }
  821. ///add new event to the rolling average.
  822. if( board_b3_ch[i]>50.0){
  823. array_b3[length-1] += board_b3_ch[i];
  824. }
  825. ////////////////////////////////////////////
  826. }
  827. }//end of 128
  828. // th1_signal_b3->Fill(signal_b3);
  829. arrayavg_b3 += array_b3[length-1]/length;
  830. // cout << frame << " Rolling average: " << arrayavg_b3 << endl;// " ic: " << ic1_avg << endl;
  831. }
  832. else {
  833. std::cout << "Error." << std::endl;
  834. }
  835. ////////////////////////////////////////////////////////////
  836. ////////////////////////////////////////////////////////////
  837. //start the signal analysis
  838. ////////////////////////////////////////////////////////////
  839. ////////////////////////////////////////////////////////////
  840. if (frame>=2000&&beam_off == false&&beam_wason == true){
  841. ////////////////////////////////////////////////////////////
  842. //find the approx FWHM
  843. ////////////////////////////////////////////////////////////
  844. nfwhm_b0 =0;
  845. nfwhm_b1 =0;
  846. nfwhm_b2 =0;
  847. nfwhm_b3 =0;
  848. for (int i = 0;i<128;i++){
  849. if (board_b0_ch[i] > maxchannelamp_b0/3.) nfwhm_b0++; //switched to a lower threshold 1/3 instead of 1/2
  850. if (board_b1_ch[i] > maxchannelamp_b1/3.) nfwhm_b1++;
  851. if (board_b2_ch[i] > maxchannelamp_b2/3.) nfwhm_b2++;
  852. if (board_b3_ch[i] > maxchannelamp_b3/3.) nfwhm_b3++;
  853. signal_gsl_b0[i] = 0.;
  854. signal_gsl_b1[i] = 0.;
  855. signal_gsl_b2[i] = 0.;
  856. signal_gsl_b3[i] = 0.;
  857. }
  858. ////////////////////////////////////////////////////////////
  859. //integrate under the approximate peak
  860. //build the channel list for statistical analysis
  861. ////////////////////////////////////////////////////////////
  862. numtocalc_b0 = 0;
  863. numtocalc_b1 = 0;
  864. numtocalc_b2 = 0;
  865. numtocalc_b3 = 0;
  866. signal_b0 = 0. - signaloffset_b0[energy_indexbin];
  867. // cout << energy_indexbin << endl;
  868. for (int i = maxchannel_b0-nfwhm_b0 ; i <= maxchannel_b0 + nfwhm_b0; i++){
  869. if (i>=0 && i<=127 && board_b0_ch[i]>0){
  870. signal_b0 +=board_b0_ch[i];
  871. signal_gsl_b0[numtocalc_b0]=board_b0_ch[i];
  872. // channellist_gsl_b0[numtocalc_b0] = i;
  873. channellist_gsl_b0[numtocalc_b0] = pos[i];
  874. numtocalc_b0++;
  875. }
  876. }
  877. th1_signal_b0->Fill(signal_b0); //cout << signal_b0 << endl;
  878. if (ic1_avg>0.1){
  879. h_beamSignal_b0[energy_indexbin]->Fill(signal_b0);
  880. goodevents_b0++;
  881. }
  882. signal_b1 = 0. - signaloffset_b1[energy_indexbin];;
  883. for (int i = maxchannel_b1-nfwhm_b1 ; i <= maxchannel_b1 + nfwhm_b1; i++){
  884. if (i>=0 && i<=127&&board_b1_ch[i]>0){
  885. signal_b1 +=board_b1_ch[i] ;
  886. signal_gsl_b1[numtocalc_b1]=board_b1_ch[i];
  887. // channellist_gsl_b1[numtocalc_b1] = i;
  888. channellist_gsl_b1[numtocalc_b1] = pos[i];
  889. numtocalc_b1++;
  890. }
  891. }
  892. th1_signal_b1->Fill(signal_b1);
  893. if (ic1_avg>0.1){
  894. h_beamSignal_b1[energy_indexbin]->Fill(signal_b1);
  895. goodevents_b1++;
  896. }
  897. signal_b2 = 0. - signaloffset_b2[energy_indexbin];;
  898. for (int i = maxchannel_b2-nfwhm_b2 ; i <= maxchannel_b2 + nfwhm_b2; i++){
  899. if (i>=0 && i<=127&&board_b2_ch[i]>0){
  900. signal_b2 +=board_b2_ch[i];
  901. signal_gsl_b2[numtocalc_b2]=board_b2_ch[i];
  902. // channellist_gsl_b2[numtocalc_b2] = i;
  903. channellist_gsl_b2[numtocalc_b2] = pos[i];
  904. numtocalc_b2++;
  905. }
  906. }
  907. th1_signal_b2->Fill(signal_b2);
  908. if (ic1_avg>0.1) {
  909. h_beamSignal_b2[energy_indexbin]->Fill(signal_b2);
  910. goodevents_b2++;
  911. }
  912. signal_b3 = 0. - signaloffset_b3[energy_indexbin];
  913. for (int i = maxchannel_b3-nfwhm_b3 ; i <= maxchannel_b3 + nfwhm_b3; i++){
  914. if (i>=0 && i<=127&&board_b3_ch[i]>0){
  915. signal_b3 +=board_b3_ch[i];
  916. signal_gsl_b3[numtocalc_b3]=board_b3_ch[i];
  917. //channellist_gsl_b3[numtocalc_b3] = i;
  918. channellist_gsl_b3[numtocalc_b3] = pos[i];
  919. numtocalc_b3++;
  920. }
  921. }
  922. th1_signal_b3->Fill(signal_b3);
  923. if (ic1_avg>0.1) {
  924. h_beamSignal_b3[energy_indexbin]->Fill(signal_b3);
  925. h_beamSignal_ic1[energy_indexbin]->Fill(ic1_avg);
  926. goodevents_b3++;
  927. }
  928. signal_cor_b0 = signal_b0*intcorr/(intensity/1.E6)/sp2_ps;
  929. signal_cor_b1 = signal_b1*intcorr/(intensity/1.E6)/sp2_ps;
  930. signal_cor_b2 = signal_b2*intcorr/(intensity/1.E6)/sp2_ps;
  931. signal_cor_b3 = signal_b3*intcorr/(intensity/1.E6)/sp2_ps;
  932. if (signal_cor_b0 >0.05 && signal_cor_b0 < 10.) {h_beamSignal_cor_b0[energy_indexbin]->Fill(signal_cor_b0);}
  933. if (signal_cor_b1 >0.05 && signal_cor_b1 < 10.) {h_beamSignal_cor_b1[energy_indexbin]->Fill(signal_cor_b1);}
  934. if (signal_cor_b2 >0.05 && signal_cor_b2 < 10.) {h_beamSignal_cor_b2[energy_indexbin]->Fill(signal_cor_b2);}
  935. if (signal_cor_b3 >0.05 && signal_cor_b3 < 10.) {h_beamSignal_cor_b3[energy_indexbin]->Fill(signal_cor_b3);}
  936. ///////////////// linear regression using Integration by parts of gaussian function.
  937. if (doLinInt&&numtocalc_b0>=3&&numtocalc_b1>=3&&numtocalc_b2>=3&&numtocalc_b3>=3){
  938. for (int j = 0; j<=4; j++){
  939. if (j== 0) {
  940. copy(signal_gsl_b0,signal_gsl_b0+128, signal_reg);
  941. copy(channellist_gsl_b0,channellist_gsl_b0+128, channellist_reg);
  942. numtocalc_reg = numtocalc_b0;
  943. }
  944. else if (j== 1) {
  945. copy(signal_gsl_b1,signal_gsl_b1+128, signal_reg);
  946. copy(channellist_gsl_b1,channellist_gsl_b1+128, channellist_reg);
  947. numtocalc_reg = numtocalc_b1;
  948. }
  949. else if (j== 2) {
  950. copy(signal_gsl_b2,signal_gsl_b2+128, signal_reg);
  951. copy(channellist_gsl_b2,channellist_gsl_b2+128, channellist_reg);
  952. numtocalc_reg = numtocalc_b2;
  953. }
  954. else if (j== 3) {
  955. copy(signal_gsl_b3,signal_gsl_b3+128, signal_reg);
  956. copy(channellist_gsl_b3,channellist_gsl_b3+128, channellist_reg);
  957. numtocalc_reg = numtocalc_b3;
  958. }
  959. SumY = 0.;
  960. SumS = 0.;
  961. SumT = 0.;
  962. SumS2 = 0.;
  963. SumST = 0.;
  964. SumT2 = 0.;
  965. SumYS = 0.;
  966. SumYT = 0.;
  967. b_den = 0.;
  968. b_num = 0.;
  969. b = 0.;
  970. SumYYM = 0.;
  971. SumYYP = 0.;
  972. MeanY = 0.;
  973. for(int k=0; k<numtocalc_b0;k++){
  974. if (k==0){
  975. S[k]=0.; T[k]=0.;
  976. }
  977. else{
  978. S[k] = S[k-1]+0.5*( signal_reg[k] + signal_reg[k-1] ) * ( channellist_reg[k] - channellist_reg[k-1] );
  979. 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] );
  980. }
  981. // cout << S[k] << " " << T[k] << endl;
  982. SumS += S[k]; SumT += T[k];
  983. SumY += signal_reg[k];
  984. SumS2 += S[k]*S[k]; SumST += S[k]*T[k]; SumT2 += T[k]*T[k];
  985. SumYS += signal_reg[k]*S[k];
  986. SumYT += signal_reg[k]*T[k];
  987. MeanY+=signal_reg[k];
  988. }
  989. MeanY/=numtocalc_reg;
  990. M1(0,0) = SumT2; M1(0,1) = SumST; M1(0,2) = SumT; M1(1,0) = SumST; M1(1,1) = SumS2;
  991. M1(1,2) = SumS; M1(2,0) = SumT; M1(2,1) = SumS;
  992. M1(2,2) = numtocalc_reg;
  993. M2(0) = SumYT; M2(1) = SumYS; M2(2) = SumY;
  994. M1inv = M1.Invert(); ABC = M1inv * M2;
  995. //calculate b,p,c ---> y = b*exp(-p*(x-c)*(x-c))
  996. p = -ABC(0)/2.; c = -ABC(1)/ABC(0);
  997. for(int k=0; k<numtocalc_reg;k++){
  998. b_num += exp(-p*(channellist_reg[k]-c)*(channellist_reg[k]-c)) * signal_reg[k];
  999. b_den += exp(-2*p*(channellist_reg[k]-c)*(channellist_reg[k]-c));
  1000. }
  1001. b = b_num/b_den;
  1002. //calculate R-squared
  1003. ///residual plots (should be normally distributed). They are normalised to the standard error of the baseline (17 ADC units)
  1004. for(int k=0; k<numtocalc_reg;k++){
  1005. SumYYM+= (signal_reg[k]-MeanY)*(signal_reg[k]-MeanY);
  1006. 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 );
  1007. if (j == 0) {
  1008. h_regresidual_b0->Fill((b*exp(-p*(channellist_reg[k]-c)*(channellist_reg[k]-c)) - signal_reg[k])/signal_reg[k]);
  1009. 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]);
  1010. }
  1011. if (j == 1) {
  1012. h_regresidual_b1->Fill((b*exp(-p*(channellist_reg[k]-c)*(channellist_reg[k]-c)) - signal_reg[k])/signal_reg[k]);
  1013. 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]);
  1014. }
  1015. if (j == 2) {
  1016. h_regresidual_b2->Fill((b*exp(-p*(channellist_reg[k]-c)*(channellist_reg[k]-c)) - signal_reg[k])/signal_reg[k]);
  1017. 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]);
  1018. }
  1019. if (j == 3) {
  1020. h_regresidual_b3->Fill((b*exp(-p*(channellist_reg[k]-c)*(channellist_reg[k]-c)) - signal_reg[k])/signal_reg[k]);
  1021. 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]);
  1022. }
  1023. }
  1024. // cout << "R-squared = " << SumYYP/SumYYM << endl;
  1025. //final results
  1026. if (j == 0) {
  1027. beamFocusX_reg_b0 = 2.3548/sqrt(2*p);
  1028. beamPosX_reg_b0 = -ABC(1)/ ABC(0);
  1029. beamPeakX_reg_b0 = b;
  1030. beamRsqr_b0 = SumYYP/SumYYM;
  1031. 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)
  1032. 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)
  1033. M1elements_b0[0] = SumT2;
  1034. M1elements_b0[1] = SumST;
  1035. M1elements_b0[2] = SumT;
  1036. M1elements_b0[3] = SumST;
  1037. M1elements_b0[4] = SumS2;
  1038. M1elements_b0[5] = SumS;
  1039. M1elements_b0[6] = SumT;
  1040. M1elements_b0[7] = SumS;
  1041. M1elements_b0[8] = numtocalc_reg;
  1042. }
  1043. else if (j == 1) {
  1044. beamFocusX_reg_b1 = 2.3548/sqrt(2*p);
  1045. beamPosX_reg_b1 = -ABC(1)/ ABC(0);
  1046. beamPeakX_reg_b1 = b;
  1047. beamRsqr_b1 = SumYYP/SumYYM;
  1048. 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)
  1049. 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)
  1050. M1elements_b0[0] = SumT2;
  1051. M1elements_b1[1] = SumST;
  1052. M1elements_b1[2] = SumT;
  1053. M1elements_b1[3] = SumST;
  1054. M1elements_b1[4] = SumS2;
  1055. M1elements_b1[5] = SumS;
  1056. M1elements_b1[6] = SumT;
  1057. M1elements_b1[7] = SumS;
  1058. M1elements_b1[8] = numtocalc_reg;
  1059. }
  1060. else if (j == 2) {
  1061. beamFocusX_reg_b2 = 2.3548/sqrt(2*p);
  1062. beamPosX_reg_b2 = -ABC(1)/ ABC(0);
  1063. beamPeakX_reg_b2 = b;
  1064. beamRsqr_b2 = SumYYP/SumYYM;
  1065. 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)
  1066. 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)
  1067. M1elements_b2[0] = SumT2;
  1068. M1elements_b2[1] = SumST;
  1069. M1elements_b2[2] = SumT;
  1070. M1elements_b2[3] = SumST;
  1071. M1elements_b2[4] = SumS2;
  1072. M1elements_b2[5] = SumS;
  1073. M1elements_b2[6] = SumT;
  1074. M1elements_b2[7] = SumS;
  1075. M1elements_b2[8] = numtocalc_reg;
  1076. }
  1077. else if (j == 3) {
  1078. beamFocusX_reg_b3 = 2.3548/sqrt(2*p);
  1079. beamPosX_reg_b3 = -ABC(1)/ ABC(0);
  1080. beamPeakX_reg_b3 = b;
  1081. beamRsqr_b3 = SumYYP/SumYYM;
  1082. 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)
  1083. 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)
  1084. M1elements_b0[0] = SumT2;
  1085. M1elements_b3[1] = SumST;
  1086. M1elements_b3[2] = SumT;
  1087. M1elements_b3[3] = SumST;
  1088. M1elements_b3[4] = SumS2;
  1089. M1elements_b3[5] = SumS;
  1090. M1elements_b3[6] = SumT;
  1091. M1elements_b3[7] = SumS;
  1092. M1elements_b3[8] = numtocalc_reg;
  1093. }
  1094. }
  1095. }
  1096. else if (numtocalc_b0>0&&numtocalc_b1>0) {
  1097. beamPosX_reg_b0 = gsl_stats_wmean(signal_gsl_b0,1,channellist_gsl_b0,1,numtocalc_b0); //calculate the weighted mean
  1098. beamFocusX_reg_b0 = gsl_stats_wsd_with_fixed_mean(signal_gsl_b0,1,channellist_gsl_b0,1,numtocalc_b0,beamPosX_reg_b0); //Standard Deviation
  1099. beamFocusX_reg_b0 *=2.3548;//SD-->FWHM
  1100. beamPosX_reg_b1 = gsl_stats_wmean(signal_gsl_b1,1,channellist_gsl_b1,1,numtocalc_b1); //calculate the weighted mean
  1101. beamFocusX_reg_b1 = gsl_stats_wsd_with_fixed_mean(signal_gsl_b1,1,channellist_gsl_b1,1,numtocalc_b1,beamPosX_reg_b1); //Standard Deviation
  1102. beamNumX_b1 = numtocalc_b1;
  1103. beamFocusX_reg_b1 *=2.3548;//SD-->FWHM
  1104. beamPosX_reg_b2 = gsl_stats_wmean(signal_gsl_b2,1,channellist_gsl_b2,1,numtocalc_b2); //calculate the weighted mean
  1105. beamFocusX_reg_b2 = gsl_stats_wsd_with_fixed_mean(signal_gsl_b2,1,channellist_gsl_b2,1,numtocalc_b2,beamPosX_reg_b2); //Standard Deviation
  1106. beamNumX_b2 = numtocalc_b2;
  1107. beamFocusX_reg_b2 *=2.3548;//SD-->FWHM
  1108. beamPosX_reg_b3 = gsl_stats_wmean(signal_gsl_b3,1,channellist_gsl_b3,1,numtocalc_b3); //calculate the weighted mean
  1109. beamFocusX_reg_b3 = gsl_stats_wsd_with_fixed_mean(signal_gsl_b3,1,channellist_gsl_b3,1,numtocalc_b3,beamPosX_reg_b3); //Standard Deviation
  1110. beamNumX_b3 = numtocalc_b3;
  1111. beamFocusX_reg_b3 *=2.3548;//SD-->FWHM
  1112. beamRsqr_b0 = .0;
  1113. beamRsqr_b1 = .0;
  1114. beamRsqr_b2 = .0;
  1115. beamRsqr_b3 = .0;
  1116. }
  1117. else
  1118. {
  1119. beamFocusX_reg_b0 = 0.;
  1120. beamFocusX_reg_b1 = 0.;
  1121. beamFocusX_reg_b1 = 0.;
  1122. beamFocusX_reg_b1 = 0.;
  1123. beamPosX_reg_b0 = 0.;
  1124. beamPosX_reg_b1 = 0.;
  1125. beamPosX_reg_b2 = 0.;
  1126. beamPosX_reg_b3 = 0.;
  1127. beamRsqr_b0 = .0;
  1128. beamRsqr_b1 = .0;
  1129. beamRsqr_b2 = .0;
  1130. beamRsqr_b3 = .0;
  1131. }
  1132. rootTree->Fill();
  1133. }
  1134. if (frameend>0 && frame+framestart>=frameend) break;
  1135. }//end of loop over frames
  1136. graph_bkg_b0->SetName("graph_bkg_b0"); // graph_bkg_b0->Write();
  1137. graph_bkg_b1->SetName("graph_bkg_b1"); // graph_bkg_b1->Write();
  1138. graph_bkg_b2->SetName("graph_bkg_b2"); // graph_bkg_b2->Write();
  1139. graph_bkg_b3->SetName("graph_bkg_b3"); // graph_bkg_b3->Write();
  1140. // bic1->Fill();
  1141. // bmw1_posx->Fill();
  1142. //bmw1_posy->Fill();
  1143. ///make reduced signal graph.
  1144. for (int jjj = 0; jjj<23;jjj++) {
  1145. // beamSignal_cor_b0_mean[jjj] = h_beamSignal_cor_b0[jjj]->GetMean();
  1146. // beamSignal_cor_b1_mean[jjj] = h_beamSignal_cor_b1[jjj]->GetMean();
  1147. // beamSignal_cor_b2_mean[jjj] = h_beamSignal_cor_b2[jjj]->GetMean();
  1148. // beamSignal_cor_b3_mean[jjj] = h_beamSignal_cor_b3[jjj]->GetMean();
  1149. //// get the median (0.5 quantile)
  1150. q = 0.5; // 0.5 for "median"
  1151. if (ionsort==3){
  1152. //protons
  1153. energy = energy_list_p[ jjj];
  1154. intensity = intensity_list_p[ int(intensity_index) ];
  1155. sp_air = f_sp_air->Eval(energy)*(intensity/1.0E6);
  1156. sp_ps = f_sp_ps->Eval(energy)*(intensity/1.0E6);
  1157. sp2_air = f_sp_air->Eval(energy);
  1158. sp2_ps = f_sp_ps->Eval(energy);
  1159. lorentz_gamma = energy/938.272 +1.; // lorentz_gamma = E_u/M_u +1
  1160. mybeta = sqrt(1. - 1./(lorentz_gamma*lorentz_gamma));
  1161. zsqr = 1.;
  1162. }
  1163. else if (ionsort==1){
  1164. //helium
  1165. energy = energy_list_he[ jjj ];
  1166. intensity = intensity_list_he[ int(intensity_index) ];
  1167. sp_air = f_h2sp_air->Eval(energy)*(intensity/1.0E6);
  1168. sp_ps = f_h2sp_ps->Eval(energy)*(intensity/1.0E6);
  1169. sp2_air = f_h2sp_air->Eval(energy);
  1170. sp2_ps = f_h2sp_ps->Eval(energy);
  1171. lorentz_gamma = energy/932.1055 +1.;// lorentz_gamma = E_u/M_u +1
  1172. mybeta = sqrt(1. - 1./(lorentz_gamma*lorentz_gamma));
  1173. zsqr = 4.;
  1174. }
  1175. else if (ionsort==4){
  1176. //carbon
  1177. energy = energy_list_c[ jjj];
  1178. intensity = intensity_list_c[ int(intensity_index) ];
  1179. sp_air = f_c12sp_air->Eval(energy)*(intensity/1.0E6);
  1180. sp_ps = f_c12sp_ps->Eval(energy)*(intensity/1.0E6);
  1181. sp2_air = f_c12sp_air->Eval(energy);
  1182. sp2_ps = f_c12sp_ps->Eval(energy);
  1183. lorentz_gamma = energy/932.3539 +1.;// lorentz_gamma = E_u/M_u +1
  1184. mybeta = sqrt(1. - 1./(lorentz_gamma*lorentz_gamma));
  1185. zsqr = 36.;
  1186. }
  1187. else if (ionsort==2){
  1188. //oxygen
  1189. energy = energy_list_o[ jjj];
  1190. intensity = intensity_list_o[ int(intensity_index) ];
  1191. sp_air = f_o16sp_air->Eval(energy)*(intensity/1.0E6);
  1192. sp_ps = f_o16sp_ps->Eval(energy)*(intensity/1.0E6);
  1193. sp2_air = f_o16sp_air->Eval(energy);
  1194. sp2_ps = f_o16sp_ps->Eval(energy);
  1195. lorentz_gamma = energy/931.4418 +1.;// lorentz_gamma = E_u/M_u +1
  1196. mybeta = sqrt(1. - 1./(lorentz_gamma*lorentz_gamma));
  1197. zsqr = 64.;
  1198. }
  1199. else {
  1200. sp_air = -1.;
  1201. sp_ps = -1.;
  1202. sp2_air = -1.;
  1203. sp2_ps = -1.;
  1204. lorentz_gamma = 0.;
  1205. mybeta = 0.;
  1206. zsqr = -1.;
  1207. }
  1208. h_beamSignal_ic1[jjj]->ComputeIntegral(); //just a precaution
  1209. h_beamSignal_ic1[jjj]->GetQuantiles(1,&median, &q);
  1210. //median = h_beamSignal_ic1[jjj]->GetMean();
  1211. // intcorr = (Intensity /19.8E6) / (totalcurrent/sp2_air/totaltime);
  1212. if (median>0&&energy>0) {intcorr = (intensity / 19.8E6) / (median/sp2_air)/ 3.11;}
  1213. // else if (median>0&&energy>0) {intcorr = 0.; median = 0.;}
  1214. else {intcorr = 0.; median = 0.;}
  1215. cout << "energy: " << energy << endl;
  1216. cout << "intensity: " << intensity << endl;
  1217. cout << "sp2_air: " << sp2_air << endl;
  1218. cout << "median: " << median << endl;
  1219. cout << "intcorr: " << intcorr << endl;
  1220. mybeta_graph[jjj] = sqrt(1. - 1./(lorentz_gamma*lorentz_gamma));
  1221. h_beamSignal_b0[jjj]->ComputeIntegral(); //just a precaution
  1222. h_beamSignal_b0[jjj]->GetQuantiles(1,&median, &q);
  1223. beamSignal_cor_b0_mean[jjj] = median*intcorr /(intensity/1.E6)/sp2_ps;
  1224. //beamSignal_cor_b0_mean[jjj] = h_beamSignal_b0[jjj]->GetMean()*intcorr /(intensity/1.E6)/sp2_ps;
  1225. cout << beamSignal_cor_b0_mean[jjj] << endl;
  1226. h_beamSignal_b1[jjj]->ComputeIntegral(); //just a precaution
  1227. h_beamSignal_b1[jjj]->GetQuantiles(1,&median, &q);
  1228. beamSignal_cor_b1_mean[jjj] = median*intcorr /(intensity/1.E6)/sp2_ps;
  1229. //beamSignal_cor_b1_mean[jjj] = h_beamSignal_b1[jjj]->GetMean()*intcorr /(intensity/1.E6)/sp2_ps;
  1230. h_beamSignal_b2[jjj]->ComputeIntegral(); //just a precaution
  1231. h_beamSignal_b2[jjj]->GetQuantiles(1,&median, &q);
  1232. beamSignal_cor_b2_mean[jjj] = median*intcorr /(intensity/1.E6)/sp2_ps;
  1233. // beamSignal_cor_b2_mean[jjj] = h_beamSignal_b2[jjj]->GetMean()*intcorr /(intensity/1.E6)/sp2_ps;
  1234. h_beamSignal_b3[jjj]->ComputeIntegral(); //just a precaution
  1235. h_beamSignal_b3[jjj]->GetQuantiles(1,&median, &q);
  1236. beamSignal_cor_b3_mean[jjj] = median*intcorr /(intensity/1.E6)/sp2_ps;
  1237. //beamSignal_cor_b3_mean[jjj] = h_beamSignal_b3[jjj]->GetMean()*intcorr /(intensity/1.E6)/sp2_ps;
  1238. }
  1239. TGraph * graph_b0 = new TGraph(23,mybeta_graph, beamSignal_cor_b0_mean);
  1240. TGraph * graph_b1 = new TGraph(23,mybeta_graph, beamSignal_cor_b1_mean);
  1241. TGraph * graph_b2 = new TGraph(23,mybeta_graph, beamSignal_cor_b2_mean);
  1242. TGraph * graph_b3 = new TGraph(23,mybeta_graph, beamSignal_cor_b3_mean);
  1243. graph_b0->SetName("graph_b0");graph_b0->Write();
  1244. graph_b1->SetName("graph_b1");graph_b1->Write();
  1245. graph_b2->SetName("graph_b2");graph_b2->Write();
  1246. graph_b3->SetName("graph_b3");graph_b3->Write();
  1247. rootFile->Write();
  1248. rootFile->Close();
  1249. }
  1250. std::cout << eventID << " frames analysed." << std::endl;
  1251. return 0;
  1252. }
  1253. else {
  1254. std::cerr << "Error 1" << std::endl;
  1255. return 1;
  1256. }
  1257. }
  1258. int main(int argc, char **argv){
  1259. analyse(argc, argv);
  1260. }