checkpoint: before files dir migrate

This commit is contained in:
Dustella 2025-02-13 18:38:05 +08:00
parent 9f93b1a158
commit 7237b0ec19
Signed by: Dustella
GPG Key ID: 35AA0AA3DC402D5C
8 changed files with 101 additions and 49 deletions

5
.gitignore vendored
View File

@ -5,4 +5,7 @@
# Include .gitignore itself # Include .gitignore itself
!.gitignore !.gitignore
# Recursively allow .py files in subdirectories # Recursively allow .py files in subdirectories
!*/ !*/
dist
build

View File

@ -1,3 +1,4 @@
from matplotlib import pyplot as plt
import cosmic import cosmic
import tidi import tidi
from utils import * from utils import *
@ -11,7 +12,10 @@ import sys
import matplotlib.font_manager as fm import matplotlib.font_manager as fm
app = Quart(__name__) app = Quart(__name__)
app = cors(app, send_origin_wildcard=True, allow_origin="*")
plt.switch_backend('agg')
fm.fontManager.addfont("./SimHei.ttf") fm.fontManager.addfont("./SimHei.ttf")
@app.before_request @app.before_request
def auth(): 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(tidi.tidi_module, url_prefix="/tidi")
app.register_blueprint(cosmic.cosmic_module, url_prefix="/cosmic") app.register_blueprint(cosmic.cosmic_module, url_prefix="/cosmic")
# allow cors # allow cors
app = cors(app)
if __name__ == '__main__': if __name__ == '__main__':
# get args '--prod' # get args '--prod'
args = sys.argv args = sys.argv
if 'prod' in args: if 'prod' in args:
app.run("0.0.0.0", port=5000, debug=False)
pass pass
elif 'debug' in args: elif 'debug' in args:
app.run("0.0.0.0",port=18200,debug=True) app.run("0.0.0.0",port=18200,debug=True)

View File

@ -2,7 +2,9 @@ from io import BytesIO
from quart import Blueprint, request, send_file from quart import Blueprint, request, send_file
from matplotlib import pyplot as plt from matplotlib import pyplot as plt
from cosmic.single import SingleCosmicWavePlot
from cosmic.temp_render import temp_render from cosmic.temp_render import temp_render
from quart.utils import run_sync
cosmic_module = Blueprint("Cosmic", __name__) cosmic_module = Blueprint("Cosmic", __name__)
@ -14,9 +16,29 @@ def get_meta():
@cosmic_module.route('/temp_render') @cosmic_module.route('/temp_render')
async def render(): async def render():
T = request.args.get("T", 16) T = request.args.get("T", 16)
temp_render(T=int(T)) await run_sync(temp_render)(T=int(T))
buf = BytesIO() buf = BytesIO()
plt.savefig(buf, format="png") plt.savefig(buf, format="png")
buf.seek(0) 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") return await send_file(buf, mimetype="image/png")

View File

@ -15,7 +15,7 @@ plt.rcParams['axes.unicode_minus'] = False # 正常显示负号
def process_single_file(base_folder_path, i): 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) folder_path = os.path.join(base_folder_path, folder_name)
# 检查文件夹是否存在 # 检查文件夹是否存在
if os.path.exists(folder_path): if os.path.exists(folder_path):
@ -269,7 +269,7 @@ def process_single_file(base_folder_path, i):
# 主循环处理1到3个文件 # 主循环处理1到3个文件
base_folder_path = r"./cosmic/data/2018" base_folder_path = r"./cosmic/data/2008"
all_mean_ktemp_Nz = [] all_mean_ktemp_Nz = []
all_mean_ktemp_Ptz = [] all_mean_ktemp_Ptz = []
for file_index in range(1, 365): for file_index in range(1, 365):

View File

@ -1,4 +1,5 @@
import os import os
import time
import numpy as np import numpy as np
import pandas as pd import pandas as pd
from scipy.interpolate import interp1d from scipy.interpolate import interp1d
@ -22,7 +23,7 @@ def read_and_preprocess_data(base_folder_path, day_num):
""" """
dfs = [] 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) folder_path = os.path.join(base_folder_path, folder_name)
# 检查文件夹是否存在 # 检查文件夹是否存在
if os.path.exists(folder_path): if os.path.exists(folder_path):
@ -340,7 +341,7 @@ def calculate_potential_energy(background_temperatures, result, heights):
# 模块7 绘制重力波势能和浮力频率日图 # 模块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): 高度数据数组 heights (np.ndarray): 高度数据数组
""" """
# 绘制平均浮力频率mean_ktemp_Nz随高度变化的图像 # 绘制平均浮力频率mean_ktemp_Nz随高度变化的图像
plt.clf()
plt.figure(figsize=(10, 6)) plt.figure(figsize=(10, 6))
plt.plot(mean_ktemp_Nz, heights / 1000) # 高度单位换算为km方便展示 plt.plot(mean_ktemp_Nz, heights / 1000) # 高度单位换算为km方便展示
plt.xlabel('Average (N_z)') plt.xlabel('Average (N_z)')
plt.ylabel('H(km)') plt.ylabel('H(km)')
# plt.gca().invert_yaxis() # 使高度坐标轴从上到下递增,符合常规习惯 # plt.gca().invert_yaxis() # 使高度坐标轴从上到下递增,符合常规习惯
plt.show() # plt.show()
def plot_results_mean_ktemp_Ptz(mean_ktemp_Ptz, heights):
"""
# 绘制平均势能mean_ktemp_Ptz随高度变化的图像 # 绘制平均势能mean_ktemp_Ptz随高度变化的图像
"""
# clean the plot
plt.clf()
plt.figure(figsize=(10, 6)) plt.figure(figsize=(10, 6))
plt.plot(mean_ktemp_Ptz, heights / 1000) # 高度单位换算为km方便展示 plt.plot(mean_ktemp_Ptz, heights / 1000) # 高度单位换算为km方便展示
plt.xlabel('Average (PT_z)') plt.xlabel('Average (PT_z)')
plt.ylabel('H (km)') plt.ylabel('H (km)')
# plt.gca().invert_yaxis() # 使高度坐标轴从上到下递增,符合常规习惯 # plt.gca().invert_yaxis() # 使高度坐标轴从上到下递增,符合常规习惯
plt.show() # plt.show()
if __name__ == "__main__": class SingleCosmicWavePlot:
base_folder_path = r"./cosmic/data/2018"
day_num = 1 def __init__(self, year, day):
# 模块1调用
final_df = read_and_preprocess_data(base_folder_path, day_num) base_folder_path = f"./cosmic/data/{year}"
# 模块2调用 day_num = day
latitude_filtered_df, altitude_temperature_mean = filter_and_grid_data( # 模块1调用
final_df) final_df = read_and_preprocess_data(base_folder_path, day_num)
# 模块3调用 # 模块2调用
merged_df = calculate_wn0_and_perturbation( latitude_filtered_df, altitude_temperature_mean = filter_and_grid_data(
latitude_filtered_df, altitude_temperature_mean) final_df)
# 模块4调用 # 模块3调用
fit_results, residuals, background_temperatures = wave_fitting_and_filtering( merged_df = calculate_wn0_and_perturbation(
merged_df) latitude_filtered_df, altitude_temperature_mean)
# 模块5调用 # 模块4调用
result = bandpass_filtering(residuals) fit_results, residuals, background_temperatures = wave_fitting_and_filtering(
# 创建从1到80km的高度列表按照代码中原本逻辑转换为对应单位的数组 merged_df)
heights = np.linspace(0, 60000, 3000) # 模块5调用
# 模块6调用计算势能相关数据并获取平均浮力频率和平均势能 result = bandpass_filtering(residuals)
mean_ktemp_Nz, mean_ktemp_Ptz = calculate_potential_energy( # 创建从1到80km的高度列表按照代码中原本逻辑转换为对应单位的数组
background_temperatures, result, heights) heights = np.linspace(0, 60000, 3000)
print("平均浮力频率mean_ktemp_Nz:", mean_ktemp_Nz) # 模块6调用计算势能相关数据并获取平均浮力频率和平均势能
print("平均势能mean_ktemp_Ptz:", mean_ktemp_Ptz) 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)

View File

@ -5,6 +5,7 @@ from matplotlib import pyplot as plt
from saber.process import DataProcessor from saber.process import DataProcessor
from saber.render import Renderer from saber.render import Renderer
from saber.utils import * from saber.utils import *
from quart.utils import run_sync
saber_module = Blueprint('saber', __name__) saber_module = Blueprint('saber', __name__)
@ -74,8 +75,8 @@ async def do_plot_wave_day_fitting():
ncfile = data_nc_load(path) ncfile = data_nc_load(path)
processor = get_processer() processor = get_processer()
data = processor.process_day(ncfile, int(day)) data = await run_sync(processor.process_day)(ncfile, int(day))
renderer.plot_wave_fitting(data, int(height)) await run_sync(renderer.plot_wave_fitting)(data, int(height))
return await extract_payload() return await extract_payload()
@ -87,8 +88,9 @@ async def do_day_fft_ifft_plot():
ncfile = data_nc_load(path) ncfile = data_nc_load(path)
processor = get_processer() processor = get_processer()
data = processor.process_day(ncfile, int(day)) data = await run_sync(processor.process_day)(ncfile, int(day))
renderer.day_fft_ifft_plot(wave_data=data, cycle_no=int(cycle_no)) # 高度滤波处理
await run_sync(renderer.day_fft_ifft_plot)(wave_data=data, cycle_no=int(cycle_no))
return await extract_payload() return await extract_payload()
@ -100,8 +102,8 @@ async def do_day_cycle_power_wave_plot():
ncfile = data_nc_load(path) ncfile = data_nc_load(path)
processor = get_processer() processor = get_processer()
data = processor.process_day(ncfile, int(day)) data = await run_sync(processor.process_day)(ncfile, int(day))
renderer.day_cycle_power_wave_plot(wave_data=data, cycle_no=int(cycle_no)) await run_sync(renderer.day_cycle_power_wave_plot)(wave_data=data, cycle_no=int(cycle_no))
return await extract_payload() return await extract_payload()
@ -112,8 +114,8 @@ async def do_month_power_wave_plot():
ncfile = data_nc_load(path) ncfile = data_nc_load(path)
processor = get_processer() processor = get_processer()
data = processor.process_month(ncfile) data =await run_sync(processor.process_month)(ncfile)
renderer.month_power_wave_plot(wave_data=data, date_time=ncfile.date_time) await run_sync(renderer.month_power_wave_plot)(wave_data=data, date_time=ncfile.date_time)
return await extract_payload() return await extract_payload()
@ -121,8 +123,8 @@ async def do_month_power_wave_plot():
async def do_year_power_wave_plot(): async def do_year_power_wave_plot():
year = request.args.get("year") year = request.args.get("year")
processor = get_processer() 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") 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() return await extract_payload()

View File

@ -1,6 +1,7 @@
import glob import glob
from io import BytesIO from io import BytesIO
from quart import Blueprint, request, send_file from quart import Blueprint, request, send_file
from quart.utils import run_sync
from matplotlib import pyplot as plt from matplotlib import pyplot as plt
from tidi.plot import TidiPlotv2 from tidi.plot import TidiPlotv2
@ -28,7 +29,7 @@ async def render_wave():
k = int(k) k = int(k)
T = int(T) T = int(T)
tidi_render(mode, year, k, T) await run_sync(tidi_render)(mode, year, k, T)
buffer = BytesIO() buffer = BytesIO()
plt.savefig(buffer, format="png") plt.savefig(buffer, format="png")
buffer.seek(0) buffer.seek(0)
@ -40,8 +41,8 @@ async def render_stats_v1():
year = request.args.get('year') year = request.args.get('year')
year = int(year) year = int(year)
plotter = TidiPlotv2(year) plotter = await run_sync(TidiPlotv2)(year)
plotter.plot_v1() await run_sync(plotter.plot_v1)()
buffer = BytesIO() buffer = BytesIO()
plt.savefig(buffer, format="png") plt.savefig(buffer, format="png")
buffer.seek(0) buffer.seek(0)
@ -52,8 +53,8 @@ async def render_stats_v2():
year = request.args.get('year') year = request.args.get('year')
year = int(year) year = int(year)
plotter = TidiPlotv2(year) plotter = await run_sync(TidiPlotv2)(year)
plotter.plot_month() await run_sync(plotter.plot_month)()
buffer = BytesIO() buffer = BytesIO()
plt.savefig(buffer, format="png") plt.savefig(buffer, format="png")
buffer.seek(0) buffer.seek(0)

View File

@ -1,3 +1,5 @@
# 行星波
#此代码是对数据处理后的txt数据进行行星波参数提取绘图 #此代码是对数据处理后的txt数据进行行星波参数提取绘图
#2006_TIDI_V_Meridional_data.txt也可以做同样处理一个是经向风提取的行星波一个是纬向风的 #2006_TIDI_V_Meridional_data.txt也可以做同样处理一个是经向风提取的行星波一个是纬向风的