30 matplotlib.rcParams.update({
32 "axes.titlesize": 10.0,
33 "axes.labelsize": 10.0,
34 "xtick.labelsize": 8.0,
35 "ytick.labelsize": 8.0,
36 "legend.fontsize": 8.0,
42 from matplotlib
import figure
43 from matplotlib.backends.backend_agg
import FigureCanvasAgg
as FigureCanvas
55 from gstlal
import pipeio
56 from gstlal
import reference_psd
57 from gstlal.elements
import matplotlibcaps
60 __author__ =
"Kipp Cannon <kipp.cannon@ligo.org>"
76 "Power spectrum plot",
78 "Generates a video showing a power spectrum (e.g., as measured by lal_whiten)",
86 "Lower bound of plot in Hz.",
87 0, gobject.G_MAXDOUBLE, 10.0,
88 gobject.PARAM_READWRITE | gobject.PARAM_CONSTRUCT
93 "Upper bound of plot in Hz.",
94 0, gobject.G_MAXDOUBLE, 4000.0,
95 gobject.PARAM_READWRITE | gobject.PARAM_CONSTRUCT
100 gst.PadTemplate(
"sink",
103 gst.caps_from_string(
104 "audio/x-raw-float, " +
105 "delta-f = (double) [0, MAX], " +
106 "channels = (int) [1, MAX], " +
107 "endianness = (int) BYTE_ORDER, " +
108 "rate = (fraction) [0/1, 2147483647/1], " +
112 gst.PadTemplate(
"src",
115 gst.caps_from_string(
116 matplotlibcaps +
", " +
117 "width = (int) [1, MAX], " +
118 "height = (int) [1, MAX], " +
119 "framerate = (fraction) [0/1, 2147483647/1]"
126 gst.BaseTransform.__init__(self)
136 def do_set_property(self, prop, val):
137 if prop.name ==
"f-min":
139 elif prop.name ==
"f-max":
142 raise AssertionError(
"no property %s" % prop.name)
145 def do_get_property(self, prop):
146 if prop.name ==
"f-min":
148 elif prop.name ==
"f-max":
151 raise AssertionError(
"no property %s" % prop.name)
154 def do_set_caps(self, incaps, outcaps):
155 self.
channels = incaps[0][
"channels"]
156 self.
delta_f = incaps[0][
"delta-f"]
162 def do_get_unit_size(self, caps):
163 return pipeio.get_unit_size(caps)
166 def do_event(self, event):
167 if event.type == gst.EVENT_TAG:
168 tags = pipeio.parse_framesrc_tags(event.parse_tag())
175 def do_transform(self, inbuf, outbuf):
180 fig = figure.Figure()
182 fig.set_size_inches(self.
out_width / float(fig.get_dpi()), self.
out_height / float(fig.get_dpi()))
183 axes = fig.gca(rasterized =
True)
185 data = numpy.transpose(pipeio.array_from_audio_buffer(inbuf))
186 f = numpy.arange(len(data[0]), dtype =
"double") * self.
delta_f
188 imin = bisect.bisect_left(f, self.
f_min)
189 imax = bisect.bisect_right(f, self.
f_max)
192 axes.loglog(f[imin:imax], psd[imin:imax], alpha = 0.7, label =
"%s:%s (%.4g Mpc BNS horizon)" % ((self.
instrument or "Unknown Instrument"), (self.
channel_name or "Unknown Channel").replace(
"_",
r"\_"), reference_psd.horizon_distance(reference_psd.laltypes.REAL8FrequencySeries(f0 = f[0], deltaF = self.
delta_f, data = psd), 1.4, 1.4, 8.0, 10.0)))
196 axes.set_title(
r"Spectral Density at %.11g s" % (float(inbuf.timestamp) / gst.SECOND))
197 axes.set_xlabel(
r"Frequency (Hz)")
198 axes.set_ylabel(
r"Spectral Density (%s)" % self.
sample_units)
199 axes.legend(loc =
"lower left")
206 rgba_buffer = fig.canvas.buffer_rgba(0, 0)
207 rgba_buffer_size = len(rgba_buffer)
213 outbuf[0:rgba_buffer_size] = rgba_buffer
214 outbuf.datasize = rgba_buffer_size
220 outbuf.offset_end = outbuf.offset = gst.BUFFER_OFFSET_NONE
221 outbuf.timestamp = inbuf.timestamp
222 outbuf.duration = gst.CLOCK_TIME_NONE
231 def do_transform_caps(self, direction, caps):
232 if direction == gst.PAD_SRC:
237 rate, = [struct[
"framerate"]
for struct
in caps]
239 for struct
in self.get_pad(
"sink").get_pad_template_caps():
240 struct = struct.copy()
241 struct[
"rate"] = rate
242 result.append_structure(struct)
245 elif direction == gst.PAD_SINK:
250 rate, = [struct[
"rate"]
for struct
in caps]
252 for struct
in self.get_pad(
"src").get_pad_template_caps():
253 struct = struct.copy()
254 struct[
"framerate"] = rate
255 result.append_structure(struct)
258 raise ValueError(direction)
261 def do_transform_size(self, direction, caps, size, othercaps):
262 if direction == gst.PAD_SRC:
267 frames = size * 8 // (caps[0][
"bpp"] * caps[0][
"width"] * caps[0][
"height"])
280 elif direction == gst.PAD_SINK:
288 othercaps = self.get_pad(
"src").get_allowed_caps()
289 return othercaps[0][
"width"] * othercaps[0][
"height"] * othercaps[0][
"bpp"] // 8
291 raise ValueError(direction)
299 gobject.type_register(lal_spectrumplot)
301 __gstelementfactory__ = (
302 lal_spectrumplot.__name__,