def model_files(multi):
    """
    Computes respective metric and returns single model files and multi-model cube at different aggregations
    """
    #this is necessary to make multiprocessing an option
    variable = multi[0]
    scenario = multi[1]
    bc_and_resolution = multi[2]
    inpath = multi[3]
    outpath = multi[4]
    season = multi[5]
    metric = multi[6]
    region = multi[7]
    overwrite = multi[8]

    ###region box
    box = region[2]
    xmin = box[0]
    xmax = box[1]
    ymin = box[2]
    ymax = box[3]

    for sc, bc, seas, var in itertools.product(scenario, bc_and_resolution, season, variable):


        if metric == 'pet' and var == 'multivars':
            var = 'rsds'

        files_good, modelID = load_file_names(inpath, var, sc, bc)

        if files_good == []:
            print inpath, sc, bc, seas, var
            print 'No files found. Check your input directory!!!'
            continue
            #sys.exit('No files found. Check your input directory!!!')

        out = outpath + os.sep + bc

        calc_to_call = getattr(calc, metric) # calls the metric calc function from calc.py
        file_searcher = out + os.sep + str(metric) + '_' +str(var) + '_' + str(bc) + \
                        '_' + str(sc) + '_' + str(seas) +'_' + str(region[0])

        for file, nme in zip(files_good, modelID):

            cubeout=None
            print('Doing:', nme, metric, var)
            if metric == 'pet' and var == 'rsds':
                print(nme, 'in')
                # This is a different case because PET needs multiple variables, rather than one
                # NB: We use rsds, because generally, less models have this variable as opposed to tasmin or tasmax

                tasmin = atlas_utils.load_data(file.replace(var, 'tasmin'), xmin, xmax, ymin, ymax)
                tasmax = atlas_utils.load_data(file.replace(var, 'tasmax'), xmin, xmax, ymin, ymax)
                rsds = atlas_utils.load_data(file.replace(var, 'rsds'), xmin, xmax, ymin, ymax)
                cubeout = iris.cube.CubeList([tasmin, tasmax, rsds])
                file_searcher = file_searcher.replace('rsds', 'multivars')

                print cubeout

            nc_file = file_searcher + '_' + str(nme) + '_singleModel_tseries.nc'

            if not os.path.isfile(nc_file) or (overwrite == 'Yes'):
                print 'nc_file: ' + nc_file
                print 'Load file: '+ file

                if not cubeout:
                    print(nme, 'no cubeout yet, loading file')
                    print 'newcube'

                    cubeout = atlas_utils.load_data(file, xmin, xmax, ymin, ymax)
                    
                calc_to_call(cubeout, seas, nc_file)  # saves single model netcdf
                print '#######################################'
                print 'Saving data for: '
                print nme, metric, var, seas, region[0]
                print '#######################################'

        # runs big_cube for all available aggregations
        for agg in cnst.AGGREGATION:
            big_cube(file_searcher, agg)
def wfdei(multi):

    # this is necessary to make multiprocessing an option
    variable = multi[0]
    outpath =  multi[1]
    season =  multi[2]
    metric =  multi[3]
    region = multi[4]
    overwrite = multi[5]

    for seas, var in itertools.product(season, variable):

        bc = 'WFDEI'
        sc = 'historical'

        if metric == 'pet' and var == 'multivars':
            var = 'rsds'

        filepath = cnst.DATADIR + os.sep + bc + os.sep + str(var) + '_daily*.nc'
        file = glob.glob(filepath)

        if (len(file) != 1):
            print('No or too many WFDEI files found, path problem')
            return
        file = file[0]

        box = region[2]
        xmin = box[0]
        xmax = box[1]
        ymin = box[2]
        ymax = box[3]

        if metric == 'pet' and var == 'multivars':
            var = 'rsds'

        out = outpath + os.sep + bc

        calc_to_call = getattr(calc, metric)  # calls the metric calc function from calc.py
        file_searcher = out + os.sep + str(metric) + '_' + str(var) + '_' + str(bc) + \
                        '_' + str(sc) + '_' + str(seas) + '_' + str(region[0])

        cubeout = None

        # Check if we have any missing files for all aggregation types, if so, run the metric calculation again
        # Note: the calc functions run for 2 or 3 aggregation methods

        if metric == 'pet' and var == 'rsds':
            # This is a different case because PET needs multiple variables, rather than one
            # NB: We use rsds, because generally, less models have this variable as opposed to tasmin or tasmax
            tasmin = atlas_utils.load_data(file.replace(var, 'tasmin'), xmin, xmax, ymin, ymax)
            tasmax = atlas_utils.load_data(file.replace(var, 'tasmax'), xmin, xmax, ymin, ymax)
            rsds = atlas_utils.load_data(file.replace(var, 'rsds'), xmin, xmax, ymin, ymax)
            cubeout = iris.cube.CubeList([tasmin, tasmax, rsds])

            file_searcher = file_searcher.replace('rsds', 'multivars')

            print cubeout

        nc_file = file_searcher + '_WFDEI_tseries.nc'

        if not os.path.isfile(nc_file) or (overwrite == 'Yes'):
            print 'nc_file: ' + nc_file
            print 'Load file: ' + file

            if not cubeout:
                print 'newcube'
                cubeout = atlas_utils.load_data(file, xmin, xmax, ymin, ymax)

            calc_to_call(cubeout, seas, nc_file)  # saves single model netcdf
            print '#######################################'
            print 'Saving data for: '
            print metric, var, seas, region[0]
            print '#######################################'
import atlas_utils, calc, constants as cnst

#### We only need these seven strings to create clean output files.
# Please give the correct variable and scenario information, the rest is less important
metric = 'metricname'  # identifies the metric you're calculating
var = 'tas'  # the CMIP5 variable name
bc = 'dummy'  # we use this, you need to provide a random string (it's a bias correction flag)
sc = 'rcp45'  #  scenario, could form a loop from cnst.SCENARIO
seas = 'jas'  # season
reg = 'WestAfrica'  # regional flag
aggregation = cnst.AGGREGATION[0]

lonlatbox = [-18, 25, 4, 25]
cmip5_file = '/users/global/cornkle/CMIP/CMIP5_Africa/BC_mdlgrid/GFDL-CM3/rcp45/' + var + '_WFDEI_1979-2013_mdlgrid_day_GFDL-CM3_west-africa_rcp45_r1i1p1_full.nc'

outfilename = str(metric) + '_' +str(var) + '_' + str(bc) + \
                        '_' + str(sc) + '_' + str(seas) +'_' + str(reg) +'_singleModel_' + aggregation +'.nc'

outpath = '/users/global/cornkle/test/' + outfilename

cube = atlas_utils.load_data(cmip5_file, lonlatbox[0], lonlatbox[1],
                             lonlatbox[2], lonlatbox[3])

calc.annualHotDays(cube, 'jas', outpath)