FABLE-3DXRD / ImageD11

ImageD11 is a python code for identifying individual grains in spotty area detector X-ray diffraction images.
https://imaged11.readthedocs.io/
GNU General Public License v2.0
15 stars 24 forks source link

Sort out the Lorentz and Polarisation factors #70

Open jonwright opened 4 years ago

jonwright commented 4 years ago

Function lf() in refinegrains.py has some problems.

Suggestion : create some functions in xfab for computing lorentz and polarisation in terms of the fable geometry and call on them. Will need to add some parameters for polarisation.

AxelHenningsson commented 2 years ago

I recall doing something in lf() a long time ago.

I have an implementation (lorentz_factor()) of the Lorentz factor as a function of sample rotation axis and the wave vectors involved in the elastic scattering. Similarly, here (polarization_factor()) is an implementation of the polarisation factor for linearly polarized light. I think these get around the wedge stuff in a "simple way". Don't know if it is useful, I find it hard to verify that these types of equations/implementations are sane.

Putting this in xfab makes perfect sense to me. 👍

Question: How do you mean one needs the grain positions to do this? Should these things not be relatively independent of the grain position?

Question: When you say peak tails, do you mean in omega? I think the lorentz factors classically derived are always implicitly assuming the peak will be rendered unto a single frame.

jonwright commented 2 years ago

For the grain positions : People want to apply a Lorentz correction to the intensity of a spot recorded on the detector. You can't do this until you know the direction of the ray. So you need to index the spot and find the crystal position. The effect depends on which spot and how big is the crystal translation.

For the peak tails : I was thinking of a debate about how much of the tail of a peak is supposed to be counted as integrated intensity to refine the crystal structure. You get tails from thermal diffuse scattering (inelastic) as well as dislocations, etc.

If there is a large orientation spread there is also a variation of the Lorentz factor across the peak, so it is not quite right to just apply it on the integrated intensity and centroid.

To verify these things, people usually take a dataset for a single crystal and check if the correction makes the integrated intensities more or less accurate by doing a crystal structure refinement.

AxelHenningsson commented 2 years ago

What algorithms in ImageD11 do care about weak internal peak intensity variations at this point?

If none; it seems to me this is then more of a user problem in the terms of:

"user has to decide on approximation user wants to use for users application"

Let me know if I can help out on this issue in any way. 🙂

Cheers

jonwright commented 2 years ago

There was this project called "totalcryst" which inspired most of the code here and where the aim is to refine crystal structures. The idea was to take a h,k,l,Intensity file and try to feed that to a structure refinement program.

Calling on code from xfab would be fine. There is some rotation axis stuff in ImageD11/gv_general.py too. A re-factor is needed for several diffractometer rotations to be used, most things are built around the idea of one rotation axis. People who do chemical crystallography to measure intensities often use a few different axis settings to average out these kinds of problems.

For the polarisation - lab diffractometers are different to synchrotrons - there should be some parameter to describe this. For example, the "gold standard" decided to use the "stokes parameters" but does not go so far as saying what they are or how to use them! (incident_polarisation_stokes[nP, 4] here : https://manual.nexusformat.org/classes/applications/NXmx.html#nxmx)