Hello, I want to use a function from a user defined library, which I load whenever I start a root session (this function is a convolution of a Landau with a Gauss). When I draw this function or add a print-out statement if this function is known, there is no problem: I indeed see the function drawn on a canvas. However, when I try to define a new function using this predefined function, TF1 *fFit = new TF1("fFit", "fFitLandGaus", 0, 20,4); or TF1 *fFit = new TF1("fFit", fFitLandGaus, 0, 20,4); I get the following error message: Function:fFit cannot be compiled I have attached a few lines of code, where you can follow up the steps, that I want to do. The final command that I want to use is: TF1 *fFit = new TF1("fFit", "fFit+f1", 0, 20,7); I saw that it is possible to "add" two predefined function on the webpage for the TF1 - class (http://root.cern.ch/root/html302/TF1.html) Example: { TF1 *fcos = new TF1 ("fcos", "[0]*cos(x)", 0., 10.); fcos->SetParNames( "cos"); fcos->SetParameter( 0, 1.1); TF1 *fsin = new TF1 ("fsin", "[0]*sin(x)", 0., 10.); fsin->SetParNames( "sin"); fsin->SetParameter( 0, 2.1); TF1 *fsincos = new TF1 ("fsc", "fcos+fsin"); } I hope it is a trivial problem to solve, Thank you, Hermine Woehri +------------------------------------------------------+ |Hermine Katharina Woehri hermine.woehri@cern.ch | +------------------------------------------------------| |EP Division office: +41 22 767 9408| |CERN mobile: +41 79 201 0715| |CH-1211 Geneve 23 fax: +41 22 767 9780| |Switzerland private: +33 450 42 4415| +------------------------------------------------------+ #include <iostream.h> #include <math.h> TF1 *fFitLandGaus; static Double_t FitLandGaus(Double_t *x, Double_t *par) { double fun,xp[5]; if ( fabs(par[3])<=1.e-3 ) { double yy = ( *x - par[1] )/par[0]; double lnd = (yy<-10. ? 0. : DenLandau(&yy))/par[0]; return lnd; } xp[0] = par[0]; xp[1] = par[1]-0.2225*par[0]; xp[2] = par[2]; xp[3] = fabs(par[3]); xp[4] = *x; double l1 = (*x) -15.*xp[3]; double l2 = (*x) +15.*xp[3]; fun = Gauss(LGconvl,xp,l1,l2,0.00001*fabs(xp[3])); return par[2]*fun/(par[3]*2.506628275); } Int_t InitFunctions(Int_t x){ fFitLandGaus = new TF1("fFitLandGaus",FitLandGaus,0.,25.,4); fFitLandGaus ->SetParameters(0.25,3.5,1000.,0.1); fFitLandGaus ->SetParName(0,"Scale"); fFitLandGaus ->SetParName(1,"Peak"); fFitLandGaus ->SetParName(2,"Norm"); fFitLandGaus ->SetParName(3,"Sigma"); } static Double_t DenLandau( Double_t *x, Double_t *par=0) { static Double_t p1[5] = { .4259894875,-.124976255,.039842437, -.006298287635,.001511162253 }; static Double_t q5[5] = { 1.,156.9424537,3745.310488,9834.698876, 66924.28357 }; static Double_t p6[5] = { 1.000827619,664.9143136,62972.92665, 475554.6998,-5743609.109 }; static Double_t q6[5] = { 1.,651.4101098,56974.73333,165917.4725, -2815759.939 }; static Double_t a1[3] = { .04166666667,-.01996527778,.02709538966 }; static Double_t a2[2] = { -1.84556867,-4.284640743 }; static Double_t q1[5] = { 1.,-.3388260629,.09594393323,-.01608042283, .003778942063 }; static Double_t p2[5] = { .1788541609,.1173957403,.01488850518, -.001394989411,1.283617211e-4 }; static Double_t q2[5] = { 1.,.7428795082,.3153932961,.06694219548, .008790609714 }; static Double_t p3[5] = { .1788544503,.09359161662,.006325387654, 6.611667319e-5,-2.031049101e-6 }; static Double_t q3[5] = { 1.,.6097809921,.2560616665,.04746722384, .006957301675 }; static Double_t p4[5] = { .9874054407,118.6723273,849.279436, -743.7792444,427.0262186 }; static Double_t q4[5] = { 1.,106.8615961,337.6496214,2016.712389, 1597.063511 }; static Double_t p5[5] = { 1.003675074,167.5702434,4789.711289, 21217.86767,-22324.9491 }; /* System generated locals */ Double_t ret_val, d__1; /* Local variables */ static Double_t u, v; v = *x; if (v < -5.5) { u = exp(v + 1.); ret_val = exp(-1 / u) / sqrt(u) * .3989422803 * ((a1[0] + (a1[ 1] + a1[2] * u) * u) * u + 1); } else if (v < -1.) { u = exp(-v - 1); ret_val = exp(-u) * sqrt(u) * (p1[0] + (p1[1] + (p1[2] + (p1[3] + p1[ 4] * v) * v) * v) * v) / (q1[0] + (q1[1] + (q1[2] + (q1[3] + q1[4] * v) * v) * v) * v); } else if (v < 1.) { ret_val = (p2[0] + (p2[1] + (p2[2] + (p2[3] + p2[4] * v) * v) * v) * v) / (q2[0] + (q2[1] + (q2[2] + (q2[3] + q2[4] * v) * v) * v) * v); } else if (v < 5.) { ret_val = (p3[0] + (p3[1] + (p3[2] + (p3[3] + p3[4] * v) * v) * v) * v) / (q3[0] + (q3[1] + (q3[2] + (q3[3] + q3[4] * v) * v) * v) * v); } else if (v < 12.) { u = 1 / v; /* Computing 2nd power */ d__1 = u; ret_val = d__1 * d__1 * (p4[0] + (p4[1] + (p4[2] + (p4[3] + p4[4] * u) * u) * u) * u) / (q4[0] + (q4[1] + (q4[2] + (q4[3] + q4[4] * u) * u) * u) * u); } else if (v < 50.) { u = 1 / v; /* Computing 2nd power */ d__1 = u; ret_val = d__1 * d__1 * (p5[0] + (p5[1] + (p5[2] + (p5[3] + p5[4] * u) * u) * u) * u) / (q5[0] + (q5[1] + (q5[2] + (q5[3] + q5[4] * u) * u) * u) * u); } else if (v < 300.) { u = 1 / v; /* Computing 2nd power */ d__1 = u; ret_val = d__1 * d__1 * (p6[0] + (p6[1] + (p6[2] + (p6[3] + p6[4] * u) * u) * u) * u) / (q6[0] + (q6[1] + (q6[2] + (q6[3] + q6[4] * u) * u) * u) * u); } else { u = 1 / (v - v * log(v) / (v + 1)); /* Computing 2nd power */ d__1 = u; ret_val = d__1 * d__1 * ((a2[0] + a2[1] * u) * u + 1); } return ret_val; } void tryFit(){ }
This archive was generated by hypermail 2b29 : Sat Jan 04 2003 - 23:50:57 MET