Tutorial IBS

[1]:
import IBSLib as ibslib
import numpy as np
import pandas as pd

For getting help:

help(ibslib.Nagaitsev)

Help on built-in function Nagaitsev in module IBSLib:

Nagaitsev(…) method of builtins.PyCapsule instance Nagaitsev(pnumber: float, emitx: float, emity: float, bunchLength: float, dpop: float, twissHeaderMap: Dict[str, float], twissTableMap: Dict[str, List[float]], classicalRadius: float, outputArray: numpy.ndarray[numpy.float64]) -> None

Nagaitsev

Physical Constants

[2]:
print("{:35} : {:12.8e}".format("Speed of light in m/s", ibslib.clight))
print("{:35} : {:12.8e}".format("Reduced Planck constant in GeV ", ibslib.hbarGeV))
print("{:35} : {:12.8e}".format("Electron Mass in GeV", ibslib.electron_mass))
print("{:35} : {:12.8e}".format("Proton Mass in GeV", ibslib.proton_mass))
print("{:35} : {:12.8e}".format("Neutron Mass in GeV", ibslib.neutron_mass))
print("{:35} : {:12.8e}".format("Muon Mass in GeV", ibslib.mu_mass))
print("{:35} : {:12.8e}".format("Atomic Mass Unit in GeV", ibslib.atomic_mass_unit))
print("{:35} : {:12.8e}".format("Pi", ibslib.pi))
print("{:35} : {:12.8e}".format("Electric Charge in Coulomb", ibslib.electric_charge))
print("{:35} : {:12.8e}".format("Euler Constant", ibslib.euler))
print("{:35} : {:12.8e}".format("Classical Electron Radius in m", ibslib.electron_radius))
print("{:35} : {:12.8e}".format("Classical Proton Radius in m ", ibslib.proton_radius))

Speed of light in m/s               : 2.99792458e+08
Reduced Planck constant in GeV      : 6.58211957e-25
Electron Mass in GeV                : 5.10998950e-04
Proton Mass in GeV                  : 9.38272088e-01
Neutron Mass in GeV                 : 9.39565421e-01
Muon Mass in GeV                    : 1.05658375e-01
Atomic Mass Unit in GeV             : 9.31494102e-01
Pi                                  : 3.14159265e+00
Electric Charge in Coulomb          : 1.60217663e-19
Euler Constant                      : 5.77215665e-01
Classical Electron Radius in m      : 2.81794033e-15
Classical Proton Radius in m        : 1.53469827e-18

Twiss

  • Cpymad

  • from file

    • read header

    • read table

    • update -> adds radiation integrals per element (I1,I2,I3,I4x,I4y,I5x,I5y)

Cpymad

[3]:
from pprint import pprint
from cpymad.madx import Madx

lattice = "BII_1996-01-01_design_v_1.seq"
tfsfile = "b2_design.twiss"

mad = Madx()
mad.option.echo = False
mad.option.warn = False
mad.command.beam(energy=1.7, particle='electron')
mad.call(file=lattice)
mad.use(sequence='ring')
twiss = mad.twiss(file=tfsfile, chrom=True)
pprint(dict(twiss.summary))
{'alfa': 0.0007316942746,
 'bcurrent': 2.001335116e-13,
 'betxmax': 17.43722837,
 'betymax': 21.09492526,
 'bv_flag': 1.0,
 'charge': -1.0,
 'deltap': 0.0,
 'dq1': 1.077745266,
 'dq2': 1.371772348,
 'dxmax': 0.4496533372,
 'dxrms': 0.2272073799,
 'dymax': 0.0,
 'dyrms': 0.0,
 'energy': 1.7,
 'et': 0.001,
 'ex': 1.0,
 'ey': 1.0,
 'gamma': 3326.817012,
 'gammatr': 36.9687845,
 'kbunch': 1.0,
 'length': 240.0,
 'mass': 0.00051099895,
 'npart': 1.0,
 'orbit5': -0.0,
 'particle': 'ELECTRON',
 'pc': 1.699999923,
 'q1': 17.84996563,
 'q2': 6.743031469,
 'sequence': 'RING',
 'sige': 0.001,
 'sigt': 1.0,
 'synch_1': 0.1756066259,
 'synch_2': 1.442924619,
 'synch_3': 0.3313655981,
 'synch_4': -0.004653715528,
 'synch_5': 0.001749753833,
 'xcomax': 0.0,
 'xcorms': 0.0,
 'ycomax': 0.0,
 'ycorms': 0.0}

From File

[4]:
# read twiss summary / header as dictionary
twissHeader = ibslib.GetTwissHeader(tfsfile)
[5]:
# read twiss table as dictionary - only reads IBS relevant columns from Twiss (data reduction)
twissTable = ibslib.GetTwissTable(tfsfile)
print(list(twissTable.keys()))
['ALFX', 'ALFY', 'ANGLE', 'BETX', 'BETY', 'DPX', 'DPY', 'DX', 'DY', 'K1L', 'K1SL', 'L']
[6]:
# update Twiss with radiation integrals and related quantities needed later on (come back to this later)
twissTable = ibslib.updateTwiss(twissTable)
print(list(twissTable.keys()))
['ALFX', 'ALFY', 'ANGLE', 'BETX', 'BETY', 'DPX', 'DPY', 'DX', 'DY', 'I1', 'I2', 'I3', 'I4x', 'I4y', 'I5x', 'I5y', 'K1L', 'K1SL', 'L', 'gammax', 'gammay', 'hx', 'hy', 'k', 'rho']

print values of twiss column

ibslib.printTwissColumn("BETX",twissTable)

Radiation Damping

  • RadiationDampingApprox

  • RadiationDampingLattice

  • RadiationDampingEquilibria

Radiation Damping Approx

Uses ring averages (Tunes -> beta average, average bending radius, etc…)

[7]:
df     = pd.DataFrame.from_dict(twissTable,orient='columns')
rhoAvg = df.loc[df.rho != 0.0,'rho'].mean()

gamma    = twissHeader['GAMMA']
gamma_tr = twissHeader['GAMMATR']
circ     = twissHeader['LENGTH']

bxAvg = circ / (2.0 * ibslib.pi * twissHeader["Q1"]);
byAvg = circ / (2.0 * ibslib.pi * twissHeader["Q2"]);

radint = np.zeros(7)
ibslib.RadiationDampingApprox(circ, gamma, gamma_tr, rhoAvg, bxAvg, byAvg, radint);
radint
[7]:
array([1.540409  , 1.44292462, 0.3313656 , 0.        , 0.        ,
       0.07523688, 0.        ])

Radiation Damping Lattice

Uses Twiss Table

[8]:
ibslib.RadiationDampingLattice(twissTable, radint)
radint
[8]:
array([ 0.26299979,  1.44292462,  0.3313656 , -0.00465372,  0.        ,
        0.00201665,  0.        ])

Radiation damping Equilibria

Values are used in the ODE simulations!!

[9]:
gamma   = twissHeader.get('GAMMA')
pc      = twissHeader.get('PC')
gammatr = twissHeader.get('GAMMATR')
mass    = twissHeader.get('MASS')
charge  = twissHeader.get('CHARGE')
q1      = twissHeader.get('Q1')
l       = twissHeader.get('LENGTH')

aatom   = ibslib.electron_mass / ibslib.proton_mass
betar   = ibslib.beta_relativistic_from_gamma(gamma) # see numeric functions
r0      = ibslib.particle_radius(1, aatom) # see numeric functions
trev    = l / (betar * ibslib.clight)
frev    = 1.0 / trev
omega   = 2.0 * ibslib.pi * frev
eta     = ibslib.eta(gamma, gammatr)
epsilon = 1.0e-6 # accuracy for synchronuous phase search

radint = np.zeros(7)
ibslib.RadiationDampingLattice(twissTable, radint)

target_energy_gain_ev    = 0.0
intial_phis_search_value = 173
harmon                   = [400.0]
voltages                 = [-4. * 375000.]

# methods below are described/ demonstrated in the numeric functions part
U0     = ibslib.get_energy_loss_per_turn(twissHeader, radint[1], aatom)
phis   = ibslib.get_synchronuous_phase(target_energy_gain_ev, intial_phis_search_value, U0, charge, harmon,voltages,epsilon)
qs     = ibslib.get_synchrotron_tune(omega, U0, charge, harmon, voltages, phis, eta, pc)
omegas = qs * omega

equi = np.zeros(9)
ibslib.RadiationDampingEquilibria(twissHeader, radint, aatom, qs, equi)
print("{:10} : {:10.6e} ({})\n".format("Energy Loss per Turn", U0, "eV"));
print("{:10} : {:10.6e} ({})".format("Taux", equi[0], "s"));
print("{:10} : {:10.6e} ({})".format("Tauy", equi[1], "s"));
print("{:10} : {:10.6e} ({})".format("Taus", equi[2], "s"));
print("{:10} : {:10.6e} ({})".format("exinf", equi[3], ""));
print("{:10} : {:10.6e} ({})".format("eyinf", equi[4], ""));
print("{:10} : {:10.6e} ({})".format("sigeoe2", equi[5], ""));
print("{:10} : {:10.6e} ({})".format("sigsinf", equi[6], ""));
print("{:10} : {:10.6e} ({})".format("jx", equi[7], ""));
print("{:10} : {:10.6e} ({})".format("jy", equi[8], ""))
Energy Loss per Turn : 1.702619e+05 (eV)

Taux       : 7.967527e-03 (s)
Tauy       : 7.993224e-03 (s)
Taus       : 3.990177e-03 (s)
exinf      : 5.908327e-09 ()
eyinf      : 9.415563e-14 ()
sigeoe2    : 4.877655e-07 ()
sigsinf    : 3.054559e-03 ()
jx         : 1.003225e+00 ()
jy         : 1.000000e+00 ()

Numeric Functions

  • Standard util functions

  • Longitudinal / RF

  • IBS specific numeric functions

Standard functions

[10]:
betar   = ibslib.beta_relativistic_from_gamma(gamma)
eta     = ibslib.eta(gamma, gammatr)
r0      = ibslib.particle_radius(1, aatom)

sige    = np.sqrt(equi[5])
dpop    = ibslib.dee_to_dpp(sige, betar)
deoe    = ibslib.dpp_to_dee(dpop, betar)
betar, eta, r0, sige, dpop, deoe
[10]:
(0.999999954823541,
 0.0007316942747206528,
 2.8179403262e-15,
 0.0006984020902062896,
 0.0006984021532869811,
 0.0006984020902063293)

Longitudinal / RF

  • sigs_from_sige

  • sige_from_sigs

  • rf_voltage_in_eV - energy gain in eV -> to be able to find \(\phi_s\)

  • rf_voltage_in_ev_prime - derivative of rf_voltage_in_eV

  • rf_voltage_in_ev_with_rad_losses

  • get_synchronuous_phase

  • rf_voltage_with_potential_well_distortion

  • rf_voltage_with_potential_well_distortion_prime

  • get_synchronuous_phase_with_potential_well_distortion

  • get_synchrotron_tune

  • get_synchrotron_tune_with_potential_well

  • sige_form_sigs_using_rf

[11]:
# sigma_s from sigma_e
sigs = ibslib.sigs_from_sige(sige, gamma, gammatr, omegas)
sigs, sige
[11]:
(0.003054558934794126, 0.0006984020902062896)
[12]:
# sigma_e from sigma_s
sigen = ibslib.sige_from_sigs(omega, sigs, qs, gamma, gammatr)
sigs,sigen
[12]:
(0.003054558934794126, 0.0006984020902062895)
[13]:
phi = 173
ibslib.rf_voltage_in_ev(phi, charge, harmon,voltages), ibslib.rf_voltage_in_ev_prime(phi, charge, harmon,voltages)
[13]:
(182804.01510772132, -1488819.227461983)
[14]:
# offset to be on synchronuous phase
ibslib.rf_voltage_in_ev_with_rad_losses(phi, charge, U0, harmon, voltages)
[14]:
12542.106380552286
[15]:
# synchronuous phase
phis   = ibslib.get_synchronuous_phase(target_energy_gain_ev, intial_phis_search_value, U0, charge, harmon,voltages,epsilon)
intial_phis_search_value, phis, ibslib.rf_voltage_in_ev_with_rad_losses(phis, charge, U0, harmon, voltages)
[15]:
(173, 173.48242725610714, 9.92469722405076e-07)
[16]:
# synchrotron tune
ibslib.get_synchrotron_tune(omega, U0, charge, harmon, voltages, phis, eta, pc)
[16]:
0.006390253850181927
[17]:
ibslib.sige_form_sigs_using_rf(sigs, U0, charge, harmon, voltages, gamma,gammatr, pc, circ, phis, True), sige
[17]:
(0.0006984021533089606, 0.0006984020902062896)

IBS specific

[18]:
# numeric functions used in IBS growth rate calculations
ibslib.fmohl(1.,2.,3.,1000), ibslib.rds(1.0,2.0,3.0)
[18]:
(-5.404172967883225, 0.29046028102188937)

Coulomb Log

  • twclog

  • twclogtail

  • coulomblog

  • coulomblogtail

The first two methods are used in the simulation and are designed to be applied on an element by element basis. The second two use ring averages and can be used to get an idea of the values.

[19]:
pnumber = 1.0e10
restE   = twissHeader['ENERGY']
clog    = np.zeros(2)
clogt   = np.zeros(2)

# using ring averages
ibslib.coulomblog(pnumber, equi[3], equi[4], twissHeader, sige, sigs, r0, True, clog)
ibslib.coulomblogtail(pnumber, equi[3], equi[4], twissHeader, sige, sigs, equi[0], equi[1], equi[2], r0, True, clogt)

print("{:30} : {:12.6e}".format("Coulomb Log", clog[0]))
print("{:30} : {:12.6e}".format("Coulomb IBS pre-factor", clog[1]))
print()
print("{:30} : {:12.6e}".format("Coulomb Log Tailcut", clogt[0]))
print("{:30} : {:12.6e}".format("Coulomb IBS pre-factor Tailcut", clogt[1]))
print()


print("Element weighted")
print("================")
# element by element weighted
avgclog  = 0.0;
avgclogc = 0.0;

# without tailcut
for i in range(len(twissTable["L"])):
    ibslib.twclog(pnumber, twissTable["BETX"][i], twissTable["BETY"][i],
           twissTable["DX"][i], twissTable["DY"][i], equi[3], equi[4], r0,
           gamma, charge, restE, mass, sige, sigs, clog);
    avgclog  += twissTable["L"][i] * clog[0];
    avgclogc += twissTable["L"][i] * clog[1];

avgclog  /= twissHeader["LENGTH"];
avgclogc /= twissHeader["LENGTH"];

print("{:30} : {:12.6e}".format("Coulomb Log", avgclog))
print("{:30} : {:12.6e}".format("Coulomb IBS pre-factor", avgclogc))
print()

# with tailcut
for i in range(len(twissTable["L"])):
    ibslib.twclogtail(pnumber, twissTable["L"][i], twissTable["BETX"][i],
               twissTable["BETY"][i], twissTable["DX"][i],
               twissTable["DPX"][i], twissTable["DY"][i],
               twissTable["DPY"][i], twissTable["ALFX"][i],
               twissTable["ALFY"][i], twissTable["ANGLE"][i],
               twissTable["K1L"][i], twissTable["K1SL"][i], equi[3],
               equi[4], r0, aatom, gamma, restE, circ, mass, charge, sige, sigs,
               clogt);
    avgclog  += twissTable["L"][i] * clogt[0];
    avgclogc += twissTable["L"][i] * clogt[1];

avgclog  /= twissHeader["LENGTH"];
avgclogc /= twissHeader["LENGTH"];

print("{:30} : {:12.6e}".format("Coulomb Log Tailcut", avgclog))
print("{:30} : {:12.6e}".format("Coulomb IBS pre-factor Tailcut", avgclogc))
Coulomb Log                    : 1.742574e+01
Coulomb IBS pre-factor         : 1.135416e+02

Coulomb Log Tailcut            : 9.002388e+00
Coulomb IBS pre-factor Tailcut : 5.865725e+01

Element weighted
================
Coulomb Log                    : 1.654592e+01
Coulomb IBS pre-factor         : 1.078089e+02

Coulomb Log Tailcut            : 1.582737e+01
Coulomb IBS pre-factor Tailcut : 1.031271e+02

Integrands and integrals

  • Simpson

  • Simpson Decade

  • Simpson Decade with scaling for Zimmerman Models as implemented in MADX

  • Integrand Function that can be passed to the integrators (Bjorken-Mtingwa, Conte-Martini, Zimmerman)

  • Demo with IBS models as individually hard to compare due to different integrands. (test_cpp_integrators.py in unit tests for some examples)

IBS models

  • Numeric approximation function (fast)

    • Piwinski smooth

    • Piwinski lattice

    • Piwinski Modified

    • Nagaitsev without and with tailcut

  • Using integration

    • Zimmerman model - madx with and without tailcut using scaled Simpson Decade

    • Bjorken-Mtingwa Simpson (least accurate)

    • Bjorken-Mtingwa Simpson Decade with and without tailcut

    • Conte-Martini Simpson Decade with and without tailcut

    • Zimmerman model with Simpson Decade

Note: all use coulomb constants element weighted - different from previous implementations.

[20]:
print("IBS Models");
print("==========");
printf = lambda model, te, tx, ty: "{:40}\t{:<12.6f}\t{:<12.6f}\t{:<12.6f}".format(model, te, tx, ty)
print("{:40}\t{:12}\t{:12}\t{:12}".format('Model', "te2", "tex", "tey"))
res = np.zeros(3)
sige0 = 1e-4;

ibslib.PiwinskiSmooth(pnumber, equi[3], equi[4], sigs, ibslib.dee_to_dpp(sige0, betar), twissHeader, r0, res);
print(printf("Piwinski Smooth", *(0.5/res)));

ibslib.PiwinskiLattice(pnumber, equi[3], equi[4], sigs, ibslib.dee_to_dpp(sige0, betar), twissHeader, twissTable, r0, res);
print(printf("Piwinski Lattice", *(0.5/res)));

ibslib.PiwinskiLatticeModified(pnumber, equi[3], equi[4], sigs, ibslib.dee_to_dpp(sige0, betar), twissHeader, twissTable, r0, res);
print(printf("Piwinski Lattice Modified", *(0.5/res)));

ibslib.Nagaitsev(pnumber, equi[3], equi[4], sigs, ibslib.dee_to_dpp(sige0, betar), twissHeader, twissTable, r0, res);
print(printf("Nagaitsev", *(0.5/res)));

ibslib.NagaitsevTailcut(pnumber, equi[3], equi[4], sigs, ibslib.dee_to_dpp(sige0, betar), twissHeader, twissTable, r0, aatom, res);
print(printf("Nagaitsev Tailcut", *(0.5/res)));

# IBS METHODS WITH DEDICATED INTEGRATORS
# ================================================================================

ibslib.Zimmerman(pnumber, equi[3], equi[4], sigs, sige0, twissHeader, twissTable, r0, True, res);
print(printf("Zimmerman scaled Simpson Decade", *(0.5/res)));

ibslib.ZimmermanTailcut(pnumber, equi[3], equi[4], sigs, sige0, twissHeader, twissTable, r0, aatom, res);
print(printf("Zimmerman scaled Simpson Decade Tailcut", *(0.5/res)));

ibslib.BjorkenMtingwaSimpson(pnumber, equi[3], equi[4], sigs, ibslib.dee_to_dpp(sige0, betar), twissHeader, twissTable, r0, res);
print(printf("Bjorken Mtingwa Simpson", *(0.5/res)));

ibslib.BjorkenMtingwaSimpsonDecade(pnumber, equi[3], equi[4], sigs, ibslib.dee_to_dpp(sige0, betar), twissHeader, twissTable, r0, res);
print(printf("Bjorken Mtingwa Simpson Decade", *(0.5/res)));

ibslib.BjorkenMtingwaTailcutSimpsonDecade(pnumber, equi[3], equi[4], sigs, ibslib.dee_to_dpp(sige0, betar), twissHeader, twissTable, r0, aatom, res);
print(printf("Bjorken Mtingwa Simpson Decade Tailcut", *(0.5/res)));

ibslib.ConteMartiniSimpsonDecade(pnumber, equi[3], equi[4], sigs, ibslib.dee_to_dpp(sige0, betar), twissHeader, twissTable, r0, res);
print(printf("Conte Martini Simpson Decade", *(0.5/res)));

ibslib.ConteMartiniTailcutSimpsonDecade(pnumber, equi[3], equi[4], sigs, ibslib.dee_to_dpp(sige0, betar), twissHeader, twissTable, r0, aatom, res);
print(printf("Conte Martini Simpson Decade Tailcut", *(0.5/res)));

ibslib.ZimmermanSimpsonDecade(pnumber, equi[3], equi[4], sigs, ibslib.dee_to_dpp(sige0, betar), twissHeader, twissTable, r0, res);
print(printf("Zimmerman Simpson Decade", *(0.5/res)));
IBS Models
==========
Model                                           te2             tex             tey
Piwinski Smooth                                 0.000041        0.072543        0.000866
Piwinski Lattice                                0.000060        0.011744        0.000650
Piwinski Lattice Modified                       0.000060        0.011751        0.000651
Nagaitsev                                       0.000033        0.006027        0.000422
Nagaitsev Tailcut                               0.000035        0.006492        0.000459
Zimmerman scaled Simpson Decade                 0.000032        0.005843        0.000402
Zimmerman scaled Simpson Decade Tailcut         0.000033        0.006147        0.000440
Bjorken Mtingwa Simpson                         0.000031        0.005637        0.000411
Bjorken Mtingwa Simpson Decade                  0.000031        0.005572        0.000413
Bjorken Mtingwa Simpson Decade Tailcut          0.000032        0.006003        0.000450
Conte Martini Simpson Decade                    0.000032        0.005757        0.000403
Conte Martini Simpson Decade Tailcut            0.000033        0.006202        0.000439
Zimmerman Simpson Decade                        0.000032        0.005692        0.000403

Keep in mind that the Piwinski models do not use an elment weighted Coulomb Log calculation, but it is embedded in the analytical function used.

ODE simulations

[21]:
from ibs import print_model_map
print_model_map()
{0: 'All', 1: 'Piwinski Smooth', 2: 'Piwinski Lattice', 3: 'Piwinski Lattice Modified', 4: 'Nagaitsev', 5: 'Nagaitsev Tailcut', 6: 'Zimmerman Simpson Decade Scaling', 7: 'Zimmerman Simpson Decade Scaling with Tailcut', 8: 'Bjorken-Mtingwa Standard Simpson', 9: 'Bjorken-Mtingwa Simpson Decade', 10: 'Bjorken-Mtingwa Simpson Decade Tailcut', 11: 'Conte-Martini Simpson Decade', 12: 'Conte-Martini Simpson Decade Tailcut', 13: 'Zimmerman Simpson Decade'}
[22]:
# for the CLI command this is read from a json file
sim_input= {
    "twissfile": "b2_design.twiss",
    "harmon": [
        400.0
    ],
    "voltages": [
        -1.5e6
    ],
    "ex": 7.5e-9,
    "ey": 1e-10,
    "sigs": 0.005,
    "model": 1,
    "pnumber": 1e10,
    "coupling": 0,
    "threshold": 1e-3,
    "outfile": "sim_test.csv",
    "plotfile": "sim_test.png"
}
[23]:
twissheader = ibslib.GetTwissHeader(sim_input["twissfile"])
twisstable = ibslib.GetTwissTable(sim_input["twissfile"])
twisstable = ibslib.updateTwiss(twisstable)

pnumber = 1e10
ex = 5e-9
ey = 1e-10
sigs = 0.005

t = [0.0]
exa = [sim_input['ex']]
eya = [sim_input['ey']]
sigsa = [sim_input['sigs']]
sigea = []
harmon = [400.0]
voltages = [-4.0 * 375e3]
coupling = 0
threshold = 1e-3

res = ibslib.runODE(
    twissheader,
    twisstable,
     sim_input["harmon"],
    sim_input["voltages"],
    t,
    exa,
    eya,
    sigsa,
    sigea,
    sim_input["model"],
    sim_input["pnumber"],
    sim_input["coupling"],
    sim_input["threshold"],
    "der"
)

df = pd.DataFrame.from_dict(res, orient='columns')

Synchrotron Tune : 6.390254e-03
 Synchrotron freq : 5.015421e+04
 Sige             : 6.984022e-04
 Radius max          : 4.08388714e-03
Density             : 1.24561741e-05
CONST               ; 1.13541624e+02
ENERGY              ; 1.70000000e+00 GeV
BETA                ; 9.99999955e-01
GAMMA               ; 3.32681701e+03
COULOMB LOG         ; 1.74257370e+01
X-emittance         ; 5.90832712e-09 m*rad
Y-emittance         ; 9.41556346e-14 m*rad
Momentum spread     ; 6.98402090e-04
Bunch length        ; 3.05455893e-03 m
Particles per bunch ; 1.00000000e+10
Bunch current       ; 2.00133521e-03 A
Radius max          : 4.08388714e-03
Density             : 1.24561699e-05
CONST               ; 5.86572496e+01
ENERGY              ; 1.70000000e+00 GeV
BETA                ; 9.99999955e-01
GAMMA               ; 3.32681701e+03
COULOMB LOG         ; 9.00238847e+00
X-emittance         ; 5.90832712e-09 m*rad
Y-emittance         ; 9.41556346e-14 m*rad
Momentum spread     ; 6.98402090e-04
Bunch length        ; 3.05455893e-03 m
Particles per bunch ; 1.00000000e+10
Bunch current       ; 2.00133521e-03 A
    r0                  ; 2.81794033e-15 m*rad
    X-emittance         ; 5.90832712e-09 m*rad
    Y-emittance         ; 9.41556346e-14 m*rad
    SIGS                ; 3.05455893e-03 m*rad
    SIGE                ; 1.00000000e-04 m*rad
    ENERGY              : 1.70000000e+00
    GAMMA               : 3.32681701e+03
    CONST               : 7.39062138e+02
    COULOMB LOG         : 1.62409518e+01

Ring average values
    betx   = 9.16428881e+00   bety   = 1.16281945e+01   Dx  = 7.86541414e-02   Dy  = 0.00000000e+00

    (Weighted) average rates (1/sec)
    Longitudinal =    31375.064717
    Horizontal   =      171.153605
    Vertical     =     2485.116344

    (Weighted) average lifetimes (sec)
    Longitudinal =        0.000032
    Horizontal   =        0.005843
    Vertical     =        0.000402
Radiation Damping Times
=======================
Tau_rad_x            :         7.967527e-03 (s)
Tau_rad_y            :         7.993224e-03 (s)
Tau_rad_s            :         3.990177e-03 (s)

Longitudinal Parameters
=======================
Synchrotron Tune     :         6.390254e-03 ()
Synchrotron Freq     :         5.015421e+04 (Hz)
SigEOE2              :         4.877655e-07 ()
SigEOE               :         6.984021e-04 ()
eta                  :         7.316943e-04 ()
Sigs                 :         5.000000e-03 ()
Sigs_inf             :         3.054559e-03 ()
SigE0                :         6.984021e-04 ()
Sige0 - check        :         6.984021e-04 ()

    (Weighted) average rates - emittances (1/sec)
    Longitudinal =        7.194518
    Horizontal   =        0.170577
    Vertical     =        0.006858

    (Weighted) average growth - emittances (sec)
    Longitudinal =        0.138995
    Horizontal   =        5.862444
    Vertical     =      145.810448

Max tau : 1.000000e+00
dt      : 3.990177e-03
Max step: 2506

Coupling:     0.000000

[>                                                                     ]0 %]0 %

Note:

The SigE0 in the above output are calculated using different methods (sigs_to_sige and using RF settings). Both results are included as a double check.

[24]:
from ibs import plot
plot(df,sim_input, save=False)
plotting
../_images/notebooks_Tutorial_44_1.png