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.

1186 lines
44 KiB

  1. /// to do:
  2. /// 1. correct for gap between arrays
  3. #define convert2_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 <TVector.h>
  24. #include "TStopwatch.h"
  25. #include "Math/MinimizerOptions.h"
  26. #include "TVirtualFitter.h"
  27. using namespace std;
  28. bool smooth_on = false;
  29. bool doFit = false;
  30. int eventID = 0;
  31. int framestart=0;
  32. int frameend = 0;
  33. double board_b0_ch[128];
  34. double board_b1_ch[128];
  35. double board_b2_ch[128];
  36. double board_b3_ch[128];
  37. double board_b0_ch_bkg[128];
  38. double board_b1_ch_bkg[128];
  39. double board_b2_ch_bkg[128];
  40. double board_b3_ch_bkg[128];
  41. double signal_b0 = 0.;
  42. double signal_b1 = 0.;
  43. double signal_b2 = 0.;
  44. double signal_b3 = 0.;
  45. double signal_b0_left = 0.;
  46. double signal_b1_left = 0.;
  47. double signal_b2_left = 0.;
  48. double signal_b3_left = 0.;
  49. double signal_b0_right = 0.;
  50. double signal_b1_right = 0.;
  51. double signal_b2_right = 0.;
  52. double signal_b3_right = 0.;
  53. double signal_gsl_b0[128];
  54. double signal_gsl_b1[128];
  55. double signal_gsl_b2[128];
  56. double signal_gsl_b3[128];
  57. double channellist_gsl_b0[128];
  58. double channellist_gsl_b1[128];
  59. double channellist_gsl_b2[128];
  60. double channellist_gsl_b3[128];
  61. double channellist[128];
  62. double pos[128];
  63. double maxchannelamp_b0 =0.;
  64. double maxchannelamp_b1 =0.;
  65. double maxchannelamp_b2 =0.;
  66. double maxchannelamp_b3 =0.;
  67. int maxchannel_b0 =0;
  68. int maxchannel_b1 =0;
  69. int maxchannel_b2 =0;
  70. int maxchannel_b3 =0;
  71. int numtocalc_b0 =0;
  72. int numtocalc_b1 =0;
  73. int numtocalc_b2 =0;
  74. int numtocalc_b3 =0;
  75. int nfwhm_b0 = 0;
  76. int nfwhm_b1 = 0;
  77. int nfwhm_b2 = 0;
  78. int nfwhm_b3 = 0;
  79. double beamPosX_b0,beamPosX_b1,beamPosX_b2,beamPosX_b3;
  80. double beamFocusX_b0,beamFocusX_b1,beamFocusX_b2,beamFocusX_b3;
  81. double beamPosX_fit_b0,beamPosX_fit_b1,beamPosX_fit_b2,beamPosX_fit_b3;
  82. double beamFocusX_fit_b0,beamFocusX_fit_b1,beamFocusX_fit_b2,beamFocusX_fit_b3;
  83. double beamSkewX_b0,beamSkewX_b1,beamSkewX_b2,beamSkewX_b3;
  84. double beamKurtX_b0,beamKurtX_b1,beamKurtX_b2,beamKurtX_b3;
  85. double beamNumX_b0,beamNumX_b1,beamNumX_b2,beamNumX_b3;
  86. double beamSidebandNoise_b0, beamSidebandNoise_b1, beamSidebandNoise_b2, beamSidebandNoise_b3 ;
  87. int sidenumtocalc_b0,sidenumtocalc_b1,sidenumtocalc_b2,sidenumtocalc_b3;
  88. size_t size = 5;
  89. vector<double> boxcar;
  90. vector<double> boxcarsort;
  91. vector<double> boxcarweight{1,3,5,3,1};
  92. vector<double> data(128);
  93. TVector sumvector_b0(128);
  94. TVector sumvector_b1(128);
  95. TVector sumvector_b2(128);
  96. TVector sumvector_b3(128);
  97. TVector * sumvector_b0_ptr = &sumvector_b0;
  98. TVector * sumvector_b1_ptr = &sumvector_b1;
  99. TVector * sumvector_b2_ptr = &sumvector_b2;
  100. TVector * sumvector_b3_ptr = &sumvector_b3;
  101. const int length = 100; //length of the rolling average
  102. double array_b0[length][128] = {{0.}};
  103. double array_b1[length][128] = {{0.}};
  104. double array_b2[length][128] = {{0.}};
  105. double array_b3[length][128] = {{0.}};
  106. double arrayavg_b0[128] = {0.};
  107. double arrayavg_b1[128] = {0.};
  108. double arrayavg_b2[128] = {0.};
  109. double arrayavg_b3[128] = {0.};
  110. double board_b0_smooth_ch[128];
  111. double board_b1_smooth_ch[128];
  112. double board_b2_smooth_ch[128];
  113. double board_b3_smooth_ch[128];
  114. bool graphsaved_b0 = false;
  115. bool graphsaved_b1 = false;
  116. bool graphsaved_b2 = false;
  117. bool graphsaved_b3 = false;
  118. TVector beamontime(0,3,0.,0.,0.,0.,"END");
  119. TVector * beamontime_ptr = &beamontime;
  120. double calibration_b0[128] = {0.};
  121. double calibration_b1[128] = {0.};
  122. double calibration_b2[128] = {0.};
  123. double calibration_b3[128] = {0.};
  124. TF1 * gausfunc_b0 = new TF1("gausfunc_b0","gaus(0)+[3]");
  125. TF1 * gausfunc_b1 = new TF1("gausfunc_b1","gaus(0)+[3]");
  126. TGraphErrors * gausgraph_b0;
  127. TGraphErrors * gausgraph_b1;
  128. Int_t lastfit_b0 = 0;
  129. Int_t lastfit_b1 = 0;
  130. double errorx[128];
  131. double errory[128];
  132. /// compile with:
  133. //// $ make clean; make
  134. /// run with:
  135. //// $ ./convert <path to data> <run>
  136. //// $ ./convert /work/leverington/beamprofilemonitor/hitdata/HIT_17_12_2017/ run2
  137. int analyse(int argc, char **argv)
  138. {
  139. TVirtualFitter::SetDefaultFitter("Minuit2");
  140. TVirtualFitter::SetPrecision(0.01);
  141. std::cout << "Default Fitter:" << TVirtualFitter::GetDefaultFitter() << std::endl;
  142. //initialise some values;
  143. for (int i = 0;i<128;i++){
  144. board_b0_ch_bkg[i] = 0.;
  145. board_b1_ch_bkg[i] = 0.;
  146. board_b2_ch_bkg[i] = 0.;
  147. board_b3_ch_bkg[i] = 0.;
  148. channellist_gsl_b0[i] = 0;
  149. channellist_gsl_b1[i] = 0;
  150. channellist_gsl_b2[i] = 0;
  151. channellist_gsl_b3[i] = 0;
  152. sumvector_b0[i] = 0;
  153. sumvector_b1[i] = 0;
  154. sumvector_b2[i] = 0;
  155. sumvector_b3[i] = 0;
  156. calibration_b0[i] = 1.0;
  157. calibration_b1[i] = 1.0;
  158. calibration_b2[i] = 1.0;
  159. calibration_b3[i] = 1.0;
  160. errorx[i]=17.;
  161. errory[i]=17.;
  162. if (i<64) {pos[i] = double(i);}
  163. else {pos[i] = double(i) + 0.2; }
  164. }
  165. if (argc > 1){
  166. //open the file names specified in the command line
  167. string ethercatfile = argv[3];
  168. // argv[1]= "/work/leverington/beamprofilemonitor/hitdata/HIT_17_12_2017/";
  169. // argv[2]= "Run11"
  170. string filename = Form("%s%s.dat",argv[1],argv[2]);
  171. string timestampfilename = Form("%s%s_timestamp.csv",argv[1],argv[2]);
  172. string rootfilename = Form("%s/root/%s.root",argv[1],argv[2]); // Giulia needs to change the path %s/root/ of the written root file.
  173. ifstream file(filename, ifstream::in | ifstream::binary);
  174. ifstream timestampfile(timestampfilename, ifstream::in);
  175. if (!file.is_open()){
  176. printf(".dat did not open.\n");
  177. return -1; //file could not be opened
  178. }
  179. if (!timestampfile.is_open()){
  180. printf("timestamp.csv did not open.\n");
  181. return -1; //file could not be opened
  182. }
  183. ///some variables to get the data
  184. // int number_of_records_to_read = 4*10;
  185. // BufferData* buffer = new BufferData[number_of_records_to_read];
  186. //if(argc > 4) {
  187. // framestart = atoi(argv[3]);
  188. // frameend = atoi(argv[4]);
  189. // }
  190. int board_b = -1;
  191. long int fileframesize = getFileSize(filename.c_str()) / ( 4*sizeof(BufferData) );
  192. BufferData* dataptr = new BufferData();
  193. if (fileframesize>0){
  194. std::cout << "Number of frames:" << fileframesize << std::endl;
  195. //open ROOT file for saving histos and TTree.
  196. TFile *rootFile = new TFile(rootfilename.c_str(),"RECREATE");
  197. if ( rootFile->IsOpen() ) printf("ROOT file opened successfully\n");
  198. TH2D * th2_signal_vs_channel_b0 = new TH2D("th2_signal_vs_channel_b0","th2_signal_vs_channel_b0",128,0,128,2200,-1000,10000);
  199. TH2D * th2_signal_vs_channel_b1 = new TH2D("th2_signal_vs_channel_b1","th2_signal_vs_channel_b1",128,0,128,2200,-1000,10000);
  200. TH2D * th2_signal_vs_channel_b2 = new TH2D("th2_signal_vs_channel_b2","th2_signal_vs_channel_b2",128,0,128,2200,-1000,10000);
  201. TH2D * th2_signal_vs_channel_b3 = new TH2D("th2_signal_vs_channel_b3","th2_signal_vs_channel_b3",128,0,128,2200,-1000,10000);
  202. 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);
  203. 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);
  204. 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);
  205. 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);
  206. TH1D * th1_signal_b0 = new TH1D("th1_signal_b0","th1_signal_b0",2200,-10000,50000);
  207. TH1D * th1_signal_b1 = new TH1D("th1_signal_b1","th1_signal_b1",2200,-10000,50000);
  208. TH1D * th1_signal_b2 = new TH1D("th1_signal_b2","th1_signal_b2",2200,-10000,50000);
  209. TH1D * th1_signal_b3 = new TH1D("th1_signal_b3","th1_signal_b3",2200,-10000,50000);
  210. TGraph * graph_bkg_b0 = new TGraph();
  211. TGraph * graph_bkg_b1 = new TGraph();
  212. TGraph * graph_bkg_b2 = new TGraph();
  213. TGraph * graph_bkg_b3 = new TGraph();
  214. TGraph * gr_b0;
  215. TGraph * gr_sm_b0;
  216. TGraph * gr_b1;
  217. TGraph * gr_sm_b1;
  218. TGraph * gr_b2;
  219. TGraph * gr_sm_b2;
  220. TGraph * gr_b3;
  221. TGraph * gr_sm_b3;
  222. 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);
  223. 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);
  224. 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);
  225. 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);
  226. TTree *rootTree = new TTree("t","HIT Data Root Tree");
  227. rootTree->Branch("beamPosX_b0",&beamPosX_b0,"beamPosX_b0/D");
  228. rootTree->Branch("beamPosX_b1",&beamPosX_b1,"beamPosX_b1/D");
  229. rootTree->Branch("beamPosX_b2",&beamPosX_b2,"beamPosX_b2/D");
  230. rootTree->Branch("beamPosX_b3",&beamPosX_b3,"beamPosX_b3/D");
  231. rootTree->Branch("beamPosX_fit_b0",&beamPosX_fit_b0,"beamPosX_fit_b0/D");
  232. rootTree->Branch("beamPosX_fit_b1",&beamPosX_fit_b1,"beamPosX_fit_b1/D");
  233. rootTree->Branch("beamPosX_fit_b2",&beamPosX_fit_b2,"beamPosX_fit_b2/D");
  234. rootTree->Branch("beamPosX_fit_b3",&beamPosX_fit_b3,"beamPosX_fit_b3/D");
  235. rootTree->Branch("beamFocusX_b0",&beamFocusX_b0,"beamFocusX_b0/D");
  236. rootTree->Branch("beamFocusX_b1",&beamFocusX_b1,"beamFocusX_b1/D");
  237. rootTree->Branch("beamFocusX_b2",&beamFocusX_b2,"beamFocusX_b2/D");
  238. rootTree->Branch("beamFocusX_b3",&beamFocusX_b3,"beamFocusX_b3/D");
  239. rootTree->Branch("beamFocusX_fit_b0",&beamFocusX_fit_b0,"beamFocusX_fit_b0/D");
  240. rootTree->Branch("beamFocusX_fit_b1",&beamFocusX_fit_b1,"beamFocusX_fit_b1/D");
  241. rootTree->Branch("beamFocusX_fit_b2",&beamFocusX_fit_b2,"beamFocusX_fit_b2/D");
  242. rootTree->Branch("beamFocusX_fit_b3",&beamFocusX_fit_b3,"beamFocusX_fit_b3/D");
  243. rootTree->Branch("beamSkewX_b0",&beamSkewX_b0,"beamSkewX_b0/D");
  244. rootTree->Branch("beamSkewX_b1",&beamSkewX_b1,"beamSkewX_b1/D");
  245. rootTree->Branch("beamSkewX_b2",&beamSkewX_b2,"beamSkewX_b2/D");
  246. rootTree->Branch("beamSkewX_b3",&beamSkewX_b3,"beamSkewX_b3/D");
  247. rootTree->Branch("beamKurtX_b0",&beamKurtX_b0,"beamKurtX_b0/D");
  248. rootTree->Branch("beamKurtX_b1",&beamKurtX_b1,"beamKurtX_b1/D");
  249. rootTree->Branch("beamKurtX_b2",&beamKurtX_b2,"beamKurtX_b2/D");
  250. rootTree->Branch("beamKurtX_b3",&beamKurtX_b3,"beamKurtX_b3/D");
  251. rootTree->Branch("beamNumX_b0",&beamNumX_b0,"beamNumX_b0/D");
  252. rootTree->Branch("beamNumX_b1",&beamNumX_b1,"beamNumX_b1/D");
  253. rootTree->Branch("beamNumX_b2",&beamNumX_b2,"beamNumX_b2/D");
  254. rootTree->Branch("beamNumX_b3",&beamNumX_b3,"beamNumX_b3/D");
  255. rootTree->Branch("beamSignal_b0",&signal_b0,"beamSignal_b0/D");
  256. rootTree->Branch("beamSignal_b1",&signal_b1,"beamSignal_b1/D");
  257. rootTree->Branch("beamSignal_b2",&signal_b2,"beamSignal_b2/D");
  258. rootTree->Branch("beamSignal_b3",&signal_b3,"beamSignal_b3/D");
  259. rootTree->Branch("beamSignal_b0_left",&signal_b0_left,"beamSignal_b0_left/D");
  260. rootTree->Branch("beamSignal_b1_left",&signal_b1_left,"beamSignal_b1_left/D");
  261. rootTree->Branch("beamSignal_b2_left",&signal_b2_left,"beamSignal_b2_left/D");
  262. rootTree->Branch("beamSignal_b3_left",&signal_b3_left,"beamSignal_b3_left/D");
  263. rootTree->Branch("beamSignal_b0_right",&signal_b0_right,"beamSignal_b0_right/D");
  264. rootTree->Branch("beamSignal_b1_right",&signal_b1_right,"beamSignal_b1_right/D");
  265. rootTree->Branch("beamSignal_b2_right",&signal_b2_right,"beamSignal_b2_right/D");
  266. rootTree->Branch("beamSignal_b3_right",&signal_b3_right,"beamSignal_b3_right/D");
  267. rootTree->Branch("eventID",&eventID,"eventID/I");
  268. //rootTree->Branch("board_b0_ch",&board_b0_ch,"board_b0_ch[128]/D");
  269. //rootTree->Branch("board_b1_ch",&board_b1_ch,"board_b1_ch[128]/D");
  270. //rootTree->Branch("board_b2_ch",&board_b2_ch,"board_b2_ch[128]/D");
  271. //rootTree->Branch("board_b3_ch",&board_b3_ch,"board_b3_ch[128]/D");
  272. rootTree->Branch("beamSidebandNoise_b0",&beamSidebandNoise_b0,"beamSidebandNoise_b0/D");
  273. rootTree->Branch("beamSidebandNoise_b1",&beamSidebandNoise_b1,"beamSidebandNoise_b1/D");
  274. rootTree->Branch("beamSidebandNoise_b2",&beamSidebandNoise_b2,"beamSidebandNoise_b2/D");
  275. rootTree->Branch("beamSidebandNoise_b3",&beamSidebandNoise_b3,"beamSidebandNoise_b3/D");
  276. //rootTree->Branch("arrayavg_b0",&arrayavg_b0,"arrayavg_b0[128]/D");
  277. //rootTree->Branch("arrayavg_b1",&arrayavg_b1,"arrayavg_b1[128]/D");
  278. // rootTree->Branch("arrayavg_b2",&arrayavg_b2,"arrayavg_b2[128]/D");
  279. //rootTree->Branch("arrayavg_b3",&arrayavg_b3,"arrayavg_b3[128]/D");
  280. double time;
  281. // import and align matching ethercat data
  282. TTree *tree2 = new TTree("t2", "t2");
  283. std::cout << " Loading Ethercat data." << std::endl;
  284. tree2->ReadFile(ethercatfile.c_str(), "RELTIME2/D:IC1/D:MW1_POSX/D:MW1_POSY/D:ANALOG_IN1/D:ENERGY/D:INTENSITY/D:ION-SORT/D:TIME2/D", '\t');
  285. std::cout << "Ethercat data loaded." << std::endl;
  286. tree2->Print();
  287. int k = 0;
  288. // int count = 0;
  289. double ic1, ic2, mw1_focusx, mw1_focusy, mw2_focusx, mw2_focusy, mw1_posx, mw1_posy, mw2_posx, mw2_posy;
  290. 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;
  291. double analog_in1;
  292. double energy;
  293. double intensity;
  294. double ionsort;
  295. double rel_time2,time2;
  296. double timeoffset;
  297. int mwoffset;
  298. double timewindow;
  299. double timeoffset2;
  300. double timewindow2;
  301. rootTree->Branch("ic1_avg", &ic1_avg, "ic1_avg/D");
  302. rootTree->Branch("mw1_posx", &mw1_posx_avg, "mw1_posx/D");
  303. rootTree->Branch("mw1_posy", &mw1_posy_avg, "mw1_posy/D");
  304. rootTree->Branch("energy", &energy, "energy/D");
  305. rootTree->Branch("intensity", &intensity, "intensity/D");
  306. rootTree->Branch("ionsort", &ionsort, "ionsort/D");
  307. timeoffset = 0.10; //offset between ic and bpm readouts
  308. mwoffset = 2; // offset for timestamped event. MW chamber position correlation seems to be better in other windows
  309. timewindow = -0.0999; //should be a negative number. window size in time to average over.
  310. timeoffset2 = -0.00; //offset between ic and bpm readouts
  311. timewindow2 = -0.05; //should be a negative number. window size in time to average over.
  312. //////////////////////////////////////////////////////////////////
  313. ///// ETHERCAT DATA
  314. //////////////////////////////////////////////////////////////////
  315. // tree->SetBranchAddress("time", &time);
  316. tree2->SetBranchAddress("RELTIME2", &rel_time2);
  317. tree2->SetBranchAddress("TIME2", &time2);
  318. tree2->SetBranchAddress("IC1", &ic1);
  319. // tree2->SetBranchAddress("IC2", &ic2);
  320. //tree2->SetBranchAddress("MW1_FOCUSX", &mw1_focusx);
  321. //tree2->SetBranchAddress("MW1_FOCUSY", &mw1_focusy);
  322. ///tree2->SetBranchAddress("MW2_FOCUSX", &mw2_focusx);
  323. ///tree2->SetBranchAddress("MW2_FOCUSY", &mw2_focusy);
  324. tree2->SetBranchAddress("MW1_POSX", &mw1_posx);
  325. tree2->SetBranchAddress("MW1_POSY", &mw1_posy);
  326. //tree2->SetBranchAddress("MW2_POSX", &mw2_posx);
  327. //tree2->SetBranchAddress("MW2_POSY", &mw2_posy);
  328. tree2->SetBranchAddress("ENERGY", &energy);
  329. tree2->SetBranchAddress("INTENSITY", &intensity);
  330. tree2->SetBranchAddress("ION-SORT", &ionsort);
  331. tree2->SetBranchAddress("ANALOG_IN1", &analog_in1);
  332. int currentEntryTree2 = 1;
  333. // int nevents = tree->GetEntries();
  334. int nevents2 = tree2->GetEntries();
  335. int icCounter = 0;
  336. int count = 0;
  337. int count2 = 0;
  338. //loop through recorded data frames
  339. for (int frame = 0; frame<fileframesize; frame++){
  340. // if (icCounter>10000) break;
  341. eventID = frame;
  342. if (timestampfile) timestampfile >> time ;
  343. //printf("%i %f\n", eventID, time);
  344. count= 0;
  345. count2 = 0;
  346. ic1_avg = 0.;
  347. mw1_posx_avg = 0.;
  348. mw1_posy_avg = 0.;
  349. tree2->GetEntry(currentEntryTree2);
  350. /* if (frame % 100 == 0)
  351. {
  352. printf("merging event %d ,", frame);
  353. printf("Time %f \n", time);
  354. printf("Entry hit %d ,", currentEntryTree2);
  355. printf("Time hit %f \n", time2);
  356. }
  357. */
  358. while (time2 < time + timeoffset && currentEntryTree2 < nevents2 )
  359. {
  360. if (time2 - time - timeoffset > timewindow)
  361. {
  362. tree2->GetEntry(currentEntryTree2);
  363. if (ic1>0.0) ic1_avg += ic1;
  364. if (ic1>0.0) count++;
  365. // 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);
  366. }
  367. tree2->GetEntry(currentEntryTree2);
  368. if ( time2 - time - timeoffset2 > timewindow2)
  369. {
  370. tree2->GetEntry(currentEntryTree2 + mwoffset); //why currentEtryTree2-4?
  371. mw1_posx_avg += mw1_posx;
  372. mw1_posy_avg += mw1_posy;
  373. count2++;
  374. // if (i % 2000 == 0) printf("%i %2.3f %2.3f %2.3f %2.3f\n", count2, time, time2, ic1, mw1_posx);
  375. //if (i % 2001 == 0) printf("%i %2.3f %2.3f %2.3f %2.3f\n", count2, time, time2, ic1, mw1_posx);
  376. // if (i % 2002 == 0) printf("%i %2.3f %2.3f %2.3f %2.3f\n", count2, time, time2, ic1, mw1_posx);
  377. // printf("%i %2.3f %2.3f %2.3f %2.3f\n", count2, time, time2, ic1, mw1_posx);
  378. }
  379. // currentEntryTree2++;
  380. tree2->GetEntry(currentEntryTree2);
  381. currentEntryTree2++;
  382. if (count2>0){
  383. mw1_posx_avg /= double(count2); //the positions are weighted by the charge
  384. mw1_posy_avg /= double(count2);
  385. }
  386. if(count>0){
  387. ic1_avg /= double(count);
  388. if (ic1_avg>1.) icCounter++;
  389. // if (frame % 2000 == 0) printf("%i %f.2 %i \n", count, ic1_avg, icCounter);
  390. }
  391. // std::cout << ic1_avg << " " << icCounter << std::endl;
  392. }
  393. /////////end of ethercat matching
  394. if(frame >=2000&& ic1_avg<0.5) continue;
  395. ///////////////////////////////////
  396. //// HIT DATA
  397. ///////////////////////////////////
  398. //board_b 0
  399. board_b=0;
  400. signal_b0 = 0.;
  401. maxchannelamp_b0 = 0.;
  402. file.seekg(framestart*sizeof(BufferData)+board_b*sizeof(BufferData)+4*frame*sizeof(BufferData));
  403. file.read ((char*)dataptr ,sizeof(BufferData));
  404. if (dataptr->sync_frame.device_nr==board_b){
  405. // 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;
  406. if (frame%1000==0) std::cout << "Frame: " << frame << " (" <<double(frame)/double(fileframesize)*100.0 << "%)" << std::endl;
  407. for (int i = 0;i<128;i++){
  408. board_b0_ch[i] = dataptr->sensor_data[i];
  409. if (frame<1000){
  410. board_b0_ch_bkg[i] += board_b0_ch[i]/1000.; //find baseline from the average of first 1000 events
  411. }
  412. else if (frame>=1000&& frame<2000){
  413. board_b0_ch[i] -= board_b0_ch_bkg[i]; //histogram the subtracted baseline in the next 1000 events
  414. th2_signal_vs_channel_bkg_b0->Fill(i,board_b0_ch[i]);
  415. if (i==1) graph_bkg_b0->SetPoint(graph_bkg_b0->GetN(), frame, board_b0_ch[i]);
  416. }
  417. else if (frame>=2000) {
  418. board_b0_ch[i]-=board_b0_ch_bkg[i]; // the rest background subtracted
  419. board_b0_ch[i]*=calibration_b0[i]; //calibration factor
  420. th2_signal_vs_channel_b0->Fill(i,board_b0_ch[i]);
  421. // signal_b0 +=board_b0_ch[i] ;
  422. if (board_b0_ch[i]> maxchannelamp_b0) {
  423. maxchannel_b0 = i;
  424. maxchannelamp_b0 = board_b0_ch[i];
  425. }
  426. //calculate a rolling average of the signal
  427. arrayavg_b0[i] = 0;
  428. for (int j = 1; j<length;j++){
  429. array_b0[j-1][i] = array_b0[j][i];
  430. arrayavg_b0[i] += array_b0[j-1][i]/double(length);
  431. }
  432. if( board_b0_ch[i]>-1000){
  433. array_b0[length-1][i] = board_b0_ch[i];
  434. arrayavg_b0[i] += array_b0[length-1][i]/double(length);
  435. }
  436. ////////////////////////////////////////////
  437. }
  438. }
  439. // th1_signal_b0->Fill(signal_b0);
  440. }
  441. else {
  442. std::cout << "Error." << std::endl;
  443. }
  444. //board_b 1
  445. board_b=1;
  446. signal_b1=0.;
  447. maxchannelamp_b1 = 0.;
  448. file.seekg(framestart*sizeof(BufferData)+board_b*sizeof(BufferData)+4*frame*sizeof(BufferData));
  449. file.read ((char*)dataptr ,sizeof(BufferData));
  450. if (dataptr->sync_frame.device_nr==board_b){
  451. //std::cout << frame << " " << dataptr->sync_frame.device_nr << std::endl;
  452. for (int i = 0;i<128;i++){
  453. board_b1_ch[i] = dataptr->sensor_data[i];
  454. if (frame<1000){
  455. board_b1_ch_bkg[i] += board_b1_ch[i]/1000.; //find baseline from the average of first 1000 events
  456. }
  457. else if (frame>=1000&& frame<2000){
  458. board_b1_ch[i] -= board_b1_ch_bkg[i]; //histogram the subtracted baseline in the next 1000 events
  459. th2_signal_vs_channel_bkg_b1->Fill(i,board_b1_ch[i]);
  460. if (i==1) graph_bkg_b1->SetPoint(graph_bkg_b1->GetN(), frame, board_b1_ch[i]);
  461. }
  462. else if (frame>=2000) {
  463. board_b1_ch[i]-=board_b1_ch_bkg[i]; // the rest are background subtracted
  464. board_b1_ch[i]*=calibration_b1[i]; //calibration factor
  465. th2_signal_vs_channel_b1->Fill(i,board_b1_ch[i]);
  466. // signal_b1 +=board_b1_ch[i] ;
  467. if (board_b1_ch[i]> maxchannelamp_b1) {
  468. maxchannel_b1 = i;
  469. maxchannelamp_b1 = board_b1_ch[i];
  470. }
  471. //calculate a rolling average of the signal
  472. arrayavg_b1[i] = 0;
  473. for (int j = 1; j<length;j++){
  474. array_b1[j-1][i] = array_b1[j][i];
  475. arrayavg_b1[i] += array_b1[j-1][i]/double(length);
  476. }
  477. if( board_b1_ch[i]>-1000){
  478. array_b1[length-1][i] = board_b1_ch[i];
  479. arrayavg_b1[i] += array_b1[length-1][i]/double(length);
  480. }
  481. ////////////////////////////////////////////
  482. }
  483. }
  484. // th1_signal_b1->Fill(signal_b1);
  485. }
  486. else {
  487. std::cout << "Error." << std::endl;
  488. }
  489. //board_b 2
  490. board_b=2;
  491. signal_b2=0.;
  492. maxchannelamp_b2 = 0.;
  493. file.seekg(framestart*sizeof(BufferData)+board_b*sizeof(BufferData)+4*frame*sizeof(BufferData));
  494. file.read ((char*)dataptr ,sizeof(BufferData));
  495. if (dataptr->sync_frame.device_nr==board_b){
  496. //std::cout << frame << " " << dataptr->sync_frame.device_nr << std::endl;
  497. for (int i = 0;i<128;i++){
  498. board_b2_ch[i] = dataptr->sensor_data[i];
  499. if (frame<1000){
  500. board_b2_ch_bkg[i] += board_b2_ch[i]/1000.; //find baseline from the average of first 1000 events
  501. }
  502. else if (frame>=1000&& frame<2000){
  503. board_b2_ch[i] -= board_b2_ch_bkg[i]; //histogram the subtracted baseline in the next 1000 events
  504. th2_signal_vs_channel_bkg_b2->Fill(i,board_b2_ch[i]);
  505. if (i==1) graph_bkg_b2->SetPoint(graph_bkg_b2->GetN(), frame, board_b2_ch[i]);
  506. }
  507. else if (frame>=2000) {
  508. board_b2_ch[i]-=board_b2_ch_bkg[i]; // the rest background subtracted
  509. board_b2_ch[i]*=calibration_b2[i]; //calibration factor
  510. th2_signal_vs_channel_b2->Fill(i,board_b2_ch[i]);
  511. // signal_b2 +=board_b2_ch[i] ;
  512. if (board_b2_ch[i]> maxchannelamp_b2) {
  513. maxchannel_b2 = i;
  514. maxchannelamp_b2 = board_b2_ch[i];
  515. }
  516. //calculate a rolling average of the signal
  517. arrayavg_b2[i] = 0;
  518. for (int j = 1; j<length;j++){
  519. array_b2[j-1][i] = array_b2[j][i];
  520. arrayavg_b2[i] += array_b2[j-1][i]/double(length);
  521. }
  522. if( board_b2_ch[i]>-1000){
  523. array_b2[length-1][i] = board_b2_ch[i];
  524. arrayavg_b2[i] += array_b2[length-1][i]/double(length);
  525. }
  526. ////////////////////////////////////////////
  527. }
  528. }
  529. // th1_signal_b2->Fill(signal_b2);
  530. }
  531. else {
  532. std::cout << "Error." << std::endl;
  533. }
  534. //board_b 3
  535. board_b=3;
  536. signal_b3=0.;
  537. maxchannelamp_b3 = 0.;
  538. file.seekg(framestart*sizeof(BufferData)+board_b*sizeof(BufferData)+4*frame*sizeof(BufferData));
  539. file.read ((char*)dataptr ,sizeof(BufferData));
  540. if (dataptr->sync_frame.device_nr==board_b){
  541. //std::cout << frame << " " << dataptr->sync_frame.device_nr << std::endl;
  542. for (int i = 0;i<128;i++){
  543. board_b3_ch[i] = dataptr->sensor_data[i];
  544. if (frame<1000){
  545. board_b3_ch_bkg[i] += board_b3_ch[i]/1000.; //find baseline from the average of first 1000 events
  546. }
  547. else if (frame>=1000&& frame<2000){
  548. board_b3_ch[i] -= board_b3_ch_bkg[i]; //histogram the subtracted baseline in the next 1000 events
  549. th2_signal_vs_channel_bkg_b3->Fill(i,board_b3_ch[i]);
  550. if (i==1) graph_bkg_b3->SetPoint(graph_bkg_b3->GetN(), frame, board_b3_ch[i]);
  551. }
  552. else if (frame>=2000) {
  553. board_b3_ch[i]-=board_b3_ch_bkg[i]; // the rest of the events are background subtracted
  554. board_b3_ch[i]*=calibration_b3[i]; //with a calibration factor
  555. th2_signal_vs_channel_b3->Fill(i,board_b3_ch[i]);
  556. // signal_b3 +=board_b3_ch[i] ;
  557. if (board_b3_ch[i]> maxchannelamp_b3) {
  558. maxchannel_b3 = i;
  559. maxchannelamp_b3 = board_b3_ch[i];
  560. }
  561. //calculate a rolling average of the signal
  562. arrayavg_b3[i] = 0;
  563. for (int j = 1; j<length;j++){
  564. array_b3[j-1][i] = array_b3[j][i];
  565. arrayavg_b3[i] += array_b3[j-1][i]/double(length);
  566. }
  567. if( board_b3_ch[i]>-1000){
  568. array_b3[length-1][i] = board_b3_ch[i];
  569. arrayavg_b3[i] += array_b3[length-1][i]/double(length);
  570. }
  571. ////////////////////////////////////////////
  572. }
  573. }
  574. // th1_signal_b3->Fill(signal_b3);
  575. }
  576. else {
  577. std::cout << "Error." << std::endl;
  578. }
  579. ////////////////////////////////////////////////////////////
  580. ////////////////////////////////////////////////////////////
  581. //start the signal analysis
  582. ////////////////////////////////////////////////////////////
  583. ////////////////////////////////////////////////////////////
  584. if (frame>=2000){
  585. ////////////////////////////////////////////////////////////
  586. //boxcar smoothing filter
  587. ////////////////////////////////////////////////////////////
  588. if (smooth_on){
  589. maxchannelamp_b0 = 0.0;
  590. maxchannelamp_b1 = 0.0;
  591. maxchannelamp_b2 = 0.0;
  592. maxchannelamp_b3 = 0.0;
  593. }
  594. boxcar.clear();
  595. boxcar.push_back(board_b0_ch[0]);
  596. boxcar.push_back(board_b0_ch[1]);
  597. // std::cout << frame << std::endl;
  598. for (int i = 0;i<128;i++){
  599. channellist[i] = i;
  600. if (i<126) {
  601. boxcar.push_back(board_b0_ch[i+2]);
  602. }
  603. if ( (i<126&&boxcar.size()>5) || (i>=126&&boxcar.size()>3) ) boxcar.erase(boxcar.cbegin());
  604. board_b0_smooth_ch[i] = gsl_stats_mean(boxcar.data(), 1, 5 );
  605. if (smooth_on && board_b0_smooth_ch[i]> maxchannelamp_b0) {
  606. maxchannel_b0 = i;
  607. maxchannelamp_b0 = board_b0_smooth_ch[i];
  608. }
  609. }
  610. if (eventID>2001&&maxchannelamp_b0>100&&!graphsaved_b0) {
  611. gr_b0 = new TGraph(128, channellist, board_b0_ch);
  612. gr_b0->SetTitle("RawData_b0");
  613. gr_b0->SetName("RawData_b0");
  614. gr_b0->Write();
  615. gr_sm_b0 = new TGraph(128, channellist, board_b0_smooth_ch);
  616. gr_sm_b0->SetTitle("SmoothedData_b0");
  617. gr_sm_b0->SetName("SmoothedData_b0");
  618. gr_sm_b0->Write();
  619. graphsaved_b0=true;
  620. }
  621. boxcar.clear();
  622. boxcar.push_back(board_b1_ch[0]);
  623. boxcar.push_back(board_b1_ch[1]);
  624. // std::cout << frame << std::endl;
  625. for (int i = 0;i<128;i++){
  626. channellist[i] = i;
  627. if (i<126) {
  628. boxcar.push_back(board_b1_ch[i+2]);
  629. }
  630. if ( (i<126&&boxcar.size()>5) || (i>=126&&boxcar.size()>3) ) boxcar.erase(boxcar.cbegin());
  631. board_b1_smooth_ch[i] = gsl_stats_mean(boxcar.data(), 1, 5 );
  632. if (smooth_on && board_b1_smooth_ch[i]> maxchannelamp_b1) {
  633. maxchannel_b1 = i;
  634. maxchannelamp_b1 = board_b1_smooth_ch[i];
  635. }
  636. }
  637. if (eventID>2001&&maxchannelamp_b1>100&&!graphsaved_b1) {
  638. gr_b1 = new TGraph(128, channellist, board_b1_ch);
  639. gr_b1->SetTitle("RawData_b1");
  640. gr_b1->SetName("RawData_b1");
  641. gr_b1->Write();
  642. gr_sm_b1 = new TGraph(128, channellist, board_b1_smooth_ch);
  643. gr_sm_b1->SetTitle("SmoothedData_b1");
  644. gr_sm_b1->SetName("SmoothedData_b1");
  645. gr_sm_b1->Write();
  646. graphsaved_b1=true;
  647. }
  648. boxcar.clear();
  649. boxcar.push_back(board_b2_ch[0]);
  650. boxcar.push_back(board_b2_ch[1]);
  651. // std::cout << frame << std::endl;
  652. for (int i = 0;i<128;i++){
  653. channellist[i] = i;
  654. if (i<126) {
  655. boxcar.push_back(board_b2_ch[i+2]);
  656. }
  657. if ( (i<126&&boxcar.size()>5) || (i>=126&&boxcar.size()>3) ) boxcar.erase(boxcar.cbegin());
  658. board_b2_smooth_ch[i] = gsl_stats_mean(boxcar.data(), 1, 5 );
  659. if (smooth_on && board_b2_smooth_ch[i]> maxchannelamp_b2) {
  660. maxchannel_b2 = i;
  661. maxchannelamp_b2 = board_b2_smooth_ch[i];
  662. }
  663. }
  664. if (eventID>2001&&maxchannelamp_b2>100&&!graphsaved_b2) {
  665. gr_b2 = new TGraph(128, channellist, board_b2_ch);
  666. gr_b2->SetTitle("RawData_b2");
  667. gr_b2->SetName("RawData_b2");
  668. gr_b2->Write();
  669. gr_sm_b2 = new TGraph(128, channellist, board_b2_smooth_ch);
  670. gr_sm_b2->SetTitle("SmoothedData_b2");
  671. gr_sm_b2->SetName("SmoothedData_b2");
  672. gr_sm_b2->Write();
  673. graphsaved_b2=true;
  674. }
  675. boxcar.clear();
  676. boxcar.push_back(board_b3_ch[0]);
  677. boxcar.push_back(board_b3_ch[1]);
  678. // std::cout << frame << std::endl;
  679. for (int i = 0;i<128;i++){
  680. channellist[i] = i;
  681. if (i<126) {
  682. boxcar.push_back(board_b3_ch[i+2]);
  683. }
  684. if ( (i<126&&boxcar.size()>5) || (i>=126&&boxcar.size()>3) ) boxcar.erase(boxcar.cbegin());
  685. board_b3_smooth_ch[i] = gsl_stats_mean(boxcar.data(), 1, 5 );
  686. if (smooth_on && board_b3_smooth_ch[i]> maxchannelamp_b3) {
  687. maxchannel_b3 = i;
  688. maxchannelamp_b3 = board_b3_smooth_ch[i];
  689. }
  690. }
  691. if (eventID>2001&&maxchannelamp_b3>100&&!graphsaved_b3) {
  692. gr_b3 = new TGraph(128, channellist, board_b3_ch);
  693. gr_b3->SetTitle("RawData_b3");
  694. gr_b3->SetName("RawData_b3");
  695. gr_b3->Write();
  696. gr_sm_b3 = new TGraph(128, channellist, board_b3_smooth_ch);
  697. gr_sm_b3->SetTitle("SmoothedData_b3");
  698. gr_sm_b3->SetName("SmoothedData_b3");
  699. gr_sm_b3->Write();
  700. graphsaved_b3=true;
  701. }
  702. ////////////////////////////////////////////////////////////
  703. //find the approx FWHM
  704. ////////////////////////////////////////////////////////////
  705. nfwhm_b0 =0;
  706. nfwhm_b1 =0;
  707. nfwhm_b2 =0;
  708. nfwhm_b3 =0;
  709. if (smooth_on){
  710. for (int i = 0;i<128;i++){
  711. if (board_b0_smooth_ch[i] > maxchannelamp_b0/2.) nfwhm_b0++;
  712. if (board_b1_smooth_ch[i] > maxchannelamp_b1/2.) nfwhm_b1++;
  713. if (board_b2_smooth_ch[i] > maxchannelamp_b2/2.) nfwhm_b2++;
  714. if (board_b3_smooth_ch[i] > maxchannelamp_b3/2.) nfwhm_b3++;
  715. signal_gsl_b0[i] = 0.;
  716. signal_gsl_b1[i] = 0.;
  717. signal_gsl_b2[i] = 0.;
  718. signal_gsl_b3[i] = 0.;
  719. }
  720. }
  721. else {
  722. for (int i = 0;i<128;i++){
  723. if (board_b0_ch[i] > maxchannelamp_b0/2.) nfwhm_b0++;
  724. if (board_b1_ch[i] > maxchannelamp_b1/2.) nfwhm_b1++;
  725. if (board_b2_ch[i] > maxchannelamp_b2/2.) nfwhm_b2++;
  726. if (board_b3_ch[i] > maxchannelamp_b3/2.) nfwhm_b3++;
  727. signal_gsl_b0[i] = 0.;
  728. signal_gsl_b1[i] = 0.;
  729. signal_gsl_b2[i] = 0.;
  730. signal_gsl_b3[i] = 0.;
  731. }
  732. }
  733. ////////////////////////////////////////////////////////////
  734. //integrate the sidebands first to check for baseline shift
  735. ////////////////////////////////////////////////////////////
  736. beamSidebandNoise_b0 = 0.;
  737. sidenumtocalc_b0 = 0;
  738. for (int i =0; i<maxchannel_b0-nfwhm_b0; i++){
  739. if (i>=0 && i<=127){
  740. beamSidebandNoise_b0 += board_b0_ch[i]; //integrate the noise outside the peak
  741. sidenumtocalc_b0++;
  742. }
  743. }
  744. for (int i = maxchannel_b0+nfwhm_b0; i < 128; i++){
  745. if (i>=0 && i<=127){
  746. beamSidebandNoise_b0 += board_b0_ch[i]; //integrate the noise outside the peak
  747. sidenumtocalc_b0++;
  748. }
  749. }
  750. if (sidenumtocalc_b0>0) beamSidebandNoise_b0 = beamSidebandNoise_b0 /double(sidenumtocalc_b0); // channel baseline shift
  751. beamSidebandNoise_b1 = 0.;
  752. sidenumtocalc_b1 = 0;
  753. for (int i =0; i<maxchannel_b1-nfwhm_b1; i++){
  754. if (i>=0 && i<=127){
  755. beamSidebandNoise_b1 += board_b1_ch[i]; //integrate the noise outside the peak
  756. sidenumtocalc_b1++;
  757. }
  758. }
  759. for (int i = maxchannel_b1+nfwhm_b1; i < 128; i++){
  760. if (i>=0 && i<=127){
  761. beamSidebandNoise_b1 += board_b1_ch[i]; //integrate the noise outside the peak
  762. sidenumtocalc_b1++;
  763. }
  764. }
  765. if (sidenumtocalc_b1>0) beamSidebandNoise_b1 = beamSidebandNoise_b1 /double(sidenumtocalc_b1); // channel baseline shift
  766. beamSidebandNoise_b2 = 0.;
  767. sidenumtocalc_b2 = 0;
  768. for (int i =0; i<maxchannel_b2-nfwhm_b2; i++){
  769. if (i>=0 && i<=127){
  770. beamSidebandNoise_b2 += board_b2_ch[i]; //integrate the noise outside the peak
  771. sidenumtocalc_b2++;
  772. }
  773. }
  774. for (int i = maxchannel_b2+nfwhm_b2; i < 128; i++){
  775. if (i>=0 && i<=127){
  776. beamSidebandNoise_b2 += board_b2_ch[i]; //integrate the noise outside the peak
  777. sidenumtocalc_b2++;
  778. }
  779. }
  780. if (sidenumtocalc_b2>0) beamSidebandNoise_b2 = beamSidebandNoise_b2 /double(sidenumtocalc_b2); // channel baseline shift
  781. beamSidebandNoise_b3 = 0.;
  782. sidenumtocalc_b3 = 0;
  783. for (int i =0; i<maxchannel_b3-nfwhm_b3; i++){
  784. if (i>=0 && i<=127){
  785. beamSidebandNoise_b3 += board_b3_ch[i]; //integrate the noise outside the peak
  786. sidenumtocalc_b3++;
  787. }
  788. }
  789. for (int i = maxchannel_b3+nfwhm_b3; i < 128; i++){
  790. if (i>=0 && i<=127){
  791. beamSidebandNoise_b3 += board_b3_ch[i]; //integrate the noise outside the peak
  792. sidenumtocalc_b3++;
  793. }
  794. }
  795. if (sidenumtocalc_b3>0) beamSidebandNoise_b3 = beamSidebandNoise_b3 /double(sidenumtocalc_b3); // channel baseline shift
  796. ////////////////////////////////////////////////////////////
  797. //integrate under the approximate peak
  798. //build the channel list for statistical analysis
  799. ////////////////////////////////////////////////////////////
  800. numtocalc_b0 = 0;
  801. numtocalc_b1 = 0;
  802. numtocalc_b2 = 0;
  803. numtocalc_b3 = 0;
  804. beamSidebandNoise_b0=0.;
  805. beamSidebandNoise_b1=0.;
  806. beamSidebandNoise_b2=0.;
  807. beamSidebandNoise_b3=0.;
  808. signal_b0_left = 0.;
  809. signal_b0_right = 0.;
  810. for (int i = maxchannel_b0-nfwhm_b0 ; i <= maxchannel_b0 + nfwhm_b0; i++){
  811. if (i>=0 && i<=127 && board_b0_ch[i]>50){
  812. signal_b0 +=board_b0_ch[i]-beamSidebandNoise_b0 ;
  813. if (i<64) {signal_b0_left +=board_b0_ch[i]-beamSidebandNoise_b0 ;}
  814. else {signal_b0_right +=board_b0_ch[i]-beamSidebandNoise_b0 ;}
  815. signal_gsl_b0[numtocalc_b0]=board_b0_ch[i]-beamSidebandNoise_b0 ;
  816. // channellist_gsl_b0[numtocalc_b0] = i;
  817. channellist_gsl_b0[numtocalc_b0] = pos[i];
  818. numtocalc_b0++;
  819. }
  820. }
  821. th1_signal_b0->Fill(signal_b0);
  822. signal_b1_left = 0.;
  823. signal_b1_right = 0.;
  824. for (int i = maxchannel_b1-nfwhm_b1 ; i <= maxchannel_b1 + nfwhm_b1; i++){
  825. if (i>=0 && i<=127&&board_b1_ch[i]>50){
  826. signal_b1 +=board_b1_ch[i]-beamSidebandNoise_b1 ;
  827. if (i<64) {signal_b1_left +=board_b1_ch[i]-beamSidebandNoise_b1 ;}
  828. else {signal_b1_right +=board_b1_ch[i]-beamSidebandNoise_b1 ;}
  829. signal_gsl_b1[numtocalc_b1]=board_b1_ch[i]-beamSidebandNoise_b1 ;
  830. // channellist_gsl_b1[numtocalc_b1] = i;
  831. channellist_gsl_b1[numtocalc_b1] = pos[i];
  832. numtocalc_b1++;
  833. }
  834. }
  835. th1_signal_b0->Fill(signal_b1);
  836. signal_b2_left = 0.;
  837. signal_b2_right = 0.;
  838. for (int i = maxchannel_b2-nfwhm_b2 ; i <= maxchannel_b2 + nfwhm_b2; i++){
  839. if (i>=0 && i<=127&&board_b2_ch[i]>50){
  840. signal_b2 +=board_b2_ch[i]-beamSidebandNoise_b2 ;
  841. if (i<64) {signal_b2_left +=board_b2_ch[i]-beamSidebandNoise_b2 ;}
  842. else {signal_b2_right +=board_b2_ch[i]-beamSidebandNoise_b2 ;}
  843. signal_gsl_b2[numtocalc_b2]=board_b2_ch[i]-beamSidebandNoise_b2 ;
  844. // channellist_gsl_b2[numtocalc_b2] = i;
  845. channellist_gsl_b2[numtocalc_b2] = pos[i];
  846. numtocalc_b2++;
  847. }
  848. }
  849. th1_signal_b0->Fill(signal_b2);
  850. signal_b3_left = 0.;
  851. signal_b3_right = 0.;
  852. for (int i = maxchannel_b3-nfwhm_b3 ; i <= maxchannel_b3 + nfwhm_b3; i++){
  853. if (i>=0 && i<=127&&board_b3_ch[i]>50){
  854. signal_b3 +=board_b3_ch[i]-beamSidebandNoise_b3 ;
  855. if (i<64) {signal_b3_left +=board_b3_ch[i]-beamSidebandNoise_b3 ;}
  856. else {signal_b3_right +=board_b3_ch[i]-beamSidebandNoise_b3 ;}
  857. signal_gsl_b3[numtocalc_b3]=board_b3_ch[i]-beamSidebandNoise_b3 ;
  858. //channellist_gsl_b3[numtocalc_b3] = i;
  859. channellist_gsl_b3[numtocalc_b3] = pos[i];
  860. numtocalc_b3++;
  861. }
  862. }
  863. th1_signal_b0->Fill(signal_b3);
  864. for (int i=0;i<128;i++){
  865. if(signal_b0>700) {
  866. th2_signal_vs_channel_sub_b0->Fill(i,board_b0_ch[i]-beamSidebandNoise_b0);
  867. sumvector_b0[i] += board_b0_ch[i];//-beamSidebandNoise_b0;
  868. }
  869. if(signal_b1>700) {
  870. th2_signal_vs_channel_sub_b1->Fill(i,board_b1_ch[i]-beamSidebandNoise_b1);
  871. sumvector_b1[i] += board_b1_ch[i];//-beamSidebandNoise_b1;
  872. }
  873. if(signal_b2>700){
  874. th2_signal_vs_channel_sub_b2->Fill(i,board_b2_ch[i]-beamSidebandNoise_b2);
  875. sumvector_b2[i] += board_b2_ch[i];//-beamSidebandNoise_b2;
  876. }
  877. if(signal_b3>700) {
  878. th2_signal_vs_channel_sub_b3->Fill(i,board_b3_ch[i]-beamSidebandNoise_b3);
  879. sumvector_b3[i] += board_b3_ch[i];//-beamSidebandNoise_b3;
  880. }
  881. }
  882. if(signal_b0>100) beamontime[0]+=1.0;
  883. if(signal_b1>100) beamontime[1]+=1.0;
  884. if(signal_b2>100) beamontime[2]+=1.0;
  885. if(signal_b3>100) beamontime[3]+=1.0;
  886. ///add gsl stuff here.
  887. /* std::cout << maxchannel_b0 << " " << maxchannel_b1 << " "<< maxchannel_b2 << " "<< maxchannel_b3 << " " << std::endl;
  888. std::cout << maxchannelamp_b0 << " " << maxchannelamp_b1 << " "<< maxchannelamp_b2 << " "<< maxchannelamp_b3 << " " << std::endl;
  889. std::cout << nfwhm_b0 << " " << nfwhm_b1 << " " << nfwhm_b2 << " " << nfwhm_b3 << " " << std::endl;
  890. std::cout << std::endl;*/
  891. beamPosX_b0 = gsl_stats_wmean(signal_gsl_b0,1,channellist_gsl_b0,1,numtocalc_b0); //calculate the weighted mean
  892. beamFocusX_b0 = gsl_stats_wsd_with_fixed_mean(signal_gsl_b0,1,channellist_gsl_b0,1,numtocalc_b0,beamPosX_b0); //Standard Deviation
  893. beamSkewX_b0 = gsl_stats_wskew_m_sd(signal_gsl_b0,1,channellist_gsl_b0,1,numtocalc_b0,beamPosX_b0,beamFocusX_b0); //skewness (symmetry)
  894. 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)
  895. beamNumX_b0 = numtocalc_b0;
  896. beamFocusX_b0 *=2.3548;//SD-->FWHM
  897. beamPosX_b1 = gsl_stats_wmean(signal_gsl_b1,1,channellist_gsl_b1,1,numtocalc_b1); //calculate the weighted mean
  898. beamFocusX_b1 = gsl_stats_wsd_with_fixed_mean(signal_gsl_b1,1,channellist_gsl_b1,1,numtocalc_b1,beamPosX_b1); //Standard Deviation
  899. beamSkewX_b1 = gsl_stats_wskew_m_sd(signal_gsl_b1,1,channellist_gsl_b1,1,numtocalc_b1,beamPosX_b1,beamFocusX_b1); //skewness (symmetry)
  900. 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)
  901. beamNumX_b1 = numtocalc_b1;
  902. beamFocusX_b1 *=2.3548;//SD-->FWHM
  903. beamPosX_b2 = gsl_stats_wmean(signal_gsl_b2,1,channellist_gsl_b2,1,numtocalc_b2); //calculate the weighted mean
  904. beamFocusX_b2 = gsl_stats_wsd_with_fixed_mean(signal_gsl_b2,1,channellist_gsl_b2,1,numtocalc_b2,beamPosX_b2); //Standard Deviation
  905. beamSkewX_b2 = gsl_stats_wskew_m_sd(signal_gsl_b2,1,channellist_gsl_b2,1,numtocalc_b2,beamPosX_b2,beamFocusX_b2); //skewness (symmetry)
  906. 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)
  907. beamNumX_b2 = numtocalc_b2;
  908. beamFocusX_b2 *=2.3548;//SD-->FWHM
  909. beamPosX_b3 = gsl_stats_wmean(signal_gsl_b3,1,channellist_gsl_b3,1,numtocalc_b3); //calculate the weighted mean
  910. beamFocusX_b3 = gsl_stats_wsd_with_fixed_mean(signal_gsl_b3,1,channellist_gsl_b3,1,numtocalc_b3,beamPosX_b3); //Standard Deviation
  911. beamSkewX_b3 = gsl_stats_wskew_m_sd(signal_gsl_b3,1,channellist_gsl_b3,1,numtocalc_b3,beamPosX_b3,beamFocusX_b3); //skewness (symmetry)
  912. 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)
  913. beamNumX_b3 = numtocalc_b3;
  914. beamFocusX_b3 *=2.3548;//SD-->FWHM
  915. /////////////////////////////////////////////////
  916. /////Add fitting algorithm here
  917. /////////////////////////////////////////////////
  918. /*
  919. use board_b0_ch[i] to fill a TGraph.
  920. fit with a gaussian
  921. subtract the difference
  922. fill a THF2 with the difference, delta_amp vs channel
  923. */
  924. // std::cout << ic1_avg << std::endl;
  925. //fit with a gaussian function;
  926. if (doFit&&ic1_avg>0.1){
  927. if ((lastfit_b0!=0||lastfit_b1!=0)&&numtocalc_b0>1&&numtocalc_b0<50){
  928. gausfunc_b0->SetParameters(signal_b0/(sqrt(2)*beamFocusX_b0/2.3548),beamPosX_b0,4.,0.);
  929. gausfunc_b1->SetParameters(signal_b1/(sqrt(2)*beamFocusX_b1/2.3548),beamPosX_b1,4.,0.);
  930. }
  931. else if (signal_b0<=0||signal_b1<=0) {
  932. gausfunc_b0->SetParameters(100.,35.,10.,0.);
  933. gausfunc_b1->SetParameters(100.,35.,10.,0.);
  934. }
  935. gausfunc_b0->SetParLimits(0,0.,5000.);
  936. gausfunc_b0->SetParLimits(1,0.,128.);
  937. gausfunc_b0->SetParLimits(2,0.5,40.);
  938. gausfunc_b0->SetParLimits(3,-150.,150.);
  939. gausfunc_b1->SetParLimits(0,0.,5000.);
  940. gausfunc_b1->SetParLimits(1,0,128);
  941. gausfunc_b1->SetParLimits(2,0.5,40.);
  942. gausfunc_b1->SetParLimits(3,-150.,150.);
  943. //signal_gsl_b0,1,channellist_gsl_b0,1,numtocalc_b0)
  944. gausgraph_b0 = new TGraphErrors(128,channellist_gsl_b0,signal_gsl_b0,errorx,errory);
  945. gausgraph_b1 = new TGraphErrors(128,channellist_gsl_b1,signal_gsl_b1,errorx,errory);
  946. lastfit_b0 = gausgraph_b0->Fit(gausfunc_b0,"QRN","",1,128); // single gaussian fit
  947. lastfit_b1 = gausgraph_b1->Fit(gausfunc_b1,"QRN","",1,128); // single gaussian fit
  948. beamPosX_fit_b0 = gausfunc_b0->GetParameter(1);
  949. beamFocusX_fit_b0 =2.3548* gausfunc_b0->GetParameter(2);
  950. // beamChi2_fit_b0 = gausfunc_b0->GetChisquare()/gausfunc_b0->GetNDF();
  951. // beamPeakX_fit_b0 = gausfunc_b0->GetParameter(0);
  952. beamPosX_fit_b1 = gausfunc_b1->GetParameter(1);
  953. beamFocusX_fit_b1 =2.3548* gausfunc_b1->GetParameter(2);
  954. // beamChi2_fit_b1 = gausfunc_b1->GetChisquare()/gausfunc_b1->GetNDF();
  955. // beamPeakX_fit_b1 = gausfunc_b1->GetParameter(0);
  956. // cout << lastfit_b0 << " " << lastfit_b1 << " " << ic1_avg << " " << maxchannelamp_b0 << " " << nfwhm_b0<< " " << nfwhm_b1 <<" " << beamPosX_b0 << " " <<beamPosX_b1 << " " << beamPosX_fit_b0 << " " << beamPosX_fit_b1 << " " << signal_b0 << " " << signal_b1 << " " << energy << " " << intensity << endl;
  957. /*
  958. for (int ch = 4; ch < 64; ch++){
  959. th2d_fitdiff_channel->Fill(ch, double(channelamp[ch]-gausfunc->Eval(ch)));
  960. }
  961. for (int ch = 64; ch < 128; ch++){
  962. th2d_fit2diff_channel->Fill(ch, double(channelamp[ch]-gausfunc2->Eval(ch)));
  963. }
  964. */
  965. }
  966. rootTree->Fill();
  967. }
  968. if (frameend>0 && frame+framestart>=frameend) break;
  969. }//end of loop over frames
  970. /* th2_signal_vs_channel_b0->Write();
  971. th2_signal_vs_channel_b1->Write();
  972. th2_signal_vs_channel_b2->Write();
  973. th2_signal_vs_channel_b3->Write();
  974. th2_signal_vs_channel_bkg_b0->Write();
  975. th2_signal_vs_channel_bkg_b1->Write();
  976. th2_signal_vs_channel_bkg_b2->Write();
  977. th2_signal_vs_channel_bkg_b3->Write();
  978. th1_signal_b0->Write();
  979. th1_signal_b1->Write();
  980. th1_signal_b2->Write();
  981. th1_signal_b3->Write();*/
  982. graph_bkg_b0->SetName("graph_bkg_b0"); // graph_bkg_b0->Write();
  983. graph_bkg_b1->SetName("graph_bkg_b1"); // graph_bkg_b1->Write();
  984. graph_bkg_b2->SetName("graph_bkg_b2"); // graph_bkg_b2->Write();
  985. graph_bkg_b3->SetName("graph_bkg_b3"); // graph_bkg_b3->Write();
  986. sumvector_b0_ptr->Write("sumvector_b0");
  987. sumvector_b1_ptr->Write("sumvector_b1");
  988. sumvector_b2_ptr->Write("sumvector_b2");
  989. sumvector_b3_ptr->Write("sumvector_b3");
  990. beamontime_ptr->Write("beamontime");
  991. // bic1->Fill();
  992. // bmw1_posx->Fill();
  993. //bmw1_posy->Fill();
  994. rootFile->Write();
  995. rootFile->Close();
  996. }
  997. std::cout << eventID << " frames analysed." << std::endl;
  998. return 0;
  999. }
  1000. else {
  1001. std::cerr << "Error 1" << std::endl;
  1002. return 1;
  1003. }
  1004. }
  1005. int main(int argc, char **argv){
  1006. analyse(argc, argv);
  1007. }