Skip to content

Commit 5cfbc1d

Browse files
Load IBTrACs file from archive in case (#956)
* hazard.test: fall back for missing IBTraCs file * typo
1 parent dc7d424 commit 5cfbc1d

File tree

4 files changed

+63
-2
lines changed

4 files changed

+63
-2
lines changed

climada/hazard/test/__init__.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,3 +18,29 @@
1818
1919
init test
2020
"""
21+
22+
import shutil
23+
24+
from climada.util.constants import SYSTEM_DIR
25+
from climada.util.api_client import Client
26+
from climada.util.files_handler import download_ftp
27+
from climada.hazard.tc_tracks import IBTRACS_FILE, IBTRACS_URL
28+
29+
30+
def download_ibtracs():
31+
"""This makes sure a IBTrACS.ALL.v04r00.nc file is present in SYSTEM_DIR
32+
First, downloading from the original sources is attempted. If that fails an old version
33+
is downloaded from the CLIMADA Data API
34+
"""
35+
if SYSTEM_DIR.joinpath(IBTRACS_FILE).is_file():
36+
return # Nothing to do
37+
38+
try:
39+
download_ftp(f'{IBTRACS_URL}/{IBTRACS_FILE}', IBTRACS_FILE)
40+
shutil.move(IBTRACS_FILE, SYSTEM_DIR)
41+
42+
except ValueError: # plan b: download an old version of that file from the climada api
43+
client = Client()
44+
dsinfo = client.get_dataset_info(name="IBTrACS", version="v04r00", status="external")
45+
[fileinfo] = [fi for fi in dsinfo.files if fi.file_name == 'IBTrACS.ALL.v04r00.nc']
46+
client._download_file(local_path=SYSTEM_DIR, fileinfo=fileinfo)

climada/hazard/test/test_tc_tracks.py

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,9 @@
1919
Test tc_tracks module.
2020
"""
2121

22+
from datetime import datetime as dt
2223
import unittest
24+
2325
import xarray as xr
2426
import numpy as np
2527
import pandas as pd
@@ -32,7 +34,8 @@
3234
from climada.util.constants import TC_ANDREW_FL
3335
import climada.util.coordinates as u_coord
3436
from climada.entity import Exposures
35-
from datetime import datetime as dt
37+
from climada.hazard.test import download_ibtracs
38+
3639

3740
DATA_DIR = CONFIG.hazard.test_data.dir()
3841
TEST_TRACK = DATA_DIR.joinpath("trac_brb_test.csv")
@@ -50,6 +53,10 @@
5053
class TestIbtracs(unittest.TestCase):
5154
"""Test reading and model of TC from IBTrACS files"""
5255

56+
@classmethod
57+
def setUpClass(cls):
58+
download_ibtracs()
59+
5360
def test_raw_ibtracs_empty_pass(self):
5461
"""Test reading empty TC from IBTrACS files"""
5562
tc_track = tc.TCTracks.from_ibtracs_netcdf(
@@ -290,6 +297,11 @@ def test_ibtracs_additional_variables(self):
290297

291298
class TestIO(unittest.TestCase):
292299
"""Test reading of tracks from files of different formats"""
300+
301+
@classmethod
302+
def setUpClass(cls):
303+
download_ibtracs()
304+
293305
def test_netcdf_io(self):
294306
"""Test writting and reading netcdf4 TCTracks instances"""
295307
path = DATA_DIR.joinpath("tc_tracks_nc")
@@ -556,6 +568,10 @@ def test_to_geodataframe_line(self):
556568
class TestFuncs(unittest.TestCase):
557569
"""Test functions over TC tracks"""
558570

571+
@classmethod
572+
def setUpClass(cls):
573+
download_ibtracs()
574+
559575
def test_get_track_pass(self):
560576
"""Test get_track."""
561577
tc_track = tc.TCTracks.from_processed_ibtracs_csv(TEST_TRACK_SHORT)

climada/hazard/test/test_tc_tracks_synth.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@
3030
import climada.hazard.tc_tracks_synth as tc_synth
3131
import climada.util.coordinates
3232
from climada.util.constants import TC_ANDREW_FL
33+
from climada.hazard.test import download_ibtracs
34+
3335

3436
DATA_DIR = Path(__file__).parent.joinpath('data')
3537
TEST_TRACK = DATA_DIR.joinpath("trac_brb_test.csv")
@@ -39,7 +41,13 @@
3941
TEST_TRACK_DECAY_PENV_GT_PCEN = DATA_DIR.joinpath('1988021S12080_gen2.nc')
4042
TEST_TRACK_DECAY_PENV_GT_PCEN_HIST = DATA_DIR.joinpath('1988021S12080.nc')
4143

44+
4245
class TestDecay(unittest.TestCase):
46+
47+
@classmethod
48+
def setUpClass(cls):
49+
download_ibtracs()
50+
4351
def test_apply_decay_no_landfall_pass(self):
4452
"""Test _apply_land_decay with no historical tracks with landfall"""
4553
tc_track = tc.TCTracks.from_processed_ibtracs_csv(TEST_TRACK_SHORT)
@@ -469,6 +477,11 @@ def test_decay_penv_gt_pcen(self):
469477
self.assertTrue(np.all(np.diff(p_env_lf - p_synth_lf) <= 0))
470478

471479
class TestSynth(unittest.TestCase):
480+
481+
@classmethod
482+
def setUpClass(cls):
483+
download_ibtracs()
484+
472485
def test_angle_funs_pass(self):
473486
"""Test functions used by random walk code"""
474487
self.assertAlmostEqual(tc_synth._get_bearing_angle(np.array([15, 20]),

climada/hazard/test/test_trop_cyclone.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,18 +34,24 @@
3434
from climada.hazard.trop_cyclone.trop_cyclone import (
3535
TropCyclone, )
3636
from climada.hazard.centroids.centr import Centroids
37+
from climada.hazard.test import download_ibtracs
38+
3739

3840
DATA_DIR = Path(hazard_test.__file__).parent.joinpath('data')
3941

4042
TEST_TRACK = DATA_DIR.joinpath("trac_brb_test.csv")
4143
TEST_TRACK_SHORT = DATA_DIR.joinpath("trac_short_test.csv")
4244

43-
4445
CENTR_TEST_BRB = Centroids.from_hdf5(get_test_file('centr_test_brb', file_format='hdf5'))
4546

4647

4748
class TestReader(unittest.TestCase):
4849
"""Test loading funcions from the TropCyclone class"""
50+
51+
@classmethod
52+
def setUpClass(cls):
53+
download_ibtracs()
54+
4955
def test_memory_limit(self):
5056
"""Test from_tracks when memory is (very) limited"""
5157
tc_track = TCTracks.from_processed_ibtracs_csv(TEST_TRACK)

0 commit comments

Comments
 (0)