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); |
} |