def makearbitrarygrad(kwargs): """ Makes a Holder object for an arbitrary gradient Event. Parameters ---------- kwargs : dict Key value mappings of RF Event parameters_params and values. Returns ------- grad : Holder Trapezoidal gradient Event configured based on supplied kwargs. """ channel = kwargs.get("channel", "z") system = kwargs.get("system", Opts()) waveform = kwargs.get("waveform") max_grad_result = kwargs.get("max_grad", 0) max_slew_result = kwargs.get("max_slew", 0) max_grad = max_grad_result if max_grad_result > 0 else system.max_grad max_slew = max_slew_result if max_slew_result > 0 else system.max_slew g = waveform slew = (g[0][1:] - g[0][0:-1]) / system.grad_raster_time if max(abs(slew)) > max_slew: raise ValueError('Slew rate violation {:f}'.format( max(abs(slew)) / max_slew * 100)) if max(abs(g[0])) > max_grad: raise ValueError('Gradient amplitude violation {:f}'.format( max(abs(g)) / max_grad * 100)) grad = Holder() grad.type = 'grad' grad.channel = channel grad.waveform = g grad.t = np.array([[x * system.grad_raster_time for x in range(len(g[0]))]]) return grad
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