10#include "tpcclibConfig.h"
24static char *info[] = {
25 "Draw x,y,z matrix containing boxes with values starting from 1",
26 "for simple simulations, SW testing, and creating ROI masks.",
27 "Matrix and box x,y-dimension and z-dimension must be given in pixels.",
29 "Usage: @P [Options] matxydim matzdim boxxydim boxzdim outputfile",
32 " -format=<<TSV>|<CSV>|<float>|<short>>",
33 " Matrix data can be saved as tab separated values (TSV, default),",
34 " comma separated values (CSV), or as binary flat files with either",
35 " floats or short ints.",
39 " @P 128 15 16 1 boxes.txt",
41 " @P -format=float 128 15 16 1 boxes.bin",
42 " flat2img -scanner=931 boxes.bin boxes.img 15 1 128 128",
44 "See also: flat2img, asc2flat, simcirc, imgshrink, imgadd, imglkup, dft2img",
46 "Keywords: simulation, image, mask, software testing",
65int main(
int argc,
char **argv)
67 int ai, help=0, version=0, verbose=1;
68 char *cptr, outfile[FILENAME_MAX];
69 int matxydim, matzdim, boxxydim, boxzdim;
77 if(argc==1) {
tpcPrintUsage(argv[0], info, stderr);
return(1);}
78 matxydim=matzdim=boxxydim=boxzdim=-1;
81 for(ai=1; ai<argc; ai++)
if(*argv[ai]==
'-') {
83 cptr=argv[ai]+1;
if(*cptr==
'-') cptr++;
if(!*cptr)
continue;
84 if(strncasecmp(cptr,
"F=", 2)==0) {
86 if(!strcasecmp(cptr,
"TSV")) {csv_separator=2; output_format=0;
continue;}
87 if(!strcasecmp(cptr,
"CSV")) {csv_separator=0; output_format=0;
continue;}
88 if(!strcasecmp(cptr,
"FLOAT")) {output_format=1;
continue;}
89 if(!strcasecmp(cptr,
"SHORT")) {output_format=2;
continue;}
90 }
else if(strncasecmp(cptr,
"FORMAT=", 7)==0) {
92 if(!strcasecmp(cptr,
"TSV")) {csv_separator=2; output_format=0;
continue;}
93 if(!strcasecmp(cptr,
"CSV")) {csv_separator=0; output_format=0;
continue;}
94 if(!strcasecmp(cptr,
"FLOAT")) {output_format=1;
continue;}
95 if(!strcasecmp(cptr,
"SHORT")) {output_format=2;
continue;}
97 fprintf(stderr,
"Error: invalid option '%s'.\n", argv[ai]);
106 if(help==2) {
tpcHtmlUsage(argv[0], info,
"");
return(0);}
112 if(ai<argc) {
if(
atoiCheck(argv[ai++], &matxydim)) ret++;}
113 if(ai<argc) {
if(
atoiCheck(argv[ai++], &matzdim)) ret++;}
114 if(ai<argc) {
if(
atoiCheck(argv[ai++], &boxxydim)) ret++;}
115 if(ai<argc) {
if(
atoiCheck(argv[ai++], &boxzdim)) ret++;}
116 if(ret || matxydim<1 || matzdim<1 || boxxydim>matxydim || boxzdim>matzdim) {
117 fprintf(stderr,
"Error: invalid dimension.\n");
120 if(ai<argc) {
strlcpy(outfile, argv[ai], FILENAME_MAX); ai++;}
121 if(ai<argc) {fprintf(stderr,
"Error: too many arguments.\n");
return(1);}
125 fprintf(stderr,
"Error: missing command-line argument; use option --help\n");
132 printf(
"outfile := %s\n", outfile);
133 printf(
"matxydim := %d\n", matxydim);
134 printf(
"matzdim := %d\n", matzdim);
135 printf(
"boxxydim := %d\n", boxxydim);
136 printf(
"boxzdim := %d\n", boxzdim);
137 printf(
"csv_separator := %d\n", csv_separator);
138 printf(
"output_format := %d\n", output_format);
145 if(output_format==0) {
147 unsigned int size=matzdim*matxydim*matxydim;
149 fprintf(stderr,
"Error: too much data for text format.\n");
153 int a, b, c, zi, yi, xi, mb=0, mc=0;
154 int mat[matzdim][matxydim][matxydim];
155 for(zi=0; zi<matzdim; zi++) {
157 for(yi=0; yi<matxydim; yi++) {
159 for(xi=0; xi<matxydim; xi++) {
161 mat[zi][yi][xi]= 1 + c + b*(mc+1) + a*(mc+1)*(mb+1);
163 printf(
"mat[%d][%d][%d]=%d (%d %d %d) (%d %d)\n",
164 zi, yi, xi, mat[zi][yi][xi], a, b, c, mb, mc);
174 fprintf(stderr,
"Error: out of memory.\n");
181 ret=
csvPutInt(&csv, mat[zi][yi][xi], newline); newline=0;
187 fprintf(stderr,
"Error: cannot fill CSV data.\n");
192 else if(csv_separator==1) csv.
separator=
';';
193 else if(csv_separator==2) csv.
separator=
'\t';
197 if(strcasecmp(outfile,
"stdout")==0) {
200 fp=fopen(outfile,
"w");
202 fprintf(stderr,
"Error: cannot open file for write.\n");
211 if(verbose>1) printf(
"ret := %d\n", ret);
225 fp=fopen(outfile,
"wb");
227 fprintf(stderr,
"Error: cannot open file for write.\n");
231 int a, b, c, mb=0, mc=0, zi, yi, xi;
234 unsigned short int s;
242 mv=1 + c + b*(mc+1) + a*(mc+1)*(mb+1);
243 if(output_format==1) {
246 }
else if(output_format==2) {
247 s=(
unsigned short int)mv;
248 if(fwrite(&s,
sizeof(
unsigned short int), 1, fp) != 1)
258 fprintf(stderr,
"Error: cannot write in %s; disk full?\n", outfile);
int csvPutInt(CSV *csv, int v, int newline)
int csvAllocate(CSV *csv, int nr)
int csvWrite(CSV *csv, int regular, FILE *fp, TPCSTATUS *status)
int atoiCheck(const char *s, int *v)
int tpcProcessStdOptions(const char *s, int *print_usage, int *print_version, int *verbose_level)
int tpcHtmlUsage(const char *program, char *text[], const char *path)
void tpcPrintBuild(const char *program, FILE *fp)
void tpcPrintUsage(const char *program, char *text[], FILE *fp)
void statusInit(TPCSTATUS *s)
char * errorMsg(tpcerror e)
void statusSet(TPCSTATUS *s, const char *func, const char *srcfile, int srcline, tpcerror error)
size_t strlcpy(char *dst, const char *src, size_t dstsize)
int verbose
Verbose level, used by statusPrint() etc.
tpcerror error
Error code.
Header file for library libtpccsv.
Header file for library libtpcextensions.
@ TPCERROR_CANNOT_WRITE
Cannot write file.
Header file for library libtpcift.