189 lines
6.5 KiB
Python
189 lines
6.5 KiB
Python
import glob
|
|
from io import BytesIO
|
|
from quart import Blueprint, request, send_file
|
|
from matplotlib import pyplot as plt
|
|
from CONSTANT import DATA_BASEPATH
|
|
from modules.saber.planetw_perday import saber_planetw_plot_perday
|
|
from modules.saber.planetw_plot import saber_planetw_plot
|
|
from modules.saber.planetw_process import saber_planetw_process
|
|
from modules.saber.gravityw_process import SaberGravitywProcessor
|
|
from modules.saber.gravityw_render import SaberGravitywRenderer
|
|
from modules.saber.utils import *
|
|
from quart.utils import run_sync
|
|
|
|
|
|
saber_module = Blueprint('saber', __name__)
|
|
# lat_range = (30.0, 40.0)
|
|
# alt_range = (20.0, 105.0)
|
|
# lambda_range = (2, 15)
|
|
# lvboin = True
|
|
|
|
# processor = DataProcessor(
|
|
# lat_range=lat_range, alt_range=alt_range, lambda_range=lambda_range, lvboin=lvboin)
|
|
renderer = SaberGravitywRenderer()
|
|
|
|
|
|
def get_gravityw_processer():
|
|
lat_str = request.args.get("lat_range")
|
|
# if found ~ in str, replace it with ,
|
|
if "~" in lat_str:
|
|
lat_str = lat_str.replace("~", ",")
|
|
if lat_str is None:
|
|
lat_str = "30.0,40.0"
|
|
print(lat_str)
|
|
lat_range = tuple(map(float, lat_str.split(",")))
|
|
print(lat_range)
|
|
alt_str = request.args.get("alt_range")
|
|
if alt_str is None:
|
|
alt_str = "20.0,105.0"
|
|
alt_range = tuple(map(float, alt_str.split(",")))
|
|
lambda_str = request.args.get("lambda_range")
|
|
if lambda_str is None:
|
|
lambda_str = "2,15"
|
|
lambda_range = tuple(map(int, lambda_str.split(",")))
|
|
lvboin = request.args.get("lvboin") == "true"
|
|
if lvboin is None:
|
|
lvboin = True
|
|
|
|
_p = SaberGravitywProcessor(
|
|
lat_range=lat_range, alt_range=alt_range, lambda_range=lambda_range, lvboin=lvboin)
|
|
return _p
|
|
|
|
|
|
async def extract_payload():
|
|
buffer = BytesIO()
|
|
plt.savefig(buffer, format="png")
|
|
buffer.seek(0)
|
|
return await send_file(buffer, mimetype="image/png")
|
|
|
|
|
|
_all_saber_files = glob.glob(f"{DATA_BASEPATH.saber}/**/**.nc", recursive=True)
|
|
|
|
|
|
@saber_module.route("/metadata")
|
|
def get_files():
|
|
# normalizing the path, and replace \\ with /
|
|
all_saber_files = [path.replace("\\", "/") for path in _all_saber_files]
|
|
return all_saber_files
|
|
|
|
|
|
@saber_module.route("/metadata/list_days")
|
|
async def get_days():
|
|
path = request.args.get("path")
|
|
|
|
ncfile = await run_sync(data_nc_load)(path)
|
|
|
|
return ncfile.date_time.tolist()
|
|
|
|
|
|
@saber_module.route("/render/gravity_wave/per_day/wave_fitting")
|
|
@saber_module.route("/render/plot_wave_fitting")
|
|
async def do_plot_wave_day_fitting():
|
|
path = request.args.get("path")
|
|
day = request.args.get("day")
|
|
height = request.args.get("height_no")
|
|
|
|
ncfile = await run_sync(data_nc_load)(path)
|
|
processor = await run_sync(get_gravityw_processer)()
|
|
data = await run_sync(processor.process_day)(ncfile, int(day))
|
|
await run_sync(renderer.plot_wave_fitting)(data, int(height))
|
|
return await extract_payload()
|
|
|
|
|
|
@saber_module.route("/render/gravity_wave/per_day/fft_ifft")
|
|
@saber_module.route("/render/day_fft_ifft_plot")
|
|
async def do_day_fft_ifft_plot():
|
|
path = request.args.get("path")
|
|
day = request.args.get("day")
|
|
cycle_no = request.args.get("cycle_no")
|
|
|
|
ncfile = await run_sync(data_nc_load)(path)
|
|
processor = await run_sync(get_gravityw_processer)()
|
|
data = await run_sync(processor.process_day)(ncfile, int(day))
|
|
# 高度滤波处理
|
|
await run_sync(renderer.day_fft_ifft_plot)(wave_data=data, cycle_no=int(cycle_no))
|
|
return await extract_payload()
|
|
|
|
|
|
@saber_module.route("/render/gravity_wave/per_day/power_wave_plot")
|
|
@saber_module.route("/render/day_cycle_power_wave_plot")
|
|
async def do_day_cycle_power_wave_plot():
|
|
path = request.args.get("path")
|
|
day = request.args.get("day")
|
|
cycle_no = request.args.get("cycle_no")
|
|
|
|
ncfile = await run_sync(data_nc_load)(path)
|
|
processor = await run_sync(get_gravityw_processer)()
|
|
data = await run_sync(processor.process_day)(ncfile, int(day))
|
|
await run_sync(renderer.day_cycle_power_wave_plot)(wave_data=data, cycle_no=int(cycle_no))
|
|
return await extract_payload()
|
|
|
|
|
|
@saber_module.route("/render/gravity_wave/per_month/power_wave_plot")
|
|
@saber_module.route("/render/month_power_wave_plot")
|
|
async def do_month_power_wave_plot():
|
|
path = request.args.get("path")
|
|
month = request.args.get("month")
|
|
|
|
ncfile = await run_sync(data_nc_load)(path)
|
|
processor = await run_sync(get_gravityw_processer)()
|
|
data = await run_sync(processor.process_month)(ncfile)
|
|
await run_sync(renderer.month_power_wave_plot)(wave_data=data, date_time=ncfile.date_time)
|
|
return await extract_payload()
|
|
|
|
|
|
@saber_module.route("/render/gravity_wave/per_year/power_wave_plot")
|
|
@saber_module.route("/render/year_power_wave_plot")
|
|
async def do_year_power_wave_plot():
|
|
year = request.args.get("year")
|
|
processor = await run_sync(get_gravityw_processer)()
|
|
data = await run_sync(processor.process_year)([
|
|
data_nc_load(path) for path in glob.glob(f"{DATA_BASEPATH.saber}/{year}/*.nc")
|
|
])
|
|
await run_sync(renderer.year_power_wave_plot)(year_wave=data)
|
|
return await extract_payload()
|
|
|
|
|
|
@saber_module.route("/render/planet_wave/per_year/energy_plot")
|
|
# above path is named correctly
|
|
# below path is named wrongly, but kept due to compatibility
|
|
@saber_module.route("/render/gravity_year")
|
|
async def do_gravity_year():
|
|
year = request.args.get("year")
|
|
T = request.args.get("T")
|
|
k = request.args.get("k")
|
|
H = request.args.get("H")
|
|
lat_target = request.args.get("lat_target")
|
|
year = int(year)
|
|
T = int(T)
|
|
if T not in [5, 10, 16]:
|
|
raise ValueError("T must be in [5, 10, 16]")
|
|
data = await run_sync(saber_planetw_process)(
|
|
year,
|
|
target_h=int(H),
|
|
target_lat=int(lat_target)
|
|
)
|
|
await run_sync(saber_planetw_plot)(data, T, k=int(k))
|
|
return await extract_payload()
|
|
|
|
|
|
@saber_module.route("/render/planet_wave/per_day")
|
|
async def do_pl_year():
|
|
year = request.args.get("year")
|
|
T = request.args.get("T")
|
|
# k = request.args.get("k")
|
|
H = request.args.get("H")
|
|
lat_target = request.args.get("lat_target")
|
|
start_day = request.args.get("start_day", 0)
|
|
year = int(year)
|
|
T = int(T)
|
|
if T not in [5, 10, 16]:
|
|
raise ValueError("T must be in [5, 10, 16]")
|
|
data = await run_sync(saber_planetw_process)(
|
|
year,
|
|
target_h=int(H),
|
|
target_lat=int(lat_target)
|
|
)
|
|
await run_sync(saber_planetw_plot_perday)(data, T, int(start_day))
|
|
return await extract_payload()
|