psdlag-agn/scripts/analyze_lightcurve.py
2017-01-31 21:15:42 -05:00

125 lines
4.1 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# -*- coding: utf-8 -*-
from __future__ import unicode_literals
import numpy as np
import sys
import getopt
import clag
sys.path.insert(1, "/home/caes/science/clag/")
# For jupyter notebook
# %pylab inline
try:
opts, args = getopt.getopt(sys.argv[1:], "")
except getopt.GetoptError:
print 'analyze_lightcure.py <reference curve> <compared curve>'
sys.exit(2)
# Time resolution determined from inspection and testing. This script
# does not expect evenly spaced data in time.
dt = 0.1
### Get the psd for the #fqL = np.hstack((np.array(0.5*f1),np.logspace(np.log10(0.9*f1),
# first light curve ###
# These bin values determined summer 2016 for STORM III optical/UV lightcurves
fqL = np.array([0.0049999999, 0.018619375, 0.044733049, 0.069336227,
0.10747115, 0.16658029, 0.25819945, 0.40020915,
0.62032418])
#A general rules for fqL is as follows:
#
# define f1, f2 as the two extreme frequencies allowed by the data. i.e.
# f1=1/T with T being the length of observation in time units, and
# f2=0.5/Δt
#
# The frequency limits where the psd/lag can be constrained are about
# ~0.9f10.5f2. The 0.9 factor doesn't depend on the data much, but
# values in the range ~[0.9-1.1] are ok. The factor in front of f2
# depends on the quality of the data, for low qualily data, use ~0.1--
# 0.2, and for high quality data, increase it up to 0.91.
#
# Always include two dummy bins at the low and high frequencies and
# ignore them. The first and last bins are generally biased, So I suggest
# using the first bin as 0.5f10.9f1 (or whatever value you use instead
# of 0.9f1, see second point above), and the last bin should be
# 0.5f22f2 (or whatever value instead of 0.5f2, see second point
# above). So the frequency bins should be something like:
# [0.5f1,0.9f1,...,0.5f2,2f2], the bins in between can be devided as
# desired.
#
#fqd is the bin center
#
# If lightcurves need to be split:
# seg_length = 256;
# fqL = np.logspace(np.log10(1.1/seg_length),np.log10(.5/dt),7)
# fqL = np.concatenate(([0.5/seg_length], fqL))
#
#f1 = 1/175.
#f2 = 0.5/dt
#fqL = np.hstack((np.array(0.5*f1),np.logspace(np.log10(0.9*f1),
# np.log10(0.3*f2),9),np.array(2*f2)))
fqL = np.logspace(np.log10(0.0049999999),np.log10(0.62032418),9)
nfq = len(fqL) - 1
fqd = 10**(np.log10( (fqL[:-1]*fqL[1:]) )/2.)
## load the first light curve
lc1_time, lc1_strength, lc1_strength_err =
np.loadtxt(args[0],skiprows=1).T
# for pylab: errorbar(t1,l1,yerr=l1e,fmt='o')
# Used throughout
initial_args = np.ones(nfq)
## initialize the psd class for multiple light curves ##
P1 = clag.clag('psd10r',
[lc1_time], [lc1_strength], [lc1_strength_err],
dt, fqL)
ref_psd, ref_psd_err = clag.optimize(P1, initial_args)
ref_psd, ref_psd_err = clag.errors(P1, ref_psd, ref_psd_err)
## plot ##
#xscale('log'); ylim(-4,2)
#errorbar(fqd, ref_psd, yerr=ref_psd_err, fmt='o', ms=10)
# Load second light curve
lc2_time, lc2_strength, lc2_strength_err = np.loadtxt(args[1],skiprows=1).T
P2 = clag.clag('psd10r', [lc2_time], [lc2_strength], [lc2_strength_err], dt, fqL)
echo_psd, echo_psd_err = clag.optimize(P2, initial_args)
echo_psd, echo_psd_err = clag.errors(P2, echo_psd, echo_psd_err)
### Now the cross spectrum ###
### We also give it the calculated psd values as input ###
Cx = clag.clag('cxd10r',
[[lc1_time,lc1_time]],
[[lc1_strength,lc2_strength]],
[[lc1_strength_err,lc2_strength_err]],
dt, fqL, ref_psd, echo_psd)
#Cx_vals = np.concatenate( (0.3*(ref_psd*echo_psd)**0.5, ref_psd*0+1.) )
Cx_vals = np.concatenate( ((ref_psd+echo_psd)*0.5-0.3,ref_psd*0+0.1) )
Cx_vals, Cx_err = clag.optimize(Cx, Cx_vals)
#?????? %autoreload
Cx_vals, Cx_err = clag.errors(Cx,Cx_vals,Cx_err)
phi, phie = Cx_vals[nfq:], Cx_err[nfq:]
lag, lage = phi/(2*np.pi*fqd), phie/(2*np.pi*fqd)
cross_spectrm, cross_spectrm_err = Cx_vals[:nfq], Cx_err[:nfq]
np.savetxt("freq.out",fqL.reshape((-1,len(fqL))))
np.savetxt("ref_psd.out",[ref_psd,ref_psd_err])
np.savetxt("echo_psd.out",[echo_psd,echo_psd_err])
np.savetxt("crsspctrm.out",[cross_spectrm,cross_spectrm_err])
np.savetxt("timelag.out",[lag,lage])