{ "metadata": { "name": "LSL DR Spectrometer Tutorial" }, "nbformat": 2, "worksheets": [ { "cells": [ { "cell_type": "markdown", "source": [ "# Basics" ] }, { "cell_type": "markdown", "source": [ "The LSL interface for DR spectrometer data is similar to that of DRX but there are a few key differences because they data have already been Fourier transformed and averaged in time.", "", "First, download a snippet of DR spectrometer data:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "# This may take a bit...", "import os", "import urllib2", "from lsl.reader import drx", "", "if not os.path.exists('temp.drspec'):", " fh1 = urllib2.urlopen('http://lda10g.alliance.unm.edu/tutorial/B0329+54/056770_000044687')", " fh2 = open('temp.drspec', 'wb')", " fh2.write(fh1.read(drx.FrameSize*300))", " fh1.close()", " fh2.close()", " ", "print \"DR Spectrometer Size: %.1f kB\" % (os.path.getsize('temp.drspec')/1024.)" ], "language": "python", "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "DR Spectrometer Size: 1209.4 kB" ] } ], "prompt_number": 1 }, { "cell_type": "markdown", "source": [ "The contents of the file can be found using a few of the top-level functions in the lsl.reader.drspec module:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "from lsl.reader import drspec", "", "# Open the file", "fh = open('temp.drspec', 'rb')", "", "# What is the size in bytes of each frame?", "print \"Frame size:\", drspec.getFrameSize(fh), \"bytes\"", "", "# What is the sample rate?", "print \"Sample Rate:\", drspec.getSampleRate(fh)/1e6, \"MHz\"", "", "# How many frequency channels are in the data?", "print \"FFT length:\", drspec.getTransformSize(fh), \"channels\"", "print \"-> %.3f kHz/channel\" % (drspec.getSampleRate(fh)/1e3/drspec.getTransformSize(fh),)", "", "# What type of data do we have?", "print \"Linear (XX, YY, etc.)?\", drspec.containsLinearData(fh)", "print \"Stokes (I, V, etc.)?\", drspec.containsStokesData(fh)", "", "# What are the exact data products in the file?", "print \"Data products:\", \", \".join(drspec.getDataProducts(fh))", "", "# Close it out", "fh.close()" ], "language": "python", "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Frame size: 16460 bytes", "Sample Rate: 19.6 MHz", "FFT length: 1024 channels", "-> 19.141 kHz/channel", "Linear (XX, YY, etc.)? True", "Stokes (I, V, etc.)? False", "Data products: XX, YY" ] } ], "prompt_number": 2 }, { "cell_type": "markdown", "source": [ "To read in a single frame, use the modules read function:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "# Open the file and read in a frame", "fh = open('temp.drspec', 'rb')", "frame = drspec.readFrame(fh)", "", "# Load in some basic information", "beam = frame.parseID()", "srate = frame.getSampleRate()", "LFFT = drspec.getTransformSize(fh)", "tInt = frame.header.nInts*LFFT/srate", "", "# Print out some basic information", "print \"Beam:\", beam", "print \"Timestamp:\", frame.getTime()", "print \"Tuning 1:\", frame.getCentralFreq(1)/1e6, \"MHz\"", "print \"Tuning 2:\", frame.getCentralFreq(2)/1e6, \"MHz\"", "print \" \"", "print \"Transform Length:\", LFFT", "print \"Integration Time:\", tInt, \"s\"", "", "# Done", "fh.close()" ], "language": "python", "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Beam: 2", "Timestamp: 1398276221.03", "Tuning 1: 54.4000009298 MHz", "Tuning 2: 73.9999997616 MHz", " ", "Transform Length: 1024", "Integration Time: 0.0401240816327 s" ] } ], "prompt_number": 3 }, { "cell_type": "markdown", "source": [ "The time tags reported in the above example are in seconds since the UNIX epoch. These can be converted to Python datetime instances through:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "from datetime import datetime", "", "# Open the file and read in a frame", "fh = open('temp.drspec', 'rb')", "frame = drspec.readFrame(fh)", "", "# Load in some basic information", "beam = frame.parseID()", "srate = frame.getSampleRate()", "LFFT = drspec.getTransformSize(fh)", "tInt = frame.header.nInts*LFFT/srate", "", "# Print out some basic information", "print \"Beam:\", beam", "print \"Timestamp:\", frame.getTime(), \"(\", datetime.utcfromtimestamp(frame.getTime()), \")\"", "print \"Tuning 1:\", frame.getCentralFreq(1)/1e6, \"MHz\"", "print \"Tuning 2:\", frame.getCentralFreq(2)/1e6, \"MHz\"", "print \" \"", "print \"Transform Length:\", LFFT", "print \"Integration Time:\", tInt, \"s\"", "", "# Done", "fh.close()" ], "language": "python", "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Beam: 2", "Timestamp: 1398276221.03 ( 2014-04-23 18:03:41.034108 )", "Tuning 1: 54.4000009298 MHz", "Tuning 2: 73.9999997616 MHz", " ", "Transform Length: 1024", "Integration Time: 0.0401240816327 s" ] } ], "prompt_number": 4 }, { "cell_type": "markdown", "source": [ "The data product are stored as attributes to the frame.data object. You can either access these directly or through Python's getattr function:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "# Open the file and read in a frame", "fh = open('temp.drspec', 'rb')", "frame = drspec.readFrame(fh)", "", "print \"Tuning 1 XX mean:\", frame.data.XX0.mean()", "print \"Tuning 2 XX mean:\", frame.data.XX1.mean()", "print \" \"", "", "for tuning in (1, 2):", " for prod in frame.getDataProducts():", " data = getattr(frame.data, \"%s%i\" % (prod, tuning-1), None)", " print \"Tuning %i %s standard deviation:\" % (tuning, prod), data.std()", "", "# Done", "fh.close()" ], "language": "python", "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Tuning 1 XX mean: 27.6883773804", "Tuning 2 XX mean: 10.2878665924", " ", "Tuning 1 XX standard deviation: 10.0468772781", "Tuning 1 YY standard deviation: 9.77003064685", "Tuning 2 XX standard deviation: 3.85698524032", "Tuning 2 YY standard deviation: 4.11942237842" ] } ], "prompt_number": 5 }, { "cell_type": "markdown", "source": [ "# Plotting Spectra" ] }, { "cell_type": "markdown", "source": [ "Similar to DRX data you can also plot spectra from a DR spectrometer file. However, unlink DRX data, you do not need to make a call to SpecMaster since they data have already been transformed:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "%matplotlib inline", "import numpy", "from lsl.misc.mathutil import to_dB", "from matplotlib import pyplot as plt", "", "# Open the file", "fh = open('temp.drspec', 'rb')", "", "# Create the array that will hold the data", "products = drspec.getDataProducts(fh)", "nProd = len(products)*2", "nChan = drspec.getTransformSize(fh)", "data = numpy.zeros((nProd, 5, nChan), dtype=numpy.float32)", "", "# Read in the first 5 frames", "for i in xrange(5):", " try:", " frame = drspec.readFrame(fh)", " except errors.syncError:", " continue", " except errors.eofError:", " break", " ", " j = 0", " for tuning in (1, 2):", " for prod in products:", " data[j,i,:] = getattr(frame.data, \"%s%i\" % (prod, tuning-1), None)", " j += 1", "fh.close()", "", "# Integrate across the frames", "spec = data.mean(axis=1)", "", "# Compute the frequency bins", "freq = numpy.fft.fftfreq(spec.shape[1], d=1.0/frame.getSampleRate())", "freq = numpy.fft.fftshift(freq)", "freq1 = freq + frame.getCentralFreq(1)", "freq2 = freq + frame.getCentralFreq(2)", "", "# Plot", "beam = frame.parseID()", "", "fig = plt.figure()", "ax = fig.gca()", "for i in xrange(spec.shape[0]):", " if i / len(products) == 0:", " freq = freq1", " else:", " freq = freq2", " ", " ax.plot(freq/1e6, to_dB(spec[i,:]), label='B%i,T1,%s' % (beam, products[i % len(products)]))", "ax.set_xlabel('Frequency [MHz]')", "ax.set_ylabel('PSD [arb. dB]')", "ax.legend(loc=0)", "plt.show()" ], "language": "python", "outputs": [ { "output_type": "stream", "stream": "stderr", "text": [ "ERROR: Magic function `matplotlib` not found." ] }, { "output_type": "display_data", "png": "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\nRv0/duvKOBqCFNQAAAAASUVORK5CYII=\n" } ], "prompt_number": 6 } ] } ] }