Skip to content
Snippets Groups Projects
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)