Beispiel #1
0
def bisym_mod(vel, evel, guess0, vary, n_it, rstart, rfinal, ring_space,
              frac_pixel, r_back, delta, pixel_scale, r_bar_max, errors,
              config, e_ISM):
    #def bisym_mod(vel, evel, guess0, vary, n_it=5,rstart = 2, rfinal = 55, ring_space = 2, frac_pixel = 0.7, r_back = 20, delta = 1, pixel_scale = 0.2, r_bar_max = 20):

    vrot0, vr20, pa0, inc0, x0, y0, vsys0, vtan, theta_b = guess0
    vmode = "bisymmetric"
    [ny, nx] = vel.shape
    shape = [ny, nx]
    """

		 					BYSIMETRIC MODEL


		"""

    chisq_global = 1e4
    PA, INC, XC, YC, VSYS = 0, 0, 0, 0, 0
    Vrot, Vrad, Vsys, Vtan = [], [], [], []
    R = 0

    if r_back < ring_space:
        r_back = ring_space

    for jj in np.arange(0, r_back, ring_space):
        for it in range(n_it):
            guess = [vrot0, vr20, pa0, inc0, x0, y0, vsys0, 0, theta_b]

            #theta_b = np.arctan(np.tan(theta_b*np.pi/180-pa0*np.pi/180)/np.cos(inc0*np.pi/180))*180/np.pi

            xi_sq_array = np.asarray([])
            N = np.asarray([])

            vrot_model, vrad_model, vtan_model = np.asarray([]), np.asarray(
                []), np.asarray([])
            los_vel = np.array([])
            e_los_vel = np.array([])
            x_pos = np.array([])
            y_pos = np.array([])

            los_vel = []
            e_los_vel = []
            x_pos = []
            y_pos = []
            xy_pos = []
            r = []

            for j in np.arange(rstart, rfinal - jj, ring_space):

                XY_mesh, vel_val, e_vel, f_pixel = pixels(
                    vel,
                    evel,
                    guess,
                    ringpos=j,
                    delta=delta,
                    ring="ARCSEC",
                    pixel_scale=pixel_scale)
                npixels = len(XY_mesh[0])

                if j < 10:
                    f_pixel = 1

                if f_pixel > frac_pixel:

                    if j < r_bar_max:

                        # Create bisymetric model
                        try:
                            w_sys, w_rot, w_rad, w_tan, vrot, vrad, vsys, vtan = M_radial(
                                XY_mesh, 0, 0, pa0, inc0, x0, y0, vsys0, 0,
                                theta_b, vel_val - vsys0, e_vel, vmode)
                            vrot_model, vrad_model, vtan_model = np.append(
                                vrot_model,
                                vrot), np.append(vrad_model, vrad), np.append(
                                    vtan_model, vtan)
                        except (np.linalg.LinAlgError):
                            vrot_model, vrad_model, vtan_model = np.append(
                                vrot_model,
                                100), np.append(vrad_model,
                                                10), np.append(vtan_model, 10)

                    else:

                        # Create ciruclar model
                        w_rot, w_rad, vrot, vrad = M_radial(XY_mesh,
                                                            0,
                                                            0,
                                                            pa0,
                                                            inc0,
                                                            x0,
                                                            y0,
                                                            vsys0,
                                                            0,
                                                            theta_b,
                                                            vel_val - vsys0,
                                                            e_vel,
                                                            vmode="circular")
                        vrot_model, vrad_model, vtan_model = np.append(
                            vrot_model,
                            vrot), np.append(vrad_model,
                                             0), np.append(vtan_model, 0)

                    r.append(j)
                    los_vel.append(vel_val)
                    e_los_vel.append(e_vel)
                    x_pos.append(XY_mesh[0])
                    y_pos.append(XY_mesh[1])
                    xy_pos.append(XY_mesh)

            guess = [
                vrot_model + 1, vrad_model + 1, pa0, inc0, x0, y0, vsys0,
                vtan_model + 1, theta_b
            ]

            vrot, vrad, vsys0, pa0, inc0, x0, y0, vtan, theta_b, xi_sq, n_data = fit(
                shape,
                los_vel,
                e_los_vel,
                xy_pos,
                guess,
                vary,
                vmode,
                config,
                fit_method="Powell",
                r_bar_max=r_bar_max,
                e_ISM=e_ISM)

            if xi_sq < chisq_global:

                PA, INC, XC, YC, VSYS, THETA = pa0, inc0, x0, y0, vsys0, theta_b
                LOS_VEL, eLOS_VEL = los_vel, e_los_vel
                Vrot = vrot
                Vrad = vrad
                Vtan = vtan
                R = r
                XY_PIX_POS = xy_pos
                chisq_global = xi_sq
                #print("chisq_global1 = ", chisq_global)

            if it == n_it - 1:

                vrot_poly = legendre(R, Vrot)
                vrad_poly = legendre(R, Vrad)
                vtan_poly = legendre(R, Vtan)
                guess_end = [
                    vrot_poly, vrad_poly, PA, INC, XC, YC, VSYS, vtan_poly,
                    THETA
                ]
                guess_end = [
                    vrot_poly, Vrad, PA, INC, XC, YC, VSYS, Vtan, THETA
                ]
                vary_end = [
                    True, True, False, False, False, False, False, True, False
                ]
                #vary_end = [True,True,True,True,True,True,True,True,True]

                Vrot, Vrad, vsys0, pa0, inc0, x0, y0, Vtan, theta_b, xi_sq, n_data = fit(
                    shape,
                    LOS_VEL,
                    eLOS_VEL,
                    XY_PIX_POS,
                    guess_end,
                    vary_end,
                    vmode,
                    "",
                    fit_method="Powell",
                    r_bar_max=r_bar_max,
                    e_ISM=e_ISM)

                #print("chisq_global2=", xi_sq)

                MODEL_not_interp = np.zeros((ny, nx))
                N = len(LOS_VEL)
                for k in range(N):
                    for mm, nn in zip(XY_PIX_POS[k][0], XY_PIX_POS[k][1]):
                        MODEL_not_interp[nn][mm] = vlos(
                            mm, nn, Vrot[k], Vrad[k], PA, INC, XC, YC, VSYS,
                            Vtan[k], THETA, vmode) - VSYS

                MODEL_interp = vlos_interp(XY_PIX_POS, R, Vrot, Vrad, PA, INC,
                                           XC, YC, VSYS, Vtan, THETA, vmode,
                                           shape, pixel_scale)

                # For error estimation:
                LoS, eLoS, XY_pixels = los_vel, e_los_vel, xy_pos
                best = guess

    MODEL_not_interp[MODEL_not_interp == 0] = np.nan
    MODELS = [MODEL_interp, MODEL_not_interp]

    R = np.asarray(R)
    Vtan = np.asarray(Vtan)
    Vrad = np.asarray(Vrad)
    Vrot = np.asarray(Vrot)
    PA_bar_major = pa_bar_sky(PA, INC, THETA)
    PA_bar_minor = pa_bar_sky(PA, INC, THETA - 90)

    if errors == 1:
        from mcmc import fit_mcmc
        res_mcmc = fit_mcmc(shape,
                            LOS_VEL,
                            eLOS_VEL,
                            XY_PIX_POS,
                            guess_end,
                            vary_end,
                            vmode,
                            "",
                            fit_method="emcee",
                            e_ISM=e_ISM)
    else:
        res_mcmc = Vrot * 0, [Vrot * 0, Vrot * 0], Vrot * 0, [
            Vrot * 0, Vrot * 0
        ], 0, [0, 0], 0, [0, 0], 0, [0, 0], 0, [0, 0], 0, [0, 0], 0, [
            0, 0
        ], Vrot * 0, [Vrot * 0, Vrot * 0]

    return PA, INC, XC, YC, VSYS, THETA, R, Vrot, Vrad, Vtan, MODELS, PA_bar_major, PA_bar_minor, chisq_global, res_mcmc
def circ_mod(vel, evel, guess0, vary, n_it, rstart, rfinal, ring_space,
             frac_pixel, delta, pixel_scale, bar_min_max, errors, config,
             e_ISM):

    vrot0, vr20, pa0, inc0, x0, y0, vsys0, vtan, theta_b = guess0
    vmode = "circular"
    [ny, nx] = vel.shape
    shape = [ny, nx]
    """

		 					CIRCULAR MODEL


		"""

    chisq_global = 1e10
    PA, INC, XC, YC, VSYS = 0, 0, 0, 0, 0
    Vrot, Vrad, Vsys, Vtan = [], [], [], []
    R = 0
    best_xy_pix = []

    rings = np.arange(rstart, rfinal, ring_space)

    for it in np.arange(n_it):
        guess = [vrot0, vr20, pa0, inc0, x0, y0, vsys0, 0, theta_b]

        vrot_tab, vrad_tab, vtan_tab = np.asarray([]), np.asarray(
            []), np.asarray([])
        index = 0

        nrings = len(rings)
        n_annulus = nrings - 1

        R_pos = np.asarray([])
        for ring in rings:

            from pixel_params import pixels
            fpix = pixels(shape,
                          vel,
                          pa0,
                          inc0,
                          x0,
                          y0,
                          ring,
                          delta=delta,
                          pixel_scale=pixel_scale)
            if fpix > frac_pixel:

                v_rot_k, v_rad_k, v_tan_k = M_tab(pa0,
                                                  inc0,
                                                  x0,
                                                  y0,
                                                  theta_b,
                                                  ring,
                                                  delta,
                                                  index,
                                                  shape,
                                                  vel - vsys0,
                                                  evel,
                                                  pixel_scale=pixel_scale,
                                                  vmode=vmode)

                vrot_tab = np.append(vrot_tab, v_rot_k)
                R_pos = np.append(R_pos, ring)

        if np.nanmean(vrot_tab) < 0:
            vrot_tab = abs(vrot_tab)
            pa0 = pa0 - 180
            if pa0 < 0: pa0 = pa0 + 360

        guess = [
            vrot_tab + 1, vrad_tab + 1, pa0, inc0, x0, y0, vsys0, vtan_tab,
            theta_b
        ]
        v_2D_mdl, kin_2D_modls, vrot, vsys0, pa0, inc0, x0, y0, xi_sq, n_data, Errors = fit(
            shape,
            vel,
            evel,
            guess,
            vary,
            vmode,
            config,
            R_pos,
            fit_method="powell",
            e_ISM=e_ISM,
            pixel_scale=pixel_scale,
            ring_space=ring_space)

        if xi_sq < chisq_global:

            PA, INC, XC, YC, VSYS, THETA = pa0, inc0, x0, y0, vsys0, theta_b
            Vrot = vrot
            chisq_global = xi_sq
            best_vlos_2D_model = v_2D_mdl
            best_kin_2D_models = kin_2D_modls
            Rings = R_pos
            std_errors = Errors
            GUESS = [Vrot, 0, PA, INC, XC, YC, VSYS, 0, 0]

    Vrot = np.array(Vrot)

    if errors == 1:

        from mcmc import fit_mcmc
        res_mcmc = fit_mcmc(shape,
                            vel,
                            evel,
                            GUESS,
                            vary,
                            vmode,
                            "",
                            Rings,
                            fit_method="emcee",
                            e_ISM=e_ISM,
                            pixel_scale=pixel_scale,
                            ring_space=ring_space)

    else:

        std_Vrot, std_Vrad, std_pa, std_inc, std_x0, std_y0, std_Vsys, std_theta, std_Vtan = std_errors

        res_mcmc = Vrot * 0, [std_Vrot, std_Vrot], Vrot * 0, [
            std_Vrad, std_Vrad
        ], 0, [std_pa,
               std_pa], 0, [std_inc, std_inc], 0, [std_x0, std_x0], 0, [
                   std_y0, std_y0
               ], 0, [std_Vsys,
                      std_Vsys], 0, [std_theta, std_theta
                                     ], Vrot * 0, [std_Vtan, std_Vtan]

    return PA, INC, XC, YC, VSYS, 0, Rings, Vrot, 0 * Vrot, 0 * Vrot, best_vlos_2D_model, best_kin_2D_models, chisq_global, res_mcmc
def bisym_mod(vel, evel, guess0, vary, n_it, rstart, rfinal, ring_space,
              frac_pixel, delta, pixel_scale, bar_min_max, errors, config,
              e_ISM):
    #def bisym_mod(vel, evel, guess0, vary, n_it=5,rstart = 2, rfinal = 55, ring_space = 2, frac_pixel = 0.7, r_back = 20, delta = 1, pixel_scale = 0.2, r_bar_max = 20):

    vrot0, vr20, pa0, inc0, x0, y0, vsys0, vtan, theta_b = guess0
    vmode = "bisymmetric"
    [ny, nx] = vel.shape
    shape = [ny, nx]
    r_bar_min, r_bar_max = bar_min_max
    """

		 					BYSIMETRIC MODEL


		"""

    chisq_global = 1e10
    PA, INC, XC, YC, VSYS = 0, 0, 0, 0, 0
    Vrot, Vrad, Vsys, Vtan = [], [], [], []
    R = 0
    best_xy_pix = []

    rings = np.arange(rstart, rfinal, ring_space)

    for it in np.arange(n_it):
        guess = [vrot0, vr20, pa0, inc0, x0, y0, vsys0, 0, theta_b]

        vrot_tab, vrad_tab, vtan_tab = np.asarray([]), np.asarray(
            []), np.asarray([])
        index = 0

        nrings = len(rings)
        n_annulus = nrings - 1

        R_pos = np.asarray([])

        for ring in rings:

            from pixel_params import pixels
            fpix = pixels(shape,
                          vel,
                          pa0,
                          inc0,
                          x0,
                          y0,
                          ring,
                          delta=delta,
                          pixel_scale=pixel_scale)

            if fpix > frac_pixel:

                if ring >= r_bar_min and ring <= r_bar_max:

                    # Create bisymetric model
                    try:

                        v_rot_k, v_rad_k, v_tan_k = M_tab(
                            pa0,
                            inc0,
                            x0,
                            y0,
                            theta_b,
                            ring,
                            delta,
                            index,
                            shape,
                            vel - vsys0,
                            evel,
                            pixel_scale=pixel_scale,
                            vmode=vmode)

                        vrot_tab = np.append(vrot_tab, v_rot_k)
                        vrad_tab = np.append(vrad_tab, v_rad_k)
                        vtan_tab = np.append(vtan_tab, v_tan_k)
                        R_pos = np.append(R_pos, ring)

                    except (np.linalg.LinAlgError):
                        vrot_tab, vrad_tab, vtan_tab = np.append(
                            vrot_tab,
                            100), np.append(vrad_tab,
                                            10), np.append(vtan_tab, 10)
                        R_pos = np.append(R_pos, ring)
                else:

                    # Create ciruclar model

                    v_rot_k, v_rad_k, v_tan_k = M_tab(pa0,
                                                      inc0,
                                                      x0,
                                                      y0,
                                                      theta_b,
                                                      ring,
                                                      delta,
                                                      index,
                                                      shape,
                                                      vel - vsys0,
                                                      evel,
                                                      pixel_scale=pixel_scale,
                                                      vmode="circular")
                    vrot_tab = np.append(vrot_tab, v_rot_k)
                    vrad_tab = np.append(vrad_tab, 0)
                    vtan_tab = np.append(vtan_tab, 0)
                    R_pos = np.append(R_pos, ring)

        if np.nanmean(vrot_tab) < 0:
            vrot_tab = abs(vrot_tab)
            pa0 = pa0 - 180
            if pa0 < 0: pa0 = pa0 + 360

        guess = [
            vrot_tab, vrad_tab, pa0, inc0, x0, y0, vsys0, vtan_tab, theta_b
        ]
        v_2D_mdl, kin_2D_modls, vrot, vrad, vsys0, pa0, inc0, x0, y0, vtan, theta_b, xi_sq, n_data, Errors = fit(
            shape,
            vel,
            evel,
            guess,
            vary,
            vmode,
            config,
            R_pos,
            fit_method="Powell",
            e_ISM=e_ISM,
            pixel_scale=pixel_scale,
            ring_space=ring_space)

        if xi_sq < chisq_global:

            PA, INC, XC, YC, VSYS, THETA = pa0, inc0, x0, y0, vsys0, theta_b
            Vrot = vrot
            Vrad = vrad
            Vtan = vtan
            chisq_global = xi_sq
            best_vlos_2D_model = v_2D_mdl
            best_kin_2D_models = kin_2D_modls

            Rings = R_pos
            std_errors = Errors
            GUESS = [
                vrot_tab, vrad_tab, PA, INC, XC, YC, VSYS, vtan_tab, THETA
            ]
            GUESS = [Vrot, Vrad, PA, INC, XC, YC, VSYS, Vtan, THETA]

    # Maybe the code has found the bar minor axis, in such case Vrad <0 and Vtan <0

    if np.nanmean(Vrad) < 0 or np.nanmean(Vtan) < 0:
        GUESS[-1] = GUESS[-1] - 90
        NEW = GUESS[-1]
        if NEW < 0: GUESS[-1] = 180 + NEW

        VARY = [True, True, False, False, False, False, False, True, True]
        v_2D_mdl_, kin_2D_modls_, vrot_, vrad_, _vsys0_, pa0_, inc0_, x0_, y0_, vtan_, theta_b_, xi_sq_, n_data_, Errors_ = fit(
            shape,
            vel,
            evel,
            GUESS,
            VARY,
            vmode,
            config,
            Rings,
            fit_method="Powell",
            e_ISM=e_ISM,
            pixel_scale=pixel_scale,
            ring_space=ring_space)
        if xi_sq_ < chisq_global:
            Vrot = vrot_
            Vrad = vrad_
            Vtan = vtan_
            THETA = theta_b_
            best_vlos_2D_model = v_2D_mdl_
            best_kin_2D_models = kin_2D_modls_
            std_errors = Errors_

    Vtan = np.asarray(Vtan)
    Vrad = np.asarray(Vrad)
    Vrot = np.asarray(Vrot)
    PA_bar_major = pa_bar_sky(PA, INC, THETA)
    PA_bar_minor = pa_bar_sky(PA, INC, THETA - 90)

    if errors == 1:
        from mcmc import fit_mcmc
        res_mcmc = fit_mcmc(shape,
                            vel,
                            evel,
                            GUESS,
                            vary,
                            vmode,
                            "",
                            Rings,
                            fit_method="emcee",
                            e_ISM=e_ISM,
                            pixel_scale=pixel_scale,
                            ring_space=ring_space)
    else:
        std_Vrot, std_Vrad, std_pa, std_inc, std_x0, std_y0, std_Vsys, std_theta, std_Vtan = std_errors

        res_mcmc = Vrot * 0, [std_Vrot, std_Vrot], Vrot * 0, [
            std_Vrad, std_Vrad
        ], 0, [std_pa,
               std_pa], 0, [std_inc, std_inc], 0, [std_x0, std_x0], 0, [
                   std_y0, std_y0
               ], 0, [std_Vsys,
                      std_Vsys], 0, [std_theta, std_theta
                                     ], Vrot * 0, [std_Vtan, std_Vtan]

    return PA, INC, XC, YC, VSYS, THETA, Rings, Vrot, Vrad, Vtan, best_vlos_2D_model, best_kin_2D_models, PA_bar_major, PA_bar_minor, chisq_global, res_mcmc