Esempio n. 1
0
def receive():
    while True:
        t = spead.TransportUDPrx(PORT, pkt_count=1024, buffer_size=5120000)
        ig = spead.ItemGroup()
        print "Initializing new item group and waiting for data..."
        s_time = 0
        total_bytes = 0
        for heap in spead.iterheaps(t):
            if s_time == 0: s_time = time.time()
            h_time = time.time()
            ig.update(heap)
            h_time = time.time() - h_time
            total_bytes += heap.heap_len
            print '\nDecoded heap %i of length %i in %f (%f MBps) seconds.' % (heap.heap_cnt, heap.heap_len, h_time, heap.heap_len/(h_time*1024*1024))
            if heap.heap_len == 0: continue
            print 'Items\n====='
            for name in ig.keys():
                item = ig.get_item(name)
                print 'Name:',name,', Transport Type:',(item.dtype is not None and 'numpy' or 'std'),', Shape:',item.shape
                if name == 'data_timestamp':
                    tt = time.time() - (ig[name][0]/1000.0)
                    print 'Transport time for timestamp %i is %f (%f MBps)' % (ig[name][0],tt,heap.heap_len/(tt*1024*1024))
        s_time = time.time() - s_time
        print 'Received stop. Stream processed %i bytes in %f seconds (%f MBps).' % (total_bytes, s_time, total_bytes/(s_time*1024*1024))
        t.stop()
        if options.profile: break
        time.sleep(2)
Esempio n. 2
0
 def _listen(self):
     for heap in S.iterheaps(self.rx):
         logger.debug('BorphSpeadServer._listen: Got a heap')
         self.is_connected = True
         self.update(heap)
     logger.debug('BorphSpeadServer._listen: Listening thread ended')
     self.is_connected = False
Esempio n. 3
0
def receive():
    while True:
        t = spead.TransportUDPrx(PORT, pkt_count=1024, buffer_size=5120000)
        ig = spead.ItemGroup()
        print "Initializing new item group and waiting for data..."
        s_time = 0
        total_bytes = 0
        for heap in spead.iterheaps(t):
            if s_time == 0: s_time = time.time()
            h_time = time.time()
            ig.update(heap)
            h_time = time.time() - h_time
            total_bytes += heap.heap_len
            print '\nDecoded heap %i of length %i in %f (%f MBps) seconds.' % (
                heap.heap_cnt, heap.heap_len, h_time, heap.heap_len /
                (h_time * 1024 * 1024))
            if heap.heap_len == 0: continue
            print 'Items\n====='
            for name in ig.keys():
                item = ig.get_item(name)
                print 'Name:', name, ', Transport Type:', (
                    item.dtype is not None and 'numpy'
                    or 'std'), ', Shape:', item.shape
                if name == 'data_timestamp':
                    tt = time.time() - (ig[name][0] / 1000.0)
                    print 'Transport time for timestamp %i is %f (%f MBps)' % (
                        ig[name][0], tt, heap.heap_len / (tt * 1024 * 1024))
        s_time = time.time() - s_time
        print 'Received stop. Stream processed %i bytes in %f seconds (%f MBps).' % (
            total_bytes, s_time, total_bytes / (s_time * 1024 * 1024))
        t.stop()
        if options.profile: break
        time.sleep(2)
Esempio n. 4
0
 def test_iterheaps(self):
     rx_tport = S.TransportFile(self.filename, "r")
     heaps = [f for f in S.iterheaps(rx_tport)]
     self.assertEqual(len(heaps), 2)
     heap = heaps[0]
     ig = S.ItemGroup()
     ig.update(heap)
     self.assertEqual(ig["var1"], 1)
     self.assertEqual(ig["var2"], 2)
Esempio n. 5
0
 def test_iterheaps(self):
     rx_tport = S.TransportFile(self.filename,'r')
     heaps = [f for f in S.iterheaps(rx_tport)]
     self.assertEqual(len(heaps), 2)
     heap = heaps[0]
     ig = S.ItemGroup()
     ig.update(heap)
     self.assertEqual(ig['var1'], 1)
     self.assertEqual(ig['var2'], 2)
Esempio n. 6
0
def receive():
    print 'RX: Initializing...'
    t = spead.TransportFile(FILENAME, 'r')
    ig = spead.ItemGroup()
    for heap in spead.iterheaps(t):
        ig.update(heap)
        print 'Got heap:', ig.heap_cnt
        for name in ig.keys():
            print '   ', name
            item = ig.get_item(name)
            print '      Description: ', item.description
            print '           Format: ', [item.format]
            print '            Shape: ', item.shape
            print '            Value: ', ig[name]
    print 'RX: Done.'
Esempio n. 7
0
def receive():
    print 'RX: Initializing...'
    t = spead.TransportFile(sys.stdin)
    ig = spead.ItemGroup()
    for heap in spead.iterheaps(t):
        ig.update(heap)
        print 'Got heap:', ig.heap_cnt
        for name in ig.keys():
            print '   ', name
            item = ig.get_item(name)
            print '      Description: ', item.description
            print '           Format: ', item.format
            print '            Shape: ', item.shape
            print '            Value: ', ig[name]
    print 'RX: Done.'
Esempio n. 8
0
def receive():
    print 'RX: Initializing...'
    t = spead.TransportUDPrx(PORT)
    ig = spead.ItemGroup()
    for heap in spead.iterheaps(t):
        #print spead.readable_heap(heap)
        ig.update(heap)
        print 'Got heap:', ig.heap_cnt
        for name in ig.keys():
            print '   ', name
            item = ig.get_item(name)
            print '      Description: ', item.description
            print '           Format: ', item.format
            print '            Shape: ', item.shape
            print '            Value: ', ig[name]
    print 'RX: Done.'
Esempio n. 9
0
    def write_thread(self):
        """Starts up reciever thread and parses through the data.
           Then writes the uv files """
        global c
        global syncup_pulse
        logger.info("RPOCO8-RX.rx_thread: Starting receiver thread")
        for heap in S.iterheaps(rx):
            ig.update(heap)
            ig["acc_num"] = ig.heap_cnt
            # print ig.keys()
            if syncup_pulse:
                if ig.heap_cnt > 0:
                    continue
                elif ig.heap_cnt == 0:
                    syncup_pulse = False
            if ig.heap_cnt == 0:
                continue
            sec = ig["data_timestamp"] / 1000.0
            jd = self.unix2julian(sec)
            logger.info("RPOCO8-RX.rx_thread: Got HEAP_CNT=%d" % (ig.heap_cnt))
            # continue
            # data = N.zeros(shape = 1024, dtype = N.complex64)
            for name in self.now:
                data = N.zeros(shape=1024, dtype=N.complex64)
                if name[0] == name[1]:
                    data.real = N.dstack((ig[name + "_er"], ig[name + "_or"])).flatten()
                    self.uv_update(name, data[::-1], jd)
                else:
                    data.real = N.dstack((ig[name + "_er"], ig[name + "_or"])).flatten()
                    data.imag = N.dstack((ig[name + "_ei"], ig[name + "_oi"])).flatten()
                    self.uv_update(name, data[::-1], jd)

            if c == 0:
                self.filename = "poco.%f.uv" % jd
                print "Writing to filename %s" % self.filename
            c += 1
            if c == 30:
                c = 0
                print "closing uv file"
                self.close_uv(self.filename)
                print "reopening new uv file"
                self.open_uv()
Esempio n. 10
0
 def write_thread(self):
     """Starts up reciever thread and parses through the data.
        Then writes the uv files """
     global c
     logger.info("RPOCO8-RX.rx_thread: Starting receiver thread")
     for heap in S.iterheaps(rx):
         ig.update(heap)
         ig["acc_num"] = ig.heap_cnt
         # print ig.keys()
         sec = ig["data_timestamp"] / 1000.0
         jd = self.unix2julian(sec)
         logger.info("RPOCO8-RX.rx_thread: Got HEAP_CNT=%d" % (ig.heap_cnt))
         # continue
         data = N.zeros(shape=1024, dtype=N.complex64)
         for name in self.now:
             data = N.zeros(shape=1024, dtype=N.complex64)
             if name[0] == name[1]:
                 R = ig[name + "_r"].reshape([NCHAN, 2])
                 data.real = R[:, 0]
                 self.uv_update(name, data[::-1], jd)
                 data.real = R[:, 1]
                 self.uv_update(self.then[self.now.index(name)], data[::-1], jd)
             else:
                 R = ig[name + "_r"].reshape([NCHAN, 2])
                 I = ig[name + "_i"].reshape([NCHAN, 2])
                 data.real = R[:, 0]
                 data.imag = I[:, 0]
                 self.uv_update(name, data[::-1], jd)
                 data.real = R[:, 1]
                 data.imag = I[:, 1]
                 if name in ["ae", "af", "be", "bf", "cg", "ch", "dg", "dh"]:
                     self.uv_update(self.then[self.now.index(name)], N.conj(data)[::-1], jd)
                 else:
                     self.uv_update(self.then[self.now.index(name)], data[::-1], jd)
         c += 1
         if c % 300 == 0:
             filename = "poco." + str((time.time() / 86400.0) + 2440587.5) + ".uv"
             print "closing uv file"
             self.close_uv(filename)
             print "reopening new uv file"
             self.open_uv()
Esempio n. 11
0
def receive():
    print 'RX: initializing'
    tport = spead.TransportUDPrx(PORT)
    ig = spead.ItemGroup()
    print 'RX: listening'
    pv_t1, pv_tx_time = 0, 0
    for heap in spead.iterheaps(tport):
        t1 = time.time()
        ig.update(heap)
        t2 = time.time()
        t_total = t2 - ig['tx_time']
        t_update = t2 - t1
        t_rx_heap = pv_t1 - ig['pv_time']
        print 't_total:', t_total
        print 't_update:', t_update
        print 't_rx_heap (prev):', t_rx_heap
        print 't_tx (prev):', ig['pv_time'] - pv_tx_time
        print '-' * 60
        pv_t1 = t1
        pv_tx_time = ig['tx_time']
    print 'RX: stop'
Esempio n. 12
0
def receive():
    print 'RX: initializing'
    tport = spead.TransportUDPrx(PORT)
    ig = spead.ItemGroup()
    print 'RX: listening'
    pv_t1, pv_tx_time = 0, 0
    for heap in spead.iterheaps(tport):
        t1 = time.time()
        ig.update(heap)
        t2 = time.time()
        t_total = t2 - ig['tx_time'] 
        t_update = t2 - t1
        t_rx_heap = pv_t1 - ig['pv_time']
        print 't_total:', t_total
        print 't_update:', t_update
        print 't_rx_heap (prev):', t_rx_heap
        print 't_tx (prev):', ig['pv_time'] - pv_tx_time
        print '-' * 60
        pv_t1 = t1
        pv_tx_time = ig['tx_time']
    print 'RX: stop'
Esempio n. 13
0
 def write_thread(self):
     '''Starts up reciever thread and parses through the data.
        Then writes the uv files '''
     global c
     logger.info('RPOCO8-RX.rx_thread: Starting receiver thread')
     for heap in S.iterheaps(rx):
         ig.update(heap)
         ig['acc_num']= ig.heap_cnt
         #print ig.keys()
         sec = ig['data_timestamp']/1000.0
         jd = self.unix2julian(sec)
         logger.info('RPOCO8-RX.rx_thread: Got HEAP_CNT=%d' % (ig.heap_cnt))
         #continue
         data = N.zeros(shape = 1024, dtype = N.complex64)
         for name in self.now:
             data = N.zeros(shape = 1024, dtype = N.complex64)
             if name[0] == name[1]:
                 R = ig[name+'_r'].reshape([NCHAN,2])
                 data.real = R[:,0]
                 self.uv_update(name,data[::-1],jd)
                 data.real = R[:,1]
                 self.uv_update(self.then[self.now.index(name)],data[::-1],jd)
             else:
                 R = ig[name+'_r'].reshape([NCHAN,2])
                 I = ig[name+'_i'].reshape([NCHAN,2])
                 data.real = R[:,0]
                 data.imag = I[:,0]
                 self.uv_update(name,data[::-1],jd)
                 data.real = R[:,1]
                 data.imag = I[:,1]
                 if name in ['ae','af','be','bf','cg','ch','dg','dh']:self.uv_update(self.then[self.now.index(name)], N.conj(data)[::-1],jd)
                 else:self.uv_update(self.then[self.now.index(name)], data[::-1],jd)
         c += 1
         if c%300 == 0:
             filename = 'poco.' + str((time.time()/86400.0)+2440587.5) + '.uv'
             print 'closing uv file'
             self.close_uv(filename)
             print 'reopening new uv file'
             self.open_uv()
Esempio n. 14
0
    def rx_cont(self,data_port=7148, sd_ip='127.0.0.1', sd_port=7149,acc_scale=True, filename=None,**kwargs): 
        logger=self.logger
        logger.info("Data reception on port %i."%data_port)
        rx = spead.TransportUDPrx(data_port, pkt_count=1024, buffer_size=51200000)
        logger.info("Sending Signal Display data to %s:%i."%(sd_ip,sd_port))
        tx_sd = spead.Transmitter(spead.TransportUDPtx(sd_ip, sd_port))
        ig = spead.ItemGroup()
        ig_sd = spead.ItemGroup()
        if filename == None:
            filename=str(int(time.time())) + ".synth.h5"
        logger.info("Starting file %s."%(filename))
        f = h5py.File(filename, mode="w")
        data_ds = None
        ts_ds = None
        idx = 0
        dump_size = 0
        datasets = {} 
        datasets_index = {}
        meta_required = ['n_chans','bandwidth','n_bls','n_xengs','center_freq','bls_ordering']
         # we need these bits of meta data before being able to assemble and transmit signal display data
        meta_desired = ['n_accs']
        meta = {}
        for heap in spead.iterheaps(rx):
            ig.update(heap)
            logger.debug("PROCESSING HEAP idx(%i) cnt(%i) @ %.4f" % (idx, heap.heap_cnt, time.time()))
            for name in ig.keys():
                item = ig.get_item(name)
                if not item._changed and datasets.has_key(name): continue # the item is not marked as changed, and we have a record for it
                if name in meta_desired:
                    meta[name] = ig[name]
                if name in meta_required:
                    meta[name] = ig[name]
                    meta_required.pop(meta_required.index(name))
                    if len(meta_required) == 0:
                        #sd_frame = np.zeros((meta['n_chans'],meta['n_bls'],2),dtype=np.float32)
                        logger.info("Got all required metadata. Expecting data frame shape of %i %i %i"%(meta['n_chans'],meta['n_bls'],2))
                        meta_required = ['n_chans','bandwidth','n_bls','n_xengs','center_freq','bls_ordering']
                        ig_sd = spead.ItemGroup()
                        for meta_item in meta_required:
                          ig_sd.add_item(
                            name=ig.get_item(meta_item).name,
                            id=ig.get_item(meta_item).id,
                            description=ig.get_item(meta_item).description,
                            #shape=ig.get_item(meta_item).shape,
                            #fmt=ig.get_item(meta_item).format,
                            init_val=ig.get_item(meta_item).get_value())
                        tx_sd.send_heap(ig_sd.get_heap())

                if not datasets.has_key(name):
                 # check to see if we have encountered this type before
                    shape = ig[name].shape if item.shape == -1 else item.shape
                    dtype = np.dtype(type(ig[name])) if shape == [] else item.dtype
                    if dtype is None: dtype = ig[name].dtype
                     # if we can't get a dtype from the descriptor try and get one from the value
                    logger.info("Creating dataset for %s (%s,%s)."%(str(name),str(shape),str(dtype)))
                    f.create_dataset(name,[1] + ([] if list(shape) == [1] else list(shape)), maxshape=[None] + ([] if list(shape) == [1] else list(shape)), dtype=dtype)
                    dump_size += np.multiply.reduce(shape) * dtype.itemsize
                    datasets[name] = f[name]
                    datasets_index[name] = 0
                    if not item._changed: continue
                     # if we built from and empty descriptor
                else:
                    logger.info("Adding %s to dataset. New size is %i."%(name,datasets_index[name]+1))
                    f[name].resize(datasets_index[name]+1, axis=0)
                if name.startswith("xeng_raw"):
                    sd_timestamp = ig['sync_time'] + (ig['timestamp'] / float(ig['scale_factor_timestamp']))
                    #logger.info("SD Timestamp: %f (%s)."%(sd_timestamp,time.ctime(sd_timestamp)))

                    scale_factor=float(meta['n_accs'] if (meta.has_key('n_accs') and acc_scale) else 1)
                    scaled_data = (ig[name]/scale_factor).astype(np.float32)

                     # reinit the group to force meta data resend
                    ig_sd = spead.ItemGroup()
                    ig_sd.add_item(name=('sd_data'),
                                    id=(0x3501), 
                                    description="Combined raw data from all x engines.", 
                                    ndarray=(scaled_data.dtype,scaled_data.shape))
                    ig_sd.add_item(name=('sd_timestamp'), 
                                    id=0x3502, 
                                    description='Timestamp of this sd frame in centiseconds since epoch (40 bit limitation).', 
                                    init_val=sd_timestamp)
                                    #shape=[], 
                                    #fmt=spead.mkfmt(('u',spead.ADDRSIZE)))
                    t_it = ig_sd.get_item('sd_data')
                    logger.debug("Added SD frame with shape %s, dtype %s"%(str(t_it.shape),str(t_it.dtype)))
                    tx_sd.send_heap(ig_sd.get_heap())

                    logger.info("Sending signal display frame with timestamp %i (%s). %s. Max: %i, Mean: %i"%(
                        sd_timestamp,
                        time.ctime(sd_timestamp),
                        "Unscaled" if not acc_scale else "Scaled by %i" % (scale_factor), 
                        np.max(scaled_data),
                        np.mean(scaled_data)))
                    ig_sd['sd_data'] = scaled_data
                    ig_sd['sd_timestamp'] = sd_timestamp * 100
                    #ig_sd['sd_timestamp'] = sd_timestamp
                    tx_sd.send_heap(ig_sd.get_heap())

                f[name][datasets_index[name]] = ig[name]
                datasets_index[name] += 1
                item._changed = False
                  # we have dealt with this item so continue...
            idx+=1

#        for (name,idx) in datasets_index.iteritems():
#            if idx == 1:
#                self.logger.info("Repacking dataset %s as an attribute as it is singular."%name)
#                f['/'].attrs[name] = f[name].value[0]
#                f.__delitem__(name)
        logger.info("Got a SPEAD end-of-stream marker. Closing File.")
        f.flush()
        f.close()
        rx.stop()
        ig_sd = None
        sd_timestamp = None
        logger.info("Files and sockets closed.")
Esempio n. 15
0
    def rx_inter(self,data_port=7148, sd_ip='127.0.0.1', sd_port=7149, acc_scale=True, filename=None, **kwargs):
        '''
        Process SPEAD data from X engines and forward it to the SD.
        '''
        print 'WARNING: This function is not yet tested. YMMV.'
        logger=self.logger
        logger.info("Data reception on port %i."%data_port)
        rx = spead.TransportUDPrx(data_port, pkt_count=1024, buffer_size=51200000)
        logger.info("Sending Signal Display data to %s:%i."%(sd_ip,sd_port))
        tx_sd = spead.Transmitter(spead.TransportUDPtx(sd_ip, sd_port))
        ig = spead.ItemGroup()
        ig_sd = spead.ItemGroup()
        if filename == None:
          filename=str(int(time.time())) + ".synth.h5"
        logger.info("Starting file %s."%(filename))
        f = h5py.File(filename, mode="w")
        data_ds = None
        ts_ds = None
        idx = 0
        dump_size = 0
        datasets = {} 
        datasets_index = {}
        # we need these bits of meta data before being able to assemble and transmit signal display data
        meta_required = ['n_chans','n_bls','n_xengs','center_freq','bls_ordering','bandwidth']
        meta_desired = ['n_accs']
        meta = {}
        sd_frame = None
        sd_slots = None
        timestamp = None

        # log the latest timestamp for which we've stored data
        currentTimestamp = -1

        # iterate through SPEAD heaps returned by the SPEAD receiver.
        for heap in spead.iterheaps(rx):
            ig.update(heap)
            logger.debug("PROCESSING HEAP idx(%i) cnt(%i) @ %.4f" % (idx, heap.heap_cnt, time.time()))
            for name in ig.keys():
                item = ig.get_item(name)

                # the item is not marked as changed and we already have a record for it, continue
                if not item._changed and datasets.has_key(name):
                  continue         
                logger.debug("PROCESSING KEY %s @ %.4f" % (name, time.time()))

                if name in meta_desired:
                    meta[name] = ig[name]

                if name in meta_required:
                  meta[name] = ig[name]
                  meta_required.pop(meta_required.index(name))
                  if len(meta_required) == 0:
                    sd_frame = np.zeros((meta['n_chans'],meta['n_bls'],2),dtype=np.float32)
                    logger.info("Got all required metadata. Initialised sd frame to shape %s"%(str(sd_frame.shape)))
                    meta_required = ['n_chans','bandwidth','n_bls','n_xengs','center_freq','bls_ordering']
                    ig_sd = spead.ItemGroup()
                    for meta_item in meta_required:
                      ig_sd.add_item(
                        name=ig.get_item(meta_item).name,
                        id=ig.get_item(meta_item).id,
                        description=ig.get_item(meta_item).description,
                        #shape=ig.get_item(meta_item).shape,
                        #fmt=ig.get_item(meta_item).format,
                        init_val=ig.get_item(meta_item).get_value())
                    tx_sd.send_heap(ig_sd.get_heap())
                    sd_slots = np.zeros(meta['n_xengs'])
                if not datasets.has_key(name):
                 # check to see if we have encountered this type before
                  shape = ig[name].shape if item.shape == -1 else item.shape
                  dtype = np.dtype(type(ig[name])) if shape == [] else item.dtype
                  if dtype is None: dtype = ig[name].dtype
                   # if we can't get a dtype from the descriptor, try and get one from the value
                  logger.info("Creating dataset for %s (%s,%s)."%(str(name),str(shape),str(dtype)))
                  f.create_dataset(name,[1] + ([] if list(shape) == [1] else list(shape)), maxshape=[None] + ([] if list(shape) == [1] else list(shape)), dtype=dtype)
                  dump_size += np.multiply.reduce(shape) * dtype.itemsize
                  datasets[name] = f[name]
                  datasets_index[name] = 0
                  # if we built from an empty descriptor
                  if not item._changed:
                    continue
                else:
                  logger.info("Adding %s to dataset. New size is %i."%(name,datasets_index[name]+1))
                  f[name].resize(datasets_index[name]+1, axis=0)

                # now we store this x engine's data for sending sd data.
                if sd_frame is not None and name.startswith("xeng_raw"):          
                  xeng_id = int(name[8:])
                  sd_frame[xeng_id::meta['n_xengs']] = ig[name]
                  logger.debug('Received data for Xeng %i @ %.4f' % (xeng_id, time.time()))

                # we got a timestamp.
                if sd_frame is not None and name.startswith("timestamp"):
                  xeng_id = int(name[9:])
                  timestamp = ig['sync_time'] + (ig[name] / ig['scale_factor_timestamp']) #in seconds since unix epoch
                  localTime = time.time()
                  print "Decoded timestamp for Xeng", xeng_id, ":", timestamp, " (", time.ctime(timestamp),") @ %.4f" % localTime, " ", time.ctime(localTime), "diff(", localTime-timestamp, ")"

                  # is this timestamp in the past?
                  if currentTimestamp > timestamp:
                    errorString = "Timestamp %.2f (%s) is earlier than the current timestamp %.2f (%s). Ignoring..." % (timestamp, time.ctime(timestamp), currentTimestamp, time.ctime(currentTimestamp))
                    logger.warning(errorString)
                    continue

                  # is this a new timestamp before a complete set?
                  if (timestamp > currentTimestamp) and sd_slots.any():
                    errorString = "New timestamp %.2f from Xeng%i before previous set %.2f sent" % (timestamp, xeng_id, currentTimestamp)
                    logger.warning(errorString)
                    sd_slots = np.zeros(meta['n_xengs'])
                    sd_frame = np.zeros((ig['n_chans'],ig['n_bls'],2),dtype=sd_frame.dtype)
                    currentTimestamp = -1
                    continue

                  # is this new timestamp in the past for this X engine?
                  if timestamp <= sd_slots[xeng_id]:
                    errorString = 'Xeng%i already on timestamp %.2f but got %.2f now, THIS SHOULD NOT HAPPEN' % (xeng_id, sd_slots[xeng_id], timestamp)
                    logger.error(errorString)
                    raise RuntimeError(errorString)

                  # update our info on which integrations we have
                  sd_slots[xeng_id] = timestamp
                  currentTimestamp = timestamp

                # do we have integration data and timestamps for all the xengines? If so, send the SD frame.
                if timestamp is not None and sd_frame is not None and sd_slots is not None and sd_slots.all():
                    ig_sd = spead.ItemGroup()
                    # make sure we have the right dtype for the sd data
                    ig_sd.add_item(name=('sd_data'), id=(0x3501), description="Combined raw data from all x engines.", ndarray=(sd_frame.dtype,sd_frame.shape))
                    ig_sd.add_item(name=('sd_timestamp'), id=0x3502, description='Timestamp of this sd frame in centiseconds since epoch (40 bit limitation).', shape=[], fmt=spead.mkfmt(('u',spead.ADDRSIZE)))
                    t_it = ig_sd.get_item('sd_data')
                    logger.info("Added SD frame with shape %s, dtype %s" % (str(t_it.shape),str(t_it.dtype)))
                    scale_factor=(meta['n_accs'] if meta.has_key('n_accs') else 1)
                    logger.info("Sending signal display frame with timestamp %i (%s). %s. @ %.4f" % (timestamp, time.ctime(timestamp), "Unscaled" if not acc_scale else "Scaled by %i" % (scale_factor), time.time()))
                    ig_sd['sd_data'] = sd_frame.astype(np.float32) if not acc_scale else (sd_frame / float(scale_factor)).astype(np.float32)
                    ig_sd['sd_timestamp'] = int(timestamp * 100)
                    tx_sd.send_heap(ig_sd.get_heap())
                    # reset the arrays that hold integration data
                    sd_slots = np.zeros(meta['n_xengs'])
                    sd_frame = np.zeros((ig['n_chans'],ig['n_bls'],2),dtype=sd_frame.dtype)
                    timestamp = None

                f[name][datasets_index[name]] = ig[name]
                datasets_index[name] += 1
                item._changed = False
            idx+=1

        logger.info("Got a SPEAD end-of-stream marker. Closing File.")
        f.flush()
        f.close()
        rx.stop()
        sd_frame = None
        sd_slots = None
        ig_sd = None
Esempio n. 16
0
dump_size = 0
datasets = {}
datasets_index = {}
meta_required = ['n_chans','n_bls','n_stokes','n_xengs','sync_time']
 # we need these bits of meta data before being able to assemble and transmit signal display data
meta = {}
sd_frame = None
sd_slots = None
timestamp = None
write_enabled = True

last_save_time = time.time()
recording=False

try:
    for heap in spead.iterheaps(rx):
        ig.update(heap)
        for name in ig.keys():
            item = ig.get_item(name)
            if not item._changed and datasets.has_key(name): continue #the item has not changed and we already have a record of it.
            if name in meta_required:
                meta_required.pop(meta_required.index(name))
                if len(meta_required) == 0:
                    sd_frame = np.zeros((ig['n_chans'],ig['n_bls'],ig['n_stokes'],2),dtype=np.int32)
                    print "Got the required metadata. Initialised sd frame to shape",sd_frame.shape
                    sd_slots = np.zeros(ig['n_xengs']) #create an SD slot for each X engine. This keeps track of which engines' data have been received for this integration.

            if not datasets.has_key(name):
             # check to see if we have encountered this type before
                shape = ig[name].shape if item.shape == -1 else item.shape
                dtype = np.dtype(type(ig[name])) if shape == [] else item.dtype                 
Esempio n. 17
0
 def test_heaplen(self):
     data = open(self.filename).read()
     rx_tport = S.TransportString(data)
     for h in S.iterheaps(rx_tport):
         self.assertFalse(rx_tport.got_term_sig)
     self.assertTrue(rx_tport.got_term_sig)
Esempio n. 18
0
 def test_heaplen(self):
     data = open(self.filename).read()
     rx_tport = S.TransportString(data)
     for h in S.iterheaps(rx_tport):
         self.assertFalse(rx_tport.got_term_sig)
     self.assertTrue(rx_tport.got_term_sig)