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.

539 lines
20 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 ngraphs = 0;
  28. int eventID = 0;
  29. int framestart=0;
  30. int frameend = 0;
  31. double board_b0_ch[128];
  32. double board_b1_ch[128];
  33. double board_b2_ch[128];
  34. double board_b3_ch[128];
  35. double board_b0_ch_bkg[128];
  36. double board_b1_ch_bkg[128];
  37. double board_b2_ch_bkg[128];
  38. double board_b3_ch_bkg[128];
  39. double signal_b0 = 0.;
  40. double signal_b1 = 0.;
  41. double signal_b2 = 0.;
  42. double signal_b3 = 0.;
  43. double signal_avg = 0.;
  44. double signal_b0_left = 0.;
  45. double signal_b1_left = 0.;
  46. double signal_b2_left = 0.;
  47. double signal_b3_left = 0.;
  48. double signal_b0_right = 0.;
  49. double signal_b1_right = 0.;
  50. double signal_b2_right = 0.;
  51. double signal_b3_right = 0.;
  52. double signal_gsl_b0[128];
  53. double signal_gsl_b1[128];
  54. double signal_gsl_b2[128];
  55. double signal_gsl_b3[128];
  56. double channellist_gsl_b0[128];
  57. double channellist_gsl_b1[128];
  58. double channellist_gsl_b2[128];
  59. double channellist_gsl_b3[128];
  60. double channellist[128];
  61. double pos[128];
  62. double maxchannelamp_b0 =0.;
  63. double maxchannelamp_b1 =0.;
  64. double maxchannelamp_b2 =0.;
  65. double maxchannelamp_b3 =0.;
  66. int maxchannel_b0 =0;
  67. int maxchannel_b1 =0;
  68. int maxchannel_b2 =0;
  69. int maxchannel_b3 =0;
  70. int numtocalc_b0 =0;
  71. int numtocalc_b1 =0;
  72. int numtocalc_b2 =0;
  73. int numtocalc_b3 =0;
  74. int nfwhm_b0 = 0;
  75. int nfwhm_b1 = 0;
  76. int nfwhm_b2 = 0;
  77. int nfwhm_b3 = 0;
  78. double beamPosX_b0,beamPosX_b1,beamPosX_b2,beamPosX_b3;
  79. double beamFocusX_b0,beamFocusX_b1,beamFocusX_b2,beamFocusX_b3;
  80. double beamSkewX_b0,beamSkewX_b1,beamSkewX_b2,beamSkewX_b3;
  81. double beamKurtX_b0,beamKurtX_b1,beamKurtX_b2,beamKurtX_b3;
  82. double beamNumX_b0,beamNumX_b1,beamNumX_b2,beamNumX_b3;
  83. double beamSidebandNoise_b0, beamSidebandNoise_b1, beamSidebandNoise_b2, beamSidebandNoise_b3 ;
  84. int sidenumtocalc_b0,sidenumtocalc_b1,sidenumtocalc_b2,sidenumtocalc_b3;
  85. size_t size = 5;
  86. vector<double> boxcar;
  87. vector<double> boxcarsort;
  88. vector<double> boxcarweight{1,3,5,3,1};
  89. vector<double> data(128);
  90. TVector sumvector_b0(128);
  91. TVector sumvector_b1(128);
  92. TVector sumvector_b2(128);
  93. TVector sumvector_b3(128);
  94. TVector * sumvector_b0_ptr = &sumvector_b0;
  95. TVector * sumvector_b1_ptr = &sumvector_b1;
  96. TVector * sumvector_b2_ptr = &sumvector_b2;
  97. TVector * sumvector_b3_ptr = &sumvector_b3;
  98. const int length = 100; //length of the rolling average
  99. double array_b0[length][128] = {{0.}};
  100. double array_b1[length][128] = {{0.}};
  101. double array_b2[length][128] = {{0.}};
  102. double array_b3[length][128] = {{0.}};
  103. double arrayavg_b0[128] = {0.};
  104. double arrayavg_b1[128] = {0.};
  105. double arrayavg_b2[128] = {0.};
  106. double arrayavg_b3[128] = {0.};
  107. double board_b0_smooth_ch[128];
  108. double board_b1_smooth_ch[128];
  109. double board_b2_smooth_ch[128];
  110. double board_b3_smooth_ch[128];
  111. bool graphsaved_b0 = false;
  112. bool graphsaved_b1 = false;
  113. bool graphsaved_b2 = false;
  114. bool graphsaved_b3 = false;
  115. TVector beamontime(0,3,0.,0.,0.,0.,"END");
  116. TVector * beamontime_ptr = &beamontime;
  117. double calibration_b0[128] = {0.};
  118. double calibration_b1[128] = {0.};
  119. double calibration_b2[128] = {0.};
  120. double calibration_b3[128] = {0.};
  121. TGraph * graph[100];
  122. /// compile with:
  123. //// $ make clean; make
  124. /// run with:
  125. //// $ ./convert <path to data> <run>
  126. //// $ ./convert /work/leverington/beamprofilemonitor/hitdata/HIT_17_12_2017/ run2
  127. int main(int argc, char **argv)
  128. {
  129. //initialise some values;
  130. for (int i = 0;i<128;i++){
  131. board_b0_ch_bkg[i] = 0.;
  132. board_b1_ch_bkg[i] = 0.;
  133. board_b2_ch_bkg[i] = 0.;
  134. board_b3_ch_bkg[i] = 0.;
  135. channellist_gsl_b0[i] = 0;
  136. channellist_gsl_b1[i] = 0;
  137. channellist_gsl_b2[i] = 0;
  138. channellist_gsl_b3[i] = 0;
  139. sumvector_b0[i] = 0;
  140. sumvector_b1[i] = 0;
  141. sumvector_b2[i] = 0;
  142. sumvector_b3[i] = 0;
  143. calibration_b0[i] = 1.0;
  144. calibration_b1[i] = 1.0;
  145. calibration_b2[i] = 1.0;
  146. calibration_b3[i] = 1.0;
  147. channellist[i] = i;
  148. if (i<64) {pos[i] = double(i);}
  149. else {pos[i] = double(i) + 0.2; }
  150. }
  151. if (argc > 1){
  152. //open the file names specified in the command line
  153. string filename;
  154. string rootfilename;
  155. // argv[1]= "/work/leverington/beamprofilemonitor/hitdata/HIT_17_12_2017/";
  156. // argv[2]= "Run11"
  157. filename = Form("%s%s.dat",argv[1],argv[2]);
  158. rootfilename = Form("%s/root/%s.root",argv[1],argv[2]); // Giulia needs to change the path %s/root/ of the written root file.
  159. ifstream file(filename, ifstream::in | ifstream::binary);
  160. if (!file.is_open()){
  161. printf(".dat did not open.\n");
  162. return -1; //file could not be opened
  163. }
  164. ///some variables to get the data
  165. // int number_of_records_to_read = 4*10;
  166. // BufferData* buffer = new BufferData[number_of_records_to_read];
  167. if(argc > 4) {
  168. framestart = atoi(argv[3]);
  169. frameend = atoi(argv[4]);
  170. }
  171. int board_b = -1;
  172. long int fileframesize = getFileSize(filename.c_str()) / ( 4*sizeof(BufferData) );
  173. BufferData* dataptr = new BufferData();
  174. if (fileframesize>0){
  175. //open ROOT file for saving histos and TTree.
  176. TFile *rootFile = new TFile(rootfilename.c_str(),"RECREATE");
  177. if ( rootFile->IsOpen() ) printf("ROOT file opened successfully\n");
  178. TH2D * th2_signal_vs_channel_b0 = new TH2D("th2_signal_vs_channel_b0","th2_signal_vs_channel_b0",128,0,128,2200,-1000,10000);
  179. TH2D * th2_signal_vs_channel_b1 = new TH2D("th2_signal_vs_channel_b1","th2_signal_vs_channel_b1",128,0,128,2200,-1000,10000);
  180. TH2D * th2_signal_vs_channel_b2 = new TH2D("th2_signal_vs_channel_b2","th2_signal_vs_channel_b2",128,0,128,2200,-1000,10000);
  181. TH2D * th2_signal_vs_channel_b3 = new TH2D("th2_signal_vs_channel_b3","th2_signal_vs_channel_b3",128,0,128,2200,-1000,10000);
  182. 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);
  183. 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);
  184. 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);
  185. 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);
  186. TH1D * th1_signal_b0 = new TH1D("th1_signal_b0","th1_signal_b0",2200,-10000,50000);
  187. TH1D * th1_signal_b1 = new TH1D("th1_signal_b1","th1_signal_b1",2200,-10000,50000);
  188. TH1D * th1_signal_b2 = new TH1D("th1_signal_b2","th1_signal_b2",2200,-10000,50000);
  189. TH1D * th1_signal_b3 = new TH1D("th1_signal_b3","th1_signal_b3",2200,-10000,50000);
  190. TGraph * graph_bkg_b0 = new TGraph();
  191. TGraph * graph_bkg_b1 = new TGraph();
  192. TGraph * graph_bkg_b2 = new TGraph();
  193. TGraph * graph_bkg_b3 = new TGraph();
  194. TGraph * gr_b0;
  195. TGraph * gr_sm_b0;
  196. TGraph * gr_b1;
  197. TGraph * gr_sm_b1;
  198. TGraph * gr_b2;
  199. TGraph * gr_sm_b2;
  200. TGraph * gr_b3;
  201. TGraph * gr_sm_b3;
  202. 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);
  203. 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);
  204. 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);
  205. 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);
  206. TTree *rootTree = new TTree("t","HIT Data Root Tree");
  207. rootTree->Branch("beamPosX_b0",&beamPosX_b0,"beamPosX_b0/D");
  208. rootTree->Branch("beamPosX_b1",&beamPosX_b1,"beamPosX_b1/D");
  209. rootTree->Branch("beamPosX_b2",&beamPosX_b2,"beamPosX_b2/D");
  210. rootTree->Branch("beamPosX_b3",&beamPosX_b3,"beamPosX_b3/D");
  211. rootTree->Branch("beamFocusX_b0",&beamFocusX_b0,"beamFocusX_b0/D");
  212. rootTree->Branch("beamFocusX_b1",&beamFocusX_b1,"beamFocusX_b1/D");
  213. rootTree->Branch("beamFocusX_b2",&beamFocusX_b2,"beamFocusX_b2/D");
  214. rootTree->Branch("beamFocusX_b3",&beamFocusX_b3,"beamFocusX_b3/D");
  215. rootTree->Branch("beamSkewX_b0",&beamSkewX_b0,"beamSkewX_b0/D");
  216. rootTree->Branch("beamSkewX_b1",&beamSkewX_b1,"beamSkewX_b1/D");
  217. rootTree->Branch("beamSkewX_b2",&beamSkewX_b2,"beamSkewX_b2/D");
  218. rootTree->Branch("beamSkewX_b3",&beamSkewX_b3,"beamSkewX_b3/D");
  219. rootTree->Branch("beamKurtX_b0",&beamKurtX_b0,"beamKurtX_b0/D");
  220. rootTree->Branch("beamKurtX_b1",&beamKurtX_b1,"beamKurtX_b1/D");
  221. rootTree->Branch("beamKurtX_b2",&beamKurtX_b2,"beamKurtX_b2/D");
  222. rootTree->Branch("beamKurtX_b3",&beamKurtX_b3,"beamKurtX_b3/D");
  223. rootTree->Branch("beamNumX_b0",&beamNumX_b0,"beamNumX_b0/D");
  224. rootTree->Branch("beamNumX_b1",&beamNumX_b1,"beamNumX_b1/D");
  225. rootTree->Branch("beamNumX_b2",&beamNumX_b2,"beamNumX_b2/D");
  226. rootTree->Branch("beamNumX_b3",&beamNumX_b3,"beamNumX_b3/D");
  227. rootTree->Branch("beamSignal_b0",&signal_b0,"beamSignal_b0/D");
  228. rootTree->Branch("beamSignal_b1",&signal_b1,"beamSignal_b1/D");
  229. rootTree->Branch("beamSignal_b2",&signal_b2,"beamSignal_b2/D");
  230. rootTree->Branch("beamSignal_b3",&signal_b3,"beamSignal_b3/D");
  231. rootTree->Branch("beamSignal_b0_left",&signal_b0_left,"beamSignal_b0_left/D");
  232. rootTree->Branch("beamSignal_b1_left",&signal_b1_left,"beamSignal_b1_left/D");
  233. rootTree->Branch("beamSignal_b2_left",&signal_b2_left,"beamSignal_b2_left/D");
  234. rootTree->Branch("beamSignal_b3_left",&signal_b3_left,"beamSignal_b3_left/D");
  235. rootTree->Branch("beamSignal_b0_right",&signal_b0_right,"beamSignal_b0_right/D");
  236. rootTree->Branch("beamSignal_b1_right",&signal_b1_right,"beamSignal_b1_right/D");
  237. rootTree->Branch("beamSignal_b2_right",&signal_b2_right,"beamSignal_b2_right/D");
  238. rootTree->Branch("beamSignal_b3_right",&signal_b3_right,"beamSignal_b3_right/D");
  239. rootTree->Branch("eventID",&eventID,"eventID/I");
  240. rootTree->Branch("board_b0_ch",&board_b0_ch,"board_b0_ch[128]/D");
  241. rootTree->Branch("board_b1_ch",&board_b1_ch,"board_b1_ch[128]/D");
  242. rootTree->Branch("board_b2_ch",&board_b2_ch,"board_b2_ch[128]/D");
  243. rootTree->Branch("board_b3_ch",&board_b3_ch,"board_b3_ch[128]/D");
  244. rootTree->Branch("beamSidebandNoise_b0",&beamSidebandNoise_b0,"beamSidebandNoise_b0/D");
  245. rootTree->Branch("beamSidebandNoise_b1",&beamSidebandNoise_b1,"beamSidebandNoise_b1/D");
  246. rootTree->Branch("beamSidebandNoise_b2",&beamSidebandNoise_b2,"beamSidebandNoise_b2/D");
  247. rootTree->Branch("beamSidebandNoise_b3",&beamSidebandNoise_b3,"beamSidebandNoise_b3/D");
  248. rootTree->Branch("arrayavg_b0",&arrayavg_b0,"arrayavg_b0[128]/D");
  249. rootTree->Branch("arrayavg_b1",&arrayavg_b1,"arrayavg_b1[128]/D");
  250. rootTree->Branch("arrayavg_b2",&arrayavg_b2,"arrayavg_b2[128]/D");
  251. rootTree->Branch("arrayavg_b3",&arrayavg_b3,"arrayavg_b3[128]/D");
  252. //loop through recorded data frames
  253. for (int frame = 0; frame<fileframesize; frame++){
  254. eventID = frame;
  255. // cout << eventID << endl;
  256. //board_b 0
  257. board_b=0;
  258. signal_b0 = 0.;
  259. maxchannelamp_b0 = 0.;
  260. file.seekg(framestart*sizeof(BufferData)+board_b*sizeof(BufferData)+4*frame*sizeof(BufferData));
  261. file.read ((char*)dataptr ,sizeof(BufferData));
  262. if (dataptr->sync_frame.device_nr==board_b){
  263. //cout << frame << " " << dataptr->sync_frame.device_nr << endl;
  264. if (frame%1000==0) cout << "Frame: " << frame << endl;
  265. for (int i = 0;i<128;i++){
  266. board_b0_ch[i] = dataptr->sensor_data[i];
  267. if (frame<1000){
  268. board_b0_ch_bkg[i] += board_b0_ch[i]/1000.; //find baseline from the average of first 1000 events
  269. }
  270. else if (frame>=1000&& frame<2000){
  271. board_b0_ch[i] -= board_b0_ch_bkg[i]; //histogram the subtracted baseline in the next 1000 events
  272. th2_signal_vs_channel_bkg_b0->Fill(i,board_b0_ch[i]);
  273. if (i==1) graph_bkg_b0->SetPoint(graph_bkg_b0->GetN(), frame, board_b0_ch[i]);
  274. }
  275. else if (frame>=2000) {
  276. board_b0_ch[i]-=board_b0_ch_bkg[i]; // the rest background subtracted
  277. board_b0_ch[i]*=calibration_b0[i]; //calibration factor
  278. th2_signal_vs_channel_b0->Fill(i,board_b0_ch[i]);
  279. // signal_b0 +=board_b0_ch[i] ;
  280. if (board_b0_ch[i]> maxchannelamp_b0) {
  281. maxchannel_b0 = i;
  282. maxchannelamp_b0 = board_b0_ch[i];
  283. }
  284. //calculate a rolling average of the signal
  285. arrayavg_b0[i] = 0;
  286. for (int j = 1; j<length;j++){
  287. array_b0[j-1][i] = array_b0[j][i];
  288. arrayavg_b0[i] += array_b0[j-1][i]/double(length);
  289. }
  290. if( board_b0_ch[i]>-1000){
  291. array_b0[length-1][i] = board_b0_ch[i];
  292. arrayavg_b0[i] += array_b0[length-1][i]/double(length);
  293. }
  294. ////////////////////////////////////////////
  295. }
  296. }
  297. // th1_signal_b0->Fill(signal_b0);
  298. }
  299. else {
  300. cout << "Error." << endl;
  301. }
  302. //board_b 1
  303. board_b=1;
  304. signal_b1=0.;
  305. maxchannelamp_b1 = 0.;
  306. file.seekg(framestart*sizeof(BufferData)+board_b*sizeof(BufferData)+4*frame*sizeof(BufferData));
  307. file.read ((char*)dataptr ,sizeof(BufferData));
  308. if (dataptr->sync_frame.device_nr==board_b){
  309. //cout << frame << " " << dataptr->sync_frame.device_nr << endl;
  310. for (int i = 0;i<128;i++){
  311. board_b1_ch[i] = dataptr->sensor_data[i];
  312. if (frame<1000){
  313. board_b1_ch_bkg[i] += board_b1_ch[i]/1000.; //find baseline from the average of first 1000 events
  314. }
  315. else if (frame>=1000&& frame<2000){
  316. board_b1_ch[i] -= board_b1_ch_bkg[i]; //histogram the subtracted baseline in the next 1000 events
  317. th2_signal_vs_channel_bkg_b1->Fill(i,board_b1_ch[i]);
  318. if (i==1) graph_bkg_b1->SetPoint(graph_bkg_b1->GetN(), frame, board_b1_ch[i]);
  319. }
  320. else if (frame>=2000) {
  321. board_b1_ch[i]-=board_b1_ch_bkg[i]; // the rest are background subtracted
  322. board_b1_ch[i]*=calibration_b1[i]; //calibration factor
  323. th2_signal_vs_channel_b1->Fill(i,board_b1_ch[i]);
  324. // signal_b1 +=board_b1_ch[i] ;
  325. if (board_b1_ch[i]> maxchannelamp_b1) {
  326. maxchannel_b1 = i;
  327. maxchannelamp_b1 = board_b1_ch[i];
  328. }
  329. //calculate a rolling average of the signal
  330. arrayavg_b1[i] = 0;
  331. for (int j = 1; j<length;j++){
  332. array_b1[j-1][i] = array_b1[j][i];
  333. arrayavg_b1[i] += array_b1[j-1][i]/double(length);
  334. }
  335. if( board_b1_ch[i]>-1000){
  336. array_b1[length-1][i] = board_b1_ch[i];
  337. arrayavg_b1[i] += array_b1[length-1][i]/double(length);
  338. }
  339. ////////////////////////////////////////////
  340. }
  341. }
  342. // th1_signal_b1->Fill(signal_b1);
  343. }
  344. else {
  345. cout << "Error." << endl;
  346. }
  347. //board_b 2
  348. board_b=2;
  349. signal_b2=0.;
  350. maxchannelamp_b2 = 0.;
  351. file.seekg(framestart*sizeof(BufferData)+board_b*sizeof(BufferData)+4*frame*sizeof(BufferData));
  352. file.read ((char*)dataptr ,sizeof(BufferData));
  353. if (dataptr->sync_frame.device_nr==board_b){
  354. //cout << frame << " " << dataptr->sync_frame.device_nr << endl;
  355. for (int i = 0;i<128;i++){
  356. board_b2_ch[i] = dataptr->sensor_data[i];
  357. if (frame<1000){
  358. board_b2_ch_bkg[i] += board_b2_ch[i]/1000.; //find baseline from the average of first 1000 events
  359. }
  360. else if (frame>=1000&& frame<2000){
  361. board_b2_ch[i] -= board_b2_ch_bkg[i]; //histogram the subtracted baseline in the next 1000 events
  362. th2_signal_vs_channel_bkg_b2->Fill(i,board_b2_ch[i]);
  363. if (i==1) graph_bkg_b2->SetPoint(graph_bkg_b2->GetN(), frame, board_b2_ch[i]);
  364. }
  365. else if (frame>=2000) {
  366. board_b2_ch[i]-=board_b2_ch_bkg[i]; // the rest background subtracted
  367. board_b2_ch[i]*=calibration_b2[i]; //calibration factor
  368. th2_signal_vs_channel_b2->Fill(i,board_b2_ch[i]);
  369. // signal_b2 +=board_b2_ch[i] ;
  370. if (board_b2_ch[i]> maxchannelamp_b2) {
  371. maxchannel_b2 = i;
  372. maxchannelamp_b2 = board_b2_ch[i];
  373. }
  374. //calculate a rolling average of the signal
  375. arrayavg_b2[i] = 0;
  376. for (int j = 1; j<length;j++){
  377. array_b2[j-1][i] = array_b2[j][i];
  378. arrayavg_b2[i] += array_b2[j-1][i]/double(length);
  379. }
  380. if( board_b2_ch[i]>-1000){
  381. array_b2[length-1][i] = board_b2_ch[i];
  382. arrayavg_b2[i] += array_b2[length-1][i]/double(length);
  383. }
  384. ////////////////////////////////////////////
  385. }
  386. }
  387. // th1_signal_b2->Fill(signal_b2);
  388. }
  389. else {
  390. cout << "Error." << endl;
  391. }
  392. //board_b 3
  393. board_b=3;
  394. signal_b3=0.;
  395. maxchannelamp_b3 = 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. //cout << frame << " " << dataptr->sync_frame.device_nr << endl;
  400. for (int i = 0;i<128;i++){
  401. board_b3_ch[i] = dataptr->sensor_data[i];
  402. if (frame<1000){
  403. board_b3_ch_bkg[i] += board_b3_ch[i]/1000.; //find baseline from the average of first 1000 events
  404. }
  405. else if (frame>=1000&& frame<2000){
  406. board_b3_ch[i] -= board_b3_ch_bkg[i]; //histogram the subtracted baseline in the next 1000 events
  407. th2_signal_vs_channel_bkg_b3->Fill(i,board_b3_ch[i]);
  408. if (i==1) graph_bkg_b3->SetPoint(graph_bkg_b3->GetN(), frame, board_b3_ch[i]);
  409. }
  410. else if (frame>=2000) {
  411. board_b3_ch[i]-=board_b3_ch_bkg[i]; // the rest of the events are background subtracted
  412. board_b3_ch[i]*=calibration_b3[i]; //with a calibration factor
  413. th2_signal_vs_channel_b3->Fill(i,board_b3_ch[i]);
  414. // signal_b3 +=board_b3_ch[i] ;
  415. if (board_b3_ch[i]> maxchannelamp_b3) {
  416. maxchannel_b3 = i;
  417. maxchannelamp_b3 = board_b3_ch[i];
  418. }
  419. //calculate a rolling average of the signal
  420. arrayavg_b3[i] = 0;
  421. for (int j = 1; j<length;j++){
  422. array_b3[j-1][i] = array_b3[j][i];
  423. arrayavg_b3[i] += array_b3[j-1][i]/double(length);
  424. }
  425. if( board_b3_ch[i]>-1000){
  426. array_b3[length-1][i] = board_b3_ch[i];
  427. arrayavg_b3[i] += array_b3[length-1][i]/double(length);
  428. }
  429. ////////////////////////////////////////////
  430. }
  431. }
  432. // th1_signal_b3->Fill(signal_b3);
  433. }
  434. else {
  435. cout << "Error." << endl;
  436. }
  437. ////////////////////////////////////////////////////////////
  438. ////////////////////////////////////////////////////////////
  439. //start the signal analysis
  440. ////////////////////////////////////////////////////////////
  441. ////////////////////////////////////////////////////////////
  442. if (frame>=2000){
  443. signal_b0 = 0.; signal_b1 = 0.; signal_b2 = 0.; signal_b3 = 0.;
  444. for (int i = 1; i<128; i++){
  445. signal_b0 += board_b0_ch[i];
  446. signal_b1 += board_b1_ch[i];
  447. signal_b2 += board_b2_ch[i];
  448. signal_b3 += board_b3_ch[i];
  449. signal_avg = (signal_b0 + signal_b1 + signal_b2 + signal_b3)/4.;
  450. }
  451. if ( signal_avg> 2000 && ngraphs<100){
  452. graph[ngraphs] = new TGraph(128,channellist,board_b0_ch); graph[ngraphs]->SetName(Form("graph_%i",ngraphs)); graph[ngraphs]->Write();
  453. ngraphs++;
  454. }
  455. if ( signal_avg> 2000) cout << signal_b0 << " " << signal_b1 << " " << signal_b2 << " " << signal_b3 << " " << signal_avg << " " << ngraphs << endl;
  456. // rootTree->Fill();
  457. }//end of if (frame>=2000)
  458. if (frameend>0 && frame+framestart>=frameend) break;
  459. if (ngraphs==100) break;
  460. }//end of loop over frames
  461. rootFile->Write();
  462. rootFile->Close();
  463. }
  464. cout << eventID << " frames analysed." << endl;
  465. return 0;
  466. }
  467. else {
  468. cerr << "Error 1" << endl;
  469. return 1;
  470. }
  471. }