#include "TCanvas.h" #include "TPad.h" #include "TMultiGraph.h" #include "TGraph.h" #include "TGraphErrors.h" #include "TAxis.h" #include "TLegend.h" #include "TLatex.h" #include "TROOT.h" #include void coronatamp() { gStyle->SetOptFit(); const char *datain = "C:/coronatamp.txt"; const char *dataout = "C:/root_v6.20.00/coronatamp.pdf"; TCanvas *c01 = new TCanvas("c01","multigraph",1280,1024); c01->SetGrid(); float offx=1.3; float offy=1.3; float margr=0.08; float w=3; float margl=0.12; float line=2; float ymax=1.; gPad->SetLeftMargin(margl); gPad->SetRightMargin(margr); TGraphErrors *gamma = new TGraphErrors(datain,"%lg %lg"); for(int i = 0; i < gamma->GetN(); i++) { gamma->SetPointError(i, 0.0, TMath::Sqrt(gamma->GetY()[i])); } // ex = 0.0 or 0.3 or 0.5 gamma->SetMarkerColor(kBlue); gamma->SetLineColor(kBlue); gamma->SetMarkerStyle(3); gamma->SetMarkerSize(1.3); gamma->SetLineWidth(line); TF1 *fitspettro = new TF1("fitspettro", "[0] * (1+[1]*TMath::Exp(-x/[2]))/(1+[3]*TMath::Exp(-x/[2]))", 0,25); TPaveText *t=new TPaveText(0.7,0.15,0.75,0.2,"brNDC"); TF1 *fitspettroexpo = new TF1("fitspettroexpo", "expo", 0,25); TF1 *fitspettrogaus = new TF1("fitspettrogaus", "gaus", 0,25); TGraphErrors *gamma2 = (TGraphErrors*)(gamma->Clone()); TGraphErrors *gamma3 = (TGraphErrors*)(gamma->Clone()); fitspettro->SetParName(0,"a"); fitspettro->SetParName(1,"m"); fitspettro->SetParName(2,"#tau"); fitspettro->SetParName(3,"n"); fitspettro->SetParameter(0,2); fitspettro->SetParameter(1,60); fitspettro->SetParameter(2,5); fitspettro->SetParameter(3,300); fitspettro->SetParLimits(0,0,1); fitspettro->SetParLimits(2,-1,50000); fitspettro->SetLineColor(kRed+2); fitspettrogaus->SetLineColor(kGreen+2); // need to increase number of function calls for avoiding call limit error ROOT::Math::MinimizerOptions::SetDefaultMaxFunctionCalls(1000000); gamma->Fit("fitspettro","+"); gamma2->Fit("fitspettroexpo","","sames"); gamma3->Fit("fitspettrogaus","","sames"); fitspettro->SetLineWidth(line); fitspettro->SetMaximum(ymax); fitspettroexpo->SetRange(0.,80); fitspettrogaus->SetRange(0.,80); fitspettroexpo->SetLineWidth(line); // draw first function to have then data put on top fitspettro->SetRange(0.,80); fitspettro->Draw(); fitspettroexpo->Draw("SAME "); fitspettrogaus->Draw("SAME "); gamma->Draw("PL"); // drow graph data on top of function gamma2->Draw("L"); // drow graph data on top of function gamma3->Draw("L"); // drow graph data on top of function //gamma->Draw("L"); fitspettro->SetTitle("Covid-19 infections/swabs ratio in Italy, March 02-April 15 2020- Gaussian fit compared to Logistic and Exponential ones until May 20 2020"); fitspettro->GetXaxis()->SetTitle("Day since March 02, 2020"); fitspettro->GetYaxis()->SetTitle("Infections/Swabs"); fitspettro->GetYaxis()->SetTitleOffset(offy); fitspettro->GetXaxis()->SetTitleOffset(offx); gamma->SetTitle("Covid-19 cases"); gamma->GetXaxis()->SetTitle("Day"); gamma->GetYaxis()->SetTitle("Cases"); gamma->GetYaxis()->SetTitleOffset(offy); gamma->GetXaxis()->SetTitleOffset(offx); TLegend* leg = new TLegend(0.15, 0.75, .25, .85); leg->SetHeader("Legend"); leg->SetNColumns(1); leg->AddEntry(gamma, "Data", "lp"); leg->AddEntry(fitspettro, "Logistic Fit", "l"); leg->AddEntry(fitspettroexpo, "Exponential Fit", "l"); leg->AddEntry(fitspettrogaus, "Gaussian Fit", "l"); leg->Draw(); //gPad->SetLogy(true); gPad->Update(); TPaveStats *stat = (TPaveStats*)(gamma->FindObject("stats")); TPaveStats *stat1 = (TPaveStats*)(gamma2->FindObject("stats")); TPaveStats *stat2 = (TPaveStats*)(gamma3->FindObject("stats")); if(stat && stat1 && stat2) { stat->SetTextColor(kRed+2); stat1->SetTextColor(kRed); stat2->SetTextColor(kGreen+2); stat->SetX1NDC(0.85); stat->SetX2NDC(0.98); stat->SetY1NDC(0.79); stat->SetY2NDC(0.94); stat1->SetX1NDC(0.85); stat1->SetX2NDC(0.98); stat1->SetY1NDC(0.62); stat1->SetY2NDC(0.77); stat2->SetX1NDC(0.85); stat2->SetX2NDC(0.98); stat2->SetY1NDC(0.45); stat2->SetY2NDC(0.60); } gPad->Update(); t->AddText("Fausto."); t->Draw(); gPad->Update(); c01->Print(dataout); }