<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def roughcwt(data, wavelet, widths):
 """ Continuous wavelet transform. Performs a continuous wavelet transform on `data`, using the `wavelet` function. A CWT performs a convolution with `data` using the `wavelet` function, which is characterized by a width parameter and length parameter. Parameters data : (N,) ndarray data on which to perform the transform. wavelet : function Wavelet function, which should take 2 arguments. The first argument is the number of points that the returned vector will have (len(wavelet(width,length)) == length). The second is a width parameter, defining the size of the wavelet (e.g. standard deviation of a gaussian). See `ricker`, which satisfies these requirements. widths : (M,) sequence Widths to use for transform. Returns ------- cwt: (M, N) ndarray Will have shape of (len(data), len(widths)). Notes ----- Examples -------- """

    out_dtype = wavelet(widths[0], widths[0]).dtype
    output = np.zeros([len(widths), len(data)], dtype=out_dtype)
    for ind, width in enumerate(widths):
        wavelet_data = wavelet(min(3 * width, len(data)), width)
        output[ind, :] = convolve(data, wavelet_data,
                                              mode='same')
    return output