Source code for scmiracle.download_data
import os
import sys
import tarfile
import requests
_DATASETS = {
"DOTEA_mudata": {
"archive_name": "DOTEA_mudata.tar.gz",
"extract_dir": "DOTEA_mudata",
"url": "https://pub-c608fed55b484fd79e24335cfb8e2509.r2.dev/DOTEA_mudata.tar.gz",
},
"atlas_transfer_mudata": {
"archive_name": "atlas_transfer_mudata.tar.gz",
"extract_dir": "atlas_transfer_mudata",
"url": "https://pub-c608fed55b484fd79e24335cfb8e2509.r2.dev/atlas_transfer_mudata.tar.gz",
},
}
# Backward-compatible alias for older examples.
_ALIASES = {
"DOTEA": "DOTEA_mudata",
}
def _canonical_dataset_name(data):
return _ALIASES.get(data, data)
def _download_url(dataset_name):
return _DATASETS[dataset_name]["url"]
[docs]
def list_available_datasets():
"""
Displays a list of all datasets that can be downloaded.
"""
print("Available datasets for download:")
for dataset_name in _DATASETS.keys():
print(f"- {dataset_name}")
print("\nOptional aliases:")
for alias_name, target_name in _ALIASES.items():
print(f"- {alias_name} -> {target_name}")
print("\nPlease choose a dataset name exactly as listed above.")
def _extract_archive(archive_path, destination_dir):
with tarfile.open(archive_path, "r:gz") as tar_ref:
tar_ref.extractall(destination_dir)
[docs]
def download(data, data_path):
"""
Downloads and extracts a specified dataset to the given data_path.
Includes a progress bar for downloads.
Args:
data (str): The dataset name, e.g. 'DOTEA_mudata'.
data_path (str): The base directory where the data should be stored.
"""
dataset_name = _canonical_dataset_name(data)
if dataset_name not in _DATASETS:
print(f"Error: Dataset '{data}' not recognized.")
list_available_datasets()
return
dataset_info = _DATASETS[dataset_name]
target_dir_path = os.path.join(data_path, dataset_info["extract_dir"])
archive_path = os.path.join(data_path, dataset_info["archive_name"])
if os.path.exists(target_dir_path):
print(f"Directory {target_dir_path} already exists. Skipping download and extraction.")
print(f"'{dataset_name}' data path is set to: {target_dir_path}")
return
os.makedirs(data_path, exist_ok=True)
try:
download_url = _download_url(dataset_name)
print(f"Downloading '{dataset_name}' from {download_url}...")
response = requests.get(download_url, stream=True)
response.raise_for_status()
total_size = int(response.headers.get("content-length", 0))
block_size = 8192
downloaded_size = 0
with open(archive_path, "wb") as f:
for chunk in response.iter_content(chunk_size=block_size):
if not chunk:
continue
f.write(chunk)
downloaded_size += len(chunk)
if total_size > 0:
progress = (downloaded_size / total_size) * 100
sys.stdout.write(
f"\rDownloading: {downloaded_size / (1024 * 1024):.2f}MB / "
f"{total_size / (1024 * 1024):.2f}MB ({progress:.2f}%)"
)
sys.stdout.flush()
if total_size > 0:
sys.stdout.write("\n")
print(f"Download complete: {archive_path}")
print(f"Extracting {archive_path} to {data_path}...")
_extract_archive(archive_path, data_path)
print("Extraction complete.")
if not os.path.exists(target_dir_path):
raise FileNotFoundError(
f"Expected extracted directory was not found: {target_dir_path}"
)
os.remove(archive_path)
print(f"Removed temporary archive: {archive_path}")
except requests.exceptions.RequestException as e:
print(f"\nError during download: {e}")
except (tarfile.TarError, OSError) as e:
print(f"\nError during extraction: {e}")
except Exception as e:
print(f"\nAn unexpected error occurred: {e}")
print(f"'{dataset_name}' data path is set to: {target_dir_path}")