[group] [eFit] [Weight] 3 [Algorithm] 1 MODE=3 ITERS=1000 REL=0 DER=1e-4 Form Factors [name] cylinder-efit [number parameters] 7, [description]

Form Factor of Cylinder with Radius R and Length L:

I(Q) = I0 x P(Q);

P(Q) = [0..π/2] F2(Q,R,L,α) sin(α)dα;

F(Q,R,L,a) => 2J1[QRsin(α)] / [QRsin(α)] x sin(QLcos(α)/2) / (QLcos(α)/2);

J1(x) - the regular cylindrical Bessel function of first order .


v. 2019-10-09

[x] Q [y] I [parameter names] L,R,I0,bgd,sldCylinder,sldSolvent,phi, [initial values] 500[1..10000],20[1..1000],1[0..1E6],0[0..10],3e+10,-5.6e+09,0.01[0.001..1] [adjustibility] 1,1,0,0,0,0,1 [parameter description] Length of Cylinder [A],Radius of Cylinder [A],Forward Scattering calculated [1/cm],Background [1/cm],SLD [1/cm/cm],SLD [1/cm/cm],volume fraction [0..1], [h-headers] #include #include [included functions] struct data {double QL; double QR;}; //--- double cylinder_under_integral(double alfa, void * data) { double QL = ((struct data *)data)->QL; double QR = ((struct data *)data)->QR; double result; //--- result= 2*gsl_sf_bessel_J1(QR*sin(alfa))/(QR*sin(alfa)); result*=sin(QL*cos(alfa)/2)/(QL*cos(alfa)/2); result=result*result*sin(alfa); //--- return result; }; double cylinder_form_factor(double Q, double R, double L) { if (Q==0) return 1.0; if (R*L==0) return 0.0; //+++ integral control parameters double IntegralAbs=0; double IntegralRel=0.001; int maxNumber=1000; //--- double QL=Q*L; double QR=Q*R; gsl_integration_workspace * w = gsl_integration_workspace_alloc (maxNumber); double result, error; data data={QL, QR}; gsl_function F; F.function = &cylinder_under_integral; F.params = &data; gsl_integration_qags (&F, 0.0001, M_PI/2, IntegralAbs, IntegralRel, maxNumber, w, &result, &error); gsl_integration_workspace_free(w); return result; } void beforeFiting(void * ParaM) { if (!beforeFit) return; int minPoint=currentFirstPoint; double min=YYY[minPoint]; int maxPoint=currentFirstPoint; double max=YYY[maxPoint]; for(int i=currentFirstPoint; imax) {max=YYY[i];maxPoint=i;} } double VolumeCylinder=M_PI*R*R*L; phi=max/(VolumeCylinder*1.0E-24*(sldCylinder-sldSolvent)*(sldCylinder-sldSolvent)); //bgd=0.75*min; } [code] double VolumeCylinder=M_PI*R*R*L; // volume in A^3 I0=phi*VolumeCylinder*1.0E-24*(sldCylinder-sldSolvent)*(sldCylinder-sldSolvent); I=I0 * cylinder_form_factor(Q, R, L)+bgd; beforeFiting(ParaM); //+++ eFit [fortran] 0, [end]