from ColdTOFU import ShadowImage, FluorescenceImage, rcParams
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
Shadow imaging, also known as absorption imaging, is a commonly used imaging used in cold atoms research to estimate number of atoms and characterize the atomic sample's temperature and size. In this imaging sequence, we take three images for every measurement. First is the absorption image where a quasi resonant probe laser is shone at the atoms and transmission is recorded. The second image is the reference image of the probe laser. The third image is a background image to account for the stray light in the lab. The background image is subtracted from the first two and optical depth (OD) in the image plane is calculated using Lambert-Beer's law
$$ I_t(x, y) = I_0(x, y)e^{-OD(x, y)}$$
where $I_0(x, y)$ and $I_t(x, y)$ are the reference probe intensity (or the incident probe intensity) and transmitted intensity, respectively. The class ShadowImage(pathOfImage)
provides interface between standard multi-frame image files like widely used .tiff image files and proprietary .sif image file acquired with Andor Cameras. It provides methods to access image frames and extract OD, incident probe image, probe intensity etc. See documentation for all the available methods. In the following code, an example usage of ShadowImage
class is demonstrated.
im = ShadowImage('shadow_imag_#3030.tif')
frames = im.frames # shows all the frames of the multi-image tiff file same as im.images() method
print('Total number of images in the tiff file:', len(frames))
labels = ['shadow', 'reference', 'background']
for i in range(3):
plt.figure()
plt.imshow(frames[i])
plt.colorbar(label='camera counts')
plt.text(10, 200, labels[i]+' image', color='w')
if i == 0:
plt.arrow(380, 115, 30, 30, color='w')
plt.text(412, 147, 'atoms', color='w')
Total number of images in the tiff file: 36
rcParams().params
{'binning': 2, 'magnification': 2.07, 'pixelSize': 6.5e-06, 'quantum efficiency': 0.85, 'mass number': 87}
In the considered example, the time of flight is varied and the variation is repeated after all the times of flight are finished. In case where each time of flight is repeated continuously for nAveraging number of times and then the time of flight is changed to next value, use averagedSignalOD2()
method to extract OD with appropriate averaging. Choose appropriate ROI for each time of flight using ROIupdater
tool or by manually slicing the OD
ndarray with ROI and proceed for the further analysis of the OD images. See calculation of number of atoms and temperature example for example.
OD = im.averagedSignalOD(nAveraging=3)
# averagedSignalOD returns OD after averaging the absorption images and reference images given by nAveraging
print('number of absorption images:', len(OD))
TOF = 7+np.arange(len(OD))*2
for i in range(len(OD)):
plt.figure()
plt.imshow(OD[i])
plt.colorbar(label='OD')
plt.text(10, 210, 'Time of flight: '+str(TOF[i])+' ms', color='w')
number of absorption images: 4
im.description()
'No description to show!'
# read the tags of the tiff image files
im.tags
{'ImageWidth': (480,), 'ImageLength': (224,), 'BitsPerSample': (16,), 'Compression': (1,), 'PhotometricInterpretation': (1,), 'StripOffsets': (53,), 'Software': ('pco.camware File 4.10 Copyright (C) 2018 PCO',), 'SamplesPerPixel': (1,), 'RowsPerStrip': (224,), 'StripByteCounts': (215040,), 'NewSubfileType': (0,), 'unknown': b'\x80\x03\x00\x00\xe6\x07\x04\x00\x05\x00\x16\x00\x11\x00,\x00/\x00|\x02\x13\x12!\x01\xe0\x01\x00\x00\xe0\x00\x00\x00PCO-PCO-PCO-PCO-PCO-PCO-PCO\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x95\x01\x00\x00\x94\x00\x00\x00\xb0\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00Y@\x00\x00\x00\x00\x00\x00Y@\x00\x00\x00\x00\x00\x00Y@\x00\x00\x00\x00\x00\x00Y@\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00d\x19\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00d\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x01\x00A\x00\x00\x16d\x00\x01\x00\x00\x00\x91bc\x00\x01\x00`\x01$\x1c\x00\x00\x00\x00\x00\x00\x02\x02\x02\x00\x80\xe7\xbd\x02D\xbb\xdb\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'}
im2 = FluorescenceImage('fluorescence_imag_306.sif')
frames = im2.frames #frames in the fluorescence image sequence
print('Total number of frames in .sif file:', len(frames))
labels = ['fluorescence', 'reference']
for i in range(2):
plt.figure()
plt.imshow(frames[i])
plt.colorbar(label='camera counts')
plt.text(10, 60, labels[i]+' image', color='w')
if i == 0:
plt.arrow(50, 35, 10, -10, color='w')
plt.text(62, 25, 'atoms', color='w')
Total number of frames in .sif file: 120
im2.tags
{'Type': 0, 'Active': 0, 'Version': 1, 'Time': 1602280416, 'FormattedTime': 'Sat Oct 10 05:53:36 2020', 'FileName': 'Z:\\Measurements\\GF\\Reproduce Killian\\20200824\\fluorescence_imag_306.sif', 'Temperature': -80.0, 'UnstabalizedTemperature': -999.0, 'Head': 0, 'HeadModel': 'DU897_EXF', 'StoreType': 0, 'DataType': 0, 'SIDisplacement': 0, 'SINumberSubFrames': 1, 'PixelReadOutTime': 1e-06, 'TrackHeight': 0, 'ReadPattern': 4, 'ReadPatternFullName': 'Image', 'ShutterDelay': 0, 'CentreRow': 256, 'RowOffset': 0, 'Operation': 4, 'Mode': 3, 'ModeFullName': 'Kinetics', 'TriggerSource': 1, 'TriggerSourceFullName': 'External', 'TriggerLevel': 0.0, 'ExposureTime': 0.0001, 'Delay': 0.05959, 'IntegrationCycleTime': 0.05959, 'NumberIntegrations': 1, 'KineticCycleTime': 0.05959, 'FlipX': 0, 'FlipY': 1, 'Clock': 0, 'AClock': 1, 'IOC': 0, 'Frequency': 0.0, 'NumberPulses': 0, 'FrameTransferAcquisitionMode': 1, 'BaselineClamp': 1, 'PreScan': 0, 'EMRealGain': 1, 'BaselineOffset': 0, 'SWVersion': 1, 'SWVersionEx': '4.25.10002.0', 'MCP': 0, 'Gain': 50, 'VerticalClockAmp': 4, 'VerticalShiftSpeed': 3.3e-06, 'OutputAmplifier': 0, 'PreAmplifierGain': 3.0, 'Serial': 7969, 'DetectorFormatX': 512, 'DetectorFormatZ': 512, 'NumberImages': 120, 'NumberSubImages': 1, 'SubImageHBin': 1, 'SubImageVBin': 1, 'SubImageLeft': 340, 'SubImageRight': 430, 'SubImageTop': 203, 'SubImageBottom': 133, 'Baseline': 200, 'CCDLeft': 1, 'CCDRight': 512, 'CCDTop': 512, 'CCDBottom': 1, 'Sensitivity': 4.11, 'DetectionWavelength': 550.0, 'CountConvertMode': 0, 'IsCountConvert': 1, 'XAxisType': 'Pixel number', 'XAxisUnit': ' ', 'YAxisType': 'Counts', 'YAxisUnit': '', 'ZAxisType': 'Pixel number', 'ZAxisUnit': ' ', 'UserText': '', 'IsPhotonCountingEnabled': 0, 'NumberThresholds': 0, 'Threshold1': 0.0, 'Threshold2': 0.0, 'Threshold3': 0.0, 'Threshold4': 0.0, 'AveragingFilterMode': 0, 'AveragingFactor': 1, 'FrameCount': 1, 'NoiseFilter': 0, 'Threshold': 0.0, 'TimeStamp': 0}