LALPulsar  6.1.0.1-c9a8ef6
ExtrapolatePulsarSpins.c
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2014 Karl Wette
3  * Copyright (C) 2005, 2006, 2018 Reinhard Prix
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation; either version 2 of the License, or
8  * (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with with program; see the file COPYING. If not, write to the
17  * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
18  * MA 02110-1301 USA
19  */
20 
21 /* ========== REVIEW information ==================================================
22  * This file has been fully reviewed on 13 May, 2009
23  * Reviewers: Peter Shawhan, Teviet Creighton, Francesco Salemi, M.A. Papa
24  * Minutes of this review:
25  * https://www.lsc-group.phys.uwm.edu/twiki/pub/CW/HierarchicalSearchReview/meeting_20090513.txt
26  *
27  * If you want to modify any existing functions in this file, please submit
28  * your patch for review to https://bugs.ligo.org/redmine/projects/lalsuite-lalpulsar
29  * ================================================================================
30  */
31 
32 /*********************************************************************************/
33 /**
34  * \file
35  * \ingroup ExtrapolatePulsarSpins
36  * \author Reinhard Prix
37  *
38  * \brief Defines functions to extrapolate the pulsar spin-paramters
39  * \f$ \{f, \dot{f},\ddot{f},...\} \f$ from one SSB epoch to another.
40  *
41  */
42 
43 /*---------- INCLUDES ---------- */
44 #include <math.h>
45 
46 #include <lal/LALError.h>
47 #include <lal/Date.h>
48 #include <lal/SFTfileIO.h>
49 #include <lal/SSBtimes.h>
50 
51 #include "ExtrapolatePulsarSpins.h"
52 
53 /*---------- local DEFINES ----------*/
54 #define MYMAX(x,y) ( (x) > (y) ? (x) : (y) )
55 #define MYMIN(x,y) ( (x) < (y) ? (x) : (y) )
56 #define COPY_VECT(dst,src) do { (dst)[0] = (src)[0]; (dst)[1] = (src)[1]; (dst)[2] = (src)[2]; } while(0)
57 #define SUB_VECT(dst,src) do { (dst)[0] -= (src)[0]; (dst)[1] -= (src)[1]; (dst)[2] -= (src)[2]; } while(0)
58 #define MULT_VECT(v,lam) do{ (v)[0] *= (lam); (v)[1] *= (lam); (v)[2] *= (lam); } while(0)
59 #define DOT_VECT(u,v) ((u)[0]*(v)[0] + (u)[1]*(v)[1] + (u)[2]*(v)[2])
60 #define NORM_VECT(v) sqrt(DOT_VECT(v,v))
61 
62 /*---------- main functions ---------- */
63 
64 /// \addtogroup ExtrapolatePulsarSpins_h
65 /// @{
66 
67 /**
68  * Initialise a \c PulsarSpinRange struct from two ::PulsarSpins structs
69  */
70 int XLALInitPulsarSpinRangeFromSpins( PulsarSpinRange *range, /**< [out] output spin range */
71  const LIGOTimeGPS *refTime, /**< [in] reference time */
72  const PulsarSpins fkdot1, /**< [in] input spins */
73  const PulsarSpins fkdot2 /**< [in] input spins */
74  )
75 {
76  XLAL_CHECK( range != NULL, XLAL_EFAULT );
77  XLAL_CHECK( refTime != NULL, XLAL_EFAULT );
78  XLAL_INIT_MEM( *range );
79  range->refTime = *refTime;
80  for ( size_t k = 0; k < PULSAR_MAX_SPINS; ++k ) {
81  range->fkdot[k] = MYMIN( fkdot1[k], fkdot2[k] );
82  range->fkdotBand[k] = fabs( fkdot1[k] - fkdot2[k] );
83  }
84  return XLAL_SUCCESS;
85 }
86 
87 /**
88  * General pulsar-spin extrapolation function: given a "spin-range" (ie spins + spin-bands) \c range0
89  * at time \f$ \tau_0 \f$ , propagate the whole spin-range to time \f$ \tau_1 \f$ .
90  *
91  * \note \c *range1 is allowed to point to the same spin-range as \c *range0: the input will be overwritten
92  * with the output.
93  *
94  * \note The output-range is in the 'canonical' order of \f$ [ f^{(k)}, f^{(k)} + \Delta f^{(k)}] \f$ ,
95  * where \f$ \Delta f^{(k)} \ge 0 \f$ .
96  *
97  */
98 int
99 XLALExtrapolatePulsarSpinRange( PulsarSpinRange *range1, /**< [out] output spin range */
100  const PulsarSpinRange *range0, /**< [in] input spin range */
101  const REAL8 dtau /**< [in] time difference \f$ \tau_1 - \tau_0 \f$ to extrapolate \c range0 to */
102  )
103 {
104  UINT4 k, l;
105  PulsarSpinRange inRange;
106 
107  XLAL_CHECK( range1 != NULL, XLAL_EFAULT );
108  XLAL_CHECK( range0 != NULL, XLAL_EFAULT );
109 
110  /* ----- make a copy of input range, because we allow input == output range, so
111  * the input can get overwritten */
112  memmove( &inRange, range0, sizeof( inRange ) );
113 
114  for ( l = 0; l < PULSAR_MAX_SPINS; l ++ ) {
115  REAL8 flmin = 0, flmax = 0;
116  REAL8 kfact = 1, dtau_powk = 1; /* values for k=0 */
117 
118  for ( k = 0; k < PULSAR_MAX_SPINS - l; k ++ ) {
119  REAL8 fkltauk0 = inRange.fkdot[k + l] * dtau_powk;
120  REAL8 fkltauk1 = fkltauk0 + inRange.fkdotBand[k + l] * dtau_powk;
121 
122  REAL8 fkltauk_min = MYMIN( fkltauk0, fkltauk1 );
123  REAL8 fkltauk_max = MYMAX( fkltauk0, fkltauk1 );
124 
125  flmin += fkltauk_min / kfact;
126  flmax += fkltauk_max / kfact;
127 
128  kfact *= ( k + 1 );
129  dtau_powk *= dtau;
130 
131  } /* for k < PULSAR_MAX_SPINS */
132 
133  range1->fkdot[l] = flmin;
134  range1->fkdotBand[l] = flmax - flmin;
135 
136  } /* for l < PULSAR_MAX_SPINS */
137 
138  /* set proper epoch for output */
139  range1->refTime = range0->refTime;
140  XLALGPSAdd( &range1->refTime, dtau );
141 
142  return XLAL_SUCCESS;
143 
144 } /* XLALExtrapolatePulsarSpinRange() */
145 
146 
147 /**
148  * Extrapolate the Pulsar spin-parameters \f$ \{f, \dot{f},\ddot{f},...\} \f$
149  * (\c fkdot0) from the initial reference-epoch \f$ \tau_0 \f$
150  * to the new reference-epoch \f$ \tau_1 \f$ .
151  *
152  * This is equivalent to XLALExtrapolatePulsarSpins(), but uses the fixed-size array-type
153  * ::PulsarSpins instead, which is easier to handle and avoids any dynamic-memory hassles.
154  *
155  * \note This can be called with <tt>fkdot1 == fkdot0</tt>, in which case the input will
156  * be correctly replaced by the output.
157  */
158 int
159 XLALExtrapolatePulsarSpins( PulsarSpins fkdot1, /**< [out] output spin-parameter array */
160  const PulsarSpins fkdot0, /**< [in] input spin-parameter array */
161  REAL8 dtau /**< [in] time difference \f$ \tau_1 - \tau_0 \f$ to extrapolate \c fkdot0 to */
162  )
163 {
164  UINT4 numSpins = sizeof( PulsarSpins ) / sizeof( fkdot0[0] ); /* fixed size array */
165  UINT4 k, l;
166  REAL8 kfact, dtauk;
167  PulsarSpins inSpins;
168 
169  /* if dtau is zero, just copy fkdot0 to fkdot1 */
170  if ( dtau == 0.0 ) {
171  memmove( fkdot1, fkdot0, sizeof( PulsarSpins ) );
172  return XLAL_SUCCESS;
173  }
174 
175  /* keep a local copy of input to allow the input- and output- pointers to be identical */
176  memcpy( inSpins, fkdot0, sizeof( PulsarSpins ) );
177 
178  for ( l = 0; l < numSpins; l ++ ) {
179  fkdot1[l] = 0;
180  }
181 
182  kfact = 1;
183  dtauk = 1; /* values of k! and (dTau)^k at k=0 */
184  for ( k = 0; k < numSpins; k ++ ) {
185  REAL8 kcoef = dtauk / kfact;
186  for ( l = 0; l < numSpins - k ; l ++ ) {
187  fkdot1[l] += inSpins[ k + l ] * kcoef;
188  }
189 
190  kfact *= ( k + 1.0 );
191  dtauk *= dtau;
192 
193  } /* for k < numSpins */
194 
195  return XLAL_SUCCESS;
196 
197 } /* XLALExtrapolatePulsarSpins() */
198 
199 
200 /**
201  * Extrapolate phase \f$ \phi_0 \f$ from \f$ \tau_0 \f$ to \f$ \tau_1 \f$ , given the spins \c fkdot1 at \f$ \tau_1 \f$ .
202  * Returns \f$ \phi_1 \f$ in the range \f$ [0, 2\pi] \f$ .
203  */
204 int
205 XLALExtrapolatePulsarPhase( REAL8 *phi1, /**< [out] output phase at \f$ \tau_1 \f$ */
206  const PulsarSpins fkdot1, /**< [in] spin-params at reference \f$ \tau_1 \f$ */
207  const REAL8 phi0, /**< [in] input phase at \f$ \tau_0 \f$ */
208  const REAL8 dtau /**< [in] time difference \f$ \tau_1 - \tau_0 \f$ to extrapolate \c phi0 to */
209  )
210 {
211  UINT4 numSpins = PULSAR_MAX_SPINS;
212  UINT4 k;
213  UINT4 kFact;
214  REAL8 dtauk;
215  REAL8 frac_cycles;
216  REAL8 dummy, phi;
217 
218  XLAL_CHECK( fkdot1 != NULL, XLAL_EFAULT );
219  XLAL_CHECK( phi1 != NULL, XLAL_EFAULT );
220 
221  kFact = 1;
222  dtauk = 1.0;
223  frac_cycles = 0;
224 
225  for ( k = 0; k < numSpins; k++ ) {
226  kFact *= ( k + 1 );
227  dtauk *= -dtau;
228  frac_cycles += modf( fkdot1[k] * dtauk / kFact, &dummy );
229  }
230 
231  phi = fmod( phi0 - LAL_TWOPI * frac_cycles, LAL_TWOPI );
232  if ( phi < 0 ) {
233  phi += LAL_TWOPI;
234  }
235 
236  ( *phi1 ) = phi;
237 
238  return XLAL_SUCCESS;
239 
240 } /* XLALExtrapolatePulsarPhase() */
241 
242 
243 /**
244  * Determines a frequency band which covers the frequency evolution of a band of CW signals between two GPS times.
245  * The calculation accounts for the spin evolution of the signals, and the maximum possible Dopper modulation
246  * due to detector motion, and (for binary signals) binary orbital motion.
247  */
248 int
249 XLALCWSignalCoveringBand( REAL8 *minCoverFreq, /**< [out] Minimum frequency of the covering band */
250  REAL8 *maxCoverFreq, /**< [out] Maximum frequency of the covering band */
251  const LIGOTimeGPS *time1, /**< [in] One end of the GPS time range */
252  const LIGOTimeGPS *time2, /**< [in] The other end of the GPS time range */
253  const PulsarSpinRange *spinRange, /**< [in] Frequency and spindown range of the CW signals */
254  const REAL8 binaryMaxAsini, /**< [in] Maximum projected semi-major axis a*sini/c (= 0 for isolated sources) */
255  const REAL8 binaryMinPeriod, /**< [in] Minimum orbital period (s); must be 0 for isolated signals */
256  const REAL8 binaryMaxEcc /**< [in] Maximal binary eccentricity: must be 0 for isolated signals */
257  )
258 {
259  // Check input
260  XLAL_CHECK( minCoverFreq != NULL, XLAL_EFAULT );
261  XLAL_CHECK( maxCoverFreq != NULL, XLAL_EFAULT );
262  XLAL_CHECK( time1 != NULL, XLAL_EFAULT );
263  XLAL_CHECK( time2 != NULL, XLAL_EFAULT );
264  XLAL_CHECK( spinRange != NULL, XLAL_EFAULT );
265  XLAL_CHECK( binaryMaxAsini >= 0, XLAL_EINVAL );
266 
267  XLAL_CHECK( ( binaryMaxAsini > 0 ) || ( ( binaryMinPeriod == 0 ) && ( binaryMaxEcc == 0 ) ), XLAL_EINVAL ); // if isolated: required P=0 and e=0
268  XLAL_CHECK( ( binaryMaxAsini == 0 ) || ( ( binaryMinPeriod > 0 ) && ( binaryMaxEcc >= 0 ) && ( binaryMaxEcc < 1 ) ), XLAL_EINVAL ); // if binary: P>0, 0<=e<1
269 
270  // Track instantaneous SRC-frame frequency through the observing interval in steps of 'dT' and record maximal extents in frequency
271  // This is safer than just extrapolating to the beginning and end of the observing interval, in case
272  // the frequency evolution has a local minimum or maximum (not physically probable, but still possible in test cases)
273  REAL8 t1 = XLALGPSGetREAL8( time1 );
274  REAL8 t2 = XLALGPSGetREAL8( time2 );
275  REAL8 tStart = MYMIN( t1, t2 );
276  REAL8 tEnd = MYMAX( t1, t2 );
277  REAL8 Tspan = tEnd - tStart; // >=0
278  REAL8 dT = LAL_DAYSID_SI; // steps of ~1day (should be safely short enough)
279  UINT4 numSteps = ( UINT4 )ceil( ( Tspan + 1e-9 ) / dT ) + 1; // minimum of 2 steps: [beginning, end] // add 1ns for special case Tspan=0
280  dT = Tspan / ( numSteps - 1 ); // re-adjust step-size so we exactly end at the end-time at i=(numSteps-1)
281  REAL8 refTime = XLALGPSGetREAL8( &spinRange->refTime );
282  REAL8 minFreq = LAL_REAL8_MAX;
283  REAL8 maxFreq = 0;
284  for ( UINT4 i = 0; i < numSteps; i ++ ) {
285  REAL8 t_i = tStart + i * dT;
286  REAL8 DeltaT_i = t_i - refTime;
287  PulsarSpinRange spin_i;
288  XLAL_CHECK( XLALExtrapolatePulsarSpinRange( &spin_i, spinRange, DeltaT_i ) == XLAL_SUCCESS, XLAL_EFUNC );
289  // keep track of the minimum and maximum frequencies covered
290  minFreq = MYMIN( minFreq, spin_i.fkdot[0] );
291  maxFreq = MYMAX( maxFreq, spin_i.fkdot[0] + spin_i.fkdotBand[0] );
292  } // for i < numSteps
293 
294  // Extra frequency range needed due to detector motion, per unit frequency
295  // * Maximum value of the time derivative of the diurnal and (Ptolemaic) orbital phase, plus 5% for luck
296  REAL8 extraPerFreq = 1.05 * LAL_TWOPI / LAL_C_SI * ( ( LAL_AU_SI / LAL_YRSID_SI ) + ( LAL_REARTH_SI / LAL_DAYSID_SI ) );
297 
298  // Extra frequency range needed due to binary orbital motion, per unit frequency
299  // Upper bound on maximum value, derived from time derivative of binary-CW phase,
300  // see https://bugs.ligo.org/redmine/issues/1567
301  if ( binaryMaxAsini > 0 ) {
302  REAL8 maxOmega = LAL_TWOPI / binaryMinPeriod;
303  extraPerFreq += maxOmega * binaryMaxAsini / ( 1.0 - binaryMaxEcc );
304  }
305 
306  // Expand frequency range
307  ( *minCoverFreq ) = minFreq * ( 1.0 - extraPerFreq );
308  ( *maxCoverFreq ) = maxFreq * ( 1.0 + extraPerFreq );
309 
310  return XLAL_SUCCESS;
311 
312 } /* XLALCWSignalCoveringBand() */
313 
314 
315 /**
316  * Determines the frequency band occupied by the frequency evolution of a given CW signal between two GPS times.
317  * The calculation accounts for the spin evolution of the signals, and the actual Dopper modulation
318  * due to detector motion, and (for binary signals) binary orbital motion.
319  */
320 int
321 XLALCWSignalBand( REAL8 *minFreq, /**< [out] Minimum frequency of the covering band */
322  REAL8 *maxFreq, /**< [out] Maximum frequency of the covering band */
323  const DetectorStateSeries *detStates, /**< [in] detector state series, cf XLALGetDetectorStates() */
324  const PulsarDopplerParams *doppler /**< [in] Signal phase-evolution parameters */
325  )
326 {
327  XLAL_CHECK( minFreq != NULL && maxFreq != NULL, XLAL_EINVAL );
328  XLAL_CHECK( detStates != NULL, XLAL_EINVAL );
329  XLAL_CHECK( doppler != NULL, XLAL_EINVAL );
330 
331  // get actual doppler-shifts as a function of time over the observation time
332  SkyPosition skypos = { .longitude = doppler->Alpha, .latitude = doppler->Delta, .system = COORDINATESYSTEM_EQUATORIAL };
333  SSBtimes *ssb;
334  XLAL_CHECK( ( ssb = XLALGetSSBtimes( detStates, skypos, doppler->refTime, SSBPREC_NEWTONIAN ) ) != NULL, XLAL_EFUNC );
335  if ( doppler->asini > 0 ) {
336  XLAL_CHECK( XLALAddBinaryTimes( &ssb, ssb, doppler ) == XLAL_SUCCESS, XLAL_EFUNC );
337  }
338 
339  UINT4 Nsteps = detStates->length;
340  REAL8 minFreq0 = LAL_REAL8_MAX;
341  REAL8 maxFreq0 = 0;
342  for ( UINT4 i = 0; i < Nsteps; i ++ ) {
343  REAL8 dtau_i = XLALGPSDiff( &( detStates->data[i].tGPS ), &( doppler->refTime ) );
344  PulsarSpins fkdot_i;
345  XLAL_CHECK( XLALExtrapolatePulsarSpins( fkdot_i, doppler->fkdot, dtau_i ) == XLAL_SUCCESS, XLAL_EFUNC );
346  REAL8 freq_i = fkdot_i[0];
347  // apply doppler shifts from detector motion
348  freq_i *= ( ssb->Tdot->data[i] );
349 
350  minFreq0 = fmin( minFreq0, freq_i );
351  maxFreq0 = fmax( maxFreq0, freq_i );
352  } // for i < Nsteps
353 
354  XLALDestroySSBtimes( ssb );
355 
356  ( *minFreq ) = minFreq0;
357  ( *maxFreq ) = maxFreq0;
358 
359  return XLAL_SUCCESS;
360 
361 } // XLALCWSignalBand()
362 
363 
364 /**
365  * (Optional) Helper function for using XLALCWSignalBand():
366  * compute DetectorStateSeries for given time-span and detector,
367  * and optionally also the sky-position with maximal Doppler band-width.
368  *
369  * The calculation accounts for the spin evolution of the signals, and the actual Dopper modulation
370  * due to detector motion, and (for binary signals) binary orbital motion.
371  */
373 XLALPrepareCWSignalBand( SkyPosition *skypos_maxdoppler, /**< [out] [optional] sky-position of maximal Doppler band-width over the sky */
374  const LIGOTimeGPS tStart, /**< [in] start GPS time of observing interval */
375  const REAL8 Tspan, /**< [in] total span of observing interval in seconds */
376  const REAL8 dT, /**< [in] step-size (in seconds) to use to sample output detector-state series */
377  const LALDetector *detector, /**< [in] detector, cf XLALGetSiteInfo() */
378  const EphemerisData *edat /**< [in] ephemeris data, cf XLALInitBarycenter() */
379  )
380 {
382  XLAL_CHECK_NULL( edat != NULL, XLAL_EINVAL );
383 
384  // create a 'grid' of timestamps over the observing interval
386  XLAL_CHECK_NULL( ( ts = XLALMakeTimestamps( tStart, Tspan, dT, 0 ) ) != NULL, XLAL_EFUNC );
387 
388  // get corresponding 'detector states'
389  DetectorStateSeries *detStates;
390  XLAL_CHECK_NULL( ( detStates = XLALGetDetectorStates( ts, detector, edat, 0 ) ) != NULL, XLAL_EFUNC );
391  UINT4 Nsteps = detStates->length;
392 
394 
395  // if output 'skypos_maxdoppler' requested
396  if ( skypos_maxdoppler ) {
397  // compute dV = v0 - v1, with maximal norm over observation time
398  REAL8 XLAL_INIT_DECL( dV, [3] );
399  REAL8 XLAL_INIT_DECL( v1, [3] );
400  COPY_VECT( dV, detStates->data[0].vDetector );
401  // heuristic: if Tspan>6months, we use dV = v0 - (-v0) = 2*v0 ~ v0: we only need the direction!
402  if ( Tspan < 0.5 * LAL_YRSID_SI ) {
403  COPY_VECT( v1, detStates->data[Nsteps - 1].vDetector );
404  SUB_VECT( dV, v1 );
405  }
406  // normalize
407  REAL8 norm = NORM_VECT( dV );
408  MULT_VECT( dV, ( 1.0 / norm ) );
409  // convert back into equatorial coordinates
410  REAL8 longitude = atan2( dV[1], dV[0] ); // range = [-pi, pi]
411  if ( longitude < 0 ) {
412  longitude += LAL_TWOPI;
413  }
414  REAL8 latitude = asin( dV[2] ); // range is [-pi/2, pi/2]
415  ( *skypos_maxdoppler ).longitude = longitude;
416  ( *skypos_maxdoppler ).latitude = latitude;
417  ( *skypos_maxdoppler ).system = COORDINATESYSTEM_EQUATORIAL;
418 
419  } // if skypos_maxdopppler
420 
421  return detStates;
422 
423 } // XLALPrepareCWSignalBand()
424 
425 /// @}
#define MYMIN(x, y)
#define COPY_VECT(dst, src)
#define SUB_VECT(dst, src)
#define NORM_VECT(v)
#define MYMAX(x, y)
#define MULT_VECT(v, lam)
int k
#define tEnd
INT4 dummy
Definition: SinCosLUT.i:123
int l
double e
DetectorStateSeries * XLALGetDetectorStates(const LIGOTimeGPSVector *timestamps, const LALDetector *detector, const EphemerisData *edat, REAL8 tOffset)
Get the 'detector state' (ie detector-tensor, position, velocity, etc) for the given vector of timest...
int XLALExtrapolatePulsarPhase(REAL8 *phi1, const PulsarSpins fkdot1, const REAL8 phi0, const REAL8 dtau)
Extrapolate phase from to , given the spins fkdot1 at .
DetectorStateSeries * XLALPrepareCWSignalBand(SkyPosition *skypos_maxdoppler, const LIGOTimeGPS tStart, const REAL8 Tspan, const REAL8 dT, const LALDetector *detector, const EphemerisData *edat)
(Optional) Helper function for using XLALCWSignalBand(): compute DetectorStateSeries for given time-s...
int XLALExtrapolatePulsarSpinRange(PulsarSpinRange *range1, const PulsarSpinRange *range0, const REAL8 dtau)
General pulsar-spin extrapolation function: given a "spin-range" (ie spins + spin-bands) range0 at ti...
int XLALExtrapolatePulsarSpins(PulsarSpins fkdot1, const PulsarSpins fkdot0, REAL8 dtau)
Extrapolate the Pulsar spin-parameters (fkdot0) from the initial reference-epoch to the new referen...
int XLALInitPulsarSpinRangeFromSpins(PulsarSpinRange *range, const LIGOTimeGPS *refTime, const PulsarSpins fkdot1, const PulsarSpins fkdot2)
Initialise a PulsarSpinRange struct from two PulsarSpins structs.
int XLALCWSignalBand(REAL8 *minFreq, REAL8 *maxFreq, const DetectorStateSeries *detStates, const PulsarDopplerParams *doppler)
Determines the frequency band occupied by the frequency evolution of a given CW signal between two GP...
int XLALCWSignalCoveringBand(REAL8 *minCoverFreq, REAL8 *maxCoverFreq, const LIGOTimeGPS *time1, const LIGOTimeGPS *time2, const PulsarSpinRange *spinRange, const REAL8 binaryMaxAsini, const REAL8 binaryMinPeriod, const REAL8 binaryMaxEcc)
Determines a frequency band which covers the frequency evolution of a band of CW signals between two ...
#define LAL_DAYSID_SI
#define LAL_YRSID_SI
#define LAL_TWOPI
#define LAL_REAL8_MAX
#define XLAL_INIT_MEM(x)
double REAL8
#define XLAL_INIT_DECL(var,...)
uint32_t UINT4
REAL8 PulsarSpins[PULSAR_MAX_SPINS]
Typedef for fixed-size array holding GW frequency and derivatives fk = d^k Freq/dt^k|(tau_ref)
#define PULSAR_MAX_SPINS
maximal number of spin-parameters (Freq + spindowns) we can handle
LIGOTimeGPSVector * XLALMakeTimestamps(LIGOTimeGPS tStart, REAL8 Tspan, REAL8 Tsft, REAL8 Toverlap)
Given a start-time, Tspan, Tsft and Toverlap, returns a list of timestamps covering this time-stretch...
void XLALDestroyTimestampVector(LIGOTimeGPSVector *vect)
De-allocate a LIGOTimeGPSVector.
Definition: SFTtimestamps.c:69
void XLALDestroySSBtimes(SSBtimes *tSSB)
Destroy a SSBtimes structure.
Definition: SSBtimes.c:822
SSBtimes * XLALGetSSBtimes(const DetectorStateSeries *DetectorStates, SkyPosition pos, LIGOTimeGPS refTime, SSBprecision precision)
For a given DetectorStateSeries, calculate the time-differences , and their derivatives .
Definition: SSBtimes.c:518
int XLALAddBinaryTimes(SSBtimes **tSSBOut, const SSBtimes *tSSBIn, const PulsarDopplerParams *Doppler)
Compute extra time-delays for a CW source in a (Keplerian) binary orbital system.
Definition: SSBtimes.c:259
@ SSBPREC_NEWTONIAN
simple Newtonian:
Definition: SSBtimes.h:46
COORDINATESYSTEM_EQUATORIAL
#define XLAL_CHECK(assertion,...)
#define XLAL_CHECK_NULL(assertion,...)
XLAL_SUCCESS
XLAL_EFAULT
XLAL_EFUNC
XLAL_EINVAL
LIGOTimeGPS * XLALGPSAdd(LIGOTimeGPS *epoch, REAL8 dt)
REAL8 XLALGPSGetREAL8(const LIGOTimeGPS *epoch)
REAL8 XLALGPSDiff(const LIGOTimeGPS *t1, const LIGOTimeGPS *t0)
phi1
ts
REAL8 vDetector[3]
Cart.
LIGOTimeGPS tGPS
GPS timestamps corresponding to this entry.
Timeseries of DetectorState's, representing the detector-info at different timestamps.
DetectorState * data
array of DetectorState entries
UINT4 length
total number of entries
This structure contains all information about the center-of-mass positions of the Earth and Sun,...
A vector of 'timestamps' of type LIGOTimeGPS.
Definition: SFTfileIO.h:188
Type containing the 'Doppler-parameters' affecting the time-evolution of the phase.
PulsarSpins fkdot
Intrinsic spins: [Freq, f1dot, f2dot, ...
REAL8 Delta
Sky position: DEC (latitude) in equatorial coords and radians.
LIGOTimeGPS refTime
Reference time of pulsar parameters (in SSB!)
REAL8 Alpha
Sky position: RA (longitude) in equatorial coords and radians.
REAL8 asini
Binary: projected, normalized orbital semi-major axis (s).
Contains a "spin-range", ie spins and corresponding bands at a given (SSB) reference GPS-time .
PulsarSpins fkdot
Vector of spin-values .
LIGOTimeGPS refTime
SSB reference GPS-time at which spin-range is defined.
PulsarSpins fkdotBand
Vector of spin-bands , MUST be same length as fkdot.
REAL8 * data
Simple container for two REAL8-vectors, namely the SSB-timings DeltaT_alpha and Tdot_alpha,...
Definition: SSBtimes.h:60
REAL8Vector * Tdot
dT/dt : time-derivative of SSB-time wrt local time for SFT-alpha
Definition: SSBtimes.h:63
REAL8 longitude