diff --git a/intercal/modis.py b/intercal/modis.py index 3f754560d40f873f3db71bdebe789f9024b44d9a..324432822ca0118b1f4351f1257376536a04603c 100644 --- a/intercal/modis.py +++ b/intercal/modis.py @@ -5,16 +5,17 @@ import pyhdf.SD import pyhdf.VS from intercal.util import great_circle_dist -def sno_stats(mod03_file, mod021km_file, sno_lat, sno_lon, sno_radius, output_file): +def modis_to_iasi(files, sno_lat, sno_lon, sno_radius, output_file): - reader = ModisReader(mod03_file, mod021km_file) - mask = (great_circle_dist(reader.latitude, reader.longitude, sno_lat, sno_lon) <= sno_radius) - radiance = reader.radiance[:,mask] + output_shape = [16] + num_invalid_fov = np.zeros(output_shape, np.int32) + num_fov = np.zeros(output_shape, np.int32) + sum_radiance = np.zeros(output_shape, np.float64) + sum_radiance_squared = np.zeros(output_shape, np.float64) - num_invalid_fov = np.ma.count_masked(radiance, axis=-1) - num_fov = radiance.shape[-1] - num_invalid_fov - sum_radiance = radiance.sum(axis=-1) - sum_radiance_squared = (radiance**2).sum(axis=-1) + for mod03_file, mod021km_file in files: + sno_stats(mod03_file, mod021km_file, sno_lat, sno_lon, sno_radius, + num_invalid_fov, num_fov, sum_radiance, sum_radiance_squared) sd = pyhdf.SD.SD(output_file, pyhdf.SD.SDC.WRITE | pyhdf.SD.SDC.CREATE | pyhdf.SD.SDC.TRUNC) write_hdf_sds(sd, 'Num_Invalid_FOV', num_invalid_fov, dims=['Channel']) @@ -22,6 +23,18 @@ def sno_stats(mod03_file, mod021km_file, sno_lat, sno_lon, sno_radius, output_fi write_hdf_sds(sd, 'Sum_Radiance', sum_radiance, dims=['Channel']) write_hdf_sds(sd, 'Sum_Radiance_Squared', sum_radiance_squared, dims=['Channel']) +def sno_stats(mod03_file, mod021km_file, sno_lat, sno_lon, sno_radius, + num_invalid_fov, num_fov, sum_radiance, sum_radiance_squared): + + reader = ModisReader(mod03_file, mod021km_file) + mask = (great_circle_dist(reader.latitude, reader.longitude, sno_lat, sno_lon) <= sno_radius) + radiance = reader.radiance[:,mask] + + num_invalid_fov += np.ma.count_masked(radiance, axis=-1) + num_fov += radiance.shape[-1] - num_invalid_fov + sum_radiance += radiance.sum(axis=-1) + sum_radiance_squared += (radiance**2).sum(axis=-1) + def write_hdf_sds(sd, name, data, dims): hdf_type, np_type = {'i': (pyhdf.SD.SDC.INT32, np.int32), diff --git a/intercal/test/e2e/test.py b/intercal/test/e2e/test.py index d3aa93b35292ef8a79624fbc041ca72b4976e567..e3f33f0520505d6d6bdaed79d5a5819d885a9e96 100644 --- a/intercal/test/e2e/test.py +++ b/intercal/test/e2e/test.py @@ -2,15 +2,16 @@ import os from unittest import TestCase import pyhdf.SD -from intercal.modis import sno_stats +from intercal.modis import modis_to_iasi -class SnoStatsTest(TestCase): +class ModisToIasiTest(TestCase): @classmethod def setUpClass(cls): output_file = os.path.join('local/test', output_file_name) - sno_stats(mod03_file, mod021km_file, sno_lat, sno_lon, distance_threshold, output_file) + modis_to_iasi([(mod03_file, mod021km_file)], sno_lat, sno_lon, distance_threshold, + output_file) cls.output_sd = pyhdf.SD.SD(output_file) def test_counts_number_of_pixels_within_threshold_distance_of_sno(self):