使用python代码计算等效宽度

时间:2015-12-03 20:02:15

标签: python astropy

我有这个Fortran程序用于计算等效谱线宽度 我希望找到写python代码的帮助来做同样的算法(输入文件包含拖曳列波长和通量)

     PARAMETER (N=195)              ! N is the number of data
     IMPLICIT DOUBLE PRECISION (A-H,O-Z)
     DIMENSION X(N),Y(N)
     OPEN(1,FILE='halpha.dat')
     DO 10 I=1,N
     READ(1,*)X(I),Y(I)
     WRITE(*,*)X(I),Y(I)
10   CONTINUE
     CALL WIDTH(X,Y,N,SUM)     
     WRITE(*,*)SUM
     END
 c-----------------------------------------
    SUBROUTINE WIDTH(X,Y,N,SUM)
    PARAMETER (NBOD=20000)
    IMPLICIT DOUBLE PRECISION (A-H,O-Z)
    DIMENSION X(NBOD),Y(NBOD) 
    SUM=0.D0
    DO I=2,N
    SUM=SUM+(X(I-1)-X(I))*((1.-Y(I-1))+(1.-Y(I)))
C   WRITE(*,*)SUM
    END DO 
    SUM=0.5*dabs(SUM)
    RETURN
    END

2 个答案:

答案 0 :(得分:2)

这是一个相当直译的翻译:

def main():
    N = 195  # number of data pairs
    x, y = [0 for i in xrange(N)], [0 for i in xrange(N)]

    with open('halpha.dat') as f:
        for i in xrange(N):
            x[i], y[i] = map(float, f.readline().split())
            print x[i], y[i]

    sum = width(x, y, N)
    print sum

def width(x, y, N):
    sum = 0.0
    for i in xrange(1, N):
        sum = sum + (x[i-1] - x[i]) * ((1. - y[i-1]) + (1. - y[i]))
    sum = 0.5*abs(sum)
    return sum

main()

然而,这将是一个更惯用的翻译:

from math import fsum  # more accurate floating point sum of a series of terms

def main():
    with open('halpha.dat') as f:  # Read file into a list of tuples.
        pairs = [tuple(float(word) for word in line.split()) for line in f]

    for pair in pairs:
        print('{}, {}'.format(*pair))

    print('{}'.format(width(pairs)))

def width(pairs):
    def term(prev, curr):
        return (prev[0] - curr[0]) * ((1. - prev[1]) + (1. - curr[1]))

    return 0.5 * abs(fsum(term(*pairs[i-1:i+1]) for i in range(1, len(pairs))))

main()

答案 1 :(得分:0)

我建议在Python中执行此操作的更自然的方法是关注频谱本身的属性,并在astropy的specutils中使用参数。

尤其是等效宽度详细信息为here。有关更多常规信息 specutils,specutils.analysis及其软件包遵循以下链接:

specutils top levelspecutils.analysis

要使用此软件包,您需要创建一个Spectrum1D对象,其第一个成分是您的波长轴,第二个成分是通量。通过单击分析页面中的链接(在第一段第三行的末尾),可以找到有关如何创建Spectrum1D对象的详细信息。

这是一种非常强大的方法,是天文学家为天文学家开发的。