-
System User authoredSystem User authored
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
strip_data.py 4.35 KiB
import sys
import numpy as np
import scipy as sp
import scipy.signal as ss
DDR_FILLING = [0xba98,0xfedc]
pixels = 512
TAIL = [0xba98,0xfedc]*16
DEAD = [0xdea1,0xdead,0xdea2,0xdead,0xdea3,0xdead,0xdea4,0xdead,0xdea5,0xdead,0xdea6,0xdead,0xdea7,0xdead,0xdea8,0xdead]
def strip_data(filename, number_pixels, orbits, offset = None):
###############----------Read data from memory----------############################################
np.set_printoptions(threshold='nan')
# data = np.fromfile(str(filename), dtype=np.uint16)
if offset is None:
data = np.memmap( str(filename), dtype=np.dtype('<u2'), mode='r')
else:
data = np.memmap( str(filename), dtype=np.dtype('<u2'), offset = (2*pixels*offset),mode='r')
###############----------Remove Header----------####################################################
if (data[0] == 0x1111 and data[15] == 0xF888):
print ('Removing header .....')
data = data[16:]
else:
print ('No data header....')
data = data
##############--------Search and remove for TAIL--------############################################
offset = 0
tailoffset = offset
while np.any((data[tailoffset : tailoffset + len(TAIL)] != TAIL)):
tailoffset += 8
if tailoffset + len(TAIL) > len(data):
print('Could not find tail')
#sys.exit(-1)
print('Found tail at offset ' + str(tailoffset))
##############--------Search and remove for DEAD filling--------##################################
deadcnt = 0
deadoffset = tailoffset
while np.any(data[deadoffset - len(DEAD) : deadoffset] == DEAD):
deadcnt +=1
deadoffset -= len(DEAD)
print('Removed %d bytes of DEAD' %(deadcnt))
##############--------Set the pure data --------###################################################
data = np.frombuffer((data[offset:deadoffset]), dtype = np.uint16)
#dead = np.where(data == 0xdea1)
#loc = np.amin(dead)
#data = data[0:loc]
############-------Swap the data bytes and change from 16 bit to 14 bit---------####################
data = data.byteswap()
data = data >> 2
#############---------Index decoder for the jesd data for 16 input mode----------###################
inner_idx_1 = [23, 22, 7, 6, 21, 20, 5, 4, 19, 18, 3, 2, 17, 16 ,1, 0] # working one
inner_idx_2 = [8, 9, 24, 25, 10, 11, 26, 27, 12, 13, 28, 29, 14, 15, 30, 31] # non interleaved
index_1 = np.zeros([256], dtype=np.int64)
index_2 = np.zeros([256], dtype=np.int64)
for i in range(16):
for j in range(16):
index_1[i * 16 + j] = inner_idx_1[i] + j * 32
for i in range(16):
for j in range(16):
index_2[i * 16 + j] = inner_idx_2[i] + j * 32
################------working part---------###########################################################
#index_interleave = np.ravel(np.column_stack((index_1,index_2))) #interleaving the pixels, NOTE: interchange index_1 & index_2 if the pixels are swapped
#k = 32
#pixel_map = []
#a = index_interleave
#for i in range(0, len(a), k):
# pixel_map.extend((a[i:i + k])[::-1])
######################################################################################################
l = 16
adc_2 = []
b = index_2
for i in range(0, len(b), l):
adc_2.extend((b[i:i + l])[::-1])
#index_interleave = np.concatenate((index_1,adc_2),axis = 0) # for concatenated pixels
index_interleave = np.ravel(np.column_stack((index_1,adc_2))) # for interleaved pixels
##############-------------Reshape the data as pixel x orbits-------------------###################
if (orbits):
data = data[0:orbits*512]
data = np.reshape(data,(-1,pixels))
data = data[:,index_interleave]
###### filter out the saw pattern ####################
data = ss.savgol_filter(data, 21, 3) # window size 51, polynomial order 3
orb, pix = np.shape(data)
return (data, orb)