Subversion Repositories f9daq

Compare Revisions

Ignore whitespace Rev 40 → Rev 39

/sipmScan/sipmScan.ini
File deleted
/sipmScan/src/analysisBias.cpp
103,7 → 103,7
 
int analysisBias(char* dfile0="test", int dbg=0, double tdcCut=5.0)
{
const double c_tdcOffset = 368*TDC_BIN; // ns
const double c_tdcOffset = 1; // ns
printf(" Data to root conversion program\nUsage:\nd2r(input file name <without.dat>, debug on/off, TDC cut +-[ns])\n\n");
240,7 → 240,20
//htdc = (TH2F*) gROOT->FindObject(hname);
//if (htdc) delete htdc;
//htdc = new TH2F("htdc",";TDC channel;SiPM channel",512,0,512,NCH,0,NCH);
h_correctedTDC = (TH3F*) gROOT->FindObject("h_correctedTDC");
if (h_correctedTDC) delete h_correctedTDC;
nSteps = (run.thUp - run.thLow)/double(run.thStep) + 1;
if (dbg) printf("nSteps %d\n", nSteps);
h_correctedTDC = new TH3F("h_correctedTDC",";SiPM channel; ASD threshold [V]; t [ns]",
NCH,
-0.5,
NCH-0.5,
nSteps,
(run.thLow - 0.5*run.thStep)/1000.0,
(run.thUp + 0.5*run.thStep)/1000.0,
2*tdcCut*TDC_BIN,
-tdcCut*TDC_BIN,
tdcCut*TDC_BIN);
//TH1F* gsumV673A[NCH/16] = new TH1F(hn,hname,256,-0.5,255.5);
for(int i=0; i<NCH; i++) {
/*
283,22 → 296,6
}
nBiasSteps = (run.biasUp - run.biasLow)/double(run.biasStep) + 1;
h_correctedTDC = (TH3F*) gROOT->FindObject("h_correctedTDC");
if (h_correctedTDC) delete h_correctedTDC;
nSteps = (run.thUp - run.thLow)/double(run.thStep) + 1;
if (dbg) printf("nSteps %d\n", nSteps);
h_correctedTDC = new TH3F("h_correctedTDC",";SiPM channel; ASD threshold [V]; t [ns]",
NCH,
-0.5,
NCH-0.5,
nBiasSteps,
(run.biasLow - 0.5*run.biasStep)/1000.0,
(run.biasUp + 0.5*run.biasStep)/1000.0,
2*tdcCut+1,
-tdcCut*TDC_BIN - 0.5*TDC_BIN,
tdcCut*TDC_BIN + 0.5*TDC_BIN);
h_bias = (TH2F*) gROOT->FindObject("h_bias");
if (h_bias) delete h_bias;
h_bias = new TH2F("h_bias",";Channel; Bias [V]", 64, -0.5, 63.5,
395,7 → 392,7
double tdcmax = tdcOffset[channel] + tdcCut;
double time = data*TDC_BIN - tdcOffset[channel];
if(time >= -tdcCut and time <= tdcCut) {
h_correctedTDC->Fill(channel, bias.bias/1000.0, time);
h_correctedTDC->Fill(channel, thr.threshold/1000.0, time);
hnhitsx[channel]->Fill((pos.xset - OFFSETX) * MIKRO_BIN);
hnhitsy[channel]->Fill((pos.yset - OFFSETY) * MIKRO_BIN);
h2d[channel]->Fill((pos.xset - OFFSETX) * MIKRO_BIN, (pos.yset - OFFSETY) * MIKRO_BIN);
500,7 → 497,7
int position(int x, int y, int channel)
{
int flag = 0;
if ( (x > (padCenter[channel][0] - 5040)) and (x < (padCenter[channel][0] + 5040)) and
(y > (padCenter[channel][1] - 5040)) and (y < (padCenter[channel][1] + 5040)) ) flag = 1;
if ( (x > (padCenter[channel][0] - 5000)) and (x < (padCenter[channel][0] + 5000)) and
(y > (padCenter[channel][1] - 5000)) and (y < (padCenter[channel][1] + 5000)) ) flag = 1;
return flag;
}
/sipmScan/src/analysisScan.cpp
30,8 → 30,8
#define NCH 64
#define TDC_BIN 1.0416 // 1 TDC bin in ns
#define MIKRO_BIN 0.49609/1000. //1 mikro step in mm; stage MM3MF
#define OFFSETX 15400 // Right edge of SiPM+Lightguide
#define OFFSETY 6400 // Lower edge of SiPM+Lightguide
#define OFFSETX 4800 // Right edge of SiPM+Lightguide
#define OFFSETY 3400 // Lower edge of SiPM+Lightguide
 
#define RUNREC_ID 1
#define ENDREC_ID 2
103,7 → 103,7
//Chanel information
double tdcOffset[NCH];
sprintf(fullname, "sipmScan.ini");
sprintf(fullname, "d2r.ini");
if( (fp=fopen(fullname, "rt")) == NULL )
printf("Cannot open pad centers file %s !!!\n", fullname);
else {
374,9 → 374,9
hnhitsx[channel]->Fill((pos.xset - OFFSETX) * MIKRO_BIN);
hnhitsy[channel]->Fill((pos.yset - OFFSETY) * MIKRO_BIN);
//h_threshold->Fill(channel, thr.threshold);
//if (position(pos.xset-OFFSETX, pos.yset-OFFSETY, channel)) {
if (position(pos.xset-OFFSETX, pos.yset-OFFSETY, channel)) {
h2d[channel]->Fill((pos.xset - OFFSETX) * MIKRO_BIN, (pos.yset - OFFSETY) * MIKRO_BIN);
//}
}
}
//gV673A->Fill(data,channel);
//gsumV673A[channel/16]->Fill(data);
/sipmScan/src/RTUtil.cpp
1,6 → 1,4
//##########################################################################################
#include "TGaxis.h"
 
void RTSetStyle(TStyle *style)
{
style->SetStatBorderSize(1);
16,20 → 14,16
style->SetMarkerStyle(kFullDotLarge);
//style->SetMarkerSize(7);
style->SetOptStat("e");
style->SetOptFit(1);
style->SetPadTopMargin(0.12);
style->SetPadBottomMargin(0.12);
style->SetPadLeftMargin(0.12);
style->SetPadRightMargin(0.12);
style->SetPadTopMargin(0.15);
style->SetPadBottomMargin(0.15);
style->SetPadLeftMargin(0.15);
style->SetPadRightMargin(0.15);
style->SetTitleOffset(1.3, "y");
style->SetPalette(1, 0);
gStyle->SetPalette(1, 0);
style->SetPaperSize(TStyle::kA4);
TGaxis::SetMaxDigits(4);
//gStyle->SetPaperSize(TStyle::kA4);
}
//##########################################################################################
RTCanvas::RTCanvas()
/sipmScan/src/analysisThreshold.cpp
93,7 → 93,7
 
int analysisThreshold(char* dfile0="test", int dbg=0, double tdcCut=5.0)
{
const double c_tdcOffset = 368*TDC_BIN; // ns
const double c_tdcOffset = 1; // ns
printf(" Data to root conversion program\nUsage:\nd2r(input file name <without.dat>, debug on/off, TDC cut +-[ns])\n\n");
230,7 → 230,7
h_correctedTDC = (TH3F*) gROOT->FindObject("h_correctedTDC");
if (h_correctedTDC) delete h_correctedTDC;
nSteps = (run.thUp - run.thLow)/double(run.thStep) + 1;
if (dbg) printf("nSteps %f\n", nSteps);
if (dbg) printf("nSteps %d\n", nSteps);
h_correctedTDC = new TH3F("h_correctedTDC",";SiPM channel; ASD threshold [V]; t [ns]",
NCH,
-0.5,
238,9 → 238,9
nSteps,
(run.thLow - 0.5*run.thStep)/1000.0,
(run.thUp + 0.5*run.thStep)/1000.0,
2*tdcCut+1,
(-tdcCut - 0.5)*TDC_BIN,
(tdcCut + 0.5)*TDC_BIN);
2*tdcCut*TDC_BIN,
-tdcCut*TDC_BIN,
tdcCut*TDC_BIN);
//TH1F* gsumV673A[NCH/16] = new TH1F(hn,hname,256,-0.5,255.5);
for(int i=0; i<NCH; i++) {
/*
/sipmScan/examples/thresholdScan.C
60,12 → 60,11
TCanvas* canvas2 = new TCanvas("canvas2","",1600,800);
//canvas2->Divide(2);
int channel = map[chXstart][chXend];
TH1D* h_projection1 = h_threshold->ProjectionY("",channel+1,channel+1);
TH1D* h_projection1 = h_threshold->ProjectionY("Ch 37",38,38);
canvas2->cd();
//h_projection1->GetYaxis()->SetRangeUser(0,1000);
//gPad->SetLogy();
h_projection1->SetTitle(";Threshold [V]; Events");
h_projection1->SetTitle("Channel 37;Threshold [V]; Events");
h_projection1->Draw();
/*
TH1D* h_projection2 = h_threshold->ProjectionY("Ch 38",39,39);
/sipmScan/examples/sipm.C
372,10 → 372,9
h_corrected->Fill(x + c_xOffset, y + c_yOffset, eta);
}
}
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->SetTitle("n_pe = - ln P(0);x[mm];y[mm]");
h_corrected->SetTitle(";x[mm];y[mm]");
h_corrected->GetZaxis()->SetRangeUser(-0.01,0.5);
h_corrected->SetContour(50);
h_corrected->Draw("colz");
/sipmScan/examples/biasScan.C
12,17 → 12,16
#include "TSpectrum.h"
#include "stdio.h"
#include "THStack.h"
#include "TPaveText.h"
 
#include "include/RTUtil.h"
 
double getNoise(TH2F*, int, int);
 
int biasScan(char filename[256] = "test", char plopt[256]="th", int chXstart=0, int chXend=7, double par1=0.0, double par2=0.0, bool debug = false)
int biasScan(char filename[256] = "test", char plopt[256]="th", int chXstart=0, int chXend=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;
const double c_xOffset = 1; // mm
const double c_yOffset = 0.7;
int map[8][8]={{32,34,53,55,40,42,61,63},
{48,50,37,39,56,58,45,47},
75,7 → 74,7
TH2D* h_correctedTDC = (TH2D*) h0->Project3D("xz");
//h0->GetZaxis()->SetRangeUser(-5,5);
//h0->Project3D("xzo")->Draw("colz");
//h_correctedTDC->SetTitle("; t [ns]; Channel");
h_correctedTDC->SetTitle("; t [ns]; Channel");
h_correctedTDC->Draw("colz");
/*
TH1F* tdc1 = new TH1F("tdc1",";TDC [ns];Events",binsZ, minZ, maxZ);
90,7 → 89,7
TH2D* h_timeWalk = (TH2D*) h0->Project3D("zy");
canvas21->cd(2);
//h_timeWalk->SetTitle(";Threshold [V]; t [ns]");
h_timeWalk->SetTitle(";Threshold [V]; t [ns]");
h_timeWalk->Draw("colz");
}
138,10 → 137,10
main->cd();
main->Divide(4,4);
for(int i=chXstart; i<chXend; i++) {
for(int j=(int)par1; j<(int)par2; j++) {
for(int j=chYstart; j<chYend; j++) {
int channel = map[i][j];
TH1D* h_projection = h_threshold->ProjectionY("",channel+1,channel+1);
int canvasPosition = i-chXend+4*((int)par2-j)+1;
int canvasPosition = i-chXend+4*(chYend-j)+1;
printf(" %d ", canvasPosition);
main->cd(canvasPosition);
gPad->SetMargin(0.08, 0.08, 0.08, 0.08);
182,28 → 181,7
h_projection->SetMarkerStyle(kFullDotMedium);
//h_projection->SetMarkerSize(8);
gPad->SetMargin(0.1,0.1,0.1,0.1);
TF1* f_linear = new TF1("f_linear", "[0] + [1]*x", par1, par2);
f_linear->SetParameter(0, -1);
f_linear->SetParameter(1, 0.1);
f_linear->SetParNames("p0", "p1");
h_projection->Fit(f_linear,"q");
h_projection->Fit(f_linear,"r");
h_projection->Draw("pe1x0");
double p0 = f_linear->GetParameter(0);
double p1 = f_linear->GetParameter(1);
printf("p0 %f p1 %f V_b = %f [V]\n", p0, p1, -p0/p1);
TPaveText *text = new TPaveText(0.15,0.5,0.35,0.56);
text->SetFillColor(0);
text->SetBorderSize(0.1);
text->SetTextSize(0.030);
char string[128];
sprintf(string, "V_b = %2.2f", -p0/p1);
text->AddText(string);
text->Draw("same");
text->Paint();
}
if( strstr(plopt, "all") != NULL ) {
245,8 → 223,167
h_hitsy = (TH1F*)rootfile->Get(hname);
h_hitsy->Draw();
}
 
if( strstr(plopt, "share") != NULL ) {
/*TCanvas *canvas4 = new TCanvas("canvas1","canvas1",1000,1000);
int nChannels = chYend-chYstart+1;
int ncols = nChannels/2;
printf("nch %d nch\\2 %d\n", nChannels, ncols);
canvas4->Divide(2,ncols);
TH1F* h_hitsy;
for(int i=chYstart; i<=chYend; i++){
canvas4->cd(i-chYstart+1);
char hname[128];
int chPosition = map[0][i];
sprintf(hname, "hnhitsy%d", chPosition);
h_hitsy = (TH1F*)rootfile->Get(hname);
h_hitsy->Draw();
}*/
TCanvas *canvas4 = new TCanvas("canvas4","canvas4",500,500);
canvas4->cd();
for(int i=chXstart; i<=chXend; i++) {
TH1F* h_hitsx;
char hname[128];
int chPosition = map[i][chYstart];
sprintf(hname, "hnhitsx%d", chPosition);
h_hitsx = (TH1F*)rootfile->Get(hname);
h_hitsx->SetTitle("Scan X;x [mm]; Entries");
h_hitsx->GetYaxis()->SetTitleOffset(1.3);
h_hitsx->SetStats(0);
if (i == chXstart)
h_hitsx->Draw();
else {
h_hitsx->SetLineColor(i+1);
h_hitsx->Draw("same");
}
}
//sprintf(fullname, "ps/%s_Yshare.eps", filename);
//canvas4->SaveAs(fullname);
TCanvas *canvas5 = new TCanvas("canvas5","canvas5",500,500);
canvas5->cd();
for(int i=chYstart; i<=chYend; i++) {
TH1F* h_hitsy;
char hname[128];
int chPosition = map[chXstart][i];
sprintf(hname, "hnhitsy%d", chPosition);
h_hitsy = (TH1F*)rootfile->Get(hname);
h_hitsy->SetTitle("Scan Y;y [mm]; Entries");
h_hitsy->GetYaxis()->SetTitleOffset(1.3);
h_hitsy->SetStats(0);
if (i == chYstart)
h_hitsy->Draw();
else {
h_hitsy->SetLineColor(i+1);
h_hitsy->Draw("same");
}
}
//sprintf(fullname, "ps/%s_Yshare.eps", filename);
//canvas5->SaveAs(fullname);
}
/** Draws the signal from 8 channels in x-row
* for one specific y bin, so the background and cross-talk
* can be estimated.
* Draws also a 2d scan of these channels.
*/
if (strstr(plopt, "line") != NULL) {
TCanvas* canvas6 = new TCanvas("canvas6","canvas6",500,500);
canvas6->cd(0);
gStyle->SetOptStat(0);
TH2F* h0 = (TH2F*) rootfile->Get("h2d0");
Int_t binsX = h0->GetXaxis()->GetNbins();
Int_t minX = h0->GetXaxis()->GetFirst();
Int_t maxX = h0->GetXaxis()->GetLast()+1;
Int_t binsY = h0->GetYaxis()->GetNbins();
Int_t minY = h0->GetYaxis()->GetFirst();
Int_t maxY = h0->GetYaxis()->GetLast()+1;
Double_t xLowUser = h0->GetXaxis()->GetBinLowEdge(minX);
Double_t xUpUser = h0->GetXaxis()->GetBinUpEdge(maxX);
Double_t yLowUser = h0->GetYaxis()->GetBinLowEdge(minY);
Double_t yUpUser = h0->GetYaxis()->GetBinUpEdge(maxY);
if (debug) printf("xLow %f xUp %f\n",xLowUser,xUpUser);
//! 1-dimension position in x vs. hits
TH2F* h[8];
TH1F* h_line[8];
for(int j=0; j<8; j++) {
h_line[j] = new TH1F("h_line", "h_line", binsX, xLowUser, xUpUser);
}
for(int j=chXstart; j<=chXend; j++) {
int chPosition = map[j][chYstart];
char hname[128];
sprintf(hname, "h2d%d", chPosition);
int histogram = j;
h[histogram] = (TH2F *) rootfile->Get(hname);
int noise = getNoise(h[histogram], 1, 160);
for(int k=minX; k<=maxX; k++) {
int l=chYstart*20+12;
//for(int l=12; l<=16; l++) {
double signal = h[histogram]->GetBinContent(k,l);
//signal -= noise;
//signal /= 5*10000.0;
double eta = -log(1 - signal);
double x = k*(xUpUser-xLowUser)/double(binsX);
//double y = l*(yUpUser-yLowUser)/double(binsY);
h_line[j]->Fill(x-c_xOffset, signal);
//}
}
if (j == chXstart) {
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);
h_line[j]->Draw("");
}
else {
h_line[j]->SetLineColor(j+1);
h_line[j]->Draw("same");
}
}
//! 2d scan
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;
//if (debug) printf("canvas %d\n",canvasPosition);
int chPosition = map[i][chYstart];
char hname[128];
sprintf(hname, "h2d%d", chPosition);
int histogram = i;
h[histogram] = (TH2F *) rootfile->Get(hname);
int noise = getNoise(h[histogram], 1, 100);
for(int k=minX; k<=maxX; k++) {
for(int l=minY; l<=maxY; l++) {
int signal = h[histogram]->GetBinContent(k,l); // detected
//p /= 10000.;
//double p0 = 1.0 - p; // events with zero photons
//double eta = (-log(p0) * p0 ) / (1-p0-0.00001);
//double eta = -log(p0);
//printf("p=%f p0=%f log(p0)=%f eta=%f\n",p,p0,log(p0),eta);
//double signal = ((p - noise) > 0.1) ? (p-noise) : 0.1;
double p = signal - noise;
p /= 10000.0;
double eta = -log(1 - p);
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->SetTitle("SiPM#2 n_pe = - ln(P0);x[mm];y[mm]");
h_corrected->GetZaxis()->SetRangeUser(-0.05,0.30);
h_corrected->Draw("colz");
}
/** Draws the sum of the channels
* Each channel is a 2d plot
* Intended for the study of 1 channel
254,14 → 391,14
if (strstr(plopt, "2d") != NULL) {
int nX = chXend - chXstart + 1;
int nY = (int)par2 - (int)par1 + 1;
int nY = chYend - chYstart + 1;
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=(int)par1; i<=(int)par2; i++) {
for(int i=chYstart; i<=chYend; i++) {
for(int j=chXstart; j<=chXend; j++) {
//int canvasPosition = nX*(i-chYstart)+(j-chXstart)+1;
int canvasPosition = nX*((int)par2-i)+(j-chXstart)+1;
int canvasPosition = nX*(chYend-i)+(j-chXstart)+1;
if (debug) printf("canvas %d\n",canvasPosition);
canvas7->cd(canvasPosition);
char hname[128];
334,8 → 471,8
* Suitable for 8x8 chs scan
*/
if( strstr(plopt, "sum") != NULL ) {
int nX = 7 - 0 + 1;
int nY = 7 - 0 + 1;
int nX = chXend - chXstart + 1;
int nY = chYend - chYstart + 1;
TCanvas* canvas12 = new TCanvas("canvas12","c2",8*200, 8*200);
canvas12->cd();
gStyle->SetOptStat(0);
357,12 → 494,12
TH2F* h[9];
// 2d histogram noise subtraction and poisson scaling
for(int i=0; i<=7; i++) {
for(int i=chYstart; i<=chYend; i++) {
for(int j=chXstart; j<=chXend; j++) {
int chPosition = map[j][i];
char hname[128];
sprintf(hname, "h2d%d", chPosition);
int histogram = nX*(i-0)+(j-chXstart);
int histogram = nX*(i-chYstart)+(j-chXstart);
h[histogram] = (TH2F *) rootfile->Get(hname);
int noise = getNoise(h[histogram], 1, 170);
if (debug) printf("noise: %d\n",noise);
/sipmScan/examples/tdc.C
75,22 → 75,19
h_correctedTDC->Draw("colz");
TCanvas* canvas3 = new TCanvas("canvas3","canvas3",800,800);
canvas2->cd(2);
TH1D* h_allTDCbins = h_correctedTDC->ProjectionX("", 1, 64);
h_allTDCbins->Draw();
/*
int binY = map[chX][chY];
TH1D* channelY = h_correctedTDC->ProjectionX("",binY+1,binY+1);
channelY->SetStats(0);
//channelY->SetStats(0);
char title[256];
sprintf(title,"Channel %d;t [ns];Events", binY);
channelY->SetTitle(title);
channelY->GetYaxis()->SetTitleOffset(1.7);
TAxis* xAxis = h_correctedTDC->GetXaxis();
int range = xAxis->GetBinUpEdge(xAxis->GetLast()+1);
channelY->GetXaxis()->SetRangeUser(-range, range);
//TAxis* xAxis = h_correctedTDC->GetXaxis();
//int range = xAxis->GetBinUpEdge(xAxis->GetLast()+1);
//channelY->GetXaxis()->SetRangeUser(-range, range);
channelY->Draw();
 
/*
TF1* f_gaus1 = new TF1("f_gaus1","[0] + gaus(1)", rangeLeft,rangeRight);
TF1* f_gaus2 = new TF1("f_gaus2","[0] + gaus(1) + gaus(4)",-8,8);
f_gaus1->SetParNames("Linear","Norm","#mu","#sigma");
/sipmScan/d2r.ini
0,0 → 1,72
# ch pad_center_x pad_center_y tdc_offset # sipm2, tdc modified 27/3/14 pos added 20/2/14 threshold scan
0 75600 5040 143.5
1 55440 5040 143.5
2 75600 15120 143.5
3 55440 15120 143.5
4 45360 25200 143.5
5 65520 25200 143.5
6 45360 35280 143.5
7 65520 35280 143.5
 
8 75600 45360 143.5
9 55440 45360 142.5
10 75600 55440 142.5
11 55440 55440 142.5
12 45360 65520 142.5
13 65520 65520 142.5
14 45360 75600 142.5
15 65520 75600 142.5
 
16 65520 5040 144.5
17 45360 5040 144.5
18 65520 15120 144.5
19 45360 15120 144.5
20 55440 25200 144.5
21 75600 25200 144.5
22 55440 35280 144.5
23 75600 35280 143.5
 
24 65520 45360 143.5
25 45360 45360 143.5
26 65520 55440 143.5
27 45360 55440 143.5
28 55440 65520 143.5
29 75600 65520 143.5
30 55440 75600 143.5
31 75600 75600 146.5
 
32 5040 5040 143.5
33 25200 5040 143.5
34 5040 15120 143.5
35 25200 15120 143.5
36 35280 25200 143.5
37 15120 25200 143.5
38 35280 35280 144.5
39 15120 35280 144.5
 
40 5040 45360 144.5
41 25200 45360 144.5
42 5040 55440 144.5
43 25200 55440 144.5
44 35280 65520 144.5
45 15120 65520 144.5
46 35280 75600 144.5
47 15120 75600 144.5
 
48 15120 5040 144.5
49 35280 5040 144.5
50 15120 15120 144.5
51 35280 15120 144.5
52 25200 25200 143.5
53 5040 25200 142.5
54 25200 35280 142.5
55 5040 35280 142.5
 
56 15120 45360 142.5
57 35280 45360 142.5
58 15120 55440 142.5
59 35280 55440 142.5
60 25200 65520 142.5
61 5040 65520 142.5
62 25200 75600 142.5
63 5040 75600 142.5