python数据库接口_HAPI——HITRAN数据库python接口
HAPI (HITRAN Application Programming Interface) 是HITRAN数据库提供的一个python包,可以实现对HITRAN online数据库中谱线数据的下载,以及后续谱线的模拟等常用操作。HITRANonline: HAPIhitran.org
要使用HAPI,直接在上述网站下载.py文件,根据手册配置好环境即可,在脚本中import即可。此外,还需要制定数据存放的文件夹,如data文件夹。
from hapi import *
db_begin('data')
数据存放的文件夹中的数据分为一个.data文件和.header文件。除了通过fetch()从HITRAN online自动下载谱线数据外,还可以手动将符合HITRAN数据格式的.par文件(如HITEMP数据)直接存放在该文件夹下。HAPI会自动识别.par数据并为之生成.header。
HAPI常用的方法如下,详见getHelp()命令及手册:帮助
getHelp(name_of_the_function)
可以查看函数,谱线等的帮助。
从HITRAN online下载单一谱线数据到本地(db_begin()指定的文件夹)
fetch(TableName, M, I, numin, numax)
TableName: 本地保存的文件名
M: HITRAN中的分子编号
I: HITRAN中的同位素编号:
numin: 波数下限
numax: 波数上限
例:
fetch('HOH', 1, 1, 4000, 4100)
下载后,可以在db_begin()指定的文件夹中找到HOH.data和HOH.header文件。
建议下载过数据后不再使用该函数,改为直接读取文件夹中的数据。虽然不会重复下载,连接服务器仍需要一定时间。
过滤谱线数据
select(TableName, DestinationTableName='__BUFFER__', ParameterNames=None, Conditions=None, Output=True, File=None)
TableName: 数据文件名
DestinationTableName: 保存的文件名
ParameterNames: 参数列表
Conditions: 过滤条件,详见手册
Output: 文本输出
File: 文件输出
该函数支持表达式控制的复杂过滤条件,并且可以保存过滤到的数据,不过用DestinationTableName参数保存我自己测试不能用,可以用File参数输出成.par格式,也可以被HAPI读取。详见手册。
例:
select('sampletab', File='outtab.par', ParameterNames=(p1,p2), Conditions=(('and', ('>=', 'p1', 1), ('
将sampletab中p1>=1且p1*p2<20的p1,p2保存到outtab.par中。
提取谱线数据
getColumn(TableName, ParameterName)
TableName: 数据文件名
ParameterNames: 参数列表
输出选定数据文件选定参数的列表。
例:
p1 = getColumn('sampletab', 'p1')
可以得到sampletab的p1数据。很实用。
计算线型(以Voigt线型为例)
PROFILE_VOIGT(sg0, GamD, Gam0, sg)
sg0: 线中心位置(cm^-1).
GamD: Doppler HWHM(cm^-1)
Gam0: Speed-averaged line-width(cm^-1)
sg: 供计算的波数(cm^-1)
返回sg给定的波数范围对应的线型。
计算配分函数
partitionSum(M, I, T, step=None)
M: HITRAN中的分子编号
I: HITRAN中的同位素编号
T: 温度(K),可以是数,数组或范围
step: 计算温度的步长。若未指定步长则计算所有T的配分函数,若指定步长则计算T[0]与T[1]间以step为步长的配分函数
输出:
TT: 温度数组,只有当输入T为数组时才输出
PartSum: 与TT对应的配分函数
TIPS-2011提供的配分函数算法。
例:
PartSum = partitionSum(1,1,[296,1000])
TT,PartSum = partitionSum(1,1,[296,1000],step=0.1)
计算吸收系数(以Voigt线型为例)
absorptionCoefficient_Voigt(Components=None, SourceTables=None, partitionFunction=>, Environment=None, OmegaRange=None, OmegaStep=None, OmegaWing=None, IntensityThreshold=0.0, OmegaWingHW=50.0, ParameterBindings={}, EnvironmentDependencyBindings={}, GammaL='gamma_air', Diluent={'air':1.0}, HITRAN_units=True, File=None, Format='%e %e')
Components: [(M,I,D)]的列表,其中
M: HITRAN中的分子编号
I: HITRAN中的同位素编号
D: 丰度(可选)
SourceTables: 计算cross-section的表
partitionFunction: 配分函数指针(默认为TIPS-2011)
Environment: 压强和温度参数的字典(默认{'p':1.,'T' :296.})
'p': 总压强(atm)
'T': 温度(K)
OmegaRange: 波数范围(cm^-1)
OmegaStep: 波数步长(cm^-1)
OmegaWing: 线中心到线强为0之间的距离(cm^-1)
IntensityThreshold: 强度阈值(cm^-1/(molec*cm^-2))
OmegaWingHW : 线中心到线强为0之间的距离的相对值(halfwidths),与OmegaWing取最大
GammaL: 展宽参数('gamma_air'或'self')。建议不要使用这个参数,使用下面的Diluent参数设置各物种浓度。
Diluent: 气体混合物体积比例。默认是{'air':1.0},即纯空气环境,计算展宽系数时相当于\gamma_air。若需要设置其他混合物比例,可以自行设置字典Diluent={'self':A, 'air':B, 'CO_2':C, ...}表示本物种,空气,CO_2的体积比例分别是A,B,C(A+B+C+...=1,但HAPI没有检测,需要自己注意)。注意数据库里只有空气,自身展宽系数,所以实际上其他组分除了浓度外物质种类没有影响。
HITRAN_units: 使用cm^2/molecule (True) 或cm^-1
输出:
Omegas: OmegaRange与OmegaStep给出的波数数组
Xsect: Omegas对应的吸收系数
例:
nu,coef = absorptionCoefficient_Voigt(((2,1),), 'co2', OmegaStep=0.01, HITRAN_units=False)
计算吸收光谱
absorptionSpectrum(Omegas, AbsorptionCoefficient, Environment={'l': 100.0}, File=None, Format='%e %e')
Omegas: 波数数组,一般用absorptionCoefficient_Voigt()输出的Omegas
AbsorptionCoefficient: 吸收系数数组,一般用absorptionCoefficient_Voigt()输出的Xsects
Environment: 吸收光程(cm)的字典,默认为{'l': 100.0}
File: 输出文件名
Format: 文件输出c格式
输出:
Omegas: 波数数组
Xsect: Omegas对应的吸光度
例:
nu,absorp = absorptionSpectrum(nu, coef)
谱线模拟的基本流程
下面简单演示一个基本的谱线模拟的完整过程:
首先是调用模块
from hapi import *
import numpy as np
import matplotlib.pylab as plb
import scipy.constants as C
我们希望用HITRAN数据库模拟
在7178~7192
范围内,296K(HITRAN的参照温度),1atm,吸收光程5cm条件下的吸光度。
选择data文件夹
db_begin('data')
从HITRAN下载谱线数据至data\H2O_7178~7192,并显示数据信息
myTableName = 'H2O_7178~7192'
fetch(myTableName, 1, 1, 7178, 7192)
tableList()
describeTable(myTableName)
绘制线强图
x, y = getStickXY(myTableName)
plb.figure()
plb.plot(x, y)
plb.xlabel('wavenumber($cm^{-1}$)')
plb.ylabel('linestrength($cm^{-1}/(molecule\cdot cm^{-2})$)')
plb.title('$H_2O linestrength @ 296K$')
如图:
用Voigt线型计算吸收系数
并绘图
nu, coef = absorptionCoefficient_Voigt(SourceTables=myTableName, HITRAN_units=False)
plb.figure()
plb.plot(nu, coef)
plb.xlabel('wavenumber($cm^{-1}$)')
plb.ylabel('absorption coefficient($cm^{-1}$)')
plb.title('$H_2O absorption coefficient @ 1atm, 296K$')
如图:
计算吸光度
并绘图
myOpticalL = 5.0
nu, absorp = absorptionSpectrum(nu, coef, Environment={'l':myOpticalL})
plb.figure()
plb.plot(nu, absorp)
plb.xlabel('wavenumber($cm^{-1}$)')
plb.ylabel('absorbance')
plb.title('$H_2O absorbance @ 1atm, 296K$')
plb.show()
如图:
除了HITRAN推出的HAPI外还有其他基于数据库的光谱模拟分析包,如RADIS。有需要的朋友可以自行选用。
更多推荐


所有评论(0)