A pipeline for KID data analysis
Project description
G31_KID_pipeline package
A pipeline for Kinetic Inductance Detectors data analysis and characterization that I developed during my master thesis and PhD.
How to install
The use of this package is recommended under Linux or Mac OS. This software is developed under Mac OS.
Using the pip package
Make sure you are using a >=3.7
Python version and the latest pip
version available by executing, for Mac Os / Linux users, the following command
python3 -m pip install --upgrade pip
or, for Windows users,
py -m pip install --upgrade pip
Then proceed with the package installation by typing
pip install G31_KID_pipeline
and you are done.
Stable versions and changelog
Current stable version is 1.0.2 (October 3rd, 2022)
Overview
A short overview of the package is given here. To import the package just include it in your Python code as follows:
import G31_KID_pipeline as pl
Once the package is imported in your code, you must specify the path to the working directory where all the data files are stored. If the data is in the same folder of your Python script than the easiest way is to use the os.getcwd()
function:
import os
# specify the working directory where data files are stored
pl.paths(working_directory=os.getcwd())
In this way it automatically checks if all the data directories exist. If it doesn't find one or more data directories, it creates them in the same path of your Python script. At the end of this operation you should have the following directories in your script path:
anritsu_MS2034B
cosmic_rays
data_logger
noise
picolog
target
target_S21
vna
vna_S21
your_python_script.py
anritsu_MS2034B
should contain the output files from the Vector Network Analyzer Anritsu MS2034B;cosmic_rays
should contain the output files of cosmic ray events taken using a Tektronix DPO3054 digital oscilloscope;data_logger
should contain the dirfiles coming from the ROACH readout;noise
should contain the extracted noise time streams in.npy
file format;picolog
should contain the PicoLog output files;target
should contain the target sweep files coming from the ROACH readout;target_S21
should contain the target sweep files converted into.npy
files for each channel;vna
should contain the VNA sweep files coming from the ROACH readout;vna_S21
should contain the VNA sweep files converted into.npy
files for each channel.
VNA
object
You can open a VNA
file by defining a VNA
object as
vna = pl.VNA(filename='20220531_04', temperature=270, build_dataset=True)
where the optional temperature
parameter (default is None
) defines the temperature of the VNA sweep expressed in milli kelvin and the optional build_dataset
parameter (default is False
) forces the conversion the raw VNA sweep files into .npy
files by creating a subfolder under the VNA_S21
directory with the same name of the filename
parameter.
Operations with the VNA
object
vna.plotVNA(xlim, mag_filt, phase_filt)
This is a function that plots the amplitude (in dB) and phase (in radians) of a VNA sweep in the frequency range defined by the xlim
parameter. The optional parameters mag_filt
and phase_filt
allow to chose an algorithm to remove the baseline from the VNA sweep magnitude and phase data respectively. They can be equal to one of the following values:
None
: no baseline will be removed;'lowpass_cosine'
: the functionpl.lowpass_cosine()
will be called;'a_lss'
: the functionpl.asymmetric_least_squares_smoothing()
will be called (this is not available forphase_filt
);'airp_lss'
: the functionpl.adaptive_iteratively_reweighted_penalized_least_squares_smoothing()
will be called (this is not available forphase_filt
).
This is an example showing the original (without filtering out the baselines) and the flattened magnitude and phase data using an airp_lss
algorithm for the mag_filt
and a lowpass_cosine
for the phase_filt
.
vna.findPeaks(xlim, mag_filt, phase_filt, peak_width, peak_height, peak_prominence)
This function find the resonances dips in the VNA sweep and marks the found resonances with a cross. xlim
is the frequency range of the plot, mag_filt
and phase_filt
are described in the previous function, peak_width
, peak_height
and peak_prominence
are used to recognise local minima of the sweep data (see scipy.signal.find_peaks()
). Currently only the magnitude data is used to find resonances. Following an example of application of this function where it found 353 resonances.
vna.extractTarget(peaks, peaks_info, extr_width)
With this function it is possible to extract a target sweep from a VNA sweep in order to fit the resonance circles and measure the electrical parameters of a detector. This function takes in input the peaks
and peaks_info
parameters returned by the vna.findPeaks()
function and returns a dictionary with I, Q, magnitude, phase and frequency for all the resonances found. The optional extr_width
parameter (default is 2.5) is the frequency range in unit of FWHM of each extracted resonance. The following plot shows the extracted target sweep from a VNA sweep.
vna.fitS21(extracted_target, channel)
This function performs a complex fit of the S21 scattering parameter on an extracted target resonance from a target sweep. The fitting routine is described under the pl.complexS21Fit()
function section. The channel
parameter can be an integer value between 0 and the number of extracted resonances -1 or 'all'
in order to perform the complex on all the resonances at once.
This is an example of this function, the typical output will be:
Fit S21 complex function for vna_S21/20220531_04/extracted_target/001...
centerd circle parameters
Xc = -4106.814783255634
Yc = 13468.54613369031
radius = 4041.616970887738
rotation angle
angle = 1.4642370255123929
phase fit
[[Fit Statistics]]
# fitting method = leastsq
# function evals = 21
# data points = 40
# variables = 2
chi-square = 3300.41786
reduced chi-square = 86.8531016
Akaike info crit = 180.516996
Bayesian info crit = 183.894755
[[Variables]]
Q_tot: 14783.0227 +/- 415.342964 (2.81%) (init = 5000)
nu_r: 201.026147 +/- 5.3325e-05 (0.00%) (init = 201.0256)
[[Correlations]] (unreported correlations are < 0.100)
C(Q_tot, nu_r) = -0.105
complex fit results
[[Fit Statistics]]
# fitting method = leastsq
# function evals = 221
# data points = 40
# variables = 6
chi-square = 64.3328892
reduced chi-square = 1.89214380
Akaike info crit = 31.0076617
Bayesian info crit = 41.1409384
[[Variables]]
Rea: -42.5742370 +/- 69.2660770 (162.69%) (init = -4509.955)
Ima: 18188.3458 +/- 143.319915 (0.79%) (init = 17237.46)
Q_tot: 13858.0282 +/- 491.054533 (3.54%) (init = 14783.02)
Q_c: 30879.1224 +/- 910.735366 (2.95%) (init = 32585.86)
nu_r: 201.025926 +/- 1.6956e-04 (0.00%) (init = 201.0261)
phi_0: 6.15323124 +/- 0.02365153 (0.38%) (init = 6.133844)
tau: 0.04 (fixed)
[[Correlations]] (unreported correlations are < 0.100)
C(nu_r, phi_0) = -0.929
C(Ima, Q_c) = -0.901
C(Q_tot, Q_c) = 0.892
C(Ima, Q_tot) = -0.782
C(Rea, phi_0) = -0.510
C(Rea, nu_r) = 0.454
C(Rea, Ima) = 0.308
C(Rea, Q_c) = -0.277
C(Q_tot, nu_r) = 0.163
C(Rea, Q_tot) = -0.147
C(Ima, nu_r) = -0.130
C(Q_c, nu_r) = 0.108
Q_i: 25141+/-1725
This function will save the fitted parameters in a .npy
file inside the VNA sweep folder inside the vna_S21
directory.
vna.plotS21(channel)
This function is useful to visualize the result of the complex fit on the extracted resonances of a VNA sweep. The channel
parameter must be an integer number between 0 and the number of extracted resonances (-1). This function calls the pl.complexS21Plot()
routine.
This is an example of a complex fit on an extracted resonance from a VNA sweep.
target
object
You can open a target
file by defining a target
object as
target = pl.Target(filename='20220530_145142', temperature=150, build_dataset=True)
where the optional temperature
parameter (default is None
) defines the temperature of the target sweep expressed in milli kelvin and the optional build_dataset
parameter (default is False
) forces the conversion of the raw target sweep files into .npy
files by creating a subfolder under the target_S21
directory with the same name of the filename
parameter.
When a target
object is defined a series of operations are performed in background. A dictionary entry
will be created as an attribute of the target
object. The dictionary has the following items:
'target_freq'
a list with the target frequencies of the sweep;'channel'
a list indexes that label the resonances;'depth'
a list of the resonance depths in dB;'is_out_of_res'
a list of boolean values for each tone (True
is the tone is out of resonance andFalse
if it is a resonance,False
by default);'number_of_peaks'
a list of integer number representing the number of peaks for each tone (useful to determine if a single tone sees more than one pixel);
the next few items are used to store the output values of the complex fit routine for each resonance:
'Re[a]'
;'Im[a]'
;'Q_tot'
;'Q_i'
;'Q_c'
;'nu_r'
;'phi_0'
;'reduced_chi2'
.
The next operation concerns the search for out of resonance tones with the function target.filterOutOfResTones()
, the search in memory for the already computed S21 complex fit parameters with the function target.readS21Data()
(if present) and the search for double resonances in the target sweep with the target.findDouble()
function. All these functions are explained in the next section.
Operations with the target
object
target.filterOutOfResTones(std_mult)
This function is called when a target
object is defined. It selects and labels all the out of resonance tones (if present). The selection is done by comparing each tone depth with the target sweep average depth. If the depth of a tone is lower than std_mult
times the standard deviation over the target sweep depths then it is labeled as an out of resonance tone and its corresponding value in the list 'is_out_of_res'
will be turned to True
.
target.readS21Data()
This function is called when a target
object is defined. It will try to search for complex fit parameters of each resonance already present in the memory.
target.findDouble()
This function is called when a target
object is defined. It will try to search for double (or more) resonances in each tone of the target sweep. If it find a double resonance the corresponding value in the list 'number_of_peaks'
will be turned to the number of resonances found.
target.plotTarget(flat_at_0db)
This is a function that plots the amplitude (in dB) of a target sweep. The optional boolean parameter flat_at_0db
(False
by default) if True
, allows to plot all the tones with their highest point at the 0dB level. The output plot will be an interactive plot that will show the channel number of a tone when the mouse is over it, like in the example image below.
target.plotChannel(channel)
This function is similar to the previous one with the exception that it plots the IQ data, the amplitude and the phase of a tone indexed by the value of the channel
parameter. The following image shows an example.
target.plotS21(channel)
This function is useful to visualize the result of the complex fit on a channel of a target sweep. The channel
parameter must be an integer number between 0 and the number of channels (-1). This function calls the pl.complexS21Plot()
routine.
This is an example of a complex fit on a target sweep channel.
Fit S21 complex function for target_S21/20220530_145142/001...
centerd circle parameters
Xc = -350852.7043057035
Yc = 436318.853189466
radius = 337206.6320412996
rotation angle
angle = 0.9912039193143776
phase fit
[[Fit Statistics]]
# fitting method = leastsq
# function evals = 19
# data points = 31
# variables = 2
chi-square = 19.1696365
reduced chi-square = 0.66102195
Akaike info crit = -10.9004479
Bayesian info crit = -8.03247352
[[Variables]]
Q_tot: 25316.3945 +/- 78.2077610 (0.31%) (init = 5000)
nu_r: 201.232202 +/- 3.0830e-06 (0.00%) (init = 201.2318)
[[Correlations]] (unreported correlations are < 0.100)
C(Q_tot, nu_r) = -0.170
complex fit results
[[Fit Statistics]]
# fitting method = leastsq
# function evals = 484
# data points = 31
# variables = 6
chi-square = 8.37844104
reduced chi-square = 0.33513764
Akaike info crit = -28.5580856
Bayesian info crit = -19.9541623
[[Variables]]
Rea: -285363.955 +/- 1722.87122 (0.60%) (init = -520071.1)
Ima: 847947.008 +/- 2399.48949 (0.28%) (init = 694830.9)
Q_tot: 25690.3985 +/- 205.204873 (0.80%) (init = 25316.39)
Q_c: 33902.2276 +/- 160.239752 (0.47%) (init = 32579.87)
nu_r: 201.232238 +/- 3.6001e-05 (0.00%) (init = 201.2322)
phi_0: 6.21302085 +/- 0.00710776 (0.11%) (init = 6.220246)
tau: 0.04 (fixed)
[[Correlations]] (unreported correlations are < 0.100)
C(nu_r, phi_0) = -0.892
C(Q_tot, Q_c) = 0.754
C(Ima, Q_c) = -0.524
C(Ima, Q_tot) = -0.502
C(Ima, nu_r) = 0.493
C(Q_tot, nu_r) = -0.487
C(Ima, phi_0) = -0.408
C(Rea, phi_0) = -0.396
C(Rea, nu_r) = 0.342
C(Rea, Ima) = -0.330
C(Rea, Q_c) = 0.215
C(Q_tot, phi_0) = 0.145
C(Q_c, nu_r) = -0.136
Q_i: 106062+/-3833
This function will save the fitted parameters in a .npy
file inside the target sweep folder inside the target_S21
directory.
target.plotS21(channel)
This function is useful to visualize the result of the complex fit on the extracted resonances of a VNA sweep. The channel
parameter must be an integer number between 0 and the number of extracted resonances (-1). This function calls the pl.complexS21Plot()
routine.
This is an example of a complex fit on an extracted resonance from a VNA sweep.
Other operations with the pipeline
class
pl.buildS21Dataset(sweep, ROACH='MISTRAL')
Sweep files are generated by the ROACH readout electronics as a list of .npy
files each one storing the in-quadrature or the in-phase (Q or I respectively) data relative to a single base band frequency. This data is converted into a more readable way in which a single .npy
file stores a single frequency sweep data as I, Q, magnitude in dB, phase in radians and frequency. The sweep
parameter can be both a Target
or a VNA
object and the optional ROACH
parameter (default is 'MISTRAL'
) determines how the sweep frequencies are computed starting from the Local Oscillator frequency and the base bands frequencies:
ROACH='MISTRAL'
-->freqs = LO + bb_feqs
;ROACH='OLIMPO'
-->freqs = 0.5*LO + bb_feqs
.
When defining a new VNA
or Target
class, the function pl.buildS21Dataset(sweep, ROACH='MISTRAL')
will be called automatically only if the S21 dataset is not already present. The conversion of the raw sweep dataset can be forced by setting the build_dataset
parameter to True
.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distributions
Built Distribution
File details
Details for the file G31_KID_pipeline-1.0.3-py3-none-any.whl
.
File metadata
- Download URL: G31_KID_pipeline-1.0.3-py3-none-any.whl
- Upload date:
- Size: 19.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.1 CPython/3.10.5
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 9b89b35a16e646a7e42312e588aa32fa4877bc86df1f0c4633c6ca4c3cf188a7 |
|
MD5 | b8ceaaac83314ef4aa7506d7a0ba903a |
|
BLAKE2b-256 | ca888cf331d2e6107cd86bb3ae0fc3b356eb841defaa5cb5b61e06b1dc8f7423 |