int main(int argc, char *argv[]) { LALFrStream *stream; REAL8TimeSeries *series; LIGOTimeGPS start; XLALSetErrorHandler(XLALAbortErrorHandler); parseargs(argc, argv); /* get the data */ stream = XLALFrStreamCacheOpen(cache); XLALGPSSetREAL8(&start, t0 - pad); series = XLALFrStreamInputREAL8TimeSeries(stream, channel, &start, dt + 2.0 * pad, 0); XLALFrStreamClose(stream); /* manipulate the data */ if (srate > 0) XLALResampleREAL8TimeSeries(series, 1.0 / srate); if (minfreq > 0) XLALHighPassREAL8TimeSeries(series, minfreq, 0.9, 8); if (maxfreq > 0) XLALLowPassREAL8TimeSeries(series, maxfreq, 0.9, 8); if (pad > 0) series = XLALResizeREAL8TimeSeries(series, pad / series->deltaT, dt / series->deltaT); if (df > 0) { /* we are computing a spectrum */ REAL8FrequencySeries *spectrum; REAL8FFTPlan *plan; REAL8Window *window; size_t seglen = 1.0 / (df * series->deltaT); /* make sure that the time series length is commensurate with seglen */ if (((2 * series->data->length) % seglen) != 0) { size_t newlen = ((2 * series->data->length) / seglen) * seglen; series = XLALResizeREAL8TimeSeries(series, 0, newlen); } spectrum = XLALCreateREAL8FrequencySeries(series->name, &series->epoch, 0.0, df, &lalDimensionlessUnit, seglen/2 + 1); plan = XLALCreateForwardREAL8FFTPlan(seglen, 0); window = XLALCreateHannREAL8Window(seglen); XLALREAL8AverageSpectrumWelch(spectrum, series, seglen, seglen/2, window, plan); if (minfreq > 0 || maxfreq > 0) { size_t first = minfreq / spectrum->deltaF; size_t last = maxfreq > 0 ? maxfreq / spectrum->deltaF : spectrum->data->length; spectrum = XLALResizeREAL8FrequencySeries(spectrum, first, last - first); } output_fs(outfile, spectrum); XLALDestroyREAL8Window(window); XLALDestroyREAL8FFTPlan(plan); XLALDestroyREAL8FrequencySeries(spectrum); } else { /* we are outputting a time series */ output_ts(outfile, series); } XLALDestroyREAL8TimeSeries(series); return 0; }
/** * Function that *truncates the PSD in place* to the requested frequency-bin interval [firstBin, lastBin] for the given multiPSDVector. * Now also truncates the original SFT vector, as necessary for correct computation of normalized SFT power. */ int XLALCropMultiPSDandSFTVectors ( MultiPSDVector *multiPSDVect, MultiSFTVector *multiSFTVect, UINT4 firstBin, UINT4 lastBin ) { /* check user input */ if ( !multiPSDVect ) { XLALPrintError ("%s: invalid NULL input 'multiPSDVect'\n", __func__ ); XLAL_ERROR ( XLAL_EINVAL ); } if ( !multiSFTVect ) { XLALPrintError ("%s: invalid NULL input 'multiSFTVect'\n", __func__ ); XLAL_ERROR ( XLAL_EINVAL ); } if ( lastBin < firstBin ) { XLALPrintError ("%s: empty bin interval requested [%d, %d]\n", __func__, firstBin, lastBin ); XLAL_ERROR ( XLAL_EDOM ); } UINT4 numIFOs = multiPSDVect->length; UINT4 numBins = multiPSDVect->data[0]->data[0].data->length; if ( numIFOs != multiSFTVect->length ) { XLALPrintError ("%s: inconsistent number of IFOs between PSD (%d) and SFT (%d) vectors.\n", __func__, numIFOs, multiSFTVect->length ); XLAL_ERROR ( XLAL_EDOM ); } if ( numBins != multiSFTVect->data[0]->data[0].data->length ) { XLALPrintError ("%s: inconsistent number of bins between PSD (%d bins) and SFT (%d bins) vectors.\n", __func__, numBins, multiSFTVect->data[0]->data[0].data->length ); XLAL_ERROR ( XLAL_EDOM ); } if ( (firstBin >= numBins) || (lastBin >= numBins ) ) { XLALPrintError ("%s: requested bin-interval [%d, %d] outside of PSD bins [0, %d]\n", __func__, firstBin, lastBin, numBins - 1 ); XLAL_ERROR ( XLAL_EDOM ); } /* ----- check if there's anything to do at all? ----- */ if ( (firstBin == 0) && (lastBin == numBins - 1) ) return XLAL_SUCCESS; /* ----- loop over detectors, timestamps, then crop each PSD ----- */ UINT4 X; for ( X=0; X < numIFOs; X ++ ) { PSDVector *thisPSDVect = multiPSDVect->data[X]; SFTVector *thisSFTVect = multiSFTVect->data[X]; UINT4 numTS = thisPSDVect->length; UINT4 iTS; for ( iTS = 0; iTS < numTS; iTS ++ ) { REAL8FrequencySeries *thisPSD = &thisPSDVect->data[iTS]; COMPLEX8FrequencySeries *thisSFT = &thisSFTVect->data[iTS]; if ( numBins != thisPSD->data->length ) { XLALPrintError ("%s: inconsistent number of frequency-bins across multiPSDVector: X=%d, iTS=%d: numBins = %d != %d\n", __func__, X, iTS, numBins, thisPSD->data->length ); XLAL_ERROR ( XLAL_EDOM ); } if ( numBins != thisSFT->data->length ) { XLALPrintError ("%s: inconsistent number of frequency-bins across multiSFTVector: X=%d, iTS=%d: numBins = %d != %d\n", __func__, X, iTS, numBins, thisSFT->data->length ); XLAL_ERROR ( XLAL_EDOM ); } UINT4 numNewBins = lastBin - firstBin + 1; /* crop PSD */ XLAL_CHECK(XLALResizeREAL8FrequencySeries(thisPSD, firstBin, numNewBins) != NULL, XLAL_EFUNC); /* crop SFT */ XLAL_CHECK(XLALResizeCOMPLEX8FrequencySeries(thisSFT, firstBin, numNewBins) != NULL, XLAL_EFUNC); } /* for iTS < numTS */ } /* for X < numIFOs */ /* that should be all ... */ return XLAL_SUCCESS; } /* XLALCropMultiPSDandSFTVectors() */