Ejemplo n.º 1
0
    time_min=range_min_date.astype(datetime.datetime),
    time_max=range_max_date.astype(datetime.datetime), map_freq=image_freq)

# query histograms
ref_hist_pd = db_funcs.query_hist(db_session=db_session, meth_id=method_id[1],
                                  n_intensity_bins=n_intensity_bins, lat_band=lat_band,
                                  time_min=calc_query_time_min - datetime.timedelta(days=number_of_days),
                                  time_max=calc_query_time_max + datetime.timedelta(days=number_of_days),
                                  instrument=ref_instrument, wavelength=wavelengths)
# keep only one observation-histogram per image_center window
keep_ind = lbcc.cadence_choose(ref_hist_pd.date_obs, image_centers, image_del)
ref_hist_pd = ref_hist_pd.iloc[keep_ind]

# convert binary to histogram data
mu_bin_edges, intensity_bin_edges, ref_full_hist = psi_d_types.binary_to_hist(hist_binary=ref_hist_pd,
                                                                              n_mu_bins=None,
                                                                              n_intensity_bins=n_intensity_bins)

# determine date of first AIA image
min_ref_time = db_session.query(func.min(db_class.EUV_Images.date_obs)).filter(
    db_class.EUV_Images.instrument == ref_inst
).all()
base_ref_min    = min_ref_time[0][0]
base_ref_center = base_ref_min + datetime.timedelta(days=number_of_days)/2
base_ref_max    = base_ref_center + datetime.timedelta(days=number_of_days)/2
if (calc_query_time_min - datetime.timedelta(days=7)) < base_ref_center:
    # generate histogram for first year of reference instrument
    ref_base_hist = ref_full_hist[:, (ref_hist_pd['date_obs'] >= str(base_ref_min)) & (
            ref_hist_pd['date_obs'] <= str(base_ref_max))]
else:
    ref_base_hist = None
Ejemplo n.º 2
0
                                   meth_name,
                                   meth_desc=None,
                                   var_names=None,
                                   var_descs=None,
                                   create=False)

# query for IIT histograms
pd_lbc_hist = db_funcs.query_hist(db_session=db_session,
                                  meth_id=method_id[1],
                                  n_intensity_bins=n_intensity_bins,
                                  lat_band=lat_band,
                                  time_min=hist_query_time_min,
                                  time_max=hist_query_time_max)
pd_lbc_hist_srt = pd_lbc_hist.sort_values(by=['image_id'])
# convert the binary types back to arrays
mu_bin_edges, intensity_bin_edges, full_lbc_hist = psi_d_types.binary_to_hist(
    pd_lbc_hist_srt, n_mu_bins=None, n_intensity_bins=n_intensity_bins)
# create corrected/original histograms
original_hist_list = np.full(full_lbc_hist.shape, 0, dtype=np.int64)
corrected_hist_list = np.full(full_lbc_hist.shape, 0, dtype=np.int64)
for inst_index, instrument in enumerate(inst_list):
    print("Applying corrections for", instrument)
    #### QUERY IMAGES ####
    query_instrument = [
        instrument,
    ]
    rot_images = db_funcs.query_euv_images_rot(db_session,
                                               rot_min=rot_min,
                                               rot_max=rot_max,
                                               instrument=query_instrument)
    image_pd = rot_images.sort_values(by=['cr_rot'])
    # get time minimum and maximum for instrument
                             n_intensity_bins=n_intensity_bins, lat_band=lat_band,
                             time_min=np.datetime64(range_min_date).astype(datetime.datetime),
                             time_max=np.datetime64(range_max_date).astype(datetime.datetime),
                             instrument=query_instrument, wavelength=wavelengths)

    # check if instrument has any histograms for this timerange
    if pd_hist_all.shape[0] == 0:
        print("No histograms for", instrument, "in this time range. Skipping")
        continue

    # keep only one observation-histogram per image_center window
    keep_ind = lbcc.cadence_choose(pd_hist.date_obs, image_centers, image_del)
    pd_hist = pd_hist.iloc[keep_ind]

    # convert the binary types back to arrays
    mu_bin_array, intensity_bin_array, full_hist = psi_d_types.binary_to_hist(pd_hist, n_mu_bins,
                                                                              n_intensity_bins)

    for date_index, center_date in enumerate(moving_avg_centers):
        print("Begin date " + str(center_date))

        if center_date > pd_hist.date_obs.max() or center_date < pd_hist.date_obs.min():
            print("Date is out of instrument range, skipping.")
            continue

        # determine time range based off moving average centers
        min_date = center_date - moving_width/2
        max_date = center_date + moving_width/2

        # create list of observed dates in time frame
        date_obs_npDT64 = pd_hist['date_obs']
Ejemplo n.º 4
0
iit_hist = psi_d_types.create_iit_hist(lbcc_image, method_id[1], lat_band,
                                       hist)

# Now query database for histogram to compare
db_hist = db_funcs.query_hist(
    db_session,
    iit_hist.meth_id,
    n_mu_bins=iit_hist.n_mu_bins,
    n_intensity_bins=iit_hist.n_intensity_bins,
    lat_band=lat_band,
    time_min=row.date_obs.to_pydatetime(),
    time_max=row.date_obs.to_pydatetime(),
)

# convert binary to histogram data
mu_bin_edges_db, intensity_bin_edges_db, db_full_hist = psi_d_types.binary_to_hist(
    hist_binary=db_hist, n_mu_bins=None, n_intensity_bins=n_intensity_bins)

# plot newly calc'd IIT-hist vs DB-IIT-hist
plt.plot(intensity_bin_edges_db[1:], db_full_hist, 'r', label="From DB")
plt.plot(intensity_bin_edges_db[1:], hist, 'b', label="New Calc")
ax = plt.gca()
ax.legend(loc='upper right', title="")

# Now test database histogram write/read functionality
iit_hist.date_obs = datetime.datetime(1985, 1, 1, 0, 0, 0, 0)

# delete any previous test histograms
# db_session.query(db_class.Histogram).filter(db_class.Histogram.meth_id == iit_hist.meth_id,
#                                             db_class.Histogram.date_obs < datetime.datetime(1990, 1, 1, 0, 0, 0, 0)
#                                             ).delete()
# create bogus image record
Ejemplo n.º 5
0
n_mu_bins = 18  # number of mu bins
n_intensity_bins = 200  # number of intensity bins
lat_band = [-np.pi / 64., np.pi / 64.]
query_instrument = [
    "AIA",
]

sqlite_hists = db_funcs.query_hist(sqlite_session,
                                   meth_id=method_id[1],
                                   n_mu_bins=n_mu_bins,
                                   n_intensity_bins=n_intensity_bins,
                                   lat_band=lat_band,
                                   time_min=query_time_min,
                                   time_max=query_time_max,
                                   instrument=query_instrument)
mu_bin_array, intensity_bin_array, sq_full_hist = psi_dtypes.binary_to_hist(
    sqlite_hists, n_mu_bins, n_intensity_bins)

mysql_hists = db_funcs.query_hist(mysql_session,
                                  meth_id=method_id[1],
                                  n_mu_bins=n_mu_bins,
                                  n_intensity_bins=n_intensity_bins,
                                  lat_band=lat_band,
                                  time_min=query_time_min,
                                  time_max=query_time_max,
                                  instrument=query_instrument)
mu_bin_array, intensity_bin_array, my_full_hist = psi_dtypes.binary_to_hist(
    mysql_hists, n_mu_bins, n_intensity_bins)

# verify that the two databases return identical histograms
np.all((my_full_hist - sq_full_hist) == 0.)
Ejemplo n.º 6
0
def plot_iit_histograms(db_session,
                        hdf_data_dir,
                        hist_query_time_min,
                        hist_query_time_max,
                        inst_list,
                        ref_inst,
                        n_intensity_bins=200,
                        lat_band=[-np.pi / 2.4, np.pi / 2.4],
                        R0=1.01,
                        log10=True):
    # start time
    start_time = time.time()

    #### GET REFERENCE INFO FOR LATER USE ####
    # get index number of reference instrument
    ref_index = inst_list.index(ref_inst)
    # query euv images to get carrington rotation range
    ref_instrument = [
        ref_inst,
    ]
    euv_images = db_funcs.query_euv_images(db_session,
                                           time_min=hist_query_time_min,
                                           time_max=hist_query_time_max,
                                           instrument=ref_instrument)
    # get min and max carrington rotation
    rot_max = euv_images.cr_rot.max()
    rot_min = euv_images.cr_rot.min()

    # method information
    meth_name = "IIT"
    method_id = db_funcs.get_method_id(db_session,
                                       meth_name,
                                       meth_desc=None,
                                       var_names=None,
                                       var_descs=None,
                                       create=False)

    # query for IIT histograms
    pd_lbc_hist = db_funcs.query_hist(db_session=db_session,
                                      meth_id=method_id[1],
                                      n_intensity_bins=n_intensity_bins,
                                      lat_band=lat_band,
                                      time_min=hist_query_time_min,
                                      time_max=hist_query_time_max)
    pd_lbc_hist_srt = pd_lbc_hist.sort_values(by=['image_id'])
    # convert the binary types back to arrays
    mu_bin_edges, intensity_bin_edges, full_lbc_hist = psi_d_types.binary_to_hist(
        pd_lbc_hist_srt, n_mu_bins=None, n_intensity_bins=n_intensity_bins)
    # create corrected/original histograms
    original_hist_list = np.full(full_lbc_hist.shape, 0, dtype=np.int64)
    corrected_hist_list = np.full(full_lbc_hist.shape, 0, dtype=np.int64)
    for inst_index, instrument in enumerate(inst_list):
        print("Applying corrections for", instrument)
        #### QUERY IMAGES ####
        query_instrument = [
            instrument,
        ]
        rot_images = db_funcs.query_euv_images_rot(db_session,
                                                   rot_min=rot_min,
                                                   rot_max=rot_max,
                                                   instrument=query_instrument)
        image_pd = rot_images.sort_values(by=['cr_rot'])
        # get time minimum and maximum for instrument
        inst_time_min = rot_images.date_obs.min()
        inst_time_max = rot_images.date_obs.max()
        # query correct image combos
        lbc_meth_name = "LBCC"
        combo_query_lbc = db_funcs.query_inst_combo(db_session, inst_time_min,
                                                    inst_time_max,
                                                    lbc_meth_name, instrument)
        iit_meth_name = "IIT"
        combo_query_iit = db_funcs.query_inst_combo(db_session, inst_time_min,
                                                    inst_time_max,
                                                    iit_meth_name, instrument)
        # query correct image combos
        combo_query_lbc = db_funcs.query_inst_combo(db_session,
                                                    hist_query_time_min,
                                                    hist_query_time_max,
                                                    meth_name="LBCC",
                                                    instrument=instrument)
        # query correct image combos
        combo_query_iit = db_funcs.query_inst_combo(db_session,
                                                    hist_query_time_min,
                                                    hist_query_time_max,
                                                    meth_name="IIT",
                                                    instrument=instrument)
        for index, row in image_pd.iterrows():
            # apply LBC
            original_los, lbcc_image, mu_indices, use_indices, theoretic_query = lbcc_funcs.apply_lbc(
                db_session,
                hdf_data_dir,
                combo_query_lbc,
                image_row=row,
                n_intensity_bins=n_intensity_bins,
                R0=R0)

            #### ORIGINAL LOS DATA ####
            # calculate IIT histogram from original data
            original_los_hist = psi_d_types.LosImage.iit_hist(
                original_los, intensity_bin_edges, lat_band, log10)
            # add 1D histogram to array
            original_hist_list[:, index] = original_los_hist

            #### CORRECTED DATA ####
            # apply IIT correction
            lbcc_image, iit_image, use_indices, alpha, x = iit_funcs.apply_iit(
                db_session,
                combo_query_iit,
                lbcc_image,
                use_indices,
                original_los,
                R0=R0)

            #### CREATE CORRECTED IIT HISTOGRAM #####
            # calculate IIT histogram from LBC
            hist_iit = psi_d_types.IITImage.iit_hist(iit_image, lat_band,
                                                     log10)
            # create IIT histogram datatype
            corrected_hist = psi_d_types.create_iit_hist(
                iit_image, method_id[1], lat_band, hist_iit)
            corrected_hist_list[:, index] = corrected_hist.hist

    # plotting definitions
    color_list = ['red', 'blue', 'black']
    linestyle_list = ['solid', 'dashed', 'dashdot']

    #### CREATE NEW HISTOGRAM ####
    for inst_index, instrument in enumerate(inst_list):
        print("Plotting Histograms for", instrument)
        #### GET INDICES TO USE ####
        # get index of instrument in histogram dataframe
        hist_inst = pd_lbc_hist_srt['instrument']
        pd_inst_index = hist_inst[hist_inst == instrument].index

        #### ORIGINAL HISTOGRAM #####
        # define histogram
        original_hist = original_hist_list[:, pd_inst_index].sum(axis=1)
        # normalize histogram
        row_sums = original_hist.sum(axis=0, keepdims=True)
        norm_original_hist = original_hist / row_sums

        # plot original
        Plotting.Plot1d_Hist(norm_original_hist,
                             instrument,
                             inst_index,
                             intensity_bin_edges,
                             color_list,
                             linestyle_list,
                             figure=100,
                             xlabel="Intensity (log10)",
                             ylabel="H(I)",
                             title="Histogram: Original LOS Data")

        #### LBCC HISTOGRAM #####
        # define histogram
        lbc_hist = full_lbc_hist[:, pd_inst_index].sum(axis=1)
        # normalize histogram
        lbc_sums = lbc_hist.sum(axis=0, keepdims=True)
        norm_lbc_hist = lbc_hist / lbc_sums

        # plot lbcc
        Plotting.Plot1d_Hist(norm_lbc_hist,
                             instrument,
                             inst_index,
                             intensity_bin_edges,
                             color_list,
                             linestyle_list,
                             figure=200,
                             xlabel="Intensity (log10)",
                             ylabel="H(I)",
                             title="Histogram: Post LBCC")

        #### CORRECTED HISTOGRAM ####
        # define histogram
        corrected_hist = corrected_hist_list[:, pd_inst_index].sum(axis=1)
        # normalize histogram
        iit_sums = corrected_hist.sum(axis=0, keepdims=True)
        norm_corrected_hist = corrected_hist / iit_sums

        # plot corrected
        Plotting.Plot1d_Hist(norm_corrected_hist,
                             instrument,
                             inst_index,
                             intensity_bin_edges,
                             color_list,
                             linestyle_list,
                             figure=300,
                             xlabel="Intensity (log10)",
                             ylabel="H(I)",
                             title="Histogram: Post IIT")

    # end time
    end_time = time.time()
    print("ITT has been applied and original/resulting histograms plotted.")
    print("Total elapsed time to apply correction and plot histograms: " +
          str(round(end_time - start_time, 3)) + " seconds.")

    return None
Ejemplo n.º 7
0
def calc_iit_coefficients(db_session,
                          inst_list,
                          ref_inst,
                          calc_query_time_min,
                          calc_query_time_max,
                          weekday=0,
                          number_of_days=180,
                          image_freq=2,
                          image_del=np.timedelta64(30, 'm'),
                          n_intensity_bins=200,
                          lat_band=[-np.pi / 2.4, np.pi / 2.4],
                          create=False,
                          wavelengths=None):
    # start time
    start_time = time.time()

    # create IIT method
    meth_name = "IIT"
    meth_desc = "IIT Fit Method"
    method_id = db_funcs.get_method_id(db_session,
                                       meth_name,
                                       meth_desc,
                                       var_names=None,
                                       var_descs=None,
                                       create=False)

    #### GET REFERENCE INFO FOR LATER USE ####
    # get index number of reference instrument
    ref_index = inst_list.index(ref_inst)
    # query euv images to get carrington rotation range
    ref_instrument = [
        ref_inst,
    ]
    euv_images = db_funcs.query_euv_images(db_session,
                                           time_min=calc_query_time_min,
                                           time_max=calc_query_time_max,
                                           instrument=ref_instrument,
                                           wavelength=wavelengths)
    # get min and max carrington rotation
    rot_max = euv_images.cr_rot.max()
    rot_min = euv_images.cr_rot.min()

    # calculate the moving average centers
    ref_moving_avg_centers, moving_width = lbcc.moving_averages(
        calc_query_time_min, calc_query_time_max, weekday, number_of_days)
    # calculate image cadence centers
    range_min_date = ref_moving_avg_centers[0] - moving_width / 2
    range_max_date = ref_moving_avg_centers[-1] + moving_width / 2
    image_centers = synch_utils.get_dates(
        time_min=range_min_date.astype(datetime.datetime),
        time_max=range_max_date.astype(datetime.datetime),
        map_freq=image_freq)

    # query histograms
    ref_hist_pd = db_funcs.query_hist(
        db_session=db_session,
        meth_id=method_id[1],
        n_intensity_bins=n_intensity_bins,
        lat_band=lat_band,
        time_min=calc_query_time_min - datetime.timedelta(days=number_of_days),
        time_max=calc_query_time_max + datetime.timedelta(days=number_of_days),
        instrument=ref_instrument,
        wavelength=wavelengths)
    # keep only one observation-histogram per image_center window
    keep_ind = lbcc.cadence_choose(ref_hist_pd.date_obs, image_centers,
                                   image_del)
    ref_hist_pd = ref_hist_pd.iloc[keep_ind]

    # convert binary to histogram data
    mu_bin_edges, intensity_bin_edges, ref_full_hist = psi_d_types.binary_to_hist(
        hist_binary=ref_hist_pd,
        n_mu_bins=None,
        n_intensity_bins=n_intensity_bins)

    # determine date of first AIA image
    min_ref_time = db_session.query(func.min(
        db_class.EUV_Images.date_obs)).filter(
            db_class.EUV_Images.instrument == ref_inst).all()
    base_ref_min = min_ref_time[0][0]
    base_ref_center = base_ref_min + datetime.timedelta(
        days=number_of_days) / 2
    base_ref_max = base_ref_center + datetime.timedelta(
        days=number_of_days) / 2
    if (calc_query_time_min - datetime.timedelta(days=7)) < base_ref_center:
        # generate histogram for first year of reference instrument
        ref_base_hist = ref_full_hist[:, (
            ref_hist_pd['date_obs'] >= str(base_ref_min)) & (
                ref_hist_pd['date_obs'] <= str(base_ref_max))]
    else:
        ref_base_hist = None

    for inst_index, instrument in enumerate(inst_list):
        # check if this is the reference instrument
        if inst_index == ref_index:
            # loop through moving average centers
            for date_index, center_date in enumerate(ref_moving_avg_centers):
                print("Starting calculations for", instrument, ":",
                      center_date)

                if center_date > ref_hist_pd.date_obs.max(
                ) or center_date < ref_hist_pd.date_obs.min():
                    print("Date is out of instrument range, skipping.")
                    continue

                # determine time range based off moving average centers
                min_date = center_date - moving_width / 2
                max_date = center_date + moving_width / 2
                # get the correct date range to use for image combos
                ref_pd_use = ref_hist_pd[
                    (ref_hist_pd['date_obs'] >= str(min_date))
                    & (ref_hist_pd['date_obs'] <= str(max_date))]

                # save alpha/x as [1, 0] for reference instrument
                alpha = 1
                x = 0
                db_funcs.store_iit_values(db_session, ref_pd_use, meth_name,
                                          meth_desc, [alpha, x], create)
        else:
            # query euv_images for correct carrington rotation
            query_instrument = [
                instrument,
            ]

            rot_images = db_funcs.query_euv_images_rot(
                db_session,
                rot_min=rot_min,
                rot_max=rot_max,
                instrument=query_instrument,
                wavelength=wavelengths)
            if rot_images.shape[0] == 0:
                print("No images in timeframe for ", instrument, ". Skipping")
                continue
            # get time minimum and maximum for instrument
            inst_time_min = rot_images.date_obs.min()
            inst_time_max = rot_images.date_obs.max()
            # if Stereo A or B has images before AIA, calc IIT for those weeks
            if inst_time_min > calc_query_time_min:
                all_images = db_funcs.query_euv_images(
                    db_session,
                    time_min=calc_query_time_min,
                    time_max=calc_query_time_max,
                    instrument=query_instrument,
                    wavelength=wavelengths)
                if all_images.date_obs.min() < inst_time_min:
                    inst_time_min = all_images.date_obs.min()

            moving_avg_centers, moving_width = lbcc.moving_averages(
                inst_time_min, inst_time_max, weekday, number_of_days)
            # calculate image cadence centers
            range_min_date = moving_avg_centers[0] - moving_width / 2
            range_max_date = moving_avg_centers[-1] + moving_width / 2
            image_centers = synch_utils.get_dates(
                time_min=range_min_date.astype(datetime.datetime),
                time_max=range_max_date.astype(datetime.datetime),
                map_freq=image_freq)

            inst_hist_pd = db_funcs.query_hist(
                db_session=db_session,
                meth_id=method_id[1],
                n_intensity_bins=n_intensity_bins,
                lat_band=lat_band,
                time_min=inst_time_min -
                datetime.timedelta(days=number_of_days),
                time_max=inst_time_max +
                datetime.timedelta(days=number_of_days),
                instrument=query_instrument,
                wavelength=wavelengths)
            # keep only one observation-histogram per image_center window
            keep_ind = lbcc.cadence_choose(inst_hist_pd.date_obs,
                                           image_centers, image_del)
            inst_hist_pd = inst_hist_pd.iloc[keep_ind]

            # convert binary to histogram data
            mu_bin_edges, intensity_bin_edges, inst_full_hist = psi_d_types.binary_to_hist(
                hist_binary=inst_hist_pd,
                n_mu_bins=None,
                n_intensity_bins=n_intensity_bins)
            # loops through moving average centers
            for date_index, center_date in enumerate(moving_avg_centers):
                print("Starting calculations for", instrument, ":",
                      center_date)

                if center_date > inst_hist_pd.date_obs.max(
                ) or center_date < inst_hist_pd.date_obs.min():
                    print("Date is out of instrument range, skipping.")
                    continue

                # determine time range based off moving average centers
                min_date = center_date - moving_width / 2
                max_date = center_date + moving_width / 2
                # get proper time-range of reference histograms
                if center_date <= base_ref_center:
                    # if date is earlier than reference (AIA) first year, use reference (AIA) first year
                    ref_hist_use = ref_base_hist
                else:
                    # get indices for calculation of reference histogram
                    ref_hist_ind = (ref_hist_pd['date_obs'] >= str(
                        min_date)) & (ref_hist_pd['date_obs'] <= str(max_date))
                    ref_hist_use = ref_full_hist[:, ref_hist_ind]

                # get the correct date range to use for the instrument histogram
                inst_hist_ind = (inst_hist_pd['date_obs'] >= str(min_date)) & (
                    inst_hist_pd['date_obs'] <= str(max_date))
                inst_pd_use = inst_hist_pd[inst_hist_ind]
                # get indices and histogram for calculation
                inst_hist_use = inst_full_hist[:, inst_hist_ind]

                # sum histograms
                hist_fit = inst_hist_use.sum(axis=1)
                hist_ref = ref_hist_use.sum(axis=1)

                # normalize fit histogram
                fit_sum = hist_fit.sum()
                norm_hist_fit = hist_fit / fit_sum

                # normalize reference histogram
                ref_sum = hist_ref.sum()
                norm_hist_ref = hist_ref / ref_sum

                # get reference/fit peaks
                ref_peak_index = np.argmax(
                    norm_hist_ref)  # index of max value of hist_ref
                ref_peak_val = norm_hist_ref[
                    ref_peak_index]  # max value of hist_ref
                fit_peak_index = np.argmax(
                    norm_hist_fit)  # index of max value of hist_fit
                fit_peak_val = norm_hist_fit[
                    fit_peak_index]  # max value of hist_fit
                # estimate correction coefficients that match fit_peak to ref_peak
                alpha_est = fit_peak_val / ref_peak_val
                x_est = intensity_bin_edges[
                    ref_peak_index] - alpha_est * intensity_bin_edges[
                        fit_peak_index]
                init_pars = np.asarray([alpha_est, x_est], dtype=np.float64)

                # calculate alpha and x
                alpha_x_parameters = iit.optim_iit_linear(norm_hist_ref,
                                                          norm_hist_fit,
                                                          intensity_bin_edges,
                                                          init_pars=init_pars)
                # save alpha and x to database
                db_funcs.store_iit_values(db_session, inst_pd_use, meth_name,
                                          meth_desc, alpha_x_parameters.x,
                                          create)

    end_time = time.time()
    tot_time = end_time - start_time
    time_tot = str(datetime.timedelta(minutes=tot_time))

    print(
        "Inter-instrument transformation fit parameters have been calculated and saved to the database."
    )
    print("Total elapsed time for IIT fit parameter calculation: " + time_tot)

    return None