def makedelay(d): """ Makes a Holder object for an delay Event. Parameters ---------- d : float Delay time, in seconds. Returns ------- delay : Holder Delay Event. """ delay = Holder() if d < 0: raise ValueError('Delay {:.2f} ms is invalid'.format(d * 1e3)) delay.type = 'delay' delay.delay = d return delay
def makeadc(kwargs): """ Makes a Holder object for an ADC Event. Parameters ---------- kwargs : dict Key value mappings of ADC Event parameters_params and values. Returns ------- adc : Holder ADC Event. """ num_samples = kwargs.get("num_samples", 0) system = kwargs.get("system", Opts()) dwell = kwargs.get("dwell", 0) duration = kwargs.get("duration", 0) delay = kwargs.get("delay", 0) freq_offset = kwargs.get("freq_offset", 0) phase_offset = kwargs.get("phase_offset", 0) adc = Holder() adc.type = 'adc' adc.num_samples = num_samples adc.dwell = dwell adc.delay = delay adc.freq_offset = freq_offset adc.phase_offset = phase_offset adc.dead_time = system.adc_dead_time if (dwell == 0 and duration == 0) or (dwell > 0 and duration > 0): raise ValueError("Either dwell or duration must be defined, not both") if duration > 0: # getcontext().prec = 4 adc.dwell = float(Decimal(duration) / Decimal(num_samples)) adc.duration = dwell * num_samples if dwell > 0 else 0 return adc
def get_block(self, block_index): """ Returns Block at position specified by block_index. Parameters ---------- block_index : int Index of Block to be retrieved. Returns ------- block : dict Block at position specified by block_index. """ block = {} event_ind = self.block_events[block_index] if event_ind[0] > 0: delay = Holder() delay.type = 'delay' delay.delay = self.delay_library.data[event_ind[0]] block['delay'] = delay elif event_ind[1] > 0: rf = Holder() rf.type = 'rf' lib_data = self.rf_library.data[event_ind[1]] amplitude, mag_shape, phase_shape = lib_data[0], lib_data[1], lib_data[ 2] shape_data = self.shape_library.data[mag_shape] compressed = Holder() compressed.num_samples = shape_data[0][0] compressed.data = shape_data[0][1:] compressed.data = compressed.data.reshape( (1, compressed.data.shape[0])) mag = decompress_shape(compressed) shape_data = self.shape_library.data[phase_shape] compressed.num_samples = shape_data[0][0] compressed.data = shape_data[0][1:] compressed.data = compressed.data.reshape( (1, compressed.data.shape[0])) phase = decompress_shape(compressed) rf.signal = 1j * 2 * np.pi * phase rf.signal = amplitude * mag * np.exp(rf.signal) rf.t = [(x * self.rf_raster_time) for x in range(1, max(mag.shape) + 1)] rf.t = np.reshape(rf.t, (1, len(rf.t))) rf.freq_offset = lib_data[3] rf.phase_offset = lib_data[4] if max(lib_data.shape) < 6: lib_data = np.append(lib_data, 0) rf.dead_time = lib_data[5] block['rf'] = rf grad_channels = ['gx', 'gy', 'gz'] for i in range(1, len(grad_channels) + 1): if event_ind[2 + (i - 1)] > 0: grad, compressed = Holder(), Holder() type = self.grad_library.type[event_ind[2 + (i - 1)]] lib_data = self.grad_library.data[event_ind[2 + (i - 1)]] grad.type = 'trap' if type == 't' else 'grad' grad.channel = grad_channels[i - 1][1] if grad.type == 'grad': amplitude = lib_data[0] shape_id = lib_data[1] shape_data = self.shape_library.data[shape_id] compressed.num_samples = shape_data[0][0] compressed.data = np.array([shape_data[0][1:]]) g = decompress_shape(compressed) grad.waveform = amplitude * g grad.t = np.array([[ x * self.grad_raster_time for x in range(1, g.size + 1) ]]) else: grad.amplitude, grad.rise_time, grad.flat_time, grad.fall_time = [ lib_data[x] for x in range(4) ] grad.area = grad.amplitude * ( grad.flat_time + grad.rise_time / 2 + grad.fall_time / 2) grad.flat_area = grad.amplitude * grad.flat_time block[grad_channels[i - 1]] = grad if event_ind[5] > 0: lib_data = self.adc_library.data[event_ind[5]] if max(lib_data.shape) < 6: lib_data = np.append(lib_data, 0) adc = Holder() adc.num_samples, adc.dwell, adc.delay, adc.freq_offset, adc.phase_offset, adc.dead_time = [ lib_data[x] for x in range(6) ] adc.type = 'adc' block['adc'] = adc return block