Skip to content

Commit 5463d87

Browse files
correct tests and tutorial example.
1 parent 11c2ba4 commit 5463d87

File tree

3 files changed

+47
-24
lines changed

3 files changed

+47
-24
lines changed

docs/examples/workbook.md

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -29,17 +29,19 @@ First, let's create synthetic data that mimics photon-limited imaging:
2929

3030
```python
3131
# Parameters for synthetic data
32-
n_frames = 100
33-
height, width = 512, 512
34-
mean_photons = 50 # Average photons per pixel
35-
zero_level = 100 # Camera baseline
36-
conversion_gain = 2.5 # ADU per photon
32+
n_frames = 30
33+
height, width = 120, 120
34+
mean_photon_rate = 5.0 # Average photons per pixel (exponential distribution of rates)
35+
zero_level = -10.0 # camera baseline
36+
conversion_gain = 2.5 # levels per photon
3737

3838
# Generate Poisson-distributed photon counts
39-
photon_counts = np.random.poisson(lam=mean_photons, size=(n_frames, height, width))
39+
photon_rate = np.random.exponential(scale=5, size=(1, height, width))
40+
photon_counts = np.random.poisson(lam=np.tile(photon_rate, (n_frames, 1, 1)))
41+
measured_signal = photon_counts + np.random.randn(*size) * 0.2
4042

41-
# Convert to camera signal (ADU)
42-
camera_signal = (photon_counts * conversion_gain + zero_level).astype('int16')
43+
# Convert to camera signal
44+
camera_signal = (measured_signal * conversion_gain + zero_level).astype('int16')
4345

4446
print(f"Data shape: {camera_signal.shape}")
4547
print(f"Data range: [{camera_signal.min()}, {camera_signal.max()}]")
@@ -58,16 +60,16 @@ estimated_gain = result['sensitivity']
5860
estimated_zero = result['zero_level']
5961

6062
print(f"\nTrue parameters:")
61-
print(f" Conversion gain: {conversion_gain:.3f} ADU/photon")
62-
print(f" Zero level: {zero_level:.1f} ADU")
63+
print(f" Conversion gain: {conversion_gain:.3f} units/photon")
64+
print(f" Zero level: {zero_level:.1f} ")
6365

6466
print(f"\nEstimated parameters:")
65-
print(f" Conversion gain: {estimated_gain:.3f} ADU/photon")
66-
print(f" Zero level: {estimated_zero:.1f} ADU")
67+
print(f" Conversion gain: {estimated_gain:.3f} units/photon")
68+
print(f" Zero level: {estimated_zero:.1f}")
6769

6870
print(f"\nEstimation error:")
69-
print(f" Gain error: {abs(estimated_gain - conversion_gain):.3f} ADU/photon")
70-
print(f" Zero level error: {abs(estimated_zero - zero_level):.1f} ADU")
71+
print(f" Gain error: {abs(estimated_gain - conversion_gain):.3f} units/photon")
72+
print(f" Zero level error: {abs(estimated_zero - zero_level):.1f} units")
7173
```
7274

7375
## Visualize Noise Model

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ name = "anscombe_transform"
77
version = "1.0.0"
88

99
authors = [
10-
{ name = "Jerome Lecoq", email = "[email protected]" },
1110
{ name = "Dimitri Yatsenko", email = "[email protected]" },
11+
{ name = "Jerome Lecoq", email = "[email protected]" },
1212
{ name = "Davis Bennett", email = "[email protected]" },
1313
]
1414
maintainers = [

tests/test_zarr.py

Lines changed: 30 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,35 +10,57 @@
1010
def test_zarr_v2_roundtrip() -> None:
1111
decoded_dtype = "int16"
1212
encoded_dtype = "uint8"
13-
data = np.random.poisson(100, size=(20, 20)).astype(decoded_dtype)
13+
14+
# generate fake data
15+
np.random.seed(42)
16+
size = (20, 20)
1417
sensitivity = 100.0
18+
zero_level = -5.0
19+
true_rate = np.random.exponential(scale=5, size=size)
20+
data = (
21+
zero_level
22+
+ sensitivity * (np.random.poisson(true_rate) + np.random.randn(*size) * 0.25)
23+
).astype(decoded_dtype)
24+
25+
# construct codec
1526
codec = AnscombeTransformV2(
1627
conversion_gain=sensitivity,
17-
zero_level=0,
28+
zero_level=zero_level,
1829
encoded_dtype=encoded_dtype,
1930
decoded_dtype=decoded_dtype,
2031
)
2132
data_encoded = codec.encode(data)
2233
data_rt = codec.decode(data_encoded).reshape(data.shape)
2334

24-
store = {}
25-
2635
# write data
36+
store = {}
2737
_ = create_array(store=store, data=data, zarr_format=2, compressors=codec)
38+
2839
# read data
2940
z_arr_r = open_array(store=store)
3041
assert z_arr_r.dtype == decoded_dtype
31-
assert nearly_equal(z_arr_r, data_rt, sensitivity / 2)
42+
breakpoint()
43+
assert nearly_equal(z_arr_r, data_rt, sensitivity * 0.5)
3244

3345

3446
def test_zarr_v3_roundtrip() -> None:
3547
decoded_dtype = "int16"
3648
encoded_dtype = "uint8"
37-
data = np.random.poisson(100, size=(20, 20)).astype(decoded_dtype)
49+
50+
# generate fake data
51+
np.random.seed(42)
52+
size = (20, 20)
3853
sensitivity = 100.0
54+
zero_level = -5.0
55+
true_rate = np.random.exponential(scale=5, size=size)
56+
data = (
57+
zero_level
58+
+ sensitivity * (np.random.poisson(true_rate) + np.random.randn(*size) * 0.25)
59+
).astype(decoded_dtype)
60+
3961
codec = AnscombeTransformV3(
4062
conversion_gain=sensitivity,
41-
zero_level=0,
63+
zero_level=zero_level,
4264
encoded_dtype=encoded_dtype,
4365
decoded_dtype=decoded_dtype,
4466
)
@@ -47,9 +69,8 @@ def test_zarr_v3_roundtrip() -> None:
4769
data_encoded = codec._encode(data)
4870
data_rt = codec._decode(data_encoded).reshape(data.shape)
4971

50-
store = {}
51-
5272
# write data
73+
store = {}
5374
_ = create_array(store=store, data=data, zarr_format=3, filters=[codec])
5475
# read data
5576
z_arr_r = open_array(store=store)

0 commit comments

Comments
 (0)