88 SET_DIFFERENCECOLUMNS,
94char *option[N_OPTIONS] = {
113 "sddsfdfilter [<inputfile>] [<outputfile>]\n"
114 " [-pipe=[input][,output]]\n"
115 " [-columns=<indep-variable>[,<depen-quantity>[,...]]]\n"
116 " [-exclude=<depen-quantity>[,...]]\n"
117 " [-clipFrequencies=[high=<number>][,low=<number>]]\n"
118 " [-threshold=level=<value>[,fractional][,start=<freq>][,end=<freq>]]\n"
119 " [-highpass=start=<freq>,end=<freq>]\n"
120 " [-lowpass=start=<freq>,end=<freq>]\n"
121 " [-notch=center=<center>,flatWidth=<value>,fullWidth=<value>]\n"
122 " [-bandpass=center=<center>,flatWidth=<value>,fullWidth=<value>]\n"
123 " [-filterFile=filename=<filename>,frequency=<columnName>{,real=<cName>,imaginary=<cName>|magnitude=<cName>}]\n"
126 " [-differenceColumns]\n"
127 " [-majorOrder=row|column]\n\n"
128 "Program by Michael Borland. (" __DATE__
" " __TIME__
", SVN revision: " SVN_VERSION
")\n";
130#define FILT_START_GIVEN 0x00000001U
131#define FILT_END_GIVEN 0x00000002U
132#define FILT_THRES_GIVEN 0x00000004U
133#define FILT_CENTER_GIVEN 0x00000008U
134#define FILT_FULLWIDTH_GIVEN 0x00000010U
135#define FILT_FREQNAME_GIVEN 0x00000020U
136#define FILT_REALNAME_GIVEN 0x00000040U
137#define FILT_IMAGNAME_GIVEN 0x00000080U
138#define FILT_MAGNAME_GIVEN 0x00000100U
139#define FILT_FRACTHRES_GIVEN 0x00000200U
140#define FILT_LEVEL_GIVEN 0x00000400U
141#define FILT_FILENAME_GIVEN 0x00000800U
142#define FILT_HIGH_GIVEN 0x00001000U
143#define FILT_LOW_GIVEN 0x00002000U
144#define FILT_FLATWIDTH_GIVEN 0x00004000U
147 double level, start, end;
157 double center, fullwidth, flatwidth;
162 char *file, *freqName, *realName, *imagName, *magName;
163 double *freqData, *realData, *imagData, *magData;
183#define FL_NEWCOLUMNS 0x00001UL
184#define FL_DIFCOLUMNS 0x00002UL
186long applyFilters(
double *outputData,
double *inputData,
double *timeData, int64_t rows,
FILTER_STAGE *filterStage,
long filterStages);
187long applyFilterStage(
double *outputRI,
double *inputRI, int64_t frequencies,
double dfrequency,
FILTER_STAGE *filterStage);
188void addClipFilterOutput(
double *outputRI,
double *inputRI, int64_t frequencies,
double dfrequency,
CLIP_FILTER *filter);
189void addThresholdFilterOutput(
double *outputRI,
double *inputRI, int64_t frequencies,
double dfrequency,
THRESHOLD_FILTER *filter);
190void addHighPassFilterOutput(
double *outputRI,
double *inputRI, int64_t frequencies,
double dfrequency,
HILO_FILTER *filter);
191void addLowPassFilterOutput(
double *outputRI,
double *inputRI, int64_t frequencies,
double dfrequency,
HILO_FILTER *filter);
192void addNotchFilterOutput(
double *outputRI,
double *inputRI, int64_t frequencies,
double dfrequency,
NHBP_FILTER *filter);
193void addBandPassFilterOutput(
double *outputRI,
double *inputRI, int64_t frequencies,
double dfrequency,
NHBP_FILTER *filter);
194void addFileFilterOutput(
double *outputRI,
double *inputRI, int64_t frequencies,
double dfrequency,
FILE_FILTER *filter);
195int64_t computeIndex(
double value,
double dfrequency, int64_t frequencies);
196void addFilter(
FILTER_STAGE *filterStage,
long optionCode, SCANNED_ARG *scanned);
198int main(
int argc,
char **argv) {
200 char **outputColumn, **difColumn;
201 char *indepColumn, **depenColumn, **exclude;
202 long depenColumns, excludes;
203 char *input, *output;
204 long i, readCode, optionCode;
206 unsigned long flags, pipeFlags, majorOrderFlag;
207 SCANNED_ARG *scanned;
209 double *timeData, *inputData, *outputData;
211 long filterStages, totalFilters;
212 short columnMajorOrder = -1;
215 argc =
scanargs(&scanned, argc, argv);
216 if (argc < 3 || argc > (3 + N_OPTIONS))
219 output = input = NULL;
220 flags = pipeFlags = 0;
222 depenColumn = exclude = NULL;
223 depenColumns = excludes = 0;
224 if (!(filterStage = (
FILTER_STAGE *)calloc(1,
sizeof(*filterStage))))
227 filterStage->filter = NULL;
228 filterStage->filters = 0;
232 for (iArg = 1; iArg < argc; iArg++) {
233 if (scanned[iArg].arg_type == OPTION) {
235 switch (optionCode =
match_string(scanned[iArg].list[0], option, N_OPTIONS, 0)) {
236 case SET_MAJOR_ORDER:
238 scanned[iArg].n_items--;
239 if (scanned[iArg].n_items > 0 && (!
scanItemList(&majorOrderFlag, scanned[iArg].list + 1, &scanned[iArg].n_items, 0,
240 "row", -1, NULL, 0, SDDS_ROW_MAJOR_ORDER,
241 "column", -1, NULL, 0, SDDS_COLUMN_MAJOR_ORDER, NULL)))
242 SDDS_Bomb(
"invalid -majorOrder syntax/values");
243 if (majorOrderFlag & SDDS_COLUMN_MAJOR_ORDER)
244 columnMajorOrder = 1;
245 else if (majorOrderFlag & SDDS_ROW_MAJOR_ORDER)
246 columnMajorOrder = 0;
249 if (!
processPipeOption(scanned[iArg].list + 1, scanned[iArg].n_items - 1, &pipeFlags))
254 SDDS_Bomb(
"only one -columns option may be given");
255 if (scanned[iArg].n_items < 2)
257 indepColumn = scanned[iArg].list[1];
258 if (scanned[iArg].n_items >= 2) {
259 depenColumn =
tmalloc(
sizeof(*depenColumn) * (depenColumns = scanned[iArg].n_items - 2));
260 for (i = 0; i < depenColumns; i++)
261 depenColumn[i] = scanned[iArg].list[i + 2];
271 addFilter(filterStage + filterStages - 1, optionCode, scanned + iArg);
275 if (filterStages == 0)
276 SDDS_Bomb(
"-cascade option precedes all filter definitions");
277 if (!(filterStage =
SDDS_Realloc(filterStage, (filterStages + 1) *
sizeof(*filterStage))))
279 filterStage[filterStages].filter = NULL;
280 filterStage[filterStages].filters = 0;
284 flags |= FL_NEWCOLUMNS;
286 case SET_DIFFERENCECOLUMNS:
287 flags |= FL_DIFCOLUMNS;
290 if (scanned[iArg].n_items < 2)
292 moveToStringArray(&exclude, &excludes, scanned[iArg].list + 1, scanned[iArg].n_items - 1);
295 fprintf(stderr,
"error: unknown/ambiguous option: %s (%s)\n", scanned[iArg].list[0], argv[0]);
301 input = scanned[iArg].list[0];
303 output = scanned[iArg].list[0];
312 fputs(
"warning: no filters specified (sddsfdfilter)\n", stderr);
315 SDDS_Bomb(
"supply the independent column name with the -columns option");
323 excludes = appendToStringArray(&exclude, excludes, indepColumn);
325 depenColumns = appendToStringArray(&depenColumn, depenColumns,
"*");
327 if ((depenColumns = expandColumnPairNames(&SDDSin, &depenColumn, NULL, depenColumns, exclude, excludes, FIND_NUMERIC_TYPE, 0)) <= 0) {
329 SDDS_Bomb(
"No quantities selected to filter");
335 if (columnMajorOrder != -1)
336 SDDSout.layout.data_mode.column_major = columnMajorOrder;
338 SDDSout.layout.data_mode.column_major = SDDSin.layout.data_mode.column_major;
340 if (flags & FL_NEWCOLUMNS) {
341 outputColumn =
tmalloc(
sizeof(*outputColumn) * depenColumns);
342 for (i = 0; i < depenColumns; i++) {
343 outputColumn[i] =
tmalloc(
sizeof(**outputColumn) * (strlen(depenColumn[i]) + 1 + strlen(
"Filtered")));
344 sprintf(outputColumn[i],
"%sFiltered", depenColumn[i]);
349 outputColumn = depenColumn;
352 if (flags & FL_DIFCOLUMNS) {
353 difColumn =
tmalloc(
sizeof(*difColumn) * depenColumns);
354 for (i = 0; i < depenColumns; i++) {
355 difColumn[i] =
tmalloc(
sizeof(**difColumn) * (strlen(depenColumn[i]) + 1 + strlen(
"Difference")));
356 sprintf(difColumn[i],
"%sDifference", depenColumn[i]);
375 if (!(outputData =
SDDS_Realloc(outputData,
sizeof(*outputData) * rows)))
377 for (i = 0; i < depenColumns; i++) {
380 if (!applyFilters(outputData, inputData, timeData, rows, filterStage, filterStages))
384 if (flags & FL_DIFCOLUMNS) {
386 for (j = 0; j < rows; j++)
387 outputData[j] = inputData[j] - outputData[j];
400 for (i = 0; i < depenColumns; i++) {
401 free(depenColumn[i]);
402 if (flags & FL_NEWCOLUMNS)
403 free(outputColumn[i]);
404 if (flags & FL_DIFCOLUMNS)
407 for (i = 0; i < excludes; i++)
411 if (flags & FL_NEWCOLUMNS)
414 if (flags & FL_DIFCOLUMNS)
417 for (i = 0; i < filterStages; i++) {
419 for (j = 0; j < filterStage[i].filters; j++) {
420 switch (filterStage[i].filter[j].filterType) {
422 free(((
FILE_FILTER *)(filterStage[i].filter[j].filter))->freqData);
423 free(((
FILE_FILTER *)(filterStage[i].filter[j].filter))->magData);
424 free(((
FILE_FILTER *)(filterStage[i].filter[j].filter))->imagData);
425 free(((
FILE_FILTER *)(filterStage[i].filter[j].filter))->realData);
439long applyFilters(
double *outputData,
double *inputData,
double *timeData, int64_t rows,
FILTER_STAGE *filterStage,
long filterStages) {
441 int64_t frequencies, row;
442 double *realimagInput, *realimagOutput;
443 double length, dfrequency, factor;
444 realimagOutput = NULL;
445 if (!(realimagInput = (
double *)malloc(
sizeof(*realimagInput) * (rows + 2))) ||
446 !(realimagOutput = (
double *)malloc(
sizeof(*realimagOutput) * (rows + 2))))
451 realFFT2(realimagInput, inputData, rows, 0);
452 frequencies = rows / 2 + 1;
456 length = ((double)rows) * (timeData[rows - 1] - timeData[0]) / ((double)rows - 1.0);
457 dfrequency = factor = 1.0 / length;
459 for (stage = 0; stage < filterStages; stage++) {
460 if (!applyFilterStage(realimagOutput, realimagInput, frequencies, dfrequency, filterStage + stage))
462 SWAP_PTR(realimagOutput, realimagInput);
469 for (row = 0; row < rows; row++) {
470 fprintf(stdout,
"Real: %f, Imag: %f\n", realimagInput[2 * row], realimagInput[2 * row + 1]);
473 realFFT2(realimagOutput, realimagInput, rows, INVERSE_FFT);
475 for (row = 0; row < rows; row++)
476 outputData[row] = realimagOutput[row];
478 free(realimagOutput);
484long applyFilterStage(
double *outputRI,
double *inputRI, int64_t frequencies,
double dfrequency,
FILTER_STAGE *filterStage) {
487 for (i = 0; i < 2 * frequencies; i++)
490 for (ifilter = 0; ifilter < filterStage->filters; ifilter++) {
491 switch (filterStage->filter[ifilter].filterType) {
493 addClipFilterOutput(outputRI, inputRI, frequencies, dfrequency, filterStage->filter[ifilter].filter);
496 addThresholdFilterOutput(outputRI, inputRI, frequencies, dfrequency, filterStage->filter[ifilter].filter);
499 addHighPassFilterOutput(outputRI, inputRI, frequencies, dfrequency, filterStage->filter[ifilter].filter);
502 addLowPassFilterOutput(outputRI, inputRI, frequencies, dfrequency, filterStage->filter[ifilter].filter);
505 addNotchFilterOutput(outputRI, inputRI, frequencies, dfrequency, filterStage->filter[ifilter].filter);
508 addBandPassFilterOutput(outputRI, inputRI, frequencies, dfrequency, filterStage->filter[ifilter].filter);
511 addFileFilterOutput(outputRI, inputRI, frequencies, dfrequency, filterStage->filter[ifilter].filter);
514 SDDS_Bomb(
"unknown filter type in applyFilterStage--this shouldn't happen");
521void addClipFilterOutput(
double *outputRI,
double *inputRI, int64_t frequencies,
double dfrequency,
CLIP_FILTER *filter) {
525 i2 = frequencies - 1;
526 if (filter->flags & FILT_HIGH_GIVEN)
527 if ((i2 = frequencies - filter->high) < 0)
529 if (filter->flags & FILT_LOW_GIVEN)
530 if ((i1 = filter->low) >= frequencies)
531 i1 = frequencies - 1;
532 for (; i1 <= i2; i1++) {
533 outputRI[2 * i1] += inputRI[2 * i1];
534 outputRI[2 * i1 + 1] += inputRI[2 * i1 + 1];
538void addThresholdFilterOutput(
double *outputRI,
double *inputRI, int64_t frequencies,
double dfrequency,
THRESHOLD_FILTER *filter) {
540 double level2, level2q, level2o;
544 if (filter->flags & FILT_START_GIVEN)
545 i1 = computeIndex(filter->start, dfrequency, frequencies);
546 i2 = frequencies - 1;
547 if (filter->flags & FILT_END_GIVEN)
548 i2 = computeIndex(filter->end, dfrequency, frequencies);
550 if (filter->flags & FILT_FRACTHRES_GIVEN) {
552 for (i = i1; i <= i2; i++)
553 if ((mag2 = inputRI[2 * i] * inputRI[2 * i] + inputRI[2 * i + 1] * inputRI[2 * i + 1]) > max2)
555 level2o = max2 * sqr(filter->level);
557 level2o = sqr(filter->level);
558 level2q = level2o / 4;
560 for (i = i1; i <= i2; i++) {
562 if (i == 0 || i == frequencies - 1)
564 if ((inputRI[2 * i] * inputRI[2 * i] + inputRI[2 * i + 1] * inputRI[2 * i + 1]) >= level2) {
565 outputRI[2 * i] += inputRI[2 * i];
566 outputRI[2 * i + 1] += inputRI[2 * i + 1];
571void addHighPassFilterOutput(
double *outputRI,
double *inputRI, int64_t frequencies,
double dfrequency,
HILO_FILTER *filter) {
573 double fraction, dfraction;
575 i1 = computeIndex(filter->start, dfrequency, frequencies);
576 i2 = computeIndex(filter->end, dfrequency, frequencies);
578 dfraction = i1 == i2 ? 0 : 1.0 / (i2 - i1);
580 for (i = i1; i <= i2; i++) {
581 outputRI[2 * i] += inputRI[2 * i] * fraction;
582 outputRI[2 * i + 1] += inputRI[2 * i + 1] * fraction;
583 if ((fraction += dfraction) > 1)
586 for (; i < frequencies; i++) {
587 outputRI[2 * i] += inputRI[2 * i];
588 outputRI[2 * i + 1] += inputRI[2 * i + 1];
592void addLowPassFilterOutput(
double *outputRI,
double *inputRI, int64_t frequencies,
double dfrequency,
HILO_FILTER *filter) {
594 double fraction, dfraction;
596 i1 = computeIndex(filter->start, dfrequency, frequencies);
597 i2 = computeIndex(filter->end, dfrequency, frequencies);
599 dfraction = i1 == i2 ? 0 : 1.0 / (i2 - i1);
601 for (i = i1; i <= i2; i++) {
602 outputRI[2 * i] += inputRI[2 * i] * fraction;
603 outputRI[2 * i + 1] += inputRI[2 * i + 1] * fraction;
604 if ((fraction -= dfraction) < 0)
607 for (i = 0; i < i1; i++) {
608 outputRI[2 * i] += inputRI[2 * i];
609 outputRI[2 * i + 1] += inputRI[2 * i + 1];
613void addNotchFilterOutput(
double *outputRI,
double *inputRI, int64_t frequencies,
double dfrequency,
NHBP_FILTER *filter) {
615 double fraction, dfraction;
617 i1 = computeIndex(filter->center - filter->fullwidth / 2, dfrequency, frequencies);
618 i2 = computeIndex(filter->center - filter->flatwidth / 2, dfrequency, frequencies);
619 for (i = 0; i < i1; i++) {
620 outputRI[2 * i] += inputRI[2 * i];
621 outputRI[2 * i + 1] += inputRI[2 * i + 1];
623 dfraction = i1 == i2 ? 0 : 1.0 / (i2 - i1);
625 for (i = i1; i <= i2; i++) {
626 outputRI[2 * i] += inputRI[2 * i] * fraction;
627 outputRI[2 * i + 1] += inputRI[2 * i + 1] * fraction;
628 if ((fraction -= dfraction) < 0)
632 i1 = computeIndex(filter->center + filter->flatwidth / 2, dfrequency, frequencies);
633 i2 = computeIndex(filter->center + filter->fullwidth / 2, dfrequency, frequencies);
634 for (i = i2; i < frequencies; i++) {
635 outputRI[2 * i] += inputRI[2 * i];
636 outputRI[2 * i + 1] += inputRI[2 * i + 1];
638 dfraction = i1 == i2 ? 0 : 1.0 / (i2 - i1);
640 for (i = i1; i <= i2; i++) {
641 outputRI[2 * i] += inputRI[2 * i] * fraction;
642 outputRI[2 * i + 1] += inputRI[2 * i + 1] * fraction;
643 if ((fraction += dfraction) > 1)
648void addBandPassFilterOutput(
double *outputRI,
double *inputRI, int64_t frequencies,
double dfrequency,
NHBP_FILTER *filter) {
650 double fraction, dfraction;
652 i1 = computeIndex(filter->center - filter->fullwidth / 2, dfrequency, frequencies);
653 i2 = computeIndex(filter->center - filter->flatwidth / 2, dfrequency, frequencies);
654 dfraction = i1 == i2 ? 0 : 1.0 / (i2 - i1);
656 for (i = i1; i <= i2; i++) {
657 outputRI[2 * i] += inputRI[2 * i] * fraction;
658 outputRI[2 * i + 1] += inputRI[2 * i + 1] * fraction;
659 if ((fraction += dfraction) > 1)
663 i1 = computeIndex(filter->center + filter->flatwidth / 2, dfrequency, frequencies);
664 i2 = computeIndex(filter->center + filter->fullwidth / 2, dfrequency, frequencies);
665 dfraction = i1 == i2 ? 0 : 1.0 / (i2 - i1);
667 for (i = i1; i <= i2; i++) {
668 outputRI[2 * i] += inputRI[2 * i] * fraction;
669 outputRI[2 * i + 1] += inputRI[2 * i + 1] * fraction;
670 if ((fraction -= dfraction) < 0)
674 i1 = computeIndex(filter->center - filter->flatwidth / 2, dfrequency, frequencies);
675 i2 = computeIndex(filter->center + filter->flatwidth / 2, dfrequency, frequencies);
676 for (i = i1; i <= i2; i++) {
677 outputRI[2 * i] += inputRI[2 * i];
678 outputRI[2 * i + 1] += inputRI[2 * i + 1];
682void addFileFilterOutput(
double *outputRI,
double *inputRI, int64_t frequencies,
double dfrequency,
FILE_FILTER *filter) {
685 double factor, ifactor, rfactor, rdata, idata, f;
687 if (!filter->freqData) {
694 fprintf(stderr,
"error: unable to read filter file %s (sddsfdfilter)\n", filter->file);
698 fprintf(stderr,
"error: file %s has no data on first page (sddsfdfilter)\n", filter->file);
707 for (i = 1; i < filter->points; i++)
708 if (filter->freqData[i - 1] >= filter->freqData[i]) {
709 fprintf(stderr,
"error: frequency data not monotonically increasing for %s (sddsfdfilter)\n", filter->file);
713 for (i = 0; i < frequencies; i++) {
715 if (filter->freqData[0] > f || filter->freqData[filter->points - 1] < f)
717 if (filter->magName) {
718 factor =
interp(filter->magData, filter->freqData, filter->points, f, 0, 1, &code);
719 outputRI[2 * i] += factor * inputRI[2 * i];
720 outputRI[2 * i + 1] += factor * inputRI[2 * i + 1];
722 rfactor =
interp(filter->realData, filter->freqData, filter->points, f, 0, 1, &code);
723 ifactor =
interp(filter->imagData, filter->freqData, filter->points, f, 0, 1, &code);
724 rdata = inputRI[2 * i];
725 idata = inputRI[2 * i + 1];
726 outputRI[2 * i] += rdata * rfactor - idata * ifactor;
727 outputRI[2 * i + 1] += rdata * ifactor + idata * rfactor;
732int64_t computeIndex(
double value,
double dfrequency, int64_t frequencies) {
735 i1 = value / dfrequency + 0.5;
738 if (i1 > frequencies - 1)
739 i1 = frequencies - 1;
743void addFilter(
FILTER_STAGE *filterStage,
long optionCode, SCANNED_ARG *scanned) {
753 if (!(filterStage->filter =
SDDS_Realloc(filterStage->filter,
sizeof(*filterStage->filter) * (filterStage->filters + 1))))
754 SDDS_Bomb(
"allocation failure adding filter slot");
755 filter = filterStage->filter;
756 filters = filterStage->filters;
757 filterStage->filters++;
759 items = scanned->n_items - 1;
760 item = scanned->list + 1;
761 switch (filter[filters].filterType = optionCode) {
763 if (!(thresholdFilter = filter[filters].filter = calloc(1,
sizeof(
THRESHOLD_FILTER))))
764 SDDS_Bomb(
"allocation failure allocating threshold filter");
767 if (!
scanItemList(&thresholdFilter->flags, item, &items, 0,
768 "level",
SDDS_DOUBLE, &thresholdFilter->level, 1, FILT_LEVEL_GIVEN,
769 "fractional", -1, NULL, 0, FILT_FRACTHRES_GIVEN,
770 "start",
SDDS_DOUBLE, &thresholdFilter->start, 1, FILT_START_GIVEN,
771 "end",
SDDS_DOUBLE, &thresholdFilter->end, 1, FILT_END_GIVEN, NULL))
772 SDDS_Bomb(
"invalid -threshold syntax/values");
773 if (!(thresholdFilter->flags & FILT_LEVEL_GIVEN))
774 SDDS_Bomb(
"supply level=<value> qualifier for -threshold");
775 if ((thresholdFilter->flags & FILT_START_GIVEN && thresholdFilter->flags & FILT_END_GIVEN) && thresholdFilter->start > thresholdFilter->end)
776 SDDS_Bomb(
"start > end for -threshold filter");
780 if (!(hiloFilter = filter[filters].filter = calloc(1,
sizeof(
HILO_FILTER))))
781 SDDS_Bomb(
"allocation failure allocating low-pass or high-pass filter");
783 "start",
SDDS_DOUBLE, &hiloFilter->start, 1, FILT_START_GIVEN,
784 "end",
SDDS_DOUBLE, &hiloFilter->end, 1, FILT_END_GIVEN, NULL))
785 SDDS_Bomb(
"invalid -highpass or -lowpass syntax");
786 if (!(hiloFilter->flags & FILT_START_GIVEN) || !(hiloFilter->flags & FILT_END_GIVEN))
787 SDDS_Bomb(
"supply start=<value> and end=<value> qualifiers with -highpass and -lowpass");
791 if (!(nhbpFilter = filter[filters].filter = calloc(1,
sizeof(
NHBP_FILTER))))
792 SDDS_Bomb(
"allocation failure allocating notch or bandpass filter");
794 "center",
SDDS_DOUBLE, &nhbpFilter->center, 1, FILT_CENTER_GIVEN,
795 "fullwidth",
SDDS_DOUBLE, &nhbpFilter->fullwidth, 1, FILT_FULLWIDTH_GIVEN,
796 "flatwidth",
SDDS_DOUBLE, &nhbpFilter->flatwidth, 1, FILT_FLATWIDTH_GIVEN, NULL))
797 SDDS_Bomb(
"invalid -notch or -bandpass syntax");
798 if (!(nhbpFilter->flags & FILT_CENTER_GIVEN) || !(nhbpFilter->flags & FILT_FLATWIDTH_GIVEN))
799 SDDS_Bomb(
"supply center=<value> and flatWidth=<value> qualifiers with -notch and -bandpass");
800 if (!(nhbpFilter->flags & FILT_FULLWIDTH_GIVEN))
801 nhbpFilter->fullwidth = nhbpFilter->flatwidth;
802 if (nhbpFilter->fullwidth < nhbpFilter->flatwidth)
803 SDDS_Bomb(
"full width may not be less than flat width for notch/bandpass filter");
806 if (!(fileFilter = filter[filters].filter = calloc(1,
sizeof(
FILE_FILTER))))
807 SDDS_Bomb(
"allocation failure allocating file filter");
809 "filename",
SDDS_STRING, &fileFilter->file, 1, FILT_FILENAME_GIVEN,
810 "frequency",
SDDS_STRING, &fileFilter->freqName, 1, FILT_FREQNAME_GIVEN,
811 "real",
SDDS_STRING, &fileFilter->realName, 1, FILT_REALNAME_GIVEN,
812 "imaginary",
SDDS_STRING, &fileFilter->imagName, 1, FILT_IMAGNAME_GIVEN,
813 "magnitude",
SDDS_STRING, &fileFilter->magName, 1, FILT_MAGNAME_GIVEN, NULL))
815 if (!(fileFilter->flags & FILT_FILENAME_GIVEN))
816 SDDS_Bomb(
"supply filename=<string> with -filterFile");
817 if (!(fileFilter->flags & FILT_FREQNAME_GIVEN))
818 SDDS_Bomb(
"supply frequency=<columnName> with -filterFile");
819 if (!(fileFilter->flags & FILT_MAGNAME_GIVEN) && !(fileFilter->flags & FILT_REALNAME_GIVEN && fileFilter->flags & FILT_IMAGNAME_GIVEN))
820 SDDS_Bomb(
"supply either magnitude=<columnName>, or real=<columnName> and imag=<columnName>, with -filterFile");
821 if (fileFilter->flags & FILT_MAGNAME_GIVEN && (fileFilter->flags & FILT_REALNAME_GIVEN || fileFilter->flags & FILT_IMAGNAME_GIVEN))
822 SDDS_Bomb(
"magnitude=<columnName> is incompatible with real=<columnName> and imag=<columnName> for -filterFile");
823 fileFilter->freqData = NULL;
826 if (!(clipFilter = filter[filters].filter = calloc(1,
sizeof(
CLIP_FILTER))))
827 SDDS_Bomb(
"allocation failure allocating clip filter");
829 "high",
SDDS_LONG, &clipFilter->high, 1, FILT_HIGH_GIVEN,
830 "low",
SDDS_LONG, &clipFilter->low, 1, FILT_LOW_GIVEN, NULL))
831 SDDS_Bomb(
"invalid -clipFrequencies syntax");
832 if (!(clipFilter->flags & FILT_HIGH_GIVEN) && !(clipFilter->flags & FILT_LOW_GIVEN))
833 SDDS_Bomb(
"supply at least one of high=<number> or low=<number> with -clipFrequencies");
836 SDDS_Bomb(
"invalid filter code---this shouldn't happen");
SDDS (Self Describing Data Set) Data Types Definitions and Function Prototypes.
int32_t SDDS_InitializeCopy(SDDS_DATASET *SDDS_target, SDDS_DATASET *SDDS_source, char *filename, char *filemode)
int32_t SDDS_CopyPage(SDDS_DATASET *SDDS_target, SDDS_DATASET *SDDS_source)
int32_t SDDS_SetColumnFromDoubles(SDDS_DATASET *SDDS_dataset, int32_t mode, double *data, int64_t rows,...)
Sets the values for a single data column using double-precision floating-point numbers.
int32_t SDDS_WritePage(SDDS_DATASET *SDDS_dataset)
Writes the current data table to the output file.
int32_t SDDS_WriteLayout(SDDS_DATASET *SDDS_dataset)
Writes the SDDS layout header to the output file.
int32_t SDDS_TransferColumnDefinition(SDDS_DATASET *target, SDDS_DATASET *source, char *name, char *newName)
Transfers a column definition from a source dataset to a target dataset.
int32_t SDDS_CheckColumn(SDDS_DATASET *SDDS_dataset, char *name, char *units, int32_t type, FILE *fp_message)
Checks if a column exists in the SDDS dataset with the specified name, units, and type.
void SDDS_PrintErrors(FILE *fp, int32_t mode)
Prints recorded error messages to a specified file stream.
void SDDS_RegisterProgramName(const char *name)
Registers the executable program name for use in error messages.
void SDDS_Bomb(char *message)
Terminates the program after printing an error message and recorded errors.
void * SDDS_Realloc(void *old_ptr, size_t new_size)
Reallocates memory to a new size.
#define SDDS_STRING
Identifier for the string data type.
#define SDDS_LONG
Identifier for the signed 32-bit integer data type.
#define SDDS_ANY_NUMERIC_TYPE
Special identifier used by SDDS_Check*() routines to accept any numeric type.
#define SDDS_DOUBLE
Identifier for the double data type.
Utility functions for SDDS dataset manipulation and string array operations.
void * tmalloc(uint64_t size_of_block)
Allocates a memory block of the specified size with zero initialization.
void bomb(char *error, char *usage)
Reports error messages to the terminal and aborts the program.
double interp(double *f, double *x, long n, double xo, long warnings, long order, long *returnCode)
Performs simple linear interpolation of data.
long match_string(char *string, char **option, long n_options, long mode)
Matches a given string against an array of option strings based on specified modes.
int scanargs(SCANNED_ARG **scanned, int argc, char **argv)
long processPipeOption(char **item, long items, unsigned long *flags)
void processFilenames(char *programName, char **input, char **output, unsigned long pipeFlags, long noWarnings, long *tmpOutputUsed)
long scanItemList(unsigned long *flags, char **item, long *items, unsigned long mode,...)
Scans a list of items and assigns values based on provided keywords and types.