| 6,6 → 6,8 |
| #include "TCanvas.h" |
| #include "TStyle.h" |
| #include "TPad.h" |
| #include "TPaveText.h" |
| //#include "TLabel.h" |
| #include "TF1.h" |
| #include "TGraph.h" |
| #include "TSpectrum.h" |
| 15,11 → 17,9 |
| |
| double getNoise(TH2F*, int, int); |
| |
| int sipm(char filename[256] = "test", char plopt[256]="all", int chXstart=0, int chXend=7, int chYstart=0, int chYend=7, bool debug = false) |
| int sipm(char filename[256] = "test", char plopt[256]="all", int parameter1=0, int parameter2=7, int chYstart=0, int chYend=7, bool debug = false) |
| { |
| const int c_nChannels = 64; |
| const double c_xOffset = 0; // mm |
| const double c_yOffset = 0; |
| |
| int map[8][8]={{32,34,53,55,40,42,61,63}, |
| {48,50,37,39,56,58,45,47}, |
| 43,6 → 43,16 |
| |
| // set draw style |
| RTSetStyle(gStyle); |
| |
| // Print results to .pdf (option "p") |
| if(strstr(plopt, "p") != NULL) { |
| TCanvas* canvasFirst = new TCanvas("canvasFirst","",500,500); |
| TPaveText* text = new TPaveText(.05,.1,.95,.8); |
| text->AddText("SiPM Scan results"); |
| canvasFirst->cd(); |
| text->Draw(); |
| canvasFirst->Print("result.pdf("); |
| } |
| |
| if( strstr(plopt, "all") != NULL ) { |
| TCanvas *canvas2 = new TCanvas("canvas2","Hits x;;",2000,2000); |
| 68,10 → 78,16 |
| TCanvas *canvas10 = new TCanvas("canvas10","Ch x;;",500,500); |
| TH1F* h_hitsx; |
| canvas10->cd(); |
| int chPosition = map[parameter1][parameter2]; |
| char hname[128]; |
| sprintf(hname, "hnhitsx%d", chXstart); |
| sprintf(hname, "hnhitsx%d", chPosition); |
| h_hitsx = (TH1F*)rootfile->Get(hname); |
| h_hitsx->Draw(); |
| h_hitsx->Draw(); |
| |
| if(strstr(plopt, "p") != NULL) { |
| canvas10->Print("result.pdf"); |
| } |
| |
| } |
| |
| if( strstr(plopt, "y") != NULL ) { |
| 78,10 → 94,15 |
| TCanvas *canvas11 = new TCanvas("canvas11","Ch x;;",500,500); |
| TH1F* h_hitsy; |
| canvas11->cd(); |
| int chPosition = map[parameter1][parameter2]; |
| char hname[128]; |
| sprintf(hname, "hnhitsy%d", chXstart); |
| sprintf(hname, "hnhitsy%d", chPosition); |
| h_hitsy = (TH1F*)rootfile->Get(hname); |
| h_hitsy->Draw(); |
| |
| if(strstr(plopt, "p") != NULL) { |
| canvas11->Print("result.pdf"); |
| } |
| } |
| |
| if( strstr(plopt, "share") != NULL ) { |
| 102,7 → 123,7 |
| |
| TCanvas *canvas4 = new TCanvas("canvas4","canvas4",500,500); |
| canvas4->cd(); |
| for(int i=chXstart; i<=chXend; i++) { |
| for(int i=parameter1; i<=parameter2; i++) { |
| TH1F* h_hitsx; |
| char hname[128]; |
| int chPosition = map[i][chYstart]; |
| 111,7 → 132,7 |
| h_hitsx->SetTitle("Scan X;x [mm]; Entries"); |
| h_hitsx->GetYaxis()->SetTitleOffset(1.3); |
| h_hitsx->SetStats(0); |
| if (i == chXstart) |
| if (i == parameter1) |
| h_hitsx->Draw(); |
| else { |
| h_hitsx->SetLineColor(i+1); |
| 126,7 → 147,7 |
| for(int i=chYstart; i<=chYend; i++) { |
| TH1F* h_hitsy; |
| char hname[128]; |
| int chPosition = map[chXstart][i]; |
| int chPosition = map[parameter1][i]; |
| sprintf(hname, "hnhitsy%d", chPosition); |
| h_hitsy = (TH1F*)rootfile->Get(hname); |
| h_hitsy->SetTitle("Scan Y;y [mm]; Entries"); |
| 153,12 → 174,12 |
| // Get the filled histogram from scan |
| TH1F* h_x; |
| char name[32]; |
| sprintf(name, "hnhitsx%d", chXstart); |
| sprintf(name, "hnhitsx%d", parameter1); |
| h_x = (TH1F*)rootfile->Get(name); |
| h_x->DrawCopy(); |
| |
| TH1F* h_y; |
| sprintf(name, "hnhitsy%d", chXstart); |
| sprintf(name, "hnhitsy%d", parameter1); |
| h_y = (TH1F*)rootfile->Get(name); |
| |
| // Create and fill corrected histogram |
| 229,7 → 250,7 |
| h_line[j] = new TH1F("h_line", "h_line", binsX, xLowUser, xUpUser); |
| } |
| |
| for(int j=chXstart; j<=chXend; j++) { |
| for(int j=parameter1; j<=parameter2; j++) { |
| int chPosition = map[j][chYstart]; |
| char hname[128]; |
| sprintf(hname, "h2d%d", chPosition); |
| 245,10 → 266,10 |
| double eta = -log(1 - signal); |
| double x = xLowUser + k*(xUpUser-xLowUser)/double(binsX); |
| //double y = l*(yUpUser-yLowUser)/double(binsY); |
| h_line[j]->Fill(x-c_xOffset, signal); |
| h_line[j]->Fill(x, signal); |
| //} |
| } |
| if (j == chXstart) { |
| if (j == parameter1) { |
| h_line[j]->SetTitle("SiPM#2 w/o noise subtraction;x[mm];Hits"); |
| //h_line[j]->GetYaxis()->SetRangeUser(-0.05, 0.3); |
| //h_line[j]->GetYaxis()->SetRangeUser(-50, 2500); |
| 265,9 → 286,9 |
| TCanvas* canvas61 = new TCanvas("canvas61","canvas61",8*200,300); |
| canvas61->cd(); |
| TH2F* h_corrected = new TH2F("h_corrected","h_corrected",binsX,xLowUser,xUpUser, binsY,yLowUser,yUpUser); |
| for(int i=chXstart; i<=chXend; i++) { |
| //int canvasPosition = nX*(i-chYstart)+(j-chXstart)+1; |
| //int canvasPosition = nX*(chYend-i)+chXstart+1; |
| for(int i=parameter1; i<=parameter2; i++) { |
| //int canvasPosition = nX*(i-chYstart)+(j-parameter1)+1; |
| //int canvasPosition = nX*(chYend-i)+parameter1+1; |
| //if (debug) printf("canvas %d\n",canvasPosition); |
| int chPosition = map[i][chYstart]; |
| char hname[128]; |
| 292,7 → 313,7 |
| //double y = l*(yUpUser-yLowUser)/double(binsY); |
| double x = h[histogram]->GetXaxis()->GetBinCenter(k); |
| double y = h[histogram]->GetYaxis()->GetBinCenter(l); |
| h_corrected->Fill(x-c_xOffset, y-c_yOffset, eta); |
| h_corrected->Fill(x, y, eta); |
| } |
| } |
| } |
| 315,10 → 336,10 |
| TCanvas* canvas7 = new TCanvas("canvas7","canvas7", nX*400,nY*400); |
| printf("nx %d ny %d\n",nX,nY); |
| canvas7->Divide(nX,nY); |
| for(int i=chXend-1; i<=chXend+1; i++) { |
| for(int j=chXstart-1; j<=chXstart+1; j++) { |
| //int canvasPosition = nX*(i-chYstart)+(j-chXstart)+1; |
| int canvasPosition = nX*(chXend+1-i) + (j-chXstart+1) +1; |
| for(int i=parameter2-1; i<=parameter2+1; i++) { |
| for(int j=parameter1-1; j<=parameter1+1; j++) { |
| //int canvasPosition = nX*(i-chYstart)+(j-parameter1)+1; |
| int canvasPosition = nX*(parameter2+1-i) + (j-parameter1+1) +1; |
| if (debug) printf("canvas %d\n",canvasPosition); |
| canvas7->cd(canvasPosition); |
| char hname[128]; |
| 334,7 → 355,7 |
| canvas8->cd(); |
| gStyle->SetOptStat(0); |
| char hname[128]; |
| int chPosition = map[chXstart][chXend]; |
| int chPosition = map[parameter1][parameter2]; |
| sprintf(hname, "h2d%d", chPosition); |
| TH2F* h_2d = (TH2F*)rootfile->Get(hname); |
| |
| 350,6 → 371,9 |
| Double_t yUpUser = h_2d->GetYaxis()->GetXmax(); |
| if (debug) printf("xLow %f xUp %f\n",xLowUser,xUpUser); |
| TH2F* h_corrected = new TH2F("h_corrected","h_corrected",binsX, xLowUser, xUpUser, binsY, yLowUser, yUpUser); |
| double diffX = xUpUser - xLowUser; |
| double diffY = yUpUser - yLowUser; |
| //TH2F* h_corrected = new TH2F("h_corrected","h_corrected",binsX, 3.00, 3.00+diffX, binsY, 8.00, 8.00+diffY); |
| //TH2F* h_corrected = new TH2F("h_corrected","h_corrected",binsX, minX, maxX, binsY, minY, maxY); |
| |
| double noise = getNoise(h_2d, 1, 70); |
| 359,24 → 383,28 |
| double signal = h_2d->GetBinContent(k,j); // detected |
| //double p = ((signal - noise) > 1) ? (signal-noise) : 1; |
| double p = signal - noise; |
| p /= 10000.; |
| /* |
| p /= 1000.; |
| double p0 = 1.0 - p; // events with zero photons |
| //double eta = (-log(p0) * p0 ) / (1-p0-0.00001); |
| double eta = -log(p0); // constant of the poissonian statistics |
| if (debug) printf("p=%f p0=%f log(p0)=%f eta=%f\n",p,p0,log(p0),eta); |
| */ |
| //double x = xLowUser + k*(xUpUser - xLowUser) / double(binsX); |
| double x = h_2d->GetXaxis()->GetBinCenter(k); |
| //double y = yLowUser + j*(yUpUser-yLowUser)/double(binsY); |
| double y = h_2d->GetYaxis()->GetBinCenter(j); |
| if (debug) printf("x=%f y=%f\n", x, y); |
| h_corrected->Fill(x + c_xOffset, y + c_yOffset, eta); |
| h_corrected->Fill(x, y, p); |
| } |
| } |
| h_corrected->SetTitle("n_pe = - ln P(0);x[mm];y[mm]"); |
| //h_corrected->SetTitle(";x[mm];y[mm]"); |
| gStyle->SetPalette(52,0); |
| h_corrected->GetZaxis()->SetRangeUser(-0.05,0.7); |
| h_corrected->SetContour(50); |
| //h_corrected->SetTitle("n_pe = - ln P(0);x[mm];y[mm]"); |
| h_corrected->SetTitle(";x[mm];y[mm]"); |
| //gStyle->SetPalette(52,0); // black and white for print |
| //h_corrected->GetZaxis()->SetRangeUser(-0.05,1); |
| //h_corrected->SetContour(100); |
| //gStyle->SetPalette(1); |
| //SetGS(); |
| h_corrected->Draw("colz"); |
| |
| // collection efficiency |
| 391,6 → 419,11 |
| } |
| } |
| printf("Signal sum = %f\n # of points = %d\n",efficiency,nPoints); |
| |
| if(strstr(plopt, "p") != NULL) { |
| canvas8->Print("result.pdf"); |
| } |
| |
| } |
| |
| /** Draws the sum of channel signals |
| 398,7 → 431,7 |
| * Suitable for 8x8 chs scan |
| */ |
| if( strstr(plopt, "sum") != NULL ) { |
| int nX = chXend - chXstart + 1; |
| int nX = parameter2 - parameter1 + 1; |
| int nY = chYend - chYstart + 1; |
| TCanvas* canvas12 = new TCanvas("canvas12","c2",8*200, 8*200); |
| canvas12->cd(); |
| 422,11 → 455,11 |
| |
| // 2d histogram noise subtraction and poisson scaling |
| for(int i=chYstart; i<=chYend; i++) { |
| for(int j=chXstart; j<=chXend; j++) { |
| for(int j=parameter1; j<=parameter2; j++) { |
| int chPosition = map[j][i]; |
| char hname[128]; |
| sprintf(hname, "h2d%d", chPosition); |
| int histogram = nX*(i-chYstart)+(j-chXstart); |
| int histogram = nX*(i-chYstart)+(j-parameter1); |
| h[histogram] = (TH2F *) rootfile->Get(hname); |
| int noise = getNoise(h[histogram], 1, 170); |
| if (debug) printf("noise: %d\n",noise); |
| 442,7 → 475,7 |
| //printf("p=%f p0=%f log(p0)=%f eta=%f\n",p,p0,log(p0),eta); |
| double x = k*(xUpUser-xLowUser)/double(binsX); |
| double y = l*(yUpUser-yLowUser)/double(binsY); |
| h_corrected->Fill(x-c_xOffset, y-c_yOffset, eta); |
| h_corrected->Fill(x, y, eta); |
| } |
| } |
| |
| 469,12 → 502,12 |
| TCanvas* canvas9 = new TCanvas("canvas9","canvas9", 500,500); |
| canvas9->cd(); |
| char hname[128]; |
| sprintf(hname, "hnhitsx%d", 36); |
| sprintf(hname, "hnhitsx%d", 49); |
| TH1F* h_laser = (TH1F*)rootfile->Get(hname); |
| h_laser->Draw(); |
| h_laser->SetStats(1); |
| |
| TF1* err = new TF1("err","[0]+[1]*TMath::Erf((x-[2])/[3])",17.02,17.30); |
| TF1* err = new TF1("err","[0]+[1]*TMath::Erf((x-[2])/[3])",parameter1,parameter2); |
| err->SetParameter(0,2500); |
| err->SetParameter(1, h_laser->GetMaximum()); |
| err->SetParameter(2, h_laser->GetBinCenter(h_laser->GetMaximumBin())); |
| 500,6 → 533,12 |
| gStyle->SetOptStat(0); |
| h_map->Draw("text"); |
| } |
| |
| if(strstr(plopt, "p") != NULL) { |
| TCanvas* canvasLast = new TCanvas("canvasLast","",500,500); |
| canvasLast->Print("result.pdf)"); |
| } |
| |
| |
| return(0); |
| } |