LALInspiral 5.0.3.1-eeff03c
FindChirpSimulation.c
Go to the documentation of this file.
1/*
2* Copyright (C) 2007 Duncan Brown, Eirini Messaritaki, Gareth Jones, Jolien Creighton, Patrick Brady, Reinhard Prix, Anand Sengupta, Stephen Fairhurst, Craig Robinson , Thomas Cokelaer
3*
4* This program is free software; you can redistribute it and/or modify
5* it under the terms of the GNU General Public License as published by
6* the Free Software Foundation; either version 2 of the License, or
7* (at your option) any later version.
8*
9* This program is distributed in the hope that it will be useful,
10* but WITHOUT ANY WARRANTY; without even the implied warranty of
11* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12* GNU General Public License for more details.
13*
14* You should have received a copy of the GNU General Public License
15* along with with program; see the file COPYING. If not, write to the
16* Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
17* MA 02110-1301 USA
18*/
19
20/*-----------------------------------------------------------------------
21 *
22 * File Name: FindChirpSimulation.c
23 *
24 * Author: Brown, D. A., and Creighton, T. D.
25 *
26 *
27 *-----------------------------------------------------------------------
28 */
29
30/**
31 * \author Brown, D. A. and Creighton, T. D
32 * \file
33 * \ingroup FindChirp_h
34 *
35 * \brief Provides an interface between code build from \c findchirp and
36 * various simulation packages for injecting chirps into data.
37 *
38 * ### Prototypes ###
39 *
40 * <dl>
41 * <dt><tt>LALFindChirpInjectSignals()</tt></dt><dd> injects the signals described
42 * in the linked list of \c SimInspiralTable structures \c events
43 * into the data \c chan. The response function \c resp should
44 * contain the response function to use when injecting the signals into the data.</dd>
45 * </dl>
46 *
47 * ### Algorithm ###
48 *
49 * None.
50 *
51 * ### Notes ###
52 *
53 *
54 * ### Uses ###
55 *
56 * \code
57 * LALCalloc()
58 * LALFree()
59 * \endcode
60 *
61 * ### Notes ###
62 *
63 */
64
65#include <lal/Units.h>
66#include <lal/Date.h>
67#include <lal/AVFactories.h>
68#include <lal/VectorOps.h>
69#include <lal/SeqFactories.h>
70#include <lal/DetectorSite.h>
71#include <lal/GenerateInspiral.h>
72#include <lal/GeneratePPNInspiral.h>
73#include <lal/SimulateCoherentGW.h>
74#include <lal/LIGOMetadataTables.h>
75#include <lal/LIGOMetadataUtils.h>
76#include <lal/LIGOMetadataInspiralUtils.h>
77#include <lal/LIGOMetadataRingdownUtils.h>
78#include <lal/LALInspiralBank.h>
79#include <lal/FindChirp.h>
80#include <lal/LALStdlib.h>
81#include <lal/LALInspiralBank.h>
82#include <lal/GenerateInspiral.h>
83#include <lal/NRWaveInject.h>
84#include <lal/GenerateInspRing.h>
85#include <math.h>
86#include <lal/LALInspiral.h>
87#include <lal/LALError.h>
88#include <lal/TimeSeries.h>
89#include <lal/LALSimulation.h>
90
91#ifdef __GNUC__
92#define UNUSED __attribute__ ((unused))
93#else
94#define UNUSED
95#endif
96
98 REAL4Vector *signalvec,
99 UINT4 *start,
100 UINT4 *end
101 );
102
103
104void
107 REAL4TimeSeries *chan,
108 SimInspiralTable *events,
110 )
111
112{
113 UINT4 k;
115 SimInspiralTable *thisEvent = NULL;
116 PPNParamStruc ppnParams;
117 CoherentGW waveform;
118 INT8 waveformStartTime;
119 REAL4TimeSeries signalvec;
120 COMPLEX8Vector *unity = NULL;
121 CHAR warnMsg[512];
123 REAL8 timeDelay;
124
127
128 ASSERT( chan, status,
129 FINDCHIRPH_ENULL, FINDCHIRPH_MSGENULL );
130 ASSERT( chan->data, status,
131 FINDCHIRPH_ENULL, FINDCHIRPH_MSGENULL );
132 ASSERT( chan->data->data, status,
133 FINDCHIRPH_ENULL, FINDCHIRPH_MSGENULL );
134
135 ASSERT( events, status,
136 FINDCHIRPH_ENULL, FINDCHIRPH_MSGENULL );
137
138 ASSERT( resp, status,
139 FINDCHIRPH_ENULL, FINDCHIRPH_MSGENULL );
140 ASSERT( resp->data, status,
141 FINDCHIRPH_ENULL, FINDCHIRPH_MSGENULL );
142 ASSERT( resp->data->data, status,
143 FINDCHIRPH_ENULL, FINDCHIRPH_MSGENULL );
144
145
146 /*
147 *
148 * set up structures and parameters needed
149 *
150 */
151
152
153 /* fixed waveform injection parameters */
154 memset( &ppnParams, 0, sizeof(PPNParamStruc) );
155 ppnParams.deltaT = chan->deltaT;
156 ppnParams.lengthIn = 0;
157 ppnParams.ppn = NULL;
158
159
160 /*
161 *
162 * compute the transfer function from the given response function
163 *
164 */
165
166
167 /* allocate memory and copy the parameters describing the freq series */
168 memset( &detector, 0, sizeof( DetectorResponse ) );
169 detector.transfer = (COMPLEX8FrequencySeries *)
171 if ( ! detector.transfer )
172 {
173 ABORT( status, FINDCHIRPH_EALOC, FINDCHIRPH_MSGEALOC );
174 }
175 memcpy( &(detector.transfer->epoch), &(resp->epoch),
176 sizeof(LIGOTimeGPS) );
177 detector.transfer->f0 = resp->f0;
178 detector.transfer->deltaF = resp->deltaF;
179
180 detector.site = (LALDetector *) LALMalloc( sizeof(LALDetector) );
181 /* set the detector site */
182 switch ( chan->name[0] )
183 {
184 case 'H':
186 LALWarning( status, "computing waveform for Hanford." );
187 strcpy(ifo, "H1");
188 break;
189 case 'L':
191 LALWarning( status, "computing waveform for Livingston." );
192 strcpy(ifo, "L1");
193 break;
194 case 'G':
196 LALWarning( status, "computing waveform for GEO600." );
197 strcpy(ifo, "G1");
198 break;
199 case 'T':
201 LALWarning( status, "computing waveform for TAMA300." );
202 strcpy(ifo, "T1");
203 break;
204 case 'V':
206 LALWarning( status, "computing waveform for Virgo." );
207 strcpy(ifo, "V1");
208 break;
209 default:
210 LALFree( detector.site );
211 detector.site = NULL;
212 LALWarning( status, "Unknown detector site, computing plus mode "
213 "waveform with no time delay" );
214 break;
215 }
216
217 /* set up units for the transfer function */
218 if (XLALUnitDivide( &(detector.transfer->sampleUnits),
219 &lalADCCountUnit, &lalStrainUnit ) == NULL) {
221 }
222
223 /* invert the response function to get the transfer function */
224 LALCCreateVector( status->statusPtr, &( detector.transfer->data ),
225 resp->data->length );
227
228 LALCCreateVector( status->statusPtr, &unity, resp->data->length );
230 for ( k = 0; k < resp->data->length; ++k )
231 {
232 unity->data[k] = 1.0;
233 }
234
235 LALCCVectorDivide( status->statusPtr, detector.transfer->data, unity,
236 resp->data );
238
239 LALCDestroyVector( status->statusPtr, &unity );
241
242
243 /*
244 *
245 * loop over the signals and inject them into the time series
246 *
247 */
248
249
250 for ( thisEvent = events; thisEvent; thisEvent = thisEvent->next )
251 {
252 /*
253 *
254 * generate waveform and inject it into the data
255 *
256 */
257
258
259 /* clear the waveform structure */
260 memset( &waveform, 0, sizeof(CoherentGW) );
261
262 LALGenerateInspiral(status->statusPtr, &waveform, thisEvent, &ppnParams );
264
265 LALInfo( status, ppnParams.termDescription );
266
267 if ( strstr( thisEvent->waveform, "KludgeIMR") ||
268 strstr( thisEvent->waveform, "KludgeRingOnly") )
269 {
270 CoherentGW *wfm;
271 SimRingdownTable *ringEvent;
272 int injectSignalType = LALRINGDOWN_IMR_INJECT;
273
274
275 ringEvent = (SimRingdownTable *)
276 LALCalloc( 1, sizeof(SimRingdownTable) );
277 wfm = XLALGenerateInspRing( &waveform, thisEvent, ringEvent,
278 injectSignalType);
279 LALFree(ringEvent);
280
281 if ( !wfm )
282 {
283 LALInfo( status, "Unable to generate merger/ringdown, "
284 "injecting inspiral only");
285 ABORT( status, FINDCHIRPH_EIMRW, FINDCHIRPH_MSGEIMRW );
286 }
287 waveform = *wfm;
288 }
289
290
291 if ( thisEvent->geocent_end_time.gpsSeconds )
292 {
293 /* get the gps start time of the signal to inject */
294 waveformStartTime = XLALGPSToINT8NS( &(thisEvent->geocent_end_time) );
295 waveformStartTime -= (INT8) ( 1000000000.0 * ppnParams.tc );
296 }
297 else
298 {
299 LALInfo( status, "Waveform start time is zero: injecting waveform "
300 "into center of data segment" );
301
302 /* center the waveform in the data segment */
303 waveformStartTime = XLALGPSToINT8NS( &(chan->epoch) );
304
305 waveformStartTime += (INT8) ( 1000000000.0 *
306 ((REAL8) (chan->data->length - ppnParams.length) / 2.0) * chan->deltaT
307 );
308 }
309
310 snprintf( warnMsg, XLAL_NUM_ELEM(warnMsg),
311 "Injected waveform timing:\n"
312 "thisEvent->geocent_end_time.gpsSeconds = %d\n"
313 "thisEvent->geocent_end_time.gpsNanoSeconds = %d\n"
314 "ppnParams.tc = %e\n"
315 "waveformStartTime = %" LAL_INT8_FORMAT "\n",
316 thisEvent->geocent_end_time.gpsSeconds,
318 ppnParams.tc,
319 waveformStartTime );
320 LALInfo( status, warnMsg );
321
322 /* if we generated waveform.h then use LALInjectStrainGW
323 otherwise use SimulateCoherentGW */
324 if( waveform.h == NULL)
325 {
326 /* clear the signal structure */
327 memset( &signalvec, 0, sizeof(REAL4TimeSeries) );
328
329 /* set the start time of the signal vector to the appropriate start time of the injection */
330 if ( detector.site )
331 {
332 timeDelay = XLALTimeDelayFromEarthCenter( detector.site->location, thisEvent->longitude,
333 thisEvent->latitude, &(thisEvent->geocent_end_time) );
334 if ( XLAL_IS_REAL8_FAIL_NAN( timeDelay ) )
335 {
336 ABORTXLAL( status );
337 }
338 }
339 else
340 {
341 timeDelay = 0.0;
342 }
343 /* Give a little more breathing space to aid band-passing */
344 XLALGPSSetREAL8( &(signalvec.epoch), (waveformStartTime * 1.0e-9) - 0.25 + timeDelay );
345 UINT4 signalvecLength=waveform.phi->data->length + (UINT4)ceil((0.5+timeDelay)/waveform.phi->deltaT);
346
347
348 /* set the parameters for the signal time series */
349 signalvec.deltaT = chan->deltaT;
350 if ( ( signalvec.f0 = chan->f0 ) != 0 )
351 {
352 ABORT( status, FINDCHIRPH_EHETR, FINDCHIRPH_MSGEHETR );
353 }
354 signalvec.sampleUnits = lalADCCountUnit;
355
356 /* set the start times for injection */
357 XLALINT8NSToGPS( &(waveform.a->epoch), waveformStartTime );
358 /* put a rug on a polished floor? */
359 waveform.f->epoch = waveform.a->epoch;
360 waveform.phi->epoch = waveform.a->epoch;
361 /* you might as well set a man trap */
362 if ( waveform.shift )
363 {
364 waveform.shift->epoch = waveform.a->epoch;
365 }
366 /* and to think he'd just come from the hospital */
367
368 /* simulate the detectors response to the inspiral */
369 LALSCreateVector( status->statusPtr, &(signalvec.data), signalvecLength );
371
372 LALSimulateCoherentGW( status->statusPtr,
373 &signalvec, &waveform, &detector );
375
376 /* Taper the signal */
377 {
378
379 if ( ! strcmp( "TAPER_START", thisEvent->taper ) )
380 {
382 }
383 else if ( ! strcmp( "TAPER_END", thisEvent->taper ) )
384 {
386 }
387 else if ( ! strcmp( "TAPER_STARTEND", thisEvent->taper ) )
388 {
390 }
391 else if ( strcmp( "TAPER_NONE", thisEvent->taper ) )
392 {
393 XLALPrintError( "Invalid injection tapering option specified: %s\n",
394 thisEvent->taper );
396 }
397 }
398
399 /* Band pass the signal */
400 if ( thisEvent->bandpass )
401 {
402 UINT4 safeToBandPass = 0;
403 UINT4 start=0, end=0;
404 REAL4Vector *bandpassVec = NULL;
405
406 safeToBandPass = FindTimeSeriesStartAndEnd (
407 signalvec.data, &start, &end );
408
409 if ( safeToBandPass )
410 {
411 /* Check if we can grab some padding at the extremeties.
412 * This will make the bandpassing better
413 */
414
415 if (((INT4)start - (int)(0.25/chan->deltaT)) > 0 )
416 start -= (int)(0.25/chan->deltaT);
417 else
418 start = 0;
419
420 if ((end + (int)(0.25/chan->deltaT)) < signalvec.data->length )
421 end += (int)(0.25/chan->deltaT);
422 else
423 end = signalvec.data->length - 1;
424
425 bandpassVec = (REAL4Vector *)
426 LALCalloc(1, sizeof(REAL4Vector) );
427
428 bandpassVec->length = (end - start + 1);
429 bandpassVec->data = signalvec.data->data + start;
430
431 if ( XLALBandPassInspiralTemplate( bandpassVec,
432 1.1*thisEvent->f_lower,
433 1.05*thisEvent->f_final,
434 1./chan->deltaT) != XLAL_SUCCESS )
435 {
436 LALError( status, "Failed to Bandpass signal" );
437 ABORT (status, LALINSPIRALH_EBPERR, LALINSPIRALH_MSGEBPERR);
438 };
439
440 LALFree( bandpassVec );
441 }
442 }
443
444 /* inject the signal into the data channel */
445 int retcode=XLALSimAddInjectionREAL4TimeSeries(chan, &signalvec, NULL);
446
447 if(retcode!=XLAL_SUCCESS){
449 }
450
451 }
452 else
453 {
454 const INT4 wfmLength = waveform.h->data->length;
455 INT4 i = wfmLength;
456 REAL4 *dataPtr = waveform.h->data->data;
457 REAL4 *tmpdata;
458
459 /* XXX This code will BREAK if the first element of the frequency XXX *
460 * XXX series does not contain dynRange. This is the case for XXX *
461 * XXX calibrated strain data, but will not be the case when XXX *
462 * XXX filtering uncalibrated data. XXX */
463 REAL8 dynRange;
464 LALWarning (status, "Attempting to calculate dynRange: Will break if un-calibrated strain-data is used.");
465 dynRange = 1.0/(crealf(resp->data->data[0]));
466
467 /* set the start times for injection */
468 XLALINT8NSToGPS( &(waveform.h->epoch), waveformStartTime );
469
470 /*
471 * We are using functions from NRWaveInject which do not take a vector
472 * with alternating h+ & hx but rather one that stores h+ in the first
473 * half and hx in the second half. That is, we must transpose h.
474 *
475 * We also must multiply the strain by the distance to be compatible
476 * with NRWaveInject.
477 */
478 if (waveform.h->data->vectorLength != 2)
479 LALAbort("expected alternating h+ and hx");
480 tmpdata = XLALCalloc(2 * wfmLength, sizeof(*tmpdata));
481 for (i=0;i<wfmLength;i++) {
482 tmpdata[i] = dataPtr[2*i] * thisEvent->distance;
483 tmpdata[wfmLength+i] = dataPtr[2*i+1] * thisEvent->distance;
484 }
485 memcpy(dataPtr, tmpdata, 2 * wfmLength * sizeof(*tmpdata));
486 XLALFree(tmpdata);
487 waveform.h->data->vectorLength = wfmLength;
488 waveform.h->data->length = 2;
489
490 LALInjectStrainGW( status->statusPtr ,
491 chan ,
492 waveform.h ,
493 thisEvent ,
494 ifo ,
495 dynRange );
497
498 }
499
500
501
502
503 if ( waveform.shift )
504 {
505 LALSDestroyVector( status->statusPtr, &(waveform.shift->data) );
507 LALFree( waveform.shift );
508 }
509
510 if( waveform.h )
511 {
512 LALSDestroyVectorSequence( status->statusPtr, &(waveform.h->data) );
514 LALFree( waveform.h );
515 }
516 if( waveform.a )
517 {
518 LALSDestroyVectorSequence( status->statusPtr, &(waveform.a->data) );
520 LALFree( waveform.a );
521 /*
522 * destroy the signal only if waveform.h is NULL as otherwise it won't
523 * be created
524 * */
525 if ( waveform.h == NULL )
526 {
527 LALSDestroyVector( status->statusPtr, &(signalvec.data) );
529 }
530 }
531 if( waveform.f )
532 {
533 LALSDestroyVector( status->statusPtr, &(waveform.f->data) );
535 LALFree( waveform.f );
536 }
537 if( waveform.phi )
538 {
539 LALDDestroyVector( status->statusPtr, &(waveform.phi->data) );
541 LALFree( waveform.phi );
542 }
543 }
544
545 LALCDestroyVector( status->statusPtr, &( detector.transfer->data ) );
547
548 if ( detector.site ) LALFree( detector.site );
549 LALFree( detector.transfer );
550
552 RETURN( status );
553}
554
555
557 REAL4Vector *signalvec,
558 UINT4 *start,
559 UINT4 *end
560 )
561{
562 UINT4 i; /* mid, n; indices */
563 UINT4 flag, safe = 1;
564 UINT4 length;
565
566 if ( !signalvec )
568
569 if ( !signalvec->data )
571
572 length = signalvec->length;
573
574 /* Search for start and end of signal */
575 flag = 0;
576 i = 0;
577 while(flag == 0 && i < length )
578 {
579 if( signalvec->data[i] != 0.)
580 {
581 *start = i;
582 flag = 1;
583 }
584 i++;
585 }
586 if ( flag == 0 )
587 {
588 return flag;
589 }
590
591 flag = 0;
592 i = length - 1;
593 while(flag == 0)
594 {
595 if( signalvec->data[i] != 0.)
596 {
597 *end = i;
598 flag = 1;
599 }
600 i--;
601 }
602
603 /* Check we have more than 2 data points */
604 if(((*end) - (*start)) <= 1)
605 {
606 XLALPrintWarning( "Data less than 3 points in this signal!\n" );
607 safe = 0;
608 }
609
610 return safe;
611
612}
int XLALBandPassInspiralTemplate(REAL4Sequence *sequence, REAL4 fLow, REAL4 fHigh, REAL4 fSampling)
LALDetectorIndexLLODIFF
LALDetectorIndexGEO600DIFF
LALDetectorIndexTAMA300DIFF
LALDetectorIndexVIRGODIFF
LALDetectorIndexLHODIFF
static int FindTimeSeriesStartAndEnd(REAL4Vector *signalvec, UINT4 *start, UINT4 *end)
void LALFindChirpInjectSignals(LALStatus *status, REAL4TimeSeries *chan, SimInspiralTable *events, COMPLEX8FrequencySeries *resp)
#define LAL_BADPARM_MSG
#define LAL_BADPARM_ERR
#define LALCalloc(m, n)
#define LALMalloc(n)
#define LALFree(p)
#define ABORT(statusptr, code, mesg)
#define CHECKSTATUSPTR(statusptr)
#define ATTATCHSTATUSPTR(statusptr)
#define ASSERT(assertion, statusptr, code, mesg)
#define DETATCHSTATUSPTR(statusptr)
#define INITSTATUS(statusptr)
#define RETURN(statusptr)
#define ABORTXLAL(sp)
@ LALRINGDOWN_IMR_INJECT
#define LIGOMETA_IFO_MAX
void LALSimulateCoherentGW(LALStatus *status, REAL4TimeSeries *output, CoherentGW *input, DetectorResponse *detector)
double i
const char * detector
void LALSDestroyVectorSequence(LALStatus *status, REAL4VectorSequence **vectorSequence)
const LALDetector lalCachedDetectors[LAL_NUM_DETECTORS]
#define FINDCHIRPH_EIMRW
Error computing IMR waveform.
Definition: FindChirp.h:120
#define FINDCHIRPH_EALOC
Memory allocation error.
Definition: FindChirp.h:97
#define FINDCHIRPH_ENULL
Null pointer.
Definition: FindChirp.h:95
#define FINDCHIRPH_EHETR
Attempting to simulate heterodyned GW.
Definition: FindChirp.h:109
CoherentGW * XLALGenerateInspRing(CoherentGW *waveform, SimInspiralTable *inspiralInj, SimRingdownTable *ringInj, int injectSignalType)
Takes an inspiral waveform, and a simInspiralTable and generates a ringdown at an appropriate frequen...
void LALGenerateInspiral(LALStatus *status, CoherentGW *waveform, SimInspiralTable *thisEvent, PPNParamStruc *ppnParams)
#define XLAL_NUM_ELEM(x)
double REAL8
int64_t INT8
char CHAR
uint32_t UINT4
int32_t INT4
float REAL4
void LALAbort(const char *fmt,...)
int LALWarning(LALStatus *status, const char *warning)
int LALError(LALStatus *status, const char *statement)
int LALInfo(LALStatus *status, const char *info)
#define LALINSPIRALH_EBPERR
Error in band passing signal.
Definition: LALInspiral.h:74
void * XLALCalloc(size_t m, size_t n)
void XLALFree(void *p)
LAL_SIM_INSPIRAL_TAPER_START
LAL_SIM_INSPIRAL_TAPER_STARTEND
LAL_SIM_INSPIRAL_TAPER_END
int XLALSimInspiralREAL4WaveTaper(REAL4Vector *signalvec, LALSimInspiralApplyTaper bookends)
int XLALSimAddInjectionREAL4TimeSeries(REAL4TimeSeries *target, REAL4TimeSeries *h, const COMPLEX8FrequencySeries *response)
#define LAL_INT8_FORMAT
void LALInjectStrainGW(LALStatus *status, REAL4TimeSeries *injData, REAL4TimeVectorSeries *strain, SimInspiralTable *thisInj, CHAR *ifo, REAL8 dynRange)
Definition: NRWaveInject.c:655
REAL8 XLALTimeDelayFromEarthCenter(const double detector_earthfixed_xyz_metres[3], double source_right_ascension_radians, double source_declination_radians, const LIGOTimeGPS *gpstime)
const LALUnit lalStrainUnit
const LALUnit lalADCCountUnit
LALUnit * XLALUnitDivide(LALUnit *output, const LALUnit *unit1, const LALUnit *unit2)
void LALCCreateVector(LALStatus *, COMPLEX8Vector **, UINT4)
void LALCDestroyVector(LALStatus *, COMPLEX8Vector **)
void LALDDestroyVector(LALStatus *, REAL8Vector **)
void LALSDestroyVector(LALStatus *, REAL4Vector **)
void LALSCreateVector(LALStatus *, REAL4Vector **, UINT4)
void LALCCVectorDivide(LALStatus *status, COMPLEX8Vector *out, const COMPLEX8Vector *in1, const COMPLEX8Vector *in2)
#define XLAL_ERROR(...)
int XLALPrintError(const char *fmt,...) _LAL_GCC_PRINTF_FORMAT_(1
int int XLALPrintWarning(const char *fmt,...) _LAL_GCC_PRINTF_FORMAT_(1
#define XLAL_IS_REAL8_FAIL_NAN(val)
XLAL_SUCCESS
XLAL_EFAULT
LIGOTimeGPS * XLALGPSSetREAL8(LIGOTimeGPS *epoch, REAL8 t)
LIGOTimeGPS * XLALINT8NSToGPS(LIGOTimeGPS *epoch, INT8 ns)
INT8 XLALGPSToINT8NS(const LIGOTimeGPS *epoch)
start
COMPLEX8Sequence * data
COMPLEX8 * data
REAL4TimeSeries * shift
REAL4TimeVectorSeries * a
REAL8TimeSeries * phi
REAL4TimeVectorSeries * h
REAL4TimeSeries * f
INT4 gpsNanoSeconds
This structure stores the parameters for constructing a restricted post-Newtonian waveform.
REAL4Vector * ppn
The parameters selecting the type of post-Newtonian expansion; If ppn=NULL, a "normal" (physical) ex...
const CHAR * termDescription
The termination code description (above)
UINT4 length
The length of the generated waveform.
REAL8 tc
The time from the start of the waveform to coalescence (in the point-mass approximation),...
REAL8 deltaT
The requested sampling interval of the waveform, in s.
UINT4 lengthIn
The maximum number of samples in the generated waveform; If zero, the waveforms can be arbitrarily lo...
CHAR name[LALNameLength]
REAL4Sequence * data
LALUnit sampleUnits
LIGOTimeGPS epoch
REAL4VectorSequence * data
REAL4 * data
REAL8Sequence * data
LIGOTimeGPS epoch
LIGOTimeGPS geocent_end_time
struct tagSimInspiralTable * next
CHAR taper[LIGOMETA_INSPIRALTAPER_MAX]
CHAR waveform[LIGOMETA_WAVEFORM_MAX]