计算idl中指定的周期时间



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

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

我需要的只是满足这些条件的数据(0,I(/data(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)对通量进行中值滤波