utils module#
Collection of functions that might be useful, or might not.
- class presto.utils.ProgressBar(size, update_time=1.0)#
Bases:
object
Prints a progress bar to stderr, keeping track of remaining time.
- Parameters:
Example
>>> pb = ProgressBar(100) >>> pb.start() >>> for _ in range(100): >>> time.sleep(0.1) # <-- do work here! >>> pb.increment() >>> pb.done()
- done()#
Terminate the progress bar and print total time.
- increment(inc=1)#
Increment the progress bar.
Will not change the text on stderr if too little time has passed since last update.
- Parameters:
inc (
int
) – how many “units of work” have been done since last call
- start()#
Start counting time.
- presto.utils.as_flat_list(x)#
Return
x
as a flat unidimensional list.
- presto.utils.compatible_dac_configs(freq_MHz)#
- presto.utils.eprint(*objects)#
- presto.utils.eprint_error(title, body, warn=False, inline=False)#
- presto.utils.format_precision(n, s)#
Format a value and uncertainty to the correct number of significant digits.
- Parameters:
- Return type:
- Returns:
a formatted string with numbers rounded to significant digits.
Examples
>>> format_precision(36.91226461435421, 0.4060358649863922) '36.9 ± 0.4'
- presto.utils.format_sec(s)#
Format a time interval in seconds into a more human-readable string.
- Parameters:
- Return type:
- Returns:
time interval in the form “Xh Ym Z.zs”.
Examples
>>> format_sec(np.pi * 1e+8) '9y 348d 20h 27m 45.4s' >>> format_sec(np.exp(-10)) '45.4us'
- presto.utils.get_sourcecode(script_filename)#
Open a file and return its content.
- presto.utils.plot_sequence(pls)#
Plots pulse sequence for interactive inspection.
See Plot pulse sequences for more documentation.
- Parameters:
pls (pulsed.Pulsed) – Pulsed object that contains the pulse sequence to be plotted.
- Returns:
The matplotlib Figure instance.
- Return type:
Examples
>>> from presto import pulsed >>> from presto.utils import plot_sequence, sin2 >>> >>> with pulsed.Pulsed(dry_run=True) as pls: >>> # define the pulse and set parameters >>> pulse = pls.setup_template(1, 0, 0.5 * sin2(100)) >>> pls.setup_scale_lut(1, 0, 0.707) >>> pls.set_store_ports(1) >>> pls.set_store_duration(100e-9) >>> >>> # define the pulse sequence >>> pls.store(0.0) >>> pls.output_pulse(26e-9, pulse) >>> >>> # plot the pulse sequence >>> plot_sequence(pls)
- Raises:
ImportError – if
matplotlib
is not installed.
- presto.utils.recommended_dac_config(freq, *, print_all=False, plot=False)#
Recommended DAC configuration.
- Parameters:
freq (
float
) – signal frequency in Hzprint_all (
bool
) – set toTrue
to print all valid DAC configurations forfreq
, together with frequency of spurious tones and suggested reconstruction filtersplot (
bool
) – set toTrue
to show amatplotlib
figure with DAC zones and frequencies of signal and spurious tones
- Returns:
A tuple of
(dac_mode, dac_fsample)
wheredac_mode
(hardware.DacFSample
)dac_fsample
(hardware.DacMode
)
represent the most recommended DAC configuration.
- Raises:
ValueError – if
freq
is negative or above 9.6 GHz.
Examples
Print detailed information:
>>> recommended_dac_config(5.2e9, print_all=True) Valid DAC configurations for signal at 5200.0 MHz: * Mixed42-G8 (score 1680): - low-frequency spur: 2800.0 MHz - high-frequency spur: 10800.0 MHz - compatible band-pass filters: ['VBFZ-5500-S+', 'ZBSS-6G-S+', 'ZVBP-5G-S+'] * Mixed02-G6 (score 1173): - low-frequency spur: 800.0 MHz - high-frequency spur: 6800.0 MHz - compatible band-pass filters: ['ZVBP-5G-S+']
Use suggested configuration directly:
>>> dac_mode, dac_fsample = recommended_dac_config(5.2e9) >>> print(f"Best DacMode is {dac_mode.name}, DacFSample is {dac_fsample.name}") DacMode is Mixed42, DacFSample is G8 >>> from presto import lockin, pulsed >>> lck = lockin.Lockin(dac_mode=dac_mode, dac_fsample=dac_fsample) >>> pls = pulsed.Pulsed(dac_mode=dac_mode, dac_fsample=dac_fsample)
- presto.utils.rotate_opt(data, return_x=False)#
Rotates
data
so that all the signal is in the I quadrature (real part).
- presto.utils.si_prefix_scale(data)#
Calculare the appropriate SI prefix for
data
.- Parameters:
data – an integer, a float, a list or array of those, …
- Return type:
- Returns:
a tuple (prefix, scale)
Examples
>>> si_prefix_scale(3.1415e-5) ('μ', 1000000)
>>> value = 2.718e-7 >>> (unit, scale) = si_prefix_scale(value) >>> print(f"The length is {scale * value} {unit}m") The length is 271.8 nm
- presto.utils.sin2(nr_samples, drag=0.0)#
Create a \(\sin^2\) envelope/template.
- presto.utils.sinP(P, nr_samples)#
Create a \(\sin^P\) envelope/template.
- presto.utils.ssh_reboot(address)#
Reboot the Linux system on the hardware.
Establish an SSH connection to
address
on port 22 and execute the commandsudo /sbin/shutdown -r now &
.- Parameters:
address (
str
) – IP address or hostname of the hardware
Note
Requires Python package fabric to be installed.
- Raises:
ImportError – Python module
fabric
not found.
- presto.utils.to_pm_pi(phase)#
Converts a phase in radians into the [-π, +π) interval.
- presto.utils.triangle(nr_samples)#
Create a triangular envelope/template.
- presto.utils.untwist_downconversion(I_port, Q_port)#
Convert a measured IQ pair into a low/high sideband pair.