Interface to PyHEADTAIL

PyHEADTAIL elements cannot be natively used by an Xsuite line due to different naming conventions for the particles coordinates. A specific interface has been introduced in Xsuite which indtroduces additional properties in the Particles objects in order to make them compatible with PyHEADTAIL beam elements. The interface can be enabled by calling the function enable_pyheadtail_interface right after importing xtrack, as illustrated in the following example.

import pathlib
import json
import numpy as np

import xobjects as xo
import xtrack as xt
xt.enable_pyheadtail_interface()

fname_line = '../../test_data/lhc_no_bb/line_and_particle.json'
num_turns = int(100)
n_part = 200

####################
# Choose a context #
####################

context = xo.ContextCpu()

##############
# Get a line #
##############

with open(fname_line, 'r') as fid:
    input_data = json.load(fid)
line = xt.Line.from_dict(input_data['line'])

#########################
# Add PyHEADTAIL damper #
#########################

from PyHEADTAIL.feedback.transverse_damper import TransverseDamper
damper = TransverseDamper(dampingrate_x=10., dampingrate_y=15.)
line.append_element(damper, 'Damper')

##################
# Build TrackJob #
##################

line.build_tracker(_context=context)

######################
# Get some particles #
######################

particles = xt.Particles(_context=context,
                        p0c=6500e9,
                        x=np.random.uniform(-1e-3, 1e-3, n_part)+1e-3,
                        px=np.random.uniform(-1e-7, 1e-7, n_part),
                        y=np.random.uniform(-0.5e-3, 0.5e-3, n_part)-1.2e-3,
                        py=np.random.uniform(-1e-7, 1e-7, n_part),
                        zeta=0*np.random.uniform(-1e-2, 1e-2, n_part),
                        delta=0.*np.random.uniform(-1e-5, 1e-5, n_part))

#########
# Track #
#########

line.track(particles, num_turns=num_turns, turn_by_turn_monitor=True)

########
# Plot #
########

res = line.record_last_track

import matplotlib.pyplot as plt
plt.close('all')
fig1 = plt.figure(1)
sp1 = fig1.add_subplot(2,1,1)
sp2 = fig1.add_subplot(2,1,2)
sp1.plot(np.mean(res.x, axis=0))
sp2.plot(np.mean(res.y, axis=0))
plt.show()