예제 #1
0
 def update_output_folder_text(self):
     if os.path.isfile(self.selectedDWI.text()) and os.path.isfile(
             self.selectedMask.text()):
         folder_base = os.path.join(
             os.path.dirname(self.selectedDWI.text()), 'output',
             split_image_path(self.selectedMask.text())[1])
         self.selectedOutputFolder.setText(folder_base)
예제 #2
0
    def generate_roi_mask(self):
        kwargs = dict(mask=self.selectedMaskText.text(), output=self.selectedOutputFileText.text(),
                      dimension=self.dimensionInput.value(), slice=self.sliceInput.value())
        self._generate_mask_worker.set_args(**kwargs)
        self._computations_thread.start()
        self._generate_mask_worker.moveToThread(self._computations_thread)

        self._generate_mask_worker.starting.connect(self._computations_thread.starting)
        self._generate_mask_worker.finished.connect(self._computations_thread.finished)

        self._generate_mask_worker.starting.connect(lambda: self.generateButton.setEnabled(False))
        self._generate_mask_worker.finished.connect(lambda: self.generateButton.setEnabled(True))
        self._generate_mask_worker.finished.connect(lambda: self.viewButton.setEnabled(True))

        image_path = split_image_path(self.selectedOutputFileText.text())
        script_basename = os.path.join(image_path[0], 'scripts', 'create_roi_mask_' + image_path[1])
        if not os.path.isdir(os.path.join(image_path[0], 'scripts')):
            os.makedirs(os.path.join(image_path[0], 'scripts'))

        self._generate_mask_worker.finished.connect(
            lambda: self._write_python_script_file(script_basename + '.py', **kwargs))

        self._generate_mask_worker.finished.connect(
            lambda: self._write_bash_script_file(script_basename + '.sh', **kwargs))

        self._generate_mask_worker.starting.emit()
예제 #3
0
    def run(self, args, extra_args):
        input_file = os.path.realpath(args.input_file)

        if args.output_file is None:
            dirname, basename, ext = split_image_path(input_file)
            output_file = dirname + basename + '_tSNR' + ext
        else:
            output_file = os.path.realpath(args.output_file)

        nifti = mct.load_nifti(input_file)
        tsnr = calculate_tsnr(nifti.get_data())
        mdt.write_nifti(tsnr, output_file, nifti.get_header())
예제 #4
0
    def update_output_file_text(self):
        if os.path.isfile(self.selectedMaskText.text()):
            folder, basename, ext = split_image_path(self.selectedMaskText.text())
            folder_base = os.path.join(folder, basename)

            if self.selectedOutputFileText.text() == '':
                self.selectedOutputFileText.setText('{}_{}_{}.nii.gz'.format(folder_base,
                                                                             self.dimensionInput.value(),
                                                                             self.sliceInput.value()))
            elif self.selectedOutputFileText.text()[0:len(folder_base)] == folder_base:
                self.selectedOutputFileText.setText('{}_{}_{}.nii.gz'.format(folder_base,
                                                                             self.dimensionInput.value(),
                                                                             self.sliceInput.value()))
예제 #5
0
    def run(self, args, extra_args):
        input_file = os.path.realpath(
            get_input_file(args.input_file, os.path.realpath('')))
        dirname, _, _ = split_image_path(input_file)

        if args.output_folder is None:
            output_folder = dirname + '/split'
        else:
            output_folder = os.path.realpath(args.output_folder)

        if not os.path.exists(output_folder):
            os.makedirs(output_folder)

        split_write_volumes(input_file, output_folder, args.axis)
예제 #6
0
    def run(self, args, extra_args):
        mask = mdt.load_brain_mask(
            nifti_filepath_resolution(os.path.realpath(args.mask)))

        file_names = []
        for file in args.input_files:
            file_names.extend(glob.glob(file))

        for file in file_names:
            if args.overwrite:
                mdt.apply_mask_to_file(file, mask)
            else:
                folder, basename, ext = split_image_path(
                    nifti_filepath_resolution(os.path.realpath(file)))
                mdt.apply_mask_to_file(file,
                                       mask,
                                       output_fname=os.path.join(
                                           folder, basename + '_masked' + ext))
예제 #7
0
    def _load_niftis(self):
        niftis = []
        for filename in self._input_filenames:
            filename = nifti_filepath_resolution(filename)
            _, basename, extension = split_image_path(filename)

            if extension.endswith('gz'):
                unzipped_nifti_path = os.path.join(self._tmp_dir,
                                                   basename + '.nii')
                unzip_nifti(filename, unzipped_nifti_path)

                self._files_to_remove.append(unzipped_nifti_path)
                resolved_path = unzipped_nifti_path
            else:
                resolved_path = filename

            niftis.append(load_nifti(resolved_path))
        return niftis
예제 #8
0
    def _select_image(self):
        initial_dir = self._shared_state.base_dir
        if self.selectedImageText.text() != '':
            initial_dir = self.selectedImageText.text()

        open_file, used_filter = QFileDialog().getOpenFileName(
            caption='Select the 4d diffusion weighted image',
            directory=initial_dir,
            filter=';;'.join(image_files_filters))

        if os.path.isfile(open_file):
            self.selectedImageText.setText(open_file)
            self._shared_state.base_dir = os.path.dirname(open_file)

            if self.selectedOutputText.text() == '':
                split_path = split_image_path(open_file)
                self.selectedOutputText.setText(
                    os.path.join(split_path[0],
                                 split_path[1] + '_mask' + split_path[2]))
예제 #9
0
def split_write_volumes(input_file, output_dir, axis=-1):
    """Split and write the given input volume to separate nifti files.

    Args:
        input_file (str): the input nifti file to split
        output_dir (str): the output directory, this will write the split volumes to that directory
            with the same basename as the input file, with the slice index appended
        axis (int): the axis to split on
    """
    dirname, basename, extension = split_image_path(input_file)

    nifti = load_nifti(input_file)
    data = nifti.get_data()
    header = nifti.get_header()

    for ind in range(data.shape[axis]):
        index = [slice(None)] * len(data.shape)
        index[axis] = ind
        mdt.write_nifti(data[index],
                        '{}/{}_{}.nii'.format(output_dir, basename,
                                              ind), header)
예제 #10
0
    def _get_subject_output_dir(self, subject_id, mask_fname, subject_base_dir=None):
        """Helper function for generating the output directory for a subject.

        Args:
            subject_id (str): the id of the subject to use
            mask_fname (str): the name of the mask we are using for this subject
            subject_base_dir (str): the base directory for this subject, defaults to
                self._root_dir / subject_id / self.output_base_dir

        Returns:
            str: the path for the output directory
        """
        output_dir = subject_base_dir or os.path.join(self._root_dir, subject_id, self.output_base_dir)

        if self.output_sub_dir:
            output_dir = os.path.join(output_dir, self.output_sub_dir)

        if self._append_mask_name_to_output_sub_dir and mask_fname:
            output_dir = os.path.join(output_dir, split_image_path(mask_fname)[1])

        return output_dir
예제 #11
0
    def generate_mask(self):
        args = (self.selectedImageText.text(),
                self.selectedProtocolText.text(),
                self.selectedOutputText.text())
        kwargs = dict(median_radius=self.medianRadiusInput.value(),
                      numpass=self.numberOfPassesInput.value(),
                      mask_threshold=self.finalThresholdInput.value())

        self._generate_mask_worker.set_args(*args, **kwargs)
        self._computations_thread.start()
        self._generate_mask_worker.moveToThread(self._computations_thread)
        self._generate_mask_worker.starting.connect(
            self._computations_thread.starting)
        self._generate_mask_worker.starting.connect(
            lambda: self.generateButton.setEnabled(False))
        self._generate_mask_worker.finished.connect(
            self._computations_thread.finished)
        self._generate_mask_worker.finished.connect(
            lambda: self.generateButton.setEnabled(True))
        self._generate_mask_worker.finished.connect(
            lambda: self.viewButton.setEnabled(True))

        image_path = split_image_path(self.selectedOutputText.text())
        script_basename = os.path.join(image_path[0], 'scripts',
                                       'generate_mask_' + image_path[1])
        if not os.path.isdir(os.path.join(image_path[0], 'scripts')):
            os.makedirs(os.path.join(image_path[0], 'scripts'))

        self._generate_mask_worker.finished.connect(
            lambda: self._write_python_script_file(script_basename + '.py', *
                                                   args, **kwargs))

        self._generate_mask_worker.finished.connect(
            lambda: self._write_bash_script_file(script_basename + '.sh', *
                                                 args, **kwargs))

        self._generate_mask_worker.starting.emit()
예제 #12
0
 def get_name(img_path):
     return split_image_path(os.path.basename(img_path))[1]
예제 #13
0
    def _get_subjects(self):
        pjoin = mdt.make_path_joiner(self._root_dir)

        files = [os.path.basename(f) for f in glob.glob(pjoin('*'))]
        basenames = sorted(list({split_image_path(f)[1] for f in files}))
        subjects = []

        protocol_options = ['TE', 'TR', 'Delta', 'delta', 'maxG']

        default_mask = None
        if list(glob.glob(pjoin('mask.nii*'))):
            default_mask = list(glob.glob(pjoin('mask.nii*')))[0]

        for basename in basenames:
            dwi_fname = None
            if basename + '.nii' in files:
                dwi_fname = pjoin(basename + '.nii')
            elif basename + '.nii.gz' in files:
                dwi_fname = pjoin(basename + '.nii.gz')
            elif basename + '.hdr' in files and basename + '.img' in files:
                dwi_fname = pjoin(basename + '.hdr')

            noise_std = self._autoload_noise_std(basename,
                                                 file_path=pjoin(basename +
                                                                 '.noise_std'))

            prtcl_fname = None
            if basename + '.prtcl' in files:
                prtcl_fname = pjoin(basename + '.prtcl')

            bval_fname = None
            if basename + '.bval' in files:
                bval_fname = pjoin(basename + '.bval')

            bvec_fname = None
            if basename + '.bvec' in files:
                bvec_fname = pjoin(basename + '.bvec')

            mask_fname = default_mask
            if basename + '_mask.nii' in files:
                mask_fname = pjoin(basename + '_mask.nii')
            elif basename + '_mask.nii.gz' in files:
                mask_fname = pjoin(basename + '_mask.nii.gz')

            extra_cols_from_file = {}
            for option in protocol_options:
                if basename + '.' + option in files:
                    extra_cols_from_file.update(
                        {option: pjoin(basename + '.' + option)})

            if dwi_fname and (prtcl_fname or (bval_fname and bvec_fname)):
                protocol_loader = BatchFitProtocolLoader(
                    pjoin(),
                    protocol_fname=prtcl_fname,
                    bvec_fname=bvec_fname,
                    bval_fname=bval_fname,
                    protocol_columns=extra_cols_from_file)

                output_dir = self._get_subject_output_dir(
                    basename, mask_fname, pjoin(self.output_base_dir,
                                                basename))

                subjects.append(
                    SimpleSubjectInfo(basename,
                                      dwi_fname,
                                      protocol_loader,
                                      mask_fname,
                                      output_dir,
                                      noise_std=noise_std))
        return subjects
예제 #14
0
 def mask_name(self):
     return split_image_path(self.subject_info.get_mask_filename())[1]
예제 #15
0
    def run_model(self):
        model = mdt.get_model(self._get_current_model_name())()

        if not model.is_input_data_sufficient(
                self._input_data_info.build_input_data()):
            msg = ProtocolWarningBox(
                model.get_input_data_problems(
                    self._input_data_info.build_input_data()))
            msg.exec_()
            return

        self._run_model_worker.set_args(
            model,
            self._input_data_info.build_input_data(),
            self.selectedOutputFolder.text(),
            recalculate=True,
            double_precision=self._optim_options.double_precision,
            only_recalculate_last=not self._optim_options.recalculate_all,
            method=self._optim_options.method)

        self._computations_thread.start()
        self._run_model_worker.moveToThread(self._computations_thread)

        self._run_model_worker.starting.connect(
            self._computations_thread.starting)
        self._run_model_worker.finished.connect(
            self._computations_thread.finished)

        self._run_model_worker.starting.connect(
            lambda: self.runButton.setEnabled(False))
        self._run_model_worker.finished.connect(
            lambda: self.runButton.setEnabled(True))

        self._run_model_worker.finished.connect(
            lambda: self._shared_state.set_output_folder(
                self._get_full_model_output_path()))

        image_path = split_image_path(self._input_data_info.dwi)
        script_basename = os.path.join(
            image_path[0], 'scripts', 'fit_model_{}_{}'.format(
                self._get_current_model_name().replace('|', '.'),
                image_path[1]))
        if not os.path.isdir(os.path.join(image_path[0], 'scripts')):
            os.makedirs(os.path.join(image_path[0], 'scripts'))

        script_info = dict(
            optim_options=self._optim_options,
            input_data_info=self._input_data_info,
            model=self._get_current_model_name(),
            output_folder=self.selectedOutputFolder.text(),
            recalculate=True,
            double_precision=self._optim_options.double_precision,
            only_recalculate_last=not self._optim_options.recalculate_all)

        self._run_model_worker.finished.connect(
            lambda: self._write_python_script_file(script_basename + '.py', **
                                                   script_info))

        self._run_model_worker.finished.connect(
            lambda: self._write_bash_script_file(script_basename + '.sh', **
                                                 script_info))

        self._run_model_worker.starting.emit()
예제 #16
0
    def run(self, args, extra_args):
        file_names = []
        images = []
        for file in args.input_files:
            globbed = glob.glob(file)

            if globbed:
                for fname in globbed:
                    file_names.append(fname)
                    images.append(
                        mdt.load_nifti(os.path.realpath(fname)).get_data())
            else:
                file_names.append(file)
                images.append(
                    mdt.load_nifti(os.path.realpath(file)).get_data())

        if args.verbose:
            print('')

        if args.input_4d:
            images = self._images_3d_to_4d(images)

        context_dict = {'input': images, 'i': images, 'np': np, 'mdt': mdt}
        alpha_chars = list('abcdefghjklmnopqrstuvwxyz')

        for ind, image in enumerate(images):
            context_dict.update({alpha_chars[ind]: image})

            if args.verbose:
                print('Input {ind} ({alpha}):'.format(ind=ind,
                                                      alpha=alpha_chars[ind]))
                print('    name: {}'.format(
                    split_image_path(file_names[ind])[1]))
                print('    shape: {}'.format(str(image.shape)))

        if args.verbose:
            print('')
            print("Evaluating: '{expr}'".format(expr=args.expr))

        if args.as_expression:
            output = eval(args.expr, context_dict)
        else:
            expr = textwrap.dedent('''
            def mdt_image_math():
                {}
            output = mdt_image_math()
            ''').format(args.expr)
            exec(expr, context_dict)
            output = context_dict['output']

        if args.verbose:
            print('')
            if isinstance(output, np.ndarray):
                print('Output shape: {shape}'.format(shape=str(output.shape)))
            else:
                print('Output is single value')

            print('Output: ')
            print('')
            print(output)
        else:
            if not args.write_output:
                print(output)

        if args.verbose:
            print('')

        if args.write_output:
            if isinstance(output, Sequence):
                if args.output_file:
                    output_file = os.path.realpath(args.output_file)
                    dirname, basename, ext = split_image_path(output_file)
                    for ind, element in enumerate(output):
                        mdt.write_nifti(
                            element, dirname + basename + '_' + str(ind) + ext,
                            mdt.load_nifti(file_names[0]).header)
                else:
                    for ind, element in enumerate(output):
                        output_file = os.path.realpath(file_names[ind])
                        mdt.write_nifti(element, output_file,
                                        mdt.load_nifti(file_names[ind]).header)
            else:
                if args.output_file:
                    output_file = os.path.realpath(args.output_file)
                else:
                    output_file = os.path.realpath(file_names[0])

                mdt.write_nifti(output, output_file,
                                mdt.load_nifti(file_names[0]).header)
예제 #17
0
    def run(self, args):
        write_output = args.output_file is not None

        if write_output:
            output_file = os.path.realpath(args.output_file)

            if os.path.isfile(output_file):
                os.remove(output_file)

        file_names = []
        for file in args.input_files:
            file_names.extend(glob.glob(file))

        if args.verbose:
            print('')

        images = [mdt.load_nifti(dwi_image).get_data() for dwi_image in file_names]

        if args.input_4d:
            images = self._images_3d_to_4d(images)

        context_dict = {'input': images, 'i': images, 'np': np, 'mdt': mdt}
        alpha_chars = list('abcdefghjklmnopqrstuvwxyz')

        for ind, image in enumerate(images):
            context_dict.update({alpha_chars[ind]: image})

            if args.verbose:
                print('Input {ind} ({alpha}):'.format(ind=ind, alpha=alpha_chars[ind]))
                print('    name: {}'.format(split_image_path(file_names[ind])[1]))
                print('    shape: {}'.format(str(image.shape)))

        if args.verbose:
            print('')
            print("Evaluating: '{expr}'".format(expr=args.expr))

        if args.as_expression:
            output = eval(args.expr, context_dict)
        else:
            expr = textwrap.dedent('''
            def mdt_image_math():
                {}
            output = mdt_image_math()
            ''').format(args.expr)
            exec(expr, context_dict)
            output = context_dict['output']

        if args.verbose:
            print('')
            if isinstance(output, np.ndarray):
                print('Output shape: {shape}'.format(shape=str(output.shape)))
            else:
                print('Output is single value')

            print('Output: ')
            print('')
            print(output)
        else:
            if not write_output:
                print(output)

        if args.verbose:
            print('')

        if write_output:
            mdt.write_image(output_file, output, mdt.load_nifti(file_names[0]).get_header())