def get_ADS_to_fixed_correction(self, range_theta): """ Returns a correction range that will convert ADS data to fixed slit data. Use with caution. """ return 1.0 / get_fixed_to_ads_correction_range(range_theta, self.data_object)
def test_fixed_to_ads_correction_range(self): result = get_fixed_to_ads_correction_range( np.asanyarray([2.2551711385, 2.478038901, 2.7001518288, 2.9214422642, 3.1418428, 3.3612863, 3.5797059197, 3.7970351263]), self.goniometer_data ) self.assertIsNotNone(result) self.assertEquals(np.allclose( result, [7.74814435e-01, 6.15920411e-01, 4.27242611e-01, 2.18376385e-01, -2.50146408e-04, -2.17930643e-01, -4.24231682e-01, -6.09510086e-01] ), True)
def test_fixed_to_ads_correction_range(self): result = get_fixed_to_ads_correction_range( np.asanyarray([ 2.2551711385, 2.478038901, 2.7001518288, 2.9214422642, 3.1418428, 3.3612863, 3.5797059197, 3.7970351263 ]), self.goniometer_data) self.assertIsNotNone(result) self.assertEquals( np.allclose(result, [ 7.74814435e-01, 6.15920411e-01, 4.27242611e-01, 2.18376385e-01, -2.50146408e-04, -2.17930643e-01, -4.24231682e-01, -6.09510086e-01 ]), True)
def get_machine_correction_range(specimen): """ Calculate a correction factor for a certain sample length, sample absorption and machine setup. """ goniometer = specimen.goniometer range_st = np.sin(specimen.range_theta) correction_range = np.ones_like(specimen.range_theta) # Correct for automatic divergence slits first: if bool(goniometer.has_ads): correction_range *= get_fixed_to_ads_correction_range( specimen.range_theta, goniometer) # Then correct for sample absorption: if specimen.absorption > 0.0: correction_range *= np.minimum( 1.0 - np.exp(-2.0 * specimen.absorption / range_st), 1.0) # And finally correct for sample length: if not bool(goniometer.has_ads): L_Rta = specimen.sample_length / (goniometer.radius * tan(radians(goniometer.divergence))) correction_range *= np.minimum(range_st * L_Rta, 1) return correction_range
def get_ADS_to_fixed_correction(self, range_theta): """ Returns a correction range that will convert ADS data to fixed slit data. Use with caution. """ return 1.0 / get_fixed_to_ads_correction_range(range_theta, self.data_object)