100 {
101 SCANNED_ARG *s_arg;
103
104 char *inputfile, *outputfile;
105 char **inputColumnName, **inputStringColumnName, **inputDoubleColumnName;
106 char **outputStringColumnName, **outputDoubleColumnName;
107 int64_t inputRows, outputRows;
108 long inputDoubleColumns, inputStringColumns;
109 long outputDoubleColumns, outputStringColumns;
110 char **inputParameterName;
111 int32_t inputParameters, inputColumns;
112 char *inputDescription, *inputContents;
113 long i, i_arg, col;
114#define BUFFER_SIZE_INCREMENT 16384
115 MATRIX *R, *Rderiv;
116 long OldStringColumnsDefined;
117 long verbose;
118 long ascii;
119 unsigned long pipeFlags;
120 long tmpfile_used, noWarnings;
121 long ipage, columnType;
122 long addRowsBefore, addRowsAfter, addColumnsBefore;
123 char *mode;
124 char **stringData = NULL;
125 char **rootnameData = NULL;
126
127 inputColumnName = outputStringColumnName = outputDoubleColumnName = inputParameterName = NULL;
128 outputRows = outputDoubleColumns = outputStringColumns = OldStringColumnsDefined = 0;
129
131
132 argc =
scanargs(&s_arg, argc, argv);
133 if (argc == 1)
135
136 inputfile = outputfile = NULL;
137 verbose = 0;
138 ascii = 0;
139 pipeFlags = 0;
140 tmpfile_used = 0;
141 noWarnings = 0;
142 mode = NULL;
143 int modeDefined = 0;
144 addRowsBefore = 0;
145 addRowsAfter = 0;
146
147 for (i_arg = 1; i_arg < argc; i_arg++) {
148 if (s_arg[i_arg].arg_type == OPTION) {
150 switch (
match_string(s_arg[i_arg].list[0], commandline_option, N_OPTIONS, UNIQUE_MATCH)) {
151 case CLO_VERBOSE:
152 verbose = 1;
153 break;
154 case CLO_PIPE:
155 if (!
processPipeOption(s_arg[i_arg].list + 1, s_arg[i_arg].n_items - 1, &pipeFlags))
157 break;
158 case CLO_MODE:
159 modeDefined = 1;
160 if (!(mode = s_arg[i_arg].list[1]))
162 break;
163 case CLO_ADDROWSBEFORE:
164 if (!(sscanf(s_arg[i_arg].list[1], "%ld", &addRowsBefore)) || (addRowsBefore < 0))
165 SDDS_Bomb(
"Invalid value for addRowsBefore: must be a non-negative number");
166 break;
167 case CLO_ADDROWSAFTER:
168 if (!(sscanf(s_arg[i_arg].list[1], "%ld", &addRowsAfter)) || (addRowsAfter < 0))
169 SDDS_Bomb(
"Invalid value for addRowsAfter: must be a non-negative number");
170 break;
171 default:
172 bomb(
"Unrecognized option provided", USAGE);
173 }
174 } else {
175 if (!inputfile)
176 inputfile = s_arg[i_arg].list[0];
177 else if (!outputfile)
178 outputfile = s_arg[i_arg].list[0];
179 else
180 bomb(
"Too many filenames provided", USAGE);
181 }
182 }
183
184 if (modeDefined) {
185 if (strcmp(mode, "cor") && strcmp(mode, "bpm") && strcmp(mode, "quad")) {
186 bomb(
"Invalid mode parameter",
"Mode must be 'cor', 'bpm', or 'quad'");
187 }
188 } else {
189 bomb(
"Mode parameter is not defined.",
"Mode must be 'cor', 'bpm', or 'quad'");
190 }
191
192 processFilenames(
"sddsrespmatrixderivative", &inputfile, &outputfile, pipeFlags, noWarnings, &tmpfile_used);
193
199 exit(EXIT_FAILURE);
200 }
201
202 inputDoubleColumns = 0;
203 inputStringColumns = 0;
204 inputDoubleColumnName = (char **)malloc(inputColumns * sizeof(char *));
205 inputStringColumnName = (char **)malloc(inputColumns * sizeof(char *));
206 inputRows = 0;
207
208 if (strcmp(mode, "quad") == 0) {
209 addColumnsBefore = addRowsBefore;
210 addRowsBefore = 0;
211 } else {
212 addColumnsBefore = 0;
213 }
214
215
216 while (0 < (ipage = SDDS_ReadTable(&inputPage))) {
217 if (ipage == 1) {
220
221
222 for (i = 0; i < inputColumns; i++) {
224 inputDoubleColumnName[inputDoubleColumns] = inputColumnName[i];
225 inputDoubleColumns++;
227 inputStringColumnName[inputStringColumns] = inputColumnName[i];
228 inputStringColumns++;
229 }
230 }
231
234 } else {
236 }
237
238 if (inputDoubleColumns == 0)
239 SDDS_Bomb(
"No numerical columns in file.");
240
241 if ((ipage == 1) && verbose) {
242 fprintf(stderr, "Number of numerical columns: %ld.\n", inputDoubleColumns);
243 fprintf(stderr, "Number of string columns: %ld.\n", inputStringColumns);
244 fprintf(stderr, "Number of rows: %" PRId64 ".\n", inputRows);
245 }
246
247
248 if (inputDoubleColumns) {
249 m_alloc(&R, inputDoubleColumns, inputRows);
250 outputRows = inputDoubleColumns * inputRows + addRowsBefore + addRowsAfter;
251
252 if (strcmp(mode, "cor") == 0) {
253 m_alloc(&Rderiv, inputDoubleColumns, outputRows);
254 } else if (strcmp(mode, "bpm") == 0) {
255 m_alloc(&Rderiv, inputRows, outputRows);
256 } else {
257 outputRows = addRowsAfter;
258 m_alloc(&Rderiv, inputDoubleColumns, outputRows);
259 }
260
261 for (col = 0; col < inputDoubleColumns; col++) {
264 }
265 }
266
267
268 if (strcmp(mode, "quad") != 0) {
272 return EXIT_FAILURE;
273 }
274 }
275 }
276
277 if ((ipage == 1) && verbose) {
278 fprintf(stderr, "Starting MakeDerivative...\n");
279 }
280
281 MakeDerivative(mode, addRowsBefore, addRowsAfter, addColumnsBefore, Rderiv, R);
282
283 rootnameData = (char **)malloc(outputRows * sizeof(char *));
284 if ((ipage == 1) && verbose) {
285 fprintf(stderr, "Starting MakeRootnameColumn...\n");
286 }
287
288 MakeRootnameColumn(mode, inputDoubleColumns, inputRows, addRowsBefore, addRowsAfter,
289 inputDoubleColumnName, stringData, rootnameData);
290
291
292 if ((ipage == 1) && verbose) {
293 fprintf(stderr, "Starting output...\n");
294 }
295
296 if (ipage == 1) {
297 if (strcmp(mode, "cor") == 0) {
298 outputDoubleColumns = inputDoubleColumns;
299 outputDoubleColumnName = inputDoubleColumnName;
300 } else if (strcmp(mode, "bpm") == 0) {
301 outputDoubleColumns = inputRows;
302 outputDoubleColumnName = stringData;
303 } else {
304 outputDoubleColumns = inputDoubleColumns;
305 outputDoubleColumnName = inputDoubleColumnName;
306 }
307
308 if (!
SDDS_InitializeOutput(&outputPage, ascii ? SDDS_ASCII : SDDS_BINARY, 1, NULL, NULL, outputfile))
310
311
312 outputStringColumns = 1;
313 outputStringColumnName = (char **)malloc(sizeof(char *));
314 outputStringColumnName[0] = "Rootname";
317
318
319 for (i = 0; i < outputDoubleColumns; i++) {
322 }
323
324
326 case SDDS_CHECK_NONEXISTENT:
329 break;
330 default:
331 break;
332 }
333
336 }
337
338 if (!SDDS_StartTable(&outputPage, outputRows))
340
341 if (ipage == 1) {
342 if (!
SDDS_SetParameters(&outputPage, SDDS_SET_BY_NAME | SDDS_PASS_BY_VALUE,
"InputFile", inputfile ? inputfile :
"pipe", NULL))
344 }
345
346
347
348
349 if (!
SDDS_SetColumn(&outputPage, SDDS_SET_BY_NAME | SDDS_PASS_BY_REFERENCE, rootnameData, outputRows, outputStringColumnName[0]))
351
352
353 for (i = 0; i < outputDoubleColumns; i++) {
354 if (!
SDDS_SetColumn(&outputPage, SDDS_SET_BY_NAME | SDDS_PASS_BY_REFERENCE, Rderiv->a[i], outputRows, outputDoubleColumnName[i]))
356 }
357 }
358
359 if (!SDDS_WriteTable(&outputPage))
361
362 if (outputDoubleColumns) {
363 m_free(&R);
364 m_free(&Rderiv);
365 free(rootnameData);
366 }
367
370
372 exit(EXIT_FAILURE);
373
374 return EXIT_SUCCESS;
375}
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_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_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.
void SDDS_SetError(char *error_text)
Records an error message in the SDDS error stack.
char ** SDDS_GetParameterNames(SDDS_DATASET *SDDS_dataset, int32_t *number)
Retrieves the names of all parameters 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_GetColumnType(SDDS_DATASET *SDDS_dataset, int32_t index)
Retrieves the data type of a column in the SDDS dataset by its index.
void SDDS_Bomb(char *message)
Terminates the program after printing an error message and recorded errors.
int32_t SDDS_CheckParameter(SDDS_DATASET *SDDS_dataset, char *name, char *units, int32_t type, FILE *fp_message)
Checks if a parameter exists in the SDDS dataset with the specified name, units, and type.
#define SDDS_STRING
Identifier for the string data type.
#define SDDS_DOUBLE
Identifier for the double data type.
#define SDDS_NUMERIC_TYPE(type)
Checks if the given type identifier corresponds to any numeric type.
void bomb(char *error, char *usage)
Reports error messages to the terminal and aborts the program.
char * delete_chars(char *s, char *t)
Removes all occurrences of characters found in string t from string s.
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.
long replaceFileAndBackUp(char *file, char *replacement)
Replaces a file with a replacement file and creates a backup of the original.
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)