89char *option[N_OPTIONS] = {
104 "Usage: sddslorentzianfit [<inputfile>] [<outputfile>]\n"
105 " [-pipe=[input][,output]]\n"
106 " -columns=<x-name>,<y-name>[,ySigma=<sy-name>]\n"
107 " [-fitRange=<lower>|@<parameter-name>,<upper>|@<parameter-name>]\n"
109 " [-verbosity=<integer>] \n"
110 " [-stepSize=<factor>] \n"
111 " [-tolerance=<value>]\n"
112 " [-guesses=[baseline=<value>|@<parameter-name>][,center=<value>|@<parameter-name>]\n"
113 " [,height=<value>|@<parameter-name>][,gamma=<value>|@<parameter-name>]] \n"
114 " [-fixValue=[baseline=<value>|@<parameter-name>][,center=<value>|@<parameter-name>]\n"
115 " [,height=<value>|@<parameter-name>][,gamma=<value>|@<parameter-name>]]\n"
116 " [-limits=[evaluations=<number>][,passes=<number>]] \n"
117 " [-majorOrder=row|column] \n"
119 " -pipe=<input>,<output> Use standard input/output pipes.\n"
120 " -columns=<x-name>,<y-name>[,ySigma=<sy-name>]\n"
121 " Specify the names of the x and y data columns,\n"
122 " and optionally the y sigma column.\n"
123 " -fitRange=<lower>|@<param>,<upper>|@<param>\n"
124 " Define the fitting range with lower and upper bounds.\n"
125 " Values can be direct or parameter references.\n"
126 " -guesses=<baseline|@param>,<center|@param>,<height|@param>,<gamma|@param>\n"
127 " Provide initial guesses for the fit parameters.\n"
128 " -fixValue=<baseline|@param>,<center|@param>,<height|@param>,<gamma|@param>\n"
129 " Fix specific fit parameters to given values or parameters.\n"
130 " -verbosity=<integer> Set verbosity level (higher for more detail).\n"
131 " -stepSize=<factor> Define the step size factor for the fitting algorithm.\n"
132 " -tolerance=<value> Set the tolerance for convergence of the fit.\n"
133 " -limits=<evaluations>,<passes> Set maximum number of evaluations and passes.\n"
134 " -majorOrder=row|column Specify the major order for data storage.\n"
135 " -fullOutput Enable detailed output including residuals.\n"
137 " Performs a Lorentzian fit of the form:\n"
138 " y = baseline + height * gamma^2 / (gamma^2 + (x - center)^2)\n"
141 " (" __DATE__
" " __TIME__
", SVN revision: " SVN_VERSION
")\n";
143void report(
double res,
double *a,
long pass,
long n_eval,
long n_dimen);
144void setupOutputFile(
SDDS_DATASET *OutputTable,
long *xIndex,
long *yIndex,
long *syIndex,
long *fitIndex,
145 long *residualIndex,
long fullOutput,
char *output,
SDDS_DATASET *InputTable,
146 char *xName,
char *yName,
char *syName,
short columnMajorOrder);
147long computeStartingPoint(
double *a,
double *da,
double *x,
double *y, int64_t n,
unsigned long guessFlags,
148 double gammaGuess,
double centerGuess,
double baselineGuess,
double heightGuess,
150double fitFunction(
double *a,
long *invalid);
151int64_t makeFilteredCopy(
double **xFit,
double **yFit,
double **syFit,
double *x,
double *y,
double *sy,
152 int64_t n,
double lower,
double upper);
154static double *xDataFit = NULL, *yDataFit = NULL, *syDataFit = NULL;
155static int64_t nDataFit = 0;
157#define GUESS_BASELINE_GIVEN 0x0001
158#define FIX_BASELINE_GIVEN (0x0001 << 4)
159#define GUESS_HEIGHT_GIVEN 0x0002
160#define FIX_HEIGHT_GIVEN (0x0002 << 4)
161#define GUESS_CENTER_GIVEN 0x0004
162#define FIX_CENTER_GIVEN (0x0004 << 4)
163#define GUESS_GAMMA_GIVEN 0x0008
164#define FIX_GAMMA_GIVEN (0x0008 << 4)
166#define BASELINE_INDEX 0
167#define HEIGHT_INDEX 1
168#define CENTER_INDEX 2
171int main(
int argc,
char **argv) {
172 double *xData = NULL, *yData = NULL, *syData = NULL;
177 char *input, *output, *xName, *yName, *syName;
178 long xIndex, yIndex, fitIndex, residualIndex, syIndex_col, retval;
179 double *fitData, *residualData, rmsResidual, chiSqr, sigLevel;
180 unsigned long guessFlags, dummyFlags, pipeFlags, majorOrderFlag;
181 double gammaGuess, centerGuess, baselineGuess, heightGuess;
182 double tolerance, stepSize;
183 double a[4], da[4], lower, upper, result;
184 double aLow[4], aHigh[4];
185 short disable[4] = {0, 0, 0, 0};
186 int32_t nEvalMax = 5000, nPassMax = 100;
187 long nEval, verbosity, fullOutput = 0;
189 short columnMajorOrder = -1;
190 char *lowerPar, *upperPar, *baselineGuessPar, *gammaGuessPar, *centerGuessPar, *heightGuessPar;
193 argc =
scanargs(&s_arg, argc, argv);
194 if (argc < 2 || argc > (2 + N_OPTIONS)) {
195 fprintf(stderr,
"%s", USAGE);
199 for (i = 0; i < 4; i++)
200 aLow[i] = -(aHigh[i] = DBL_MAX);
201 aLow[GAMMA_INDEX] = 0;
202 input = output = NULL;
206 guessFlags = gammaGuess = heightGuess = baselineGuess = centerGuess = pipeFlags = 0;
207 xName = yName = syName = NULL;
209 lowerPar = upperPar = gammaGuessPar = heightGuessPar = baselineGuessPar = centerGuessPar = NULL;
210 for (i_arg = 1; i_arg < argc; i_arg++) {
211 if (s_arg[i_arg].arg_type == OPTION) {
212 switch (
match_string(s_arg[i_arg].list[0], option, N_OPTIONS, 0)) {
213 case SET_MAJOR_ORDER:
215 s_arg[i_arg].n_items--;
216 if (s_arg[i_arg].n_items > 0 && (!
scanItemList(&majorOrderFlag, s_arg[i_arg].list + 1, &s_arg[i_arg].n_items, 0,
"row", -1, NULL, 0, SDDS_ROW_MAJOR_ORDER,
"column", -1, NULL, 0, SDDS_COLUMN_MAJOR_ORDER, NULL)))
217 SDDS_Bomb(
"invalid -majorOrder syntax/values");
218 if (majorOrderFlag & SDDS_COLUMN_MAJOR_ORDER)
219 columnMajorOrder = 1;
220 else if (majorOrderFlag & SDDS_ROW_MAJOR_ORDER)
221 columnMajorOrder = 0;
224 if (s_arg[i_arg].n_items != 3)
226 if (s_arg[i_arg].list[1][0] ==
'@') {
227 cp_str(&lowerPar, s_arg[i_arg].list[1] + 1);
228 }
else if (sscanf(s_arg[i_arg].list[1],
"%lf", &lower) != 1)
229 SDDS_Bomb(
"invalid fitRange lower value provided");
230 if (s_arg[i_arg].list[2][0] ==
'@') {
231 cp_str(&upperPar, s_arg[i_arg].list[2] + 1);
232 }
else if (sscanf(s_arg[i_arg].list[2],
"%lf", &upper) != 1)
233 SDDS_Bomb(
"invalid fitRange upper value provided");
236 if (s_arg[i_arg].n_items != 2 || sscanf(s_arg[i_arg].list[1],
"%lf", &tolerance) != 1 || tolerance <= 0)
237 SDDS_Bomb(
"incorrect -tolerance syntax");
240 if (s_arg[i_arg].n_items != 2 || sscanf(s_arg[i_arg].list[1],
"%lf", &stepSize) != 1 || stepSize <= 0)
244 if (s_arg[i_arg].n_items != 2 || sscanf(s_arg[i_arg].list[1],
"%ld", &verbosity) != 1)
245 SDDS_Bomb(
"incorrect -verbosity syntax");
248 if (s_arg[i_arg].n_items < 2)
250 s_arg[i_arg].n_items -= 1;
251 dummyFlags = guessFlags;
252 if (!
scanItemList(&guessFlags, s_arg[i_arg].list + 1, &s_arg[i_arg].n_items, 0,
253 "baseline",
SDDS_STRING, &baselineGuessPar, 1, GUESS_BASELINE_GIVEN,
254 "height",
SDDS_STRING, &heightGuessPar, 1, GUESS_HEIGHT_GIVEN,
255 "center",
SDDS_STRING, ¢erGuessPar, 1, GUESS_CENTER_GIVEN,
256 "gamma",
SDDS_STRING, &gammaGuessPar, 1, GUESS_GAMMA_GIVEN, NULL))
258 if (baselineGuessPar) {
259 if (baselineGuessPar[0] ==
'@') {
262 if (sscanf(baselineGuessPar,
"%lf", &baselineGuess) != 1)
263 SDDS_Bomb(
"Invalid baseline guess value provided.");
264 free(baselineGuessPar);
265 baselineGuessPar = NULL;
268 if (heightGuessPar) {
269 if (heightGuessPar[0] ==
'@') {
272 if (sscanf(heightGuessPar,
"%lf", &heightGuess) != 1)
273 SDDS_Bomb(
"Invalid height guess value provided.");
274 free(heightGuessPar);
275 heightGuessPar = NULL;
278 if (centerGuessPar) {
279 if (centerGuessPar[0] ==
'@') {
282 if (sscanf(centerGuessPar,
"%lf", ¢erGuess) != 1)
283 SDDS_Bomb(
"Invalid center guess value provided.");
284 free(centerGuessPar);
285 centerGuessPar = NULL;
289 if (gammaGuessPar[0] ==
'@') {
292 if (sscanf(gammaGuessPar,
"%lf", &gammaGuess) != 1)
293 SDDS_Bomb(
"Invalid gamma guess value provided.");
295 gammaGuessPar = NULL;
298 if ((dummyFlags >> 4) & guessFlags)
299 SDDS_Bomb(
"can't have -fixValue and -guesses for the same item");
300 guessFlags |= dummyFlags;
303 if (s_arg[i_arg].n_items < 2)
305 s_arg[i_arg].n_items -= 1;
306 dummyFlags = guessFlags;
307 if (!
scanItemList(&guessFlags, s_arg[i_arg].list + 1, &s_arg[i_arg].n_items, 0,
308 "baseline",
SDDS_STRING, &baselineGuessPar, 1, FIX_BASELINE_GIVEN,
309 "height",
SDDS_STRING, &heightGuessPar, 1, FIX_HEIGHT_GIVEN,
310 "center",
SDDS_STRING, ¢erGuessPar, 1, FIX_CENTER_GIVEN,
311 "gamma",
SDDS_STRING, &gammaGuessPar, 1, FIX_GAMMA_GIVEN, NULL))
313 if (dummyFlags & (guessFlags >> 4))
314 SDDS_Bomb(
"can't have -fixValue and -guesses for the same item");
315 guessFlags |= dummyFlags;
316 if (baselineGuessPar) {
317 if (baselineGuessPar[0] ==
'@') {
320 if (sscanf(baselineGuessPar,
"%lf", &baselineGuess) != 1)
321 SDDS_Bomb(
"Invalid baseline guess value provided.");
322 free(baselineGuessPar);
323 baselineGuessPar = NULL;
326 if (heightGuessPar) {
327 if (heightGuessPar[0] ==
'@') {
330 if (sscanf(heightGuessPar,
"%lf", &heightGuess) != 1)
331 SDDS_Bomb(
"Invalid height guess value provided.");
332 free(heightGuessPar);
333 heightGuessPar = NULL;
336 if (centerGuessPar) {
337 if (centerGuessPar[0] ==
'@') {
340 if (sscanf(centerGuessPar,
"%lf", ¢erGuess) != 1)
341 SDDS_Bomb(
"Invalid center guess value provided.");
342 free(centerGuessPar);
343 centerGuessPar = NULL;
347 if (gammaGuessPar[0] ==
'@') {
350 if (sscanf(gammaGuessPar,
"%lf", &gammaGuess) != 1)
351 SDDS_Bomb(
"Invalid gamma guess value provided.");
353 gammaGuessPar = NULL;
358 if (s_arg[i_arg].n_items != 3 && s_arg[i_arg].n_items != 4)
360 xName = s_arg[i_arg].list[1];
361 yName = s_arg[i_arg].list[2];
362 s_arg[i_arg].n_items -= 3;
363 if (!
scanItemList(&dummyFlags, s_arg[i_arg].list + 3, &s_arg[i_arg].n_items, 0,
371 if (s_arg[i_arg].n_items < 2)
373 s_arg[i_arg].n_items -= 1;
374 if (!
scanItemList(&dummyFlags, s_arg[i_arg].list + 1, &s_arg[i_arg].n_items, 0,
375 "evaluations",
SDDS_LONG, &nEvalMax, 1, 0,
376 "passes",
SDDS_LONG, &nPassMax, 1, 0, NULL) ||
377 nEvalMax <= 0 || nPassMax <= 0)
381 if (!
processPipeOption(s_arg[i_arg].list + 1, s_arg[i_arg].n_items - 1, &pipeFlags))
385 fprintf(stderr,
"Error: Unknown or ambiguous option: %s\n", s_arg[i_arg].list[0]);
386 fprintf(stderr,
"%s", USAGE);
392 input = s_arg[i_arg].list[0];
393 else if (output == NULL)
394 output = s_arg[i_arg].list[0];
402 for (i = 0; i < 4; i++) {
403 if ((guessFlags >> 4) & (1 << i)) {
408 if (!xName || !yName) {
409 fprintf(stderr,
"Error: -columns option must be specified.\n");
410 fprintf(stderr,
"%s", USAGE);
418 (syName && !
SDDS_FindColumn(&InputTable, FIND_NUMERIC_TYPE, syName, NULL)))
419 SDDS_Bomb(
"One or more of the specified data columns do not exist or are non-numeric.");
421 setupOutputFile(&OutputTable, &xIndex, &yIndex, &syIndex_col, &fitIndex, &residualIndex,
422 fullOutput, output, &InputTable, xName, yName, syName, columnMajorOrder);
425 xData = yData = syData = NULL;
426 fitData = residualData = NULL;
448 if ((nDataFit = makeFilteredCopy(&xDataFit, &yDataFit, &syDataFit, xData, yData, syData, nData, lower, upper)) < 5)
457 if (!computeStartingPoint(a, da, xDataFit, yDataFit, nDataFit, guessFlags, gammaGuess, centerGuess, baselineGuess, heightGuess, stepSize)) {
458 fprintf(stderr,
"Error: Couldn't compute starting point for page %ld--skipping\n", retval);
462 fprintf(stderr,
"Starting values: gamma=%.6e center=%.6e baseline=%.6e height=%.6e\n", a[GAMMA_INDEX], a[CENTER_INDEX], a[BASELINE_INDEX], a[HEIGHT_INDEX]);
464 fprintf(stderr,
"Starting steps: gamma=%.6e center=%.6e baseline=%.6e height=%.6e\n", da[GAMMA_INDEX], da[CENTER_INDEX], da[BASELINE_INDEX], da[HEIGHT_INDEX]);
466 nEval =
simplexMin(&result, a, da, aLow, aHigh, disable, 4, -DBL_MAX, tolerance, fitFunction, (verbosity > 0 ? report : NULL), nEvalMax, nPassMax, 12, 3, 1.0, 0);
467 if (xData != xDataFit) {
475 fprintf(stderr,
"%ld evaluations of fit function required, giving result %e\n", nEval, result);
477 fitData =
trealloc(fitData,
sizeof(*fitData) * nData);
478 residualData =
trealloc(residualData,
sizeof(*residualData) * nData);
479 for (i = result = 0; i < nData; i++) {
480 fitData[i] = a[BASELINE_INDEX] + a[HEIGHT_INDEX] / (1 + sqr((xDataFit[i] - a[CENTER_INDEX]) / a[GAMMA_INDEX]));
481 residualData[i] = yData[i] - fitData[i];
482 result += sqr(residualData[i]);
484 rmsResidual = sqrt(result / nData);
486 for (i = chiSqr = 0; i < nData; i++)
487 chiSqr += sqr(residualData[i] / syData[i]);
490 sy2 = result / (nData - 4);
491 for (i = chiSqr = 0; i < nData; i++)
492 chiSqr += sqr(residualData[i]) / sy2;
496 fprintf(stderr,
"gamma: %.15e\ncenter: %.15e\nbaseline: %.15e\nheight: %.15e\n", a[GAMMA_INDEX], a[CENTER_INDEX], a[BASELINE_INDEX], a[HEIGHT_INDEX]);
500 fprintf(stderr,
"Significance level: %.5e\n", sigLevel);
501 fprintf(stderr,
"RMS deviation: %.15e\n", rmsResidual);
506 !
SDDS_SetColumn(&OutputTable, SDDS_SET_BY_INDEX, xData, nData, xIndex) ||
507 !
SDDS_SetColumn(&OutputTable, SDDS_SET_BY_INDEX, fitData, nData, fitIndex) ||
509 "lorentzianfitGamma", a[GAMMA_INDEX],
510 "lorentzianfitCenter", a[CENTER_INDEX],
511 "lorentzianfitBaseline", a[BASELINE_INDEX],
512 "lorentzianfitHeight", a[HEIGHT_INDEX],
513 "lorentzianfitRmsResidual", rmsResidual,
514 "lorentzianfitSigLevel", sigLevel, NULL) ||
516 (!
SDDS_SetColumn(&OutputTable, SDDS_SET_BY_INDEX, yData, nData, yIndex) ||
517 !
SDDS_SetColumn(&OutputTable, SDDS_SET_BY_INDEX, residualData, nData, residualIndex) ||
518 (syName && !
SDDS_SetColumn(&OutputTable, SDDS_SET_BY_INDEX, syData, nData, syIndex_col)))) ||
540 if (baselineGuessPar)
541 free(baselineGuessPar);
543 free(heightGuessPar);
550void setupOutputFile(
SDDS_DATASET *OutputTable,
long *xIndex,
long *yIndex,
long *syIndex,
long *fitIndex,
551 long *residualIndex,
long fullOutput,
char *output,
SDDS_DATASET *InputTable,
552 char *xName,
char *yName,
char *syName,
short columnMajorOrder) {
553 char *name, *yUnits, *description, *xUnits;
555 static char *residualNamePart =
"Residual";
556 static char *residualDescriptionPart =
"Residual of Lorentzian fit to ";
565 if (columnMajorOrder != -1)
566 OutputTable->layout.data_mode.column_major = columnMajorOrder;
568 OutputTable->layout.data_mode.column_major = InputTable->layout.data_mode.column_major;
569 name =
tmalloc(
sizeof(*name) * (strlen(yName) + strlen(residualNamePart) + 1));
570 description =
tmalloc(
sizeof(*description) * (strlen(yName) + strlen(residualDescriptionPart) + 1));
581 sprintf(name,
"%s%s", yName, residualNamePart);
582 sprintf(description,
"%s%s", yName, residualDescriptionPart);
587 sprintf(name,
"%sFit", yName);
588 sprintf(description,
"Lorentzian fit to %s", yName);
592 if (
SDDS_DefineParameter(OutputTable,
"lorentzianfitBaseline", NULL, yUnits,
"Baseline from Lorentzian fit",
594 SDDS_DefineParameter(OutputTable,
"lorentzianfitHeight", NULL, yUnits,
"Height from Lorentzian fit",
596 SDDS_DefineParameter(OutputTable,
"lorentzianfitCenter", NULL, xUnits,
"Center from Lorentzian fit",
598 SDDS_DefineParameter(OutputTable,
"lorentzianfitGamma", NULL, xUnits,
"Gamma from Lorentzian fit",
600 SDDS_DefineParameter(OutputTable,
"lorentzianfitRmsResidual", NULL, yUnits,
"RMS residual from Lorentzian fit",
602 SDDS_DefineParameter(OutputTable,
"lorentzianfitSigLevel", NULL, NULL,
"Significance level from chi-squared test",
609double fitFunction(
double *a,
long *invalid) {
610 double sum, tmp, center, gamma, base, norm;
614 gamma = a[GAMMA_INDEX];
615 center = a[CENTER_INDEX];
616 base = a[BASELINE_INDEX];
617 norm = a[HEIGHT_INDEX];
620 for (i = sum = 0; i < nDataFit; i++) {
621 tmp = (xDataFit[i] - center) / gamma;
622 tmp = norm / (1 + sqr(tmp)) + base;
623 sum += sqr(tmp - yDataFit[i]);
625 return (sum / nDataFit);
627 for (i = sum = 0; i < nDataFit; i++) {
628 tmp = (xDataFit[i] - center) / gamma;
629 tmp = norm / (1 + sqr(tmp)) + base;
630 sum += sqr((tmp - yDataFit[i]) / syDataFit[i]);
632 return (sum / nDataFit);
636void report(
double y,
double *x,
long pass,
long nEval,
long n_dimen) {
639 fprintf(stderr,
"Pass %ld, after %ld evaluations: result = %.16e\na = ", pass, nEval, y);
640 for (i = 0; i < n_dimen; i++)
641 fprintf(stderr,
"%.8e ", x[i]);
645long computeStartingPoint(
double *a,
double *da,
double *x,
double *y, int64_t n,
unsigned long guessFlags,
646 double gammaGuess,
double centerGuess,
double baselineGuess,
double heightGuess,
648 double xhalf, dhalf, ymin, ymax, xcenter, tmp, xmax, xmin;
656 ymax = xmax = -DBL_MAX;
657 ymin = xmin = DBL_MAX;
658 for (i = 0; i < n; i++) {
659 if (xmax < (tmp = fabs(x[i])))
674 for (i = 0; i < n; i++) {
675 tmp = fabs(fabs(y[i] - ymax) / (ymax - ymin) - 0.5);
681 if (dhalf != DBL_MAX)
682 a[GAMMA_INDEX] = fabs(xhalf - xcenter) / 1.177;
684 a[GAMMA_INDEX] = xmax - xmin;
685 a[CENTER_INDEX] = xcenter;
686 a[BASELINE_INDEX] = ymin;
687 a[HEIGHT_INDEX] = ymax - ymin;
689 if (guessFlags & (GUESS_GAMMA_GIVEN + FIX_GAMMA_GIVEN))
690 a[GAMMA_INDEX] = gammaGuess;
691 if (guessFlags & (GUESS_CENTER_GIVEN + FIX_CENTER_GIVEN))
692 a[CENTER_INDEX] = centerGuess;
693 if (guessFlags & (GUESS_BASELINE_GIVEN + FIX_BASELINE_GIVEN))
694 a[BASELINE_INDEX] = baselineGuess;
695 if (guessFlags & (GUESS_HEIGHT_GIVEN + FIX_HEIGHT_GIVEN))
696 a[HEIGHT_INDEX] = heightGuess;
699 for (i = 0; i < 4; i++)
700 if (!(da[i] = a[i] * stepSize))
706int64_t makeFilteredCopy(
double **xFit,
double **yFit,
double **syFit,
double *x,
double *y,
707 double *sy, int64_t n,
double lower,
double upper) {
710 if (!(*xFit = (
double *)malloc(
sizeof(**xFit) * n)) ||
711 !(*yFit = (
double *)malloc(
sizeof(**yFit) * n)) ||
712 (sy && !(*syFit = (
double *)malloc(
sizeof(**syFit) * n))))
715 for (i = j = 0; i < n; i++) {
716 if (x[i] < lower || x[i] > upper)
SDDS (Self Describing Data Set) Data Types Definitions and Function Prototypes.
int32_t SDDS_CopyParameters(SDDS_DATASET *SDDS_target, SDDS_DATASET *SDDS_source)
int32_t SDDS_StartPage(SDDS_DATASET *SDDS_dataset, int64_t expected_n_rows)
int32_t SDDS_SetParameters(SDDS_DATASET *SDDS_dataset, int32_t mode,...)
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_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_DefineColumn(SDDS_DATASET *SDDS_dataset, const char *name, const char *symbol, const char *units, const char *description, const char *format_string, int32_t type, int32_t field_length)
Defines a data column within the SDDS dataset.
int32_t SDDS_WriteLayout(SDDS_DATASET *SDDS_dataset)
Writes the SDDS layout header to the output file.
int32_t SDDS_DefineParameter(SDDS_DATASET *SDDS_dataset, const char *name, const char *symbol, const char *units, const char *description, const char *format_string, int32_t type, char *fixed_value)
Defines a data parameter with a fixed string value.
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_TransferAllParameterDefinitions(SDDS_DATASET *SDDS_target, SDDS_DATASET *SDDS_source, uint32_t mode)
Transfers all parameter definitions from a source dataset to a target dataset.
int32_t SDDS_GetColumnIndex(SDDS_DATASET *SDDS_dataset, char *name)
Retrieves the index of a named column 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.
char * SDDS_FindColumn(SDDS_DATASET *SDDS_dataset, int32_t mode,...)
Finds the first column in the SDDS dataset that matches the specified criteria.
void SDDS_Bomb(char *message)
Terminates the program after printing an error message and recorded errors.
#define SDDS_STRING
Identifier for the string data type.
#define SDDS_LONG
Identifier for the signed 32-bit integer data type.
#define SDDS_DOUBLE
Identifier for the double data type.
void * trealloc(void *old_ptr, uint64_t size_of_block)
Reallocates a memory block to a new size.
void * tmalloc(uint64_t size_of_block)
Allocates a memory block of the specified size with zero initialization.
char * cp_str(char **s, char *t)
Copies a string, allocating memory for storage.
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)
void free_scanargs(SCANNED_ARG **scanned, int argc)
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.
double ChiSqrSigLevel(double ChiSquared0, long nu)
Computes the probability that a chi-squared variable exceeds a given value.
long simplexMin(double *yReturn, double *xGuess, double *dxGuess, double *xLowerLimit, double *xUpperLimit, short *disable, long dimensions, double target, double tolerance, double(*func)(double *x, long *invalid), void(*report)(double ymin, double *xmin, long pass, long evals, long dims), long maxEvaluations, long maxPasses, long maxDivisions, double divisorFactor, double passRangeFactor, unsigned long flags)
Top-level convenience function for simplex-based minimization.