00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197
00198
00199 #include <config.h>
00200 #ifdef HAVE_SUNMATH_H
00201 #include <sunmath.h>
00202 #if defined HAVE_LIBSUNMATH && defined ONLINE
00203 #define USE_SINCOSP 1
00204 #endif
00205 #endif
00206
00207 #include <math.h>
00208 #include <lal/LALStdio.h>
00209 #include <lal/LALStdlib.h>
00210 #include <lal/LALError.h>
00211 #include <lal/DetectorSite.h>
00212 #include <lal/DetResponse.h>
00213 #include <lal/AVFactories.h>
00214 #include <lal/Date.h>
00215 #include <lal/Units.h>
00216 #include <lal/TimeDelay.h>
00217 #include <lal/LALBarycenter.h>
00218 #include <lal/VectorOps.h>
00219 #include <lal/SimulateCoherentGW.h>
00220 #include <lal/SkyCoordinates.h>
00221
00222
00223 #include <lal/RealFFT.h>
00224
00225
00226
00227
00228
00229
00230
00231
00232
00233
00234 #define TCENTRE( time ) \
00235 ( \
00236 realIndex = delayOff + (time)*delayDt, \
00237 intIndex = (INT4)floor( realIndex ), \
00238 indexFrac = realIndex - intIndex, \
00239 time + indexFrac*delayData[intIndex+1] \
00240 + (1.0-indexFrac)*delayData[intIndex] \
00241 )
00242
00243
00244 NRCSID( SIMULATECOHERENTGWNEWC, "$Id: SimulateCoherentGWNew.c,v 1.5 2007/06/08 14:41:47 bema Exp $" );
00245
00246
00247
00248 void
00249 LALSimulateCoherentGW( LALStatus *stat,
00250 REAL4TimeSeries *output,
00251 CoherentGW *signal,
00252 DetectorResponse *detector )
00253 {
00254 INT4 i, n;
00255
00256 INT4 startI = 0;
00257
00258 INT4 nMax;
00259 INT4 fInit, fFinal;
00260 INT4 shiftInit, shiftFinal;
00261 UINT4 dtDelayBy2 = 400;
00262 UINT4 dtPolBy2 = 300;
00263 REAL4 *outData;
00264 REAL8 delayMin, delayMax;
00265 SkyPosition source;
00266 BOOLEAN transfer;
00267 BOOLEAN fFlag = 0;
00268 BOOLEAN pFlag = 0;
00269
00270
00271
00272
00273
00274
00275
00276 LALDetAMResponseSeries polResponse;
00277 REAL8Vector *delay = NULL;
00278 REAL4 *aData, *fData, *shiftData, *plusData, *crossData;
00279 REAL8 *phiData, *delayData;
00280 REAL8 aOff, fOff, phiOff, shiftOff, polOff, delayOff;
00281 REAL8 aDt, fDt, phiDt, shiftDt, polDt, delayDt;
00282
00283
00284
00285
00286 REAL4Vector *aTransfer = NULL;
00287 REAL4Vector *phiTransfer = NULL;
00288 REAL4Vector *phiTemp = NULL;
00289 REAL4 *aTransData = NULL, *phiTransData = NULL;
00290 REAL8 f0 = 1.0;
00291 REAL8 phiFac = 1.0, fFac = 1.0;
00292
00293
00294
00295
00296 REAL8 heteroFac, phi0;
00297
00298
00299 REAL8 realIndex;
00300 INT4 intIndex;
00301 REAL8 indexFrac;
00302
00303
00304 INT4 l = 0;
00305 INT4 k = 0;
00306 RealFFTPlan *fwdPlan = NULL;
00307 RealFFTPlan *invPlan = NULL;
00308 REAL4Vector *interpolatedWave = NULL;
00309 COMPLEX8Vector *interpolatedFFTWave = NULL;
00310 COMPLEX8Vector *CFreqOutput = NULL;
00311 INT4 outFreqLength=0;
00312
00313 INITSTATUS( stat, "LALSimulateCoherentGWNew", SIMULATECOHERENTGWNEWC );
00314 ATTATCHSTATUSPTR( stat );
00315
00316
00317 ASSERT( signal, stat, SIMULATECOHERENTGWH_ENUL,
00318 SIMULATECOHERENTGWH_MSGENUL );
00319 if ( !( signal->a ) ) {
00320 ABORT( stat, SIMULATECOHERENTGWH_ESIG,
00321 SIMULATECOHERENTGWH_MSGESIG );
00322 }
00323 ASSERT( signal->a->data, stat,
00324 SIMULATECOHERENTGWH_ENUL, SIMULATECOHERENTGWH_MSGENUL );
00325 ASSERT( signal->a->data->data, stat,
00326 SIMULATECOHERENTGWH_ENUL, SIMULATECOHERENTGWH_MSGENUL );
00327 if ( !( signal->phi ) ) {
00328 ABORT( stat, SIMULATECOHERENTGWH_ESIG,
00329 SIMULATECOHERENTGWH_MSGESIG );
00330 }
00331 ASSERT( signal->phi->data, stat,
00332 SIMULATECOHERENTGWH_ENUL, SIMULATECOHERENTGWH_MSGENUL );
00333 ASSERT( signal->phi->data->data, stat,
00334 SIMULATECOHERENTGWH_ENUL, SIMULATECOHERENTGWH_MSGENUL );
00335 if ( signal->f ) {
00336 ASSERT( signal->f->data, stat,
00337 SIMULATECOHERENTGWH_ENUL, SIMULATECOHERENTGWH_MSGENUL );
00338 ASSERT( signal->f->data->data, stat,
00339 SIMULATECOHERENTGWH_ENUL, SIMULATECOHERENTGWH_MSGENUL );
00340 }
00341 if ( signal->shift ) {
00342 ASSERT( signal->shift->data, stat,
00343 SIMULATECOHERENTGWH_ENUL, SIMULATECOHERENTGWH_MSGENUL );
00344 ASSERT( signal->shift->data->data, stat,
00345 SIMULATECOHERENTGWH_ENUL, SIMULATECOHERENTGWH_MSGENUL );
00346 }
00347 ASSERT( detector, stat,
00348 SIMULATECOHERENTGWH_ENUL, SIMULATECOHERENTGWH_MSGENUL );
00349 if ( ( transfer = ( detector->transfer != NULL ) ) ) {
00350 ASSERT( detector->transfer->data, stat,
00351 SIMULATECOHERENTGWH_ENUL, SIMULATECOHERENTGWH_MSGENUL );
00352 ASSERT( detector->transfer->data->data, stat,
00353 SIMULATECOHERENTGWH_ENUL, SIMULATECOHERENTGWH_MSGENUL );
00354 }
00355 ASSERT( output, stat,
00356 SIMULATECOHERENTGWH_ENUL, SIMULATECOHERENTGWH_MSGENUL );
00357 ASSERT( output->data, stat,
00358 SIMULATECOHERENTGWH_ENUL, SIMULATECOHERENTGWH_MSGENUL );
00359 ASSERT( output->data->data, stat,
00360 SIMULATECOHERENTGWH_ENUL, SIMULATECOHERENTGWH_MSGENUL );
00361
00362
00363 ASSERT( signal->a->data->vectorLength == 2, stat,
00364 SIMULATECOHERENTGWH_EDIM, SIMULATECOHERENTGWH_MSGEDIM );
00365
00366
00367 ASSERT( signal->a->deltaT != 0.0, stat,
00368 SIMULATECOHERENTGWH_EBAD, SIMULATECOHERENTGWH_MSGEBAD );
00369 ASSERT( signal->phi->deltaT != 0.0, stat,
00370 SIMULATECOHERENTGWH_EBAD, SIMULATECOHERENTGWH_MSGEBAD );
00371 aDt = output->deltaT / signal->a->deltaT;
00372 phiDt = output->deltaT / signal->phi->deltaT;
00373 ASSERT( aDt != 0.0, stat,
00374 SIMULATECOHERENTGWH_EBAD, SIMULATECOHERENTGWH_MSGEBAD );
00375 ASSERT( phiDt != 0.0, stat,
00376 SIMULATECOHERENTGWH_EBAD, SIMULATECOHERENTGWH_MSGEBAD );
00377 if ( signal->f ) {
00378 ASSERT( signal->f->deltaT != 0.0, stat,
00379 SIMULATECOHERENTGWH_EBAD, SIMULATECOHERENTGWH_MSGEBAD );
00380 fDt = output->deltaT / signal->f->deltaT;
00381 ASSERT( fDt != 0.0, stat,
00382 SIMULATECOHERENTGWH_EBAD, SIMULATECOHERENTGWH_MSGEBAD );
00383 } else
00384 fDt = 0.0;
00385 if ( signal->shift ) {
00386 ASSERT( signal->shift->deltaT != 0.0, stat,
00387 SIMULATECOHERENTGWH_EBAD, SIMULATECOHERENTGWH_MSGEBAD );
00388 shiftDt = output->deltaT / signal->shift->deltaT;
00389 ASSERT( shiftDt != 0.0, stat,
00390 SIMULATECOHERENTGWH_EBAD, SIMULATECOHERENTGWH_MSGEBAD );
00391 } else
00392 shiftDt = 0.0;
00393 if ( transfer ) {
00394 ASSERT( detector->transfer->deltaF != 0.0, stat,
00395 SIMULATECOHERENTGWH_EBAD, SIMULATECOHERENTGWH_MSGEBAD );
00396 fFac = 1.0 / detector->transfer->deltaF;
00397 phiFac = fFac / ( LAL_TWOPI*signal->phi->deltaT );
00398 f0 = detector->transfer->f0/detector->transfer->deltaF;
00399 }
00400 heteroFac = LAL_TWOPI*output->f0*output->deltaT;
00401 phi0 = (REAL8)( output->epoch.gpsSeconds -
00402 detector->heterodyneEpoch.gpsSeconds );
00403 phi0 += 0.000000001*(REAL8)( output->epoch.gpsNanoSeconds -
00404 detector->heterodyneEpoch.gpsNanoSeconds );
00405 phi0 *= LAL_TWOPI*output->f0;
00406 if ( phi0 > 1.0/LAL_REAL8_EPS ) {
00407 LALWarning( stat, "REAL8 arithmetic is not sufficient to maintain"
00408 " heterodyne phase to within a radian." );
00409 }
00410
00411
00412 {
00413 BOOLEAN unitsOK;
00414 LALUnitPair pair;
00415
00416 pair.unitOne = &(signal->f->sampleUnits);
00417 pair.unitTwo = &lalHertzUnit;
00418 TRY( LALUnitCompare( stat->statusPtr, &unitsOK, &pair ), stat );
00419 ASSERT( unitsOK, stat, SIMULATECOHERENTGWH_EUNIT,
00420 SIMULATECOHERENTGWH_MSGEUNIT );
00421 pair.unitOne = &(signal->phi->sampleUnits);
00422 pair.unitTwo = &lalDimensionlessUnit;
00423 TRY( LALUnitCompare( stat->statusPtr, &unitsOK, &pair ), stat );
00424 ASSERT( unitsOK, stat, SIMULATECOHERENTGWH_EUNIT,
00425 SIMULATECOHERENTGWH_MSGEUNIT );
00426 if( signal->shift ) {
00427 pair.unitOne = &(signal->shift->sampleUnits);
00428 TRY( LALUnitCompare( stat->statusPtr, &unitsOK, &pair ), stat );
00429 ASSERT( unitsOK, stat, SIMULATECOHERENTGWH_EUNIT,
00430 SIMULATECOHERENTGWH_MSGEUNIT );
00431 }
00432 if ( transfer ) {
00433 pair.unitOne = &(signal->a->sampleUnits);
00434 pair.unitTwo = &(detector->transfer->sampleUnits);
00435 TRY( LALUnitMultiply( stat->statusPtr, &(output->sampleUnits),
00436 &pair ), stat );
00437 } else
00438 output->sampleUnits = signal->a->sampleUnits;
00439 LALSnprintf( output->name, LALNameLength, "response to %s",
00440 signal->a->name );
00441 }
00442
00443
00444
00445 aData = signal->a->data->data;
00446 phiData = signal->phi->data->data;
00447 outData = output->data->data;
00448 if ( signal->f )
00449 fData = signal->f->data->data;
00450 else
00451 fData = NULL;
00452 if ( signal->shift )
00453 shiftData = signal->shift->data->data;
00454 else
00455 shiftData = NULL;
00456
00457
00458
00459 if ( detector->site ) {
00460 source = signal->position;
00461 if ( source.system != COORDINATESYSTEM_EQUATORIAL ) {
00462 ConvertSkyParams params;
00463 EarthPosition location;
00464 params.gpsTime = &( output->epoch );
00465 params.system = COORDINATESYSTEM_EQUATORIAL;
00466 if ( source.system == COORDINATESYSTEM_HORIZON ) {
00467 params.zenith = &( location.geodetic );
00468 location.x = detector->site->location[0];
00469 location.y = detector->site->location[1];
00470 location.z = detector->site->location[2];
00471 TRY( LALGeocentricToGeodetic( stat->statusPtr, &location ),
00472 stat );
00473 }
00474 TRY( LALConvertSkyCoordinates( stat->statusPtr, &source,
00475 &source, ¶ms ), stat );
00476 }
00477 }
00478
00479
00480
00481
00482 delayDt = output->deltaT/( 2.0*dtDelayBy2 );
00483 nMax = (UINT4)( output->data->length*delayDt ) + 3;
00484 TRY( LALDCreateVector( stat->statusPtr, &delay, nMax ), stat );
00485 delayData = delay->data;
00486
00487
00488 if ( detector->site && detector->ephemerides ) {
00489 LIGOTimeGPS gpsTime;
00490 EarthState state;
00491 BarycenterInput input;
00492 EmissionTime emit;
00493
00494
00495 gpsTime = input.tgps = output->epoch;
00496 gpsTime.gpsSeconds -= dtDelayBy2;
00497 input.tgps.gpsSeconds -= dtDelayBy2;
00498 input.site = *(detector->site);
00499 for ( i = 0; i < 3; i++ )
00500 input.site.location[i] /= LAL_C_SI;
00501 input.alpha = source.longitude;
00502 input.delta = source.latitude;
00503 input.dInv = 0.0;
00504 delayMin = delayMax = 1.1*LAL_AU_SI/( LAL_C_SI*output->deltaT );
00505 delayMax *= -1;
00506
00507
00508 for ( i = 0; i < nMax; i++ ) {
00509 REAL8 tDelay;
00510 LALBarycenterEarth( stat->statusPtr, &state, &gpsTime,
00511 detector->ephemerides );
00512 BEGINFAIL( stat )
00513 TRY( LALDDestroyVector( stat->statusPtr, &delay ), stat );
00514 ENDFAIL( stat );
00515 LALBarycenter( stat->statusPtr, &emit, &input, &state );
00516 BEGINFAIL( stat )
00517 TRY( LALDDestroyVector( stat->statusPtr, &delay ), stat );
00518 ENDFAIL( stat );
00519 delayData[i] = tDelay = emit.deltaT/output->deltaT;
00520 if ( tDelay < delayMin )
00521 delayMin = tDelay;
00522 if ( tDelay > delayMax )
00523 delayMax = tDelay;
00524 gpsTime.gpsSeconds += 2*dtDelayBy2;
00525 input.tgps.gpsSeconds += 2*dtDelayBy2;
00526 }
00527 }
00528
00529
00530 else if ( detector->site ) {
00531 LIGOTimeGPS gpsTime;
00532 LALPlaceAndGPS event;
00533 DetTimeAndASource input;
00534
00535 LALInfo( stat, "Ephemeris field absent; computing propagation"
00536 " delays from Earth centre" );
00537
00538
00539 event.p_detector = detector->site;
00540 event.p_gps = &gpsTime;
00541 input.p_det_and_time = &event;
00542 input.p_source = &source;
00543 gpsTime = output->epoch;
00544 gpsTime.gpsSeconds -= dtDelayBy2;
00545 delayMin = delayMax = LAL_REARTH_SI / ( LAL_C_SI*output->deltaT );
00546 delayMin *= -1;
00547
00548
00549 for ( i = 0; i < nMax; i++ ) {
00550 REAL8 tDelay;
00551 LALTimeDelayFromEarthCenter( stat->statusPtr, &tDelay, &input );
00552 BEGINFAIL( stat )
00553 TRY( LALDDestroyVector( stat->statusPtr, &delay ), stat );
00554 ENDFAIL( stat );
00555
00556
00557
00558 tDelay /= -output->deltaT;
00559 delayData[i] = tDelay;
00560 if ( tDelay < delayMin )
00561 delayMin = tDelay;
00562 if ( tDelay > delayMax )
00563 delayMax = tDelay;
00564 gpsTime.gpsSeconds += 2*dtDelayBy2;
00565 }
00566 }
00567
00568
00569 else {
00570 LALInfo( stat, "Detector site absent; simulating hplus with no"
00571 " propagation delays" );
00572 memset( delayData, 0, nMax*sizeof(REAL8) );
00573 delayMin = delayMax = 0.0;
00574 }
00575
00576
00577 polDt = output->deltaT/( 2.0*dtPolBy2 );
00578 nMax = (UINT4)( output->data->length*polDt ) + 3;
00579 memset( &polResponse, 0, sizeof( LALDetAMResponseSeries ) );
00580 polResponse.pPlus = (REAL4TimeSeries *)
00581 LALMalloc( sizeof(REAL4TimeSeries) );
00582 polResponse.pCross = (REAL4TimeSeries *)
00583 LALMalloc( sizeof(REAL4TimeSeries) );
00584 polResponse.pScalar = (REAL4TimeSeries *)
00585 LALMalloc( sizeof(REAL4TimeSeries) );
00586 if ( !polResponse.pPlus || !polResponse.pCross ||
00587 !polResponse.pScalar ) {
00588 if ( polResponse.pPlus )
00589 LALFree( polResponse.pPlus );
00590 if ( polResponse.pCross )
00591 LALFree( polResponse.pCross );
00592 if ( polResponse.pScalar )
00593 LALFree( polResponse.pScalar );
00594 TRY( LALDDestroyVector( stat->statusPtr, &delay ), stat );
00595 ABORT( stat, SIMULATECOHERENTGWH_EMEM,
00596 SIMULATECOHERENTGWH_MSGEMEM );
00597 }
00598 memset( polResponse.pPlus, 0, sizeof(REAL4TimeSeries) );
00599 memset( polResponse.pCross, 0, sizeof(REAL4TimeSeries) );
00600 memset( polResponse.pScalar, 0, sizeof(REAL4TimeSeries) );
00601 LALSCreateVector( stat->statusPtr, &( polResponse.pPlus->data ),
00602 nMax );
00603 BEGINFAIL( stat ) {
00604 LALFree( polResponse.pPlus );
00605 LALFree( polResponse.pCross );
00606 LALFree( polResponse.pScalar );
00607 TRY( LALDDestroyVector( stat->statusPtr, &delay ), stat );
00608 } ENDFAIL( stat );
00609 LALSCreateVector( stat->statusPtr, &( polResponse.pCross->data ),
00610 nMax );
00611 BEGINFAIL( stat ) {
00612 TRY( LALSDestroyVector( stat->statusPtr,
00613 &( polResponse.pPlus->data ) ), stat );
00614 LALFree( polResponse.pPlus );
00615 LALFree( polResponse.pCross );
00616 LALFree( polResponse.pScalar );
00617 TRY( LALDDestroyVector( stat->statusPtr, &delay ), stat );
00618 } ENDFAIL( stat );
00619 LALSCreateVector( stat->statusPtr, &( polResponse.pScalar->data ),
00620 nMax );
00621 BEGINFAIL( stat ) {
00622 TRY( LALSDestroyVector( stat->statusPtr,
00623 &( polResponse.pPlus->data ) ), stat );
00624 TRY( LALSDestroyVector( stat->statusPtr,
00625 &( polResponse.pCross->data ) ), stat );
00626 LALFree( polResponse.pPlus );
00627 LALFree( polResponse.pCross );
00628 LALFree( polResponse.pScalar );
00629 TRY( LALDDestroyVector( stat->statusPtr, &delay ), stat );
00630 } ENDFAIL( stat );
00631 plusData = polResponse.pPlus->data->data;
00632 crossData = polResponse.pCross->data->data;
00633 if ( detector->site ) {
00634 LALSource polSource;
00635 LALDetAndSource input;
00636 LALTimeIntervalAndNSample params;
00637
00638
00639 polSource.equatorialCoords = source;
00640 polSource.orientation = (REAL8)( signal->psi );
00641 input.pSource = &polSource;
00642 input.pDetector = detector->site;
00643 params.epoch = output->epoch;
00644 params.epoch.gpsSeconds -= dtPolBy2;
00645 params.deltaT = 2.0*dtPolBy2;
00646 params.nSample = nMax;
00647 params.accuracy = LALLEAPSEC_STRICT;
00648
00649
00650 LALComputeDetAMResponseSeries( stat->statusPtr, &polResponse,
00651 &input, ¶ms );
00652 BEGINFAIL( stat ) {
00653 TRY( LALSDestroyVector( stat->statusPtr,
00654 &( polResponse.pPlus->data ) ), stat );
00655 TRY( LALSDestroyVector( stat->statusPtr,
00656 &( polResponse.pCross->data ) ), stat );
00657 TRY( LALSDestroyVector( stat->statusPtr,
00658 &( polResponse.pScalar->data ) ), stat );
00659 LALFree( polResponse.pPlus );
00660 LALFree( polResponse.pCross );
00661 LALFree( polResponse.pScalar );
00662 TRY( LALDDestroyVector( stat->statusPtr, &delay ), stat );
00663 } ENDFAIL( stat );
00664 } else {
00665
00666 for ( i = 0; i < nMax; i++ ) {
00667 plusData[i] = 1.0;
00668 crossData[i] = 0.0;
00669 }
00670 }
00671
00672 TRY( LALSDestroyVector( stat->statusPtr,
00673 &( polResponse.pScalar->data ) ), stat );
00674 LALFree( polResponse.pScalar );
00675
00676
00677
00678 if ( transfer ) {
00679 nMax = detector->transfer->data->length;
00680 LALSCreateVector( stat->statusPtr, &phiTemp, nMax );
00681 BEGINFAIL( stat ) {
00682 TRY( LALDDestroyVector( stat->statusPtr, &delay ), stat );
00683 TRY( LALSDestroyVector( stat->statusPtr,
00684 &( polResponse.pPlus->data ) ), stat );
00685 TRY( LALSDestroyVector( stat->statusPtr,
00686 &( polResponse.pCross->data ) ), stat );
00687 LALFree( polResponse.pPlus );
00688 LALFree( polResponse.pCross );
00689 } ENDFAIL( stat );
00690 LALCVectorAngle( stat->statusPtr, phiTemp,
00691 detector->transfer->data );
00692 BEGINFAIL( stat ) {
00693 TRY( LALDDestroyVector( stat->statusPtr, &delay ), stat );
00694 TRY( LALSDestroyVector( stat->statusPtr, &phiTemp ), stat );
00695 TRY( LALSDestroyVector( stat->statusPtr,
00696 &( polResponse.pPlus->data ) ), stat );
00697 TRY( LALSDestroyVector( stat->statusPtr,
00698 &( polResponse.pCross->data ) ), stat );
00699 LALFree( polResponse.pPlus );
00700 LALFree( polResponse.pCross );
00701 } ENDFAIL( stat );
00702 LALSCreateVector( stat->statusPtr, &phiTransfer, nMax );
00703 BEGINFAIL( stat ) {
00704 TRY( LALDDestroyVector( stat->statusPtr, &delay ), stat );
00705 TRY( LALSDestroyVector( stat->statusPtr, &phiTemp ), stat );
00706 TRY( LALSDestroyVector( stat->statusPtr,
00707 &( polResponse.pPlus->data ) ), stat );
00708 TRY( LALSDestroyVector( stat->statusPtr,
00709 &( polResponse.pCross->data ) ), stat );
00710 LALFree( polResponse.pPlus );
00711 LALFree( polResponse.pCross );
00712 } ENDFAIL( stat );
00713 LALUnwrapREAL4Angle( stat->statusPtr, phiTransfer, phiTemp );
00714 BEGINFAIL( stat ) {
00715 TRY( LALDDestroyVector( stat->statusPtr, &delay ), stat );
00716 TRY( LALSDestroyVector( stat->statusPtr, &phiTemp ), stat );
00717 TRY( LALSDestroyVector( stat->statusPtr, &phiTransfer ), stat );
00718 TRY( LALSDestroyVector( stat->statusPtr,
00719 &( polResponse.pPlus->data ) ), stat );
00720 TRY( LALSDestroyVector( stat->statusPtr,
00721 &( polResponse.pCross->data ) ), stat );
00722 LALFree( polResponse.pPlus );
00723 LALFree( polResponse.pCross );
00724 } ENDFAIL( stat );
00725 TRY( LALSDestroyVector( stat->statusPtr, &phiTemp ), stat );
00726 LALSCreateVector( stat->statusPtr, &aTransfer, nMax );
00727 BEGINFAIL( stat ) {
00728 TRY( LALDDestroyVector( stat->statusPtr, &delay ), stat );
00729 TRY( LALSDestroyVector( stat->statusPtr, &phiTransfer ), stat );
00730 TRY( LALSDestroyVector( stat->statusPtr,
00731 &( polResponse.pPlus->data ) ), stat );
00732 TRY( LALSDestroyVector( stat->statusPtr,
00733 &( polResponse.pCross->data ) ), stat );
00734 LALFree( polResp