int main(int argc, char *argv[]) { UserVariables_t XLAL_INIT_DECL(uvar); XLAL_CHECK ( InitUserVars(&uvar, argc, argv) == XLAL_SUCCESS, XLAL_EFUNC ); MultiLALDetector *detectors = NULL; XLAL_CHECK( (detectors = XLALMalloc(sizeof(MultiLALDetector))) != NULL, XLAL_ENOMEM ); detectors->length = uvar.IFO->length; for (UINT4 ii=0; ii<detectors->length; ii++) { if (strcmp("H1", uvar.IFO->data[ii])==0) { detectors->sites[ii] = lalCachedDetectors[LAL_LHO_4K_DETECTOR]; //H1 } else if (strcmp("L1",uvar.IFO->data[ii])==0) { detectors->sites[ii] = lalCachedDetectors[LAL_LLO_4K_DETECTOR]; //L1 } else if (strcmp("V1", uvar.IFO->data[ii])==0) { detectors->sites[ii] = lalCachedDetectors[LAL_VIRGO_DETECTOR]; //V1 } else if (strcmp("H2", uvar.IFO->data[ii])==0) { detectors->sites[ii] = lalCachedDetectors[LAL_LHO_2K_DETECTOR]; //H2 } else if (strcmp("H2r", uvar.IFO->data[ii])==0) { LALDetector H2 = lalCachedDetectors[LAL_LHO_2K_DETECTOR]; //H2 rotated H2.frDetector.xArmAzimuthRadians -= 0.25*LAL_PI; H2.frDetector.yArmAzimuthRadians -= 0.25*LAL_PI; memset(&(H2.frDetector.name), 0, sizeof(CHAR)*LALNameLength); snprintf(H2.frDetector.name, LALNameLength, "%s", "LHO_2k_rotatedPiOver4"); XLAL_CHECK( (XLALCreateDetector(&(detectors->sites[ii]), &(H2.frDetector), LALDETECTORTYPE_IFODIFF)) != NULL, XLAL_EFUNC ); } else { XLAL_ERROR(XLAL_EINVAL, "Not using valid interferometer! Expected 'H1', 'H2', 'H2r' (rotated H2), 'L1', or 'V1' not %s.\n", uvar.IFO->data[ii]); } } EphemerisData *edat = NULL; XLAL_CHECK( (edat = XLALInitBarycenter(uvar.ephemEarth, uvar.ephemSun)) != NULL, XLAL_EFUNC ); LIGOTimeGPS tStart; XLALGPSSetREAL8 ( &tStart, uvar.t0 ); XLAL_CHECK( xlalErrno == 0, XLAL_EFUNC, "XLALGPSSetREAL8 failed\n" ); MultiLIGOTimeGPSVector *multiTimestamps = NULL; XLAL_CHECK( (multiTimestamps = XLALMakeMultiTimestamps(tStart, uvar.Tobs, uvar.Tsft, uvar.SFToverlap, detectors->length)) != NULL, XLAL_EFUNC ); LIGOTimeGPS refTime = multiTimestamps->data[0]->data[0]; MultiDetectorStateSeries *multiStateSeries = NULL; XLAL_CHECK( (multiStateSeries = XLALGetMultiDetectorStates(multiTimestamps, detectors, edat, uvar.SFToverlap)) != NULL, XLAL_EFUNC ); gsl_rng *rng = NULL; XLAL_CHECK( (rng = gsl_rng_alloc(gsl_rng_mt19937)) != NULL, XLAL_EFUNC ); gsl_rng_set(rng, 0); FILE *OUTPUT; XLAL_CHECK( (OUTPUT = fopen(uvar.outfilename,"w")) != NULL, XLAL_EIO, "Output file %s could not be opened\n", uvar.outfilename ); for (INT4 n=0; n<uvar.skylocations; n++) { SkyPosition skypos; if (XLALUserVarWasSet(&(uvar.alpha)) && XLALUserVarWasSet(&(uvar.delta)) && n==0) { skypos.longitude = uvar.alpha; skypos.latitude = uvar.delta; skypos.system = COORDINATESYSTEM_EQUATORIAL; } else { skypos.longitude = LAL_TWOPI*gsl_rng_uniform(rng); skypos.latitude = LAL_PI*gsl_rng_uniform(rng) - LAL_PI_2; skypos.system = COORDINATESYSTEM_EQUATORIAL; } REAL8 cosi0, psi0; if (XLALUserVarWasSet(&(uvar.cosi)) && n==0) cosi0 = uvar.cosi; else cosi0 = 2.0*gsl_rng_uniform(rng) - 1.0; if (XLALUserVarWasSet(&(uvar.psi)) && n==0) psi0 = uvar.psi; else psi0 = LAL_PI*gsl_rng_uniform(rng); MultiAMCoeffs *multiAMcoefficients = NULL; XLAL_CHECK( (multiAMcoefficients = XLALComputeMultiAMCoeffs(multiStateSeries, NULL, skypos)) != NULL, XLAL_EFUNC ); MultiSSBtimes *multissb = NULL; XLAL_CHECK( (multissb = XLALGetMultiSSBtimes(multiStateSeries, skypos, refTime, SSBPREC_RELATIVISTICOPT)) != NULL, XLAL_EFUNC ); REAL8 frequency = 1000.0; REAL8 frequency0 = frequency + (gsl_rng_uniform(rng)-0.5)/uvar.Tsft; for (UINT4 ii=0; ii<multiAMcoefficients->data[0]->a->length; ii++) { REAL4 Fplus0 = multiAMcoefficients->data[0]->a->data[ii]*cos(2.0*psi0) + multiAMcoefficients->data[0]->b->data[ii]*sin(2.0*psi0); REAL4 Fcross0 = multiAMcoefficients->data[0]->b->data[ii]*cos(2.0*psi0) - multiAMcoefficients->data[0]->a->data[ii]*sin(2.0*psi0); REAL4 Fplus1 = multiAMcoefficients->data[1]->a->data[ii]*cos(2.0*psi0) + multiAMcoefficients->data[1]->b->data[ii]*sin(2.0*psi0); REAL4 Fcross1 = multiAMcoefficients->data[1]->b->data[ii]*cos(2.0*psi0) - multiAMcoefficients->data[1]->a->data[ii]*sin(2.0*psi0); COMPLEX16 RatioTerm0 = crect(0.5*Fplus1*(1.0+cosi0*cosi0), Fcross1*cosi0)/crect(0.5*Fplus0*(1.0+cosi0*cosi0), Fcross0*cosi0); //real det-sig ratio term REAL4 detPhaseArg = 0.0, detPhaseMag = 0.0; BOOLEAN loopbroken = 0; for (INT4 jj=0; jj<16 && !loopbroken; jj++) { REAL4 psi = 0.0625*jj*LAL_PI; Fplus0 = multiAMcoefficients->data[0]->a->data[ii]*cos(2.0*psi) + multiAMcoefficients->data[0]->b->data[ii]*sin(2.0*psi); Fcross0 = multiAMcoefficients->data[0]->b->data[ii]*cos(2.0*psi) - multiAMcoefficients->data[0]->a->data[ii]*sin(2.0*psi); Fplus1 = multiAMcoefficients->data[1]->a->data[ii]*cos(2.0*psi) + multiAMcoefficients->data[1]->b->data[ii]*sin(2.0*psi); Fcross1 = multiAMcoefficients->data[1]->b->data[ii]*cos(2.0*psi) - multiAMcoefficients->data[1]->a->data[ii]*sin(2.0*psi); for (INT4 kk=0; kk<21 && !loopbroken; kk++) { REAL4 cosi = 1.0 - 2.0*0.05*kk; if (!uvar.unrestrictedCosi) { if (cosi0<0.0) cosi = -0.05*kk; else cosi = 0.05*kk; } COMPLEX16 complexnumerator = crect(0.5*Fplus1*(1.0+cosi*cosi), Fcross1*cosi); COMPLEX16 complexdenominator = crect(0.5*Fplus0*(1.0+cosi*cosi) , Fcross0*cosi); if (cabs(complexdenominator)>1.0e-6) { COMPLEX16 complexval = complexnumerator/complexdenominator; detPhaseMag += fmin(cabs(complexval), 10.0); detPhaseArg += gsl_sf_angle_restrict_pos(carg(complexval)); } else { loopbroken = 1; detPhaseMag = 0.0; detPhaseArg = 0.0; } } } detPhaseMag /= 336.0; detPhaseArg /= 336.0; COMPLEX16 RatioTerm = cpolar(detPhaseMag, detPhaseArg); //Bin of interest REAL8 signalFrequencyBin = round(multissb->data[0]->Tdot->data[ii]*frequency0*uvar.Tsft) - frequency*uvar.Tsft; //estimated nearest freq in ref IFO REAL8 timediff0 = multissb->data[0]->DeltaT->data[ii] - 0.5*uvar.Tsft*multissb->data[0]->Tdot->data[ii]; REAL8 timediff1 = multissb->data[1]->DeltaT->data[ii] - 0.5*uvar.Tsft*multissb->data[1]->Tdot->data[ii]; REAL8 tau = timediff1 - timediff0; REAL8 freqshift0 = -LAL_TWOPI*tau*frequency0; //real freq shift REAL8 freqshift = -LAL_TWOPI*tau*(round(multissb->data[0]->Tdot->data[ii]*frequency0*uvar.Tsft)/uvar.Tsft); //estimated freq shift COMPLEX16 phaseshift0 = cpolar(1.0, freqshift0); COMPLEX16 phaseshift = cpolar(1.0, freqshift); REAL8 delta0_0 = (multissb->data[0]->Tdot->data[ii]*frequency0-frequency)*uvar.Tsft - signalFrequencyBin; REAL8 delta1_0 = (multissb->data[1]->Tdot->data[ii]*frequency0-frequency)*uvar.Tsft - signalFrequencyBin; REAL8 realSigBinDiff = round(delta0_0) - round(delta1_0); delta1_0 += realSigBinDiff; REAL8 delta0 = round(multissb->data[0]->Tdot->data[ii]*frequency0*uvar.Tsft)*(multissb->data[0]->Tdot->data[ii] - 1.0); REAL8 delta1 = round(multissb->data[0]->Tdot->data[ii]*frequency0*uvar.Tsft)*(multissb->data[1]->Tdot->data[ii] - 1.0); REAL8 estSigBinDiff = round(delta0) - round(delta1); delta1 += estSigBinDiff; COMPLEX16 dirichlet0; if (!uvar.rectWindow) { if (fabsf((REAL4)delta1_0)<(REAL4)1.0e-6) { if (fabsf((REAL4)delta0_0)<(REAL4)1.0e-6) dirichlet0 = crect(1.0, 0.0); else if (fabsf((REAL4)(delta0_0*delta0_0-1.0))<(REAL4)1.0e-6) dirichlet0 = crect(-2.0, 0.0); else if (fabsf((REAL4)(delta0_0-roundf(delta0_0)))<(REAL4)1.0e-6) { dirichlet0 = crect(0.0, 0.0); continue; } else dirichlet0 = -LAL_PI*crectf(cos(LAL_PI*delta0_0), -sin(LAL_PI*delta0_0))*delta0_0*(delta0_0*delta0_0 - 1.0)/sin(LAL_PI*delta0_0); } else if (fabsf((REAL4)(delta1_0*delta1_0-1.0))<(REAL4)1.0e-6) { if (fabsf((REAL4)delta0_0)<(REAL4)1.0e-6) dirichlet0 = crect(-0.5, 0.0); else if (fabsf((REAL4)(delta0_0*delta0_0-1.0))<(REAL4)1.0e-6) dirichlet0 = crect(1.0, 0.0); else if (fabsf((REAL4)(delta0_0-roundf(delta0_0)))<(REAL4)1.0e-6) { dirichlet0 = crect(0.0, 0.0); continue; } else dirichlet0 = -LAL_PI_2*crectf(-cos(LAL_PI*delta0_0), sin(LAL_PI*delta0_0))*delta0_0*(delta0_0*delta0_0 - 1.0)/sin(LAL_PI*delta0_0); } else if (fabsf((REAL4)delta0_0)<(REAL4)1.0e-6) dirichlet0 = -LAL_1_PI*crectf(cos(LAL_PI*delta1_0), sin(LAL_PI*delta1_0))*sin(LAL_PI*delta1_0)/(delta1_0*(delta1_0*delta1_0-1.0)); else if (fabsf((REAL4)(delta0_0*delta0_0-1.0))<(REAL4)1.0e-6) dirichlet0 = LAL_2_PI*crectf(cos(LAL_PI*delta1_0), sin(LAL_PI*delta1_0))*sin(LAL_PI*delta1_0)/(delta1_0*(delta1_0*delta1_0-1.0)); else if (fabsf((REAL4)(delta0_0-roundf(delta0_0)))<(REAL4)1.0e-6) { dirichlet0 = crect(0.0, 0.0); continue; } else dirichlet0 = sin(LAL_PI*delta1_0)/sin(LAL_PI*delta0_0)*(delta0_0*(delta0_0*delta0_0-1.0))/(delta1_0*(delta1_0*delta1_0-1.0))*cpolarf(1.0,LAL_PI*(delta1_0-delta0_0)); } else { if (fabsf((REAL4)delta1_0)<(REAL4)1.0e-6) { if (fabsf((REAL4)delta0_0)<(REAL4)1.0e-6) dirichlet0 = crect(1.0, 0.0); else if (fabsf((REAL4)(delta0_0-roundf(delta0_0)))<(REAL4)1.0e-6) { dirichlet0 = crect(0.0, 0.0); continue; } else dirichlet0 = conj(1.0/((cpolar(1.0,LAL_TWOPI*delta0_0)-1.0)/crect(0.0,LAL_TWOPI*delta0_0))); } else if (fabsf((REAL4)delta0_0)<(REAL4)1.0e-6) dirichlet0 = conj((cpolar(1.0,LAL_TWOPI*delta1_0)-1.0)/crect(0.0,LAL_TWOPI*delta1_0)); else if (fabsf((REAL4)(delta0_0-roundf(delta0_0)))<(REAL4)1.0e-6) { dirichlet0 = crect(0.0, 0.0); continue; } else dirichlet0 = conj(((cpolar(1.0,LAL_TWOPI*delta1_0)-1.0)/crect(0.0,LAL_TWOPI*delta1_0))/((cpolar(1.0,LAL_TWOPI*delta0_0)-1.0)/crect(0.0,LAL_TWOPI*delta0_0))); } COMPLEX16 dirichlet; if (!uvar.rectWindow) { if (fabsf((REAL4)delta1)<(REAL4)1.0e-6) { if (fabsf((REAL4)delta0)<(REAL4)1.0e-6) dirichlet = crect(1.0, 0.0); else if (fabsf((REAL4)(delta0*delta0-1.0))<(REAL4)1.0e-6) dirichlet = crect(-2.0, 0.0); else if (fabsf((REAL4)(delta0-roundf(delta0)))<(REAL4)1.0e-6) dirichlet = crect(0.0, 0.0); else dirichlet = -LAL_PI*crectf(cos(LAL_PI*delta0), -sin(LAL_PI*delta0))*delta0*(delta0*delta0 - 1.0)/sin(LAL_PI*delta0); } else if (fabsf((REAL4)(delta1*delta1-1.0))<(REAL4)1.0e-6) { if (fabsf((REAL4)delta0)<(REAL4)1.0e-6) dirichlet = crect(-0.5, 0.0); else if (fabsf((REAL4)(delta0*delta0-1.0))<(REAL4)1.0e-6) dirichlet = crect(1.0, 0.0); else if (fabsf((REAL4)(delta0-roundf(delta0)))<(REAL4)1.0e-6) dirichlet = crect(0.0, 0.0); else dirichlet = -LAL_PI_2*crectf(-cos(LAL_PI*delta0), sin(LAL_PI*delta0))*delta0*(delta0*delta0 - 1.0)/sin(LAL_PI*delta0); } else if (fabsf((REAL4)delta0)<(REAL4)1.0e-6) dirichlet = -LAL_1_PI*crectf(cos(LAL_PI*delta1), sin(LAL_PI*delta1))*sin(LAL_PI*delta1)/(delta1*(delta1*delta1-1.0)); else if (fabsf((REAL4)(delta0*delta0-1.0))<(REAL4)1.0e-6) dirichlet = LAL_2_PI*crectf(cos(LAL_PI*delta1), sin(LAL_PI*delta1))*sin(LAL_PI*delta1)/(delta1*(delta1*delta1-1.0)); else if (fabsf((REAL4)(delta0-roundf(delta0)))<(REAL4)1.0e-6) dirichlet = crect(0.0, 0.0); else dirichlet = sin(LAL_PI*delta1)/sin(LAL_PI*delta0)*(delta0*(delta0*delta0-1.0))/(delta1*(delta1*delta1-1.0))*cpolarf(1.0,LAL_PI*(delta1-delta0)); } else { if (fabsf((REAL4)delta1)<(REAL4)1.0e-6) { if (fabsf((REAL4)delta0)<(REAL4)1.0e-6) dirichlet = crect(1.0, 0.0); else if (fabsf((REAL4)(delta0-roundf(delta0)))<(REAL4)1.0e-6) dirichlet = crect(0.0, 0.0); else dirichlet = conj(1.0/((cpolar(1.0,LAL_TWOPI*delta0)-1.0)/crect(0.0,LAL_TWOPI*delta0))); } else if (fabsf((REAL4)delta0)<(REAL4)1.0e-6) dirichlet = conj((cpolar(1.0,LAL_TWOPI*delta1)-1.0)/crect(0.0,LAL_TWOPI*delta1)); else if (fabsf((REAL4)(delta0-roundf(delta0)))<(REAL4)1.0e-6) dirichlet = crect(0.0, 0.0); else dirichlet = conj(((cpolar(1.0,LAL_TWOPI*delta1)-1.0)/crect(0.0,LAL_TWOPI*delta1))/((cpolar(1.0,LAL_TWOPI*delta0)-1.0)/crect(0.0,LAL_TWOPI*delta0))); } dirichlet = cpolar(1.0, carg(dirichlet)); if (fabs(floor(delta0)-floor(delta1))>=1.0) dirichlet *= -1.0; COMPLEX16 realRatio = RatioTerm0*phaseshift0*conj(dirichlet0); COMPLEX16 estRatio = RatioTerm*phaseshift*conj(dirichlet); fprintf(OUTPUT, "%g %g %g %g\n", cabs(realRatio), gsl_sf_angle_restrict_pos(carg(realRatio)), cabs(estRatio), gsl_sf_angle_restrict_pos(carg(estRatio))); } XLALDestroyMultiAMCoeffs(multiAMcoefficients); XLALDestroyMultiSSBtimes(multissb); } fclose(OUTPUT); gsl_rng_free(rng); XLALDestroyMultiDetectorStateSeries(multiStateSeries); XLALDestroyMultiTimestamps(multiTimestamps); XLALDestroyEphemerisData(edat); XLALFree(detectors); XLALDestroyUserVars(); }
/** * Chooses between different approximants when requesting a waveform to be generated * Returns the waveform in the frequency domain. * The parameters passed must be in SI units. * * This version allows caching of waveforms. The most recently generated * waveform and its parameters are stored. If the next call requests a waveform * that can be obtained by a simple transformation, then it is done. * This bypasses the waveform generation and speeds up the code. */ int XLALSimInspiralChooseFDWaveformFromCache( COMPLEX16FrequencySeries **hptilde, /**< +-polarization waveform */ COMPLEX16FrequencySeries **hctilde, /**< x-polarization waveform */ REAL8 phiRef, /**< reference orbital phase (rad) */ REAL8 deltaF, /**< sampling interval (Hz) */ REAL8 m1, /**< mass of companion 1 (kg) */ REAL8 m2, /**< mass of companion 2 (kg) */ REAL8 S1x, /**< x-component of the dimensionless spin of object 1 */ REAL8 S1y, /**< y-component of the dimensionless spin of object 1 */ REAL8 S1z, /**< z-component of the dimensionless spin of object 1 */ REAL8 S2x, /**< x-component of the dimensionless spin of object 2 */ REAL8 S2y, /**< y-component of the dimensionless spin of object 2 */ REAL8 S2z, /**< z-component of the dimensionless spin of object 2 */ REAL8 f_min, /**< starting GW frequency (Hz) */ REAL8 f_max, /**< ending GW frequency (Hz) */ REAL8 f_ref, /**< Reference GW frequency (Hz) */ REAL8 r, /**< distance of source (m) */ REAL8 i, /**< inclination of source (rad) */ LALDict *LALpars, /**< LALDictionary containing non-mandatory variables/flags */ Approximant approximant, /**< post-Newtonian approximant to use for waveform production */ LALSimInspiralWaveformCache *cache, /**< waveform cache structure */ REAL8Sequence *frequencies /**< sequence of frequencies for which the waveform will be computed. Pass in NULL (or None in python) for standard f_min to f_max sequence. */ ) { int status; size_t j; REAL8 dist_ratio, incl_ratio_plus, incl_ratio_cross, phase_diff; COMPLEX16 exp_dphi; CacheVariableDiffersBitmask changedParams; // If nonGRparams are not NULL, don't even try to cache. if ( !XLALSimInspiralWaveformParamsNonGRAreDefault(LALpars) || (!cache) ) { if (frequencies != NULL) return XLALSimInspiralChooseFDWaveformSequence(hptilde, hctilde, phiRef, m1, m2, S1x, S1y, S1z, S2x, S2y, S2z, f_ref, r, i, LALpars, approximant,frequencies); else return XLALSimInspiralChooseFDWaveform(hptilde, hctilde, m1, m2, S1x, S1y, S1z, S2x, S2y, S2z, r, i, phiRef, 0., 0., 0., deltaF, f_min, f_max, f_ref, LALpars, approximant); } // Check which parameters have changed changedParams = CacheArgsDifferenceBitmask(cache, phiRef, deltaF, m1, m2, S1x, S1y, S1z, S2x, S2y, S2z, f_min, f_ref, f_max, r, i, LALpars, approximant, frequencies); // No parameters have changed! Copy the cached polarizations if( changedParams == NO_DIFFERENCE ) { *hptilde = XLALCutCOMPLEX16FrequencySeries(cache->hptilde, 0, cache->hptilde->data->length); if (*hptilde == NULL) return XLAL_ENOMEM; *hctilde = XLALCutCOMPLEX16FrequencySeries(cache->hctilde, 0, cache->hctilde->data->length); if (*hctilde == NULL) { XLALDestroyCOMPLEX16FrequencySeries(*hptilde); *hptilde = NULL; return XLAL_ENOMEM; } return XLAL_SUCCESS; } // Intrinsic parameters have changed. We must generate a new waveform if( (changedParams & INTRINSIC) != 0 ) { if ( frequencies != NULL ){ status = XLALSimInspiralChooseFDWaveformSequence(hptilde, hctilde, phiRef, m1, m2, S1x, S1y, S1z, S2x, S2y, S2z, f_ref, r, i, LALpars, approximant, frequencies); } else { status = XLALSimInspiralChooseFDWaveform(hptilde, hctilde, m1, m2, S1x, S1y, S1z, S2x, S2y, S2z, r, i, phiRef, 0., 0., 0., deltaF, f_min, f_max, f_ref, LALpars, approximant); } if (status == XLAL_FAILURE) return status; return StoreFDHCache(cache, *hptilde, *hctilde, phiRef, deltaF, m1, m2, S1x, S1y, S1z, S2x, S2y, S2z, f_min, f_ref, f_max, r, i, LALpars, approximant, frequencies); } // case 1: Non-precessing, 2nd harmonic only if( approximant == TaylorF2 || approximant == TaylorF2RedSpin || approximant == TaylorF2RedSpinTidal || approximant == IMRPhenomA || approximant == IMRPhenomB || approximant == IMRPhenomC ) { // If polarizations are not cached we must generate a fresh waveform // FIXME: Will need to check hlms and/or dynamical variables as well if( cache->hptilde == NULL || cache->hctilde == NULL) { if ( frequencies != NULL ){ status = XLALSimInspiralChooseFDWaveformSequence(hptilde, hctilde, phiRef, m1, m2, S1x, S1y, S1z, S2x, S2y, S2z, f_ref, r, i, LALpars, approximant,frequencies); } else { status = XLALSimInspiralChooseFDWaveform(hptilde, hctilde, m1, m2, S1x, S1y, S1z, S2x, S2y, S2z, r, i, phiRef, 0., 0., 0., deltaF, f_min, f_max, f_ref, LALpars, approximant); } if (status == XLAL_FAILURE) return status; return StoreFDHCache(cache, *hptilde, *hctilde, phiRef, deltaF, m1, m2, S1x, S1y, S1z, S2x, S2y, S2z, f_min, f_ref, f_max, r, i, LALpars, approximant, frequencies); } // Set transformation coefficients for identity transformation. // We'll adjust them depending on which extrinsic parameters changed. dist_ratio = incl_ratio_plus = incl_ratio_cross = 1.; phase_diff = 0.; exp_dphi = 1.; if( changedParams & PHI_REF ) { // Only 2nd harmonic present, so {h+,hx} \propto e^(2 i phiRef) phase_diff = 2.*(phiRef - cache->phiRef); exp_dphi = cpolar(1., phase_diff); } if( changedParams & INCLINATION) { // Rescale h+, hx by ratio of new/old inclination dependence incl_ratio_plus = (1.0 + cos(i)*cos(i)) / (1.0 + cos(cache->i)*cos(cache->i)); incl_ratio_cross = cos(i) / cos(cache->i); } if( changedParams & DISTANCE ) { // Rescale h+, hx by ratio of (1/new_dist)/(1/old_dist) = old/new dist_ratio = cache->r / r; } // Create the output polarizations *hptilde = XLALCreateCOMPLEX16FrequencySeries(cache->hptilde->name, &(cache->hptilde->epoch), cache->hptilde->f0, cache->hptilde->deltaF, &(cache->hptilde->sampleUnits), cache->hptilde->data->length); if (*hptilde == NULL) return XLAL_ENOMEM; *hctilde = XLALCreateCOMPLEX16FrequencySeries(cache->hctilde->name, &(cache->hctilde->epoch), cache->hctilde->f0, cache->hctilde->deltaF, &(cache->hctilde->sampleUnits), cache->hctilde->data->length); if (*hctilde == NULL) { XLALDestroyCOMPLEX16FrequencySeries(*hptilde); *hptilde = NULL; return XLAL_ENOMEM; } // Get new polarizations by transforming the old incl_ratio_plus *= dist_ratio; incl_ratio_cross *= dist_ratio; for (j = 0; j < cache->hptilde->data->length; j++) { (*hptilde)->data->data[j] = exp_dphi * incl_ratio_plus * cache->hptilde->data->data[j]; (*hctilde)->data->data[j] = exp_dphi * incl_ratio_cross * cache->hctilde->data->data[j]; } return XLAL_SUCCESS; } // case 2: Precessing /*else if( approximant == SpinTaylorF2 ) { }*/ // Catch-all. Unsure what to do, don't try to cache. // Basically, you requested a waveform type which is not setup for caching // b/c of lack of interest or it's unclear what/how to cache for that model else { if ( frequencies != NULL ){ return XLALSimInspiralChooseFDWaveformSequence(hptilde, hctilde, phiRef, m1, m2, S1x, S1y, S1z, S2x, S2y, S2z, f_ref, r, i, LALpars, approximant,frequencies); } else { return XLALSimInspiralChooseFDWaveform(hptilde, hctilde, m1, m2, S1x, S1y, S1z, S2x, S2y, S2z, r, i, phiRef, 0., 0., 0., deltaF, f_min, f_max, f_ref, NULL, approximant); } } }
int main(int argc, char *argv[]) { UserVariables_t XLAL_INIT_DECL(uvar); XLAL_CHECK ( InitUserVars(&uvar, argc, argv) == XLAL_SUCCESS, XLAL_EFUNC ); MultiLALDetector *detectors = NULL; XLAL_CHECK( (detectors = XLALMalloc(sizeof(MultiLALDetector))) != NULL, XLAL_ENOMEM ); detectors->length = uvar.IFO->length; for (UINT4 ii=0; ii<detectors->length; ii++) { if (strcmp("H1", uvar.IFO->data[ii])==0) { detectors->sites[ii] = lalCachedDetectors[LAL_LHO_4K_DETECTOR]; //H1 } else if (strcmp("L1",uvar.IFO->data[ii])==0) { detectors->sites[ii] = lalCachedDetectors[LAL_LLO_4K_DETECTOR]; //L1 } else if (strcmp("V1", uvar.IFO->data[ii])==0) { detectors->sites[ii] = lalCachedDetectors[LAL_VIRGO_DETECTOR]; //V1 } else if (strcmp("H2", uvar.IFO->data[ii])==0) { detectors->sites[ii] = lalCachedDetectors[LAL_LHO_2K_DETECTOR]; //H2 } else if (strcmp("H2r", uvar.IFO->data[ii])==0) { LALDetector H2 = lalCachedDetectors[LAL_LHO_2K_DETECTOR]; //H2 rotated H2.frDetector.xArmAzimuthRadians -= 0.25*LAL_PI; H2.frDetector.yArmAzimuthRadians -= 0.25*LAL_PI; memset(&(H2.frDetector.name), 0, sizeof(CHAR)*LALNameLength); snprintf(H2.frDetector.name, LALNameLength, "%s", "LHO_2k_rotatedPiOver4"); XLAL_CHECK( (XLALCreateDetector(&(detectors->sites[ii]), &(H2.frDetector), LALDETECTORTYPE_IFODIFF)) != NULL, XLAL_EFUNC ); } else { XLAL_ERROR(XLAL_EINVAL, "Not using valid interferometer! Expected 'H1', 'H2', 'H2r' (rotated H2), 'L1', or 'V1' not %s.\n", uvar.IFO->data[ii]); } } EphemerisData *edat = NULL; XLAL_CHECK( (edat = XLALInitBarycenter(uvar.ephemEarth, uvar.ephemSun)) != NULL, XLAL_EFUNC ); LIGOTimeGPS tStart; XLALGPSSetREAL8 ( &tStart, uvar.t0 ); XLAL_CHECK( xlalErrno == 0, XLAL_EFUNC, "XLALGPSSetREAL8 failed\n" ); MultiLIGOTimeGPSVector *multiTimestamps = NULL; XLAL_CHECK( (multiTimestamps = XLALMakeMultiTimestamps(tStart, uvar.Tobs, uvar.Tsft, uvar.SFToverlap, detectors->length)) != NULL, XLAL_EFUNC ); LIGOTimeGPS refTime = multiTimestamps->data[0]->data[0]; MultiDetectorStateSeries *multiStateSeries = NULL; XLAL_CHECK( (multiStateSeries = XLALGetMultiDetectorStates(multiTimestamps, detectors, edat, uvar.SFToverlap)) != NULL, XLAL_EFUNC ); gsl_rng *rng = NULL; XLAL_CHECK( (rng = gsl_rng_alloc(gsl_rng_mt19937)) != NULL, XLAL_EFUNC ); gsl_rng_set(rng, 0); FILE *OUTPUT; XLAL_CHECK( (OUTPUT = fopen(uvar.outfilename,"w")) != NULL, XLAL_EIO, "Output file %s could not be opened\n", uvar.outfilename ); for (INT4 n=0; n<uvar.skylocations; n++) { SkyPosition skypos; if (XLALUserVarWasSet(&(uvar.alpha)) && XLALUserVarWasSet(&(uvar.delta)) && n==0) { skypos.longitude = uvar.alpha; skypos.latitude = uvar.delta; skypos.system = COORDINATESYSTEM_EQUATORIAL; } else { skypos.longitude = LAL_TWOPI*gsl_rng_uniform(rng); skypos.latitude = LAL_PI*gsl_rng_uniform(rng) - LAL_PI_2; skypos.system = COORDINATESYSTEM_EQUATORIAL; } REAL8 cosi0, psi0; if (XLALUserVarWasSet(&(uvar.cosi)) && n==0) cosi0 = uvar.cosi; else cosi0 = 2.0*gsl_rng_uniform(rng) - 1.0; if (XLALUserVarWasSet(&(uvar.psi)) && n==0) psi0 = uvar.psi; else psi0 = LAL_PI*gsl_rng_uniform(rng); MultiAMCoeffs *multiAMcoefficients = NULL; XLAL_CHECK( (multiAMcoefficients = XLALComputeMultiAMCoeffs(multiStateSeries, NULL, skypos)) != NULL, XLAL_EFUNC ); MultiSSBtimes *multissb = NULL; XLAL_CHECK( (multissb = XLALGetMultiSSBtimes(multiStateSeries, skypos, refTime, SSBPREC_RELATIVISTICOPT)) != NULL, XLAL_EFUNC ); REAL8 frequency0 = 1000.0 + (gsl_rng_uniform(rng)-0.5)/uvar.Tsft; REAL8 frequency = 1000.0; for (UINT4 ii=0; ii<multiAMcoefficients->data[0]->a->length; ii++) { REAL4 Fplus0 = multiAMcoefficients->data[0]->a->data[ii]*cos(2.0*psi0) + multiAMcoefficients->data[0]->b->data[ii]*sin(2.0*psi0); REAL4 Fcross0 = multiAMcoefficients->data[0]->b->data[ii]*cos(2.0*psi0) - multiAMcoefficients->data[0]->a->data[ii]*sin(2.0*psi0); REAL4 Fplus1 = multiAMcoefficients->data[1]->a->data[ii]*cos(2.0*psi0) + multiAMcoefficients->data[1]->b->data[ii]*sin(2.0*psi0); REAL4 Fcross1 = multiAMcoefficients->data[1]->b->data[ii]*cos(2.0*psi0) - multiAMcoefficients->data[1]->a->data[ii]*sin(2.0*psi0); COMPLEX16 RatioTerm0 = crect(0.5*Fplus1*(1.0+cosi0*cosi0), Fcross1*cosi0)/crect(0.5*Fplus0*(1.0+cosi0*cosi0), Fcross0*cosi0); REAL4 detPhaseArg = 0.0, detPhaseMag = 0.0; BOOLEAN loopbroken = 0; for (INT4 jj=0; jj<50 && !loopbroken; jj++) { REAL4 psi = 0.02*jj*LAL_PI; Fplus0 = multiAMcoefficients->data[0]->a->data[ii]*cos(2.0*psi) + multiAMcoefficients->data[0]->b->data[ii]*sin(2.0*psi); Fcross0 = multiAMcoefficients->data[0]->b->data[ii]*cos(2.0*psi) - multiAMcoefficients->data[0]->a->data[ii]*sin(2.0*psi); Fplus1 = multiAMcoefficients->data[1]->a->data[ii]*cos(2.0*psi) + multiAMcoefficients->data[1]->b->data[ii]*sin(2.0*psi); Fcross1 = multiAMcoefficients->data[1]->b->data[ii]*cos(2.0*psi) - multiAMcoefficients->data[1]->a->data[ii]*sin(2.0*psi); for (INT4 kk=0; kk<51 && !loopbroken; kk++) { //REAL4 cosi = 1.0 - 2.0*0.02*kk; REAL4 cosi; if (cosi0<0.0) cosi = -0.02*kk; else cosi = 0.02*kk; COMPLEX16 complexnumerator = crect(0.5*Fplus1*(1.0+cosi*cosi), Fcross1*cosi); COMPLEX16 complexdenominator = crect(0.5*Fplus0*(1.0+cosi*cosi) , Fcross0*cosi); if (cabs(complexdenominator)>1.0e-7) { COMPLEX16 complexval = complexnumerator/complexdenominator; detPhaseMag += fmin(cabs(complexval), 10.0); detPhaseArg += gsl_sf_angle_restrict_pos(carg(complexval)); } else { loopbroken = 1; detPhaseMag = 0.0; detPhaseArg = 0.0; } } } detPhaseMag /= 2550.0; detPhaseArg /= 2550.0; REAL8 timediff0 = multissb->data[0]->DeltaT->data[ii] - 0.5*uvar.Tsft*multissb->data[0]->Tdot->data[ii]; REAL8 timediff1 = multissb->data[1]->DeltaT->data[ii] - 0.5*uvar.Tsft*multissb->data[1]->Tdot->data[ii]; REAL8 tau = timediff1 - timediff0; REAL8 freqshift0 = -LAL_TWOPI*tau*frequency0; REAL8 freqshift = -LAL_TWOPI*tau*frequency; REAL8 nearestFrequency = round(multissb->data[0]->Tdot->data[ii]*frequency*uvar.Tsft)/uvar.Tsft; COMPLEX16 dirichlet0 = conj(DirichletKernelLargeNHann((multissb->data[1]->Tdot->data[ii]*frequency0-nearestFrequency)*uvar.Tsft)/DirichletKernelLargeNHann((multissb->data[0]->Tdot->data[ii]*frequency0-nearestFrequency)*uvar.Tsft)); COMPLEX16 dirichlet = conj(DirichletKernelLargeNHann((multissb->data[1]->Tdot->data[ii]*frequency-nearestFrequency)*uvar.Tsft)/DirichletKernelLargeNHann((multissb->data[0]->Tdot->data[ii]*frequency-nearestFrequency)*uvar.Tsft)); COMPLEX16 signal0 = 0.5*crect(0.5*Fplus0*(1.0+cosi0*cosi0), Fcross0*cosi0)*cpolar(1.0, LAL_TWOPI*frequency0*0.5*uvar.Tsft+LAL_TWOPI*frequency0*(multissb->data[0]->DeltaT->data[ii]+multissb->data[0]->Tdot->data[ii]*0.5*uvar.Tsft))*uvar.Tsft*DirichletKernelLargeNHann((multissb->data[0]->Tdot->data[ii]*frequency0-nearestFrequency)*uvar.Tsft); COMPLEX16 signal1 = 0.5*crect(0.5*Fplus1*(1.0+cosi0*cosi0), Fcross1*cosi0)*cpolar(1.0, LAL_TWOPI*frequency0*0.5*uvar.Tsft+LAL_TWOPI*frequency0*(multissb->data[1]->DeltaT->data[ii]+multissb->data[1]->Tdot->data[ii]*0.5*uvar.Tsft))*uvar.Tsft*DirichletKernelLargeNHann((multissb->data[1]->Tdot->data[ii]*frequency0-nearestFrequency)*uvar.Tsft); fprintf(OUTPUT, "%g %g %g %g %g %g %g %g %g %g %g %g %g %g\n", cabs(signal0), gsl_sf_angle_restrict_pos(carg(signal0)), cabs(signal1), gsl_sf_angle_restrict_pos(carg(signal1)), cabs(RatioTerm0), gsl_sf_angle_restrict_pos(carg(RatioTerm0)), detPhaseMag, detPhaseArg, freqshift0, freqshift, cabs(dirichlet0), gsl_sf_angle_restrict_pos(carg(dirichlet0)), cabs(dirichlet), gsl_sf_angle_restrict_pos(carg(dirichlet))); //fprintf(OUTPUT, "%g %g %g %g\n", cabs(signal0), gsl_sf_angle_restrict_pos(carg(signal0)), cabs(signal1), gsl_sf_angle_restrict_pos(carg(signal1))); } XLALDestroyMultiAMCoeffs(multiAMcoefficients); XLALDestroyMultiSSBtimes(multissb); } fclose(OUTPUT); gsl_rng_free(rng); XLALDestroyMultiDetectorStateSeries(multiStateSeries); XLALDestroyMultiTimestamps(multiTimestamps); XLALDestroyEphemerisData(edat); XLALFree(detectors); XLALDestroyUserVars(); }