{ "cells": [ { "attachments": {}, "cell_type": "markdown", "id": "e98ee097-94cc-4dbd-8979-2882f06afaab", "metadata": {}, "source": [ "# Example-22: Line serialization and deserialization (YAML)" ] }, { "cell_type": "code", "execution_count": 1, "id": "89c0e17c-92a5-469d-aba2-e5edb3794d48", "metadata": {}, "outputs": [], "source": [ "# In this example lattice serialization and deserialization is demonstrated\n", "# All elements have serialize property, for all elements but lines, it returns a dictionary that can be used to construct the element\n", "# Element(**Element.serialize)\n", "# Line serialize property also returns a (nested) dictionary with element parameters and kinds\n", "# This dictionary can't be used to construct the original line with constructor\n", "# Instead, model.command.build.load_line can be used for construction (deserialization)\n", "# This function loads and processes YAML fine (can be created with model.command.build.save_line)" ] }, { "cell_type": "code", "execution_count": 2, "id": "97f107f0-3155-45b5-b210-c1fd8eaf9414", "metadata": {}, "outputs": [], "source": [ "# Import\n", "\n", "import torch\n", "\n", "from pathlib import Path\n", "from pprint import pprint\n", "\n", "from model.library.drift import Drift\n", "from model.library.quadrupole import Quadrupole\n", "from model.library.sextupole import Sextupole\n", "from model.library.dipole import Dipole\n", "from model.library.bpm import BPM\n", "from model.library.line import Line\n", "\n", "from model.command.external import load_lattice\n", "from model.command.build import build\n", "from model.command.build import save_line\n", "from model.command.build import load_line" ] }, { "cell_type": "code", "execution_count": 3, "id": "038e14dd-1fe5-48cc-af3c-8368402536a6", "metadata": {}, "outputs": [], "source": [ "# Define simple FODO based lattice\n", "\n", "QF = Quadrupole('QF', 0.5, +0.20)\n", "QD = Quadrupole('QD', 0.5, -0.19)\n", "SF = Sextupole('SF', 0.25)\n", "SD = Sextupole('SD', 0.25)\n", "DR = Drift('DR', 0.25)\n", "BM = Dipole('BM', 3.50, torch.pi/4.0)\n", "BA = BPM('BA', direction='inverse')\n", "BB = BPM('BB', direction='forward')\n", "\n", "FODO = Line('FODO', \n", " [BA, QF, DR, SF, DR, BM, DR, SD, DR, QD, QD, DR, SD, DR, BM, DR, SF, DR, QF, BB], \n", " propagate=True, \n", " dp=0.0, \n", " exact=False, \n", " output=True, \n", " matrix = True)" ] }, { "cell_type": "code", "execution_count": 4, "id": "127db8ab-1710-49ac-9fa9-4c39cd8cad30", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{'name': 'DR',\n", " 'length': 0.25,\n", " 'dp': 0.0,\n", " 'dx': 0.0,\n", " 'dy': 0.0,\n", " 'dz': 0.0,\n", " 'wx': 0.0,\n", " 'wy': 0.0,\n", " 'wz': 0.0,\n", " 'ns': 1,\n", " 'order': 0,\n", " 'exact': False,\n", " 'insertion': False,\n", " 'output': True,\n", " 'matrix': True}\n", "\n", "Drift(name=\"DR\", length=0.25, dp=0.0, exact=False, ns=1, order=0)\n", "\n" ] } ], "source": [ "# Element serialization and deserialization\n", "\n", "pprint(DR.serialize, sort_dicts=False)\n", "print()\n", "\n", "print(Drift(**DR.serialize))\n", "print()" ] }, { "cell_type": "code", "execution_count": 5, "id": "8d2b1a95-12c7-4301-9118-cca6b998eb5a", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{'kind': 'Line',\n", " 'name': 'FODO',\n", " 'sequence': [{'kind': 'BPM',\n", " 'name': 'BA',\n", " 'dp': 0.0,\n", " 'dx': 0.0,\n", " 'dy': 0.0,\n", " 'dz': 0.0,\n", " 'wx': 0.0,\n", " 'wy': 0.0,\n", " 'wz': 0.0,\n", " 'output': True,\n", " 'matrix': True,\n", " 'direction': 'inverse'},\n", " {'kind': 'Quadrupole',\n", " 'name': 'QF',\n", " 'length': 0.5,\n", " 'dp': 0.0,\n", " 'dx': 0.0,\n", " 'dy': 0.0,\n", " 'dz': 0.0,\n", " 'wx': 0.0,\n", " 'wy': 0.0,\n", " 'wz': 0.0,\n", " 'ns': 1,\n", " 'order': 0,\n", " 'exact': False,\n", " 'insertion': False,\n", " 'output': True,\n", " 'matrix': True,\n", " 'kn': 0.200000000000001,\n", " 'ks': 0.0},\n", " {'kind': 'Drift',\n", " 'name': 'DR',\n", " 'length': 0.25,\n", " 'dp': 0.0,\n", " 'dx': 0.0,\n", " 'dy': 0.0,\n", " 'dz': 0.0,\n", " 'wx': 0.0,\n", " 'wy': 0.0,\n", " 'wz': 0.0,\n", " 'ns': 1,\n", " 'order': 0,\n", " 'exact': False,\n", " 'insertion': False,\n", " 'output': True,\n", " 'matrix': True},\n", " {'kind': 'Sextupole',\n", " 'name': 'SF',\n", " 'length': 0.25,\n", " 'dp': 0.0,\n", " 'dx': 0.0,\n", " 'dy': 0.0,\n", " 'dz': 0.0,\n", " 'wx': 0.0,\n", " 'wy': 0.0,\n", " 'wz': 0.0,\n", " 'ns': 1,\n", " 'order': 0,\n", " 'exact': False,\n", " 'insertion': False,\n", " 'output': True,\n", " 'matrix': True,\n", " 'ms': 0.0},\n", " {'kind': 'Drift',\n", " 'name': 'DR',\n", " 'length': 0.25,\n", " 'dp': 0.0,\n", " 'dx': 0.0,\n", " 'dy': 0.0,\n", " 'dz': 0.0,\n", " 'wx': 0.0,\n", " 'wy': 0.0,\n", " 'wz': 0.0,\n", " 'ns': 1,\n", " 'order': 0,\n", " 'exact': False,\n", " 'insertion': False,\n", " 'output': True,\n", " 'matrix': True},\n", " {'kind': 'Dipole',\n", " 'name': 'BM',\n", " 'length': 3.5,\n", " 'dp': 0.0,\n", " 'dx': 0.0,\n", " 'dy': 0.0,\n", " 'dz': 0.0,\n", " 'wx': 0.0,\n", " 'wy': 0.0,\n", " 'wz': 0.0,\n", " 'ns': 1,\n", " 'order': 0,\n", " 'exact': False,\n", " 'insertion': False,\n", " 'output': True,\n", " 'matrix': True,\n", " 'angle': 0.7853981633974493,\n", " 'e1': 0.0,\n", " 'e2': 0.0,\n", " 'kn': 1e-15,\n", " 'ks': 0.0,\n", " 'ms': 0.0,\n", " 'mo': 0.0,\n", " 'e1_on': True,\n", " 'e2_on': True},\n", " {'kind': 'Drift',\n", " 'name': 'DR',\n", " 'length': 0.25,\n", " 'dp': 0.0,\n", " 'dx': 0.0,\n", " 'dy': 0.0,\n", " 'dz': 0.0,\n", " 'wx': 0.0,\n", " 'wy': 0.0,\n", " 'wz': 0.0,\n", " 'ns': 1,\n", " 'order': 0,\n", " 'exact': False,\n", " 'insertion': False,\n", " 'output': True,\n", " 'matrix': True},\n", " {'kind': 'Sextupole',\n", " 'name': 'SD',\n", " 'length': 0.25,\n", " 'dp': 0.0,\n", " 'dx': 0.0,\n", " 'dy': 0.0,\n", " 'dz': 0.0,\n", " 'wx': 0.0,\n", " 'wy': 0.0,\n", " 'wz': 0.0,\n", " 'ns': 1,\n", " 'order': 0,\n", " 'exact': False,\n", " 'insertion': False,\n", " 'output': True,\n", " 'matrix': True,\n", " 'ms': 0.0},\n", " {'kind': 'Drift',\n", " 'name': 'DR',\n", " 'length': 0.25,\n", " 'dp': 0.0,\n", " 'dx': 0.0,\n", " 'dy': 0.0,\n", " 'dz': 0.0,\n", " 'wx': 0.0,\n", " 'wy': 0.0,\n", " 'wz': 0.0,\n", " 'ns': 1,\n", " 'order': 0,\n", " 'exact': False,\n", " 'insertion': False,\n", " 'output': True,\n", " 'matrix': True},\n", " {'kind': 'Quadrupole',\n", " 'name': 'QD',\n", " 'length': 0.5,\n", " 'dp': 0.0,\n", " 'dx': 0.0,\n", " 'dy': 0.0,\n", " 'dz': 0.0,\n", " 'wx': 0.0,\n", " 'wy': 0.0,\n", " 'wz': 0.0,\n", " 'ns': 1,\n", " 'order': 0,\n", " 'exact': False,\n", " 'insertion': False,\n", " 'output': True,\n", " 'matrix': True,\n", " 'kn': -0.189999999999999,\n", " 'ks': 0.0},\n", " {'kind': 'Quadrupole',\n", " 'name': 'QD',\n", " 'length': 0.5,\n", " 'dp': 0.0,\n", " 'dx': 0.0,\n", " 'dy': 0.0,\n", " 'dz': 0.0,\n", " 'wx': 0.0,\n", " 'wy': 0.0,\n", " 'wz': 0.0,\n", " 'ns': 1,\n", " 'order': 0,\n", " 'exact': False,\n", " 'insertion': False,\n", " 'output': True,\n", " 'matrix': True,\n", " 'kn': -0.189999999999999,\n", " 'ks': 0.0},\n", " {'kind': 'Drift',\n", " 'name': 'DR',\n", " 'length': 0.25,\n", " 'dp': 0.0,\n", " 'dx': 0.0,\n", " 'dy': 0.0,\n", " 'dz': 0.0,\n", " 'wx': 0.0,\n", " 'wy': 0.0,\n", " 'wz': 0.0,\n", " 'ns': 1,\n", " 'order': 0,\n", " 'exact': False,\n", " 'insertion': False,\n", " 'output': True,\n", " 'matrix': True},\n", " {'kind': 'Sextupole',\n", " 'name': 'SD',\n", " 'length': 0.25,\n", " 'dp': 0.0,\n", " 'dx': 0.0,\n", " 'dy': 0.0,\n", " 'dz': 0.0,\n", " 'wx': 0.0,\n", " 'wy': 0.0,\n", " 'wz': 0.0,\n", " 'ns': 1,\n", " 'order': 0,\n", " 'exact': False,\n", " 'insertion': False,\n", " 'output': True,\n", " 'matrix': True,\n", " 'ms': 0.0},\n", " {'kind': 'Drift',\n", " 'name': 'DR',\n", " 'length': 0.25,\n", " 'dp': 0.0,\n", " 'dx': 0.0,\n", " 'dy': 0.0,\n", " 'dz': 0.0,\n", " 'wx': 0.0,\n", " 'wy': 0.0,\n", " 'wz': 0.0,\n", " 'ns': 1,\n", " 'order': 0,\n", " 'exact': False,\n", " 'insertion': False,\n", " 'output': True,\n", " 'matrix': True},\n", " {'kind': 'Dipole',\n", " 'name': 'BM',\n", " 'length': 3.5,\n", " 'dp': 0.0,\n", " 'dx': 0.0,\n", " 'dy': 0.0,\n", " 'dz': 0.0,\n", " 'wx': 0.0,\n", " 'wy': 0.0,\n", " 'wz': 0.0,\n", " 'ns': 1,\n", " 'order': 0,\n", " 'exact': False,\n", " 'insertion': False,\n", " 'output': True,\n", " 'matrix': True,\n", " 'angle': 0.7853981633974493,\n", " 'e1': 0.0,\n", " 'e2': 0.0,\n", " 'kn': 1e-15,\n", " 'ks': 0.0,\n", " 'ms': 0.0,\n", " 'mo': 0.0,\n", " 'e1_on': True,\n", " 'e2_on': True},\n", " {'kind': 'Drift',\n", " 'name': 'DR',\n", " 'length': 0.25,\n", " 'dp': 0.0,\n", " 'dx': 0.0,\n", " 'dy': 0.0,\n", " 'dz': 0.0,\n", " 'wx': 0.0,\n", " 'wy': 0.0,\n", " 'wz': 0.0,\n", " 'ns': 1,\n", " 'order': 0,\n", " 'exact': False,\n", " 'insertion': False,\n", " 'output': True,\n", " 'matrix': True},\n", " {'kind': 'Sextupole',\n", " 'name': 'SF',\n", " 'length': 0.25,\n", " 'dp': 0.0,\n", " 'dx': 0.0,\n", " 'dy': 0.0,\n", " 'dz': 0.0,\n", " 'wx': 0.0,\n", " 'wy': 0.0,\n", " 'wz': 0.0,\n", " 'ns': 1,\n", " 'order': 0,\n", " 'exact': False,\n", " 'insertion': False,\n", " 'output': True,\n", " 'matrix': True,\n", " 'ms': 0.0},\n", " {'kind': 'Drift',\n", " 'name': 'DR',\n", " 'length': 0.25,\n", " 'dp': 0.0,\n", " 'dx': 0.0,\n", " 'dy': 0.0,\n", " 'dz': 0.0,\n", " 'wx': 0.0,\n", " 'wy': 0.0,\n", " 'wz': 0.0,\n", " 'ns': 1,\n", " 'order': 0,\n", " 'exact': False,\n", " 'insertion': False,\n", " 'output': True,\n", " 'matrix': True},\n", " {'kind': 'Quadrupole',\n", " 'name': 'QF',\n", " 'length': 0.5,\n", " 'dp': 0.0,\n", " 'dx': 0.0,\n", " 'dy': 0.0,\n", " 'dz': 0.0,\n", " 'wx': 0.0,\n", " 'wy': 0.0,\n", " 'wz': 0.0,\n", " 'ns': 1,\n", " 'order': 0,\n", " 'exact': False,\n", " 'insertion': False,\n", " 'output': True,\n", " 'matrix': True,\n", " 'kn': 0.200000000000001,\n", " 'ks': 0.0},\n", " {'kind': 'BPM',\n", " 'name': 'BB',\n", " 'dp': 0.0,\n", " 'dx': 0.0,\n", " 'dy': 0.0,\n", " 'dz': 0.0,\n", " 'wx': 0.0,\n", " 'wy': 0.0,\n", " 'wz': 0.0,\n", " 'output': True,\n", " 'matrix': True,\n", " 'direction': 'forward'}],\n", " 'propagate': True,\n", " 'dp': 0.0,\n", " 'exact': False,\n", " 'output': True,\n", " 'matrix': True}\n" ] } ], "source": [ "# Line serialization\n", "\n", "pprint(FODO.serialize, sort_dicts=False)" ] }, { "cell_type": "code", "execution_count": 6, "id": "0afae386-1938-407d-97ed-84dcd461dbdc", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "tensor(27.4256, dtype=torch.float64)\n", "{'BPM': 16, 'Drift': 42, 'Quadrupole': 28, 'Dipole': 8, 'Sextupole': 16}\n" ] } ], "source": [ "# Build lattice from ELEGANT \n", "\n", "path = Path('ic.lte')\n", "data = load_lattice(path)\n", "ring = build('RING', 'ELEGANT', data)\n", "\n", "print(ring.length)\n", "print(ring.describe)" ] }, { "cell_type": "code", "execution_count": 7, "id": "252e60e4-ce5b-4eac-917d-48b0a8c618b2", "metadata": {}, "outputs": [], "source": [ "# Save lattice\n", "\n", "path = Path('ring.yaml')\n", "save_line(ring, path)" ] }, { "cell_type": "code", "execution_count": 8, "id": "939b8132-ac54-4eac-affe-bdfa04be5cd2", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "tensor(27.4256, dtype=torch.float64)\n", "{'BPM': 16, 'Drift': 42, 'Quadrupole': 28, 'Dipole': 8, 'Sextupole': 16}\n" ] } ], "source": [ "# Load lattice\n", "\n", "path = Path('ring.yaml')\n", "ring = load_line(path)\n", "\n", "print(ring.length)\n", "print(ring.describe)" ] } ], "metadata": { "colab": { "collapsed_sections": [ "myt0_gMIOq7b", "5d97819c" ], "name": "03_frequency.ipynb", "provenance": [] }, "kernelspec": { "display_name": "Python 3 (ipykernel)", "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.12.1" }, "latex_envs": { "LaTeX_envs_menu_present": true, "autoclose": false, "autocomplete": true, "bibliofile": "biblio.bib", "cite_by": "apalike", "current_citInitial": 1, "eqLabelWithNumbers": true, "eqNumInitial": 1, "hotkeys": { "equation": "Ctrl-E", "itemize": "Ctrl-I" }, "labels_anchors": false, "latex_user_defs": false, "report_style_numbering": false, "user_envs_cfg": false } }, "nbformat": 4, "nbformat_minor": 5 }