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.

928 lines
34 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 <TStyle.h>
  12. #include <TCanvas.h>
  13. #include <TFile.h>
  14. #include <TTree.h>
  15. #include <TSystemDirectory.h>
  16. #include <gsl/gsl_statistics.h>
  17. #include <math.h>
  18. #include <gsl/gsl_errno.h>
  19. #include <gsl/gsl_fft_complex.h>
  20. #include <TF1.h>
  21. #include <TGraphErrors.h>
  22. #include <gsl/gsl_sort.h>
  23. #include "GaussSmoothen.h"
  24. #include <TVector.h>
  25. using namespace std;
  26. bool smooth_on = true;
  27. int eventID = 0;
  28. int framestart=0;
  29. int frameend = 0;
  30. double board_b0_ch[128];
  31. double board_b1_ch[128];
  32. double board_b2_ch[128];
  33. double board_b3_ch[128];
  34. double board_b0_ch_bkg[128];
  35. double board_b1_ch_bkg[128];
  36. double board_b2_ch_bkg[128];
  37. double board_b3_ch_bkg[128];
  38. double signal_b0 = 0.;
  39. double signal_b1 = 0.;
  40. double signal_b2 = 0.;
  41. double signal_b3 = 0.;
  42. double signal_b0_left = 0.;
  43. double signal_b1_left = 0.;
  44. double signal_b2_left = 0.;
  45. double signal_b3_left = 0.;
  46. double signal_b0_right = 0.;
  47. double signal_b1_right = 0.;
  48. double signal_b2_right = 0.;
  49. double signal_b3_right = 0.;
  50. double signal_gsl_b0[128];
  51. double signal_gsl_b1[128];
  52. double signal_gsl_b2[128];
  53. double signal_gsl_b3[128];
  54. double channellist_gsl_b0[128];
  55. double channellist_gsl_b1[128];
  56. double channellist_gsl_b2[128];
  57. double channellist_gsl_b3[128];
  58. double channellist[128];
  59. double pos[128];
  60. double maxchannelamp_b0 =0.;
  61. double maxchannelamp_b1 =0.;
  62. double maxchannelamp_b2 =0.;
  63. double maxchannelamp_b3 =0.;
  64. int maxchannel_b0 =0;
  65. int maxchannel_b1 =0;
  66. int maxchannel_b2 =0;
  67. int maxchannel_b3 =0;
  68. int numtocalc_b0 =0;
  69. int numtocalc_b1 =0;
  70. int numtocalc_b2 =0;
  71. int numtocalc_b3 =0;
  72. int nfwhm_b0 = 0;
  73. int nfwhm_b1 = 0;
  74. int nfwhm_b2 = 0;
  75. int nfwhm_b3 = 0;
  76. double beamPosX_b0,beamPosX_b1,beamPosX_b2,beamPosX_b3;
  77. double beamFocusX_b0,beamFocusX_b1,beamFocusX_b2,beamFocusX_b3;
  78. double beamSkewX_b0,beamSkewX_b1,beamSkewX_b2,beamSkewX_b3;
  79. double beamKurtX_b0,beamKurtX_b1,beamKurtX_b2,beamKurtX_b3;
  80. double beamNumX_b0,beamNumX_b1,beamNumX_b2,beamNumX_b3;
  81. double beamSidebandNoise_b0, beamSidebandNoise_b1, beamSidebandNoise_b2, beamSidebandNoise_b3 ;
  82. int sidenumtocalc_b0,sidenumtocalc_b1,sidenumtocalc_b2,sidenumtocalc_b3;
  83. size_t size = 5;
  84. vector<double> boxcar;
  85. vector<double> boxcarsort;
  86. vector<double> boxcarweight{1,3,5,3,1};
  87. vector<double> data(128);
  88. TVector sumvector_b0(128);
  89. TVector sumvector_b1(128);
  90. TVector sumvector_b2(128);
  91. TVector sumvector_b3(128);
  92. TVector * sumvector_b0_ptr = &sumvector_b0;
  93. TVector * sumvector_b1_ptr = &sumvector_b1;
  94. TVector * sumvector_b2_ptr = &sumvector_b2;
  95. TVector * sumvector_b3_ptr = &sumvector_b3;
  96. const int length = 100; //length of the rolling average
  97. double array_b0[length][128] = {{0.}};
  98. double array_b1[length][128] = {{0.}};
  99. double array_b2[length][128] = {{0.}};
  100. double array_b3[length][128] = {{0.}};
  101. double arrayavg_b0[128] = {0.};
  102. double arrayavg_b1[128] = {0.};
  103. double arrayavg_b2[128] = {0.};
  104. double arrayavg_b3[128] = {0.};
  105. double board_b0_smooth_ch[128];
  106. double board_b1_smooth_ch[128];
  107. double board_b2_smooth_ch[128];
  108. double board_b3_smooth_ch[128];
  109. bool graphsaved_b0 = false;
  110. bool graphsaved_b1 = false;
  111. bool graphsaved_b2 = false;
  112. bool graphsaved_b3 = false;
  113. TVector beamontime(0,3,0.,0.,0.,0.,"END");
  114. TVector * beamontime_ptr = &beamontime;
  115. double calibration_b0[128] = {0.};
  116. double calibration_b1[128] = {0.};
  117. double calibration_b2[128] = {0.};
  118. double calibration_b3[128] = {0.};
  119. /// compile with:
  120. //// $ make clean; make
  121. /// run with:
  122. //// $ ./convert <path to data> <run>
  123. //// $ ./convert /work/leverington/beamprofilemonitor/hitdata/HIT_17_12_2017/ run2
  124. int main(int argc, char **argv)
  125. {
  126. //initialise some values;
  127. for (int i = 0;i<128;i++){
  128. board_b0_ch_bkg[i] = 0.;
  129. board_b1_ch_bkg[i] = 0.;
  130. board_b2_ch_bkg[i] = 0.;
  131. board_b3_ch_bkg[i] = 0.;
  132. channellist_gsl_b0[i] = 0;
  133. channellist_gsl_b1[i] = 0;
  134. channellist_gsl_b2[i] = 0;
  135. channellist_gsl_b3[i] = 0;
  136. sumvector_b0[i] = 0;
  137. sumvector_b1[i] = 0;
  138. sumvector_b2[i] = 0;
  139. sumvector_b3[i] = 0;
  140. calibration_b0[i] = 1.0;
  141. calibration_b1[i] = 1.0;
  142. calibration_b2[i] = 1.0;
  143. calibration_b3[i] = 1.0;
  144. if (i<64) {pos[i] = double(i);}
  145. else {pos[i] = double(i) + 0.2; }
  146. }
  147. if (argc > 1){
  148. //open the file names specified in the command line
  149. string filename;
  150. string rootfilename;
  151. // argv[1]= "/work/leverington/beamprofilemonitor/hitdata/HIT_17_12_2017/";
  152. // argv[2]= "Run11"
  153. filename = Form("%s%s.dat",argv[1],argv[2]);
  154. rootfilename = Form("%s/root/%s.root",argv[1],argv[2]); // Giulia needs to change the path %s/root/ of the written root file.
  155. ifstream file(filename, ifstream::in | ifstream::binary);
  156. if (!file.is_open()){
  157. printf(".dat did not open.\n");
  158. return -1; //file could not be opened
  159. }
  160. ///some variables to get the data
  161. // int number_of_records_to_read = 4*10;
  162. // BufferData* buffer = new BufferData[number_of_records_to_read];
  163. if(argc > 4) {
  164. framestart = atoi(argv[3]);
  165. frameend = atoi(argv[4]);
  166. }
  167. int board_b = -1;
  168. long int fileframesize = getFileSize(filename.c_str()) / ( 4*sizeof(BufferData) );
  169. BufferData* dataptr = new BufferData();
  170. if (fileframesize>0){
  171. cout << "Number of frames:" << fileframesize << endl;
  172. //open ROOT file for saving histos and TTree.
  173. TFile *rootFile = new TFile(rootfilename.c_str(),"RECREATE");
  174. if ( rootFile->IsOpen() ) printf("ROOT file opened successfully\n");
  175. TH2D * th2_signal_vs_channel_b0 = new TH2D("th2_signal_vs_channel_b0","th2_signal_vs_channel_b0",128,0,128,2200,-1000,10000);
  176. TH2D * th2_signal_vs_channel_b1 = new TH2D("th2_signal_vs_channel_b1","th2_signal_vs_channel_b1",128,0,128,2200,-1000,10000);
  177. TH2D * th2_signal_vs_channel_b2 = new TH2D("th2_signal_vs_channel_b2","th2_signal_vs_channel_b2",128,0,128,2200,-1000,10000);
  178. TH2D * th2_signal_vs_channel_b3 = new TH2D("th2_signal_vs_channel_b3","th2_signal_vs_channel_b3",128,0,128,2200,-1000,10000);
  179. 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);
  180. 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);
  181. 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);
  182. 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);
  183. TH1D * th1_signal_b0 = new TH1D("th1_signal_b0","th1_signal_b0",2200,-10000,50000);
  184. TH1D * th1_signal_b1 = new TH1D("th1_signal_b1","th1_signal_b1",2200,-10000,50000);
  185. TH1D * th1_signal_b2 = new TH1D("th1_signal_b2","th1_signal_b2",2200,-10000,50000);
  186. TH1D * th1_signal_b3 = new TH1D("th1_signal_b3","th1_signal_b3",2200,-10000,50000);
  187. TGraph * graph_bkg_b0 = new TGraph();
  188. TGraph * graph_bkg_b1 = new TGraph();
  189. TGraph * graph_bkg_b2 = new TGraph();
  190. TGraph * graph_bkg_b3 = new TGraph();
  191. TGraph * gr_b0;
  192. TGraph * gr_sm_b0;
  193. TGraph * gr_b1;
  194. TGraph * gr_sm_b1;
  195. TGraph * gr_b2;
  196. TGraph * gr_sm_b2;
  197. TGraph * gr_b3;
  198. TGraph * gr_sm_b3;
  199. 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);
  200. 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);
  201. 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);
  202. 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);
  203. TTree *rootTree = new TTree("t","HIT Data Root Tree");
  204. rootTree->Branch("beamPosX_b0",&beamPosX_b0,"beamPosX_b0/D");
  205. rootTree->Branch("beamPosX_b1",&beamPosX_b1,"beamPosX_b1/D");
  206. rootTree->Branch("beamPosX_b2",&beamPosX_b2,"beamPosX_b2/D");
  207. rootTree->Branch("beamPosX_b3",&beamPosX_b3,"beamPosX_b3/D");
  208. rootTree->Branch("beamFocusX_b0",&beamFocusX_b0,"beamFocusX_b0/D");
  209. rootTree->Branch("beamFocusX_b1",&beamFocusX_b1,"beamFocusX_b1/D");
  210. rootTree->Branch("beamFocusX_b2",&beamFocusX_b2,"beamFocusX_b2/D");
  211. rootTree->Branch("beamFocusX_b3",&beamFocusX_b3,"beamFocusX_b3/D");
  212. rootTree->Branch("beamSkewX_b0",&beamSkewX_b0,"beamSkewX_b0/D");
  213. rootTree->Branch("beamSkewX_b1",&beamSkewX_b1,"beamSkewX_b1/D");
  214. rootTree->Branch("beamSkewX_b2",&beamSkewX_b2,"beamSkewX_b2/D");
  215. rootTree->Branch("beamSkewX_b3",&beamSkewX_b3,"beamSkewX_b3/D");
  216. rootTree->Branch("beamKurtX_b0",&beamKurtX_b0,"beamKurtX_b0/D");
  217. rootTree->Branch("beamKurtX_b1",&beamKurtX_b1,"beamKurtX_b1/D");
  218. rootTree->Branch("beamKurtX_b2",&beamKurtX_b2,"beamKurtX_b2/D");
  219. rootTree->Branch("beamKurtX_b3",&beamKurtX_b3,"beamKurtX_b3/D");
  220. rootTree->Branch("beamNumX_b0",&beamNumX_b0,"beamNumX_b0/D");
  221. rootTree->Branch("beamNumX_b1",&beamNumX_b1,"beamNumX_b1/D");
  222. rootTree->Branch("beamNumX_b2",&beamNumX_b2,"beamNumX_b2/D");
  223. rootTree->Branch("beamNumX_b3",&beamNumX_b3,"beamNumX_b3/D");
  224. rootTree->Branch("beamSignal_b0",&signal_b0,"beamSignal_b0/D");
  225. rootTree->Branch("beamSignal_b1",&signal_b1,"beamSignal_b1/D");
  226. rootTree->Branch("beamSignal_b2",&signal_b2,"beamSignal_b2/D");
  227. rootTree->Branch("beamSignal_b3",&signal_b3,"beamSignal_b3/D");
  228. rootTree->Branch("beamSignal_b0_left",&signal_b0_left,"beamSignal_b0_left/D");
  229. rootTree->Branch("beamSignal_b1_left",&signal_b1_left,"beamSignal_b1_left/D");
  230. rootTree->Branch("beamSignal_b2_left",&signal_b2_left,"beamSignal_b2_left/D");
  231. rootTree->Branch("beamSignal_b3_left",&signal_b3_left,"beamSignal_b3_left/D");
  232. rootTree->Branch("beamSignal_b0_right",&signal_b0_right,"beamSignal_b0_right/D");
  233. rootTree->Branch("beamSignal_b1_right",&signal_b1_right,"beamSignal_b1_right/D");
  234. rootTree->Branch("beamSignal_b2_right",&signal_b2_right,"beamSignal_b2_right/D");
  235. rootTree->Branch("beamSignal_b3_right",&signal_b3_right,"beamSignal_b3_right/D");
  236. rootTree->Branch("eventID",&eventID,"eventID/I");
  237. rootTree->Branch("board_b0_ch",&board_b0_ch,"board_b0_ch[128]/D");
  238. rootTree->Branch("board_b1_ch",&board_b1_ch,"board_b1_ch[128]/D");
  239. rootTree->Branch("board_b2_ch",&board_b2_ch,"board_b2_ch[128]/D");
  240. rootTree->Branch("board_b3_ch",&board_b3_ch,"board_b3_ch[128]/D");
  241. rootTree->Branch("beamSidebandNoise_b0",&beamSidebandNoise_b0,"beamSidebandNoise_b0/D");
  242. rootTree->Branch("beamSidebandNoise_b1",&beamSidebandNoise_b1,"beamSidebandNoise_b1/D");
  243. rootTree->Branch("beamSidebandNoise_b2",&beamSidebandNoise_b2,"beamSidebandNoise_b2/D");
  244. rootTree->Branch("beamSidebandNoise_b3",&beamSidebandNoise_b3,"beamSidebandNoise_b3/D");
  245. rootTree->Branch("arrayavg_b0",&arrayavg_b0,"arrayavg_b0[128]/D");
  246. rootTree->Branch("arrayavg_b1",&arrayavg_b1,"arrayavg_b1[128]/D");
  247. rootTree->Branch("arrayavg_b2",&arrayavg_b2,"arrayavg_b2[128]/D");
  248. rootTree->Branch("arrayavg_b3",&arrayavg_b3,"arrayavg_b3[128]/D");
  249. // import and align matching ethercat data
  250. TTree *tree2 = new TTree("t2", "t2");
  251. //loop through recorded data frames
  252. for (int frame = 0; frame<fileframesize; frame++){
  253. eventID = frame;
  254. // cout << eventID << endl;
  255. //board_b 0
  256. board_b=0;
  257. signal_b0 = 0.;
  258. maxchannelamp_b0 = 0.;
  259. file.seekg(framestart*sizeof(BufferData)+board_b*sizeof(BufferData)+4*frame*sizeof(BufferData));
  260. file.read ((char*)dataptr ,sizeof(BufferData));
  261. if (dataptr->sync_frame.device_nr==board_b){
  262. //cout << frame << " " << dataptr->sync_frame.device_nr << endl;
  263. if (frame%1000==0) cout << "Frame: " << frame << endl;
  264. for (int i = 0;i<128;i++){
  265. board_b0_ch[i] = dataptr->sensor_data[i];
  266. if (frame<1000){
  267. board_b0_ch_bkg[i] += board_b0_ch[i]/1000.; //find baseline from the average of first 1000 events
  268. }
  269. else if (frame>=1000&& frame<2000){
  270. board_b0_ch[i] -= board_b0_ch_bkg[i]; //histogram the subtracted baseline in the next 1000 events
  271. th2_signal_vs_channel_bkg_b0->Fill(i,board_b0_ch[i]);
  272. if (i==1) graph_bkg_b0->SetPoint(graph_bkg_b0->GetN(), frame, board_b0_ch[i]);
  273. }
  274. else if (frame>=2000) {
  275. board_b0_ch[i]-=board_b0_ch_bkg[i]; // the rest background subtracted
  276. board_b0_ch[i]*=calibration_b0[i]; //calibration factor
  277. th2_signal_vs_channel_b0->Fill(i,board_b0_ch[i]);
  278. // signal_b0 +=board_b0_ch[i] ;
  279. if (board_b0_ch[i]> maxchannelamp_b0) {
  280. maxchannel_b0 = i;
  281. maxchannelamp_b0 = board_b0_ch[i];
  282. }
  283. //calculate a rolling average of the signal
  284. arrayavg_b0[i] = 0;
  285. for (int j = 1; j<length;j++){
  286. array_b0[j-1][i] = array_b0[j][i];
  287. arrayavg_b0[i] += array_b0[j-1][i]/double(length);
  288. }
  289. if( board_b0_ch[i]>-1000){
  290. array_b0[length-1][i] = board_b0_ch[i];
  291. arrayavg_b0[i] += array_b0[length-1][i]/double(length);
  292. }
  293. ////////////////////////////////////////////
  294. }
  295. }
  296. // th1_signal_b0->Fill(signal_b0);
  297. }
  298. else {
  299. cout << "Error." << endl;
  300. }
  301. //board_b 1
  302. board_b=1;
  303. signal_b1=0.;
  304. maxchannelamp_b1 = 0.;
  305. file.seekg(framestart*sizeof(BufferData)+board_b*sizeof(BufferData)+4*frame*sizeof(BufferData));
  306. file.read ((char*)dataptr ,sizeof(BufferData));
  307. if (dataptr->sync_frame.device_nr==board_b){
  308. //cout << frame << " " << dataptr->sync_frame.device_nr << endl;
  309. for (int i = 0;i<128;i++){
  310. board_b1_ch[i] = dataptr->sensor_data[i];
  311. if (frame<1000){
  312. board_b1_ch_bkg[i] += board_b1_ch[i]/1000.; //find baseline from the average of first 1000 events
  313. }
  314. else if (frame>=1000&& frame<2000){
  315. board_b1_ch[i] -= board_b1_ch_bkg[i]; //histogram the subtracted baseline in the next 1000 events
  316. th2_signal_vs_channel_bkg_b1->Fill(i,board_b1_ch[i]);
  317. if (i==1) graph_bkg_b1->SetPoint(graph_bkg_b1->GetN(), frame, board_b1_ch[i]);
  318. }
  319. else if (frame>=2000) {
  320. board_b1_ch[i]-=board_b1_ch_bkg[i]; // the rest are background subtracted
  321. board_b1_ch[i]*=calibration_b1[i]; //calibration factor
  322. th2_signal_vs_channel_b1->Fill(i,board_b1_ch[i]);
  323. // signal_b1 +=board_b1_ch[i] ;
  324. if (board_b1_ch[i]> maxchannelamp_b1) {
  325. maxchannel_b1 = i;
  326. maxchannelamp_b1 = board_b1_ch[i];
  327. }
  328. //calculate a rolling average of the signal
  329. arrayavg_b1[i] = 0;
  330. for (int j = 1; j<length;j++){
  331. array_b1[j-1][i] = array_b1[j][i];
  332. arrayavg_b1[i] += array_b1[j-1][i]/double(length);
  333. }
  334. if( board_b1_ch[i]>-1000){
  335. array_b1[length-1][i] = board_b1_ch[i];
  336. arrayavg_b1[i] += array_b1[length-1][i]/double(length);
  337. }
  338. ////////////////////////////////////////////
  339. }
  340. }
  341. // th1_signal_b1->Fill(signal_b1);
  342. }
  343. else {
  344. cout << "Error." << endl;
  345. }
  346. //board_b 2
  347. board_b=2;
  348. signal_b2=0.;
  349. maxchannelamp_b2 = 0.;
  350. file.seekg(framestart*sizeof(BufferData)+board_b*sizeof(BufferData)+4*frame*sizeof(BufferData));
  351. file.read ((char*)dataptr ,sizeof(BufferData));
  352. if (dataptr->sync_frame.device_nr==board_b){
  353. //cout << frame << " " << dataptr->sync_frame.device_nr << endl;
  354. for (int i = 0;i<128;i++){
  355. board_b2_ch[i] = dataptr->sensor_data[i];
  356. if (frame<1000){
  357. board_b2_ch_bkg[i] += board_b2_ch[i]/1000.; //find baseline from the average of first 1000 events
  358. }
  359. else if (frame>=1000&& frame<2000){
  360. board_b2_ch[i] -= board_b2_ch_bkg[i]; //histogram the subtracted baseline in the next 1000 events
  361. th2_signal_vs_channel_bkg_b2->Fill(i,board_b2_ch[i]);
  362. if (i==1) graph_bkg_b2->SetPoint(graph_bkg_b2->GetN(), frame, board_b2_ch[i]);
  363. }
  364. else if (frame>=2000) {
  365. board_b2_ch[i]-=board_b2_ch_bkg[i]; // the rest background subtracted
  366. board_b2_ch[i]*=calibration_b2[i]; //calibration factor
  367. th2_signal_vs_channel_b2->Fill(i,board_b2_ch[i]);
  368. // signal_b2 +=board_b2_ch[i] ;
  369. if (board_b2_ch[i]> maxchannelamp_b2) {
  370. maxchannel_b2 = i;
  371. maxchannelamp_b2 = board_b2_ch[i];
  372. }
  373. //calculate a rolling average of the signal
  374. arrayavg_b2[i] = 0;
  375. for (int j = 1; j<length;j++){
  376. array_b2[j-1][i] = array_b2[j][i];
  377. arrayavg_b2[i] += array_b2[j-1][i]/double(length);
  378. }
  379. if( board_b2_ch[i]>-1000){
  380. array_b2[length-1][i] = board_b2_ch[i];
  381. arrayavg_b2[i] += array_b2[length-1][i]/double(length);
  382. }
  383. ////////////////////////////////////////////
  384. }
  385. }
  386. // th1_signal_b2->Fill(signal_b2);
  387. }
  388. else {
  389. cout << "Error." << endl;
  390. }
  391. //board_b 3
  392. board_b=3;
  393. signal_b3=0.;
  394. maxchannelamp_b3 = 0.;
  395. file.seekg(framestart*sizeof(BufferData)+board_b*sizeof(BufferData)+4*frame*sizeof(BufferData));
  396. file.read ((char*)dataptr ,sizeof(BufferData));
  397. if (dataptr->sync_frame.device_nr==board_b){
  398. //cout << frame << " " << dataptr->sync_frame.device_nr << endl;
  399. for (int i = 0;i<128;i++){
  400. board_b3_ch[i] = dataptr->sensor_data[i];
  401. if (frame<1000){
  402. board_b3_ch_bkg[i] += board_b3_ch[i]/1000.; //find baseline from the average of first 1000 events
  403. }
  404. else if (frame>=1000&& frame<2000){
  405. board_b3_ch[i] -= board_b3_ch_bkg[i]; //histogram the subtracted baseline in the next 1000 events
  406. th2_signal_vs_channel_bkg_b3->Fill(i,board_b3_ch[i]);
  407. if (i==1) graph_bkg_b3->SetPoint(graph_bkg_b3->GetN(), frame, board_b3_ch[i]);
  408. }
  409. else if (frame>=2000) {
  410. board_b3_ch[i]-=board_b3_ch_bkg[i]; // the rest of the events are background subtracted
  411. board_b3_ch[i]*=calibration_b3[i]; //with a calibration factor
  412. th2_signal_vs_channel_b3->Fill(i,board_b3_ch[i]);
  413. // signal_b3 +=board_b3_ch[i] ;
  414. if (board_b3_ch[i]> maxchannelamp_b3) {
  415. maxchannel_b3 = i;
  416. maxchannelamp_b3 = board_b3_ch[i];
  417. }
  418. //calculate a rolling average of the signal
  419. arrayavg_b3[i] = 0;
  420. for (int j = 1; j<length;j++){
  421. array_b3[j-1][i] = array_b3[j][i];
  422. arrayavg_b3[i] += array_b3[j-1][i]/double(length);
  423. }
  424. if( board_b3_ch[i]>-1000){
  425. array_b3[length-1][i] = board_b3_ch[i];
  426. arrayavg_b3[i] += array_b3[length-1][i]/double(length);
  427. }
  428. ////////////////////////////////////////////
  429. }
  430. }
  431. // th1_signal_b3->Fill(signal_b3);
  432. }
  433. else {
  434. cout << "Error." << endl;
  435. }
  436. ////////////////////////////////////////////////////////////
  437. ////////////////////////////////////////////////////////////
  438. //start the signal analysis
  439. ////////////////////////////////////////////////////////////
  440. ////////////////////////////////////////////////////////////
  441. if (frame>=2000){
  442. ////////////////////////////////////////////////////////////
  443. //boxcar smoothing filter
  444. ////////////////////////////////////////////////////////////
  445. if (smooth_on){
  446. maxchannelamp_b0 = 0.0;
  447. maxchannelamp_b1 = 0.0;
  448. maxchannelamp_b2 = 0.0;
  449. maxchannelamp_b3 = 0.0;
  450. }
  451. boxcar.clear();
  452. boxcar.push_back(board_b0_ch[0]);
  453. boxcar.push_back(board_b0_ch[1]);
  454. // cout << frame << endl;
  455. for (int i = 0;i<128;i++){
  456. channellist[i] = i;
  457. if (i<126) {
  458. boxcar.push_back(board_b0_ch[i+2]);
  459. }
  460. if ( (i<126&&boxcar.size()>5) || (i>=126&&boxcar.size()>3) ) boxcar.erase(boxcar.cbegin());
  461. board_b0_smooth_ch[i] = gsl_stats_mean(boxcar.data(), 1, 5 );
  462. if (smooth_on && board_b0_smooth_ch[i]> maxchannelamp_b0) {
  463. maxchannel_b0 = i;
  464. maxchannelamp_b0 = board_b0_smooth_ch[i];
  465. }
  466. }
  467. if (eventID>2001&&maxchannelamp_b0>100&&!graphsaved_b0) {
  468. gr_b0 = new TGraph(128, channellist, board_b0_ch);
  469. gr_b0->SetTitle("RawData_b0");
  470. gr_b0->SetName("RawData_b0");
  471. gr_b0->Write();
  472. gr_sm_b0 = new TGraph(128, channellist, board_b0_smooth_ch);
  473. gr_sm_b0->SetTitle("SmoothedData_b0");
  474. gr_sm_b0->SetName("SmoothedData_b0");
  475. gr_sm_b0->Write();
  476. graphsaved_b0=true;
  477. }
  478. boxcar.clear();
  479. boxcar.push_back(board_b1_ch[0]);
  480. boxcar.push_back(board_b1_ch[1]);
  481. // cout << frame << endl;
  482. for (int i = 0;i<128;i++){
  483. channellist[i] = i;
  484. if (i<126) {
  485. boxcar.push_back(board_b1_ch[i+2]);
  486. }
  487. if ( (i<126&&boxcar.size()>5) || (i>=126&&boxcar.size()>3) ) boxcar.erase(boxcar.cbegin());
  488. board_b1_smooth_ch[i] = gsl_stats_mean(boxcar.data(), 1, 5 );
  489. if (smooth_on && board_b1_smooth_ch[i]> maxchannelamp_b1) {
  490. maxchannel_b1 = i;
  491. maxchannelamp_b1 = board_b1_smooth_ch[i];
  492. }
  493. }
  494. if (eventID>2001&&maxchannelamp_b1>100&&!graphsaved_b1) {
  495. gr_b1 = new TGraph(128, channellist, board_b1_ch);
  496. gr_b1->SetTitle("RawData_b1");
  497. gr_b1->SetName("RawData_b1");
  498. gr_b1->Write();
  499. gr_sm_b1 = new TGraph(128, channellist, board_b1_smooth_ch);
  500. gr_sm_b1->SetTitle("SmoothedData_b1");
  501. gr_sm_b1->SetName("SmoothedData_b1");
  502. gr_sm_b1->Write();
  503. graphsaved_b1=true;
  504. }
  505. boxcar.clear();
  506. boxcar.push_back(board_b2_ch[0]);
  507. boxcar.push_back(board_b2_ch[1]);
  508. // cout << frame << endl;
  509. for (int i = 0;i<128;i++){
  510. channellist[i] = i;
  511. if (i<126) {
  512. boxcar.push_back(board_b2_ch[i+2]);
  513. }
  514. if ( (i<126&&boxcar.size()>5) || (i>=126&&boxcar.size()>3) ) boxcar.erase(boxcar.cbegin());
  515. board_b2_smooth_ch[i] = gsl_stats_mean(boxcar.data(), 1, 5 );
  516. if (smooth_on && board_b2_smooth_ch[i]> maxchannelamp_b2) {
  517. maxchannel_b2 = i;
  518. maxchannelamp_b2 = board_b2_smooth_ch[i];
  519. }
  520. }
  521. if (eventID>2001&&maxchannelamp_b2>100&&!graphsaved_b2) {
  522. gr_b2 = new TGraph(128, channellist, board_b2_ch);
  523. gr_b2->SetTitle("RawData_b2");
  524. gr_b2->SetName("RawData_b2");
  525. gr_b2->Write();
  526. gr_sm_b2 = new TGraph(128, channellist, board_b2_smooth_ch);
  527. gr_sm_b2->SetTitle("SmoothedData_b2");
  528. gr_sm_b2->SetName("SmoothedData_b2");
  529. gr_sm_b2->Write();
  530. graphsaved_b2=true;
  531. }
  532. boxcar.clear();
  533. boxcar.push_back(board_b3_ch[0]);
  534. boxcar.push_back(board_b3_ch[1]);
  535. // cout << frame << endl;
  536. for (int i = 0;i<128;i++){
  537. channellist[i] = i;
  538. if (i<126) {
  539. boxcar.push_back(board_b3_ch[i+2]);
  540. }
  541. if ( (i<126&&boxcar.size()>5) || (i>=126&&boxcar.size()>3) ) boxcar.erase(boxcar.cbegin());
  542. board_b3_smooth_ch[i] = gsl_stats_mean(boxcar.data(), 1, 5 );
  543. if (smooth_on && board_b3_smooth_ch[i]> maxchannelamp_b3) {
  544. maxchannel_b3 = i;
  545. maxchannelamp_b3 = board_b3_smooth_ch[i];
  546. }
  547. }
  548. if (eventID>2001&&maxchannelamp_b3>100&&!graphsaved_b3) {
  549. gr_b3 = new TGraph(128, channellist, board_b3_ch);
  550. gr_b3->SetTitle("RawData_b3");
  551. gr_b3->SetName("RawData_b3");
  552. gr_b3->Write();
  553. gr_sm_b3 = new TGraph(128, channellist, board_b3_smooth_ch);
  554. gr_sm_b3->SetTitle("SmoothedData_b3");
  555. gr_sm_b3->SetName("SmoothedData_b3");
  556. gr_sm_b3->Write();
  557. graphsaved_b3=true;
  558. }
  559. ////////////////////////////////////////////////////////////
  560. //find the approx FWHM
  561. ////////////////////////////////////////////////////////////
  562. nfwhm_b0 =0;
  563. nfwhm_b1 =0;
  564. nfwhm_b2 =0;
  565. nfwhm_b3 =0;
  566. if (smooth_on){
  567. for (int i = 0;i<128;i++){
  568. if (board_b0_smooth_ch[i] > maxchannelamp_b0/2.) nfwhm_b0++;
  569. if (board_b1_smooth_ch[i] > maxchannelamp_b1/2.) nfwhm_b1++;
  570. if (board_b2_smooth_ch[i] > maxchannelamp_b2/2.) nfwhm_b2++;
  571. if (board_b3_smooth_ch[i] > maxchannelamp_b3/2.) nfwhm_b3++;
  572. signal_gsl_b0[i] = 0.;
  573. signal_gsl_b1[i] = 0.;
  574. signal_gsl_b2[i] = 0.;
  575. signal_gsl_b3[i] = 0.;
  576. }
  577. }
  578. else {
  579. for (int i = 0;i<128;i++){
  580. if (board_b0_ch[i] > maxchannelamp_b0/2.) nfwhm_b0++;
  581. if (board_b1_ch[i] > maxchannelamp_b1/2.) nfwhm_b1++;
  582. if (board_b2_ch[i] > maxchannelamp_b2/2.) nfwhm_b2++;
  583. if (board_b3_ch[i] > maxchannelamp_b3/2.) nfwhm_b3++;
  584. signal_gsl_b0[i] = 0.;
  585. signal_gsl_b1[i] = 0.;
  586. signal_gsl_b2[i] = 0.;
  587. signal_gsl_b3[i] = 0.;
  588. }
  589. }
  590. ////////////////////////////////////////////////////////////
  591. //integrate the sidebands first to check for baseline shift
  592. ////////////////////////////////////////////////////////////
  593. beamSidebandNoise_b0 = 0.;
  594. sidenumtocalc_b0 = 0;
  595. for (int i =0; i<maxchannel_b0-nfwhm_b0; i++){
  596. if (i>=0 && i<=127){
  597. beamSidebandNoise_b0 += board_b0_ch[i]; //integrate the noise outside the peak
  598. sidenumtocalc_b0++;
  599. }
  600. }
  601. for (int i = maxchannel_b0+nfwhm_b0; i < 128; i++){
  602. if (i>=0 && i<=127){
  603. beamSidebandNoise_b0 += board_b0_ch[i]; //integrate the noise outside the peak
  604. sidenumtocalc_b0++;
  605. }
  606. }
  607. if (sidenumtocalc_b0>0) beamSidebandNoise_b0 = beamSidebandNoise_b0 /double(sidenumtocalc_b0); // channel baseline shift
  608. beamSidebandNoise_b1 = 0.;
  609. sidenumtocalc_b1 = 0;
  610. for (int i =0; i<maxchannel_b1-nfwhm_b1; i++){
  611. if (i>=0 && i<=127){
  612. beamSidebandNoise_b1 += board_b1_ch[i]; //integrate the noise outside the peak
  613. sidenumtocalc_b1++;
  614. }
  615. }
  616. for (int i = maxchannel_b1+nfwhm_b1; i < 128; i++){
  617. if (i>=0 && i<=127){
  618. beamSidebandNoise_b1 += board_b1_ch[i]; //integrate the noise outside the peak
  619. sidenumtocalc_b1++;
  620. }
  621. }
  622. if (sidenumtocalc_b1>0) beamSidebandNoise_b1 = beamSidebandNoise_b1 /double(sidenumtocalc_b1); // channel baseline shift
  623. beamSidebandNoise_b2 = 0.;
  624. sidenumtocalc_b2 = 0;
  625. for (int i =0; i<maxchannel_b2-nfwhm_b2; i++){
  626. if (i>=0 && i<=127){
  627. beamSidebandNoise_b2 += board_b2_ch[i]; //integrate the noise outside the peak
  628. sidenumtocalc_b2++;
  629. }
  630. }
  631. for (int i = maxchannel_b2+nfwhm_b2; i < 128; i++){
  632. if (i>=0 && i<=127){
  633. beamSidebandNoise_b2 += board_b2_ch[i]; //integrate the noise outside the peak
  634. sidenumtocalc_b2++;
  635. }
  636. }
  637. if (sidenumtocalc_b2>0) beamSidebandNoise_b2 = beamSidebandNoise_b2 /double(sidenumtocalc_b2); // channel baseline shift
  638. beamSidebandNoise_b3 = 0.;
  639. sidenumtocalc_b3 = 0;
  640. for (int i =0; i<maxchannel_b3-nfwhm_b3; i++){
  641. if (i>=0 && i<=127){
  642. beamSidebandNoise_b3 += board_b3_ch[i]; //integrate the noise outside the peak
  643. sidenumtocalc_b3++;
  644. }
  645. }
  646. for (int i = maxchannel_b3+nfwhm_b3; i < 128; i++){
  647. if (i>=0 && i<=127){
  648. beamSidebandNoise_b3 += board_b3_ch[i]; //integrate the noise outside the peak
  649. sidenumtocalc_b3++;
  650. }
  651. }
  652. if (sidenumtocalc_b3>0) beamSidebandNoise_b3 = beamSidebandNoise_b3 /double(sidenumtocalc_b3); // channel baseline shift
  653. ////////////////////////////////////////////////////////////
  654. //integrate under the approximate peak
  655. //build the channel list for statistical analysis
  656. ////////////////////////////////////////////////////////////
  657. numtocalc_b0 = 0;
  658. numtocalc_b1 = 0;
  659. numtocalc_b2 = 0;
  660. numtocalc_b3 = 0;
  661. signal_b0_left = 0.;
  662. signal_b0_right = 0.;
  663. for (int i = maxchannel_b0-nfwhm_b0 ; i <= maxchannel_b0 + nfwhm_b0; i++){
  664. if (i>=0 && i<=127 && board_b0_ch[i]>50){
  665. signal_b0 +=board_b0_ch[i]-beamSidebandNoise_b0 ;
  666. if (i<64) {signal_b0_left +=board_b0_ch[i]-beamSidebandNoise_b0 ;}
  667. else {signal_b0_right +=board_b0_ch[i]-beamSidebandNoise_b0 ;}
  668. signal_gsl_b0[numtocalc_b0]=board_b0_ch[i]-beamSidebandNoise_b0 ;
  669. // channellist_gsl_b0[numtocalc_b0] = i;
  670. channellist_gsl_b0[numtocalc_b0] = pos[i];
  671. numtocalc_b0++;
  672. }
  673. }
  674. th1_signal_b0->Fill(signal_b0);
  675. signal_b1_left = 0.;
  676. signal_b1_right = 0.;
  677. for (int i = maxchannel_b1-nfwhm_b1 ; i <= maxchannel_b1 + nfwhm_b1; i++){
  678. if (i>=0 && i<=127&&board_b1_ch[i]>50){
  679. signal_b1 +=board_b1_ch[i]-beamSidebandNoise_b1 ;
  680. if (i<64) {signal_b1_left +=board_b1_ch[i]-beamSidebandNoise_b1 ;}
  681. else {signal_b1_right +=board_b1_ch[i]-beamSidebandNoise_b1 ;}
  682. signal_gsl_b1[numtocalc_b1]=board_b1_ch[i]-beamSidebandNoise_b1 ;
  683. // channellist_gsl_b1[numtocalc_b1] = i;
  684. channellist_gsl_b1[numtocalc_b1] = pos[i];
  685. numtocalc_b1++;
  686. }
  687. }
  688. th1_signal_b0->Fill(signal_b1);
  689. signal_b2_left = 0.;
  690. signal_b2_right = 0.;
  691. for (int i = maxchannel_b2-nfwhm_b2 ; i <= maxchannel_b2 + nfwhm_b2; i++){
  692. if (i>=0 && i<=127&&board_b2_ch[i]>50){
  693. signal_b2 +=board_b2_ch[i]-beamSidebandNoise_b2 ;
  694. if (i<64) {signal_b2_left +=board_b2_ch[i]-beamSidebandNoise_b2 ;}
  695. else {signal_b2_right +=board_b2_ch[i]-beamSidebandNoise_b2 ;}
  696. signal_gsl_b2[numtocalc_b2]=board_b2_ch[i]-beamSidebandNoise_b2 ;
  697. // channellist_gsl_b2[numtocalc_b2] = i;
  698. channellist_gsl_b2[numtocalc_b2] = pos[i];
  699. numtocalc_b2++;
  700. }
  701. }
  702. th1_signal_b0->Fill(signal_b2);
  703. signal_b3_left = 0.;
  704. signal_b3_right = 0.;
  705. for (int i = maxchannel_b3-nfwhm_b3 ; i <= maxchannel_b3 + nfwhm_b3; i++){
  706. if (i>=0 && i<=127&&board_b3_ch[i]>50){
  707. signal_b3 +=board_b3_ch[i]-beamSidebandNoise_b3 ;
  708. if (i<64) {signal_b3_left +=board_b3_ch[i]-beamSidebandNoise_b3 ;}
  709. else {signal_b3_right +=board_b3_ch[i]-beamSidebandNoise_b3 ;}
  710. signal_gsl_b3[numtocalc_b3]=board_b3_ch[i]-beamSidebandNoise_b3 ;
  711. //channellist_gsl_b3[numtocalc_b3] = i;
  712. channellist_gsl_b3[numtocalc_b3] = pos[i];
  713. numtocalc_b3++;
  714. }
  715. }
  716. th1_signal_b0->Fill(signal_b3);
  717. for (int i=0;i<128;i++){
  718. if(signal_b0>7000) {
  719. th2_signal_vs_channel_sub_b0->Fill(i,board_b0_ch[i]-beamSidebandNoise_b0);
  720. sumvector_b0[i] += board_b0_ch[i];//-beamSidebandNoise_b0;
  721. }
  722. if(signal_b1>7000) {
  723. th2_signal_vs_channel_sub_b1->Fill(i,board_b1_ch[i]-beamSidebandNoise_b1);
  724. sumvector_b1[i] += board_b1_ch[i];//-beamSidebandNoise_b1;
  725. }
  726. if(signal_b2>7000){
  727. th2_signal_vs_channel_sub_b2->Fill(i,board_b2_ch[i]-beamSidebandNoise_b2);
  728. sumvector_b2[i] += board_b2_ch[i];//-beamSidebandNoise_b2;
  729. }
  730. if(signal_b3>7000) {
  731. th2_signal_vs_channel_sub_b3->Fill(i,board_b3_ch[i]-beamSidebandNoise_b3);
  732. sumvector_b3[i] += board_b3_ch[i];//-beamSidebandNoise_b3;
  733. }
  734. }
  735. if(signal_b0>1000) beamontime[0]+=1.0;
  736. if(signal_b1>1000) beamontime[1]+=1.0;
  737. if(signal_b2>1000) beamontime[2]+=1.0;
  738. if(signal_b3>1000) beamontime[3]+=1.0;
  739. ///add gsl stuff here.
  740. /* cout << maxchannel_b0 << " " << maxchannel_b1 << " "<< maxchannel_b2 << " "<< maxchannel_b3 << " " << endl;
  741. cout << maxchannelamp_b0 << " " << maxchannelamp_b1 << " "<< maxchannelamp_b2 << " "<< maxchannelamp_b3 << " " << endl;
  742. cout << nfwhm_b0 << " " << nfwhm_b1 << " " << nfwhm_b2 << " " << nfwhm_b3 << " " << endl;
  743. cout << endl;*/
  744. beamPosX_b0 = gsl_stats_wmean(signal_gsl_b0,1,channellist_gsl_b0,1,numtocalc_b0); //calculate the weighted mean
  745. beamFocusX_b0 = gsl_stats_wsd_with_fixed_mean(signal_gsl_b0,1,channellist_gsl_b0,1,numtocalc_b0,beamPosX_b0); //Standard Deviation
  746. beamSkewX_b0 = gsl_stats_wskew_m_sd(signal_gsl_b0,1,channellist_gsl_b0,1,numtocalc_b0,beamPosX_b0,beamFocusX_b0); //skewness (symmetry)
  747. beamKurtX_b0 = gsl_stats_wkurtosis_m_sd(signal_gsl_b0,1,channellist_gsl_b0,1,numtocalc_b0,beamPosX_b0,beamFocusX_b0); //excess kurtosis (well behaved tails)
  748. beamNumX_b0 = numtocalc_b0;
  749. beamFocusX_b0 *=2.3548;//SD-->FWHM
  750. beamPosX_b1 = gsl_stats_wmean(signal_gsl_b1,1,channellist_gsl_b1,1,numtocalc_b1); //calculate the weighted mean
  751. beamFocusX_b1 = gsl_stats_wsd_with_fixed_mean(signal_gsl_b1,1,channellist_gsl_b1,1,numtocalc_b1,beamPosX_b1); //Standard Deviation
  752. beamSkewX_b1 = gsl_stats_wskew_m_sd(signal_gsl_b1,1,channellist_gsl_b1,1,numtocalc_b1,beamPosX_b1,beamFocusX_b1); //skewness (symmetry)
  753. beamKurtX_b1 = gsl_stats_wkurtosis_m_sd(signal_gsl_b1,1,channellist_gsl_b1,1,numtocalc_b1,beamPosX_b1,beamFocusX_b1); //excess kurtosis (well behaved tails)
  754. beamNumX_b1 = numtocalc_b1;
  755. beamFocusX_b1 *=2.3548;//SD-->FWHM
  756. beamPosX_b2 = gsl_stats_wmean(signal_gsl_b2,1,channellist_gsl_b2,1,numtocalc_b2); //calculate the weighted mean
  757. beamFocusX_b2 = gsl_stats_wsd_with_fixed_mean(signal_gsl_b2,1,channellist_gsl_b2,1,numtocalc_b2,beamPosX_b2); //Standard Deviation
  758. beamSkewX_b2 = gsl_stats_wskew_m_sd(signal_gsl_b2,1,channellist_gsl_b2,1,numtocalc_b2,beamPosX_b2,beamFocusX_b2); //skewness (symmetry)
  759. beamKurtX_b2 = gsl_stats_wkurtosis_m_sd(signal_gsl_b2,1,channellist_gsl_b2,1,numtocalc_b2,beamPosX_b2,beamFocusX_b2); //excess kurtosis (well behaved tails)
  760. beamNumX_b2 = numtocalc_b2;
  761. beamFocusX_b2 *=2.3548;//SD-->FWHM
  762. beamPosX_b3 = gsl_stats_wmean(signal_gsl_b3,1,channellist_gsl_b3,1,numtocalc_b3); //calculate the weighted mean
  763. beamFocusX_b3 = gsl_stats_wsd_with_fixed_mean(signal_gsl_b3,1,channellist_gsl_b3,1,numtocalc_b3,beamPosX_b3); //Standard Deviation
  764. beamSkewX_b3 = gsl_stats_wskew_m_sd(signal_gsl_b3,1,channellist_gsl_b3,1,numtocalc_b3,beamPosX_b3,beamFocusX_b3); //skewness (symmetry)
  765. beamKurtX_b3 = gsl_stats_wkurtosis_m_sd(signal_gsl_b3,1,channellist_gsl_b3,1,numtocalc_b3,beamPosX_b3,beamFocusX_b3); //excess kurtosis (well behaved tails)
  766. beamNumX_b3 = numtocalc_b3;
  767. beamFocusX_b3 *=2.3548;//SD-->FWHM
  768. /////////////////////////////////////////////////
  769. /////Add fitting algorithm here
  770. /////////////////////////////////////////////////
  771. /*
  772. use board_b0_ch[i] to fill a TGraph.
  773. fit with a gaussian
  774. subtract the difference
  775. fill a THF2 with the difference, delta_amp vs channel
  776. */
  777. rootTree->Fill();
  778. }
  779. if (frameend>0 && frame+framestart>=frameend) break;
  780. }//end of loop over frames
  781. /* th2_signal_vs_channel_b0->Write();
  782. th2_signal_vs_channel_b1->Write();
  783. th2_signal_vs_channel_b2->Write();
  784. th2_signal_vs_channel_b3->Write();
  785. th2_signal_vs_channel_bkg_b0->Write();
  786. th2_signal_vs_channel_bkg_b1->Write();
  787. th2_signal_vs_channel_bkg_b2->Write();
  788. th2_signal_vs_channel_bkg_b3->Write();
  789. th1_signal_b0->Write();
  790. th1_signal_b1->Write();
  791. th1_signal_b2->Write();
  792. th1_signal_b3->Write();*/
  793. graph_bkg_b0->SetName("graph_bkg_b0"); // graph_bkg_b0->Write();
  794. graph_bkg_b1->SetName("graph_bkg_b1"); // graph_bkg_b1->Write();
  795. graph_bkg_b2->SetName("graph_bkg_b2"); // graph_bkg_b2->Write();
  796. graph_bkg_b3->SetName("graph_bkg_b3"); // graph_bkg_b3->Write();
  797. sumvector_b0_ptr->Write("sumvector_b0");
  798. sumvector_b1_ptr->Write("sumvector_b1");
  799. sumvector_b2_ptr->Write("sumvector_b2");
  800. sumvector_b3_ptr->Write("sumvector_b3");
  801. beamontime_ptr->Write("beamontime");
  802. rootFile->Write();
  803. rootFile->Close();
  804. }
  805. cout << eventID << " frames analysed." << endl;
  806. return 0;
  807. }
  808. else {
  809. cerr << "Error 1" << endl;
  810. return 1;
  811. }
  812. }