#Generate the fibers fibers = AM.FiberSet(Ndiameter=73, fiber_pitch=fiber_pitch_mm * plate_scale, fiber_size=fiber_size_mm * plate_scale) #Generates a mock catalog fiber_number_density = fibers.Nfibers/((3.0 * np.sqrt(3.0)/2.0)*(fibers.radius **2)) print fiber_number_density, fibers.radius gals = AM.MockGalaxyCatalog(number_density=2.0*fiber_number_density, radius_fov=fibers.radius, random=True) #runs the allocation method="galaxy_density" for i in range(2): fibers = AM.FiberSet(Ndiameter=73, fiber_pitch=fiber_pitch_mm * plate_scale, fiber_size=fiber_size_mm * plate_scale) AM.make_fiber_allocation(fibers, gals, tile_visit_ID=i, rank_criterion=method, patrol_radius=fibers.fiber_pitch,\ exclusion_radius=fibers.fiber_size * 0.5) #prints some statistics allocated_gals = np.where(gals.tile_visit_ID!=-1) n_allocated = np.size(allocated_gals) n_total_gals = 1.0*gals.Ngalaxies* (3.0 * np.sqrt(3.0)/2.0/np.pi) print 'fraction of allocated galaxies', n_allocated/n_total_gals #makes a nice plot of allocated galaxies fig = plt.figure(1, figsize=(9.5,9.0)) ax = plt.axes() ax.set_xlabel("$\mathrm{ra\ [deg]}$",fontsize=25) ax.set_ylabel("$\mathrm{dec\ [deg]}$",fontsize=25) ax.set_title("$\mathrm{allocated\ galaxies}$", fontsize=25) ticklabels_x = ax.get_xticklabels() ticklabels_y = ax.get_yticklabels()
def main(): print "Started fiber allocation. Importing from data bank..." # load all the inputs data_bank = "../../../data/data_bank.h5" with archive.archive(data_bank, "r") as ar: # numbers coming from param.ini fiber_pitch = ar["/Fiber_Allocation/fiber_pitch"] fiber_size = ar["/Fiber_Allocation/fiber_size"] Ndiameter = ar["/Fiber_Allocation/num_fibers_on_diameter"] n_pass_per_tile = ar["/Fiber_Allocation/n_pass_per_tile"] patrol_radius = ar["/Fiber_Allocation/patrol_radius"] allocation_method = ar["/Fiber_Allocation/allocation_method"] # numbers coming from the previous step in the pipeline gals_x_in = ar["/gal/ra_true"] gals_y_in = ar["/gal/dec_true"] gals_id_in = ar["/gal/galaxy_index"] number_of_tiles = ar["/tiling/number_of_tiles"] tiles_centers_ra = ar["/tiling/tile_centers_ra"] tiles_centers_dec = ar["/tiling/tile_centers_dec"] galaxy_tile_id_list = ar["/gal/tile_ID"] tile_id_list = ar["/tiling/tile_ID"] survey_selection_flag = ar["/gal/survey_selection_flag"] survey_selection_flag = np.array(survey_selection_flag) gals_x_in = gals_x_in[survey_selection_flag] gals_y_in = gals_y_in[survey_selection_flag] gals_id_in = gals_id_in[survey_selection_flag] galaxy_tile_id_list = galaxy_tile_id_list[survey_selection_flag] print "...done." selected = np.where(galaxy_tile_id_list > 0) n_in_tiles = np.size(selected) print "There are %d galaxies in tiles" % (n_in_tiles) print "Min-Max RA Tiles: %f %f" % (np.amin(tiles_centers_ra), np.amax(tiles_centers_ra)) print "Min-Max DEC Tiles: %f %f" % (np.amin(tiles_centers_dec), np.amax(tiles_centers_dec)) print "Min-Max RA Galaxies: %f %f" % (np.amin(gals_x_in), np.amax(gals_x_in)) print "Min-Max DEC Galaxies: %f %f" % (np.amin(gals_y_in), np.amax(gals_y_in)) # plot_name = "all_galaxies" # diagplot.plot_positions(gals_x_in[selected], gals_y_in[selected], plot_name) # redefine the positions of the galaxies and tile centers to a 'planar' frame gals_x_in = gals_x_in * np.cos(gals_y_in * math.pi / 180.0) tiles_centers_ra = tiles_centers_ra * np.cos(tiles_centers_dec * math.pi / 180.0) # initialize full galaxy structure all_gals = AM.MockGalaxyCatalog(x_in=gals_x_in, y_in=gals_y_in, id_in=gals_id_in) fraction_allocated = np.empty((0)) # loop over the tiles for ra_center, dec_center, tile_id in zip(tiles_centers_ra, tiles_centers_dec, tile_id_list): # create the unperturbed set of fibers for this pass in this tile fibers = AM.FiberSet( Ndiameter=Ndiameter, fiber_pitch=fiber_pitch, fiber_size=fiber_size, center_x=ra_center, center_y=dec_center ) # set to -1 the fiber_ID of the galaxies that should fall inside a tile index_inside = np.where((galaxy_tile_id_list == tile_id) & (all_gals.tile_ID < 0)) all_gals.tile_ID[index_inside] = -1 if np.size(index_inside) > 0: print "Galaxies to allocate", np.size(index_inside) # Finally. Make the allocation! AM.make_fiber_allocation( fibers, all_gals, tile_ID=tile_id, visit_ID=1, rank_criterion=allocation_method, patrol_radius=fibers.fiber_pitch, exclusion_radius=fibers.fiber_size * 0.5, ) n_alloc = np.where(all_gals.fiber_ID > 0) # update the number of allocated galaxies for a control plot gal_alloc = np.where(all_gals.fiber_ID > 0) n_total = np.size(all_gals.fiber_ID) n_alloc = np.size(gal_alloc) fraction_allocated = np.append(fraction_allocated, (1.0 * n_alloc / (1.0 * n_total))) # final stats gal_alloc = np.where(all_gals.fiber_ID > 0) n_total = np.size(all_gals.fiber_ID) n_alloc = np.size(gal_alloc) print "Allocation efficiency", (1.0 * n_alloc) / (1.0 * n_total) print "Initial number of galaxies (after target selection)", n_total print "Initial number of galaxies (in tiles)", n_in_tiles print "Galaxies that were allocated:", n_alloc inner_fiber_selection_flag = np.array((all_gals.fiber_ID > 0)) print "survey selection:", survey_selection_flag.shape, np.sum(survey_selection_flag) print "inner fiber selection:", inner_fiber_selection_flag.shape, np.sum(inner_fiber_selection_flag) fiber_selection_flag = survey_selection_flag fiber_selection_flag[survey_selection_flag] = inner_fiber_selection_flag print "fiber selection:", fiber_selection_flag.shape, np.sum(fiber_selection_flag) # Write result to data bank with archive.archive(data_bank, "a") as ar: ar["/gal/tile_id"] = all_gals.tile_ID ar["/gal/visit_id"] = all_gals.visit_ID ar["/gal/fiber_id"] = all_gals.fiber_ID ar["/gal/fiber_selection_flag"] = fiber_selection_flag # ===================================================== # Diagnostics # ===================================================== print "... diagnostic plots" # fiberid distribution try: check_fiber_sel = numpy.where(fiber_selection_flag == True)[0] fiber_id_sub = all_gals.fiber_ID[check_fiber_sel] width, center, bin_edges, hist = Utilities.make_histogram(fiber_id_sub, int(float(Ngal) / 10.0)) Plotters.plot_fa_hist_fiberid( center, width, hist, fig_number=0, plot_number=0, title="n(fiberid)", base_directory=".", show_plot=True ) except (RuntimeError, TypeError, NameError): print "bad plot" pass # galaxy positions for those that are allocated (ra/dec position plot) try: Plotters.plot_fa_gal_position( all_gals.x[gal_alloc], all_gals.y[gal_alloc], fig_number=1, plot_number=0, title="galaxy position", base_directory=".", show_plot=True, ) except (RuntimeError, TypeError, NameError): print "bad plot" pass # fraction allocated vs. tile number try: tile_list = np.arange(np.size(fraction_allocated)) Plotters.plot_fa_completeness( tile_list, fraction_allocated, fig_number=2, plot_number=0, title="fiber completeness", base_directory=".", show_plot=False, ) except (RuntimeError, TypeError, NameError): print "bad plot" pass