#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 corona() { gStyle->SetOptFit(); const char *datain = "C:/corona.txt"; const char *dataout = "C:/root_v6.20.00/corona.png"; 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 ymax=1.E8; 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(23); gamma->SetMarkerSize(1.3); gamma->SetLineWidth(3); 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.E10); 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(3); fitspettro->SetMaximum(ymax); fitspettroexpo->SetRange(0.,70); fitspettrogaus->SetRange(0.,70); fitspettroexpo->SetLineWidth(3); // draw first function to have then data put on top fitspettro->SetRange(0.,70); fitspettro->Draw(); fitspettroexpo->Draw("SAME "); fitspettrogaus->Draw("SAME "); gamma->Draw("PL"); // drow graph data on top of function //gamma->Draw("L"); fitspettro->SetTitle("Covid-19 cases in Italy, February 24-March 13 2020- Logistic, Exponential and Gaussian fits until May 4 2020"); fitspettro->GetXaxis()->SetTitle("Day"); fitspettro->GetYaxis()->SetTitle("Cases"); 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); float height = stat1->GetY2NDC() - stat1->GetY1NDC(); stat1->SetY1NDC(stat->GetY1NDC() - height); stat1->SetY2NDC(stat->GetY1NDC() ); stat1->Draw(); float height2 = stat2->GetY2NDC() - stat2->GetY1NDC(); stat2->SetY1NDC(stat1->GetY1NDC() - height); stat2->SetY2NDC(stat1->GetY1NDC() ); stat2->Draw(); } gPad->Update(); t->AddText("COVID-19"); t->Draw(); gPad->Update(); c01->Print(dataout); }