diff --git a/gstlal-burst/gst/lal/gstlal_burst_triggergen.c b/gstlal-burst/gst/lal/gstlal_burst_triggergen.c index 5d6cbd0d43e7d718d4688c423c98f1f2300bdc31..062f2a3af410fe6f880974fcbe28d257d3450d0d 100644 --- a/gstlal-burst/gst/lal/gstlal_burst_triggergen.c +++ b/gstlal-burst/gst/lal/gstlal_burst_triggergen.c @@ -87,6 +87,215 @@ static void free_bank(GSTLALBurst_Triggergen *element) element->bankarray = NULL; } + +/* + * ======================================================================== + * + * Triggers + * + * ======================================================================== + */ + + +static int gstlal_set_channel_in_snglburst_array(SnglBurst *bankarray, int length, char *channel) +{ + int i; + for (i = 0; i < length; i++) { + if (channel) { + strncpy(bankarray[i].channel, (const char*) channel, LIGOMETA_CHANNEL_MAX); + bankarray[i].channel[LIGOMETA_CHANNEL_MAX - 1] = 0; + } + } + return 0; +} + + +static int gstlal_set_instrument_in_snglburst_array(SnglBurst *bankarray, int length, char *instrument) +{ + int i; + for (i = 0; i < length; i++) { + if (instrument) { + strncpy(bankarray[i].ifo, (const char*) instrument, LIGOMETA_IFO_MAX); + bankarray[i].ifo[LIGOMETA_IFO_MAX - 1] = 0; + } + } + return 0; +} + + +static SnglBurst *gstlal_snglburst_new_list_from_peak(struct gstlal_peak_state *input, SnglBurst *bankarray, GstClockTime etime, guint rate, SnglBurst* output) +{ + /* advance the pointer if we have one */ + guint channel; + double complex *maxdata = input->values.as_double_complex; + guint *maxsample = input->samples; + + /* FIXME do error checking */ + for(channel = 0; channel < input->channels; channel++) { + if ( maxdata[channel] ) { + SnglBurst *new_event = XLALCreateSnglBurst(); + memcpy(new_event, &(bankarray[channel]), sizeof(*new_event)); + LIGOTimeGPS peak_time; + XLALINT8NSToGPS(&peak_time, etime); + XLALGPSAdd(&peak_time, -new_event->duration/2); + XLALGPSAdd(&peak_time, (double) maxsample[channel] / rate); + LIGOTimeGPS start_time = peak_time; + XLALGPSAdd(&start_time, -new_event->duration/2); + new_event->snr = cabs(maxdata[channel]); + new_event->start_time = start_time; + new_event->peak_time = peak_time; + new_event->next = output; + output = new_event; + } + } + + return output; +} + + +static SnglBurst *gstlal_snglburst_new_list_from_double_peak(struct gstlal_peak_state *input, SnglBurst *bankarray, GstClockTime etime, guint rate, SnglBurst* output) +{ + /* advance the pointer if we have one */ + guint channel; + double *maxdata = input->values.as_double; + guint *maxsample = input->samples; + + /* FIXME do error checking */ + for(channel = 0; channel < input->channels; channel++) { + if ( maxdata[channel] ) { + SnglBurst *new_event = XLALCreateSnglBurst(); + memcpy(new_event, &(bankarray[channel]), sizeof(*new_event)); + LIGOTimeGPS peak_time; + XLALINT8NSToGPS(&peak_time, etime); + XLALGPSAdd(&peak_time, (double) maxsample[channel] / rate); + XLALGPSAdd(&peak_time, -new_event->duration/2); + // Center the tile + XLALGPSAdd(&peak_time, 1.0/(2.0*rate)); + LIGOTimeGPS start_time = peak_time; + XLALGPSAdd(&start_time, -new_event->duration/2); + new_event->snr = fabs(maxdata[channel]); + new_event->start_time = start_time; + new_event->peak_time = peak_time; + new_event->next = output; + output = new_event; + } + } + + return output; +} + + +static GstBuffer *gstlal_snglburst_new_buffer_from_list(SnglBurst *input, GstPad *pad, guint64 offset, guint64 length, GstClockTime etime, guint rate, guint64 *count) +{ + /* FIXME check errors */ + + /* size is length in samples times number of channels times number of bytes per sample */ + gint size = XLALSnglBurstTableLength(input); + size *= sizeof(*input); + GstBuffer *srcbuf = NULL; + GstCaps *caps = GST_PAD_CAPS(pad); + GstFlowReturn result = gst_pad_alloc_buffer(pad, offset, size, caps, &srcbuf); + if (result != GST_FLOW_OK) + return srcbuf; + + if (input) { + //FIXME: Process ID + (*count) = XLALSnglBurstAssignIDs(input, 0, *count); + } + + /* Copy the events into the buffer */ + SnglBurst *output = (SnglBurst *) GST_BUFFER_DATA(srcbuf); + SnglBurst *head = input; + while (input) { + *output = *input; + /* Make the array look like a linked list */ + output->next = input->next ? output+1 : NULL; + output++; + input = input->next; + } + /* Forget about this set of events, it's the buffer's now. */ + XLALDestroySnglBurstTable(head); + + if (size == 0) + GST_BUFFER_FLAG_SET(srcbuf, GST_BUFFER_FLAG_GAP); + + /* set the offset */ + GST_BUFFER_OFFSET(srcbuf) = offset; + GST_BUFFER_OFFSET_END(srcbuf) = offset + length; + + /* set the time stamps */ + GST_BUFFER_TIMESTAMP(srcbuf) = etime; + GST_BUFFER_DURATION(srcbuf) = (GstClockTime) gst_util_uint64_scale_int_round(GST_SECOND, length, rate); + + return srcbuf; +} + +static SnglBurst *gstlal_snglburst_new_list_from_double_buffer(double *input, SnglBurst *bankarray, GstClockTime etime, guint channels, guint samples, guint rate, gdouble threshold, SnglBurst* output) +{ + /* advance the pointer if we have one */ + guint channel, sample; + + /* FIXME do error checking */ + for (channel = 0; channel < channels; channel++) { + for (sample = 0; sample < samples; sample++) { + if (input[channels*sample+channel] > threshold) { + SnglBurst *new_event = XLALCreateSnglBurst(); + memcpy(new_event, &(bankarray[channel]), sizeof(*new_event)); + LIGOTimeGPS peak_time; + XLALINT8NSToGPS(&peak_time, etime); + XLALGPSAdd(&peak_time, (double) sample / rate); + XLALGPSAdd(&peak_time, -new_event->duration/2); + // Center the tile + XLALGPSAdd(&peak_time, 1.0/(2.0*rate)); + LIGOTimeGPS start_time = peak_time; + XLALGPSAdd(&start_time, -new_event->duration/2); + new_event->snr = fabs(input[channels*sample+channel]); + new_event->start_time = start_time; + new_event->peak_time = peak_time; + new_event->next = output; + output = new_event; + } + } + } + + return output; +} + + +static SnglBurst *gstlal_snglburst_new_list_from_complex_double_buffer(complex double *input, SnglBurst *bankarray, GstClockTime etime, guint channels, guint samples, guint rate, gdouble threshold, SnglBurst* output) +{ + /* advance the pointer if we have one */ + guint channel, sample; + + /* FIXME do error checking */ + for (channel = 0; channel < channels; channel++) { + for (sample = 0; sample < samples; sample++) { + /* FIXME Which are we thresholding on. the EP version uses the + * squared value, so we make this consistent */ + if (cabs(input[channels*sample+channel]) > sqrt(threshold)) { + SnglBurst *new_event = XLALCreateSnglBurst(); + memcpy(new_event, &(bankarray[channel]), sizeof(*new_event)); + LIGOTimeGPS peak_time; + XLALINT8NSToGPS(&peak_time, etime); + XLALGPSAdd(&peak_time, (double) sample / rate); + XLALGPSAdd(&peak_time, -new_event->duration/2); + // Center the tile + XLALGPSAdd(&peak_time, 1.0/(2.0*rate)); + LIGOTimeGPS start_time = peak_time; + XLALGPSAdd(&start_time, -new_event->duration/2); + new_event->snr = cabs(input[channels*sample+channel]); + new_event->start_time = start_time; + new_event->peak_time = peak_time; + new_event->next = output; + output = new_event; + } + } + } + + return output; +} + + /* * ============================================================================ * diff --git a/gstlal-burst/lib/gstlal_snglburst.c b/gstlal-burst/lib/gstlal_snglburst.c index ecf8958a79c368745c592caa42957d413ae60250..f3b41e43b04039e5970e0111cbc7969966c09ea7 100644 --- a/gstlal-burst/lib/gstlal_snglburst.c +++ b/gstlal-burst/lib/gstlal_snglburst.c @@ -1,12 +1,4 @@ -#include <glib.h> -#include <glib-object.h> -#include <gst/gst.h> -#include <gstlal/gstlal_peakfinder.h> #include <gstlal_snglburst.h> -#include <complex.h> -#include <string.h> -#include <math.h> -#include <lal/Date.h> #include <lal/LIGOMetadataTables.h> #include <lal/SnglBurstUtils.h> #include <lal/LIGOLwXMLBurstRead.h> @@ -46,196 +38,3 @@ int gstlal_snglburst_array_from_file(char *bank_filename, SnglBurst **bankarray) return num; } - -int gstlal_set_channel_in_snglburst_array(SnglBurst *bankarray, int length, char *channel) -{ - int i; - for (i = 0; i < length; i++) { - if (channel) { - strncpy(bankarray[i].channel, (const char*) channel, LIGOMETA_CHANNEL_MAX); - bankarray[i].channel[LIGOMETA_CHANNEL_MAX - 1] = 0; - } - } - return 0; -} - -int gstlal_set_instrument_in_snglburst_array(SnglBurst *bankarray, int length, char *instrument) -{ - int i; - for (i = 0; i < length; i++) { - if (instrument) { - strncpy(bankarray[i].ifo, (const char*) instrument, LIGOMETA_IFO_MAX); - bankarray[i].ifo[LIGOMETA_IFO_MAX - 1] = 0; - } - } - return 0; -} - -SnglBurst *gstlal_snglburst_new_list_from_peak(struct gstlal_peak_state *input, SnglBurst *bankarray, GstClockTime etime, guint rate, SnglBurst* output) -{ - /* advance the pointer if we have one */ - guint channel; - double complex *maxdata = input->values.as_double_complex; - guint *maxsample = input->samples; - - /* FIXME do error checking */ - for(channel = 0; channel < input->channels; channel++) { - if ( maxdata[channel] ) { - SnglBurst *new_event = XLALCreateSnglBurst(); - memcpy(new_event, &(bankarray[channel]), sizeof(*new_event)); - LIGOTimeGPS peak_time; - XLALINT8NSToGPS(&peak_time, etime); - XLALGPSAdd(&peak_time, -new_event->duration/2); - XLALGPSAdd(&peak_time, (double) maxsample[channel] / rate); - LIGOTimeGPS start_time = peak_time; - XLALGPSAdd(&start_time, -new_event->duration/2); - new_event->snr = cabs(maxdata[channel]); - new_event->start_time = start_time; - new_event->peak_time = peak_time; - new_event->next = output; - output = new_event; - } - } - - return output; -} - -SnglBurst *gstlal_snglburst_new_list_from_double_peak(struct gstlal_peak_state *input, SnglBurst *bankarray, GstClockTime etime, guint rate, SnglBurst* output) -{ - /* advance the pointer if we have one */ - guint channel; - double *maxdata = input->values.as_double; - guint *maxsample = input->samples; - - /* FIXME do error checking */ - for(channel = 0; channel < input->channels; channel++) { - if ( maxdata[channel] ) { - SnglBurst *new_event = XLALCreateSnglBurst(); - memcpy(new_event, &(bankarray[channel]), sizeof(*new_event)); - LIGOTimeGPS peak_time; - XLALINT8NSToGPS(&peak_time, etime); - XLALGPSAdd(&peak_time, (double) maxsample[channel] / rate); - XLALGPSAdd(&peak_time, -new_event->duration/2); - // Center the tile - XLALGPSAdd(&peak_time, 1.0/(2.0*rate)); - LIGOTimeGPS start_time = peak_time; - XLALGPSAdd(&start_time, -new_event->duration/2); - new_event->snr = fabs(maxdata[channel]); - new_event->start_time = start_time; - new_event->peak_time = peak_time; - new_event->next = output; - output = new_event; - } - } - - return output; -} - -GstBuffer *gstlal_snglburst_new_buffer_from_list(SnglBurst *input, GstPad *pad, guint64 offset, guint64 length, GstClockTime etime, guint rate, guint64 *count) -{ - /* FIXME check errors */ - - /* size is length in samples times number of channels times number of bytes per sample */ - gint size = XLALSnglBurstTableLength(input); - size *= sizeof(*input); - GstBuffer *srcbuf = NULL; - GstCaps *caps = GST_PAD_CAPS(pad); - GstFlowReturn result = gst_pad_alloc_buffer(pad, offset, size, caps, &srcbuf); - if (result != GST_FLOW_OK) - return srcbuf; - - if (input) { - //FIXME: Process ID - (*count) = XLALSnglBurstAssignIDs(input, 0, *count); - } - - /* Copy the events into the buffer */ - SnglBurst *output = (SnglBurst *) GST_BUFFER_DATA(srcbuf); - SnglBurst *head = input; - while (input) { - *output = *input; - /* Make the array look like a linked list */ - output->next = input->next ? output+1 : NULL; - output++; - input = input->next; - } - /* Forget about this set of events, it's the buffer's now. */ - XLALDestroySnglBurstTable(head); - - if (size == 0) - GST_BUFFER_FLAG_SET(srcbuf, GST_BUFFER_FLAG_GAP); - - /* set the offset */ - GST_BUFFER_OFFSET(srcbuf) = offset; - GST_BUFFER_OFFSET_END(srcbuf) = offset + length; - - /* set the time stamps */ - GST_BUFFER_TIMESTAMP(srcbuf) = etime; - GST_BUFFER_DURATION(srcbuf) = (GstClockTime) gst_util_uint64_scale_int_round(GST_SECOND, length, rate); - - return srcbuf; -} - -SnglBurst *gstlal_snglburst_new_list_from_double_buffer(double *input, SnglBurst *bankarray, GstClockTime etime, guint channels, guint samples, guint rate, gdouble threshold, SnglBurst* output) -{ - /* advance the pointer if we have one */ - guint channel, sample; - - /* FIXME do error checking */ - for (channel = 0; channel < channels; channel++) { - for (sample = 0; sample < samples; sample++) { - if (input[channels*sample+channel] > threshold) { - SnglBurst *new_event = XLALCreateSnglBurst(); - memcpy(new_event, &(bankarray[channel]), sizeof(*new_event)); - LIGOTimeGPS peak_time; - XLALINT8NSToGPS(&peak_time, etime); - XLALGPSAdd(&peak_time, (double) sample / rate); - XLALGPSAdd(&peak_time, -new_event->duration/2); - // Center the tile - XLALGPSAdd(&peak_time, 1.0/(2.0*rate)); - LIGOTimeGPS start_time = peak_time; - XLALGPSAdd(&start_time, -new_event->duration/2); - new_event->snr = fabs(input[channels*sample+channel]); - new_event->start_time = start_time; - new_event->peak_time = peak_time; - new_event->next = output; - output = new_event; - } - } - } - - return output; -} - -SnglBurst *gstlal_snglburst_new_list_from_complex_double_buffer(complex double *input, SnglBurst *bankarray, GstClockTime etime, guint channels, guint samples, guint rate, gdouble threshold, SnglBurst* output) -{ - /* advance the pointer if we have one */ - guint channel, sample; - - /* FIXME do error checking */ - for (channel = 0; channel < channels; channel++) { - for (sample = 0; sample < samples; sample++) { - /* FIXME Which are we thresholding on. the EP version uses the - * squared value, so we make this consistent */ - if (cabs(input[channels*sample+channel]) > sqrt(threshold)) { - SnglBurst *new_event = XLALCreateSnglBurst(); - memcpy(new_event, &(bankarray[channel]), sizeof(*new_event)); - LIGOTimeGPS peak_time; - XLALINT8NSToGPS(&peak_time, etime); - XLALGPSAdd(&peak_time, (double) sample / rate); - XLALGPSAdd(&peak_time, -new_event->duration/2); - // Center the tile - XLALGPSAdd(&peak_time, 1.0/(2.0*rate)); - LIGOTimeGPS start_time = peak_time; - XLALGPSAdd(&start_time, -new_event->duration/2); - new_event->snr = cabs(input[channels*sample+channel]); - new_event->start_time = start_time; - new_event->peak_time = peak_time; - new_event->next = output; - output = new_event; - } - } - } - - return output; -} diff --git a/gstlal-burst/lib/gstlal_snglburst.h b/gstlal-burst/lib/gstlal_snglburst.h index 83a9e453b1085cf86b8328de590937befbbb3b05..83f088d5f5d15750acbeed283a83f192d1fe3361 100644 --- a/gstlal-burst/lib/gstlal_snglburst.h +++ b/gstlal-burst/lib/gstlal_snglburst.h @@ -2,34 +2,13 @@ #define __GSTLAL_SNGLBURST_H__ #include <glib.h> -#include <glib-object.h> -#include <gst/gst.h> -#include <gstlal/gstlal_peakfinder.h> -#include <complex.h> -#include <string.h> -#include <math.h> #include <lal/LIGOMetadataTables.h> -#include <lal/LIGOLwXMLInspiralRead.h> -#include <lal/LALStdlib.h> G_BEGIN_DECLS int gstlal_snglburst_array_from_file(char *bank_filename, SnglBurst **bankarray); -int gstlal_set_channel_in_snglburst_array(SnglBurst *bankarray, int length, char *channel); -int gstlal_set_instrument_in_snglburst_array(SnglBurst *bankarray, int length, char *instrument); -SnglBurst *gstlal_snglburst_new_buffer_from_peak(struct gstlal_peak_state *input, SnglBurst *bankarray, GstPad *pad, guint64 offset, guint64 length, GstClockTime etime, guint rate, guint64 *count); -SnglBurst *gstlal_snglburst_new_double_buffer_from_peak(struct gstlal_peak_state *input, SnglBurst *bankarray, GstPad *pad, guint64 offset, guint64 length, GstClockTime etime, guint rate, guint64 *count); - -SnglBurst *gstlal_snglburst_new_list_from_peak(struct gstlal_peak_state *input, SnglBurst *bankarray, GstClockTime etime, guint rate, SnglBurst* output); -SnglBurst *gstlal_snglburst_new_list_from_double_peak(struct gstlal_peak_state *input, SnglBurst *bankarray, GstClockTime etime, guint rate, SnglBurst* output); - -SnglBurst *gstlal_snglburst_new_list_from_double_buffer(double *input, SnglBurst *bankarray, GstClockTime etime, guint channels, guint samples, guint rate, gdouble threshold, SnglBurst* output); -SnglBurst *gstlal_snglburst_new_list_from_complex_double_buffer(complex double *input, SnglBurst *bankarray, GstClockTime etime, guint channels, guint samples, guint rate, gdouble threshold, SnglBurst* output); - -GstBuffer *gstlal_snglburst_new_buffer_from_list(SnglBurst *input, GstPad *pad, guint64 offset, guint64 length, GstClockTime etime, guint rate, guint64 *count); G_END_DECLS #endif /* __GSTLAL_SNGLBURST_H__ */ -