예제 #1
0
 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)
예제 #2
0
 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)
예제 #3
0
 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)
예제 #4
0
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
예제 #5
0
 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)