55 if(verbose>0) printf(
"ecat7ReadMatlist(fp, mlist)\n");
56 if(fp==NULL)
return(1);
64 if(verbose>1) printf(
" reading dirblock %d\n", blk);
74 if(ml->
matdir==NULL)
return(4);
82 if(verbose>2) printf(
"nr_free=%d next_blk=%d prev_blk=%d nr_used=%d\n", nr_free, next_blk, prev_blk, nr_used);
83 for(
int i=4; i<
MatBLKSIZE/4; i+=4)
if(dirbuf[i]>0) {
89 printf(
"matnum=%d strtblk=%d endblk=%d matstat=%d matrixNr=%d\n",
99 fseeko(fp, pos, SEEK_SET);
if(ftello(fp)!=pos) err=1;
116 printf(
"nr matrix pl fr gate bed startblk blknr status\n");
119 printf(
"%4d %8d %3d %3d %3d %3d %8d %5d ", i+1, ml->
matdir[i].
id,
148 unsigned int i=0, dirblk, little, busy=1, nxtblk=0, oldsize;
151 if(
ECAT7_TEST) printf(
"ecat7EnterMatrix(fp, %d, %d)\n", matrix_id, block_nr);
153 if(fp==NULL || matrix_id<1 || block_nr<1)
return(-1);
159 if(ftell(fp)!=(
int)(dirblk-1)*
MatBLKSIZE)
return(-2);
166 for(i=4, nxtblk=dirblk+1; i<
MatBLKSIZE/4; i+=4) {
167 oldsize=dirbuf[i+2]-dirbuf[i+1]+1;
170 }
else if(dirbuf[i]==matrix_id) {
172 if(oldsize<(
unsigned int)block_nr) {
174 dirbuf[i] = 0xFFFFFFFF; dirbuf[i+3]=-1;
176 long long pos=(dirblk-1)*(
long long)
MatBLKSIZE;
177 fseeko(fp, pos, SEEK_SET);
if(ftello(fp)!=pos)
return(-6);
180 nxtblk=dirbuf[i+2]+1;
182 nxtblk=dirbuf[i+1]; dirbuf[0]++; dirbuf[3]--; busy=0;
187 if(dirbuf[i+3]==-1 && (
unsigned int)block_nr<=oldsize) {
190 nxtblk=dirbuf[i+1]; dirbuf[0]++; dirbuf[3]--; busy=0;
194 nxtblk=dirbuf[i+2]+1;
202 long long pos=(dirblk-1)*(
long long)
MatBLKSIZE;
203 fseeko(fp, pos, SEEK_SET);
if(ftello(fp)!=pos)
return(-9);
210 long long pos=(dirblk-1)*(
long long)
MatBLKSIZE;
211 fseeko(fp, pos, SEEK_SET);
if(ftello(fp)!=pos)
return(-11);
215 dirbuf[3]=0; dirblk=nxtblk;
221 dirbuf[i+2]=nxtblk+block_nr;
226 long long pos=(dirblk-1)*(
long long)
MatBLKSIZE;
227 fseeko(fp, pos, SEEK_SET);
if(ftello(fp)!=pos)
return(-15);
229 if(
ECAT7_TEST) printf(
"returning %d from ecat7EnterMatrix()\n", nxtblk);
247 ((bed & 0xF) << 12) |
249 ((gate & 0x3F) << 24) |
250 ((plane & 0xFF) << 16) |
251 ((plane & 0x300) << 1) |
252 ((data & 0x3) << 30) |
263 matval->
frame = matrix_id & 0x1FF;
264 matval->
plane = ((matrix_id >> 16) & 0xFF) + ((matrix_id >> 1) & 0x300);
265 matval->
gate = (matrix_id >> 24) & 0x3F;
266 matval->
data = ((matrix_id >> 30) & 0x3) + ((matrix_id >> 9) & 0x4);
267 matval->
bed = (matrix_id >> 12) & 0xF;
332 if(ml==NULL)
return(1);
374 int m, plane, frame, prev_plane, prev_frame, fnr, pnr;
377 if(mlist==NULL)
return STATUS_FAULT;
378 if(plane_nr!=NULL) *plane_nr=0;
379 if(frame_nr!=NULL) *frame_nr=0;
384 prev_plane=plane=-1; prev_frame=frame=-1;
393 if(plane!=prev_plane) {
397 if(prev_frame>0 && frame!=prev_frame+1)
return STATUS_MISSINGMATRIX;
399 prev_plane=plane; prev_frame=frame;
401 if(fnr*pnr != mlist->
matrixNr)
return STATUS_MISSINGMATRIX;
402 if(plane_nr!=NULL) *plane_nr=pnr;
403 if(frame_nr!=NULL) *frame_nr=fnr;
419 int m, prev_blk, blk;
422 if(mlist==NULL)
return STATUS_FAULT;
423 if(blk_nr!=NULL) *blk_nr=0;
429 if(blk!=prev_blk)
return STATUS_VARMATSIZE;
432 if(blk_nr!=NULL) *blk_nr=blk;
453 short int *num_frames,
short int *num_gates,
short int *num_bed_pos) {
459 if(ml==NULL)
return(1);
464 if(matval == NULL)
return(3);
470 if(num_planes!=NULL) {
471 nmax=matval[0].
plane;
472 for(i=1; i<ml->
matrixNr; i++)
if(matval[i].plane>nmax) nmax=matval[i].
plane;
476 if(num_frames!=NULL) {
477 nmax=matval[0].
frame;
478 for(i=1; i<ml->
matrixNr; i++)
if(matval[i].frame>nmax) nmax=matval[i].
frame;
482 if(num_gates!=NULL) {
484 for(i=1; i<ml->
matrixNr; i++)
if(matval[i].gate>nmax) nmax=matval[i].
gate;
488 if(num_bed_pos!=NULL) {
490 for(i=1; i<ml->
matrixNr; i++)
if(matval[i].bed>nmax) nmax=matval[i].
bed;
495 if(num_planes!=NULL && *num_planes<=1)
switch(mh->
file_type) {
513 for(i=0, *num_planes=0; i<64; i++) *num_planes+=sh.
num_z_elements[i];
536 short int do_gates,
short int do_beds) {
540 if(ml==NULL)
return(1);
545 if(matval == NULL)
return(3);
553 while(ncurr <= ml->matrixNr) {
555 for(i=0, n=0; i<ml->
matrixNr; i++)
if(matval[i].plane==ncurr) {n=1;
break;}
557 if(n==1) {ncurr++;
continue;}
560 if(matval[i].plane>ncurr) {
562 matval[i].
plane--; n++;
572 while(ncurr <= ml->matrixNr) {
574 for(i=0, n=0; i<ml->
matrixNr; i++)
if(matval[i].frame==ncurr) {n=1;
break;}
576 if(n==1) {ncurr++;
continue;}
579 if(matval[i].frame>ncurr) {matval[i].
frame--; n++;}
588 while(ncurr <= ml->matrixNr) {
590 for(i=0, n=0; i<ml->
matrixNr; i++)
if(matval[i].gate==ncurr) {n=1;
break;}
592 if(n==1) {ncurr++;
continue;}
595 if(matval[i].gate>ncurr) {matval[i].
gate--; n++;}
604 while(ncurr <= ml->matrixNr) {
606 for(i=0, n=0; i<ml->
matrixNr; i++)
if(matval[i].bed==ncurr) {n=1;
break;}
608 if(n==1) {ncurr++;
continue;}
611 if(matval[i].bed>ncurr) {matval[i].
bed--; n++;}
619 matval[i].frame, matval[i].plane,
620 matval[i].gate, matval[i].data,
void ecat7InitMatlist(ECAT7_MATRIXLIST *mlist)
void ecat7SortMatlistByFrame(ECAT7_MATRIXLIST *ml)
int ecat7GetPlaneAndFrameNr(ECAT7_MATRIXLIST *mlist, ECAT7_mainheader *h, int *plane_nr, int *frame_nr)
int ecat7GetMatrixBlockSize(ECAT7_MATRIXLIST *mlist, int *blk_nr)
void ecat7SortMatlistByPlane(ECAT7_MATRIXLIST *ml)
void ecat7_id_to_val(int matrix_id, ECAT7_Matval *matval)
int ecat7GetNums(ECAT7_MATRIXLIST *ml, ECAT7_mainheader *mh, FILE *fp, short int *num_planes, short int *num_frames, short int *num_gates, short int *num_bed_pos)
int ecat7ReadMatlist(FILE *fp, ECAT7_MATRIXLIST *ml, int verbose)
void ecat7EmptyMatlist(ECAT7_MATRIXLIST *mlist)
int ecat7EnterMatrix(FILE *fp, int matrix_id, int block_nr)
int ecat7_val_to_id(int frame, int plane, int gate, int data, int bed)
int ecat7GatherMatlist(ECAT7_MATRIXLIST *ml, short int do_planes, short int do_frames, short int do_gates, short int do_beds)
void ecat7PrintMatlist(ECAT7_MATRIXLIST *ml)
int ecat7DeleteLateFrames(ECAT7_MATRIXLIST *ml, int frame_nr)
int ecat7CheckMatlist(ECAT7_MATRIXLIST *ml)
int ecat7ReadScanheader(FILE *fp, int blk, ECAT7_scanheader *h)
int ecat7ReadImageheader(FILE *fp, int blk, ECAT7_imageheader *h)
Header file for libtpcimgio.
void swawbip(void *buf, long long int size)