Fix coverage: add /api/coverage route, remove stray gather code from loadCoverage
This commit is contained in:
71
scripts/extract_h5_calibrated.py
Executable file
71
scripts/extract_h5_calibrated.py
Executable file
@@ -0,0 +1,71 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Script d'extraction de données H5 calibrées (format 2026).
|
||||
Lit calibrated_data/channel_X (valeurs physiques avec unités).
|
||||
"""
|
||||
|
||||
import argparse
|
||||
import json
|
||||
import sys
|
||||
import h5py
|
||||
import numpy as np
|
||||
|
||||
def extract_window(file_path: str, channel: int, start_ts: int, duration_sec: int) -> dict:
|
||||
try:
|
||||
with h5py.File(file_path, 'r') as f:
|
||||
# Métadonnées
|
||||
meta = f['metadata']
|
||||
sample_rate = meta.attrs['sample_rate_hz']
|
||||
file_duration = meta.attrs['duration_sec']
|
||||
total_samples = meta.attrs['n_samples']
|
||||
|
||||
# Dataset calibré
|
||||
dataset = f[f'calibrated_data/channel_{channel}']
|
||||
|
||||
# Calcul indices (si start_ts = 0, on prend depuis le début)
|
||||
start_idx = int(start_ts * sample_rate) if start_ts > 0 else 0
|
||||
num_samples = int(duration_sec * sample_rate) if duration_sec > 0 else total_samples
|
||||
end_idx = min(start_idx + num_samples, total_samples)
|
||||
|
||||
# Extraire
|
||||
samples = dataset[start_idx:end_idx]
|
||||
|
||||
# Unité selon le canal
|
||||
unit = 'm/s' if channel in [1, 2, 3] else 'Pa'
|
||||
channel_name = f'Geophone {channel}' if channel in [1, 2, 3] else 'Hydrophone'
|
||||
|
||||
return {
|
||||
"samples": samples.tolist(),
|
||||
"start_idx": int(start_idx),
|
||||
"end_idx": int(end_idx),
|
||||
"total_samples": int(total_samples),
|
||||
"sample_rate": int(sample_rate),
|
||||
"duration_sec": float(file_duration),
|
||||
"channel": channel,
|
||||
"channel_name": channel_name,
|
||||
"unit": unit,
|
||||
"stats": {
|
||||
"min": float(np.min(samples)),
|
||||
"max": float(np.max(samples)),
|
||||
"mean": float(np.mean(samples)),
|
||||
"std": float(np.std(samples)),
|
||||
"rms": float(np.sqrt(np.mean(samples**2)))
|
||||
},
|
||||
"source": "calibrated_h5_2026"
|
||||
}
|
||||
except Exception as e:
|
||||
return {"error": str(e)}
|
||||
|
||||
def main():
|
||||
parser = argparse.ArgumentParser(description='Extraction H5 calibré')
|
||||
parser.add_argument('--file', required=True, help='Fichier H5')
|
||||
parser.add_argument('--channel', type=int, required=True, help='Canal 1-4')
|
||||
parser.add_argument('--start', type=int, default=0, help='Offset secondes (0=début)')
|
||||
parser.add_argument('--duration', type=int, default=0, help='Durée secondes (0=tout)')
|
||||
args = parser.parse_args()
|
||||
|
||||
result = extract_window(args.file, args.channel, args.start, args.duration)
|
||||
print(json.dumps(result))
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
Reference in New Issue
Block a user