Exemple #1
0
def generate_lattice_data(input_path, output_path, conf=dict()):
    print("**** Generating Lattice Data From SixTrack Input:")
    print("**** -> Reading sixtrack input data from:\r\n" +
          f"****    {input_path}")
    six = sixtracktools.SixInput(input_path)
    slot_size = st.CBufferView.DEFAULT_SLOT_SIZE

    line = pysix.Line.from_sixinput(six)
    n_slots, n_objs, n_ptrs = calc_cbuffer_params_for_pysix_line(
        line, slot_size=slot_size, conf=conf)
    cbuffer = st.CBuffer(n_slots, n_objs, n_ptrs, 0, slot_size)
    pysix_line_to_cbuffer(line, cbuffer)
    path_to_lattice = os.path.join(output_path, "cobj_lattice.bin")

    if 0 == cbuffer.tofile_normalised(path_to_lattice,
                                      conf.get("cbuffer_norm_base_addr",
                                               4096)):
        print("**** -> Generated cobjects lattice data at:\r\n" +
              f"****    {path_to_lattice}")
    else:
        raise RuntimeError("Problem during creation of lattice data")

    path_to_pysix_lattice = os.path.join(output_path,
                                         "pysixtrack_lattice.pickle")

    try:
        pickle.dump(line.elements, open(path_to_pysix_lattice, "wb"))
        print("**** -> Generated pysixtrack lattice as python pickle:\r\n" +
              f"****    {path_to_pysix_lattice}")
    except:
        raise RuntimeError("Unable to generate pysixtrack lattice data")

    if conf.get( 'make_demotrack_data', False ) and \
        st.Demotrack_enabled() and st.Demotrack_belems_can_convert( cbuffer ):
        dt_lattice = st.Demotrack_belems_convert(cbuffer)
        if isinstance( dt_lattice, np.ndarray ) and \
            st.Demotrack_belems_num_stored_objects( dt_lattice ) == \
            cbuffer.num_objects:
            path_dt_lattice = os.path.join(output_path,
                                           "demotrack_lattice.bin")
            with open(path_dt_lattice, "wb") as fp_out:
                fp_out.write(float_to_bytes(len(dt_lattice)))
                fp_out.write(dt_lattice.tobytes())
                print(
                    "**** -> Generated demotrack lattice as flat array:\r\n" +
                    f"****    {path_dt_lattice}")
    return
Exemple #2
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
Exemple #3
0
sys.path.append('..')

import normalization

import os

os.system('(cd sixtrack; ./runsix)')

import numpy as np

##############
# Build line #
##############

# Read sixtrack input
sixinput = sixtracktools.SixInput('./sixtrack')
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
Exemple #4
0
import pysixtrack

npart = 1
nturns = 1
x0 = 0.0001

particles = sim.Particles(nparticles=npart)
particles.p0c = 7000e9
particles.x = x0

#lhc = sixtracktools.SixInput('.')
#line, rest, iconv = lhc.expand_struct()
#elements=sim.Elements.fromline(line)

elements = sim.Elements()
lhc = sixtracktools.SixInput('.')
line, rest, iconv = lhc.expand_struct(convert=elements.gen_builder())

cljob = sim.TrackJobCL(particles, elements, device="0.0", dump_element=nturns)
cljob.track()
cljob.collect()
out = cljob.dump_element

refline, rest, iconv = lhc.expand_struct(convert=pysixtrack.element_types)
refline = pysixtrack.Line(elements=[l[2] for l in refline])
refline.elements.append(pysixtrack.Monitor())

prun = pysixtrack.Particles(p0c=7000e9, x=x0)
refout = refline.track_elem_by_elem(prun)

refx = np.array([p.x for p in refout])
Exemple #5
0
import sixtracktools
import pysixtrack

import numpy as np

##############
# Build line #
##############

# Read sixtrack input
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
Exemple #6
0
# Read sixtrack input using sixtracktools
import sixtracktools

sixinput = sixtracktools.SixInput('sixtrack_input')

# Build a pysixtrack line from pyblep line
import pysixtrack

ps_line, other = pysixtrack.Line.from_sixinput(sixinput)

# Build a pysixtracklib line from pyblep line
import pysixtracklib

pslib_line = pysixtracklib.Elements()
pslib_line.append_line(ps_line)
pslib_line.BeamMonitor(num_stores=1)

# Build a pysixtrack particle
ps_part = pysixtrack.Particles(p0c=7000e9)
ps_part.x = 1e-3
ps_part.px = 2e-4

# Build a pysixtracklib particle
pslib_part_set = pysixtracklib.ParticlesSet()
pslib_part = pslib_part_set.Particles(num_particles=1)
ps_part.partid = 0
ps_part.state = 1
ps_part.elemid = 0
ps_part.turn = 0
pslib_part.from_pysixtrack(ps_part, particle_index=0)
Exemple #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]}")
Exemple #8
0
import sixtracktools
import pysixtrack
import simpletrack as sim

elements = sim.Elements()

six = sixtracktools.SixInput(".")
line = pysixtrack.Line.from_sixinput(six, classes=elements.gen_builder_class())

elements.tofile('line.bin')
def generate_testdata(pyst_example, pysixtrack_line_from_pickle=True):

    # -------------------------------------------------------------------------
    # Step 1: convert the input data into CObject files

    input_folder  = os.path.join( testdata.PATH_TO_TESTDATA_DIR, pyst_example )
    output_folder = os.path.join( testdata.PATH_TO_TESTDATA_DIR, pyst_example )

    st_beam_elem_dump = os.path.join( output_folder, 'beam_elements_sixtrack.bin' )
    beam_elem_dump    = os.path.join( output_folder, 'beam_elements.bin' )

    # Dump the unmodified SixTrack machine description to CBuffer data file
    six = sixtracktools.SixInput(input_folder)
    st_line, rest, iconv = six.expand_struct(convert=pysixtrack.element_types)
    st_elements = pystlib.Elements.fromline(st_line)
    st_elements.to_file(st_beam_elem_dump)

    # Dump the pysixtrack machine description to CBuffer data file
    if pysixtrack_line_from_pickle:
        with open(os.path.join(input_folder, 'line.pkl'), 'rb') as fid:
            line = pickle.load(fid)
    else:
        line = st_line


    elements = pystlib.Elements.fromline(line)
    elements.to_file(beam_elem_dump)

    # -------------------------------------------------------------------------
    # Step 2: Dump particle state into an element by element I/O buffer
    #         before tracking happens at each beam element:

    # Dump the unmodified SixTrack element-by-element data to CBuffer data file
    st_particles_dump = os.path.join(output_folder, 'particles_dump_sixtrack.bin')
    st_particles = pystlib.ParticlesSet.fromSixDump101(input_folder,
        os.path.join(input_folder, 'dump3.dat'))
    st_particles.to_file(st_particles_dump)


    # Reload from file
    input_particles_buffer = pystlib.CBuffer.fromfile(st_particles_dump)
    assert(input_particles_buffer.n_objects > 0)

    ebe_particles_buffer = CBuffer()

    input_particles = input_particles_buffer.get_object(0, cls=Particles)
    npart = input_particles.num_particles

    pystlib_particles = pystlib.particles.makeCopy( input_particles )

    # one particle is used for the fix-point calculation, thus we would need at
    # least two particles for any kind of non-trivial testdata
    track_particles = []

    for jj in range( npart ):
        track_particles.append( pysixtrack.Particles() )
        input_particles.to_pysixtrack( track_particles[ jj ], jj )
        track_particles[ jj ].turn = 0 #Override turn in case it's not 0

    for ii, elem in enumerate( line ):
        label, be_type, beam_element = elem
        before = Particles( num_particles=npart, cbuffer=ebe_particles_buffer )

        for jj in range( 0, npart ):
            before.from_pysixtrack( track_particles[ jj ], jj )
            beam_element.track( track_particles[ jj ] )

        before.at_element[:] = ii

    last = Particles( num_particles=npart, cbuffer=ebe_particles_buffer )

    for jj in range( npart ):
        last.from_pysixtrack( track_particles[ jj ], jj )

    last.at_turn[:] = 1
    last.at_element[:] = 0

    # -------------------------------------------------------------------------
    # Step 3: Write the element by element I/O buffer to the output file
    #         in the output_folder location:

    assert( ( len( line ) + 1 ) == ebe_particles_buffer.n_objects )
    particles_dump = os.path.join( output_folder, 'particles_dump.bin' )

    ebe_particles_buffer.to_file( particles_dump )
Exemple #10
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)
Exemple #11
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]}")