93 if(
ECAT7_TEST) printf(
"ecat7ReadMatlist(fp, mlist)\n");
94 if(fp==NULL)
return(1);
95 little=little_endian();
102 if(
ECAT7_TEST) printf(
" reading dirblock %d\n", blk);
112 if(ml->
matdir==NULL)
return(4);
117 next_blk = dirbuf[1];
118 prev_blk = dirbuf[2];
120 if(
ECAT7_TEST>1) printf(
"nr_free=%d next_blk=%d prev_blk=%d nr_used=%d\n", nr_free, next_blk, prev_blk, nr_used);
121 for(i=4; i<
MatBLKSIZE/4; i+=4)
if(dirbuf[i]>0) {
127 printf(
"matnum=%d strtblk=%d endblk=%d matstat=%d matrixNr=%d\n",
153 printf(
" matrix pl fr gate bed startblk blknr status\n");
156 printf(
"%4d %8d %3d %3d %3d %3d %8d %5d ", i+1, ml->
matdir[i].
id,
185 unsigned int i=0, dirblk, little, busy=1, nxtblk=0, oldsize;
188 if(
ECAT7_TEST) printf(
"ecat7EnterMatrix(fp, %d, %d)\n", matrix_id, block_nr);
190 if(fp==NULL || matrix_id<1 || block_nr<1)
return(-1);
192 little=little_endian();
196 if(ftell(fp)!=(dirblk-1)*
MatBLKSIZE)
return(-2);
203 for(i=4, nxtblk=dirblk+1; i<
MatBLKSIZE/4; i+=4) {
204 oldsize=dirbuf[i+2]-dirbuf[i+1]+1;
207 }
else if(dirbuf[i]==matrix_id) {
209 if(oldsize<block_nr) {
211 dirbuf[i] = 0xFFFFFFFF; dirbuf[i+3]=-1;
214 if(ftell(fp)!=(dirblk-1)*
MatBLKSIZE)
return(-6);
217 nxtblk=dirbuf[i+2]+1;
219 nxtblk=dirbuf[i+1]; dirbuf[0]++; dirbuf[3]--; busy=0;
224 if(dirbuf[i+3]==-1 && block_nr<=oldsize) {
227 nxtblk=dirbuf[i+1]; dirbuf[0]++; dirbuf[3]--; busy=0;
231 nxtblk=dirbuf[i+2]+1;
240 if(ftell(fp)!=(dirblk-1)*
MatBLKSIZE)
return(-9);
248 if(ftell(fp)!=(dirblk-1)*
MatBLKSIZE)
return(-11);
252 dirbuf[3]=0; dirblk=nxtblk;
258 dirbuf[i+2]=nxtblk+block_nr;
264 if(ftell(fp)!=(dirblk-1)*
MatBLKSIZE)
return(-15);
266 if(
ECAT7_TEST) printf(
"returning %d from ecat7EnterMatrix()\n", nxtblk);
284 ((bed & 0xF) << 12) |
286 ((gate & 0x3F) << 24) |
287 ((plane & 0xFF) << 16) |
288 ((plane & 0x300) << 1) |
289 ((data & 0x3) << 30) |
300 matval->
frame = matrix_id & 0x1FF;
301 matval->
plane = ((matrix_id >> 16) & 0xFF) + ((matrix_id >> 1) & 0x300);
302 matval->
gate = (matrix_id >> 24) & 0x3F;
303 matval->
data = ((matrix_id >> 30) & 0x3) + ((matrix_id >> 9) & 0x4);
304 matval->
bed = (matrix_id >> 12) & 0xF;
369 if(ml==NULL)
return(1);
411 int m, plane, frame, prev_plane, prev_frame, fnr, pnr;
415 if(plane_nr!=NULL) *plane_nr=0;
416 if(frame_nr!=NULL) *frame_nr=0;
421 prev_plane=plane=-1; prev_frame=frame=-1;
430 if(plane!=prev_plane) {
436 prev_plane=plane; prev_frame=frame;
439 if(plane_nr!=NULL) *plane_nr=pnr;
440 if(frame_nr!=NULL) *frame_nr=fnr;
456 int m, prev_blk, blk;
460 if(blk_nr!=NULL) *blk_nr=0;
469 if(blk_nr!=NULL) *blk_nr=blk;
490 short int *num_frames,
short int *num_gates,
short int *num_bed_pos) {
496 if(ml==NULL)
return(1);
501 if(matval == NULL)
return(3);
507 if(num_planes!=NULL) {
508 nmax=matval[0].
plane;
509 for(i=1; i<ml->
matrixNr; i++)
if(matval[i].plane>nmax) nmax=matval[i].
plane;
513 if(num_frames!=NULL) {
514 nmax=matval[0].
frame;
515 for(i=1; i<ml->
matrixNr; i++)
if(matval[i].frame>nmax) nmax=matval[i].
frame;
519 if(num_gates!=NULL) {
521 for(i=1; i<ml->
matrixNr; i++)
if(matval[i].gate>nmax) nmax=matval[i].
gate;
525 if(num_bed_pos!=NULL) {
527 for(i=1; i<ml->
matrixNr; i++)
if(matval[i].bed>nmax) nmax=matval[i].
bed;
532 if(num_planes!=NULL && *num_planes<=1)
switch(mh->
file_type) {
550 for(i=0, *num_planes=0; i<64; i++) *num_planes+=sh.
num_z_elements[i];
573 short int do_gates,
short int do_beds) {
577 if(ml==NULL)
return(1);
582 if(matval == NULL)
return(3);
590 while(ncurr <= ml->matrixNr) {
592 for(i=0, n=0; i<ml->
matrixNr; i++)
if(matval[i].plane==ncurr) {n=1;
break;}
594 if(n==1) {ncurr++;
continue;}
597 if(matval[i].plane>ncurr) {
599 matval[i].
plane--; n++;
609 while(ncurr <= ml->matrixNr) {
611 for(i=0, n=0; i<ml->
matrixNr; i++)
if(matval[i].frame==ncurr) {n=1;
break;}
613 if(n==1) {ncurr++;
continue;}
616 if(matval[i].frame>ncurr) {matval[i].
frame--; n++;}
625 while(ncurr <= ml->matrixNr) {
627 for(i=0, n=0; i<ml->
matrixNr; i++)
if(matval[i].gate==ncurr) {n=1;
break;}
629 if(n==1) {ncurr++;
continue;}
632 if(matval[i].gate>ncurr) {matval[i].
gate--; n++;}
641 while(ncurr <= ml->matrixNr) {
643 for(i=0, n=0; i<ml->
matrixNr; i++)
if(matval[i].bed==ncurr) {n=1;
break;}
645 if(n==1) {ncurr++;
continue;}
648 if(matval[i].bed>ncurr) {matval[i].
bed--; n++;}
656 matval[i].frame, matval[i].plane,
657 matval[i].gate, matval[i].data,
int ecat7ReadScanheader(FILE *fp, int blk, ECAT7_scanheader *h)
int ecat7DeleteLateFrames(ECAT7_MATRIXLIST *ml, int frame_nr)
int ecat7GatherMatlist(ECAT7_MATRIXLIST *ml, short int do_planes, short int do_frames, short int do_gates, short int do_beds)
int ecat7_val_to_id(int frame, int plane, int gate, int data, int bed)
void ecat7SortMatlistByFrame(ECAT7_MATRIXLIST *ml)
int ecat7GetPlaneAndFrameNr(ECAT7_MATRIXLIST *mlist, ECAT7_mainheader *h, int *plane_nr, int *frame_nr)
void ecat7InitMatlist(ECAT7_MATRIXLIST *mlist)
void ecat7PrintMatlist(ECAT7_MATRIXLIST *ml)
void ecat7EmptyMatlist(ECAT7_MATRIXLIST *mlist)
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 ecat7GetMatrixBlockSize(ECAT7_MATRIXLIST *mlist, int *blk_nr)
void ecat7_id_to_val(int matrix_id, ECAT7_Matval *matval)
int ecat7CheckMatlist(ECAT7_MATRIXLIST *ml)
int ecat7ReadMatlist(FILE *fp, ECAT7_MATRIXLIST *ml)
int ecat7EnterMatrix(FILE *fp, int matrix_id, int block_nr)
void ecat7SortMatlistByPlane(ECAT7_MATRIXLIST *ml)
int ecat7ReadImageheader(FILE *fp, int blk, ECAT7_imageheader *h)