diff --git a/CDTools/tools/analysis/analysis.py b/CDTools/tools/analysis/analysis.py index e28d2d2..85f051e 100644 --- a/CDTools/tools/analysis/analysis.py +++ b/CDTools/tools/analysis/analysis.py @@ -546,7 +546,8 @@ def calc_frc(im1, im2, basis, im_slice=None, nbins=None, snr=1., limit='side'): weights=F2.detach().cpu().numpy()) n_pix, bins = np.histogram(Rs, bins=nbins, range=frc_range) - n_pix = n_pix / 4 # This is for an apodized image, apodized with a hann window + + #n_pix = n_pix / 4 # This is for an apodized image, apodized with a hann window frc = np.abs(numerator) / np.sqrt(denominator_F1*denominator_F2) diff --git a/CDTools/tools/data/data.py b/CDTools/tools/data/data.py index be9785e..9e6eda4 100644 --- a/CDTools/tools/data/data.py +++ b/CDTools/tools/data/data.py @@ -63,7 +63,9 @@ def get_entry_info(cxi_file): metadata_attrs = ['title', 'experiment_identifier', 'experiment_description', - 'program_name'] + 'program_name', + 'start_time', + 'end_time'] metadata = {attr: str(e1[attr][()].decode()) for attr in metadata_attrs if attr in e1} @@ -481,6 +483,7 @@ def add_entry_info(cxi_file, metadata): cxi_file['entry_1'].create_dataset(key, data=asnumpy) + def add_sample_info(cxi_file, metadata): """Adds a dictionary of entry metadata to the entry_1/sample_1 group of a cxi file object diff --git a/CDTools/tools/interactions/interactions.py b/CDTools/tools/interactions/interactions.py index 5e850fd..42c2544 100644 --- a/CDTools/tools/interactions/interactions.py +++ b/CDTools/tools/interactions/interactions.py @@ -627,7 +627,7 @@ def RPI_interaction(probe, obj): # Again, just an inverse FFT but with an fftshift upsampled_obj = propagators.inverse_far_field(fftobj) - if obj.dim() == 3: + if obj.dim() >= 3: return probe[None,...] * upsampled_obj else: return probe * upsampled_obj diff --git a/tests/test_datasets.py b/tests/test_datasets.py index 17f00ea..6034634 100644 --- a/tests/test_datasets.py +++ b/tests/test_datasets.py @@ -61,7 +61,8 @@ def test_CDataset_from_cxi(test_ptycho_cxis): assert t.all(t.eq(t.tensor(expected['mask']),dataset.mask)) if expected['dark'] is not None: - assert t.all(t.eq(t.Tensor(expected['dark']),dataset.background)) + assert t.all(t.eq(t.as_tensor(expected['dark'], dtype=t.float32), + dataset.background)) @@ -147,8 +148,8 @@ def test_Ptycho2DDataset_init(): assert dataset.sample_info == sample_info assert dataset.wavelength == wavelength assert dataset.detector_geometry == detector_geometry - assert t.allclose(dataset.patterns, t.Tensor(patterns)) - assert t.allclose(dataset.translations, t.Tensor(translations)) + assert t.allclose(dataset.patterns, t.as_tensor(patterns)) + assert t.allclose(dataset.translations, t.as_tensor(translations)) def test_Ptycho2DDataset_from_cxi(test_ptycho_cxis): @@ -180,7 +181,8 @@ def test_Ptycho2DDataset_from_cxi(test_ptycho_cxis): assert t.all(t.eq(t.tensor(expected['mask']),dataset.mask)) if expected['dark'] is not None: - assert t.all(t.eq(t.Tensor(expected['dark']),dataset.background)) + assert t.all(t.eq(t.as_tensor(expected['dark'], dtype=t.float32), + dataset.background)) assert t.allclose(t.tensor(expected['data']),dataset.patterns) @@ -305,17 +307,15 @@ def test_PolarizedPtycho2DDataset_init(): detector_geometry=detector_geometry, mask=mask) - print(analyzer.dtype) - print(dataset.analyzer.dtype) assert t.all(t.eq(dataset.mask,t.BoolTensor(mask))) assert dataset.entry_info == entry_info assert dataset.sample_info == sample_info assert dataset.wavelength == wavelength assert dataset.detector_geometry == detector_geometry - assert t.allclose(dataset.patterns, t.Tensor(patterns)) - assert t.allclose(dataset.translations, t.Tensor(translations)) - assert t.allclose(dataset.analyzer, t.Tensor(analyzer)) - assert t.allclose(dataset.polarizer, t.Tensor(polarizer)) + assert t.allclose(dataset.patterns, t.as_tensor(patterns)) + assert t.allclose(dataset.translations, t.as_tensor(translations)) + assert t.allclose(dataset.analyzer, t.as_tensor(analyzer, dtype=t.float32)) + assert t.allclose(dataset.polarizer, t.as_tensor(polarizer, dtype=t.float32)) def test_PolarizedPtycho2DDataset_from_cxi(polarized_ptycho_cxi): @@ -347,7 +347,8 @@ def test_PolarizedPtycho2DDataset_from_cxi(polarized_ptycho_cxi): assert t.all(t.eq(t.tensor(expected['mask']),dataset.mask)) if expected['dark'] is not None: - assert t.all(t.eq(t.Tensor(expected['dark']),dataset.background)) + assert t.all(t.eq(t.as_tensor(expected['dark'], dtype=t.float32), + dataset.background)) assert t.allclose(t.tensor(expected['data']),dataset.patterns) diff --git a/tests/tools/test_analysis.py b/tests/tools/test_analysis.py index 86597cd..29ce65c 100644 --- a/tests/tools/test_analysis.py +++ b/tests/tools/test_analysis.py @@ -280,8 +280,9 @@ def test_calc_frc(): threshold = (snr + (2 * snr + 1) / np.sqrt(n_pix)) / \ (1 + snr + (2 * np.sqrt(snr)) / np.sqrt(n_pix)) - test_bins, test_frc, test_threshold = analysis.calc_frc(obj1, obj2, - basis, im_slice=np.s_[10:-10,20:-20], nbins=100, snr=2) + test_bins, test_frc, test_threshold = analysis.calc_frc( + obj1, obj2, basis, im_slice=np.s_[10:-10,20:-20], + nbins=100, snr=2, limit='corner') assert np.allclose(bins, test_bins) assert np.allclose(frc, test_frc) @@ -292,10 +293,11 @@ def test_calc_frc(): obj2_torch = t.as_tensor(obj2) basis_torch = t.tensor(basis) - test_bins_t, test_frc_t, test_threshold_t = analysis.calc_frc(obj1_torch, - obj2_torch, - basis_torch, - im_slice=np.s_[10:-10,20:-20], nbins=100, snr=2) + test_bins_t, test_frc_t, test_threshold_t = analysis.calc_frc( + obj1_torch, + obj2_torch, + basis_torch, + im_slice=np.s_[10:-10,20:-20], nbins=100, snr=2, limit='corner') assert np.allclose(bins, test_bins_t.numpy()) assert np.allclose(frc, test_frc_t.numpy()) diff --git a/tests/tools/test_data.py b/tests/tools/test_data.py index cf8b5dd..26fbe75 100644 --- a/tests/tools/test_data.py +++ b/tests/tools/test_data.py @@ -116,9 +116,12 @@ def test_add_entry_info(tmp_path): with data.create_cxi(tmp_path / 'test_add_entry_info.cxi') as f: data.add_entry_info(f, entry_info) + with h5py.File(tmp_path / 'test_add_entry_info.cxi','r') as f: read_entry_info = data.get_entry_info(f) + print(read_entry_info) + for key in entry_info: if isinstance(entry_info[key], np.ndarray): assert np.allclose(entry_info[key], read_entry_info[key]) diff --git a/tests/tools/test_interactions.py b/tests/tools/test_interactions.py index 922cd67..1178aa2 100644 --- a/tests/tools/test_interactions.py +++ b/tests/tools/test_interactions.py @@ -254,23 +254,22 @@ def test_ptycho_2D_sinc(single_pixel_probe, random_obj): def test_RPI_interaction(random_probe, random_obj): - random_obj1 = random_obj[:79,:68] - random_probe1 = random_probe + random_obj1 = random_obj[:79,:68] * 0 + 1 + random_probe1 = random_probe * 0 + 1 t_random_obj1 = t.as_tensor(random_obj1) t_random_probe1 = t.as_tensor(random_probe1) t_output1 = interactions.RPI_interaction(t_random_probe1, t_random_obj1) obj1_fourier = fftshift(fft.fft2(ifftshift(random_obj1), norm='ortho')) obj1_ups = np.zeros(random_probe1.shape[:2]).astype(np.complex128) - obj1_ups[(random_probe1.shape[0]-79)//2: - (random_probe1.shape[0]-79)//2 + 79, + obj1_ups[random_probe1.shape[0]//2 - 79//2: + -(random_probe1.shape[0]-79 - (random_probe1.shape[0]//2 - 79//2)), (random_probe1.shape[1]-68)//2: (random_probe1.shape[1]-68)//2 + 68] = obj1_fourier output1 = random_probe1 * fftshift(fft.ifft2(ifftshift(obj1_ups), norm='ortho')) - - assert np.allclose(t.as_tensor(t_output1), output1) + assert np.allclose(t_output1, output1) random_obj2 = np.stack([random_obj[:64,:89]]*3) random_probe2 = random_probe[3:,5:]