Inelastic x-ray (IXS) and neutron (INS) scattering intensity maps:ΒΆ

The script make_TDS_DispersionIntensityCurves calculates inelastic scattering intensities for x-rays and neutrons. It has interactive capabilities to let you choose two modes at a given q-point and look for translations into other Brillouin zones which optimize the contrast (see below Interactions) It requires that you have performed the following operations beforehand:

  • symmetrisation
  • Fourier Transform
  • Debye waller calculation for the temperature of choice
  • The usage is

    make_TDS_DispersionIntensityCurves castep_filename input_filename  

    the file castep_filename can be either the name of the original castep output the associated hdf5 file. In any case the associated hdf5 file must exist already (make_TDS_Simmetrization must be run beforehand)

  • The input_file must set the variables :

    • Mandatories
      • redStarts
      • redEnds
      • Nqlines
      • Nfour_interp
      • Temperature
      • resolutionfile
      • Saturation
      • lowerLimit
      • bottom_meV
      • tth_max (degrees)
    • If NEUTRONCALC==0 ( default )
      • Lambda
      • CohB
      • NeutronE
    • Optional
      • branchWeight
      • Eigscal
      • UniqueIon


  • File summedoverQs.dat

    contains two columns : energy , intensity. Obtained after summing over Qs

  • File alongtheline_TDS.dat

    energy integrated intensity (TDS) for each q-value


  • To toggle back and forth the Choosing mode (selection mode) type C with the graph as active window.

  • Choosing branch A :

    when you are in selection mode left-click over the branch. The q-point also is selected according to the click position.

  • Choosing branch B :

    right click

  • To change manually selected points
    : type m

    this is sometimes necessary to disambiguate overlapping branches. This interaction opens an emacs editor with variable assignation. When you save and exit, the variables are updated with new values if you have modified them. You can, in this way, change the branch number and see if there are ambiguous neighbours.

  • To run the optimisation
    : type M

    This launches a calculation of equivalent Qpoints in a wide range of cells (from -6 to 6 along all three axis ) which is centred over the initial q-point. New points are considered if they are physical : K < 2pi/lambda. The calculation writes the intensity of the two branches on file choosen_modes.txt.

    The first three columns are the reduced reciprocal shift applied to the original Q point. The fourth is scattering angle theta in degree. The last three columns are Ia, Ib and Ia/Ib ( the constrast ) The lines are ordered in descending order of contrast.

The implemented formula is the following

I(\omega, {\bf Q}) = \sum_v \delta(\omega-\omega_v)  \left \|   \sum_\alpha  S_\alpha(\lambda,Q) exp(-\sum_{ij} W^\alpha_{ij} Q_i Q_j ) exp(-i {\bf Q} \cdot {\bf R}_\alpha) \frac{{\bf Q}\cdot {\bf e}^\alpha_{v{\bf Q}}} { M_\alpha^{1/2}  }\right \|^2

where v is the branch index, \alpha the atom index, S is the scattering factor for a given wavelenght ang angle, W are the Deby-Waller coefficients for the given temperature, R the atomic positions, M the atomic masses and {\bf e} the eigenvectors.

The input variables are documented with docstrings below

make_TDS_DispersionIntensityCurves.APPLYTIMEREVERSAL = 1

this is one by default. Must be coherent with previous steps

make_TDS_DispersionIntensityCurves.redStarts = [[-2.0, -2.0, 0.0], [2.0, 2.0, 0.0]]

The list of Q points at which calculation is made is done of N segments. The redStarts variable contains a list of N starting points in reciprocal space reduced units. Each segment i starts at redStarts[i] and ends at redEnds[i]. Within each segment the spacing between points is the segment lenght divided by Nqlines[i]

make_TDS_DispersionIntensityCurves.redEnds = [[2.0, 2.0, 0.0], [2.0, 2.0, 1.0]]

see redStarts

make_TDS_DispersionIntensityCurves.Nqlines = [200, 100]

see redStarts

make_TDS_DispersionIntensityCurves.Nfour_interp = 5

The number of points in each direction of the 3D reciprocal grid. The hdf5 file must contain a previous treatement done with the same parameter.

make_TDS_DispersionIntensityCurves.Temperature = 100
The hdf5 file must include DW factors calculated ALSO at this temperature.
The temperature at which DW factors have been calculated.
Units are Kelvin
make_TDS_DispersionIntensityCurves.resolutionfile = ''

a two column file : first the energy in cm-1, second the value of resolution function

make_TDS_DispersionIntensityCurves.Lambda = 1.0

For X-ray scattering : the wavelenght in Angstroems.

make_TDS_DispersionIntensityCurves.Saturation = 0

To limit intensity at peaks : intensity is saturated at this value

make_TDS_DispersionIntensityCurves.lowerLimit = 0

To correct the dynamical range, when displaying, the intensity is clipped to prevent it going below this value

make_TDS_DispersionIntensityCurves.bottom_meV = 0

Calculated eigenvalues are clipped to this value before use.

make_TDS_DispersionIntensityCurves.NEUTRONCALC = 0

This activate neutron scattering calculations.

make_TDS_DispersionIntensityCurves.CohB = None

When neutroncalc is on, this must be a dictionary : for each atom name the Coherent lenght.

make_TDS_DispersionIntensityCurves.NeutronE = 0

When neutroncalc is on, the neutron energy in meV

make_TDS_DispersionIntensityCurves.branchWeight = None

a list of weights : one per branch.

make_TDS_DispersionIntensityCurves.Eigscal = 0

EigScal==1 Intensity are calculated WITH only eigenvector scalar products ; ==2 Intensity are calculated WITH only eigenvector scalar products PLUS Mass factor

make_TDS_DispersionIntensityCurves.UniqueIon = -1

If >=0. Selects one ion. All the other will be silent.