Example #1
0
 def testVolume(self):
     qpd = NumpyData(self.floats4d, grid=self.grid, name="test")
     for idx in range(NVOLS):
         self.assertTrue(np.allclose(qpd.volume(idx), self.floats4d[..., idx]))
Example #2
0
    def run(self, options):
        self.debug("Run")
        method_name = options.pop("method")
        mode = options.pop("mode", "reg")
        self._save_transform = options.pop("save-transform", None)

        # Registration data. Need to know the reg data grid and number of volumes so progress
        # and output data can be interpreted correctly
        regdata_name = options.pop("reg", options.pop("data", None))
        if not regdata_name:
            raise QpException("No registration data specified")
        elif regdata_name not in self.ivm.data:
            raise QpException("Registration data not found: %s" % regdata_name)
        regdata = self.ivm.data[regdata_name]
        reg_grid = regdata.grid
        reg_data = [
            regdata,
        ]
        self._output_name = options.pop(
            "output-name", regdata.name + options.get("output-suffix", "_reg"))

        # Reference data. Defaults to same as reg data so MoCo can be
        # supported as self-registration
        refdata_name = options.pop("ref", regdata_name)
        ref_data = self.ivm.data[refdata_name]
        if ref_data.nvols > 1:
            refvol = options.pop("ref-vol", "median")
            if refvol == "median":
                refidx = int(ref_data.nvols / 2)
            elif refvol == "mean":
                raise NotImplementedError("Not yet implemented")
            else:
                refidx = refvol
            ref_data = NumpyData(ref_data.volume(refidx), ref_data.grid,
                                 "refdata")

        # Additional registration targets can be specified which will be transformed
        # in the same way as the main registration data.
        #
        # Useful for masks defined on an unregistered volume.
        add_reg = options.pop(
            "add-reg", options.pop("warp-rois", options.pop("warp-roi", ())))

        # Handle case where additional registation targets are given as a string
        if isinstance(add_reg, six.string_types):
            add_reg = (add_reg, )

        for name in add_reg:
            qpdata = self.ivm.data.get(name, None)
            if not qpdata:
                self.warn(
                    "Removing non-existant data set from additional registration list: %s"
                    % name)
            else:
                reg_data.append(qpdata.resample(reg_grid, suffix=""))

        self.debug("Have %i registration targets" % len(reg_data))

        # Function input data must be passed as list of arguments for multiprocessingmethod = get_reg_method(method_name)
        options_pass = dict(options)
        options.clear()
        self.start_bg([method_name, mode, reg_data, ref_data, options_pass])