//Renata Kopecna #include "tests.hh" #include #include //TODO: go through what is needed #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace fcnc { void test_integrals(){ spdlog::debug("Starting Test"); //sin test unsigned int nbins=100; for (unsigned int i = 0; i < nbins; i++) { double x = -1.0 + 2.0*i/double(nbins); double a = integral_x_to_n_times_sin_x_2(x, 0); double b = 0.5*(x-0.5*sin(2.0*x)); if (fabs(a-b) > 1.0e-8) { std::cout << a; std::cout << " != "; std::cout << b; std::cout << std::endl; } } for (unsigned int i = 0; i < nbins; i++) { double x = -1.0 + 2.0*i/double(nbins); double a = integral_x_to_n_times_sin_x_2(x, 1); double b = -(2*x*sin(2*x)+cos(2*x)-2*x*x)/8; if (fabs(a-b) > 1.0e-8) { std::cout << a; std::cout << " != "; std::cout << b; std::cout << std::endl; } } for (unsigned int i = 0; i < nbins; i++) { double x = -1.0 + 2.0*i/double(nbins); double a = integral_x_to_n_times_sin_x_2(x, 2); double b = -((6*x*x-3)*sin(2*x)+6*x*cos(2*x)-4*x*x*x)/24; if (fabs(a-b) > 1.0e-8) { std::cout << a; std::cout << " != "; std::cout << b; std::cout << std::endl; } } for (unsigned int i = 0; i < nbins; i++) { double x = -1.0 + 2.0*i/double(nbins); double a = integral_x_to_n_times_sin_x_2(x, 3); double b = -((4*x*x*x-6*x)*sin(2*x)+(6*x*x-3)*cos(2*x)-2*x*x*x*x)/16; if (fabs(a-b) > 1.0e-8) { std::cout << a; std::cout << " != "; std::cout << b; std::cout << std::endl; } } for (unsigned int i = 0; i < nbins; i++) { double x = -1.0 + 2.0*i/double(nbins); double a = integral_x_to_n_times_sin_x_2(x, 1); double b = -(2*x*sin(2*x)+cos(2*x)-2*x*x)/8; if (fabs(a-b) > 1.0e-8) { std::cout << a; std::cout << " != "; std::cout << b; std::cout << std::endl; } } //cos test for (unsigned int i = 0; i < nbins; i++) { double x = -1.0 + 2.0*i/double(nbins); double a = integral_x_to_n_times_cos_x_2(x, 0); double b = (sin(2.0*x)*0.5+x)*0.5; if (fabs(a-b) > 1.0e-8) { std::cout << a; std::cout << " != "; std::cout << b; std::cout << std::endl; } } std::vector res; chebyshev(0.43, 13, res); for (unsigned int i = 0; i < 14; i++) { if (fabs(res.at(i) - chebyshev(0.43,i)) > 1.0e-8){ spdlog::debug("CHEBYSHEV: {0:f} != {1:f}", res.at(i), chebyshev(0.43,i)); } } legendre(0.43, 13, res); for (unsigned int i = 0; i < 14; i++) { if (fabs(res.at(i) - ROOT::Math::legendre(i, 0.43)) > 1.0e-8){ spdlog::debug("LEGENDREPOLY {0:d}: {1:f} != {2:f}", i, res.at(i), ROOT::Math::legendre(i, 0.43)); } } spdlog::debug("Finished Test"); } void test_legendre() { spdlog::debug("Starting Test"); TRandom3 rnd; TCanvas *canvas = new TCanvas("canvas", "canvas",1600,1200); canvas->cd(); unsigned int nbins = 200; TH1D * data = new TH1D("data", "data", nbins, -1.0, 1.0); for (unsigned int i =0; i<200000; i++){ data->Fill(rnd.Gaus(0.0,0.5)); bool finished = false; double x; while (!finished){ x = rnd.Rndm(); if (rnd.Rndm() < x){ x = x*2.0-1.0; finished = true; } } data->Fill(x); } //data->FillRandom("gaus", 200000); data->Draw("e"); unsigned int n = 20; std::vector l; double dv = 2.0/nbins; std::vector coeffs(n+1, 0.0); for (unsigned int j=0; jGetBinContent(j+1); for (unsigned int i = 0; iSetBinContent(j+1, y); } interpol->SetLineColor(2); interpol->Draw("same l"); TH1D * pol1d = new TH1D("pol1d", "pol1d", nbins, -1.0, 1.0); std::vector poly_coeffs; for (unsigned int i=0; iSetBinContent(j+1, y); } pol1d->SetLineColor(3); pol1d->SetLineStyle(2); pol1d->Draw("same l"); canvas->Update(); canvas->Print("legendre.eps", "eps"); delete data; delete interpol; delete pol1d; delete canvas; } void test_legendre_2pi() { TRandom3 rnd; TCanvas *canvas = new TCanvas("canvas", "canvas",1600,1200) ; canvas->cd(); unsigned int nbins = 200; TH1D * data = new TH1D("data", "data", nbins, -TMath::Pi(), TMath::Pi()); for (unsigned int i =0; i<200000; i++) { data->Fill(rnd.Gaus(0.0,0.5)); bool finished = false; double x; while (!finished) { x = rnd.Rndm(); if (rnd.Rndm() < x) { x = x*2.0*TMath::Pi()-TMath::Pi(); finished = true; } } data->Fill(x); } //data->FillRandom("gaus", 200000); data->Draw("e"); unsigned int n = 20; std::vector l; double dv = 2.0/nbins; std::vector coeffs(n+1, 0.0); for (unsigned int j=0; jGetBinContent(j+1); for (unsigned int i = 0; iSetBinContent(j+1, y); } interpol->SetLineColor(2); interpol->Draw("same l"); TH1D * pol1d = new TH1D("pol1d", "pol1d", nbins, -TMath::Pi(), +TMath::Pi()); std::vector poly_coeffs; for (unsigned int i=0; iSetBinContent(j+1, y); } pol1d->SetLineColor(3); pol1d->SetLineStyle(2); pol1d->Draw("same l"); canvas->Update(); canvas->Print("legendre2pi.eps", "eps"); delete data; delete interpol; delete pol1d; delete canvas; } void test_chebyshev() { TRandom3 rnd; TCanvas *canvas = new TCanvas("canvas", "canvas",1600,1200) ; canvas->cd(); unsigned int nbins = 200; TH1D * data = new TH1D("data", "data", nbins, -1.0, 1.0); for (unsigned int i =0; i<200000; i++) { data->Fill(rnd.Gaus(0.0,0.5)); bool finished = false; double x; while (!finished) { x = rnd.Rndm(); if (rnd.Rndm() < x) { x = x*2.0-1.0; finished = true; } } data->Fill(x); } //data->FillRandom("gaus", 200000); data->Draw("e"); unsigned int n = 20; std::vector l; double dv = 2.0/nbins; std::vector coeffs(n+1, 0.0); for (unsigned int j=0; jGetBinContent(j+1); for (unsigned int i = 0; iSetBinContent(j+1, y); } interpol->SetLineColor(2); interpol->Draw("same l"); canvas->Update(); canvas->Print("chebyshev.eps", "eps"); delete data; delete interpol; //delete pol1d; delete canvas; } void test_legendre_2d() { gStyle->SetPalette(1); TRandom3 rnd; TCanvas *canvas = new TCanvas("canvas", "canvas",1600,1200) ; canvas->cd(); unsigned int nbins = 200; TH2D * data = new TH2D("data", "data", nbins, -1.0, 1.0, nbins, -1.0, 1.0); for (unsigned int i =0; i<1000000; i++) { //double r = rnd.Gaus(0.7,0.2); //double phi = rnd.Rndm() * 2.0 * TMath::Pi(); //data->Fill(fabs(r)*cos(phi),fabs(r)*sin(phi)); data->Fill(rnd.Gaus(-0.1,0.3), rnd.Gaus(-0.1,0.3)); data->Fill(rnd.Gaus(0.5,0.3), rnd.Gaus(0.5,0.3)); } //data->FillRandom("gaus", 200000); data->Draw("colz"); canvas->Update(); canvas->Print("2d.eps", "eps"); unsigned int n = 10; std::vector legendre_x, legendre_y; double dv = 2.0/nbins*2.0/nbins; std::vector< std::vector > coeffs(n+1, std::vector(n+1, 0.0)); for (unsigned int i=0; iGetBinContent(i+1,j+1); //orthonormal_legendre(x, n, legendre_x); //orthonormal_legendre(y, n, legendre_y); legendre(x, n, legendre_x); legendre(y, n, legendre_y); for (unsigned int l = 0; lSetBinContent(i+1, j+1, z); } } //calculate chi^2 double chi2 = 0.0; for (unsigned int i=0; iGetBinContent(i+1, j+1); double dd = data->GetBinError(i+1, j+1); double f = interpol->GetBinContent(i+1, j+1); if (dd != 0.0) chi2 += (d-f)*(d-f)/dd/dd; } } spdlog::debug("Found a chi^2 of {0:f with {1:d} bins.", chi2, nbins*nbins); //cleanup interpol->Draw("colz"); canvas->Update(); canvas->Print("2dinter.eps", "eps"); delete data; delete interpol; delete canvas; } /** This function tests the different versions of the complex error function. * Unfortunately the complex error function is not yet in the standard c library. **/ void test_errf() { gStyle->SetPalette(1); unsigned int divisions=1000; double min=-10.0; double max=+10.0; TH2D* real_1 = new TH2D("real_1", "real part", divisions, min, max, divisions, min, max); real_1->SetMinimum(-20.0); real_1->SetMaximum(+20.0); TH2D* imaginary_1 = new TH2D("imaginary_1", "imaginary part", divisions, min, max, divisions, min, max); imaginary_1->SetMinimum(-20.0); imaginary_1->SetMaximum(+20.0); TH2D* real_2 = new TH2D("real_2", "real part", divisions, min, max, divisions, min, max); TH2D* imaginary_2 = new TH2D("imaginary_2", "imaginary part", divisions, min, max, divisions, min, max); TH2D* real_3 = new TH2D("real_3", "real part", divisions, min, max, divisions, min, max); TH2D* imaginary_3 = new TH2D("imaginary_3", "imaginary part", divisions, min, max, divisions, min, max); double r, i; std::complex result, arg; for (unsigned int re = 0; re < divisions; re++) for (unsigned int im = 0; im < divisions; im++) { r = min + (max - min)/divisions*re; i = min + (max - min)/divisions*im; arg = std::complex(r, i); result = 1.0-cErrF(arg); //if (!std::isnan(result.real())) real_1->SetBinContent(re, im, result.real()); imaginary_1->SetBinContent(re, im, result.imag()); result = 1.0-cErrF_2(arg); //if (!std::isnan(result.real())) real_2->SetBinContent(re, im, result.real()); imaginary_2->SetBinContent(re, im, result.imag()); result = 1.0-cErrF_3(arg); //if (!std::isnan(result.real())) real_3->SetBinContent(re, im, result.real()); imaginary_3->SetBinContent(re, im, result.imag()); } TCanvas *canvas_1 = new TCanvas("canvas_1", "canvas 1",1600,1200) ; canvas_1->Divide(2,1); canvas_1->cd(1); real_1->Draw("COLZ"); canvas_1->cd(2); imaginary_1->Draw("COLZ"); canvas_1->Update(); canvas_1->Print("error_1.eps", "eps"); TCanvas *canvas_2 = new TCanvas("canvas_2", "canvas 2",1600,1200) ; canvas_2->Divide(2,1); canvas_2->cd(1); real_2->Draw("COLZ"); canvas_2->cd(2); imaginary_2->Draw("COLZ"); canvas_2->Update(); canvas_2->Print("error_2.eps", "eps"); TCanvas *canvas_3 = new TCanvas("canvas_3", "canvas 3",1600,1200) ; canvas_3->Divide(2,1); canvas_3->cd(1); real_3->Draw("COLZ"); canvas_3->cd(2); imaginary_3->Draw("COLZ"); canvas_3->Update(); canvas_3->Print("error_3.eps", "eps"); TH2D* real_12 = new TH2D((*real_1) / (*real_2)); TH2D* imaginary_12 = new TH2D((*imaginary_1) / (*imaginary_2)); TCanvas *canvas_12 = new TCanvas("canvas_12", "canvas 1 - 2",1600,1200) ; canvas_12->Divide(2,1); canvas_12->cd(1); real_12->Draw("COLZ"); canvas_12->cd(2); imaginary_12->Draw("COLZ"); canvas_12->Update(); canvas_12->Print("error_1_over_2.eps", "eps"); TH2D* real_23 = new TH2D((*real_2) / (*real_3)); TH2D* imaginary_23 = new TH2D((*imaginary_2) / (*imaginary_3)); TCanvas *canvas_23 = new TCanvas("canvas_23", "canvas 1 - 2",1600,1200) ; canvas_23->Divide(2,1); canvas_23->cd(1); real_23->Draw("COLZ"); canvas_23->cd(2); imaginary_23->Draw("COLZ"); canvas_23->Update(); canvas_23->Print("error_2_over_3.eps", "eps"); TH2D* real_13 = new TH2D((*real_1) / (*real_3)); TH2D* imaginary_13 = new TH2D((*imaginary_1) / (*imaginary_3)); TCanvas *canvas_13 = new TCanvas("canvas_13", "canvas 1 - 2",1600,1200) ; canvas_13->Divide(2,1); canvas_13->cd(1); real_13->Draw("COLZ"); canvas_13->cd(2); imaginary_13->Draw("COLZ"); canvas_13->Update(); canvas_13->Print("error_1_over_3.eps", "eps"); } void test_convolutions() { gStyle->SetPalette(1); gStyle->SetOptFit(0); gStyle->SetOptStat(0); unsigned int divisions=1000; double min=-TMath::Pi(); double max=+2.0*TMath::Pi(); TH1D* conv_sin = new TH1D("conv_sin", "", divisions, min, max); TH1D* conv_cos = new TH1D("conv_cos", "", divisions, min, max); TH1D* conv_sin_2 = new TH1D("conv_sin_2", "", divisions, min, max); TH1D* conv_cos_2 = new TH1D("conv_cos_2", "", divisions, min, max); TH1D* conv_2_sin = new TH1D("conv_2_sin", "", divisions, min, max); TH1D* conv_2_cos = new TH1D("conv_2_cos", "", divisions, min, max); TH1D* conv_cos_2_sin = new TH1D("conv_cos_2_sin", "", divisions, min, max); TH1D* conv_sin_3 = new TH1D("conv_sin_3", "", divisions, min, max); TH1D* conv_2_sin_sin = new TH1D("conv_2_sin_sin", "", divisions, min, max); double sigma = 0.03; for (unsigned int i = 0; i < divisions; i++) { double angle = min+(max - min)/double(divisions)*i; conv_sin->SetBinContent(i+1, convoluted_sin(angle, sigma)); conv_cos->SetBinContent(i+1, convoluted_cos(angle, sigma)); conv_sin_2->SetBinContent(i+1, convoluted_sin_2(angle, sigma)); conv_cos_2->SetBinContent(i+1, convoluted_cos_2(angle, sigma)); conv_2_sin->SetBinContent(i+1, convoluted_2_sin(angle, sigma)); conv_2_cos->SetBinContent(i+1, convoluted_2_cos(angle, sigma)); conv_cos_2_sin->SetBinContent(i+1, convoluted_cos_2_sin(angle, sigma)); conv_sin_3->SetBinContent(i+1, convoluted_sin_3(angle, sigma)); //std::cout << convoluted_sin_3(angle, sigma) << std::endl; conv_2_sin_sin->SetBinContent(i+1, convoluted_2_sin_sin(angle, sigma)); } conv_sin->SetLineColor(2); conv_cos->SetLineColor(3); conv_sin_2->SetLineColor(4); conv_cos_2->SetLineColor(5); conv_2_sin->SetLineColor(6); conv_2_cos->SetLineColor(7); conv_cos_2_sin->SetLineColor(8); conv_sin_3->SetLineColor(9); conv_2_sin_sin->SetLineColor(15); TCanvas *canvas = new TCanvas("canvas", "canvas",1600,1200) ; canvas->cd(); conv_sin->SetMinimum(-1.0); conv_sin->SetMaximum(1.0); conv_sin->Draw(); conv_cos->Draw("same"); conv_sin_2->Draw("same"); conv_cos_2->Draw("same"); conv_2_sin->Draw("same"); conv_2_cos->Draw("same"); conv_cos_2_sin->Draw("same"); conv_sin_3->Draw("same"); conv_2_sin_sin->Draw("same"); TLegend* conv_legend = new TLegend(0.7,0.6,0.9,0.9); conv_legend->AddEntry(conv_sin, "sin #Theta", "L"); conv_legend->AddEntry(conv_cos, "cos #Theta", "L"); conv_legend->AddEntry(conv_sin_2, "sin #Theta^{2}", "L"); conv_legend->AddEntry(conv_cos_2, "cos #Theta^{2}", "L"); conv_legend->AddEntry(conv_2_sin, "sin 2#Theta", "L"); conv_legend->AddEntry(conv_2_cos, "cos 2#Theta", "L"); conv_legend->AddEntry(conv_cos_2_sin, "cos #Theta^{2} sin #Theta", "L"); conv_legend->AddEntry(conv_sin_3, "sin #Theta ^{3}", "L"); conv_legend->AddEntry(conv_2_sin_sin, "sin 2#Theta sin #Theta", "L"); conv_legend->Draw(); canvas->Print("convolutions.eps", "eps"); delete conv_sin; delete conv_cos; delete conv_sin_2; delete conv_cos_2; delete conv_2_sin; delete conv_2_cos; delete conv_cos_2_sin; delete conv_sin_3; delete conv_2_sin_sin; delete canvas; TH1D* conv_cos_2_a = new TH1D("conv_cos_2_a", "", divisions, -1.0, +1.0); TH1D* conv_cos_2_b = new TH1D("conv_cos_2_b", "", divisions, -1.0, +1.0); TH1D* conv_cos_2_c = new TH1D("conv_cos_2_c", "", divisions, -1.0, +1.0); TH1D* conv_cos_2_d = new TH1D("conv_cos_2_d", "", divisions, -1.0, +1.0); TH1D* conv_cos_2_e = new TH1D("conv_cos_2_e", "", divisions, -1.0, +1.0); conv_cos_2_a->SetMinimum(-1.0); conv_cos_2_a->SetMaximum(1.0); for (unsigned int i = 0; i < divisions; i++) { double cos_theta = -1.0 + 2.0/divisions*(i+0.5); double angle = acos(cos_theta); conv_cos_2_a->SetBinContent(i+1, cos_theta*cos_theta); conv_cos_2_b->SetBinContent(i+1, convoluted_cos_2(angle, sigma)); conv_cos_2_c->SetBinContent(i+1, convoluted_cos_2(angle, sigma) +convoluted_cos_2(-angle, sigma) +convoluted_cos_2(2.0*TMath::Pi()-angle, sigma)); conv_cos_2_d->SetBinContent(i+1,1.0/sin(angle)*convoluted_cos_2_sin(angle, sigma)); conv_cos_2_e->SetBinContent(i+1,1.0/sin(angle)*(convoluted_cos_2_sin(angle, sigma) +convoluted_cos_2_sin(-angle, sigma) +convoluted_cos_2_sin(2.0*TMath::Pi()-angle, sigma) )); } TCanvas *canvas2 = new TCanvas("canvas2", "canvas",1600,1200); canvas2->cd(); conv_cos_2_b->SetLineColor(2); conv_cos_2_c->SetLineColor(3); conv_cos_2_d->SetLineColor(4); conv_cos_2_e->SetLineColor(5); conv_cos_2_a->Draw(); conv_cos_2_b->Draw("same"); conv_cos_2_c->Draw("same"); conv_cos_2_d->Draw("same"); conv_cos_2_e->Draw("same"); canvas2->Print("overcos.eps", "eps"); delete conv_cos_2_a; delete conv_cos_2_b; delete conv_cos_2_c; delete conv_cos_2_d; delete conv_cos_2_e; delete canvas2; } void test_int_convolutions() { gStyle->SetPalette(1); gStyle->SetOptFit(0); gStyle->SetOptStat(0); unsigned int divisions=1000; double min=-TMath::Pi(); double max=+2.0*TMath::Pi(); TH1D* conv_sin = new TH1D("conv_sin", "", divisions, min, max); TH1D* conv_cos = new TH1D("conv_cos", "", divisions, min, max); TH1D* conv_sin_2 = new TH1D("conv_sin_2", "", divisions, min, max); TH1D* conv_cos_2 = new TH1D("conv_cos_2", "", divisions, min, max); TH1D* conv_2_sin = new TH1D("conv_2_sin", "", divisions, min, max); TH1D* conv_2_cos = new TH1D("conv_2_cos", "", divisions, min, max); TH1D* conv_cos_2_sin = new TH1D("conv_cos_2_sin", "", divisions, min, max); TH1D* conv_sin_3 = new TH1D("conv_sin_3", "", divisions, min, max); TH1D* conv_2_sin_sin = new TH1D("conv_2_sin_sin", "", divisions, min, max); double sigma = 0.03; for (unsigned int i = 0; i < divisions; i++) { double angle = min+(max - min)/double(divisions)*i; conv_sin->SetBinContent(i+1, int_convoluted_sin(angle, sigma)-int_convoluted_sin(min, sigma)); // conv_cos->SetBinContent(i+1, convoluted_cos(angle, sigma)); conv_sin_2->SetBinContent(i+1, int_convoluted_sin_2(angle, sigma) - int_convoluted_sin_2(min, sigma)); // conv_cos_2->SetBinContent(i+1, convoluted_cos_2(angle, sigma)); conv_2_sin->SetBinContent(i+1, int_convoluted_2_sin(angle, sigma)-int_convoluted_2_sin(min, sigma)); // conv_2_cos->SetBinContent(i+1, convoluted_2_cos(angle, sigma)); conv_cos_2_sin->SetBinContent(i+1, int_convoluted_cos_2_sin(angle, sigma) - int_convoluted_cos_2_sin(min, sigma)); conv_sin_3->SetBinContent(i+1, int_convoluted_sin_3(angle, sigma)-int_convoluted_sin_3(min, sigma)); conv_2_sin_sin->SetBinContent(i+1, int_convoluted_2_sin_sin(angle, sigma) - int_convoluted_2_sin_sin(min, sigma)); } conv_sin->SetLineColor(2); conv_cos->SetLineColor(3); conv_sin_2->SetLineColor(4); conv_cos_2->SetLineColor(5); conv_2_sin->SetLineColor(6); conv_2_cos->SetLineColor(7); conv_cos_2_sin->SetLineColor(8); conv_sin_3->SetLineColor(9); conv_2_sin_sin->SetLineColor(15); TCanvas *canvas = new TCanvas("canvas", "canvas",1600,1200) ; canvas->cd(); conv_sin->SetMinimum(-0.5); conv_sin->SetMaximum(3.0); conv_sin->Draw(); // conv_cos->Draw("same"); conv_sin_2->Draw("same"); // conv_cos_2->Draw("same"); conv_2_sin->Draw("same"); // conv_2_cos->Draw("same"); conv_cos_2_sin->Draw("same"); conv_sin_3->Draw("same"); conv_2_sin_sin->Draw("same"); TLegend* conv_legend = new TLegend(0.7,0.6,0.9,0.9); conv_legend->AddEntry(conv_sin, "sin #Theta", "L"); conv_legend->AddEntry(conv_cos, "cos #Theta", "L"); conv_legend->AddEntry(conv_sin_2, "sin #Theta^{2}", "L"); conv_legend->AddEntry(conv_cos_2, "cos #Theta^{2}", "L"); conv_legend->AddEntry(conv_2_sin, "sin 2#Theta", "L"); conv_legend->AddEntry(conv_2_cos, "cos 2#Theta", "L"); conv_legend->AddEntry(conv_cos_2_sin, "cos #Theta^{2} sin #Theta", "L"); conv_legend->AddEntry(conv_sin_3, "sin #Theta ^{3}", "L"); conv_legend->AddEntry(conv_2_sin_sin, "sin 2#Theta sin #Theta", "L"); conv_legend->Draw(); canvas->Print("int_convolutions.eps", "eps"); delete conv_sin; delete conv_cos; delete conv_sin_2; delete conv_cos_2; delete conv_2_sin; delete conv_2_cos; delete conv_cos_2_sin; delete conv_sin_3; delete conv_2_sin_sin; delete canvas; } }