我有由时间(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)的第一个值。我该怎么做呢?
发布于 2018-07-27 11:08:31
抛开一些问题不谈,这里有一些示例代码,用于确定流量何时首先超过阈值,然后下降到第二个阈值以下(假设数据在时间上按升序排序):
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)?在上面的plot语句中,你似乎也标准化了你的时间(data[0,*]/data[0,0]) --这是你想要做的吗?
在定义3*exp(-9/2)的第二个阈值时要小心;在IDL中,9/2是一个整数除法,并且给出的答案是4,而不是4.5。请改用3.*exp(-9./2.)。
最后,我假设您的数据是有噪声的(而不是无噪声的模拟)。您是否真的希望找到第一个超过阈值的数据点(这可能是由于一个特别大的正异常值?)或者更确切地说,当运行的平均值/中值(或数据的其他平滑版本)超过阈值时?您可以使用例如median(flux, boxwidth)对流量进行中值过滤
https://stackoverflow.com/questions/51506313
复制相似问题