Example-23: Advanced line editing

[1]:
# In this example some advanced line addition options are explored

# Given an ELEGANT lattice the following is performed

# 1. build lattice
# 2. flatten lattice
# 3. merge drifts
# 4. split BPMs (replace BPMs with forward/inverse BPM elements)
# 5. change lattice start
# 6. split quadrupoles and insert correctors
# 7. rename inserted correctors (binding to different tensors)
# 8. generate sublines (bpm to bpm transformations)
# 9. generate layout and plot lattice

# Additionaly all line methods and properties are illustrated (also see the previous line example)
[2]:
# Import

from pprint import pprint

import torch

from pathlib import Path

from plotly import graph_objects

from model.library.line import Line
from model.library.corrector import Corrector

from model.command.external import load_lattice
from model.command.build import save_line
from model.command.build import load_line
from model.command.build import build
from model.command.layout import Layout
[3]:
# Load test ELEGANT lattice

path = Path('ic.lte')
data = load_lattice(path)
[4]:
# Build from ELEGANT style dictionary

ring:Line = build('RING', 'ELEGANT', data)
ring.propagate = True

print(f'{ring.length.item():.3f}')
print(f'{ring.angle.item():.3f}')
print(ring.describe)
27.426
6.283
{'BPM': 16, 'Drift': 42, 'Quadrupole': 28, 'Dipole': 8, 'Sextupole': 16}
[5]:
# Print full ring
# Note, lines, if any, are always flattened in printout

print(ring)
BPM(name="BPM05", direction="forward", dp=0.0)
Drift(name="D09", length=0.116715, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q3D3", length=0.19657, kn=-8.426928737999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="D19", length=0.161715, dp=0.0, exact=False, ns=1, order=0)
Drift(name="D38", length=0.806715, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q3D2", length=0.19657, kn=-2.695188250999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="D12", length=0.126715, dp=0.0, exact=False, ns=1, order=0)
Drift(name="D42", length=0.095, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q3F2", length=0.18, kn=13.544085930000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="D28", length=0.065, dp=0.0, exact=False, ns=1, order=0)
BPM(name="BPM07", direction="forward", dp=0.0)
Drift(name="D10", length=0.11958, dp=0.0, exact=False, ns=1, order=0)
Dipole(name="RM5", length=0.87284, angle=0.785398163400001, e1=0.0, e1_on=True, e2=0.0, e2_on=True, kn=-2.379107171999999, ks=0.0, ms=0.0, mo=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="D05", length=0.10958, dp=0.0, exact=False, ns=1, order=0)
Sextupole(name="SY1_3F4", length=0.08, ms=-277.23165, dp=0.0, exact=False, ns=1, order=0)
Drift(name="D23", length=0.044, dp=0.0, exact=False, ns=1, order=0)
BPM(name="BPM08", direction="forward", dp=0.0)
Drift(name="D07", length=0.111, dp=0.0, exact=False, ns=1, order=0)
Sextupole(name="SX1_3F4", length=0.08, ms=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="D30", length=0.07, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q3F4", length=0.18, kn=12.030967120000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="D30", length=0.07, dp=0.0, exact=False, ns=1, order=0)
Sextupole(name="SX2_3F4", length=0.08, ms=206.44984, dp=0.0, exact=False, ns=1, order=0)
Drift(name="D16", length=0.155, dp=0.0, exact=False, ns=1, order=0)
Sextupole(name="SY2_3F4", length=0.08, ms=-277.23165, dp=0.0, exact=False, ns=1, order=0)
Drift(name="D05", length=0.10958, dp=0.0, exact=False, ns=1, order=0)
Dipole(name="RM6", length=0.87284, angle=0.785398163400001, e1=0.0, e1_on=True, e2=0.0, e2_on=True, kn=-2.379107171999999, ks=0.0, ms=0.0, mo=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="D10", length=0.11958, dp=0.0, exact=False, ns=1, order=0)
BPM(name="BPM09", direction="forward", dp=0.0)
Drift(name="D28", length=0.065, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q3F1", length=0.18, kn=13.562217330000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="D14", length=0.12, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q3D1", length=0.18, kn=-6.763721520999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="D21", length=0.36, dp=0.0, exact=False, ns=1, order=0)
Drift(name="D21", length=0.36, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q4D1", length=0.18, kn=-6.763721520999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="D14", length=0.12, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q4F1", length=0.18, kn=13.562217330000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="D30", length=0.07, dp=0.0, exact=False, ns=1, order=0)
BPM(name="BPM10", direction="forward", dp=0.0)
Drift(name="D08", length=0.11458, dp=0.0, exact=False, ns=1, order=0)
Dipole(name="RM7", length=0.87284, angle=0.785398163400001, e1=0.0, e1_on=True, e2=0.0, e2_on=True, kn=-2.379107171999999, ks=0.0, ms=0.0, mo=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="D05", length=0.10958, dp=0.0, exact=False, ns=1, order=0)
Sextupole(name="SY1_4F4", length=0.08, ms=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="D16", length=0.155, dp=0.0, exact=False, ns=1, order=0)
Sextupole(name="SX1_4F4", length=0.08, ms=206.44984, dp=0.0, exact=False, ns=1, order=0)
Drift(name="D30", length=0.07, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q4F4", length=0.18, kn=12.030967120000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="D30", length=0.07, dp=0.0, exact=False, ns=1, order=0)
Sextupole(name="SX2_4F4", length=0.08, ms=206.44984, dp=0.0, exact=False, ns=1, order=0)
Drift(name="D11", length=0.11, dp=0.0, exact=False, ns=1, order=0)
BPM(name="BPM11", direction="forward", dp=0.0)
Drift(name="D24", length=0.045, dp=0.0, exact=False, ns=1, order=0)
Sextupole(name="SY2_4F4", length=0.08, ms=-277.23165, dp=0.0, exact=False, ns=1, order=0)
Drift(name="D05", length=0.10958, dp=0.0, exact=False, ns=1, order=0)
Dipole(name="RM8", length=0.87284, angle=0.785398163400001, e1=0.0, e1_on=True, e2=0.0, e2_on=True, kn=-2.379107171999999, ks=0.0, ms=0.0, mo=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="D10", length=0.11958, dp=0.0, exact=False, ns=1, order=0)
BPM(name="BPM12", direction="forward", dp=0.0)
Drift(name="D28", length=0.065, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q4F2", length=0.18, kn=13.562217330000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="D42", length=0.095, dp=0.0, exact=False, ns=1, order=0)
Drift(name="D12", length=0.126715, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q4D2", length=0.19657, kn=-2.645953025999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="D39", length=0.811715, dp=0.0, exact=False, ns=1, order=0)
Drift(name="D17", length=0.156715, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q4D3", length=0.19657, kn=-8.526334987999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="D09", length=0.116715, dp=0.0, exact=False, ns=1, order=0)
BPM(name="BPM13", direction="forward", dp=0.0)
Drift(name="D27", length=0.056715, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q4F3", length=0.19657, kn=7.792169674000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="D29", length=0.066715, dp=0.0, exact=False, ns=1, order=0)
Drift(name="D06", length=0.1119, dp=0.0, exact=False, ns=1, order=0)
Drift(name="D40", length=0.841, dp=0.0, exact=False, ns=1, order=0)
Drift(name="D06", length=0.1119, dp=0.0, exact=False, ns=1, order=0)
Drift(name="D29", length=0.066715, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q1F3", length=0.19657, kn=7.792169674000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="D31", length=0.071715, dp=0.0, exact=False, ns=1, order=0)
BPM(name="BPM14", direction="forward", dp=0.0)
Drift(name="D01", length=0.101715, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q1D3", length=0.19657, kn=-8.526334987999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="D20", length=0.166715, dp=0.0, exact=False, ns=1, order=0)
Drift(name="D36", length=0.801715, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q1D2", length=0.19657, kn=-2.645953025999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="D15", length=0.131715, dp=0.0, exact=False, ns=1, order=0)
Drift(name="D41", length=0.09, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q1F2", length=0.18, kn=13.562217330000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="D30", length=0.07, dp=0.0, exact=False, ns=1, order=0)
BPM(name="BPM15", direction="forward", dp=0.0)
Drift(name="D08", length=0.11458, dp=0.0, exact=False, ns=1, order=0)
Dipole(name="RM1", length=0.87284, angle=0.785398163400001, e1=0.0, e1_on=True, e2=0.0, e2_on=True, kn=-2.379107171999999, ks=0.0, ms=0.0, mo=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="D05", length=0.10958, dp=0.0, exact=False, ns=1, order=0)
Sextupole(name="SY1_1F4", length=0.08, ms=-277.23165, dp=0.0, exact=False, ns=1, order=0)
Drift(name="D35", length=0.0775, dp=0.0, exact=False, ns=1, order=0)
BPM(name="BPM16", direction="forward", dp=0.0)
Drift(name="D35", length=0.0775, dp=0.0, exact=False, ns=1, order=0)
Sextupole(name="SX1_1F4", length=0.08, ms=206.44984, dp=0.0, exact=False, ns=1, order=0)
Drift(name="D30", length=0.07, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q1F4", length=0.18, kn=12.030967120000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="D30", length=0.07, dp=0.0, exact=False, ns=1, order=0)
Sextupole(name="SX2_1F4", length=0.08, ms=206.44984, dp=0.0, exact=False, ns=1, order=0)
Drift(name="D16", length=0.155, dp=0.0, exact=False, ns=1, order=0)
Sextupole(name="SY2_1F4", length=0.08, ms=-277.23165, dp=0.0, exact=False, ns=1, order=0)
Drift(name="D05", length=0.10958, dp=0.0, exact=False, ns=1, order=0)
Dipole(name="RM2", length=0.87284, angle=0.785398163400001, e1=0.0, e1_on=True, e2=0.0, e2_on=True, kn=-2.379107171999999, ks=0.0, ms=0.0, mo=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="D13", length=0.12958, dp=0.0, exact=False, ns=1, order=0)
BPM(name="BPM17", direction="forward", dp=0.0)
Drift(name="D26", length=0.055, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q1F1", length=0.18, kn=13.562217330000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="D14", length=0.12, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q1D1", length=0.18, kn=-6.763721520999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="D32", length=0.72, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q2D1", length=0.18, kn=-6.763721520999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="D14", length=0.12, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q2F1", length=0.18, kn=13.562217330000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="D33", length=0.075, dp=0.0, exact=False, ns=1, order=0)
BPM(name="BPM01", direction="forward", dp=0.0)
Drift(name="D05", length=0.10958, dp=0.0, exact=False, ns=1, order=0)
Dipole(name="RM3", length=0.87284, angle=0.785398163400001, e1=0.0, e1_on=True, e2=0.0, e2_on=True, kn=-2.379107171999999, ks=0.0, ms=0.0, mo=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="D05", length=0.10958, dp=0.0, exact=False, ns=1, order=0)
Sextupole(name="SY1_2F4", length=0.08, ms=-277.23165, dp=0.0, exact=False, ns=1, order=0)
Drift(name="D16", length=0.155, dp=0.0, exact=False, ns=1, order=0)
Sextupole(name="SX1_2F4", length=0.08, ms=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="D30", length=0.07, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q2F4", length=0.18, kn=12.030967120000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="D30", length=0.07, dp=0.0, exact=False, ns=1, order=0)
Sextupole(name="SX2_2F4", length=0.08, ms=206.44984, dp=0.0, exact=False, ns=1, order=0)
Drift(name="D02", length=0.101, dp=0.0, exact=False, ns=1, order=0)
BPM(name="BPM02", direction="forward", dp=0.0)
Drift(name="D25", length=0.054, dp=0.0, exact=False, ns=1, order=0)
Sextupole(name="SY2_2F4", length=0.08, ms=-277.23165, dp=0.0, exact=False, ns=1, order=0)
Drift(name="D05", length=0.10958, dp=0.0, exact=False, ns=1, order=0)
Dipole(name="RM4", length=0.87284, angle=0.785398163400001, e1=0.0, e1_on=True, e2=0.0, e2_on=True, kn=-2.379107171999999, ks=0.0, ms=0.0, mo=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="D10", length=0.11958, dp=0.0, exact=False, ns=1, order=0)
BPM(name="BPM03", direction="forward", dp=0.0)
Drift(name="D28", length=0.065, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q2F2", length=0.18, kn=13.690633560000002, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="D41", length=0.09, dp=0.0, exact=False, ns=1, order=0)
Drift(name="D15", length=0.131715, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q2D2", length=0.19657, kn=-2.815743509999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="D37", length=0.802715, dp=0.0, exact=False, ns=1, order=0)
Drift(name="D18", length=0.159715, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q2D3", length=0.19657, kn=-8.487311754999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="D03", length=0.106715, dp=0.0, exact=False, ns=1, order=0)
BPM(name="BPM04", direction="forward", dp=0.0)
Drift(name="D29", length=0.066715, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q2F3", length=0.19657, kn=7.899043454000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="D34", length=0.076715, dp=0.0, exact=False, ns=1, order=0)
Drift(name="D04", length=0.1079, dp=0.0, exact=False, ns=1, order=0)
Drift(name="D22", length=0.4205, dp=0.0, exact=False, ns=1, order=0)
Drift(name="D22", length=0.4205, dp=0.0, exact=False, ns=1, order=0)
Drift(name="D06", length=0.1119, dp=0.0, exact=False, ns=1, order=0)
Drift(name="D29", length=0.066715, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q3F3", length=0.19657, kn=7.640511954000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="D27", length=0.056715, dp=0.0, exact=False, ns=1, order=0)
[6]:
# Flatten
# Note, the above lattice is already flat (no sublines)

# Total number of first level sequence elements (with duplicates)

print(len(ring))

# Flatten sublines is any

ring.flatten()
print(len(ring))
154
154
[7]:
# Remove all elements with length != 0 and length < 1.0E-12

ring.clean((1.0E-12, None, None, None))
[8]:
# Merge adjacent drifts
# Note, this will also rename all drift elements

ring.merge(name='DR', size=3)
print(len(ring))
136
[9]:
# Print full ring

print(ring)
BPM(name="BPM05", direction="forward", dp=0.0)
Drift(name="DR001", length=0.116715, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q3D3", length=0.19657, kn=-8.426928737999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR002", length=0.9684299999999999, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q3D2", length=0.19657, kn=-2.695188250999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR003", length=0.221715, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q3F2", length=0.18, kn=13.544085930000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR004", length=0.065, dp=0.0, exact=False, ns=1, order=0)
BPM(name="BPM07", direction="forward", dp=0.0)
Drift(name="DR005", length=0.11958, dp=0.0, exact=False, ns=1, order=0)
Dipole(name="RM5", length=0.87284, angle=0.785398163400001, e1=0.0, e1_on=True, e2=0.0, e2_on=True, kn=-2.379107171999999, ks=0.0, ms=0.0, mo=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR006", length=0.10958, dp=0.0, exact=False, ns=1, order=0)
Sextupole(name="SY1_3F4", length=0.08, ms=-277.23165, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR007", length=0.044, dp=0.0, exact=False, ns=1, order=0)
BPM(name="BPM08", direction="forward", dp=0.0)
Drift(name="DR008", length=0.111, dp=0.0, exact=False, ns=1, order=0)
Sextupole(name="SX1_3F4", length=0.08, ms=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR009", length=0.07, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q3F4", length=0.18, kn=12.030967120000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR010", length=0.07, dp=0.0, exact=False, ns=1, order=0)
Sextupole(name="SX2_3F4", length=0.08, ms=206.44984, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR011", length=0.155, dp=0.0, exact=False, ns=1, order=0)
Sextupole(name="SY2_3F4", length=0.08, ms=-277.23165, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR012", length=0.10958, dp=0.0, exact=False, ns=1, order=0)
Dipole(name="RM6", length=0.87284, angle=0.785398163400001, e1=0.0, e1_on=True, e2=0.0, e2_on=True, kn=-2.379107171999999, ks=0.0, ms=0.0, mo=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR013", length=0.11958, dp=0.0, exact=False, ns=1, order=0)
BPM(name="BPM09", direction="forward", dp=0.0)
Drift(name="DR014", length=0.065, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q3F1", length=0.18, kn=13.562217330000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR015", length=0.12, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q3D1", length=0.18, kn=-6.763721520999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR016", length=0.72, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q4D1", length=0.18, kn=-6.763721520999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR017", length=0.12, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q4F1", length=0.18, kn=13.562217330000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR018", length=0.07, dp=0.0, exact=False, ns=1, order=0)
BPM(name="BPM10", direction="forward", dp=0.0)
Drift(name="DR019", length=0.11458, dp=0.0, exact=False, ns=1, order=0)
Dipole(name="RM7", length=0.87284, angle=0.785398163400001, e1=0.0, e1_on=True, e2=0.0, e2_on=True, kn=-2.379107171999999, ks=0.0, ms=0.0, mo=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR020", length=0.10958, dp=0.0, exact=False, ns=1, order=0)
Sextupole(name="SY1_4F4", length=0.08, ms=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR021", length=0.155, dp=0.0, exact=False, ns=1, order=0)
Sextupole(name="SX1_4F4", length=0.08, ms=206.44984, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR022", length=0.07, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q4F4", length=0.18, kn=12.030967120000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR023", length=0.07, dp=0.0, exact=False, ns=1, order=0)
Sextupole(name="SX2_4F4", length=0.08, ms=206.44984, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR024", length=0.11, dp=0.0, exact=False, ns=1, order=0)
BPM(name="BPM11", direction="forward", dp=0.0)
Drift(name="DR025", length=0.045, dp=0.0, exact=False, ns=1, order=0)
Sextupole(name="SY2_4F4", length=0.08, ms=-277.23165, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR026", length=0.10958, dp=0.0, exact=False, ns=1, order=0)
Dipole(name="RM8", length=0.87284, angle=0.785398163400001, e1=0.0, e1_on=True, e2=0.0, e2_on=True, kn=-2.379107171999999, ks=0.0, ms=0.0, mo=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR027", length=0.11958, dp=0.0, exact=False, ns=1, order=0)
BPM(name="BPM12", direction="forward", dp=0.0)
Drift(name="DR028", length=0.065, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q4F2", length=0.18, kn=13.562217330000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR029", length=0.221715, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q4D2", length=0.19657, kn=-2.645953025999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR030", length=0.9684299999999999, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q4D3", length=0.19657, kn=-8.526334987999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR031", length=0.116715, dp=0.0, exact=False, ns=1, order=0)
BPM(name="BPM13", direction="forward", dp=0.0)
Drift(name="DR032", length=0.056715, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q4F3", length=0.19657, kn=7.792169674000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR033", length=1.19823, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q1F3", length=0.19657, kn=7.792169674000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR034", length=0.071715, dp=0.0, exact=False, ns=1, order=0)
BPM(name="BPM14", direction="forward", dp=0.0)
Drift(name="DR035", length=0.101715, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q1D3", length=0.19657, kn=-8.526334987999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR036", length=0.9684299999999999, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q1D2", length=0.19657, kn=-2.645953025999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR037", length=0.221715, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q1F2", length=0.18, kn=13.562217330000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR038", length=0.07, dp=0.0, exact=False, ns=1, order=0)
BPM(name="BPM15", direction="forward", dp=0.0)
Drift(name="DR039", length=0.11458, dp=0.0, exact=False, ns=1, order=0)
Dipole(name="RM1", length=0.87284, angle=0.785398163400001, e1=0.0, e1_on=True, e2=0.0, e2_on=True, kn=-2.379107171999999, ks=0.0, ms=0.0, mo=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR040", length=0.10958, dp=0.0, exact=False, ns=1, order=0)
Sextupole(name="SY1_1F4", length=0.08, ms=-277.23165, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR041", length=0.0775, dp=0.0, exact=False, ns=1, order=0)
BPM(name="BPM16", direction="forward", dp=0.0)
Drift(name="DR042", length=0.0775, dp=0.0, exact=False, ns=1, order=0)
Sextupole(name="SX1_1F4", length=0.08, ms=206.44984, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR043", length=0.07, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q1F4", length=0.18, kn=12.030967120000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR044", length=0.07, dp=0.0, exact=False, ns=1, order=0)
Sextupole(name="SX2_1F4", length=0.08, ms=206.44984, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR045", length=0.155, dp=0.0, exact=False, ns=1, order=0)
Sextupole(name="SY2_1F4", length=0.08, ms=-277.23165, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR046", length=0.10958, dp=0.0, exact=False, ns=1, order=0)
Dipole(name="RM2", length=0.87284, angle=0.785398163400001, e1=0.0, e1_on=True, e2=0.0, e2_on=True, kn=-2.379107171999999, ks=0.0, ms=0.0, mo=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR047", length=0.12958, dp=0.0, exact=False, ns=1, order=0)
BPM(name="BPM17", direction="forward", dp=0.0)
Drift(name="DR048", length=0.055, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q1F1", length=0.18, kn=13.562217330000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR049", length=0.12, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q1D1", length=0.18, kn=-6.763721520999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR050", length=0.72, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q2D1", length=0.18, kn=-6.763721520999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR051", length=0.12, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q2F1", length=0.18, kn=13.562217330000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR052", length=0.075, dp=0.0, exact=False, ns=1, order=0)
BPM(name="BPM01", direction="forward", dp=0.0)
Drift(name="DR053", length=0.10958, dp=0.0, exact=False, ns=1, order=0)
Dipole(name="RM3", length=0.87284, angle=0.785398163400001, e1=0.0, e1_on=True, e2=0.0, e2_on=True, kn=-2.379107171999999, ks=0.0, ms=0.0, mo=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR054", length=0.10958, dp=0.0, exact=False, ns=1, order=0)
Sextupole(name="SY1_2F4", length=0.08, ms=-277.23165, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR055", length=0.155, dp=0.0, exact=False, ns=1, order=0)
Sextupole(name="SX1_2F4", length=0.08, ms=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR056", length=0.07, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q2F4", length=0.18, kn=12.030967120000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR057", length=0.07, dp=0.0, exact=False, ns=1, order=0)
Sextupole(name="SX2_2F4", length=0.08, ms=206.44984, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR058", length=0.101, dp=0.0, exact=False, ns=1, order=0)
BPM(name="BPM02", direction="forward", dp=0.0)
Drift(name="DR059", length=0.054, dp=0.0, exact=False, ns=1, order=0)
Sextupole(name="SY2_2F4", length=0.08, ms=-277.23165, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR060", length=0.10958, dp=0.0, exact=False, ns=1, order=0)
Dipole(name="RM4", length=0.87284, angle=0.785398163400001, e1=0.0, e1_on=True, e2=0.0, e2_on=True, kn=-2.379107171999999, ks=0.0, ms=0.0, mo=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR061", length=0.11958, dp=0.0, exact=False, ns=1, order=0)
BPM(name="BPM03", direction="forward", dp=0.0)
Drift(name="DR062", length=0.065, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q2F2", length=0.18, kn=13.690633560000002, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR063", length=0.221715, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q2D2", length=0.19657, kn=-2.815743509999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR064", length=0.9624299999999999, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q2D3", length=0.19657, kn=-8.487311754999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR065", length=0.106715, dp=0.0, exact=False, ns=1, order=0)
BPM(name="BPM04", direction="forward", dp=0.0)
Drift(name="DR066", length=0.066715, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q2F3", length=0.19657, kn=7.899043454000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR067", length=1.2042300000000001, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q3F3", length=0.19657, kn=7.640511954000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR068", length=0.056715, dp=0.0, exact=False, ns=1, order=0)
[10]:
# By default only one forward BPM is created for each monitor
# It transforms phase space coordinates from the beam to bpm frame (identity without deviation variables)
# To insert inverse trasformation, BPMs can be splitted with the following command
# This method can be used to split elements by type, name and/or exclude some names
# For dipoles, e1 is on for the first part and e2 is on for the last part, both are off for all middle parts
# Split of elements with non-zero length (and angle) just creates shorter elements with the same name
# Zero length elements other than BPM are not splitted

ring.split((None, ['BPM'], None, None))
print(ring)
BPM(name="BPM05", direction="forward", dp=0.0)
BPM(name="BPM05", direction="inverse", dp=0.0)
Drift(name="DR001", length=0.116715, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q3D3", length=0.19657, kn=-8.426928737999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR002", length=0.9684299999999999, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q3D2", length=0.19657, kn=-2.695188250999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR003", length=0.221715, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q3F2", length=0.18, kn=13.544085930000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR004", length=0.065, dp=0.0, exact=False, ns=1, order=0)
BPM(name="BPM07", direction="forward", dp=0.0)
BPM(name="BPM07", direction="inverse", dp=0.0)
Drift(name="DR005", length=0.11958, dp=0.0, exact=False, ns=1, order=0)
Dipole(name="RM5", length=0.87284, angle=0.785398163400001, e1=0.0, e1_on=True, e2=0.0, e2_on=True, kn=-2.379107171999999, ks=0.0, ms=0.0, mo=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR006", length=0.10958, dp=0.0, exact=False, ns=1, order=0)
Sextupole(name="SY1_3F4", length=0.08, ms=-277.23165, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR007", length=0.044, dp=0.0, exact=False, ns=1, order=0)
BPM(name="BPM08", direction="forward", dp=0.0)
BPM(name="BPM08", direction="inverse", dp=0.0)
Drift(name="DR008", length=0.111, dp=0.0, exact=False, ns=1, order=0)
Sextupole(name="SX1_3F4", length=0.08, ms=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR009", length=0.07, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q3F4", length=0.18, kn=12.030967120000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR010", length=0.07, dp=0.0, exact=False, ns=1, order=0)
Sextupole(name="SX2_3F4", length=0.08, ms=206.44984, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR011", length=0.155, dp=0.0, exact=False, ns=1, order=0)
Sextupole(name="SY2_3F4", length=0.08, ms=-277.23165, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR012", length=0.10958, dp=0.0, exact=False, ns=1, order=0)
Dipole(name="RM6", length=0.87284, angle=0.785398163400001, e1=0.0, e1_on=True, e2=0.0, e2_on=True, kn=-2.379107171999999, ks=0.0, ms=0.0, mo=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR013", length=0.11958, dp=0.0, exact=False, ns=1, order=0)
BPM(name="BPM09", direction="forward", dp=0.0)
BPM(name="BPM09", direction="inverse", dp=0.0)
Drift(name="DR014", length=0.065, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q3F1", length=0.18, kn=13.562217330000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR015", length=0.12, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q3D1", length=0.18, kn=-6.763721520999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR016", length=0.72, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q4D1", length=0.18, kn=-6.763721520999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR017", length=0.12, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q4F1", length=0.18, kn=13.562217330000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR018", length=0.07, dp=0.0, exact=False, ns=1, order=0)
BPM(name="BPM10", direction="forward", dp=0.0)
BPM(name="BPM10", direction="inverse", dp=0.0)
Drift(name="DR019", length=0.11458, dp=0.0, exact=False, ns=1, order=0)
Dipole(name="RM7", length=0.87284, angle=0.785398163400001, e1=0.0, e1_on=True, e2=0.0, e2_on=True, kn=-2.379107171999999, ks=0.0, ms=0.0, mo=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR020", length=0.10958, dp=0.0, exact=False, ns=1, order=0)
Sextupole(name="SY1_4F4", length=0.08, ms=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR021", length=0.155, dp=0.0, exact=False, ns=1, order=0)
Sextupole(name="SX1_4F4", length=0.08, ms=206.44984, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR022", length=0.07, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q4F4", length=0.18, kn=12.030967120000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR023", length=0.07, dp=0.0, exact=False, ns=1, order=0)
Sextupole(name="SX2_4F4", length=0.08, ms=206.44984, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR024", length=0.11, dp=0.0, exact=False, ns=1, order=0)
BPM(name="BPM11", direction="forward", dp=0.0)
BPM(name="BPM11", direction="inverse", dp=0.0)
Drift(name="DR025", length=0.045, dp=0.0, exact=False, ns=1, order=0)
Sextupole(name="SY2_4F4", length=0.08, ms=-277.23165, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR026", length=0.10958, dp=0.0, exact=False, ns=1, order=0)
Dipole(name="RM8", length=0.87284, angle=0.785398163400001, e1=0.0, e1_on=True, e2=0.0, e2_on=True, kn=-2.379107171999999, ks=0.0, ms=0.0, mo=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR027", length=0.11958, dp=0.0, exact=False, ns=1, order=0)
BPM(name="BPM12", direction="forward", dp=0.0)
BPM(name="BPM12", direction="inverse", dp=0.0)
Drift(name="DR028", length=0.065, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q4F2", length=0.18, kn=13.562217330000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR029", length=0.221715, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q4D2", length=0.19657, kn=-2.645953025999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR030", length=0.9684299999999999, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q4D3", length=0.19657, kn=-8.526334987999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR031", length=0.116715, dp=0.0, exact=False, ns=1, order=0)
BPM(name="BPM13", direction="forward", dp=0.0)
BPM(name="BPM13", direction="inverse", dp=0.0)
Drift(name="DR032", length=0.056715, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q4F3", length=0.19657, kn=7.792169674000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR033", length=1.19823, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q1F3", length=0.19657, kn=7.792169674000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR034", length=0.071715, dp=0.0, exact=False, ns=1, order=0)
BPM(name="BPM14", direction="forward", dp=0.0)
BPM(name="BPM14", direction="inverse", dp=0.0)
Drift(name="DR035", length=0.101715, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q1D3", length=0.19657, kn=-8.526334987999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR036", length=0.9684299999999999, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q1D2", length=0.19657, kn=-2.645953025999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR037", length=0.221715, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q1F2", length=0.18, kn=13.562217330000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR038", length=0.07, dp=0.0, exact=False, ns=1, order=0)
BPM(name="BPM15", direction="forward", dp=0.0)
BPM(name="BPM15", direction="inverse", dp=0.0)
Drift(name="DR039", length=0.11458, dp=0.0, exact=False, ns=1, order=0)
Dipole(name="RM1", length=0.87284, angle=0.785398163400001, e1=0.0, e1_on=True, e2=0.0, e2_on=True, kn=-2.379107171999999, ks=0.0, ms=0.0, mo=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR040", length=0.10958, dp=0.0, exact=False, ns=1, order=0)
Sextupole(name="SY1_1F4", length=0.08, ms=-277.23165, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR041", length=0.0775, dp=0.0, exact=False, ns=1, order=0)
BPM(name="BPM16", direction="forward", dp=0.0)
BPM(name="BPM16", direction="inverse", dp=0.0)
Drift(name="DR042", length=0.0775, dp=0.0, exact=False, ns=1, order=0)
Sextupole(name="SX1_1F4", length=0.08, ms=206.44984, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR043", length=0.07, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q1F4", length=0.18, kn=12.030967120000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR044", length=0.07, dp=0.0, exact=False, ns=1, order=0)
Sextupole(name="SX2_1F4", length=0.08, ms=206.44984, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR045", length=0.155, dp=0.0, exact=False, ns=1, order=0)
Sextupole(name="SY2_1F4", length=0.08, ms=-277.23165, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR046", length=0.10958, dp=0.0, exact=False, ns=1, order=0)
Dipole(name="RM2", length=0.87284, angle=0.785398163400001, e1=0.0, e1_on=True, e2=0.0, e2_on=True, kn=-2.379107171999999, ks=0.0, ms=0.0, mo=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR047", length=0.12958, dp=0.0, exact=False, ns=1, order=0)
BPM(name="BPM17", direction="forward", dp=0.0)
BPM(name="BPM17", direction="inverse", dp=0.0)
Drift(name="DR048", length=0.055, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q1F1", length=0.18, kn=13.562217330000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR049", length=0.12, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q1D1", length=0.18, kn=-6.763721520999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR050", length=0.72, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q2D1", length=0.18, kn=-6.763721520999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR051", length=0.12, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q2F1", length=0.18, kn=13.562217330000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR052", length=0.075, dp=0.0, exact=False, ns=1, order=0)
BPM(name="BPM01", direction="forward", dp=0.0)
BPM(name="BPM01", direction="inverse", dp=0.0)
Drift(name="DR053", length=0.10958, dp=0.0, exact=False, ns=1, order=0)
Dipole(name="RM3", length=0.87284, angle=0.785398163400001, e1=0.0, e1_on=True, e2=0.0, e2_on=True, kn=-2.379107171999999, ks=0.0, ms=0.0, mo=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR054", length=0.10958, dp=0.0, exact=False, ns=1, order=0)
Sextupole(name="SY1_2F4", length=0.08, ms=-277.23165, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR055", length=0.155, dp=0.0, exact=False, ns=1, order=0)
Sextupole(name="SX1_2F4", length=0.08, ms=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR056", length=0.07, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q2F4", length=0.18, kn=12.030967120000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR057", length=0.07, dp=0.0, exact=False, ns=1, order=0)
Sextupole(name="SX2_2F4", length=0.08, ms=206.44984, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR058", length=0.101, dp=0.0, exact=False, ns=1, order=0)
BPM(name="BPM02", direction="forward", dp=0.0)
BPM(name="BPM02", direction="inverse", dp=0.0)
Drift(name="DR059", length=0.054, dp=0.0, exact=False, ns=1, order=0)
Sextupole(name="SY2_2F4", length=0.08, ms=-277.23165, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR060", length=0.10958, dp=0.0, exact=False, ns=1, order=0)
Dipole(name="RM4", length=0.87284, angle=0.785398163400001, e1=0.0, e1_on=True, e2=0.0, e2_on=True, kn=-2.379107171999999, ks=0.0, ms=0.0, mo=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR061", length=0.11958, dp=0.0, exact=False, ns=1, order=0)
BPM(name="BPM03", direction="forward", dp=0.0)
BPM(name="BPM03", direction="inverse", dp=0.0)
Drift(name="DR062", length=0.065, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q2F2", length=0.18, kn=13.690633560000002, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR063", length=0.221715, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q2D2", length=0.19657, kn=-2.815743509999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR064", length=0.9624299999999999, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q2D3", length=0.19657, kn=-8.487311754999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR065", length=0.106715, dp=0.0, exact=False, ns=1, order=0)
BPM(name="BPM04", direction="forward", dp=0.0)
BPM(name="BPM04", direction="inverse", dp=0.0)
Drift(name="DR066", length=0.066715, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q2F3", length=0.19657, kn=7.899043454000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR067", length=1.2042300000000001, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q3F3", length=0.19657, kn=7.640511954000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR068", length=0.056715, dp=0.0, exact=False, ns=1, order=0)
[11]:
# Line start can be changed with start property or roll method

ring.roll(1)
print(ring)
BPM(name="BPM05", direction="inverse", dp=0.0)
Drift(name="DR001", length=0.116715, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q3D3", length=0.19657, kn=-8.426928737999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR002", length=0.9684299999999999, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q3D2", length=0.19657, kn=-2.695188250999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR003", length=0.221715, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q3F2", length=0.18, kn=13.544085930000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR004", length=0.065, dp=0.0, exact=False, ns=1, order=0)
BPM(name="BPM07", direction="forward", dp=0.0)
BPM(name="BPM07", direction="inverse", dp=0.0)
Drift(name="DR005", length=0.11958, dp=0.0, exact=False, ns=1, order=0)
Dipole(name="RM5", length=0.87284, angle=0.785398163400001, e1=0.0, e1_on=True, e2=0.0, e2_on=True, kn=-2.379107171999999, ks=0.0, ms=0.0, mo=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR006", length=0.10958, dp=0.0, exact=False, ns=1, order=0)
Sextupole(name="SY1_3F4", length=0.08, ms=-277.23165, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR007", length=0.044, dp=0.0, exact=False, ns=1, order=0)
BPM(name="BPM08", direction="forward", dp=0.0)
BPM(name="BPM08", direction="inverse", dp=0.0)
Drift(name="DR008", length=0.111, dp=0.0, exact=False, ns=1, order=0)
Sextupole(name="SX1_3F4", length=0.08, ms=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR009", length=0.07, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q3F4", length=0.18, kn=12.030967120000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR010", length=0.07, dp=0.0, exact=False, ns=1, order=0)
Sextupole(name="SX2_3F4", length=0.08, ms=206.44984, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR011", length=0.155, dp=0.0, exact=False, ns=1, order=0)
Sextupole(name="SY2_3F4", length=0.08, ms=-277.23165, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR012", length=0.10958, dp=0.0, exact=False, ns=1, order=0)
Dipole(name="RM6", length=0.87284, angle=0.785398163400001, e1=0.0, e1_on=True, e2=0.0, e2_on=True, kn=-2.379107171999999, ks=0.0, ms=0.0, mo=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR013", length=0.11958, dp=0.0, exact=False, ns=1, order=0)
BPM(name="BPM09", direction="forward", dp=0.0)
BPM(name="BPM09", direction="inverse", dp=0.0)
Drift(name="DR014", length=0.065, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q3F1", length=0.18, kn=13.562217330000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR015", length=0.12, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q3D1", length=0.18, kn=-6.763721520999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR016", length=0.72, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q4D1", length=0.18, kn=-6.763721520999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR017", length=0.12, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q4F1", length=0.18, kn=13.562217330000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR018", length=0.07, dp=0.0, exact=False, ns=1, order=0)
BPM(name="BPM10", direction="forward", dp=0.0)
BPM(name="BPM10", direction="inverse", dp=0.0)
Drift(name="DR019", length=0.11458, dp=0.0, exact=False, ns=1, order=0)
Dipole(name="RM7", length=0.87284, angle=0.785398163400001, e1=0.0, e1_on=True, e2=0.0, e2_on=True, kn=-2.379107171999999, ks=0.0, ms=0.0, mo=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR020", length=0.10958, dp=0.0, exact=False, ns=1, order=0)
Sextupole(name="SY1_4F4", length=0.08, ms=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR021", length=0.155, dp=0.0, exact=False, ns=1, order=0)
Sextupole(name="SX1_4F4", length=0.08, ms=206.44984, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR022", length=0.07, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q4F4", length=0.18, kn=12.030967120000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR023", length=0.07, dp=0.0, exact=False, ns=1, order=0)
Sextupole(name="SX2_4F4", length=0.08, ms=206.44984, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR024", length=0.11, dp=0.0, exact=False, ns=1, order=0)
BPM(name="BPM11", direction="forward", dp=0.0)
BPM(name="BPM11", direction="inverse", dp=0.0)
Drift(name="DR025", length=0.045, dp=0.0, exact=False, ns=1, order=0)
Sextupole(name="SY2_4F4", length=0.08, ms=-277.23165, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR026", length=0.10958, dp=0.0, exact=False, ns=1, order=0)
Dipole(name="RM8", length=0.87284, angle=0.785398163400001, e1=0.0, e1_on=True, e2=0.0, e2_on=True, kn=-2.379107171999999, ks=0.0, ms=0.0, mo=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR027", length=0.11958, dp=0.0, exact=False, ns=1, order=0)
BPM(name="BPM12", direction="forward", dp=0.0)
BPM(name="BPM12", direction="inverse", dp=0.0)
Drift(name="DR028", length=0.065, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q4F2", length=0.18, kn=13.562217330000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR029", length=0.221715, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q4D2", length=0.19657, kn=-2.645953025999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR030", length=0.9684299999999999, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q4D3", length=0.19657, kn=-8.526334987999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR031", length=0.116715, dp=0.0, exact=False, ns=1, order=0)
BPM(name="BPM13", direction="forward", dp=0.0)
BPM(name="BPM13", direction="inverse", dp=0.0)
Drift(name="DR032", length=0.056715, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q4F3", length=0.19657, kn=7.792169674000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR033", length=1.19823, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q1F3", length=0.19657, kn=7.792169674000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR034", length=0.071715, dp=0.0, exact=False, ns=1, order=0)
BPM(name="BPM14", direction="forward", dp=0.0)
BPM(name="BPM14", direction="inverse", dp=0.0)
Drift(name="DR035", length=0.101715, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q1D3", length=0.19657, kn=-8.526334987999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR036", length=0.9684299999999999, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q1D2", length=0.19657, kn=-2.645953025999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR037", length=0.221715, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q1F2", length=0.18, kn=13.562217330000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR038", length=0.07, dp=0.0, exact=False, ns=1, order=0)
BPM(name="BPM15", direction="forward", dp=0.0)
BPM(name="BPM15", direction="inverse", dp=0.0)
Drift(name="DR039", length=0.11458, dp=0.0, exact=False, ns=1, order=0)
Dipole(name="RM1", length=0.87284, angle=0.785398163400001, e1=0.0, e1_on=True, e2=0.0, e2_on=True, kn=-2.379107171999999, ks=0.0, ms=0.0, mo=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR040", length=0.10958, dp=0.0, exact=False, ns=1, order=0)
Sextupole(name="SY1_1F4", length=0.08, ms=-277.23165, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR041", length=0.0775, dp=0.0, exact=False, ns=1, order=0)
BPM(name="BPM16", direction="forward", dp=0.0)
BPM(name="BPM16", direction="inverse", dp=0.0)
Drift(name="DR042", length=0.0775, dp=0.0, exact=False, ns=1, order=0)
Sextupole(name="SX1_1F4", length=0.08, ms=206.44984, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR043", length=0.07, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q1F4", length=0.18, kn=12.030967120000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR044", length=0.07, dp=0.0, exact=False, ns=1, order=0)
Sextupole(name="SX2_1F4", length=0.08, ms=206.44984, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR045", length=0.155, dp=0.0, exact=False, ns=1, order=0)
Sextupole(name="SY2_1F4", length=0.08, ms=-277.23165, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR046", length=0.10958, dp=0.0, exact=False, ns=1, order=0)
Dipole(name="RM2", length=0.87284, angle=0.785398163400001, e1=0.0, e1_on=True, e2=0.0, e2_on=True, kn=-2.379107171999999, ks=0.0, ms=0.0, mo=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR047", length=0.12958, dp=0.0, exact=False, ns=1, order=0)
BPM(name="BPM17", direction="forward", dp=0.0)
BPM(name="BPM17", direction="inverse", dp=0.0)
Drift(name="DR048", length=0.055, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q1F1", length=0.18, kn=13.562217330000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR049", length=0.12, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q1D1", length=0.18, kn=-6.763721520999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR050", length=0.72, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q2D1", length=0.18, kn=-6.763721520999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR051", length=0.12, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q2F1", length=0.18, kn=13.562217330000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR052", length=0.075, dp=0.0, exact=False, ns=1, order=0)
BPM(name="BPM01", direction="forward", dp=0.0)
BPM(name="BPM01", direction="inverse", dp=0.0)
Drift(name="DR053", length=0.10958, dp=0.0, exact=False, ns=1, order=0)
Dipole(name="RM3", length=0.87284, angle=0.785398163400001, e1=0.0, e1_on=True, e2=0.0, e2_on=True, kn=-2.379107171999999, ks=0.0, ms=0.0, mo=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR054", length=0.10958, dp=0.0, exact=False, ns=1, order=0)
Sextupole(name="SY1_2F4", length=0.08, ms=-277.23165, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR055", length=0.155, dp=0.0, exact=False, ns=1, order=0)
Sextupole(name="SX1_2F4", length=0.08, ms=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR056", length=0.07, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q2F4", length=0.18, kn=12.030967120000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR057", length=0.07, dp=0.0, exact=False, ns=1, order=0)
Sextupole(name="SX2_2F4", length=0.08, ms=206.44984, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR058", length=0.101, dp=0.0, exact=False, ns=1, order=0)
BPM(name="BPM02", direction="forward", dp=0.0)
BPM(name="BPM02", direction="inverse", dp=0.0)
Drift(name="DR059", length=0.054, dp=0.0, exact=False, ns=1, order=0)
Sextupole(name="SY2_2F4", length=0.08, ms=-277.23165, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR060", length=0.10958, dp=0.0, exact=False, ns=1, order=0)
Dipole(name="RM4", length=0.87284, angle=0.785398163400001, e1=0.0, e1_on=True, e2=0.0, e2_on=True, kn=-2.379107171999999, ks=0.0, ms=0.0, mo=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR061", length=0.11958, dp=0.0, exact=False, ns=1, order=0)
BPM(name="BPM03", direction="forward", dp=0.0)
BPM(name="BPM03", direction="inverse", dp=0.0)
Drift(name="DR062", length=0.065, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q2F2", length=0.18, kn=13.690633560000002, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR063", length=0.221715, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q2D2", length=0.19657, kn=-2.815743509999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR064", length=0.9624299999999999, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q2D3", length=0.19657, kn=-8.487311754999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR065", length=0.106715, dp=0.0, exact=False, ns=1, order=0)
BPM(name="BPM04", direction="forward", dp=0.0)
BPM(name="BPM04", direction="inverse", dp=0.0)
Drift(name="DR066", length=0.066715, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q2F3", length=0.19657, kn=7.899043454000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR067", length=1.2042300000000001, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q3F3", length=0.19657, kn=7.640511954000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR068", length=0.056715, dp=0.0, exact=False, ns=1, order=0)
BPM(name="BPM05", direction="forward", dp=0.0)
[12]:
# Insert correctors at quadrupole centers
# This inserts elements with identical names
# Element name is like a hash that is used to bind tensors to deviation variables
# Thus, to bind different tensors, elements should have different names
# For example, we would like splitted BPMs and pelement part to have identical names

insection = Corrector(name='CXY')
ring.split((1 + 1, ['Quadrupole'], None, None), paste=[insection])
print(ring)
BPM(name="BPM05", direction="inverse", dp=0.0)
Drift(name="DR001", length=0.116715, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q3D3", length=0.098285, kn=-8.426928737999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Corrector(name="CXY", cx=0.0, cy=0.0, dp=0.0)
Quadrupole(name="Q3D3", length=0.098285, kn=-8.426928737999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR002", length=0.9684299999999999, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q3D2", length=0.098285, kn=-2.695188250999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Corrector(name="CXY", cx=0.0, cy=0.0, dp=0.0)
Quadrupole(name="Q3D2", length=0.098285, kn=-2.695188250999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR003", length=0.221715, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q3F2", length=0.09, kn=13.544085930000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Corrector(name="CXY", cx=0.0, cy=0.0, dp=0.0)
Quadrupole(name="Q3F2", length=0.09, kn=13.544085930000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR004", length=0.065, dp=0.0, exact=False, ns=1, order=0)
BPM(name="BPM07", direction="forward", dp=0.0)
BPM(name="BPM07", direction="inverse", dp=0.0)
Drift(name="DR005", length=0.11958, dp=0.0, exact=False, ns=1, order=0)
Dipole(name="RM5", length=0.87284, angle=0.785398163400001, e1=0.0, e1_on=True, e2=0.0, e2_on=True, kn=-2.379107171999999, ks=0.0, ms=0.0, mo=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR006", length=0.10958, dp=0.0, exact=False, ns=1, order=0)
Sextupole(name="SY1_3F4", length=0.08, ms=-277.23165, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR007", length=0.044, dp=0.0, exact=False, ns=1, order=0)
BPM(name="BPM08", direction="forward", dp=0.0)
BPM(name="BPM08", direction="inverse", dp=0.0)
Drift(name="DR008", length=0.111, dp=0.0, exact=False, ns=1, order=0)
Sextupole(name="SX1_3F4", length=0.08, ms=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR009", length=0.07, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q3F4", length=0.09, kn=12.030967120000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Corrector(name="CXY", cx=0.0, cy=0.0, dp=0.0)
Quadrupole(name="Q3F4", length=0.09, kn=12.030967120000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR010", length=0.07, dp=0.0, exact=False, ns=1, order=0)
Sextupole(name="SX2_3F4", length=0.08, ms=206.44984, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR011", length=0.155, dp=0.0, exact=False, ns=1, order=0)
Sextupole(name="SY2_3F4", length=0.08, ms=-277.23165, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR012", length=0.10958, dp=0.0, exact=False, ns=1, order=0)
Dipole(name="RM6", length=0.87284, angle=0.785398163400001, e1=0.0, e1_on=True, e2=0.0, e2_on=True, kn=-2.379107171999999, ks=0.0, ms=0.0, mo=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR013", length=0.11958, dp=0.0, exact=False, ns=1, order=0)
BPM(name="BPM09", direction="forward", dp=0.0)
BPM(name="BPM09", direction="inverse", dp=0.0)
Drift(name="DR014", length=0.065, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q3F1", length=0.09, kn=13.562217330000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Corrector(name="CXY", cx=0.0, cy=0.0, dp=0.0)
Quadrupole(name="Q3F1", length=0.09, kn=13.562217330000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR015", length=0.12, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q3D1", length=0.09, kn=-6.763721520999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Corrector(name="CXY", cx=0.0, cy=0.0, dp=0.0)
Quadrupole(name="Q3D1", length=0.09, kn=-6.763721520999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR016", length=0.72, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q4D1", length=0.09, kn=-6.763721520999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Corrector(name="CXY", cx=0.0, cy=0.0, dp=0.0)
Quadrupole(name="Q4D1", length=0.09, kn=-6.763721520999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR017", length=0.12, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q4F1", length=0.09, kn=13.562217330000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Corrector(name="CXY", cx=0.0, cy=0.0, dp=0.0)
Quadrupole(name="Q4F1", length=0.09, kn=13.562217330000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR018", length=0.07, dp=0.0, exact=False, ns=1, order=0)
BPM(name="BPM10", direction="forward", dp=0.0)
BPM(name="BPM10", direction="inverse", dp=0.0)
Drift(name="DR019", length=0.11458, dp=0.0, exact=False, ns=1, order=0)
Dipole(name="RM7", length=0.87284, angle=0.785398163400001, e1=0.0, e1_on=True, e2=0.0, e2_on=True, kn=-2.379107171999999, ks=0.0, ms=0.0, mo=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR020", length=0.10958, dp=0.0, exact=False, ns=1, order=0)
Sextupole(name="SY1_4F4", length=0.08, ms=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR021", length=0.155, dp=0.0, exact=False, ns=1, order=0)
Sextupole(name="SX1_4F4", length=0.08, ms=206.44984, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR022", length=0.07, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q4F4", length=0.09, kn=12.030967120000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Corrector(name="CXY", cx=0.0, cy=0.0, dp=0.0)
Quadrupole(name="Q4F4", length=0.09, kn=12.030967120000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR023", length=0.07, dp=0.0, exact=False, ns=1, order=0)
Sextupole(name="SX2_4F4", length=0.08, ms=206.44984, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR024", length=0.11, dp=0.0, exact=False, ns=1, order=0)
BPM(name="BPM11", direction="forward", dp=0.0)
BPM(name="BPM11", direction="inverse", dp=0.0)
Drift(name="DR025", length=0.045, dp=0.0, exact=False, ns=1, order=0)
Sextupole(name="SY2_4F4", length=0.08, ms=-277.23165, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR026", length=0.10958, dp=0.0, exact=False, ns=1, order=0)
Dipole(name="RM8", length=0.87284, angle=0.785398163400001, e1=0.0, e1_on=True, e2=0.0, e2_on=True, kn=-2.379107171999999, ks=0.0, ms=0.0, mo=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR027", length=0.11958, dp=0.0, exact=False, ns=1, order=0)
BPM(name="BPM12", direction="forward", dp=0.0)
BPM(name="BPM12", direction="inverse", dp=0.0)
Drift(name="DR028", length=0.065, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q4F2", length=0.09, kn=13.562217330000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Corrector(name="CXY", cx=0.0, cy=0.0, dp=0.0)
Quadrupole(name="Q4F2", length=0.09, kn=13.562217330000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR029", length=0.221715, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q4D2", length=0.098285, kn=-2.645953025999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Corrector(name="CXY", cx=0.0, cy=0.0, dp=0.0)
Quadrupole(name="Q4D2", length=0.098285, kn=-2.645953025999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR030", length=0.9684299999999999, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q4D3", length=0.098285, kn=-8.526334987999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Corrector(name="CXY", cx=0.0, cy=0.0, dp=0.0)
Quadrupole(name="Q4D3", length=0.098285, kn=-8.526334987999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR031", length=0.116715, dp=0.0, exact=False, ns=1, order=0)
BPM(name="BPM13", direction="forward", dp=0.0)
BPM(name="BPM13", direction="inverse", dp=0.0)
Drift(name="DR032", length=0.056715, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q4F3", length=0.098285, kn=7.792169674000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Corrector(name="CXY", cx=0.0, cy=0.0, dp=0.0)
Quadrupole(name="Q4F3", length=0.098285, kn=7.792169674000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR033", length=1.19823, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q1F3", length=0.098285, kn=7.792169674000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Corrector(name="CXY", cx=0.0, cy=0.0, dp=0.0)
Quadrupole(name="Q1F3", length=0.098285, kn=7.792169674000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR034", length=0.071715, dp=0.0, exact=False, ns=1, order=0)
BPM(name="BPM14", direction="forward", dp=0.0)
BPM(name="BPM14", direction="inverse", dp=0.0)
Drift(name="DR035", length=0.101715, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q1D3", length=0.098285, kn=-8.526334987999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Corrector(name="CXY", cx=0.0, cy=0.0, dp=0.0)
Quadrupole(name="Q1D3", length=0.098285, kn=-8.526334987999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR036", length=0.9684299999999999, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q1D2", length=0.098285, kn=-2.645953025999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Corrector(name="CXY", cx=0.0, cy=0.0, dp=0.0)
Quadrupole(name="Q1D2", length=0.098285, kn=-2.645953025999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR037", length=0.221715, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q1F2", length=0.09, kn=13.562217330000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Corrector(name="CXY", cx=0.0, cy=0.0, dp=0.0)
Quadrupole(name="Q1F2", length=0.09, kn=13.562217330000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR038", length=0.07, dp=0.0, exact=False, ns=1, order=0)
BPM(name="BPM15", direction="forward", dp=0.0)
BPM(name="BPM15", direction="inverse", dp=0.0)
Drift(name="DR039", length=0.11458, dp=0.0, exact=False, ns=1, order=0)
Dipole(name="RM1", length=0.87284, angle=0.785398163400001, e1=0.0, e1_on=True, e2=0.0, e2_on=True, kn=-2.379107171999999, ks=0.0, ms=0.0, mo=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR040", length=0.10958, dp=0.0, exact=False, ns=1, order=0)
Sextupole(name="SY1_1F4", length=0.08, ms=-277.23165, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR041", length=0.0775, dp=0.0, exact=False, ns=1, order=0)
BPM(name="BPM16", direction="forward", dp=0.0)
BPM(name="BPM16", direction="inverse", dp=0.0)
Drift(name="DR042", length=0.0775, dp=0.0, exact=False, ns=1, order=0)
Sextupole(name="SX1_1F4", length=0.08, ms=206.44984, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR043", length=0.07, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q1F4", length=0.09, kn=12.030967120000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Corrector(name="CXY", cx=0.0, cy=0.0, dp=0.0)
Quadrupole(name="Q1F4", length=0.09, kn=12.030967120000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR044", length=0.07, dp=0.0, exact=False, ns=1, order=0)
Sextupole(name="SX2_1F4", length=0.08, ms=206.44984, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR045", length=0.155, dp=0.0, exact=False, ns=1, order=0)
Sextupole(name="SY2_1F4", length=0.08, ms=-277.23165, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR046", length=0.10958, dp=0.0, exact=False, ns=1, order=0)
Dipole(name="RM2", length=0.87284, angle=0.785398163400001, e1=0.0, e1_on=True, e2=0.0, e2_on=True, kn=-2.379107171999999, ks=0.0, ms=0.0, mo=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR047", length=0.12958, dp=0.0, exact=False, ns=1, order=0)
BPM(name="BPM17", direction="forward", dp=0.0)
BPM(name="BPM17", direction="inverse", dp=0.0)
Drift(name="DR048", length=0.055, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q1F1", length=0.09, kn=13.562217330000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Corrector(name="CXY", cx=0.0, cy=0.0, dp=0.0)
Quadrupole(name="Q1F1", length=0.09, kn=13.562217330000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR049", length=0.12, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q1D1", length=0.09, kn=-6.763721520999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Corrector(name="CXY", cx=0.0, cy=0.0, dp=0.0)
Quadrupole(name="Q1D1", length=0.09, kn=-6.763721520999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR050", length=0.72, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q2D1", length=0.09, kn=-6.763721520999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Corrector(name="CXY", cx=0.0, cy=0.0, dp=0.0)
Quadrupole(name="Q2D1", length=0.09, kn=-6.763721520999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR051", length=0.12, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q2F1", length=0.09, kn=13.562217330000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Corrector(name="CXY", cx=0.0, cy=0.0, dp=0.0)
Quadrupole(name="Q2F1", length=0.09, kn=13.562217330000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR052", length=0.075, dp=0.0, exact=False, ns=1, order=0)
BPM(name="BPM01", direction="forward", dp=0.0)
BPM(name="BPM01", direction="inverse", dp=0.0)
Drift(name="DR053", length=0.10958, dp=0.0, exact=False, ns=1, order=0)
Dipole(name="RM3", length=0.87284, angle=0.785398163400001, e1=0.0, e1_on=True, e2=0.0, e2_on=True, kn=-2.379107171999999, ks=0.0, ms=0.0, mo=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR054", length=0.10958, dp=0.0, exact=False, ns=1, order=0)
Sextupole(name="SY1_2F4", length=0.08, ms=-277.23165, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR055", length=0.155, dp=0.0, exact=False, ns=1, order=0)
Sextupole(name="SX1_2F4", length=0.08, ms=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR056", length=0.07, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q2F4", length=0.09, kn=12.030967120000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Corrector(name="CXY", cx=0.0, cy=0.0, dp=0.0)
Quadrupole(name="Q2F4", length=0.09, kn=12.030967120000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR057", length=0.07, dp=0.0, exact=False, ns=1, order=0)
Sextupole(name="SX2_2F4", length=0.08, ms=206.44984, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR058", length=0.101, dp=0.0, exact=False, ns=1, order=0)
BPM(name="BPM02", direction="forward", dp=0.0)
BPM(name="BPM02", direction="inverse", dp=0.0)
Drift(name="DR059", length=0.054, dp=0.0, exact=False, ns=1, order=0)
Sextupole(name="SY2_2F4", length=0.08, ms=-277.23165, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR060", length=0.10958, dp=0.0, exact=False, ns=1, order=0)
Dipole(name="RM4", length=0.87284, angle=0.785398163400001, e1=0.0, e1_on=True, e2=0.0, e2_on=True, kn=-2.379107171999999, ks=0.0, ms=0.0, mo=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR061", length=0.11958, dp=0.0, exact=False, ns=1, order=0)
BPM(name="BPM03", direction="forward", dp=0.0)
BPM(name="BPM03", direction="inverse", dp=0.0)
Drift(name="DR062", length=0.065, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q2F2", length=0.09, kn=13.690633560000002, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Corrector(name="CXY", cx=0.0, cy=0.0, dp=0.0)
Quadrupole(name="Q2F2", length=0.09, kn=13.690633560000002, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR063", length=0.221715, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q2D2", length=0.098285, kn=-2.815743509999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Corrector(name="CXY", cx=0.0, cy=0.0, dp=0.0)
Quadrupole(name="Q2D2", length=0.098285, kn=-2.815743509999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR064", length=0.9624299999999999, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q2D3", length=0.098285, kn=-8.487311754999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Corrector(name="CXY", cx=0.0, cy=0.0, dp=0.0)
Quadrupole(name="Q2D3", length=0.098285, kn=-8.487311754999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR065", length=0.106715, dp=0.0, exact=False, ns=1, order=0)
BPM(name="BPM04", direction="forward", dp=0.0)
BPM(name="BPM04", direction="inverse", dp=0.0)
Drift(name="DR066", length=0.066715, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q2F3", length=0.098285, kn=7.899043454000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Corrector(name="CXY", cx=0.0, cy=0.0, dp=0.0)
Quadrupole(name="Q2F3", length=0.098285, kn=7.899043454000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR067", length=1.2042300000000001, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q3F3", length=0.098285, kn=7.640511954000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Corrector(name="CXY", cx=0.0, cy=0.0, dp=0.0)
Quadrupole(name="Q3F3", length=0.098285, kn=7.640511954000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR068", length=0.056715, dp=0.0, exact=False, ns=1, order=0)
BPM(name="BPM05", direction="forward", dp=0.0)
[13]:
# Individual elements can be renamed with rename method (renames the first occurrance of the element in the sequence)
# To rename by kind mangle method can be used
# Note, a list of element names to skip can be also passed to it

ring.mangle('Corrector')
print(ring)
BPM(name="BPM05", direction="inverse", dp=0.0)
Drift(name="DR001", length=0.116715, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q3D3", length=0.098285, kn=-8.426928737999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Corrector(name="CXY001", cx=0.0, cy=0.0, dp=0.0)
Quadrupole(name="Q3D3", length=0.098285, kn=-8.426928737999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR002", length=0.9684299999999999, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q3D2", length=0.098285, kn=-2.695188250999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Corrector(name="CXY002", cx=0.0, cy=0.0, dp=0.0)
Quadrupole(name="Q3D2", length=0.098285, kn=-2.695188250999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR003", length=0.221715, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q3F2", length=0.09, kn=13.544085930000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Corrector(name="CXY003", cx=0.0, cy=0.0, dp=0.0)
Quadrupole(name="Q3F2", length=0.09, kn=13.544085930000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR004", length=0.065, dp=0.0, exact=False, ns=1, order=0)
BPM(name="BPM07", direction="forward", dp=0.0)
BPM(name="BPM07", direction="inverse", dp=0.0)
Drift(name="DR005", length=0.11958, dp=0.0, exact=False, ns=1, order=0)
Dipole(name="RM5", length=0.87284, angle=0.785398163400001, e1=0.0, e1_on=True, e2=0.0, e2_on=True, kn=-2.379107171999999, ks=0.0, ms=0.0, mo=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR006", length=0.10958, dp=0.0, exact=False, ns=1, order=0)
Sextupole(name="SY1_3F4", length=0.08, ms=-277.23165, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR007", length=0.044, dp=0.0, exact=False, ns=1, order=0)
BPM(name="BPM08", direction="forward", dp=0.0)
BPM(name="BPM08", direction="inverse", dp=0.0)
Drift(name="DR008", length=0.111, dp=0.0, exact=False, ns=1, order=0)
Sextupole(name="SX1_3F4", length=0.08, ms=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR009", length=0.07, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q3F4", length=0.09, kn=12.030967120000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Corrector(name="CXY004", cx=0.0, cy=0.0, dp=0.0)
Quadrupole(name="Q3F4", length=0.09, kn=12.030967120000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR010", length=0.07, dp=0.0, exact=False, ns=1, order=0)
Sextupole(name="SX2_3F4", length=0.08, ms=206.44984, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR011", length=0.155, dp=0.0, exact=False, ns=1, order=0)
Sextupole(name="SY2_3F4", length=0.08, ms=-277.23165, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR012", length=0.10958, dp=0.0, exact=False, ns=1, order=0)
Dipole(name="RM6", length=0.87284, angle=0.785398163400001, e1=0.0, e1_on=True, e2=0.0, e2_on=True, kn=-2.379107171999999, ks=0.0, ms=0.0, mo=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR013", length=0.11958, dp=0.0, exact=False, ns=1, order=0)
BPM(name="BPM09", direction="forward", dp=0.0)
BPM(name="BPM09", direction="inverse", dp=0.0)
Drift(name="DR014", length=0.065, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q3F1", length=0.09, kn=13.562217330000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Corrector(name="CXY005", cx=0.0, cy=0.0, dp=0.0)
Quadrupole(name="Q3F1", length=0.09, kn=13.562217330000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR015", length=0.12, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q3D1", length=0.09, kn=-6.763721520999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Corrector(name="CXY006", cx=0.0, cy=0.0, dp=0.0)
Quadrupole(name="Q3D1", length=0.09, kn=-6.763721520999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR016", length=0.72, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q4D1", length=0.09, kn=-6.763721520999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Corrector(name="CXY007", cx=0.0, cy=0.0, dp=0.0)
Quadrupole(name="Q4D1", length=0.09, kn=-6.763721520999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR017", length=0.12, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q4F1", length=0.09, kn=13.562217330000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Corrector(name="CXY008", cx=0.0, cy=0.0, dp=0.0)
Quadrupole(name="Q4F1", length=0.09, kn=13.562217330000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR018", length=0.07, dp=0.0, exact=False, ns=1, order=0)
BPM(name="BPM10", direction="forward", dp=0.0)
BPM(name="BPM10", direction="inverse", dp=0.0)
Drift(name="DR019", length=0.11458, dp=0.0, exact=False, ns=1, order=0)
Dipole(name="RM7", length=0.87284, angle=0.785398163400001, e1=0.0, e1_on=True, e2=0.0, e2_on=True, kn=-2.379107171999999, ks=0.0, ms=0.0, mo=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR020", length=0.10958, dp=0.0, exact=False, ns=1, order=0)
Sextupole(name="SY1_4F4", length=0.08, ms=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR021", length=0.155, dp=0.0, exact=False, ns=1, order=0)
Sextupole(name="SX1_4F4", length=0.08, ms=206.44984, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR022", length=0.07, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q4F4", length=0.09, kn=12.030967120000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Corrector(name="CXY009", cx=0.0, cy=0.0, dp=0.0)
Quadrupole(name="Q4F4", length=0.09, kn=12.030967120000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR023", length=0.07, dp=0.0, exact=False, ns=1, order=0)
Sextupole(name="SX2_4F4", length=0.08, ms=206.44984, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR024", length=0.11, dp=0.0, exact=False, ns=1, order=0)
BPM(name="BPM11", direction="forward", dp=0.0)
BPM(name="BPM11", direction="inverse", dp=0.0)
Drift(name="DR025", length=0.045, dp=0.0, exact=False, ns=1, order=0)
Sextupole(name="SY2_4F4", length=0.08, ms=-277.23165, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR026", length=0.10958, dp=0.0, exact=False, ns=1, order=0)
Dipole(name="RM8", length=0.87284, angle=0.785398163400001, e1=0.0, e1_on=True, e2=0.0, e2_on=True, kn=-2.379107171999999, ks=0.0, ms=0.0, mo=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR027", length=0.11958, dp=0.0, exact=False, ns=1, order=0)
BPM(name="BPM12", direction="forward", dp=0.0)
BPM(name="BPM12", direction="inverse", dp=0.0)
Drift(name="DR028", length=0.065, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q4F2", length=0.09, kn=13.562217330000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Corrector(name="CXY010", cx=0.0, cy=0.0, dp=0.0)
Quadrupole(name="Q4F2", length=0.09, kn=13.562217330000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR029", length=0.221715, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q4D2", length=0.098285, kn=-2.645953025999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Corrector(name="CXY011", cx=0.0, cy=0.0, dp=0.0)
Quadrupole(name="Q4D2", length=0.098285, kn=-2.645953025999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR030", length=0.9684299999999999, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q4D3", length=0.098285, kn=-8.526334987999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Corrector(name="CXY012", cx=0.0, cy=0.0, dp=0.0)
Quadrupole(name="Q4D3", length=0.098285, kn=-8.526334987999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR031", length=0.116715, dp=0.0, exact=False, ns=1, order=0)
BPM(name="BPM13", direction="forward", dp=0.0)
BPM(name="BPM13", direction="inverse", dp=0.0)
Drift(name="DR032", length=0.056715, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q4F3", length=0.098285, kn=7.792169674000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Corrector(name="CXY013", cx=0.0, cy=0.0, dp=0.0)
Quadrupole(name="Q4F3", length=0.098285, kn=7.792169674000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR033", length=1.19823, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q1F3", length=0.098285, kn=7.792169674000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Corrector(name="CXY014", cx=0.0, cy=0.0, dp=0.0)
Quadrupole(name="Q1F3", length=0.098285, kn=7.792169674000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR034", length=0.071715, dp=0.0, exact=False, ns=1, order=0)
BPM(name="BPM14", direction="forward", dp=0.0)
BPM(name="BPM14", direction="inverse", dp=0.0)
Drift(name="DR035", length=0.101715, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q1D3", length=0.098285, kn=-8.526334987999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Corrector(name="CXY015", cx=0.0, cy=0.0, dp=0.0)
Quadrupole(name="Q1D3", length=0.098285, kn=-8.526334987999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR036", length=0.9684299999999999, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q1D2", length=0.098285, kn=-2.645953025999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Corrector(name="CXY016", cx=0.0, cy=0.0, dp=0.0)
Quadrupole(name="Q1D2", length=0.098285, kn=-2.645953025999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR037", length=0.221715, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q1F2", length=0.09, kn=13.562217330000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Corrector(name="CXY017", cx=0.0, cy=0.0, dp=0.0)
Quadrupole(name="Q1F2", length=0.09, kn=13.562217330000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR038", length=0.07, dp=0.0, exact=False, ns=1, order=0)
BPM(name="BPM15", direction="forward", dp=0.0)
BPM(name="BPM15", direction="inverse", dp=0.0)
Drift(name="DR039", length=0.11458, dp=0.0, exact=False, ns=1, order=0)
Dipole(name="RM1", length=0.87284, angle=0.785398163400001, e1=0.0, e1_on=True, e2=0.0, e2_on=True, kn=-2.379107171999999, ks=0.0, ms=0.0, mo=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR040", length=0.10958, dp=0.0, exact=False, ns=1, order=0)
Sextupole(name="SY1_1F4", length=0.08, ms=-277.23165, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR041", length=0.0775, dp=0.0, exact=False, ns=1, order=0)
BPM(name="BPM16", direction="forward", dp=0.0)
BPM(name="BPM16", direction="inverse", dp=0.0)
Drift(name="DR042", length=0.0775, dp=0.0, exact=False, ns=1, order=0)
Sextupole(name="SX1_1F4", length=0.08, ms=206.44984, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR043", length=0.07, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q1F4", length=0.09, kn=12.030967120000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Corrector(name="CXY018", cx=0.0, cy=0.0, dp=0.0)
Quadrupole(name="Q1F4", length=0.09, kn=12.030967120000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR044", length=0.07, dp=0.0, exact=False, ns=1, order=0)
Sextupole(name="SX2_1F4", length=0.08, ms=206.44984, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR045", length=0.155, dp=0.0, exact=False, ns=1, order=0)
Sextupole(name="SY2_1F4", length=0.08, ms=-277.23165, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR046", length=0.10958, dp=0.0, exact=False, ns=1, order=0)
Dipole(name="RM2", length=0.87284, angle=0.785398163400001, e1=0.0, e1_on=True, e2=0.0, e2_on=True, kn=-2.379107171999999, ks=0.0, ms=0.0, mo=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR047", length=0.12958, dp=0.0, exact=False, ns=1, order=0)
BPM(name="BPM17", direction="forward", dp=0.0)
BPM(name="BPM17", direction="inverse", dp=0.0)
Drift(name="DR048", length=0.055, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q1F1", length=0.09, kn=13.562217330000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Corrector(name="CXY019", cx=0.0, cy=0.0, dp=0.0)
Quadrupole(name="Q1F1", length=0.09, kn=13.562217330000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR049", length=0.12, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q1D1", length=0.09, kn=-6.763721520999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Corrector(name="CXY020", cx=0.0, cy=0.0, dp=0.0)
Quadrupole(name="Q1D1", length=0.09, kn=-6.763721520999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR050", length=0.72, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q2D1", length=0.09, kn=-6.763721520999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Corrector(name="CXY021", cx=0.0, cy=0.0, dp=0.0)
Quadrupole(name="Q2D1", length=0.09, kn=-6.763721520999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR051", length=0.12, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q2F1", length=0.09, kn=13.562217330000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Corrector(name="CXY022", cx=0.0, cy=0.0, dp=0.0)
Quadrupole(name="Q2F1", length=0.09, kn=13.562217330000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR052", length=0.075, dp=0.0, exact=False, ns=1, order=0)
BPM(name="BPM01", direction="forward", dp=0.0)
BPM(name="BPM01", direction="inverse", dp=0.0)
Drift(name="DR053", length=0.10958, dp=0.0, exact=False, ns=1, order=0)
Dipole(name="RM3", length=0.87284, angle=0.785398163400001, e1=0.0, e1_on=True, e2=0.0, e2_on=True, kn=-2.379107171999999, ks=0.0, ms=0.0, mo=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR054", length=0.10958, dp=0.0, exact=False, ns=1, order=0)
Sextupole(name="SY1_2F4", length=0.08, ms=-277.23165, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR055", length=0.155, dp=0.0, exact=False, ns=1, order=0)
Sextupole(name="SX1_2F4", length=0.08, ms=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR056", length=0.07, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q2F4", length=0.09, kn=12.030967120000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Corrector(name="CXY023", cx=0.0, cy=0.0, dp=0.0)
Quadrupole(name="Q2F4", length=0.09, kn=12.030967120000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR057", length=0.07, dp=0.0, exact=False, ns=1, order=0)
Sextupole(name="SX2_2F4", length=0.08, ms=206.44984, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR058", length=0.101, dp=0.0, exact=False, ns=1, order=0)
BPM(name="BPM02", direction="forward", dp=0.0)
BPM(name="BPM02", direction="inverse", dp=0.0)
Drift(name="DR059", length=0.054, dp=0.0, exact=False, ns=1, order=0)
Sextupole(name="SY2_2F4", length=0.08, ms=-277.23165, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR060", length=0.10958, dp=0.0, exact=False, ns=1, order=0)
Dipole(name="RM4", length=0.87284, angle=0.785398163400001, e1=0.0, e1_on=True, e2=0.0, e2_on=True, kn=-2.379107171999999, ks=0.0, ms=0.0, mo=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR061", length=0.11958, dp=0.0, exact=False, ns=1, order=0)
BPM(name="BPM03", direction="forward", dp=0.0)
BPM(name="BPM03", direction="inverse", dp=0.0)
Drift(name="DR062", length=0.065, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q2F2", length=0.09, kn=13.690633560000002, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Corrector(name="CXY024", cx=0.0, cy=0.0, dp=0.0)
Quadrupole(name="Q2F2", length=0.09, kn=13.690633560000002, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR063", length=0.221715, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q2D2", length=0.098285, kn=-2.815743509999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Corrector(name="CXY025", cx=0.0, cy=0.0, dp=0.0)
Quadrupole(name="Q2D2", length=0.098285, kn=-2.815743509999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR064", length=0.9624299999999999, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q2D3", length=0.098285, kn=-8.487311754999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Corrector(name="CXY026", cx=0.0, cy=0.0, dp=0.0)
Quadrupole(name="Q2D3", length=0.098285, kn=-8.487311754999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR065", length=0.106715, dp=0.0, exact=False, ns=1, order=0)
BPM(name="BPM04", direction="forward", dp=0.0)
BPM(name="BPM04", direction="inverse", dp=0.0)
Drift(name="DR066", length=0.066715, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q2F3", length=0.098285, kn=7.899043454000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Corrector(name="CXY027", cx=0.0, cy=0.0, dp=0.0)
Quadrupole(name="Q2F3", length=0.098285, kn=7.899043454000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR067", length=1.2042300000000001, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q3F3", length=0.098285, kn=7.640511954000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Corrector(name="CXY028", cx=0.0, cy=0.0, dp=0.0)
Quadrupole(name="Q3F3", length=0.098285, kn=7.640511954000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR068", length=0.056715, dp=0.0, exact=False, ns=1, order=0)
BPM(name="BPM05", direction="forward", dp=0.0)
[14]:
# Create lines between BPMs
# Note, printout is always flat

ring.splice()

print(len(ring))

16
[15]:
# Print the first subline

line, *_ = ring
print(line)
BPM(name="BPM05", direction="inverse", dp=0.0)
Drift(name="DR001", length=0.116715, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q3D3", length=0.098285, kn=-8.426928737999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Corrector(name="CXY001", cx=0.0, cy=0.0, dp=0.0)
Quadrupole(name="Q3D3", length=0.098285, kn=-8.426928737999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR002", length=0.9684299999999999, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q3D2", length=0.098285, kn=-2.695188250999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Corrector(name="CXY002", cx=0.0, cy=0.0, dp=0.0)
Quadrupole(name="Q3D2", length=0.098285, kn=-2.695188250999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR003", length=0.221715, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q3F2", length=0.09, kn=13.544085930000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Corrector(name="CXY003", cx=0.0, cy=0.0, dp=0.0)
Quadrupole(name="Q3F2", length=0.09, kn=13.544085930000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR004", length=0.065, dp=0.0, exact=False, ns=1, order=0)
BPM(name="BPM07", direction="forward", dp=0.0)
[16]:
# Print the second subline

_, line, *_ = ring
print(line)
BPM(name="BPM07", direction="inverse", dp=0.0)
Drift(name="DR005", length=0.11958, dp=0.0, exact=False, ns=1, order=0)
Dipole(name="RM5", length=0.87284, angle=0.785398163400001, e1=0.0, e1_on=True, e2=0.0, e2_on=True, kn=-2.379107171999999, ks=0.0, ms=0.0, mo=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR006", length=0.10958, dp=0.0, exact=False, ns=1, order=0)
Sextupole(name="SY1_3F4", length=0.08, ms=-277.23165, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR007", length=0.044, dp=0.0, exact=False, ns=1, order=0)
BPM(name="BPM08", direction="forward", dp=0.0)
[17]:
# Print the last subline

*_, line = ring
print(line)
BPM(name="BPM04", direction="inverse", dp=0.0)
Drift(name="DR066", length=0.066715, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q2F3", length=0.098285, kn=7.899043454000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Corrector(name="CXY027", cx=0.0, cy=0.0, dp=0.0)
Quadrupole(name="Q2F3", length=0.098285, kn=7.899043454000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR067", length=1.2042300000000001, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q3F3", length=0.098285, kn=7.640511954000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Corrector(name="CXY028", cx=0.0, cy=0.0, dp=0.0)
Quadrupole(name="Q3F3", length=0.098285, kn=7.640511954000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR068", length=0.056715, dp=0.0, exact=False, ns=1, order=0)
BPM(name="BPM05", direction="forward", dp=0.0)
[18]:
# save/load lattice

path = Path('ring.yaml')
save_line(ring, path)
ring:Line = load_line(path)

print(f'{ring.length.item():.3f}')
print(f'{ring.angle.item():.3f}')
print(ring.describe)
27.426
6.283
{'BPM': 16, 'Drift': 68, 'Quadrupole': 28, 'Corrector': 28, 'Dipole': 8, 'Sextupole': 16}
[19]:
# Here are all the steps together without save/load steps

path = Path('ic.lte')                                              # -- set path with ELEGANT lattice file
data = load_lattice(path)                                          # -- load ELEGANT file as dictionary
ring:Line = build('RING', 'ELEGANT', data)                         # -- build ELEGANT style dictionary
ring.propagate = True                                              # -- set flag to propagate options (slicing, integration order, exact, output, ...)
ring.flatten()                                                     # -- flatten all sublines
ring.clean((1.0E-12, None, None, None))                            # -- remove non-zero length elements with length smaller than given
ring.merge()                                                       # -- merge drifts
ring.split((None, ['BPM'], None, None))                            # -- split BPMs
ring.roll(1)                                                       # -- change line start
insection = Corrector('CXY')                                       # -- define insertion element
ring.split((1 + 1, ['Quadrupole'], None, None), paste=[insection]) # -- split quadrupoles and insert corrector between parts
ring.mangle('Corrector')                                           # -- rename all correctors (unique names)
ring.splice()                                                      # -- generate lines between BPMs
[20]:
# Plot 3D profile

# Slice dipoles

ring.ns = (('Dipole', 0.05), )

# Set layout

layout = Layout(ring)

# Generate orbit

x, y, z = layout.orbit(flat=False, step=0.05, start=(0, 0))

# Generate layout blocks

blocks = layout.profile_3d(scale=2.5, exclude=['Drift'])

# Plot

figure = graph_objects.Figure(
    data=[
        graph_objects.Scatter3d(
            x=x.numpy(),
            y=y.numpy(),
            z=z.numpy(),
            mode='lines',
            name='Orbit',
            line=dict(color='black',width=2.0,dash='solid'),
            opacity=0.75,
            showlegend=True
        ),
        *[graph_objects.Mesh3d(block) for block in blocks]
    ]
)
figure.update_layout(
    scene=dict(
        xaxis=dict(visible=False, range=[-10,10]),
        yaxis=dict(visible=False, range=[-10,10]),
        zaxis=dict(visible=False, range=[-2,2]),
        aspectratio=dict(x=1, y=1, z=1/5),
        annotations=[]
    ),
    margin=dict(l=0, r=0, t=0, b=0),
    legend=dict(orientation='v', x=0., y=1., xanchor='left', yanchor='top'),
    hoverlabel=dict(font_size=12, font_family="Rockwell", font_color='white'),
    legend_groupclick='toggleitem'
)
figure.show()
[21]:
# In the rest of the example we go through all line methods and properties one by one
# Also see element properties that are not reimplemented (flag, clone)

insection = Corrector('CXY')

path = Path('ic.lte')
data = load_lattice(path)
ring:Line = build('RING', 'ELEGANT', data)
ring.propagate = True
ring.flatten()
ring.clean((1.0E-12, None, None, None))
ring.merge()
ring.split((None, ['BPM'], None, None))
ring.roll(1)
ring.split((1 + 1, ['Quadrupole'], None, None), paste=[insection])
ring.mangle('Corrector')
ring.splice()
[22]:
# serialize (property)

print([*map(len, ring)])

_, line, *_ = ring
pprint(line.serialize, sort_dicts=False)
[15, 7, 15, 19, 15, 7, 15, 11, 15, 7, 15, 19, 15, 7, 15, 11]
{'kind': 'Line',
 'name': 'BPM07_BPM08',
 'sequence': [{'kind': 'BPM',
               'name': 'BPM07',
               'dp': 0.0,
               'dx': 0.0,
               'dy': 0.0,
               'dz': 0.0,
               'wx': 0.0,
               'wy': 0.0,
               'wz': 0.0,
               'output': False,
               'matrix': False,
               'direction': 'inverse'},
              {'kind': 'Drift',
               'name': 'DR005',
               'length': 0.11958,
               'dp': 0.0,
               'dx': 0.0,
               'dy': 0.0,
               'dz': 0.0,
               'wx': 0.0,
               'wy': 0.0,
               'wz': 0.0,
               'ns': 1,
               'order': 0,
               'exact': False,
               'insertion': False,
               'output': False,
               'matrix': False},
              {'kind': 'Dipole',
               'name': 'RM5',
               'length': 0.87284,
               'dp': 0.0,
               'dx': 0.0,
               'dy': 0.0,
               'dz': 0.0,
               'wx': 0.0,
               'wy': 0.0,
               'wz': 0.0,
               'ns': 1,
               'order': 0,
               'exact': False,
               'insertion': False,
               'output': False,
               'matrix': False,
               'angle': 0.785398163400001,
               'e1': 0.0,
               'e2': 0.0,
               'kn': -2.379107171999999,
               'ks': 0.0,
               'ms': 0.0,
               'mo': 0.0,
               'e1_on': True,
               'e2_on': True},
              {'kind': 'Drift',
               'name': 'DR006',
               'length': 0.10958,
               'dp': 0.0,
               'dx': 0.0,
               'dy': 0.0,
               'dz': 0.0,
               'wx': 0.0,
               'wy': 0.0,
               'wz': 0.0,
               'ns': 1,
               'order': 0,
               'exact': False,
               'insertion': False,
               'output': False,
               'matrix': False},
              {'kind': 'Sextupole',
               'name': 'SY1_3F4',
               'length': 0.08,
               'dp': 0.0,
               'dx': 0.0,
               'dy': 0.0,
               'dz': 0.0,
               'wx': 0.0,
               'wy': 0.0,
               'wz': 0.0,
               'ns': 1,
               'order': 0,
               'exact': False,
               'insertion': False,
               'output': False,
               'matrix': False,
               'ms': -277.23165},
              {'kind': 'Drift',
               'name': 'DR007',
               'length': 0.044,
               'dp': 0.0,
               'dx': 0.0,
               'dy': 0.0,
               'dz': 0.0,
               'wx': 0.0,
               'wy': 0.0,
               'wz': 0.0,
               'ns': 1,
               'order': 0,
               'exact': False,
               'insertion': False,
               'output': False,
               'matrix': False},
              {'kind': 'BPM',
               'name': 'BPM08',
               'dp': 0.0,
               'dx': 0.0,
               'dy': 0.0,
               'dz': 0.0,
               'wx': 0.0,
               'wy': 0.0,
               'wz': 0.0,
               'output': False,
               'matrix': False,
               'direction': 'forward'}],
 'propagate': False,
 'dp': 0.0,
 'exact': False,
 'output': False,
 'matrix': False}
[23]:
# inverse

forward, *_ = ring.clone()
forward.propagate = True
forward.dp = 0.001

inverse = forward.inverse()

state = torch.tensor([0.001, 0.0005, -0.005, 0.0001], dtype=torch.float64)
local = forward(state)
local = inverse(local)

assert torch.allclose(local, state, rtol=1.0E-15, atol=1.0E-15)
[24]:
# data (default deviation data)

_, line, *_ = ring.clone()
pprint(line.data(alignment=False), sort_dicts=False)
{'BPM07': {'xx': tensor(0., dtype=torch.float64),
           'xy': tensor(0., dtype=torch.float64),
           'yx': tensor(0., dtype=torch.float64),
           'yy': tensor(0., dtype=torch.float64),
           'dp': tensor(0., dtype=torch.float64)},
 'DR005': {'dp': tensor(0., dtype=torch.float64),
           'dl': tensor(0., dtype=torch.float64)},
 'RM5': {'dw': tensor(0., dtype=torch.float64),
         'e1': tensor(0., dtype=torch.float64),
         'e2': tensor(0., dtype=torch.float64),
         'kn': tensor(0., dtype=torch.float64),
         'ks': tensor(0., dtype=torch.float64),
         'ms': tensor(0., dtype=torch.float64),
         'mo': tensor(0., dtype=torch.float64),
         'dp': tensor(0., dtype=torch.float64),
         'dl': tensor(0., dtype=torch.float64)},
 'DR006': {'dp': tensor(0., dtype=torch.float64),
           'dl': tensor(0., dtype=torch.float64)},
 'SY1_3F4': {'ms': tensor(0., dtype=torch.float64),
             'dp': tensor(0., dtype=torch.float64),
             'dl': tensor(0., dtype=torch.float64)},
 'DR007': {'dp': tensor(0., dtype=torch.float64),
           'dl': tensor(0., dtype=torch.float64)},
 'BPM08': {'xx': tensor(0., dtype=torch.float64),
           'xy': tensor(0., dtype=torch.float64),
           'yx': tensor(0., dtype=torch.float64),
           'yy': tensor(0., dtype=torch.float64),
           'dp': tensor(0., dtype=torch.float64)}}
[25]:
# scan (generator to get elements at all levels that have given attribute)

pprint([*ring.scan('angle')])
[Dipole(name="RM5", length=0.87284, angle=0.785398163400001, e1=0.0, e1_on=True, e2=0.0, e2_on=True, kn=-2.379107171999999, ks=0.0, ms=0.0, mo=0.0, dp=0.0, exact=False, ns=1, order=0),
 Dipole(name="RM6", length=0.87284, angle=0.785398163400001, e1=0.0, e1_on=True, e2=0.0, e2_on=True, kn=-2.379107171999999, ks=0.0, ms=0.0, mo=0.0, dp=0.0, exact=False, ns=1, order=0),
 Dipole(name="RM7", length=0.87284, angle=0.785398163400001, e1=0.0, e1_on=True, e2=0.0, e2_on=True, kn=-2.379107171999999, ks=0.0, ms=0.0, mo=0.0, dp=0.0, exact=False, ns=1, order=0),
 Dipole(name="RM8", length=0.87284, angle=0.785398163400001, e1=0.0, e1_on=True, e2=0.0, e2_on=True, kn=-2.379107171999999, ks=0.0, ms=0.0, mo=0.0, dp=0.0, exact=False, ns=1, order=0),
 Dipole(name="RM1", length=0.87284, angle=0.785398163400001, e1=0.0, e1_on=True, e2=0.0, e2_on=True, kn=-2.379107171999999, ks=0.0, ms=0.0, mo=0.0, dp=0.0, exact=False, ns=1, order=0),
 Dipole(name="RM2", length=0.87284, angle=0.785398163400001, e1=0.0, e1_on=True, e2=0.0, e2_on=True, kn=-2.379107171999999, ks=0.0, ms=0.0, mo=0.0, dp=0.0, exact=False, ns=1, order=0),
 Dipole(name="RM3", length=0.87284, angle=0.785398163400001, e1=0.0, e1_on=True, e2=0.0, e2_on=True, kn=-2.379107171999999, ks=0.0, ms=0.0, mo=0.0, dp=0.0, exact=False, ns=1, order=0),
 Dipole(name="RM4", length=0.87284, angle=0.785398163400001, e1=0.0, e1_on=True, e2=0.0, e2_on=True, kn=-2.379107171999999, ks=0.0, ms=0.0, mo=0.0, dp=0.0, exact=False, ns=1, order=0)]
[26]:
# select (static method to filter elements)

elements = [*ring.scan('angle')]

pprint(ring.select(elements, kinds=None, names=["RM1", "RM2"]))
[Dipole(name="RM1", length=0.87284, angle=0.785398163400001, e1=0.0, e1_on=True, e2=0.0, e2_on=True, kn=-2.379107171999999, ks=0.0, ms=0.0, mo=0.0, dp=0.0, exact=False, ns=1, order=0),
 Dipole(name="RM2", length=0.87284, angle=0.785398163400001, e1=0.0, e1_on=True, e2=0.0, e2_on=True, kn=-2.379107171999999, ks=0.0, ms=0.0, mo=0.0, dp=0.0, exact=False, ns=1, order=0)]
[27]:
# get (combination of scan and select to get attribute value)

line, *_ = ring.clone()
pprint(line.get('length', kinds=['Quadrupole']))
[('Q3D3', tensor(0.0983, dtype=torch.float64)),
 ('Q3D3', tensor(0.0983, dtype=torch.float64)),
 ('Q3D2', tensor(0.0983, dtype=torch.float64)),
 ('Q3D2', tensor(0.0983, dtype=torch.float64)),
 ('Q3F2', tensor(0.0900, dtype=torch.float64)),
 ('Q3F2', tensor(0.0900, dtype=torch.float64))]
[28]:
# set (combination of scan and select to set attribute value)
# Note, this method sets attribute to the first matched element (by name)

line, *_ = ring.clone()
line.set('length', 0.0, kinds=['Quadrupole'])
pprint(line.get('length', kinds=['Quadrupole']))
[('Q3D3', tensor(0.0983, dtype=torch.float64)),
 ('Q3D3', tensor(0., dtype=torch.float64)),
 ('Q3D2', tensor(0.0983, dtype=torch.float64)),
 ('Q3D2', tensor(0., dtype=torch.float64)),
 ('Q3F2', tensor(0.0900, dtype=torch.float64)),
 ('Q3F2', tensor(0., dtype=torch.float64))]
[29]:
# name

print(ring.name)
RING
[30]:
# sequence (ordered elements)

line, *_ = ring.clone()
pprint(line.sequence)
[BPM(name="BPM05", direction="inverse", dp=0.0),
 Drift(name="DR001", length=0.116715, dp=0.0, exact=False, ns=1, order=0),
 Quadrupole(name="Q3D3", length=0.098285, kn=-8.426928737999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0),
 Corrector(name="CXY001", cx=0.0, cy=0.0, dp=0.0),
 Quadrupole(name="Q3D3", length=0.098285, kn=-8.426928737999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0),
 Drift(name="DR002", length=0.9684299999999999, dp=0.0, exact=False, ns=1, order=0),
 Quadrupole(name="Q3D2", length=0.098285, kn=-2.695188250999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0),
 Corrector(name="CXY002", cx=0.0, cy=0.0, dp=0.0),
 Quadrupole(name="Q3D2", length=0.098285, kn=-2.695188250999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0),
 Drift(name="DR003", length=0.221715, dp=0.0, exact=False, ns=1, order=0),
 Quadrupole(name="Q3F2", length=0.09, kn=13.544085930000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0),
 Corrector(name="CXY003", cx=0.0, cy=0.0, dp=0.0),
 Quadrupole(name="Q3F2", length=0.09, kn=13.544085930000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0),
 Drift(name="DR004", length=0.065, dp=0.0, exact=False, ns=1, order=0),
 BPM(name="BPM07", direction="forward", dp=0.0)]
[31]:
# flatten

line = ring.clone()
print(len(line))
line.flatten()
print(len(line))
16
208
[32]:
# Rename (get/set)

line = ring.clone()
print(line[0].name)
line[0].name = 'LINE'
print(line[0].name)
BPM05_BPM07
LINE
[33]:
# append
# Note, since line sequence is basicaly a (nested) list, all list methods can be used on it
# Not all methods are implemented

line, *_ = ring.clone()
line.append(Corrector('CXY'))
print(line)
BPM(name="BPM05", direction="inverse", dp=0.0)
Drift(name="DR001", length=0.116715, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q3D3", length=0.098285, kn=-8.426928737999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Corrector(name="CXY001", cx=0.0, cy=0.0, dp=0.0)
Quadrupole(name="Q3D3", length=0.098285, kn=-8.426928737999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR002", length=0.9684299999999999, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q3D2", length=0.098285, kn=-2.695188250999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Corrector(name="CXY002", cx=0.0, cy=0.0, dp=0.0)
Quadrupole(name="Q3D2", length=0.098285, kn=-2.695188250999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR003", length=0.221715, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q3F2", length=0.09, kn=13.544085930000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Corrector(name="CXY003", cx=0.0, cy=0.0, dp=0.0)
Quadrupole(name="Q3F2", length=0.09, kn=13.544085930000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR004", length=0.065, dp=0.0, exact=False, ns=1, order=0)
BPM(name="BPM07", direction="forward", dp=0.0)
Corrector(name="CXY", cx=0.0, cy=0.0, dp=0.0)
[34]:
# extend

line, *_ = ring.clone()
line.extend(Line('CXY', sequence=[Corrector('CXY')]))
print(line)
BPM(name="BPM05", direction="inverse", dp=0.0)
Drift(name="DR001", length=0.116715, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q3D3", length=0.098285, kn=-8.426928737999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Corrector(name="CXY001", cx=0.0, cy=0.0, dp=0.0)
Quadrupole(name="Q3D3", length=0.098285, kn=-8.426928737999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR002", length=0.9684299999999999, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q3D2", length=0.098285, kn=-2.695188250999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Corrector(name="CXY002", cx=0.0, cy=0.0, dp=0.0)
Quadrupole(name="Q3D2", length=0.098285, kn=-2.695188250999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR003", length=0.221715, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q3F2", length=0.09, kn=13.544085930000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Corrector(name="CXY003", cx=0.0, cy=0.0, dp=0.0)
Quadrupole(name="Q3F2", length=0.09, kn=13.544085930000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR004", length=0.065, dp=0.0, exact=False, ns=1, order=0)
BPM(name="BPM07", direction="forward", dp=0.0)
Corrector(name="CXY", cx=0.0, cy=0.0, dp=0.0)
[35]:
# insert (after element with given name)

line, *_ = ring.clone()
line.insert(Corrector('CXY'), 'DR001')
print(line)
BPM(name="BPM05", direction="inverse", dp=0.0)
Drift(name="DR001", length=0.116715, dp=0.0, exact=False, ns=1, order=0)
Corrector(name="CXY", cx=0.0, cy=0.0, dp=0.0)
Quadrupole(name="Q3D3", length=0.098285, kn=-8.426928737999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Corrector(name="CXY001", cx=0.0, cy=0.0, dp=0.0)
Quadrupole(name="Q3D3", length=0.098285, kn=-8.426928737999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR002", length=0.9684299999999999, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q3D2", length=0.098285, kn=-2.695188250999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Corrector(name="CXY002", cx=0.0, cy=0.0, dp=0.0)
Quadrupole(name="Q3D2", length=0.098285, kn=-2.695188250999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR003", length=0.221715, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q3F2", length=0.09, kn=13.544085930000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Corrector(name="CXY003", cx=0.0, cy=0.0, dp=0.0)
Quadrupole(name="Q3F2", length=0.09, kn=13.544085930000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR004", length=0.065, dp=0.0, exact=False, ns=1, order=0)
BPM(name="BPM07", direction="forward", dp=0.0)
[36]:
# remove (first occurrance with matching name)

line, *_ = ring.clone()
line.remove('Q3D3')
print(line)
BPM(name="BPM05", direction="inverse", dp=0.0)
Drift(name="DR001", length=0.116715, dp=0.0, exact=False, ns=1, order=0)
Corrector(name="CXY001", cx=0.0, cy=0.0, dp=0.0)
Quadrupole(name="Q3D3", length=0.098285, kn=-8.426928737999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR002", length=0.9684299999999999, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q3D2", length=0.098285, kn=-2.695188250999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Corrector(name="CXY002", cx=0.0, cy=0.0, dp=0.0)
Quadrupole(name="Q3D2", length=0.098285, kn=-2.695188250999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR003", length=0.221715, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q3F2", length=0.09, kn=13.544085930000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Corrector(name="CXY003", cx=0.0, cy=0.0, dp=0.0)
Quadrupole(name="Q3F2", length=0.09, kn=13.544085930000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR004", length=0.065, dp=0.0, exact=False, ns=1, order=0)
BPM(name="BPM07", direction="forward", dp=0.0)
[37]:
# replace (first occurrance with matching name)

line, *_ = ring.clone()
line.replace('Q3D3', Corrector('CXY'))
print(line)
BPM(name="BPM05", direction="inverse", dp=0.0)
Drift(name="DR001", length=0.116715, dp=0.0, exact=False, ns=1, order=0)
Corrector(name="CXY", cx=0.0, cy=0.0, dp=0.0)
Corrector(name="CXY001", cx=0.0, cy=0.0, dp=0.0)
Quadrupole(name="Q3D3", length=0.098285, kn=-8.426928737999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR002", length=0.9684299999999999, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q3D2", length=0.098285, kn=-2.695188250999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Corrector(name="CXY002", cx=0.0, cy=0.0, dp=0.0)
Quadrupole(name="Q3D2", length=0.098285, kn=-2.695188250999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR003", length=0.221715, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q3F2", length=0.09, kn=13.544085930000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Corrector(name="CXY003", cx=0.0, cy=0.0, dp=0.0)
Quadrupole(name="Q3F2", length=0.09, kn=13.544085930000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR004", length=0.065, dp=0.0, exact=False, ns=1, order=0)
BPM(name="BPM07", direction="forward", dp=0.0)
[38]:
# names (all first level names)

line, *_ = ring.clone()
pprint(line.names)
['BPM05',
 'DR001',
 'Q3D3',
 'CXY001',
 'Q3D3',
 'DR002',
 'Q3D2',
 'CXY002',
 'Q3D2',
 'DR003',
 'Q3F2',
 'CXY003',
 'Q3F2',
 'DR004',
 'BPM07']
[39]:
# position (first matching position at the first level)

line, *_ = ring.clone()
line.position('Q3D3')
[39]:
2
[40]:
# positions (all matching position at the first level)

line, *_ = ring.clone()
line.positions('Q3D3')
[40]:
[2, 4]
[41]:
# start (get/set start by name, first match)

_, line, *_ = ring.clone()

print(line.start)
print(line)
print()

line.start = 'RM5'

print(line.start)
print(line)
print()
BPM07
BPM(name="BPM07", direction="inverse", dp=0.0)
Drift(name="DR005", length=0.11958, dp=0.0, exact=False, ns=1, order=0)
Dipole(name="RM5", length=0.87284, angle=0.785398163400001, e1=0.0, e1_on=True, e2=0.0, e2_on=True, kn=-2.379107171999999, ks=0.0, ms=0.0, mo=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR006", length=0.10958, dp=0.0, exact=False, ns=1, order=0)
Sextupole(name="SY1_3F4", length=0.08, ms=-277.23165, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR007", length=0.044, dp=0.0, exact=False, ns=1, order=0)
BPM(name="BPM08", direction="forward", dp=0.0)

RM5
Dipole(name="RM5", length=0.87284, angle=0.785398163400001, e1=0.0, e1_on=True, e2=0.0, e2_on=True, kn=-2.379107171999999, ks=0.0, ms=0.0, mo=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR006", length=0.10958, dp=0.0, exact=False, ns=1, order=0)
Sextupole(name="SY1_3F4", length=0.08, ms=-277.23165, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR007", length=0.044, dp=0.0, exact=False, ns=1, order=0)
BPM(name="BPM08", direction="forward", dp=0.0)
BPM(name="BPM07", direction="inverse", dp=0.0)
Drift(name="DR005", length=0.11958, dp=0.0, exact=False, ns=1, order=0)

[42]:
# roll (first level sequence)

_, line, *_ = ring.clone()

print(line.start)
print(line)
print()

line.roll(line.position('RM5'))

print(line.start)
print(line)
print()
BPM07
BPM(name="BPM07", direction="inverse", dp=0.0)
Drift(name="DR005", length=0.11958, dp=0.0, exact=False, ns=1, order=0)
Dipole(name="RM5", length=0.87284, angle=0.785398163400001, e1=0.0, e1_on=True, e2=0.0, e2_on=True, kn=-2.379107171999999, ks=0.0, ms=0.0, mo=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR006", length=0.10958, dp=0.0, exact=False, ns=1, order=0)
Sextupole(name="SY1_3F4", length=0.08, ms=-277.23165, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR007", length=0.044, dp=0.0, exact=False, ns=1, order=0)
BPM(name="BPM08", direction="forward", dp=0.0)

RM5
Dipole(name="RM5", length=0.87284, angle=0.785398163400001, e1=0.0, e1_on=True, e2=0.0, e2_on=True, kn=-2.379107171999999, ks=0.0, ms=0.0, mo=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR006", length=0.10958, dp=0.0, exact=False, ns=1, order=0)
Sextupole(name="SY1_3F4", length=0.08, ms=-277.23165, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR007", length=0.044, dp=0.0, exact=False, ns=1, order=0)
BPM(name="BPM08", direction="forward", dp=0.0)
BPM(name="BPM07", direction="inverse", dp=0.0)
Drift(name="DR005", length=0.11958, dp=0.0, exact=False, ns=1, order=0)

[43]:
# unique (unique elements at all levels)

_, line, *_ = ring.clone()
pprint(line.unique)
{'BPM07': ('BPM',
           tensor(0., dtype=torch.float64),
           tensor(0., dtype=torch.float64)),
 'BPM08': ('BPM',
           tensor(0., dtype=torch.float64),
           tensor(0., dtype=torch.float64)),
 'DR005': ('Drift',
           tensor(0.1196, dtype=torch.float64),
           tensor(0., dtype=torch.float64)),
 'DR006': ('Drift',
           tensor(0.1096, dtype=torch.float64),
           tensor(0., dtype=torch.float64)),
 'DR007': ('Drift',
           tensor(0.0440, dtype=torch.float64),
           tensor(0., dtype=torch.float64)),
 'RM5': ('Dipole',
         tensor(0.8728, dtype=torch.float64),
         tensor(0.7854, dtype=torch.float64)),
 'SY1_3F4': ('Sextupole',
             tensor(0.0800, dtype=torch.float64),
             tensor(0., dtype=torch.float64))}
[44]:
# duplicate (check first level for duplicates (elements with the same name)

line, *_ = ring.clone()
print(line.duplicates)

_, line, *_ = ring.clone()
print(line.duplicates)
True
False
[45]:
# itemize (get element names with matching kind at all levels, ordered, with duplicates)

pprint(ring.itemize('Dipole'))
pprint(ring.itemize('Quadrupole'))
['RM5', 'RM6', 'RM7', 'RM8', 'RM1', 'RM2', 'RM3', 'RM4']
['Q3D3',
 'Q3D2',
 'Q3F2',
 'Q3F4',
 'Q3F1',
 'Q3D1',
 'Q4D1',
 'Q4F1',
 'Q4F4',
 'Q4F2',
 'Q4D2',
 'Q4D3',
 'Q4F3',
 'Q1F3',
 'Q1D3',
 'Q1D2',
 'Q1F2',
 'Q1F4',
 'Q1F1',
 'Q1D1',
 'Q2D1',
 'Q2F1',
 'Q2F4',
 'Q2F2',
 'Q2D2',
 'Q2D3',
 'Q2F3',
 'Q3F3']
[46]:
# describe (element counts by kinds, all levels, with duplicates)

pprint(ring.describe)
{'BPM': 16,
 'Corrector': 28,
 'Dipole': 8,
 'Drift': 68,
 'Quadrupole': 28,
 'Sextupole': 16}
[47]:
# split (split elements)

_, line, *_ = ring.clone()
print(line)
print()

# zero or one do not slice matching element(s)

_, line, *_ = ring.clone()
line.split((1, ['Dipole'], None, None))
print(line)
print()

# split by kind

_, line, *_ = ring.clone()

line.split((4, ['Dipole'], None, None))
print(line)
print()

# split by kind with insertion (number of insertions is count - 1)

_, line, *_ = ring.clone()

line.split((4, ['Dipole'], None, None), paste=[Corrector('CXY')])
print(line)
print()


# split by names

_, line, *_ = ring.clone()

line.split((4, None, ['RM5'], None))
print(line)
print()

# split by names with exclude

_, line, *_ = ring.clone()

line.split((4, None, ['RM5'], ['RM5']))
print(line)
print()
BPM(name="BPM07", direction="inverse", dp=0.0)
Drift(name="DR005", length=0.11958, dp=0.0, exact=False, ns=1, order=0)
Dipole(name="RM5", length=0.87284, angle=0.785398163400001, e1=0.0, e1_on=True, e2=0.0, e2_on=True, kn=-2.379107171999999, ks=0.0, ms=0.0, mo=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR006", length=0.10958, dp=0.0, exact=False, ns=1, order=0)
Sextupole(name="SY1_3F4", length=0.08, ms=-277.23165, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR007", length=0.044, dp=0.0, exact=False, ns=1, order=0)
BPM(name="BPM08", direction="forward", dp=0.0)

BPM(name="BPM07", direction="inverse", dp=0.0)
Drift(name="DR005", length=0.11958, dp=0.0, exact=False, ns=1, order=0)
Dipole(name="RM5", length=0.87284, angle=0.785398163400001, e1=0.0, e1_on=True, e2=0.0, e2_on=True, kn=-2.379107171999999, ks=0.0, ms=0.0, mo=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR006", length=0.10958, dp=0.0, exact=False, ns=1, order=0)
Sextupole(name="SY1_3F4", length=0.08, ms=-277.23165, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR007", length=0.044, dp=0.0, exact=False, ns=1, order=0)
BPM(name="BPM08", direction="forward", dp=0.0)

BPM(name="BPM07", direction="inverse", dp=0.0)
Drift(name="DR005", length=0.11958, dp=0.0, exact=False, ns=1, order=0)
Dipole(name="RM5", length=0.21821, angle=0.19634954085000025, e1=0.0, e1_on=True, e2=0.0, e2_on=False, kn=-2.379107171999999, ks=0.0, ms=0.0, mo=0.0, dp=0.0, exact=False, ns=1, order=0)
Dipole(name="RM5", length=0.21821, angle=0.19634954085000025, e1=0.0, e1_on=False, e2=0.0, e2_on=False, kn=-2.379107171999999, ks=0.0, ms=0.0, mo=0.0, dp=0.0, exact=False, ns=1, order=0)
Dipole(name="RM5", length=0.21821, angle=0.19634954085000025, e1=0.0, e1_on=False, e2=0.0, e2_on=False, kn=-2.379107171999999, ks=0.0, ms=0.0, mo=0.0, dp=0.0, exact=False, ns=1, order=0)
Dipole(name="RM5", length=0.21821, angle=0.19634954085000025, e1=0.0, e1_on=False, e2=0.0, e2_on=True, kn=-2.379107171999999, ks=0.0, ms=0.0, mo=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR006", length=0.10958, dp=0.0, exact=False, ns=1, order=0)
Sextupole(name="SY1_3F4", length=0.08, ms=-277.23165, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR007", length=0.044, dp=0.0, exact=False, ns=1, order=0)
BPM(name="BPM08", direction="forward", dp=0.0)

BPM(name="BPM07", direction="inverse", dp=0.0)
Drift(name="DR005", length=0.11958, dp=0.0, exact=False, ns=1, order=0)
Dipole(name="RM5", length=0.21821, angle=0.19634954085000025, e1=0.0, e1_on=True, e2=0.0, e2_on=False, kn=-2.379107171999999, ks=0.0, ms=0.0, mo=0.0, dp=0.0, exact=False, ns=1, order=0)
Corrector(name="CXY", cx=0.0, cy=0.0, dp=0.0)
Dipole(name="RM5", length=0.21821, angle=0.19634954085000025, e1=0.0, e1_on=False, e2=0.0, e2_on=False, kn=-2.379107171999999, ks=0.0, ms=0.0, mo=0.0, dp=0.0, exact=False, ns=1, order=0)
Corrector(name="CXY", cx=0.0, cy=0.0, dp=0.0)
Dipole(name="RM5", length=0.21821, angle=0.19634954085000025, e1=0.0, e1_on=False, e2=0.0, e2_on=False, kn=-2.379107171999999, ks=0.0, ms=0.0, mo=0.0, dp=0.0, exact=False, ns=1, order=0)
Corrector(name="CXY", cx=0.0, cy=0.0, dp=0.0)
Dipole(name="RM5", length=0.21821, angle=0.19634954085000025, e1=0.0, e1_on=False, e2=0.0, e2_on=True, kn=-2.379107171999999, ks=0.0, ms=0.0, mo=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR006", length=0.10958, dp=0.0, exact=False, ns=1, order=0)
Sextupole(name="SY1_3F4", length=0.08, ms=-277.23165, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR007", length=0.044, dp=0.0, exact=False, ns=1, order=0)
BPM(name="BPM08", direction="forward", dp=0.0)

BPM(name="BPM07", direction="inverse", dp=0.0)
Drift(name="DR005", length=0.11958, dp=0.0, exact=False, ns=1, order=0)
Dipole(name="RM5", length=0.21821, angle=0.19634954085000025, e1=0.0, e1_on=True, e2=0.0, e2_on=False, kn=-2.379107171999999, ks=0.0, ms=0.0, mo=0.0, dp=0.0, exact=False, ns=1, order=0)
Dipole(name="RM5", length=0.21821, angle=0.19634954085000025, e1=0.0, e1_on=False, e2=0.0, e2_on=False, kn=-2.379107171999999, ks=0.0, ms=0.0, mo=0.0, dp=0.0, exact=False, ns=1, order=0)
Dipole(name="RM5", length=0.21821, angle=0.19634954085000025, e1=0.0, e1_on=False, e2=0.0, e2_on=False, kn=-2.379107171999999, ks=0.0, ms=0.0, mo=0.0, dp=0.0, exact=False, ns=1, order=0)
Dipole(name="RM5", length=0.21821, angle=0.19634954085000025, e1=0.0, e1_on=False, e2=0.0, e2_on=True, kn=-2.379107171999999, ks=0.0, ms=0.0, mo=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR006", length=0.10958, dp=0.0, exact=False, ns=1, order=0)
Sextupole(name="SY1_3F4", length=0.08, ms=-277.23165, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR007", length=0.044, dp=0.0, exact=False, ns=1, order=0)
BPM(name="BPM08", direction="forward", dp=0.0)

BPM(name="BPM07", direction="inverse", dp=0.0)
Drift(name="DR005", length=0.11958, dp=0.0, exact=False, ns=1, order=0)
Dipole(name="RM5", length=0.87284, angle=0.785398163400001, e1=0.0, e1_on=True, e2=0.0, e2_on=True, kn=-2.379107171999999, ks=0.0, ms=0.0, mo=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR006", length=0.10958, dp=0.0, exact=False, ns=1, order=0)
Sextupole(name="SY1_3F4", length=0.08, ms=-277.23165, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR007", length=0.044, dp=0.0, exact=False, ns=1, order=0)
BPM(name="BPM08", direction="forward", dp=0.0)

[48]:
# clean (remove elements by kind, name, length)
# Note, it element has zero length, it will not be removed

_, line, *_ = ring.clone()
print(line)
print()

# Remove BPMs

line.clean((None, ['BPM'], None, None))
print(line)
print()

# Remove by name

line.clean((None, None, ['RM5'], None))
print(line)
print()

# Remove by length

line.clean((0.11, None, None, None))
print(line)
print()
BPM(name="BPM07", direction="inverse", dp=0.0)
Drift(name="DR005", length=0.11958, dp=0.0, exact=False, ns=1, order=0)
Dipole(name="RM5", length=0.87284, angle=0.785398163400001, e1=0.0, e1_on=True, e2=0.0, e2_on=True, kn=-2.379107171999999, ks=0.0, ms=0.0, mo=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR006", length=0.10958, dp=0.0, exact=False, ns=1, order=0)
Sextupole(name="SY1_3F4", length=0.08, ms=-277.23165, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR007", length=0.044, dp=0.0, exact=False, ns=1, order=0)
BPM(name="BPM08", direction="forward", dp=0.0)

Drift(name="DR005", length=0.11958, dp=0.0, exact=False, ns=1, order=0)
Dipole(name="RM5", length=0.87284, angle=0.785398163400001, e1=0.0, e1_on=True, e2=0.0, e2_on=True, kn=-2.379107171999999, ks=0.0, ms=0.0, mo=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR006", length=0.10958, dp=0.0, exact=False, ns=1, order=0)
Sextupole(name="SY1_3F4", length=0.08, ms=-277.23165, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR007", length=0.044, dp=0.0, exact=False, ns=1, order=0)

Drift(name="DR005", length=0.11958, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR006", length=0.10958, dp=0.0, exact=False, ns=1, order=0)
Sextupole(name="SY1_3F4", length=0.08, ms=-277.23165, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR007", length=0.044, dp=0.0, exact=False, ns=1, order=0)

Drift(name="DR005", length=0.11958, dp=0.0, exact=False, ns=1, order=0)

[49]:
# merge (merge drifts)
# Note, all drift elements are renamed

_, line, *_ = ring.clone()
line.remove("RM5")
print(line)
print()

line.merge()
print(line)
print()
BPM(name="BPM07", direction="inverse", dp=0.0)
Drift(name="DR005", length=0.11958, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR006", length=0.10958, dp=0.0, exact=False, ns=1, order=0)
Sextupole(name="SY1_3F4", length=0.08, ms=-277.23165, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR007", length=0.044, dp=0.0, exact=False, ns=1, order=0)
BPM(name="BPM08", direction="forward", dp=0.0)

BPM(name="BPM07", direction="inverse", dp=0.0)
Drift(name="DR001", length=0.22916, dp=0.0, exact=False, ns=1, order=0)
Sextupole(name="SY1_3F4", length=0.08, ms=-277.23165, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR002", length=0.044, dp=0.0, exact=False, ns=1, order=0)
BPM(name="BPM08", direction="forward", dp=0.0)

[50]:
# mangle (rename elements with identical names)

line, *_ = ring.clone()
print(line)
print()

# Rename quadrupoles

line, *_ = ring.clone()
line.mangle('Quadrupole')
print(line)
print()

# Rename quadrupoles with exclude

line, *_ = ring.clone()
line.mangle('Quadrupole', names=['Q3D3'])
print(line)
print()
BPM(name="BPM05", direction="inverse", dp=0.0)
Drift(name="DR001", length=0.116715, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q3D3", length=0.098285, kn=-8.426928737999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Corrector(name="CXY001", cx=0.0, cy=0.0, dp=0.0)
Quadrupole(name="Q3D3", length=0.098285, kn=-8.426928737999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR002", length=0.9684299999999999, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q3D2", length=0.098285, kn=-2.695188250999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Corrector(name="CXY002", cx=0.0, cy=0.0, dp=0.0)
Quadrupole(name="Q3D2", length=0.098285, kn=-2.695188250999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR003", length=0.221715, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q3F2", length=0.09, kn=13.544085930000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Corrector(name="CXY003", cx=0.0, cy=0.0, dp=0.0)
Quadrupole(name="Q3F2", length=0.09, kn=13.544085930000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR004", length=0.065, dp=0.0, exact=False, ns=1, order=0)
BPM(name="BPM07", direction="forward", dp=0.0)

BPM(name="BPM05", direction="inverse", dp=0.0)
Drift(name="DR001", length=0.116715, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q3D3001", length=0.098285, kn=-8.426928737999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Corrector(name="CXY001", cx=0.0, cy=0.0, dp=0.0)
Quadrupole(name="Q3D3002", length=0.098285, kn=-8.426928737999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR002", length=0.9684299999999999, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q3D2001", length=0.098285, kn=-2.695188250999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Corrector(name="CXY002", cx=0.0, cy=0.0, dp=0.0)
Quadrupole(name="Q3D2002", length=0.098285, kn=-2.695188250999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR003", length=0.221715, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q3F2001", length=0.09, kn=13.544085930000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Corrector(name="CXY003", cx=0.0, cy=0.0, dp=0.0)
Quadrupole(name="Q3F2002", length=0.09, kn=13.544085930000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR004", length=0.065, dp=0.0, exact=False, ns=1, order=0)
BPM(name="BPM07", direction="forward", dp=0.0)

BPM(name="BPM05", direction="inverse", dp=0.0)
Drift(name="DR001", length=0.116715, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q3D3", length=0.098285, kn=-8.426928737999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Corrector(name="CXY001", cx=0.0, cy=0.0, dp=0.0)
Quadrupole(name="Q3D3", length=0.098285, kn=-8.426928737999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR002", length=0.9684299999999999, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q3D2001", length=0.098285, kn=-2.695188250999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Corrector(name="CXY002", cx=0.0, cy=0.0, dp=0.0)
Quadrupole(name="Q3D2002", length=0.098285, kn=-2.695188250999999, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR003", length=0.221715, dp=0.0, exact=False, ns=1, order=0)
Quadrupole(name="Q3F2001", length=0.09, kn=13.544085930000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Corrector(name="CXY003", cx=0.0, cy=0.0, dp=0.0)
Quadrupole(name="Q3F2002", length=0.09, kn=13.544085930000001, ks=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR004", length=0.065, dp=0.0, exact=False, ns=1, order=0)
BPM(name="BPM07", direction="forward", dp=0.0)

[51]:
# splice (sequencies between BPMs)

line = ring.clone()

line.flatten()
print(len(line))

line.splice()
print(len(line))
208
16
[52]:
# dp (get/set)

_, line, *_ = ring.clone()
line.propagate = True
line.dp = 0.001
print(line.dp)
print()

print(line)
tensor(0.0010, dtype=torch.float64)

BPM(name="BPM07", direction="inverse", dp=0.001)
Drift(name="DR005", length=0.11958, dp=0.001, exact=False, ns=1, order=0)
Dipole(name="RM5", length=0.87284, angle=0.785398163400001, e1=0.0, e1_on=True, e2=0.0, e2_on=True, kn=-2.379107171999999, ks=0.0, ms=0.0, mo=0.0, dp=0.001, exact=False, ns=1, order=0)
Drift(name="DR006", length=0.10958, dp=0.001, exact=False, ns=1, order=0)
Sextupole(name="SY1_3F4", length=0.08, ms=-277.23165, dp=0.001, exact=False, ns=1, order=0)
Drift(name="DR007", length=0.044, dp=0.001, exact=False, ns=1, order=0)
BPM(name="BPM08", direction="forward", dp=0.001)
[53]:
# exact (get/set)

_, line, *_ = ring.clone()
line.propagate = True
line.exact = True
print(line)
BPM(name="BPM07", direction="inverse", dp=0.0)
Drift(name="DR005", length=0.11958, dp=0.0, exact=True, ns=1, order=0)
Dipole(name="RM5", length=0.87284, angle=0.785398163400001, e1=0.0, e1_on=True, e2=0.0, e2_on=True, kn=-2.379107171999999, ks=0.0, ms=0.0, mo=0.0, dp=0.0, exact=True, ns=1, order=0)
Drift(name="DR006", length=0.10958, dp=0.0, exact=True, ns=1, order=0)
Sextupole(name="SY1_3F4", length=0.08, ms=-277.23165, dp=0.0, exact=True, ns=1, order=0)
Drift(name="DR007", length=0.044, dp=0.0, exact=True, ns=1, order=0)
BPM(name="BPM08", direction="forward", dp=0.0)
[54]:
# output (get/set)

_, line, *_ = ring.clone()
line.propagate = True
line.output = True
line['RM5'].output
[54]:
True
[55]:
# matrix (get/set)

_, line, *_ = ring.clone()
line.propagate = True
line.matrix = True
line['RM5'].matrix
[55]:
True
[56]:
# length

line = ring.clone()
print(line.length)
tensor(27.4256, dtype=torch.float64)
[57]:
# angle

line = ring.clone()
print(line.angle)
tensor(6.2832, dtype=torch.float64)
[58]:
# flag (layout flag, true if contains dipoles with non-zero angles)

line = ring.clone()
print(line.flag)
True
[59]:
# ns (get/set number of integration steps)

_, line, *_ = ring.clone()
line.propagate = True
pprint(line.ns)
print()

# Set fixed number to all elements

_, line, *_ = ring.clone()
line.propagate = True
line.ns = 10
pprint(line.ns)
print()

# Set by step length (keeps 1 step for zero length elements)

_, line, *_ = ring.clone()
line.propagate = True
line.ns = 0.01
pprint(line.ns)
print()

# Set by kind (pass int or float)

_, line, *_ = ring.clone()
line.propagate = True
line.ns = (('Dipole', 0.01), ('Sextupole', 0.01))
pprint(line.ns)
print()

# Set by name (pass int or float)

_, line, *_ = ring.clone()
line.propagate = True
line.ns = (('RM5', 10),)
pprint(line.ns)
print()
{'BPM07': 1,
 'BPM08': 1,
 'DR005': 1,
 'DR006': 1,
 'DR007': 1,
 'RM5': 1,
 'SY1_3F4': 1}

{'BPM07': 10,
 'BPM08': 10,
 'DR005': 10,
 'DR006': 10,
 'DR007': 10,
 'RM5': 10,
 'SY1_3F4': 10}

{'BPM07': 1,
 'BPM08': 1,
 'DR005': 12,
 'DR006': 11,
 'DR007': 5,
 'RM5': 88,
 'SY1_3F4': 8}

{'BPM07': 1,
 'BPM08': 1,
 'DR005': 1,
 'DR006': 1,
 'DR007': 1,
 'RM5': 88,
 'SY1_3F4': 8}

{'BPM07': 1,
 'BPM08': 1,
 'DR005': 1,
 'DR006': 1,
 'DR007': 1,
 'RM5': 10,
 'SY1_3F4': 1}

[60]:
# order (get/set integration order)

_, line, *_ = ring.clone()
line.propagate = True
pprint(line.order)
print()

# Set fixed number to all elements

_, line, *_ = ring.clone()
line.propagate = True
line.order = 1
pprint(line.order)
print()

# Set by kind

_, line, *_ = ring.clone()
line.propagate = True
line.order = (('Dipole', 1), ('Sextupole', 1))
pprint(line.order)
print()

# Set by name

_, line, *_ = ring.clone()
line.propagate = True
line.order = (('RM5', 1),)
pprint(line.order)
print()
{'BPM07': 0,
 'BPM08': 0,
 'DR005': 0,
 'DR006': 0,
 'DR007': 0,
 'RM5': 0,
 'SY1_3F4': 0}

{'BPM07': 1,
 'BPM08': 1,
 'DR005': 1,
 'DR006': 1,
 'DR007': 1,
 'RM5': 1,
 'SY1_3F4': 1}

{'BPM07': 0,
 'BPM08': 0,
 'DR005': 0,
 'DR006': 0,
 'DR007': 0,
 'RM5': 1,
 'SY1_3F4': 1}

{'BPM07': 0,
 'BPM08': 0,
 'DR005': 0,
 'DR006': 0,
 'DR007': 0,
 'RM5': 1,
 'SY1_3F4': 0}

[61]:
# __call__ (propagate initial condition, pass deviation variables)

line:Line = ring.clone()
line.propagate = True

# Propagate initial condition

state = torch.tensor([0.001, 0.0005, -0.005, 0.0001], dtype=torch.float64)
print(line(state))

# Equivalent to element by element propagation of a flat line

line.flatten()
state = torch.tensor([0.001, 0.0005, -0.005, 0.0001], dtype=torch.float64)
for element in line.sequence:
    state = element(state)
print(state)

# Passing deviation parameters

line:Line = ring.clone()
line.propagate = True
line.flatten()

data = line.data()
data['Q3D3']['kn'] = torch.tensor(0.1, dtype=torch.float64)
state = torch.tensor([0.001, 0.0005, -0.005, 0.0001], dtype=torch.float64)
print(line(state, data=data))

# Equivalent to changing kn value in all Q3D3 occurrancies

for position in line.positions('Q3D3'):
    line[position].kn = line[position].kn.item() + 0.1

state = torch.tensor([0.001, 0.0005, -0.005, 0.0001], dtype=torch.float64)
print(line(state))

# Passing alignment errors as deviation parameters

line:Line = ring.clone()
line.propagate = True
line.flatten()

data = line.data()
data['Q3D3']['dx'] = torch.tensor(0.001, dtype=torch.float64)
state = torch.tensor([0.001, 0.0005, -0.005, 0.0001], dtype=torch.float64)
print(line(state, data=data, alignment=True))

# Equivalent to changing dx value in all Q3D3 occurrancies

for position in line.positions('Q3D3'):
    line[position].dx = 0.001

state = torch.tensor([0.001, 0.0005, -0.005, 0.0001], dtype=torch.float64)
print(line(state, alignment=True))
tensor([ 0.0015, -0.0031, -0.0210, -0.0315], dtype=torch.float64)
tensor([ 0.0015, -0.0031, -0.0210, -0.0315], dtype=torch.float64)
tensor([ 0.0013, -0.0028, -0.0208, -0.0310], dtype=torch.float64)
tensor([ 0.0013, -0.0028, -0.0208, -0.0310], dtype=torch.float64)
tensor([ 0.0043, -0.0084, -0.0204, -0.0302], dtype=torch.float64)
tensor([ 0.0043, -0.0084, -0.0204, -0.0302], dtype=torch.float64)
[62]:
# __len__ (number of first level elements in the sequence)

line:Line = ring.clone()
line.propagate = True
line.flatten()

print(len(line))
print(len(line.sequence))
208
208
[63]:
# layout  (name, kind, length, angle) for all leaf elements (ordered)

_, line, *_ = ring.clone()

pprint(line.layout())
[('BPM07',
  'BPM',
  tensor(0., dtype=torch.float64),
  tensor(0., dtype=torch.float64)),
 ('DR005',
  'Drift',
  tensor(0.1196, dtype=torch.float64),
  tensor(0., dtype=torch.float64)),
 ('RM5',
  'Dipole',
  tensor(0.8728, dtype=torch.float64),
  tensor(0.7854, dtype=torch.float64)),
 ('DR006',
  'Drift',
  tensor(0.1096, dtype=torch.float64),
  tensor(0., dtype=torch.float64)),
 ('SY1_3F4',
  'Sextupole',
  tensor(0.0800, dtype=torch.float64),
  tensor(0., dtype=torch.float64)),
 ('DR007',
  'Drift',
  tensor(0.0440, dtype=torch.float64),
  tensor(0., dtype=torch.float64)),
 ('BPM08',
  'BPM',
  tensor(0., dtype=torch.float64),
  tensor(0., dtype=torch.float64))]
[64]:
# __repr__ (string representation, can be used for instance creation, not recommended)

_, line, *_ = ring.clone()

print(line)
print()

element, *_ = line

print(element)
print()

from model.library.bpm import BPM
print(eval(str(element)))
BPM(name="BPM07", direction="inverse", dp=0.0)
Drift(name="DR005", length=0.11958, dp=0.0, exact=False, ns=1, order=0)
Dipole(name="RM5", length=0.87284, angle=0.785398163400001, e1=0.0, e1_on=True, e2=0.0, e2_on=True, kn=-2.379107171999999, ks=0.0, ms=0.0, mo=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR006", length=0.10958, dp=0.0, exact=False, ns=1, order=0)
Sextupole(name="SY1_3F4", length=0.08, ms=-277.23165, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR007", length=0.044, dp=0.0, exact=False, ns=1, order=0)
BPM(name="BPM08", direction="forward", dp=0.0)

BPM(name="BPM07", direction="inverse", dp=0.0)

BPM(name="BPM07", direction="inverse", dp=0.0)
[65]:
# __getitem__ and __setitem__ (similar for __delitem__)

# Supports indexing by name (first match) or index in the sequence
# Supports indexing of nested lines
# Unpacking also works

line = ring.clone()

print(line[1])
print()

print(line[1, 0])
print()

print(line['BPM07_BPM08', 'BPM07'])
print()

line['BPM07_BPM08', 'BPM07'] = Corrector('CXY')
print(line[1])
print()
BPM(name="BPM07", direction="inverse", dp=0.0)
Drift(name="DR005", length=0.11958, dp=0.0, exact=False, ns=1, order=0)
Dipole(name="RM5", length=0.87284, angle=0.785398163400001, e1=0.0, e1_on=True, e2=0.0, e2_on=True, kn=-2.379107171999999, ks=0.0, ms=0.0, mo=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR006", length=0.10958, dp=0.0, exact=False, ns=1, order=0)
Sextupole(name="SY1_3F4", length=0.08, ms=-277.23165, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR007", length=0.044, dp=0.0, exact=False, ns=1, order=0)
BPM(name="BPM08", direction="forward", dp=0.0)

BPM(name="BPM07", direction="inverse", dp=0.0)

BPM(name="BPM07", direction="inverse", dp=0.0)

Corrector(name="CXY", cx=0.0, cy=0.0, dp=0.0)
Drift(name="DR005", length=0.11958, dp=0.0, exact=False, ns=1, order=0)
Dipole(name="RM5", length=0.87284, angle=0.785398163400001, e1=0.0, e1_on=True, e2=0.0, e2_on=True, kn=-2.379107171999999, ks=0.0, ms=0.0, mo=0.0, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR006", length=0.10958, dp=0.0, exact=False, ns=1, order=0)
Sextupole(name="SY1_3F4", length=0.08, ms=-277.23165, dp=0.0, exact=False, ns=1, order=0)
Drift(name="DR007", length=0.044, dp=0.0, exact=False, ns=1, order=0)
BPM(name="BPM08", direction="forward", dp=0.0)