| 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 |
|
|---|
| 20 | int 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 | }
|
|---|