Example #1
0
def show_event(ind, track, mom, classifier):
    """
    Plot stuff for one event.

    geant4 is cyan
    ridge-following is light green
    moments is magenta
    """

    if track.g4track.energy_tot_kev < 100:
        print('Low energy event: {} keV'.format(track.g4track.energy_tot_kev))
        return None

    mom.reconstruct()
    try:
        _, HTinfo = ht.reconstruct(track)
    except ht.HybridTrackError:
        HTinfo = None

    # geant4 position
    g4x, g4y = tp.get_image_xy(track)
    g4x0 = np.array([g4x[0], g4y[0]])
    # geant4 direction (radians)
    g4_alpha_deg = track.g4track.alpha_deg
    g4_alpha_rad = g4_alpha_deg * np.pi / 180.0

    # moments
    mom_arc, mom_ep = tp.get_arc2(mom)
    mom_alpha_rad = mom.alpha
    reject_flag, reject_reason = mom_reject(mom)
    mom_da = ev.AlphaUncertainty.delta_alpha(
        g4_alpha_deg, mom_alpha_rad * 180.0 / np.pi)

    # ridge-following
    # HTinfo = track.algorithms['python HT v1.52'].info
    ridge_ep = (HTinfo.ridge[HTinfo.measurement_start_pt].coordinates_pix
                - np.array([1, 1]))
    ridge_alpha_rad = (track.algorithms['python HT v1.52'].alpha_deg
                       * np.pi / 180.0)
    ridge_da = ev.AlphaUncertainty.delta_alpha(
        g4_alpha_deg, ridge_alpha_rad * 180.0 / np.pi)

    titlebase = (
        r'{}' + '\n' +
        r'E={:.0f}keV, $\beta$={:.0f}{deg}, ' +
        r'scattering {:.1f}{deg}, E_end={:.1f}keV' + '\n' +
        r'Rejection: {}' + '\n')
    titlestr = titlebase.format(
        ind,
        track.g4track.energy_tot_kev,
        track.g4track.beta_deg,
        classifier.total_scatter_angle * 180 / np.pi,
        mom.end_energy,
        reject_reason,
        deg=DEG,)
    if np.abs(classifier.g4track.beta_deg) > 60:
        titlestr += '[Beta > 60{}]'.format(DEG)
    if classifier.early_scatter:
        titlestr += ' [Early scatter in 25um]'
    if classifier.overlap:
        titlestr += ' [Overlapping]'
    if classifier.wrong_end:
        titlestr += ' [Wrong end]'

    # PLOTS
    fig = plt.figure()

    # top left: ridge-following, zoomed
    plt.subplot(2, 2, 1)
    # g4
    plot_track(track.image)
    plt.plot(g4y, g4x, '.c')
    tp.plot_arrow(g4x0, g4_alpha_rad, color='c')
    # ridge
    ridge = HTinfo.ridge[HTinfo.measurement_start_pt:HTinfo.measurement_end_pt]
    tp.plot_ridgepoints(
        plt.gca(), ridge, fmtstring='.', offset=[1, 1], color=[0, 1, 0])
    tp.plot_arrow(ridge_ep, ridge_alpha_rad, color=[0, 1, 0])
    # general
    xoff = mom.end_segment_offsets[1]
    yoff = mom.end_segment_offsets[0]
    plt.xlim((xoff - 1, xoff + mom.end_segment_image.shape[1] + 1))
    plt.ylim((yoff - 1, yoff + mom.end_segment_image.shape[0] + 1))
    plt.xlabel('y [pixels]')
    plt.ylabel('x [pixels]')
    plt.colorbar()

    # bottom left: ridge-following, full
    plt.subplot(2, 2, 3)
    # g4
    plot_track(track.image)
    plt.plot(g4y, g4x, '.c')
    tp.plot_arrow(g4x0, g4_alpha_rad, color='c')
    # ridge
    ridge = HTinfo.ridge[HTinfo.measurement_start_pt:HTinfo.measurement_end_pt]
    tp.plot_ridgepoints(
        plt.gca(), ridge, fmtstring='.', offset=[1, 1], color=[0, 1, 0])
    tp.plot_arrow(ridge_ep, ridge_alpha_rad, color=[0, 1, 0])
    # general
    plt.xlim((0, track.image.shape[1] - 1))
    plt.ylim((0, track.image.shape[0] - 1))
    plt.xlabel('y [pixels]')
    plt.ylabel('x [pixels]')
    plt.colorbar()
    plt.title(r'Ridge-following, $\Delta_\alpha$ = {:2.1f}{}'.format(
        ridge_da, DEG))

    # top right: moments, zoomed
    plt.subplot(2, 2, 2)
    # g4
    plot_track(track.image)
    plt.plot(g4y, g4x, '.c')
    tp.plot_arrow(g4x0, g4_alpha_rad, color='c')
    # moments
    plt.plot(mom.box_y, mom.box_x, 'm')
    if reject_flag:
        plt.plot(mom_arc[1, :], mom_arc[0, :], 'm', lw=2.5, ls='dashed')
        tp.plot_arrow(mom_ep, mom_alpha_rad, color='m', ls='dashed')
    else:
        plt.plot(mom_arc[1, :], mom_arc[0, :], 'm', lw=2.5)
        tp.plot_arrow(mom_ep, mom_alpha_rad, color='m')
    # general
    xoff = mom.end_segment_offsets[1]
    yoff = mom.end_segment_offsets[0]
    plt.xlim((xoff - 1, xoff + mom.end_segment_image.shape[1] + 1))
    plt.ylim((yoff - 1, yoff + mom.end_segment_image.shape[0] + 1))
    plt.xlabel('y [pixels]')
    plt.ylabel('x [pixels]')
    plt.colorbar()

    # bottom right: moments, full
    plt.subplot(2, 2, 4)
    # g4
    plot_track(track.image)
    plt.plot(g4y, g4x, '.c')
    tp.plot_arrow(g4x0, g4_alpha_rad, color='c')
    # moments
    plt.plot(mom.box_y, mom.box_x, 'm')
    if reject_flag:
        plt.plot(mom_arc[1, :], mom_arc[0, :], 'm', lw=2.5, ls='dashed')
        tp.plot_arrow(mom_ep, mom_alpha_rad, color='m', ls='dashed')
    else:
        plt.plot(mom_arc[1, :], mom_arc[0, :], 'm', lw=2.5)
        tp.plot_arrow(mom_ep, mom_alpha_rad, color='m')
    # general
    plt.xlim((0, track.image.shape[1] - 1))
    plt.ylim((0, track.image.shape[0] - 1))
    plt.xlabel('y [pixels]')
    plt.ylabel('x [pixels]')
    plt.colorbar()
    plt.title(r'Moments, $\Delta_\alpha$ = {:2.1f}{}'.format(mom_da, DEG))

    fig.suptitle(titlestr)

    figManager = plt.get_current_fig_manager()
    figManager.window.showMaximized()
    plt.show()
    return fig
Example #2
0
def classify_etc(loadfile, savefile, v):
    """
    1. Moments algorithm
    2. HybridTrack algorithm
    3. Classify
    """

    progressflag = not file_vars()[0]

    pn = 'pix10_5noise15'
    HTname = 'python HT v1.52'
    MTname = 'moments v1.0'

    vprint(v, 1, 'Starting {} at {} with {}% mem usage'.format(
        loadfile, time.ctime(), psutil.virtual_memory().percent))

    pyobj_to_h5 = {}

    try:
        with h5py.File(loadfile, 'a', driver='core') as f, h5py.File(
                savefile, 'a', driver='core') as h5save:
            #
            n = 0
            if progressflag:
                pbar = progressbar.ProgressBar(
                    widgets=[progressbar.Percentage(), ' ',
                             progressbar.Bar(), ' ',
                             progressbar.ETA()], maxval=len(f))
                pbar.start()

            keylist = f.keys()
            keylist.sort()
            for ind in keylist:
                vprint(v, 3, 'Beginning track {} in {}'.format(ind, loadfile))
                if int(ind) % 50 == 0:
                    vprint(v, 2,
                           'Beginning track {} in {}'.format(ind, loadfile))

                # evt is for the G4Track object
                evt = f[ind]
                # shouldn't get a KeyError because we are looping over ind

                # trk is for the Track object
                try:
                    trk = evt[pn]
                except KeyError:
                    vprint(v, 1,
                           '**Missing key {} in {}{}, skipping'.format(
                               pn, loadfile, evt.name))
                    continue

                trkpath = ind + '/' + pn
                errorcode = 0
                n += 1

                if n > 50:
                    # testing
                    # vprint(v, 1, 'Finished 50 files, exiting')
                    # break
                    pass

                # load G4Track
                vprint(v, 3, 'Loading G4Track {} in {}'.format(ind, loadfile))
                try:
                    this_g4track = G4Track.from_dth5(evt)
                except trackio.InterfaceError:
                    vprint(v, 2, 'InterfaceError in G4Track at {}, {}'.format(
                        loadfile, ind))
                    continue

                # load Track
                vprint(v, 3, 'Loading Track {} in {}'.format(ind, loadfile))
                try:
                    this_track = Track.from_dth5(trk, g4track=this_g4track)
                except trackio.InterfaceError:
                    vprint(v, 2, 'InterfaceError in Track at {}, {}'.format(
                        loadfile, ind))
                    continue

                # check for error codes - Track.from_dth5 may return an int
                if isinstance(this_track, int):
                    this_save = h5save.create_group(trkpath)
                    this_save.attrs.create(
                        'errorcode', this_track, shape=np.shape(this_track))
                    continue

                # run moments algorithm
                vprint(v, 3, 'Running moments on track {} in {}'.format(
                    ind, loadfile))
                try:
                    mom = tm.MomentsReconstruction(this_track.image)
                    mom.reconstruct()
                except ht.NoEndsFound:
                    mom.alpha = None
                    errorcode = 4
                    this_save = h5save.create_group('mom_' + trkpath)
                    this_save.attrs.create(
                        'errorcode', errorcode, shape=np.shape(errorcode))
                else:
                    # write into savefile
                    trackio.write_object_to_hdf5(
                        mom, h5save, 'mom_' + trkpath, pyobj_to_h5=pyobj_to_h5)
                # write into track object
                if mom.alpha:
                    this_track.add_algorithm(
                        MTname,
                        alpha_deg=mom.alpha * 180 / np.pi,
                        beta_deg=np.nan, info=None)
                else:
                    this_track.add_algorithm(
                        MTname,
                        alpha_deg=np.nan,
                        beta_deg=np.nan, info=None)

                # run HT algorithm (v1.52)
                vprint(v, 3, 'Running HT on track {} in {}'.format(
                    ind, loadfile))
                try:
                    _, HTinfo = ht.reconstruct(this_track)
                except (ht.InfiniteLoop, ht.NoEndsFound):
                    # write empty into track object
                    this_track.add_algorithm(
                        HTname,
                        alpha_deg=np.nan,
                        beta_deg=np.nan,
                        info=None)
                else:
                    # trim memory usage
                    if hasattr(HTinfo, 'ridge'):
                        if HTinfo.ridge:
                            for ridgept in HTinfo.ridge:
                                ridgept.cuts = None
                                ridgept.best_cut = None
                    # write into track object
                    this_track.add_algorithm(
                        HTname,
                        alpha_deg=HTinfo.alpha_deg,
                        beta_deg=HTinfo.beta_deg,
                        info=HTinfo)

                # write py HDF5 format into savefile (including alg outputs)
                try:
                    trackio.write_object_to_hdf5(
                        this_track, h5save, trkpath,
                        pyobj_to_h5=pyobj_to_h5)
                except trackio.InterfaceError:
                    vprint(v, 1, 'InterfaceError writing to file at ' +
                           '{}, {}'.format(savefile, ind))
                    continue

                # run classifier
                vprint(v, 3, 'Running MC classifier on track {} in {}'.format(
                    ind, loadfile))
                classifier = cl.Classifier(this_track.g4track)
                try:
                    classifier.mc_classify()
                except cl.TrackTooShortError:
                    classifier.error = 'TrackTooShortError'
                else:
                    vprint(v, 3,
                           'Running ends classifier on track {} in {}'.format(
                               ind, loadfile))
                    try:
                        classifier.end_classify(this_track, mom=mom)
                    except tp.G4TrackTooBigError:
                        classifier.error = 'G4TrackTooBigError'
                    except cl.NoEnds:
                        classifier.error = 'NoEnds'
                # write into savefile
                vprint(v, 3, 'Writing classifier into {} for track {}'.format(
                    savefile, ind))
                trackio.write_object_to_hdf5(
                    classifier, h5save, 'cl_' + trkpath,
                    pyobj_to_h5=pyobj_to_h5)

                if progressflag:
                    pbar.update(n)
            if progressflag:
                pbar.finish()
        # f gets closed here
    except NotImplementedError:
        pass
Example #3
0
def test_Track():
    """
    """
    def test_Track_read(track):
        # test Track data format
        from etrack.io import trackio
        import os

        filebase = ''.join(
            chr(i) for i in np.random.randint(97, 122, size=(8, )))
        filename = '.'.join([filebase, 'h5'])
        with h5py.File(filename, 'a') as h5file:
            trackio.write_object_to_hdf5(track, h5file, 'track')
        with h5py.File(filename, 'r') as h5file:
            track2 = trackio.read_object_from_hdf5(h5file['track'])

        assert track2['is_modeled'] == track.is_modeled
        assert track2['pixel_size_um'] == track.pixel_size_um
        assert track2['noise_ev'] == track.noise_ev
        assert track2['label'] == track.label
        assert track2['energy_kev'] == track.energy_kev
        assert np.all(track2['image'] == track.image)

        assert track2['algorithms']['python HT v1.5']['alpha_deg'] == 120.5
        assert track2['algorithms']['python HT v1.5']['beta_deg'] == 43.5

        test_Track_from_pydict(track, track2)

        test_Track_from_hdf5()

        os.remove(filename)

    def test_Track_from_pydict(track, track2):
        """
        track is the original generated Track object
        track2 is the pydict from file

        Returns the track object constructed from pydict.
        """
        track3 = Track.from_pydict(track2)
        assert track3.is_modeled == track.is_modeled
        assert track3.pixel_size_um == track.pixel_size_um
        assert track3.noise_ev == track.noise_ev
        assert track3.label == track.label
        assert track3.energy_kev == track.energy_kev
        assert np.all(track3.image == track.image)

        assert track3.algorithms['python HT v1.5'].alpha_deg == 120.5
        assert track3.algorithms['python HT v1.5'].beta_deg == 43.5

        return track3

    def test_Track_from_hdf5():
        """
        as previously, but test the Track.from_hdf5() constructor.
        """

        # TODO
        print('test_Track_from_hdf5 not implemented yet!')
        pass

    def test_TrackExceptions():
        """
        """

        image = hybridtrack.test_input()
        try:
            Track(image)
            raise RuntimeError('Failed to raise error on Track instantiation')
        except InputError:
            pass

        try:
            Track(image, is_modeled=True, is_measured=True)
            raise RuntimeError('Failed to raise error on Track instantiation')
        except InputError:
            pass

        try:
            Track(image, is_modeled=False, is_measured=False)
            raise RuntimeError('Failed to raise error on Track instantiation')
        except InputError:
            pass

    # test_Track() main

    image = hybridtrack.test_input()

    track = Track(image,
                  is_modeled=True,
                  pixel_size_um=10.5,
                  noise_ev=0.0,
                  label='MultiAngle',
                  energy_kev=np.sum(image))
    options, info = hybridtrack.reconstruct(track)

    track.add_algorithm('python HT v1.5', 120.5, 43.5, info=info)

    test_Track_read(track)

    test_TrackExceptions()
Example #4
0
def test_Track():
    """
    """

    def test_Track_read(track):
        # test Track data format
        from etrack.io import trackio
        import os

        filebase = ''.join(
            chr(i) for i in np.random.randint(97, 122, size=(8,)))
        filename = '.'.join([filebase, 'h5'])
        with h5py.File(filename, 'a') as h5file:
            trackio.write_object_to_hdf5(
                track, h5file, 'track')
        with h5py.File(filename, 'r') as h5file:
            track2 = trackio.read_object_from_hdf5(
                h5file['track'])

        assert track2['is_modeled'] == track.is_modeled
        assert track2['pixel_size_um'] == track.pixel_size_um
        assert track2['noise_ev'] == track.noise_ev
        assert track2['label'] == track.label
        assert track2['energy_kev'] == track.energy_kev
        assert np.all(track2['image'] == track.image)

        assert track2['algorithms']['python HT v1.5']['alpha_deg'] == 120.5
        assert track2['algorithms']['python HT v1.5']['beta_deg'] == 43.5

        test_Track_from_pydict(track, track2)

        test_Track_from_hdf5()

        os.remove(filename)

    def test_Track_from_pydict(track, track2):
        """
        track is the original generated Track object
        track2 is the pydict from file

        Returns the track object constructed from pydict.
        """
        track3 = Track.from_pydict(track2)
        assert track3.is_modeled == track.is_modeled
        assert track3.pixel_size_um == track.pixel_size_um
        assert track3.noise_ev == track.noise_ev
        assert track3.label == track.label
        assert track3.energy_kev == track.energy_kev
        assert np.all(track3.image == track.image)

        assert track3.algorithms['python HT v1.5'].alpha_deg == 120.5
        assert track3.algorithms['python HT v1.5'].beta_deg == 43.5

        return track3

    def test_Track_from_hdf5():
        """
        as previously, but test the Track.from_hdf5() constructor.
        """

        # TODO
        print('test_Track_from_hdf5 not implemented yet!')
        pass

    def test_TrackExceptions():
        """
        """

        image = hybridtrack.test_input()
        try:
            Track(image)
            raise RuntimeError('Failed to raise error on Track instantiation')
        except InputError:
            pass

        try:
            Track(image, is_modeled=True, is_measured=True)
            raise RuntimeError('Failed to raise error on Track instantiation')
        except InputError:
            pass

        try:
            Track(image, is_modeled=False, is_measured=False)
            raise RuntimeError('Failed to raise error on Track instantiation')
        except InputError:
            pass

    # test_Track() main

    image = hybridtrack.test_input()

    track = Track(image, is_modeled=True, pixel_size_um=10.5, noise_ev=0.0,
                  label='MultiAngle', energy_kev=np.sum(image))
    options, info = hybridtrack.reconstruct(track)

    track.add_algorithm('python HT v1.5', 120.5, 43.5, info=info)

    test_Track_read(track)

    test_TrackExceptions()
Example #5
0
def show_event(ind, track, mom, classifier):
    """
    Plot stuff for one event.

    geant4 is cyan
    ridge-following is light green
    moments is magenta
    """

    if track.g4track.energy_tot_kev < 100:
        print('Low energy event: {} keV'.format(track.g4track.energy_tot_kev))
        return None

    mom.reconstruct()
    try:
        _, HTinfo = ht.reconstruct(track)
    except ht.HybridTrackError:
        HTinfo = None

    # geant4 position
    g4x, g4y = tp.get_image_xy(track)
    g4x0 = np.array([g4x[0], g4y[0]])
    # geant4 direction (radians)
    g4_alpha_deg = track.g4track.alpha_deg
    g4_alpha_rad = g4_alpha_deg * np.pi / 180.0

    # moments
    mom_arc, mom_ep = tp.get_arc2(mom)
    mom_alpha_rad = mom.alpha
    reject_flag, reject_reason = mom_reject(mom)
    mom_da = ev.AlphaUncertainty.delta_alpha(g4_alpha_deg,
                                             mom_alpha_rad * 180.0 / np.pi)

    # ridge-following
    # HTinfo = track.algorithms['python HT v1.52'].info
    ridge_ep = (HTinfo.ridge[HTinfo.measurement_start_pt].coordinates_pix -
                np.array([1, 1]))
    ridge_alpha_rad = (track.algorithms['python HT v1.52'].alpha_deg * np.pi /
                       180.0)
    ridge_da = ev.AlphaUncertainty.delta_alpha(g4_alpha_deg,
                                               ridge_alpha_rad * 180.0 / np.pi)

    titlebase = (r'{}' + '\n' + r'E={:.0f}keV, $\beta$={:.0f}{deg}, ' +
                 r'scattering {:.1f}{deg}, E_end={:.1f}keV' + '\n' +
                 r'Rejection: {}' + '\n')
    titlestr = titlebase.format(
        ind,
        track.g4track.energy_tot_kev,
        track.g4track.beta_deg,
        classifier.total_scatter_angle * 180 / np.pi,
        mom.end_energy,
        reject_reason,
        deg=DEG,
    )
    if np.abs(classifier.g4track.beta_deg) > 60:
        titlestr += '[Beta > 60{}]'.format(DEG)
    if classifier.early_scatter:
        titlestr += ' [Early scatter in 25um]'
    if classifier.overlap:
        titlestr += ' [Overlapping]'
    if classifier.wrong_end:
        titlestr += ' [Wrong end]'

    # PLOTS
    fig = plt.figure()

    # top left: ridge-following, zoomed
    plt.subplot(2, 2, 1)
    # g4
    plot_track(track.image)
    plt.plot(g4y, g4x, '.c')
    tp.plot_arrow(g4x0, g4_alpha_rad, color='c')
    # ridge
    ridge = HTinfo.ridge[HTinfo.measurement_start_pt:HTinfo.measurement_end_pt]
    tp.plot_ridgepoints(plt.gca(),
                        ridge,
                        fmtstring='.',
                        offset=[1, 1],
                        color=[0, 1, 0])
    tp.plot_arrow(ridge_ep, ridge_alpha_rad, color=[0, 1, 0])
    # general
    xoff = mom.end_segment_offsets[1]
    yoff = mom.end_segment_offsets[0]
    plt.xlim((xoff - 1, xoff + mom.end_segment_image.shape[1] + 1))
    plt.ylim((yoff - 1, yoff + mom.end_segment_image.shape[0] + 1))
    plt.xlabel('y [pixels]')
    plt.ylabel('x [pixels]')
    plt.colorbar()

    # bottom left: ridge-following, full
    plt.subplot(2, 2, 3)
    # g4
    plot_track(track.image)
    plt.plot(g4y, g4x, '.c')
    tp.plot_arrow(g4x0, g4_alpha_rad, color='c')
    # ridge
    ridge = HTinfo.ridge[HTinfo.measurement_start_pt:HTinfo.measurement_end_pt]
    tp.plot_ridgepoints(plt.gca(),
                        ridge,
                        fmtstring='.',
                        offset=[1, 1],
                        color=[0, 1, 0])
    tp.plot_arrow(ridge_ep, ridge_alpha_rad, color=[0, 1, 0])
    # general
    plt.xlim((0, track.image.shape[1] - 1))
    plt.ylim((0, track.image.shape[0] - 1))
    plt.xlabel('y [pixels]')
    plt.ylabel('x [pixels]')
    plt.colorbar()
    plt.title(r'Ridge-following, $\Delta_\alpha$ = {:2.1f}{}'.format(
        ridge_da, DEG))

    # top right: moments, zoomed
    plt.subplot(2, 2, 2)
    # g4
    plot_track(track.image)
    plt.plot(g4y, g4x, '.c')
    tp.plot_arrow(g4x0, g4_alpha_rad, color='c')
    # moments
    plt.plot(mom.box_y, mom.box_x, 'm')
    if reject_flag:
        plt.plot(mom_arc[1, :], mom_arc[0, :], 'm', lw=2.5, ls='dashed')
        tp.plot_arrow(mom_ep, mom_alpha_rad, color='m', ls='dashed')
    else:
        plt.plot(mom_arc[1, :], mom_arc[0, :], 'm', lw=2.5)
        tp.plot_arrow(mom_ep, mom_alpha_rad, color='m')
    # general
    xoff = mom.end_segment_offsets[1]
    yoff = mom.end_segment_offsets[0]
    plt.xlim((xoff - 1, xoff + mom.end_segment_image.shape[1] + 1))
    plt.ylim((yoff - 1, yoff + mom.end_segment_image.shape[0] + 1))
    plt.xlabel('y [pixels]')
    plt.ylabel('x [pixels]')
    plt.colorbar()

    # bottom right: moments, full
    plt.subplot(2, 2, 4)
    # g4
    plot_track(track.image)
    plt.plot(g4y, g4x, '.c')
    tp.plot_arrow(g4x0, g4_alpha_rad, color='c')
    # moments
    plt.plot(mom.box_y, mom.box_x, 'm')
    if reject_flag:
        plt.plot(mom_arc[1, :], mom_arc[0, :], 'm', lw=2.5, ls='dashed')
        tp.plot_arrow(mom_ep, mom_alpha_rad, color='m', ls='dashed')
    else:
        plt.plot(mom_arc[1, :], mom_arc[0, :], 'm', lw=2.5)
        tp.plot_arrow(mom_ep, mom_alpha_rad, color='m')
    # general
    plt.xlim((0, track.image.shape[1] - 1))
    plt.ylim((0, track.image.shape[0] - 1))
    plt.xlabel('y [pixels]')
    plt.ylabel('x [pixels]')
    plt.colorbar()
    plt.title(r'Moments, $\Delta_\alpha$ = {:2.1f}{}'.format(mom_da, DEG))

    fig.suptitle(titlestr)

    figManager = plt.get_current_fig_manager()
    figManager.window.showMaximized()
    plt.show()
    return fig