fix: transmission is a fraction of full beam everywhere #31

Merged
perl_d merged 1 commits from fix/transmission-fraction into main 2026-09-08 00:22:16 +02:00
4 changed files with 35 additions and 4 deletions
+5 -1
View File
@@ -61,7 +61,11 @@ class DataCollectionParameters(BaseModel):
totalangle: int | None = Field( # was totalrange
default=None, validation_alias=AliasChoices("totalangle", "totalrange")
) # Only accept positive integers between 0 and 360
transmission: int | None = None # Only accept positive integers between 0 and 100
# Fraction of full beam (1.0 = full transmission), NOT a percentage.
# Values in (1.0, 100.0] fail validation by design: they are percent-scale
# leftovers and must be divided by 100 at whatever boundary produced them
# (user spreadsheets stay percent for humans; converters live in AareDB).
transmission: Annotated[float, Field(ge=0.0, le=1.0)] | None = None
targetresolution: float | None = None # Only accept positive float
beamsize: str | None = None
aperture: int | None = None # Optional string field
+2 -1
View File
@@ -11,7 +11,8 @@ from aarecommon.models.gridscan_decision import GridScanDecision
class RasterGridRequest(BaseModel):
dtz: float | None = None
transmission: float | None = None
# Fraction of full beam (1.0 = full transmission), NOT a percentage.
transmission: Annotated[float, Field(ge=0.0, le=1.0)] | None = None
file_prefix: str | None = None
exp_time_s: float
+5 -2
View File
@@ -1,12 +1,15 @@
from typing import Annotated
from jfjoch_client.models.scan_result import ScanResult
from pydantic import BaseModel
from pydantic import BaseModel, Field
from aarecommon.math.coordinate import SmargonCoordinate
class RotationScanRequest(BaseModel):
dtz: float | None = None
transmission: float | None = None
# Fraction of full beam (1.0 = full transmission), NOT a percentage.
transmission: Annotated[float, Field(ge=0.0, le=1.0)] | None = None
file_prefix: str | None = None
exp_time_s: float
+23
View File
@@ -71,3 +71,26 @@ def test_datacollectionparameters_accepts_new_fields():
assert params.processingresolution == 1.2
assert params.pdbmodel == "model.pdb"
assert params.cloud is False
def test_transmission_is_a_fraction_of_full_beam():
params = DataCollectionParameters(transmission=0.35)
assert params.transmission == 0.35
def test_transmission_boundaries_are_valid():
assert DataCollectionParameters(transmission=0.0).transmission == 0.0
assert DataCollectionParameters(transmission=1.0).transmission == 1.0
def test_transmission_rejects_percent_scale_values():
# Percent-scale leftovers (1.0, 100.0] must fail loudly, never be
# silently reinterpreted — converters live at the producing boundary.
for percent in (1.5, 35, 100):
with pytest.raises(ValidationError):
DataCollectionParameters(transmission=percent)
def test_transmission_rejects_negative_values():
with pytest.raises(ValidationError):
DataCollectionParameters(transmission=-0.1)