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.

1306 lines
48 KiB

  1. /// to do:
  2. /// 1. correct for gap between arrays
  3. #define convert_cxx
  4. #include "convert_clean.h"
  5. int init(int argc, char **argv);
  6. int analyse(int argc, char **argv);
  7. //using namespace std;
  8. /// compile with:
  9. //// $ make clean; make
  10. /// run with:
  11. //// $ ./convert <path to data> <run> <ethercatfile> <offsetfile>
  12. ///// $convert_clean /work/leverington/beamprofilemonitor/hitdata/HIT_2018-04-25/ run41 /work/leverington/beamprofilemonitor/hitdata/HIT_2018-04-25/ethercat/with_timestamp/run41.csv ./run41_offsetcor.txt
  13. int main(int argc, char **argv){
  14. init(argc, argv); // initialise some variables, create histograms and root tree
  15. analyse(argc, argv);
  16. }
  17. int init(int argc, char **argv){
  18. smooth_on = true; // boxcar smoothing of data
  19. doFit = false; // gaussian fitting (slow)
  20. doLinInt = true; // Linear Interpolation (fast)
  21. ethercat = true; // align with ethercat data (IC and MWPC)
  22. f_sp_air->SetParameters(303.746, -0.873697,1.01335); //protons between 50 and 300 MeV
  23. f_sp_ps->SetParameters(361.936, -0.892255, 1.19133); //protons between 50 and 220 MeV
  24. f_h2sp_air->SetParameters(1236.51, -0.880225, 4.17041); //helium between 50 and 300 MeV
  25. f_h2sp_ps->SetParameters(1387.08, -0.882686,4.60833); //heelium between 50 and 300 MeV
  26. f_c12sp_air->SetParameters(13291.2, -0.925464,45.3876); //carbon between 80 and 480 MeV
  27. f_c12sp_ps->SetParameters(14538.9, -0.922423,49.2859); //carbon between 80 and 480 MeV
  28. f_o16sp_air->SetParameters(24624.9, -0.925425,80.6828); //oxygen between 80 and 480 MeV
  29. f_o16sp_ps->SetParameters(26465.6, -0.928309,88.6728); //oxygen between 80 and 480 MeV
  30. // TVirtualFitter::SetDefaultFitter("Minuit2");
  31. // TVirtualFitter::SetPrecision(0.1);
  32. // std::cout << "Default Fitter:" << TVirtualFitter::GetDefaultFitter() << std::endl;
  33. //initialise some values;
  34. for (int i = 0;i<128;i++){
  35. board_b0_ch_bkg[i] = 0.;
  36. board_b1_ch_bkg[i] = 0.;
  37. board_b2_ch_bkg[i] = 0.;
  38. board_b3_ch_bkg[i] = 0.;
  39. channellist_gsl_b0[i] = 0;
  40. channellist_gsl_b1[i] = 0;
  41. channellist_gsl_b2[i] = 0;
  42. channellist_gsl_b3[i] = 0;
  43. calibration_b0[i] = 1.0;
  44. calibration_b1[i] = 1.0;
  45. calibration_b2[i] = 1.0;
  46. calibration_b3[i] = 1.0;
  47. errorx[i]=17.;
  48. errory[i]=17.;
  49. if (i<64) {pos[i] = double(i);}
  50. else {pos[i] = double(i) + 0.2; }
  51. }
  52. // if (argc > 3){
  53. //open the file names specified in the command line
  54. ethercatfile = argv[3];
  55. // argv[1]= "/work/leverington/beamprofilemonitor/hitdata/HIT_17_12_2017/";
  56. // argv[2]= "Run11"
  57. filename = Form("%s%s.dat",argv[1],argv[2]);
  58. offsetfilename = Form("%s",argv[4]);
  59. timestampfilename = Form("%s%s_timestamp.csv",argv[1],argv[2]);
  60. // modify location of rootfilename to somewhere writeable
  61. rootfilename = Form("%s/root/%s.root",argv[1],argv[2]);
  62. file.open(filename, ifstream::in | ifstream::binary);
  63. timestampfile.open(timestampfilename, ifstream::in);
  64. offsetfile.open(offsetfilename, ifstream::in);
  65. if (!file.is_open()){
  66. printf(".dat did not open.\n");
  67. return -1; //file could not be opened
  68. }
  69. else {
  70. printf("Data file opened.\n");
  71. }
  72. if (!timestampfile.is_open()){
  73. printf("timestamp.csv did not open.\n");
  74. ethercat = false;
  75. //return -1; //file could not be opened
  76. }
  77. if (!offsetfile.is_open()){
  78. printf("no offset.txt file found\n");
  79. // return -1; //file could not be opened
  80. for (int ii = 0; ii<30;ii++) {
  81. signaloffset_b0[ii] = 0.; signaloffset_b1[ii] = 0.; signaloffset_b2[ii] = 0.; signaloffset_b3[ii] = 0.;
  82. }
  83. }
  84. else {
  85. for (int ii = 0; ii<30;ii++) offsetfile >> signaloffset_b0[ii] >> signaloffset_b1[ii] >>signaloffset_b2[ii] >>signaloffset_b3[ii] ;
  86. }
  87. ///read in offsets produced by offsetcor.C script (needs to be run after convert_clean, then repeat convert_clean.)
  88. ///some variables to get the data
  89. // int number_of_records_to_read = 4*10;
  90. // BufferData* buffer = new BufferData[number_of_records_to_read];
  91. //if(argc > 4) {
  92. // framestart = atoi(argv[3]);
  93. // frameend = atoi(argv[4]);
  94. // }
  95. board_b = -1;
  96. fileframesize = getFileSize(filename) / ( 4*sizeof(BufferData) );
  97. dataptr = new BufferData();
  98. if (fileframesize>0){
  99. std::cout << "Number of frames:" << fileframesize << std::endl;
  100. //open ROOT file for saving histos and TTree.
  101. rootFile = new TFile(rootfilename,"RECREATE");
  102. if ( rootFile->IsOpen() ) printf("ROOT file opened successfully\n");
  103. th2_signal_vs_channel_b0 = new TH2D("th2_signal_vs_channel_b0","th2_signal_vs_channel_b0",128,0,128,2200,-1000,10000);
  104. th2_signal_vs_channel_b1 = new TH2D("th2_signal_vs_channel_b1","th2_signal_vs_channel_b1",128,0,128,2200,-1000,10000);
  105. th2_signal_vs_channel_b2 = new TH2D("th2_signal_vs_channel_b2","th2_signal_vs_channel_b2",128,0,128,2200,-1000,10000);
  106. th2_signal_vs_channel_b3 = new TH2D("th2_signal_vs_channel_b3","th2_signal_vs_channel_b3",128,0,128,2200,-1000,10000);
  107. 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);
  108. 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);
  109. 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);
  110. 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);
  111. th1_signal_b0 = new TH1D("th1_signal_b0","th1_signal_b0",2200,-10000,50000);
  112. th1_signal_b1 = new TH1D("th1_signal_b1","th1_signal_b1",2200,-10000,50000);
  113. th1_signal_b2 = new TH1D("th1_signal_b2","th1_signal_b2",2200,-10000,50000);
  114. th1_signal_b3 = new TH1D("th1_signal_b3","th1_signal_b3",2200,-10000,50000);
  115. h_regresidual_b0 = new TH1D("h_regresidual_b0","h_regresidual_b0", 200,-.20,.20);
  116. h_regresidual_b1 = new TH1D("h_regresidual_b1","h_regresidual_b1", 200,-.20,.20);
  117. h_regresidual_b2 = new TH1D("h_regresidual_b2","h_regresidual_b2", 200,-.20,.20);
  118. h_regresidual_b3 = new TH1D("h_regresidual_b3","h_regresidual_b3", 200,-.20,.20);
  119. graph_bkg_b0 = new TGraph();
  120. graph_bkg_b1 = new TGraph();
  121. graph_bkg_b2 = new TGraph();
  122. graph_bkg_b3 = new TGraph();
  123. 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);
  124. 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);
  125. 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);
  126. 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);
  127. 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);
  128. 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);
  129. 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);
  130. 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);
  131. for (int iii=0; iii<=29; iii++){
  132. sprintf(histname,"h_beamSignal_b0_%d",iii);
  133. h_beamSignal_b0[iii] = new TH1D(histname,histname,200,0,100000);
  134. sprintf(histname,"h_beamSignal_b1_%d",iii);
  135. h_beamSignal_b1[iii] = new TH1D(histname,histname,200,0,100000);
  136. sprintf(histname,"h_beamSignal_b2_%d",iii);
  137. h_beamSignal_b2[iii] = new TH1D(histname,histname,200,0,100000);
  138. sprintf(histname,"h_beamSignal_b3_%d",iii);
  139. h_beamSignal_b3[iii] = new TH1D(histname,histname,200,0,100000);
  140. }
  141. for (int iii=0; iii<=29; iii++){
  142. sprintf(histname,"h_beamSignal_cor_b0_%d",iii);
  143. h_beamSignal_cor_b0[iii] = new TH1D(histname,histname,200,0,10);
  144. sprintf(histname,"h_beamSignal_cor_b1_%d",iii);
  145. h_beamSignal_cor_b1[iii] = new TH1D(histname,histname,200,0,10.);
  146. sprintf(histname,"h_beamSignal_cor_b2_%d",iii);
  147. h_beamSignal_cor_b2[iii] = new TH1D(histname,histname,200,0,10.);
  148. sprintf(histname,"h_beamSignal_cor_b3_%d",iii);
  149. h_beamSignal_cor_b3[iii] = new TH1D(histname,histname,200,0,10.);
  150. sprintf(histname,"h_beamSignal_ic1_%d",iii);
  151. h_beamSignal_ic1[iii] = new TH1D(histname,histname,200,0,1000.);
  152. }
  153. rootTree = new TTree("t","HIT Data Root Tree");
  154. rootTree->Branch("beamPosX_reg_b0",&beamPosX_reg_b0,"beamPosX_reg_b0/D");
  155. rootTree->Branch("beamPosX_reg_b1",&beamPosX_reg_b1,"beamPosX_reg_b1/D");
  156. rootTree->Branch("beamPosX_reg_b2",&beamPosX_reg_b2,"beamPosX_reg_b2/D");
  157. rootTree->Branch("beamPosX_reg_b3",&beamPosX_reg_b3,"beamPosX_reg_b3/D");
  158. rootTree->Branch("beamFocusX_reg_b0",&beamFocusX_reg_b0,"beamFocusX_reg_b0/D");
  159. rootTree->Branch("beamFocusX_reg_b1",&beamFocusX_reg_b1,"beamFocusX_reg_b1/D");
  160. rootTree->Branch("beamFocusX_reg_b2",&beamFocusX_reg_b2,"beamFocusX_reg_b2/D");
  161. rootTree->Branch("beamFocusX_reg_b3",&beamFocusX_reg_b3,"beamFocusX_reg_b3/D");
  162. rootTree->Branch("beamPeakX_reg_b0",&beamPeakX_reg_b0,"beamPeakX_reg_b0/D");
  163. rootTree->Branch("beamPeakX_reg_b1",&beamPeakX_reg_b1,"beamPeakX_reg_b1/D");
  164. rootTree->Branch("beamPeakX_reg_b2",&beamPeakX_reg_b2,"beamPeakX_reg_b2/D");
  165. rootTree->Branch("beamPeakX_reg_b3",&beamPeakX_reg_b3,"beamPeakX_reg_b3/D");
  166. rootTree->Branch("beamRsqr_b0",&beamRsqr_b0,"beamRsqr_b0/D");
  167. rootTree->Branch("beamRsqr_b1",&beamRsqr_b1,"beamRsqr_b1/D");
  168. rootTree->Branch("beamRsqr_b2",&beamRsqr_b2,"beamRsqr_b2/D");
  169. rootTree->Branch("beamRsqr_b3",&beamRsqr_b3,"beamRsqr_b3/D");
  170. rootTree->Branch("sp2_ps",&sp2_ps,"sp2_ps/D");
  171. rootTree->Branch("sp2_air",&sp2_air,"sp2_air/D");
  172. rootTree->Branch("mybeta",&mybeta,"mybeta/D");
  173. rootTree->Branch("beamSkewX_b0",&beamSkewX_b0,"beamSkewX_b0/D");
  174. rootTree->Branch("beamSkewX_b1",&beamSkewX_b1,"beamSkewX_b1/D");
  175. rootTree->Branch("beamSkewX_b2",&beamSkewX_b2,"beamSkewX_b2/D");
  176. rootTree->Branch("beamSkewX_b3",&beamSkewX_b3,"beamSkewX_b3/D");
  177. rootTree->Branch("beamKurtX_b0",&beamKurtX_b0,"beamKurtX_b0/D");
  178. rootTree->Branch("beamKurtX_b1",&beamKurtX_b1,"beamKurtX_b1/D");
  179. rootTree->Branch("beamKurtX_b2",&beamKurtX_b2,"beamKurtX_b2/D");
  180. rootTree->Branch("beamKurtX_b3",&beamKurtX_b3,"beamKurtX_b3/D");
  181. rootTree->Branch("beamNumX_b0",&numtocalc_b0,"beamNumX_b0/I");
  182. rootTree->Branch("beamNumX_b1",&numtocalc_b1,"beamNumX_b1/I");
  183. rootTree->Branch("beamNumX_b2",&numtocalc_b2,"beamNumX_b2/I");
  184. rootTree->Branch("beamNumX_b3",&numtocalc_b3,"beamNumX_b3/I");
  185. rootTree->Branch("beamSignal_b0",&signal_b0,"beamSignal_b0/D");
  186. rootTree->Branch("beamSignal_b1",&signal_b1,"beamSignal_b1/D");
  187. rootTree->Branch("beamSignal_b2",&signal_b2,"beamSignal_b2/D");
  188. rootTree->Branch("beamSignal_b3",&signal_b3,"beamSignal_b3/D");
  189. rootTree->Branch("beamSignal_cor_b0",&signal_cor_b0,"beamSignal_cor_b0/D");
  190. rootTree->Branch("beamSignal_cor_b1",&signal_cor_b1,"beamSignal_cor_b1/D");
  191. rootTree->Branch("beamSignal_cor_b2",&signal_cor_b2,"beamSignal_cor_b2/D");
  192. rootTree->Branch("beamSignal_cor_b3",&signal_cor_b3,"beamSignal_cor_b3/D");
  193. rootTree->Branch("eventID",&eventID,"eventID/I");
  194. //rootTree->Branch("board_b0_ch",&board_b0_ch,"board_b0_ch[128]/D");
  195. //rootTree->Branch("board_b1_ch",&board_b1_ch,"board_b1_ch[128]/D");
  196. //rootTree->Branch("board_b2_ch",&board_b2_ch,"board_b2_ch[128]/D");
  197. //rootTree->Branch("board_b3_ch",&board_b3_ch,"board_b3_ch[128]/D");
  198. rootTree->Branch("arrayavg_b0",&arrayavg_b0,"arrayavg_b0/D");
  199. rootTree->Branch("arrayavg_b1",&arrayavg_b1,"arrayavg_b1/D");
  200. rootTree->Branch("arrayavg_b2",&arrayavg_b2,"arrayavg_b2/D");
  201. rootTree->Branch("arrayavg_b3",&arrayavg_b3,"arrayavg_b3/D");
  202. rootTree->Branch("M1elements_b0",&M1elements_b0,"M1elements_b0[9]/D");
  203. rootTree->Branch("M1elements_b1",&M1elements_b1,"M1elements_b1[9]/D");
  204. rootTree->Branch("M1elements_b2",&M1elements_b2,"M1elements_b2[9]/D");
  205. rootTree->Branch("M1elements_b3",&M1elements_b3,"M1elements_b3[9]/D");
  206. rootTree->Branch("goodevents_b0",&goodevents_b0,"goodevents_b0/I");
  207. rootTree->Branch("goodevents_b1",&goodevents_b1,"goodevents_b1/I");
  208. rootTree->Branch("goodevents_b2",&goodevents_b2,"goodevents_b2/I");
  209. rootTree->Branch("goodevents_b3",&goodevents_b3,"goodevents_b3/I");
  210. double mytime;
  211. // import and align matching ethercat data
  212. TTree *tree2 = new TTree("t2", "t2");
  213. if(ethercat){
  214. std::cout << " Loading Ethercat data." << std::endl;
  215. 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');
  216. std::cout << "Ethercat data loaded." << std::endl;
  217. tree2->Print();
  218. }
  219. if(ethercat){
  220. rootTree->Branch("ic1_avg", &ic1_avg, "ic1_avg/D");
  221. rootTree->Branch("mw1_posx", &mw1_posx_avg, "mw1_posx/D");
  222. rootTree->Branch("mw1_posy", &mw1_posy_avg, "mw1_posy/D");
  223. rootTree->Branch("energy_index", &energy_index, "energy_index/D");
  224. rootTree->Branch("intensity_index", &intensity_index, "intensity_index/D");
  225. rootTree->Branch("ionsort", &ionsort, "ionsort/D");
  226. timeoffset = -0.050; //offset between ic and bpm readouts
  227. mwoffset = 2; // offset for timestamped event. MW chamber position correlation seems to be better in other windows
  228. timewindow = -0.0999; //should be a negative number. window size in time to average over.
  229. timeoffset2 = -0.00; //offset between ic and bpm readouts
  230. timewindow2 = -0.0999; //should be a negative number. window size in time to average over.
  231. //////////////////////////////////////////////////////////////////
  232. ///// ETHERCAT DATA
  233. //////////////////////////////////////////////////////////////////
  234. // tree->SetBranchAddress("time", &time);
  235. tree2->SetBranchAddress("RELTIME2", &rel_time2);
  236. tree2->SetBranchAddress("TIME2", &time2);
  237. tree2->SetBranchAddress("IC1", &ic1);
  238. // tree2->SetBranchAddress("IC2", &ic2);
  239. //tree2->SetBranchAddress("MW1_FOCUSX", &mw1_focusx);
  240. //tree2->SetBranchAddress("MW1_FOCUSY", &mw1_focusy);
  241. ///tree2->SetBranchAddress("MW2_FOCUSX", &mw2_focusx);
  242. ///tree2->SetBranchAddress("MW2_FOCUSY", &mw2_focusy);
  243. tree2->SetBranchAddress("MW1_POSX", &mw1_posx);
  244. tree2->SetBranchAddress("MW1_POSY", &mw1_posy);
  245. //tree2->SetBranchAddress("MW2_POSX", &mw2_posx);
  246. //tree2->SetBranchAddress("MW2_POSY", &mw2_posy);
  247. tree2->SetBranchAddress("ENERGY_INDEX", &energy_index);
  248. tree2->SetBranchAddress("INTENSITY_INDEX", &intensity_index);
  249. tree2->SetBranchAddress("ION-SORT", &ionsort);
  250. tree2->SetBranchAddress("ANALOG_IN1", &analog_in1);
  251. }
  252. int currentEntryTree2 = 1;
  253. // int nevents = tree->GetEntries();
  254. int nevents2 = tree2->GetEntries();
  255. int icCounter = 0;
  256. int count = 0;
  257. int count2 = 0;
  258. }
  259. }
  260. int analyse(int argc, char **argv)
  261. {
  262. //loop through recorded data frames
  263. for (int frame = 0; frame<fileframesize; frame++){
  264. // if (icCounter>10000) break;
  265. // if(frame>2000&&frame<120000) continue;
  266. eventID = frame;
  267. if (ethercat){
  268. if (timestampfile) timestampfile >> time ;
  269. //printf("%i %f\n", eventID, time);
  270. count= 0;
  271. count2 = 0;
  272. ic1_avg = 0.;
  273. mw1_posx_avg = 0.;
  274. mw1_posy_avg = 0.;
  275. tree2->GetEntry(currentEntryTree2);
  276. /* if (frame % 100 == 0)
  277. {
  278. printf("merging event %d ,", frame);
  279. printf("Time %f \n", time);
  280. printf("Entry hit %d ,", currentEntryTree2);
  281. printf("Time hit %f \n", time2);
  282. }
  283. */
  284. while (time2 < mytime + timeoffset && currentEntryTree2 < nevents2 )
  285. {
  286. if (time2 - mytime - timeoffset > timewindow)
  287. {
  288. tree2->GetEntry(currentEntryTree2);
  289. if (ic1>0.0) ic1_avg += ic1;
  290. if (ic1>0.0) count++;
  291. // if (frame % 200 == 0) printf("%i %2.3f %2.3f %2.3f %2.3f %2.3f %i \n", count, ic1, time2, mytime, timeoffset, time2 - mytime - timeoffset, mwoffset);
  292. }
  293. tree2->GetEntry(currentEntryTree2);
  294. if ( time2 - mytime - timeoffset2 > timewindow2)
  295. {
  296. tree2->GetEntry(currentEntryTree2 + mwoffset); //why currentEtryTree2-4?
  297. mw1_posx_avg += mw1_posx;
  298. mw1_posy_avg += mw1_posy;
  299. count2++;
  300. // if (i % 2000 == 0) printf("%i %2.3f %2.3f %2.3f %2.3f\n", count2, mytime, time2, ic1, mw1_posx);
  301. //if (i % 2001 == 0) printf("%i %2.3f %2.3f %2.3f %2.3f\n", count2, mytime, time2, ic1, mw1_posx);
  302. // if (i % 2002 == 0) printf("%i %2.3f %2.3f %2.3f %2.3f\n", count2, mytime, time2, ic1, mw1_posx);
  303. // printf("%i %2.3f %2.3f %2.3f %2.3f\n", count2, mytime, time2, ic1, mw1_posx);
  304. }
  305. // currentEntryTree2++;
  306. tree2->GetEntry(currentEntryTree2);
  307. currentEntryTree2++;
  308. if (count2>0){
  309. mw1_posx_avg /= double(count2); //the positions are weighted by the charge
  310. mw1_posy_avg /= double(count2);
  311. }
  312. if(count>0){
  313. ic1_avg /= double(count);
  314. if (ic1_avg>1.) icCounter++;
  315. // if (frame % 2000 == 0) printf("%i %f.2 %i \n", count, ic1_avg, icCounter);
  316. }
  317. // std::cout << ic1_avg << " " << icCounter << std::endl;
  318. }
  319. /////////end of ethercat matching
  320. if (floor(energy_index/10.)>=0&&floor(energy_index/10)<=26){energy_indexbin = floor(energy_index/10.);}
  321. else {energy_indexbin=27;}
  322. if (ionsort==3){
  323. //protons
  324. energy = energy_list_p[ energy_indexbin];
  325. intensity = intensity_list_p[ int(intensity_index) ];
  326. sp_air = f_sp_air->Eval(energy)*(intensity/1.0E6);
  327. sp_ps = f_sp_ps->Eval(energy)*(intensity/1.0E6);
  328. sp2_air = f_sp_air->Eval(energy);
  329. sp2_ps = f_sp_ps->Eval(energy);
  330. lorentz_gamma = energy/938.272 +1.; // lorentz_gamma = E_u/M_u +1
  331. mybeta = sqrt(1. - 1./(lorentz_gamma*lorentz_gamma));
  332. zsqr = 1.;
  333. }
  334. else if (ionsort==1){
  335. //helium
  336. energy = energy_list_he[ energy_indexbin ];
  337. intensity = intensity_list_he[ int(intensity_index) ];
  338. sp_air = f_h2sp_air->Eval(energy)*(intensity/1.0E6);
  339. sp_ps = f_h2sp_ps->Eval(energy)*(intensity/1.0E6);
  340. sp2_air = f_h2sp_air->Eval(energy);
  341. sp2_ps = f_h2sp_ps->Eval(energy);
  342. lorentz_gamma = energy/932.1055 +1.;// lorentz_gamma = E_u/M_u +1
  343. mybeta = sqrt(1. - 1./(lorentz_gamma*lorentz_gamma));
  344. zsqr = 4.;
  345. }
  346. else if (ionsort==4){
  347. //carbon
  348. energy = energy_list_c[ energy_indexbin];
  349. intensity = intensity_list_c[ int(intensity_index) ];
  350. sp_air = f_c12sp_air->Eval(energy)*(intensity/1.0E6);
  351. sp_ps = f_c12sp_ps->Eval(energy)*(intensity/1.0E6);
  352. sp2_air = f_c12sp_air->Eval(energy);
  353. sp2_ps = f_c12sp_ps->Eval(energy);
  354. lorentz_gamma = energy/932.3539 +1.;// lorentz_gamma = E_u/M_u +1
  355. mybeta = sqrt(1. - 1./(lorentz_gamma*lorentz_gamma));
  356. zsqr = 36.;
  357. }
  358. else if (ionsort==2){
  359. //oxygen
  360. energy = energy_list_o[ energy_indexbin];
  361. intensity = intensity_list_o[ int(intensity_index) ];
  362. sp_air = f_o16sp_air->Eval(energy)*(intensity/1.0E6);
  363. sp_ps = f_o16sp_ps->Eval(energy)*(intensity/1.0E6);
  364. sp2_air = f_o16sp_air->Eval(energy);
  365. sp2_ps = f_o16sp_ps->Eval(energy);
  366. lorentz_gamma = energy/931.4418 +1.;// lorentz_gamma = E_u/M_u +1
  367. mybeta = sqrt(1. - 1./(lorentz_gamma*lorentz_gamma));
  368. zsqr = 64.;
  369. }
  370. else {
  371. sp_air = -1.;
  372. sp_ps = -1.;
  373. sp2_air = -1.;
  374. sp2_ps = -1.;
  375. lorentz_gamma = 0.;
  376. mybeta = 0.;
  377. zsqr = -1.;
  378. }
  379. // intcorr = (Intensity /19.8E6) / (totalcurrent/sp2_air/totaltime);
  380. intcorr = (intensity / 19.8E6) / (ic1_avg/sp2_air)/ 3.11;
  381. // if (frame>2000&&ic1_avg<0.5) continue;
  382. }
  383. ///////////////////////////////////
  384. //// HIT DATA
  385. ///////////////////////////////////
  386. if (frame>2000 && beam_wason == true && beam_off == true) { beamoffcounter++;
  387. // cout << beamoffcounter<< endl;
  388. }
  389. if (samplenoise==false && frame> 2000 && beam_wason == true && beam_off == true && beamoffcounter==5000) {
  390. samplenoise = true;
  391. }
  392. //board_b 0
  393. board_b=0;
  394. signal_b0 = 0.;
  395. maxchannelamp_b0 = 0.;
  396. file.seekg(framestart*sizeof(BufferData)+board_b*sizeof(BufferData)+4*frame*sizeof(BufferData));
  397. file.read ((char*)dataptr ,sizeof(BufferData));
  398. if (dataptr->sync_frame.device_nr==board_b){
  399. // 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;
  400. if (frame%10000==0) std::cout << "Frame: " << frame << " (" <<double(frame)/double(fileframesize)*100.0 << "%)" << std::endl;
  401. arrayavg_b0 = 0;
  402. //shift the events of the rolling average of the signal one left
  403. for (int j = 1; j<length;j++){
  404. array_b0[j-1] = array_b0[j];
  405. arrayavg_b0 += array_b0[j-1];
  406. // cout << array_b0[j-1] << " ";
  407. }
  408. array_b0[length-1] = 0.;
  409. // cout << endl;
  410. ///loop over the channels
  411. for (int i = 0;i<128;i++){
  412. board_b0_ch[i] = dataptr->sensor_data[i];
  413. if (frame<1000 || samplenoise==true){
  414. if (samplenoise==true&& beamoffcounter==5000) {
  415. board_b0_ch_bkg[i]=0.;
  416. if(i==0) cout << frame << " Resampling noise " << beamoffcounter << endl;
  417. }
  418. board_b0_ch_bkg[i] += board_b0_ch[i]/1000.; //find baseline from the average of first 1000 events
  419. if (samplenoise==true && beamoffcounter==6000) {
  420. beam_wason = false;
  421. samplenoise =false;
  422. cout << frame << " End sampling." << endl;
  423. }
  424. }
  425. else if (frame>=1000&& frame<2000){
  426. board_b0_ch[i] -= board_b0_ch_bkg[i]; //histogram the subtracted baseline in the next 1000 events
  427. th2_signal_vs_channel_bkg_b0->Fill(i,board_b0_ch[i]);
  428. if (i==1) graph_bkg_b0->SetPoint(graph_bkg_b0->GetN(), frame, board_b0_ch[i]);
  429. }
  430. else if (frame>=2000 && samplenoise==false) {
  431. board_b0_ch[i]-=board_b0_ch_bkg[i]; // the rest background subtracted
  432. // board_b0_ch[i]*=calibration_b0[i]; //calibration factor
  433. th2_signal_vs_channel_b0->Fill(i,board_b0_ch[i]);
  434. //find the peak channel
  435. if (board_b0_ch[i]> maxchannelamp_b0) {
  436. maxchannel_b0 = i;
  437. maxchannelamp_b0 = board_b0_ch[i];
  438. // cout << maxchannel_b0 << " " <<maxchannelamp_b0 << endl;
  439. }
  440. ///add new event to the rolling average.
  441. if( board_b0_ch[i]>50.0){
  442. array_b0[length-1] += board_b0_ch[i];
  443. }
  444. ////////////////////////////////////////////
  445. }
  446. }//end of 128
  447. // th1_signal_b0->Fill(signal_b0);
  448. if (frame>2000) {
  449. arrayavg_b0 += array_b0[length-1]/length;
  450. if (arrayavg_b0>= 20000) {
  451. beamoncounter++;
  452. }
  453. if (beamoncounter>100 && beam_wason == false && arrayavg_b0>= 20000) {
  454. beam_off = false;
  455. beam_wason = true;
  456. cout << frame << " Beam on " << arrayavg_b0 << endl;
  457. }
  458. if (arrayavg_b0< 10000) {
  459. if(beam_wason== true && beam_off==false ) {
  460. cout << frame << "Beam went OFF!" << arrayavg_b0 << endl;
  461. beamoffcounter = 0;
  462. }
  463. beam_off = true;
  464. goodevents_b0=0;
  465. goodevents_b1=0;
  466. goodevents_b2=0;
  467. goodevents_b3=0;
  468. }
  469. }
  470. // cout << frame << " Rolling average: " << arrayavg_b0 << endl;// " ic: " << ic1_avg << endl;
  471. }
  472. else {
  473. std::cout << "Error." << std::endl;
  474. }
  475. //board_b 1
  476. board_b=1;
  477. signal_b1 = 0.;
  478. maxchannelamp_b1 = 0.;
  479. file.seekg(framestart*sizeof(BufferData)+board_b*sizeof(BufferData)+4*frame*sizeof(BufferData));
  480. file.read ((char*)dataptr ,sizeof(BufferData));
  481. if (dataptr->sync_frame.device_nr==board_b){
  482. // 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;
  483. arrayavg_b1 = 0;
  484. //shift the events of the rolling average of the signal one left
  485. for (int j = 1; j<length;j++){
  486. array_b1[j-1] = array_b1[j];
  487. arrayavg_b1 += array_b1[j-1];
  488. // cout << array_b1[j-1] << " ";
  489. }
  490. array_b1[length-1] = 0.;
  491. // cout << endl;
  492. ///loop over the channels
  493. for (int i = 0;i<128;i++){
  494. board_b1_ch[i] = dataptr->sensor_data[i];
  495. if (frame<1000){
  496. board_b1_ch_bkg[i] += board_b1_ch[i]/1000.; //find baseline from the average of first 1000 events
  497. }
  498. else if (frame>=1000&& frame<2000){
  499. board_b1_ch[i] -= board_b1_ch_bkg[i]; //histogram the subtracted baseline in the next 1000 events
  500. th2_signal_vs_channel_bkg_b1->Fill(i,board_b1_ch[i]);
  501. if (i==1) graph_bkg_b1->SetPoint(graph_bkg_b1->GetN(), frame, board_b1_ch[i]);
  502. }
  503. else if (frame>=2000) {
  504. board_b1_ch[i]-=board_b1_ch_bkg[i]; // the rest background subtracted
  505. // board_b1_ch[i]*=calibration_b1[i]; //calibration factor
  506. th2_signal_vs_channel_b1->Fill(i,board_b1_ch[i]);
  507. //find the peak channel
  508. if (board_b1_ch[i]> maxchannelamp_b1) {
  509. maxchannel_b1 = i;
  510. maxchannelamp_b1 = board_b1_ch[i];
  511. // cout << maxchannel_b1 << " " <<maxchannelamp_b1 << endl;
  512. }
  513. ///add new event to the rolling average.
  514. if( board_b1_ch[i]>50.0){
  515. array_b1[length-1] += board_b1_ch[i];
  516. }
  517. ////////////////////////////////////////////
  518. }
  519. }//end of 128
  520. // th1_signal_b1->Fill(signal_b1);
  521. arrayavg_b1 += array_b1[length-1]/length;
  522. // cout << frame << " Rolling average: " << arrayavg_b1 << endl;// " ic: " << ic1_avg << endl;
  523. }
  524. else {
  525. std::cout << "Error." << std::endl;
  526. }
  527. //board_b 2
  528. board_b=2;
  529. signal_b2 = 0.;
  530. maxchannelamp_b2 = 0.;
  531. file.seekg(framestart*sizeof(BufferData)+board_b*sizeof(BufferData)+4*frame*sizeof(BufferData));
  532. file.read ((char*)dataptr ,sizeof(BufferData));
  533. if (dataptr->sync_frame.device_nr==board_b){
  534. // 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;
  535. arrayavg_b2 = 0;
  536. //shift the events of the rolling average of the signal one left
  537. for (int j = 1; j<length;j++){
  538. array_b2[j-1] = array_b2[j];
  539. arrayavg_b2 += array_b2[j-1];
  540. // cout << array_b2[j-1] << " ";
  541. }
  542. array_b2[length-1] = 0.;
  543. // cout << endl;
  544. ///loop over the channels
  545. for (int i = 0;i<128;i++){
  546. board_b2_ch[i] = dataptr->sensor_data[i];
  547. if (frame<1000){
  548. board_b2_ch_bkg[i] += board_b2_ch[i]/1000.; //find baseline from the average of first 1000 events
  549. }
  550. else if (frame>=1000&& frame<2000){
  551. board_b2_ch[i] -= board_b2_ch_bkg[i]; //histogram the subtracted baseline in the next 1000 events
  552. th2_signal_vs_channel_bkg_b2->Fill(i,board_b2_ch[i]);
  553. if (i==1) graph_bkg_b2->SetPoint(graph_bkg_b2->GetN(), frame, board_b2_ch[i]);
  554. }
  555. else if (frame>=2000) {
  556. board_b2_ch[i]-=board_b2_ch_bkg[i]; // the rest background subtracted
  557. // board_b2_ch[i]*=calibration_b2[i]; //calibration factor
  558. th2_signal_vs_channel_b2->Fill(i,board_b2_ch[i]);
  559. //find the peak channel
  560. if (board_b2_ch[i]> maxchannelamp_b2) {
  561. maxchannel_b2 = i;
  562. maxchannelamp_b2 = board_b2_ch[i];
  563. // cout << maxchannel_b2 << " " <<maxchannelamp_b2 << endl;
  564. }
  565. ///add new event to the rolling average.
  566. if( board_b2_ch[i]>50.0){
  567. array_b2[length-1] += board_b2_ch[i];
  568. }
  569. ////////////////////////////////////////////
  570. }
  571. }//end of 128
  572. // th1_signal_b2->Fill(signal_b2);
  573. arrayavg_b2 += array_b2[length-1]/length;
  574. // cout << frame << " Rolling average: " << arrayavg_b2 << endl;// " ic: " << ic1_avg << endl;
  575. }
  576. else {
  577. std::cout << "Error." << std::endl;
  578. }
  579. //board_b 3
  580. board_b=3;
  581. signal_b3 = 0.;
  582. maxchannelamp_b3 = 0.;
  583. file.seekg(framestart*sizeof(BufferData)+board_b*sizeof(BufferData)+4*frame*sizeof(BufferData));
  584. file.read ((char*)dataptr ,sizeof(BufferData));
  585. if (dataptr->sync_frame.device_nr==board_b){
  586. // 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;
  587. arrayavg_b3 = 0;
  588. //shift the events of the rolling average of the signal one left
  589. for (int j = 1; j<length;j++){
  590. array_b3[j-1] = array_b3[j];
  591. arrayavg_b3 += array_b3[j-1];
  592. // cout << array_b3[j-1] << " ";
  593. }
  594. array_b3[length-1] = 0.;
  595. // cout << endl;
  596. ///loop over the channels
  597. for (int i = 0;i<128;i++){
  598. board_b3_ch[i] = dataptr->sensor_data[i];
  599. if (frame<1000){
  600. board_b3_ch_bkg[i] += board_b3_ch[i]/1000.; //find baseline from the average of first 1000 events
  601. }
  602. else if (frame>=1000&& frame<2000){
  603. board_b3_ch[i] -= board_b3_ch_bkg[i]; //histogram the subtracted baseline in the next 1000 events
  604. th2_signal_vs_channel_bkg_b3->Fill(i,board_b3_ch[i]);
  605. if (i==1) graph_bkg_b3->SetPoint(graph_bkg_b3->GetN(), frame, board_b3_ch[i]);
  606. }
  607. else if (frame>=2000) {
  608. board_b3_ch[i]-=board_b3_ch_bkg[i]; // the rest background subtracted
  609. // board_b3_ch[i]*=calibration_b3[i]; //calibration factor
  610. th2_signal_vs_channel_b3->Fill(i,board_b3_ch[i]);
  611. //find the peak channel
  612. if (board_b3_ch[i]> maxchannelamp_b3) {
  613. maxchannel_b3 = i;
  614. maxchannelamp_b3 = board_b3_ch[i];
  615. // cout << maxchannel_b3 << " " <<maxchannelamp_b3 << endl;
  616. }
  617. ///add new event to the rolling average.
  618. if( board_b3_ch[i]>50.0){
  619. array_b3[length-1] += board_b3_ch[i];
  620. }
  621. ////////////////////////////////////////////
  622. }
  623. }//end of 128
  624. // th1_signal_b3->Fill(signal_b3);
  625. arrayavg_b3 += array_b3[length-1]/length;
  626. // cout << frame << " Rolling average: " << arrayavg_b3 << endl;// " ic: " << ic1_avg << endl;
  627. }
  628. else {
  629. std::cout << "Error." << std::endl;
  630. }
  631. ////////////////////////////////////////////////////////////
  632. ////////////////////////////////////////////////////////////
  633. //start the signal analysis
  634. ////////////////////////////////////////////////////////////
  635. ////////////////////////////////////////////////////////////
  636. if (frame>=2000&&beam_off == false&&beam_wason == true){
  637. ////////////////////////////////////////////////////////////
  638. //find the approx FWHM
  639. ////////////////////////////////////////////////////////////
  640. nfwhm_b0 =0;
  641. nfwhm_b1 =0;
  642. nfwhm_b2 =0;
  643. nfwhm_b3 =0;
  644. for (int i = 0;i<128;i++){
  645. if (board_b0_ch[i] > maxchannelamp_b0/3.) nfwhm_b0++; //switched to a lower threshold 1/3 instead of 1/2
  646. if (board_b1_ch[i] > maxchannelamp_b1/3.) nfwhm_b1++;
  647. if (board_b2_ch[i] > maxchannelamp_b2/3.) nfwhm_b2++;
  648. if (board_b3_ch[i] > maxchannelamp_b3/3.) nfwhm_b3++;
  649. signal_gsl_b0[i] = 0.;
  650. signal_gsl_b1[i] = 0.;
  651. signal_gsl_b2[i] = 0.;
  652. signal_gsl_b3[i] = 0.;
  653. }
  654. ////////////////////////////////////////////////////////////
  655. //integrate under the approximate peak
  656. //build the channel list for statistical analysis
  657. ////////////////////////////////////////////////////////////
  658. numtocalc_b0 = 0;
  659. numtocalc_b1 = 0;
  660. numtocalc_b2 = 0;
  661. numtocalc_b3 = 0;
  662. signal_b0 = 0. - signaloffset_b0[energy_indexbin];
  663. // cout << energy_indexbin << endl;
  664. for (int i = maxchannel_b0-nfwhm_b0 ; i <= maxchannel_b0 + nfwhm_b0; i++){
  665. if (i>=0 && i<=127 && board_b0_ch[i]>0){
  666. signal_b0 +=board_b0_ch[i];
  667. signal_gsl_b0[numtocalc_b0]=board_b0_ch[i];
  668. // channellist_gsl_b0[numtocalc_b0] = i;
  669. channellist_gsl_b0[numtocalc_b0] = pos[i];
  670. numtocalc_b0++;
  671. }
  672. }
  673. th1_signal_b0->Fill(signal_b0); //cout << signal_b0 << endl;
  674. if (ic1_avg>0.1){
  675. h_beamSignal_b0[energy_indexbin]->Fill(signal_b0);
  676. goodevents_b0++;
  677. }
  678. signal_b1 = 0. - signaloffset_b1[energy_indexbin];;
  679. for (int i = maxchannel_b1-nfwhm_b1 ; i <= maxchannel_b1 + nfwhm_b1; i++){
  680. if (i>=0 && i<=127&&board_b1_ch[i]>0){
  681. signal_b1 +=board_b1_ch[i] ;
  682. signal_gsl_b1[numtocalc_b1]=board_b1_ch[i];
  683. // channellist_gsl_b1[numtocalc_b1] = i;
  684. channellist_gsl_b1[numtocalc_b1] = pos[i];
  685. numtocalc_b1++;
  686. }
  687. }
  688. th1_signal_b1->Fill(signal_b1);
  689. if (ic1_avg>0.1){
  690. h_beamSignal_b1[energy_indexbin]->Fill(signal_b1);
  691. goodevents_b1++;
  692. }
  693. signal_b2 = 0. - signaloffset_b2[energy_indexbin];;
  694. for (int i = maxchannel_b2-nfwhm_b2 ; i <= maxchannel_b2 + nfwhm_b2; i++){
  695. if (i>=0 && i<=127&&board_b2_ch[i]>0){
  696. signal_b2 +=board_b2_ch[i];
  697. signal_gsl_b2[numtocalc_b2]=board_b2_ch[i];
  698. // channellist_gsl_b2[numtocalc_b2] = i;
  699. channellist_gsl_b2[numtocalc_b2] = pos[i];
  700. numtocalc_b2++;
  701. }
  702. }
  703. th1_signal_b2->Fill(signal_b2);
  704. if (ic1_avg>0.1) {
  705. h_beamSignal_b2[energy_indexbin]->Fill(signal_b2);
  706. goodevents_b2++;
  707. }
  708. signal_b3 = 0. - signaloffset_b3[energy_indexbin];
  709. for (int i = maxchannel_b3-nfwhm_b3 ; i <= maxchannel_b3 + nfwhm_b3; i++){
  710. if (i>=0 && i<=127&&board_b3_ch[i]>0){
  711. signal_b3 +=board_b3_ch[i];
  712. signal_gsl_b3[numtocalc_b3]=board_b3_ch[i];
  713. //channellist_gsl_b3[numtocalc_b3] = i;
  714. channellist_gsl_b3[numtocalc_b3] = pos[i];
  715. numtocalc_b3++;
  716. }
  717. }
  718. th1_signal_b3->Fill(signal_b3);
  719. if (ic1_avg>0.1) {
  720. h_beamSignal_b3[energy_indexbin]->Fill(signal_b3);
  721. h_beamSignal_ic1[energy_indexbin]->Fill(ic1_avg);
  722. goodevents_b3++;
  723. }
  724. signal_cor_b0 = signal_b0*intcorr/(intensity/1.E6)/sp2_ps;
  725. signal_cor_b1 = signal_b1*intcorr/(intensity/1.E6)/sp2_ps;
  726. signal_cor_b2 = signal_b2*intcorr/(intensity/1.E6)/sp2_ps;
  727. signal_cor_b3 = signal_b3*intcorr/(intensity/1.E6)/sp2_ps;
  728. if (signal_cor_b0 >0.05 && signal_cor_b0 < 10.) {h_beamSignal_cor_b0[energy_indexbin]->Fill(signal_cor_b0);}
  729. if (signal_cor_b1 >0.05 && signal_cor_b1 < 10.) {h_beamSignal_cor_b1[energy_indexbin]->Fill(signal_cor_b1);}
  730. if (signal_cor_b2 >0.05 && signal_cor_b2 < 10.) {h_beamSignal_cor_b2[energy_indexbin]->Fill(signal_cor_b2);}
  731. if (signal_cor_b3 >0.05 && signal_cor_b3 < 10.) {h_beamSignal_cor_b3[energy_indexbin]->Fill(signal_cor_b3);}
  732. ///////////////// linear regression using Integration by parts of gaussian function.
  733. if (doLinInt&&numtocalc_b0>=3&&numtocalc_b1>=3&&numtocalc_b2>=3&&numtocalc_b3>=3){
  734. for (int j = 0; j<=4; j++){
  735. if (j== 0) {
  736. copy(signal_gsl_b0,signal_gsl_b0+128, signal_reg);
  737. copy(channellist_gsl_b0,channellist_gsl_b0+128, channellist_reg);
  738. numtocalc_reg = numtocalc_b0;
  739. }
  740. else if (j== 1) {
  741. copy(signal_gsl_b1,signal_gsl_b1+128, signal_reg);
  742. copy(channellist_gsl_b1,channellist_gsl_b1+128, channellist_reg);
  743. numtocalc_reg = numtocalc_b1;
  744. }
  745. else if (j== 2) {
  746. copy(signal_gsl_b2,signal_gsl_b2+128, signal_reg);
  747. copy(channellist_gsl_b2,channellist_gsl_b2+128, channellist_reg);
  748. numtocalc_reg = numtocalc_b2;
  749. }
  750. else if (j== 3) {
  751. copy(signal_gsl_b3,signal_gsl_b3+128, signal_reg);
  752. copy(channellist_gsl_b3,channellist_gsl_b3+128, channellist_reg);
  753. numtocalc_reg = numtocalc_b3;
  754. }
  755. SumY = 0.;
  756. SumS = 0.;
  757. SumT = 0.;
  758. SumS2 = 0.;
  759. SumST = 0.;
  760. SumT2 = 0.;
  761. SumYS = 0.;
  762. SumYT = 0.;
  763. b_den = 0.;
  764. b_num = 0.;
  765. b = 0.;
  766. SumYYM = 0.;
  767. SumYYP = 0.;
  768. MeanY = 0.;
  769. for(int k=0; k<numtocalc_b0;k++){
  770. if (k==0){
  771. S[k]=0.; T[k]=0.;
  772. }
  773. else{
  774. S[k] = S[k-1]+0.5*( signal_reg[k] + signal_reg[k-1] ) * ( channellist_reg[k] - channellist_reg[k-1] );
  775. 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] );
  776. }
  777. // cout << S[k] << " " << T[k] << endl;
  778. SumS += S[k]; SumT += T[k];
  779. SumY += signal_reg[k];
  780. SumS2 += S[k]*S[k]; SumST += S[k]*T[k]; SumT2 += T[k]*T[k];
  781. SumYS += signal_reg[k]*S[k];
  782. SumYT += signal_reg[k]*T[k];
  783. MeanY+=signal_reg[k];
  784. }
  785. MeanY/=numtocalc_reg;
  786. M1(0,0) = SumT2; M1(0,1) = SumST; M1(0,2) = SumT; M1(1,0) = SumST; M1(1,1) = SumS2;
  787. M1(1,2) = SumS; M1(2,0) = SumT; M1(2,1) = SumS;
  788. M1(2,2) = numtocalc_reg;
  789. M2(0) = SumYT; M2(1) = SumYS; M2(2) = SumY;
  790. M1inv = M1.Invert(); ABC = M1inv * M2;
  791. //calculate b,p,c ---> y = b*exp(-p*(x-c)*(x-c))
  792. p = -ABC(0)/2.; c = -ABC(1)/ABC(0);
  793. for(int k=0; k<numtocalc_reg;k++){
  794. b_num += exp(-p*(channellist_reg[k]-c)*(channellist_reg[k]-c)) * signal_reg[k];
  795. b_den += exp(-2*p*(channellist_reg[k]-c)*(channellist_reg[k]-c));
  796. }
  797. b = b_num/b_den;
  798. //calculate R-squared
  799. ///residual plots (should be normally distributed). They are normalised to the standard error of the baseline (17 ADC units)
  800. for(int k=0; k<numtocalc_reg;k++){
  801. SumYYM+= (signal_reg[k]-MeanY)*(signal_reg[k]-MeanY);
  802. 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 );
  803. if (j == 0) {
  804. h_regresidual_b0->Fill((b*exp(-p*(channellist_reg[k]-c)*(channellist_reg[k]-c)) - signal_reg[k])/signal_reg[k]);
  805. 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]);
  806. }
  807. if (j == 1) {
  808. h_regresidual_b1->Fill((b*exp(-p*(channellist_reg[k]-c)*(channellist_reg[k]-c)) - signal_reg[k])/signal_reg[k]);
  809. 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]);
  810. }
  811. if (j == 2) {
  812. h_regresidual_b2->Fill((b*exp(-p*(channellist_reg[k]-c)*(channellist_reg[k]-c)) - signal_reg[k])/signal_reg[k]);
  813. 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]);
  814. }
  815. if (j == 3) {
  816. h_regresidual_b3->Fill((b*exp(-p*(channellist_reg[k]-c)*(channellist_reg[k]-c)) - signal_reg[k])/signal_reg[k]);
  817. 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]);
  818. }
  819. }
  820. // cout << "R-squared = " << SumYYP/SumYYM << endl;
  821. //final results
  822. if (j == 0) {
  823. beamFocusX_reg_b0 = 2.3548/sqrt(2*p);
  824. beamPosX_reg_b0 = -ABC(1)/ ABC(0);
  825. beamPeakX_reg_b0 = b;
  826. beamRsqr_b0 = SumYYP/SumYYM;
  827. 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)
  828. 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)
  829. M1elements_b0[0] = SumT2;
  830. M1elements_b0[1] = SumST;
  831. M1elements_b0[2] = SumT;
  832. M1elements_b0[3] = SumST;
  833. M1elements_b0[4] = SumS2;
  834. M1elements_b0[5] = SumS;
  835. M1elements_b0[6] = SumT;
  836. M1elements_b0[7] = SumS;
  837. M1elements_b0[8] = numtocalc_reg;
  838. }
  839. else if (j == 1) {
  840. beamFocusX_reg_b1 = 2.3548/sqrt(2*p);
  841. beamPosX_reg_b1 = -ABC(1)/ ABC(0);
  842. beamPeakX_reg_b1 = b;
  843. beamRsqr_b1 = SumYYP/SumYYM;
  844. 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)
  845. 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)
  846. M1elements_b0[0] = SumT2;
  847. M1elements_b1[1] = SumST;
  848. M1elements_b1[2] = SumT;
  849. M1elements_b1[3] = SumST;
  850. M1elements_b1[4] = SumS2;
  851. M1elements_b1[5] = SumS;
  852. M1elements_b1[6] = SumT;
  853. M1elements_b1[7] = SumS;
  854. M1elements_b1[8] = numtocalc_reg;
  855. }
  856. else if (j == 2) {
  857. beamFocusX_reg_b2 = 2.3548/sqrt(2*p);
  858. beamPosX_reg_b2 = -ABC(1)/ ABC(0);
  859. beamPeakX_reg_b2 = b;
  860. beamRsqr_b2 = SumYYP/SumYYM;
  861. 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)
  862. 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)
  863. M1elements_b2[0] = SumT2;
  864. M1elements_b2[1] = SumST;
  865. M1elements_b2[2] = SumT;
  866. M1elements_b2[3] = SumST;
  867. M1elements_b2[4] = SumS2;
  868. M1elements_b2[5] = SumS;
  869. M1elements_b2[6] = SumT;
  870. M1elements_b2[7] = SumS;
  871. M1elements_b2[8] = numtocalc_reg;
  872. }
  873. else if (j == 3) {
  874. beamFocusX_reg_b3 = 2.3548/sqrt(2*p);
  875. beamPosX_reg_b3 = -ABC(1)/ ABC(0);
  876. beamPeakX_reg_b3 = b;
  877. beamRsqr_b3 = SumYYP/SumYYM;
  878. 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)
  879. 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)
  880. M1elements_b0[0] = SumT2;
  881. M1elements_b3[1] = SumST;
  882. M1elements_b3[2] = SumT;
  883. M1elements_b3[3] = SumST;
  884. M1elements_b3[4] = SumS2;
  885. M1elements_b3[5] = SumS;
  886. M1elements_b3[6] = SumT;
  887. M1elements_b3[7] = SumS;
  888. M1elements_b3[8] = numtocalc_reg;
  889. }
  890. }
  891. }
  892. else if (numtocalc_b0>0&&numtocalc_b1>0) {
  893. beamPosX_reg_b0 = gsl_stats_wmean(signal_gsl_b0,1,channellist_gsl_b0,1,numtocalc_b0); //calculate the weighted mean
  894. beamFocusX_reg_b0 = gsl_stats_wsd_with_fixed_mean(signal_gsl_b0,1,channellist_gsl_b0,1,numtocalc_b0,beamPosX_reg_b0); //Standard Deviation
  895. beamFocusX_reg_b0 *=2.3548;//SD-->FWHM
  896. beamPosX_reg_b1 = gsl_stats_wmean(signal_gsl_b1,1,channellist_gsl_b1,1,numtocalc_b1); //calculate the weighted mean
  897. beamFocusX_reg_b1 = gsl_stats_wsd_with_fixed_mean(signal_gsl_b1,1,channellist_gsl_b1,1,numtocalc_b1,beamPosX_reg_b1); //Standard Deviation
  898. beamNumX_b1 = numtocalc_b1;
  899. beamFocusX_reg_b1 *=2.3548;//SD-->FWHM
  900. beamPosX_reg_b2 = gsl_stats_wmean(signal_gsl_b2,1,channellist_gsl_b2,1,numtocalc_b2); //calculate the weighted mean
  901. beamFocusX_reg_b2 = gsl_stats_wsd_with_fixed_mean(signal_gsl_b2,1,channellist_gsl_b2,1,numtocalc_b2,beamPosX_reg_b2); //Standard Deviation
  902. beamNumX_b2 = numtocalc_b2;
  903. beamFocusX_reg_b2 *=2.3548;//SD-->FWHM
  904. beamPosX_reg_b3 = gsl_stats_wmean(signal_gsl_b3,1,channellist_gsl_b3,1,numtocalc_b3); //calculate the weighted mean
  905. beamFocusX_reg_b3 = gsl_stats_wsd_with_fixed_mean(signal_gsl_b3,1,channellist_gsl_b3,1,numtocalc_b3,beamPosX_reg_b3); //Standard Deviation
  906. beamNumX_b3 = numtocalc_b3;
  907. beamFocusX_reg_b3 *=2.3548;//SD-->FWHM
  908. beamRsqr_b0 = .0;
  909. beamRsqr_b1 = .0;
  910. beamRsqr_b2 = .0;
  911. beamRsqr_b3 = .0;
  912. }
  913. else
  914. {
  915. beamFocusX_reg_b0 = 0.;
  916. beamFocusX_reg_b1 = 0.;
  917. beamFocusX_reg_b1 = 0.;
  918. beamFocusX_reg_b1 = 0.;
  919. beamPosX_reg_b0 = 0.;
  920. beamPosX_reg_b1 = 0.;
  921. beamPosX_reg_b2 = 0.;
  922. beamPosX_reg_b3 = 0.;
  923. beamRsqr_b0 = .0;
  924. beamRsqr_b1 = .0;
  925. beamRsqr_b2 = .0;
  926. beamRsqr_b3 = .0;
  927. }
  928. rootTree->Fill();
  929. }
  930. if (frameend>0 && frame+framestart>=frameend) break;
  931. }//end of loop over frames
  932. graph_bkg_b0->SetName("graph_bkg_b0"); // graph_bkg_b0->Write();
  933. graph_bkg_b1->SetName("graph_bkg_b1"); // graph_bkg_b1->Write();
  934. graph_bkg_b2->SetName("graph_bkg_b2"); // graph_bkg_b2->Write();
  935. graph_bkg_b3->SetName("graph_bkg_b3"); // graph_bkg_b3->Write();
  936. // bic1->Fill();
  937. // bmw1_posx->Fill();
  938. //bmw1_posy->Fill();
  939. ///make reduced signal graph.
  940. for (int jjj = 0; jjj<23;jjj++) {
  941. // beamSignal_cor_b0_mean[jjj] = h_beamSignal_cor_b0[jjj]->GetMean();
  942. // beamSignal_cor_b1_mean[jjj] = h_beamSignal_cor_b1[jjj]->GetMean();
  943. // beamSignal_cor_b2_mean[jjj] = h_beamSignal_cor_b2[jjj]->GetMean();
  944. // beamSignal_cor_b3_mean[jjj] = h_beamSignal_cor_b3[jjj]->GetMean();
  945. //// get the median (0.5 quantile)
  946. q = 0.5; // 0.5 for "median"
  947. if (ionsort==3){
  948. //protons
  949. energy = energy_list_p[ jjj];
  950. intensity = intensity_list_p[ int(intensity_index) ];
  951. sp_air = f_sp_air->Eval(energy)*(intensity/1.0E6);
  952. sp_ps = f_sp_ps->Eval(energy)*(intensity/1.0E6);
  953. sp2_air = f_sp_air->Eval(energy);
  954. sp2_ps = f_sp_ps->Eval(energy);
  955. lorentz_gamma = energy/938.272 +1.; // lorentz_gamma = E_u/M_u +1
  956. mybeta = sqrt(1. - 1./(lorentz_gamma*lorentz_gamma));
  957. zsqr = 1.;
  958. }
  959. else if (ionsort==1){
  960. //helium
  961. energy = energy_list_he[ jjj ];
  962. intensity = intensity_list_he[ int(intensity_index) ];
  963. sp_air = f_h2sp_air->Eval(energy)*(intensity/1.0E6);
  964. sp_ps = f_h2sp_ps->Eval(energy)*(intensity/1.0E6);
  965. sp2_air = f_h2sp_air->Eval(energy);
  966. sp2_ps = f_h2sp_ps->Eval(energy);
  967. lorentz_gamma = energy/932.1055 +1.;// lorentz_gamma = E_u/M_u +1
  968. mybeta = sqrt(1. - 1./(lorentz_gamma*lorentz_gamma));
  969. zsqr = 4.;
  970. }
  971. else if (ionsort==4){
  972. //carbon
  973. energy = energy_list_c[ jjj];
  974. intensity = intensity_list_c[ int(intensity_index) ];
  975. sp_air = f_c12sp_air->Eval(energy)*(intensity/1.0E6);
  976. sp_ps = f_c12sp_ps->Eval(energy)*(intensity/1.0E6);
  977. sp2_air = f_c12sp_air->Eval(energy);
  978. sp2_ps = f_c12sp_ps->Eval(energy);
  979. lorentz_gamma = energy/932.3539 +1.;// lorentz_gamma = E_u/M_u +1
  980. mybeta = sqrt(1. - 1./(lorentz_gamma*lorentz_gamma));
  981. zsqr = 36.;
  982. }
  983. else if (ionsort==2){
  984. //oxygen
  985. energy = energy_list_o[ jjj];
  986. intensity = intensity_list_o[ int(intensity_index) ];
  987. sp_air = f_o16sp_air->Eval(energy)*(intensity/1.0E6);
  988. sp_ps = f_o16sp_ps->Eval(energy)*(intensity/1.0E6);
  989. sp2_air = f_o16sp_air->Eval(energy);
  990. sp2_ps = f_o16sp_ps->Eval(energy);
  991. lorentz_gamma = energy/931.4418 +1.;// lorentz_gamma = E_u/M_u +1
  992. mybeta = sqrt(1. - 1./(lorentz_gamma*lorentz_gamma));
  993. zsqr = 64.;
  994. }
  995. else {
  996. sp_air = -1.;
  997. sp_ps = -1.;
  998. sp2_air = -1.;
  999. sp2_ps = -1.;
  1000. lorentz_gamma = 0.;
  1001. mybeta = 0.;
  1002. zsqr = -1.;
  1003. }
  1004. h_beamSignal_ic1[jjj]->ComputeIntegral(); //just a precaution
  1005. h_beamSignal_ic1[jjj]->GetQuantiles(1,&median, &q);
  1006. //median = h_beamSignal_ic1[jjj]->GetMean();
  1007. // intcorr = (Intensity /19.8E6) / (totalcurrent/sp2_air/totaltime);
  1008. if (median>0&&energy>0) {intcorr = (intensity / 19.8E6) / (median/sp2_air)/ 3.11;}
  1009. // else if (median>0&&energy>0) {intcorr = 0.; median = 0.;}
  1010. else {intcorr = 0.; median = 0.;}
  1011. cout << "energy: " << energy << endl;
  1012. cout << "intensity: " << intensity << endl;
  1013. cout << "sp2_air: " << sp2_air << endl;
  1014. cout << "median: " << median << endl;
  1015. cout << "intcorr: " << intcorr << endl;
  1016. mybeta_graph[jjj] = sqrt(1. - 1./(lorentz_gamma*lorentz_gamma));
  1017. h_beamSignal_b0[jjj]->ComputeIntegral(); //just a precaution
  1018. h_beamSignal_b0[jjj]->GetQuantiles(1,&median, &q);
  1019. beamSignal_cor_b0_mean[jjj] = median*intcorr /(intensity/1.E6)/sp2_ps;
  1020. //beamSignal_cor_b0_mean[jjj] = h_beamSignal_b0[jjj]->GetMean()*intcorr /(intensity/1.E6)/sp2_ps;
  1021. cout << beamSignal_cor_b0_mean[jjj] << endl;
  1022. h_beamSignal_b1[jjj]->ComputeIntegral(); //just a precaution
  1023. h_beamSignal_b1[jjj]->GetQuantiles(1,&median, &q);
  1024. beamSignal_cor_b1_mean[jjj] = median*intcorr /(intensity/1.E6)/sp2_ps;
  1025. //beamSignal_cor_b1_mean[jjj] = h_beamSignal_b1[jjj]->GetMean()*intcorr /(intensity/1.E6)/sp2_ps;
  1026. h_beamSignal_b2[jjj]->ComputeIntegral(); //just a precaution
  1027. h_beamSignal_b2[jjj]->GetQuantiles(1,&median, &q);
  1028. beamSignal_cor_b2_mean[jjj] = median*intcorr /(intensity/1.E6)/sp2_ps;
  1029. // beamSignal_cor_b2_mean[jjj] = h_beamSignal_b2[jjj]->GetMean()*intcorr /(intensity/1.E6)/sp2_ps;
  1030. h_beamSignal_b3[jjj]->ComputeIntegral(); //just a precaution
  1031. h_beamSignal_b3[jjj]->GetQuantiles(1,&median, &q);
  1032. beamSignal_cor_b3_mean[jjj] = median*intcorr /(intensity/1.E6)/sp2_ps;
  1033. //beamSignal_cor_b3_mean[jjj] = h_beamSignal_b3[jjj]->GetMean()*intcorr /(intensity/1.E6)/sp2_ps;
  1034. }
  1035. TGraph * graph_b0 = new TGraph(23,mybeta_graph, beamSignal_cor_b0_mean);
  1036. TGraph * graph_b1 = new TGraph(23,mybeta_graph, beamSignal_cor_b1_mean);
  1037. TGraph * graph_b2 = new TGraph(23,mybeta_graph, beamSignal_cor_b2_mean);
  1038. TGraph * graph_b3 = new TGraph(23,mybeta_graph, beamSignal_cor_b3_mean);
  1039. graph_b0->SetName("graph_b0");graph_b0->Write();
  1040. graph_b1->SetName("graph_b1");graph_b1->Write();
  1041. graph_b2->SetName("graph_b2");graph_b2->Write();
  1042. graph_b3->SetName("graph_b3");graph_b3->Write();
  1043. rootFile->Write();
  1044. rootFile->Close();
  1045. std::cout << eventID << " frames analysed." << std::endl;
  1046. return 0;
  1047. // }
  1048. // else {
  1049. // std::cerr << "Error 1" << std::endl;
  1050. // return 1;
  1051. // }
  1052. }