def plot(self, bmap, ax_to_plot, unpacked_healpix, **kwargs): if len(self.polygon_coords) > 0: cra_deg, cdec_deg = zip(*[(coord_deg[0], coord_deg[1]) for coord_deg in self.polygon_coords]) cx, cy = bmap(cra_deg, cdec_deg) clat_lons = np.vstack([cx, cy]).transpose() ax_to_plot.add_patch(Polygon(clat_lons, **kwargs)) else: if self.relative_prob < 1e-8: fc = 'k' ec = 'None' alph = 0.1 else: fc = 'None' ec = 'k' alph = 1.0 c = coord.SkyCoord(self.RA, self.Dec, unit=(u.deg, u.deg)) pe = Pixel_Element(self.pixel_index, unpacked_healpix.nside, unpacked_healpix.prob[self.pixel_index]) pe.plot(bmap, ax_to_plot, facecolor=fc, edgecolor=ec, linewidth=0.1, alpha=alph, zorder=9500)
def main(self): is_error = False has_candidates = False # Parameter checks if self.options.gw_id == "": is_error = True print("GWID is required.") formatted_healpix_dir = self.options.healpix_dir if "{GWID}" in formatted_healpix_dir: formatted_healpix_dir = formatted_healpix_dir.replace( "{GWID}", self.options.gw_id) hpx_path = "%s/%s" % (formatted_healpix_dir, self.options.healpix_file) candidate_file_path = "%s/Candidates/%s" % ( formatted_healpix_dir, self.options.candidate_file) if self.options.healpix_file == "": is_error = True print("You must specify which healpix file to process.") if os.path.exists(candidate_file_path): has_candidates = True else: print("Skipping plot candidates.") if is_error: print("Exiting...") return 1 # Get Map ID healpix_map_select = "SELECT id, NSIDE FROM HealpixMap WHERE GWID = '%s' and Filename = '%s'" healpix_map_id = query_db([ healpix_map_select % (self.options.gw_id, self.options.healpix_file) ])[0][0][0] healpix_map_nside = query_db([ healpix_map_select % (self.options.gw_id, self.options.healpix_file) ])[0][0][1] # Get configured Detectors detector_select = "SELECT id, Name, Deg_width, Deg_width, Deg_radius, Area, MinDec, MaxDec FROM Detector" detector_result = query_db([detector_select])[0] detectors = [ Detector(dr[1], float(dr[2]), float(dr[2]), detector_id=int(dr[0])) for dr in detector_result ] # Get all observed tiles for all configured detectors observed_tile_select = ''' SELECT id, Detector_id, FieldName, RA, _Dec, EBV, N128_SkyPixel_id, Band_id, MJD, Exp_Time, Mag_Lim, HealpixMap_id FROM ObservedTile WHERE HealpixMap_id = %s and Detector_id = %s ''' observed_tiles = {} for d in detectors: ot_result = query_db( [observed_tile_select % (healpix_map_id, d.id)])[0] observed_tiles[d.name] = [ Tile(float(ot[3]), float(ot[4]), d.deg_width, d.deg_height, healpix_map_nside, tile_id=int(ot[0])) for ot in ot_result ] print("Loaded %s %s tiles..." % (len(observed_tiles[d.name]), d.name)) # load candidates if they exist candidates = [] if has_candidates: with open(candidate_file_path, 'r') as csvfile: csvreader = csv.reader(csvfile, delimiter=',') next(csvreader) # skip header for row in csvreader: name = row[0] ra = float(row[1]) dec = float(row[2]) flag1 = bool(int(row[3])) flag2 = bool(int(row[4])) is_keck = bool(int(row[5])) # append tuple candidates.append( (name, coord.SkyCoord(ra, dec, unit=(u.deg, u.deg)), flag1, flag2, is_keck)) select_pix = ''' SELECT running_prob.id, running_prob.HealpixMap_id, running_prob.Pixel_Index, running_prob.Prob, running_prob.Distmu, running_prob.Distsigma, running_prob.Mean, running_prob.Stddev, running_prob.Norm, running_prob.N128_SkyPixel_id, running_prob.cum_prob FROM (SELECT hp_prob.id, hp_prob.HealpixMap_id, hp_prob.Pixel_Index, hp_prob.Prob, hp_prob.Distmu, hp_prob.Distsigma, hp_prob.Mean, hp_prob.Stddev, hp_prob.Norm, hp_prob.N128_SkyPixel_id, SUM(hp_prob.Prob) OVER(ORDER BY hp_prob.Prob DESC) AS cum_prob FROM (SELECT hp.id, hp.HealpixMap_id, hp.Pixel_Index, hp.Prob, hp.Distmu, hp.Distsigma, hp.Mean, hp.Stddev, hp.Norm, hp.N128_SkyPixel_id FROM HealpixPixel hp WHERE hp.HealpixMap_id = %s ORDER BY hp.Prob DESC) hp_prob GROUP BY hp_prob.id, hp_prob.HealpixMap_id, hp_prob.Pixel_Index, hp_prob.Prob, hp_prob.Distmu, hp_prob.Distsigma, hp_prob.Mean, hp_prob.Stddev, hp_prob.Norm, hp_prob.N128_SkyPixel_id ) running_prob WHERE running_prob.cum_prob <= 0.9 ''' print("Selecting map pixels...") map_pix_result = query_db([select_pix % healpix_map_id])[0] print("...done") print("Building pixel elements...") map_pix = [ Pixel_Element(int(mp[2]), healpix_map_nside, float(mp[3]), pixel_id=int(mp[0])) for mp in map_pix_result ] map_pix_sorted = sorted(map_pix, key=lambda x: x.prob, reverse=True) print("...done") cutoff_50th = 0.5 cutoff_90th = 0.9 index_50th = 0 index_90th = 0 print("Find index for 50th...") cum_prob = 0.0 for i in range(len(map_pix_sorted)): cum_prob += map_pix_sorted[i].prob index_50th = i if (cum_prob >= cutoff_50th): break print("... %s" % index_50th) print("Find index for 90th...") cum_prob = 0.0 for i in range(len(map_pix_sorted)): cum_prob += map_pix_sorted[i].prob index_90th = i if (cum_prob >= cutoff_90th): break print("... %s" % index_90th) # print("Build multipolygons...") # net_50_polygon = [] # for p in map_pix_sorted[0:index_50th]: # net_50_polygon += p.query_polygon # joined_50_poly = unary_union(net_50_polygon) # # Fix any seams # eps = 0.00001 # merged_50_poly = [] # smoothed_50_poly = joined_50_poly.buffer(eps, 1, join_style=JOIN_STYLE.mitre).buffer(-eps, 1, join_style=JOIN_STYLE.mitre) # try: # test_iter = iter(smoothed_50_poly) # merged_50_poly = smoothed_50_poly # except TypeError as te: # merged_50_poly.append(smoothed_50_poly) # print("Number of sub-polygons in `merged_50_poly`: %s" % len(merged_50_poly)) # sql_50_poly = SQL_Polygon(merged_50_poly, detectors[0]) # net_90_polygon = [] # for p in map_pix_sorted[0:index_90th]: # net_90_polygon += p.query_polygon # joined_90_poly = unary_union(net_90_polygon) # # Fix any seams # merged_90_poly = [] # smoothed_90_poly = joined_90_poly.buffer(eps, 1, join_style=JOIN_STYLE.mitre).buffer(-eps, 1, join_style=JOIN_STYLE.mitre) # try: # test_iter = iter(smoothed_90_poly) # merged_90_poly = smoothed_90_poly # except TypeError as te: # merged_90_poly.append(smoothed_90_poly) # print("Number of sub-polygons in `merged_90_poly`: %s" % len(merged_90_poly)) # sql_90_poly = SQL_Polygon(merged_90_poly, detectors[0]) # print("... done.") sql_50_poly = None with open('sql50.pkl', 'rb') as handle: sql_50_poly = pickle.load(handle) sql_90_poly = None with open('sql90.pkl', 'rb') as handle: sql_90_poly = pickle.load(handle) fig = plt.figure(figsize=(10, 10), dpi=1000) ax = fig.add_subplot(111) m = Basemap(projection='stere', lon_0=15.0, lat_0=-20.0, llcrnrlat=-35.0, urcrnrlat=-19.5, llcrnrlon=8.0, urcrnrlon=24.5) # # m = Basemap(projection='moll',lon_0=180.0) # print("Plotting `pixels_filled`...") # Scale colormap pix_90 = map_pix_sorted[0:index_90th] pixel_probs = [p.prob for p in pix_90] min_prob = np.min(pixel_probs) max_prob = np.max(pixel_probs) # min_prob = 1.341511144989834e-06 # max_prob = 6.890843958619067e-05 print("min prob: %s" % min_prob) print("max prob: %s" % max_prob) # fracs = pixels_probs/max_prob # norm = colors.Normalize(fracs.min(), fracs.max()) # norm = colors.LogNorm(min_prob, max_prob) norm = colors.Normalize(min_prob, max_prob) # norm = colors.LogNorm(1e-18, max_prob) # log_lower_limit = 1e-8 # norm = colors.LogNorm(log_lower_limit, max_prob) # clrs = { # "SWOPE":"yellow", # "NICKEL":"brown", # "THACHER":"blue", # "ANDICAM":"red", # "MOSFIRE":"green", # } clrs = { "SWOPE": (230.0 / 256.0, 159 / 256.0, 0), "NICKEL": (0, 114.0 / 256.0, 178.0 / 256.0), "THACHER": (0, 158.0 / 256.0, 115.0 / 256.0), "MOSFIRE": (204.0 / 256.0, 121.0 / 256.0, 167.0 / 256.0), # "ANDICAM":"red", # "MOSFIRE":"green" } # Plot SWOPE, then THACHER, then NICKEL, then MOSFIRE x1, y1 = m(0, 0) m.plot(x1, y1, marker='s', markeredgecolor="k", markerfacecolor=clrs["SWOPE"], markersize=20, label="Swope", linestyle='None') m.plot(x1, y1, marker='s', markeredgecolor="k", markerfacecolor=clrs["THACHER"], markersize=16, label="Thacher", linestyle='None') m.plot(x1, y1, marker='s', markeredgecolor="k", markerfacecolor=clrs["NICKEL"], markersize=14, label="Nickel", linestyle='None') m.plot(x1, y1, marker='s', markeredgecolor="k", markerfacecolor=clrs["MOSFIRE"], markersize=10, label="MOSFIRE", linestyle='None') tile_opacity = 0.1 print("Plotting Tiles for: %s (%s)" % ("SWOPE", clrs["SWOPE"])) for i, t in enumerate(observed_tiles["SWOPE"]): t.plot(m, ax, edgecolor=clrs["SWOPE"], facecolor=clrs["SWOPE"], linewidth=0.25, alpha=tile_opacity) t.plot(m, ax, edgecolor='k', facecolor="None", linewidth=0.25, alpha=1.0) print("Plotting Tiles for: %s (%s)" % ("THACHER", clrs["THACHER"])) for i, t in enumerate(observed_tiles["THACHER"]): t.plot(m, ax, edgecolor=clrs["THACHER"], facecolor=clrs["THACHER"], linewidth=0.25, alpha=tile_opacity) t.plot(m, ax, edgecolor='k', facecolor="None", linewidth=0.25, alpha=1.0) print("Plotting Tiles for: %s (%s)" % ("NICKEL", clrs["NICKEL"])) for i, t in enumerate(observed_tiles["NICKEL"]): t.plot(m, ax, edgecolor=clrs["NICKEL"], facecolor=clrs["NICKEL"], linewidth=0.25, alpha=tile_opacity) t.plot(m, ax, edgecolor='k', facecolor="None", linewidth=0.25, alpha=1.0) print("Plotting Tiles for: %s (%s)" % ("MOSFIRE", clrs["MOSFIRE"])) for i, t in enumerate(observed_tiles["MOSFIRE"]): t.plot(m, ax, edgecolor=clrs["MOSFIRE"], facecolor=clrs["MOSFIRE"], linewidth=0.25, alpha=1.0, zorder=9999) t.plot(m, ax, edgecolor='k', facecolor="None", linewidth=0.25, alpha=1.0, zorder=9999) print("Plotting (%s) `pixels`..." % len(pix_90)) for i, p in enumerate(pix_90): p.plot(m, ax, facecolor=plt.cm.Greys(norm(p.prob)), edgecolor='None', linewidth=0.5, alpha=norm(p.prob) * 0.8) print("Plotting SQL Multipolygons") # with open('sql50.pkl', 'wb') as handle: # pickle.dump(sql_50_poly, handle, protocol=pickle.HIGHEST_PROTOCOL) # with open('sql90.pkl', 'wb') as handle: # pickle.dump(sql_90_poly, handle, protocol=pickle.HIGHEST_PROTOCOL) sql_50_poly.plot(m, ax, edgecolor='black', linewidth=1.0, facecolor='None') sql_90_poly.plot(m, ax, edgecolor='gray', linewidth=0.75, facecolor='None') # Plotted off the map so that the legend will have a line item if has_candidates: for c in candidates: x, y = m(c[1].ra.degree, c[1].dec.degree) if c[4]: m.plot(x, y, marker='*', markeredgecolor='k', markerfacecolor='gray', markersize=20.0, zorder=9999) else: mkrclr = 'gray' if c[2] and c[3]: # passes both Charlie and Ryan cuts mkrclr = 'red' m.plot(x, y, marker='o', markeredgecolor='k', markerfacecolor=mkrclr, markersize=5.0) x1, y1 = m(0, 0) m.plot(x1, y1, marker='.', linestyle="None", markeredgecolor="k", markerfacecolor="red", markersize=20, label="Viable candidate") x2, y2 = m(0, 0) m.plot(x2, y2, marker='.', linestyle="None", markeredgecolor="k", markerfacecolor="grey", markersize=20, label="Excluded") x3, y3 = m(0, 0) m.plot(x3, y3, marker='*', linestyle="None", markeredgecolor="k", markerfacecolor="grey", markersize=20, label="Keck Observed") # # # -------------- Use this for mollweide projections -------------- # # meridians = np.arange(0.,360.,60.) # # m.drawparallels(np.arange(-90.,91.,30.),fontsize=14,labels=[True,True,False,False],dashes=[2,2],linewidth=0.5) # , xoffset=2500000 # # m.drawmeridians(meridians,labels=[False,False,False,False],dashes=[2,2],linewidth=0.5) # # # ---------------------------------------------------------------- # # # -------------- Use this for stereographic projections ---------- # # # draw meridians # # meridians = np.arange(0.,360.,10.) # # par = m.drawmeridians(meridians,labels=[0,0,0,1],fontsize=18,zorder=-1,color='gray', linewidth=0.5) # # # draw parallels # # parallels = np.arange(-90.,90.,10.) # # par = m.drawparallels(parallels,labels=[0,1,0,0],fontsize=18,zorder=-1,color='gray', linewidth=0.5, xoffset=230000) # # ## ---------------------------------------------------------------- # # for mer in meridians[1:]: # # plt.annotate("%0.0f" % mer,xy=m(mer,0),xycoords='data', fontsize=14, zorder=9999) # draw parallels. sm_label_size = 18 label_size = 28 title_size = 36 _90_x1 = 0.77 _90_y1 = 0.558 _90_x2 = 0.77 _90_y2 = 0.40 _90_text_y = 0.37 _90_text_x = 0.32 _50_x1 = 0.60 _50_y1 = 0.51 _50_x2 = 0.48 _50_y2 = 0.40 _50_text_y = 0.37 _50_text_x = 0.64 ax.annotate('', xy=(_90_x1, _90_y1), xytext=(_90_x2, _90_y2), xycoords='axes fraction', arrowprops={ 'arrowstyle': '-', 'lw': 2.0 }) ax.annotate('', xy=(_50_x1, _50_y1), xytext=(_50_x2, _50_y2), xycoords='axes fraction', arrowprops={ 'arrowstyle': '-', 'lw': 2.0 }) ax.annotate('90th percentile', xy=(_50_text_x, _50_text_y), xycoords='axes fraction', fontsize=sm_label_size) ax.annotate('50th percentile', xy=(_90_text_x, _90_text_y), xycoords='axes fraction', fontsize=sm_label_size) parallels = np.arange(-90., 90., 10.) dec_ticks = m.drawparallels(parallels, labels=[0, 1, 0, 0]) for i, tick_obj in enumerate(dec_ticks): a = coord.Angle(tick_obj, unit=u.deg) for text_obj in dec_ticks[tick_obj][1]: direction = '+' if a.dms[0] > 0.0 else '-' text_obj.set_text(r'${0}{1:0g}^{{\degree}}$'.format( direction, np.abs(a.dms[0]))) text_obj.set_size(sm_label_size) x = text_obj.get_position()[0] new_x = x * (1.0 + 0.08) text_obj.set_x(new_x) # draw meridians meridians = np.arange(0., 360., 7.5) ra_ticks = m.drawmeridians(meridians, labels=[0, 0, 0, 1]) RA_label_dict = { 7.5: r'$00^{\mathrm{h}}30^{\mathrm{m}}$', 15.0: r'$01^{\mathrm{h}}00^{\mathrm{m}}$', 22.5: r'$01^{\mathrm{h}}30^{\mathrm{m}}$', } for i, tick_obj in enumerate(ra_ticks): # a = coord.Angle(tick_obj, unit=u.deg) # print(a.hms) print(tick_obj) for text_obj in ra_ticks[tick_obj][1]: if tick_obj in RA_label_dict: text_obj.set_text(RA_label_dict[tick_obj]) text_obj.set_size(sm_label_size) sm = plt.cm.ScalarMappable(norm=norm, cmap=plt.cm.Greys) sm.set_array([]) # can be an empty list tks = np.linspace(min_prob, max_prob, 6) # tks = np.logspace(np.log10(min_prob), np.log10(max_prob), 11) tks_strings = [] for t in tks: tks_strings.append('%0.2f' % (t * 100)) cb = fig.colorbar(sm, ax=ax, ticks=tks, orientation='vertical', fraction=0.04875, pad=0.02, alpha=0.80) # 0.08951 cb.ax.set_yticklabels(tks_strings, fontsize=16) cb.set_label("2D Pixel Probability", fontsize=label_size, labelpad=9.0) cb.ax.tick_params(width=2.0, length=6.0) cb.outline.set_linewidth(2.0) for axis in ['top', 'bottom', 'left', 'right']: ax.spines[axis].set_linewidth(2.0) ax.invert_xaxis() ax.legend(loc='upper left', fontsize=sm_label_size, borderpad=0.35, handletextpad=0.0, labelspacing=0.4) # ax.legend(fontsize=14) plt.ylabel(r'$\mathrm{Declination}$', fontsize=label_size, labelpad=36) plt.xlabel(r'$\mathrm{Right\;Ascension}$', fontsize=label_size, labelpad=30) fig.savefig('Keck.png', bbox_inches='tight') #,dpi=840 plt.close('all') print("... Done.")
def main(self): ### UNPACKING THE HEALPIX FILES ### hpx_path = "%s/%s" % (self.options.healpix_dir, self.options.healpix_file) # If you specify a telescope that's not in the default list, you must provide the rest of the information detector = None is_error = False is_custom_percentile = False custom_percentile = None # Check the inputs for errors... if self.options.telescope_abbreviation not in self.telescope_mapping.keys( ): print( "Running for custom telescope. Checking required parameters..." ) if self.options.telescope_abbreviation == "": is_error = True print( "For custom telescope, `telescope_abbreviation` is required!" ) if self.options.telescope_name == "": is_error = True print("For custom telescope, `telescope_name` is required!") if self.options.detector_width_deg <= 0.0: is_error = True print( "For custom telescope, `detector_width_deg` is required, and must be > 0!" ) if self.options.detector_height_deg <= 0.0: is_error = True print( "For custom telescope, `detector_height_deg` is required, and must be > 0!" ) if not is_error: detector = Detector(self.options.telescope_name, self.options.detector_width_deg, self.options.detector_height_deg) else: detector = self.telescope_mapping[ self.options.telescope_abbreviation] if self.options.percentile > 0.9: is_error = True print("User-defined percentile must be <= 0.90") elif self.options.percentile > 0.0: is_custom_percentile = True custom_percentile = self.options.percentile if is_error: print("Exiting...") return 1 print("\n\nTelescope: `%s -- %s`, width: %s [deg]; height %s [deg]" % (self.options.telescope_abbreviation, detector.name, detector.deg_width, detector.deg_height)) print("%s FOV area: %s" % (detector.name, (detector.deg_width * detector.deg_height))) if is_custom_percentile: print("\nTiling to %s percentile." % self.options.percentile) t1 = time.time() print("Unpacking '%s':%s..." % (self.options.gw_id, hpx_path)) prob, distmu, distsigma, distnorm, header_gen = hp.read_map( hpx_path, field=(0, 1, 2, 3), h=True) header = dict(header_gen) t2 = time.time() print("\n********* start DEBUG ***********") print("`Unpacking healpix` execution time: %s" % (t2 - t1)) print("********* end DEBUG ***********\n") npix = len(prob) print("\nNumber of pix in '%s': %s" % (hpx_path, len(prob))) sky_area = 4 * 180**2 / np.pi area_per_px = sky_area / npix print("Sky Area per pix in '%s': %s [sq deg]" % (hpx_path, area_per_px)) sky_area_radians = 4 * np.pi steradian_per_pix = sky_area_radians / npix pixel_radius_radian = np.sqrt(steradian_per_pix / np.pi) print("Steradian per px for '%s': %s" % (hpx_path, steradian_per_pix)) # nside = the lateral resolution of the HEALPix map nside = hp.npix2nside(npix) print("Resolution (nside) of '%s': %s\n" % (hpx_path, nside)) print("Processing for %s..." % detector.name) num_px_per_field = (detector.deg_height * detector.deg_width) / area_per_px print("Pix per (%s) field for '%s': %s" % (detector.name, hpx_path, num_px_per_field)) percentile = self.options.percentile unpacked_healpix = Unpacked_Healpix( hpx_path, prob, distmu, distsigma, distnorm, header, nside, npix, area_per_px, linestyle="-", compute_contours=False, custom_percentile=custom_percentile) num_50 = len(unpacked_healpix.indices_of_50) num_90 = len(unpacked_healpix.indices_of_90) area_50 = num_50 * area_per_px area_90 = num_90 * area_per_px # Debug -- should match Grace DB statistics print("\nArea of 50th: %s" % area_50) print("Area of 90th: %s\n" % area_90) if is_custom_percentile: num_custom = len(unpacked_healpix.pixels_custom) area_custom = num_custom * area_per_px print("\n[User defined] Area of %s: %s\n" % (custom_percentile, area_custom)) ### GENERATE THE ALL-SKY TILING FOR A DETECTOR & GET THE ENCLOSED GALAXIES ### print("Generating all sky coords for %s" % detector.name) detector_all_sky_coords = Cartographer.generate_all_sky_coords( detector) base_cartography = Cartographer(self.options.gw_id, unpacked_healpix, detector, detector_all_sky_coords, generate_tiles=True) # Save cartograpy with open( '%s/%s_base_cartography.pkl' % (self.options.working_dir, self.options.gw_id), 'wb') as handle: pickle.dump(base_cartography, handle, protocol=pickle.HIGHEST_PROTOCOL) if not self.options.skip_completeness: # Build the spatial query t1 = time.time() # Join all tiles together into a composite polygon to simplify the SQL query net_polygon = [] for t in base_cartography.tiles: net_polygon += t.query_polygon joined_poly = unary_union(net_polygon) # Fix any seams eps = 0.00001 merged_poly = joined_poly.buffer( eps, 1, join_style=JOIN_STYLE.mitre).buffer( -eps, 1, join_style=JOIN_STYLE.mitre) try: print("Number of sub-polygons in query: %s" % len(merged_poly)) except TypeError as e: print("Warning...") print(e) print( "\nOnly one polygons in query! Wrapping `merged_poly` and resuming..." ) merged_poly = [merged_poly] # Create and save sql_poly sql_poly = SQL_Polygon(merged_poly, detector) with open( '%s/%s_sql_poly.pkl' % (self.options.working_dir, self.options.gw_id), 'wb') as handle: pickle.dump(sql_poly, handle, protocol=pickle.HIGHEST_PROTOCOL) # # Use the sql_poly string to create the WHERE clause mp_where = "ST_WITHIN(Coord, ST_GEOMFROMTEXT('" mp_where += sql_poly.query_polygon_string mp_where += "', 4326));" t2 = time.time() print("\n********* start DEBUG ***********") print("`Generating multipolygon` execution time: %s" % (t2 - t1)) print("********* end DEBUG ***********\n") # Database I/O t1 = time.time() query = "SELECT * from GalaxyDistance2 WHERE z_dist IS NOT NULL AND z_dist_err IS NOT NULL AND B IS NOT NULL AND " query += mp_where print(query) print("\n*****************************\n") # Save cartograpy with open( '%s/%s_query.pkl' % (self.options.working_dir, self.options.gw_id), 'wb') as handle: pickle.dump(query, handle, protocol=pickle.HIGHEST_PROTOCOL) result = QueryDB(query, port=LOCAL_PORT) t2 = time.time() print("\n********* start DEBUG ***********") print("`Query database` execution time: %s" % (t2 - t1)) print("********* end DEBUG ***********\n") # Instantiate galaxies contained_galaxies = [] # What is the angular radius for our given map? cosmo = LambdaCDM(H0=70, Om0=0.3, Ode0=0.7) pixel_diameter_arcsec = np.degrees( pixel_radius_radian) * 2.0 * 3600.0 proper_radius = 20.0 # kpc z = np.linspace(1e-18, 0.3, 1000) arcsec_of_proper_diam = cosmo.arcsec_per_kpc_proper( z) * proper_radius * 2.0 z_index = find_nearest(arcsec_of_proper_diam, pixel_diameter_arcsec) target_z = z[z_index] dist_cuttoff = cosmo.luminosity_distance(target_z).value # Mpc print("Redshift cutoff: %s" % target_z) print("Distance cutoff: %s" % dist_cuttoff) for row in result: g = glade_galaxy(row, base_cartography.unpacked_healpix, cosmo, dist_cuttoff, proper_radius) contained_galaxies.append(g) print("Query returned %s galaxies" % len(contained_galaxies)) avg_dist = average_distance_prior( base_cartography.unpacked_healpix) catalog_completeness = GLADE_completeness(avg_dist) print("Completeness: %s" % catalog_completeness) ### REDISTRIBUTE THE PROBABILITY IN THE MAP TO THE GALAXIES ### print("Assigning relative prob...") Cartographer.assign_galaxy_relative_prob( base_cartography.unpacked_healpix, contained_galaxies, base_cartography.cumlative_prob_in_tiles, catalog_completeness) # Save contained galaxies with open( '%s/%s_contained_galaxies.pkl' % (self.options.working_dir, self.options.gw_id), 'wb') as handle: pickle.dump(contained_galaxies, handle, protocol=pickle.HIGHEST_PROTOCOL) print("Redistribute prob...") # redistributed_map redistributed_prob, enclosed_indices = Cartographer.redistribute_probability( base_cartography.unpacked_healpix, contained_galaxies, base_cartography.tiles, catalog_completeness) # Copy base cartography (have to do this?) and update the prob of the 90th perecentil redistributed_cartography = copy.deepcopy(base_cartography) redistributed_cartography.unpacked_healpix.prob = redistributed_prob redistributed_cartography.unpacked_healpix.pixels_90 = [ Pixel_Element( ei, redistributed_cartography.unpacked_healpix.nside, redistributed_cartography.unpacked_healpix.prob[ei]) for ei in enclosed_indices ] # Update the original tiles with the new probability redistributed_cartography.assign_tiles(base_cartography.tiles) # Save cartograpy with open( '%s/%s_redstributed_cartography.pkl' % (self.options.working_dir, self.options.gw_id), 'wb') as handle: pickle.dump(redistributed_cartography, handle, protocol=pickle.HIGHEST_PROTOCOL) else: print("\n\nPure tiling...") ### SAVE THE RESULTS ### def GetSexigesimalString(c): ra = c.ra.hms dec = c.dec.dms ra_string = "%02d:%02d:%05.2f" % (ra[0], ra[1], ra[2]) if dec[0] >= 0: dec_string = "+%02d:%02d:%05.2f" % (dec[0], np.abs( dec[1]), np.abs(dec[2])) else: dec_string = "%03d:%02d:%05.2f" % (dec[0], np.abs( dec[1]), np.abs(dec[2])) # Python has a -0.0 object. If the deg is this (because object lies < 60 min south), the string formatter will drop the negative sign if c.dec < 0.0 and dec[0] == 0.0: dec_string = "-00:%02d:%05.2f" % (np.abs(dec[1]), np.abs( dec[2])) return (ra_string, dec_string) tiles_to_serialize = None if not self.options.skip_completeness: tiles_to_serialize = redistributed_cartography.tiles else: tiles_to_serialize = base_cartography.tiles t1 = time.time() sorted_tiles = sorted(tiles_to_serialize, key=lambda x: x.net_prob, reverse=True) with open( '%s/%s_%s_%s_Tiles.txt' % (self.options.working_dir, base_cartography.gwid, self.options.schedule_designation, detector.name), 'w') as csvfile: csvwriter = csv.writer(csvfile) cols = [] cols.append('# FieldName') cols.append('FieldRA') cols.append('FieldDec') cols.append('Telscope') cols.append('Filter') cols.append('ExpTime') cols.append('Priority') cols.append('Status') csvwriter.writerow(cols) for i, st in enumerate(sorted_tiles): c = coord.SkyCoord(st.ra_deg, st.dec_deg, unit=(u.deg, u.deg)) coord_str = GetSexigesimalString(c) cols = [] field_name = "%s%s%sE%s" % ( self.options.telescope_abbreviation, str(self.options.event_number).zfill(3), self.options.schedule_designation, str(i + 1).zfill(5)) cols.append(field_name) cols.append(coord_str[0]) cols.append(coord_str[1]) cols.append(detector.name) cols.append(self.options.filter) cols.append(self.options.exp_time) cols.append(st.net_prob) cols.append('False') csvwriter.writerow(cols) print("Done") t2 = time.time() print("\n********* start DEBUG ***********") print("`Serialize tiles` execution time: %s" % (t2 - t1)) print("********* end DEBUG ***********\n")
def initialize(self, compute_contours): t1 = time.time() sorted_prob = np.sort(self.prob) sorted_prob = sorted_prob[::-1] # Reverse sort (highest first) max_prob = np.max(sorted_prob) # 99th percentile _99_cut, index_99 = self.get_prob_val_and_index(sorted_prob, 0.99) # 95th percentile _95_cut, index_95 = self.get_prob_val_and_index(sorted_prob, 0.95) # 90th percentile _90_cut, index_90 = self.get_prob_val_and_index(sorted_prob, 0.90) # 70th percentile _70_cut, index_70 = self.get_prob_val_and_index(sorted_prob, 0.70) # 50th percentile _50_cut, index_50 = self.get_prob_val_and_index(sorted_prob, 0.50) lvls = [_90_cut, _70_cut, _50_cut, max_prob] indices_of_50 = np.where(self.prob >= _50_cut)[0] indices_of_70 = np.where(self.prob >= _70_cut)[0] indices_of_90 = np.where(self.prob >= _90_cut)[0] indices_of_95 = np.where(self.prob >= _95_cut)[0] indices_of_99 = np.where(self.prob >= _99_cut)[0] self.indices_of_50 = indices_of_50 self.indices_of_70 = indices_of_70 self.indices_of_90 = indices_of_90 self.indices_of_95 = indices_of_95 self.indices_of_99 = indices_of_99 self.levels = lvls self.pixels_90 = [ Pixel_Element(i90, self.nside, self.prob[i90]) for i90 in self.indices_of_90 ] self.indices_of_custom = None # Custom percentile _custom_cut = None index_custom = None indices_of_custom = None if self.custom_percentile is not None: _custom_cut, index_custom = self.get_prob_val_and_index( sorted_prob, self.custom_percentile) indices_of_custom = np.where(self.prob >= _custom_cut)[0] self.indices_of_custom = indices_of_custom self.pixels_custom = [ Pixel_Element(ic, self.nside, self.prob[ic]) for ic in self.indices_of_custom ] if compute_contours: print("Computing contours for '%s'...\n" % self.file_name) self.compute_contours() t2 = time.time() print("\n********* start DEBUG ***********") print("`Unpacked_Healpix.initialize` execution time: %s" % (t2 - t1)) print("********* end DEBUG ***********\n")
def main(self): detector_mapping = { "s": "SWOPE", "t": "THACHER", "n": "NICKEL", "k": "KAIT" } band_mapping = { "g": "SDSS g", "r": "SDSS r", "i": "SDSS i", "Clear": "Clear" } # Valid prob types _4D = "4D" _2D = "2D" is_error = False # Parameter checks if self.options.gw_id == "": is_error = True print("GWID is required.") formatted_healpix_dir = self.options.healpix_dir if "{GWID}" in formatted_healpix_dir: formatted_healpix_dir = formatted_healpix_dir.replace( "{GWID}", self.options.gw_id) hpx_path = "%s/%s" % (formatted_healpix_dir, self.options.healpix_file) tile_file_path = "%s/%s" % (formatted_healpix_dir, self.options.tile_file) galaxies_file_path = "%s/%s" % (formatted_healpix_dir, self.options.galaxies_file) if self.options.healpix_file == "": is_error = True print("You must specify which healpix file to process.") if self.options.band not in band_mapping: is_error = True print("Invalid band selection. Available bands: %s" % band_mapping.keys()) if self.options.tele not in detector_mapping: is_error = True print("Invalid telescope selection. Available telescopes: %s" % detector_mapping.keys()) if not self.options.get_tiles_from_db: if not os.path.exists(tile_file_path): is_error = True print("You must specify which tile file to plot.") plotGalaxies = False if os.path.exists(galaxies_file_path): plotGalaxies = True if self.options.extinct <= 0.0: is_error = True print("Extinction must be a valid float > 0.0") if not (self.options.prob_type == _4D or self.options.prob_type == _2D): is_error = True print("Prob type must either be `4D` or `2D`") if self.options.cum_prob_outer > 0.95 or \ self.options.cum_prob_outer < 0.20 or \ self.options.cum_prob_outer < self.options.cum_prob_inner: is_error = True print( "Cum prob outer must be between 0.2 and 0.95 and > Cum prob inner" ) if self.options.cum_prob_inner > 0.95 or \ self.options.cum_prob_inner < 0.20 or \ self.options.cum_prob_inner > self.options.cum_prob_outer: is_error = True print( "Cum prob inner must be between 0.2 and 0.95 and < Cum prob outer" ) if is_error: print("Exiting...") return 1 # Get Map ID healpix_map_select = "SELECT id, RescaledNSIDE FROM HealpixMap WHERE GWID = '%s' and Filename = '%s'" healpix_map_result = query_db([ healpix_map_select % (self.options.gw_id, self.options.healpix_file) ])[0][0] healpix_map_id = int(healpix_map_result[0]) healpix_map_nside = int(healpix_map_result[1]) band_name = band_mapping[self.options.band] band_select = "SELECT id, Name, F99_Coefficient FROM Band WHERE `Name`='%s'" band_result = query_db([band_select % band_name])[0][0] band_id = band_result[0] band_F99 = float(band_result[2]) telescope_name = detector_mapping[self.options.tele] detector_select_by_name = "SELECT id, Name, Deg_width, Deg_height, Deg_radius, Area, MinDec, MaxDec FROM Detector WHERE Name='%s'" detector_result = query_db([detector_select_by_name % telescope_name ])[0][0] detector_id = int(detector_result[0]) detector = Detector(detector_result[1], float(detector_result[2]), float(detector_result[3]), detector_id=detector_id) galaxies_to_plot = [] gal_ra = [] gal_dec = [] if plotGalaxies: with open('%s' % galaxies_file_path, 'r') as csvfile: csvreader = csv.reader(csvfile, delimiter=',', skipinitialspace=True) # Skip Header next(csvreader) for row in csvreader: gal_ra.append(row[1]) gal_dec.append(row[2]) galaxies_to_plot = coord.SkyCoord(gal_ra, gal_dec, unit=(u.hour, u.deg)) tiles_to_plot = [] if not self.options.get_tiles_from_db: # Load tile_file with open('%s' % tile_file_path, 'r') as csvfile: csvreader = csv.reader(csvfile, delimiter=',', skipinitialspace=True) # Skip Header next(csvreader) for row in csvreader: name = row[0] c = coord.SkyCoord(row[1], row[2], unit=(u.hour, u.deg)) t = Tile(c.ra.degree, c.dec.degree, detector.deg_width, detector.deg_height, healpix_map_nside) t.field_name = name t.net_prob = float(row[6]) tiles_to_plot.append(t) else: select_tiles_per_map = ''' SELECT ot.FieldName, ot.RA, ot._Dec, ot.MJD, ot.Exp_Time, ot.Mag_Lim, d.`Name` as DetectorName, d.Deg_width, d.Deg_height FROM ObservedTile ot JOIN Detector d on d.id = ot.Detector_id WHERE ot.HealpixMap_id = %s; ''' map_tiles = query_db([select_tiles_per_map % healpix_map_id])[0] print("Map tiles: %s" % len(map_tiles)) for mt in map_tiles: c = coord.SkyCoord(mt[1], mt[2], unit=(u.deg, u.deg)) t = Tile(c.ra.degree, c.dec.degree, float(mt[7]), float(mt[8]), healpix_map_nside) t.field_name = mt[6] tiles_to_plot.append(t) tile_colors = { 'KAIT': "seagreen", 'NICKEL': "mediumpurple", 'SWOPE': "red", 'THACHER': "darkorange" } select_2D_pix = ''' SELECT running_prob.id, running_prob.HealpixMap_id, running_prob.Pixel_Index, running_prob.Prob, running_prob.Distmu, running_prob.Distsigma, running_prob.Mean, running_prob.Stddev, running_prob.Norm, running_prob.N128_SkyPixel_id, running_prob.cum_prob FROM (SELECT hp_prob.id, hp_prob.HealpixMap_id, hp_prob.Pixel_Index, hp_prob.Prob, hp_prob.Distmu, hp_prob.Distsigma, hp_prob.Mean, hp_prob.Stddev, hp_prob.Norm, hp_prob.N128_SkyPixel_id, SUM(hp_prob.Prob) OVER(ORDER BY hp_prob.Prob DESC) AS cum_prob FROM (SELECT hp.id, hp.HealpixMap_id, hp.Pixel_Index, hp.Prob, hp.Distmu, hp.Distsigma, hp.Mean, hp.Stddev, hp.Norm, hp.N128_SkyPixel_id FROM HealpixPixel hp WHERE hp.HealpixMap_id = %s ORDER BY hp.Prob DESC) hp_prob GROUP BY hp_prob.id, hp_prob.HealpixMap_id, hp_prob.Pixel_Index, hp_prob.Prob, hp_prob.Distmu, hp_prob.Distsigma, hp_prob.Mean, hp_prob.Stddev, hp_prob.Norm, hp_prob.N128_SkyPixel_id ) running_prob WHERE running_prob.cum_prob <= %s ''' select_4D_pix = ''' SELECT running_prob.id, running_prob.HealpixMap_id, running_prob.Pixel_Index, running_prob.Prob, running_prob.NetPixelProb, running_prob.Distmu, running_prob.Distsigma, running_prob.Mean, running_prob.Stddev, running_prob.Norm, running_prob.N128_SkyPixel_id, running_prob.cum_net_pixel_prob FROM (SELECT hp_prob.id, hp_prob.HealpixMap_id, hp_prob.Pixel_Index, hp_prob.Prob, hp_prob.NetPixelProb, hp_prob.Distmu, hp_prob.Distsigma, hp_prob.Mean, hp_prob.Stddev, hp_prob.Norm, hp_prob.N128_SkyPixel_id, SUM(hp_prob.NetPixelProb) OVER(ORDER BY hp_prob.NetPixelProb DESC) AS cum_net_pixel_prob FROM (SELECT hp.id, hp.HealpixMap_id, hp.Pixel_Index, hp.Prob, hpc.NetPixelProb, hp.Distmu, hp.Distsigma, hp.Mean, hp.Stddev, hp.Norm, hp.N128_SkyPixel_id FROM HealpixPixel hp JOIN HealpixPixel_Completeness hpc on hpc.HealpixPixel_id = hp.id WHERE hp.HealpixMap_id = %s ORDER BY hpc.NetPixelProb DESC) hp_prob GROUP BY hp_prob.id, hp_prob.HealpixMap_id, hp_prob.Pixel_Index, hp_prob.Prob, hp_prob.NetPixelProb, hp_prob.Distmu, hp_prob.Distsigma, hp_prob.Mean, hp_prob.Stddev, hp_prob.Norm, hp_prob.N128_SkyPixel_id ) running_prob WHERE running_prob.cum_net_pixel_prob <= %s ''' select_mwe_pix = ''' SELECT sp.Pixel_Index FROM SkyPixel sp WHERE sp.id IN ( SELECT sp.Parent_Pixel_id FROM SkyPixel sp WHERE sp.id IN ( SELECT sp.Parent_Pixel_id FROM SkyPixel sp JOIN SkyPixel_EBV sp_ebv ON sp_ebv.N128_SkyPixel_id = sp.id WHERE sp_ebv.EBV*%s > %s and NSIDE = 128 ) and NSIDE = 64 ) and NSIDE = 32 ''' print("Selecting map pixels...") pixels_to_select = "" if self.options.prob_type == _2D: pixels_to_select = select_2D_pix % (healpix_map_id, self.options.cum_prob_outer) else: pixels_to_select = select_4D_pix % (healpix_map_id, self.options.cum_prob_outer) map_pix_result = query_db([pixels_to_select])[0] mwe_pix_result = query_db( [select_mwe_pix % (band_F99, self.options.extinct)])[0] print("...done") print("Building pixel elements...") map_pix = [ Pixel_Element(int(mp[2]), healpix_map_nside, float(mp[3]), pixel_id=int(mp[0])) for mp in map_pix_result ] map_pix_sorted = sorted(map_pix, key=lambda p: p.prob, reverse=True) mwe_pix = [Pixel_Element(int(mp[0]), 32, 0.0) for mp in mwe_pix_result] print("...done") cutoff_inner = self.options.cum_prob_inner cutoff_outer = self.options.cum_prob_outer index_inner = 0 index_outer = 0 print("Find index for inner contour...") cum_prob = 0.0 for i in range(len(map_pix_sorted)): cum_prob += map_pix_sorted[i].prob index_inner = i if cum_prob >= cutoff_inner: break print("... %s" % index_inner) print("Find index for outer contour...") cum_prob = 0.0 for i in range(len(map_pix_sorted)): cum_prob += map_pix_sorted[i].prob index_outer = i if cum_prob >= cutoff_outer: break print("... %s" % index_outer) print("Build multipolygons...") net_inner_polygon = [] for p in map_pix_sorted[0:index_inner]: net_inner_polygon += p.query_polygon joined_inner_poly = unary_union(net_inner_polygon) # Fix any seams eps = 0.00001 merged_inner_poly = [] smoothed_inner_poly = joined_inner_poly.buffer( eps, 1, join_style=JOIN_STYLE.mitre).buffer(-eps, 1, join_style=JOIN_STYLE.mitre) try: test_iter = iter(smoothed_inner_poly) merged_inner_poly = smoothed_inner_poly except TypeError as te: merged_inner_poly.append(smoothed_inner_poly) print("Number of sub-polygons in `merged_inner_poly`: %s" % len(merged_inner_poly)) sql_inner_poly = SQL_Polygon(merged_inner_poly, detector) net_outer_polygon = [] for p in map_pix_sorted[0:index_outer]: net_outer_polygon += p.query_polygon joined_outer_poly = unary_union(net_outer_polygon) # Fix any seams merged_outer_poly = [] smoothed_outer_poly = joined_outer_poly.buffer( eps, 1, join_style=JOIN_STYLE.mitre).buffer(-eps, 1, join_style=JOIN_STYLE.mitre) try: test_iter = iter(smoothed_outer_poly) merged_outer_poly = smoothed_outer_poly except TypeError as te: merged_outer_poly.append(smoothed_outer_poly) print("Number of sub-polygons in `merged_outer_poly`: %s" % len(merged_outer_poly)) sql_outer_poly = SQL_Polygon(merged_outer_poly, detector) print("... done.") # Plot!! fig = plt.figure(figsize=(10, 10), dpi=800) ax = fig.add_subplot(111) m = Basemap(projection='moll', lon_0=180.0) sql_inner_poly.plot(m, ax, edgecolor='black', linewidth=0.5, facecolor='None') sql_outer_poly.plot(m, ax, edgecolor='gray', linewidth=0.5, facecolor='None') for p in mwe_pix: p.plot(m, ax, edgecolor='None', linewidth=0.5, facecolor='cornflowerblue', alpha=0.5) print("Plotting (%s) Tiles..." % len(tiles_to_plot)) if not self.options.get_tiles_from_db: for i, t in enumerate(tiles_to_plot): t.plot(m, ax, edgecolor='r', facecolor='None', linewidth=0.25, alpha=1.0, zorder=9900) else: for i, t in enumerate(tiles_to_plot): t.plot(m, ax, edgecolor=tile_colors[t.field_name], facecolor='None', linewidth=0.25, alpha=1.0, zorder=9900) print("Plotting (%s) Galaxies..." % len(galaxies_to_plot)) if plotGalaxies: for g in galaxies_to_plot: x, y = m(g.ra.degree, g.dec.degree) m.plot(x, y, 'ko', markersize=0.2, linewidth=0.25, alpha=0.3, zorder=9900) # # # -------------- Use this for mollweide projections -------------- meridians = np.arange(0., 360., 60.) m.drawparallels(np.arange(-90., 91., 30.), fontsize=14, labels=[True, True, False, False], dashes=[2, 2], linewidth=0.5) # , xoffset=2500000 m.drawmeridians(meridians, labels=[False, False, False, False], dashes=[2, 2], linewidth=0.5) # # # ---------------------------------------------------------------- ax.invert_xaxis() plt.ylabel(r'$\mathrm{Declination}$', fontsize=16, labelpad=36) plt.xlabel(r'$\mathrm{Right\;Ascension}$', fontsize=16, labelpad=30) output_path = "%s/%s" % (formatted_healpix_dir, self.options.tile_file.replace( ".csv", ".png")) fig.savefig(output_path, bbox_inches='tight') # ,dpi=840 plt.close('all') print("... Done.")
print("\tLoading existing pixels...") with open('sky_pixels.pkl', 'rb') as handle: sky_pixels = pickle.load(handle) else: ## Build Sky Pixel Objects ## print("\n\nBuilding Sky Pixels...") sky_pixels = OrderedDict( ) # Ordered Dict because it will matter the order once we start iterating during the INSERT for i, nside in enumerate(nsides): print("Initializing NSIDE=%s pix..." % nside) sky_pixels[nside] = {} for j in range(nside_npix[i]): pe = Pixel_Element(j, nside, 0.0) pe.query_polygon_string # initialize sky_pixels[nside][j] = pe if i > 0: for j, (pi, pe) in enumerate(sky_pixels[nside].items()): # Get Parent Pixel theta, phi = hp.pix2ang(pe.nside, pe.index) parent_index = hp.ang2pix(nsides[i - 1], theta, phi) if not parent_index in sky_pixels[nsides[i - 1]]: raise ( "Orphaned NSIDE=%s pixel! Orphaned index, theta, phi: (%s, %s, %s)" % (nside, pe.index, theta, phi)) else: parent_pixel = sky_pixels[nsides[i - 1]][parent_index]
def main(self): hpx_path = "%s/%s" % (self.options.healpix_dir, self.options.healpix_file) # If you specify a telescope that's not in the default list, you must provide the rest of the information detector = None is_error = False is_custom_percentile = False custom_percentile = None # Check the inputs for errors... if self.options.telescope_abbreviation not in self.telescope_mapping.keys(): print("Running for custom telescope. Checking required parameters...") if self.options.telescope_abbreviation == "": is_error = True print("For custom telescope, `telescope_abbreviation` is required!") if self.options.telescope_name == "": is_error = True print("For custom telescope, `telescope_name` is required!") if self.options.detector_width_deg <= 0.0: is_error = True print("For custom telescope, `detector_width_deg` is required, and must be > 0!") if self.options.detector_height_deg <= 0.0: is_error = True print("For custom telescope, `detector_height_deg` is required, and must be > 0!") if not is_error: detector = Detector(self.options.telescope_name, self.options.detector_width_deg, self.options.detector_height_deg) else: detector = self.telescope_mapping[self.options.telescope_abbreviation] if self.options.percentile > 0.9: is_error = True print("User-defined percentile must be <= 0.90") elif self.options.percentile > 0.0: is_custom_percentile = True custom_percentile = self.options.percentile if is_error: print("Exiting...") return 1 print("\n\nTelescope: `%s -- %s`, width: %s [deg]; height %s [deg]" % (self.options.telescope_abbreviation, detector.name, detector.deg_width, detector.deg_height)) fov_area = (detector.deg_width * detector.deg_height) print("%s FOV area: %s" % (detector.name, fov_area)) print("Loading base cartography...") base_cartography = None with open('%s/%s_base_cartography.pkl' % (self.options.working_dir, self.options.gw_id), 'rb') as handle: base_cartography = pickle.load(handle) # print("Loading sql pixel map...") # sql_pixel_map = None # with open('%s/%s_sql_pixel_map.pkl' % (self.options.working_dir, self.options.gw_id), 'rb') as handle: # sql_pixel_map = pickle.load(handle) # print("Loading sql cartography...") # sql_tile_cartography = None # with open('%s/%s_sql_cartography.pkl' % (self.options.working_dir, self.options.gw_id), 'rb') as handle: # sql_tile_cartography = pickle.load(handle) # print("Loading galaxy query...") # query = None # with open('%s/%s_query.pkl' % (self.options.working_dir, self.options.gw_id), 'rb') as handle: # query = pickle.load(handle) if not self.options.skip_completeness: print("Loading sql multipolygon...") sql_poly = None with open('%s/%s_sql_poly.pkl' % (self.options.working_dir, self.options.gw_id), 'rb') as handle: sql_poly = pickle.load(handle) # print("Loading contained galaxies...") # contained_galaxies = None # with open('%s/%s_contained_galaxies.pkl' % (self.options.working_dir, self.options.gw_id), 'rb') as handle: # contained_galaxies = pickle.load(handle) # for g in (sorted(contained_galaxies, key=lambda x: x.relative_prob, reverse=True))[:99]: # print(g.relative_prob) print("Loading redistributed cartography...") redistributed_cartography = None with open('%s/%s_redstributed_cartography.pkl' % (self.options.working_dir, self.options.gw_id), 'rb') as handle: redistributed_cartography = pickle.load(handle) # print("Loading observed tiles file...") # observed_tiles = { # "S190728q":{"Thacher":{"ut190728":[]}, # "Swope":{"ut190728":[]} # } # } # running_prob = 0 # unique_pixels = [] # # Thacher # thacher_width = 2048*0.609/3600. #arcseconds -> deg # thacher_height = 2048*0.609/3600. # with open('%s/ut190727_28_Thacher_observed.txt' % self.options.working_dir,'r') as csvfile: # csvreader = csv.reader(csvfile, delimiter=',',skipinitialspace=True) # for row in csvreader: # name = row[0] # t = Tile(coord.SkyCoord(row[1], row[2], unit=(u.hour, u.deg)), thacher_width, thacher_height, redistributed_cartography.unpacked_healpix.nside) # t.field_name = name # t_prob = t.enclosed_pixel_indices # for ti in t_prob: # if ti not in unique_pixels: # unique_pixels.append(ti) # t.net_prob = np.sum(redistributed_cartography.unpacked_healpix.prob[t_prob]) # running_prob += t.net_prob # print("%s - net prob: %s" % (name, t.net_prob)) # observed_tiles["S190728q"]["Thacher"]["ut190728"].append(t) # print("\n") # swope_width = 4096*0.435/3600. #arcseconds -> deg # swope_height = 4112*0.435/3600. # with open('%s/ut190727_28_Swope_observed.txt' % self.options.working_dir,'r') as csvfile: # csvreader = csv.reader(csvfile, delimiter=',',skipinitialspace=True) # for row in csvreader: # name = row[0] # t = Tile(coord.SkyCoord(row[1], row[2], unit=(u.hour, u.deg)), swope_width, swope_height, redistributed_cartography.unpacked_healpix.nside) # t.field_name = name # t_prob = t.enclosed_pixel_indices # for ti in t_prob: # if ti not in unique_pixels: # unique_pixels.append(ti) # t.net_prob = np.sum(redistributed_cartography.unpacked_healpix.prob[t_prob]) # running_prob += t.net_prob # print("%s - net prob: %s" % (name, t.net_prob)) # observed_tiles["S190728q"]["Swope"]["ut190728"].append(t) # tile_set = [ # ("Thacher_0728",observed_tiles["S190728q"]["Thacher"]["ut190728"],('royalblue','None')), # ("Swope_0728",observed_tiles["S190728q"]["Swope"]["ut190728"],('green','None')), # ] # print("Total non-corrected prob captured by observed Thacher+Swope tiles: %s" % running_prob) # print("Total corrected prob captured by observed Thacher+Swope tiles: %s" % np.sum(redistributed_cartography.unpacked_healpix.prob[np.asarray(unique_pixels)])) print("\n\nBuilding MWE...") config["data_dir"] = "./DataIngestion" print("Initializing MWE n128 pix...") f99_r = 2.285 nside128 = 128 nside128_npix = hp.nside2npix(nside128) nside128_pixels = [] nside128_RA = [] nside128_DEC = [] mw_pixels = [] for i in range(nside128_npix): pe = Pixel_Element(i, nside128, 0.0) nside128_pixels.append(pe) theta, phi = hp.pix2ang(pe.nside, pe.index) dec = np.degrees(0.5 * np.pi - theta) ra = np.degrees(phi) nside128_RA.append(ra) nside128_DEC.append(dec) c1 = coord.SkyCoord(nside128_RA, nside128_DEC, unit=(u.deg, u.deg)) sfd = SFDQuery() ebv1 = sfd(c1) for i, e in enumerate(ebv1): if e * f99_r >= 0.5: mw_pixels.append(nside128_pixels[i]) tiles_to_plot = None pixels_to_plot = None sql_poly_to_plot = None if not self.options.skip_completeness: tiles_to_plot = redistributed_cartography.tiles pixels_to_plot = redistributed_cartography.unpacked_healpix.pixels_90 sql_poly_to_plot = sql_poly else: tiles_to_plot = base_cartography.tiles pixels_to_plot = base_cartography.unpacked_healpix.pixels_90 ra_tiles = [] dec_tiles = [] for i, t in enumerate(tiles_to_plot): field_name = "%s%s%sE%s" % (self.options.telescope_abbreviation, str(self.options.event_number).zfill(3), self.options.schedule_designation, str(i + 1).zfill(5)) t.field_name = field_name # ra_tiles.append(t.coord.ra.degree) # dec_tiles.append(t.coord.dec.degree) ra_tiles.append(t.ra_deg) dec_tiles.append(t.dec_deg) c = coord.SkyCoord(ra_tiles, dec_tiles, unit=(u.deg, u.deg)) sfd = SFDQuery() ebv = sfd(c) new_tiles = [] for i, e in enumerate(ebv): t = tiles_to_plot[i] # if e*f99_r < 0.5 and t.coord.dec.degree > -30.0: if e * f99_r < 0.5 and t.dec_deg < 30.0: new_tiles.append(t) # if t.coord.dec.degree > -30.0: # t.mwe = e # new_tiles.append(t) print(len(new_tiles)) prob = 0.0 for t in new_tiles: prob += t.net_prob print("Enclosed prob = %s" % prob) def GetSexigesimalString(c): ra = c.ra.hms dec = c.dec.dms ra_string = "%02d:%02d:%05.2f" % (ra[0], ra[1], ra[2]) if dec[0] >= 0: dec_string = "+%02d:%02d:%05.2f" % (dec[0], np.abs(dec[1]), np.abs(dec[2])) else: dec_string = "%03d:%02d:%05.2f" % (dec[0], np.abs(dec[1]), np.abs(dec[2])) # Python has a -0.0 object. If the deg is this (because object lies < 60 min south), the string formatter will drop the negative sign if c.dec < 0.0 and dec[0] == 0.0: dec_string = "-00:%02d:%05.2f" % (np.abs(dec[1]), np.abs(dec[2])) return (ra_string, dec_string) with open('%s/%s_%s_MWE_below_30_AA.txt' % (self.options.working_dir, self.options.gw_id, detector.name), 'w') as csvfile: csvwriter = csv.writer(csvfile) cols = [] cols.append('# FieldName') cols.append('FieldRA') cols.append('FieldDec') cols.append('Telscope') cols.append('Filter') cols.append('ExpTime') cols.append('Priority') cols.append('Status') # cols.append('A_R') csvwriter.writerow(cols) for i, st in enumerate(new_tiles): # coord_str = GetSexigesimalString(st.coord) c = coord.SkyCoord(st.ra_deg, st.dec_deg, unit=(u.deg, u.deg)) coord_str = GetSexigesimalString(c) cols = [] cols.append(st.field_name) cols.append(coord_str[0]) cols.append(coord_str[1]) cols.append(detector.name) cols.append(self.options.filter) cols.append(self.options.exp_time) cols.append(st.net_prob) cols.append('False') # cols.append(st.mwe) csvwriter.writerow(cols) print("Done") # return 0; # raise("Stop!") # swope_width = 4096*0.435/3600. #arcseconds -> deg # swope_height = 4112*0.435/3600. # thacher_width = 2048*0.609/3600. #arcseconds -> deg # thacher_height = 2048*0.609/3600. # nickel_width = 2048*0.368/3600. #arcseconds -> deg # nickel_height = 2048*0.368/3600. # nickel_width = 2048*0.368/3600. #arcseconds -> deg # nickel_height = 2048*0.368/3600. # andicam_ccd_width = 1024*0.371/3600. #arcseconds -> deg # andicam_ccd_height = 1024*0.371/3600. # swift_uvot_width = 2048*0.502/3600. #arcseconds -> deg # swift_uvot_height = 2048*0.502/3600. # saguaro_width = 2.26 #deg # saguaro_height = 2.26 # observed_tiles = { # "S190425z":{"Swope":{"ut190425":[], "ut190428":[], "ut190429":[]}, # "Thacher":{"ut190425":[]}, # "ANDICAM":{"ut190425":[], "ut190428":[]}, # "Nickel":{"ut190425":[], "ut190429":[]}, # "Swift":{"ut190425":[]}, # "SAGUARO":{"ut190425":[]} # } # } # # Just do S190425z for now... # # SWOPE # with open('../O3_Alerts/GW190408/GW190425_2/S190425z_ut190425_Swope_Tiles_Observed.csv','r') as csvfile: # csvreader = csv.reader(csvfile, delimiter=' ',skipinitialspace=True) # next(csvreader) # for row in csvreader: # t = Tile(coord.SkyCoord(row[1], row[2], unit=(u.hour, u.deg)), swope_width, swope_height, redistributed_cartography.unpacked_healpix.nside) # (observed_tiles["S190425z"]["Swope"]["ut190425"]).append(t) # with open('../O3_Alerts/GW190408/GW190425_2/S190425z_ut190428_Swope_Tiles_Observed.csv','r') as csvfile: # csvreader = csv.reader(csvfile, delimiter=' ',skipinitialspace=True) # next(csvreader) # for row in csvreader: # t = Tile(coord.SkyCoord(row[1], row[2], unit=(u.hour, u.deg)), swope_width, swope_height, redistributed_cartography.unpacked_healpix.nside) # (observed_tiles["S190425z"]["Swope"]["ut190428"]).append(t) # with open('../O3_Alerts/GW190408/GW190425_2/S190425z_ut190429_Swope_Tiles_Observed.csv','r') as csvfile: # csvreader = csv.reader(csvfile, delimiter=' ',skipinitialspace=True) # next(csvreader) # for row in csvreader: # t = Tile(coord.SkyCoord(row[1], row[2], unit=(u.hour, u.deg)), swope_width, swope_height, redistributed_cartography.unpacked_healpix.nside) # (observed_tiles["S190425z"]["Swope"]["ut190429"]).append(t) # # THACHER # with open('../O3_Alerts/GW190408/GW190425_2/S190425z_ut190425_Thacher_Tiles_Observed.csv','r') as csvfile: # csvreader = csv.reader(csvfile, delimiter=' ',skipinitialspace=True) # next(csvreader) # for row in csvreader: # t = Tile(coord.SkyCoord(row[1], row[2], unit=(u.hour, u.deg)), thacher_width, thacher_height, redistributed_cartography.unpacked_healpix.nside) # (observed_tiles["S190425z"]["Thacher"]["ut190425"]).append(t) # # ANDICAM # with open('../O3_Alerts/GW190408/GW190425_2/S190425z_ut190425_ANDICAM_Tiles_Observed.csv','r') as csvfile: # csvreader = csv.reader(csvfile, delimiter=' ',skipinitialspace=True) # next(csvreader) # for row in csvreader: # t = Tile(coord.SkyCoord(row[1], row[2], unit=(u.hour, u.deg)), andicam_ccd_width, andicam_ccd_height, redistributed_cartography.unpacked_healpix.nside) # (observed_tiles["S190425z"]["ANDICAM"]["ut190425"]).append(t) # with open('../O3_Alerts/GW190408/GW190425_2/S190425z_ut190428_ANDICAM_Tiles_Observed.csv','r') as csvfile: # csvreader = csv.reader(csvfile, delimiter=' ',skipinitialspace=True) # next(csvreader) # for row in csvreader: # t = Tile(coord.SkyCoord(row[1], row[2], unit=(u.hour, u.deg)), andicam_ccd_width, andicam_ccd_height, redistributed_cartography.unpacked_healpix.nside) # (observed_tiles["S190425z"]["ANDICAM"]["ut190428"]).append(t) # # NICKEL # with open('../O3_Alerts/GW190408/GW190425_2/S190425z_ut190425_Nickel_Tiles_Observed.csv','r') as csvfile: # csvreader = csv.reader(csvfile, delimiter=' ',skipinitialspace=True) # next(csvreader) # for row in csvreader: # t = Tile(coord.SkyCoord(row[1], row[2], unit=(u.hour, u.deg)), nickel_width, nickel_height, redistributed_cartography.unpacked_healpix.nside) # (observed_tiles["S190425z"]["Nickel"]["ut190425"]).append(t) # with open('../O3_Alerts/GW190408/GW190425_2/S190425z_ut190429_Nickel_Tiles_Observed.csv','r') as csvfile: # csvreader = csv.reader(csvfile, delimiter=' ',skipinitialspace=True) # next(csvreader) # for row in csvreader: # t = Tile(coord.SkyCoord(row[1], row[2], unit=(u.hour, u.deg)), nickel_width, nickel_height, redistributed_cartography.unpacked_healpix.nside) # (observed_tiles["S190425z"]["Nickel"]["ut190429"]).append(t) # # Swift # with open('../O3_Alerts/GW190408/GW190425_2/S190425z_ut190425_Swift_Tiles_Observed.csv','r') as csvfile: # csvreader = csv.reader(csvfile, delimiter=' ',skipinitialspace=True) # next(csvreader) # for row in csvreader: # t = Tile(coord.SkyCoord(row[1], row[2], unit=(u.deg, u.deg)), swift_uvot_width, swift_uvot_height, redistributed_cartography.unpacked_healpix.nside) # (observed_tiles["S190425z"]["Swift"]["ut190425"]).append(t) # for k1,v1 in observed_tiles.items(): # print("%s" % k1) # for k2,v2 in observed_tiles[k1].items(): # print("\t%s" % k2) # for k3,v3 in observed_tiles[k1][k2].items(): # print("\t\t%s - # of tiles: %s" % (k3, len(observed_tiles[k1][k2][k3]))) # print("\n") # tile_set = [ # ("Swope_0425",observed_tiles["S190425z"]["Swope"]["ut190425"],('r','None')), # ("Swope_0428",observed_tiles["S190425z"]["Swope"]["ut190428"],('r','None')), # ("Swope_0429",observed_tiles["S190425z"]["Swope"]["ut190429"],('r','None')), # ("Thacher_0425",observed_tiles["S190425z"]["Thacher"]["ut190425"],('royalblue','None')), # ("ANDICAM_0425",observed_tiles["S190425z"]["ANDICAM"]["ut190425"],('forestgreen','None')), # ("ANDICAM_0428",observed_tiles["S190425z"]["ANDICAM"]["ut190428"],('forestgreen','None')), # ("Nickel_0425",observed_tiles["S190425z"]["Nickel"]["ut190425"],('mediumorchid','None')), # ("Nickel_0429",observed_tiles["S190425z"]["Nickel"]["ut190429"],('mediumorchid','None')), # ("Swift_0425",observed_tiles["S190425z"]["Swift"]["ut190425"],('k','None')) # ] # # In case you want to plot contours... # print("Computing contours for '%s'...\n" % base_cartography.unpacked_healpix.file_name) # base_cartography.unpacked_healpix.compute_contours() # print("Computing contours for '%s'...\n" % redistributed_cartography.unpacked_healpix.file_name) # redistributed_cartography.unpacked_healpix.compute_contours() # # Thacher # thacher_tiles = [] # with open('%s/S190521g_AA_THACHER_Tiles.txt' % self.options.working_dir,'r') as csvfile: # csvreader = csv.reader(csvfile, delimiter=',') # next(csvreader) # for row in csvreader: # t = Tile(coord.SkyCoord(row[1], row[2], unit=(u.hour, u.deg)), detector.deg_width, detector.deg_height, # redistributed_cartography.unpacked_healpix.nside) # t.field_name = row[0] # t.net_prob = np.sum(redistributed_cartography.unpacked_healpix.prob[t.enclosed_pixel_indices]) # print("Tile #: %s; Net prob: %0.4f" % (t.field_name, t.net_prob)) # thacher_tiles.append(t) # above_30 = [] # for t in thacher_tiles: # if t.coord.dec.degree > -30.0: # above_30.append(t) # sorted_tiles = sorted(above_30, key=lambda t: t.net_prob, reverse=True) # print("Number of northern tiles: %s" % len(sorted_tiles)) # top_200 = sorted_tiles[0:199] # top_200_prob = np.sum([t.net_prob for t in top_200]) # print("Prob of northern, top 200: %s" % top_200_prob) # top_200_area = fov_area*200 # print("Area of northern, top 200: %s" % top_200_area) # with open('%s/S190521g_AA_THACHER_Tiles_Northern_200.txt' % self.options.working_dir,'w') as csvfile: # csvwriter = csv.writer(csvfile) # cols = [] # cols.append('# FieldName') # cols.append('FieldRA') # cols.append('FieldDec') # cols.append('Telscope') # cols.append('Filter') # cols.append('ExpTime') # cols.append('Priority') # cols.append('Status') # csvwriter.writerow(cols) # for i, st in enumerate(top_200): # coord_str = GetSexigesimalString(st.coord) # cols = [] # cols.append(st.field_name) # cols.append(coord_str[0]) # cols.append(coord_str[1]) # cols.append(detector.name) # cols.append(self.options.filter) # cols.append(self.options.exp_time) # print(st.net_prob) # cols.append(st.net_prob) # cols.append('False') # csvwriter.writerow(cols) # print("Done") # test = [] # for t in base_cartography.tiles: # test.append(t.polygon) # # print("here") # # print(list(test[0].exterior.coords)) # # print("\n\n") # test2 = unary_union(test) # # print(type(test2)) # eps = 0.00001 # test3 = test2.buffer(eps, 1, join_style=JOIN_STYLE.mitre).buffer(-eps, 1, join_style=JOIN_STYLE.mitre) # plot_probability_map("%s/%s_SQL_Pixels" % (self.options.working_dir, self.options.gw_id), # pixels_filled=base_cartography.unpacked_healpix.pixels_90, # # tiles=base_cartography.tiles, # # pixels_empty=base_cartography.unpacked_healpix.pixels_90, # colormap=plt.cm.viridis, # linear_rings=test3) # pixels_90 = [Pixel_Element(i90, redistributed_cartography.unpacked_healpix.nside, # redistributed_cartography.unpacked_healpix.prob[i90]) # for i90 in redistributed_cartography.unpacked_healpix.indices_of_90] plot_probability_map( "%s/%s_%s_Redistributed_90th_Tiles" % (self.options.working_dir, self.options.gw_id, detector.name), # pixels_filled=redistributed_cartography.unpacked_healpix.pixels_90, pixels_filled=pixels_to_plot, # galaxies=contained_galaxies, galaxies=mw_pixels, tiles=new_tiles, # tiles=redistributed_cartography.tiles, # tiles=base_cartography.tiles, # sql_poly=sql_poly, # sql_poly=sql_poly_to_plot, # linear_rings=sql_poly.polygon, # healpix_obj_for_contours=base_cartography.unpacked_healpix, # tile_set=tile_set )