1 | #include <TROOT.h>
|
---|
2 | #include <TCanvas.h>
|
---|
3 | #include <TProfile.h>
|
---|
4 | #include <TH1.h>
|
---|
5 | #include <TH2.h>
|
---|
6 | #include <TF1.h>
|
---|
7 | #include <TGraph.h>
|
---|
8 | #include <TFile.h>
|
---|
9 |
|
---|
10 | #include <stdint.h>
|
---|
11 | #include <cstdio>
|
---|
12 |
|
---|
13 | #define HAVE_ZLIB
|
---|
14 | #include "fits.h"
|
---|
15 | #include "FOpenDataFile.c"
|
---|
16 | #include "FOpenCalibFile.c"
|
---|
17 | #include "FPedestal.c"
|
---|
18 | #include "FOscilloscopeAllPx.c"
|
---|
19 |
|
---|
20 | #define n_peaks 2
|
---|
21 |
|
---|
22 | int gainanalysis(const char *name, const char *drsname, size_t pixelnr)
|
---|
23 | {
|
---|
24 | //******************************************************************************
|
---|
25 | //Read a file with G-APD singles, analyse them and plot the spectra
|
---|
26 | //This source code is best read with a wide editor (>100 characters per line) or a horizontal scroll bar.
|
---|
27 | //ATTENTION: this script only works for ROI=1024
|
---|
28 | // (array indices of the calibration wrong otherwise)
|
---|
29 | //******************************************************************************
|
---|
30 |
|
---|
31 | gROOT->SetStyle("Plain");
|
---|
32 | TFile outfile("gainspectra.root","RECREATE");
|
---|
33 | //-------------------------------------------
|
---|
34 | //Define the data variables
|
---|
35 | //-------------------------------------------
|
---|
36 | vector<int16_t> data;
|
---|
37 | vector<int16_t> data_offset;
|
---|
38 | unsigned int data_num;
|
---|
39 | size_t data_n;
|
---|
40 | UInt_t data_px;
|
---|
41 | UInt_t data_roi;
|
---|
42 |
|
---|
43 | //-------------------------------------------
|
---|
44 | //Get the DRS calibration
|
---|
45 | //-------------------------------------------
|
---|
46 | size_t drs_n;
|
---|
47 | vector<float> drs_basemean;
|
---|
48 | vector<float> drs_gainmean;
|
---|
49 | vector<float> drs_triggeroffsetmean;
|
---|
50 | FOpenCalibFile(drsname, drs_basemean, drs_gainmean, drs_triggeroffsetmean, drs_n);
|
---|
51 |
|
---|
52 | //-------------------------------------------
|
---|
53 | //Check the sizes of the data columns
|
---|
54 | //-------------------------------------------
|
---|
55 | // if(drs_n!=data_n)
|
---|
56 | // {
|
---|
57 | // cout << "Data and DRS file incompatible (Px*ROI disagree)" << endl;
|
---|
58 | // return 1;
|
---|
59 | // }
|
---|
60 |
|
---|
61 | //-------------------------------------------
|
---|
62 | //Open the file
|
---|
63 | //-------------------------------------------
|
---|
64 | fits datafile(name);
|
---|
65 | if (!datafile)
|
---|
66 | {
|
---|
67 | cout << "Couldn't properly open the datafile." << endl;
|
---|
68 | return 1;
|
---|
69 | }
|
---|
70 | FOpenDataFile(datafile, data, data_offset, data_num, data_n, data_roi, data_px);
|
---|
71 |
|
---|
72 | //-------------------------------------------
|
---|
73 | //Create the canvas, plot and title
|
---|
74 | //-------------------------------------------
|
---|
75 | char title_spect[500];
|
---|
76 | char name_spect[50];
|
---|
77 | std::sprintf(title_spect,"Spectrum of Px %i (data: %s, DRS: %s)",pixelnr, name,drsname);
|
---|
78 | TCanvas *canv_spect = new TCanvas( "canv_spect", "Spectrum", 950, 10, 700, 500 );
|
---|
79 | TH1F* spectrum[data_px];
|
---|
80 | for(int i=0; i<data_px; i++) {
|
---|
81 | std::sprintf(title_spect,"Spectrum of Px %i (data: %s, DRS: %s)",i,name,drsname);
|
---|
82 | std::sprintf(name_spect,"spect%i",i);
|
---|
83 | spectrum[i] = new TH1F(name_spect,title_spect,350,-100,600);
|
---|
84 | spectrum[i]->GetXaxis()->SetTitle("Pulse size (a.u.)");
|
---|
85 | spectrum[i]->GetYaxis()->SetTitle("Counts");
|
---|
86 | }
|
---|
87 |
|
---|
88 | TCanvas *canv_gain= new TCanvas( "canv_gain", "Gain in arbitrary units", 50, 500, 1800, 800 );
|
---|
89 | //-------------------------------------------
|
---|
90 | //Define the fit
|
---|
91 | //-------------------------------------------
|
---|
92 | int fit_start = 20;
|
---|
93 | int fit_end = 200;
|
---|
94 | TF1 *f_peaks = new TF1("total","[2]*TMath::Exp(-(x-[0])*(x-[0])/(2*[3]*[3])) + [4]*TMath::Exp(-(x-[0]-[1])*(x-[0]-[1])/(2*[5]*[5])) + [6]*TMath::Exp((-x-[7])/[8])",fit_start,fit_end);
|
---|
95 | Double_t par_init[5+2*n_peaks] = {70,90,100,15,10,15,10,30,30};
|
---|
96 | // TF1 *f_peaks = new TF1("total","[2]*TMath::Exp(-(x-[0])*(x-[0])/(2*[3]*[3])) + [4]*TMath::Exp(-(x-[0]-[1])*(x-[0]-[1])/(2*[5]*[5])) + [6]*TMath::Exp(-(x-[0]-2*[1])*(x-[0]-2*[1])/(2*[7]*[7])) + [8]*TMath::Exp(-(x-[0]-3*[1])*(x-[0]-3*[1])/(2*[9]*[9])) + [10]*TMath::Exp(-(x-[12])*(x-[12])/(2*[11]*[11]))",fit_start,fit_end);
|
---|
97 | // Double_t par_init[3+2*n_peaks] = {70,90,500000,15,50000,15,5000,15,500,15,800000,20,0};
|
---|
98 | f_peaks->SetParameters(par_init);
|
---|
99 | f_peaks->SetLineColor(2);
|
---|
100 |
|
---|
101 | TF1 *f_pedestal = new TF1("pedestal","[0]*TMath::Exp((-x-[1])/[2])",fit_start,fit_end);
|
---|
102 | f_pedestal->SetLineColor(2);
|
---|
103 | f_pedestal->SetLineWidth(1);
|
---|
104 |
|
---|
105 | TF1* f_peak[n_peaks];
|
---|
106 | for(int i=0; i<n_peaks; i++) {
|
---|
107 | f_peak[i] = new TF1("peak","gaus",fit_start,fit_end);
|
---|
108 | f_peak[i]->SetLineColor(2);
|
---|
109 | f_peak[i]->SetLineWidth(1);
|
---|
110 | }
|
---|
111 |
|
---|
112 | //-------------------------------------------
|
---|
113 | //Find the baseline
|
---|
114 | //-------------------------------------------
|
---|
115 | float pedestal_mean, pedestal_rms;
|
---|
116 | // FPedestal(title_base, datafile, data, data_offset, drs_basemean, drs_gainmean, drs_triggeroffsetmean, data_roi, pixelnr, pedestal_mean, pedestal_rms);
|
---|
117 | //Return values
|
---|
118 | //Value of maximal probability: -2.225 +- 4.3144
|
---|
119 | pedestal_mean = -2.225;
|
---|
120 | pedestal_rms = 4.3144;
|
---|
121 |
|
---|
122 | //-------------------------------------------
|
---|
123 | //Oscilloscope (search for peaks and fill integral into the histograms)
|
---|
124 | //-------------------------------------------
|
---|
125 | // float threshold = pedestal_mean+pedestal_rms;
|
---|
126 | float threshold = 2.5;
|
---|
127 |
|
---|
128 | //***********************
|
---|
129 | FOscilloscopeAllPx(datafile, data, data_offset, data_num, data_px, drs_basemean, drs_gainmean, drs_triggeroffsetmean, data_roi, threshold, spectrum);
|
---|
130 |
|
---|
131 | canv_spect->cd();
|
---|
132 | spectrum[0]->Draw();
|
---|
133 | canv_spect->Modified();
|
---|
134 | canv_spect->Update();
|
---|
135 | //***********************
|
---|
136 | // fits datafile2("20110804_025.fits");
|
---|
137 | // if (!datafile2)
|
---|
138 | // {
|
---|
139 | // cout << "Couldn't properly open the datafile2." << endl;
|
---|
140 | // return 1;
|
---|
141 | // }
|
---|
142 | // FOpenDataFile(datafile2, data, data_offset, data_num, data_n, data_roi, data_px);
|
---|
143 | // FOscilloscopeAllPx(datafile2, data, data_offset, data_num, data_px, drs_basemean, drs_gainmean, drs_triggeroffsetmean, data_roi, threshold, spectrum);//
|
---|
144 | // canv_spect->cd();
|
---|
145 | // spectrum[0]->Draw();
|
---|
146 | // canv_spect->Modified();
|
---|
147 | // canv_spect->Update();
|
---|
148 | ////***********************
|
---|
149 | // fits datafile3("20110804_026.fits");
|
---|
150 | // if (!datafile3)
|
---|
151 | // {
|
---|
152 | // cout << "Couldn't properly open the datafile3." << endl;
|
---|
153 | // return 1;
|
---|
154 | // }
|
---|
155 | // FOpenDataFile(datafile3, data, data_offset, data_num, data_n, data_roi, data_px);
|
---|
156 | // FOscilloscopeAllPx(datafile3, data, data_offset, data_num, data_px, drs_basemean, drs_gainmean, drs_triggeroffsetmean, data_roi, threshold, spectrum);
|
---|
157 | //
|
---|
158 | // canv_spect->cd();
|
---|
159 | // spectrum[0]->Draw();
|
---|
160 | // canv_spect->Modified();
|
---|
161 | // canv_spect->Update();
|
---|
162 | ////***********************
|
---|
163 | // fits datafile4("20110804_027.fits");
|
---|
164 | // if (!datafile4)
|
---|
165 | // {
|
---|
166 | // cout << "Couldn't properly open the datafile4." << endl;
|
---|
167 | // return 1;
|
---|
168 | // }
|
---|
169 | // FOpenDataFile(datafile4, data, data_offset, data_num, data_n, data_roi, data_px);
|
---|
170 | // FOscilloscopeAllPx(datafile4, data, data_offset, data_num, data_px, drs_basemean, drs_gainmean, drs_triggeroffsetmean, data_roi, threshold, spectrum);
|
---|
171 | //
|
---|
172 | // canv_spect->cd();
|
---|
173 | // spectrum[0]->Draw();
|
---|
174 | // canv_spect->Modified();
|
---|
175 | // canv_spect->Update();
|
---|
176 | //***********************
|
---|
177 |
|
---|
178 | //-------------------------------------------
|
---|
179 | //Fit the histograms and store the parameters into parread
|
---|
180 | //parread_dist: peak difference (gain) per pixel, parread_x: x-Values for the TGraph
|
---|
181 | //-------------------------------------------
|
---|
182 | Double_t parread[data_px][5+2*n_peaks];
|
---|
183 | Double_t parread_tmp[5+2*n_peaks];
|
---|
184 | Double_t parread_dist[data_px];
|
---|
185 | Double_t parread_x[data_px];
|
---|
186 | for(int i=0; i<data_px; i++) {
|
---|
187 | f_peaks->SetParameters(par_init);
|
---|
188 | if(!(spectrum[i]->Fit(f_peaks,"NR"))) {
|
---|
189 | // std::cout << "Fit successful." << std::endl;
|
---|
190 | f_peaks->GetParameters(&parread_tmp[0]);
|
---|
191 | for(int j=0; j<5+2*n_peaks; j++) {
|
---|
192 | parread[i][j] = parread_tmp[j];
|
---|
193 | }
|
---|
194 | parread_dist[i] = parread_tmp[1];
|
---|
195 | parread_x[i] = i;
|
---|
196 | }
|
---|
197 | else {
|
---|
198 | for(int j=0; j<5+2*n_peaks; j++) {
|
---|
199 | parread[i][j] = 0;
|
---|
200 | }
|
---|
201 | parread_dist[i] = 0;
|
---|
202 | parread_x[i] = i;
|
---|
203 | }
|
---|
204 | }
|
---|
205 |
|
---|
206 | //-------------------------------------------
|
---|
207 | //Plot the gain of all pixel
|
---|
208 | //-------------------------------------------
|
---|
209 | canv_gain->cd();
|
---|
210 | TGraph* plot_gain = new TGraph(data_px,parread_x,parread_dist);
|
---|
211 | plot_gain->GetYaxis()->SetRangeUser(0,150);
|
---|
212 | plot_gain->Draw("A*");
|
---|
213 | canv_gain->Modified();
|
---|
214 | canv_gain->Update();
|
---|
215 |
|
---|
216 | canv_spect->cd();
|
---|
217 | canv_spect->SetLogy();
|
---|
218 |
|
---|
219 | //-------------------------------------------
|
---|
220 | //Draw the spectrum of pixel where the gain is out of limits
|
---|
221 | //Drawn are the fitted function (f_peaks) and its components (f_peak[i], f_pedestal)
|
---|
222 | //-------------------------------------------
|
---|
223 | char temp = 'x';
|
---|
224 | std::cout << "Plot the spectra out of limits: Enter for next, 'a' to abort." << std::endl;
|
---|
225 | for(int i=0; i<data_px; i++) {
|
---|
226 | if((parread_dist[i]<80)||(parread_dist[i]>105)) {
|
---|
227 | std::cout << "Gain out of limits: Px " << i << " at " << parread_dist[i] << std::endl;
|
---|
228 | spectrum[i]->Draw();
|
---|
229 |
|
---|
230 | f_peaks->SetParameters(&parread[i][0]);
|
---|
231 | f_peak[0]->SetParameters(parread[i][2],parread[i][0],parread[i][3]);
|
---|
232 | f_peak[1]->SetParameters(parread[i][4],parread[i][0]+parread[i][1],parread[i][5]);
|
---|
233 | // f_peak[2]->SetParameters(parread[i][6],parread[i][0]+2*parread[i][1],parread[i][7]);
|
---|
234 | // f_peak[3]->SetParameters(parread[i][8],parread[i][0]+3*parread[i][1],parread[i][9]);
|
---|
235 | // f_peak[4]->SetParameters(parread[i][10],parread[i][12],parread[i][11]);
|
---|
236 | f_pedestal->SetParameters(parread[i][6],parread[i][7],parread[i][8]);
|
---|
237 |
|
---|
238 | f_peaks->Draw("same");
|
---|
239 | for(int i=0; i<n_peaks; i++) {
|
---|
240 | f_peak[i]->Draw("same");
|
---|
241 | }
|
---|
242 | f_pedestal->Draw("same");
|
---|
243 |
|
---|
244 | canv_spect->Modified();
|
---|
245 | canv_spect->Update();
|
---|
246 | temp='x';
|
---|
247 | while ((temp!='\n') && (temp!='a'))
|
---|
248 | cin.get(temp);
|
---|
249 | if(temp=='a') break;
|
---|
250 | }
|
---|
251 | }
|
---|
252 |
|
---|
253 | //-------------------------------------------
|
---|
254 | //Give the possibility to draw the spectrum of any pixel
|
---|
255 | //-------------------------------------------
|
---|
256 | canv_spect->cd();
|
---|
257 | Int_t plotspect_nr;
|
---|
258 | std::cout << "Enter the number of the spectrum to plot (-1 to quit): ";
|
---|
259 | std::cin >> plotspect_nr;
|
---|
260 | while(plotspect_nr>=0) {
|
---|
261 | plotspect_nr = plotspect_nr % data_px;
|
---|
262 | spectrum[plotspect_nr]->Draw();
|
---|
263 |
|
---|
264 | f_peaks->SetParameters(&parread[plotspect_nr][0]);
|
---|
265 | f_peak[0]->SetParameters(parread[plotspect_nr][2],parread[plotspect_nr][0],parread[plotspect_nr][3]);
|
---|
266 | f_peak[1]->SetParameters(parread[plotspect_nr][4],parread[plotspect_nr][0]+parread[plotspect_nr][1],parread[plotspect_nr][5]);
|
---|
267 | // f_peak[2]->SetParameters(parread[plotspect_nr][6],parread[plotspect_nr][0]+2*parread[plotspect_nr][1],parread[plotspect_nr][7]);
|
---|
268 | // f_peak[3]->SetParameters(parread[plotspect_nr][8],parread[plotspect_nr][0]+3*parread[plotspect_nr][1],parread[plotspect_nr][9]);
|
---|
269 | // f_peak[4]->SetParameters(parread[plotspect_nr][10],parread[plotspect_nr][12],parread[plotspect_nr][11]);
|
---|
270 | f_pedestal->SetParameters(parread[plotspect_nr][6],parread[plotspect_nr][7],parread[plotspect_nr][8]);
|
---|
271 |
|
---|
272 | f_peaks->Draw("same");
|
---|
273 | for(int i=0; i<n_peaks; i++) {
|
---|
274 | f_peak[i]->Draw("same");
|
---|
275 | }
|
---|
276 | f_pedestal->Draw("same");
|
---|
277 |
|
---|
278 | canv_spect->Modified();
|
---|
279 | canv_spect->Update();
|
---|
280 |
|
---|
281 | std::cout << "Enter the number of the spectrum to plot (-1 to quit): ";
|
---|
282 | std::cin >> plotspect_nr;
|
---|
283 | }
|
---|
284 | outfile.Write();
|
---|
285 | outfile.Close();
|
---|
286 | return 0;
|
---|
287 | }
|
---|