33char *option[N_OPTIONS] = {
36char *USAGE =
"mcs2sdds <inputfile> <outputfile> [-ascii]\n\
37Link date: " __DATE__
" " __TIME__
", SVN revision: " SVN_VERSION
"\n";
41void swapshort(
short *data);
42void swaplong(
long *data);
43void swapulong(
unsigned long *data);
44void swapushort(
unsigned short *data);
45void swapfloat(
float *data);
47int main(
int argc,
char **argv) {
54 unsigned long dwell_913;
55 unsigned short pass_length;
56 unsigned long pass_count;
57 unsigned long pass_count_preset;
60 unsigned short mark_chan;
85 char ts1[256], ts2[256], ts3[256], ts4[256];
86 unsigned long *ucount;
87 long *count, *channel;
91 argc =
scanargs(&scanned, argc, argv);
94 input = output = NULL;
96 for (i_arg = 1; i_arg < argc; i_arg++) {
97 if (scanned[i_arg].arg_type == OPTION) {
98 switch (
match_string(scanned[i_arg].list[0], option, N_OPTIONS, 0)) {
103 bomb(
"invalid option seen", USAGE);
108 input = scanned[i_arg].list[0];
110 output = scanned[i_arg].list[0];
112 bomb(
"too many filenames", USAGE);
126 fread(&f_type,
sizeof(
short), 1, fpi);
129 fprintf(stderr,
"Not a valid file: f_type = %hx\n", f_type);
132 fread(&trigger,
sizeof(
char), 1, fpi);
133 fread(&dwell_flag,
sizeof(
char), 1, fpi);
134 fread(&dwell_units,
sizeof(
char), 1, fpi);
135 fread(&acq_mode,
sizeof(
char), 1, fpi);
136 fread(&dwell_913,
sizeof(
long), 1, fpi);
137 swapulong(&dwell_913);
138 fread(&pass_length,
sizeof(
short), 1, fpi);
139 swapushort(&pass_length);
140 fread(&pass_count,
sizeof(
long), 1, fpi);
141 swapulong(&pass_count);
142 fread(&pass_count_preset,
sizeof(
long), 1, fpi);
143 swapulong(&pass_count_preset);
144 fread(acq_time,
sizeof(
char), 8, fpi);
145 fread(acq_date,
sizeof(
char), 8, fpi);
146 fread(&mark_chan,
sizeof(
short), 1, fpi);
147 swapushort(&mark_chan);
148 fread(&mcs_num,
sizeof(
char), 1, fpi);
149 fread(&cal_flag,
sizeof(
char), 1, fpi);
150 fread(cal_units,
sizeof(
char), 4, fpi);
151 fread(&cal_zero,
sizeof(
float), 1, fpi);
152 swapfloat(&cal_zero);
153 fread(&cal_slope,
sizeof(
float), 1, fpi);
154 swapfloat(&cal_slope);
155 fread(reserved,
sizeof(
char), 10, fpi);
156 fread(&id_byte,
sizeof(
char), 1, fpi);
157 fread(reserved,
sizeof(
char), 1, fpi);
158 fread(&detector_len,
sizeof(
char), 1, fpi);
159 fread(detector,
sizeof(
char), 63, fpi);
160 fread(&sample_len,
sizeof(
char), 1, fpi);
161 fread(sample,
sizeof(
char), 63, fpi);
162 fread(reserved,
sizeof(
char), 16, fpi);
163 fread(&disc_sel,
sizeof(
char), 1, fpi);
164 fread(&disc_edge,
sizeof(
char), 1, fpi);
165 fread(&disc,
sizeof(
float), 1, fpi);
167 fread(&sca_uld,
sizeof(
float), 1, fpi);
169 fread(&sca_lld,
sizeof(
float), 1, fpi);
171 fread(&dwell,
sizeof(
float), 1, fpi);
173 fread(&consistent,
sizeof(
char), 1, fpi);
174 fread(reserved,
sizeof(
char), 21, fpi);
175 fread(mcs_id,
sizeof(
char), 8, fpi);
178 sprintf(ts1,
"%d", mcs_num + 1);
179 sprintf(ts2,
"%hd", pass_length);
180 sprintf(ts3,
"%ld", pass_count);
181 sprintf(ts4,
"%ld", pass_count_preset);
183 if (!
SDDS_InitializeOutput(&SDDS_dataset, ascii ? SDDS_ASCII : SDDS_BINARY, 1,
"Turbo MCS data",
"Turbo MCS data", output) ||
191 if (dwell_flag == 0) {
192 if (dwell_units == 0)
194 else if (dwell_units == 1)
196 else if (dwell_units == 3)
200 sprintf(ts1,
"%15.8e", dwell);
201 sprintf(ts2,
"%8s %8s", acq_time, acq_date);
208 sprintf(ts1,
"%15.8e", cal_slope);
209 sprintf(ts2,
"%15.8e", cal_zero);
215 detector[(unsigned)detector_len] = 0;
221 sample[(unsigned)sample_len] = 0;
228 sprintf(ts1,
"%15.8e", sca_lld);
229 sprintf(ts2,
"%15.8e", sca_uld);
234 sprintf(ts1,
"%15.8e", disc);
240 if (consistent == 0) {
241 if (
SDDS_DefineParameter(&SDDS_dataset,
"Inconsistent", NULL, NULL,
"Flag indicating whether data and settings are inconsistent", NULL,
SDDS_LONG,
"1") < 0)
243 fprintf(stderr,
"WARNING: Settings are not consistent with data\n");
255 channel =
tmalloc(
sizeof(*channel) * pass_length);
256 count =
tmalloc(
sizeof(*count) * pass_length);
257 ucount =
tmalloc(
sizeof(*ucount) * pass_length);
258 if (fread(ucount,
sizeof(*ucount), pass_length, fpi) != pass_length)
259 SDDS_Bomb(
"unable to read channel data");
260 for (i = 0; i < (long)pass_length; i++) {
261 swapulong(ucount + i);
262 count[i] = (long)ucount[i];
265 if (!
SDDS_SetColumn(&SDDS_dataset, SDDS_SET_BY_NAME, channel, (
long)pass_length,
"ChannelNumber") ||
266 !
SDDS_SetColumn(&SDDS_dataset, SDDS_SET_BY_NAME, count, (
long)pass_length,
"EventCount") ||
273void swapshort(
short *data) {
275 c1 = *((
char *)data);
276 *((
char *)data) = *(((
char *)data) + 1);
277 *(((
char *)data) + 1) = c1;
280void swapushort(
unsigned short *data) {
282 c1 = *((
char *)data);
283 *((
char *)data) = *(((
char *)data) + 1);
284 *(((
char *)data) + 1) = c1;
287void swaplong(
long *data) {
290 *(((
char *)data) + 0) = *(((
char *)©) + 3);
291 *(((
char *)data) + 1) = *(((
char *)©) + 2);
292 *(((
char *)data) + 2) = *(((
char *)©) + 1);
293 *(((
char *)data) + 3) = *(((
char *)©) + 0);
296void swapulong(
unsigned long *data) {
299 *(((
char *)data) + 0) = *(((
char *)©) + 3);
300 *(((
char *)data) + 1) = *(((
char *)©) + 2);
301 *(((
char *)data) + 2) = *(((
char *)©) + 1);
302 *(((
char *)data) + 3) = *(((
char *)©) + 0);
305void swapfloat(
float *data) {
308 *(((
char *)data) + 0) = *(((
char *)©) + 3);
309 *(((
char *)data) + 1) = *(((
char *)©) + 2);
310 *(((
char *)data) + 2) = *(((
char *)©) + 1);
311 *(((
char *)data) + 3) = *(((
char *)©) + 0);
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_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_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.
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.
#define SDDS_STRING
Identifier for the string data type.
#define SDDS_LONG
Identifier for the signed 32-bit integer data type.
#define SDDS_SHORT
Identifier for the signed short integer data type.
#define SDDS_DOUBLE
Identifier for the double 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.
FILE * fopen_e(char *file, char *open_mode, long mode)
Opens a file with error checking, messages, and aborts.
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)