Beispiel #1
0
def readQdrSnap(fpga):
    #(roach,memName,nSamples,nBytesPerSample=4,bQdrFlip=False)
    nQdrSamples = 2**20
    nBytesPerQdrSample = 8
    nBitsPerQdrSample = nBytesPerQdrSample*8
    qdr0Vals = np.array(readMemory(fpga,'qdr0_memory',nQdrSamples,nBytesPerQdrSample,bQdrFlip=True,dtype=np.object),dtype=object)
    qdr1Vals = np.array(readMemory(fpga,'qdr1_memory',nQdrSamples,nBytesPerQdrSample,bQdrFlip=True,dtype=np.object),dtype=object)
    qdr2Vals = np.array(readMemory(fpga,'qdr2_memory',nQdrSamples,nBytesPerQdrSample,bQdrFlip=True,dtype=np.object),dtype=object)
    #qdr0 has the most significant 64 bits, followed by qdr1, and last qdr2
    #smush them all toghether into 192 bit words
    wholeQdrWords = (qdr0Vals<<(nBitsPerQdrSample*2))+(qdr1Vals<<(nBitsPerQdrSample))+qdr2Vals

    nBitsPerSample = 12 #I or Q sample
    nSamplesPerWholeWord = 16 # 8 IQ pairs per clock cycle
    bitmask = int('1'*nBitsPerSample,2)
    bitshifts = nBitsPerSample*np.arange(nSamplesPerWholeWord)[::-1]
    samples = (wholeQdrWords[:,np.newaxis]) >> bitshifts
    samples = samples & bitmask
    samples = reinterpretBin(samples,nBits=nBitsPerSample,binaryPoint=0)
    samples = samples.flatten(order='C')
    iVals = samples[::2]
    qVals = samples[1::2]


    return {'iVals':iVals,'qVals':qVals}
Beispiel #2
0
def readQdrSnap(fpga):
    #(roach,memName,nSamples,nBytesPerSample=4,bQdrFlip=False)
    nQdrSamples = 2**20
    nBytesPerQdrSample = 8
    nBitsPerQdrSample = nBytesPerQdrSample*8
    qdr0Vals = np.array(readMemory(fpga,'qdr0_memory',nQdrSamples,nBytesPerQdrSample,bQdrFlip=True),dtype=np.uint64)
    qdr1Vals = np.array(readMemory(fpga,'qdr1_memory',nQdrSamples,nBytesPerQdrSample,bQdrFlip=True),dtype=np.uint64)
    qdr2Vals = np.array(readMemory(fpga,'qdr2_memory',nQdrSamples,nBytesPerQdrSample,bQdrFlip=True),dtype=np.uint64)
    #qdr0 has the most significant 64 bits, followed by qdr1, and last qdr2
    #smush them all toghether into 192 bit words
    wholeQdrWords = (qdr0Vals<<(nBitsPerQdrSample*2))+(qdr1Vals<<(nBitsPerQdrSample))+qdr2Vals
    print 'qdrdtype', wholeQdrWords.dtype

    nBitsPerSample = 12 #I or Q sample
    nSamplesPerWholeWord = 16 # 8 IQ pairs per clock cycle
    bitmask = int('1'*nBitsPerSample,2)
    # bitshifts = nBitsPerSample*np.arange(nSamplesPerWholeWord)[::-1]
    # bitshifts = np.array(bitshifts, dtype=np.uint64)
    qdr0Bitshifts = np.arange(nBitsPerQdrSample%nBitsPerSample, nBitsPerQdrSample, nBitsPerSample)[::-1]
    qdr1Bitshifts = qdr0Bitshifts + nBitsPerQdrSample%nBitsPerSample
    qdr2Bitshifts = qdr1Bitshifts + nBitsPerQdrSample%nBitsPerSample
    qdr0Bitshifts = np.append(qdr0Bitshifts, 0)
    qdr1Bitshifts = np.append(qdr1Bitshifts, 0)
    qdr2Bitshifts = np.append(qdr2Bitshifts, 0)
    
    qdr0Bitshifts = np.array(qdr0Bitshifts, dtype=np.uint64)
    qdr1Bitshifts = np.array(qdr1Bitshifts, dtype=np.uint64)
    qdr2Bitshifts = np.array(qdr2Bitshifts, dtype=np.uint64)
    
    # print 'qdr0Bitshifts', qdr0Bitshifts
    # print 'qdr1Bitshifts', qdr1Bitshifts
    # print 'qdr2Bitshifts', qdr2Bitshifts

    qdr0Samples = ((qdr0Vals[:,np.newaxis]) >> qdr0Bitshifts)&bitmask
    qdr1Samples = ((qdr1Vals[:,np.newaxis]) >> qdr1Bitshifts)&bitmask
    qdr2Samples = ((qdr2Vals[:,np.newaxis]) >> qdr2Bitshifts)&bitmask
    
    qdr0Samples[:,-1] = (((qdr0Samples[:,-1]&(2**(nBitsPerQdrSample%nBitsPerSample)-1)))<<8) + (qdr1Samples[:,0]&(2**(nBitsPerSample-nBitsPerQdrSample%nBitsPerSample)-1))
    qdr1Samples = np.delete(qdr1Samples, 0, axis=1)
    qdr1Samples[:,-1] = (((qdr1Samples[:,-1]&(2**(2*nBitsPerQdrSample%nBitsPerSample)-1)))<<4) + (qdr2Samples[:,0]&(2**(nBitsPerSample-2*nBitsPerQdrSample%nBitsPerSample)-1))
    qdr2Samples = np.delete(qdr2Samples, 0, axis=1)
    samples = np.concatenate((qdr0Samples, qdr1Samples, qdr2Samples), axis=1)
    samples = samples.flatten(order='C')
    samples = reinterpretBin(samples,nBits=nBitsPerSample,binaryPoint=0)
    iVals = samples[::2]
    qVals = samples[1::2]

    # samples = (wholeQdrWords[:,np.newaxis]) >> bitshifts
    # samples = samples & bitmask
    # samples = reinterpretBin(samples,nBits=nBitsPerSample,binaryPoint=0)
    # samples = samples.flatten(order='C')
    # iVals = samples[::2]
    # qVals = samples[1::2]


    return {'iVals':iVals,'qVals':qVals}
def parsePacketData(words,verbose=False):

    nWords = len(words)

    fakePhotonWord = 2**63-1
    headerFirstByte = 0xff

    firstBytes = words >> (64-8)
    if verbose:
        print nWords,' words parsed'
    headerIdx = np.where(firstBytes == headerFirstByte)[0]
    headers = words[firstBytes == headerFirstByte]
    if verbose:
        print len(headerIdx),'headers'

    if verbose:
        fig,ax = plt.subplots(1,1)
        ax.plot(np.diff(headerIdx))
        ax.set_title('frame size')
        print np.max(np.diff(headerIdx)),'max frame size'

    fakeIdx = np.where(words == fakePhotonWord)[0]
    if verbose:
        print len(fakeIdx),'fake photons'

    #header format: 8 bits all ones, 8 bits roach num, 12 bits frame num, ufix36_1 bit timestamp
    nBitsHdrTstamp = 36
    binPtHdrTstamp = 1
    nBitsHdrNum = 12
    nBitsHdrRoach = 8

    roachNumMask = binTools.bitmask(nBitsHdrRoach)
    roachNums = (headers >> (nBitsHdrNum+nBitsHdrTstamp)) & roachNumMask
    roachList = np.unique(roachNums)
    if verbose:
        print np.unique(roachNums)

    frameNumMask = binTools.bitmask(nBitsHdrNum)
    frameNums = (headers >> nBitsHdrTstamp) & frameNumMask
    frameNumDiff = np.diff(frameNums)

    #for roach in roachList:
    #    frameNumsByRoach.append(frameNums[roachNums==roach])

    nMissedFrames = np.sum(np.logical_and(frameNumDiff != 1,frameNumDiff != -((2**nBitsHdrNum) - 1)))
    if verbose:
        fig,ax = plt.subplots(1,1)
        ax.plot(np.diff(frameNums))
        ax.set_title('frame nums')
        print nMissedFrames,'missed frames'


    realIdx = np.where(np.logical_and(firstBytes != headerFirstByte, words != fakePhotonWord))[0]
    realPhotons = words[realIdx]
    nRealPhotons = len(realPhotons)
    if verbose:
        print nRealPhotons,'real photons parsed'
    #photon format: 20 bits id, 9 bits ts, fix18_15 phase, fix17_14 base
    nBitsPhtId = 20
    nBitsXCoord = 10
    nBitsYCoord = 10
    nBitsPhtTstamp = 9
    nBitsPhtPhase = 18
    binPtPhtPhase = 15
    nBitsPhtBase = 17
    binPtPhtBase = 14

    #find each photon's corresponding header
    photonIdMask = binTools.bitmask(nBitsPhtId)
    pixelIds = (realPhotons >> (nBitsPhtTstamp+nBitsPhtPhase+nBitsPhtBase)) & photonIdMask
    xMask = binTools.bitmask(nBitsXCoord)
    yMask = binTools.bitmask(nBitsYCoord)

    xCoords = (pixelIds >> nBitsYCoord) & xMask
    yCoords = pixelIds & yMask
    #selectId = 34
    #selectMask = pixelIds==selectId
    #realIdx = realIdx[selectMask]
    #realPhotons = realPhotons[selectMask]

    photonsHeaderIdx = np.searchsorted(headerIdx,realIdx)-1

    photonsHeader = headers[photonsHeaderIdx]
    #now get the timestamp from this
    headerTimestampBitmask = int('1'*nBitsHdrTstamp,2)
    headerTimestamps = ((headerTimestampBitmask & photonsHeader)/2.)

    headerFrameNumBitmask = int('1'*nBitsHdrNum,2)
    headerFrameNums = headerFrameNumBitmask & (photonsHeader>>nBitsHdrTstamp)

    photonTimestampMask = binTools.bitmask(nBitsPhtTstamp)
    photonTimestamps = (realPhotons >> (nBitsPhtPhase+nBitsPhtBase)) & photonTimestampMask

    photonTimestamps = photonTimestamps*1.e-3 + headerTimestamps #convert us to ms
    dt = np.diff(photonTimestamps)
    if verbose:
        fig,ax = plt.subplots(1,1)
        ax.plot(photonTimestamps)
        ax.set_title('timestamps')

    phtPhaseMask = int('1'*nBitsPhtPhase,2)
    phases = (realPhotons >> nBitsPhtBase) & phtPhaseMask
    phasesDeg = 180./np.pi * binTools.reinterpretBin(phases,nBits=nBitsPhtPhase,binaryPoint=binPtPhtPhase)

    phtBaseMask = int('1'*nBitsPhtBase,2)
    bases = (realPhotons) & phtPhaseMask
    basesDeg = 180./np.pi * binTools.reinterpretBin(bases,nBits=nBitsPhtBase,binaryPoint=binPtPhtBase)

    image = np.zeros((nRows,nCols))
    for x,y in zip(xCoords,yCoords):
        image[y,x] += 1


    return {'basesDeg':basesDeg,'phasesDeg':phasesDeg,'photonTimestamps':photonTimestamps,'pixelIds':pixelIds,'photons':realPhotons,'headers':headers,'roachNums':roachNums,'image':image,'xCoords':xCoords,'yCoords':yCoords}
Beispiel #4
0
photonTimestampMask = binTools.bitmask(nBitsPhtTstamp)
photonTimestamps = (realPhotons >> (nBitsPhtPhase+nBitsPhtBase)) & photonTimestampMask

print 'photon ts',photonTimestamps[0:5]
photonTimestamps = photonTimestamps*1.e-3 + headerTimestamps #convert us to ms
print 'header ts',headerTimestamps[0:5]
print 'ts',photonTimestamps[0:5]
dt = np.diff(photonTimestamps)
print 'diff ts',dt[0:5]
fig,ax = plt.subplots(1,1)
ax.plot(dt)

phtPhaseMask = int('1'*nBitsPhtPhase,2)
phases = (realPhotons >> nBitsPhtBase) & phtPhaseMask
phasesDeg = 180./np.pi * binTools.reinterpretBin(phases,nBits=nBitsPhtPhase,binaryPoint=binPtPhtPhase)
phtBaseMask = int('1'*nBitsPhtBase,2)
bases = (realPhotons) & phtPhaseMask
basesDeg = 180./np.pi * binTools.reinterpretBin(bases,nBits=nBitsPhtBase,binaryPoint=binPtPhtBase)
print 'phase',phasesDeg[0:10]
print 'base',basesDeg[0:10]
print 'IDs',photonIds[0:10]
#print 'phase bin',phases[0:10]
#print 'base bin',bases[0:10]
fig,ax = plt.subplots(1,1)
ax.plot(phasesDeg)
ax.plot(basesDeg)
#ax.plot(photonIds)


plt.show()