def readDataPeriods(varnames, sliceq):
    ### Call function for 4d variable data
    lat, lon, lev, varfuture = MO.readExperiAll(varnames, 'Future', 'surface')
    lat, lon, lev, varpast = MO.readExperiAll(varnames, 'Current', 'surface')

    ### Select ensemble mean period
    if sliceq == 'Mean':
        varfuture = varfuture[:, :, :, :]
        varpast = varpast[:, :, :, :]
    elif sliceq == 'A':
        varfuture = varfuture[:100, :, :, :]
        varpast = varpast[:100, :, :, :]
    elif sliceq == 'B':
        varfuture = varfuture[100:200, :, :, :]
        varpast = varpast[100:200, :, :, :]
    elif sliceq == 'C':
        varfuture = varfuture[200:, :, :, :]
        varpast = varpast[200:, :, :, :]

    ### Create 2d array of latitude and longitude
    lon2, lat2 = np.meshgrid(lon, lat)

    ### Remove missing data
    varfuture[np.where(varfuture <= -1e10)] = np.nan
    varpast[np.where(varpast <= -1e10)] = np.nan

    ### Rearrange months (N,D,J,F,M,A)
    varfuturem = np.append(varfuture[:, -2:, :, :],
                           varfuture[:, :4, :, :],
                           axis=1)
    varpastm = np.append(varpast[:, -2:, :, :], varpast[:, :4, :, :], axis=1)

    ### Calculate anomalies
    anom = varfuturem - varpastm

    ### Calculate ensemble mean
    anomm = np.nanmean(anom, axis=0)
    pastm = np.nanmean(varpastm, axis=0)

    ### Calculate zonal mean
    anommz = np.nanmean(anomm, axis=2)
    climoz = np.nanmean(pastm, axis=2)

    ### Calculate significance for each month
    pvalue = np.empty((varpastm.shape[1], len(lat)))
    for i in range(varpastm.shape[1]):
        pvalue[i] = UT.calc_FDR_ttest(np.nanmean(varfuturem[:, i, :], axis=2),
                                      np.nanmean(varpastm[:, i, :], axis=2),
                                      0.05)

    return anommz, climoz, lat, lon, pvalue
def readDataPeriods(varnames, sliceq):
    ### Call function for 4d variable data
    lat, lon, lev, varfuture = MO.readExperiAll(varnames, 'SIT_Fu', 'surface')
    lat, lon, lev, varpast = MO.readExperiAll(varnames, 'SIT_Cu', 'surface')

    ### Select ensemble mean period
    if sliceq == 'Mean':
        varfuture = varfuture[:, :, :, :]
        varpast = varpast[:, :, :, :]
    elif sliceq == 'A':
        varfuture = varfuture[:100, :, :, :]
        varpast = varpast[:100, :, :, :]
    elif sliceq == 'B':
        varfuture = varfuture[100:200, :, :, :]
        varpast = varpast[100:200, :, :, :]
    elif sliceq == 'C':
        varfuture = varfuture[200:, :, :, :]
        varpast = varpast[200:, :, :, :]

    ### Create 2d array of latitude and longitude
    lon2, lat2 = np.meshgrid(lon, lat)

    ### Remove missing data
    varfuture[np.where(varfuture <= -1e10)] = np.nan
    varpast[np.where(varpast <= -1e10)] = np.nan

    ### Rearrange months (N,D,J,F,M,A)
    varfuturem = np.append(varfuture[:, -2:, :, :],
                           varfuture[:, :4, :, :],
                           axis=1)
    varpastm = np.append(varpast[:, -2:, :, :], varpast[:, :4, :, :], axis=1)

    ### Calculate anomalies
    anompi = varfuturem - varpastm

    ### Calculate ensemble mean
    anompim = np.nanmean(anompi, axis=0)
    zdiffruns = anompim

    ### Calculate climatologies
    zclimo = np.nanmean(varpastm, axis=0)

    ### Calculate significance for each month (pick method)
    pruns = UT.calc_FDR_ttest(varfuturem[:, :, :], varpastm[:, :, :],
                              0.05)  #FDR
    #    pruns = UT.calc_indttest(varfuturem[:,:,:],varpastm[:,:,:])[1] #ttest

    return zdiffruns, zclimo, pruns, lat, lon, lev
def readDataPeriods(varnames,simulations,period):
    ### Call function for 4d variable data
    lat,lon,lev,varfuture = MO.readExperiAll(varnames,simulations[0],'surface')
    lat,lon,lev,varpast = MO.readExperiAll(varnames,simulations[1],'surface')
    
    ### Create 2d array of latitude and longitude
    lon2,lat2 = np.meshgrid(lon,lat)
    
    ### Remove missing data [ensembles,months,lat,lon]
    varfuture[np.where(varfuture <= -1e10)] = np.nan
    varpast[np.where(varpast <= -1e10)] = np.nan
    
    ### Calculate over DJF
    if period == 'OND':
        print('Calculating over %s months!' % period)
        varfuturem = np.nanmean(varfuture[:,-3:,:,:],axis=1)
        varpastm = np.nanmean(varpast[:,-3:,:,:],axis=1)
    elif period == 'D':
        print('Calculating over %s months!' % period)
        varfuturem = np.nanmean(varfuture[:,-1:,:,:],axis=1)
        varpastm = np.nanmean(varpast[:,-1:,:,:],axis=1)
    elif period == 'DJF':
        print('Calculating over %s months!' % period)
        runs = [varfuture,varpast]
        var_mo = np.empty((2,varpast.shape[0]-1,varpast.shape[2],varpast.shape[3]))
        for i in range(len(runs)):
            var_mo[i,:,:,:] = UT.calcDecJanFeb(runs[i],runs[i],lat,lon,'surface',1) 
        varfuturem = var_mo[0]
        varpastm = var_mo[1]
    elif period == 'JFM':
        print('Calculating over %s months!' % period)
        varfuturem = np.nanmean(varfuture[:,0:3,:,:],axis=1)
        varpastm = np.nanmean(varpast[:,0:3,:,:],axis=1)
    elif period == 'JF':
        print('Calculating over %s months!' % period)
        varfuturem = np.nanmean(varfuture[:,0:2,:,:],axis=1)
        varpastm = np.nanmean(varpast[:,0:2,:,:],axis=1)
    elif period == 'FMA':
        print('Calculating over %s months!' % period)
        varfuturem = np.nanmean(varfuture[:,1:4,:,:],axis=1)
        varpastm = np.nanmean(varpast[:,1:4,:,:],axis=1)
    elif period == 'FM':
        print('Calculating over %s months!' % period)
        varfuturem = np.nanmean(varfuture[:,1:3,:,:],axis=1)
        varpastm = np.nanmean(varpast[:,1:3,:,:],axis=1)
    elif period == 'J':
        print('Calculating over %s months!' % period)
        varfuturem = np.nanmean(varfuture[:,0:1,:,:],axis=1)
        varpastm = np.nanmean(varpast[:,0:1,:,:],axis=1)
    elif period == 'F':
        print('Calculating over %s months!' % period)
        varfuturem = np.nanmean(varfuture[:,1:2,:,:],axis=1)
        varpastm = np.nanmean(varpast[:,1:2,:,:],axis=1)
    elif period == 'M':
        print('Calculating over %s months!' % period)
        varfuturem = np.nanmean(varfuture[:,2:3,:,:],axis=1)
        varpastm = np.nanmean(varpast[:,2:3,:,:],axis=1)
    else:
        print(ValueError('Selected wrong month period!'))
    
    ### Calculate anomalies
    anompi = varfuturem - varpastm
    
    ### Calculate ensemble mean
    anompim = np.nanmean(anompi,axis=0)
    zdiffruns = anompim
    
    ### Calculate climatologies
    zclimo = np.nanmean(varpastm,axis=0)
    
    ### Calculate significance for each month (pick method)
    pruns = UT.calc_FDR_ttest(varfuturem[:,:,:],varpastm[:,:,:],0.05) #FDR
#    pruns = UT.calc_indttest(varfuturem[:,:,:],varpastm[:,:,:])[1] #ttest
    
    return zdiffruns,zclimo,pruns,lat,lon,lev
示例#4
0
def readData(simuh, simuf, varnames, period):
    for v in range(len(varnames)):
        ### Call function for 4d variable data
        lat, lon, lev, varfuture = MO.readExperiAll('%s' % varnames[v], simuf,
                                                    'profile')
        lat, lon, lev, varpast = MO.readExperiAll('%s' % varnames[v], simuh,
                                                  'profile')

        ### Create 2d array of latitude and longitude
        lon2, lat2 = np.meshgrid(lon, lat)

        ### List of experiments
        runs = [varfuture, varpast]

        ### Separate per monthly periods
        if period == 'DJF':
            varmo = np.empty(
                (len(runs), varpast.shape[0] - 1, varpast.shape[2],
                 varpast.shape[3], varpast.shape[4]))
            for i in range(len(runs)):
                varmo[i] = UT.calcDecJanFeb(runs[i], runs[i], lat, lon,
                                            'profile', 17)
        elif period == 'DJFM':
            varmo = np.empty((len(runs), varpast.shape[0], varpast.shape[2],
                              varpast.shape[3], varpast.shape[4]))
            for i in range(len(runs)):
                varmo1 = runs[i][:, :3, :, :, :]
                varmo2 = runs[i][:, -1, :, :, :]
                varmo2 = np.expand_dims(varmo2, axis=1)
                varmoall = np.append(varmo1, varmo2, axis=1)
                varmo[i] = np.nanmean(varmoall, axis=1)
        elif period == 'JFM':
            varmo = np.empty((len(runs), varpast.shape[0], varpast.shape[2],
                              varpast.shape[3], varpast.shape[4]))
            for i in range(len(runs)):
                varmo[i] = np.nanmean(runs[i][:, :3, :, :, :], axis=1)
        elif period == 'JFMA':
            varmo = np.empty((len(runs), varpast.shape[0], varpast.shape[2],
                              varpast.shape[3], varpast.shape[4]))
            for i in range(len(runs)):
                varmo[i] = np.nanmean(runs[i][:, :4, :, :, :], axis=1)
        elif period == 'ND':
            varmo = np.empty((len(runs), varpast.shape[0], varpast.shape[2],
                              varpast.shape[3], varpast.shape[4]))
            for i in range(len(runs)):
                varmo[i] = np.nanmean(runs[i][:, -2:, :, :, :], axis=1)
        elif period == 'MA':
            varmo = np.empty((len(runs), varpast.shape[0], varpast.shape[2],
                              varpast.shape[3], varpast.shape[4]))
            for i in range(len(runs)):
                varmo[i] = np.nanmean(runs[i][:, 2:4, :, :, :], axis=1)
        else:
            ValueError('Wrong period selected! (DJF,JFM,JFMA,ND)')

        ### Remove missing data
        varmo[np.where(varmo < -1e10)] = np.nan

        ### Take total ensemble mean (300)
        meanens = np.nanmean(varmo, axis=1)

        ### Calculate climos
        climo = np.nanmean(meanens[1, :, :, :], axis=2)

        ### Calculate anomaly
        anom = np.nanmean(meanens[0, :, :, :] - meanens[1, :, :, :], axis=2)

        ### Calculate significance testing at 95% confidence level
        meanx = np.nanmean(varmo[0, :, :, :, :], axis=3)
        meany = np.nanmean(varmo[1, :, :, :, :], axis=3)
        pvalue = UT.calc_FDR_ttest(meanx, meany, 0.05)  #FDR

        pvalue[np.where(pvalue < 0.05)] = 1.
        pvalue[np.where(np.isnan(pvalue))] = 0.

        return anom, climo, pvalue, lev, lat
示例#5
0
def readData(simu, period, varia, level):
    ###############################################################################
    ###############################################################################
    ###############################################################################
    if simu == 'AA-2030':
        lat, lon, lev, future = NUDG.readExperi(varia, 'AA', '2030', level,
                                                'none')
        lat, lon, lev, historical = CONT.readControl(varia, level, 'none')
    elif simu == 'AA-2060':
        lat, lon, lev, future = NUDG.readExperi(varia, 'AA', '2060', level,
                                                'none')
        lat, lon, lev, historical = CONT.readControl(varia, level, 'none')
    elif simu == 'AA-2090':
        lat, lon, lev, future = NUDG.readExperi(varia, 'AA', '2090', level,
                                                'none')
        lat, lon, lev, historical = CONT.readControl(varia, level, 'none')
    ###############################################################################
    elif simu == 'coupled':
        lat, lon, lev, future = COUP.readCOUPs(varia, 'C_Fu', level)
        lat, lon, lev, historical = COUP.readCOUPs(varia, 'C_Pd', level)
    ###############################################################################
    elif simu == 'SIT':
        lat, lon, lev, future = THICK.readSIT(varia, 'SIT_Fu', level)
        lat, lon, lev, historical = THICK.readSIT(varia, 'SIT_Pd', level)
    ###############################################################################
    elif simu == 'SIC_Pd':
        lat, lon, lev, future = CONC.readSIC(varia, 'Fu', level)
        lat, lon, lev, historical = CONC.readSIC(varia, 'Pd', level)
    ###############################################################################
    elif simu == 'SIC_Pi':
        lat, lon, lev, future = CONC.readSIC(varia, 'Fu', level)
        lat, lon, lev, historical = CONC.readSIC(varia, 'Pi', level)
    ###############################################################################
    elif simu == 'E3SIT':
        lat, lon, lev, future = E3SIT.readE3SM_SIT(varia, 'ESIT_Fu', level)
        lat, lon, lev, historical = E3SIT.readE3SM_SIT(varia, 'ESIT_Pd', level)
    ###############################################################################
    elif simu == 'E3SIC_Pd':
        lat, lon, lev, future = E3SIC.readE3SM_SIC(varia, 'ESIC_Fu', level)
        lat, lon, lev, historical = E3SIC.readE3SM_SIC(varia, 'ESIC_Pd', level)
    elif simu == 'E3SIC_Pi':
        lat, lon, lev, future = E3SIC.readE3SM_SIC(varia, 'ESIC_Fu', level)
        lat, lon, lev, historical = E3SIC.readE3SM_SIC(varia, 'ESIC_Pi', level)
    ###############################################################################
    elif simu == 'OLD':
        lat, lon, lev, future = OLD.readOldIceExperi(varia, 'FICT', level)
        lat, lon, lev, historical = OLD.readOldIceExperi(varia, 'HIT', level)
    ###############################################################################
    ###############################################################################
    ###############################################################################
    ### Calculate number of ensembles
    nens = np.shape(historical)[0]

    ### Check for missing data [ensembles,months,lat,lon]
    future[np.where(future <= -1e10)] = np.nan
    historical[np.where(historical <= -1e10)] = np.nan

    ###############################################################################
    ###############################################################################
    ###############################################################################
    ### Calculate over period
    if period == 'OND':
        print('Calculating over %s months!' % period)
        futurem = np.nanmean(future[:, -3:], axis=1)
        historicalm = np.nanmean(historical[:, -3:], axis=1)
    elif period == 'D':
        print('Calculating over %s months!' % period)
        futurem = np.nanmean(future[:, -1:], axis=1)
        historicalm = np.nanmean(historical[:, -1:], axis=1)
    elif period == 'DJF':
        print('Calculating over %s months!' % period)
        runs = [future, historical]
        var_mo = np.empty((2, historical.shape[0] - 1, historical.shape[2],
                           historical.shape[3], historical.shape[4]))
        for i in range(len(runs)):
            var_mo[i, :, :, :, :] = UT.calcDecJanFeb(runs[i], runs[i], lat,
                                                     lon, level, 17)
        futurem = var_mo[0]
        historicalm = var_mo[1]
    elif period == 'JFM':
        print('Calculating over %s months!' % period)
        futurem = np.nanmean(future[:, 0:3], axis=1)
        historicalm = np.nanmean(historical[:, 0:3], axis=1)
    elif period == 'JF':
        print('Calculating over %s months!' % period)
        futurem = np.nanmean(future[:, 0:2], axis=1)
        historicalm = np.nanmean(historical[:, 0:2], axis=1)
    elif period == 'FMA':
        print('Calculating over %s months!' % period)
        futurem = np.nanmean(future[:, 1:4], axis=1)
        historicalm = np.nanmean(historical[:, 1:4], axis=1)
    elif period == 'FM':
        print('Calculating over %s months!' % period)
        futurem = np.nanmean(future[:, 1:3], axis=1)
        historicalm = np.nanmean(historical[:, 1:3], axis=1)
    elif period == 'J':
        print('Calculating over %s months!' % period)
        futurem = np.nanmean(future[:, 0:1], axis=1)
        historicalm = np.nanmean(historical[:, 0:1], axis=1)
    elif period == 'F':
        print('Calculating over %s months!' % period)
        futurem = np.nanmean(future[:, 1:2], axis=1)
        historicalm = np.nanmean(historical[:, 1:2], axis=1)
    elif period == 'M':
        print('Calculating over %s months!' % period)
        futurem = np.nanmean(future[:, 2:3], axis=1)
        historicalm = np.nanmean(historical[:, 2:3], axis=1)
    elif period == 'MA':
        print('Calculating over %s months!' % period)
        futurem = np.nanmean(future[:, 2:4], axis=1)
        historicalm = np.nanmean(historical[:, 2:4], axis=1)
    else:
        print(ValueError('Selected wrong month period!'))

    ###########################################################################
    ###########################################################################
    ###########################################################################
    ### Calculate zonal means
    futuremz = np.nanmean(futurem, axis=3)
    historicalmz = np.nanmean(historicalm, axis=3)

    ### Calculate anomalies [ens,level,lat]
    anom = futuremz - historicalmz

    ### Calculate ensemble mean
    anommean = np.nanmean(anom, axis=0)

    ### Calculate significance
    pruns = UT.calc_FDR_ttest(futuremz, historicalmz, 0.05)  #FDR

    ### Select climo
    climo = np.nanmean(historicalmz, axis=0)

    return lat, lon, lev, anommean, nens, pruns, climo
示例#6
0
def readData(simu,period,varia,level,latpolar,cps):
    ############################################################################### 
    ############################################################################### 
    ############################################################################### 
    if simu == 'AA-2030':
        lat,lon,lev,future = NUDG.readExperi(varia,'AA','2030',level,'none')
        lat,lon,lev,historical = CONT.readControl(varia,level,'none')
    elif simu == 'AA-2060':
        lat,lon,lev,future = NUDG.readExperi(varia,'AA','2060',level,'none')
        lat,lon,lev,historical = CONT.readControl(varia,level,'none')
    elif simu == 'AA-2090':
        lat,lon,lev,future = NUDG.readExperi(varia,'AA','2090',level,cps)
        lat,lon,lev,historical = CONT.readControl(varia,level,cps)
    ############################################################################### 
    elif simu == 'coupled':
        lat,lon,lev,future = COUP.readCOUPs(varia,'C_Fu',level)
        lat,lon,lev,historical = COUP.readCOUPs(varia,'C_Pd',level)        
    ###############################################################################        
    elif simu == 'SIT':
        lat,lon,lev,future = THICK.readSIT(varia,'SIT_Fu',level)
        lat,lon,lev,historical = THICK.readSIT(varia,'SIT_Pd',level)
    ############################################################################### 
    elif simu == 'SIC':
        lat,lon,lev,future = CONC.readSIC(varia,'Fu',level)
        lat,lon,lev,historical = CONC.readSIC(varia,'Pd',level)
    ############################################################################### 
    ############################################################################### 
    ############################################################################### 
    ### Calculate number of ensembles
    nens = np.shape(historical)[0]

    ### Check for missing data [ensembles,months,lat,lon]
    future[np.where(future <= -1e10)] = np.nan
    historical[np.where(historical <= -1e10)] = np.nan
    
    ############################################################################### 
    ############################################################################### 
    ############################################################################### 
    ### Calculate over period
    if period == 'OND':
        print('Calculating over %s months!' % period)
        futurem = np.nanmean(future[:,-3:],axis=1)
        historicalm = np.nanmean(historical[:,-3:],axis=1)
    elif period == 'D':
        print('Calculating over %s months!' % period)
        futurem = np.nanmean(future[:,-1:],axis=1)
        historicalm = np.nanmean(historical[:,-1:],axis=1)
    elif period == 'DJF':
        print('Calculating over %s months!' % period)
        runs = [future,historical]
        var_mo = np.empty((2,historical.shape[0]-1,historical.shape[2],historical.shape[3],historical.shape[4]))
        for i in range(len(runs)):
            var_mo[i,:,:,:,:] = UT.calcDecJanFeb(runs[i],runs[i],lat,lon,level,17) 
        futurem = var_mo[0]
        historicalm = var_mo[1]
    elif period == 'JFM':
        print('Calculating over %s months!' % period)
        futurem = np.nanmean(future[:,0:3],axis=1)
        historicalm = np.nanmean(historical[:,0:3],axis=1)
    elif period == 'JF':
        print('Calculating over %s months!' % period)
        futurem = np.nanmean(future[:,0:2],axis=1)
        historicalm = np.nanmean(historical[:,0:2],axis=1)
    elif period == 'FMA':
        print('Calculating over %s months!' % period)
        futurem = np.nanmean(future[:,1:4],axis=1)
        historicalm = np.nanmean(historical[:,1:4],axis=1)
    elif period == 'FM':
        print('Calculating over %s months!' % period)
        futurem = np.nanmean(future[:,1:3],axis=1)
        historicalm = np.nanmean(historical[:,1:3],axis=1)
    elif period == 'J':
        print('Calculating over %s months!' % period)
        futurem = np.nanmean(future[:,0:1],axis=1)
        historicalm = np.nanmean(historical[:,0:1],axis=1)
    elif period == 'F':
        print('Calculating over %s months!' % period)
        futurem = np.nanmean(future[:,1:2],axis=1)
        historicalm = np.nanmean(historical[:,1:2],axis=1)
    elif period == 'M':
        print('Calculating over %s months!' % period)
        futurem = np.nanmean(future[:,2:3],axis=1)
        historicalm = np.nanmean(historical[:,2:3],axis=1)
    elif period == 'MA':
        print('Calculating over %s months!' % period)
        futurem = np.nanmean(future[:,2:4],axis=1)
        historicalm = np.nanmean(historical[:,2:4],axis=1)
    elif period == 'annual':
        print('Calculating over %s months!' % period)
        futurem = np.nanmean(future,axis=1)
        historicalm = np.nanmean(historical,axis=1)
    elif period == 'NONE':
        print('Calculating over %s months!' % period)
        futurem = future
        historicalm = historical
    elif period == 'timemonth':
        print('Calculating over O,N,D,J,F,M months!')
        futurem = np.append(future[:,-3:,:,:,:],future[:,:3,:,:,:],axis=1)
        historicalm = np.append(historical[:,-3:,:,:,:],historical[:,:3,:,:,:],axis=1)
    else:
        print(ValueError('Selected wrong month period!'))

    ###########################################################################
    ###########################################################################
    ###########################################################################
    ### Calculate polar cap
    lon2,lat2 = np.meshgrid(lon,lat)
    
    ### Calculate SHI
    latq = np.where((lat >= latpolar))[0]
    lat2p = lat2[latq,:]
        
    futurep = futurem[:,:,:,latq,:]
    futuremz = UT.calc_weightedAve(futurep,lat2p)
    
    historicalp = historicalm[:,:,:,latq,:]
    historicalmz = UT.calc_weightedAve(historicalp,lat2p)
    
    ### Calculate anomalies [ens,level,lat]
    anom = futuremz - historicalmz

    ### Calculate ensemble mean
    anommean = np.nanmean(anom,axis=0)
    
    ### Calculate significance
    pruns = UT.calc_FDR_ttest(futuremz,historicalmz,0.05) #FDR
    
    ### Select climo
    climo = np.nanmean(historicalmz,axis=0)
    
    return lat,lon,lev,anommean,nens,pruns,climo
示例#7
0
 ### Composite over selected period (x2)
 if monthlychoice == 'DJF':
     years = np.arange(meandata.shape[0]) + 1921
 else:
     years = np.arange(meandata.shape[0]) + 1920
     
 length = years.shape[0]//2
 historical = meandata[:length,:,:]
 future = meandata[length:,:,:]
 
 ### Average over composites for plotting
 historicalm = np.nanmean(historical,axis=0)
 futurem = np.nanmean(future,axis=0)
 
 ### Calculate significance
 pruns = UT.calc_FDR_ttest(future[:,:,:],historical[:,:,:],0.05) #FDR
 
 ###########################################################################
 ###########################################################################
 ###########################################################################
 ### Begin plots!!!
 fig = plt.figure()
 
 ### Select graphing preliminaries
 if rm_ensemble_mean == True:
     if variq[i] == 'T2M':
         label = r'\textbf{T2M [$\bf{^{\circ}}$C]}'
         cmap = cm.cubehelix3_16_r.mpl_colormap 
     elif variq[i] == 'SLP':
         label = r'\textbf{SLP [hPa]}'
         cmap = cm.cubehelix3_16_r.mpl_colormap 
示例#8
0
    varpolr = np.nanmean(varr, axis=3)

###############################################################################
###############################################################################
###############################################################################
### Calculate reanalysis epochs
oldthicke = np.nanmean(varpole[:epochq], axis=0)  # 1979-1993
newthicke = np.nanmean(varpole[-epochq:], axis=0)  # 2005-2019
diffe = newthicke - oldthicke

oldthickr = np.nanmean(varpolr[:epochq], axis=0)  # 1979-1993
newthickr = np.nanmean(varpolr[-epochq:], axis=0)  # 2005-2019
diffr = newthickr - oldthickr

### Significance testing
prunse = UT.calc_FDR_ttest(varpole[:epochq], varpole[-epochq:], 0.1)
prunsr = UT.calc_FDR_ttest(varpolr[:epochq], varpolr[-epochq:], 0.1)

############################################################################
############################################################################
############################################################################
##### Plot temperature profile
plt.rc('text', usetex=True)
plt.rc('font', **{'family': 'sans-serif', 'sans-serif': ['Avant Garde']})

fig = plt.figure()
ax1 = plt.subplot(121)

### Set limits for contours and colorbars
limit = np.arange(-120, 121, 10)
barlim = np.arange(-120, 121, 60)
def readDataPeriods(typesimu, varnames, simulations, period):
    ### Call function for 4d variable data
    if typesimu == 'arc_sea_ice':
        lat, lon, lev, varfuture = MO.readExperiAll(varnames, simulations[0],
                                                    'zonmean')
        lat, lon, lev, varpast = MO.readExperiAll(varnames, simulations[1],
                                                  'zonmean')
    elif typesimu == 'sst':
        lat, lon, lev, varfuture = MOS.readExperiAll(varnames, simulations[0],
                                                     'zonmean')
        lat, lon, lev, varpast = MOS.readExperiAll(varnames, simulations[1],
                                                   'zonmean')
    elif typesimu == 'ant_sea_ice':
        lat, lon, lev, varfuture = MOA.readExperiAll(varnames, simulations[0],
                                                     'zonmean')
        lat, lon, lev, varpast = MOA.readExperiAll(varnames, simulations[1],
                                                   'zonmean')

    ### Create 2d array of latitude and longitude
    lon2, lat2 = np.meshgrid(lon, lat)

    ### Remove missing data [ensembles,months,lat,lon]
    varfuture[np.where(varfuture <= -1e10)] = np.nan
    varpast[np.where(varpast <= -1e10)] = np.nan

    ### Calculate over DJF
    if period == 'JJA':
        print('Calculating over %s months!' % period)
        varfuturem = np.nanmean(varfuture[:, 5:8, :, :], axis=1)
        varpastm = np.nanmean(varpast[:, 5:8:, :, :], axis=1)
    elif period == 'JAS':
        print('Calculating over %s months!' % period)
        varfuturem = np.nanmean(varfuture[:, 6:9, :, :], axis=1)
        varpastm = np.nanmean(varpast[:, 6:9:, :, :], axis=1)
    elif period == 'July':
        print('Calculating over %s months!' % period)
        varfuturem = np.nanmean(varfuture[:, 6:7, :, :], axis=1)
        varpastm = np.nanmean(varpast[:, 6:7:, :, :], axis=1)
    elif period == 'August':
        print('Calculating over %s months!' % period)
        varfuturem = np.nanmean(varfuture[:, 7:8, :, :], axis=1)
        varpastm = np.nanmean(varpast[:, 7:8:, :, :], axis=1)
    elif period == 'JA':
        print('Calculating over %s months!' % period)
        varfuturem = np.nanmean(varfuture[:, 6:8, :, :], axis=1)
        varpastm = np.nanmean(varpast[:, 6:8:, :, :], axis=1)
    elif period == 'S':
        print('Calculating over %s months!' % period)
        varfuturem = np.nanmean(varfuture[:, 8:9, :, :], axis=1)
        varpastm = np.nanmean(varpast[:, 8:9:, :, :], axis=1)
    elif period == 'AMJ':
        print('Calculating over %s months!' % period)
        varfuturem = np.nanmean(varfuture[:, 3:6, :, :], axis=1)
        varpastm = np.nanmean(varpast[:, 3:6:, :, :], axis=1)
    elif period == 'OND':
        print('Calculating over %s months!' % period)
        varfuturem = np.nanmean(varfuture[:, -3:, :, :], axis=1)
        varpastm = np.nanmean(varpast[:, -3:, :, :], axis=1)
    elif period == 'JFM':
        print('Calculating over %s months!' % period)
        varfuturem = np.nanmean(varfuture[:, 0:3, :, :], axis=1)
        varpastm = np.nanmean(varpast[:, 0:3, :, :], axis=1)
    elif period == 'JF':
        print('Calculating over %s months!' % period)
        varfuturem = np.nanmean(varfuture[:, 0:2, :, :], axis=1)
        varpastm = np.nanmean(varpast[:, 0:2, :, :], axis=1)
    elif period == 'FMA':
        print('Calculating over %s months!' % period)
        varfuturem = np.nanmean(varfuture[:, 1:4, :, :], axis=1)
        varpastm = np.nanmean(varpast[:, 1:4, :, :], axis=1)
    elif period == 'FM':
        print('Calculating over %s months!' % period)
        varfuturem = np.nanmean(varfuture[:, 1:3, :, :], axis=1)
        varpastm = np.nanmean(varpast[:, 1:3, :, :], axis=1)
    elif period == 'J':
        print('Calculating over %s months!' % period)
        varfuturem = np.nanmean(varfuture[:, 0:1, :, :], axis=1)
        varpastm = np.nanmean(varpast[:, 0:1, :, :], axis=1)
    elif period == 'F':
        print('Calculating over %s months!' % period)
        varfuturem = np.nanmean(varfuture[:, 1:2, :, :], axis=1)
        varpastm = np.nanmean(varpast[:, 1:2, :, :], axis=1)
    elif period == 'M':
        print('Calculating over %s months!' % period)
        varfuturem = np.nanmean(varfuture[:, 2:3, :, :], axis=1)
        varpastm = np.nanmean(varpast[:, 2:3, :, :], axis=1)
    elif period == 'Annual':
        print('Calculating over %s months!' % period)
        varfuturem = np.nanmean(varfuture[:, :, :, :], axis=1)
        varpastm = np.nanmean(varpast[:, :, :, :], axis=1)
    else:
        print(ValueError('Selected wrong month period!'))

    ### Calculate anomalies and ensemble means
    varfutureq = varfuturem.copy()
    varpastq = varpastm.copy()
    anommean = np.nanmean(varfutureq, axis=0) - np.nanmean(varpastq, axis=0)

    ### Calculate climatologies
    climo = np.nanmean(varpastq, axis=0)

    ### Calculate significance for each month (pick method)
    pruns = UT.calc_FDR_ttest(varfuturem[:, :, :], varpastm[:, :, :],
                              0.05)  #FDR

    return anommean, climo, pruns, lat, lev
示例#10
0
def readData(simu, period, vari, level, cps):
    if any([vari == 'T700', vari == 'T500']):
        varia = 'TEMP'
        level = 'profile'
    elif vari == 'U700':
        varia = 'U'
        level = 'profile'
    elif any([vari == 'V925', vari == 'V700', vari == 'V1000']):
        varia = 'V'
        level = 'profile'
    else:
        varia = vari
    ###############################################################################
    ###############################################################################
    ###############################################################################
    if simu == 'AA-2030':
        lat, lon, lev, future = NUDG.readExperi(varia, 'AA', '2030', level,
                                                'none')
        lat, lon, lev, historical = CONT.readControl(varia, level, 'none')
    elif simu == 'AA-2060':
        lat, lon, lev, future = NUDG.readExperi(varia, 'AA', '2060', level,
                                                'none')
        lat, lon, lev, historical = CONT.readControl(varia, level, 'none')
    elif simu == 'AA-2090':
        lat, lon, lev, future = NUDG.readExperi(varia, 'AA', '2090', level,
                                                'none')
        lat, lon, lev, historical = CONT.readControl(varia, level, 'none')
    ###############################################################################
    elif simu == 'coupled_Pd':
        lat, lon, lev, future = COUP.readCOUPs(varia, 'C_Fu', level)
        lat, lon, lev, historical = COUP.readCOUPs(varia, 'C_Pd', level)
    ###############################################################################
    elif simu == 'coupled_Pi':
        lat, lon, lev, future = COUP.readCOUPs(varia, 'C_Fu', level)
        lat, lon, lev, historical = COUP.readCOUPs(varia, 'C_Pi', level)
    ###############################################################################
    elif simu == 'SIT':
        lat, lon, lev, future = THICK.readSIT(varia, 'SIT_Fu', level)
        lat, lon, lev, historical = THICK.readSIT(varia, 'SIT_Pd', level)
    ###############################################################################
    elif simu == 'SIC_Pd':
        lat, lon, lev, future = CONC.readSIC(varia, 'Fu', level)
        lat, lon, lev, historical = CONC.readSIC(varia, 'Pd', level)
    ###############################################################################
    elif simu == 'SIC_Pi':
        lat, lon, lev, future = CONC.readSIC(varia, 'Fu', level)
        lat, lon, lev, historical = CONC.readSIC(varia, 'Pi', level)
    ###############################################################################
    elif simu == 'E3SIT':
        lat, lon, lev, future = E3SIT.readE3SM_SIT(varia, 'ESIT_Fu', level)
        lat, lon, lev, historical = E3SIT.readE3SM_SIT(varia, 'ESIT_Pd', level)
    ###############################################################################
    elif simu == 'E3SIC_Pd':
        lat, lon, lev, future = E3SIC.readE3SM_SIC(varia, 'ESIC_Fu', level)
        lat, lon, lev, historical = E3SIC.readE3SM_SIC(varia, 'ESIC_Pd', level)
    elif simu == 'E3SIC_Pi':
        lat, lon, lev, future = E3SIC.readE3SM_SIC(varia, 'ESIC_Fu', level)
        lat, lon, lev, historical = E3SIC.readE3SM_SIC(varia, 'ESIC_Pi', level)
    ###############################################################################
    elif simu == 'OLD':
        lat, lon, lev, future = OLD.readOldIceExperi(varia, 'FICT', level)
        lat, lon, lev, historical = OLD.readOldIceExperi(varia, 'HIT', level)
    ###############################################################################
    elif simu == 'LONG':
        lat, lon, lev, future = LC.readLong(varia, 'Long_Fu', level)
        lat, lon, lev, historical = LC.readLong(varia, 'Long_Pd', level)
    ###############################################################################
    ###############################################################################
    ###############################################################################
    ### Calculate number of ensembles
    nens = np.shape(historical)[0]

    ### Check for 4D field
    if vari == 'T700':
        levq = np.where(lev == 700)[0]
        future = future[:, :, levq, :, :].squeeze()
        historical = historical[:, :, levq, :, :].squeeze()
    elif vari == 'T500':
        levq = np.where(lev == 500)[0]
        future = future[:, :, levq, :, :].squeeze()
        historical = historical[:, :, levq, :, :].squeeze()
    elif vari == 'U700':
        levq = np.where(lev == 700)[0]
        future = future[:, :, levq, :, :].squeeze()
        historical = historical[:, :, levq, :, :].squeeze()
    elif vari == 'V925':
        levq = np.where(lev == 925)[0]
        future = future[:, :, levq, :, :].squeeze()
        historical = historical[:, :, levq, :, :].squeeze()
    elif vari == 'V700':
        levq = np.where(lev == 700)[0]
        future = future[:, :, levq, :, :].squeeze()
        historical = historical[:, :, levq, :, :].squeeze()
    elif vari == 'V1000':
        levq = np.where(lev == 1000)[0]
        future = future[:, :, levq, :, :].squeeze()
        historical = historical[:, :, levq, :, :].squeeze()

    ### Check for missing data [ensembles,months,lat,lon]
    future[np.where(future <= -1e10)] = np.nan
    historical[np.where(historical <= -1e10)] = np.nan

    ###############################################################################
    ###############################################################################
    ###############################################################################
    ### Calculate over period
    if period == 'OND':
        print('Calculating over %s months!' % period)
        futurem = np.nanmean(future[:, -3:, :, :], axis=1)
        historicalm = np.nanmean(historical[:, -3:, :, :], axis=1)
    elif period == 'D':
        print('Calculating over %s months!' % period)
        futurem = np.nanmean(future[:, -1:, :, :], axis=1)
        historicalm = np.nanmean(historical[:, -1:, :, :], axis=1)
    elif period == 'DJF':
        print('Calculating over %s months!' % period)
        runs = [future, historical]
        var_mo = np.empty((2, historical.shape[0] - 1, historical.shape[2],
                           historical.shape[3]))
        for i in range(len(runs)):
            var_mo[i, :, :, :] = UT.calcDecJanFeb(runs[i], runs[i], lat, lon,
                                                  'surface', 1)
        futurem = var_mo[0]
        historicalm = var_mo[1]
    elif period == 'JFM':
        print('Calculating over %s months!' % period)
        futurem = np.nanmean(future[:, 0:3, :, :], axis=1)
        historicalm = np.nanmean(historical[:, 0:3, :, :], axis=1)
    elif period == 'JF':
        print('Calculating over %s months!' % period)
        futurem = np.nanmean(future[:, 0:2, :, :], axis=1)
        historicalm = np.nanmean(historical[:, 0:2, :, :], axis=1)
    elif period == 'FMA':
        print('Calculating over %s months!' % period)
        futurem = np.nanmean(future[:, 1:4, :, :], axis=1)
        historicalm = np.nanmean(historical[:, 1:4, :, :], axis=1)
    elif period == 'FM':
        print('Calculating over %s months!' % period)
        futurem = np.nanmean(future[:, 1:3, :, :], axis=1)
        historicalm = np.nanmean(historical[:, 1:3, :, :], axis=1)
    elif period == 'J':
        print('Calculating over %s months!' % period)
        futurem = np.nanmean(future[:, 0:1, :, :], axis=1)
        historicalm = np.nanmean(historical[:, 0:1, :, :], axis=1)
    elif period == 'F':
        print('Calculating over %s months!' % period)
        futurem = np.nanmean(future[:, 1:2, :, :], axis=1)
        historicalm = np.nanmean(historical[:, 1:2, :, :], axis=1)
    elif period == 'M':
        print('Calculating over %s months!' % period)
        futurem = np.nanmean(future[:, 2:3, :, :], axis=1)
        historicalm = np.nanmean(historical[:, 2:3, :, :], axis=1)
    elif period == 'MA':
        print('Calculating over %s months!' % period)
        futurem = np.nanmean(future[:, 2:4, :, :], axis=1)
        historicalm = np.nanmean(historical[:, 2:4, :, :], axis=1)
    elif period == 'JJA':
        print('Calculating over %s months!' % period)
        futurem = np.nanmean(future[:, 5:8, :, :], axis=1)
        historicalm = np.nanmean(historical[:, 5:8, :, :], axis=1)
    else:
        print(ValueError('Selected wrong month period!'))

    ###############################################################################
    ###############################################################################
    ###############################################################################
    ### Calculate anomalies
    anom = futurem - historicalm

    ### Calculate ensemble mean
    anommean = np.nanmean(anom, axis=0)

    ### Calculate significance
    pruns = UT.calc_FDR_ttest(futurem[:, :, :], historicalm[:, :, :],
                              0.05)  #FDR

    ### Select climo
    climo = np.nanmean(historicalm, axis=0)

    return lat, lon, lev, anommean, nens, pruns, climo
    meanAz = np.nanmean(meanA[:, :, :], axis=2)
    meanBz = np.nanmean(meanB[:, :, :], axis=2)
    meanCz = np.nanmean(meanC[:, :, :], axis=2)

    ### Calculate significance testing at 95% confidence level
    meanx = np.nanmean(varmo[0, :, :, :, :], axis=3)
    meany = np.nanmean(varmo[1, :, :, :, :], axis=3)
    Ax = np.nanmean(varmo[0, :100, :, :, :], axis=3)
    Ay = np.nanmean(varmo[1, :100, :, :, :], axis=3)
    Bx = np.nanmean(varmo[0, 100:200, :, :, :], axis=3)
    By = np.nanmean(varmo[1, 100:200, :, :, :], axis=3)
    Cx = np.nanmean(varmo[0, 200:, :, :, :], axis=3)
    Cy = np.nanmean(varmo[1, 200:, :, :, :], axis=3)

    if FDRmeth == True:
        pvalue_mean = UT.calc_FDR_ttest(meanx, meany, 0.05)  #FDR
        pvalue_A = UT.calc_FDR_ttest(Ax, Ay, 0.05)  #FDR
        pvalue_B = UT.calc_FDR_ttest(Bx, By, 0.05)  #FDR
        pvalue_C = UT.calc_FDR_ttest(Cx, Cy, 0.05)  #FDR

        ### Mask variables by their adjusted p-values
        pvalue_mean[np.where(pvalue_mean < 0.05)] = 1.
        pvalue_mean[np.where(np.isnan(pvalue_mean))] = 0.

        ### Mask variables by their adjusted p-values
        pvalue_A[np.where(pvalue_A < 0.05)] = 1.
        pvalue_A[np.where(np.isnan(pvalue_A))] = 0.

        ### Mask variables by their adjusted p-values
        pvalue_B[np.where(pvalue_B < 0.05)] = 1.
        pvalue_B[np.where(np.isnan(pvalue_B))] = 0.
示例#12
0
def readDataPeriods(varnames, sliceq):
    ### Call function for 4d variable data
    lat, lon, lev, varfuture = MO.readExperiAll(varnames, 'Future', 'surface')
    lat, lon, lev, varpast = MO.readExperiAll(varnames, 'Current', 'surface')

    ### Rearrange months (N,D,J,F,M,A)
    varfuture = np.append(varfuture[:, -2:, :, :],
                          varfuture[:, :4, :, :],
                          axis=1)
    varpast = np.append(varpast[:, -2:, :, :], varpast[:, :4, :, :], axis=1)

    ### Remove missing data
    varfuture[np.where(varfuture <= -1e10)] = np.nan
    varpast[np.where(varpast <= -1e10)] = np.nan

    ### Select ensemble mean period
    if sliceq == 'Mean':
        varfutures = varfuture[:, :, :, :]
        varpasts = varpast[:, :, :, :]
        zclimo = np.nanmean(varpasts, axis=0)
    elif sliceq == 'A':
        varfutures = varfuture[:100, :, :, :]
        varpasts = varpast[:100, :, :, :]
        zclimo = np.nanmean(varpasts, axis=0)
    elif sliceq == 'B':
        varfutures = varfuture[100:200, :, :, :]
        varpasts = varpast[100:200, :, :, :]
        zclimo = np.nanmean(varpasts, axis=0)
    elif sliceq == 'C':
        varfutures = varfuture[200:, :, :, :]
        varpasts = varpast[200:, :, :, :]
        zclimo = np.nanmean(varpasts, axis=0)

    ### Create 2d array of latitude and longitude
    lon2, lat2 = np.meshgrid(lon, lat)

    ### Calculate ensemble mean
    varfuturem = varfuture[:, :, :, :]
    varpastm = varpast[:, :, :, :]
    anommean = varfuturem - varpastm
    anommeanmean = np.nanmean(anommean, axis=0)

    ### Calculate sliced differences
    anomslice = varfutures - varpasts
    anomslicemean = np.nanmean(anomslice, axis=0)

    ### Calculate difference from total ensemble mean (300)
    diffs = anomslicemean - anommeanmean

    if sliceq == 'Mean':
        ### Calculate significance for each month (FDR method!)
        pvalue_past = np.empty((varpastm.shape[1], len(lat), len(lon)))
        for i in range(varpastm.shape[1]):
            pvalue_past[i] = UT.calc_FDR_ttest(varfuturem[:, i, :, :],
                                               varpastm[:, i, :, :], 0.05)
    else:
        ### Calculate significance for each month
        stat_past = np.empty((varpastm.shape[1], len(lat), len(lon)))
        pvalue_past = np.empty((varpastm.shape[1], len(lat), len(lon)))
        for i in range(varpastm.shape[1]):
            stat_past[i], pvalue_past[i] = UT.calc_indttest(
                anommean[:, i, :, :], anomslice[:, i, :, :])

    pruns = pvalue_past

    return anommeanmean, diffs, zclimo, pruns, lat, lon, lev
示例#13
0
def readData(simu, period, vari, level, latpolar):
    if vari == 'U700':
        varia = 'U'
        level = 'profile'
    else:
        varia = vari

    ###############################################################################
    ###############################################################################
    ###############################################################################
    if simu == 'AA-2030':
        lat, lon, lev, future = NUDG.readExperi(varia, 'AA', '2030', level,
                                                'none')
        lat, lon, lev, historical = CONT.readControl(varia, level, 'none')
    elif simu == 'AA-2060':
        lat, lon, lev, future = NUDG.readExperi(varia, 'AA', '2060', level,
                                                'none')
        lat, lon, lev, historical = CONT.readControl(varia, level, 'none')
    elif simu == 'AA-2090':
        lat, lon, lev, future = NUDG.readExperi(varia, 'AA', '2090', level,
                                                'none')
        lat, lon, lev, historical = CONT.readControl(varia, level, 'none')
    ###############################################################################
    elif simu == 'coupled_Pd':
        lat, lon, lev, future = COUP.readCOUPs(varia, 'C_Fu', level)
        lat, lon, lev, historical = COUP.readCOUPs(varia, 'C_Pd', level)
    ###############################################################################
    elif simu == 'coupled_Pi':
        lat, lon, lev, future = COUP.readCOUPs(varia, 'C_Fu', level)
        lat, lon, lev, historical = COUP.readCOUPs(varia, 'C_Pi', level)
    ###############################################################################
    elif simu == 'SIT':
        lat, lon, lev, future = THICK.readSIT(varia, 'SIT_Fu', level)
        lat, lon, lev, historical = THICK.readSIT(varia, 'SIT_Pd', level)
    ###############################################################################
    elif simu == 'SIC_Pd':
        lat, lon, lev, future = CONC.readSIC(varia, 'Fu', level)
        lat, lon, lev, historical = CONC.readSIC(varia, 'Pd', level)
    ###############################################################################
    elif simu == 'SIC_Pi':
        lat, lon, lev, future = CONC.readSIC(varia, 'Fu', level)
        lat, lon, lev, historical = CONC.readSIC(varia, 'Pi', level)
    ###############################################################################
    elif simu == 'E3SIT':
        lat, lon, lev, future = E3SIT.readE3SM_SIT(varia, 'ESIT_Fu', level)
        lat, lon, lev, historical = E3SIT.readE3SM_SIT(varia, 'ESIT_Pd', level)
    ###############################################################################
    elif simu == 'E3SIC_Pd':
        lat, lon, lev, future = E3SIC.readE3SM_SIC(varia, 'ESIC_Fu', level)
        lat, lon, lev, historical = E3SIC.readE3SM_SIC(varia, 'ESIC_Pd', level)
    elif simu == 'E3SIC_Pi':
        lat, lon, lev, future = E3SIC.readE3SM_SIC(varia, 'ESIC_Fu', level)
        lat, lon, lev, historical = E3SIC.readE3SM_SIC(varia, 'ESIC_Pi', level)
    ###############################################################################
    elif simu == 'OLD':
        lat, lon, lev, future = OLD.readOldIceExperi(varia, 'FICT', level)
        lat, lon, lev, historical = OLD.readOldIceExperi(varia, 'HIT', level)
    ###############################################################################
    elif simu == 'LONG':
        lat, lon, lev, future = LC.readLong(varia, 'Long_Fu', level)
        lat, lon, lev, historical = LC.readLong(varia, 'Long_Pd', level)
    ###############################################################################
    ###############################################################################
    ###############################################################################
    ### Calculate number of ensembles
    nens = np.shape(historical)[0]

    ### Check for 4D field
    if vari == 'T700':
        levq = np.where(lev == 700)[0]
        future = future[:, :, levq, :, :].squeeze()
        historical = historical[:, :, levq, :, :].squeeze()
    elif vari == 'T500':
        levq = np.where(lev == 500)[0]
        future = future[:, :, levq, :, :].squeeze()
        historical = historical[:, :, levq, :, :].squeeze()
    elif vari == 'U700':
        levq = np.where(lev == 700)[0]
        future = future[:, :, levq, :, :].squeeze()
        historical = historical[:, :, levq, :, :].squeeze()

    ### Check for missing data [ensembles,months,lat,lon]
    future[np.where(future <= -1e10)] = np.nan
    historical[np.where(historical <= -1e10)] = np.nan

    ###############################################################################
    ###############################################################################
    ###############################################################################
    ### Calculate over period
    if period == 'OND':
        print('Calculating over %s months!' % period)
        futurem = np.nanmean(future[:, -3:], axis=1)
        historicalm = np.nanmean(historical[:, -3:], axis=1)
    elif period == 'D':
        print('Calculating over %s months!' % period)
        futurem = np.nanmean(future[:, -1:], axis=1)
        historicalm = np.nanmean(historical[:, -1:], axis=1)
    elif period == 'DJF':
        print('Calculating over %s months!' % period)
        runs = [future, historical]
        var_mo = np.empty((2, historical.shape[0] - 1, historical.shape[2],
                           historical.shape[3], historical.shape[4]))
        for i in range(len(runs)):
            var_mo[i, :, :, :, :] = UT.calcDecJanFeb(runs[i], runs[i], lat,
                                                     lon, level, 17)
        futurem = var_mo[0]
        historicalm = var_mo[1]
    elif period == 'JFM':
        print('Calculating over %s months!' % period)
        futurem = np.nanmean(future[:, 0:3], axis=1)
        historicalm = np.nanmean(historical[:, 0:3], axis=1)
    elif period == 'JF':
        print('Calculating over %s months!' % period)
        futurem = np.nanmean(future[:, 0:2], axis=1)
        historicalm = np.nanmean(historical[:, 0:2], axis=1)
    elif period == 'FMA':
        print('Calculating over %s months!' % period)
        futurem = np.nanmean(future[:, 1:4], axis=1)
        historicalm = np.nanmean(historical[:, 1:4], axis=1)
    elif period == 'FM':
        print('Calculating over %s months!' % period)
        futurem = np.nanmean(future[:, 1:3], axis=1)
        historicalm = np.nanmean(historical[:, 1:3], axis=1)
    elif period == 'J':
        print('Calculating over %s months!' % period)
        futurem = np.nanmean(future[:, 0:1], axis=1)
        historicalm = np.nanmean(historical[:, 0:1], axis=1)
    elif period == 'F':
        print('Calculating over %s months!' % period)
        futurem = np.nanmean(future[:, 1:2], axis=1)
        historicalm = np.nanmean(historical[:, 1:2], axis=1)
    elif period == 'M':
        print('Calculating over %s months!' % period)
        futurem = np.nanmean(future[:, 2:3], axis=1)
        historicalm = np.nanmean(historical[:, 2:3], axis=1)
    elif period == 'MA':
        print('Calculating over %s months!' % period)
        futurem = np.nanmean(future[:, 2:4], axis=1)
        historicalm = np.nanmean(historical[:, 2:4], axis=1)
    elif period == 'annual':
        print('Calculating over %s months!' % period)
        futurem = np.nanmean(future, axis=1)
        historicalm = np.nanmean(historical, axis=1)
    elif period == 'NONE':
        print('Calculating over %s months!' % period)
        futurem = future
        historicalm = historical
    elif period == 'timemonth':
        print('Calculating over O,N,D,J,F,M months!')
        futurem = np.append(future[:, -3:, :, :], future[:, :3, :, :], axis=1)
        historicalm = np.append(historical[:, -3:, :, :],
                                historical[:, :3, :, :],
                                axis=1)
    else:
        print(ValueError('Selected wrong month period!'))

    ###########################################################################
    ###########################################################################
    ###########################################################################
    ### Calculate polar cap
    lon2, lat2 = np.meshgrid(lon, lat)

    ### Calculate zonal means
    futuremz = np.nanmean(futurem, axis=3)
    historicalmz = np.nanmean(historicalm, axis=3)

    ### Calculate anomalies [ens,level,lat]
    anom = futuremz - historicalmz

    ### Calculate ensemble mean
    anommean = np.nanmean(anom, axis=0)

    ### Calculate significance
    pruns = UT.calc_FDR_ttest(futuremz, historicalmz, 0.05)  #FDR

    ### Select climo
    climo = np.nanmean(historicalmz, axis=0)

    return lat, lon, lev, anommean, nens, pruns, climo
def readData(simu,period,vari,level):
    if any([vari=='T700',vari=='T500']):
        varia = 'TEMP'
        level = 'profile'
    elif vari == 'U700':
        varia = 'U'
        level = 'profile'
    elif any([vari=='V925',vari=='V700',vari=='V1000']):
        varia = 'V'
        level = 'profile'
    else:
        varia = vari
    ############################################################################### 
    ############################################################################### 
    ############################################################################### 
    lat,lon,lev,future = COUP.readCOUPs(varia,'C_Fu',level,simu)
    lat,lon,lev,historical = COUP.readCOUPs(varia,'C_Pd',level,simu)        

    ############################################################################### 
    ############################################################################### 
    ############################################################################### 
    ### Calculate number of ensembles
    nens = np.shape(historical)[0]
    
    ### Check for 4D field
    if vari == 'T700':
        levq = np.where(lev == 700)[0]
        future = future[:,:,levq,:,:].squeeze()
        historical = historical[:,:,levq,:,:].squeeze()
    elif vari == 'T500':
        levq = np.where(lev == 500)[0]
        future = future[:,:,levq,:,:].squeeze()
        historical = historical[:,:,levq,:,:].squeeze()
    elif vari == 'U700':
        levq = np.where(lev == 700)[0]
        future = future[:,:,levq,:,:].squeeze()
        historical = historical[:,:,levq,:,:].squeeze()
    elif vari == 'V925':
        levq = np.where(lev == 925)[0]
        future = future[:,:,levq,:,:].squeeze()
        historical = historical[:,:,levq,:,:].squeeze()
    elif vari == 'V700':
        levq = np.where(lev == 700)[0]
        future = future[:,:,levq,:,:].squeeze()
        historical = historical[:,:,levq,:,:].squeeze()
    elif vari == 'V1000':
        levq = np.where(lev == 1000)[0]
        future = future[:,:,levq,:,:].squeeze()
        historical = historical[:,:,levq,:,:].squeeze()

    ### Check for missing data [ensembles,months,lat,lon]
    future[np.where(future <= -1e10)] = np.nan
    historical[np.where(historical <= -1e10)] = np.nan
    
    ############################################################################### 
    ############################################################################### 
    ############################################################################### 
    ### Calculate over period
    if period == 'OND':
        print('Calculating over %s months!' % period)
        futurem = np.nanmean(future[:,-3:,:,:],axis=1)
        historicalm = np.nanmean(historical[:,-3:,:,:],axis=1)
    elif period == 'D':
        print('Calculating over %s months!' % period)
        futurem = np.nanmean(future[:,-1:,:,:],axis=1)
        historicalm = np.nanmean(historical[:,-1:,:,:],axis=1)
    elif period == 'DJF':
        print('Calculating over %s months!' % period)
        runs = [future,historical]
        var_mo = np.empty((2,historical.shape[0]-1,historical.shape[2],historical.shape[3]))
        for i in range(len(runs)):
            var_mo[i,:,:,:] = UT.calcDecJanFeb(runs[i],runs[i],lat,lon,'surface',1) 
        futurem = var_mo[0]
        historicalm = var_mo[1]
    elif period == 'JFM':
        print('Calculating over %s months!' % period)
        futurem = np.nanmean(future[:,0:3,:,:],axis=1)
        historicalm = np.nanmean(historical[:,0:3,:,:],axis=1)
    elif period == 'JF':
        print('Calculating over %s months!' % period)
        futurem = np.nanmean(future[:,0:2,:,:],axis=1)
        historicalm = np.nanmean(historical[:,0:2,:,:],axis=1)
    elif period == 'FMA':
        print('Calculating over %s months!' % period)
        futurem = np.nanmean(future[:,1:4,:,:],axis=1)
        historicalm = np.nanmean(historical[:,1:4,:,:],axis=1)
    elif period == 'FM':
        print('Calculating over %s months!' % period)
        futurem = np.nanmean(future[:,1:3,:,:],axis=1)
        historicalm = np.nanmean(historical[:,1:3,:,:],axis=1)
    elif period == 'J':
        print('Calculating over %s months!' % period)
        futurem = np.nanmean(future[:,0:1,:,:],axis=1)
        historicalm = np.nanmean(historical[:,0:1,:,:],axis=1)
    elif period == 'F':
        print('Calculating over %s months!' % period)
        futurem = np.nanmean(future[:,1:2,:,:],axis=1)
        historicalm = np.nanmean(historical[:,1:2,:,:],axis=1)
    elif period == 'M':
        print('Calculating over %s months!' % period)
        futurem = np.nanmean(future[:,2:3,:,:],axis=1)
        historicalm = np.nanmean(historical[:,2:3,:,:],axis=1)
    elif period == 'MA':
        print('Calculating over %s months!' % period)
        futurem = np.nanmean(future[:,2:4,:,:],axis=1)
        historicalm = np.nanmean(historical[:,2:4,:,:],axis=1)
    else:
        print(ValueError('Selected wrong month period!'))

    ############################################################################### 
    ############################################################################### 
    ############################################################################### 
    ### Calculate anomalies
    anom = futurem - historicalm
    
    ### Calculate ensemble mean
    anommean = np.nanmean(anom,axis=0)
    
    ### Calculate significance
    pruns = UT.calc_FDR_ttest(futurem[:,:,:],historicalm[:,:,:],0.05) #FDR
    
    ### Select climo
    climo = np.nanmean(historicalm,axis=0)
    
    return lat,lon,lev,anommean,nens,pruns,climo
def readDataPeriods(varnames, sliceq):
    ### Call function for 4d variable data
    lat, lon, lev, varfuture = MO.readExperiAll(varnames, 'Future', 'surface')
    lat, lon, lev, varpast = MO.readExperiAll(varnames, 'Past', 'surface')

    ### Select ensemble mean period
    if sliceq == 'Mean':
        varfuture = varfuture[:, :, :, :]
        varpast = varpast[:, :, :, :]
    elif sliceq == 'A':
        varfuture = varfuture[:100, :, :, :]
        varpast = varpast[:100, :, :, :]
    elif sliceq == 'B':
        varfuture = varfuture[100:200, :, :, :]
        varpast = varpast[100:200, :, :, :]
    elif sliceq == 'C':
        varfuture = varfuture[200:, :, :, :]
        varpast = varpast[200:, :, :, :]

    ### Create 2d array of latitude and longitude
    lon2, lat2 = np.meshgrid(lon, lat)

    ### Remove missing data
    varfuture[np.where(varfuture <= -1e10)] = np.nan
    varpast[np.where(varpast <= -1e10)] = np.nan

    ### Rearrange months (N,D,J,F,M,A)
    varfuturem = np.append(varfuture[:, -2:, :, :],
                           varfuture[:, :4, :, :],
                           axis=1)
    varpastm = np.append(varpast[:, -2:, :, :], varpast[:, :4, :, :], axis=1)

    ### Calculate over region
    lonq1 = np.where((lon >= 0) & (lon <= 120))[0]
    lonq2 = np.where((lon > 120) & (lon <= 240))[0]
    lonq3 = np.where((lon > 240) & (lon <= 360))[0]

    varfuturem1 = varfuturem[:, :, :, lonq1]
    varfuturem2 = varfuturem[:, :, :, lonq2]
    varfuturem3 = varfuturem[:, :, :, lonq3]
    varpastm1 = varpastm[:, :, :, lonq1]
    varpastm2 = varpastm[:, :, :, lonq2]
    varpastm3 = varpastm[:, :, :, lonq3]

    ### Calculate anomalies
    anom1 = varfuturem1 - varpastm1
    anom2 = varfuturem2 - varpastm2
    anom3 = varfuturem3 - varpastm3

    ### Calculate ensemble mean
    anomm1 = np.nanmean(anom1, axis=0)
    pastm1 = np.nanmean(varpastm1, axis=0)
    anomm2 = np.nanmean(anom2, axis=0)
    pastm2 = np.nanmean(varpastm2, axis=0)
    anomm3 = np.nanmean(anom3, axis=0)
    pastm3 = np.nanmean(varpastm3, axis=0)

    ### Calculate zonal mean
    anommz1 = np.nanmean(anomm1, axis=2)
    climoz1 = np.nanmean(pastm1, axis=2)
    anommz2 = np.nanmean(anomm2, axis=2)
    climoz2 = np.nanmean(pastm2, axis=2)
    anommz3 = np.nanmean(anomm3, axis=2)
    climoz3 = np.nanmean(pastm3, axis=2)

    ### Calculate significance for each month using FDR
    pvalue1 = np.empty((varpastm1.shape[1], len(lat)))
    for i in range(varpastm1.shape[1]):
        pvalue1[i] = UT.calc_FDR_ttest(
            np.nanmean(varfuturem1[:, i, :, :], axis=2),
            np.nanmean(varpastm1[:, i, :, :], axis=2), 0.05)
    pvalue2 = np.empty((varpastm2.shape[1], len(lat)))
    for i in range(varpastm2.shape[1]):
        pvalue2[i] = UT.calc_FDR_ttest(
            np.nanmean(varfuturem2[:, i, :, :], axis=2),
            np.nanmean(varpastm2[:, i, :, :], axis=2), 0.05)
    pvalue3 = np.empty((varpastm3.shape[1], len(lat)))
    for i in range(varpastm3.shape[1]):
        pvalue3[i] = UT.calc_FDR_ttest(
            np.nanmean(varfuturem3[:, i, :, :], axis=2),
            np.nanmean(varpastm3[:, i, :, :], axis=2), 0.05)

    return lat, lon, anommz1, anommz2, anommz3, climoz1, climoz2, climoz3, pvalue1, pvalue2, pvalue3