From 7237b0ec1953ce2c6366c80d756d43a1abd320f9 Mon Sep 17 00:00:00 2001 From: Dustella Date: Thu, 13 Feb 2025 18:38:05 +0800 Subject: [PATCH] checkpoint: before files dir migrate --- .gitignore | 5 ++- backend.py | 7 +++-- cosmic/__init__.py | 24 ++++++++++++++- cosmic/multiple.py | 4 +-- cosmic/single.py | 75 ++++++++++++++++++++++++++++----------------- saber/__init__.py | 22 +++++++------ tidi/__init__.py | 11 ++++--- tidi/staged/plot.py | 2 ++ 8 files changed, 101 insertions(+), 49 deletions(-) diff --git a/.gitignore b/.gitignore index a80a3d6..c5f9266 100644 --- a/.gitignore +++ b/.gitignore @@ -5,4 +5,7 @@ # Include .gitignore itself !.gitignore # Recursively allow .py files in subdirectories -!*/ \ No newline at end of file +!*/ + +dist +build \ No newline at end of file diff --git a/backend.py b/backend.py index 1a6d38c..b601d4e 100644 --- a/backend.py +++ b/backend.py @@ -1,3 +1,4 @@ +from matplotlib import pyplot as plt import cosmic import tidi from utils import * @@ -11,7 +12,10 @@ import sys import matplotlib.font_manager as fm app = Quart(__name__) +app = cors(app, send_origin_wildcard=True, allow_origin="*") + +plt.switch_backend('agg') fm.fontManager.addfont("./SimHei.ttf") @app.before_request def auth(): @@ -34,14 +38,13 @@ app.register_blueprint(saber.saber_module, url_prefix="/saber") app.register_blueprint(tidi.tidi_module, url_prefix="/tidi") app.register_blueprint(cosmic.cosmic_module, url_prefix="/cosmic") # allow cors -app = cors(app) if __name__ == '__main__': # get args '--prod' args = sys.argv if 'prod' in args: - + app.run("0.0.0.0", port=5000, debug=False) pass elif 'debug' in args: app.run("0.0.0.0",port=18200,debug=True) diff --git a/cosmic/__init__.py b/cosmic/__init__.py index b02f2d9..232b376 100644 --- a/cosmic/__init__.py +++ b/cosmic/__init__.py @@ -2,7 +2,9 @@ from io import BytesIO from quart import Blueprint, request, send_file from matplotlib import pyplot as plt +from cosmic.single import SingleCosmicWavePlot from cosmic.temp_render import temp_render +from quart.utils import run_sync cosmic_module = Blueprint("Cosmic", __name__) @@ -14,9 +16,29 @@ def get_meta(): @cosmic_module.route('/temp_render') async def render(): T = request.args.get("T", 16) - temp_render(T=int(T)) + await run_sync(temp_render)(T=int(T)) buf = BytesIO() plt.savefig(buf, format="png") buf.seek(0) + return await send_file(buf, mimetype="image/png") + +@cosmic_module.route('/render/single') +async def single_render(): + year = request.args.get("year", 2008) + day = request.args.get("day", 1) + mode = request.args.get("mode", "mean_ktemp_Nz") + + p :SingleCosmicWavePlot = await run_sync(SingleCosmicWavePlot)(year=int(year), day=int(day)) + if mode == "mean_ktemp_Nz": + await run_sync(p.plot_results_mean_ktemp_Nz)() + elif mode == "mean_ktemp_Ptz": + await run_sync(p.plot_results_mean_ktemp_Ptz)() + else : + raise ValueError("Invalid mode") + + buf = BytesIO() + plt.savefig(buf, format="png") + buf.seek(0) + return await send_file(buf, mimetype="image/png") \ No newline at end of file diff --git a/cosmic/multiple.py b/cosmic/multiple.py index dc18895..a4306be 100644 --- a/cosmic/multiple.py +++ b/cosmic/multiple.py @@ -15,7 +15,7 @@ plt.rcParams['axes.unicode_minus'] = False # 正常显示负号 def process_single_file(base_folder_path, i): # 构建当前文件夹的路径 - folder_name = f"atmPrf_repro2021_2018_00{i}" if i < 10 else f"atmPrf_repro2021_2008_0{i}" + folder_name = f"atmPrf_repro2021_2008_00{i}" if i < 10 else f"atmPrf_repro2021_2008_0{i}" folder_path = os.path.join(base_folder_path, folder_name) # 检查文件夹是否存在 if os.path.exists(folder_path): @@ -269,7 +269,7 @@ def process_single_file(base_folder_path, i): # 主循环,处理1到3个文件 -base_folder_path = r"./cosmic/data/2018" +base_folder_path = r"./cosmic/data/2008" all_mean_ktemp_Nz = [] all_mean_ktemp_Ptz = [] for file_index in range(1, 365): diff --git a/cosmic/single.py b/cosmic/single.py index 2e018a1..8694c39 100644 --- a/cosmic/single.py +++ b/cosmic/single.py @@ -1,4 +1,5 @@ import os +import time import numpy as np import pandas as pd from scipy.interpolate import interp1d @@ -22,7 +23,7 @@ def read_and_preprocess_data(base_folder_path, day_num): """ dfs = [] # 构建当前文件夹的路径 - folder_name = f"atmPrf_repro2021_2018_00{day_num}" if day_num < 10 else f"atmPrf_repro2021_2018_0{day_num}" + folder_name = f"atmPrf_repro2021_2008_00{day_num}" if day_num < 10 else f"atmPrf_repro2021_2008_0{day_num}" folder_path = os.path.join(base_folder_path, folder_name) # 检查文件夹是否存在 if os.path.exists(folder_path): @@ -340,7 +341,7 @@ def calculate_potential_energy(background_temperatures, result, heights): # 模块7 绘制重力波势能和浮力频率日图 -def plot_results(mean_ktemp_Nz, mean_ktemp_Ptz, heights): +def plot_results_mean_ktemp_Nz(mean_ktemp_Nz, heights): """ 绘制平均浮力频率和平均势能随高度变化的图像 @@ -350,44 +351,62 @@ def plot_results(mean_ktemp_Nz, mean_ktemp_Ptz, heights): heights (np.ndarray): 高度数据数组 """ # 绘制平均浮力频率(mean_ktemp_Nz)随高度变化的图像 + plt.clf() plt.figure(figsize=(10, 6)) plt.plot(mean_ktemp_Nz, heights / 1000) # 高度单位换算为km,方便展示 plt.xlabel('Average (N_z)') plt.ylabel('H(km)') # plt.gca().invert_yaxis() # 使高度坐标轴从上到下递增,符合常规习惯 - plt.show() + # plt.show() + +def plot_results_mean_ktemp_Ptz(mean_ktemp_Ptz, heights): + """ # 绘制平均势能(mean_ktemp_Ptz)随高度变化的图像 + """ + # clean the plot + plt.clf() plt.figure(figsize=(10, 6)) plt.plot(mean_ktemp_Ptz, heights / 1000) # 高度单位换算为km,方便展示 plt.xlabel('Average (PT_z)') plt.ylabel('H (km)') # plt.gca().invert_yaxis() # 使高度坐标轴从上到下递增,符合常规习惯 - plt.show() + # plt.show() -if __name__ == "__main__": - base_folder_path = r"./cosmic/data/2018" - day_num = 1 - # 模块1调用 - final_df = read_and_preprocess_data(base_folder_path, day_num) - # 模块2调用 - latitude_filtered_df, altitude_temperature_mean = filter_and_grid_data( - final_df) - # 模块3调用 - merged_df = calculate_wn0_and_perturbation( - latitude_filtered_df, altitude_temperature_mean) - # 模块4调用 - fit_results, residuals, background_temperatures = wave_fitting_and_filtering( - merged_df) - # 模块5调用 - result = bandpass_filtering(residuals) - # 创建从1到80km的高度列表(按照代码中原本逻辑转换为对应单位的数组) - heights = np.linspace(0, 60000, 3000) - # 模块6调用,计算势能相关数据并获取平均浮力频率和平均势能 - mean_ktemp_Nz, mean_ktemp_Ptz = calculate_potential_energy( - background_temperatures, result, heights) - print("平均浮力频率(mean_ktemp_Nz):", mean_ktemp_Nz) - print("平均势能(mean_ktemp_Ptz):", mean_ktemp_Ptz) +class SingleCosmicWavePlot: + + def __init__(self, year, day): + + base_folder_path = f"./cosmic/data/{year}" + day_num = day + # 模块1调用 + final_df = read_and_preprocess_data(base_folder_path, day_num) + # 模块2调用 + latitude_filtered_df, altitude_temperature_mean = filter_and_grid_data( + final_df) + # 模块3调用 + merged_df = calculate_wn0_and_perturbation( + latitude_filtered_df, altitude_temperature_mean) + # 模块4调用 + fit_results, residuals, background_temperatures = wave_fitting_and_filtering( + merged_df) + # 模块5调用 + result = bandpass_filtering(residuals) + # 创建从1到80km的高度列表(按照代码中原本逻辑转换为对应单位的数组) + heights = np.linspace(0, 60000, 3000) + # 模块6调用,计算势能相关数据并获取平均浮力频率和平均势能 + mean_ktemp_Nz, mean_ktemp_Ptz = calculate_potential_energy( + background_temperatures, result, heights) + # print("平均浮力频率(mean_ktemp_Nz):", mean_ktemp_Nz) + # print("平均势能(mean_ktemp_Ptz):", mean_ktemp_Ptz) + self.mean_ktemp_Nz = mean_ktemp_Nz + self.mean_ktemp_Ptz = mean_ktemp_Ptz + self.heights = heights # 调用绘图模块函数进行绘图 - plot_results(mean_ktemp_Nz, mean_ktemp_Ptz, heights) + + def plot_results_mean_ktemp_Nz(self): + plot_results_mean_ktemp_Nz(self.mean_ktemp_Nz, self.heights) + + def plot_results_mean_ktemp_Ptz(self): + plot_results_mean_ktemp_Ptz(self.mean_ktemp_Ptz, self.heights) diff --git a/saber/__init__.py b/saber/__init__.py index 08d14ba..558b356 100644 --- a/saber/__init__.py +++ b/saber/__init__.py @@ -5,6 +5,7 @@ from matplotlib import pyplot as plt from saber.process import DataProcessor from saber.render import Renderer from saber.utils import * +from quart.utils import run_sync saber_module = Blueprint('saber', __name__) @@ -74,8 +75,8 @@ async def do_plot_wave_day_fitting(): ncfile = data_nc_load(path) processor = get_processer() - data = processor.process_day(ncfile, int(day)) - renderer.plot_wave_fitting(data, int(height)) + data = await run_sync(processor.process_day)(ncfile, int(day)) + await run_sync(renderer.plot_wave_fitting)(data, int(height)) return await extract_payload() @@ -87,8 +88,9 @@ async def do_day_fft_ifft_plot(): ncfile = data_nc_load(path) processor = get_processer() - data = processor.process_day(ncfile, int(day)) - renderer.day_fft_ifft_plot(wave_data=data, cycle_no=int(cycle_no)) + 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() @@ -100,8 +102,8 @@ async def do_day_cycle_power_wave_plot(): ncfile = data_nc_load(path) processor = get_processer() - data = processor.process_day(ncfile, int(day)) - renderer.day_cycle_power_wave_plot(wave_data=data, cycle_no=int(cycle_no)) + 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() @@ -112,8 +114,8 @@ async def do_month_power_wave_plot(): ncfile = data_nc_load(path) processor = get_processer() - data = processor.process_month(ncfile) - renderer.month_power_wave_plot(wave_data=data, date_time=ncfile.date_time) + 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() @@ -121,8 +123,8 @@ async def do_month_power_wave_plot(): async def do_year_power_wave_plot(): year = request.args.get("year") processor = get_processer() - data = processor.process_year([ + data = await run_sync(processor.process_year)([ data_nc_load(path) for path in glob.glob(f"./saber/data/{year}/*.nc") ]) - renderer.year_power_wave_plot(year_wave=data) + await run_sync(renderer.year_power_wave_plot)(year_wave=data) return await extract_payload() diff --git a/tidi/__init__.py b/tidi/__init__.py index 5eb7419..c67d88f 100644 --- a/tidi/__init__.py +++ b/tidi/__init__.py @@ -1,6 +1,7 @@ import glob from io import BytesIO from quart import Blueprint, request, send_file +from quart.utils import run_sync from matplotlib import pyplot as plt from tidi.plot import TidiPlotv2 @@ -28,7 +29,7 @@ async def render_wave(): k = int(k) T = int(T) - tidi_render(mode, year, k, T) + await run_sync(tidi_render)(mode, year, k, T) buffer = BytesIO() plt.savefig(buffer, format="png") buffer.seek(0) @@ -40,8 +41,8 @@ async def render_stats_v1(): year = request.args.get('year') year = int(year) - plotter = TidiPlotv2(year) - plotter.plot_v1() + plotter = await run_sync(TidiPlotv2)(year) + await run_sync(plotter.plot_v1)() buffer = BytesIO() plt.savefig(buffer, format="png") buffer.seek(0) @@ -52,8 +53,8 @@ async def render_stats_v2(): year = request.args.get('year') year = int(year) - plotter = TidiPlotv2(year) - plotter.plot_month() + plotter = await run_sync(TidiPlotv2)(year) + await run_sync(plotter.plot_month)() buffer = BytesIO() plt.savefig(buffer, format="png") buffer.seek(0) diff --git a/tidi/staged/plot.py b/tidi/staged/plot.py index 121c1d6..71d610d 100644 --- a/tidi/staged/plot.py +++ b/tidi/staged/plot.py @@ -1,3 +1,5 @@ +# 行星波 + #此代码是对数据处理后的txt数据进行行星波参数提取绘图 #2006_TIDI_V_Meridional_data.txt也可以做同样处理,一个是经向风提取的行星波,一个是纬向风的