diff --git a/pyproject.toml b/pyproject.toml index cfb1dd38..f398b338 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -6,6 +6,16 @@ build-backend = "setuptools.build_meta" name = "vlab4mic" version = "0.1.1" description = "VLab4Mic: A virtual laboratory for microscopy simulation and validation" +keywords = [ + "microscopy", + "simulation", + "super-resolution", + "SMLM", + "STED", + "fluorescence", + "labeling", + "structural-biology" +] authors = [ { name = "Damián Martínez", email = "jdmartinezigc@gmail.com" }, { name = "Bruno M. Saraiva", email = "bruno.msaraiva2@gmail.com" }, diff --git a/src/vlab4mic/sweep_generator.py b/src/vlab4mic/sweep_generator.py index 4f088af9..18053acf 100644 --- a/src/vlab4mic/sweep_generator.py +++ b/src/vlab4mic/sweep_generator.py @@ -591,6 +591,16 @@ def set_sweep_parameters( exp_time=None, **kwargs, ): + # Snapshot the parameters the user actually provided so we can report + # back which ones will be swept and which were accepted but ignored. + _provided = { + name: value + for name, value in locals().items() + if name not in ("self", "kwargs") and value is not None + } + _provided.update( + {name: value for name, value in kwargs.items() if value is not None} + ) if probe_distance_to_epitope is not None: self.set_parameter_values( "probe", @@ -714,8 +724,18 @@ def set_sweep_parameters( self.set_parameter_values( "modality", "depth_of_field_nm", values=depth_of_field_nm ) - if peptide_motif is not None: - pass + # Parameters accepted by the signature (or via kwargs) that are not yet + # wired into the sweep. They are silently discarded otherwise, so warn. + _not_applied = {"peptide_motif", "minimal_distance"} | set(kwargs) + applied = sorted(name for name in _provided if name not in _not_applied) + ignored = sorted(name for name in _provided if name in _not_applied) + if applied: + print(f"Parameters set for sweep: {', '.join(applied)}") + if ignored: + print( + "WARNING: the following parameters were provided but are not " + f"applied during the sweep and will be ignored: {', '.join(ignored)}" + ) def clear_sweep_parameters(self): """ diff --git a/tests/test_sweep_generator_state.py b/tests/test_sweep_generator_state.py index f4010b33..82fabf3d 100644 --- a/tests/test_sweep_generator_state.py +++ b/tests/test_sweep_generator_state.py @@ -16,3 +16,39 @@ def test_analysis_dict_is_per_instance(): assert "only_in_a" not in b.analysis["unsorted"] assert b.analysis["dataframes"] is None + + +def test_set_sweep_parameters_reports_applied(capsys): + g = sweep_generator.sweep_generator() + capsys.readouterr() + g.set_sweep_parameters(probe_DoL=[0.3, 0.6], pixelsize_nm=[80, 100]) + out = capsys.readouterr().out + assert "Parameters set for sweep:" in out + assert "probe_DoL" in out and "pixelsize_nm" in out + assert "WARNING" not in out + + +def test_set_sweep_parameters_warns_on_ignored(capsys): + g = sweep_generator.sweep_generator() + capsys.readouterr() + g.set_sweep_parameters( + exp_time=[10, 20], + peptide_motif={"motif": 1}, + minimal_distance=5, + bogus_param=7, + ) + out = capsys.readouterr().out + assert "Parameters set for sweep: exp_time" in out + assert "WARNING" in out + for ignored in ("peptide_motif", "minimal_distance", "bogus_param"): + assert ignored in out + assert "exp_time" not in out.split("WARNING", 1)[1] + + +def test_set_sweep_parameters_silent_when_empty(capsys): + g = sweep_generator.sweep_generator() + capsys.readouterr() + g.set_sweep_parameters() + out = capsys.readouterr().out + assert "Parameters set for sweep:" not in out + assert "WARNING" not in out