diff --git a/docs/project-management/gantt.py b/docs/project-management/gantt.py index eb0faa43349deaa8c9bfbf47e4c2eacf3df08c0d..41f03fc8e3cf4ed764849781665333c7010144d2 100644 --- a/docs/project-management/gantt.py +++ b/docs/project-management/gantt.py @@ -5,21 +5,28 @@ import plotly.figure_factory as ff df = [ dict(Task="Viirs base processor", Start='2024-08-01', Finish='2024-09-30', Resource='Complete'), dict(Task="Add pytests for already created functions (3-9)", Start='2024-08-01', Finish='2024-12-31', Resource='Complete'), - dict(Task="Tropomi base processor", Start='2024-08-01', Finish='2025-02-03', Resource='Incomplete'), - dict(Task="Tropomi to_plumes functionality (11)", Start='2025-02-03', Finish='2025-03-31', Resource='Not Started'), + dict(Task="Tropomi base processor", Start='2024-08-01', Finish='2025-02-03', Resource='Complete'), + dict(Task="Tropomi to_plumes functionality (11)", Start='2025-03-01', Finish='2025-03-14', Resource='Not Started'), dict(Task="Time evaluation statistics (18)", Start='2024-11-01', Finish='2024-11-28', Resource='Complete'), - dict(Task="Test DA implementation for VIIRS", Start='2025-02-03', Finish='2025-02-28', Resource='Not Started'), + dict(Task="Test DA implementation for VIIRS", Start='2025-03-01', Finish='2025-03-31', Resource='Not Started'), dict(Task="Convert Grid representation to numpy from geopandas", Start='2024-12-01', Finish='2024-12-31', Resource="Complete"), - dict(Task="Creating Grid Config for rotated and regular global grids (14)", Start='2024-11-18', Finish='2025-02-03', Resource='Incomplete'), - dict(Task="Add original indices of the data to the outputted netcdf (13)", Start='2025-02-03', Finish='2025-01-14', Resource='Not Started'), - dict(Task="Add history of processes to the netcdf (10)", Start='2025-01-01', Finish='2025-02-03', Resource='Not Started'), - dict(Task="Update grid representations to include Vertical profiling (20)", Start='2025-03-01', Finish='2025-03-31', Resource='Not Started'), + dict(Task="Creating Grid Config for rotated and regular global grids (14)", Start='2024-11-18', Finish='2025-02-03', Resource='Complete'), + dict(Task="Add original indices of the data to the outputted netcdf (13)", Start='2025-03-01', Finish='2025-03-07', Resource='Not Started'), + dict(Task="Add history of processes to the netcdf (10)", Start='2025-01-01', Finish='2025-02-03', Resource='Complete'), + dict(Task="Update grid representations to include Vertical profiling (20)", Start='2025-04-01', Finish='2025-04-30', Resource='Not Started'), dict(Task="Test Viirs data with Providentia Interpolation", Start="2025-03-01", Finish="2025-03-31", Resource="Not Started"), dict(Task="Produce Number of counts plots (29)", Start="2025-01-13", Finish="2025-01-20", Resource="Complete"), - dict(Task="QA flags (23)", Start="2025-01-13", Finish="2025-02-03", Resource="Incomplete"), - dict(Task="Finalise netcdf storage output (30)", Start="2025-01-20", Finish="2025-02-03", Resource="Not Started"), + dict(Task="QA flags (23)", Start="2025-01-13", Finish="2025-02-03", Resource="Complete"), + dict(Task="Finalise netcdf storage output (30)", Start="2025-01-20", Finish="2025-02-03", Resource="Complete"), dict(Task="Create conda environment", Start="2025-01-01", Finish="2025-01-14", Resource="Complete"), - dict(Task="Create Logging file output", Start="2025-01-01", Finish="2025-02-03", Resource="Incomplete"), + dict(Task="Create Logging file output", Start="2025-02-03", Finish="2025-02-24", Resource="Incomplete"), + dict(Task="Filter for min number of obs points to be aggregated (32)", Start="2025-02-17", Finish="2025-02-24", Resource="Not Started"), + dict(Task="Code refactor (41)", Start="2025-02-17", Finish="2025-03-01", Resource="Not Started"), + dict(Task="Update grid config to be in dataclasses instead of yaml files (40)", Start="2025-02-17", Finish="2025-02-24", Resource="Not Started"), + dict(Task="Implement process lazy data in Tropomi (50)", Start="2025-02-10", Finish="2025-02-17", Resource="Not Started"), + dict(Task="Investigate whether we can include Unit Converter used by Providentia/Ghost into code (51)", Start="2025-04-01", Finish="2025-04-10", Resource="Not Started"), + dict(Task="Fix to_da bug (52)", Start="2025-02-10", Finish="2025-02-17", Resource="Not Started"), + dict(Task="Error with some datasets outside time range when apply_qa=True bug (49)", Start="2025-02-10", Finish="2025-02-17", Resource="Not Started"), ] diff --git a/mapies/config/satellite_config.yaml b/mapies/config/satellite_config.yaml index af4837f296bb8916bc8f4cf7c1bc42df89e8f8b7..b94f53247a4560ddaef13571c76444d03edfb296 100644 --- a/mapies/config/satellite_config.yaml +++ b/mapies/config/satellite_config.yaml @@ -67,8 +67,9 @@ tropomi: qa_variables: qa_value: qa_name: "qa_value" - qa_values: [1] #[0.62, 0.65999997, 0.66999996, 0.69, 0.72999996, 0.74, 0.78999996, 0.84, 0.88, 0.9, 0.93, 1.] + qa_values: 0.5 qa_combined: True + qa_condition: "greater_than_or_equal" # Examples, greater_than, less_than, equal, greater_than_or_equal, less_than_or_equal diff --git a/mapies/mapies.py b/mapies/mapies.py index adca3b403ea2aa7e53943394c7a6943ef91c8ad4..d548f422b1d70249f2f2c6eee0cabead18b1f531 100644 --- a/mapies/mapies.py +++ b/mapies/mapies.py @@ -40,8 +40,8 @@ class MAPIES: self.time_orig = np.datetime64("1900-01-01T00:00:00") self.start_date = start_date self.end_date = end_date - - + self.apply_qa = True + self.geospatial_crop = None self.grid_dict = { "rotated":RotatedGrid, @@ -97,44 +97,11 @@ class MAPIES: qa_dict = self.config[self.datatype]["qa"] - #Check if the user wants qa flags - apply_qa = kwargs.get("apply_qa") - - if apply_qa is None: - self.apply_qa = True - else: - self.apply_qa = apply_qa - self.qualityFlags = qa_dict["qa_variables"] - - - - def preprocess_vars(self): - """ - Preprocessing of the dataset - """ - # Get all info about time columns - self.time_dims = self.ds[self.time_var].dims - self.time_shape = self.ds[self.time_var].shape - self.time_attrs = self.ds[self.time_var].attrs # Useful if we need to convert to datetime - - # Get time values flatten and convert to datetime values - self.time_values = self.ds[self.time_var].values - self.time_values = self.time_values.flatten() - - if self.time_values.dtype == "timedelta64[ns]": - #logger.info("Adding time origin to time values as the time variable is in timedelta") - self.time_values = np.add(self.time_orig, self.time_values) - self.time_values = pd.to_datetime(self.time_values) - else: - self.time_values = pd.to_datetime(self.time_values) - - - # Time domain selection - self.time_values, self.time_values_index = time_domain_selection(self.time_values, self.start_date, self.end_date) - + self.qualityFlags = qa_dict["qa_variables"] + # TODO this can be removed I believe @timeit def plot_2D_obs(self, **kwargs): """ @@ -178,6 +145,7 @@ class MAPIES: #return fig + # TODO this can be moved to a plotting function python file @timeit def plot_2D_obs_custom(self, lon_values=None, lat_values=None, obs_values=None, outdir=None, title=None, filename=None, display_fig=False): """ @@ -193,10 +161,12 @@ class MAPIES: if self.datatype == "viirs": label = "AOD" levels = [0.02, 0.04, 0.06, 0.08, 0.10, 0.15, 0.20, 0.30, 0.40, 0.50, 0.60, 0.70, 0.80, 1.00] + level_format = [f"{level:.2f}" for level in levels] elif self.datatype == "tropomi": #TODO remove hard coding label = "NO2" levels = [0.00001, 0.00002, 0.00003, 0.00004, 0.00005, 0.00006, 0.00007, 0.00008, 0.00009, 0.00010, 0.00015, 0.00020, 0.00030, 0.00040] + level_format = [f"{level:.5f}" for level in levels] # Define the custom color list colors = [ '#290AD8', '#2645FA', '#3A91FF', '#66CBFF', '#99EEFF', @@ -223,7 +193,7 @@ class MAPIES: # Add the color bar cbar = fig.colorbar(im, ax=ax, orientation="vertical", pad=0.05, ticks=levels, extend="both") cbar.set_label(label) - cbar.ax.set_yticklabels([f"{level:.2f}" for level in levels]) # Format tick labels + cbar.ax.set_yticklabels(level_format) # Format tick labels # Add title and save the plot ax.set_title(title) @@ -311,33 +281,6 @@ class MAPIES: # return reindexed values return independent_var_values - def quality_assurance(self): - """ - Applying quality assurance flags to mapies data - """ - mask = np.zeros_like(self.obs, dtype=bool) - for i, (flag, info) in enumerate(self.qualityFlags.items()): - - flag_mask = np.zeros_like(self.obs, dtype=bool) - arr = self.ds[info["qa_name"]].values.flatten() - arr = self.reindex(self.time_values_index, arr) - - - for value in info["qa_values"]: - flag_mask |= (arr == value) - if i == 0: - mask = flag_mask - else: - if info["qa_combined"]: - mask &= flag_mask - else: - mask |= flag_mask - - self.obs = self.obs[mask] - self.lon_values = self.lon_values[mask] - self.lat_values = self.lat_values[mask] - self.time_values = self.time_values[mask] - @staticmethod def to_xarray(coords:dict, data_vars:dict, **kwargs): @@ -351,7 +294,7 @@ class MAPIES: ds = xr.Dataset(data_vars=data_vars, coords=coords, attrs=attrs) return ds - + # TODO this can be moved to a plotting function python file @timeit def plot_2D_num_obs_custom( self, lon_values=None, diff --git a/mapies/tests/test_func_tools.py b/mapies/tests/test_func_tools.py index 52afee646630899855d3b23b4797b2eb870492a7..da0df3e7c7ce85e2604d38ff94ad89abc38b2495 100644 --- a/mapies/tests/test_func_tools.py +++ b/mapies/tests/test_func_tools.py @@ -42,6 +42,7 @@ ds = xr.Dataset( obs = np.array([1, 2, 3, 4]) lon = np.array([1, 2, 3, 4]) lat = np.array([1, 2, 3, 4]) +time = np.array([1, 2, 3, 4]) qualityFlags1 = {"qa_flag1":{"qa_name":"flag1", "qa_values":[1], "qa_combined":False}, "qa_flag2":{"qa_name":"flag2", "qa_values":[1], "qa_combined":False}} qualityFlags2 = {"qa_flag1":{"qa_name":"flag1", "qa_values":[1], "qa_combined":True}, "qa_flag2":{"qa_name":"flag2", "qa_values":[1], "qa_combined":True}} qualityFlags3 = {"qa_flag1":{"qa_name":"flag1", "qa_values":[1], "qa_combined":True}, "qa_flag2":{"qa_name":"flag2", "qa_values":[1], "qa_combined":False}} @@ -49,9 +50,9 @@ qualityFlags3 = {"qa_flag1":{"qa_name":"flag1", "qa_values":[1], "qa_combined":T @pytest.mark.parametrize( "test_input,expected", [ - ((ds, obs, lat, lon, qualityFlags1), (np.array([1, 3, 4]), np.array([1, 3, 4]), np.array([1, 3, 4]))), - ((ds, obs, lat, lon, qualityFlags2), (np.array([4]), np.array([4]), np.array([4]))), - ((ds, obs, lat, lon, qualityFlags3), (np.array([1, 3, 4]), np.array([1, 3, 4]), np.array([1, 3, 4]))), + ((ds, obs, lat, lon, time, qualityFlags1), (np.array([1, 3, 4]), np.array([1, 3, 4]), np.array([1, 3, 4]), np.array([1, 3, 4]))), + ((ds, obs, lat, lon, time, qualityFlags2), (np.array([4]), np.array([4]), np.array([4]), np.array([4]))), + ((ds, obs, lat, lon, time, qualityFlags3), (np.array([1, 3, 4]), np.array([1, 3, 4]), np.array([1, 3, 4]), np.array([1, 3, 4]))), ] ) def test_quality_assurance(test_input, expected): @@ -60,7 +61,7 @@ def test_quality_assurance(test_input, expected): assert quality_assurance(*test_input)[2].all() == expected[2].all() """ @pytest.mark.parametrize( - "test_input,expected", + "test_input,expected", [ ([], np.array([])), ] diff --git a/mapies/tropomi.py b/mapies/tropomi.py index 26e3bef76e99eb77876e60230ba84f786749a3fb..a8ee92076182e1b7d3b631a3d129a31da25e1143 100644 --- a/mapies/tropomi.py +++ b/mapies/tropomi.py @@ -87,7 +87,6 @@ class TROPOMI(MAPIES): self.daily_dict = {} # Dictionary to produce daily netcdf files self.datatype = "tropomi" - self.geospatial_crop = None # Add quality value filter number @@ -181,7 +180,7 @@ class TROPOMI(MAPIES): @timeit - def process_data(self, monthly_avg=False, batch_size=100, geospatial_crop: NDArray | None = None): + def process_data(self, monthly_avg=False, batch_size=100, apply_qa=True, geospatial_crop: NDArray | None = None): """ Process the data for the specified year and months. @@ -195,6 +194,9 @@ class TROPOMI(MAPIES): - if monthly_avg --> lon_final, lat_final, obs_final: Aggregated longitude, latitude, and observation arrays. - if not monthly_avg --> preprocess_vars() is called. """ + #Check if the user wants qa flags + if apply_qa: + self.apply_qa = True if geospatial_crop is not None: self.geospatial_crop = np.array(geospatial_crop) if monthly_avg: @@ -213,11 +215,12 @@ class TROPOMI(MAPIES): # final_lon, final_lat, final_obs, cumulative_count = self.process_files_in_blocks(month, block_size=300, batch_size=batch_size) # Update the monthly dictionary + valid_obs = final_obs > 0 self.monthly_dict[month] = { - "lon": final_lon, - "lat": final_lat, - "obs": final_obs, - "count": cumulative_count, + "lon": final_lon[valid_obs], + "lat": final_lat[valid_obs], + "obs": final_obs[valid_obs], + "count": cumulative_count[valid_obs], } print(f'Updated monthly dictionary for month {month}') print(f'Lon shape: {final_lon.shape}, Lat shape: {final_lat.shape}, Obs shape: {final_obs.shape}') @@ -236,10 +239,11 @@ class TROPOMI(MAPIES): final_lon, final_lat, final_obs, cumulative_count = self.process_monthly_data( batch_size=batch_size, month=None ) - self.lon_values = final_lon - self.lat_values = final_lat - self.obs = final_obs - self.count_obs = cumulative_count + valid_obs = final_obs > 0 + self.lon = final_lon[valid_obs] + self.lat = final_lat[valid_obs] + self.obs = final_obs[valid_obs] + self.count_obs = cumulative_count[valid_obs] except Exception as e: print(f"Error processing data for the time period from {self.start_date} to {self.end_date}: {e}") @@ -332,8 +336,8 @@ class TROPOMI(MAPIES): if months == [0]: try: - lon_values = self.lon_values - lat_values = self.lat_values + lon_values = self.lon + lat_values = self.lat obs_values = self.obs except Exception as e: print(f"Error plotting all data: {e}") @@ -392,8 +396,8 @@ class TROPOMI(MAPIES): if months == [0]: try: - lon_values = self.lon_values - lat_values = self.lat_values + lon_values = self.lon + lat_values = self.lat cum_count = self.count_obs except Exception as e: print(f"Error plotting all data: {e}") diff --git a/mapies/util/func_tools.py b/mapies/util/func_tools.py index 300f2ec6ce7350f3a8f9db0eb2e6a17a93bbccbf..15356703284b96ba1a81fd08115eb8870f8e4341 100644 --- a/mapies/util/func_tools.py +++ b/mapies/util/func_tools.py @@ -81,23 +81,57 @@ def time_converter(date:str) -> pd.Timestamp: return date + + def quality_assurance(ds, obs, lat, lon, time_values, qualityFlags): """ Applying quality assurance flags to mapies data """ mask = np.zeros_like(obs, dtype=bool) - + # Iterate through each qa flag for i, (flag, info) in enumerate(qualityFlags.items()): + # TODO add logger of flag being applied with condition and value flag_mask = np.zeros_like(obs, dtype=bool) arr = ds[info["qa_name"]].values.flatten() - for value in info["qa_values"]: - flag_mask |= (arr == value) + # Get qa conditions + try: + condition = info["qa_condition"] + except KeyError: + # print("No QA condition passed, putting equal") + condition = "equal" + # Get qa values + try: + values = info["qa_values"] + except KeyError: + raise Exception("No QA values passed, putting equal") + + if isinstance(values, (float, int)): + values = [values] + + for value in values: + if condition == "greater_than": + flag_mask |= (arr > value) + elif condition == "less_than": + flag_mask |= (arr < value) + elif condition == "greater_than_or_equal": + flag_mask |= (arr >= value) + elif condition == "less_than_or_equal": + flag_mask |= (arr <= value) + elif condition == "equal": + flag_mask |= (arr == value) if i == 0: mask = flag_mask else: - if info["qa_combined"]: + # If we want to perform an and or or between conditions + try: + combination = info["qa_combined"] + except KeyError: + # print("No combination of and or or passed for the condition, presuming or(False)") + combination = False + + if combination: mask &= flag_mask else: mask |= flag_mask @@ -110,6 +144,8 @@ def quality_assurance(ds, obs, lat, lon, time_values, qualityFlags): return obs, lat, lon, time_values + + def spatial_domain_selection(obs, lat, lon, time, spatial_bounds): """ A function for cutting the data spatially diff --git a/mapies/viirs.py b/mapies/viirs.py index 0ba568f48abfaf29abab50ca9b64adc4ebc5ecbb..65d95b6b6e8c614d72546257404b09a31d558539 100644 --- a/mapies/viirs.py +++ b/mapies/viirs.py @@ -64,11 +64,11 @@ def process_single_file( obs, lat, lon, time_values, time_values_index = new_preprocess_vars(ds, obs_var, lat_var, lon_var, time_var, start_date, end_date) # obs = ds[obs_var].values.flatten() # lat = ds[lat_var].values.flatten() - if apply_qa: obs, lat, lon, time_values = quality_assurance(ds, obs, lat, lon, time_values, qualityFlags) if geospatial_crop is not None: obs, lat, lon, time_values = spatial_domain_selection(obs, lat, lon, time_values, geospatial_crop) + if not flag: # Regrid and aggregate if isinstance(r, RotatedGrid): @@ -235,8 +235,7 @@ class VIIRS(MAPIES): @timeit - - def process_data(self, monthly_avg=False, batch_size=100, save = False, geospatial_crop: NDArray | None = None): + def process_data(self, monthly_avg=False, batch_size=100, save=False, apply_qa=True, geospatial_crop: NDArray | None = None): """ Process the data. @@ -249,6 +248,13 @@ class VIIRS(MAPIES): - if monthly_avg --> updated monthly dictorionary for the processed month. - if not monthly_avg --> updated self.lon_values, self.lat_values, self.obs, self.count_obs. """ + + #Check if the user wants qa flags + + if apply_qa: + self.apply_qa = True + else: + self.apply_qa = False if geospatial_crop is not None: self.geospatial_crop = np.array(geospatial_crop) if monthly_avg: @@ -262,7 +268,7 @@ class VIIRS(MAPIES): try: # Process the data for the current month final_lon, final_lat, final_obs, cumulative_count = self.process_monthly_data( - batch_size=batch_size, month=month + batch_size=batch_size, month=month, apply_qa=apply_qa ) # Update the monthly dictionary @@ -309,7 +315,7 @@ class VIIRS(MAPIES): print(f"Error processing data for the time period from {self.start_date} to {self.end_date}: {e}") return - @timeit + def process_monthly_data(self, batch_size, month=None): """ @@ -463,11 +469,16 @@ class VIIRS(MAPIES): print("Yearly average computation completed.") @timeit - def process_lazy_data(self): + def process_lazy_data(self, apply_qa=True, geospatial_crop: NDArray | None = None): """ Process the data for the specified time range. It only retrieves a daily dictionary using dask lazy loading. """ flag = True + #Check if the user wants qa flags + if apply_qa: + self.apply_qa = True + if geospatial_crop is not None: + self.geospatial_crop = np.array(geospatial_crop) for day in self.daily_dict.keys(): try: files = self.daily_dict[day]["files"] @@ -483,7 +494,9 @@ class VIIRS(MAPIES): self.end_date, self.apply_qa, self.qualityFlags, - flag + flag, + self.geospatial_crop + ) for file in files ] @@ -801,4 +814,4 @@ class VIIRS(MAPIES): title=title, filename=filename, display_fig=display_fig - ) + ) \ No newline at end of file diff --git a/run/run_tropomi.py b/run/run_tropomi.py index 4ee763a5f97e52762a3b923d91c54714f9c263bf..c42eb7d692a3aa559d89d098aa0e8cefe6304c0e 100644 --- a/run/run_tropomi.py +++ b/run/run_tropomi.py @@ -5,22 +5,21 @@ import time if __name__ == "__main__": - start_date = "202212010000" - end_date = "202212202359" + start_date = "202301010000" + end_date = "202301012359" - outdir = "/esarchive/scratch/cmeikle/" - indir = "/esarchive/obs/sentinel/tropomi/original_files/tropomi_OFFL_NO2" + outdir = "/home/cmeikle/Projects/data/" + indir = "/home/cmeikle/Projects/data/TROPOMI" start_time = time.time() - c = TROPOMI(start_date, end_date, dest=outdir, indir=indir, apply_qa=True, grid_repr="rotated") + c = TROPOMI(start_date, end_date, dest=outdir, indir=indir, grid_repr="regular") c.read_nc() - c.process_data(monthly_avg=True, batch_size = 13) + c.process_data(monthly_avg=False, batch_size = 14, apply_qa=True, geospatial_crop=[[-40, 40], [0, 70]]) # c.yearly_average() - c.plot_2D_observations(months=[12], outdir=outdir) - c.plot_2D_num_obs(months=[12], outdir=outdir) - #c.process_lazy_data() + c.plot_2D_observations(months=[0], outdir=outdir) + c.plot_2D_num_obs(months=[0], outdir=outdir) end_time = time.time() elapsed_time = end_time - start_time print(f"Script executed in {elapsed_time:.2f} seconds.") diff --git a/run/run_viirs.py b/run/run_viirs.py index 487bb4b792761cea076b8c57806070508e3f1ec5..04967a55fc83385311ac369da546b7150dd27a04 100644 --- a/run/run_viirs.py +++ b/run/run_viirs.py @@ -9,27 +9,26 @@ if __name__ == "__main__": start_date = "202401010030" end_date = "202401030236" - filename_obs = '1month_obs.png' - filename_num_obs = '1month_num_obs.png' - outdir = "/home/cgile/Documents/mapies/figures" - indir = "/home/cgile/bscearth000/esarchive/obs/nasa/viirs_noaa20_aerdb_l2/original_files/VIIRS" - # indir = "/home/cgile/Documents/mapies/VIIRS" - + + outdir="/home/cmeikle/Projects/data/" + indir="/home/cmeikle/Projects/data/VIIRS" + + + start_time = time.time() - c = VIIRS(start_date, end_date, dest=outdir, indir=indir, apply_qa=False, grid_repr="rotated") + c = VIIRS(start_date, end_date, dest=outdir, indir=indir, grid_repr="rotated") c.read_nc() - c.process_data(monthly_avg=False, batch_size = 50, geospatial_crop=[[-30, 50], [0, 50]]) - # c.yearly_average() - # c.plot_2D_observations(months=[0], filename=filename_obs, outdir=outdir) - # c.plot_2D_num_obs(months=[0], filename=filename_num_obs, outdir=outdir) - c.process_lazy_data() - - c.plot_2D_observations(months=[0], filename=filename_obs, outdir=outdir, display_fig=True) + c.process_data(monthly_avg=False, batch_size = 50, apply_qa=False, geospatial_crop=[[0, 20], [10, 20]]) + # c.yearly_average() + c.plot_2D_observations(months=[0], filename="Viirs_qa_not_applied.png", outdir=outdir) + c.plot_2D_num_obs(months=[0], filename="Viirs_num_obsqa_not_applied.png", outdir=outdir) + # c.process_lazy_data() + end_time = time.time() elapsed_time = end_time - start_time print(f"Script executed in {elapsed_time:.2f} seconds.") diff --git a/setup.py b/setup.py index e954ab7820750e018b348e6fa924715c6924d8ff..054f077e4601482e49ce6c44afd8c0fdddfdcf32 100644 --- a/setup.py +++ b/setup.py @@ -12,7 +12,7 @@ from setuptools import find_packages from setuptools import setup # Could update this using versioneer -version="0.0.9" +version="0.0.10" setup( name="mapies",