@@ -241,7 +241,7 @@ def sf_magnetic_neutron(q, r, moment, magnetic_formfactor=None, occ=None, debye
241241 # sf[n] = np.dot(sfm, incident_polarisation_vector)
242242 # sf[n] = np.dot(sfm, sfm) # maximum possible
243243 # average polarisation
244- sf [n ] = (np .dot (sfm , [1 , 0 , 0 ]) + np .dot (sfm , [0 , 1 , 0 ]) + np .dot (sfm , [0 , 0 , 1 ])) / 3
244+ # sf[n] = (np.dot(sfm, [1, 0, 0]) + np.dot(sfm, [0, 1, 0]) + np.dot(sfm, [0, 0, 1])) / 3
245245 return sf
246246
247247
@@ -818,16 +818,16 @@ def get_scattering_function(scattering_type):
818818 if scattering_type in SCATTERING_TYPES ['electron' ]:
819819 return sf_atom
820820 if scattering_type in SCATTERING_TYPES ['xray magnetic' ]:
821- return sf_magnetic_xray
821+ return sf_magnetic_xray_polarised
822822 if scattering_type in SCATTERING_TYPES ['neutron magnetic' ]:
823- return sf_magnetic_neutron
823+ return sf_magnetic_neutron_polarised
824824 if scattering_type in SCATTERING_TYPES ['neutron polarised' ]:
825825 return sf_magnetic_neutron_polarised
826826 if scattering_type in SCATTERING_TYPES ['xray polarised' ]:
827827 return sf_magnetic_xray_polarised
828828 if scattering_type in SCATTERING_TYPES ['xray resonant' ]:
829829 return sf_magnetic_xray_resonant
830- raise ( Exception ('Scattering name %s not recognised' % scattering_type ) )
830+ raise Exception ('Scattering name %s not recognised' % scattering_type )
831831
832832
833833def options (occ = None , debyewaller = None , scattering_factor = None ,
@@ -853,10 +853,39 @@ def options(occ=None, debyewaller=None, scattering_factor=None,
853853 return locals ()
854854
855855
856+ def scattering_factors (scattering_type , atom_type , qmag , enval ,
857+ use_sears = False , use_wasskirf = False ):
858+ """
859+ Return an array of scattering factors based on the radiation
860+ :param scattering_type: str radiation, see "get_scattering_function()"
861+ :param atom_type: [nx1] str array of element symbols
862+ :param qmag: [mx1] or None, float array of wavevector magnitudes for reflections
863+ :param enval: [ox1] or None, float array of energies in keV
864+ :param use_sears: if True, use neutron scattering lengths from ITC Vol. C, By V. F. Sears
865+ :param use_wasskirf: if True, use x-ray scattering factors from Waasmaier and Kirfel
866+ :return: [nxmxo] array of scattering factors
867+ """
868+ if scattering_type in SCATTERING_TYPES ['neutron' ]:
869+ if use_sears :
870+ return fc .neutron_scattering_length (atom_type , 'Sears' )
871+ else :
872+ return fc .neutron_scattering_length (atom_type )
873+ elif scattering_type in SCATTERING_TYPES ['electron' ]:
874+ return fc .electron_scattering_factor (atom_type , qmag )
875+ elif scattering_type in SCATTERING_TYPES ['xray fast' ]:
876+ return fc .atom_properties (atom_type , 'Z' )
877+ elif scattering_type in SCATTERING_TYPES ['xray dispersion' ]:
878+ return fc .xray_scattering_factor_resonant (atom_type , qmag , enval )
879+ elif use_wasskirf :
880+ return fc .xray_scattering_factor_WaasKirf (atom_type , qmag )
881+ else :
882+ return fc .xray_scattering_factor (atom_type , qmag )
883+
884+
856885def autostructurefactor (scattering_type , q , r , * args , ** kwargs ):
857886 """
858887 Choose a scattering type can calcuate the structure factor
859- :param scattering_type:
888+ :param scattering_type: str radiation, see "get_scattering_function()"
860889 :param q: array [n,3] reflection positions in A^-1
861890 :param r: array [m,3] atomic positions in A
862891 :param args: additional arguments to pass to choosen scattering function
0 commit comments