Exemple #1
0
def make_PCO2_vs_Month_plots(sitesDir, siteList=None, siteFile=None, classFile=''):
    sitePanelDict, sitePhreeqcDict = loadSiteListData(processedSitesDir=sitesDir, loadPhreeqc=True)
    if classFile != '':
        class_xls = read_excel(classFile, 'Sheet1',index_col=1, names=['name','site', 'recharge', 'age'])
    site_class = []
    plotsDir = os.path.join(sitesDir, 'plots/')
    for site in sitePanelDict.keys():
        if classFile !='':
            #read in classification for this site
            this_class = class_xls['recharge'][site]
            this_color=class_colors[this_class]
            site_class.append(this_class)
        else:
            this_color='black'
        print("Making plot for: "+site)
        #Read out data into shorter variable names
        T_C = sitePanelDict[site].data['Temperature, water']
        CO2 = sitePhreeqcDict[site].CO2_Molality
        good_values = get_good_indicies([T_C,CO2])
        T_C = T_C[good_values]
        CO2 = CO2[good_values]
        #Calculate PCO2
        T_K = CtoK(T_C)
        K_H = calc_K_H(T_K)
        PCO2 = CO2/K_H
        sample_month = PCO2.index.month
        figure()
        #semilogy(sample_month, PCO2, 'o', color=this_color)
        plot(sample_month, PCO2, 'o', color=this_color)
        xlabel('Month')
        ylabel('PCO2 (atm)')
        savefig(os.path.join(plotsDir,site+'-PCO2_vs_Month.pdf'))
Exemple #2
0
def make_PCO2_vs_Month_plots(sitesDir, siteList=None, siteFile=None, classFile=''):
    sitePanelDict, sitePhreeqcDict = loadSiteListData(processedSitesDir=sitesDir, loadPhreeqc=True)
    if classFile != '':
        class_xls = read_excel(classFile, 'Sheet1',index_col=1, names=['name','site', 'recharge', 'age'])
    site_class = []
    plotsDir = os.path.join(sitesDir, 'plots/')
    for site in list(sitePanelDict.keys()):
        if classFile !='':
            #read in classification for this site
            this_class = class_xls['recharge'][site]
            this_color=class_colors[this_class]
            site_class.append(this_class)
        else:
            this_color='black'
        print(("Making plot for: "+site))
        #Read out data into shorter variable names
        T_C = sitePanelDict[site].data['Temperature, water']
        CO2 = sitePhreeqcDict[site].CO2_Molality
        good_values = get_good_indicies([T_C,CO2])
        T_C = T_C[good_values]
        CO2 = CO2[good_values]
        #Calculate PCO2
        T_K = CtoK(T_C)
        K_H = calc_K_H(T_K)
        PCO2 = CO2/K_H
        sample_month = PCO2.index.month
        figure()
        #semilogy(sample_month, PCO2, 'o', color=this_color)
        plot(sample_month, PCO2, 'o', color=this_color)
        xlabel('Month')
        ylabel('PCO2 (atm)')
        savefig(os.path.join(plotsDir,site+'-PCO2_vs_Month.pdf'))
Exemple #3
0
def make_saturation_ratio_vs_Q_plots(sitesDir,
                                     siteList=None,
                                     siteFile=None,
                                     makeHistograms=True):
    sitePanelDict, sitePhreeqcDict = loadSiteListData(
        processedSitesDir=sitesDir, loadPhreeqc=True)
    rs = []
    ps = []
    slopes = []
    plotsDir = os.path.join(sitesDir, 'plots/')
    for site in sitePanelDict.keys():
        print("Making plot for: " + site)
        #Read out data into shorter variable names
        Q = sitePanelDict[site].data['Stream flow, mean. daily']
        T_C = sitePanelDict[site].data['Temperature, water']
        CO2 = sitePhreeqcDict[site].CO2_Molality
        Ca = sitePhreeqcDict[site]['Ca']
        #Filter out nan values
        #good_values = ~(Q+T_C+CO2+Ca).isnull()#Addition will create Nans if any of the series contains a NaN
        good_values = get_good_indicies([Q, T_C, CO2, Ca])
        Q = Q[good_values]
        T_C = T_C[good_values]
        CO2 = CO2[good_values]
        Ca = Ca[good_values]
        #Calculate PCO2
        T_K = CtoK(T_C)
        K_H = calc_K_H(T_K)
        PCO2 = CO2 / K_H
        #Calculate Equilibrium Ca concentration
        CaEq = concCaEqFromPCO2(PCO2, T_C=T_C)
        #Check for plots directory and make it if one doesn't exist
        check_plots_dir(sitesDir)
        #Make Discharge vs. Saturation Ratio Plot
        figure()
        loglog(Q, Ca / CaEq, 'o')
        xlabel('Discharge (cfs)')
        ylabel('Saturation Ratio $[Ca]/[Ca]_{eq}$')
        savefig(os.path.join(plotsDir, site + '-Q_vs_SatRatio.pdf'))
        #Calculate correlation coefficient and regression
        slope, intercept, r, p, stderr = linregress(log10(Q), Ca / CaEq)
        rs.append(r)
        ps.append(p)
        slopes.append(slope)
        if makeHistograms:
            figure()
            hist(Ca / CaEq, normed=True)
            xlabel('Saturation Ratio $[Ca]/[Ca]_{eq}$')
            ylabel('Frequency')
            savefig(os.path.join(plotsDir, site + '-SatRatioHist.pdf'))

    #Make histogram of pearson r values
    figure()
    hist(rs, normed=True)
    xlabel('Pearson R')
    ylabel('Frequency')
    savefig(os.path.join(plotsDir, 'PearsonR_Q_SatRatio.pdf'))
Exemple #4
0
def make_saturation_ratio_vs_Q_plots(sitesDir, siteList=None, siteFile=None, makeHistograms=True):
    sitePanelDict, sitePhreeqcDict = loadSiteListData(processedSitesDir=sitesDir, loadPhreeqc=True)
    rs = []
    ps = []
    slopes = []
    plotsDir = os.path.join(sitesDir, 'plots/')
    for site in sitePanelDict.keys():
        print("Making plot for: "+site)
        #Read out data into shorter variable names
        Q = sitePanelDict[site].data['Stream flow, mean. daily']
        T_C = sitePanelDict[site].data['Temperature, water']
        CO2 = sitePhreeqcDict[site].CO2_Molality
        Ca = sitePhreeqcDict[site]['Ca']
        #Filter out nan values
        #good_values = ~(Q+T_C+CO2+Ca).isnull()#Addition will create Nans if any of the series contains a NaN
        good_values = get_good_indicies([Q,T_C,CO2,Ca])
        Q = Q[good_values]
        T_C = T_C[good_values]
        CO2 = CO2[good_values]
        Ca = Ca[good_values]
        #Calculate PCO2
        T_K = CtoK(T_C)
        K_H = calc_K_H(T_K)
        PCO2 = CO2/K_H
        #Calculate Equilibrium Ca concentration
        CaEq = concCaEqFromPCO2(PCO2, T_C=T_C)
        #Check for plots directory and make it if one doesn't exist
        check_plots_dir(sitesDir)
        #Make Discharge vs. Saturation Ratio Plot
        figure()
        loglog(Q, Ca/CaEq, 'o')
        xlabel('Discharge (cfs)')
        ylabel('Saturation Ratio $[Ca]/[Ca]_{eq}$')
        savefig(os.path.join(plotsDir,site+'-Q_vs_SatRatio.pdf'))
        #Calculate correlation coefficient and regression
        slope,intercept,r,p,stderr = linregress(log10(Q), Ca/CaEq)
        rs.append(r)
        ps.append(p)
        slopes.append(slope)
        if makeHistograms:
            figure()
            hist(Ca/CaEq, normed=True)
            xlabel('Saturation Ratio $[Ca]/[Ca]_{eq}$')
            ylabel('Frequency')
            savefig(os.path.join(plotsDir,site+'-SatRatioHist.pdf'))

    #Make histogram of pearson r values    
    figure()
    hist(rs,normed=True)
    xlabel('Pearson R')
    ylabel('Frequency')
    savefig(os.path.join(plotsDir,'PearsonR_Q_SatRatio.pdf'))
Exemple #5
0
def make_PCO2_vs_Q_plots(sitesDir,
                         siteList=None,
                         siteFile=None,
                         classFile='',
                         makeHistograms=True):
    sitePanelDict, sitePhreeqcDict = loadSiteListData(
        processedSitesDir=sitesDir, loadPhreeqc=True)
    if classFile != '':
        class_xls = read_excel(classFile,
                               'Sheet1',
                               index_col=1,
                               names=['name', 'site', 'recharge', 'age'])
    rs = []
    ps = []
    site_class = []
    slopes = []
    plotsDir = os.path.join(sitesDir, 'plots/')
    for site in sitePanelDict.keys():
        if classFile != '':
            #read in classification for this site
            this_class = class_xls['recharge'][site]
            this_color = class_colors[this_class]
            site_class.append(this_class)
        else:
            this_color = 'black'
        print("Making plot for: " + site)
        #Read out data into shorter variable names
        Q = sitePanelDict[site].data['Stream flow, mean. daily']
        T_C = sitePanelDict[site].data['Temperature, water']
        CO2 = sitePhreeqcDict[site].CO2_Molality
        Ca = sitePhreeqcDict[site]['Ca']
        #Filter out nan values
        #good_values = ~(Q+T_C+CO2+Ca).isnull()#Addition will create Nans if any of the series contains a NaN
        good_values = get_good_indicies([Q, T_C, CO2, Ca])
        Q = Q[good_values]
        T_C = T_C[good_values]
        CO2 = CO2[good_values]
        Ca = Ca[good_values]
        #Calculate PCO2
        T_K = CtoK(T_C)
        K_H = calc_K_H(T_K)
        PCO2 = CO2 / K_H
        figure()
        loglog(Q, PCO2, 'o', color=this_color)
        xlabel('Discharge (cfs)')
        ylabel('PCO2 (atm)')
        savefig(os.path.join(plotsDir, site + '-PCO2_vs_Q.pdf'))
Exemple #6
0
def make_saturation_index_vs_Q_plots(sitesDir,
                                     siteList=None,
                                     siteFile=None,
                                     makeHistograms=True):
    sitePanelDict, sitePhreeqcDict = loadSiteListData(
        processedSitesDir=sitesDir, loadPhreeqc=True)
    rs = []
    ps = []
    slopes = []
    plotsDir = os.path.join(sitesDir, 'plots/')
    for site in sitePanelDict.keys():
        print("Making plot for: " + site)
        #Read out data into shorter variable names
        Q = sitePanelDict[site].data['Stream flow, mean. daily']
        SI = sitePhreeqcDict[site].SI_Calcite
        #Filter out nan values
        good_values = get_good_indicies([Q, SI])
        Q = Q[good_values]
        SI = SI[good_values]
        check_plots_dir(sitesDir)
        #Make Discharge vs. Saturation Index Plot
        figure()
        semilogx(Q, SI, 'o')
        xlabel('Discharge (cfs)')
        ylabel('$SI_{calcite}$')
        savefig(os.path.join(plotsDir, site + '-Q_vs_SI.pdf'))
        #Calculate correlation coefficient and regression
        slope, intercept, r, p, stderr = linregress(log10(Q), SI)
        rs.append(r)
        ps.append(p)
        slopes.append(slope)
        if makeHistograms:
            figure()
            hist(SI, normed=True)
            xlabel('$SI_{calcite}$')
            ylabel('Frequency')
            savefig(os.path.join(plotsDir, site + '-SIHist.pdf'))

    #Make histogram of pearson r values
    figure()
    hist(rs, normed=True)
    xlabel('Pearson R')
    ylabel('Frequency')
    savefig(os.path.join(plotsDir, 'PearsonR_Q_SIRatio.pdf'))
Exemple #7
0
def make_saturation_index_vs_Q_plots(sitesDir, siteList=None, siteFile=None, makeHistograms=True):
    sitePanelDict, sitePhreeqcDict = loadSiteListData(processedSitesDir=sitesDir, loadPhreeqc=True)
    rs = []
    ps = []
    slopes = []
    plotsDir = os.path.join(sitesDir, 'plots/')
    for site in sitePanelDict.keys():
        print("Making plot for: "+site)
        #Read out data into shorter variable names
        Q = sitePanelDict[site].data['Stream flow, mean. daily']
        SI = sitePhreeqcDict[site].SI_Calcite
        #Filter out nan values
        good_values = get_good_indicies([Q,SI])
        Q = Q[good_values]
        SI = SI[good_values]
        check_plots_dir(sitesDir)
        #Make Discharge vs. Saturation Index Plot
        figure()
        semilogx(Q, SI, 'o')
        xlabel('Discharge (cfs)')
        ylabel('$SI_{calcite}$')
        savefig(os.path.join(plotsDir,site+'-Q_vs_SI.pdf'))
        #Calculate correlation coefficient and regression
        slope,intercept,r,p,stderr = linregress(log10(Q), SI)
        rs.append(r)
        ps.append(p)
        slopes.append(slope)
        if makeHistograms:
            figure()
            hist(SI, normed=True)
            xlabel('$SI_{calcite}$')
            ylabel('Frequency')
            savefig(os.path.join(plotsDir,site+'-SIHist.pdf'))        

    #Make histogram of pearson r values    
    figure()
    hist(rs,normed=True)
    xlabel('Pearson R')
    ylabel('Frequency')
    savefig(os.path.join(plotsDir,'PearsonR_Q_SIRatio.pdf'))
Exemple #8
0
def make_PCO2_vs_Q_plots(sitesDir, siteList=None, siteFile=None, classFile='', makeHistograms=True):
    sitePanelDict, sitePhreeqcDict = loadSiteListData(processedSitesDir=sitesDir, loadPhreeqc=True)
    if classFile != '':
        class_xls = read_excel(classFile, 'Sheet1',index_col=1, names=['name','site', 'recharge', 'age'])
    rs = []
    ps = []
    site_class = []
    slopes = []
    plotsDir = os.path.join(sitesDir, 'plots/')
    for site in sitePanelDict.keys():
        if classFile !='':
            #read in classification for this site
            this_class = class_xls['recharge'][site]
            this_color=class_colors[this_class]
            site_class.append(this_class)
        else:
            this_color='black'
        print("Making plot for: "+site)
        #Read out data into shorter variable names
        Q = sitePanelDict[site].data['Stream flow, mean. daily']
        T_C = sitePanelDict[site].data['Temperature, water']
        CO2 = sitePhreeqcDict[site].CO2_Molality
        Ca = sitePhreeqcDict[site]['Ca']
        #Filter out nan values
        #good_values = ~(Q+T_C+CO2+Ca).isnull()#Addition will create Nans if any of the series contains a NaN
        good_values = get_good_indicies([Q,T_C,CO2,Ca])
        Q = Q[good_values]
        T_C = T_C[good_values]
        CO2 = CO2[good_values]
        Ca = Ca[good_values]
        #Calculate PCO2
        T_K = CtoK(T_C)
        K_H = calc_K_H(T_K)
        PCO2 = CO2/K_H
        figure()
        loglog(Q, PCO2, 'o', color=this_color)
        xlabel('Discharge (cfs)')
        ylabel('PCO2 (atm)')
        savefig(os.path.join(plotsDir,site+'-PCO2_vs_Q.pdf'))
Exemple #9
0
def make_pwp_vs_Q_plots(sitesDir, siteList=None, siteFile=None, makeHistograms=True, classFile='', bracket_charge_balance=False,plotloglog=False, nbins=10):
    sitePanelDict, sitePhreeqcDict = loadSiteListData(processedSitesDir=sitesDir, loadPhreeqc=True)
    if classFile != '':
        class_xls = read_excel(classFile, 'Sheet1',index_col=1, names=['name','site', 'recharge', 'age'])
    site_class = []
    rs =[]
    ps = []
    spp = []
    spr = []
    slopes= []
    plotsDir = os.path.join(sitesDir, 'plots/')
    #Check for plots directory and make it if one doesn't exist
    check_plots_dir(sitesDir)
    for site in list(sitePanelDict.keys()):
        if classFile !='':
            #read in classification for this site
            this_class = class_xls['recharge'][site]
            this_color=class_colors[this_class]
            site_class.append(this_class)
        else:
            this_color='black'
        print(("Making plot for: "+site))
        Q = sitePanelDict[site].data['Stream flow, mean. daily']
        pwp_rates = calc_site_pwp(sitePanelDict[site], sitePhreeqcDict[site])
        pwp_rates = pwp_to_mm_yr(pwp_rates)
        df = DataFrame({'Q':Q, 'pwp':pwp_rates})
        df = df.dropna()
        Qposids = df.Q>0
        df = df[Qposids]
        #Calculate fitting function parameters
        fit_converged = True
        if df.Q.values.size>5:
            try:
                opt_params, pcov = curve_fit(pwp_Q_fit, df['Q'], df['pwp'], p0=[1.,1.,1.])
                k = opt_params[0]
                a = opt_params[1]
                beta = opt_params[2]
            except RuntimeError as e:
                fit_converged = False
                print(e)
        else:
            fit_converged = False
        #Make Discharge vs. Saturation Ratio Plot
        figure()
        if plotloglog:
            if bracket_charge_balance:
                loglog(df.Q, df.pwp, '.', ms=0, color=this_color)
            else:
                loglog(df.Q, df.pwp, '.', color=this_color)
        else:
            if bracket_charge_balance:
                semilogx(df.Q, df.pwp, '.', color=this_color, ms=0)
            else:
                semilogx(df.Q, df.pwp, '.', color=this_color)
        #plot fitting function
        if fit_converged:
            Q_fit = linspace(df.Q.min(), df.Q.max(), 1000)
            pwp_fit = pwp_Q_fit(Q_fit, k, a, beta)
            plot(Q_fit, pwp_fit, '-k')
        xlabel('Discharge (cfs)')
        ylabel('PWP Dissolution Rate (mm/yr)')
        if bracket_charge_balance:
            #Load charge bracket data
            df_alk = read_csv(os.path.join(sitesDir, site, site+'-PHREEQC-Alk.csv'), parse_dates = True, index_col=0)
            df_ca = read_csv(os.path.join(sitesDir, site, site+'-PHREEQC-Ca.csv'), parse_dates = True, index_col=0)
            pwp_alk = pwp_to_mm_yr(calc_site_pwp(sitePanelDict[site], df_alk))
            pwp_ca = pwp_to_mm_yr(calc_site_pwp(sitePanelDict[site], df_ca))
            delta_alk = df.pwp - pwp_alk
            delta_ca = df.pwp - pwp_ca
            delta_upper = zeros(delta_ca.size)
            delta_lower = zeros(delta_ca.size)
            for i, delta in enumerate(delta_ca):
                if delta<0:
                    delta_upper[i] = abs(delta_ca[i])
                    delta_lower[i] = abs(delta_alk[i])
                elif delta>0:
                    delta_lower[i] = abs(delta_ca[i])
                    delta_upper[i] = abs(delta_alk[i])
            df['pwp_upper'] = delta_upper[Qposids.values]
            df['pwp_lower'] = delta_lower[Qposids.values]
            df['Alkalinity_balance_error'] = df_alk['Percent error']
            not_converged = df['Alkalinity_balance_error']>5.0
            df.pwp[not_converged]=nan
            df = df.dropna()
            df = df[df.Q>0] #USGS database has some negative values? -999999
            errorbar(df.Q, df.pwp, yerr=[df.pwp_upper, df.pwp_lower], fmt='o', color=this_color)

        tight_layout()
        savefig(os.path.join(plotsDir,site+'-Q_vs_PWP.pdf'))
        #Calculate correlation coefficient and regression
        slope,intercept,r,p,stderr = linregress(log10(df.Q), df.pwp)        
        rs.append(r)
        if isnan(r):
            return df
        ps.append(p)
        [this_spr, this_spp] = spearmanr(log10(df.Q), df.pwp)
        spr.append(this_spr)
        spp.append(this_spp)
        slopes.append(slope)
        if makeHistograms:
            figure()
            hist(df.pwp, normed=True, color=this_color)
            xlabel('PWP Rate mm/yr')
            ylabel('Frequency')
            savefig(os.path.join(plotsDir,site+'-PWPHist.pdf'))

    #Make histogram of pearson r values    
    figure()
    arr_rs = array(rs)
    arr_ps = array(ps)
    arr_spr = array(spr)
    arr_spp = array(spp)
    arr_site_class = array(site_class)
    goodids = logical_and(~isnan(arr_rs), ~isnan(arr_ps))
    arr_rs = arr_rs[goodids]
    arr_ps = arr_ps[goodids]
    arr_site_class = arr_site_class[goodids]
    if arr_rs[arr_site_class==1].shape[0]>1:
        arr1_rs_sig = arr_rs[logical_and(arr_site_class==1, arr_ps<0.05)]
        print("Class 1: number of sig ps = ",arr1_rs_sig.size,  "number insig = ", arr_rs[arr_site_class==1].size - arr1_rs_sig.size)       
        hist(arr1_rs_sig, nbins, color=class_colors[1], alpha=0.5)
    if arr_rs[arr_site_class==2].shape[0]>1:
        arr2_rs_sig = arr_rs[logical_and(arr_site_class==2, arr_ps<0.05)]
        print("Class 2: number of sig ps = ",arr2_rs_sig.size,  "number insig = ", arr_rs[arr_site_class==2].size - arr2_rs_sig.size)       
        hist(arr2_rs_sig, nbins, color=class_colors[2], alpha=0.5)
    if arr_rs[arr_site_class==3].shape[0]>1:
        arr3_rs_sig = arr_rs[logical_and(arr_site_class==3, arr_ps<0.05)]
        print("Class 3: number of sig ps = ",arr3_rs_sig.size,  "number insig = ", arr_rs[arr_site_class==3].size - arr3_rs_sig.size)       
        hist(arr3_rs_sig, nbins, color=class_colors[3], alpha=0.5)
    xlabel('Pearson R')
    ylabel('Frequency')
    savefig(os.path.join(plotsDir,'PearsonR_Q_PWP.pdf'))
    #Make histogram of pearson p values
    figure()
    if arr_ps[arr_site_class==1].shape[0]>1:
        hist(arr_ps[arr_site_class==1], nbins, color=class_colors[1], alpha=0.5)
    if arr_ps[arr_site_class==2].shape[0]>1:
        hist(arr_ps[arr_site_class==2], nbins, color=class_colors[2], alpha=0.5)
    if arr_ps[arr_site_class==3].shape[0]>1:
        hist(arr_ps[arr_site_class==3], nbins, color=class_colors[3], alpha=0.5)
    xlabel('Pearson p')
    ylabel('Frequency')
    savefig(os.path.join(plotsDir, 'PearsonP_Q_PWP.pdf'))

    #Make histogram of spearman r values
    arr_spr = array(spr)
    arr_spp = array(spp)
    arr_site_class = array(site_class)
    goodids = logical_and(~isnan(arr_spr), ~isnan(arr_spp))
    arr_spr = arr_spr[goodids]
    arr_spp = arr_spp[goodids]
    arr_site_class = arr_site_class[goodids]
    figure()
    if arr_spr[arr_site_class==1].shape[0]>1:
        arr1_spr_sig = arr_spr[logical_and(arr_site_class==1, arr_spp<0.05)]
        print("Class 1: number of sig ps = ",arr1_spr_sig.size,  "number insig = ", arr_spr[arr_site_class==1].size - arr1_spr_sig.size)       
        hist(arr1_spr_sig, nbins, color=class_colors[1], alpha=0.5)
    if arr_spr[arr_site_class==2].shape[0]>1:
        arr2_spr_sig = arr_spr[logical_and(arr_site_class==2, arr_spp<0.05)]
        print("Class 2: number of sig ps = ",arr2_spr_sig.size,  "number insig = ", arr_spr[arr_site_class==2].size - arr2_spr_sig.size)       
        hist(arr2_spr_sig, nbins, color=class_colors[2], alpha=0.5)
    if arr_spr[arr_site_class==3].shape[0]>1:
        arr3_spr_sig = arr_spr[logical_and(arr_site_class==3, arr_spp<0.05)]
        print("Class 3: number of sig ps = ",arr3_spr_sig.size,  "number insig = ", arr_spr[arr_site_class==3].size - arr3_spr_sig.size)       
        hist(arr3_spr_sig, nbins, color=class_colors[3], alpha=0.5)
    xlabel('Spearman R')
    ylabel('Frequency')
    savefig(os.path.join(plotsDir, 'SpearmanR_Q_PWP.pdf'))
    #Make histogram of spearman p values
    figure()
    if arr_spp[arr_site_class==1].shape[0]>1:
        hist(arr_spp[arr_site_class==1], nbins, color=class_colors[1], alpha=0.5)
    if arr_spp[arr_site_class==2].shape[0]>1:
        hist(arr_spp[arr_site_class==2], nbins, color=class_colors[2], alpha=0.5)
    if arr_spp[arr_site_class==3].shape[0]>1:
        hist(arr_spp[arr_site_class==3], nbins, color=class_colors[3], alpha=0.5)
    xlabel('Spearman p')
    ylabel('Frequency')
    savefig(os.path.join(plotsDir, 'SpearmanP_Q_PWP.pdf'))
Exemple #10
0
def make_pwp_vs_PCO2_plots(sitesDir, siteList=None, siteFile=None, makeHistograms=True, classFile='', bracket_charge_balance=False,plotloglog=False, nbins=10):
    sitePanelDict, sitePhreeqcDict = loadSiteListData(processedSitesDir=sitesDir, loadPhreeqc=True)
    if classFile != '':
        class_xls = read_excel(classFile, 'Sheet1',index_col=1, names=['name','site', 'recharge', 'age'])
    site_class = []
    rs =[]
    ps = []
    spp = []
    spr = []
    slopes= []
    plotsDir = os.path.join(sitesDir, 'plots/')
    #Check for plots directory and make it if one doesn't exist
    check_plots_dir(sitesDir)
    for site in list(sitePanelDict.keys()):
        if classFile !='':
            #read in classification for this site
            this_class = class_xls['recharge'][site]
            this_color=class_colors[this_class]
            site_class.append(this_class)
        else:
            this_color='black'
        print(("Making plot for: "+site))
        Q = sitePanelDict[site].data['Stream flow, mean. daily']
        pwp_rates,PCO2 = calc_site_pwp(sitePanelDict[site], sitePhreeqcDict[site], returnPCO2=True)
        pwp_rates = pwp_to_mm_yr(pwp_rates)
        df = DataFrame({'PCO2':PCO2, 'pwp':pwp_rates})
        df = df.dropna()
        #Make PWP vs. PCO2 Plot
        figure()
        if plotloglog:
            if bracket_charge_balance:
                loglog(df.PCO2, df.pwp, '.', ms=0, color=this_color)
            else:
                loglog(df.PCO2, df.pwp, '.', color=this_color)
        else:
            if bracket_charge_balance:
                semilogx(df.PCO2, df.pwp, '.', color=this_color, ms=0)
            else:
                semilogx(df.PCO2, df.pwp, '.', color=this_color)
        xlabel('PCO2 (atm)')
        ylabel('PWP Dissolution Rate (mm/yr)')
        if bracket_charge_balance:
            #Load charge bracket data
            df_alk = read_csv(os.path.join(sitesDir, site, site+'-PHREEQC-Alk.csv'), parse_dates = True, index_col=0)
            df_ca = read_csv(os.path.join(sitesDir, site, site+'-PHREEQC-Ca.csv'), parse_dates = True, index_col=0)
            pwp_alk = pwp_to_mm_yr(calc_site_pwp(sitePanelDict[site], df_alk))
            pwp_ca = pwp_to_mm_yr(calc_site_pwp(sitePanelDict[site], df_ca))
            delta_alk = df.pwp - pwp_alk
            delta_ca = df.pwp - pwp_ca
            delta_upper = zeros(delta_ca.size)
            delta_lower = zeros(delta_ca.size)
            for i, delta in enumerate(delta_ca):
                if delta<0:
                    delta_upper[i] = abs(delta_ca[i])
                    delta_lower[i] = abs(delta_alk[i])
                elif delta>0:
                    delta_lower[i] = abs(delta_ca[i])
                    delta_upper[i] = abs(delta_alk[i])
            df['pwp_upper'] = delta_upper
            df['pwp_lower'] = delta_lower
            df['Alkalinity_balance_error'] = df_alk['Percent error']
            not_converged = df['Alkalinity_balance_error']>5.0
            df.pwp[not_converged]=nan
            df = df.dropna()
            errorbar(df.PCO2, df.pwp, yerr=[df.pwp_upper, df.pwp_lower], fmt='o', color=this_color)

        savefig(os.path.join(plotsDir,site+'-PCO2_vs_PWP.pdf'))
Exemple #11
0
def make_pwp_vs_T_plots(sitesDir, siteList=None, siteFile=None, makeHistograms=True, classFile=''):
    sitePanelDict, sitePhreeqcDict = loadSiteListData(processedSitesDir=sitesDir, loadPhreeqc=True)
    if classFile != '':
        class_xls = read_excel(classFile, 'Sheet1',index_col=1, names=['name','site', 'recharge', 'age'])
    rs = []
    ps = []
    slopes = []
    plotsDir = os.path.join(sitesDir, 'plots/')
    for site in list(sitePanelDict.keys()):
        if classFile !='':
            #read in classification for this site
            this_class = class_xls['recharge'][site]
            this_color=class_colors[this_class]
        else:
            this_color='black'
        print(("Making plot for: "+site))
        #Read out data into shorter variable names
        Q = sitePanelDict[site].data['Stream flow, mean. daily']
        T_C = sitePanelDict[site].data['Temperature, water']
        CO2 = sitePhreeqcDict[site].CO2_Molality
        Ca = sitePhreeqcDict[site]['Ca']
        a_Ca = sitePhreeqcDict[site]['Ca+2_Activity']
        a_H2CO3s = sitePhreeqcDict[site]['CO2_Activity']
        a_HCO3 = sitePhreeqcDict[site]['HCO3-_Activity']
        a_H = sitePhreeqcDict[site]['H+_Activity']
        #Filter out nan values
        #good_values = ~(Q+T_C+CO2+Ca).isnull()#Addition will create Nans if any of the series contains a NaN
        good_values = get_good_indicies([Q,T_C,CO2,Ca,a_Ca,a_H2CO3s,a_H, a_HCO3])
        Q = Q[good_values]
        T_C = T_C[good_values]
        CO2 = CO2[good_values]
        Ca = Ca[good_values]
        a_Ca = a_Ca[good_values]
        a_H = a_H[good_values]
        a_H2CO3s = a_H2CO3s[good_values]
        a_HCO3 = a_HCO3[good_values]
        #Calculate PCO2
        T_K = CtoK(T_C)
        K_H = calc_K_H(T_K)
        PCO2 = CO2/K_H
        #Calculate PWP rates
        pwp_rates = []
        for i, value in enumerate(Q):
#            sol = solutionFromCaPCO2(Ca[i], PCO2[i], T_C = T_C[i])
#            this_pwp = pwpFromSolution(sol)
            this_pwp =  pwpRateTheory(a_Ca=a_Ca[i], a_H2CO3s=a_H2CO3s[i], a_H=a_H[i], a_HCO3=a_HCO3[i], T_K=T_K[i], PCO2=PCO2[i])
            this_rate_mm_yr = pwp_to_mm_yr(this_pwp)
            pwp_rates.append(this_rate_mm_yr)
        #Check for plots directory and make it if one doesn't exist
        check_plots_dir(sitesDir)
        #Make Discharge vs. Saturation Ratio Plot
        figure()
        plot(T_C, pwp_rates, 'o', color=this_color)
        xlabel('Temperature ($^\circ C$)')
        ylabel('PWP Dissolution Rate (mm/yr)')
        savefig(os.path.join(plotsDir,site+'-T_vs_PWP.pdf'))
        #Calculate correlation coefficient and regression
        slope,intercept,r,p,stderr = linregress(T_C, pwp_rates)
        rs.append(r)
        ps.append(p)
        slopes.append(slope)
        if makeHistograms:
            figure()
            hist(pwp_rates, normed=True, color=this_color)
            xlabel('PWP Rate mm/yr')
            ylabel('Frequency')
            savefig(os.path.join(plotsDir,site+'-PWPHist.pdf'))

    #Make histogram of pearson r values    
    figure()
    hist(rs,normed=True)
    xlabel('Pearson R')
    ylabel('Frequency')
    savefig(os.path.join(plotsDir,'PearsonR_T_PWP.pdf'))
Exemple #12
0
def make_pwp_vs_saturation_ratio_plots(sitesDir, siteList=None, siteFile=None,  classFile='', plotloglog=True):
    sitePanelDict, sitePhreeqcDict = loadSiteListData(processedSitesDir=sitesDir, loadPhreeqc=True)
    if classFile != '':
        class_xls = read_excel(classFile, 'Sheet1',index_col=1, names=['name','site', 'recharge', 'age'])
    site_class = []
    rs =[]
    ps = []
    spp = []
    spr = []
    slopes= []
    plotsDir = os.path.join(sitesDir, 'plots/')
    #Check for plots directory and make it if one doesn't exist
    check_plots_dir(sitesDir)
    for site in list(sitePanelDict.keys()):
        if classFile !='':
            #read in classification for this site
            this_class = class_xls['recharge'][site]
            this_color=class_colors[this_class]
            site_class.append(this_class)
        else:
            this_color='black'
        print(("Making plot for: "+site))
        Q = sitePanelDict[site].data['Stream flow, mean. daily']
        pwp_rates = calc_site_pwp(sitePanelDict[site], sitePhreeqcDict[site])
        pwp_rates = pwp_to_mm_yr(pwp_rates)
        T_C = sitePanelDict[site].data['Temperature, water']
        T_K = CtoK(T_C)
        K_H = calc_K_H(T_K)
        CO2 = sitePhreeqcDict[site].CO2_Molality
        PCO2 = CO2/K_H
        CaEq = concCaEqFromPCO2(PCO2, T_C=T_C)
        sat_ratio = sitePhreeqcDict[site].Ca/CaEq
        df = DataFrame({'Q':Q, 'pwp':pwp_rates, 'sat_ratio':sat_ratio})
        df = df.dropna()
        #Make PWP vs. Saturation Ratio Plot
        figure()
        if plotloglog:
            loglog(df.pwp, df.sat_ratio, '.', color=this_color)
        else:
            semilogx(df.pwp, df.sat_ratio, '.', color=this_color)
        xlabel('PWP Dissolution Rate (mm/yr)')
        ylabel('Saturation ratio')
        savefig(os.path.join(plotsDir,site+'-Sat_ratio_vs_PWP.pdf'))
        #Calculate correlation coefficient and regression
        slope,intercept,r,p,stderr = linregress(df.pwp, df.sat_ratio)        
        rs.append(r)
        ps.append(p)
        [this_spr, this_spp] = spearmanr(df.pwp, df.sat_ratio)
        spr.append(this_spr)
        spp.append(this_spp)
        slopes.append(slope)

    #Make histogram of pearson r values    
    figure()
    arr_rs = array(rs)
    print("size arr_rs=", arr_rs.size)
    arr_ps = array(ps)
    arr_spr = array(spr)
    arr_spp = array(spp)
    arr_site_class = array(site_class)
    hist(arr_rs[arr_site_class==1],color=class_colors[1], alpha=0.5)
    hist(arr_rs[arr_site_class==2],color=class_colors[2], alpha=0.5)
    hist(arr_rs[arr_site_class==3],color=class_colors[3], alpha=0.5)
    xlabel('Pearson R')
    ylabel('Frequency')
    savefig(os.path.join(plotsDir,'PearsonR_PWP_SatRatio.pdf'))
    #Make histogram of pearson p values
    figure()
    hist(arr_ps[arr_site_class==1],color=class_colors[1], alpha=0.5)
    hist(arr_ps[arr_site_class==2],color=class_colors[2], alpha=0.5)
    hist(arr_ps[arr_site_class==3],color=class_colors[3], alpha=0.5)
    xlabel('Pearson p')
    ylabel('Frequency')
    savefig(os.path.join(plotsDir, 'PearsonP_PWP_SatRatio.pdf'))
    #Make histogram of spearman r values
    figure()
    hist(arr_spr[arr_site_class==1],color=class_colors[1], alpha=0.5)
    hist(arr_spr[arr_site_class==2],color=class_colors[2], alpha=0.5)
    hist(arr_spr[arr_site_class==3],color=class_colors[3], alpha=0.5)
    xlabel('Spearman R')
    ylabel('Frequency')
    savefig(os.path.join(plotsDir, 'SpearmanR_PWP_SatRatio.pdf'))
    #Make histogram of spearman p values
    figure()
    hist(arr_spp[arr_site_class==1],color=class_colors[1], alpha=0.5)
    hist(arr_spp[arr_site_class==2],color=class_colors[2], alpha=0.5)
    hist(arr_spp[arr_site_class==3],color=class_colors[3], alpha=0.5)
    xlabel('Spearman p')
    ylabel('Frequency')
    savefig(os.path.join(plotsDir, 'SpearmanP_PWP_SatRatio.pdf'))
Exemple #13
0
def processSites(sitesDir,
                 PHREEQC_PATH,
                 DATABASE_FILE,
                 phreeqcDict=None,
                 regEx='USGS-*',
                 bracket_charge_balance=False,
                 process_regular=True):
    """
    Processes all data from site directories in PHREEQC.

    Parameters
    ----------
    sitesDir : str
       The directory that contains the site directories to be processed.

    PHREEQC_PATH : str
       The path to the phreeqc executable.

    DATABASE_FILE : str
       The path to the phreeqc database file to be used.

    phreeqcDict : dict
       a dictionary with WQX characteristics as keys and phreeqc chemical names as entries. By default, processPanel will use the built in translation dict, default_phreeqc_to_WQX_translation.

    regEx : str (optional)
       A regular expression to be used to locate site directories.  (default = 'USGS-')

    bracket_charge_balance : bool
       If set to True, then charge balance will be bracketed by forcing balance on Ca and Alkalinity alternately. Default = False.
    process_regular : bool
       If set to True, then PHREEQC will be run without any charge balance forcing. This can be set to False if the calculations without forced balance are already done and you only want to do the charge balance runs. Default = True.

    Returns
    -------
    None
    """
    sitesDict = loadSiteListData(regEx=regEx, processedSitesDir=sitesDir)
    if process_regular:
        #Run PHREEQC on sites without forced charge balance
        for site, site_panel in sitesDict.items():
            print(("Processing " + site + " in PHREEQC"))
            sitedf = processPanel(site_panel,
                                  os.path.join(sitesDir, site),
                                  PHREEQC_PATH=PHREEQC_PATH,
                                  DATABASE_FILE=DATABASE_FILE,
                                  phreeqcDict=phreeqcDict)
            phreeqc_site_file = os.path.join(sitesDir, site,
                                             site + '-PHREEQC.pkl')
            try:
                pickle.dump(sitedf, open(phreeqc_site_file, 'wb'))
                sitedf.to_csv(phreeqc_site_file[:-3] + 'csv')
            except IOError:
                print('Problem writing out PHREEQC data file.')
    if bracket_charge_balance:
        #Run PHREEQC using bracketed charge balance for sites
        for site, site_panel in sitesDict.items():
            #Force balance on Calcium
            phreeqc_df_ca = processPanel(site_panel,
                                         os.path.join(sitesDir, site),
                                         PHREEQC_PATH,
                                         DATABASE_FILE,
                                         force_balance='Ca')
            phreeqc_site_file_ca = os.path.join(sitesDir, site,
                                                site + '-PHREEQC-Ca.pkl')
            try:
                pickle.dump(phreeqc_df_ca, open(phreeqc_site_file_ca, 'wb'))
                phreeqc_df_ca.to_csv(phreeqc_site_file_ca[:-3] + 'csv')
            except IOError:
                print('Problem writing out PHREEQC Ca data file.')
            #Force balance on Alkalinity
            phreeqc_df_alk = processPanel(site_panel,
                                          os.path.join(sitesDir, site),
                                          PHREEQC_PATH,
                                          DATABASE_FILE,
                                          force_balance='Alk')
            phreeqc_site_file_alk = os.path.join(sitesDir, site,
                                                 site + '-PHREEQC-Alk.pkl')
            try:
                pickle.dump(phreeqc_df_alk, open(phreeqc_site_file_alk, 'wb'))
                phreeqc_df_alk.to_csv(phreeqc_site_file_alk[:-3] + 'csv')
            except IOError:
                print('Problem writing out PHREEQC Alk data file.')
Exemple #14
0
def make_pwp_vs_T_plots(sitesDir, siteList=None, siteFile=None, makeHistograms=True, classFile=''):
    sitePanelDict, sitePhreeqcDict = loadSiteListData(processedSitesDir=sitesDir, loadPhreeqc=True)
    if classFile != '':
        class_xls = read_excel(classFile, 'Sheet1',index_col=1, names=['name','site', 'recharge', 'age'])
    rs = []
    ps = []
    slopes = []
    plotsDir = os.path.join(sitesDir, 'plots/')
    for site in sitePanelDict.keys():
        if classFile !='':
            #read in classification for this site
            this_class = class_xls['recharge'][site]
            this_color=class_colors[this_class]
        else:
            this_color='black'
        print("Making plot for: "+site)
        #Read out data into shorter variable names
        Q = sitePanelDict[site].data['Stream flow, mean. daily']
        T_C = sitePanelDict[site].data['Temperature, water']
        CO2 = sitePhreeqcDict[site].CO2_Molality
        Ca = sitePhreeqcDict[site]['Ca']
        a_Ca = sitePhreeqcDict[site]['Ca+2_Activity']
        a_H2CO3s = sitePhreeqcDict[site]['CO2_Activity']
        a_HCO3 = sitePhreeqcDict[site]['HCO3-_Activity']
        a_H = sitePhreeqcDict[site]['H+_Activity']
        #Filter out nan values
        #good_values = ~(Q+T_C+CO2+Ca).isnull()#Addition will create Nans if any of the series contains a NaN
        good_values = get_good_indicies([Q,T_C,CO2,Ca,a_Ca,a_H2CO3s,a_H, a_HCO3])
        Q = Q[good_values]
        T_C = T_C[good_values]
        CO2 = CO2[good_values]
        Ca = Ca[good_values]
        a_Ca = a_Ca[good_values]
        a_H = a_H[good_values]
        a_H2CO3s = a_H2CO3s[good_values]
        a_HCO3 = a_HCO3[good_values]
        #Calculate PCO2
        T_K = CtoK(T_C)
        K_H = calc_K_H(T_K)
        PCO2 = CO2/K_H
        #Calculate PWP rates
        pwp_rates = []
        for i, value in enumerate(Q):
#            sol = solutionFromCaPCO2(Ca[i], PCO2[i], T_C = T_C[i])
#            this_pwp = pwpFromSolution(sol)
            this_pwp =  pwpRateTheory(a_Ca=a_Ca[i], a_H2CO3s=a_H2CO3s[i], a_H=a_H[i], a_HCO3=a_HCO3[i], T_K=T_K[i], PCO2=PCO2[i])
            this_rate_mm_yr = pwp_to_mm_yr(this_pwp)
            pwp_rates.append(this_rate_mm_yr)
        #Check for plots directory and make it if one doesn't exist
        check_plots_dir(sitesDir)
        #Make Discharge vs. Saturation Ratio Plot
        figure()
        plot(T_C, pwp_rates, 'o', color=this_color)
        xlabel('Temperature ($^\circ C$)')
        ylabel('PWP Dissolution Rate (mm/yr)')
        savefig(os.path.join(plotsDir,site+'-T_vs_PWP.pdf'))
        #Calculate correlation coefficient and regression
        slope,intercept,r,p,stderr = linregress(T_C, pwp_rates)
        rs.append(r)
        ps.append(p)
        slopes.append(slope)
        if makeHistograms:
            figure()
            hist(pwp_rates, normed=True, color=this_color)
            xlabel('PWP Rate mm/yr')
            ylabel('Frequency')
            savefig(os.path.join(plotsDir,site+'-PWPHist.pdf'))

    #Make histogram of pearson r values    
    figure()
    hist(rs,normed=True)
    xlabel('Pearson R')
    ylabel('Frequency')
    savefig(os.path.join(plotsDir,'PearsonR_T_PWP.pdf'))
Exemple #15
0
def make_pwp_vs_Q_plots(sitesDir, siteList=None, siteFile=None, makeHistograms=True, classFile='', bracket_charge_balance=False,plotloglog=False, nbins=10):
    sitePanelDict, sitePhreeqcDict = loadSiteListData(processedSitesDir=sitesDir, loadPhreeqc=True)
    if classFile != '':
        class_xls = read_excel(classFile, 'Sheet1',index_col=1, names=['name','site', 'recharge', 'age'])
    site_class = []
    rs =[]
    ps = []
    spp = []
    spr = []
    slopes= []
    plotsDir = os.path.join(sitesDir, 'plots/')
    #Check for plots directory and make it if one doesn't exist
    check_plots_dir(sitesDir)
    for site in sitePanelDict.keys():
        if classFile !='':
            #read in classification for this site
            this_class = class_xls['recharge'][site]
            this_color=class_colors[this_class]
            site_class.append(this_class)
        else:
            this_color='black'
        print("Making plot for: "+site)
        Q = sitePanelDict[site].data['Stream flow, mean. daily']
        pwp_rates = calc_site_pwp(sitePanelDict[site], sitePhreeqcDict[site])
        pwp_rates = pwp_to_mm_yr(pwp_rates)
        df = DataFrame({'Q':Q, 'pwp':pwp_rates})
        df = df.dropna()
        Qposids = df.Q>0
        df = df[Qposids]
        #Calculate fitting function parameters
        fit_converged = True
        if df.Q.values.size>5:
            try:
                opt_params, pcov = curve_fit(pwp_Q_fit, df['Q'], df['pwp'], p0=[1.,1.,1.])
                k = opt_params[0]
                a = opt_params[1]
                beta = opt_params[2]
            except RuntimeError, e:
                fit_converged = False
                print e
        else:
            fit_converged = False
        #Make Discharge vs. Saturation Ratio Plot
        figure()
        if plotloglog:
            if bracket_charge_balance:
                loglog(df.Q, df.pwp, '.', ms=0, color=this_color)
            else:
                loglog(df.Q, df.pwp, '.', color=this_color)
        else:
            if bracket_charge_balance:
                semilogx(df.Q, df.pwp, '.', color=this_color, ms=0)
            else:
                semilogx(df.Q, df.pwp, '.', color=this_color)
        #plot fitting function
        if fit_converged:
            Q_fit = linspace(df.Q.min(), df.Q.max(), 1000)
            pwp_fit = pwp_Q_fit(Q_fit, k, a, beta)
            plot(Q_fit, pwp_fit, '-k')
        xlabel('Discharge (cfs)')
        ylabel('PWP Dissolution Rate (mm/yr)')
        if bracket_charge_balance:
            #Load charge bracket data
            df_alk = read_csv(os.path.join(sitesDir, site, site+'-PHREEQC-Alk.csv'), parse_dates = True, index_col=0)
            df_ca = read_csv(os.path.join(sitesDir, site, site+'-PHREEQC-Ca.csv'), parse_dates = True, index_col=0)
            pwp_alk = pwp_to_mm_yr(calc_site_pwp(sitePanelDict[site], df_alk))
            pwp_ca = pwp_to_mm_yr(calc_site_pwp(sitePanelDict[site], df_ca))
            delta_alk = df.pwp - pwp_alk
            delta_ca = df.pwp - pwp_ca
            delta_upper = zeros(delta_ca.size)
            delta_lower = zeros(delta_ca.size)
            for i, delta in enumerate(delta_ca):
                if delta<0:
                    delta_upper[i] = abs(delta_ca[i])
                    delta_lower[i] = abs(delta_alk[i])
                elif delta>0:
                    delta_lower[i] = abs(delta_ca[i])
                    delta_upper[i] = abs(delta_alk[i])
            df['pwp_upper'] = delta_upper[Qposids.values]
            df['pwp_lower'] = delta_lower[Qposids.values]
            df['Alkalinity_balance_error'] = df_alk['Percent error']
            not_converged = df['Alkalinity_balance_error']>5.0
            df.pwp[not_converged]=nan
            df = df.dropna()
            df = df[df.Q>0] #USGS database has some negative values? -999999
            errorbar(df.Q, df.pwp, yerr=[df.pwp_upper, df.pwp_lower], fmt='o', color=this_color)

        tight_layout()
        savefig(os.path.join(plotsDir,site+'-Q_vs_PWP.pdf'))
        #Calculate correlation coefficient and regression
        slope,intercept,r,p,stderr = linregress(log10(df.Q), df.pwp)        
        rs.append(r)
        if isnan(r):
            return df
        ps.append(p)
        [this_spr, this_spp] = spearmanr(log10(df.Q), df.pwp)
        spr.append(this_spr)
        spp.append(this_spp)
        slopes.append(slope)
        if makeHistograms:
            figure()
            hist(df.pwp, normed=True, color=this_color)
            xlabel('PWP Rate mm/yr')
            ylabel('Frequency')
            savefig(os.path.join(plotsDir,site+'-PWPHist.pdf'))
Exemple #16
0
def make_pwp_vs_PCO2_plots(sitesDir, siteList=None, siteFile=None, makeHistograms=True, classFile='', bracket_charge_balance=False,plotloglog=False, nbins=10):
    sitePanelDict, sitePhreeqcDict = loadSiteListData(processedSitesDir=sitesDir, loadPhreeqc=True)
    if classFile != '':
        class_xls = read_excel(classFile, 'Sheet1',index_col=1, names=['name','site', 'recharge', 'age'])
    site_class = []
    rs =[]
    ps = []
    spp = []
    spr = []
    slopes= []
    plotsDir = os.path.join(sitesDir, 'plots/')
    #Check for plots directory and make it if one doesn't exist
    check_plots_dir(sitesDir)
    for site in sitePanelDict.keys():
        if classFile !='':
            #read in classification for this site
            this_class = class_xls['recharge'][site]
            this_color=class_colors[this_class]
            site_class.append(this_class)
        else:
            this_color='black'
        print("Making plot for: "+site)
        Q = sitePanelDict[site].data['Stream flow, mean. daily']
        pwp_rates,PCO2 = calc_site_pwp(sitePanelDict[site], sitePhreeqcDict[site], returnPCO2=True)
        pwp_rates = pwp_to_mm_yr(pwp_rates)
        df = DataFrame({'PCO2':PCO2, 'pwp':pwp_rates})
        df = df.dropna()
        #Make PWP vs. PCO2 Plot
        figure()
        if plotloglog:
            if bracket_charge_balance:
                loglog(df.PCO2, df.pwp, '.', ms=0, color=this_color)
            else:
                loglog(df.PCO2, df.pwp, '.', color=this_color)
        else:
            if bracket_charge_balance:
                semilogx(df.PCO2, df.pwp, '.', color=this_color, ms=0)
            else:
                semilogx(df.PCO2, df.pwp, '.', color=this_color)
        xlabel('PCO2 (atm)')
        ylabel('PWP Dissolution Rate (mm/yr)')
        if bracket_charge_balance:
            #Load charge bracket data
            df_alk = read_csv(os.path.join(sitesDir, site, site+'-PHREEQC-Alk.csv'), parse_dates = True, index_col=0)
            df_ca = read_csv(os.path.join(sitesDir, site, site+'-PHREEQC-Ca.csv'), parse_dates = True, index_col=0)
            pwp_alk = pwp_to_mm_yr(calc_site_pwp(sitePanelDict[site], df_alk))
            pwp_ca = pwp_to_mm_yr(calc_site_pwp(sitePanelDict[site], df_ca))
            delta_alk = df.pwp - pwp_alk
            delta_ca = df.pwp - pwp_ca
            delta_upper = zeros(delta_ca.size)
            delta_lower = zeros(delta_ca.size)
            for i, delta in enumerate(delta_ca):
                if delta<0:
                    delta_upper[i] = abs(delta_ca[i])
                    delta_lower[i] = abs(delta_alk[i])
                elif delta>0:
                    delta_lower[i] = abs(delta_ca[i])
                    delta_upper[i] = abs(delta_alk[i])
            df['pwp_upper'] = delta_upper
            df['pwp_lower'] = delta_lower
            df['Alkalinity_balance_error'] = df_alk['Percent error']
            not_converged = df['Alkalinity_balance_error']>5.0
            df.pwp[not_converged]=nan
            df = df.dropna()
            errorbar(df.PCO2, df.pwp, yerr=[df.pwp_upper, df.pwp_lower], fmt='o', color=this_color)

        savefig(os.path.join(plotsDir,site+'-PCO2_vs_PWP.pdf'))
Exemple #17
0
def processSites(sitesDir, PHREEQC_PATH, DATABASE_FILE, phreeqcDict=None, regEx='USGS-*', bracket_charge_balance=False, process_regular=True):
    """
    Processes all data from site directories in PHREEQC.

    Parameters
    ----------
    sitesDir : str
       The directory that contains the site directories to be processed.

    PHREEQC_PATH : str
       The path to the phreeqc executable.

    DATABASE_FILE : str
       The path to the phreeqc database file to be used.

    phreeqcDict : dict
       a dictionary with WQX characteristics as keys and phreeqc chemical names as entries. By default, processPanel will use the built in translation dict, default_phreeqc_to_WQX_translation.

    regEx : str (optional)
       A regular expression to be used to locate site directories.  (default = 'USGS-')

    bracket_charge_balance : bool
       If set to True, then charge balance will be bracketed by forcing balance on Ca and Alkalinity alternately. Default = False.
    process_regular : bool
       If set to True, then PHREEQC will be run without any charge balance forcing. This can be set to False if the calculations without forced balance are already done and you only want to do the charge balance runs. Default = True.

    Returns
    -------
    None
    """
    sitesDict = loadSiteListData(regEx=regEx, processedSitesDir = sitesDir)
    if process_regular:
        #Run PHREEQC on sites without forced charge balance
        for site, site_panel in sitesDict.iteritems():
            print("Processing "+site+" in PHREEQC")
            sitedf = processPanel(site_panel, os.path.join(sitesDir,site), PHREEQC_PATH=PHREEQC_PATH, DATABASE_FILE=DATABASE_FILE, phreeqcDict=phreeqcDict)
            phreeqc_site_file = os.path.join(sitesDir,site,site+'-PHREEQC.pkl')
            try:
                pickle.dump(sitedf, open(phreeqc_site_file, 'wb'))
                sitedf.to_csv(phreeqc_site_file[:-3]+'csv')
            except IOError:
                print('Problem writing out PHREEQC data file.')
    if bracket_charge_balance:
        #Run PHREEQC using bracketed charge balance for sites
        for site, site_panel in sitesDict.iteritems():               
            #Force balance on Calcium
            phreeqc_df_ca = processPanel(site_panel, os.path.join(sitesDir,site), PHREEQC_PATH, DATABASE_FILE, force_balance='Ca')               
            phreeqc_site_file_ca = os.path.join(sitesDir,site,site+'-PHREEQC-Ca.pkl')
            try:
                pickle.dump(phreeqc_df_ca, open(phreeqc_site_file_ca, 'wb'))
                phreeqc_df_ca.to_csv(phreeqc_site_file_ca[:-3]+'csv')
            except IOError:
                print('Problem writing out PHREEQC Ca data file.')               
            #Force balance on Alkalinity
            phreeqc_df_alk = processPanel(site_panel, os.path.join(sitesDir,site), PHREEQC_PATH, DATABASE_FILE, force_balance='Alk')               
            phreeqc_site_file_alk = os.path.join(sitesDir,site,site+'-PHREEQC-Alk.pkl')
            try:
                pickle.dump(phreeqc_df_alk, open(phreeqc_site_file_alk, 'wb'))
                phreeqc_df_alk.to_csv(phreeqc_site_file_alk[:-3]+'csv')
            except IOError:
                print('Problem writing out PHREEQC Alk data file.')                
Exemple #18
0
def make_pwp_vs_saturation_ratio_plots(sitesDir, siteList=None, siteFile=None,  classFile='', plotloglog=True):
    sitePanelDict, sitePhreeqcDict = loadSiteListData(processedSitesDir=sitesDir, loadPhreeqc=True)
    if classFile != '':
        class_xls = read_excel(classFile, 'Sheet1',index_col=1, names=['name','site', 'recharge', 'age'])
    site_class = []
    rs =[]
    ps = []
    spp = []
    spr = []
    slopes= []
    plotsDir = os.path.join(sitesDir, 'plots/')
    #Check for plots directory and make it if one doesn't exist
    check_plots_dir(sitesDir)
    for site in sitePanelDict.keys():
        if classFile !='':
            #read in classification for this site
            this_class = class_xls['recharge'][site]
            this_color=class_colors[this_class]
            site_class.append(this_class)
        else:
            this_color='black'
        print("Making plot for: "+site)
        Q = sitePanelDict[site].data['Stream flow, mean. daily']
        pwp_rates = calc_site_pwp(sitePanelDict[site], sitePhreeqcDict[site])
        pwp_rates = pwp_to_mm_yr(pwp_rates)
        T_C = sitePanelDict[site].data['Temperature, water']
        T_K = CtoK(T_C)
        K_H = calc_K_H(T_K)
        CO2 = sitePhreeqcDict[site].CO2_Molality
        PCO2 = CO2/K_H
        CaEq = concCaEqFromPCO2(PCO2, T_C=T_C)
        sat_ratio = sitePhreeqcDict[site].Ca/CaEq
        df = DataFrame({'Q':Q, 'pwp':pwp_rates, 'sat_ratio':sat_ratio})
        df = df.dropna()
        #Make PWP vs. Saturation Ratio Plot
        figure()
        if plotloglog:
            loglog(df.pwp, df.sat_ratio, '.', color=this_color)
        else:
            semilogx(df.pwp, df.sat_ratio, '.', color=this_color)
        xlabel('PWP Dissolution Rate (mm/yr)')
        ylabel('Saturation ratio')
        savefig(os.path.join(plotsDir,site+'-Sat_ratio_vs_PWP.pdf'))
        #Calculate correlation coefficient and regression
        slope,intercept,r,p,stderr = linregress(df.pwp, df.sat_ratio)        
        rs.append(r)
        ps.append(p)
        [this_spr, this_spp] = spearmanr(df.pwp, df.sat_ratio)
        spr.append(this_spr)
        spp.append(this_spp)
        slopes.append(slope)

    #Make histogram of pearson r values    
    figure()
    arr_rs = array(rs)
    print "size arr_rs=", arr_rs.size
    arr_ps = array(ps)
    arr_spr = array(spr)
    arr_spp = array(spp)
    arr_site_class = array(site_class)
    hist(arr_rs[arr_site_class==1],color=class_colors[1], alpha=0.5)
    hist(arr_rs[arr_site_class==2],color=class_colors[2], alpha=0.5)
    hist(arr_rs[arr_site_class==3],color=class_colors[3], alpha=0.5)
    xlabel('Pearson R')
    ylabel('Frequency')
    savefig(os.path.join(plotsDir,'PearsonR_PWP_SatRatio.pdf'))
    #Make histogram of pearson p values
    figure()
    hist(arr_ps[arr_site_class==1],color=class_colors[1], alpha=0.5)
    hist(arr_ps[arr_site_class==2],color=class_colors[2], alpha=0.5)
    hist(arr_ps[arr_site_class==3],color=class_colors[3], alpha=0.5)
    xlabel('Pearson p')
    ylabel('Frequency')
    savefig(os.path.join(plotsDir, 'PearsonP_PWP_SatRatio.pdf'))
    #Make histogram of spearman r values
    figure()
    hist(arr_spr[arr_site_class==1],color=class_colors[1], alpha=0.5)
    hist(arr_spr[arr_site_class==2],color=class_colors[2], alpha=0.5)
    hist(arr_spr[arr_site_class==3],color=class_colors[3], alpha=0.5)
    xlabel('Spearman R')
    ylabel('Frequency')
    savefig(os.path.join(plotsDir, 'SpearmanR_PWP_SatRatio.pdf'))
    #Make histogram of spearman p values
    figure()
    hist(arr_spp[arr_site_class==1],color=class_colors[1], alpha=0.5)
    hist(arr_spp[arr_site_class==2],color=class_colors[2], alpha=0.5)
    hist(arr_spp[arr_site_class==3],color=class_colors[3], alpha=0.5)
    xlabel('Spearman p')
    ylabel('Frequency')
    savefig(os.path.join(plotsDir, 'SpearmanP_PWP_SatRatio.pdf'))