def noise_std(self): def _compute_noise_std(): if self._noise_std is None: try: return estimate_noise_std(self) except NoiseStdEstimationNotPossible: self._logger.warning('Failed to obtain a noise std for this subject. ' 'We will continue with an std of 1.') return 1 if isinstance(self._noise_std, (numbers.Number, np.ndarray)): return self._noise_std if isinstance(self._noise_std, str): filename = str(self._noise_std) if filename[-4:] == '.txt': with open(filename, 'r') as f: return float(f.read()) return load_nifti(filename).get_data() self._logger.warning('Failed to obtain a noise std for this subject. We will continue with an std of 1.') return 1 self._noise_std = _compute_noise_std() if is_scalar(self._noise_std): return self._noise_std else: return create_roi(self._noise_std, self.mask)
def _get_bounds(self, bounds, roi_indices): return_values = [] for el in bounds: if is_scalar(el): return_values.append(el) else: return_values.append(el[roi_indices]) return tuple(return_values)
def get_subset(self, volumes_to_keep=None, volumes_to_remove=None): if (volumes_to_keep is not None) and (volumes_to_remove is not None): raise ValueError('You can not specify both the list with volumes to keep and volumes to remove. Choose one.') if (volumes_to_keep is None) and (volumes_to_remove is None): raise ValueError('Please specify either the list with volumes to keep or the list with volumes to remove.') if volumes_to_keep is not None: if is_scalar(volumes_to_keep): volumes_to_keep = [volumes_to_keep] elif volumes_to_remove is not None: if is_scalar(volumes_to_remove): volumes_to_remove = [volumes_to_remove] volumes_to_keep = list(range(self.nmr_observations)) volumes_to_keep = [ind for ind in volumes_to_keep if ind not in volumes_to_remove] new_protocol = self.protocol if self.protocol is not None: new_protocol = self.protocol.get_new_protocol_with_indices(volumes_to_keep) new_dwi_volume = self.signal4d if self.signal4d is not None: new_dwi_volume = self.signal4d[..., volumes_to_keep] new_volume_weights = self._volume_weights if self._volume_weights is not None: new_volume_weights = new_volume_weights[..., volumes_to_keep] new_gradient_deviations = self._gradient_deviations if self._gradient_deviations is not None: if self._gradient_deviations.ndim > 4 and self._gradient_deviations.shape[3] == self.protocol.length: if self._gradient_deviations.ndim == 5: new_gradient_deviations = self._gradient_deviations[..., volumes_to_keep, :] else: new_gradient_deviations = self._gradient_deviations[..., volumes_to_keep, :, :] new_extra_protocol = {} for key, value in self._extra_protocol.items(): value = np.array(value, copy=False) if value.ndim > 3 and value.shape[3] == self.protocol.length: value = value[:, :, :, volumes_to_keep, ...] new_extra_protocol[key] = value return self.copy_with_updates(protocol=new_protocol, signal4d=new_dwi_volume, gradient_deviations=new_gradient_deviations, volume_weights=new_volume_weights, extra_protocol=new_extra_protocol)