In this example we calculate the flux near the peak on a rectangular surface 30 [m] downstream from the center of the EPU.

In [1]:

```
# This has nothing to do with OSCARS, but it puts the matplotlib plots inline in the notebook
%matplotlib inline
# Import the OSCARS SR module
import oscars.sr
# Import basic plot utilities (matplotlib). You don't need these to run OSCARS, but it's used here for basic plots
from oscars.plots_mpl import *
```

In [2]:

```
# Create a new OSCARS object. Default to 8 threads and always use the GPU if available
osr = oscars.sr.sr(nthreads=8, gpu=1)
```

Here we create an EPU by adding two ideal undulators, one with a vertical field and one with a horizontal field, out of phase.

For the undulator, *bfield* represents maximum magnetic field [$B_x, B_y, B_z$]. The *period* is also in vector form which allows you to orient the axis of the undulator in any arbitrary direction. The number of periods is given by *nperiods*. This is the number of FULL periods. A terminating field of 1 period length is added to each side in addition to *nperiods*.

Typically clear_magnetic_fields() is called before adding a field in notebooks only to save time when making changes and rerunning sections of the code so it is not strictly necessary.

In [3]:

```
# Phase difference between fields in [rad]
phase = osr.pi()/2.
# Clear any existing fields (just good habit in notebook style) and add an undulator field
osr.clear_bfields()
osr.add_bfield_undulator(bfield=[0, 0.7, 0], period=[0, 0, 0.049], nperiods=21, phase=-phase/2.)
osr.add_bfield_undulator(bfield=[0.7, 0, 0], period=[0, 0, 0.049], nperiods=21, phase=+phase/2.)
# Just to check the field that we added seems visually correct
plot_bfield(osr)
```

Here we add a particle beam making use of some of the defaults, namely:

```
* type='electron'
* t0=0
* d0=[0, 0, 1]
```

One must specify ctstartstop. This is the start and stop time of the calculation. In this example we will start the calculation at t=0 and go to t=2 (given in units of ct) since the beam is relativistic. In this example you can specify the start time as less than 0 which is useful if you want to propogate the particle backwars in time. This is useful for instance if you have a bending magnet before the undulator that you wish to include.

clear_particle_beams() is called, again for convenience, but it is not necessary.

In [4]:

```
# Setup beam similar to NSLSII
osr.clear_particle_beams()
osr.set_particle_beam(x0=[0, 0, -1], energy_GeV=3, current=0.500)
# Set the start and stop times for the calculation
osr.set_ctstartstop(0, 2)
```

Now we calculate the trajectory and plot it. It is enough to call calculate_trajectory(). If you are doing other calculations (flux, spectra, power density) it is not necesary to call this since it is called internally.

In [5]:

```
# Run the particle trajectory calculation
trajectory = osr.calculate_trajectory()
# Plot the trajectory position and velocity
plot_trajectory_position(trajectory)
plot_trajectory_velocity(trajectory)
```

Calculate the spectrum in a given range with the given number of points equally spaced (not a requirement).

In [6]:

```
# Calculate spectrum zoom
spectrum = osr.calculate_spectrum(obs=[0, 0, 30], energy_range_eV=[140, 170], npoints=200)
plot_spectrum(spectrum)
```

In [7]:

```
# Calculate Flux
flux = osr.calculate_flux_rectangle(
plane='XY',
energy_eV=154,
width=[0.01, 0.01],
npoints=[101, 101],
translation=[0, 0, 30]
)
plot_flux(flux)
```

It may be of interested to calculate polarization components for such a device. Below is shown the circular-right and circular left components.

In [8]:

```
# Calculate flux, circular right and left, short versions are: 'cr', 'cl'
flux = osr.calculate_flux_rectangle(
plane='XY',
energy_eV=154,
width=[0.01, 0.01],
npoints=[101, 101],
translation=[0, 0, 30],
polarization='circular-right'
)
plot_flux(flux, title='circular-right Polarization')
flux = osr.calculate_flux_rectangle(
plane='XY',
energy_eV=154,
width=[0.01, 0.01],
npoints=[101, 101],
translation=[0, 0, 30],
polarization='circular-left'
)
plot_flux(flux, title='circular-left Polarization', xlabel='X [m]', ylabel='Y [m]')
```