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}
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}
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()