SasView / sasmodels

Package for calculation of small angle scattering models using OpenCL.
BSD 3-Clause "New" or "Revised" License
16 stars 28 forks source link

newmodels0923 branch #581

Open RichardHeenan opened 1 year ago

RichardHeenan commented 1 year ago

Leaving some notes re RIchard's newmodels0923 branch

These are models which have mostly been in existence for several years and been tested by the individual user groups for which they were written.

core_shell_ellipsoid_tied Sasview v4 version is on marketplace, has here been updated to v5 with F(Q). This and the following model really need a way to return information to the user, see the docs for my work around.

core_shell_flexible_cylinder_tied

core_shell_bicelle_elliptical_protein

core_shell_fuzzy_sphere

core_multi_shell_cylinder This is a multiplicity model
This has separate axial and radial sld profiles, have fudged them so they appear on the single sld plot. Needs a proper method to have them in different colours. The data is collected by getProfile in sasmodels\sasmodels\sasview_model.py [ separate note that the sphere version, core_multi_shell has no unit tests]

lamellar_x5_paracrystal_kr Does a sum of monolayer plus stacks of 2, 3, 4,and 5 layers. Works surprisingly well on many lamellar systems. This still needs proper documentation - in progress.

RichardHeenan commented 1 year ago

Help needed please - in my newmodels0923 branch of sasmodels core_shell_ellipsoid_tied.c core_shell_flexible_cylinder_tied.c have some printf( ...) for my work around to give users the shell thickness etc calculated by the model. On my local dev build these prints go to the sasview.log file, but in my downloadable install built on github they go neither to the on screen log nor to the log file, sending them to the on screen log would be good, but how to do this? (When I first tried this some while back the printf results appeared in both from my local dev build.)

pkienzle commented 1 year ago

The easiest path forward I see for this problem is to implement something akin to the handling of the weighted volume and effective radius calculations.

That is, we could extend the results vector returned from the kernel with weighted values for each derived parameter. For completeness we could also average over the input parameter values.

Modify kernel.py to pull these values out of the results and create a self.results method to compute weighted sum over the total weight.

This is the same (hack) mechanism we use to return P(Q) and S(Q) when computing P@S.

As a simple test I modified Kernel.Fq in sasmodels/kernel.py, adding the following just before the return statement:

self.results = lambda: {'form_volume': form_volume, 'shell_volume': shell_volume}

This makes these values available to the GUI but they are being ignored. Note that the P@S calculator already forwards these as results['P(Q) parts'] to the sasview GUI, so the results tree should allow for multiple levels.

pkienzle commented 1 year ago

As for how to handle the problem right now, instead of printing shell thickness, you can return it as I(Q)

if(f_solvent_in_shell < -1.0e-24){
    *F1 = 1.0;
    *F2 = thick_shell;
    return;
}

Unfortunately you also have to set scale=1 and background=0 for the value to be correct.

Presumably you want number density average for the thick. In other models we do this by returning V²F²(Q), which results in I(Q) = φΣwVF²(Q)/ΣwV.

Note: Your tied cylinder code is using V=1/√2 instead of form_volume, so your I(Q) calculation will be:

 φΣ(wF²(Q)/(2V))/ΣwV

Is this what you intended?

Further note: Iqac uses V² = 1 instead of V² = 1/2.