def get_pos_diff_between_spacecraft(sc1, sc2, date):
    pos1 = get_horizons_coord(sc1, date)
    pos2 = get_horizons_coord(sc2, date)
    print('lon lat r (sc1):', pos1)
    print('lon lat r (sc2):', pos2)
    londiff = abs(pos1.lon.value - pos2.lon.value)
    if londiff > 180.:
        londiff = londiff - 360
    if londiff < -180.:
        londiff = 360 - abs(londiff)

    latdiff = abs(pos1.lat.value - pos2.lat.value)
    rdiff = pos1.radius.value - pos2.radius.value

    diff = np.array([londiff, latdiff, rdiff])

    return diff
Пример #2
0
def eit_correction(eitmap):
    new_coords = get_horizons_coord(eitmap.observatory.replace(' ', '-'),
                                    eitmap.date)
    eitmap.meta['HGLN_OBS'] = new_coords.lon.to('deg').value
    eitmap.meta['HGLT_OBS'] = new_coords.lat.to('deg').value
    eitmap.meta['DSUN_OBS'] = new_coords.radius.to('m').value
    eitmap.meta.pop('hec_x')
    eitmap.meta.pop('hec_y')
    eitmap.meta.pop('hec_z')
    return eitmap
def get_long_sep(sc, date, flare_long, vsw=400):
    '''
    Determines the longitudinal separation angle of a given spacecraft and a given flare longitude
    Parameters
    ----------
    sc : `str`
        The spacecraft for which to calculate positions. 
        'STEREO-A', 'STEREO-B', 'SOHO', 'MPO' (BepiColombo), 'PSP', 'SDO'
    id_type : `str`

    '''
    if sc in ['Earth', 'EARTH']:
        pos = get_horizons_coord(399, date, 'id')
    else:
        pos = get_horizons_coord(sc,
                                 date)  # (lon, lat, radius) in (deg, deg, AU)
    pos = pos.transform_to(frames.HeliographicCarrington)

    lon = pos.lon.value
    dist = pos.radius.value

    omega = math.radians(
        360. / (25.38 * 24 * 60 * 60))  # rot-angle in rad/sec, sidereal period

    tt = dist * AU / vsw
    alpha = math.degrees(omega * tt)

    long_sep = flare_long - (lon + alpha)
    if long_sep > 180.:
        long_sep = long_sep - 360

    if long_sep < -180.:
        long_sep = 360 - abs(long_sep)

    print('spacecraft: {}'.format(sc))
    print('alpha: {:.1f}°'.format(alpha))
    print('lon: {:.1f}°'.format(lon))
    print('v_sw: {:.1f} km/s'.format(vsw))
    print('Longitudinal separation: {:.1f}°'.format(long_sep))
    print()

    return long_sep
Пример #4
0
def download_helioviewer(date, observatory, instrument, detector):
    file = hv.download_jp2(date,
                           observatory=observatory,
                           instrument=instrument,
                           detector=detector)
    f = Map(file)

    if observatory == 'SOHO':
        # add observer location information:
        soho = get_horizons_coord('SOHO', f.date)
        f.meta['HGLN_OBS'] = soho.lon.to('deg').value
        f.meta['HGLT_OBS'] = soho.lat.to('deg').value
        f.meta['DSUN_OBS'] = soho.radius.to('m').value

    return f
Пример #5
0
nx_euvir, ny_euvir = euvir_maps[0].data.shape

for file_nb in range(nb_files):

    # Make map objects for one channel
    eit_maps = sunpy.map.Map(filenames_eit_0[file_nb])
    euvil_maps = sunpy.map.Map(filenames_euvil_0[file_nb])
    euvir_maps = sunpy.map.Map(filenames_euvir_0[file_nb])
    filename_extract = filenames_eit_0[file_nb].split(path_to_files +
                                                      str(list_channels[0]))

    filename_output = output_path + 'composite_' + filename_extract[1]
    print(filename_extract)
    print('here')
    if eit_maps.observatory in ['SOHO']:
        new_coords = get_horizons_coord(eit_maps.observatory.replace(' ', '-'),
                                        eit_maps.date)
        eit_maps.meta['HGLN_OBS'] = new_coords.lon.to('deg').value
        eit_maps.meta['HGLT_OBS'] = new_coords.lat.to('deg').value
        eit_maps.meta['DSUN_OBS'] = new_coords.radius.to('m').value
        eit_maps.meta.pop('hec_x')
        eit_maps.meta.pop('hec_y')
        eit_maps.meta.pop('hec_z')

    # Check positioning of instruments in order to cover full Sun
    long_eit = eit_maps.observer_coordinate.lon.to('degree')
    print(long_eit.value)
    long_euvil = euvil_maps.observer_coordinate.lon.to('degree') - long_eit
    print(long_euvil.value)
    long_euvir = euvir_maps.observer_coordinate.lon.to('degree') - long_eit
    print(long_euvir.value)
    if -90 < long_euvil.value < 90 and -90 < long_euvir.value < 90:
Пример #6
0
def eit_correction(eitmap):    
    if eitmap.observatory in ['SOHO']:
    new_coords = get_horizons_coord(eitmap.observatory.replace(' ', '-'),
                                    eitmap.date)
    eitmap.meta['HGLN_OBS'] = new_coords.lon.to('deg').value
    eitmap.meta['HGLT_OBS'] = new_coords.lat.to('deg').value
    eitmap.meta['DSUN_OBS'] = new_coords.radius.to('m').value
    eitmap.meta.pop('hec_x')
    eitmap.meta.pop('hec_y')
    eitmap.meta.pop('hec_z')
    return eitmap
# Nb. of channels
def satellite_position(map1,map2,map3):
    map1=   
    if map1.observatory in ['SOHO']:
        long_eit =map1.observer_coordinate.lon.to('degree')

    long_eit = eit_maps.observer_coordinate.lon.to('degree')
    print(long_eit.value)
    long_euvil = euvil_maps.observer_coordinate.lon.to('degree')-long_eit
    print(long_euvil.value)
    long_euvir = euvir_maps.observer_coordinate.lon.to('degree')-long_eit
    print(long_euvir.value)
    if -90 < long_euvil.value < 90 and -90 < long_euvir.value < 90:
        position_condition = 0
    elif 90 < long_euvil.value < 180 and long_euvil.value-180 < long_euvir.value < 180:
        position_condition = 0
    elif 90 < long_euvir.value < 180 and long_euvir.value-180 < long_euvil.value < 180:
        position_condition = 0
    elif -180 < long_euvil.value < -90 and -180 < long_euvir.value < long_euvil.value+180:
        position_condition = 0
    elif -180 < long_euvir.value < -90 and -180 < long_euvil.value < long_euvir.value+180:
        position_condition = 0
    else:
        position_condition = 1


nb_channels = 3
list_channels = [171, 195, 304]

# Find sample data
path_to_files = '/home/ajt/Downloads/Hackweek_data/EUV_data/'




filenames_eit_195 = sorted(glob.glob(path_to_files+'EIT_'+'*195*' +'.fits'))
filenames_euvil_195 = sorted(glob.glob(path_to_files+'EIT_'+'*195*' +'.fits'))
filenames_euvir_195 = sorted(glob.glob(path_to_files+'EIT_'+'*195*' +'.fits'))


filenames_eit_171 = sorted(glob.glob(path_to_files+'EIT_'+'*171*' +'.fits'))
filenames_euvil_171 = sorted(glob.glob(path_to_files+'EIT_'+'*171*' +'.fits'))
filenames_euvir_171 = sorted(glob.glob(path_to_files+'EIT_'+'*171*' +'.fits'))


filenames_eit_304 = sorted(glob.glob(path_to_files+'EIT_'+'*304*' +'.fits'))
filenames_euvil_304 = sorted(glob.glob(path_to_files+'EIT_'+'*304*' +'.fits'))
filenames_euvir_304 = sorted(glob.glob(path_to_files+'EIT_'+'*304*' +'.fits'))

# Nb. of samples to work with
nb_files = max(len(filenames_euvil_171), len(filenames_euvir_171),len(filenames_eit_171))

# Hamada class for homogenization
filename = 'cumulative_hist.npz'
hamada_model = hamada_hist_matching.hamada(filename='cumulative_hist.npz')





np.datetime64('2015-07-04 12:59:59.50')



'''

STOP UNCHECKED AFTER THIS LINE

'''
# Output
output_path = '/home/plasmion/'




eit_maps = sunpy.map.Map(filenames_eit)
nx_eit, ny_eit = eit_maps[0].data.shape

euvil_maps = sunpy.map.Map(filenames_euvil)
nx_euvil, ny_euvil = euvil_maps[0].data.shape

euvir_maps = sunpy.map.Map(filenames_euvir)
nx_euvir, ny_euvir = euvir_maps[0].data.shape


for file_nb in range(len(list_channels)):    
    # Make map objects for one channel
    eit_maps_171 = sunpy.map.Map(filenames_eit_171)
    euvil_maps_171= sunpy.map.Map(filenames_euvil_171)
    euvir_maps_171 = sunpy.map.Map(filenames_euvir_171)
    eit_maps_171=eit_correction(eit_maps_171)

    filename_extract = filenames_eit_0[file_nb].split(path_to_files+str(list_channels[0]))
    
    filename_output = output_path + 'composite_' + filename_extract[1]
    print(filename_extract)
    print('here')
    nx_eit_171, ny_eit_171 = eit_maps_171.data.shape
    nx_euvil, ny_euvil = euvil_maps_171.data.shape
    nx_euvir, ny_euvir = euvir_maps_171.data.shape    

    
    # Check positioning of instruments in order to cover full Sun

    

            # Mask everything outside the solar disk
            where_mask = mask_outside_disk(eit_maps)
            eit_maps.data[where_mask] = np.nan
            where_mask = mask_outside_disk(euvil_maps)
            euvil_maps.data[where_mask] = np.nan
            where_mask = mask_outside_disk(euvir_maps)
            euvir_maps.data[where_mask] = np.nan
            maps_list=[eit_maps,euvil_maps,euvir_maps]
            # Wavelet enchancement of the EIT data for improved contrast
            # Missing Step ######################
            # arr_tmp = eit_maps.data
            # eit_maps.data = wavelet_enhancement(arr_tmp)
            # Homogenization of the EIT data /w respect to EUVI
            outmap = combine_maps(maps_list)
            outmap.plot_settings = maps_list[0].plot_settings
            outmap.nickname = 'EIT + EUVI/A + EUVI/B'
        
            # Output
            outmap.save(filename_output, filetype='fits', overwrite=True)
Пример #7
0
fig = plt.figure(figsize=(5, 6))
ax = fig.add_subplot(111, projection=aia_submap)
aia_submap.plot()
aia_submap.draw_limb()
aia_submap.draw_grid()
fig.tight_layout()
plt.show()

# ## More coordinates

# In[6]:

from sunpy.coordinates import get_horizons_coord

sdo_pos = get_horizons_coord('SDO', aia_map.date)
venus_pos = get_horizons_coord('Venus barycenter', aia_map.date)

helio_plot(sdo_pos, venus_pos)

# In[7]:

from sunpy.coordinates import frames

#Create an observer looking to the (-900,0) of the sun
spice_pointing = {'x': -900 * u.arcsec, 'y': 0 * u.arcsec}
spice_FOV = {'width': 8 * u.arcmin, 'height': 11 * u.arcmin}  # (480 slits)
spice_corners = get_corners(spice_pointing, spice_FOV)

spice_obs = SkyCoord(spice_corners,
                     observer=venus_pos,
Пример #8
0
    def __init__(self,
                 date,
                 body_list,
                 vsw_list=[],
                 reference_long=None,
                 reference_lat=None):
        body_list = list(dict.fromkeys(body_list))
        bodies = deepcopy(body_dict)

        self.date = date
        self.reference_long = reference_long
        self.reference_lat = reference_lat

        pos_E = get_horizons_coord(
            399, self.date, 'id')  # (lon, lat, radius) in (deg, deg, AU)
        self.pos_E = pos_E.transform_to(
            frames.HeliographicCarrington(observer='Sun'))

        if len(vsw_list) == 0:
            vsw_list = np.zeros(len(body_list)) + 400

        random_cols = [
            'forestgreen', 'mediumblue', 'm', 'saddlebrown', 'tomato', 'olive',
            'steelblue', 'darkmagenta', 'c', 'darkslategray', 'yellow',
            'darkolivegreen'
        ]
        body_lon_list = []
        body_lat_list = []
        body_dist_list = []
        longsep_E_list = []
        latsep_E_list = []
        body_vsw_list = []
        footp_long_list = []
        longsep_list = []
        latsep_list = []
        footp_longsep_list = []

        for i, body in enumerate(body_list.copy()):
            if body in bodies:
                body_id = bodies[body][0]
                body_lab = bodies[body][1]
                body_color = bodies[body][2]

            else:
                body_id = body
                body_lab = str(body)
                body_color = random_cols[i]
                bodies.update(
                    dict.fromkeys([body_id], [body_id, body_lab, body_color]))

            try:
                pos = get_horizons_coord(
                    body_id, date,
                    'id')  # (lon, lat, radius) in (deg, deg, AU)
                pos = pos.transform_to(
                    frames.HeliographicCarrington(observer='Sun'))
                bodies[body_id].append(pos)
                bodies[body_id].append(vsw_list[i])

                longsep_E = pos.lon.value - self.pos_E.lon.value
                if longsep_E > 180:
                    longsep_E = longsep_E - 360.
                latsep_E = pos.lat.value - self.pos_E.lat.value

                body_lon_list.append(pos.lon.value)
                body_lat_list.append(pos.lat.value)
                body_dist_list.append(pos.radius.value)
                longsep_E_list.append(longsep_E)
                latsep_E_list.append(latsep_E)

                body_vsw_list.append(vsw_list[i])

                sep, alpha = self.backmapping(pos,
                                              date,
                                              reference_long,
                                              vsw=vsw_list[i])
                bodies[body_id].append(sep)

                body_footp_long = pos.lon.value + alpha
                if body_footp_long > 360:
                    body_footp_long = body_footp_long - 360
                footp_long_list.append(body_footp_long)

                if self.reference_long is not None:
                    bodies[body_id].append(sep)
                    long_sep = pos.lon.value - self.reference_long
                    if long_sep > 180:
                        long_sep = long_sep - 360.

                    longsep_list.append(long_sep)
                    footp_longsep_list.append(sep)

                if self.reference_lat is not None:
                    lat_sep = pos.lat.value - self.reference_lat
                    latsep_list.append(lat_sep)
            except ValueError:
                print('')
                print('!!! No ephemeris for target "' + str(body) +
                      '" for date ' + self.date)
                body_list.remove(body)

        body_dict_short = {sel_key: bodies[sel_key] for sel_key in body_list}
        self.body_dict = body_dict_short
        self.max_dist = np.max(body_dist_list)
        self.coord_table = pd.DataFrame({
            'Spacecraft/Body':
            list(self.body_dict.keys()),
            'Carrington Longitude (°)':
            body_lon_list,
            'Latitude (°)':
            body_lat_list,
            'Heliocentric Distance (AU)':
            body_dist_list,
            "Longitudinal separation to Earth's longitude":
            longsep_E_list,
            "Latitudinal separation to Earth's latitude":
            latsep_E_list,
            'Vsw':
            body_vsw_list,
            'Magnetic footpoint longitude (Carrington)':
            footp_long_list
        })

        if self.reference_long is not None:
            self.coord_table[
                'Longitudinal separation between body and reference_long'] = longsep_list
            self.coord_table[
                "Longitudinal separation between body's mangetic footpoint and reference_long"] = footp_longsep_list
        if self.reference_lat is not None:
            self.coord_table[
                'Latitudinal separation between body and reference_lat'] = latsep_list

        pass
        self.coord_table.style.set_properties(**{'text-align': 'left'})
def make_the_plot(date, sc_list, vsw_list, flare_long):
    fig, ax = plt.subplots(subplot_kw=dict(projection='polar'), figsize=(8, 8))
    r = np.arange(0.007, 1.3, 0.001)
    if len(vsw_list) == 0:
        vsw_list = np.zeros(len(sc_list)) + 400

    color_dic = {
        'STEREO-A': 'red',
        'STEREO-B': 'blue',
        'Earth': 'green',
        'MPO': 'orange',
        'PSP': 'purple',
        'SolarOrbiter': 'dodgerblue'
    }
    for i, sc in enumerate(sc_list):
        sc_color = color_dic[sc]
        sep = get_long_sep(sc, date, flare_long, vsw=vsw_list[i])

        if sc in ['Earth', 'EARTH']:
            pos = get_horizons_coord(399, date, 'id')
        else:
            pos = get_horizons_coord(
                sc, date)  # (lon, lat, radius) in (deg, deg, AU)
        pos = pos.transform_to(frames.HeliographicCarrington)

        dist_a = pos.radius.value
        sc_long = pos.lon.value

        v_A = vsw_list[i]

        pos_E = get_horizons_coord(
            399, date, 'id')  # (lon, lat, radius) in (deg, deg, AU)
        pos_E = pos_E.transform_to(frames.HeliographicCarrington)

        E_long = pos_E.lon.value
        dist_e = pos_E.radius.value

        omega = np.radians(
            360. /
            (25.38 * 24 * 60 * 60))  # rot-angle in rad/sec, sidereal period

        tt = dist_a * AU / vsw_list[i]
        alpha = np.degrees(omega * tt)

        sc_long_shifted = sc_long - E_long
        if sc_long_shifted < 0.:
            sc_long_shifted = sc_long_shifted + 360.

        delta_flare = flare_long - E_long
        if delta_flare < 0.:
            delta_flare = delta_flare + 360.

        A_west_spiral = np.radians(sc_long_shifted)

        alpha_f = np.deg2rad(delta_flare) + omega / (v_A / AU) * (
            dist_e / AU - r) - (omega / (v_A / AU) * (dist_e / AU))

        alpha_A = np.deg2rad(sc_long_shifted) + omega / (v_A / AU) * (dist_a -
                                                                      r)
        ax.plot(alpha_A, r, color=sc_color)
        ax.plot(np.deg2rad(sc_long_shifted),
                dist_a,
                's',
                color=sc_color,
                label=sc)

    ax.plot(alpha_f, r, '--k')
    arr1 = plt.arrow(alpha_f[0],
                     0.01,
                     0,
                     1.1,
                     head_width=0.12,
                     head_length=0.11,
                     edgecolor='black',
                     facecolor='black',
                     lw=2,
                     zorder=5,
                     overhang=0.2)

    plt.subplots_adjust(left=0.2, bottom=0.1, right=0.8,
                        top=0.8)  # , wspace=None, hspace=None)
    ax.legend(loc=1, bbox_to_anchor=(1.3, 1.3))
    ax.set_rlabel_position(120)
    ax.set_theta_zero_location("S")
    ax.set_rmax(1.3)
    ax.set_rmin(0.01)
    ax.set_title(date + '\n')
    plt.show()