Skip to content
Snippets Groups Projects
Commit 3c86f44d authored by Patrick Robbe's avatar Patrick Robbe
Browse files

Add python script for high rate test

parent 24d02b32
No related branches found
No related tags found
No related merge requests found
from ctypes import *
b2 = CDLL("libpcie40.so")
dma_reset = b2.pcie40_b2dmabufferreset
dma_read = b2.pcie40_b2dmabufferread
DMASIZE = 0x2000
nErr = 0
currentEventIndex = 0
import os, itertools
from timeit import default_timer as timer
CRC16_XMODEM_TABLE = [
0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,
0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,
0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,
0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,
0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,
0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,
0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,
0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,
0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,
0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,
0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,
0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,
0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,
0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,
0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,
0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,
0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,
0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,
0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,
0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,
0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,
0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,
0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,
0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,
0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,
0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,
0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,
0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,
0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,
0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,
0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,
0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0,
]
def _crc16(data, crc, table):
"""Calculate CRC16 using the given table.
`data` - data for calculating CRC, must be a string
`crc` - initial value
`table` - table for caclulating CRC (list of 256 integers)
Return calculated value of CRC
"""
for byte in data:
byte1 = byte & 0xFF
byte2 = ( byte & 0xFF00 ) >> 8
crc = ((crc<<8)&0xff00) ^ table[((crc>>8)&0xff)^byte2]
crc = ((crc<<8)&0xff00) ^ table[((crc>>8)&0xff)^byte1]
return crc & 0xffff
def decode_data( dataraw , data ):
global currentEventIndex
# Remove intermediate lines
datamsb = list( itertools.islice( dataraw , currentEventIndex , None , 16 ) )
datalsb = list( itertools.islice( dataraw , currentEventIndex + 8 , None , 16 ) )
datamsb += list( itertools.islice( dataraw , 0 , currentEventIndex , 16 ) )
datalsb += list( itertools.islice( dataraw , 8 , currentEventIndex + 8 , 16 ) )
# Group in 32 bit words
data += [ ( ( x & 0xFFFF ) | ( ( y & 0xFFFF ) << 16 ) ) for x, y in zip( datalsb, datamsb) ]
# Find beginning and end of event
sizel = [ i for i, n in enumerate( data ) if n == data[0] ]
if len( sizel ) > 1:
size = sizel[ 1 ] + 2
if size > 8:
currentEventIndex = ( ( sizel[ 1 ] + 2 ) * 16 + currentEventIndex ) % DMASIZE
return size
return 0
import socket
hname = socket.gethostname()
# Stop trigger (adapt this line to your system)
if ( hname == 'belle2daq.local' ):
os.system( "ssh vme \"resetft -80\"" ) ### ADD this to suppress output >/dev/null 2>&1" )
else: ### KEK
os.system( "ssh vme \"resetft -53\"" )
## temporisation of 2s
import time
time.sleep( 2 )
b2.ecs_open( 0 , 2 )
b2.ecs_open( 0 , 0 )
dma_reset( 0 )
# Send trigger (adapt this line to your system)
if ( hname == 'belle2daq.local' ):
os.system( "ssh vme \"trigft -80 pulse 1 -1\"" ) ### ADD this to suppress output >/dev/null 2>&1" )
else: ### KEK
os.system( "ssh vme \"trigft -53 pulse 1 -1\"" )
dataraw = ( c_int * DMASIZE )( *range( DMASIZE ) )
data = []
data_crc = []
size = 0
start = timer()
nEvt = 0
for nev in range( 100000 ):
if nev % 100 == 1: print "Event number {0}".format(nev)
# Read DMA
dma_read( 0 , dataraw )
del data[:]
size = decode_data( dataraw , data )
if size <= 8: continue
del data_crc[:]
nEvt = nEvt + 1
for i in range( size ):
if ( i <= (size-3)) :
data_crc.append( ( data[ i ] & 0xFFFF0000 ) >> 16 )
data_crc.append( ( data[ i ] & 0xFFFF ) )
if ( data[size-1]&0xFFFF ) != ( _crc16( data_crc, 0xffff , CRC16_XMODEM_TABLE ) ):
print 'Error in CRC comparison'
nErr = nErr + 1
end = timer()
print 'number of errors = {0} out of {1} events'.format( nErr , nEvt )
print 'elapsed time = {0} s'.format( end - start )
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment