Skip to content

Commit 334c461

Browse files
committed
ft: Create ForecastRepository class to handle different type of access/storage. Models have a flag to re-stage.
refac: Renamed ModelTree as ForecastRegistry and PathTree as ExperimentRegistry. Moved .dir() method to ForecastRegistry. Decoupled the get_source from the directory creation, which is now inside the model class. Removed dataclasses from Registries. Removed __call__ override for registry classes and replaced them with get_path(). Created an abc BaseFileRegistry, from which ExperimentRegistry and ForecastRegistry inherits. Removed query_gcmt, as it was included in pycsep. Renamed iter_attr() from Experiment.as_dict() to parse_nested_dict, and moved to utils.py. sty: used black and pydocstringformatter in main modules. build: Added pydocstringformatter options to .toml. tests: updated all unit tests with the new classes. fix: conda manager prints output live to shell.
1 parent 48453c5 commit 334c461

23 files changed

+1506
-1308
lines changed

docs/reference/api_reference.rst

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,11 +111,32 @@ Accessors
111111
.. autosummary::
112112
:toctree: generated
113113

114-
query_gcmt
115114
from_zenodo
116115
from_git
117116

118117

118+
Environments
119+
------------
120+
121+
.. :currentmodule:: floatcsep.environments
122+
123+
.. automodule:: floatcsep.environments
124+
125+
.. autosummary::
126+
:toctree: generated
127+
128+
CondaManager
129+
CondaManager.create_environment
130+
CondaManager.env_exists
131+
CondaManager.install_dependencies
132+
CondaManager.run_command
133+
134+
VenvManager
135+
CondaManager.create_environment
136+
CondaManager.env_exists
137+
CondaManager.install_dependencies
138+
CondaManager.run_command
139+
119140

120141
Extras
121142
------

floatcsep/accessors.py

Lines changed: 5 additions & 210 deletions
Original file line numberDiff line numberDiff line change
@@ -14,48 +14,18 @@
1414
TIMEOUT = 180
1515

1616

17-
def query_gcmt(
18-
start_time,
19-
end_time,
20-
min_magnitude=5.0,
21-
max_depth=None,
22-
catalog_id=None,
23-
min_latitude=None,
24-
max_latitude=None,
25-
min_longitude=None,
26-
max_longitude=None,
27-
):
28-
29-
eventlist = _query_gcmt(
30-
start_time=start_time,
31-
end_time=end_time,
32-
min_magnitude=min_magnitude,
33-
min_latitude=min_latitude,
34-
max_latitude=max_latitude,
35-
min_longitude=min_longitude,
36-
max_longitude=max_longitude,
37-
max_depth=max_depth,
38-
)
39-
40-
catalog = CSEPCatalog(
41-
data=eventlist, name="gCMT", catalog_id=catalog_id, date_accessed=utc_now_datetime()
42-
)
43-
return catalog
44-
45-
4617
def from_zenodo(record_id, folder, force=False):
4718
"""
4819
Download data from a Zenodo repository.
49-
Downloads if file does not exist, checksum has changed in local respect to
50-
url or force
20+
21+
Downloads if file does not exist, checksum has changed in local respect to url or force
5122
5223
Args:
5324
record_id: corresponding to the Zenodo repository
5425
folder: where the repository files will be downloaded
5526
force: force download even if file exists and checksum passes
5627
5728
Returns:
58-
5929
"""
6030
# Grab the urls and filenames and checksums
6131
r = requests.get(f"https://zenodo.org/api/records/{record_id}", timeout=3)
@@ -87,8 +57,7 @@ def from_zenodo(record_id, folder, force=False):
8757

8858
def from_git(url, path, branch=None, depth=1, **kwargs):
8959
"""
90-
91-
Clones a shallow repository from a git url
60+
Clones a shallow repository from a git url.
9261
9362
Args:
9463
url (str): url of the repository
@@ -115,185 +84,13 @@ def from_git(url, path, branch=None, depth=1, **kwargs):
11584
return repo
11685

11786

118-
def _query_gcmt(
119-
start_time,
120-
end_time,
121-
min_magnitude=3.50,
122-
min_latitude=None,
123-
max_latitude=None,
124-
min_longitude=None,
125-
max_longitude=None,
126-
max_depth=1000,
127-
extra_gcmt_params=None,
128-
):
129-
"""
130-
Return GCMT eventlist from IRIS web service.
131-
For details see "https://service.iris.edu/fdsnws/event/1/"
132-
Args:
133-
start_time (datetime.datetime): start time of catalog query
134-
end_time (datetime.datetime): end time of catalog query
135-
min_magnitude (float): minimum magnitude of query
136-
min_latitude (float): minimum latitude of query
137-
max_latitude (float): maximum latitude of query
138-
min_longitude (float): minimum longitude of query
139-
max_longitude (float): maximum longitude of query
140-
max_depth (float): maximum depth of query
141-
extra_gcmt_params (dict): additional parameters to pass to IRIS search
142-
function
143-
144-
Returns:
145-
eventlist
146-
"""
147-
extra_gcmt_params = extra_gcmt_params or {}
148-
149-
eventlist = gcmt_search(
150-
minmagnitude=min_magnitude,
151-
minlatitude=min_latitude,
152-
maxlatitude=max_latitude,
153-
minlongitude=min_longitude,
154-
maxlongitude=max_longitude,
155-
starttime=start_time.isoformat(),
156-
endtime=end_time.isoformat(),
157-
maxdepth=max_depth,
158-
**extra_gcmt_params,
159-
)
160-
161-
return eventlist
162-
163-
164-
def gcmt_search(
165-
format="text",
166-
starttime=None,
167-
endtime=None,
168-
updatedafter=None,
169-
minlatitude=None,
170-
maxlatitude=None,
171-
minlongitude=None,
172-
maxlongitude=None,
173-
latitude=None,
174-
longitude=None,
175-
maxradius=None,
176-
catalog="GCMT",
177-
contributor=None,
178-
maxdepth=1000,
179-
maxmagnitude=10.0,
180-
mindepth=-100,
181-
minmagnitude=0,
182-
offset=1,
183-
orderby="time-asc",
184-
host=None,
185-
verbose=False,
186-
):
187-
"""Search the IRIS database for events matching input criteria.
188-
This search function is a wrapper around the ComCat Web API described here:
189-
https://service.iris.edu/fdsnws/event/1/
190-
191-
This function returns a list of SummaryEvent objects, described elsewhere in this package.
192-
Args:
193-
starttime (datetime):
194-
Python datetime - Limit to events on or after the specified start time.
195-
endtime (datetime):
196-
Python datetime - Limit to events on or before the specified end time.
197-
updatedafter (datetime):
198-
Python datetime - Limit to events updated after the specified time.
199-
minlatitude (float):
200-
Limit to events with a latitude larger than the specified minimum.
201-
maxlatitude (float):
202-
Limit to events with a latitude smaller than the specified maximum.
203-
minlongitude (float):
204-
Limit to events with a longitude larger than the specified minimum.
205-
maxlongitude (float):
206-
Limit to events with a longitude smaller than the specified maximum.
207-
latitude (float):
208-
Specify the latitude to be used for a radius search.
209-
longitude (float):
210-
Specify the longitude to be used for a radius search.
211-
maxradius (float):
212-
Limit to events within the specified maximum number of degrees
213-
from the geographic point defined by the latitude and longitude parameters.
214-
catalog (str):
215-
Limit to events from a specified catalog.
216-
contributor (str):
217-
Limit to events contributed by a specified contributor.
218-
maxdepth (float):
219-
Limit to events with depth less than the specified maximum.
220-
maxmagnitude (float):
221-
Limit to events with a magnitude smaller than the specified maximum.
222-
mindepth (float):
223-
Limit to events with depth more than the specified minimum.
224-
minmagnitude (float):
225-
Limit to events with a magnitude larger than the specified minimum.
226-
offset (int):
227-
Return results starting at the event count specified, starting at 1.
228-
orderby (str):
229-
Order the results. The allowed values are:
230-
- time order by origin descending time
231-
- time-asc order by origin ascending time
232-
- magnitude order by descending magnitude
233-
- magnitude-asc order by ascending magnitude
234-
host (str):
235-
Replace default ComCat host (earthquake.usgs.gov) with a custom host.
236-
Returns:
237-
list: List of SummaryEvent() objects.
238-
"""
239-
240-
# getting the inputargs must be the first line of the method!
241-
inputargs = locals().copy()
242-
newargs = {}
243-
244-
for key, value in inputargs.items():
245-
if value is True:
246-
newargs[key] = "true"
247-
continue
248-
if value is False:
249-
newargs[key] = "false"
250-
continue
251-
if value is None:
252-
continue
253-
newargs[key] = value
254-
255-
del newargs["verbose"]
256-
257-
events = _search_gcmt(**newargs)
258-
259-
return events
260-
261-
262-
def _search_gcmt(**_newargs):
263-
"""
264-
Performs de-query at ISC API and returns event list and access date
265-
266-
"""
267-
paramstr = urlencode(_newargs)
268-
url = HOST_CATALOG + paramstr
269-
fh = request.urlopen(url, timeout=TIMEOUT)
270-
data = fh.read().decode("utf8").split("\n")
271-
fh.close()
272-
eventlist = []
273-
for line in data[1:]:
274-
line_ = line.split("|")
275-
if len(line_) != 1:
276-
id_ = line_[0]
277-
time_ = datetime.fromisoformat(line_[1])
278-
dt = datetime_to_utc_epoch(time_)
279-
lat = float(line_[2])
280-
lon = float(line_[3])
281-
depth = float(line_[4])
282-
mag = float(line_[10])
283-
eventlist.append((id_, dt, lat, lon, depth, mag))
284-
285-
return eventlist
286-
287-
28887
def _download_file(url: str, filename: str) -> None:
28988
"""
290-
291-
Downloads files (from zenodo)
89+
Downloads files (from zenodo).
29290
29391
Args:
29492
url (str): the url where the file is located
29593
filename (str): the filename required.
296-
29794
"""
29895
progress_bar_length = 72
29996
block_size = 1024
@@ -331,9 +128,7 @@ def _download_file(url: str, filename: str) -> None:
331128

332129

333130
def _check_hash(filename, checksum):
334-
"""
335-
Checks if existing file hash matches checksum from url
336-
"""
131+
"""Checks if existing file hash matches checksum from url."""
337132
algorithm, value = checksum.split(":")
338133
if not os.path.exists(filename):
339134
return value, "invalid"

floatcsep/cmd/main.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ def reproduce(config, **kwargs):
5252

5353
log.info(f"floatCSEP v{__version__} | Reproduce")
5454

55-
reproduced_exp = Experiment.from_yml(config, reprdir="reproduced", **kwargs)
55+
reproduced_exp = Experiment.from_yml(config, repr_dir="reproduced", **kwargs)
5656
reproduced_exp.stage_models()
5757
reproduced_exp.set_tasks()
5858
reproduced_exp.run()

0 commit comments

Comments
 (0)