Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add top level parameter file module #37

Merged
merged 8 commits into from
Feb 18, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
287 changes: 287 additions & 0 deletions notebook/sammy.param/example.ipynb
Original file line number Diff line number Diff line change
@@ -0,0 +1,287 @@
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Overview\n",
"\n",
"This notebook demonstrates how to use the `sammy.paramter` module to load, construct and manipulate the parameter file (`*.par`) of the SAMMY suite."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import pathlib\n",
"import tempfile\n",
"\n",
"from pleiades.sammy.parfile import SammyParameterFile"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Construct a parameter object manually\n",
"\n",
"Let's build a simple parameter file from scratch."
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"entries=[ResonanceEntry(resonance_energy=0.0253, capture_width=0.1, channel1_width=0.2, channel2_width=0.3, channel3_width=0.4, vary_energy=<VaryFlag.NO: 0>, vary_capture_width=<VaryFlag.NO: 0>, vary_channel1=<VaryFlag.NO: 0>, vary_channel2=<VaryFlag.NO: 0>, vary_channel3=<VaryFlag.NO: 0>, igroup=1), ResonanceEntry(resonance_energy=0.0253, capture_width=0.1, channel1_width=0.2, channel2_width=0.3, channel3_width=0.4, vary_energy=<VaryFlag.NO: 0>, vary_capture_width=<VaryFlag.NO: 0>, vary_channel1=<VaryFlag.NO: 0>, vary_channel2=<VaryFlag.NO: 0>, vary_channel3=<VaryFlag.NO: 0>, igroup=2)]\n"
]
}
],
"source": [
"from pleiades.sammy.parameters.helper import VaryFlag\n",
"from pleiades.sammy.parameters.resonance import ResonanceCard, ResonanceEntry\n",
"\n",
"resonance_0 = ResonanceEntry(\n",
" resonance_energy=0.0253,\n",
" capture_width=0.1,\n",
" channel1_width=0.2,\n",
" channel2_width=0.3,\n",
" channel3_width=0.4,\n",
" vary_energy=VaryFlag.NO,\n",
" vary_capture_width=VaryFlag.NO,\n",
" vary_channel1_width=VaryFlag.YES,\n",
" vary_channel2_width=VaryFlag.NO,\n",
" vary_channel3_width=VaryFlag.YES,\n",
" igroup=1,\n",
")\n",
"\n",
"resonance_1 = ResonanceEntry(\n",
" resonance_energy=0.0253,\n",
" capture_width=0.1,\n",
" channel1_width=0.2,\n",
" channel2_width=0.3,\n",
" channel3_width=0.4,\n",
" vary_energy=VaryFlag.NO,\n",
" vary_capture_width=VaryFlag.NO,\n",
" vary_channel1_width=VaryFlag.NO,\n",
" vary_channel2_width=VaryFlag.YES,\n",
" vary_channel3_width=VaryFlag.NO,\n",
" igroup=2,\n",
")\n",
"\n",
"resonance_card = ResonanceCard(entries=[resonance_0, resonance_1])\n",
"\n",
"print(resonance_card)"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"parameters=RadiusParameters(effective_radius=1.0, true_radius=2.0, channel_mode=1, vary_effective=<VaryFlag.YES: 1>, vary_true=<VaryFlag.NO: 0>, spin_groups=[1, 2, 3], channels=[1, 2, 3]) particle_pair=None orbital_momentum=None relative_uncertainty=None absolute_uncertainty=None\n"
]
}
],
"source": [
"from pleiades.sammy.parameters.radius import RadiusCard, RadiusParameters\n",
"\n",
"radius_parameters = RadiusParameters(\n",
" effective_radius=1.0,\n",
" true_radius=2.0,\n",
" channel_mode=1,\n",
" vary_effective=VaryFlag.YES,\n",
" vary_true=VaryFlag.NO,\n",
" spin_groups=[1, 2, 3],\n",
" channels=[1, 2, 3],\n",
")\n",
"\n",
"radius_card = RadiusCard(parameters=radius_parameters)\n",
"\n",
"print(radius_card)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"now let's create a parameter object to hold everything"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"fudge=0.2 resonance=ResonanceCard(entries=[ResonanceEntry(resonance_energy=0.0253, capture_width=0.1, channel1_width=0.2, channel2_width=0.3, channel3_width=0.4, vary_energy=<VaryFlag.NO: 0>, vary_capture_width=<VaryFlag.NO: 0>, vary_channel1=<VaryFlag.NO: 0>, vary_channel2=<VaryFlag.NO: 0>, vary_channel3=<VaryFlag.NO: 0>, igroup=1), ResonanceEntry(resonance_energy=0.0253, capture_width=0.1, channel1_width=0.2, channel2_width=0.3, channel3_width=0.4, vary_energy=<VaryFlag.NO: 0>, vary_capture_width=<VaryFlag.NO: 0>, vary_channel1=<VaryFlag.NO: 0>, vary_channel2=<VaryFlag.NO: 0>, vary_channel3=<VaryFlag.NO: 0>, igroup=2)]) external_r=None broadening=None unused_correlated=None normalization=None radius=RadiusCard(parameters=RadiusParameters(effective_radius=1.0, true_radius=2.0, channel_mode=1, vary_effective=<VaryFlag.YES: 1>, vary_true=<VaryFlag.NO: 0>, spin_groups=[1, 2, 3], channels=[1, 2, 3]), particle_pair=None, orbital_momentum=None, relative_uncertainty=None, absolute_uncertainty=None) data_reduction=None orres=None paramagnetic=None user_resolution=None isotope=None\n"
]
}
],
"source": [
"par_file = SammyParameterFile(\n",
" fudge=0.2,\n",
" resonance=resonance_card,\n",
" radius=radius_card,\n",
")\n",
"\n",
"print(par_file)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"we can also view the string format before writing to a file"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" 2.5300E-02 1.0000E-01 2.0000E-01 3.0000E-01 4.0000E-01 0 0 0 0 0 1\n",
" 2.5300E-02 1.0000E-01 2.0000E-01 3.0000E-01 4.0000E-01 0 0 0 0 0 2\n",
"\n",
"0.2000 \n",
"RADII are in KEY-WORD format\n",
"Radius= 1.0 2.0\n",
"Flags= 1 0\n",
"Group= 1 Channels= 1 2 3\n",
"Group= 2 Channels= 1 2 3\n",
"Group= 3 Channels= 1 2 3\n",
"\n"
]
}
],
"source": [
"print(par_file.to_string())"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"then we can write the parameter object to a file"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" 2.5300E-02 1.0000E-01 2.0000E-01 3.0000E-01 4.0000E-01 0 0 0 0 0 1\n",
" 2.5300E-02 1.0000E-01 2.0000E-01 3.0000E-01 4.0000E-01 0 0 0 0 0 2\n",
"\n",
"0.2000 \n",
"RADII are in KEY-WORD format\n",
"Radius= 1.0 2.0\n",
"Flags= 1 0\n",
"Group= 1 Channels= 1 2 3\n",
"Group= 2 Channels= 1 2 3\n",
"Group= 3 Channels= 1 2 3\n",
"\n"
]
}
],
"source": [
"with tempfile.TemporaryDirectory() as tmpdir:\n",
" par_file_path = pathlib.Path(tmpdir) / \"sammy.par\"\n",
" par_file.to_file(par_file_path)\n",
"\n",
" with open(par_file_path, \"r\") as f:\n",
" print(f.read())"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Load from string/file\n",
"\n",
"We can also directly load a parameter file from a string or a file."
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"fudge=0.2 resonance=ResonanceCard(entries=[ResonanceEntry(resonance_energy=0.0253, capture_width=0.1, channel1_width=0.2, channel2_width=0.3, channel3_width=0.4, vary_energy=<VaryFlag.NO: 0>, vary_capture_width=<VaryFlag.NO: 0>, vary_channel1=<VaryFlag.NO: 0>, vary_channel2=<VaryFlag.NO: 0>, vary_channel3=<VaryFlag.NO: 0>, igroup=1), ResonanceEntry(resonance_energy=0.0253, capture_width=0.1, channel1_width=0.2, channel2_width=0.3, channel3_width=0.4, vary_energy=<VaryFlag.NO: 0>, vary_capture_width=<VaryFlag.NO: 0>, vary_channel1=<VaryFlag.NO: 0>, vary_channel2=<VaryFlag.NO: 0>, vary_channel3=<VaryFlag.NO: 0>, igroup=2)]) external_r=None broadening=None unused_correlated=None normalization=None radius=RadiusCard(parameters=RadiusParameters(effective_radius=1.0, true_radius=2.0, channel_mode=1, vary_effective=<VaryFlag.YES: 1>, vary_true=<VaryFlag.NO: 0>, spin_groups=[3], channels=[1, 2, 3]), particle_pair=None, orbital_momentum=None, relative_uncertainty=None, absolute_uncertainty=None) data_reduction=None orres=None paramagnetic=None user_resolution=None isotope=None\n",
" 2.5300E-02 1.0000E-01 2.0000E-01 3.0000E-01 4.0000E-01 0 0 0 0 0 1\n",
" 2.5300E-02 1.0000E-01 2.0000E-01 3.0000E-01 4.0000E-01 0 0 0 0 0 2\n",
"\n",
"0.2000 \n",
"RADII are in KEY-WORD format\n",
"Radius= 1.0 2.0\n",
"Flags= 1 0\n",
"Group= 3 Channels= 1 2 3\n",
"\n"
]
}
],
"source": [
"with tempfile.TemporaryDirectory() as tmpdir:\n",
" par_file_path = pathlib.Path(tmpdir) / \"sammy.par\"\n",
" par_file.to_file(par_file_path)\n",
"\n",
" par_file_read = SammyParameterFile.from_file(par_file_path)\n",
" print(par_file_read)\n",
" print(par_file_read.to_string())"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "pleiades-j7m2QWN6-py3.13",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.13.2"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
4 changes: 2 additions & 2 deletions src/pleiades/sammy/parameters/__init__.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
from pleiades.sammy.parameters.broadening import BroadeningParameterCard # noqa: F401
from pleiades.sammy.parameters.data_reduction import DataReductionCard # noqa: F401
from pleiades.sammy.parameters.external_r import ExternalREntry # noqa: F401
from pleiades.sammy.parameters.external_r import ExternalREntry, ExternalRFunction # noqa: F401
from pleiades.sammy.parameters.isotope import IsotopeCard # noqa: F401
from pleiades.sammy.parameters.normalization import NormalizationBackgroundCard # noqa: F401
from pleiades.sammy.parameters.orres import ORRESCard # noqa: F401
from pleiades.sammy.parameters.paramagnetic import ParamagneticParameters # noqa: F401
from pleiades.sammy.parameters.radius import RadiusCard # noqa: F401
from pleiades.sammy.parameters.resonance import ResonanceEntry # noqa: F401
from pleiades.sammy.parameters.resonance import ResonanceCard # noqa: F401
from pleiades.sammy.parameters.unused_var import UnusedCorrelatedCard # noqa: F401
from pleiades.sammy.parameters.user_resolution import UserResolutionParameters # noqa: F401
24 changes: 14 additions & 10 deletions src/pleiades/sammy/parameters/broadening.py
Original file line number Diff line number Diff line change
Expand Up @@ -200,38 +200,42 @@ def to_lines(self) -> List[str]:
format_float(self.deltal, width=9),
format_float(self.deltag, width=9),
format_float(self.deltae, width=9),
]
main_seg = " ".join(main_parts)
flag_parts = [
format_vary(self.flag_crfn),
format_vary(self.flag_temp),
format_vary(self.flag_thick),
format_vary(self.flag_deltal),
format_vary(self.flag_deltag),
format_vary(self.flag_deltae),
]
lines.append(" ".join(main_parts))
flag_seg = " ".join(flag_parts)
main_line = f"{main_seg} {flag_seg}"
lines.append(main_line)

# Add uncertainties line if any uncertainties are present
if any(getattr(self, f"d_{param}") is not None for param in ["crfn", "temp", "thick", "deltal", "deltag", "deltae"]):
unc_parts = [
format_float(getattr(self, f"d_{param}", 0.0), width=10)
for param in ["crfn", "temp", "thick", "deltal", "deltag", "deltae"]
format_float(getattr(self, f"d_{param}", 0.0), width=9) for param in ["crfn", "temp", "thick", "deltal", "deltag", "deltae"]
]
lines.append("".join(unc_parts))
lines.append(" ".join(unc_parts))

# Add Gaussian parameters if present
if self.deltc1 is not None and self.deltc2 is not None:
gaussian_parts = [
format_float(self.deltc1, width=10),
format_float(self.deltc2, width=10),
" " * 50, # Padding
format_float(self.deltc1, width=9),
format_float(self.deltc2, width=9),
" " * 40, # Padding
format_vary(self.flag_deltc1),
format_vary(self.flag_deltc2),
]
lines.append("".join(gaussian_parts))
lines.append(" ".join(gaussian_parts))

# Add Gaussian uncertainties if present
if self.d_deltc1 is not None or self.d_deltc2 is not None:
gaussian_unc_parts = [format_float(self.d_deltc1 or 0.0, width=10), format_float(self.d_deltc2 or 0.0, width=10)]
lines.append("".join(gaussian_unc_parts))
gaussian_unc_parts = [format_float(self.d_deltc1 or 0.0, width=9), format_float(self.d_deltc2 or 0.0, width=9)]
lines.append(" ".join(gaussian_unc_parts))

return lines

Expand Down
Loading