| 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 |
|
|---|
| 9 | #include <stdint.h>
|
|---|
| 10 | #include <cstdio>
|
|---|
| 11 |
|
|---|
| 12 | #include "fits.h"
|
|---|
| 13 | #include "FOpenDataFile.c"
|
|---|
| 14 | #include "FOpenCalibFile.c"
|
|---|
| 15 | #include "FPedestal.c"
|
|---|
| 16 | #include "FIntFixedPosAllPx.c"
|
|---|
| 17 |
|
|---|
| 18 | #define n_peaks 2
|
|---|
| 19 |
|
|---|
| 20 | int poissonanalysis(const char *name, const char *drsname, UInt_t integration_delay, UInt_t integration_size, UInt_t spect_max )
|
|---|
| 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 | // TFile f("spectra.root","RECREATE");
|
|---|
| 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 | //Open the file
|
|---|
| 60 | //-------------------------------------------
|
|---|
| 61 | fits datafile(name);
|
|---|
| 62 | if (!datafile)
|
|---|
| 63 | {
|
|---|
| 64 | cout << "Couldn't properly open the datafile." << endl;
|
|---|
| 65 | return 1;
|
|---|
| 66 | }
|
|---|
| 67 | FOpenDataFile(datafile, data, data_offset, data_num, data_n, data_roi, data_px);
|
|---|
| 68 |
|
|---|
| 69 | //-------------------------------------------
|
|---|
| 70 | //Create the canvas, plot and title
|
|---|
| 71 | //-------------------------------------------
|
|---|
| 72 | char title_spect[500];
|
|---|
| 73 | char name_spect[50];
|
|---|
| 74 | // std::sprintf(title_spect,"Spectrum of Px %i (data: %s, DRS: %s)",pixelnr, name,drsname);
|
|---|
| 75 | TCanvas *canv_spect = new TCanvas( "canv_spect", "Spectrum", 950, 10, 700, 500 );
|
|---|
| 76 | TH1F* spectrum[data_px];
|
|---|
| 77 | for(int i=0; i<data_px; i++) {
|
|---|
| 78 | std::sprintf(title_spect,"Spectrum of Px %i, %i-%i (data: %s, DRS: %s)",i,integration_delay,integration_delay+integration_size,name,drsname);
|
|---|
| 79 | std::sprintf(name_spect,"spect%i",i);
|
|---|
| 80 | // spectrum[i] = new TH1F(name_spect,title_spect,400,-150,650);
|
|---|
| 81 | spectrum[i] = new TH1F(name_spect,title_spect,400,-150,spect_max);
|
|---|
| 82 | spectrum[i]->GetXaxis()->SetTitle("Pulse size (a.u.)");
|
|---|
| 83 | spectrum[i]->GetYaxis()->SetTitle("Counts");
|
|---|
| 84 | }
|
|---|
| 85 |
|
|---|
| 86 | // TCanvas *canv_gain= new TCanvas( "canv_gain", "Gain in arbitrary units", 50, 500, 1800, 800 );
|
|---|
| 87 | //-------------------------------------------
|
|---|
| 88 | //Define the fit
|
|---|
| 89 | //-------------------------------------------
|
|---|
| 90 | // int fit_start = 20;
|
|---|
| 91 | // int fit_end = 200;
|
|---|
| 92 | // 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);
|
|---|
| 93 | // Double_t par_init[5+2*n_peaks] = {70,90,100,15,10,15,10,30,30};
|
|---|
| 94 | // Double_t parread_tmp[5+2*n_peaks];
|
|---|
| 95 | // Double_t parread[data_px][5+2*n_peaks];
|
|---|
| 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
|
|---|
| 124 | //-------------------------------------------
|
|---|
| 125 | // float threshold = pedestal_mean+pedestal_rms;
|
|---|
| 126 | // float threshold = 2.5;
|
|---|
| 127 |
|
|---|
| 128 | //***********************
|
|---|
| 129 | // UInt_t integration_size = 5;
|
|---|
| 130 | // UInt_t integration_delay = 238;
|
|---|
| 131 |
|
|---|
| 132 | FIntFixedPosAllPx(datafile, data, data_offset, data_num, data_px, drs_basemean, drs_gainmean, drs_triggeroffsetmean, data_roi, integration_size, integration_delay, spectrum);
|
|---|
| 133 |
|
|---|
| 134 | canv_spect->cd();
|
|---|
| 135 | spectrum[0]->Draw();
|
|---|
| 136 | canv_spect->Modified();
|
|---|
| 137 | canv_spect->Update();
|
|---|
| 138 |
|
|---|
| 139 | // Double_t parread_dist[data_px];
|
|---|
| 140 | // Double_t parread_x[data_px];
|
|---|
| 141 | // for(int i=0; i<data_px; i++) {
|
|---|
| 142 | // f_peaks->SetParameters(par_init);
|
|---|
| 143 | // if(!(spectrum[i]->Fit(f_peaks,"NR"))) {
|
|---|
| 144 | //// std::cout << "Fit successful." << std::endl;
|
|---|
| 145 | // f_peaks->GetParameters(&parread_tmp[0]);
|
|---|
| 146 | // for(int j=0; j<5+2*n_peaks; j++) {
|
|---|
| 147 | // parread[i][j] = parread_tmp[j];
|
|---|
| 148 | // }
|
|---|
| 149 | // parread_dist[i] = parread_tmp[1];
|
|---|
| 150 | // parread_x[i] = i;
|
|---|
| 151 | // }
|
|---|
| 152 | // else {
|
|---|
| 153 | // for(int j=0; j<5+2*n_peaks; j++) {
|
|---|
| 154 | // parread[i][j] = 0;
|
|---|
| 155 | // }
|
|---|
| 156 | // parread_dist[i] = 0;
|
|---|
| 157 | // parread_x[i] = i;
|
|---|
| 158 | // }
|
|---|
| 159 | // }
|
|---|
| 160 | //
|
|---|
| 161 | // canv_gain->cd();
|
|---|
| 162 | // TGraph* plot_gain = new TGraph(data_px,parread_x,parread_dist);
|
|---|
| 163 | // plot_gain->GetYaxis()->SetRangeUser(0,150);
|
|---|
| 164 | // plot_gain->Draw("A*");
|
|---|
| 165 | // canv_gain->Modified();
|
|---|
| 166 | // canv_gain->Update();
|
|---|
| 167 | //
|
|---|
| 168 | // canv_spect->cd();
|
|---|
| 169 | // canv_spect->SetLogy();
|
|---|
| 170 |
|
|---|
| 171 | //-------------------------------------------
|
|---|
| 172 | //Draw the data where the gain is out of limits
|
|---|
| 173 | //-------------------------------------------
|
|---|
| 174 | // char temp = 'x';
|
|---|
| 175 | // std::cout << "Plot the spectra out of limits: Enter for next, 'a' to abort." << std::endl;
|
|---|
| 176 | // for(int i=0; i<data_px; i++) {
|
|---|
| 177 | // if((parread_dist[i]<80)||(parread_dist[i]>105)) {
|
|---|
| 178 | // std::cout << "Gain out of limits: Px " << i << " at " << parread_dist[i] << std::endl;
|
|---|
| 179 | // spectrum[i]->Draw();
|
|---|
| 180 | //
|
|---|
| 181 | // f_peaks->SetParameters(&parread[i][0]);
|
|---|
| 182 | // f_peak[0]->SetParameters(parread[i][2],parread[i][0],parread[i][3]);
|
|---|
| 183 | // f_peak[1]->SetParameters(parread[i][4],parread[i][0]+parread[i][1],parread[i][5]);
|
|---|
| 184 | //// f_peak[2]->SetParameters(parread[i][6],parread[i][0]+2*parread[i][1],parread[i][7]);
|
|---|
| 185 | //// f_peak[3]->SetParameters(parread[i][8],parread[i][0]+3*parread[i][1],parread[i][9]);
|
|---|
| 186 | //// f_peak[4]->SetParameters(parread[i][10],parread[i][12],parread[i][11]);
|
|---|
| 187 | // f_pedestal->SetParameters(parread[i][6],parread[i][7],parread[i][8]);
|
|---|
| 188 | //
|
|---|
| 189 | // f_peaks->Draw("same");
|
|---|
| 190 | // for(int i=0; i<n_peaks; i++) {
|
|---|
| 191 | // f_peak[i]->Draw("same");
|
|---|
| 192 | // }
|
|---|
| 193 | // f_pedestal->Draw("same");
|
|---|
| 194 | //
|
|---|
| 195 | // canv_spect->Modified();
|
|---|
| 196 | // canv_spect->Update();
|
|---|
| 197 | // temp='x';
|
|---|
| 198 | // while ((temp!='\n') && (temp!='a'))
|
|---|
| 199 | // cin.get(temp);
|
|---|
| 200 | // if(temp=='a') break;
|
|---|
| 201 | // }
|
|---|
| 202 | // }
|
|---|
| 203 | //-------------------------------------------
|
|---|
| 204 | //Draw the data
|
|---|
| 205 | //-------------------------------------------
|
|---|
| 206 | canv_spect->cd();
|
|---|
| 207 | Int_t plotspect_nr;
|
|---|
| 208 | std::cout << "Enter the number of the spectrum to plot (-1 to quit): ";
|
|---|
| 209 | std::cin >> plotspect_nr;
|
|---|
| 210 | while(plotspect_nr>=0) {
|
|---|
| 211 | plotspect_nr = plotspect_nr % data_px;
|
|---|
| 212 | spectrum[plotspect_nr]->Draw();
|
|---|
| 213 |
|
|---|
| 214 | // f_peaks->SetParameters(&parread[plotspect_nr][0]);
|
|---|
| 215 | // f_peak[0]->SetParameters(parread[plotspect_nr][2],parread[plotspect_nr][0],parread[plotspect_nr][3]);
|
|---|
| 216 | // f_peak[1]->SetParameters(parread[plotspect_nr][4],parread[plotspect_nr][0]+parread[plotspect_nr][1],parread[plotspect_nr][5]);
|
|---|
| 217 | //// f_peak[2]->SetParameters(parread[plotspect_nr][6],parread[plotspect_nr][0]+2*parread[plotspect_nr][1],parread[plotspect_nr][7]);
|
|---|
| 218 | //// f_peak[3]->SetParameters(parread[plotspect_nr][8],parread[plotspect_nr][0]+3*parread[plotspect_nr][1],parread[plotspect_nr][9]);
|
|---|
| 219 | //// f_peak[4]->SetParameters(parread[plotspect_nr][10],parread[plotspect_nr][12],parread[plotspect_nr][11]);
|
|---|
| 220 | // f_pedestal->SetParameters(parread[plotspect_nr][6],parread[plotspect_nr][7],parread[plotspect_nr][8]);
|
|---|
| 221 | //
|
|---|
| 222 | // f_peaks->Draw("same");
|
|---|
| 223 | // for(int i=0; i<n_peaks; i++) {
|
|---|
| 224 | // f_peak[i]->Draw("same");
|
|---|
| 225 | // }
|
|---|
| 226 | // f_pedestal->Draw("same");
|
|---|
| 227 |
|
|---|
| 228 | canv_spect->Modified();
|
|---|
| 229 | canv_spect->Update();
|
|---|
| 230 |
|
|---|
| 231 | std::cout << "Enter the number of the spectrum to plot (-1 to quit): ";
|
|---|
| 232 | std::cin >> plotspect_nr;
|
|---|
| 233 | }
|
|---|
| 234 |
|
|---|
| 235 | // f->Write();
|
|---|
| 236 | return 0;
|
|---|
| 237 | }
|
|---|