#!/usr/bin/env python # -*- coding: utf-8 -*- """ CREATED: 7/2012 AUTHOR: TOMÁŠ ODSTRČIL """ from numpy import * from string import find from pygolem_lite.modules import save_adv_par import os #This function loads the binary data from a Tektronix ".ISF" #file. The ISF file format is used by newer Tektronix #TDS-series oscilloscopes. #USAGE #(v,t,h) = isf_read('ch1.isf.gz', 'gzip') #INPUT #filename - name of Tektronix ISF file, or gziped ISF file #OUTPUT #x - evenly spaced column-vector of x-values #y - corresponding column-vector of y-values #head - header record of file def getfloat(string,pattern): ii = find(string,pattern) + len(pattern) z = string[ii:].split(';')[0] return float(z) def getint(string,pattern): ii = find(string,pattern) + len(pattern) z = string[ii:].split(';')[0] return int(z) def getstr(string,pattern): ii = find(string,pattern) + len(pattern) + 1 z = string[ii:].split(';')[0] return z def getquotedstr(string,pattern): ii = find(string,pattern) + len(pattern) + 1 z = string[ii:].split('"')[1] return z def isf_read(filename): if not os.path.exists(filename): raise IOError, "Missing .isf file" if os.path.getsize(filename) == 0: raise IOError, "Empty .isf file" f = open(filename, "rb") offset = 0 #offset f.seek(offset,0) hdata = f.read(511) class HeadFile: def __init__(self): pass head = HeadFile() head.byte_num = getint(hdata,'BYT_N') head.bit_num = getint(hdata,'BIT_N') head.encoding = getstr(hdata,'ENC') head.bin_format = getstr(hdata,'BN_F') head.byte_order = getstr(hdata,'BYT_O') head.setting = getquotedstr(hdata,'WFI') head.point_format = getstr(hdata,'PT_F') head.x_unit = getquotedstr(hdata,'XUN') head.x_zero = getfloat(hdata,'XZE') head.x_increment = getfloat(hdata,'XIN') head.pt_off = getfloat(hdata,'PT_O') head.y_unit = getquotedstr(hdata,'YUN') head.y_multipt_const = getfloat(hdata,'YMU') head.y_zero = getfloat(hdata,'YZE') head.y_offset = getfloat(hdata,'YOF') head.n_samples = getint(hdata,'NR_P') # nevím jestli jsou potřebné head.vscale = getfloat(hdata,'VSCALE') head.hscale = getfloat(hdata,'HSCALE') head.vpos = getfloat(hdata,'VPOS') head.voffset = getfloat(hdata,'VOFFSET') head.hdelay = getfloat(hdata,'HDELAY') print head.setting if head.encoding !='BIN' or head.bin_format != 'RI' or head.point_format != 'Y': f.close() print 'Unable to process IFS file.' if head.byte_order == 'MSB': # Big Endian encoding machineformat = '<' elif head.byte_order == 'LSB': # little-endian encoding machineformat = '>' else: print 'Unrecognized byte order.' ii = find(hdata,'#') f.seek(ii+1+offset,0) skip= int(f.read(1))+1 f.seek(skip,1) data_type = machineformat+'i'+str(head.byte_num) data = fromstring(f.read(), dtype= data_type,count = head.n_samples ) f.close() v = head.y_zero + head.y_multipt_const*(data - head.y_offset) #v = v.astype('float32') t = head.x_zero + head.x_increment*arange( head.n_samples) save_adv_par(filename[:-4],t,data, scale = head.y_multipt_const) return single(v),single(t),head def isf2array(filename, compression = None): v,t,h = isf_read(filename, compression) return vstack([t,v]).T #(v,t,h) = isf_read('ch1.isf') #from matplotlib.pyplot import * #plot(t,v) #show()