计算IDL中的指定时间段

时间:2018-07-24 19:34:49

标签: idl-programming-language

我的光曲线数据由时间(t)和通量(f)组成(4067行x 2列)

nx=4067
t=fltarr(nx)
f=fltarr(nx)

data=read_table('kplr4830001.dat')

;print,data(0,*) ;this is t
;print,data(1,*) ;this is f

window,0
plot,data(0,*)/data(0,0),data(1,*)/data(1,0),xrange=[1.045,1.13],yrange=[0.98,1.03],xstyle=1,ystyle=1

我设法计算出阈值(thr = 0.0067621339)。

我想计算一个特定的时间段(t_start)和(t_end)。

t_start:磁通首次超过阈值(0.0067621339)的时间。
t_end:磁通首次变得小于(3 * exp(-9/2))的时间。
这是我的方法:

;t_start
for i=0,nx-2 do begin
IF (data(1,i)/data(1,0) GT (thr)) THEN begin
print, data(1,i)/data(1,0)
endif
endfor

;t_end
for i=0,nx-2 do begin
IF (data(1,i)/data(1,0) LT (3*exp(-9/2))) THEN begin
print, data(0,i)/data(0,0)
endif
endfor

end

我需要的只是满足这些条件的data(0,i)/ data(0,0)的第一个值。我该怎么办?

1 个答案:

答案 0 :(得分:0)

我还有一些问题,这里有一些示例代码来确定流量何时先超过阈值,然后下降到第二阈值以下(假设数据按时间顺序升序排列):

thr1 = 0.0067621339
thr2 = 3.*exp(-9./2.)

time = data[*,0]
flux = data[*,1]


ind1 = where(flux gt thr1)
t_start = time[ind1[0]]

ind2 = where(flux[ind1[0]:*] lt thr2)
t_end = (time[ind1[0]:*])[ind2[0]]

一些附加说明:您已指定希望通量超过阈值thr,但在代码中已指定flux/flux[0] > thr。我将假设您要测量对象的相对通量(但在那种情况下,为什么要除以光曲线的第一个元素而不是median(flux)?在上面的绘图语句中,您似乎也可以将时间标准化(data[0,*]/data[0,0])-您打算这样做吗?

定义3*exp(-9/2)的第二个门槛时要小心; IDL 9/2中的整数除法,给出的答案为4,而不是4.5。而是使用3.*exp(-9./2.)

最后,我假设您的数据很嘈杂(而不是无噪音的模拟)。您是否真的要查找超出阈值的第一个数据点(这可能是由于特别大的正离群值?)还是当运行均值/中位数(或数据的其他平滑版本)超过阈值时?您可以使用median(flux, boxwidth)