124char *option[N_OPTIONS] = {
129 "standarddeviations",
139 "wstandarddeviations",
154char *optionSuffix[N_OPTIONS] = {
189 char *weightColumnName;
190 long optionCode, sumPower;
192 char *percentileString;
201 char *sourceColumn, *weightColumn, *resultColumn, *functionOf;
202 long optionCode, resultIndex, sumPower;
204 char *percentileString;
207 double *value1, *value2, *value3, *value4;
212long addStatRequests(
STAT_REQUEST **statRequest,
long requests,
char **item,
long items,
long code,
double percentile,
long power,
char *functionOf,
long weighted,
char *percentileString);
217int compute_mean_exclude_min_max(
double *value,
double *data,
long n);
219static char *USAGE =
"sddsenvelope [<input>] [<output>] [options]\n"
220 " [-pipe=[input][,output]]\n"
222 " [-maximum=<column-names>]\n"
223 " [-minimum=<column-names>]\n"
224 " [-cmaximum=<indep-column>,<column-names>]\n"
225 " [-cminimum=<indep-column>,<column-names>]\n"
226 " [-pmaximum=<indep-parameter>,<column-names>]\n"
227 " [-pminimum=<indep-parameter>,<column-names>]\n"
228 " [-largest=<column-names>]\n"
229 " [-signedLargest=<column-names>]\n"
230 " [-mean=<column-names>]\n"
231 " [-sum=<power>,<column-names>]\n"
232 " [-median=<column-names>]\n"
233 " [-decilerange=<column-names>]\n"
234 " [-percentile=<percentage>,<column-names>]\n"
235 " [-standarddeviation=<column-names>]\n"
236 " [-rms=<column-names>]\n"
237 " [-sigma=<column-names>]\n"
238 " [-slope=<indep-parameter>,<column-names>]\n"
239 " [-intercept=<indep-parameter>,<column-names>]\n"
240 " [-wmean=<weightColumn>,<columnNames>]\n"
241 " [-wstandarddeviation=<weightColumn>,<columnNames>]\n"
242 " [-wrms=<weightColumn>,<columnNames>]\n"
243 " [-wsigma=<weightColumn>,<columnNames>]\n"
244 " [-majorOrder=row|column]\n"
246 " -copy=<column-names> Copy specified columns.\n"
247 " -pipe=[input][,output] Use pipe for input/output.\n"
248 " -nowarnings Suppress warnings.\n"
249 " -maximum=<column-names> Compute maximum values.\n"
250 " -minimum=<column-names> Compute minimum values.\n"
251 " -cmaximum=<indep-column>,<column-names> Conditional maximum based on an independent column.\n"
252 " -cminimum=<indep-column>,<column-names> Conditional minimum based on an independent column.\n"
253 " -pmaximum=<indep-parameter>,<column-names> Parameter-based maximum.\n"
254 " -pminimum=<indep-parameter>,<column-names> Parameter-based minimum.\n"
255 " -largest=<column-names> Compute the largest absolute values.\n"
256 " -signedLargest=<column-names> Compute the largest signed values.\n"
257 " -mean=<column-names> Compute mean values.\n"
258 " -sum=<power>,<column-names> Compute sum with power.\n"
259 " -median=<column-names> Compute median values.\n"
260 " -decilerange=<column-names> Compute decile range.\n"
261 " -percentile=<percentage>,<column-names> Compute specified percentile.\n"
262 " -standarddeviation=<column-names> Compute standard deviations.\n"
263 " -rms=<column-names> Compute RMS values.\n"
264 " -sigma=<column-names> Compute sigma values.\n"
265 " -slope=<indep-parameter>,<column-names> Compute slope for linear fit.\n"
266 " -intercept=<indep-parameter>,<column-names> Compute intercept for linear fit.\n"
267 " -wmean=<weightColumn>,<columnNames> Compute weighted mean.\n"
268 " -wstandarddeviation=<weightColumn>,<columnNames> Compute weighted standard deviation.\n"
269 " -wrms=<weightColumn>,<columnNames> Compute weighted RMS.\n"
270 " -wsigma=<weightColumn>,<columnNames> Compute weighted sigma.\n"
271 " -majorOrder=row|column Set major order.\n\n"
272 "Processes pages from <input> to produce <output> with\n"
273 "one page containing the specified quantities across pages\n"
274 "for each row of the specified columns.\n"
275 "Program by Michael Borland. (" __DATE__
" " __TIME__
", SVN revision: " SVN_VERSION
")";
277int main(
int argc,
char **argv) {
282 SCANNED_ARG *scanned;
284 long i_arg, code, power, iStat, pages, nowarnings = 0;
285 int64_t i, rows, firstRows;
286 char *input, *output;
287 double *inputData, *otherData, indepData, *weight;
288 unsigned long pipeFlags, majorOrderFlag;
289 double decilePoint[2] = {10.0, 90.0}, decileResult[2];
290 double percentilePoint, percentileResult;
292 short columnMajorOrder = -1;
295 argc =
scanargs(&scanned, argc, argv);
297 bomb(
"too few arguments", USAGE);
301 input = output = NULL;
304 stats = requests = pipeFlags = 0;
305 rows = firstRows = i = 0;
307 for (i_arg = 1; i_arg < argc; i_arg++) {
308 if (scanned[i_arg].arg_type == OPTION) {
310 switch (code =
match_string(scanned[i_arg].list[0], option, N_OPTIONS, 0)) {
315 case SET_SIGNEDLARGEST:
323 if (scanned[i_arg].n_items < 2) {
324 fprintf(stderr,
"error: invalid -%s syntax\n", option[code]);
327 requests = addStatRequests(&request, requests, scanned[i_arg].list + 1, scanned[i_arg].n_items - 1, code, 0, 0, NULL, 0, NULL);
333 if (scanned[i_arg].n_items < 3) {
334 fprintf(stderr,
"error: invalid -%s syntax\n", option[code]);
338 requests = addStatRequests(&request, requests, scanned[i_arg].list + 1, scanned[i_arg].n_items - 1, code, 0, 0, NULL, 1, NULL);
341 if (scanned[i_arg].n_items < 3) {
342 fprintf(stderr,
"error: invalid -%s syntax\n", option[code]);
345 if (sscanf(scanned[i_arg].list[1],
"%ld", &power) != 1 || power < 1) {
346 fprintf(stderr,
"error: invalid -%s syntax--bad power in field %s\n", option[code], scanned[i_arg].list[2]);
349 requests = addStatRequests(&request, requests, scanned[i_arg].list + 2, scanned[i_arg].n_items - 2, code, 0, power, NULL, 0, NULL);
352 if (scanned[i_arg].n_items < 3) {
353 fprintf(stderr,
"error: invalid -%s syntax\n", option[code]);
356 if (sscanf(scanned[i_arg].list[1],
"%lf", &percentile) != 1 || percentile < 0 || percentile > 100) {
357 fprintf(stderr,
"error: invalid -%s syntax--bad percentage in field %s\n", option[code], scanned[i_arg].list[1]);
360 requests = addStatRequests(&request, requests, scanned[i_arg].list + 2, scanned[i_arg].n_items - 2, code, percentile, 0, NULL, 0, scanned[i_arg].list[1]);
368 if (scanned[i_arg].n_items < 3) {
369 fprintf(stderr,
"error: invalid -%s syntax\n", option[code]);
372 requests = addStatRequests(&request, requests, scanned[i_arg].list + 2, scanned[i_arg].n_items - 2, code, 0, 0, scanned[i_arg].list[1], 0, NULL);
375 if (!
processPipeOption(scanned[i_arg].list + 1, scanned[i_arg].n_items - 1, &pipeFlags))
381 case SET_MAJOR_ORDER:
383 scanned[i_arg].n_items--;
384 if (scanned[i_arg].n_items > 0 && (!
scanItemList(&majorOrderFlag, scanned[i_arg].list + 1, &scanned[i_arg].n_items, 0,
"row", -1, NULL, 0, SDDS_ROW_MAJOR_ORDER,
"column", -1, NULL, 0, SDDS_COLUMN_MAJOR_ORDER, NULL)))
385 SDDS_Bomb(
"invalid -majorOrder syntax/values");
386 if (majorOrderFlag & SDDS_COLUMN_MAJOR_ORDER)
387 columnMajorOrder = 1;
388 else if (majorOrderFlag & SDDS_ROW_MAJOR_ORDER)
389 columnMajorOrder = 0;
392 fprintf(stderr,
"error: unknown option '%s' given\n", scanned[i_arg].list[0]);
399 input = scanned[i_arg].list[0];
401 output = scanned[i_arg].list[0];
419 SDDS_Bomb(
"empty data page in input file");
422 if (!(stat = compileStatDefinitions(&inTable, &stats, request, requests))) {
426 if (!setupOutputFile(&outTable, output, &inTable, stat, stats, rows, columnMajorOrder)) {
430 fprintf(stderr,
"Error setting up output file.\n");
433 }
else if (firstRows != rows)
434 SDDS_Bomb(
"inconsistent number of rows in input file");
435 for (iStat = 0; iStat < stats; iStat++) {
436 if (stat[iStat].optionCode == SET_COPY) {
437 if (code == 1 && !(stat[iStat].copy =
SDDS_GetColumn(&inTable, stat[iStat].sourceColumn)))
441 stat[iStat].copy = NULL;
444 switch (stat[iStat].optionCode) {
447 for (i = 0; i < rows; i++)
448 stat[iStat].value1[i] = inputData[i];
450 for (i = 0; i < rows; i++)
451 if (stat[iStat].value1[i] > inputData[i])
452 stat[iStat].value1[i] = inputData[i];
456 for (i = 0; i < rows; i++)
457 stat[iStat].value1[i] = inputData[i];
459 for (i = 0; i < rows; i++)
460 if (stat[iStat].value1[i] < inputData[i])
461 stat[iStat].value1[i] = inputData[i];
468 for (i = 0; i < rows; i++) {
469 stat[iStat].value2[i] = inputData[i];
470 stat[iStat].value1[i] = otherData[i];
473 for (i = 0; i < rows; i++)
474 if (stat[iStat].value2[i] > inputData[i]) {
475 stat[iStat].value2[i] = inputData[i];
476 stat[iStat].value1[i] = otherData[i];
485 for (i = 0; i < rows; i++) {
486 stat[iStat].value2[i] = inputData[i];
487 stat[iStat].value1[i] = otherData[i];
490 for (i = 0; i < rows; i++)
491 if (stat[iStat].value2[i] < inputData[i]) {
492 stat[iStat].value2[i] = inputData[i];
493 stat[iStat].value1[i] = otherData[i];
499 for (i = 0; i < rows; i++)
500 stat[iStat].value1[i] = fabs(inputData[i]);
502 for (i = 0; i < rows; i++)
503 if (stat[iStat].value1[i] < fabs(inputData[i]))
504 stat[iStat].value1[i] = fabs(inputData[i]);
506 case SET_SIGNEDLARGEST:
508 for (i = 0; i < rows; i++)
509 stat[iStat].value1[i] = inputData[i];
511 for (i = 0; i < rows; i++)
512 if (fabs(stat[iStat].value1[i]) < fabs(inputData[i]))
513 stat[iStat].value1[i] = inputData[i];
517 for (i = 0; i < rows; i++)
518 stat[iStat].value1[i] = inputData[i];
520 for (i = 0; i < rows; i++)
521 stat[iStat].value1[i] += inputData[i];
526 for (i = 0; i < rows; i++) {
527 stat[iStat].sumWeight[i] += weight[i];
528 stat[iStat].value1[i] += inputData[i] * weight[i];
535 for (i = 0; i < rows; i++) {
536 stat[iStat].value1[i] = inputData[i];
537 stat[iStat].value2[i] = inputData[i] * inputData[i];
540 for (i = 0; i < rows; i++) {
541 stat[iStat].value1[i] += inputData[i];
542 stat[iStat].value2[i] += inputData[i] * inputData[i];
549 for (i = 0; i < rows; i++) {
550 stat[iStat].sumWeight[i] += weight[i];
551 stat[iStat].value1[i] += inputData[i] * weight[i];
552 stat[iStat].value2[i] += inputData[i] * inputData[i] * weight[i];
558 for (i = 0; i < rows; i++)
559 stat[iStat].value1[i] = inputData[i] * inputData[i];
561 for (i = 0; i < rows; i++)
562 stat[iStat].value1[i] += inputData[i] * inputData[i];
567 for (i = 0; i < rows; i++) {
568 stat[iStat].sumWeight[i] += weight[i];
569 stat[iStat].value1[i] += inputData[i] * inputData[i] * weight[i];
575 for (i = 0; i < rows; i++)
576 stat[iStat].value1[i] =
ipow(inputData[i], stat[iStat].sumPower);
578 for (i = 0; i < rows; i++)
579 stat[iStat].value1[i] +=
ipow(inputData[i], stat[iStat].sumPower);
583 fprintf(stderr,
"error: unable to get value of parameter %s\n", stat[iStat].functionOf);
587 for (i = 0; i < rows; i++) {
588 stat[iStat].value2[i] = inputData[i];
589 stat[iStat].value1[i] = indepData;
592 for (i = 0; i < rows; i++) {
593 if (stat[iStat].value2[i] > inputData[i]) {
594 stat[iStat].value2[i] = inputData[i];
595 stat[iStat].value1[i] = indepData;
601 fprintf(stderr,
"error: unable to get value of parameter %s\n", stat[iStat].functionOf);
605 for (i = 0; i < rows; i++) {
606 stat[iStat].value2[i] = inputData[i];
607 stat[iStat].value1[i] = indepData;
610 for (i = 0; i < rows; i++) {
611 if (stat[iStat].value2[i] < inputData[i]) {
612 stat[iStat].value2[i] = inputData[i];
613 stat[iStat].value1[i] = indepData;
620 fprintf(stderr,
"error: unable to get value of parameter %s\n", stat[iStat].functionOf);
630 for (i = 0; i < rows; i++) {
631 stat[iStat].value1[i] = indepData;
632 stat[iStat].value2[i] = indepData * indepData;
633 stat[iStat].value3[i] = inputData[i];
634 stat[iStat].value4[i] = indepData * inputData[i];
637 for (i = 0; i < rows; i++) {
638 stat[iStat].value1[i] += indepData;
639 stat[iStat].value2[i] += indepData * indepData;
640 stat[iStat].value3[i] += inputData[i];
641 stat[iStat].value4[i] += indepData * inputData[i];
649 for (i = 0; i < rows; i++) {
650 stat[iStat].array[i] =
tmalloc(
sizeof(*stat[iStat].array[i]));
651 stat[iStat].array[i][pages - 1] = inputData[i];
654 for (i = 0; i < rows; i++) {
655 stat[iStat].array[i] =
SDDS_Realloc(stat[iStat].array[i],
sizeof(*stat[iStat].array[i]) * pages);
656 stat[iStat].array[i][pages - 1] = inputData[i];
661 SDDS_Bomb(
"invalid statistic code (accumulation loop)");
669 for (iStat = 0; iStat < stats; iStat++) {
670 switch (stat[iStat].optionCode) {
679 case SET_SIGNEDLARGEST:
683 for (i = 0; i < rows; i++)
684 stat[iStat].value1[i] /= pages;
687 for (i = 0; i < rows; i++)
688 if (stat[iStat].sumWeight[i])
689 stat[iStat].value1[i] /= stat[iStat].sumWeight[i];
692 fprintf(stderr,
"warning: the total weight for the %" PRId64
"th row of %s is zero.\n", i + 1, stat[iStat].sourceColumn);
693 stat[iStat].value1[i] = DBL_MAX;
698 stat[iStat].value1[i] = DBL_MAX;
700 for (i = 0; i < rows; i++) {
702 if ((tmp1 = stat[iStat].value2[i] / pages - sqr(stat[iStat].value1[i] / pages)) <= 0)
703 stat[iStat].value1[i] = 0;
705 stat[iStat].value1[i] = sqrt(tmp1 * pages / (pages - 1.0));
710 stat[iStat].value1[i] = DBL_MAX;
712 for (i = 0; i < rows; i++) {
714 if (stat[iStat].sumWeight[i]) {
715 if ((tmp1 = stat[iStat].value2[i] / stat[iStat].sumWeight[i] - sqr(stat[iStat].value1[i] / stat[iStat].sumWeight[i])) <= 0)
716 stat[iStat].value1[i] = 0;
718 stat[iStat].value1[i] = sqrt(tmp1 * pages / (pages - 1.0));
721 fprintf(stderr,
"Warning, the total weight for the %" PRId64
"th row of %s is zero.\n", i + 1, stat[iStat].sourceColumn);
722 stat[iStat].value1[i] = DBL_MAX;
728 stat[iStat].value1[i] = DBL_MAX;
730 for (i = 0; i < rows; i++) {
732 if ((tmp1 = stat[iStat].value2[i] / pages - sqr(stat[iStat].value1[i] / pages)) <= 0)
733 stat[iStat].value1[i] = 0;
735 stat[iStat].value1[i] = sqrt(tmp1 / (pages - 1.0));
740 stat[iStat].value1[i] = DBL_MAX;
742 for (i = 0; i < rows; i++) {
744 if (stat[iStat].sumWeight[i]) {
745 if ((tmp1 = stat[iStat].value2[i] / stat[iStat].sumWeight[i] - sqr(stat[iStat].value1[i] / stat[iStat].sumWeight[i])) <= 0)
746 stat[iStat].value1[i] = 0;
748 stat[iStat].value1[i] = sqrt(tmp1 / (pages - 1.0));
751 fprintf(stderr,
"Warning, the total weight for the %" PRId64
"th row of %s is zero.\n", i + 1, stat[iStat].sourceColumn);
752 stat[iStat].value1[i] = DBL_MAX;
757 for (i = 0; i < rows; i++)
758 stat[iStat].value1[i] = sqrt(stat[iStat].value1[i] / pages);
761 for (i = 0; i < rows; i++) {
762 if (stat[iStat].sumWeight[i])
763 stat[iStat].value1[i] = sqrt(stat[iStat].value1[i] / stat[iStat].sumWeight[i]);
766 fprintf(stderr,
"Warning, the total weight for the %" PRId64
"th row of %s is zero.\n", i + 1, stat[iStat].sourceColumn);
767 stat[iStat].value1[i] = DBL_MAX;
772 for (i = 0; i < rows; i++) {
774 D = pages * stat[iStat].value2[i] - stat[iStat].value1[i] * stat[iStat].value1[i];
775 stat[iStat].value1[i] = (pages * stat[iStat].value4[i] - stat[iStat].value1[i] * stat[iStat].value3[i]) / D;
779 for (i = 0; i < rows; i++) {
781 D = pages * stat[iStat].value2[i] - stat[iStat].value1[i] * stat[iStat].value1[i];
782 stat[iStat].value1[i] = (stat[iStat].value2[i] * stat[iStat].value3[i] - stat[iStat].value1[i] * stat[iStat].value4[i]) / D;
786 for (i = 0; i < rows; i++) {
787 compute_median(&stat[iStat].value1[i], stat[iStat].array[i], pages);
791 for (i = 0; i < rows; i++) {
793 stat[iStat].value1[i] = 0;
795 stat[iStat].value1[i] = decileResult[1] - decileResult[0];
799 percentilePoint = stat[iStat].percentile;
800 for (i = 0; i < rows; i++) {
801 if (!
compute_percentiles(&percentileResult, &percentilePoint, 1, stat[iStat].array[i], pages))
802 stat[iStat].value1[i] = 0;
804 stat[iStat].value1[i] = percentileResult;
808 for (i = 0; i < rows; i++)
809 if (!compute_mean_exclude_min_max(&(stat[iStat].value1[i]), stat[iStat].array[i], pages))
810 stat[iStat].value1[i] = 0;
813 SDDS_Bomb(
"invalid statistic code (final loop)");
816 if (stat[iStat].optionCode == SET_COPY) {
817 if (!
SDDS_SetColumn(&outTable, SDDS_SET_BY_NAME, stat[iStat].copy, rows, stat[iStat].resultColumn)) {
818 fprintf(stderr,
"error setting column values for column %s\n", stat[iStat].resultColumn);
821 }
else if (!
SDDS_SetColumnFromDoubles(&outTable, SDDS_SET_BY_NAME, stat[iStat].value1, rows, stat[iStat].resultColumn)) {
822 fprintf(stderr,
"error setting column values for column %s\n", stat[iStat].resultColumn);
825 if (stat[iStat].value1)
826 free(stat[iStat].value1);
827 if (stat[iStat].value2)
828 free(stat[iStat].value2);
829 if (stat[iStat].value3)
830 free(stat[iStat].value3);
831 if (stat[iStat].value4)
832 free(stat[iStat].value4);
833 if (stat[iStat].copy)
834 free(stat[iStat].copy);
835 if (stat[iStat].array) {
836 for (i = 0; i < rows; i++) {
837 free(stat[iStat].array[i]);
839 free(stat[iStat].array);
841 if (stat[iStat].sumWeight)
842 free(stat[iStat].sumWeight);
843 free(stat[iStat].sourceColumn);
844 free(stat[iStat].resultColumn);
845 stat[iStat].value1 = stat[iStat].value2 = stat[iStat].value3 = stat[iStat].value4 = NULL;
846 stat[iStat].copy = NULL;
847 stat[iStat].array = NULL;
855long addStatRequests(
STAT_REQUEST **statRequest,
long requests,
char **item,
long items,
long code,
double percentile,
long power,
char *functionOf,
long weighted,
char *percentileString) {
858 if (weighted != 0 && weighted != 1)
859 SDDS_Bomb(
"addStatRequests: weighted parameter should be either 0 or 1");
860 if (code == SET_PERCENTILE && (!percentileString || !strlen(percentileString))) {
861 fprintf(stderr,
"Percentile specification is incorrect: percentile=%e, percentileString=%s\n", percentile, percentileString ? percentileString :
"NULL");
864 *statRequest =
SDDS_Realloc(*statRequest,
sizeof(**statRequest) * (requests + items - weighted));
865 for (i = 0; i < items - weighted; i++) {
867 (*statRequest)[requests + i].weightColumnName = item[0];
869 (*statRequest)[requests + i].weightColumnName = NULL;
870 (*statRequest)[i + requests].columnName = item[i + weighted];
871 (*statRequest)[i + requests].optionCode = code;
872 (*statRequest)[i + requests].sumPower = power;
873 (*statRequest)[i + requests].percentile = percentile;
874 (*statRequest)[i + requests].percentileString = percentileString;
875 (*statRequest)[i + requests].functionOf = functionOf;
878 return items + requests - weighted;
883 long iReq, iStat, iName;
885 char s[SDDS_MAXLINE];
889 stat =
tmalloc(
sizeof(*stat) * requests);
890 for (iReq = 0; iReq < requests; iReq++) {
892 stat =
SDDS_Realloc(stat,
sizeof(*stat) * (*stats += 10));
895 sprintf(s,
"error: column %s not found input file", request[iReq].columnName);
899 stat[iStat].weightColumn = request[iReq].weightColumnName;
900 stat[iStat].sourceColumn = request[iReq].columnName;
901 stat[iStat].optionCode = request[iReq].optionCode;
902 stat[iStat].percentile = request[iReq].percentile;
903 stat[iStat].percentileString = request[iReq].percentileString;
904 stat[iStat].sumPower = request[iReq].sumPower;
905 stat[iStat].value1 = stat[iStat].value2 = stat[iStat].value3 = stat[iStat].value4 = NULL;
906 stat[iStat].array = NULL;
907 stat[iStat].copy = NULL;
908 stat[iStat].sumWeight = NULL;
909 if ((stat[iStat].functionOf = request[iReq].functionOf)) {
910 if (stat[iStat].optionCode != SET_CMAXIMA && stat[iStat].optionCode != SET_CMINIMA) {
912 sprintf(s,
"error: parameter %s not found input file (1)", request[iReq].functionOf);
918 sprintf(s,
"error: column %s not found input file (1)", request[iReq].functionOf);
930 sprintf(s,
"no columns selected for wildcard sequence %s", request[iReq].columnName);
934 if (iStat + columnNames > *stats)
935 stat =
SDDS_Realloc(stat,
sizeof(*stat) * (*stats = iStat + columnNames + 10));
936 for (iName = 0; iName < columnNames; iName++) {
937 stat[iStat + iName].weightColumn = request[iReq].weightColumnName;
938 stat[iStat + iName].sourceColumn = columnName[iName];
939 stat[iStat + iName].optionCode = request[iReq].optionCode;
940 stat[iStat + iName].sumPower = request[iReq].sumPower;
941 stat[iStat + iName].percentile = request[iReq].percentile;
942 stat[iStat + iName].percentileString = request[iReq].percentileString;
943 stat[iStat + iName].value1 = stat[iStat + iName].value2 = stat[iStat + iName].value3 = stat[iStat + iName].value4 = NULL;
944 stat[iStat + iName].array = NULL;
945 stat[iStat + iName].copy = NULL;
946 stat[iStat + iName].sumWeight = NULL;
947 if ((stat[iStat + iName].functionOf = request[iReq].functionOf) && iName == 0) {
948 if (stat[iStat + iName].optionCode != SET_CMAXIMA && stat[iStat + iName].optionCode != SET_CMINIMA) {
950 sprintf(s,
"error: parameter %s not found input file (2)", request[iReq].functionOf);
956 sprintf(s,
"error: column %s not found input file (2)", request[iReq].functionOf);
963 iStat += columnNames;
969 for (iStat = 0; iStat < *stats; iStat++) {
970 switch (stat[iStat].optionCode) {
972 strcpy(s, stat[iStat].sourceColumn);
975 if (stat[iStat].sumPower == 1)
976 sprintf(s,
"%s%s", stat[iStat].sourceColumn, optionSuffix[stat[iStat].optionCode]);
978 sprintf(s,
"%s%ld%s", stat[iStat].sourceColumn, stat[iStat].sumPower, optionSuffix[stat[iStat].optionCode]);
981 sprintf(s,
"%s%s%s", stat[iStat].sourceColumn, stat[iStat].percentileString, optionSuffix[stat[iStat].optionCode]);
985 sprintf(s,
"%s%s%s", stat[iStat].functionOf, optionSuffix[stat[iStat].optionCode], stat[iStat].sourceColumn);
989 sprintf(s,
"%s%s%s", stat[iStat].functionOf, optionSuffix[stat[iStat].optionCode], stat[iStat].sourceColumn);
992 sprintf(s,
"%s%s", stat[iStat].sourceColumn, optionSuffix[stat[iStat].optionCode]);
1003 char s[SDDS_MAXLINE], *symbol, *symbol1, *units1;
1007 if (columnMajorOrder != -1)
1008 outTable->layout.data_mode.column_major = columnMajorOrder;
1010 outTable->layout.data_mode.column_major = inTable->layout.data_mode.column_major;
1011 for (column = 0; column < stats; column++) {
1012 stat[column].value1 = calloc(
sizeof(*stat[column].value1), rows);
1013 stat[column].value2 = stat[column].value3 = stat[column].value4 = NULL;
1014 if (stat[column].optionCode == SET_SDS || stat[column].optionCode == SET_SIGMAS ||
1015 stat[column].optionCode == SET_WSDS || stat[column].optionCode == SET_WSIGMAS ||
1016 stat[column].optionCode == SET_PMINIMA || stat[column].optionCode == SET_PMAXIMA ||
1017 stat[column].optionCode == SET_CMINIMA || stat[column].optionCode == SET_CMAXIMA)
1018 stat[column].value2 = calloc(
sizeof(*stat[column].value2), rows);
1019 if (stat[column].optionCode == SET_INTERCEPT || stat[column].optionCode == SET_SLOPE) {
1020 stat[column].value2 = malloc(
sizeof(*stat[column].value2) * rows);
1021 stat[column].value3 = malloc(
sizeof(*stat[column].value3) * rows);
1022 stat[column].value4 = malloc(
sizeof(*stat[column].value4) * rows);
1024 if (stat[column].optionCode == SET_WSDS || stat[column].optionCode == SET_WSIGMAS ||
1025 stat[column].optionCode == SET_WRMSS || stat[column].optionCode == SET_WMEANS)
1026 stat[column].sumWeight = calloc(
sizeof(*stat[column].sumWeight), rows);
1027 if (stat[column].optionCode == SET_MEDIAN || stat[column].optionCode == SET_DRANGE ||
1028 stat[column].optionCode == SET_PERCENTILE || stat[column].optionCode == SET_EXMM_MEAN) {
1029 stat[column].array =
tmalloc(
sizeof(*stat[column].array) * rows);
1032 sprintf(s,
"Problem transferring definition of column %s to %s\n", stat[column].sourceColumn, stat[column].resultColumn);
1038 fprintf(stderr,
"Error: problem setting description for column %s\n", stat[column].resultColumn);
1041 if (stat[column].optionCode > 0) {
1043 fprintf(stderr,
"Error: problem setting type for column %s\n", stat[column].resultColumn);
1049 switch (stat[column].optionCode) {
1054 if (stat[column].sumPower == 1)
1055 sprintf(s,
"%s[%s]", optionSuffix[stat[column].optionCode], symbol);
1057 sprintf(s,
"%s[%s$a%ld$n]", optionSuffix[stat[column].optionCode], symbol, stat[column].sumPower);
1059 case SET_PERCENTILE:
1060 sprintf(s,
"%s[%s,%g]", optionSuffix[stat[column].optionCode], symbol, stat[column].percentile);
1067 symbol1 = stat[column].functionOf;
1068 sprintf(s,
"%s[%s:%s]", optionSuffix[stat[column].optionCode], symbol, symbol1);
1073 fprintf(stderr,
"Error: problem setting units for column %s (1)\n", stat[column].resultColumn);
1077 fprintf(stderr,
"Error: problem setting units for column %s (2)\n", stat[column].resultColumn);
1086 symbol1 = stat[column].functionOf;
1087 sprintf(s,
"%s[%s:%s]", optionSuffix[stat[column].optionCode], symbol, symbol1);
1092 fprintf(stderr,
"Error: problem setting units for column %s\n", stat[column].resultColumn);
1096 fprintf(stderr,
"Error: problem setting units for column %s\n", stat[column].resultColumn);
1105 symbol1 = stat[column].functionOf;
1106 sprintf(s,
"%s[%s:%s]", optionSuffix[stat[column].optionCode], symbol, symbol1);
1109 sprintf(s,
"%s[%s]", optionSuffix[stat[column].optionCode], symbol);
1114 fprintf(stderr,
"Error: problem setting symbol for column %s\n", stat[column].resultColumn);
1123int compute_mean_exclude_min_max(
double *value,
double *data,
long n) {
1127 max = -(min = DBL_MAX);
1128 if (n <= 0 || !data || !value)
1130 for (i = 0; i < n; i++) {
1136 for (i = 0; i < n; i++) {
1137 if (data[i] == min || data[i] == max)
1145 *value = sum / count;
SDDS (Self Describing Data Set) Data Types Definitions and Function Prototypes.
int32_t SDDS_StartPage(SDDS_DATASET *SDDS_dataset, int64_t expected_n_rows)
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_SetColumn(SDDS_DATASET *SDDS_dataset, int32_t mode, void *data, int64_t rows,...)
Sets the values for one data column in the current data table of an SDDS dataset.
int32_t SDDS_GetParameterInformation(SDDS_DATASET *SDDS_dataset, char *field_name, void *memory, int32_t mode,...)
Retrieves information about a specified parameter in the SDDS dataset.
int32_t SDDS_ChangeColumnInformation(SDDS_DATASET *SDDS_dataset, char *field_name, void *memory, int32_t mode,...)
Modifies a specific field in a column definition within the SDDS dataset.
int32_t SDDS_GetColumnInformation(SDDS_DATASET *SDDS_dataset, char *field_name, void *memory, int32_t mode,...)
Retrieves information about a specified column in the SDDS dataset.
int32_t SDDS_InitializeOutput(SDDS_DATASET *SDDS_dataset, int32_t data_mode, int32_t lines_per_row, const char *description, const char *contents, const char *filename)
Initializes the SDDS output dataset.
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.
void SDDS_SetError(char *error_text)
Records an error message in the SDDS error stack.
int32_t SDDS_GetParameterIndex(SDDS_DATASET *SDDS_dataset, char *name)
Retrieves the index of a named parameter in the SDDS dataset.
int32_t SDDS_GetColumnIndex(SDDS_DATASET *SDDS_dataset, char *name)
Retrieves the index of a named column in the SDDS dataset.
char ** SDDS_GetColumnNames(SDDS_DATASET *SDDS_dataset, int32_t *number)
Retrieves the names of all columns in the SDDS dataset.
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.
int32_t SDDS_NumberOfErrors()
Retrieves the number of errors recorded by SDDS library routines.
void SDDS_Bomb(char *message)
Terminates the program after printing an error message and recorded errors.
int32_t SDDS_CopyString(char **target, const char *source)
Copies a source string to a target string with memory allocation.
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.
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 ipow(const double x, const int64_t p)
Compute x raised to the power p (x^p).
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.
int has_wildcards(char *template)
Check if a template string contains any wildcard characters.