Details | Last modification | View Log | RSS feed
| Rev | Author | Line No. | Line |
|---|---|---|---|
| 291 | f9daq | 1 | #include "TROOT.h" |
| 2 | #include "TFile.h" |
||
| 3 | #include "TBenchmark.h" |
||
| 4 | #include "TH1F.h" |
||
| 5 | #include "TH2F.h" |
||
| 6 | #include "TCanvas.h" |
||
| 7 | #include "TStyle.h" |
||
| 8 | #include "TPad.h" |
||
| 9 | #include "TF1.h" |
||
| 10 | #include "TGraph.h" |
||
| 11 | #include "TSpectrum.h" |
||
| 12 | #include "TGraphErrors.h" |
||
| 13 | #include "TSystem.h" |
||
| 14 | #include "TMath.h" |
||
| 15 | |||
| 16 | #define COROUT |
||
| 17 | #define SHOW_SLICES |
||
| 18 | #define NCH 20 |
||
| 19 | #define USED_CH 2 |
||
| 20 | #define TDC_BIN (25./1000.) //1 TDC bin in ns |
||
| 21 | //~ #define FIRST_CH 0 |
||
| 22 | |||
| 23 | double g_corpars[NCH][3]; |
||
| 24 | |||
| 25 | int mapii[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,11,12,13,14,15,16,17,18,19 }; |
||
| 26 | int mapij[] = { 1, 0,16,16,16,16,16,16,16,16, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6 }; |
||
| 27 | |||
| 28 | // root -l "cor.cpp(\"run045\",64,1,20,\"s\")" |
||
| 29 | void cor(char *fname="cscan3", int range=1, const int nslicex=64, int slmin=1, const int projmin=5, char *fite="s") |
||
| 30 | { |
||
| 31 | double fitw=1.0; |
||
| 32 | char skip='n'; |
||
| 33 | char fullname[256]; |
||
| 34 | |||
| 35 | //get ROOT file with histograms |
||
| 36 | char fnameroot[1024]; |
||
| 37 | TFile * rootfile; |
||
| 38 | TDirectory *dir; |
||
| 39 | |||
| 40 | sprintf(fnameroot, "root/%s.root", fname); |
||
| 41 | rootfile = (TFile *) gROOT->FindObject(fname); |
||
| 42 | if(rootfile==NULL) rootfile = new TFile(fnameroot); |
||
| 43 | if(rootfile==NULL) { |
||
| 44 | printf("Cannot open root file %s!!!\n",fnameroot); |
||
| 45 | return; |
||
| 46 | } |
||
| 47 | dir = (TDirectory*) rootfile; |
||
| 48 | |||
| 49 | |||
| 50 | // set draw style |
||
| 51 | gStyle->SetOptStat("ne"); |
||
| 52 | gStyle->SetPalette(1, 0); |
||
| 53 | |||
| 54 | gStyle->SetPaperSize(TStyle::kA4); |
||
| 55 | gStyle->SetStatBorderSize(1); |
||
| 56 | gStyle->SetFrameBorderMode(0); |
||
| 57 | gStyle->SetFrameFillColor(0); |
||
| 58 | gStyle->SetCanvasBorderMode(0); |
||
| 59 | gStyle->SetPadBorderMode(0); |
||
| 60 | gStyle->SetPadColor(0); |
||
| 61 | gStyle->SetCanvasColor(0); |
||
| 62 | gStyle->SetStatColor(0); |
||
| 63 | gStyle->SetOptFit(11); |
||
| 64 | |||
| 65 | gStyle->SetPadRightMargin(0.1); |
||
| 66 | |||
| 67 | char hname[256]; |
||
| 68 | TH1F *hp1d; TH2F *hp2d; |
||
| 69 | |||
| 70 | int ch=0; |
||
| 71 | int nbinsx, deltax, bin0, bin1; |
||
| 72 | double binc; |
||
| 73 | TH1F *hprojx[nslicex]; |
||
| 74 | |||
| 75 | TF1 *f_fit = 0; |
||
| 76 | TF1 *fg = new TF1("fg", "gaus(0)"); |
||
| 77 | fg->SetParNames("Constant","Mean","Sigma"); |
||
| 78 | TF1 *fgg = new TF1("fgg", "gaus(0)+gaus(3)"); |
||
| 79 | fgg->SetParNames("Constant","Mean","Sigma","Constant2","Mean2","Sigma2"); |
||
| 80 | TF1 *fggg = new TF1("fgg", "gaus(0)+gaus(3)+gaus(6)"); |
||
| 81 | fggg->SetParNames("Constant","Mean","Sigma","Constant2","Mean2","Sigma2","Constant3","Mean3","Sigma3"); |
||
| 82 | TF1 *fitsqrt = new TF1("fitsqrt","[0]+[1]/TMath::Sqrt(x-[2])"); |
||
| 83 | |||
| 84 | TF1 *fcg = new TF1("fcg", "pol0(0)+gaus(1)"); |
||
| 85 | fcg->SetParNames("C", "Constant","Mean","Sigma"); |
||
| 86 | |||
| 87 | TF1 *fcgg = new TF1("fcgg", "pol0(0)+gaus(1)+gaus(4)"); |
||
| 88 | fcgg->SetParName(0,"Const"); |
||
| 89 | fcgg->SetParName(1,"G1_Const"); fcgg->SetParName(2,"G1_Mean" ); fcgg->SetParName(3,"G1_Sigma" ); |
||
| 90 | fcgg->SetParName(4,"G2_Const"); fcgg->SetParName(5,"G2_Mean" ); fcgg->SetParName(6,"G2_Sigma" ); |
||
| 91 | |||
| 92 | TGraphErrors *gcor[NCH]; |
||
| 93 | double fitcenter, fitampl; |
||
| 94 | |||
| 95 | double fitsigmas[2]; |
||
| 96 | int fitminsigmai; |
||
| 97 | double fiterror, fitmean; |
||
| 98 | |||
| 99 | #ifdef COROUT |
||
| 100 | FILE *fp; |
||
| 101 | //open file to save parameters |
||
| 102 | sprintf(fullname, "data/%s_cor.txt", fname); |
||
| 103 | if( (fp=fopen(fullname, "wt")) == NULL ) |
||
| 104 | printf("Cannot create parameter file %s !!!\n", fullname); |
||
| 105 | else |
||
| 106 | printf("Created parameter file %s\n", fullname); |
||
| 107 | #endif |
||
| 108 | |||
| 109 | |||
| 110 | TCanvas *c1 = new TCanvas("Cor.Fits", "Cor.Fits", 0, 0, 1300, 450); |
||
| 111 | c1->Divide(2,1); |
||
| 112 | |||
| 113 | |||
| 114 | #ifdef SHOW_SLICES |
||
| 115 | TCanvas *c0 = new TCanvas("Slices", "Slices", 0, 520, 1300, 470); |
||
| 116 | c0->Divide(5,5); |
||
| 117 | #endif |
||
| 118 | const int c0pads = 25; |
||
| 119 | |||
| 120 | |||
| 121 | if(nslicex==0) { |
||
| 122 | #ifdef COROUT |
||
| 123 | for(int j=0;j<NCH; j++) fprintf(fp,"%lf %lf %lf\n", 0.0,0.005,0.0); |
||
| 124 | gSystem->Exit(1); |
||
| 125 | return; |
||
| 126 | #endif |
||
| 127 | } else { |
||
| 128 | #ifdef FIRST_CH |
||
| 129 | ch=FIRST_CH; |
||
| 130 | #else |
||
| 131 | for(ch=0;ch<USED_CH; ch++) |
||
| 132 | #endif |
||
| 133 | { |
||
| 134 | |||
| 135 | gcor[ch] = new TGraphErrors(nslicex); |
||
| 136 | sprintf(hname,"TDC Corection ch%d;QDC;TDC [ps]",ch); |
||
| 137 | gcor[ch]->SetTitle(hname); |
||
| 138 | if(range == 0) { |
||
| 139 | sprintf(hname, "hdiffcor_low_%d_%d",mapii[ch],mapij[ch]); hp2d = (TH2F *) dir->Get(hname); |
||
| 140 | } else if(range == 2) { |
||
| 141 | sprintf(hname, "hdiffcor_hi_%d_%d",mapii[ch],mapij[ch]); hp2d = (TH2F *) dir->Get(hname); |
||
| 142 | } else { |
||
| 143 | sprintf(hname, "hdiffcor_%d_%d",mapii[ch],mapij[ch]); hp2d = (TH2F *) dir->Get(hname); |
||
| 144 | } |
||
| 145 | //~ sprintf(hname, "hcor%d",ch); hp2d = (TH2F *) dir->Get(hname); |
||
| 146 | nbinsx=hp2d->GetNbinsX(); |
||
| 147 | deltax=nbinsx/nslicex; |
||
| 148 | |||
| 149 | c0->Clear();c0->Divide(8,4); |
||
| 150 | for(int i=slmin; i<nslicex; i++) { |
||
| 151 | bin0=i*deltax+1; |
||
| 152 | bin1=(i+1)*deltax+1; |
||
| 153 | binc=(hp2d->GetXaxis()->GetBinCenter(bin0)+hp2d->GetXaxis()->GetBinCenter(bin1))/2.0; |
||
| 154 | |||
| 155 | sprintf(hname, "hprojx%d",i); |
||
| 156 | hprojx[i]=(TH1F*)hp2d->ProjectionY(hname, bin0, bin1); |
||
| 157 | |||
| 158 | //~ (hprojx[i]->GetXaxis())->SetRangeUser(-1, 2); |
||
| 159 | if( hprojx[i]->GetMaximum() > projmin ) { |
||
| 160 | |||
| 161 | fitcenter = hprojx[i]->GetBinCenter(hprojx[i]->GetMaximumBin()); |
||
| 162 | fitampl = hprojx[i]->GetMaximum(); |
||
| 163 | |||
| 164 | //------/ |
||
| 165 | if(i<1024) { |
||
| 166 | |||
| 167 | //~ if( (ch<8) && (i<3) && (fitcenter < 0.4) ) fitcenter = 0.7; |
||
| 168 | |||
| 169 | f_fit = fcg; |
||
| 170 | f_fit->SetParameters(fitampl*0.1, fitampl*0.9, fitcenter, 0.1); |
||
| 171 | //~ |
||
| 172 | //~ f_fit = fcgg; |
||
| 173 | //~ f_fit->SetParameters(fitampl*0.01, |
||
| 174 | //~ fitampl*0.4, 0, 0.4, |
||
| 175 | //~ fitampl*0.4, 0, 0.2); |
||
| 176 | |||
| 177 | //~ f_fit = fgg; |
||
| 178 | //~ f_fit->SetParameters(fitampl*0.9, fitcenter, 0.1, fitampl*0.1, fitcenter, 0.5); |
||
| 179 | //~ |
||
| 180 | //~ f_fit = fg; |
||
| 181 | //~ f_fit->SetParameters(fitampl*0.9, fitcenter, 0.1); |
||
| 182 | |||
| 183 | //~ f_fit->SetParLimits(0, 0, fitampl*3); |
||
| 184 | |||
| 185 | #ifdef SHOW_SLICES |
||
| 186 | c0->cd(i%c0pads + 1); //c0->cd(i%4 + 1)->SetLogy(); |
||
| 187 | //~ hprojx[i]->Fit(f_fit,"QL", "", fitcenter-1.0*fitw, fitcenter+0.5*fitw); |
||
| 188 | hprojx[i]->Fit(f_fit,"QL", ""); |
||
| 189 | //c0->Update(); |
||
| 190 | //if( !((i+1)%9) && (skip!='y') ) {c0->Update(); printf("Skip?: "); scanf("%c",&skip);} |
||
| 191 | //if( (skip=='q') || (skip=='Q') ) return; |
||
| 192 | //hprojx[i]->DrawClone(); |
||
| 193 | //fgg->SetRange(-1,2); |
||
| 194 | //fgg->DrawClone("LSAME"); |
||
| 195 | #else |
||
| 196 | //~ hprojx[i]>Fit(fgg,"0QL", "", fitcenter-1.0*fitw, fitcenter+2.0*fitw); |
||
| 197 | hprojx[i]->Fit(f_fit,"0QL", ""); |
||
| 198 | #endif |
||
| 199 | |||
| 200 | //~ fitsigmas[0] = TMath::Abs(f_fit->GetParameter(2)); |
||
| 201 | //~ fitsigmas[1] = TMath::Abs(f_fit->GetParameter(5)); |
||
| 202 | //~ fitminsigmai = TMath::LocMin(2,fitsigmas); |
||
| 203 | //~ fitmean = f_fit->GetParameter(1 + fitminsigmai*3); |
||
| 204 | //~ fiterror = TMath::Abs(f_fit->GetParameter(2 + fitminsigmai*3)); |
||
| 205 | //~ printf("fitminsigmai = %d {%lf, %lf}\n", fitminsigmai, fitsigmas[0], fitsigmas[1]); |
||
| 206 | //~ |
||
| 207 | //~ fitmean = f_fit->GetParameter(1); |
||
| 208 | //~ fiterror = TMath::Abs(f_fit->GetParameter(2)); |
||
| 209 | //~ |
||
| 210 | |||
| 211 | // fcg |
||
| 212 | fitmean = f_fit->GetMaximumX(fitcenter-1.0*fitw, fitcenter+0.5*fitw); |
||
| 213 | fiterror = TMath::Abs(f_fit->GetParameter(3)); |
||
| 214 | |||
| 215 | //~ // fcgg |
||
| 216 | //~ fitmean = f_fit->GetMaximumX(fitcenter-1.0*fitw, fitcenter+1.0*fitw); |
||
| 217 | //~ double HalfMax = (f_fit->GetMaximum(fitcenter-1.0*fitw, fitcenter+1.0*fitw) + f_fit->GetParameter(0))/2.0; |
||
| 218 | //~ double MinHalfMax = f_fit->GetX(HalfMax, fitcenter-1.0*fitw, fitcenter); |
||
| 219 | //~ double MaxHalfMax = f_fit->GetX(HalfMax, fitcenter, fitcenter+1.0*fitw); |
||
| 220 | //~ double FWHMc = MaxHalfMax - MinHalfMax; |
||
| 221 | //~ fiterror = TMath::Abs(FWHMc); |
||
| 222 | //~ //------/ |
||
| 223 | } else { |
||
| 224 | fgg->SetParameters(fitampl, fitcenter, 0.05, |
||
| 225 | fitampl/15, fitcenter, 0.5); |
||
| 226 | |||
| 227 | fgg->SetParLimits(0, fitampl*0.3, fitampl*1.1); |
||
| 228 | fgg->SetParLimits(3, fitampl*0.01, fitampl*0.7); |
||
| 229 | |||
| 230 | fgg->SetParLimits(1, -1, 1); |
||
| 231 | fgg->SetParLimits(4, -1, 1); |
||
| 232 | |||
| 233 | fgg->SetParLimits(2, 0, 0.300); |
||
| 234 | fgg->SetParLimits(5, 0.3, 4.0); |
||
| 235 | |||
| 236 | #ifdef SHOW_SLICES |
||
| 237 | c0->cd(i%c0pads + 1); //c0->cd(i%4 + 1)->SetLogy(); |
||
| 238 | hprojx[i]->Fit(fgg,"QL", "", fitcenter-1.0*fitw, fitcenter+2.0*fitw); |
||
| 239 | //c0->Update(); |
||
| 240 | //if( !((i+1)%9) && (skip!='y') ) {c0->Update(); printf("Skip?: "); scanf("%c",&skip);} |
||
| 241 | //if( (skip=='q') || (skip=='Q') ) return; |
||
| 242 | //hprojx[i]->DrawClone(); |
||
| 243 | //fgg->SetRange(-1,2); |
||
| 244 | //fgg->DrawClone("LSAME"); |
||
| 245 | #else |
||
| 246 | hprojx[i]>Fit(fgg,"0QL", "", fitcenter-1.0*fitw, fitcenter+2.0*fitw); |
||
| 247 | #endif |
||
| 248 | |||
| 249 | fitsigmas[0] = TMath::Abs(fgg->GetParameter(2)); |
||
| 250 | fitsigmas[1] = TMath::Abs(fgg->GetParameter(5)); |
||
| 251 | fitminsigmai = TMath::LocMin(2,fitsigmas); |
||
| 252 | //printf("fitminsigmai = %d {%.1lf, %.1lf}\n", fitminsigmai, fitsigmas[0]*1000, fitsigmas[1]*1000); |
||
| 253 | fitmean = fgg->GetParameter(1 + fitminsigmai*3); |
||
| 254 | fiterror = TMath::Abs(fgg->GetParameter(2 + fitminsigmai*3)); |
||
| 255 | //------/ |
||
| 256 | } //if(i<4) |
||
| 257 | |||
| 258 | printf(">>> ADC %3d - %3d -> %5.1lf ps\n", bin0, bin1, fiterror*1000.); |
||
| 259 | |||
| 260 | gcor[ch]->SetPoint(i, binc, fitmean); |
||
| 261 | // weight = slice fit sigma (default) |
||
| 262 | if( strcmp(fite, "s")==0 ) |
||
| 263 | gcor[ch]->SetPointError(i, 0.0, fiterror); |
||
| 264 | // weight = slice maximum bin content ~ n of events |
||
| 265 | else if( strcmp(fite, "h")==0 ) |
||
| 266 | gcor[ch]->SetPointError(i, 0.0, 2./sqrt(hprojx[i]->GetMaximum())); |
||
| 267 | // weight = both |
||
| 268 | else if( strcmp(fite, "b")==0 ) |
||
| 269 | gcor[ch]->SetPointError(i, 0, 100.*fiterror/hprojx[i]->GetMaximum()); |
||
| 270 | else if( strcmp(fite, "k")==0 ) |
||
| 271 | gcor[ch]->SetPointError(i, 0, 1./sqrt(hprojx[i]->GetMaximum())); |
||
| 272 | |||
| 273 | } //if( hprojx[i]->GetMaximum() > projmin ) |
||
| 274 | }// for(int i=slmin; i<nslicex; i++) |
||
| 275 | #ifdef SHOW_SLICES |
||
| 276 | c0->Update(); |
||
| 277 | sprintf(fullname, "gif/%s_ch_%d.gif", fname, ch); c0->SaveAs(fullname); |
||
| 278 | #endif |
||
| 279 | |||
| 280 | |||
| 281 | c1->cd(ch+1); gPad->SetLogz(); |
||
| 282 | |||
| 283 | fitsqrt->SetLineWidth(2); |
||
| 284 | gStyle->SetOptStat("e"); |
||
| 285 | gStyle->SetOptFit(11); |
||
| 286 | (gcor[ch]->GetYaxis())->SetRangeUser((hp2d->GetYaxis())->GetXmin(), (hp2d->GetYaxis())->GetXmax()); |
||
| 287 | //~ (gcor[ch]->GetYaxis())->SetRangeUser(-2,3); |
||
| 288 | //gcor[ch]->Draw("AP"); |
||
| 289 | |||
| 290 | fitsqrt->SetParameters(0, 10, 50); |
||
| 291 | |||
| 292 | fitsqrt->SetRange(TMath::Ceil(fitsqrt->GetParameter(2)),(gcor[ch]->GetXaxis())->GetXmax()); |
||
| 293 | //~ fitsqrt->SetRange(TMath::Ceil(fitsqrt->GetParameter(2)),3*256.); |
||
| 294 | //fitsqrt->SetParameters(-0.25, 3, 55); |
||
| 295 | //fitsqrt->SetParLimits(0,-4,8); |
||
| 296 | //~ fitsqrt->SetParLimits(1,0,20); |
||
| 297 | //~ fitsqrt->SetParLimits(2,-100,2000); |
||
| 298 | fitsqrt->SetParLimits(2,0,2000); |
||
| 299 | //~ #ifdef FIRST_CH |
||
| 300 | //~ if(ch==FIRST_CH) gcor[ch]->Fit(fitsqrt, "0Q",""); |
||
| 301 | //~ #else |
||
| 302 | //~ if(ch==0) gcor[ch]->Fit(fitsqrt, "0Q",""); |
||
| 303 | //~ #endif |
||
| 304 | gcor[ch]->Fit(fitsqrt, "0QR",""); |
||
| 305 | //(gcor[ch]->GetYaxis())->UnZoom(); |
||
| 306 | sprintf(fullname, "SiPM_%d; Charge [200 fC/bin]; TDC [ns]", ch+1); |
||
| 307 | hp2d->SetTitle(fullname); |
||
| 308 | //~ (hp2d->GetXaxis())->SetRangeUser(0.,4*256.); |
||
| 309 | //~ (hp2d->GetXaxis())->SetRangeUser(0.,3*256.); |
||
| 310 | //(hp2d->GetYaxis())->SetRangeUser(-1.,3.); |
||
| 311 | //~ (hp2d->GetYaxis())->SetRangeUser(-2.5,2.5); |
||
| 312 | hp2d->DrawCopy("COLZ"); |
||
| 313 | fitsqrt->SetRange(TMath::Ceil(fitsqrt->GetParameter(2)),8*256.); |
||
| 314 | //~ fitsqrt->SetRange(TMath::Ceil(fitsqrt->GetParameter(2)),(gcor[ch]->GetXaxis())->GetXmax()); |
||
| 315 | fitsqrt->DrawCopy("LSAME"); |
||
| 316 | gcor[ch]->Draw("PSAME"); |
||
| 317 | |||
| 318 | sprintf(fullname, "gif/%s_cor.gif", fname); c1->SaveAs(fullname); |
||
| 319 | |||
| 320 | printf("[ch.%d - ch.%d] %lf %lf\n", mapii[ch], mapij[ch], fitsqrt->GetParameter(1), fitsqrt->GetParameter(2)); |
||
| 321 | #ifdef COROUT |
||
| 322 | fprintf(fp,"%lf %lf %lf\n", fitsqrt->GetParameter(0), fitsqrt->GetParameter(1), fitsqrt->GetParameter(2)); |
||
| 323 | #endif |
||
| 324 | g_corpars[ch][0]=fitsqrt->GetParameter(0); |
||
| 325 | g_corpars[ch][1]=fitsqrt->GetParameter(1); |
||
| 326 | g_corpars[ch][2]=fitsqrt->GetParameter(2); |
||
| 327 | |||
| 328 | } |
||
| 329 | } |
||
| 330 | |||
| 331 | #ifdef COROUT |
||
| 332 | for(int i=USED_CH;i<NCH; i++) fprintf(fp,"%lf %lf %lf\n", 0.0,0.005,0.0); |
||
| 333 | if(fp) fclose(fp); |
||
| 334 | #endif |
||
| 335 | |||
| 336 | //rootfile->Close(); |
||
| 337 | } |