Formats acceptés par Xsuite¶
Ce notebook donne une vue des différentes façons de créer, importer et exporter des mailles avec Xsuite.
import xtrack as xt
from cpymad.madx import Madx
%config InlineBackend.figure_format = "retina"
Charger une maille MAD-X via cpymad¶
Le paquet cpymad permet de communiquer avec le process MAD-X et de programmer les simulations via Python. Cette approche permet de gérer tout script MAD-X, y compris l'inclusion et l'exécution de macros. Cette approche sera discontinuée à la fin du support de MAD-X (~2029).
%%capture
madx = Madx()
madx.call("inputs/pimms.madx")
madx.beam()
madx.use("pimms")
# La séquence cpymad elle-même peut être importée dans Xsuite
ring = xt.Line.from_madx_sequence(madx.sequence.pimms, deferred_expressions=True)
ring.particle_ref = xt.Particles(kinetic_energy0=200e6)
twiss = ring.twiss4d() # Twiss
twiss.rows["qfa.*"].cols["s betx bety dx"] # optique à une famille de quadripôles focalisants
TwissTable: 8 rows, 5 cols name s betx bety dx qfa.1 2.2125 9.25163 4.65954 0.0281476 qfa.2 8.1525 14.1858 8.31899 2.53209 qfa.3 28.9425 14.8941 7.57313 2.78333 qfa.4 34.8825 9.0982 5.56128 -0.0233975 qfa.5 39.8325 9.25163 4.65954 0.0281476 qfa.6 45.7725 14.1858 8.31899 2.53209 qfa.7 66.5625 14.8941 7.57313 2.78333 qfa.8 72.5025 9.0982 5.56128 -0.0233975
Charger séquence et optique directement depuis des scripts MAD-X¶
Xsuite inclus un analyseur syntaxique qui peut directement ingérer des scripts MAD-X définissant des séquences, références etc. Cette approche ne gère pas l'exécution de macros. L'approche sera discontinuée à la fin du support MAD-X (~2029).
env = xt.load("inputs/pimms.madx")
ring = env["pimms"]
ring.particle_ref = xt.Particles(kinetic_energy0=200e6)
twiss = ring.twiss4d()
twiss.rows["qfa.*"].cols["s betx bety dx"] # optique à une famille de quadripôles focalisants
TwissTable: 8 rows, 5 cols name s betx bety dx qfa.1 2.2125 9.25163 4.65954 0.0281476 qfa.2 8.1525 14.1858 8.31899 2.53209 qfa.3 28.9425 14.8941 7.57313 2.78333 qfa.4 34.8825 9.0982 5.56128 -0.0233975 qfa.5 39.8325 9.25163 4.65954 0.0281476 qfa.6 45.7725 14.1858 8.31899 2.53209 qfa.7 66.5625 14.8941 7.57313 2.78333 qfa.8 72.5025 9.0982 5.56128 -0.0233975
Charger une maille en JSON¶
env = xt.Environment.from_json("inputs/pimms.json")
twiss = env.pimms.twiss4d() # Twiss
twiss.rows["qfa.*"].cols["s betx bety dx"] # Get optics at selected locations
TwissTable: 8 rows, 5 cols name s betx bety dx qfa.1 2.2125 9.24561 4.65313 0.0214196 qfa.2 8.1525 14.1882 8.31625 2.52253 qfa.3 28.9425 14.8867 7.58039 2.78903 qfa.4 34.8825 9.08918 5.5684 -0.0260408 qfa.5 39.8325 9.24546 4.65312 0.0214198 qfa.6 45.7725 14.1883 8.31618 2.52253 qfa.7 66.5625 14.8869 7.58035 2.78903 qfa.8 72.5025 9.08933 5.56837 -0.026041
Charger un environement défini de manière programmatique (Python)¶
Il est possible de définir la maille ainsi que les références et alimentations directement en script Python (ce qui peut inclure logique, commentaires, etc.) et de les charger directement dans Xsuite.
Cette solution fonctionne avec les mailles très larges, comme par exemple la maille du LHC.
%%capture
env = xt.Environment()
env.call("inputs/pimms.py")
twiss = env.ring.twiss4d() # Twiss
twiss.rows["qfa.*"].cols["s betx bety dx"] # Get optics at selected locations
TwissTable: 8 rows, 5 cols name s betx bety dx qfa.0 2.2125 9.53142 4.10532 1.80856e-05 qfa.1 8.1525 12.3793 4.86072 2.47195 qfa.2 28.1175 12.995 4.44476 2.73962 qfa.3 34.0575 9.24421 4.54585 1.77094e-05 qfa.4 36.8325 9.53142 4.10532 1.80813e-05 qfa.5 42.7725 12.3793 4.86072 2.47195 qfa.6 62.7375 12.995 4.44476 2.73962 qfa.7 68.6775 9.24421 4.54585 1.77056e-05
Charger des configurations hébergées¶
Il est possible de charger des configurations hébergées en ligne, pourvu qu'elles respectent les formats ci-dessus. Ici par exemple, nous pouvons très facilement charger la configuration complète du LHC en fin de beta-star levelling, pendant les collisions.
lhc = xt.load("https://acc-models.web.cern.ch/acc-models/lhc/2025/xsuite/lhc.json")
lhc.vars.load("https://acc-models.web.cern.ch/acc-models/lhc/2025/scenarios/cycle/pp/levelling/889/optics.madx")
lhc.b1.particle_ref = xt.Particles(mass0=938272046.0, q0=1, energy0=6800000000000.0)
lhc.b2.particle_ref = xt.Particles(mass0=938272046.0, q0=1, energy0=6800000000000.0)
lhc.b1.twiss().plot()
<xtrack.twissplot.TwissPlot object at 0x7ff7807d42f0>
lhc.b1.survey().plot()
Ignoring fixed x limits to fulfill fixed data aspect with adjustable data limits.