source: fact/tools/rootmacros/peakfinderscope.C@ 14748

Last change on this file since 14748 was 12365, checked in by kraehenb, 13 years ago
More comments in calscope_batch, and exclude spikes in the peakfinderscope.
File size: 6.0 KB
Line 
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
8#include <stdint.h>
9#include <cstdio>
10
11#define HAVE_ZLIB
12#include "fits.h"
13#include "FOpenDataFile.c"
14#include "FOpenCalibFile.c"
15#include "FPedestal.c"
16#include "FOscilloscope.c"
17
18#define n_peaks 4
19
20int peakfinderscope(const char *name, const char *drsname, size_t pixelnr)
21{
22//******************************************************************************
23//Read a datafile and plot the DRS-calibrated data
24//ATTENTION: only works for ROI=1024
25// (array indices of the calibration wrong otherwise)
26//******************************************************************************
27
28 gROOT->SetStyle("Plain");
29
30//-------------------------------------------
31//Define the data variables
32//-------------------------------------------
33 vector<int16_t> data;
34 vector<int16_t> data_offset;
35 unsigned int data_num;
36 size_t data_n;
37 UInt_t data_px;
38 UInt_t data_roi;
39
40//-------------------------------------------
41//Get the DRS calibration
42//-------------------------------------------
43 size_t drs_n;
44 vector<float> drs_basemean;
45 vector<float> drs_gainmean;
46 vector<float> drs_triggeroffsetmean;
47 FOpenCalibFile(drsname, drs_basemean, drs_gainmean, drs_triggeroffsetmean, drs_n);
48
49//-------------------------------------------
50//Check the sizes of the data columns
51//-------------------------------------------
52// if(drs_n!=data_n)
53// {
54// cout << "Data and DRS file incompatible (Px*ROI disagree)" << endl;
55// return 1;
56// }
57
58//-------------------------------------------
59//Create the canvas, plot and title
60//-------------------------------------------
61 char title[500];
62 std::sprintf(title,"Data: %s, DRS: %s, Px %i",name,drsname,pixelnr);
63 TCanvas *canv = new TCanvas( "canv", "Waveform", 200, 10, 700, 500 );
64// TProfile *pulseshape = new TProfile("pulseshape", title, 70, -10.5, 59.5);
65 TH2F *pulseshape = new TH2F("pulseshape",title,70,-10.5,59.5,350,-10.5,59.5);
66 pulseshape->GetXaxis()->SetTitle("Time after trigger (bins @2 GHz)");
67 pulseshape->GetYaxis()->SetTitle("Amplitude (mV)");
68
69 char title_base[500];
70 std::sprintf(title_base,"All samples of Px %i (data: %s, DRS: %s)",pixelnr,name,drsname);
71
72 char title_spect[500];
73 std::sprintf(title_spect,"Spectrum of all pixels (data: %s, DRS: %s)",name,drsname);
74 TCanvas *canv_spect = new TCanvas( "canv_spect", "Spectrum", 950, 10, 700, 500 );
75 TH1F *spectrum = new TH1F("spectrum", title_spect,700,-200,1200);
76 spectrum->GetXaxis()->SetTitle("Pulse size (a.u.)");
77 spectrum->GetYaxis()->SetTitle("Counts");
78
79//-------------------------------------------
80//Define the fit
81//-------------------------------------------
82 int fit_start = 30;
83 int fit_end = 380;
84 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-[11])/[12])",fit_start,fit_end);
85 Double_t par[5+2*n_peaks] = {70,90,500000,15,50000,15,5000,15,500,15,10000,30,30};
86// 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);
87// Double_t par[3+2*n_peaks] = {70,90,500000,15,50000,15,5000,15,500,15,800000,20,0};
88 f_peaks->SetParameters(par);
89 f_peaks->SetLineColor(2);
90
91 TF1 *f_pedestal = new TF1("pedestal","[0]*TMath::Exp((-x-[1])/[2])",fit_start,fit_end);
92 f_pedestal->SetLineColor(2);
93 f_pedestal->SetLineWidth(1);
94
95 TF1* f_peak[n_peaks];
96 for(int i=0; i<n_peaks; i++) {
97 f_peak[i] = new TF1("peak","gaus",fit_start,fit_end);
98 f_peak[i]->SetLineColor(2);
99 f_peak[i]->SetLineWidth(1);
100 }
101
102//-------------------------------------------
103//Open the file
104//-------------------------------------------
105 fits datafile(name);
106 if (!datafile)
107 {
108 cout << "Couldn't properly open the datafile." << endl;
109 return 1;
110 }
111 FOpenDataFile(datafile, data, data_offset, data_num, data_n, data_roi, data_px);
112
113//-------------------------------------------
114//Find the baseline
115//-------------------------------------------
116 float pedestal_mean, pedestal_rms;
117// FPedestal(title_base, datafile, data, data_offset, drs_basemean, drs_gainmean, drs_triggeroffsetmean, data_roi, pixelnr, pedestal_mean, pedestal_rms);
118 //Return values
119 //Value of maximal probability: -2.225 +- 4.3144
120 pedestal_mean = -2.225;
121 pedestal_rms = 4.3144;
122
123//-------------------------------------------
124//Oscilloscope
125//-------------------------------------------
126// float threshold = pedestal_mean+pedestal_rms;
127 float threshold = 2.5;
128
129//***********************
130 FOscilloscope(datafile, data, data_offset, data_num, data_px, drs_basemean, drs_gainmean, drs_triggeroffsetmean, data_roi, threshold, pulseshape, spectrum);
131 canv->cd();
132 pulseshape->Draw();
133 canv->Modified();
134 canv->Update();
135
136 canv_spect->cd();
137 spectrum->Draw();
138 canv_spect->Modified();
139 canv_spect->Update();
140//***********************
141 spectrum->Fit(f_peaks,"R+");
142 f_peaks->GetParameters(&par[0]);
143
144 f_peak[0]->SetParameters(par[2],par[0],par[3]);
145 f_peak[1]->SetParameters(par[4],par[0]+par[1],par[5]);
146 f_peak[2]->SetParameters(par[6],par[0]+2*par[1],par[7]);
147 f_peak[3]->SetParameters(par[8],par[0]+3*par[1],par[9]);
148// f_peak[4]->SetParameters(par[10],par[12],par[11]);
149 f_pedestal->SetParameters(par[10],par[11],par[12]);
150
151 std::cout << "Crosstalk propability approx. " << ((par[4]*par[5])/(par[2]*par[3]+par[4]*par[5])) << std::endl;
152//-------------------------------------------
153//Draw the data
154//-------------------------------------------
155 canv->cd();
156 pulseshape->Draw();
157 canv->Modified();
158 canv->Update();
159
160 canv_spect->cd();
161 canv_spect->SetLogy();
162 spectrum->Draw();
163 f_peaks->Draw("same");
164
165 for(int i=0; i<n_peaks; i++) {
166 f_peak[i]->Draw("same");
167 }
168
169 f_pedestal->Draw("same");
170
171 canv_spect->Modified();
172 canv_spect->Update();
173
174 return 0;
175}
Note: See TracBrowser for help on using the repository browser.