Ejemplo n.º 1
0
    def __init__(self, scanId, show_rays=True, show_grid=True): 
        self.scanId = scanId
        self.root, self.target, agent_pose, goal_pose = scanId.split('-')
        self.root = os.path.join(Files.basedir, dirname(self.root))
        self.agent_pose_ini = to_array(agent_pose)
        self.goal_pose_ini  = to_array(goal_pose)
        
        # Cache variables
        self.pmc_var = None
        # Visualization settnigs
        self.show_rays = show_rays
        self.show_grid = show_grid 
        
        # Floyd warshall algorithm for shortest path supervision
        self.mapfile_var = join(self.root, Files.objfile)
        self.planner = FloydWarshallRobotslang(self.mapfile_var)
        
        # Navigation pixels for  visualization
        self.nav_pixels   = self.planner.navigable_pixels

        ## Target poses
        self.target_poses  = get_targets()[scanId]
        self.target_pixels = pose2pixel(np.asarray(self.target_poses), MC.mazeshape)
        self.target_pixels = list(zip(["jar", "mug", "paddle"], self.target_pixels))

        # Randomize location of agent and goal
        self.agent   = Particles(1)
        self.goal    = Particles(1)

        # Start by resetting
        self.reset()
Ejemplo n.º 2
0
 def run_temporal_moments_calculation(number_of_moments,
                                      segmentation_tuple,
                                      kind_of='not_norm'):
     p = Particles('./data/position_data_1_1.txt')
     segmentations = np.arange(*segmentation_tuple)
     moments_n = np.zeros((len(segmentations), number_of_moments))
     if kind_of == 'norm':
         mom = Moments.normalized_temporal_moment
     elif kind_of == 'not_norm':
         mom = Moments.temporal_moment
     for n in np.arange(0, number_of_moments):  # order of the moment
         for i, l in enumerate(segmentations):  # lengths to be tested
             moments_n[i, n] = mom(
                 n, p.time,
                 p.discrete_particle_distribution(l, p.time, p.qy))
             #   print(np.trapz(p.discrete_particle_distribution(l, p.time, p.qy)))
     moment_list = []
     for i in np.arange(0, number_of_moments):
         moment_list.append('m_' + str(i))
     moments_n_df = pd.DataFrame(moments_n,
                                 columns=moment_list,
                                 index=segmentations)
     moments_n_df.to_csv('./data/temporal_moments.csv')
     moments_n_df = moments_n_df.drop('m_0',
                                      axis=1)  # drop in order not to plot
     moments_n_df.plot()
     plt.xlabel('Segmentation L [m]')
     plt.xlim(segmentations[1], segmentations[-1])
     plt.ylabel('Moment []')
     plt.title('Moment versus L')
     plt.savefig('./data/temporal_moments.png')
    def __init__(self, env, num_particles, particle_angle_range, num_rays,
                 r_mean, r_std, ang_mean, ang_std, visualize, background, save_to,
                 row_min, row_max, n_angle_bins, front_angle_range):
        """Instantiates the visual particle filter with initial constraints.
        Args:
            run (dataset object): Provides access to an experiment
            experiment  Location of the experiment
            mapfile     Image location of top down maze image that is in turn converted
                        to gridmap file via the Gridmap class
            num_particles   Number of particles used for tracking
            particle_size   Size for scatter plot particles
            arrow_size      Arrow size (in meters)
        """
        # Set the run
        self.env = env
        # Setup the particles
        self.particles = Particles(num_particles, r_mean, r_std, ang_mean, ang_std)
        
        ## Matplotlib based visualization
        self.visualize = visualize
        self.viz_map   = env.mapfile 

        self.featurizer = HistogramFeatures()

        # Color gradient
        self.num_cgs = 100
        self.color_gradient = list(Color("red").range_to(Color("green"), self.num_cgs))
 def heatmap(self, viz):
     viz = viz * 0
     planner = self.env.planner
     particles = Particles(planner.poses.shape[0])
     particles.pose[:,:2] = planner.poses[:,:2]
     particles.pose[:, 2] = self.env.agent.pose[:,2]
     pixels = pose2pixel(particles.pose, MC.mazeshape)
     
     weights = np.zeros(len(particles))
     measurement = self.env.get_visual_obs(self.env.agent.pose)
     for i, (pose, pix) in enumerate(zip(particles.pose, pixels)):
         pose_measurement = self.env.get_visual_obs(pose)
         weights[i] = (pose_measurement == measurement).sum()
     #print(weights.max(), weights.min(), weights.mean())
     #weights = softmax(weights, t=.05)
     
     for i, (pose, pix) in enumerate(zip(particles.pose, pixels)):
         c_indx = int((self.num_cgs-1) * weights[i]/weights.max())
         color  = color2bgr(self.color_gradient[c_indx])
         self.env.draw_circle(viz, pix, rad=20, color=color)
         self.env.draw_orientation(viz, pose, thickness=2)
     
     for i, (pose, pix) in enumerate(zip(particles.pose, pixels)):
         cv2.putText(viz, str(int(weights[i])), point(pix), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 255, 255), 2, cv2.LINE_AA)
     return viz
Ejemplo n.º 5
0
def main():
    parser = argparse.ArgumentParser(description="FluidSim")
    parser.add_argument("--USE_SPHERICAL_GRAV", default=False)
    parser.add_argument("--SimType", type=str, default='PIC')
    parser.add_argument("--GRAV_FACTOR", type=float, default=0.01)
    parser.add_argument('--out_dir', type=str, default='output/')
    parser.add_argument('--n_iter', type=int, default=50)
    args = parser.parse_args()

    gravity = 9.8
    if (args.USE_SPHERICAL_GRAV):
        gravity *= args.GRAV_FACTOR

    grid = Grid3D(gravity, (30, 30, 30), 1)  #g, (nx,ny,nz),lx

    if not os.path.exists(args.out_dir):
        os.makedirs(args.out_dir)

    particles = Particles(grid, args.SimType)
    init_water_drop(grid, particles, 2, 2, 2)
    particles.write_to_file("{}/frameparticles{:0>4}".format(args.out_dir, 0))

    for i in range(args.n_iter):
        print(
            "===================================================> step {}...\n"
            .format(i))
        advance_one_frame(grid, particles, 1 / 30)
        particles.write_to_file("{}/frameparticles{:0>4}".format(
            args.out_dir, i))
Ejemplo n.º 6
0
 def generate(self):
     ''' Returns a particle  object with the parameters specified
     in the constructor of the Generator object
     '''
     coords = self._create_phase_space()
     particles = Particles(self.macroparticlenumber,
                           self.intensity/self.macroparticlenumber,
                           self.charge, self.mass, self.circumference,
                           self.gamma,
                           coords_n_momenta_dict=coords)
     self._linear_match_phase_space(particles)
     return particles
Ejemplo n.º 7
0
    def run_particle_distibution_graphs(self):
        p = Particles('./data/position_data_example_1.txt',
                      dimension=2,
                      time_start=0,
                      time_end=500000,
                      time_step=100)
        dist_cum = p.cumulative_distribution(0.0000505, p.qx)
        # dist_disc = p.discrete_particle_distribution(0.00005, p.time, p.qy)

        plt.scatter(range(len(dist_cum)), dist_cum)
        plt.xlabel('time')
        plt.ylabel('N')
        plt.grid(1)
        plt.show()
Ejemplo n.º 8
0
    def __init__(self, ai_game, simple: bool = True) -> None:
        self.settings = ai_game.settings
        self.screen = ai_game.screen
        self.screen_rect = ai_game.screen.get_rect()

        self.image = pygame.image.load("images/ship.png")
        self.orig_image = self.image
        self.rect = self.image.get_rect()

        self.rect.midbottom = self.screen_rect.midbottom
        self.rect.y -= 10

        self.moving_right = False
        self.moving_left = False
        self.moving_down = False
        self.moving_up = False
        self.x = float(self.rect.x)
        self.y = float(self.rect.y)
        self.simple = simple
        self.hide = False
        self.particles = Particles(self.screen)
Ejemplo n.º 9
0
    def __init__(self):
        rospy.init_node('pf')

        # pose_listener responds to selection of a new approximate robot
        # location (for instance using rviz)
        rospy.Subscriber("initialpose",
                         PoseWithCovarianceStamped,
                         self.update_initial_pose)

        # publisher for the particle cloud for visualizing in rviz.
        self.particle_pub = rospy.Publisher("particlecloud",
                                            PoseArray,
                                            queue_size=10)

        # create instances of two helper objects that are provided to you
        # as part of the project
        self.occupancy_field = OccupancyField()
        self.transform_helper = TFHelper()

        self.particles = Particles()
        self.particles.initialize_particles()

        self.ranges = []
Ejemplo n.º 10
0
 def two_particles_1d_random(self):
     return Particles(num_particles=2,
                      num_dimensions=1,
                      mass=1,
                      diameter=0.1)
Ejemplo n.º 11
0
import matplotlib.pyplot as plt
from matplotlib import animation
from matplotlib.patches import Circle, Arrow

import numpy as np

from particles import Particles
from rotor import Rotor

rotor = Rotor()
particles = Particles(rotor=rotor)

fig = plt.figure()
subplot_shape = (2,4)
ax = plt.subplot2grid(subplot_shape, (0,0), rowspan=2, colspan=3)
ax_cumulative_theta = plt.subplot2grid(subplot_shape, (0,3) )
ax_cumulative_theta.xaxis.set_ticks([])

ax_cumulative_v_theta = plt.subplot2grid(subplot_shape, (1,3) )

plt.tight_layout()

ax_main_objs = []
cumulative_plot = None
cumulative_v_plot = None

def init():
    global ax_main_objs
    global cumulative_plot
    global cumulative_v_plot
Ejemplo n.º 12
0
    def __init__(self, screen, endless = False):
        self.screen = screen

        self.sharks = []
        self.shark_sprites = pygame.sprite.Group()

        self.player = Steamboat()
        self.player_sprite = pygame.sprite.Group()
        self.player_sprite.add(self.player)

        self.health = Health()
        self.health_sprite = pygame.sprite.Group()
        self.health_sprite.add(self.health)

        self.damage_count = 0

        self.t = 0

        self.water = Water.global_water
        #Water.global_water = self.water
        self.water_sprite = pygame.sprite.Group()
        self.water_sprite.add(self.water)

        if not Game.sky:
            Game.sky = util.load_image("taivas")
            Game.sky = pygame.transform.scale(self.sky, (SCREEN_WIDTH, SCREEN_HEIGHT))

        self.cannonballs = []
        self.cannonball_sprites = pygame.sprite.Group()

        self.pirates = []
        self.pirate_sprites = pygame.sprite.Group()

        self.titanic = None
        self.titanic_sprite = pygame.sprite.Group()

        self.seagulls = []
        self.seagull_sprites = pygame.sprite.Group()

        self.particles = Particles()
        self.particle_sprite = pygame.sprite.Group()
        self.particle_sprite.add(self.particles)

        self.mines = []
        self.mine_sprites = pygame.sprite.Group()

        self.score = Score()
        self.score_sprite = pygame.sprite.Group()
        self.score_sprite.add(self.score)

        self.powerups = []
        self.powerup_sprites = pygame.sprite.Group()

        self.level = Level(endless)

        self.lastshot = MIN_FIRE_DELAY + 1

        self.gameover = False
        self.gameover_image = None
        self.gameover_rect = None
        self.done = False

        self.pause = False
        self.pause_image = util.bigfont.render("Pause", Variables.alpha, (0,0,0))
        self.pause_rect = self.pause_image.get_rect()
        self.pause_rect.center = self.screen.get_rect().center

        self.spacepressed = None
Ejemplo n.º 13
0
 def _create_sampler(self, alpha):
     parts = Particles(**self.particles_params)
     wave_function = WaveFunction(parts,
                                  **self.wave_function_params,
                                  alpha=alpha)
     return self.sampler_type(step_size=0.1, wave_function=wave_function)
Ejemplo n.º 14
0
def main():

    parameters = dict()
    read_parameters_file(parameters)
    check_parameters_consistency(parameters)
    print_parameters(parameters)

    # gas density field:
    density = Field(field="rho", parameters=parameters)

    # number of grid cells in the radial and azimuthal directions
    nrad = density.nrad
    ncol = density.ncol
    nsec = density.nsec

    # volume of each grid cell (code units)
    # calculate_volume(density)

    volume = np.zeros((nsec, ncol, nrad))
    for i in range(nsec):
        for j in range(ncol):
            for k in range(nrad):
                volume[i, j,
                       k] = (density.rmed[k]**2 * np.sin(density.tmed[j]) *
                             density.dr[k] * density.dth[j] * density.dp[i])

    # Mass of gas in units of the star's mass
    Mgas = np.sum(density.data * volume)
    print("Mgas / Mstar= " + str(Mgas) + " and Mgas [kg] = " +
          str(Mgas * density.cumass))

    # Allocate arrays
    nbin = parameters["nbin"]
    # bins = np.asarray([0.0001, 0.001, 0.01, 0.1, 0.3, 1, 3, 10, 100, 1000, 3000])
    bins = np.asarray([0.0001, 0.001, 0.01, 0.1, 0.2])
    particles_per_bin_per_cell = np.zeros(nbin * nsec * ncol * nrad)
    dust_cube = np.zeros((nbin, nsec, ncol, nrad))
    particles_per_bin = np.zeros(nbin)
    tstop_per_bin = np.zeros(nbin)

    # =========================
    # Compute dust mass volume density for each size bin
    # =========================
    if (parameters["RTdust_or_gas"] == "dust"
            and parameters["recalc_density"] == "Yes"
            and parameters["polarized_scat"] == "No"):
        print("--------- computing dust mass volume density ----------")

        particle_data = Particles(ns=parameters["particle_file"],
                                  directory=parameters["dir"])
        populate_dust_bins(
            density,
            particle_data,
            nbin,
            bins,
            particles_per_bin_per_cell,
            particles_per_bin,
            tstop_per_bin,
        )
        dust_cube = particles_per_bin_per_cell.reshape(
            (nbin, density.nsec, density.ncol, density.nrad))
        frac = np.zeros(nbin)
        buf = 0.0
        # finally compute dust surface density for each size bin
        for ibin in range(nbin):
            # fraction of dust mass in current size bin 'ibin', easy to check numerically that sum_frac = 1
            frac[ibin] = (pow(bins[ibin + 1], (4.0 - parameters["pindex"])) -
                          pow(bins[ibin], (4.0 - parameters["pindex"]))) / (
                              pow(parameters["amax"],
                                  (4.0 - parameters["pindex"])) -
                              pow(parameters["amin"],
                                  (4.0 - parameters["pindex"])))
            # total mass of dust particles in current size bin 'ibin'
            M_i_dust = parameters["ratio"] * Mgas * frac[ibin]
            buf += M_i_dust
            print("Dust mass [in units of Mstar] in species ", ibin, " = ",
                  M_i_dust)
            # dustcube, which contained N_i(r,phi), now contains sigma_i_dust (r,phi)
            dust_cube[
                ibin, :, :, :] *= M_i_dust / volume / particles_per_bin[ibin]
            # conversion in g/cm^2
            # dimensions: nbin, nrad, nsec
            dust_cube[ibin, :, :, :] *= (density.cumass * 1e3) / (
                (density.culength * 1e2)**2.0)

        # Overwrite first bin (ibin = 0) to model extra bin with small dust tightly coupled to the gas
        if parameters["bin_small_dust"] == "Yes":
            frac[0] *= 5e3
            print("!!!!!!!!!!!!!!!!!!!!!!!!!!!")
            print(
                "Bin with index 0 changed to include arbitrarilly small dust tightly coupled to the gas"
            )
            print("Mass fraction of bin 0 changed to: ", str(frac[0]))
            print("!!!!!!!!!!!!!!!!!!!!!!!!!!!")
            # radial index corresponding to 0.3"
            imin = np.argmin(np.abs(density.rmed - 1.4))
            # radial index corresponding to 0.6"
            imax = np.argmin(np.abs(density.rmed - 2.8))
            dust_cube[0, :, :, imin:imax] = (density.data[:, :, imin:imax] *
                                             parameters["ratio"] * frac[0] *
                                             (density.cumass * 1e3) /
                                             ((density.culength * 1e2)**2.0))

        print(
            "Total dust mass [g] = ",
            np.sum(dust_cube[:, :, :, :] * volume *
                   (density.culength * 1e2)**2.0),
        )
        print(
            "Total dust mass [Mgas] = ",
            np.sum(dust_cube[:, :, :, :] * volume *
                   (density.culength * 1e2)**2.0) /
            (Mgas * density.cumass * 1e3),
        )
        print(
            "Total dust mass [Mstar] = ",
            np.sum(dust_cube[:, :, :, :] * volume *
                   (density.culength * 1e2)**2.0) / (density.cumass * 1e3),
        )

        # Total dust surface density
        dust_surface_density = np.sum(dust_cube, axis=0)
        print("Maximum dust surface density [in g/cm^2] is ",
              dust_surface_density.max())

        DUSTOUT = open("dust_density.inp", "w")
        DUSTOUT.write("1 \n")  # iformat
        DUSTOUT.write(str(nrad * nsec * ncol) + " \n")  # n cells
        DUSTOUT.write(str(int(nbin)) + " \n")  # nbin size bins

        rhodustcube = np.zeros((nbin, nsec, ncol, nrad))

        # dust aspect ratio as function of ibin and r (or actually, R, cylindrical radius)
        hd = np.zeros((nbin, nrad))

        # gus aspect ratio
        hgas = np.zeros(nrad)
        for irad in range(nrad):
            hgas[irad] = (density.rmed[irad] * np.cos(density.tmed[:]) *
                          density.data[0, :, irad]).sum(
                              axis=0) / (density.data[0, :, irad]).sum(axis=0)

        for ibin in range(nbin):
            if parameters["polarized_scat"] == "No":
                for irad in range(nrad):
                    hd[ibin, irad] = hgas[irad] / np.sqrt(
                        1.0 +
                        tstop_per_bin[ibin] / parameters["alphaviscosity"] *
                        (1.0 + 2.0 * tstop_per_bin[ibin]) /
                        (1.0 + tstop_per_bin[ibin]))
            else:
                print(
                    "Set of initial conditions not implemented for pluto yet. Only parameters['polarized_scat'] == 'No'"
                )
                sys.exit("I must exit!")

        # work out exponential and normalization factors exp(-z^2 / 2H_d^2)
        # with z = r cos(theta) and H_d = h_d x R = h_d x r sin(theta)
        # r = spherical radius, R = cylindrical radius
        rho_dust_cube = dust_cube
        rho_dust_cube = np.nan_to_num(rho_dust_cube)

        # for plotting purposes
        axirhodustcube = np.sum(rho_dust_cube,
                                axis=3) / nsec  # ncol, nbin, nrad

        # Renormalize dust's mass volume density such that the sum over the 3D grid's volume of
        # the dust's mass volume density x the volume of each grid cell does give us the right
        # total dust mass, which equals ratio x Mgas.
        rhofield = np.sum(rho_dust_cube, axis=0)  # sum over dust bins

        Cedge, Aedge, Redge = np.meshgrid(
            density.tedge, density.pedge,
            density.redge)  # ncol+1, nrad+1, Nsec+1

        r2 = Redge * Redge
        jacob = r2[:-1, :-1, :-1] * np.sin(Cedge[:-1, :-1, :-1])
        dphi = Aedge[1:, :-1, :-1] - Aedge[:-1, :-1, :-1]  # same as 2pi/nsec
        dr = Redge[:-1, :-1, 1:] - Redge[:-1, :-1, :-1]  # same as Rsup-Rinf
        dtheta = Cedge[:-1, 1:, :-1] - Cedge[:-1, :-1, :-1]
        # volume of a cell in cm^3
        vol = (jacob * dr * dphi * dtheta * ((density.culength * 1e2)**3)
               )  # ncol, nrad, Nsec

        total_mass = np.sum(rhofield * vol)

        normalization_factor = (parameters["ratio"] * Mgas *
                                (density.cumass * 1e3) / total_mass)
        rho_dust_cube = rho_dust_cube * normalization_factor
        print(
            "total dust mass after vertical expansion [g] = ",
            np.sum(np.sum(rho_dust_cube, axis=0) * vol),
            " as normalization factor = ",
            normalization_factor,
        )

        # write mass volume densities for all size bins
        for ibin in range(nbin):
            print("dust species in bin", ibin, "out of ", nbin - 1)
            for k in range(nsec):
                for j in range(ncol):
                    for i in range(nrad):
                        DUSTOUT.write(
                            str(rho_dust_cube[ibin, k, j, i]) + " \n")

        # print max of dust's mass volume density at each colatitude
        for j in range(ncol):
            print(
                "max(rho_dustcube) [g cm-3] for colatitude index j = ",
                j,
                " = ",
                rho_dust_cube[:, :, j, :].max(),
            )

        DUSTOUT.close()

        # plot azimuthally-averaged density vs. radius and colatitude
        if parameters["plot_density"] == "Yes":
            plot_density(nbin, nsec, ncol, nrad, density, rho_dust_cube)

        # free RAM memory
        del rho_dust_cube, dust_cube, particles_per_bin_per_cell

    elif parameters["RTdust_or_gas"] == "gas":
        print(
            "Set of initial conditions not implemented for pluto yet. Only parameters['RTdust_or_gas'] == 'dust'"
        )
        sys.exit("I must exit!")
    elif parameters["polarized_scat"] == "Yes":
        print(
            "Set of initial conditions not implemented for pluto yet. Only parameters['polarized_scat'] == 'No'"
        )
        sys.exit("I must exit!")
    else:
        print(
            "--------- I did not compute dust densities (recalc_density = No in params.dat file) ----------"
        )

    # =========================
    # Compute dust opacities
    # =========================
    if parameters["RTdust_or_gas"] == "dust" and parameters[
            "recalc_opac"] == "Yes":
        print("--------- computing dust opacities ----------")

        # Calculation of opacities uses the python scripts makedustopac.py and bhmie.py
        # which were written by C. Dullemond, based on the original code by Bohren & Huffman.

        logawidth = 0.05  # Smear out the grain size by 5% in both directions
        na = 20  # Use 10 grain size samples per bin size
        chop = 1.0  # Remove forward scattering within an angle of 5 degrees
        # Extrapolate optical constants beyond its wavelength grid, if necessary
        extrapol = True
        verbose = False  # If True, then write out status information
        ntheta = 181  # Number of scattering angle sampling points
        # link to optical constants file
        optconstfile = (os.path.expanduser(parameters["opacity_dir"]) + "/" +
                        parameters["species"] + ".lnk")

        # The material density in gram / cm^3
        graindens = 2.0  # default density in g / cc
        if (parameters["species"] == "mix_2species_porous"
                or parameters["species"] == "mix_2species_porous_ice"
                or parameters["species"] == "mix_2species_porous_ice70"):
            graindens = 0.1  # g / cc
        if (parameters["species"] == "mix_2species"
                or parameters["species"] == "mix_2species_60silicates_40ice"):
            graindens = 1.7  # g / cc
        if parameters["species"] == "mix_2species_ice70":
            graindens = 1.26  # g / cc
        if parameters["species"] == "mix_2species_60silicates_40carbons":
            graindens = 2.7  # g / cc

        # Set up a wavelength grid (in cm) upon which we want to compute the opacities
        # 1 micron -> 1 cm
        lamcm = 10.0**np.linspace(0, 4, 200) * 1e-4

        # Set up an angular grid for which we want to compute the scattering matrix Z
        theta = np.linspace(0.0, 180.0, ntheta)

        for ibin in range(int(nbin)):
            # median grain size in cm in current bin size:
            agraincm = 10.0**(
                0.5 *
                (np.log10(1e2 * bins[ibin]) + np.log10(1e2 * bins[ibin + 1])))

            print("====================")
            print("bin ", ibin + 1, "/", nbin)
            print(
                "grain size [cm]: ",
                agraincm,
                " with grain density [g/cc] = ",
                graindens,
            )
            print("====================")
            pathout = parameters["species"] + str(ibin)
            opac = compute_opac_mie(
                optconstfile,
                graindens,
                agraincm,
                lamcm,
                theta=theta,
                extrapolate=extrapol,
                logawidth=logawidth,
                na=na,
                chopforward=chop,
                verbose=verbose,
            )
            if parameters["scat_mode"] >= 3:
                print("Writing dust opacities in dustkapscatmat* files")
                write_radmc3d_scatmat_file(opac, pathout)
            else:
                print("Writing dust opacities in dustkappa* files")
                write_radmc3d_kappa_file(opac, pathout)
    else:
        print(
            "------- taking dustkap* opacity files in current directory (recalc_opac = No in params.dat file) ------ "
        )

    # Write dustopac.inp file even if we don't (re)calculate dust opacities
    if parameters["RTdust_or_gas"] == "dust":
        print("-> writing dust opacities")
        write_dustopac(
            species=parameters["species"],
            scat_mode=parameters["scat_mode"],
            nbin=parameters["nbin"],
        )
        if parameters["plot_opac"] == "Yes":
            print("-> plotting dust opacities")
            plot_opacities(
                species=parameters["species"],
                amin=parameters["amin"],
                amax=parameters["amax"],
                nbin=parameters["nbin"],
                lbda1=parameters["wavelength"] * 1e3,
            )

    print("-> writing radmc3d script")
    write_radmc3d_script(parameters)

    # =========================
    # Call to RADMC3D thermal solution and ray tracing
    # =========================
    if parameters["recalc_radmc"] == "Yes" or parameters[
            "recalc_rawfits"] == "Yes":
        # Write other parameter files required by RADMC3D
        print("--------- printing auxiliary files ----------")

        # need to check why we need to output wavelength...
        if parameters["recalc_rawfits"] == "No":
            write_wavelength()
            write_stars(Rstar=parameters["rstar"], Tstar=parameters["teff"])
            # Write 3D spherical grid for RT computational calculation
            write_AMRgrid(density, Plot=False)

            # rto_style = 3 means that RADMC3D will write binary output files
            # setthreads corresponds to the number of threads (cores) over which radmc3d runs
            write_radmc3dinp(
                incl_dust=parameters["incl_dust"],
                incl_lines=parameters["incl_lines"],
                lines_mode=parameters["lines_mode"],
                nphot_scat=parameters["nb_photons_scat"],
                nphot=parameters["nb_photons"],
                rto_style=3,
                tgas_eq_tdust=parameters["tgas_eq_tdust"],
                modified_random_walk=1,
                scattering_mode_max=parameters["scat_mode"],
                setthreads=parameters["nbcores"],
            )

        # Add 90 degrees to position angle so that RADMC3D's definition of
        # position angle be consistent with observed position
        # angle, which is what we enter in the params.dat file
        M = RTmodel(
            distance=parameters["distance"],
            Lambda=parameters["wavelength"] * 1e3,
            label=parameters["label"],
            line=parameters["gasspecies"],
            iline=parameters["iline"],
            vkms=parameters["vkms"],
            widthkms=parameters["widthkms"],
            npix=parameters["nbpixels"],
            phi=parameters["phiangle"],
            incl=parameters["inclination"],
            posang=parameters["posangle"] + 90.0,
        )

        # Set dust / gas temperature if Tdust_eq_Thydro == 'Yes'
        if (parameters["recalc_rawfits"] == "No"
                and parameters["Tdust_eq_Thydro"] == "Yes"
                and parameters["RTdust_or_gas"] == "dust"
                and parameters["recalc_temperature"] == "Yes"):
            print("--------- Writing temperature file (no mctherm) ----------")
            os.system("rm -f dust_temperature.bdat")  # avoid confusion!...
            TEMPOUT = open("dust_temperature.dat", "w")
            TEMPOUT.write("1 \n")  # iformat
            TEMPOUT.write(str(nrad * nsec * ncol) + " \n")  # n cells
            TEMPOUT.write(str(int(nbin)) + " \n")  # nbin size bins

            gas_temp = np.zeros((ncol, nrad, nsec))
            thydro = (parameters["aspectratio"] * parameters["aspectratio"] *
                      density.cutemp *
                      density.rmed**(-1.0 + 2.0 * parameters["flaringindex"]))
            for k in range(nsec):
                for j in range(ncol):
                    gas_temp[j, :, k] = thydro

            # write dust temperature for all size bins
            for ibin in range(nbin):
                print(
                    "writing temperature of dust species in bin",
                    ibin,
                    "out of ",
                    nbin - 1,
                )
                for k in range(nsec):
                    for j in range(ncol):
                        for i in range(nrad):
                            TEMPOUT.write(str(gas_temp[j, i, k]) + " \n")
            TEMPOUT.close()
            del gas_temp

        # Now run RADMC3D
        if parameters["recalc_rawfits"] == "No":
            print("--------- Now executing RADMC3D ----------")
            os.system("./script_radmc")

        print("--------- exporting results in fits format ----------")
        outfile = exportfits(M, parameters)

        if parameters["plot_temperature"] == "Yes":
            plot_temperature(nbin, nsec, ncol, nrad, density, parameters)
    else:
        print(
            "------- I did not run RADMC3D, using existing .fits file for convolution "
        )
        print(
            "------- (recalc_radmc = No in params.dat file) and final image ------ "
        )

        if parameters["RTdust_or_gas"] == "dust":
            outfile = ("image_" + str(parameters["label"]) + "_lbda" +
                       str(parameters["wavelength"]) + "_i" +
                       str(parameters["inclination"]) + "_phi" +
                       str(parameters["phiangle"]) + "_PA" +
                       str(parameters["posangle"]))
        else:
            print(
                "Set of initial conditions not implemented for pluto yet. Only parameters['RTdust_or_gas'] == 'dust'"
            )
            sys.exit("I must exit!")

        if parameters["secondorder"] == "Yes":
            outfile = outfile + "_so"
        if parameters["dustdens_eq_gasdens"] == "Yes":
            outfile = outfile + "_ddeqgd"
        if parameters["bin_small_dust"] == "Yes":
            outfile = outfile + "_bin0"

        outfile = outfile + ".fits"

    # =========================
    # Convolve raw flux with beam and produce final image
    # =========================
    if parameters["recalc_fluxmap"] == "Yes":
        print("--------- Convolving and writing final image ----------")

        f = fits.open("./" + outfile)

        # remove .fits extension
        outfile = os.path.splitext(outfile)[0]

        # add bmaj information
        outfile = outfile + "_bmaj" + str(parameters["bmaj"])

        outfile = outfile + ".fits"

        hdr = f[0].header
        # pixel size converted from degrees to arcseconds
        cdelt = np.abs(hdr["CDELT1"] * 3600.0)

        # get wavelength and convert it from microns to mm
        lbda0 = hdr["LBDAMIC"] * 1e-3

        # no polarized scattering: fits file directly contains raw intensity field
        if parameters["polarized_scat"] == "No":
            nx = hdr["NAXIS1"]
            ny = hdr["NAXIS2"]
            raw_intensity = f[0].data
            if parameters["recalc_radmc"] == "No" and parameters[
                    "plot_tau"] == "No":
                # sum over pixels
                print("Total flux [Jy] = " + str(np.sum(raw_intensity)))
            # check beam is correctly handled by inserting a source point at the
            # origin of the raw intensity image
            if parameters["check_beam"] == "Yes":
                raw_intensity[:, :] = 0.0
                raw_intensity[nx // 2 - 1, ny // 2 - 1] = 1.0
            # Add white (Gaussian) noise to raw flux image to simulate effects of 'thermal' noise
            if (parameters["add_noise"] == "Yes"
                    and parameters["RTdust_or_gas"] == "dust"
                    and parameters["plot_tau"] == "No"):
                # beam area in pixel^2
                beam = ((np.pi / (4.0 * np.log(2.0))) * parameters["bmaj"] *
                        parameters["bmin"] / (cdelt**2.0))
                # noise standard deviation in Jy per pixel (I've checked the expression below works well)
                noise_dev_std_Jy_per_pixel = parameters[
                    "noise_dev_std"] / np.sqrt(0.5 * beam)  # 1D
                # noise array
                noise_array = np.random.normal(
                    0.0,
                    noise_dev_std_Jy_per_pixel,
                    size=parameters["nbpixels"] * parameters["nbpixels"],
                )
                noise_array = noise_array.reshape(parameters["nbpixels"],
                                                  parameters["nbpixels"])
                raw_intensity += noise_array
            if parameters["brightness_temp"] == "Yes":
                # beware that all units are in cgs! We need to convert
                # 'intensity' from Jy/pixel to cgs units!
                # pixel size in each direction in cm
                pixsize_x = cdelt * parameters["distance"] * au
                pixsize_y = pixsize_x
                # solid angle subtended by pixel size
                pixsurf_ster = (pixsize_x * pixsize_y /
                                parameters["distance"] /
                                parameters["distance"] / pc / pc)
                # convert intensity from Jy/pixel to erg/s/cm2/Hz/sr
                intensity_buf = raw_intensity / 1e23 / pixsurf_ster
                # beware that lbda0 is in mm right now, we need to have it in cm in the expression below
                raw_intensity = (h * c / kB / (lbda0 * 1e-1)) / np.log(
                    1.0 +
                    2.0 * h * c / intensity_buf / pow((lbda0 * 1e-1), 3.0))
                # raw_intensity = np.nan_to_num(raw_intensity)
        else:
            print(
                "Set of initial conditions not implemented for pluto yet. Only parameters['polarized_scat'] == 'No'"
            )
            sys.exit("I must exit!")

        # ------------
        # smooth image
        # ------------
        # beam area in pixel^2
        beam = ((np.pi / (4.0 * np.log(2.0))) * parameters["bmaj"] *
                parameters["bmin"] / (cdelt**2.0))
        # stdev lengths in pixel
        stdev_x = (parameters["bmaj"] /
                   (2.0 * np.sqrt(2.0 * np.log(2.0)))) / cdelt
        stdev_y = (parameters["bmin"] /
                   (2.0 * np.sqrt(2.0 * np.log(2.0)))) / cdelt

        # a) case with no polarized scattering
        if parameters["polarized_scat"] == "No" and parameters[
                "plot_tau"] == "No":
            # Call to Gauss_filter function
            if parameters["moment_order"] != 1:
                smooth = Gauss_filter(raw_intensity,
                                      stdev_x,
                                      stdev_y,
                                      parameters["bpaangle"],
                                      Plot=False)
            else:
                smooth = raw_intensity

            # convert image from Jy/pixel to mJy/beam or microJy/beam
            # could be refined...
            if parameters["brightness_temp"] == "Yes":
                convolved_intensity = smooth
            else:
                convolved_intensity = smooth * 1e3 * beam  # mJy/beam

            strflux = "Flux of continuum emission (mJy/beam)"
            if parameters["gasspecies"] == "co":
                strgas = r"$^{12}$CO"
            elif parameters["gasspecies"] == "13co":
                strgas = r"$^{13}$CO"
            elif parameters["gasspecies"] == "c17o":
                strgas = r"C$^{17}$O"
            elif parameters["gasspecies"] == "c18o":
                strgas = r"C$^{18}$O"
            elif parameters["gasspecies"] == "hco+":
                strgas = r"HCO+"
            elif parameters["gasspecies"] == "so":
                strgas = r"SO"
            else:
                strgas = parameters["gasspecies"]
            if parameters["gasspecies"] != "so":
                strgas += r" ($%d \rightarrow %d$)" % (
                    parameters["iline"],
                    parameters["iline"] - 1,
                )
            if parameters["gasspecies"] == "so" and parameters["iline"] == 14:
                strgas += r" ($5_6 \rightarrow 4_5$)"

            if parameters["brightness_temp"] == "Yes":
                if parameters["RTdust_or_gas"] == "dust":
                    strflux = r"Brightness temperature (K)"
            else:
                if convolved_intensity.max() < 1.0:
                    convolved_intensity = smooth * 1e6 * beam  # microJy/beam
                    strflux = r"Flux of continuum emission ($\mu$Jy/beam)"

        if parameters["plot_tau"] == "Yes":
            convolved_intensity = raw_intensity
            strflux = r"Absorption optical depth $\tau"

        # -------------------------------------
        # SP: save convolved flux map solution to fits
        # -------------------------------------
        hdu = fits.PrimaryHDU()
        hdu.header["BITPIX"] = -32
        hdu.header["NAXIS"] = 2  # 2
        hdu.header["NAXIS1"] = parameters["nbpixels"]
        hdu.header["NAXIS2"] = parameters["nbpixels"]
        hdu.header["EPOCH"] = 2000.0
        hdu.header["EQUINOX"] = 2000.0
        hdu.header["LONPOLE"] = 180.0
        hdu.header["CTYPE1"] = "RA---SIN"
        hdu.header["CTYPE2"] = "DEC--SIN"
        hdu.header["CRVAL1"] = float(0.0)
        hdu.header["CRVAL2"] = float(0.0)
        hdu.header["CDELT1"] = hdr["CDELT1"]
        hdu.header["CDELT2"] = hdr["CDELT2"]
        hdu.header["LBDAMIC"] = hdr["LBDAMIC"]
        hdu.header["CUNIT1"] = "deg     "
        hdu.header["CUNIT2"] = "deg     "
        hdu.header["CRPIX1"] = float((parameters["nbpixels"] + 1.0) / 2.0)
        hdu.header["CRPIX2"] = float((parameters["nbpixels"] + 1.0) / 2.0)
        if strflux == "Flux of continuum emission (mJy/beam)":
            hdu.header["BUNIT"] = "milliJY/BEAM"
        if strflux == r"Flux of continuum emission ($\mu$Jy/beam)":
            hdu.header["BUNIT"] = "microJY/BEAM"
        if strflux == "":
            hdu.header["BUNIT"] = ""
        hdu.header["BTYPE"] = "FLUX DENSITY"
        hdu.header["BSCALE"] = 1
        hdu.header["BZERO"] = 0
        del hdu.header["EXTEND"]
        # keep track of all parameters in params.dat file
        # for i in range(len(lines_params)):
        #    hdu.header[var[i]] = par[i]
        hdu.data = convolved_intensity
        inbasename = os.path.basename("./" + outfile)
        if parameters["add_noise"] == "Yes":
            substr = "_wn" + str(parameters["noise_dev_std"]) + "_JyBeam.fits"
            jybeamfileout = re.sub(".fits", substr, inbasename)
        else:
            jybeamfileout = re.sub(".fits", "_JyBeam.fits", inbasename)
        hdu.writeto(jybeamfileout, overwrite=True)

        plot_image(nx, cdelt, lbda0, strflux, convolved_intensity,
                   jybeamfileout, parameters)

    print("--------- done! ----------")
Ejemplo n.º 15
0
 def setUp(self):
     self.particles1 = Particles(20, 1, (200, 2))
Ejemplo n.º 16
0
 def particles(self):
     if self._particles is None:
         self._particles = Particles(self.CONST_G)
     return self._particles
Ejemplo n.º 17
0
    def __init__(self,
                 screen,
                 usealpha=True,
                 noparticles=False,
                 endless=False):
        self.screen = screen
        self.usealpha = usealpha
        self.noparticles = noparticles

        self.sharks = []
        self.shark_sprites = pygame.sprite.Group()

        self.player = Steamboat()
        self.player_sprite = pygame.sprite.Group()
        self.player_sprite.add(self.player)

        self.health = Health()
        self.health_sprite = pygame.sprite.Group()
        self.health_sprite.add(self.health)

        self.damage_count = 0

        self.t = 0

        self.water = Water.global_water  #Water(self.usealpha)
        #Water.global_water = self.water
        self.water_sprite = pygame.sprite.Group()
        self.water_sprite.add(self.water)

        self.sky = util.load_image("taivas")
        self.sky = pygame.transform.scale(self.sky,
                                          (SCREEN_WIDTH, SCREEN_HEIGHT))

        self.cannonballs = []
        self.cannonball_sprites = pygame.sprite.Group()

        self.pirates = []
        self.pirate_sprites = pygame.sprite.Group()

        self.titanic = None
        self.titanic_sprite = pygame.sprite.Group()

        self.seagulls = []
        self.seagull_sprites = pygame.sprite.Group()

        self.particles = Particles(self.usealpha)
        self.particle_sprite = pygame.sprite.Group()
        self.particle_sprite.add(self.particles)

        self.mines = []
        self.mine_sprites = pygame.sprite.Group()

        self.score = Score()
        self.score_sprite = pygame.sprite.Group()
        self.score_sprite.add(self.score)

        self.powerups = []
        self.powerup_sprites = pygame.sprite.Group()

        self.level = Level(endless)

        self.lastshot = MIN_FIRE_DELAY + 1

        self.gameover = False
        self.gameover_image = None
        self.gameover_rect = None
        self.done = False

        self.pause = False
        font = util.load_font(
            "Cosmetica",
            40)  #pygame.font.Font(pygame.font.get_default_font(), 36)
        self.pause_image = font.render("Pause", True, (0, 0, 0))
        self.pause_rect = self.pause_image.get_rect()
        self.pause_rect.center = self.screen.get_rect().center
Ejemplo n.º 18
0
 def five_particles_3d_random(self):
     return Particles(num_particles=5,
                      num_dimensions=3,
                      mass=1,
                      diameter=0.1)
Ejemplo n.º 19
0
def single_point_particle_1d():
    return Particles(num_particles=1, num_dimensions=1, mass=1, diameter=0)
Ejemplo n.º 20
0
        cv.imshow(
            'map',
            draw_field(field=FIELD.copy(),
                       robot=robot,
                       particles=particles,
                       obstacles=obstacles))
        user_input = cv.waitKey(1)

        if start_localization:
            cv.setMouseCallback(
                'map', on_mouse=lambda event, x, y, flags, param: None)

            # Create particles at the current robot pose
            particles = Particles(row=robot.row,
                                  column=robot.column,
                                  angle=robot.angle,
                                  map_rows=NUM_MAP_ROWS,
                                  map_columns=NUM_MAP_COLUMNS)

            rospy.loginfo('[SLAM] start localization')
            t0 = time()
            start_localization = False
            pause_localization = False
            started_once = True

        elif not pause_localization:
            localize()

        elif pause_localization and started_once:
            # Pause localization and update with "actions"