/*************************************************************************\ * Copyright (c) 2002 The University of Chicago, as Operator of Argonne * National Laboratory. * Copyright (c) 2002 The Regents of the University of California, as * Operator of Los Alamos National Laboratory. * This file is distributed subject to a Software License Agreement found * in the file LICENSE that is included with this distribution. \*************************************************************************/ /* * $Log: sddsimageconvert.c,v $ Revision 1.4 2008/08/21 20:54:29 soliday Updated to check if the Y interval in the single column input file would result in only positive integers for the values for Y. If this is the case then it will create the multi-column image output file with column names that have the same length by adding zeros in front of the Y value. Also it now checks the X interval in the single column input file to see if it would result in only integers for the Index column in the multi-column output file. If this is the case then it will define the Index column as LONG instead of DOUBLE. Revision 1.3 2005/11/04 22:46:40 soliday Updated code to be compiled by a 64 bit processor. Revision 1.2 2003/10/20 14:54:20 soliday Fixed issue on Linux with missing strlcpy. Revision 1.1 2003/10/17 16:16:12 soliday First version. * */ #include "mdb.h" #include "SDDS.h" #include "scan.h" #ifndef min #define min(a, b) ((a) > (b) ? (b) : (a)) #define max(a, b) ((a) < (b) ? (b) : (a)) #endif #define SET_ASCII 0 #define SET_BINARY 1 #define SET_PIPE 2 #define SET_NOWARNINGS 3 #define SET_MULTICOLUMN 4 #define SET_SINGLECOLUMN 5 #define OPTIONS 6 static char *option[OPTIONS] = { "ascii", "binary", "pipe", "nowarnings", "multicolumn", "singlecolumn" }; char *USAGE = "sddsimageconvert [] []\n[-pipe=[input][,output]]\n[-multicolumn=[indexName=][,prefix=]]\n[-singlecolumn=[imageColumn=][,xVariableName=][,yVariableName=]\n[-ascii] [-binary]\n[-noWarnings]\n\nProgram by Robert Soliday. ("__DATE__")\n"; typedef struct { char *prefix; double ymin, ymax; long ydim; char *indexName; } MULTICOLUMN_DATA; typedef struct { char *imageColumn; char *xprefix, *yprefix; } SINGLECOLUMN_DATA; long ConvertSDDSsingleColumnImage(SDDS_DATASET *SDDS_orig, SDDS_DATASET *SDDS_dataset, MULTICOLUMN_DATA multicolumnData, SINGLECOLUMN_DATA singlecolumnData); long ConvertSDDSmultiColumnImage(SDDS_DATASET *SDDS_orig, SDDS_DATASET *SDDS_dataset, MULTICOLUMN_DATA multicolumnData, SINGLECOLUMN_DATA singlecolumnData); long CheckForImageType(SDDS_DATASET *SDDS_orig, MULTICOLUMN_DATA *multicolumnData, SINGLECOLUMN_DATA *singlecolumnData); #define UNKNOWN_IMAGETYPE 0 #define SDDS_SINGLECOLUMN 1 #define SDDS_MULTICOLUMN 2 int main(int argc, char **argv) { SDDS_DATASET SDDS_dataset, SDDS_orig; SCANNED_ARG *s_arg; MULTICOLUMN_DATA multicolumnData; SINGLECOLUMN_DATA singlecolumnData; long i_arg, binary=1, noWarnings=0, tmpfile_used=0; unsigned long pipeFlags=0; char *input=NULL, *output=NULL; unsigned long dummyFlags; long imageType; if (argc<2) { fprintf(stderr, "%s", USAGE); return(1); } multicolumnData.indexName=NULL; multicolumnData.prefix=NULL; singlecolumnData.imageColumn=NULL; singlecolumnData.xprefix=NULL; singlecolumnData.yprefix=NULL; argc = scanargsg(&s_arg, argc, argv); for (i_arg=1; i_arg= 0) && (SDDS_VerifyParameterExists(SDDS_orig, FIND_SPECIFIED_TYPE,SDDS_STRING, "Variable2Name") >= 0)) { return(SDDS_SINGLECOLUMN); } /*Check for SDDS Multiple Column Image*/ if (SDDS_VerifyColumnExists(SDDS_orig, FIND_NUMERIC_TYPE, multicolumnData->indexName) >= 0) { columnNames = SDDS_GetColumnNames(SDDS_orig, &nColumns); if (multicolumnData->prefix[0] != 0) { len=strlen(multicolumnData->prefix); prefixFound=2; } for (n=0 ; nindexName, columnNames[n])==0) continue; if (prefixFound==0) { ptr = columnNames[n]; ptr++; while (strlen(ptr) > 0) { if (sscanf(ptr, "%lg", &buffer)!=1) ptr++; else break; } if (strlen(ptr)==0) break; /*strlcpy(multicolumnData->prefix, columnNames[n], strlen(columnNames[n]) - strlen(ptr) + 1);*/ strncpy(charBuffer, columnNames[n], strlen(columnNames[n]) - strlen(ptr)); charBuffer[strlen(columnNames[n]) - strlen(ptr)] = '\0'; strcpy(multicolumnData->prefix, charBuffer); len=strlen(multicolumnData->prefix); prefixFound=1; multicolumnData->ydim=1; multicolumnData->ymin=multicolumnData->ymax=buffer; } else { if (strlen(columnNames[n]) <= len) continue; if (strncmp(multicolumnData->prefix, columnNames[n], len)!=0) continue; ptr = columnNames[n]; ptr += len; if (sscanf(ptr, "%lg", &buffer)!=1) continue; if (prefixFound==2) { prefixFound=1; multicolumnData->ydim=1; multicolumnData->ymin=multicolumnData->ymax=buffer; } else { sddsMultiColumnImage=1; multicolumnData->ydim++; multicolumnData->ymin = min(buffer,multicolumnData->ymin); multicolumnData->ymax = max(buffer,multicolumnData->ymax); } } } for (n=0; n0) { if ((rows = SDDS_RowCount(SDDS_orig))<=0) continue; if (!(indexData = SDDS_GetColumnInDoubles(SDDS_orig, multicolumnData.indexName))) { fprintf(stderr, "Error (sddsimageconvert): Problem reading data from %s column\n", multicolumnData.indexName); return(1); } xdim = rows; xmin = indexData[0]; xmax = indexData[xdim-1]; for (n=1; n indexData[n]) { fprintf(stderr, "Error (sddsimageconvert): %s column is not sorted\n", multicolumnData.indexName); return(1); } } for (n=0; n\n"); return(1); } sprintf(imageColumn, "%s", columnNames[0]); for (n=0; n0) { if ((rows = SDDS_RowCount(SDDS_orig))<=0) continue; if ((SDDS_GetParameterAsString(SDDS_orig, "Variable1Name", &var1Name)==NULL) || (SDDS_GetParameterAsString(SDDS_orig, "Variable2Name", &var2Name)==NULL)) { fprintf(stderr, "Error (sddsimageconvert): Problem reading data from parameters Variable1Name and/or Variable2Name\n"); return(1); } sprintf(buffer, "%sInterval", var1Name); if (SDDS_GetParameterAsDouble(SDDS_orig, buffer, &xInterval)==NULL) { fprintf(stderr, "Error (sddsimageconvert): Problem reading data from parameter %s\n", buffer); return(1); } sprintf(buffer, "%sInterval", var2Name); if (SDDS_GetParameterAsDouble(SDDS_orig, buffer, &yInterval)==NULL) { fprintf(stderr, "Error (sddsimageconvert): Problem reading data from parameter %s\n", buffer); return(1); } sprintf(buffer, "%sMinimum", var1Name); if (SDDS_GetParameterAsDouble(SDDS_orig, buffer, &xMinimum)==NULL) { fprintf(stderr, "Error (sddsimageconvert): Problem reading data from parameter %s\n", buffer); return(1); } sprintf(buffer, "%sMinimum", var2Name); if (SDDS_GetParameterAsDouble(SDDS_orig, buffer, &yMinimum)==NULL) { fprintf(stderr, "Error (sddsimageconvert): Problem reading data from parameter %s\n", buffer); return(1); } sprintf(buffer, "%sDimension", var1Name); if (SDDS_GetParameterAsLong(SDDS_orig, buffer, &xDimension)==NULL) { fprintf(stderr, "Error (sddsimageconvert): Problem reading data from parameter %s\n", buffer); return(1); } sprintf(buffer, "%sDimension", var2Name); if (SDDS_GetParameterAsLong(SDDS_orig, buffer, &yDimension)==NULL) { fprintf(stderr, "Error (sddsimageconvert): Problem reading data from parameter %s\n", buffer); return(1); } if (definitionsDone == 0) { for (n=0 ; n < xDimension ; n++) { if ((int)(n * xInterval + xMinimum) != (n * xInterval + xMinimum)) { intindex = 0; break; } intindex = 1; } if (intindex) { if (SDDS_DefineSimpleColumn(SDDS_dataset, multicolumnData.indexName, NULL, SDDS_LONG)==0) { SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors); return(1); } } else { if (SDDS_DefineSimpleColumn(SDDS_dataset, multicolumnData.indexName, NULL, SDDS_DOUBLE)==0) { SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors); return(1); } } lineColumnNames=malloc(sizeof(char*)*yDimension); for (n=0 ; n < yDimension ; n++) { if (n * yInterval + yMinimum < 0) { intlength = 0; break; } if ((int)(n * yInterval + yMinimum) != (n * yInterval + yMinimum)) { intlength = 0; break; } intlength = 1; } if (intlength) { sprintf(buffer, "%lg", (yDimension - 1) * yInterval + yMinimum); intlength = strlen(buffer); sprintf(format, "%s%%0%ldld", prefix, intlength); } for (n=0 ; n < yDimension ; n++) { lineColumnNames[n]=malloc(sizeof(char)*40); if (intlength) { sprintf(lineColumnNames[n], format, (int)(n * yInterval + yMinimum)); } else { sprintf(lineColumnNames[n], "%s%lg", prefix, n * yInterval + yMinimum); } if (SDDS_DefineSimpleColumn(SDDS_dataset, lineColumnNames[n], NULL, SDDS_DOUBLE)==0) { SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors); return(1); } } if (SDDS_WriteLayout(SDDS_dataset) == 0) { SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors); return(1); } definitionsDone = 1; } if (!(data = SDDS_GetColumnInDoubles(SDDS_orig, imageColumn))) { fprintf(stderr, "Error (sddsimageconvert): Problem reading data from %s column\n", imageColumn); return(1); } indexData=malloc(sizeof(double)*xDimension); lineData=malloc(sizeof(double)*xDimension); if (SDDS_StartPage(SDDS_dataset, xDimension)==0) { SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors); return(1); } for (n=0 ; n < xDimension ; n++) { indexData[n] = n * xInterval + xMinimum; } if (intindex) { if (SDDS_SetColumnFromDoubles(SDDS_dataset, SDDS_SET_BY_NAME, indexData, xDimension, multicolumnData.indexName)==0) { SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors); return(1); } } else { if (SDDS_SetColumn(SDDS_dataset, SDDS_SET_BY_NAME, indexData, xDimension, multicolumnData.indexName)==0) { SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors); return(1); } } for (n=0 ; n < yDimension ; n++) { for (m=0 ; m < xDimension ; m++) { lineData[m]=data[n + m*yDimension]; } if (SDDS_SetColumn(SDDS_dataset, SDDS_SET_BY_NAME, lineData, xDimension, lineColumnNames[n])==0) { SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors); return(1); } } if (SDDS_WritePage(SDDS_dataset)==0) { SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors); return(1); } free(indexData); free(lineData); free(data); } if (definitionsDone == 1) { for (n=0 ; n < yDimension ; n++) free(lineColumnNames[n]); free(lineColumnNames); } if (var1Name) free(var1Name); if (var2Name) free(var2Name); return(0); }