Beispiel #1
0
    def fromSixDump101(cls, input_folder, st_dump_file, **kwargs):

        import sixtracktools
        import pysixtrack

        six = sixtracktools.SixInput(input_folder)
        line, rest, iconv = six.expand_struct(convert=pysixtrack.element_types)

        sixdump = sixtracktools.SixDump101(st_dump_file)

        num_iconv = int(len(iconv))
        num_belem = int(len(line))
        num_dumps = int(len(sixdump.particles))

        assert num_iconv > 0
        assert num_belem > iconv[num_iconv - 1]
        assert num_dumps >= num_iconv
        assert (num_dumps % num_iconv) == 0

        num_particles = int(num_dumps / num_iconv)

        self = cls(**kwargs)

        for ii in range(num_iconv):
            elem_id = iconv[ii]
            assert elem_id < num_belem

            p = self.Particles(num_particles=num_particles)

            assert p.num_particles == num_particles
            assert len(p.q0) == num_particles

            for jj in range(num_particles):
                kk = num_particles * ii + jj
                assert kk < num_dumps
                p.from_pysixtrack(
                    pysixtrack.Particles(**sixdump[kk].get_minimal_beam()), jj)
                p.state[jj] = 1
                p.at_element[jj] = elem_id

        return self
Beispiel #2
0
def track_particle_sixtrack(
    partCO, Dx_wrt_CO_m, Dpx_wrt_CO_rad,
    Dy_wrt_CO_m, Dpy_wrt_CO_rad,
    Dsigma_wrt_CO_m, Ddelta_wrt_CO, n_turns
):

    Dx_wrt_CO_m, Dpx_wrt_CO_rad,\
        Dy_wrt_CO_m, Dpy_wrt_CO_rad,\
        Dsigma_wrt_CO_m, Ddelta_wrt_CO = vectorize_all_coords(
            Dx_wrt_CO_m, Dpx_wrt_CO_rad,
            Dy_wrt_CO_m, Dpy_wrt_CO_rad,
            Dsigma_wrt_CO_m, Ddelta_wrt_CO)

    n_part = len(Dx_wrt_CO_m)

    wfold = 'temp_trackfun'

    if not os.path.exists(wfold):
        os.mkdir(wfold)

    os.system('cp fort.* %s' % wfold)

    with open('fort.3', 'r') as fid:
        lines_f3 = fid.readlines()

    # Set initial coordinates
    i_start_ini = None
    for ii, ll in enumerate(lines_f3):
        if ll.startswith('INITIAL COO'):
            i_start_ini = ii
            break

    lines_f3[i_start_ini + 2] = '    0.\n'
    lines_f3[i_start_ini + 3] = '    0.\n'
    lines_f3[i_start_ini + 4] = '    0.\n'
    lines_f3[i_start_ini + 5] = '    0.\n'
    lines_f3[i_start_ini + 6] = '    0.\n'
    lines_f3[i_start_ini + 7] = '    0.\n'

    lines_f3[i_start_ini + 2 + 6] = '    0.\n'
    lines_f3[i_start_ini + 3 + 6] = '    0.\n'
    lines_f3[i_start_ini + 4 + 6] = '    0.\n'
    lines_f3[i_start_ini + 5 + 6] = '    0.\n'
    lines_f3[i_start_ini + 6 + 6] = '    0.\n'
    lines_f3[i_start_ini + 7 + 6] = '    0.\n'

    lines_f13 = []

    for i_part in range(n_part):
        temp_part = pysixtrack.Particles(**partCO)
        temp_part.x += Dx_wrt_CO_m[i_part]
        temp_part.px += Dpx_wrt_CO_rad[i_part]
        temp_part.y += Dy_wrt_CO_m[i_part]
        temp_part.py += Dpy_wrt_CO_rad[i_part]
        temp_part.sigma += Dsigma_wrt_CO_m[i_part]
        temp_part.delta += Ddelta_wrt_CO[i_part]

        lines_f13.append('%.10e\n' % ((temp_part.x) * 1e3))
        lines_f13.append('%.10e\n' % ((temp_part.px) * temp_part.rpp * 1e3))
        lines_f13.append('%.10e\n' % ((temp_part.y) * 1e3))
        lines_f13.append('%.10e\n' % ((temp_part.py) * temp_part.rpp * 1e3))
        lines_f13.append('%.10e\n' % ((temp_part.sigma) * 1e3))
        lines_f13.append('%.10e\n' % ((temp_part.delta)))
        if i_part % 2 == 1:
            lines_f13.append('%.10e\n' % (temp_part.energy0 * 1e-6))
            lines_f13.append('%.10e\n' % (prev_part.energy * 1e-6))
            lines_f13.append('%.10e\n' % (temp_part.energy * 1e-6))
        prev_part = temp_part

    with open(wfold + '/fort.13', 'w') as fid:
        fid.writelines(lines_f13)

    if np.mod(n_part, 2) != 0:
        raise ValueError('SixTrack does not like this!')

    i_start_tk = None
    for ii, ll in enumerate(lines_f3):
        if ll.startswith('TRACKING PAR'):
            i_start_tk = ii
            break
    # Set number of turns and number of particles
    temp_list = lines_f3[i_start_tk + 1].split(' ')
    temp_list[0] = '%d' % n_turns
    temp_list[2] = '%d' % (n_part / 2)
    lines_f3[i_start_tk + 1] = ' '.join(temp_list)
    # Set number of idfor = 2
    temp_list = lines_f3[i_start_tk + 2].split(' ')
    temp_list[2] = '2'
    lines_f3[i_start_tk + 2] = ' '.join(temp_list)

    # Setup turn-by-turn dump
    i_start_dp = None
    for ii, ll in enumerate(lines_f3):
        if ll.startswith('DUMP'):
            i_start_dp = ii
            break

    lines_f3[i_start_dp + 1] = 'StartDUMP 1 664 101 dumtemp.dat\n'

    with open(wfold + '/fort.3', 'w') as fid:
        fid.writelines(lines_f3)

    os.system('./runsix_trackfun')

    # Load sixtrack tracking data
    sixdump_all = sixtracktools.SixDump101('%s/dumtemp.dat' % wfold)

    x_tbt = np.zeros((n_turns, n_part))
    px_tbt = np.zeros((n_turns, n_part))
    y_tbt = np.zeros((n_turns, n_part))
    py_tbt = np.zeros((n_turns, n_part))
    sigma_tbt = np.zeros((n_turns, n_part))
    delta_tbt = np.zeros((n_turns, n_part))

    for i_part in range(n_part):
        sixdump_part = sixdump_all[i_part::n_part]
        x_tbt[:, i_part] = sixdump_part.x
        px_tbt[:, i_part] = sixdump_part.px
        y_tbt[:, i_part] = sixdump_part.y
        py_tbt[:, i_part] = sixdump_part.py
        sigma_tbt[:, i_part] = sixdump_part.sigma
        delta_tbt[:, i_part] = sixdump_part.delta

    return x_tbt, px_tbt, y_tbt, py_tbt, sigma_tbt, delta_tbt
Beispiel #3
0
p0c_eV = sixinput.initialconditions[-3] * 1e6

# Build pysixtrack line from sixtrack input
line = pysixtrack.Line.from_sixinput(sixinput)
other_data = line.other_info

# Info on sixtrack->pyblep conversion
iconv = other_data['iconv']

########################################################
#                  Search closed orbit                 #
# (for comparison purposes we the orbit from sixtrack) #
########################################################

# Load sixtrack tracking data
sixdump_all = sixtracktools.SixDump101('sixtrack/res/dump3.dat')
# Assume first particle to be on the closed orbit
Nele_st = len(iconv)
sixdump_CO = sixdump_all[::2][:Nele_st]

# Disable BB elements
line.disable_beambeam()

# Find closed orbit
guess_from_sixtrack = [
    getattr(sixdump_CO, att)[0] for att in 'x px y py sigma delta'.split()
]
part_on_CO = line.find_closed_orbit(guess=guess_from_sixtrack,
                                    method='get_guess',
                                    p0c=p0c_eV)
#Setup turn-by-turn dump
i_start_dp = None
for ii, ll in enumerate(lines_f3):
    if ll.startswith('DUMP'):
        i_start_dp = ii
        break

lines_f3[i_start_dp + 1] = 'StartDUMP 1 664 101 dumtemp.dat\n'

with open(wfold + '/fort.3', 'w') as fid:
    fid.writelines(lines_f3)

os.system('./runsix_trackfun')

# Load sixtrack tracking data
sixdump_all = sixtracktools.SixDump101('%s/dumtemp.dat' % wfold)

sixdump_CO = sixdump_all[::2]  # Particle on CO
sixdump_part = sixdump_all[1::2]  #

x_tbt = sixdump_part.x
px_tbt = sixdump_part.px
y_tbt = sixdump_part.y
py_tbt = sixdump_part.py
sigma_tbt = sixdump_part.sigma
delta_tbt = sixdump_part.delta

plt.close('all')
fig1 = plt.figure(1)
axx = fig1.add_subplot(2, 1, 1)
axy = fig1.add_subplot(2, 1, 2, sharex=axx)
Beispiel #5
0
sixinput = sixtracktools.SixInput(".")
p0c_eV = sixinput.initialconditions[-3] * 1e6

# Build pysixtrack line from sixtrack input
line = pysixtrack.Line.from_sixinput(sixinput)

# Info on sixtrack->pyblep conversion
iconv = line.other_info["iconv"]

########################################################
#                  Search closed orbit                 #
# (for comparison purposes we the orbit from sixtrack) #
########################################################

# Load sixtrack tracking data
sixdump_all = sixtracktools.SixDump101("res/dump3.dat")
# Assume first particle to be on the closed orbit
Nele_st = len(iconv)
sixdump_CO = sixdump_all[::2][:Nele_st]

# Disable BB elements
line.disable_beambeam()

# Find closed orbit
guess_from_sixtrack = [
    getattr(sixdump_CO, att)[0] for att in "x px y py sigma delta".split()
]
part_on_CO = line.find_closed_orbit(guess=guess_from_sixtrack,
                                    method="get_guess",
                                    p0c=p0c_eV)
Beispiel #6
0
import sixtracktools
import pysixtrack

six = sixtracktools.SixInput('.')
line, other = pysixtrack.Line.from_sixinput(six)
iconv = other['iconv']

sixdump = sixtracktools.SixDump101('res/dump3.dat')[1::2]

def compare(prun,pbench):
    out=[]
    for att in 'x px y py delta sigma'.split():
        vrun=getattr(prun,att)
        vbench=getattr(pbench,att)
        diff=vrun-vbench
        out.append(abs(diff))
        print(f"{att:<5} {vrun:22.13e} {vbench:22.13e} {diff:22.13g}")
    print(f"max {max(out):21.12e}")
    return max(out)

print("")
for ii in range(1,len(iconv)):
    jja=iconv[ii-1]
    jjb=iconv[ii]
    prun=pysixtrack.Particles(**sixdump[ii-1].get_minimal_beam())
    print(f"\n-----sixtrack={ii} sixtracklib={jja} --------------")
    #print(f"pysixtr {jja}, x={prun.x}, px={prun.px}")
    for jj in range(jja+1, jjb+1):
        label,elem=line.element_names[jj], line.elements[jj] 
        elem.track(prun)
        print(f"{jj} {label},{str(elem)[:50]}")
Beispiel #7
0
import sixtracktools
import pysixtrack

six = sixtracktools.SixInput('sixtrack')
line, rest, iconv = six.expand_struct(convert=pysixtrack.element_types)
sixdump = sixtracktools.SixDump101('sixtrack/dump3.dat')[::2]


def compare(prun, pbench):
    out = []
    for att in 'x px y py delta sigma'.split():
        vrun = getattr(prun, att)
        vbench = getattr(pbench, att)
        diff = vrun - vbench
        out.append(abs(diff))
        print(f"{att:<5} {vrun:22.13e} {vbench:22.13e} {diff:22.13g}")
    print(f"max {max(out):21.12e}")
    return max(out)


print("")
for ii in range(1, len(iconv)):
    jja = iconv[ii - 1]
    jjb = iconv[ii]
    prun = pysixtrack.Particles(**sixdump[ii - 1].get_minimal_beam())
    print(f"\n-----sixtrack={ii} sixtracklib={jja} --------------")
    #print(f"pysixtr {jja}, x={prun.x}, px={prun.px}")
    for jj in range(jja + 1, jjb + 1):
        label, elem_type, elem = line[jj]
        elem.track(prun)
        print(f"{jj} {label},{str(elem)[:50]}")
import sixtracktools
import pysixtrack

six = sixtracktools.SixInput(".")
line, other = pysixtrack.Line.from_sixinput(six)
iconv = other["iconv"]

sixdump = sixtracktools.SixDump101("res/dump.dat")[1::2]


def compare(prun, pbench):
    out = []
    for att in "x px y py delta sigma".split():
        vrun = getattr(prun, att)
        vbench = getattr(pbench, att)
        diff = vrun - vbench
        out.append(abs(diff))
        print(f"{att:<5} {vrun:22.13e} {vbench:22.13e} {diff:22.13g}")
    print(f"max {max(out):21.12e}")
    return max(out)


print("")
for ii in range(1, len(iconv)):
    jja = iconv[ii - 1]
    jjb = iconv[ii]
    prun = pysixtrack.Particles(**sixdump[ii - 1].get_minimal_beam())
    print(f"\n-----sixtrack={ii} sixtracklib={jja} --------------")
    # print(f"pysixtr {jja}, x={prun.x}, px={prun.px}")
    for jj in range(jja + 1, jjb + 1):
        label, elem = line.element_names[jj], line.elements[jj]
Beispiel #9
0
def generate_particle_data(input_path, output_path, conf=dict()):
    print("**** Generating Particles Data From SixTrack Input:")
    path_to_dump_file = os.path.join(input_path, "dump3.dat")

    print("**** -> Reading sixtrack input data from:\r\n" +
          f"****    {path_to_dump_file}")
    six = sixtracktools.SixInput(input_path)
    #line, rest, iconv = six.expand_struct( convert=pysixtrack.elements )
    line = pysix.Line.from_sixinput(six)
    iconv = line.other_info["iconv"]
    sixdump = sixtracktools.SixDump101(path_to_dump_file)

    num_iconv = int(len(iconv))
    num_belem = int(len(line))
    num_dumps = int(len(sixdump.particles))

    assert num_iconv > 0
    assert num_belem > iconv[num_iconv - 1]
    assert num_dumps >= num_iconv
    assert (num_dumps % num_iconv) == 0

    num_particles = num_dumps // num_iconv
    print(f"****    Info :: num sixtrack sequences : {num_iconv}")
    print(f"****    Info :: num beam elements      : {num_belem}")
    print(f"****    Info :: num particles          : {num_particles}")
    assert num_particles > 0
    assert num_belem > 0
    assert num_iconv > 0

    # =========================================================================
    # Get initial particle distribution:

    # Generate the initial particle disitribution buffers
    print("**** -> Generating initial particle distributions ...")
    generate_particle_data_initial(output_path, iconv, sixdump, conf=conf)

    # =========================================================================
    # Make sixtrack sequency-by-sequence data:

    if conf.get("make_sixtrack_sequ_by_sequ", False):
        print("**** -> Generating SixTrack sequ-by-sequ particle data ...")
        generate_particle_data_sequ_by_sequ(output_path,
                                            line,
                                            iconv,
                                            sixdump,
                                            conf=conf)

    # =========================================================================
    # Make elem-by-elem data using pysixtrack:

    if conf.get("make_elem_by_elem_data", False):
        print(
            "**** -> Generating elem-by-elem particle data using pysixtrack ..."
        )
        generate_particle_data_elem_by_elem(output_path,
                                            line,
                                            iconv,
                                            sixdump,
                                            conf=conf)

    # =========================================================================
    # Make until turn data using pysixtrack:

    if conf.get( "make_until_num_turn_data", False ) and \
        conf.get( "until_num_turns", 1 ) > 0:
        print(
            "**** -> Generating until_turn tracked data using pysixtrack ...")
        until_turn = conf.get("until_num_turns", 1)
        generate_particle_data_until_turn(output_path,
                                          line,
                                          iconv,
                                          sixdump,
                                          until_turn,
                                          conf=conf)
Beispiel #10
0
import sixtracktools
import pysixtrack

six = sixtracktools.SixInput("sixtrack")
line, rest, iconv = six.expand_struct(convert=pysixtrack.element_types)
sixdump = sixtracktools.SixDump101("sixtrack/dump3.dat")[::2]


def compare(prun, pbench):
    out = []
    for att in "x px y py delta sigma".split():
        vrun = getattr(prun, att)
        vbench = getattr(pbench, att)
        diff = vrun - vbench
        out.append(abs(diff))
        print(f"{att:<5} {vrun:22.13e} {vbench:22.13e} {diff:22.13g}")
    print(f"max {max(out):21.12e}")
    return max(out)


print("")
for ii in range(1, len(iconv)):
    jja = iconv[ii - 1]
    jjb = iconv[ii]
    prun = pysixtrack.Particles(**sixdump[ii - 1].get_minimal_beam())
    print(f"\n-----sixtrack={ii} sixtracklib={jja} --------------")
    # print(f"pysixtr {jja}, x={prun.x}, px={prun.px}")
    for jj in range(jja + 1, jjb + 1):
        label, elem_type, elem = line[jj]
        elem.track(prun)
        print(f"{jj} {label},{str(elem)[:50]}")
Beispiel #11
0
def track_particle_sixtrack(
    partCO,
    Dx_wrt_CO_m,
    Dpx_wrt_CO_rad,
    Dy_wrt_CO_m,
    Dpy_wrt_CO_rad,
    Dsigma_wrt_CO_m,
    Ddelta_wrt_CO,
    n_turns,
):

    (
        Dx_wrt_CO_m,
        Dpx_wrt_CO_rad,
        Dy_wrt_CO_m,
        Dpy_wrt_CO_rad,
        Dsigma_wrt_CO_m,
        Ddelta_wrt_CO,
    ) = vectorize_all_coords(
        Dx_wrt_CO_m,
        Dpx_wrt_CO_rad,
        Dy_wrt_CO_m,
        Dpy_wrt_CO_rad,
        Dsigma_wrt_CO_m,
        Ddelta_wrt_CO,
    )

    n_part = len(Dx_wrt_CO_m)

    wfold = "temp_trackfun"

    if not os.path.exists(wfold):
        os.mkdir(wfold)

    os.system("cp fort.* %s" % wfold)

    with open("fort.3", "r") as fid:
        lines_f3 = fid.readlines()

    # Set initial coordinates
    i_start_ini = None
    for ii, ll in enumerate(lines_f3):
        if ll.startswith("INITIAL COO"):
            i_start_ini = ii
            break

    lines_f3[i_start_ini + 2] = "    0.\n"
    lines_f3[i_start_ini + 3] = "    0.\n"
    lines_f3[i_start_ini + 4] = "    0.\n"
    lines_f3[i_start_ini + 5] = "    0.\n"
    lines_f3[i_start_ini + 6] = "    0.\n"
    lines_f3[i_start_ini + 7] = "    0.\n"

    lines_f3[i_start_ini + 2 + 6] = "    0.\n"
    lines_f3[i_start_ini + 3 + 6] = "    0.\n"
    lines_f3[i_start_ini + 4 + 6] = "    0.\n"
    lines_f3[i_start_ini + 5 + 6] = "    0.\n"
    lines_f3[i_start_ini + 6 + 6] = "    0.\n"
    lines_f3[i_start_ini + 7 + 6] = "    0.\n"

    lines_f13 = []

    prev_part = None

    for i_part in range(n_part):
        temp_part = pysixtrack.Particles(**partCO)
        temp_part.x += Dx_wrt_CO_m[i_part]
        temp_part.px += Dpx_wrt_CO_rad[i_part]
        temp_part.y += Dy_wrt_CO_m[i_part]
        temp_part.py += Dpy_wrt_CO_rad[i_part]
        temp_part.sigma += Dsigma_wrt_CO_m[i_part]
        temp_part.delta += Ddelta_wrt_CO[i_part]

        lines_f13.append("%.10e\n" % ((temp_part.x) * 1e3))
        lines_f13.append("%.10e\n" % ((temp_part.px) * temp_part.rpp * 1e3))
        lines_f13.append("%.10e\n" % ((temp_part.y) * 1e3))
        lines_f13.append("%.10e\n" % ((temp_part.py) * temp_part.rpp * 1e3))
        lines_f13.append("%.10e\n" % ((temp_part.sigma) * 1e3))
        lines_f13.append("%.10e\n" % ((temp_part.delta)))
        if i_part % 2 == 1:
            lines_f13.append("%.10e\n" % (temp_part.energy0 * 1e-6))
            lines_f13.append("%.10e\n" % (prev_part.energy * 1e-6))
            lines_f13.append("%.10e\n" % (temp_part.energy * 1e-6))
        prev_part = temp_part

    with open(wfold + "/fort.13", "w") as fid:
        fid.writelines(lines_f13)

    if np.mod(n_part, 2) != 0:
        raise ValueError("SixTrack does not like this!")

    i_start_tk = None
    for ii, ll in enumerate(lines_f3):
        if ll.startswith("TRACKING PAR"):
            i_start_tk = ii
            break
    # Set number of turns and number of particles
    temp_list = lines_f3[i_start_tk + 1].split(" ")
    temp_list[0] = "%d" % n_turns
    temp_list[2] = "%d" % (n_part / 2)
    lines_f3[i_start_tk + 1] = " ".join(temp_list)
    # Set number of idfor = 2
    temp_list = lines_f3[i_start_tk + 2].split(" ")
    temp_list[2] = "2"
    lines_f3[i_start_tk + 2] = " ".join(temp_list)

    # Setup turn-by-turn dump
    i_start_dp = None
    for ii, ll in enumerate(lines_f3):
        if ll.startswith("DUMP"):
            i_start_dp = ii
            break

    lines_f3[i_start_dp + 1] = "StartDUMP 1 664 101 dumtemp.dat\n"

    with open(wfold + "/fort.3", "w") as fid:
        fid.writelines(lines_f3)

    os.system("./runsix_trackfun")

    # Load sixtrack tracking data
    sixdump_all = sixtracktools.SixDump101("%s/dumtemp.dat" % wfold)

    x_tbt = np.zeros((n_turns, n_part))
    px_tbt = np.zeros((n_turns, n_part))
    y_tbt = np.zeros((n_turns, n_part))
    py_tbt = np.zeros((n_turns, n_part))
    sigma_tbt = np.zeros((n_turns, n_part))
    delta_tbt = np.zeros((n_turns, n_part))

    for i_part in range(n_part):
        sixdump_part = sixdump_all[i_part::n_part]
        x_tbt[:, i_part] = sixdump_part.x
        px_tbt[:, i_part] = sixdump_part.px
        y_tbt[:, i_part] = sixdump_part.y
        py_tbt[:, i_part] = sixdump_part.py
        sigma_tbt[:, i_part] = sixdump_part.sigma
        delta_tbt[:, i_part] = sixdump_part.delta

    return x_tbt, px_tbt, y_tbt, py_tbt, sigma_tbt, delta_tbt