void XLALSimInjectNinjaSignals( REAL4TimeSeries* chan, const char *ifo, REAL8 dynRange, SimInspiralTable* events ) { /* New REAL8, NINJA-2 code */ UINT4 j; SimInspiralTable *thisInj = NULL; REAL8TimeSeries *tempStrain = NULL; REAL8TimeSeries *tempChan = NULL; /* Make a REAL8 version of the channel data */ /* so we can call Jolien's new inject function */ tempChan = XLALCreateREAL8TimeSeries( chan->name, &(chan->epoch), chan->f0, chan->deltaT, &(chan->sampleUnits), chan->data->length); for ( j = 0 ; j < tempChan->data->length ; ++j ) { tempChan->data->data[j] = (REAL8) ( chan->data->data[j] ); } /* loop over injections */ for ( thisInj = events; thisInj; thisInj = thisInj->next ) { tempStrain = XLALNRInjectionStrain(ifo, thisInj); for ( j = 0 ; j < tempStrain->data->length ; ++j ) { tempStrain->data->data[j] *= dynRange; } XLALSimAddInjectionREAL8TimeSeries( tempChan, tempStrain, NULL); XLALDestroyREAL8TimeSeries(tempStrain); } /* loop over injections */ /* Back to REAL4 */ for ( j = 0 ; j < tempChan->data->length ; ++j ) { chan->data->data[j] = (REAL4) ( tempChan->data->data[j] ); } XLALDestroyREAL8TimeSeries(tempChan); }
/** * Main function for injecting numetrical relativity waveforms. * Takes as input a list of injections, and adds h(t) to a given * timeseries for a specified ifo and a dynamic range factor. */ void InjectNumRelWaveformsREAL8 (LALStatus *status, /**< pointer to LALStatus structure */ REAL8TimeSeries *chan, /**< [out] the output time series */ SimInspiralTable *injections, /**< [in] list of injections */ CHAR ifo[3], /**< [in] 2 char code for interferometer */ REAL8 freqLowCutoff, /**< [in] Lower cutoff frequency */ REAL8 snrLow, /**< [in] lower cutoff value of snr */ REAL8 snrHigh, /**< TO BE DOCUMENTED */ CHAR *fname) /**< [in] higher cutoff value of snr */ { SimInspiralTable *thisInj = NULL; REAL8 startFreq, startFreqHz, massTotal; REAL8 thisSNR; SimInspiralTable *simTableOut=NULL; SimInspiralTable *thisInjOut=NULL; INITSTATUS(status); ATTATCHSTATUSPTR (status); ASSERT( chan, status, INSPIRALH_ENULL, INSPIRALH_MSGENULL ); ASSERT( ifo, status, INSPIRALH_ENULL, INSPIRALH_MSGENULL ); /* loop over injections */ for ( thisInj = injections; thisInj; thisInj = thisInj->next ) { startFreq = start_freq_from_frame_url(thisInj->numrel_data); massTotal = (thisInj->mass1 + thisInj->mass2) * LAL_MTSUN_SI; startFreqHz = startFreq / ( LAL_TWOPI * massTotal); if (startFreqHz < freqLowCutoff) { REAL8TimeSeries *strain = NULL; strain = XLALNRInjectionStrain(ifo, thisInj); thisSNR = calculate_ligo_snr_from_strain_real8(strain, ifo); /* set channel name */ snprintf( chan->name, LALNameLength * sizeof( CHAR ), "%s:STRAIN", ifo ); if ((thisSNR < snrHigh) && (thisSNR > snrLow)) { /* simTableOut will be null only the first time */ if ( simTableOut == NULL) { simTableOut = (SimInspiralTable *)LALCalloc( 1, sizeof(SimInspiralTable) ); memcpy(simTableOut, thisInj, sizeof(*thisInj)); simTableOut->next = NULL; thisInjOut = simTableOut; } else { thisInjOut->next = (SimInspiralTable *)LALCalloc( 1, sizeof(SimInspiralTable) ); memcpy(thisInjOut->next, thisInj, sizeof(*thisInj)); thisInjOut->next->next = NULL; thisInjOut = thisInjOut->next; } XLALSimAddInjectionREAL8TimeSeries( chan, strain, NULL); } XLALDestroyREAL8TimeSeries (strain); } } /* loop over injectionsj */ /* write and free the output simInspiral table */ if ( simTableOut ) { LIGOLwXMLStream xmlfp; MetadataTable dummyTable; dummyTable.simInspiralTable = simTableOut; /* write the xml table of actual injections */ memset( &xmlfp, 0, sizeof(LIGOLwXMLStream) ); TRY( LALOpenLIGOLwXMLFile( status->statusPtr, &xmlfp, fname ), status ); TRY( LALBeginLIGOLwXMLTable( status->statusPtr, &xmlfp, sim_inspiral_table ), status ); TRY( LALWriteLIGOLwXMLTable( status->statusPtr, &xmlfp, dummyTable, sim_inspiral_table ), status ); TRY( LALEndLIGOLwXMLTable ( status->statusPtr, &xmlfp ), status ); TRY( LALCloseLIGOLwXMLFile ( status->statusPtr, &xmlfp ), status ); } while (simTableOut) { thisInjOut = simTableOut; simTableOut = simTableOut->next; LALFree(thisInjOut); } DETATCHSTATUSPTR(status); RETURN(status); }
/** * Main function for injecting numetrical relativity waveforms. * Takes as input a list of injections, and adds h(t) to a given * timeseries for a specified ifo and a dynamic range factor. * Updated/generalized version of InjectNumRelWaveforms that allows * arbitrary LIGO and Virgo PSDs and integration starting frequencies */ void InjectNumRelWaveformsUsingPSDREAL8(LALStatus *status, /**< pointer to LALStatus structure */ REAL8TimeSeries *chan, /**< [out] the output time series */ SimInspiralTable *injections, /**< [in] list of injections */ CHAR ifo[3], /**< [in] 2 char code for interferometer */ REAL8 freqLowCutoff, /**< [in] Lower cutoff frequency */ REAL8 snrLow, /**< [in] lower cutoff value of snr */ REAL8 snrHigh, /**< TO BE DOCUMENTED */ REAL8FrequencySeries *ligoPSD, /**< [in] PSD to use for LIGO SNRs. If NULL, use initial PSD */ REAL8 ligoSnrLowFreq, /**< [in] Frequency at which to start integration for LIGO SNRs */ REAL8FrequencySeries *virgoPSD, /**< [in] PSD to use for Virgo SNRs. If NULL, use initial PSD */ REAL8 virgoSnrLowFreq, /**< [in] Frequency at which to start integration for Virgo SNRs */ CHAR *fname) /**< [in] higher cutoff value of snr */ { SimInspiralTable *thisInj = NULL; REAL8 startFreq, startFreqHz, massTotal; REAL8 thisSNR; SimInspiralTable *simTableOut=NULL; SimInspiralTable *thisInjOut=NULL; INITSTATUS(status); ATTATCHSTATUSPTR (status); ASSERT( chan, status, INSPIRALH_ENULL, INSPIRALH_MSGENULL ); ASSERT( ifo, status, INSPIRALH_ENULL, INSPIRALH_MSGENULL ); /* loop over injections */ for ( thisInj = injections; thisInj; thisInj = thisInj->next ) { startFreq = start_freq_from_frame_url(thisInj->numrel_data); massTotal = (thisInj->mass1 + thisInj->mass2) * LAL_MTSUN_SI; startFreqHz = startFreq / ( LAL_TWOPI * massTotal); if (startFreqHz < freqLowCutoff) { REAL8TimeSeries *strain = NULL; strain = XLALNRInjectionStrain(ifo, thisInj); if (ifo[0] == 'V') thisSNR = calculate_snr_from_strain_and_psd_real8( strain, virgoPSD, virgoSnrLowFreq, ifo ); else thisSNR = calculate_snr_from_strain_and_psd_real8( strain, ligoPSD, ligoSnrLowFreq, ifo ); /* set channel name */ snprintf( chan->name, LALNameLength * sizeof( CHAR ), "%s:STRAIN", ifo ); printf("Injection at %d.%d in ifo %s has SNR %f\n", thisInj->geocent_end_time.gpsSeconds, thisInj->geocent_end_time.gpsNanoSeconds, ifo, thisSNR); if ((thisSNR < snrHigh) && (thisSNR > snrLow)) { /* simTableOut will be null only the first time */ if ( simTableOut == NULL) { simTableOut = (SimInspiralTable *)LALCalloc( 1, sizeof(SimInspiralTable) ); memcpy(simTableOut, thisInj, sizeof(*thisInj)); simTableOut->next = NULL; thisInjOut = simTableOut; } else { thisInjOut->next = (SimInspiralTable *)LALCalloc( 1, sizeof(SimInspiralTable) ); memcpy(thisInjOut->next, thisInj, sizeof(*thisInj)); thisInjOut->next->next = NULL; thisInjOut = thisInjOut->next; } XLALSimAddInjectionREAL8TimeSeries( chan, strain, NULL); } XLALDestroyREAL8TimeSeries (strain); } else { fprintf( stderr, "Skipping injection at %d because it turns on at %f Hz, " "but the low frequency cutoff is %f\n", thisInj->geocent_end_time.gpsSeconds, startFreqHz, freqLowCutoff); } } /* loop over injectionsj */ /* write and free the output simInspiral table */ if ( simTableOut ) { LIGOLwXMLStream xmlfp; MetadataTable dummyTable; dummyTable.simInspiralTable = simTableOut; /* write the xml table of actual injections */ if (fname) { memset( &xmlfp, 0, sizeof(LIGOLwXMLStream) ); TRY( LALOpenLIGOLwXMLFile( status->statusPtr, &xmlfp, fname ), status ); TRY( LALBeginLIGOLwXMLTable( status->statusPtr, &xmlfp, sim_inspiral_table ), status ); TRY( LALWriteLIGOLwXMLTable( status->statusPtr, &xmlfp, dummyTable, sim_inspiral_table ), status ); TRY( LALEndLIGOLwXMLTable ( status->statusPtr, &xmlfp ), status ); TRY( LALCloseLIGOLwXMLFile ( status->statusPtr, &xmlfp ), status ); } } while (simTableOut) { thisInjOut = simTableOut; simTableOut = simTableOut->next; LALFree(thisInjOut); } DETATCHSTATUSPTR(status); RETURN(status); }