Example #1
0
Kw_492 = Kw_490 + ((492 - 490) * ((Kw_490 - Kw_495) / (490 - 495)))

Rrs = data_obj.Rrs                  ##  Reflectância SR superfície

##  Separação dos comprimentos de onda de referência para os cálculos em um
##  dicionário de parâmetros
wvl_ref = {
            'referencia': list(range(400, 751, 1)), ##  Bandas PAR
            'lb0': lb0                              ##  Banda inicial (lambda zero)
            }

##  Variáveis para chamada nos cálculos    
wl = pd.Series(wvl_ref['referencia'])

##  Variáveis de reflectâncias de SR para chamada nos cálculos
r_ref = filter_wvl(rrs, wvl_ref)
R_ref = filter_wvl(Rrs, wvl_ref)

###############################################################################
###############################  OPERACOES  ###################################
###############################################################################
##  Importando pacotes para realização do teste - Empirical Models
from qaapy_kdpy.empirical_calc import *
from qaapy_kdpy.utils.plot_Kd_campo_vs_qaa import plot_ajuste
from scipy.optimize import curve_fit

##  Razão de três bandas Rrs para cálculo de a(lb0)
Rrs_ratio = calc_aRrs_ratio(R_ref, lb0, 665, 704)
Rrs_ratio = Rrs_ratio.rename('Rrs_ratio', axis = 'columns')

##  Função de ajuste para o cálculo dos índices da função a(lb0) [multiplicador e expoente]
def Qaa_v5_model_RUN(data_obj, ano, lb0):
    """
    TODO: WRITE DESCRIPTION AND CREATE A PATERN TO THIS function
    
    """
    ###############################################################################
    ########################### QAA SETTINGS - GENERAL ############################
    ###############################################################################
    data_obj.Rrs = data_obj.Rrs.drop([833, 865, 945, 1374, 1614, 2202])
    data_obj.aw = data_obj.aw.drop([833, 865, 945, 1374, 1614, 2202])
    data_obj.bbw = data_obj.bbw.drop([833, 865, 945, 1374, 1614, 2202])

    # Transformação do Rrs
    rrs = Rrs_to_rrs(data_obj.Rrs)
    Rrs = data_obj.Rrs

    # Cálculando o U
    g0 = 0.089
    g1 = 0.1245

    u = calc_u(g0, g1, rrs)

    ###############################################################################
    #ToDo: checar se isso é necessário aqui, talvez criar uma função que padronize isso fora dos OLCI_models.
    # Filtrando os dados
    wvl_ref = {
        'referencia': [443, 492, 560, 665, 704, 741,
                       783],  # Bandas do sensor Sentinel-2A
        # 'referencia': [400,413,443,490,510,560,620,665,674,681,709,754,761,764,768,779], # Bandas do sensor OLCI
        # 'referencia': [400,413,443,490,510,560,620,665,674,681,709,754,761,764,768,779,865,885,900], # Bandas do sensor OLCI
        # 'referencia': [400,411,443,490,560,620,667,674,681,709,754,761,779,865,555],# Bandas v5
        'lb0': lb0
    }

    wl = pd.Series(wvl_ref['referencia'])

    r_ref = filter_wvl(rrs, wvl_ref)
    R_ref = filter_wvl(Rrs, wvl_ref)

    ###############################################################################
    ############################ FASE 1 - QAA.V5 - at #############################
    ###############################################################################

    p0 = [-1.146, -1.336, -0.469]  # Valores iniciais

    # eq_lee_v5_OLCI = np.log10( (r_ref[443] + r_ref[490]) / ( r_ref['r_lb0'] + 5 * (r_ref[665]/r_ref[510] * r_ref[665]))); lago = 'QAA.v5_OLCI'
    eq_lee_v5_s2a = np.log10(
        (r_ref[443] + r_ref[492]) / (r_ref['lb0'] + 5 *
                                     (r_ref[665] / r_ref[492] * r_ref[665])))
    lago = 'QAA.v5_S2a'

    #### ATENÇÃO : a agua é adicionada ao acs dentro da função "optimizer_aLb0" ##########
    a_Lb0_optimized = optimizer_aLb0(eq_lee_v5_s2a,
                                     wvl_ref['lb0'],
                                     p0,
                                     data_obj.aw,
                                     data_obj.acs,
                                     NOToptimize=True)
    opt = '_OptN'
    # a_Lb0_optimized = optimizer_aLb0(eq_lee_v5_s2a, wvl_ref['lb0'], p0, data_obj.aw, data_obj.acs, NOToptimize = False); opt = '_OptY'

    #### bbp (lambda_0)
    bbp_lb0 = calc_bbp_lb0(u, data_obj.bbw, 560, wvl_ref['lb0'],
                           a_Lb0_optimized['aref'])

    ## Cálculando N
    n = calc_n(r_ref[443], r_ref[560])

    # Realizando cálculo do BBP para todos os comprimentos de onda
    bbp = calc_bbp(wl, n, bbp_lb0, wvl_ref['lb0'])

    # Realizando cálculo do BB para todos comprimentos de onda
    bb = calc_bb(bbp, data_obj.bbw)

    # Realizando cálculo do atotal para todos os comprimentos de onda
    at = calc_a_total_nw(bbp, data_obj.bbw, u)

    ###############################################################################
    ############################ FASE 2 - Kd ######################################
    ###############################################################################

    m = [0.005, 4.26, 0.52, 10.54]

    chi = 0.265

    theta_10 = 10

    theta_15 = 15

    raz_bbw_bb = calc_raz_bbw_bb(data_obj.bbw, bb)

    Kd_10 = calc_kd_lee_2013(m, theta_10, at, bb, chi, raz_bbw_bb)

    Kd_15 = calc_kd_lee_2013(m, theta_15, at, bb, chi, raz_bbw_bb)

    ###############################################################################
    ########################### Data Extraction ###################################
    ###############################################################################

    result_dict = {}
    result_dict['dados'] = {
        'lb0': wvl_ref['lb0'],
        'r_ref': list(r_ref.keys()),
        'campanhas': ano,
        'equacao': lago,
        'chute_inicial': a_Lb0_optimized['chute_inicial'],
        'h0h1h2': a_Lb0_optimized['h_otimizado'],
        'g0': g0,
        'g1': g1
    }
    result_dict['a_Lb'] = a_Lb0_optimized['aref']
    result_dict['bb'] = bb
    result_dict['at'] = at
    result_dict['n'] = n
    result_dict['bbp_lb0'] = bbp_lb0
    result_dict['bbp'] = bbp
    result_dict['Kd_10'] = Kd_10
    result_dict['Kd_15'] = Kd_15
    result_dict['Kd_ZEU'] = data_obj.Kd_ZEU
    result_dict['Kd_3m'] = data_obj.Kd_3m
    result_dict['Kd_6m'] = data_obj.Kd_6m

    os.makedirs('./Results_S2A', exist_ok=True)
    export_result(
        result_dict, './Results_S2A/QAAv5_' + ano + '_S2a_' +
        str(wvl_ref['lb0']) + opt + '.pickle')

    return result_dict
def Qaa_v6_model_RUN_original(data_obj, ano, lb0):
    '''
    Função que aplica o modelo QAA v6 dado um objeto de Data Frames contendo todos
    os dados necessários, uma string com o nome/ano da campanha para salvar o arquivo
    dos resultados e um valor de comprimento de onda inicial (Lambda Zero).
    
    ----------
    Parameters
    ----------
    data_obj [Object]
        Objeto com Data Frames contendo dados usados nas funções do modelo QAA/Kd
        alocados pela função read_files através dos argumentos contendo as strings
        do caminho do diretório para cada planilha '.xlsx' de dados.
        
        O objeto de Data Frames deve conter no mínimo:
            [acs]       Absorção total na coluna d'água;
            
            [Rrs]       Reflectância de sensoriamento remoto superficial;
            
            [aw]        Coeficiente de absorção espectral da água;
            
            [bbw]       Coeficiente de retroespalhamento espectral da água;
            
            [coleta]    Planilha contendo Coordenadas, datas e horários das
                        coletas por estação;
                        
            [Kd_ZEU]    Kd medido com dados até a zona de atenação da luz até 1%;
            
            [Kd_3m]     Kd medido com dados até 3 metros de profundidade;
            
            [Kd_6m]     Kd medido com dados até 6 metros de profundidade.
        
        * Os dados devem concordar em faixa espectral, bandas e nome das estações.
        
    ano [String]
        String contendo o nome ou ano da campanha, usado para salvar arquivo
        dicionário contendo todos os dados produtos no formato '.pickle'.
        
        Ex.: 'TRM2019', '2013', 'PACO_2011', etc...
        
    lb0 [Value]
        Comprimento de onda incial usado no modelo QAA (Lambda Zero).
        
        Ex.: 665, 560, 490, etc...
                
    -------
    Returns
    -------
    result_dict [Dictionary]
        O resultado desta função é um dicionário contendo todos os resultados e
        dados de entrada relevantes.
        
        Além disso o modelo salva um arquivo contendo todos os dados em formato
        '.pickle' na pasta '.\Results_Espectral'.
        
        Dados salvos:
            [dados/lb0]         Comprimento de onda incial (Lambda Zero);
            
            [dados/wl]          Comprimentos de onda utilizados;
            
            [dados/r_ref]       Dados de rrs;
            
            [dados/campanha]    Nome/ano da campanha;
            
            [dados/equação]     Equação utilizada no modelo em questão;
            
            [dados/g0]          Coeficiente g1 - Passo 1 QAA;
            
            [dados/g1]          Coeficiente g0 - Passo 1 QAA;
            
            [a_Lb]              Absorção em Lambda Zero;
            
            [bb]                Retroespalhamento total;
            
            [at]                Absorção total estimada pelo modelo QAA;
            
            [n]                 Decaimento do retroespalhamento do particulado;
            
            [bbp_lb0]           Retroespalhamento do particulado em Lambda Zero;
            
            [bbp]               Retroespalhamento do particulado;
            
            [Kd_QAA]            Kd estimado pelo modelo QAA / Kd;
            
            [Kd_ZEU]            Kd medido com dados até a zona de atenação da luz
                                até 1%;
                                
            [Kd_3m]             Kd medido com dados até 3 metros de profundidade;
            
            [Kd_6m]             Kd medido com dados até 6 metros de profundidade.         
    '''
    ###############################################################################
    ########################### QAA SETTINGS - GERAL ##############################
    ###############################################################################
    # data_obj.Rrs = data_obj.Rrs.drop([833, 865, 945, 1374, 1614, 2202])
    # data_obj.aw = data_obj.aw.drop([833, 865, 945, 1374, 1614, 2202])
    # data_obj.bbw = data_obj.bbw.drop([833, 865, 945, 1374, 1614, 2202])

    # Transformação do Rrs
    rrs = Rrs_to_rrs(data_obj.Rrs)
    Rrs = data_obj.Rrs

    # Cálculando o U
    g0 = 0.089
    g1 = 0.1245

    u = calc_u(g0, g1, rrs)

    ##############################################################################################################
    # Filtrando os dados
    wvl_ref = {
        # 'referencia': [443, 492, 560, 665, 704, 741, 783], # Bandas do sensor Sentinel-2A
        # 'referencia': [400,413,443,490,510,560,620,665,674,681,709,754,761,764,768,779], # Bandas do sensor OLCI
        # 'referencia': [400,413,443,490,510,560,620,665,674,681,709,754,761,764,768,779,865,885,900], # Bandas do sensor OLCI
        # 'referencia': [400,411,443,490,560,620,667,674,681,709,754,761,779,865,555], # Bandas v6
        # 'referencia': list(range(400, 951, 1)), # Bandas v6
        'referencia': list(range(400, 751, 1)),  # Bandas PAR v6
        'lb0': lb0
    }

    wl = pd.Series(wvl_ref['referencia'])

    r_ref = filter_wvl(rrs, wvl_ref)
    R_ref = filter_wvl(Rrs, wvl_ref)

    ###############################################################################
    ############################ FASE 1 - QAA.V6 ##################################
    ###############################################################################
    # QAA v6 considera at_lb0 = a(670)

    aw = data_obj.aw

    # a_lb0_v6_492 = calc_alb0_v6_492(492, R_ref, 665, 704, data_obj.aw); lago = 'Eq. QAA.v6 AJUSTE 492 nm'
    # a_lb0_v6_560 = calc_alb0_v6_560(560, R_ref, 665, 704, data_obj.aw); lago = 'Eq. QAA.v6 AJUSTE 560 nm'
    # a_lb0_v6 = calc_alb0_v6(wvl_ref['lb0'], R_ref, 443, 490, data_obj.aw); lago = 'Eq. QAA.v6'
    # a_lb0_v6 = aw.loc[lb0].values; lago = 'Eq. QAA.v6 aw'
    # a_lb0_v6_olci = calc_alb0_v6(wvl_ref['lb0'], R_ref, 443, 490, data_obj.aw); lago = 'QAA.v6_OLCI'
    a_lb0_v6_s2a = calc_alb0_v6(wvl_ref['lb0'], R_ref, 443, 492, data_obj.aw)
    lago = 'QAA.v6_S2a'

    ##  bbp (lambda_0)
    # bbp_lb0_492 = calc_bbp_lb0_v6(u, data_obj.bbw, 492, a_lb0_v6_492)
    # bbp_lb0_560 = calc_bbp_lb0_v6(u, data_obj.bbw, 560, a_lb0_v6_560)
    bbp_lb0_665 = calc_bbp_lb0_v6(u, data_obj.bbw, 665, a_lb0_v6_s2a)

    ## Cálculando N
    # n_acs_492 = calc_n_acs_492(r_ref[665], r_ref[704])
    # n_acs_560 = calc_n_acs_560(r_ref[665], r_ref[704])
    # n_hydro_560 = calc_n_hydro_560(r_ref[443], r_ref[492])
    # n_hydro_704 = calc_n_hydro_704(r_ref[443], r_ref[492])
    n_slope = calc_n(r_ref[443], r_ref[560])

    # Realizando cálculo do BBP para todos os comprimentos de onda
    # bbp_492_acs_492 = calc_bbp(wl, n_acs_492, bbp_lb0_492, 492)
    # bbp_492_acs_560 = calc_bbp(wl, n_acs_560, bbp_lb0_492, 492)
    # bbp_492_hydro_560 = calc_bbp(wl, n_hydro_560, bbp_lb0_492, 492)
    # bbp_492_hydro_704 = calc_bbp(wl, n_hydro_704, bbp_lb0_492, 492)
    # bbp_560_acs_492 = calc_bbp(wl, n_acs_492, bbp_lb0_560, 560)
    # bbp_560_acs_560 = calc_bbp(wl, n_acs_560, bbp_lb0_560, 560)
    # bbp_560_hydro_560 = calc_bbp(wl, n_hydro_560, bbp_lb0_560, 560)
    # bbp_560_hydro_704 = calc_bbp(wl, n_hydro_704, bbp_lb0_560, 560)
    bbp_665 = calc_bbp(wl, n_slope, bbp_lb0_665, 665)

    # Realizando cálculo do BB para todos comprimentos de onda
    # bb_492_acs_492 = calc_bb(bbp_492_acs_492, data_obj.bbw)
    # bb_492_acs_560 = calc_bb(bbp_492_acs_560, data_obj.bbw)
    # bb_492_hydro_560 = calc_bb(bbp_492_hydro_560, data_obj.bbw)
    # bb_492_hydro_704 = calc_bb(bbp_492_hydro_704, data_obj.bbw)
    # bb_560_acs_492 = calc_bb(bbp_560_acs_492, data_obj.bbw)
    # bb_560_acs_560 = calc_bb(bbp_560_acs_560, data_obj.bbw)
    # bb_560_hydro_560 = calc_bb(bbp_560_hydro_560, data_obj.bbw)
    # bb_560_hydro_704 = calc_bb(bbp_560_hydro_704, data_obj.bbw)
    bb_665 = calc_bb(bbp_665, data_obj.bbw)

    # Realizando cálculo do atotal para todos os comprimentos de onda
    # at_492_acs_492 = calc_a_total(bbp_492_acs_492, data_obj.bbw, u)
    # at_492_acs_560 = calc_a_total(bbp_492_acs_560, data_obj.bbw, u)
    # at_492_hydro_560 = calc_a_total(bbp_492_hydro_560, data_obj.bbw, u)
    # at_492_hydro_704 = calc_a_total(bbp_492_hydro_704, data_obj.bbw, u)
    # at_560_acs_492 = calc_a_total(bbp_560_acs_492, data_obj.bbw, u)
    # at_560_acs_560 = calc_a_total(bbp_560_acs_560, data_obj.bbw, u)
    # at_560_hydro_560 = calc_a_total(bbp_560_hydro_560, data_obj.bbw, u)
    # at_560_hydro_704 = calc_a_total(bbp_560_hydro_704, data_obj.bbw, u)
    at_665 = calc_a_total(bbp_665, data_obj.bbw, u)

    ###############################################################################
    ############################ FASE 2 - Kd ######################################
    ###############################################################################

    m = [0.005, 4.26, 0.52, 10.54]

    chi = 0.265

    theta_s = calc_theta_s(data_obj.coleta)
    '''
    Renomear tudo de acordo!!!!!!
    Reescrever o modelo e automatizar etapa dos ajustes
    '''

    # raz_bbw_bb_492_acs_492 = calc_raz_bbw_bb(data_obj.bbw, bb_492_acs_492)
    # raz_bbw_bb_492_acs_560 = calc_raz_bbw_bb(data_obj.bbw, bb_492_acs_560)
    # raz_bbw_bb_492_hydro_560 = calc_raz_bbw_bb(data_obj.bbw, bb_492_hydro_560)
    # raz_bbw_bb_492_hydro_704 = calc_raz_bbw_bb(data_obj.bbw, bb_492_hydro_704)
    # raz_bbw_bb_560_acs_492 = calc_raz_bbw_bb(data_obj.bbw, bb_560_acs_492)
    # raz_bbw_bb_560_acs_560 = calc_raz_bbw_bb(data_obj.bbw, bb_560_acs_560)
    # raz_bbw_bb_560_hydro_560 = calc_raz_bbw_bb(data_obj.bbw, bb_560_hydro_560)
    # raz_bbw_bb_560_hydro_704 = calc_raz_bbw_bb(data_obj.bbw, bb_560_hydro_704)
    raz_bbw_bb_665 = calc_raz_bbw_bb(data_obj.bbw, bb_665)

    # kd_qaa_492_acs_492 = calc_kd_lee_2013(m, theta_s, at_492_acs_492, bb_492_acs_492, chi, raz_bbw_bb_492_acs_492)
    # kd_qaa_492_acs_560 = calc_kd_lee_2013(m, theta_s, at_492_acs_560, bb_492_acs_560, chi, raz_bbw_bb_492_acs_560)
    # kd_qaa_492_hydro_560 = calc_kd_lee_2013(m, theta_s, at_492_hydro_560, bb_492_hydro_560, chi, raz_bbw_bb_492_hydro_560)
    # kd_qaa_492_hydro_704 = calc_kd_lee_2013(m, theta_s, at_492_hydro_704, bb_492_hydro_704, chi, raz_bbw_bb_492_hydro_704)
    # kd_qaa_560_acs_492 = calc_kd_lee_2013(m, theta_s, at_560_acs_492, bb_560_acs_492, chi, raz_bbw_bb_560_acs_492)
    # kd_qaa_560_acs_560 = calc_kd_lee_2013(m, theta_s, at_560_acs_560, bb_560_acs_560, chi, raz_bbw_bb_560_acs_560)
    # kd_qaa_560_hydro_560 = calc_kd_lee_2013(m, theta_s, at_560_hydro_560, bb_560_hydro_560, chi, raz_bbw_bb_560_hydro_560)
    # kd_qaa_560_hydro_704 = calc_kd_lee_2013(m, theta_s, at_560_hydro_704, bb_560_hydro_704, chi, raz_bbw_bb_560_hydro_704)
    kd_qaa_665 = calc_kd_lee_2013(m, theta_s, at_665, bb_665, chi,
                                  raz_bbw_bb_665)

    ###############################################################################
    ########################### Teste Kd - absorção insitu ########################
    ###############################################################################
    '''
    at_acs = data_obj.acs + aw.values
    bb_acs = calc_bb_ref(u, wl, at_acs)
    bb_bb = data_obj.bb
    
    dif = set(theta_s).difference(at_acs)
    theta_s_2 = theta_s.drop(dif, axis = 1)
    
    raz_bbw_bb_acs = calc_raz_bbw_bb(data_obj.bbw, bb_acs)
    raz_bbw_bb_bb = calc_raz_bbw_bb(data_obj.bbw, bb_bb)
    
    kd_acs = calc_kd_lee_2013(m, theta_s_2, at_acs, bb_acs, chi, raz_bbw_bb_acs)
    kd_bb = calc_kd_lee_2013(m, theta_s_2, at_acs, bb_bb, chi, raz_bbw_bb_bb)
    
    '''
    ###############################################################################
    ########################### Data Extraction ###################################
    ###############################################################################
    result_dict = {}
    result_dict['dados'] = {
        'lb0': wvl_ref['lb0'],
        'wl': list(r_ref.keys()),
        'r_ref': r_ref,
        'campanhas': ano,
        'equacao': lago,
        'chute_inicial': 'não otimizado',
        'h0h1h2': 'não otimizado',
        'g0': g0,
        'g1': g1
    }
    # result_dict['a_lb0_492'] = a_lb0_v6_492
    # result_dict['a_lb0_560'] = a_lb0_v6_560
    result_dict['a_lb0_665'] = a_lb0_v6_s2a

    # result_dict['bb_492_acs_492'] = bb_492_acs_492
    # result_dict['bb_492_acs_560'] = bb_492_acs_560
    # result_dict['bb_492_hydro_560'] = bb_492_hydro_560
    # result_dict['bb_492_hydro_704'] = bb_492_hydro_704
    # result_dict['bb_560_acs_492'] = bb_560_acs_492
    # result_dict['bb_560_acs_560'] = bb_560_acs_560
    # result_dict['bb_560_hydro_560'] = bb_560_hydro_560
    # result_dict['bb_560_hydro_704'] = bb_560_hydro_704
    result_dict['bb_665'] = bb_665

    # result_dict['at_492_acs_492'] = at_492_acs_492
    # result_dict['at_492_acs_560'] = at_492_acs_560
    # result_dict['at_492_hydro_560'] = at_492_hydro_560
    # result_dict['at_492_hydro_704'] = at_492_hydro_704
    # result_dict['at_560_acs_492'] = at_560_acs_492
    # result_dict['at_560_acs_560'] = at_560_acs_560
    # result_dict['at_560_hydro_560'] = at_560_hydro_560
    # result_dict['at_560_hydro_704'] = at_560_hydro_704
    result_dict['at_665'] = at_665

    # result_dict['n_acs_492'] = n_acs_492
    # result_dict['n_acs_560'] = n_acs_560
    # result_dict['n_hydro_560'] = n_hydro_560
    # result_dict['n_hydro_704'] = n_hydro_704
    result_dict['n_665'] = n_slope

    # result_dict['bbp_lb0_492'] = bbp_lb0_492
    # result_dict['bbp_lb0_560'] = bbp_lb0_560
    result_dict['bbp_lb0_665'] = bbp_lb0_665

    # result_dict['bbp_492_acs_492'] = bbp_492_acs_492
    # result_dict['bbp_492_acs_560'] = bbp_492_acs_560
    # result_dict['bbp_492_hydro_560'] = bbp_492_hydro_560
    # result_dict['bbp_492_hydro_704'] = bbp_492_hydro_704
    # result_dict['bbp_560_acs_492'] = bbp_560_acs_492
    # result_dict['bbp_560_acs_560'] = bbp_560_acs_560
    # result_dict['bbp_560_hydro_560'] = bbp_560_hydro_560
    # result_dict['bbp_560_hydro_704'] = bbp_560_hydro_704
    result_dict['bbp_665'] = bbp_665

    # result_dict['kd_qaa_492_acs_492'] = kd_qaa_492_acs_492
    # result_dict['kd_qaa_492_acs_560'] = kd_qaa_492_acs_560
    # result_dict['kd_qaa_492_hydro_560'] = kd_qaa_492_hydro_560
    # result_dict['kd_qaa_492_hydro_704'] = kd_qaa_492_hydro_704
    # result_dict['kd_qaa_560_acs_492'] = kd_qaa_560_acs_492
    # result_dict['kd_qaa_560_acs_560'] = kd_qaa_560_acs_560
    # result_dict['kd_qaa_560_hydro_560'] = kd_qaa_560_hydro_560
    # result_dict['kd_qaa_560_hydro_704'] = kd_qaa_560_hydro_704
    result_dict['kd_qaa_665'] = kd_qaa_665

    # result_dict['kd_acs'] = kd_acs
    # result_dict['kd_bb'] = kd_bb

    result_dict['Kd_ZEU'] = data_obj.kd_zeu
    result_dict['Kd_3m'] = data_obj.kd_3m
    result_dict['Kd_6m'] = data_obj.kd_6m

    os.makedirs('./Results_Espectral', exist_ok=True)
    export_result(
        result_dict, './Results_Espectral/QAAv6_' + ano + '_' +
        str(wvl_ref['lb0']) + '_Ajustado.pickle')

    return result_dict
def Qaa_v5_model_RUN(data_obj, ano, lb0):
    '''
    Função que aplica o modelo QAA v5 dado um objeto de Data Frames contendo todos
    os dados necessários, uma string com o nome/ano da campanha para salvar o arquivo
    dos resultados e um valor de comprimento de onda inicial (Lambda Zero).
    
    ----------
    Parameters
    ----------
    data_obj [Object]
        Objeto com Data Frames contendo dados usados nas funções do modelo QAA/Kd
        alocados pela função read_files através dos argumentos contendo as strings
        do caminho do diretório para cada planilha '.xlsx' de dados.
        
        O objeto de Data Frames deve conter no mínimo:
            [acs]       Absorção total na coluna d'água;
            
            [Rrs]       Reflectância de sensoriamento remoto superficial;
            
            [aw]        Coeficiente de absorção espectral da água;
            
            [bbw]       Coeficiente de retroespalhamento espectral da água;
            
            [coleta]    Planilha contendo Coordenadas, datas e horários das
                        coletas por estação;
                        
            [Kd_ZEU]    Kd medido com dados até a zona de atenação da luz até 1%;
            
            [Kd_3m]     Kd medido com dados até 3 metros de profundidade;
            
            [Kd_6m]     Kd medido com dados até 6 metros de profundidade.
        
        * Os dados devem concordar em faixa espectral, bandas e nome das estações.
        
    ano [String]
        String contendo o nome ou ano da campanha, usado para salvar arquivo
        dicionário contendo todos os dados produtos no formato '.pickle'.
        
        Ex.: 'TRM2019', '2013', 'PACO_2011', etc...
        
    lb0 [Value]
        Comprimento de onda incial usado no modelo QAA (Lambda Zero).
        
        Ex.: 665, 560, 490, etc...
                
    -------
    Returns
    -------
    result_dict [Dictionary]
        O resultado desta função é um dicionário contendo todos os resultados e
        dados de entrada relevantes.
        
        Além disso o modelo salva um arquivo contendo todos os dados em formato
        '.pickle' na pasta '.\Results_Espectral'.
        
        Dados salvos:
            [dados/lb0]         Comprimento de onda incial (Lambda Zero);
            
            [dados/wl]          Comprimentos de onda utilizados;
            
            [dados/r_ref]       Dados de rrs;
            
            [dados/campanha]    Nome/ano da campanha;
            
            [dados/equação]     Equação utilizada no modelo em questão;
            
            [dados/g0]          Coeficiente g1 - Passo 1 QAA;
            
            [dados/g1]          Coeficiente g0 - Passo 1 QAA;
            
            [a_Lb]              Absorção em Lambda Zero;
            
            [bb]                Retroespalhamento total;
            
            [at]                Absorção total estimada pelo modelo QAA;
            
            [n]                 Decaimento do retroespalhamento do particulado;
            
            [bbp_lb0]           Retroespalhamento do particulado em Lambda Zero;
            
            [bbp]               Retroespalhamento do particulado;
            
            [Kd_QAA]            Kd estimado pelo modelo QAA / Kd;
            
            [Kd_ZEU]            Kd medido com dados até a zona de atenação da luz
                                até 1%;
                                
            [Kd_3m]             Kd medido com dados até 3 metros de profundidade;
            
            [Kd_6m]             Kd medido com dados até 6 metros de profundidade.         
    '''
    
    ###############################################################################
    ########################### QAA SETTINGS - GENERAL ############################
    ###############################################################################
    # data_obj.Rrs = data_obj.Rrs.drop([833, 865, 945, 1374, 1614, 2202])
    # data_obj.aw = data_obj.aw.drop([833, 865, 945, 1374, 1614, 2202])
    # data_obj.bbw = data_obj.bbw.drop([833, 865, 945, 1374, 1614, 2202])

    # Transformação do Rrs
    rrs = Rrs_to_rrs(data_obj.Rrs)
    Rrs = data_obj.Rrs

    # Cálculando o U
    g0 = 0.089
    g1 = 0.1245

    u = calc_u(g0, g1, rrs)
    
    ###############################################################################
    #ToDo: checar se isso é necessário aqui, talvez criar uma função que padronize isso fora dos OLCI_models.
    # Filtrando os dados
    wvl_ref = {
            # 'referencia': [443, 492, 560, 665, 704, 741, 783], # Bandas do sensor Sentinel-2A
            # 'referencia': [400,413,443,490,510,560,620,665,674,681,709,754,761,764,768,779], # Bandas do sensor OLCI
            # 'referencia': [400,413,443,490,510,560,620,665,674,681,709,754,761,764,768,779,865,885,900], # Bandas do sensor OLCI
            # 'referencia': [400,411,443,490,560,620,667,674,681,709,754,761,779,865,555], # Bandas v5
            # 'referencia': list(range(400, 951, 1)), # Bandas v5
            'referencia': list(range(400, 751, 1)), # Bandas PAR v5
            'lb0': lb0
            }

    wl = pd.Series(wvl_ref['referencia'])
    
    r_ref = filter_wvl(rrs, wvl_ref)
    # R_ref = filter_wvl(Rrs, wvl_ref)
    
    ###############################################################################
    ############################ FASE 1 - QAA.V5 - at #############################
    ###############################################################################
    
    p0 = [-1.146, -1.336,- 0.469] # Valores iniciais
    
    # eq_lee_v5_OLCI = np.log10( (r_ref[443] + r_ref[490]) / ( r_ref['r_lb0'] + 5 * (r_ref[665]/r_ref[510] * r_ref[665]))); lago = 'QAA.v5_OLCI'
    # eq_lee_v5_s2a = np.log10( (r_ref[443] + r_ref[492]) / ( r_ref['r_lb0'] + 5 * (r_ref[665]/r_ref[492] * r_ref[665]))); lago = 'QAA.v5_S2a'
    eq_lee_v5 = np.log10( (r_ref[443] + r_ref[490]) / (r_ref['r_lb0'] + 5 * (r_ref[670] / r_ref[490] * r_ref[670]))); lago = 'QAA.v5'

    aw = data_obj.aw

    #### ATENÇÃO : a agua é adicionada ao acs dentro da função "optimizer_aLb0" ##########
    # a_Lb0_optimized = optimizer_aLb0(eq_lee_v5, wvl_ref['lb0'], p0, data_obj.aw, data_obj.acs, NOToptimize = True); opt = '_OptN'
    # a_Lb0_optimized = optimizer_aLb0(eq_lee_v5, wvl_ref['lb0'], p0, data_obj.aw, data_obj.acs, NOToptimize = False); opt = '_OptY'
    a_Lb0_optimized = aw.loc[lb0].values; opt = '_OptAw'
    
    #### bbp (lambda_0)
    # bbp_lb0 = calc_bbp_lb0(u, data_obj.bbw, 555, wvl_ref['lb0'], a_Lb0_optimized['aref'])
    bbp_lb0 = calc_bbp_lb0(u, data_obj.bbw, wvl_ref['lb0'], a_Lb0_optimized)
    
    ## Cálculando N
    n = calc_n(r_ref[443], r_ref[555])
    
    # Realizando cálculo do BBP para todos os comprimentos de onda
    bbp = calc_bbp(wl, n, bbp_lb0, wvl_ref['lb0'])
    
    # Realizando cálculo do BB para todos comprimentos de onda
    bb = calc_bb(bbp, data_obj.bbw)
    
    # Realizando cálculo do atotal para todos os comprimentos de onda
    at = calc_a_total_nw(bbp, data_obj.bbw, u)
    
    ###############################################################################
    ############################ FASE 2 - Kd ######################################
    ###############################################################################
    
    m = [0.005, 4.26, 0.52, 10.54]
    
    chi = 0.265
    
    theta_s = calc_theta_s(data_obj.coleta)
    
    raz_bbw_bb = calc_raz_bbw_bb(data_obj.bbw, bb)
    
    kd_qaa = calc_kd_lee_2013(m, theta_s, at, bb, chi, raz_bbw_bb)
    
    ###############################################################################
    ########################### Data Extraction ###################################
    ###############################################################################
    
    result_dict = {}
    result_dict['dados'] = {
        'lb0': wvl_ref['lb0'],
        'wl': list(r_ref.keys()),
        'r_ref': r_ref,
        'campanhas': ano,
        'equacao': lago,
    #   'chute_inicial': a_Lb0_optimized['chute_inicial'],
    #    'h0h1h2': a_Lb0_optimized['h_otimizado'],
        'g0': g0,
        'g1': g1
    }
    # result_dict['a_Lb'] = a_Lb0_optimized['aref']
    result_dict['a_Lb'] = a_Lb0_optimized
    result_dict['bb'] = bb
    result_dict['at'] = at
    result_dict['n'] = n
    result_dict['bbp_lb0'] = bbp_lb0
    result_dict['bbp'] = bbp
    result_dict['Kd_QAA'] = kd_qaa
    result_dict['Kd_ZEU'] = data_obj.kd_zeu
    result_dict['Kd_3m'] = data_obj.kd_3m
    result_dict['Kd_6m'] = data_obj.kd_6m

    os.makedirs('./Results_Espectral', exist_ok = True)
    export_result(result_dict, './Results_Espectral/QAAv5_' + ano + '_' + str(wvl_ref['lb0']) + opt  + '.pickle')
    
    return result_dict
Example #5
0
def Qaa_v6_model_RUN(data_obj, ano, lb0):
    """
    TODO: WRITE DESCRIPTION AND CREATE A PATERN TO THIS function
    
    """
    ###############################################################################
    ########################### QAA SETTINGS - GERAL ##############################
    ###############################################################################
    data_obj.Rrs = data_obj.Rrs.drop([833, 865, 945, 1374, 1614, 2202])
    data_obj.aw = data_obj.aw.drop([833, 865, 945, 1374, 1614, 2202])
    data_obj.bbw = data_obj.bbw.drop([833, 865, 945, 1374, 1614, 2202])

    # Transformação do Rrs
    rrs = Rrs_to_rrs(data_obj.Rrs)
    Rrs = data_obj.Rrs

    # Cálculando o U
    g0 = 0.089
    g1 = 0.1245

    u = calc_u(g0, g1, rrs)

    ##############################################################################################################
    #ToDo: checar se isso é necessário aqui, talvez criar uma função que padronize isso fora dos OLCI_models.
    # Filtrando os dados
    wvl_ref = {
        'referencia': [443, 492, 560, 665, 704, 741,
                       783],  # Bandas do sensor Sentinel-2A
        # 'referencia': [400,413,443,490,510,560,620,665,674,681,709,754,761,764,768,779], # Bandas do sensor OLCI
        # 'referencia': [400,413,443,490,510,560,620,665,674,681,709,754,761,764,768,779,865,885,900], # Bandas do sensor OLCI
        # 'referencia': [400,411,443,490,560,620,667,674,681,709,754,761,779,865,555],# Bandas v5
        'lb0': lb0
    }

    wl = pd.Series(wvl_ref['referencia'])

    r_ref = filter_wvl(rrs, wvl_ref)
    R_ref = filter_wvl(Rrs, wvl_ref)

    ###############################################################################
    ############################ FASE 1 - QAA.V6 ##################################
    ###############################################################################
    # QAA v6 considera at_lb0 = a(670)

    aw = data_obj.aw

    # a_lb0_v6 = calc_alb0_v6(670, R_ref, 443, 490, data_obj.aw); lago = 'Eq. QAA.v6'
    # a_lb0_v6_olci = calc_alb0_v6(wvl_ref['lb0'], R_ref, 443, 490, data_obj.aw); lago = 'QAA.v6_OLCI'
    a_lb0_v6_s2a = calc_alb0_v6(wvl_ref['lb0'], R_ref, 443, 492, data_obj.aw)
    lago = 'QAA.v6_S2a'

    #### bbp (lambda_0)
    bbp_lb0 = calc_bbp_lb0_v6(u, data_obj.bbw, 665, wvl_ref['lb0'],
                              a_lb0_v6_s2a)

    ## Cálculando N
    n = calc_n(r_ref[443], r_ref[560])

    # Realizando cálculo do BBP para todos os comprimentos de onda
    bbp = calc_bbp(wl, n, bbp_lb0, wvl_ref['lb0'])

    # Realizando cálculo do BB para todos comprimentos de onda
    bb = calc_bb(bbp, data_obj.bbw)

    # Realizando cálculo do atotal para todos os comprimentos de onda
    at = calc_a_total(bbp, data_obj.bbw, u)

    ###############################################################################
    ############################ FASE 2 - Kd ######################################
    ###############################################################################

    m = [0.005, 4.26, 0.52, 10.54]

    chi = 0.265

    theta_10 = 10

    theta_15 = 15

    raz_bbw_bb = calc_raz_bbw_bb(data_obj.bbw, bb)

    Kd_10 = calc_kd_lee_2013(m, theta_10, at, bb, chi, raz_bbw_bb)

    Kd_15 = calc_kd_lee_2013(m, theta_15, at, bb, chi, raz_bbw_bb)

    ###############################################################################
    ########################### Data Extraction ###################################
    ###############################################################################
    result_dict = {}
    result_dict['dados'] = {
        'lb0': wvl_ref['lb0'],
        'r_ref': list(r_ref.keys()),
        'campanhas': ano,
        'equacao': lago,
        'chute_inicial': 'não otimizado',
        'h0h1h2': 'não otimizado',
        'g0': g0,
        'g1': g1
    }
    result_dict['a_Lb'] = a_lb0_v6_s2a
    result_dict['bb'] = bb
    result_dict['at'] = at
    result_dict['n'] = n
    result_dict['bbp_lb0'] = bbp_lb0
    result_dict['bbp'] = bbp
    result_dict['Kd_10'] = Kd_10
    result_dict['Kd_15'] = Kd_15
    result_dict['Kd_ZEU'] = data_obj.Kd_ZEU
    result_dict['Kd_3m'] = data_obj.Kd_3m
    result_dict['Kd_6m'] = data_obj.Kd_6m

    os.makedirs('./Results_S2A', exist_ok=True)
    export_result(
        result_dict, './Results_S2A/QAAv6_' + ano + '_S2a_' +
        str(wvl_ref['lb0']) + '.pickle')

    return result_dict