#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; #define xrange1 1.7502 #define xrange2 1.75079 #define EMASS 510.998902//keV #define uk 931494.013//keV #define Vc 299792458 #define eC 1.6e-19 void Mg21O142() { ifstream in; double mq1; char IonName[10],JustRead[50]; int i=0,j; TTree *tree = new TTree("TreeName",""); tree->Branch("mq1",&mq1,"mq1/D"); in.open("mvsq.txt"); while(in>>mq1) { if(mq1>xrange1&&mq1Fill(); } } in.close(); tree->Print(); //Unbindata defination int nevt = tree->Draw("mq1","","goff"); std::vector dataX( tree->GetV1(), tree->GetV1() + nevt); ROOT::Fit::UnBinData data(nevt,dataX.data()); //Function defination and parameter settings TF1 *func=new TF1("func","[0]*exp(-(x-[1])*(x-[1])/(2*[2]*[2]))+[3]*exp(-(x-[4])*(x-[4])/(2*[5]*[5]))+[6]",xrange1 ,xrange2 ); double par[7]={80,1.750425 ,2e-5 ,150,1.750525 ,2e-5 ,0.00000001}; // func->SetParameters(par); // func->SetParLimits(0,50,150); // func->SetParLimits(1,(1.7504 ) ,(1.75045 ) ); // func->SetParLimits(2,0.000001 ,0.00005 ); // func->SetParLimits(3,110,190); // func->SetParLimits(4,(1.7505 ) ,(1.75055 ) ); // func->SetParLimits(5,0.000001 ,0.00005 ); // func->SetParLimits(6,0,10); ROOT::Math::WrappedMultiTF1 fitFunction(*func,func->GetNdim()); ROOT::Fit::Fitter fitter; fitter.SetFunction(fitFunction,true); fitter.Config().SetParamsSettings(7,par); fitter.Config().ParSettings(0).SetLimits(0,200); fitter.Config().ParSettings(1).SetLimits(1.7504,1.75045 ); fitter.Config().ParSettings(2).SetLimits(0.000001 ,0.00005 ); fitter.Config().ParSettings(2).SetStepSize(1e-7 ); fitter.Config().ParSettings(3).SetLimits(0,300); fitter.Config().ParSettings(4).SetLimits(1.7505 ,1.75055 ); fitter.Config().ParSettings(5).SetLimits(0.000001 ,0.00005 ); fitter.Config().ParSettings(5).SetStepSize(1e-7); fitter.Config().ParSettings(6).SetLimits(0,10); fitter.Config().SetMinimizer("Minuit", "Migrad"); fitter.LikelihoodFit(data); ROOT::Fit::FitResult result=fitter.Result(); result.Print(std::cout); delete func; return ; } int main() { Mg21O142(); return 1; }