REAL8TimeSeries * XLALNRInjectionStrain(const char *ifo, SimInspiralTable *inj) { REAL8TimeSeries *hplus = NULL; REAL8TimeSeries *hcross = NULL; REAL8TimeSeries *strain = NULL; REAL8 deltaT = 1./16384.; InterferometerNumber ifoNumber = LAL_UNKNOWN_IFO; LALDetector det; /* look up detector */ memset( &det, 0, sizeof(LALDetector) ); ifoNumber = XLALIFONumber( ifo ); XLALReturnDetector( &det, ifoNumber ); /* generate plus and cross polarizations */ XLALNRInjectionFromSimInspiral(&hplus, &hcross, inj, deltaT); /* Use Jolien's method to place on the sky */ strain = XLALSimDetectorStrainREAL8TimeSeries(hplus, hcross, inj->longitude, inj->latitude, inj->polarization, &det); XLALDestroyREAL8TimeSeries (hplus); XLALDestroyREAL8TimeSeries (hcross); return strain; }
/** * Wrapper to iterate over the entries in a sim_burst linked list and * inject them into a time series. Passing NULL for the response disables * it (input time series is strain). */ int XLALBurstInjectSignals( REAL8TimeSeries *series, const SimBurst *sim_burst, const TimeSlide *time_slide_table_head, const COMPLEX16FrequencySeries *response ) { /* to be deduced from the time series' channel name */ const LALDetector *detector; /* FIXME: fix the const entanglement so as to get rid of this */ LALDetector detector_copy; /* + and x time series for injection waveform */ REAL8TimeSeries *hplus = NULL; REAL8TimeSeries *hcross = NULL; /* injection time series as added to detector's */ REAL8TimeSeries *h; /* skip injections whose geocentre times are more than this many * seconds outside of the target time series */ const double injection_window = 100.0; /* turn the first two characters of the channel name into a * detector */ detector = XLALDetectorPrefixToLALDetector(series->name); if(!detector) XLAL_ERROR(XLAL_EFUNC); XLALPrintInfo("%s(): channel name is '%s', instrument appears to be '%s'\n", __func__, series->name, detector->frDetector.prefix); detector_copy = *detector; /* iterate over injections */ for(; sim_burst; sim_burst = sim_burst->next) { LIGOTimeGPS time_geocent_gps; const TimeSlide *time_slide_row; /* determine the offset to be applied to this injection */ time_slide_row = XLALTimeSlideConstGetByIDAndInstrument(time_slide_table_head, sim_burst->time_slide_id, detector->frDetector.prefix); if(!time_slide_row) { XLALPrintError("%s(): cannot find time shift offset for injection 'sim_burst:simulation_id:%ld'. need 'time_slide:time_slide_id:%ld' for instrument '%s'", __func__, sim_burst->simulation_id, sim_burst->time_slide_id, detector->frDetector.prefix); XLAL_ERROR(XLAL_EINVAL); } /* skip injections whose "times" are too far outside of the * target time series */ time_geocent_gps = sim_burst->time_geocent_gps; XLALGPSAdd(&time_geocent_gps, -time_slide_row->offset); if(XLALGPSDiff(&series->epoch, &time_geocent_gps) > injection_window || XLALGPSDiff(&time_geocent_gps, &series->epoch) > (series->data->length * series->deltaT + injection_window)) continue; XLALPrintInfo("%s(): injection 'sim_burst:simulation_id:%ld' in '%s' at %d.%09u s (GPS) will be shifted by %.16g s to %d.%09u s (GPS)\n", __func__, sim_burst->simulation_id, series->name, sim_burst->time_geocent_gps.gpsSeconds, sim_burst->time_geocent_gps.gpsNanoSeconds, -time_slide_row->offset, time_geocent_gps.gpsSeconds, time_geocent_gps.gpsNanoSeconds); /* construct the h+ and hx time series for the injection * waveform. */ if(XLALGenerateSimBurst(&hplus, &hcross, sim_burst, series->deltaT)) XLAL_ERROR(XLAL_EFUNC); #if 0 { char name[100]; FILE *f; unsigned i; sprintf(name, "%d.%09u_%s.txt", sim_burst->time_geocent_gps.gpsSeconds, sim_burst->time_geocent_gps.gpsNanoSeconds, series->name); f = fopen(name, "w"); for(i = 0; i < hplus->data->length; i++) { LIGOTimeGPS t = hplus->epoch; XLALGPSAdd(&t, i * hplus->deltaT); fprintf(f, "%.16g %.16g %.16g\n", XLALGPSGetREAL8(&t), hplus->data->data[i], hcross->data->data[i]); } fclose(f); } #endif /* project the wave onto the detector to produce the strain * in the detector. */ h = XLALSimDetectorStrainREAL8TimeSeries(hplus, hcross, sim_burst->ra, sim_burst->dec, sim_burst->psi, &detector_copy); XLALDestroyREAL8TimeSeries(hplus); XLALDestroyREAL8TimeSeries(hcross); hplus = hcross = NULL; if(!h) XLAL_ERROR(XLAL_EFUNC); /* shift the waveform by the time slide offset */ XLALGPSAdd(&h->epoch, -time_slide_row->offset); #if 0 { char name[100]; FILE *f; unsigned i; sprintf(name, "%d.%09u_%s.txt", sim_burst->time_geocent_gps.gpsSeconds, sim_burst->time_geocent_gps.gpsNanoSeconds, series->name); f = fopen(name, "w"); for(i = 0; i < h->data->length; i++) { LIGOTimeGPS t = h->epoch; XLALGPSAdd(&t, i * h->deltaT); fprintf(f, "%d.%09u %.16g\n", t.gpsSeconds, t.gpsNanoSeconds, h->data->data[i]); } fclose(f); } #endif /* add the injection strain time series to the detector * data */ if(XLALSimAddInjectionREAL8TimeSeries(series, h, response)) { XLALDestroyREAL8TimeSeries(h); XLAL_ERROR(XLAL_EFUNC); } XLALDestroyREAL8TimeSeries(h); } /* done */ return 0; }