28 memset(mat, 0,
sizeof(
PRMAT));
29 mat->
type=PRMAT_TYPE_NA;
32 mat->
mode=PRMAT_DMODE_01;
45 mat->
dime=(
unsigned int*)NULL;
48 mat->
status=PRMAT_STATUS_INITIALIZED;
62 if(mat->
status==PRMAT_STATUS_INITIALIZED)
return;
65 if(mat->
status==PRMAT_STATUS_LU_OCCUPIED) {
67 for(ir=0; ir<mat->
nrp; ir++) {
74 if(mat->
status==PRMAT_STATUS_PR_OCCUPIED ||
75 mat->
status==PRMAT_STATUS_BS_OCCUPIED )
78 for(ir=0; ir<mat->
dimr; ir++){
79 for(ip=0; ip<mat->
dime[ir]; ip++){
80 free((
unsigned short int*)mat->
_factdata[ir][ip]);
84 free((
int*)mat->
dime);
107 unsigned int *iptr, ir, ip;
108 if(
PRMAT_VERBOSE) printf(
"PRMAT:prmatAllocate(*mat,%d,*coords) \n",rows);
111 if(mat->
status==PRMAT_STATUS_UNINITIALIZED)
return(1);
112 if(rows<1)
return(2);
119 mat->
dime=calloc(rows,
sizeof(
int));
121 (
unsigned short int***)calloc(rows,
sizeof(
unsigned short int**));
125 for(ir=0,iptr=coords; ir<rows; ir++){
130 (
unsigned short int**)calloc(*iptr,
sizeof(
unsigned short int*));
134 for(ip=0; ip<(*iptr); ip++){
137 (
unsigned short int*)calloc(3,
sizeof(
unsigned short int));
138 if(mat->
_factdata[ir][ip]==NULL)
return(4);
148 mat->
_linesdata=(
unsigned int**)calloc(rows,
sizeof(
unsigned int*));
152 for(ir=0,iptr=coords; ir<rows; ir++){
154 mat->
_linesdata[ir]=(
unsigned int*)calloc(*iptr + 2,
sizeof(
unsigned int));
225 return mat->
lines[row][0];
239 return mat->
lines[row][1];
255 return mat->
lines[row][ind+2];
284 return(mat->
dime[row]);
299 return (
int)(mat->
fact[row][pix][1])*mat->
imgDim + (
int)(mat->
fact[row][pix][0]);
314 return (
int)(mat->
fact[row][pix][0]);
329 return (
int)(mat->
fact[row][pix][1]);
430 char matrixfile[FILENAME_MAX], semi_x_c[2], semi_y_c[2], mod[2];
432 unsigned short int x_coordinate, y_coordinate, value, p_coord, lors;
433 unsigned int lor, row, fac, ind;
438 sprintf(semi_x_c,
"%i",semi_x);
439 sprintf(semi_y_c,
"%i",semi_y);
441 if(mat->
type==PRMAT_TYPE_ECAT931) strcpy(matrixfile,
"prE");
443 if(mat->
type==PRMAT_TYPE_GE) strcpy(matrixfile,
"prG");
444 else strcpy(matrixfile,
"prN");
446 sprintf(mod,
"%i",mode);
447 strcat(matrixfile,mod);
448 strcat(matrixfile,semi_x_c);
449 strcat(matrixfile,semi_y_c);
450 strcat(matrixfile,
".prm");
452 if(access(matrixfile, 0) != -1) {
453 if(
PRMAT_VERBOSE) printf(
"PRMAT:File %s already exists.\n", matrixfile);
457 fp=fopen(matrixfile,
"wb+");
458 if(fp==NULL)
return(1);
461 fwrite(&(mat->
status),
sizeof(
int),1,fp);
464 fwrite(&(mat->
type),
sizeof(
int),1,fp);
467 fwrite(&(mat->
viewNr),
sizeof(
int),1,fp);
468 fwrite(&(mat->
binNr),
sizeof(
int),1,fp);
469 fwrite(&(mat->
imgDim),
sizeof(
int),1,fp);
472 fwrite(&(mat->
mode),
sizeof(
int),1,fp);
475 fwrite(&(mat->
prmatfov[0]),
sizeof(
int),1,fp);
476 fwrite(&(mat->
prmatfov[1]),
sizeof(
int),1,fp);
479 fwrite(&(mat->
min),
sizeof(
float),1,fp);
480 fwrite(&(mat->
max),
sizeof(
float),1,fp);
481 fwrite(&(mat->
factor_sum),
sizeof(
float),1,fp);
485 if(mat->
status >= PRMAT_STATUS_BS_OCCUPIED){
487 fwrite(&(mat->
dimr),
sizeof(
int),1,fp);
491 fwrite(&ftmp,
sizeof(
float),1,fp);
496 fwrite(&itmp,
sizeof(
int),1,fp);
503 fwrite(&x_coordinate,
sizeof(
unsigned short int),1,fp);
505 fwrite(&y_coordinate,
sizeof(
unsigned short int),1,fp);
507 value=mat->
fact[row][fac][2];
508 fwrite(&value,
sizeof(
unsigned short int),1,fp);
514 if(mat->
status == PRMAT_STATUS_LU_OCCUPIED){
516 fwrite(&(mat->
nrp),
sizeof(
int),1,fp);
520 fwrite(&p_coord,
sizeof(
unsigned short int),1,fp);
525 fwrite(&lors,
sizeof(
unsigned short int),1,fp);
532 fwrite(&lor,
sizeof(
unsigned int),1,fp);
552 unsigned int fov[2], *dimentry=NULL, *nrlor, *iptr, dimtmp, count=0;
553 unsigned int row, lor=0, ind, fac;
554 unsigned short int *nrlor_c, *nrlor_l, *usiptr, *usiptr_c;
555 unsigned short int x_coordinate=0, y_coordinate=0, value=0;
556 float *sqrsum=NULL, *fptr, sqrtmp;
559 if(
PRMAT_VERBOSE) printf(
"\n PRMAT:prmatReadMatrix(%s,mat) \n",fname);
560 if(mat->
status==PRMAT_STATUS_UNINITIALIZED)
return(1);
563 fp=fopen(fname,
"rb");
564 if(fp==NULL)
return(1);
567 if(fread(&(mat->
status),
sizeof(
int),1,fp)==0) {fclose(fp);
return(2);}
569 if(fread(&(mat->
type),
sizeof(
int),1,fp)==0) {fclose(fp);
return(2);}
571 if(fread(&(mat->
viewNr),
sizeof(
int),1,fp)==0) {fclose(fp);
return(2);}
572 if(fread(&(mat->
binNr),
sizeof(
int),1,fp)==0) {fclose(fp);
return(2);}
573 if(fread(&(mat->
imgDim),
sizeof(
int),1,fp)==0) {fclose(fp);
return(2);}
575 printf(
"PRMAT: scanner geometrics: (%i,%i,%i) \n",
577 if(fread(&(mat->
mode),
sizeof(
int),1,fp)==0) {fclose(fp);
return(2);}
579 if(fread(fov,
sizeof(
int),1,fp)==0) {fclose(fp);
return(2);}
580 if(fread((fov+1),
sizeof(
int),1,fp)==0) {fclose(fp);
return(2);}
581 mat->
prmatfov=calloc(2,
sizeof(
int));
587 if(fread(&(mat->
min),
sizeof(
float),1,fp)==0) {fclose(fp);
return(2);}
589 if(fread(&(mat->
max),
sizeof(
float),1,fp)==0) {fclose(fp);
return(2);}
591 if(fread(&(mat->
factor_sum),
sizeof(
float),1,fp)==0) {fclose(fp);
return(2);}
593 if(fread(&(mat->
scaling_factor),
sizeof(
float),1,fp)==0) {fclose(fp);
return(2);}
597 if(mat->
status >= PRMAT_STATUS_BS_OCCUPIED){
598 if(
PRMAT_VERBOSE) printf(
"PRMAT: reading projection matrix \n");
599 if(fread(&(mat->
dimr),
sizeof(
int),1,fp)==0) {fclose(fp);
return(2);}
601 printf(
"PRMAT: number of rows in the projection matrix: %i \n",mat->
dimr);
603 sqrsum=calloc(mat->
dimr,
sizeof(
float));
604 for(row=0, fptr=sqrsum;row<(mat->
dimr); row++, fptr++) {
605 if(fread(&sqrtmp,
sizeof(
float),1,fp)==0) {fclose(fp);
return(2);}
609 dimentry=(
unsigned int*)calloc(mat->
dimr,
sizeof(
int));
611 for(row=0,iptr=dimentry;row<(mat->
dimr);row++,iptr++){
612 if(fread(&dimtmp,
sizeof(
int),1,fp)==0) {fclose(fp);
return(2);}
620 printf(
"PRMAT:prmatAllocate(mat) done in prmatReadMatrix(%s,mat)\n",fname);
623 for(row=0, fptr=sqrsum;row<(mat->
dimr);row++, fptr++){
627 for(row=0;row<(mat->
dimr);row++){
630 if(fread(&x_coordinate,
sizeof(
unsigned short int),1,fp)==0) {
631 fclose(fp);
return(2);}
632 mat->
fact[row][fac][0]=x_coordinate;
633 if(fread(&y_coordinate,
sizeof(
unsigned short int),1,fp)==0) {
634 fclose(fp);
return(2);}
635 mat->
fact[row][fac][1]=y_coordinate;
636 if(fread(&value,
sizeof(
unsigned short int),1,fp)==0) {
637 fclose(fp);
return(2);}
638 mat->
fact[row][fac][2]=value;
644 if(mat->
status == PRMAT_STATUS_LU_OCCUPIED){
646 if(fread(&(mat->
nrp),
sizeof(
int),1,fp)==0) {fclose(fp);
return(2);}
648 printf(
"PRMAT: number of pixels inside the FOV: %i \n",mat->
nrp);
650 nrlor_c=(
unsigned short int*)calloc(mat->
nrp,
sizeof(
unsigned short int));
651 nrlor_l=(
unsigned short int*)calloc(mat->
nrp,
sizeof(
unsigned short int));
655 for(row=0; row<mat->
nrp; row++, usiptr++){
657 if(fread(usiptr,
sizeof(
unsigned short int),1,fp)==0) {fclose(fp);
return(2);}
661 for(row=0; row<mat->
nrp; row++, usiptr++){
663 if(fread(usiptr,
sizeof(
unsigned short int),1,fp)==0) {fclose(fp);
return(2);}
670 for(row=0; row<mat->
nrp; row++, usiptr++){
673 printf(
"PRMAT: nr of lors in lut: %i \n",count);
678 nrlor = (
unsigned int*)calloc(mat->
nrp,
sizeof(
int));
681 for(row=0; row<mat->
nrp; row++, iptr++){
682 *iptr = (int)*usiptr++;
688 printf(
"PRMAT:prmatAllocate(mat) done in prmatReadMatrix(%s,mat)\n",fname);
692 for(row=0;row<mat->
nrp;row++ , usiptr++, usiptr_c++){
693 mat->
lines[row][0] = *usiptr_c;
694 mat->
lines[row][1] = *usiptr;
700 if(fread(&lor,
sizeof(
unsigned int),1,fp)==0) {fclose(fp);
return(2);}
701 mat->
lines[row][ind+2] = lor;
705 free((
unsigned short int*)nrlor_l);
706 free((
unsigned short int*)nrlor_c);
709 if(
PRMAT_VERBOSE) printf(
"PRMAT: prmatReadMatrix() done. \n");
710 free((
float*)sqrsum); free((
int*)dimentry);
Header file for libtpcrec.
int PRMAT_TEST
If not 0 drive in test mode.
int PRMAT_VERBOSE
If not 0 drive in verbose mode.
unsigned int prmatGetNV(PRMAT *mat)
unsigned int prmatGetPIX(PRMAT *mat)
unsigned int prmatGetRays(PRMAT *mat, int row)
float prmatGetFactorSum(PRMAT *mat)
unsigned int prmatGetBinView(PRMAT *mat, int row, int ind)
float prmatGetMinor(PRMAT *mat)
unsigned int prmatGetRows(PRMAT *mat)
void prmatEmpty(PRMAT *mat)
void prmatInit(PRMAT *mat)
float prmatGetFactorSqrSum(PRMAT *mat, int row)
unsigned int prmatGetYCoord(PRMAT *mat, int row, int pix)
unsigned int prmatGetXCoord(PRMAT *mat, int row, int pix)
unsigned int prmatGetPixCoord(PRMAT *mat, int row)
unsigned int prmatGetCoord(PRMAT *mat, int row, int pix)
int prmatSaveMatrix(PRMAT *mat)
float prmatGetMin(PRMAT *mat)
unsigned int prmatGetID(PRMAT *mat)
float prmatGetMajor(PRMAT *mat)
int prmatReadMatrix(char *fname, PRMAT *mat)
int prmatAllocate(PRMAT *mat, int set, unsigned int rows, unsigned int *coords)
float prmatGetFactor(PRMAT *mat, int row, int pix)
unsigned int prmatGetPixels(PRMAT *mat, int row)
unsigned int prmatGetNB(PRMAT *mat)
float prmatGetMax(PRMAT *mat)
float max
Maximal factor value in the projection matrix.
float min
Minimal factor value in the projection matrix.
char type
Scanner information on the prmat. 0=ECAT931 1=GE Advance.
float * factor_sqr_sum
Square sums of factors in each row in the projection matrix.
unsigned short int *** fact
float scaling_factor
Scaling factor for factors (notice that factors are stored in integers).
unsigned int * dime
Number of pixels hit by a line for every line.
unsigned int imgDim
Scanner geometrics, field imgDim.
float factor_sum
The sum of all factors in the projection matrix.
unsigned int dimr
Dimension of rows (lines of response) in the projection matrix.
unsigned int nrp
Number of pixels inside the fov. i.e. number of rows in the look-up table.
unsigned int viewNr
Scanner geometrics, field viewNr.
unsigned int ** _linesdata
Hidden pointer for the actual data.
int mode
Discretisation model utilised.
unsigned int binNr
Scanner geometrics, field binNr.
unsigned short int *** _factdata
Hidden pointer for the actual data.