Skip to content

Commit adc0689

Browse files
committed
Start FODO example
1 parent 936b582 commit adc0689

File tree

6 files changed

+106
-12
lines changed

6 files changed

+106
-12
lines changed

.github/workflows/unit_tests.yml

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,3 +27,19 @@ jobs:
2727
- name: Test
2828
run: |
2929
pytest tests -v
30+
examples:
31+
name: examples
32+
runs-on: ubuntu-latest
33+
steps:
34+
- uses: actions/checkout@v4
35+
- name: Set up Python
36+
uses: actions/setup-python@v5
37+
with:
38+
python-version: "3.13"
39+
- name: Install dependencies
40+
run: |
41+
python -m pip install --upgrade pip
42+
pip install -r requirements.txt
43+
- name: Test
44+
run: |
45+
python examples/fodo.py

examples/fodo.py

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
import json
2+
import os
3+
import sys
4+
import yaml
5+
6+
# Add the parent directory to sys.path
7+
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), "..")))
8+
9+
from schema.MagneticMultipoleParameters import MagneticMultipoleParameters
10+
11+
from schema.DriftElement import DriftElement
12+
from schema.QuadrupoleElement import QuadrupoleElement
13+
14+
from schema.Item import Item
15+
from schema.Line import Line
16+
17+
18+
def main():
19+
drift1 = DriftElement(
20+
name="drift1",
21+
length=0.25,
22+
)
23+
quad1 = QuadrupoleElement(
24+
name="quad1",
25+
length=1.0,
26+
MagneticMultipoleP=MagneticMultipoleParameters(
27+
Bn1=1.0,
28+
),
29+
)
30+
drift2 = DriftElement(
31+
name="drift2",
32+
length=0.5,
33+
)
34+
quad2 = QuadrupoleElement(
35+
name="quad2",
36+
length=1.0,
37+
MagneticMultipoleP=MagneticMultipoleParameters(
38+
Bn1=-1.0,
39+
),
40+
)
41+
drift3 = DriftElement(
42+
name="drift3",
43+
length=0.5,
44+
)
45+
# Create line with all elements
46+
line = Line(
47+
line=[
48+
Item(item=drift1),
49+
Item(item=quad1),
50+
Item(item=drift2),
51+
Item(item=quad2),
52+
Item(item=drift3),
53+
]
54+
)
55+
# Serialize to YAML
56+
yaml_data = yaml.dump(line.model_dump(), default_flow_style=False)
57+
# Write YAML data to file
58+
yaml_file = "examples_fodo.yaml"
59+
with open(yaml_file, "w") as file:
60+
file.write(yaml_data)
61+
# Read YAML data from file
62+
with open(yaml_file, "r") as file:
63+
yaml_data = yaml.safe_load(file)
64+
# Parse YAML data
65+
loaded_line = Line(**yaml_data)
66+
# Validate loaded data
67+
assert line == loaded_line
68+
# Serialize to JSON
69+
json_data = json.dumps(line.model_dump(), sort_keys=True, indent=2)
70+
# Write JSON data to file
71+
json_file = "examples_fodo.json"
72+
with open(json_file, "w") as file:
73+
file.write(json_data)
74+
# Read JSON data from file
75+
with open(json_file, "r") as file:
76+
json_data = json.loads(file.read())
77+
# Parse JSON data
78+
loaded_line = Line(**json_data)
79+
# Validate loaded data
80+
assert line == loaded_line
81+
82+
83+
if __name__ == "__main__":
84+
main()

schema/DriftElement.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,4 @@ class DriftElement(ThickElement):
77
"""A field free region"""
88

99
# Discriminator field
10-
kind: Literal["DriftElement"] = "DriftElement"
10+
kind: Literal["Drift"] = "Drift"

schema/Item.py

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from pydantic import BaseModel, ConfigDict, Field
2-
from typing import Annotated, Literal, Union
2+
from typing import Annotated, Union
33

44
from schema.BaseElement import BaseElement
55
from schema.ThickElement import ThickElement
@@ -10,9 +10,6 @@
1010
class Item(BaseModel):
1111
"""An element of a line or a line itself"""
1212

13-
# Discriminator field
14-
kind: Literal["Item"] = "Item"
15-
1613
# Validate every time a new value is assigned to an attribute,
1714
# not only when an instance of Line is created
1815
model_config = ConfigDict(validate_assignment=True)

schema/Line.py

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
from pydantic import BaseModel, ConfigDict, Field
2-
from typing import Annotated, List, Literal
1+
from pydantic import BaseModel, ConfigDict
2+
from typing import List
33

44

55
from schema.Item import Item
@@ -8,14 +8,11 @@
88
class Line(BaseModel):
99
"""A line of elements and/or other lines"""
1010

11-
# Discriminator field
12-
kind: Literal["Line"] = "Line"
13-
1411
# Validate every time a new value is assigned to an attribute,
1512
# not only when an instance of Line is created
1613
model_config = ConfigDict(validate_assignment=True)
1714

18-
line: List[Annotated[Item, Field(discriminator="kind")]]
15+
line: List[Item]
1916

2017

2118
# Avoid circular import issues

schema/QuadrupoleElement.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ class QuadrupoleElement(ThickElement):
88
"""A quadrupole element"""
99

1010
# Discriminator field
11-
kind: Literal["QuadrupoleElement"] = "QuadrupoleElement"
11+
kind: Literal["Quadrupole"] = "Quadrupole"
1212

1313
# Magnetic multipole parameters
1414
MagneticMultipoleP: MagneticMultipoleParameters

0 commit comments

Comments
 (0)