[Commits] [svn:einsteintoolkit] pyGWAnalysis/trunk/DataAnalysis/ (Rev. 8)
reisswig at tapir.caltech.edu
reisswig at tapir.caltech.edu
Wed Mar 21 10:30:39 CDT 2012
User: reisswig
Date: 2012/03/21 10:30 AM
Modified:
/trunk/DataAnalysis/
DataAnalysis.py
Log:
Add phase alignement procedure by Boyle et al.
File Changes:
Directory: /trunk/DataAnalysis/
===============================
File [modified]: DataAnalysis.py
Delta lines: +92 -0
===================================================================
--- trunk/DataAnalysis/DataAnalysis.py 2012-02-02 01:08:28 UTC (rev 7)
+++ trunk/DataAnalysis/DataAnalysis.py 2012-03-21 15:30:39 UTC (rev 8)
@@ -697,3 +697,95 @@
return err
+def PhaseAlignOverRange(DF1, DF2, x0, x1, start_xoff, delta, dx, accuracy=1e-2, monotonic=False):
+ """Phase-aligns two waveforms by minimizing their difference in the L2 norm and
+ returns the time-shift (and phase shift) that needs to be applied. The procedure is that
+ from Boyle et al, arxiv:0804.4184v2.
+ DF1: phase of waveform 1
+ DF2: phase of waveform 2
+ [x0,x1]: The minimization interval.
+ start_xoff: An initial guess to speed up computation.
+ delta: the shift will be applied in the range [start_xoff-delta, start_xoff+delta].
+ The smaller delta, the faster (but keep in mind that you need to be sure that the minimum is located in that range!
+ dx: The delta spacing of interpolated function values on which the pointwise difference is taken.
+ accuracy: The accuracy in finding the shift that minimizes the L2 norm of the error ('the delta spacing of the shift').
+ monotonic: Set to 'True' if function is monotonic (this will greatly speed up computation)"""
+
+ # Note: this function is essentially identical to AlignOverRange in DiscreteFunction.py.
+ # But this also return a phase shift!
+
+ # Keep DF1 fixed. Find offset x_off that needs to be applied to DF2.x
+ # in order to make the L2-norm of the difference over a range [x0,x1]
+ # as small as possible.
+
+ x_off = start_xoff-delta
+ minErr = 10e10
+ minX = x_off
+ trueMinX = x_off
+ trueDeltaPhi = 0
+
+ # If function is monotonic, we can use a faster algorithm
+ if (monotonic==True):
+ factor = 2.0*delta/accuracy*0.1
+ maxX = start_xoff+delta
+ while (factor >= 1.0):
+ x_off = minX
+ minErr = 10e10
+ while (x_off < maxX):
+ DF2shift = DiscreteFunction(DF2.x+x_off, DF2.f)
+ subDF1, subDF2 = MakeConsistent(DF1, DF2shift, x0, x1, dx)
+ # first, compute DeltaPhi analytically according to Boyle et al.
+ DeltaPhi = 0
+ for ii in range (0, subDF1.Length()):
+ DeltaPhi += subDF1.f[ii]-subDF2.f[ii]
+ DeltaPhi /= (x1-x0)
+ # Now compute error
+ err = 0
+ for ii in range (0, subDF1.Length()):
+ err += (subDF1.f[ii]-subDF2.f[ii]-DeltaPhi)**2
+ err = sqrt(err)
+ #print minErr, err
+ if (err < minErr):
+ minErr = err
+ minX = x_off-accuracy*factor
+ trueMinX = x_off
+ trueDeltaPhi = DeltaPhi
+ else:
+ maxX = x_off
+ break
+ x_off += accuracy*factor
+ factor *= 0.1
+ return trueMinX, trueDeltaPhi
+
+ print "ERROR! ...using brute force method!"
+
+ # Proceed with brute force algorithm...
+
+ x_off = start_xoff-delta
+
+ minErr = 10e10
+ minX = x_off
+ minDeltaPhi = 0
+
+
+ # We shift DF2 and compute the error over range [x0,x1]
+ while (x_off < start_xoff+delta):
+ DF2shift = DiscreteFunction(DF2.x+x_off, DF2.f)
+ subDF1, subDF2 = MakeConsistent(DF1, DF2shift, x0, x1, dx)
+ # first, compute DeltaPhi analytically according to Boyle et al.
+ DeltaPhi = 0
+ for ii in range (0, subDF1.Length()):
+ DeltaPhi += subDF1.f[ii]-subDF2.f[ii]
+ DeltaPhi /= (x1-x0)
+ err = 0
+ for ii in range (0, subDF1.Length()):
+ err += (subDF1.f[ii]-subDF2.f[ii]-DeltaPhi)**2
+ err = sqrt(err)
+ #print err
+ if (err < minErr):
+ minErr = err
+ minX = x_off
+ minDeltaPhi = DeltaPhi
+ x_off += accuracy
+
+ return minX, minDeltaPhi
More information about the Commits
mailing list