def test_Image_tcorr_image_daily(): """Tcorr should be masked for date outside range with IMAGE_DAILY""" input_image = ee.Image.constant(1).set({ 'system:time_start': ee.Date('1980-07-04').millis()}) m = model.Image(input_image, tcorr_source='IMAGE_DAILY', tmax_source='TOPOWX_MEDIAN_V0') tcorr_img, index_img = m._tcorr tcorr = utils.point_image_value(tcorr_img, SCENE_POINT) index = utils.point_image_value(index_img, SCENE_POINT) assert tcorr['tcorr'] is None assert index['index'] is None
def test_Image_tcorr_image_annual(expected=[0.9786, 2], tol=0.0001): """Test getting annual Tcorr from composite when monthly/daily are missing""" input_image = ee.Image.constant(1).set({ 'system:time_start': ee.Date('1980-07-04').millis()}) m = model.Image(input_image, tcorr_source='IMAGE', tmax_source='TOPOWX_MEDIAN_V0') m._month = ee.Number(9999) tcorr_img, index_img = m._tcorr tcorr = utils.point_image_value(tcorr_img, SCENE_POINT) index = utils.point_image_value(index_img, SCENE_POINT) assert abs(tcorr['tcorr'] - expected[0]) <= tol assert index['index'] == expected[1]
def test_Image_tcorr_image_month(expected=[0.9723, 1], tol=0.0001): """Test getting monthly Tcorr from composite when daily is missing""" # Setting start date to well before beginning of daily Tcorr images # 1980-07-04 should have the same cycle_day value as previous tests input_image = ee.Image.constant(1).set({ 'system:time_start': ee.Date('1980-07-04').millis()}) m = model.Image(input_image, tcorr_source='IMAGE', tmax_source='TOPOWX_MEDIAN_V0') tcorr_img, index_img = m._tcorr tcorr = utils.point_image_value(tcorr_img, SCENE_POINT) index = utils.point_image_value(index_img, SCENE_POINT) assert abs(tcorr['tcorr'] - expected[0]) <= tol assert index['index'] == expected[1]
def test_Image_tcorr_image_default(expected=[0.978, 3], tol=0.0001): """Test getting default Tcorr from composite""" input_image = ee.Image.constant(1).set( {'system:time_start': ee.Date('1980-07-04').millis()}) m = ssebop.Image(input_image, tcorr_source='IMAGE', tmax_source='TOPOWX_MEDIAN_V0') m._month = ee.Number(9999) m._cycle_day = ee.Number(9999) tcorr_img, index_img = m.tcorr tcorr = utils.point_image_value(tcorr_img, SCENE_POINT) index = utils.point_image_value(index_img, SCENE_POINT) assert abs(tcorr['tcorr'] - expected[0]) <= tol assert index['index'] == expected[1]
def test_Image_tcorr_image_source(tcorr_source, tmax_source, scene_id, expected, tol=0.0001): """Test getting Tcorr value and index for a single date at a real point""" scene_date = datetime.datetime.strptime(scene_id.split('_')[-1], '%Y%m%d') \ .strftime('%Y-%m-%d') input_image = ee.Image.constant(1).set({ 'system:time_start': ee.Date(scene_date).millis()}) tcorr_img, index_img = model.Image( input_image, tcorr_source=tcorr_source, tmax_source=tmax_source)._tcorr # Tcorr images are constant images and need to be queried at a point tcorr = utils.point_image_value(tcorr_img, SCENE_POINT) index = utils.point_image_value(index_img, SCENE_POINT) assert abs(tcorr['tcorr'] - expected[0]) <= tol assert index['index'] == expected[1]
def test_Image_et_fraction_values(dt, elev, tcorr, tmax, expected, tol=0.0001): output_img = default_image_obj(dt_source=dt, elev_source=elev, tcorr_source=tcorr, tmax_source=tmax).et_fraction output = utils.point_image_value(ee.Image(output_img), TEST_POINT) assert abs(output['et_fraction'] - expected) <= tol
def test_Image_mask_values(): output_img = default_image_obj(ndvi=0.5, lst=308, dt_source=10, elev_source=50, tcorr_source=0.98, tmax_source=310).mask output = utils.point_image_value(output_img, TEST_POINT) assert output['mask'] == 1
def test_Image_tcorr_image_values(lst=300, ndvi=0.8, tmax=306, expected=0.9804, tol=0.0001): output_img = default_image_obj(lst=lst, ndvi=ndvi, tmax_source=tmax).tcorr_image output = utils.point_image_value(output_img, TEST_POINT) assert abs(output['tcorr'] - expected) <= tol
def test_Model_elr_adjust(xy, adjusted): """Check if the temperature is lower when there should be an adjustment This test can't be done with constant images since there are reduce and reproject calls in the function. """ tmax = ee.Image(f'NASA/ORNL/DAYMET_V4/20170701').select(['tmax' ]).add(273.15) elev = ee.Image('CGIAR/SRTM90_V4') # Use a small radius to make the test run faster original = utils.point_image_value(tmax, xy, scale=100)['tmax'] tmax = model.elr_adjust(temperature=tmax, elevation=elev, radius=80) output = utils.point_image_value(tmax, xy, scale=100)['tmax'] if adjusted: assert output < original else: assert output == original
def test_Image_et_values(tol=0.0001): output_img = default_image_obj(ndvi=0.5, lst=308, dt_source=10, elev_source=50, tcorr_source=0.98, tmax_source=310, et_reference_source=10).et output = utils.point_image_value(output_img, TEST_POINT) assert abs(output['et'] - 5.8) <= tol
def test_Image_calculate_values(tol=0.0001): """Test if the calculate method returns ET, ETr, and ETf values""" output_img = default_image_obj( ndvi=0.5, lst=308, dt_source=10, elev_source=50, tcorr_source=0.98, tmax_source=310, et_reference_source=10)\ .calculate(['et', 'et_reference', 'et_fraction']) output = utils.point_image_value(output_img, TEST_POINT) assert abs(output['et'] - 5.8) <= tol assert abs(output['et_reference'] - 10) <= tol assert abs(output['et_fraction'] - 0.58) <= tol
def test_Image_tmax_fallback(tmax_source, xy, expected, tol=0.001): """Test getting Tmax median value when daily doesn't exist To test this, move the test date into the future Tmax collections are filtered based on start_date and end_date """ m = default_image_obj(tmax_source=tmax_source) m._start_date = ee.Date.fromYMD(2099, 7, 1) m._end_date = ee.Date.fromYMD(2099, 7, 2) output = utils.point_image_value(ee.Image(m.tmax), xy) assert abs(output['tmax'] - expected) <= tol
def test_Image_tmax_fallback(tmax_source, xy, expected, tol=0.001): """Test getting Tmax median value when daily doesn't exist To test this, move the test date into the future """ input_img = ee.Image.constant([300, 0.8]).rename(['lst', 'ndvi']) \ .set({'system:index': SCENE_ID, 'system:time_start': ee.Date(SCENE_DATE).update(2099).millis()}) output_img = ssebop.Image(input_img, tmax_source=tmax_source).tmax output = utils.point_image_value(ee.Image(output_img), xy) assert abs(output['tmax'] - expected) <= tol
def test_Image_time_values(): # The time image is currently being built from the et_fraction image, so all # the ancillary values must be set. output_img = default_image_obj(ndvi=0.5, lst=308, dt_source=10, elev_source=50, tcorr_source=0.98, tmax_source=310).time output = utils.point_image_value(output_img, TEST_POINT) assert output['time'] == SCENE_TIME
def test_Image_dt_source_calculated(dt_source, date, xy, expected, tol=0.001): """Test getting calculated dT values for a single date at a real point""" m = ssebop.Image(default_image(), dt_source=dt_source) # Start/end date are needed to filter the source collection m._start_date = ee.Date.parse('yyyy-MM-dd', date) m._end_date = ee.Date.parse('yyyy-MM-dd', date).advance(1, 'day') # DOY is needed in dT calculation m._doy = ee.Date.parse('yyyy-MM-dd', date).getRelative('day', 'year')\ .int().add(1) output = utils.point_image_value(ee.Image(m.dt), xy) assert abs(output['dt'] - expected) <= tol
def test_Image_et_reference_sources(source, band, factor, xy, expected, tol=0.001): """Test getting reference ET values for a single date at a real point""" output = utils.point_image_value( default_image_obj(et_reference_source=source, et_reference_band=band, et_reference_factor=factor).et_reference, xy) assert abs(output['et_reference'] - expected) <= tol
def test_Image_tcorr_image_daily_last_date_ingested(): """Test if last exported daily Tcorr image is used Two extra daily images with system:time_starts of "1979-01-01" but different "date_ingested" properties were added to the collection for this test. The "first" and "second" images have values of 1 and 2 respectively. """ input_image = ee.Image.constant(1).set( {'system:time_start': ee.Date('1979-01-01').millis()}) m = ssebop.Image(input_image, tcorr_source='IMAGE_DAILY', tmax_source='TOPOWX_MEDIAN_V0') tcorr_img, index_img = m.tcorr tcorr = utils.point_image_value(tcorr_img, SCENE_POINT) assert tcorr['tcorr'] == 2
def test_Image_tcorr_scene_daily(): """Tcorr should be masked for date outside range with SCENE_DAILY""" input_image = ee.Image.constant(1).set({ 'system:index': 'LC08_042035_20150713', 'system:time_start': ee.Date('1980-07-04').millis() }) m = ssebop.Image(input_image, tcorr_source='SCENE_DAILY', tmax_source='DAYMET_MEDIAN_V2') tcorr_img = m.tcorr tcorr = utils.point_image_value(tcorr_img, SCENE_POINT) index = utils.getinfo(tcorr_img.get('tcorr_index')) assert tcorr['tcorr'] is None assert index == 9
def test_Image_tcorr_scene_month(expected=[0.97006134520787, 1], tol=0.000001): """Test getting monthly Tcorr from composite when daily is missing""" # Setting start date to well before beginning of daily Tcorr images input_image = ee.Image.constant(1).set({ 'system:index': 'LC08_042035_20150713', 'system:time_start': ee.Date('1980-07-13').millis() }) m = ssebop.Image(input_image, tcorr_source='SCENE', tmax_source='DAYMET_MEDIAN_V2') tcorr_img = m.tcorr tcorr = utils.point_image_value(tcorr_img, SCENE_POINT) index = utils.getinfo(tcorr_img.get('tcorr_index')) assert abs(tcorr['tcorr'] - expected[0]) <= tol assert index == expected[1]
def test_Image_tcorr_scene_annual(expected=[0.9762536456651, 2], tol=0.000001): """Test getting annual Tcorr from composite when monthly/daily are missing""" input_image = ee.Image.constant(1).set({ 'system:index': 'LC08_042035_20150713', 'system:time_start': ee.Date('1980-07-13').millis() }) m = ssebop.Image(input_image, tcorr_source='SCENE', tmax_source='DAYMET_MEDIAN_V2') m._month = ee.Number(9999) tcorr_img = m.tcorr tcorr = utils.point_image_value(tcorr_img, SCENE_POINT) index = utils.getinfo(tcorr_img.get('tcorr_index')) assert abs(tcorr['tcorr'] - expected[0]) <= tol assert index == expected[1]
def test_Image_et_fraction_elr_param(lst, ndvi, dt, elev, tcorr, tmax, elr_flag, expected, tol=0.0001): """Test that elr_flag works and changes ETf values""" output_img = default_image_obj(lst=lst, ndvi=ndvi, dt_source=dt, elev_source=elev, tcorr_source=tcorr, tmax_source=tmax, elr_flag=elr_flag).et_fraction output = utils.point_image_value(ee.Image(output_img), TEST_POINT) assert abs(output['et_fraction'] - expected) <= tol
def test_Image_tmax_sources(tmax_source, xy, expected, tol=0.001): """Test getting Tmax values for a single date at a real point""" output_img = ssebop.Image(default_image(), tmax_source=tmax_source).tmax output = utils.point_image_value(ee.Image(output_img), xy) assert abs(output['tmax'] - expected) <= tol
def test_point_image_value(tol=0.001): expected = 2364.351 output = utils.point_image_value(ee.Image('USGS/NED'), [-106.03249, 37.17777]) assert abs(output['elevation'] - expected) <= tol
def test_Image_elev_sources(elev_source, xy, expected, tol=0.001): """Test getting elevation values for a single date at a real point""" output = utils.point_image_value( ssebop.Image(default_image(), elev_source=elev_source).elev, xy) assert abs(output['elev'] - expected) <= tol
def test_Image_dt_source_constant(dt_source, xy, expected, tol=0.001): """Test getting condatnt dT values for a single date at a real point""" m = ssebop.Image(default_image(), dt_source=dt_source) output = utils.point_image_value(ee.Image(m.dt), xy) assert abs(output['dt'] - expected) <= tol
def test_Image_dt_source_clamping(dt_source, doy, xy, expected, tol=0.001): """Check that dT values are clamped to dt_min and dt_max (6, 25)""" m = ssebop.Image(default_image(), dt_source=dt_source) m._doy = doy output = utils.point_image_value(ee.Image(m.dt), xy) assert abs(output['dt'] - expected) <= tol
def test_Image_dt_source_median(dt_source, doy, xy, expected, tol=0.001): """Test getting median dT values for a single date at a real point""" m = ssebop.Image(default_image(), dt_source=dt_source) m._doy = doy output = utils.point_image_value(ee.Image(m.dt), xy) assert abs(output['dt'] - expected) <= tol