Open jonwright opened 4 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.
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.
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
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)
Function
lf()
in refinegrains.py has some problems.you cannot compute it without the position of the grain ... so it must come after indexing and per grain/voxel
do you use it for reciprocal space binning (rsv_mapper.py) ? ... option in crysalis to say "yes" or "no" and apparently "no" is "right"
it cannot be correct to divide by zero (except for topo-tomo?)
it depends on the wedge angle (e.g. topo-tomo case wedge=theta)
integrated intensity depends on integration of peak tails anyway
you also need polarisation (synchrotron with axis direction versus lab source with mono angle)
for broad peaks (texture) it varies across the peak
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.