Exemple #1
0
def main():
    # Testing stuff
    g = GDF(opendap=True)
    # g.debug = True
    # pprint(g.storage_config['LS5TM'])
    # pprint(dict(g.storage_config['LS5TM']['dimensions']))
    # pprint(dict(g.storage_config['LS5TM']['measurement_types']))
    # pprint(g.storage_config['LS8OLI'])
    # pprint(dict(g.storage_config['LS8OLI']['dimensions']))
    # pprint(dict(g.storage_config['LS8OLI']['measurement_types']))

    data_request_descriptor = {
        "storage_type": "LS5TM",
        "variables": ("B30",),
        "dimensions": {
            "X": {"range": (147.968, 148.032)},
            "Y": {"range": (-36.032, -35.968)},
            "T": {"range": (1262304000.0, 1325375999.999999)},  # 2010-01-01 00:00:00.0 - 2011-12-31 23:59:59.999999
        },
    }
    t0 = datetime.now()
    print "Starting 256 x 256 single-band cross-boundary descriptor at ", t0
    d = g.get_descriptor(data_request_descriptor)
    t1 = datetime.now()
    print "Finishing 256 x 256 cross-boundary descriptor at %s (Elapsed time %s)" % (t1, t1 - t0)
    pprint(d)

    t0 = datetime.now()
    print "Starting 256 x 256 single-band cross-boundary selection at ", t0
    a = g.get_data(data_request_descriptor)
    t1 = datetime.now()
    print "Finishing 256 x 256 cross-boundary selection at %s (Elapsed time %s)" % (t1, t1 - t0)
    pprint(a)
Exemple #2
0
def main():
    # Testing stuff
    g = GDF()
    # g.debug = True
    # pprint(g.storage_config['LS5TM'])
    # pprint(dict(g.storage_config['LS5TM']['dimensions']))
    # pprint(dict(g.storage_config['LS5TM']['measurement_types']))
    # pprint(g.storage_config['LS8OLI'])
    # pprint(dict(g.storage_config['LS8OLI']['dimensions']))
    # pprint(dict(g.storage_config['LS8OLI']['measurement_types']))
    
    data_request_descriptor = {'storage_type': 'LS5TM', 
                               'variables': ('B30',), 
                               'dimensions': {'X': {'range': (147.968, 148.032)}, 
                                              'Y': {'range': (-36.032, -35.968)},
                                              'T': {'range': (1262304000.0, 1325375999.999999)}, # 2010-01-01 00:00:00.0 - 2011-12-31 23:59:59.999999
                                              }
                               }
    t0 = datetime.now()
    print 'Starting 256 x 256 single-band cross-boundary descriptor at ', t0
    d = g.get_descriptor(data_request_descriptor)
    t1 = datetime.now()
    print 'Finishing 256 x 256 cross-boundary descriptor at %s (Elapsed time %s)' % (t1, t1 - t0)
    pprint(d)

    t0 = datetime.now()
    print 'Starting 256 x 256 single-band cross-boundary selection at ', t0
    a = g.get_data(data_request_descriptor)
    t1 = datetime.now()
    print 'Finishing 256 x 256 cross-boundary selection at %s (Elapsed time %s)' % (t1, t1 - t0)
    pprint(a)
Exemple #3
0
class ExecutionEngine(object):

	SUPPORTED_REDUCTION_OPERATORS = [ 'min', 'max', 'amin', 'amax', 'nanmin', 'nanmax', 'ptp',
									  'median', 'average', 'mean', 'std', 'var', 'nanmean', 'nanstd', 'nanvar',
									  'argmax', 'argmin', 'sum', 'prod', 'all', 'any' 
									]

	def __init__(self):
		logger.debug('Initialise Execution Module.')
		self.gdf = GDF()
		self.gdf.debug = False
		self.cache = {}

	def executePlan(self, plan):

		for task in plan:
			function = task.values()[0]['orig_function']
			print 'function =', function
			if function == 'get_data': # get data
				self.executeGetData(task)
			elif function == 'apply_cloud_mask': # apply cloud mask
				self.executeCloudMask(task)
			elif len([s for s in self.SUPPORTED_REDUCTION_OPERATORS if s in function]) > 0: # reduction operator
				self.executeReduction(task)
			else: # bandmath
				self.executeBandmath(task)

	def executeGetData(self, task):
		
		data_request_param = {}
		data_request_param['dimensions'] = task.values()[0]['array_input'][0].values()[0]['dimensions']
		data_request_param['storage_type'] = task.values()[0]['array_input'][0].values()[0]['storage_type']
		data_request_param['variables'] = ()

		for array in task.values()[0]['array_input']:
			data_request_param['variables'] += (array.values()[0]['variable'],)
		
		data_response = self.gdf.get_data(data_request_param)

		key = task.keys()[0]
		self.cache[key] = {}
		self.cache[key]['array_result'] = copy.deepcopy(data_response['arrays'])
		self.cache[key]['array_indices'] = copy.deepcopy(data_response['indices'])
		self.cache[key]['array_dimensions'] = copy.deepcopy(data_response['dimensions'])
		self.cache[key]['array_output'] = copy.deepcopy(task.values()[0]['array_output'])

		del data_request_param
		del data_response

		return self.cache[key]		

	def executeCloudMask(self, task):

		key = task.keys()[0]
		data_key = task.values()[0]['array_input'][0]
		mask_key = task.values()[0]['array_mask']
		no_data_value = task.values()[0]['array_output']['no_data_value']
		print 'key =', key
		print 'data key =', data_key
		print 'data mask_key =', mask_key
		print 'no_data_value =', no_data_value
		
		array_desc = self.cache[task.values()[0]['array_input'][0]]

		data_array = self.cache[data_key]['array_result'].values()[0]
		mask_array = self.cache[mask_key]['array_result'].values()[0]

		pqa_mask = get_pqa_mask(mask_array)

		masked_array = copy.deepcopy(data_array)
		masked_array[~pqa_mask] = no_data_value
		self.cache[key] = {}
		
		self.cache[key]['array_result'] = {}
		self.cache[key]['array_result'][key] = masked_array
		self.cache[key]['array_indices'] = copy.deepcopy(array_desc['array_indices'])
		self.cache[key]['array_dimensions'] = copy.deepcopy(array_desc['array_dimensions'])
		self.cache[key]['array_output'] = copy.deepcopy(task.values()[0]['array_output'])

	def executeBandmath(self, task):

		key = task.keys()[0]
		
		# TODO: check all input arrays are the same shape and parameters

		arrays = {}
		for task_name in task.values()[0]['array_input']:
			arrays.update(self.cache[task_name]['array_result'])

		arrayResult = {}
		arrayResult['array_result'] = {}
		arrayResult['array_result'][key] = ne.evaluate(task.values()[0]['function'],  arrays)

		no_data_value = task.values()[0]['array_output']['no_data_value']

		array_desc = self.cache[task.values()[0]['array_input'][0]]

		for array in array_desc['array_result'].values():
			arrayResult['array_result'][key][array == no_data_value] = no_data_value

		arrayResult['array_indices'] = copy.deepcopy(array_desc['array_indices'])
		arrayResult['array_dimensions'] = copy.deepcopy(array_desc['array_dimensions'])
		arrayResult['array_output'] = copy.deepcopy(task.values()[0]['array_output'])

		self.cache[key] = arrayResult
		return self.cache[key]

	def executeReduction(self, task):

		function_name = task.values()[0]['orig_function'].replace(")"," ").replace("("," ").split()[0]
		func = getattr(np, function_name)

		key = key = task.keys()[0]
		data_key = task.values()[0]['array_input'][0]
		print 'key =', key
		print 'data key =', data_key

		data = self.cache[data_key]['array_dimensions']

		no_data_value = task.values()[0]['array_output']['no_data_value']

		array_data = self.cache[data_key]['array_result'].values()[0]

		array_desc = self.cache[task.values()[0]['array_input'][0]]
	
		arrayResult = {}
		arrayResult['array_result'] = {}
		arrayResult['array_output'] = copy.deepcopy(task.values()[0]['array_output'])

		if len(task.values()[0]['dimension']) == 1: # 3D -> 2D reduction
			pprint(self.cache[data_key]['array_dimensions'])
			dim = self.cache[data_key]['array_dimensions'].index(task.values()[0]['dimension'][0])

			arrayResult['array_result'][key]=np.apply_along_axis(lambda x: func(x[x!=no_data_value]), dim, array_data)
		
			arrayResult['array_indices'] = copy.deepcopy(array_desc['array_indices'])
			arrayResult['array_dimensions'] = copy.deepcopy(arrayResult['array_output']['dimensions_order'])

			for index in array_desc['array_indices']:
				if index not in arrayResult['array_dimensions'] and index in arrayResult['array_indices']:
					del arrayResult['array_indices'][index]
		elif len(task.values()[0]['dimension']) == 2: # 3D -> 1D reduction
			size = task.values()[0]['array_output']['shape'][0]
			print 'size =', size
			out = np.empty([size])
			dim = self.cache[data_key]['array_dimensions'].index(task.values()[0]['array_output']['dimensions_order'][0])
			print 'dim =', dim
			
			#to fix bug in gdf
			#size = self.cache[data_key]['array_result'].values()[0].shape[dim]
			#print 'size =', size
			#out = np.empty([size])

			for i in range(size):
				if dim == 0:
					out[i] = func(array_data[i,:,:][array_data[i,:,:] != no_data_value])
				elif dim == 1:
					out[i] = func(array_data[:,i,:][array_data[:,i,:] != no_data_value])
				elif dim == 2:
					out[i] = func(array_data[:,:,i][array_data[:,:,i] != no_data_value])

				if np.isnan(out[i]):
					out[i] = no_data_value

			arrayResult['array_result'][key] = out
			arrayResult['array_indices'] = copy.deepcopy(array_desc['array_indices'])
			arrayResult['array_dimensions'] = copy.deepcopy(arrayResult['array_output']['dimensions_order'])
		
			for index in array_desc['array_indices']:
				if index not in arrayResult['array_dimensions'] and index in arrayResult['array_indices']:
					del arrayResult['array_indices'][index]

		self.cache[key] = arrayResult
		return self.cache[key]
Exemple #4
0
class ExecutionEngine(object):

    SUPPORTED_REDUCTION_OPERATORS = [
        "min",
        "max",
        "amin",
        "amax",
        "nanmin",
        "nanmax",
        "ptp",
        "median",
        "average",
        "mean",
        "std",
        "var",
        "nanmean",
        "nanstd",
        "nanvar",
        "argmax",
        "argmin",
        "sum",
        "prod",
        "all",
        "any",
    ]

    def __init__(self):
        logger.debug("Initialise Execution Module.")
        self.gdf = GDF()
        self.gdf.debug = False
        self.cache = {}

    def executePlan(self, plan):

        for task in plan:
            function = task.values()[0]["orig_function"]
            print "function =", function
            if function == "get_data":  # get data
                self.executeGetData(task)
            elif function == "apply_cloud_mask":  # apply cloud mask
                self.executeCloudMask(task)
            elif len([s for s in self.SUPPORTED_REDUCTION_OPERATORS if s in function]) > 0:  # reduction operator
                self.executeReduction(task)
            else:  # bandmath
                self.executeBandmath(task)

    def executeGetData(self, task):

        data_request_param = {}
        data_request_param["dimensions"] = task.values()[0]["array_input"][0].values()[0]["dimensions"]
        data_request_param["storage_type"] = task.values()[0]["array_input"][0].values()[0]["storage_type"]
        data_request_param["variables"] = ()

        for array in task.values()[0]["array_input"]:
            data_request_param["variables"] += (array.values()[0]["variable"],)

        data_response = self.gdf.get_data(data_request_param)

        key = task.keys()[0]
        self.cache[key] = {}
        self.cache[key]["array_result"] = copy.deepcopy(data_response["arrays"])
        self.cache[key]["array_indices"] = copy.deepcopy(data_response["indices"])
        self.cache[key]["array_dimensions"] = copy.deepcopy(data_response["dimensions"])
        self.cache[key]["array_output"] = copy.deepcopy(task.values()[0]["array_output"])

        del data_request_param
        del data_response

        return self.cache[key]

    def executeCloudMask(self, task):

        key = task.keys()[0]
        data_key = task.values()[0]["array_input"][0]
        mask_key = task.values()[0]["array_mask"]
        no_data_value = task.values()[0]["array_output"]["no_data_value"]
        print "key =", key
        print "data key =", data_key
        print "data mask_key =", mask_key
        print "no_data_value =", no_data_value

        array_desc = self.cache[task.values()[0]["array_input"][0]]

        data_array = self.cache[data_key]["array_result"].values()[0]
        mask_array = self.cache[mask_key]["array_result"].values()[0]

        pqa_mask = get_pqa_mask(mask_array)

        masked_array = copy.deepcopy(data_array)
        masked_array[~pqa_mask] = no_data_value
        self.cache[key] = {}

        self.cache[key]["array_result"] = {}
        self.cache[key]["array_result"][key] = masked_array
        self.cache[key]["array_indices"] = copy.deepcopy(array_desc["array_indices"])
        self.cache[key]["array_dimensions"] = copy.deepcopy(array_desc["array_dimensions"])
        self.cache[key]["array_output"] = copy.deepcopy(task.values()[0]["array_output"])

    def executeBandmath(self, task):

        key = task.keys()[0]

        # TODO: check all input arrays are the same shape and parameters

        arrays = {}
        for task_name in task.values()[0]["array_input"]:
            arrays.update(self.cache[task_name]["array_result"])

        arrayResult = {}
        arrayResult["array_result"] = {}
        arrayResult["array_result"][key] = ne.evaluate(task.values()[0]["function"], arrays)

        no_data_value = task.values()[0]["array_output"]["no_data_value"]

        array_desc = self.cache[task.values()[0]["array_input"][0]]

        for array in array_desc["array_result"].values():
            arrayResult["array_result"][key][array == no_data_value] = no_data_value

        arrayResult["array_indices"] = copy.deepcopy(array_desc["array_indices"])
        arrayResult["array_dimensions"] = copy.deepcopy(array_desc["array_dimensions"])
        arrayResult["array_output"] = copy.deepcopy(task.values()[0]["array_output"])

        self.cache[key] = arrayResult
        return self.cache[key]

    def executeReduction(self, task):

        function_name = task.values()[0]["orig_function"].replace(")", " ").replace("(", " ").split()[0]
        func = getattr(np, function_name)

        key = key = task.keys()[0]
        data_key = task.values()[0]["array_input"][0]
        print "key =", key
        print "data key =", data_key

        data = self.cache[data_key]["array_dimensions"]

        no_data_value = task.values()[0]["array_output"]["no_data_value"]

        array_data = self.cache[data_key]["array_result"].values()[0]

        array_desc = self.cache[task.values()[0]["array_input"][0]]

        arrayResult = {}
        arrayResult["array_result"] = {}
        arrayResult["array_output"] = copy.deepcopy(task.values()[0]["array_output"])

        if len(task.values()[0]["dimension"]) == 1:  # 3D -> 2D reduction
            pprint(self.cache[data_key]["array_dimensions"])
            dim = self.cache[data_key]["array_dimensions"].index(task.values()[0]["dimension"][0])

            arrayResult["array_result"][key] = np.apply_along_axis(
                lambda x: func(x[x != no_data_value]), dim, array_data
            )

            arrayResult["array_indices"] = copy.deepcopy(array_desc["array_indices"])
            arrayResult["array_dimensions"] = copy.deepcopy(arrayResult["array_output"]["dimensions_order"])

            for index in array_desc["array_indices"]:
                if index not in arrayResult["array_dimensions"] and index in arrayResult["array_indices"]:
                    del arrayResult["array_indices"][index]
        elif len(task.values()[0]["dimension"]) == 2:  # 3D -> 1D reduction
            size = task.values()[0]["array_output"]["shape"][0]
            print "size =", size
            out = np.empty([size])
            dim = self.cache[data_key]["array_dimensions"].index(
                task.values()[0]["array_output"]["dimensions_order"][0]
            )
            print "dim =", dim

            # to fix bug in gdf
            # size = self.cache[data_key]['array_result'].values()[0].shape[dim]
            # print 'size =', size
            # out = np.empty([size])

            for i in range(size):
                if dim == 0:
                    out[i] = func(array_data[i, :, :][array_data[i, :, :] != no_data_value])
                elif dim == 1:
                    out[i] = func(array_data[:, i, :][array_data[:, i, :] != no_data_value])
                elif dim == 2:
                    out[i] = func(array_data[:, :, i][array_data[:, :, i] != no_data_value])

                if np.isnan(out[i]):
                    out[i] = no_data_value

            arrayResult["array_result"][key] = out
            arrayResult["array_indices"] = copy.deepcopy(array_desc["array_indices"])
            arrayResult["array_dimensions"] = copy.deepcopy(arrayResult["array_output"]["dimensions_order"])

            for index in array_desc["array_indices"]:
                if index not in arrayResult["array_dimensions"] and index in arrayResult["array_indices"]:
                    del arrayResult["array_indices"][index]

        self.cache[key] = arrayResult
        return self.cache[key]
                                                   }
                                            }
                           })


# In[6]:
#for data_request_descriptor in data_request_descriptors:
#    d = g.get_data(data_request_descriptor)
#    print "d shape: " , d['arrays']['B30'].shape
    #plotContourf(d, 'B30')
#    plotImages(d['arrays']['B30'])
#   pprint(d)

# In[ ]:

big_descriptor = {'storage_type': 'LS5TM',
                               'variables': ('B30',),
                               'dimensions': {'X': {'range': (140.0+0.75, 142.0)},
                                              'Y': {'range': (-36.0+0.75, -34.0)},
                                              'T': {'range': (start_date, end_date),
                                              #      'array_range': (0, 4)
                                                    #'crs': 'SSE', # Seconds since epoch
                                                    #'grouping_function': g.null_grouping
                                                   }
                                            }
                           }
                           
d_all = g.get_data(big_descriptor)
d_all['arrays']['B30'].shape
plotImages(d_all['arrays']['B30'])
#plotContourf(d_all, 'B30')                           
data_request_descriptor = {'storage_type': 'LS5TM',
                           'variables': ('B40', 'B30',),
                           'dimensions': {'X': {'range': (147.875, 148.125)},
                                          'Y': {'range': (-37.0 + 0.875, -36.0 + 0.125)},
                                          # 'T': {'range': (start_date, end_date),
                                          #      'array_range': (0, 4)
                                          # 'crs': 'SSE', # Seconds since epoch
                                          # 'grouping_function': g.null_grouping
                                          #     }
                                          }
                           }



# In[6]:
d = g.get_data(data_request_descriptor)
print "d shape: ", d['arrays']['B30'].shape
# plotContourf(d, 'B30')
# plotImages(d['arrays']['B30'])

# In[ ]:
from glue.core import Data, DataCollection
from glue.qt.glue_application import GlueApplication

44  # In[ ]:
my_data1 = Data(x=d['arrays']['B40'], label='B40')

collection = DataCollection([my_data1, ])
# collection.merge(my_data1,my_data2,my_data3)
app = GlueApplication(collection)
app.start()