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.

In [1]:
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).

In [2]:
%%capture
madx = Madx()
madx.call("inputs/pimms.madx")
madx.beam()
madx.use("pimms")
In [3]:
# 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)
In [4]:
twiss = ring.twiss4d()  # Twiss
twiss.rows["qfa.*"].cols["s betx bety dx"]  # optique à une famille de quadripôles focalisants
Out[4]:
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).

In [5]:
env = xt.load("inputs/pimms.madx")
ring = env["pimms"]
ring.particle_ref = xt.Particles(kinetic_energy0=200e6)
In [6]:
twiss = ring.twiss4d()
twiss.rows["qfa.*"].cols["s betx bety dx"]  # optique à une famille de quadripôles focalisants
Out[6]:
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¶

In [7]:
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
Out[7]:
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.

In [8]:
%%capture
env = xt.Environment()
env.call("inputs/pimms.py")
In [9]:
twiss = env.ring.twiss4d()  # Twiss
twiss.rows["qfa.*"].cols["s betx bety dx"]  # Get optics at selected locations
Out[9]:
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.

In [10]:
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)
In [11]:
lhc.b1.twiss().plot()
Out[11]:
<xtrack.twissplot.TwissPlot object at 0x7ff7807d42f0>
No description has been provided for this image
In [12]:
lhc.b1.survey().plot()
Ignoring fixed x limits to fulfill fixed data aspect with adjustable data limits.
No description has been provided for this image