Пример #1
0
def auto_mask(img: ndarray,
              ai: AzimuthalIntegrator,
              mask_setting: dict = None) -> Tuple[ndarray, dict]:
    """Automatically generate the mask of the image.

    Parameters
    ----------
    img : ndarray
        The 2D diffraction image array.

    ai : AzimuthalIntegrator
        The AzimuthalIntegrator instance.

    mask_setting : dict
        The user's modification to auto-masking settings.

    Returns
    -------
    mask : ndarray
        The mask as a boolean array. 0 are good pixels, 1 are masked out.

    _mask_setting : dict
        The whole mask_setting.
    """
    _mask_setting = _AUTOMASK_SETTING.copy()
    if mask_setting is not None:
        _mask_setting.update(mask_setting)
    binner = generate_binner(ai, img.shape)
    mask = np.invert(mask_img(img, binner, **_mask_setting)).astype(int)
    return mask, _mask_setting
Пример #2
0
def test_z_score_image():
    b = generate_binner(geo, (2048, 2048))
    img = np.ones((2048, 2048))
    bad = np.unique(np.random.randint(0, 2048 * 2048, 1000))
    urbad = np.unravel_index(bad, (2048, 2048))
    img[urbad] = 10

    z_score = z_score_image(img, b)
    assert all(z_score[urbad] > 2)
Пример #3
0
def test_binned_outlier(mask_method):
    b = generate_binner(geo, (2048, 2048))
    img = np.ones((2048, 2048))
    bad = np.unique(np.random.randint(0, 2048 * 2048, 1000))
    urbad = np.unravel_index(bad, (2048, 2048))
    img[urbad] = 10
    mask = binned_outlier(img, b, mask_method=mask_method)

    assert_equal(np.where(mask.ravel() == 0)[0], bad)
Пример #4
0
def test_mask_img(mask_method):
    b = generate_binner(geo, (2048, 2048))
    img = np.ones((2048, 2048))
    bad = np.unique(np.random.randint(0, 2048 * 2048, 1000))
    urbad = np.unravel_index(bad, (2048, 2048))
    img[urbad] = 10
    mask = mask_img(img, b, auto_type=mask_method, edge=None,
                    lower_thresh=None,
                    upper_thresh=None)

    assert_equal(np.where(mask.ravel() == 0)[0], bad)
Пример #5
0
def test_generate_binner():
    a = generate_binner(geo, (2048, 2048))
    b = map_to_binner(*generate_map_bin(geo, (2048, 2048)))
    assert a
    assert b
    assert_equal(a.flatcount, b.flatcount)
Пример #6
0
from tifffile import imread
from xpdtools.tools import binned_outlier, generate_binner, mask_img
from profilehooks import profile
import pyFAI

geo = pyFAI.load('test.poni')
img = imread('test.tiff')

bo = profile(binned_outlier, skip=1)
# bo = binned_outlier

binner = generate_binner(geo, img.shape)
a = binner.argsort_index
b = binner.flatcount

for i in range(2):
    bo(
        img,
        binner,
        # bs_width=None,
        mask_method='mean',
    )

# Median
# binned outlier
# median by itself .714
# median multithread .494
# numba median .270
# multithread numba .178

# mask_img
Пример #7
0
    def event(self, doc):
        if self.dark_img is not None:
            doc = next(self.db.fill_events([doc], self.descs))
            if "cryostat_T" in doc["data"]:
                doc["data"]["temperature"] = doc["data"].pop("cryostat_T")
            # human readable timestamp
            h_timestamp = _timestampstr(doc["time"])

            # dark subtraction
            img = doc["data"][self.image_data_key]
            if str(img.dtype) == "uint16":
                img = img.astype("float32")
            if self.dark_img is not None:
                img -= self.dark_img
            if self.vis:
                self.vis_callbacks["dark_sub_iq"]("event",
                                                  format_event(img=img))
            if self.write_to_disk:
                tiff_name = render_clean_makedir(
                    self.light_template,
                    human_timestamp=h_timestamp,
                    raw_event=doc,
                    raw_start=self.start_doc,
                    raw_descriptor=self.descriptor_doc,
                    analysis_stage="dark_sub",
                    ext=".tiff",
                )
                tifffile.imsave(tiff_name, img)

            if self.analysis_setting == "full":
                # background correction
                if self.background_img is not None:
                    img -= self.background_img

                # get calibration
                if self.is_calibration:
                    calibration, geo = img_calibration(img, self.wavelength,
                                                       self.calibrant,
                                                       self.detector)
                    _save_calib_param(
                        calibration,
                        h_timestamp,
                        os.path.join(self.calibration_md_folder,
                                     "xpdAcq_calib_info.yml"),
                    )
                    if self.write_to_disk:
                        poni_name = render_clean_makedir(
                            self.light_template,
                            human_timestamp=h_timestamp,
                            raw_event=doc,
                            raw_start=self.start_doc,
                            raw_descriptor=self.descriptor_doc,
                            analysis_stage="calib",
                            ext=".poni",
                        )
                        poni_saver(poni_name, calibration)

                elif self.calibrant:
                    geo = load_geo(self.calibrant)
                else:
                    geo = None

                if geo:
                    img = polarization_correction(img, geo,
                                                  self.polarization_factor)

                    # Masking
                    if doc["seq_num"] == 1:
                        if (self.start_doc["sample_name"] == "Setup"
                                or self.mask_setting is None):
                            self.mask = np.ones(img.shape, dtype=bool)
                        else:
                            binner = generate_binner(geo, img.shape, self.mask)
                            self.mask = mask_img(img, binner,
                                                 **self.mask_kwargs)
                        if self.write_to_disk:
                            mask_name = render_clean_makedir(
                                self.light_template,
                                human_timestamp=h_timestamp,
                                raw_event=doc,
                                raw_start=self.start_doc,
                                raw_descriptor=self.descriptor_doc,
                                analysis_stage="mask",
                                ext="",
                            )
                            fit2d_save(self.mask, mask_name)
                    if self.vis:
                        overlay = overlay_mask(img, self.mask)
                        self.vis_callbacks["masked_img"](
                            "event", format_event(overlay_mask=overlay))
                    # binner
                    binner = generate_binner(geo, img.shape, self.mask)

                    q, iq = (
                        binner.bin_centers,
                        np.nan_to_num(binner(img.flatten())),
                    )
                    if self.vis:
                        self.vis_callbacks["iq"]("event",
                                                 format_event(q=q, iq=iq))
                        self.vis_callbacks["zscore"](
                            "event",
                            format_event(img=z_score_image(img, binner)),
                        )
                    if self.write_to_disk:
                        iq_name = render_clean_makedir(
                            self.light_template,
                            human_timestamp=h_timestamp,
                            raw_event=doc,
                            raw_start=self.start_doc,
                            raw_descriptor=self.descriptor_doc,
                            analysis_stage="iq_q",
                            ext="_Q.chi",
                        )
                        save_output(q, iq, iq_name, "Q")
                    tth = np.rad2deg(q_to_twotheta(q, self.wavelength))
                    if self.vis:
                        self.vis_callbacks["itth"]("event",
                                                   format_event(tth=tth,
                                                                iq=iq))
                    if self.write_to_disk:
                        itth_name = render_clean_makedir(
                            self.light_template,
                            human_timestamp=h_timestamp,
                            raw_event=doc,
                            raw_start=self.start_doc,
                            raw_descriptor=self.descriptor_doc,
                            analysis_stage="iq_tth",
                            ext="_tth.chi",
                        )

                        save_output(tth, iq, itth_name, "2theta")

                    if self.composition:
                        fq_q, fq, fq_config = fq_getter(
                            q,
                            iq,
                            composition=self.composition,
                            **self.fq_kwargs)
                        if self.vis:
                            self.vis_callbacks["fq"]("event",
                                                     format_event(q=fq_q,
                                                                  fq=fq))

                        r, gr, pdf_config = pdf_getter(
                            q,
                            iq,
                            composition=self.composition,
                            **self.pdf_kwargs)
                        if self.vis:
                            self.vis_callbacks["pdf"]("event",
                                                      format_event(r=r,
                                                                   pdf=gr))
                        if self.write_to_disk:
                            pdf_name = render_clean_makedir(
                                self.light_template,
                                human_timestamp=h_timestamp,
                                raw_event=doc,
                                raw_start=self.start_doc,
                                raw_descriptor=self.descriptor_doc,
                                analysis_stage="pdf",
                                ext=".gr",
                            )
                            pdf_saver(r, gr, pdf_config, pdf_name)
Пример #8
0
first_mask = (img_cal_binner.filter(
    lambda x, **kwargs: mask_setting['setting'] == 'first').zip(
        img_counter).filter(lambda x: x[1] == 1).pluck(0).starmap(
            mask_img, stream_name='mask', **mask_kwargs))

no_mask = (img_cal_binner.filter(
    lambda x, **kwargs: mask_setting['setting'] == 'none').starmap(
        lambda img, *_: np.ones(img.shape, dtype=bool)))

mask = all_mask.union(first_mask, no_mask)

# Integration
# TODO: try to get this to not call pyFAI again
binner = (mask.combine_latest(
    geometry,
    emit_on=0).starmap(lambda mask, geo: generate_binner(geo, mask=mask)))
f_img_binner = pol_corrected_img.map(np.ravel).combine_latest(binner,
                                                              emit_on=0)

mean = (f_img_binner.starmap(
    lambda img, binner, **kwargs: binner(img, **kwargs), statistic='mean'))
median = (f_img_binner.starmap(
    lambda img, binner, **kwargs: binner(img, **kwargs), statistic='median'))
std = (f_img_binner.starmap(
    lambda img, binner, **kwargs: binner(img, **kwargs), statistic='std'))

q = binner.map(getattr, 'bin_centers')
tth = (q.combine_latest(wavelength,
                        emit_on=0).starmap(q_to_twotheta,
                                           stream_name='tth')).map(np.rad2deg)
Пример #9
0
def test_generate_binner_mask():
    b = generate_binner(
        geo, (2048, 2048),
        np.random.randint(0, 2, 2048 * 2048, dtype=bool).reshape((2048, 2048)))
    assert b
Пример #10
0
def test_generate_binner():
    b = generate_binner(geo, (2048, 2048))
    assert b
Пример #11
0
    def event(self, doc):
        if self.dark_img is not None:
            doc = next(self.db.fill_events([doc], self.descs))
            if 'cryostat_T' in doc['data']:
                doc['data']['temperature'] = doc['data'].pop('cryostat_T')
            # human readable timestamp
            h_timestamp = _timestampstr(doc['time'])

            # dark subtraction
            img = doc['data'][self.image_data_key]
            if str(img.dtype) == 'uint16':
                img = img.astype('float32')
            if self.dark_img is not None:
                img -= self.dark_img
            if self.vis:
                self.vis_callbacks['dark_sub_iq']('event',
                                                  format_event(img=img))
            if self.write_to_disk:
                tiff_name = render_clean_makedir(
                    self.light_template,
                    human_timestamp=h_timestamp,
                    raw_event=doc,
                    raw_start=self.start_doc,
                    raw_descriptor=self.descriptor_doc,
                    analysis_stage='dark_sub',
                    ext='.tiff')
                tifffile.imsave(tiff_name, img)

            if self.analysis_setting == 'full':
                # background correction
                if self.background_img is not None:
                    img -= self.background_img

                # get calibration
                if self.is_calibration:
                    calibration, geo = img_calibration(img, self.wavelength,
                                                       self.calibrant,
                                                       self.detector)
                    _save_calib_param(
                        calibration, h_timestamp,
                        os.path.join(self.calibration_md_folder,
                                     'xpdAcq_calib_info.yml'))
                    if self.write_to_disk:
                        poni_name = render_clean_makedir(
                            self.light_template,
                            human_timestamp=h_timestamp,
                            raw_event=doc,
                            raw_start=self.start_doc,
                            raw_descriptor=self.descriptor_doc,
                            analysis_stage='calib',
                            ext='.poni')
                        poni_saver(poni_name, calibration)

                elif self.calibrant:
                    geo = load_geo(self.calibrant)
                else:
                    geo = None

                if geo:
                    img = polarization_correction(img, geo,
                                                  self.polarization_factor)

                    # Masking
                    if doc['seq_num'] == 1:
                        if (self.start_doc['sample_name'] == 'Setup'
                                or self.mask_setting is None):
                            self.mask = np.ones(img.shape, dtype=bool)
                        else:
                            binner = generate_binner(geo, img.shape, self.mask)
                            self.mask = mask_img(img, binner,
                                                 **self.mask_kwargs)
                        if self.write_to_disk:
                            mask_name = render_clean_makedir(
                                self.light_template,
                                human_timestamp=h_timestamp,
                                raw_event=doc,
                                raw_start=self.start_doc,
                                raw_descriptor=self.descriptor_doc,
                                analysis_stage='mask',
                                ext='')
                            fit2d_save(self.mask, mask_name)
                    if self.vis:
                        overlay = overlay_mask(img, self.mask)
                        self.vis_callbacks['masked_img'](
                            'event', format_event(overlay_mask=overlay))
                    # binner
                    binner = generate_binner(geo, img.shape, self.mask)

                    q, iq = binner.bin_centers, np.nan_to_num(
                        binner(img.flatten()))
                    if self.vis:
                        self.vis_callbacks['iq']('event',
                                                 format_event(q=q, iq=iq))
                        self.vis_callbacks['zscore'](
                            'event',
                            format_event(img=z_score_image(img, binner)))
                    if self.write_to_disk:
                        iq_name = render_clean_makedir(
                            self.light_template,
                            human_timestamp=h_timestamp,
                            raw_event=doc,
                            raw_start=self.start_doc,
                            raw_descriptor=self.descriptor_doc,
                            analysis_stage='iq_q',
                            ext='_Q.chi')
                        save_output(q, iq, iq_name, 'Q')
                    tth = np.rad2deg(q_to_twotheta(q, self.wavelength))
                    if self.vis:
                        self.vis_callbacks['itth']('event',
                                                   format_event(tth=tth,
                                                                iq=iq))
                    if self.write_to_disk:
                        itth_name = render_clean_makedir(
                            self.light_template,
                            human_timestamp=h_timestamp,
                            raw_event=doc,
                            raw_start=self.start_doc,
                            raw_descriptor=self.descriptor_doc,
                            analysis_stage='iq_tth',
                            ext='_tth.chi')

                        save_output(tth, iq, itth_name, '2theta')

                    if self.composition:
                        fq_q, fq, fq_config = fq_getter(
                            q,
                            iq,
                            composition=self.composition,
                            **self.fq_kwargs)
                        if self.vis:
                            self.vis_callbacks['fq']('event',
                                                     format_event(q=fq_q,
                                                                  fq=fq))

                        r, gr, pdf_config = pdf_getter(
                            q,
                            iq,
                            composition=self.composition,
                            **self.pdf_kwargs)
                        if self.vis:
                            self.vis_callbacks['pdf']('event',
                                                      format_event(r=r,
                                                                   pdf=gr))
                        if self.write_to_disk:
                            pdf_name = render_clean_makedir(
                                self.light_template,
                                human_timestamp=h_timestamp,
                                raw_event=doc,
                                raw_start=self.start_doc,
                                raw_descriptor=self.descriptor_doc,
                                analysis_stage='pdf',
                                ext='.gr')
                            pdf_saver(r, gr, pdf_config, pdf_name)