class TestCalibrationController(unittest.TestCase): @classmethod def setUpClass(cls): cls.app = QtGui.QApplication([]) @classmethod def tearDownClass(cls): cls.app.quit() cls.app.deleteLater() def setUp(self): self.img_model = ImgModel() self.mask_model = MaskModel() self.calibration_model = CalibrationModel(self.img_model) self.calibration_model._calibrants_working_dir = os.path.join( data_path, 'calibrants') self.calibration_model.integrate_1d = MagicMock() self.calibration_model.integrate_2d = MagicMock() self.calibration_widget = CalibrationWidget() self.working_dir = {} self.calibration_controller = CalibrationController( working_dir=self.working_dir, img_model=self.img_model, mask_model=self.mask_model, widget=self.calibration_widget, calibration_model=self.calibration_model) def tearDown(self): del self.img_model del self.mask_model del self.calibration_model.cake_geometry del self.calibration_model.spectrum_geometry del self.calibration_model gc.collect() def test_automatic_calibration(self): self.calibration_controller.load_img( os.path.join(data_path, 'LaB6_40keV_MarCCD.tif')) self.calibration_controller.search_peaks(1179.6, 1129.4) self.calibration_controller.search_peaks(1268.5, 1119.8) self.calibration_controller.widget.sv_wavelength_txt.setText('0.31') self.calibration_controller.widget.sv_distance_txt.setText('200') self.calibration_controller.widget.sv_pixel_width_txt.setText('79') self.calibration_controller.widget.sv_pixel_height_txt.setText('79') calibrant_index = self.calibration_widget.calibrant_cb.findText('LaB6') self.calibration_controller.widget.calibrant_cb.setCurrentIndex( calibrant_index) QTest.mouseClick(self.calibration_widget.calibrate_btn, QtCore.Qt.LeftButton) self.calibration_model.integrate_1d.assert_called_once_with() self.calibration_model.integrate_2d.assert_called_once_with() self.assertEqual(QtGui.QProgressDialog.setValue.call_count, 15) calibration_parameter = self.calibration_model.get_calibration_parameter( )[0] self.assertAlmostEqual(calibration_parameter['dist'], .1967, places=4) def test_loading_and_saving_of_calibration_files(self): self.calibration_controller.load_calibration( os.path.join(data_path, 'LaB6_40keV_MarCCD.poni')) self.calibration_controller.save_calibration( os.path.join(data_path, 'calibration.poni')) self.assertTrue( os.path.exists(os.path.join(data_path, 'calibration.poni'))) os.remove(os.path.join(data_path, 'calibration.poni'))
class CbnAbsorptionCorrectionOptimizationTest(unittest.TestCase): def setUp(self): # creating Data objects self.img_data = ImgModel() self.img_data.load("Data/CbnCorrectionOptimization/Mg2SiO4_091.tif") self.calibration_data = CalibrationModel(self.img_data) self.calibration_data.load("Data/CbnCorrectionOptimization/LaB6_40keV side.poni") self.mask_data = MaskModel() self.mask_data.load_mask("Data/CbnCorrectionOptimization/Mg2SiO4_91_combined.mask") # creating the ObliqueAngleDetectorAbsorptionCorrection _, fit2d_parameter = self.calibration_data.get_calibration_parameter() detector_tilt = fit2d_parameter['tilt'] detector_tilt_rotation = fit2d_parameter['tiltPlanRotation'] self.tth_array = self.calibration_data.spectrum_geometry.twoThetaArray((2048, 2048)) self.azi_array = self.calibration_data.spectrum_geometry.chiArray((2048, 2048)) self.oiadac_correction = ObliqueAngleDetectorAbsorptionCorrection( self.tth_array, self.azi_array, detector_thickness=40, absorption_length=465.5, tilt=detector_tilt, rotation=detector_tilt_rotation, ) self.img_data.add_img_correction(self.oiadac_correction, "oiadac") def tearDown(self): del self.calibration_data.cake_geometry del self.calibration_data.spectrum_geometry def test_the_world(self): params = Parameters() params.add("diamond_thickness", value=2, min=1.9, max=2.3) params.add("seat_thickness", value=5.3, min=4.0, max=6.6, vary=False) params.add("small_cbn_seat_radius", value=0.2, min=0.10, max=0.5, vary=True) params.add("large_cbn_seat_radius", value=1.95, min=1.85, max=2.05, vary=False) params.add("tilt", value=3.3, min=0, max=8) params.add("tilt_rotation", value=0, min=-15, max=+15) params.add("cbn_abs_length", value=14.05, min=12, max=16) region = [8, 26] self.tth_array = 180.0 / np.pi * self.tth_array self.azi_array = 180.0 / np.pi * self.azi_array def fcn2min(params): cbn_correction = CbnCorrection( tth_array=self.tth_array, azi_array=self.azi_array, diamond_thickness=params['diamond_thickness'].value, seat_thickness=params['seat_thickness'].value, small_cbn_seat_radius=params['small_cbn_seat_radius'].value, large_cbn_seat_radius=params['large_cbn_seat_radius'].value, tilt=params['tilt'].value, tilt_rotation=params['tilt_rotation'].value, cbn_abs_length=params["cbn_abs_length"].value ) self.img_data.add_img_correction(cbn_correction, "cbn") tth, int = self.calibration_data.integrate_1d(mask=self.mask_data.get_mask()) self.img_data.delete_img_correction("cbn") ind = np.where((tth > region[0]) & (tth < region[1])) int = gaussian_filter1d(int, 20) return (np.diff(int[ind])) ** 2 def output_values(param1, iteration, residual): report_fit(param1) result = minimize(fcn2min, params, iter_cb=output_values) report_fit(params) # plotting result: cbn_correction = CbnCorrection( tth_array=self.tth_array, azi_array=self.azi_array, diamond_thickness=params['diamond_thickness'].value, seat_thickness=params['seat_thickness'].value, small_cbn_seat_radius=params['small_cbn_seat_radius'].value, large_cbn_seat_radius=params['large_cbn_seat_radius'].value, tilt=params['tilt'].value, tilt_rotation=params['tilt_rotation'].value, cbn_abs_length=params['cbn_abs_length'].value ) self.img_data.add_img_correction(cbn_correction, "cbn") tth, int = self.calibration_data.integrate_1d(mask=self.mask_data.get_mask()) ind = np.where((tth > region[0]) & (tth < region[1])) tth = tth[ind] int = int[ind] int_smooth = gaussian_filter1d(int, 10) int_diff1 = np.diff(int) int_diff1_smooth = np.diff(int_smooth) int_diff2 = np.diff(int_diff1) int_diff2_smooth = np.diff(int_diff1_smooth) plt.figure() plt.subplot(3, 1, 1) plt.plot(tth, int) plt.plot(tth, int_smooth) plt.subplot(3, 1, 2) plt.plot(int_diff1) plt.plot(int_diff1_smooth) plt.subplot(3, 1, 3) plt.plot(int_diff2) plt.plot(int_diff2_smooth) plt.savefig("Results/optimize_cbn_absorption.png", dpi=300) os.system("open " + "Results/optimize_cbn_absorption.png")
class CalibrationControllerTest(unittest.TestCase): def setUp(self): self.app = QtGui.QApplication(sys.argv) self.img_model = ImgModel() self.mask_model = MaskModel() self.calibration_model = CalibrationModel(self.img_model) self.calibration_model._calibrants_working_dir = os.path.join(data_path, 'calibrants') self.calibration_widget = CalibrationWidget() self.working_dir = {} self.calibration_controller = CalibrationController(working_dir=self.working_dir, img_model=self.img_model, mask_model=self.mask_model, widget=self.calibration_widget, calibration_model=self.calibration_model) def tearDown(self): del self.img_model del self.calibration_model.cake_geometry del self.calibration_model.spectrum_geometry del self.calibration_model del self.app gc.collect() def load_pilatus_1M_and_pick_peaks(self): self.calibration_controller.load_img(os.path.join(data_path,'CeO2_Pilatus1M.tif')) QTest.mouseClick(self.calibration_widget.automatic_peak_num_inc_cb, QtCore.Qt.LeftButton) self.assertFalse(self.calibration_widget.automatic_peak_num_inc_cb.isChecked()) self.calibration_controller.search_peaks(517.664434674, 647.529865592) self.calibration_controller.search_peaks(667.380513299, 525.252854758) self.calibration_controller.search_peaks(671.110095329, 473.571503774) self.calibration_controller.search_peaks(592.788872703, 350.495296791) self.calibration_controller.search_peaks(387.395462348, 390.987901686) self.calibration_controller.search_peaks(367.94835605, 554.290314848) self.calibration_widget.sv_wavelength_txt.setText('0.406626') self.calibration_widget.sv_distance_txt.setText('200') self.calibration_widget.sv_pixel_width_txt.setText('172') self.calibration_widget.sv_pixel_height_txt.setText('172') calibrant_index = self.calibration_widget.calibrant_cb.findText('CeO2') self.calibration_widget.calibrant_cb.setCurrentIndex(calibrant_index) self.mask_model.set_dimension(self.img_model.img_data.shape) def test_automatic_calibration1(self): self.calibration_controller.load_img(os.path.join(data_path,'LaB6_40keV_MarCCD.tif')) self.calibration_controller.search_peaks(1179.6, 1129.4) self.calibration_controller.search_peaks(1268.5, 1119.8) self.calibration_controller.widget.sv_wavelength_txt.setText('0.31') self.calibration_controller.widget.sv_distance_txt.setText('200') self.calibration_controller.widget.sv_pixel_width_txt.setText('79') self.calibration_controller.widget.sv_pixel_height_txt.setText('79') calibrant_index = self.calibration_widget.calibrant_cb.findText('LaB6') self.calibration_controller.widget.calibrant_cb.setCurrentIndex(calibrant_index) self.calibration_controller.calibrate() self.calibration_controller.widget.cake_view.set_vertical_line_pos(1419.8, 653.4) def test_automatic_calibration2(self): self.calibration_controller.load_img(os.path.join(data_path,'LaB6_OffCenter_PE.tif')) self.calibration_controller.search_peaks(1245.2, 1919.3) self.calibration_controller.search_peaks(1334.0, 1823.7) self.calibration_controller.widget.sv_wavelength_txt.setText('0.3344') self.calibration_controller.widget.sv_distance_txt.setText('500') self.calibration_controller.widget.sv_pixel_width_txt.setText('200') self.calibration_controller.widget.sv_pixel_height_txt.setText('200') calibrant_index = self.calibration_widget.calibrant_cb.findText('LaB6') self.calibration_controller.widget.calibrant_cb.setCurrentIndex(calibrant_index) self.calibration_controller.calibrate() self.calibration_controller.widget.cake_view.set_vertical_line_pos(206.5, 171.6) def test_automatic_calibration3(self): self.load_pilatus_1M_and_pick_peaks() start_values = self.calibration_widget.get_start_values() self.assertAlmostEqual(start_values['wavelength'], 0.406626e-10) self.assertAlmostEqual(start_values['pixel_height'], 172e-6) self.assertAlmostEqual(start_values['pixel_width'], 172e-6) self.calibration_controller.load_calibrant() self.assertAlmostEqual(self.calibration_model.calibrant.wavelength, 0.406626e-10) QTest.mouseClick(self.calibration_widget.integrate_btn, QtCore.Qt.LeftButton) calibration_parameter = self.calibration_model.get_calibration_parameter()[0] self.assertAlmostEqual(calibration_parameter['dist'], .2086, places=4) def test_automatic_calibration_with_supersampling(self): self.load_pilatus_1M_and_pick_peaks() self.img_model.set_supersampling(2) self.calibration_model.set_supersampling(2) self.calibration_controller.calibrate() def test_automatic_calibration_with_supersampling_and_mask(self): self.load_pilatus_1M_and_pick_peaks() self.img_model.set_supersampling(2) self.mask_model.mask_below_threshold(self.img_model._img_data, 1) self.mask_model.set_supersampling(2) self.calibration_model.set_supersampling(2) self.calibration_controller.widget.use_mask_cb.setChecked(True) self.calibration_controller.calibrate() def test_calibrating_one_image_size_and_loading_different_image_size(self): self.load_pilatus_1M_and_pick_peaks() self.calibration_controller.calibrate() self.calibration_model.integrate_1d() self.calibration_model.integrate_2d() self.calibration_controller.load_img(os.path.join(data_path, 'CeO2_Pilatus1M.tif')) self.calibration_model.integrate_1d() self.calibration_model.integrate_2d() def test_loading_and_saving_of_calibration_files(self): self.calibration_controller.load_calibration(os.path.join(data_path, 'LaB6_40keV_MarCCD.poni')) self.calibration_controller.save_calibration(os.path.join(data_path, 'calibration.poni')) self.assertTrue(os.path.exists(os.path.join(data_path, 'calibration.poni'))) os.remove(os.path.join(data_path, 'calibration.poni'))