Source code for monashspa.PHS3000.rubidium_spectroscopy
# Copyright 2019 School of Physics & Astronomy, Monash University
#
# This file is part of monashspa.
#
# monashspa is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# monashspa is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with monashspa. If not, see <http://www.gnu.org/licenses/>.
import os
import numpy as np
import pandas
def __matlab_round(val):
import decimal
return int(decimal.Decimal(val).quantize(decimal.Decimal('1'), rounding=decimal.ROUND_HALF_UP))
[docs]
def read_rigol_csv(filepath):
"""Reads the csv file saved from the Rigol digital storage oscilloscope.
Arguments:
filepath: A string containing the path to the csv file
Returns:
A tuple :code:`(X, time, CH1, CH2)` where each element is a 1D numpy
array containing an array of incrementing integers, an array of time
points (x-axis of the oscilloscope), and the y-values for channels 1
and 2 respectively.
"""
# read the data (skip the second line, and only use first 3 columns)
df = pandas.read_csv(filepath, skiprows=[1], usecols=[0,1,2])
X = df[df.columns[0]].values
CH1 = df[df.columns[1]].values
CH2 = df[df.columns[2]].values
# now read the information poorly encoded in the header
df = pandas.read_csv(filepath, nrows=1, usecols=[3,4])
dt = df[df.columns[1]].values[0]
time = X*dt
return X, time, CH1, CH2
[docs]
def extract_frequency(michelson_data, MHz_per_fringe, num_dc_terms_to_remove=1):
"""Returns a frequency calibration determined from Michelson interferometer data
Performs a Hilbert transform (minus the DC term) on the Michelson
interferometer data and scales the resultant frequency array by the
distance (in MHz) between constructive interference fringes.
Arguments:
michelson_data: A 1D numpy array containing the oscilloscope data
from the michelson interferometer
MHz_per_fringe: The distance (in MHz) between constructive interference
fringes in the :code:`michelson_data` calculated from
the path length difference of the Michelson
interferometer arms.
Keyword Arguments:
num_dc_terms_to_remove: The number of low frequency components to remove
after performing the Fourier transform. The
default is 1 (remove the DC term only). Higher
integers remove low order frequency components
Returns:
A 1D numpy array (with the same length as :code:`michelson_data`)
containing a frequency calibration (in MHz) for the saturated absorption
spectra. Use this array as the x-axis for plotting and fitting.
"""
ffty = np.fft.fft(michelson_data)
subffty = np.zeros(michelson_data.shape, dtype=np.complex128)
subffty[__matlab_round(num_dc_terms_to_remove):__matlab_round(len(michelson_data)/2)+1] = ffty[__matlab_round(num_dc_terms_to_remove):__matlab_round(len(michelson_data)/2)+1]
back = np.fft.ifft(subffty)
return np.unwrap(np.angle(back))/(2*np.pi)*MHz_per_fringe