1 | #include <TFile.h>
|
---|
2 | #include <TH2F.h>
|
---|
3 | #include <TH1D.h>
|
---|
4 | #include <TROOT.h>
|
---|
5 | #include <TF1.h>
|
---|
6 | #include <TTimer.h>
|
---|
7 | #include <TString.h>
|
---|
8 | #include <Getline.h>
|
---|
9 | #include <TCanvas.h>
|
---|
10 | #include <TGraph.h>
|
---|
11 | #include <TMath.h>
|
---|
12 | #include <TMultiGraph.h>
|
---|
13 | #include <TH1.h>
|
---|
14 | #include <TProfile.h>
|
---|
15 | #include <TStyle.h>
|
---|
16 |
|
---|
17 | #include <iostream>
|
---|
18 | #include <fstream>
|
---|
19 | using namespace std;
|
---|
20 |
|
---|
21 | //-----------------------------------------------------------------------------
|
---|
22 | // Decleration of variables
|
---|
23 | //-----------------------------------------------------------------------------
|
---|
24 | UInt_t NumberOfPixels;
|
---|
25 |
|
---|
26 | typedef struct{
|
---|
27 | UInt_t PID;
|
---|
28 | vector<float> fitParameters[9];
|
---|
29 | float amplSD;
|
---|
30 | float amplDT;
|
---|
31 | float amplMean;
|
---|
32 | } proj;
|
---|
33 | vector<proj> proj_of_pixel;
|
---|
34 |
|
---|
35 | //-----------------------------------------------------------------------------
|
---|
36 | // Functions
|
---|
37 | //-----------------------------------------------------------------------------
|
---|
38 |
|
---|
39 |
|
---|
40 | //-----------------------------------------------------------------------------
|
---|
41 | // Main function
|
---|
42 | //-----------------------------------------------------------------------------
|
---|
43 |
|
---|
44 |
|
---|
45 | int gainfit2(
|
---|
46 | const char * InputRootFileName = "../analysis/fpeak/20111109_006_fpeak.root",
|
---|
47 | const char * OutTextFileName = "../analysis/fpeak/20111109_006_gainfit.txt",
|
---|
48 | //TODO: Output into txt-file
|
---|
49 | bool showHistos = false,
|
---|
50 | bool debug = false)
|
---|
51 | {
|
---|
52 |
|
---|
53 | //-----------------------------------------------------------------------------
|
---|
54 | // Histograms, Canvases and Fit Functions
|
---|
55 | //-----------------------------------------------------------------------------
|
---|
56 |
|
---|
57 | TH1D *hPixelProjection = NULL;
|
---|
58 | TFile * file = TFile::Open( InputRootFileName );
|
---|
59 | TH2F *h = (TH2F*)file->Get("hAmplSpek_cfd");
|
---|
60 |
|
---|
61 |
|
---|
62 | Double_t par[9];
|
---|
63 | TF1 *g1 = new TF1("g1","gaus",5,15);
|
---|
64 | TF1 *g2 = new TF1("g2","gaus",15,25);
|
---|
65 | TF1 *g3 = new TF1("g3","gaus",25,35);
|
---|
66 | TF1 *g4 = new TF1("g4","gaus");
|
---|
67 | TF1 *total = new TF1("total","gaus(0)+gaus(3)+gaus(6)",5,35);
|
---|
68 | TH1F *hAmplDistribution = new TH1F("hAmplDistribution","Distribution of G-APD Amplification (1+2)", 500, 0 , 20 );
|
---|
69 | TH1F *hAmplDistribution2 = new TH1F("hAmplDistribution2","Distribution of G-APD Amplification(2+3)", 500, 0 , 20 );
|
---|
70 | TH1F *hAmplDistribution3 = new TH1F("hAmplDistribution3","Distribution of G-APD Amplification(2+3)", 500, 0 , 20 );
|
---|
71 |
|
---|
72 | TCanvas *cGainFit = new TCanvas("cGainFit", "Fit of Amplitude Spektra", 0,0, 800,800);
|
---|
73 | //TCanvas *cGainDist = new TCanvas("cGainDist", "cGainDist", 0,501, 1000,500);
|
---|
74 | cGainFit->Clear();
|
---|
75 | cGainFit->Divide(2, 2);
|
---|
76 |
|
---|
77 | //-----------------------------------------------------------------------------
|
---|
78 | // Loop over all Pixels and fit Distribution of singles, doubles and tripples
|
---|
79 | //-----------------------------------------------------------------------------
|
---|
80 |
|
---|
81 | cGainFit->cd(1);
|
---|
82 | gStyle->SetPalette(1,0);
|
---|
83 | gROOT->SetStyle("Plain");
|
---|
84 | h->SetTitle("Amplitude Spectrum of all Pixels");
|
---|
85 | h->SetAxisRange(0, 100, "Y");
|
---|
86 | h->Draw("COLZ");
|
---|
87 | proj_of_pixel.resize(h->GetNbinsX());
|
---|
88 | NumberOfPixels = h->GetNbinsX();
|
---|
89 | cout << "Number of Pixels: " << NumberOfPixels << endl;
|
---|
90 |
|
---|
91 | // Begin of Loop
|
---|
92 | for (UInt_t pixel = 0; pixel < NumberOfPixels; pixel++){
|
---|
93 |
|
---|
94 | cout << "-----------------------------------------------------------" << endl;
|
---|
95 | cout << " PID: " << pixel+1 << endl;
|
---|
96 | cout << "-----------------------------------------------------------" << endl;
|
---|
97 |
|
---|
98 | hPixelProjection = h->ProjectionY( "# " , pixel+1, pixel+1); //Projectipon of each Pixel out of Ampl.Spectrum
|
---|
99 | hPixelProjection->SetTitle("Amplitude Spectrum of one Pixels");
|
---|
100 | hPixelProjection->SetAxisRange(0, 40, "X");
|
---|
101 |
|
---|
102 | //-----------------------------------------------------------------------------
|
---|
103 | // Single Gaussian Fits and Tripple-Gaussian Fit Funciton
|
---|
104 | //-----------------------------------------------------------------------------
|
---|
105 |
|
---|
106 | total->SetLineColor(2);
|
---|
107 | cGainFit->cd(2);
|
---|
108 | gPad->SetLogy(1);
|
---|
109 | hPixelProjection->SetYTitle("Counts");
|
---|
110 | hPixelProjection->Fit(g1,"R");
|
---|
111 | hPixelProjection->Fit(g2,"R+");
|
---|
112 | hPixelProjection->Fit(g3,"R+");
|
---|
113 | g1->GetParameters(&par[0]);
|
---|
114 | g2->GetParameters(&par[3]);
|
---|
115 | g3->GetParameters(&par[6]);
|
---|
116 | total->SetParameters(par);
|
---|
117 | if( showHistos ){
|
---|
118 | hPixelProjection->Draw();
|
---|
119 | hPixelProjection->Fit(total,"R+");
|
---|
120 | }
|
---|
121 |
|
---|
122 | //TODO: Logarithmic Scale
|
---|
123 |
|
---|
124 | //-----------------------------------------------------------------------------
|
---|
125 | // Save Parameters into vetor
|
---|
126 | //-----------------------------------------------------------------------------
|
---|
127 |
|
---|
128 | // total->GetParameters(proj_of_pixel[ pixel ].fitParameters);
|
---|
129 | proj_of_pixel[ pixel ].PID = pixel+1;
|
---|
130 |
|
---|
131 |
|
---|
132 | // proj_of_pixel[ pixel ].tripple_peakSigm = total->GetParameter(8);
|
---|
133 | // proj_of_pixel[ pixel ].ampl = total->GetParameter(1) - total->GetParameter(4);
|
---|
134 |
|
---|
135 | //-----------------------------------------------------------------------------
|
---|
136 | // Draw Histograms
|
---|
137 | //-----------------------------------------------------------------------------
|
---|
138 |
|
---|
139 | cGainFit->cd(3);
|
---|
140 | gPad->SetLogy(1);
|
---|
141 | g4->SetLineColor(2);
|
---|
142 | hAmplDistribution->SetXTitle("Amplification [mV]");
|
---|
143 | hAmplDistribution->SetYTitle("Counts");
|
---|
144 | hAmplDistribution->SetAxisRange(7.5, 12.5, "X");
|
---|
145 | proj_of_pixel[ pixel ].amplSD = total->GetParameter(4) - total->GetParameter(1);
|
---|
146 | hAmplDistribution->Fill( proj_of_pixel[ pixel ].amplSD ) ;
|
---|
147 | hAmplDistribution->Fit(g4);
|
---|
148 |
|
---|
149 | cGainFit->cd(4);
|
---|
150 | gPad->SetLogy(1);
|
---|
151 | g4->SetLineColor(2);
|
---|
152 | hAmplDistribution2->SetXTitle("Amplification [mV]");
|
---|
153 | hAmplDistribution2->SetYTitle("Counts");
|
---|
154 | hAmplDistribution2->SetAxisRange(7.5, 12.5, "X");
|
---|
155 | proj_of_pixel[ pixel ].amplDT = total->GetParameter(7) - total->GetParameter(4);
|
---|
156 | hAmplDistribution2->Fill(proj_of_pixel[ pixel ].amplDT) ;
|
---|
157 | hAmplDistribution2->Fit(g4);
|
---|
158 |
|
---|
159 | if( showHistos ){
|
---|
160 | cGainFit->cd(3);
|
---|
161 | hAmplDistribution->Draw();
|
---|
162 | cGainFit->cd(4);
|
---|
163 | hAmplDistribution2->Draw();
|
---|
164 | cGainFit->Modified();
|
---|
165 | cGainFit->Update();
|
---|
166 | }
|
---|
167 | if(debug){
|
---|
168 |
|
---|
169 | TTimer timer("gSystem->ProcessEvents();", 50, kFALSE);
|
---|
170 | timer.TurnOn();
|
---|
171 | TString input = Getline("Type 'q' to exit, <return> to go on: ");
|
---|
172 | timer.TurnOff();
|
---|
173 | if (input=="q\n") {
|
---|
174 | break;
|
---|
175 | }
|
---|
176 | }
|
---|
177 | }
|
---|
178 | //-----------------------------------------------------------------------------
|
---|
179 | // End of Loop
|
---|
180 | //-----------------------------------------------------------------------------
|
---|
181 |
|
---|
182 | cGainFit->cd(2);
|
---|
183 | hPixelProjection->Draw();
|
---|
184 | hPixelProjection->Fit(total,"R+");
|
---|
185 |
|
---|
186 | cGainFit->cd(3);
|
---|
187 | hAmplDistribution->Draw();
|
---|
188 |
|
---|
189 | cGainFit->cd(4);
|
---|
190 | hAmplDistribution2->Draw();
|
---|
191 |
|
---|
192 | cGainFit->Modified();
|
---|
193 | cGainFit->Update();
|
---|
194 |
|
---|
195 | //-----------------------------------------------------------------------------
|
---|
196 | // Write into logfile
|
---|
197 | //-----------------------------------------------------------------------------
|
---|
198 | string filename = InputRootFileName;
|
---|
199 | size_t lastslash = filename.find_last_of('/');
|
---|
200 | filename = filename.substr(lastslash+1);
|
---|
201 | size_t firstdot = filename.find_first_of('.');
|
---|
202 | filename = filename.substr(0, firstdot);
|
---|
203 |
|
---|
204 | string::iterator it;
|
---|
205 | for (it=filename.begin(); it < filename.end(); ){
|
---|
206 |
|
---|
207 | if (!isdigit(*it)){
|
---|
208 | it=filename.erase(it);
|
---|
209 | }
|
---|
210 | else
|
---|
211 | ++it;
|
---|
212 | }
|
---|
213 | cout << filename << endl;
|
---|
214 |
|
---|
215 | ofstream out;
|
---|
216 | out.open( OutTextFileName );
|
---|
217 | out << "pixelID/I:gainSD/F:gainDT:filename/l" << endl;
|
---|
218 | out << "# ---- the 1st line helps to use TTree::ReadFile, for reading again this txt file with root. " << endl;
|
---|
219 | out << "#" << InputRootFileName << endl;
|
---|
220 | out << "# PixelID : gain between Single and Double Peak : gain between Double and Tripple Peak " << endl;
|
---|
221 | out << "# gain is derived from the parameters of a three gaussian fit function " << endl;
|
---|
222 | for (int pixel=0; pixel<1440; pixel++){
|
---|
223 | out << proj_of_pixel[ pixel ].PID << ";\t" ;
|
---|
224 | out << proj_of_pixel[ pixel ].amplSD << ";\t" ;
|
---|
225 | out << proj_of_pixel[ pixel ].amplDT << ";\t" ;
|
---|
226 | out << filename << endl;
|
---|
227 |
|
---|
228 | }
|
---|
229 | out.close();
|
---|
230 |
|
---|
231 | return( 0 );
|
---|
232 | }
|
---|