int main( int argc , char * argv[] ) { /* --- variable declarations --- */ THD_3dim_dataset * dset ; THD_diskptr * dskptr; int nx, ny, nz, nv, itim; Boolean verbose, nsize; int ok; MRI_IMAGE * im, * im2d, * tim2d; MRI_TYPE kind; int ibr, iz, count, izz,izsub ; int zfirst, zlast, tfirst, tlast; char input_filename[THD_MAX_NAME], prefix_filename[THD_MAX_NAME], output_filename[THD_MAX_NAME], str[THD_MAX_NAME]; /* --- get user command line inputs --- */ F3D_initialize_user_data (argc, argv, &verbose, &nsize, &zfirst, &zlast, &tfirst, &tlast, input_filename, prefix_filename ); /* --- open 3d data set --- */ dset = THD_open_one_dataset( input_filename ) ; if( dset == NULL ) FatalError ("Unable to open input file") ; if ( verbose ) printf("EPsim: 3d Dataset File = %s\n" , input_filename ) ; /* --- load data block --- */ ok = THD_load_datablock( dset->dblk ); if ( !ok ) FatalError ("Unable to load data block") ; /* --- get data dimensions --- */ dskptr = dset->dblk->diskptr; nx = dskptr->dimsizes[0]; ny = dskptr->dimsizes[1]; nz = dskptr->dimsizes[2]; nv = dskptr->nvals; if ( verbose ) printf ("EPsim: nx=%d ny=%d nz=%d nv=%d\n", nx, ny, nz, nv); /* --- check for valid user inputs --- */ if (zfirst < 1) zfirst = 1; if (zlast > nz) zlast = nz; if (tfirst < 1) tfirst = 1; if (tlast > nv) tlast = nv; if (zfirst > nz) FatalError ("No data selected -- zfirst too large."); if (zlast < 1) FatalError ("No data selected -- zlast too small."); if (tfirst > nv) FatalError ("No data selected -- tfirst too large."); if (tlast < 1) FatalError ("No data selected -- tlast too small."); /* --- get data type --- */ kind = IMAGE_IN_IMARR ( dset->dblk->brick, 0 ) -> kind; if ( verbose ) printf ("EPsim: datum = %s \n", MRI_TYPE_name[kind]); /* --- create 2d data pointer --- */ im2d = mri_new_vol_empty ( nx, ny, 1, kind ); /*** open channel to AFNI ***/ sprintf( buf , "tcp:%s:%d" , host , get_port_named("CONTROL_PORT") ) ; ioc = iochan_init( buf , "create" ) ; if( ioc == NULL ) FatalError("Cannot open control channel to AFNI") ; if( verbose ) printf("EPsim: waiting for AFNI") ; fflush(stdout) ; while(1){ iz = iochan_goodcheck( ioc , 1000 ) ; if( iz < 0 ) FatalError("control channel failed") ; if( iz > 0 ) break ; if( verbose ){ printf(".") ; fflush(stdout) ; } } if( verbose ){ printf("!\n") ; fflush(stdout) ; } if( use_shm ) strcpy( buf , SHM_NAME ) ; else sprintf(buf , "tcp:%s:%d" , host , get_port_named("AFNI_PLUGOUT_TCP_BASE") ) ; if( use_child ){ jj = strlen(buf) ; sprintf(buf+jj,"\ncat epsim.out") ; } else if( use_3T ){ jj = strlen(buf) ; sprintf(buf+jj,"\n3T_toafni -dummy < %s" , fname_3T ) ; } if( verbose ) printf("sending control data: %s\n",buf) ; jj = iochan_sendall( ioc , buf , strlen(buf)+1 ) ; if( jj < 0 ) FatalError("send control data failed") ; iochan_sleep(LONG_DELAY) ; /* wait a bit */ while( ! iochan_clearcheck(ioc,LONG_DELAY) ) /* loop until cleared */ iochan_sleep(LONG_DELAY) ; if( verbose ) printf("EPsim: closing control channel\n") ; IOCHAN_CLOSE(ioc) ; /*** now open data channel ***/ ioc = iochan_init( buf , "create" ) ; if( ioc == NULL ) FatalError("Cannot open data channel to AFNI") ; if( verbose ) printf("EPsim: waiting for AFNI") ; fflush(stdout) ; while(1){ iz = iochan_goodcheck( ioc , 1000 ) ; if( iz < 0 ) FatalError("data channel failed") ; if( iz > 0 ) break ; if( verbose ){ printf(".") ; fflush(stdout) ; } } if( verbose ){ printf("!\n") ; fflush(stdout) ; } if( use_child ){ FILE * fp = fopen( "epsim.out" , "w" ) ; if( fp == NULL ){fprintf(stderr,"Can't open epsim.out!\n");IOCHAN_CLOSE(ioc);exit(1);} fprintf( fp , "ZNUM %d\n" "ZDELTA %g\n" "XYFOV %g %g\n" "ZFIRST %g%c\n" "ZORDER seq\n" "XYZAXES %s %s %s\n" "ACQUISITION_TYPE %s\n" , nz , fabs(dset->daxes->zzdel) , fabs(dset->daxes->xxdel)*nx , fabs(dset->daxes->yydel)*ny , fabs(dset->daxes->zzorg) , ORIENT_first[dset->daxes->zzorient] , ORIENT_shortstr[dset->daxes->xxorient] , ORIENT_shortstr[dset->daxes->yyorient] , ORIENT_shortstr[dset->daxes->zzorient] , ( ((zlast-zfirst)>0) ? "2D+zt" : "2D+z" ) ) ; fclose(fp) ; if( verbose ) printf("EPsim: wrote epsim.out file\n") ; sprintf( buf , "XYMATRIX %d %d\n" "DATUM %s\n" , nx , ny , MRI_TYPE_name[kind] ) ; } else if( use_3T ){ sprintf( buf , "XYMATRIX %d %d\n" "DATUM %s\n" , nx , ny , MRI_TYPE_name[kind] ) ; } else { sprintf( buf , "ZNUM %d\n" "ZDELTA %g\n" "XYFOV %g %g\n" "ZFIRST %g%c\n" "ZORDER seq\n" "XYZAXES %s %s %s\n" "ACQUISITION_TYPE %s\n" "XYMATRIX %d %d\n" "DATUM %s\n" , nz , fabs(dset->daxes->zzdel) , fabs(dset->daxes->xxdel)*nx , fabs(dset->daxes->yydel)*ny , fabs(dset->daxes->zzorg) , ORIENT_first[dset->daxes->zzorient] , ORIENT_shortstr[dset->daxes->xxorient] , ORIENT_shortstr[dset->daxes->yyorient] , ORIENT_shortstr[dset->daxes->zzorient] , ( ((zlast-zfirst)>0) ? "2D+zt" : "2D+z" ) , nx , ny , MRI_TYPE_name[kind] ) ; } nbytes = im2d->nvox * im2d->pixel_size ; for( itim=0 ; itim < ntimes ; itim++ ){ count = 0; if( use_3T ) izsub = (nz%2 == 0) ? (nz-1) : (nz) ; for ( ibr = tfirst-1 ; ibr < tlast ; ibr++ ) { for ( iz = zfirst-1 ; iz < zlast ; iz++ ) { /* --- set 2d data pointer into 3d data set --- */ im = IMAGE_IN_IMARR ( dset->dblk->brick, ibr ); if( use_3T ){ izz = 2*iz ; if( izz >= nz ) izz -= izsub ; /* alt ordering */ } else { izz = iz ; /* seq ordering */ } switch ( kind ) { case MRI_byte : mri_set_data_pointer(im2d, MRI_BYTE_PTR(im) + iz*nx*ny) ; break; case MRI_short : mri_set_data_pointer(im2d, MRI_SHORT_PTR(im) + iz*nx*ny) ; break; case MRI_int : mri_set_data_pointer(im2d, MRI_INT_PTR(im) + iz*nx*ny) ; break; case MRI_float : mri_set_data_pointer(im2d, MRI_FLOAT_PTR(im) + iz*nx*ny) ; break; case MRI_double : mri_set_data_pointer(im2d, MRI_DOUBLE_PTR(im) + iz*nx*ny) ; break; case MRI_complex : mri_set_data_pointer(im2d, MRI_COMPLEX_PTR(im) + iz*nx*ny) ; break; case MRI_rgb : mri_set_data_pointer(im2d, MRI_RGB_PTR(im) + 3*iz*nx*ny) ; break; default : FatalError ("Illegal data type encountered."); } #if 0 /* --- create 2d data file name --- */ strcpy ( output_filename, prefix_filename ); if ( nv > 1 ) sprintf ( str, "%02d.%04d", izz+1, ibr+1 ); else if ( nz > 999 ) sprintf ( str, ".%04d", izz+1 ); else sprintf ( str, ".%03d", izz+1 ); strcat ( output_filename, str ); #endif if( first ){ if( verbose ) printf("EPsim: sending this data as header info in image channel:\n%s\n",buf) ; jj = iochan_sendall( ioc , buf , strlen(buf)+1 ) ; if( jj < 0 ) FatalError("send header info failed") ; first = 0 ; } if ( verbose ) printf ( "EPsim: sending 2D image izz=%d ibr=%d\n", izz,ibr ); jj = iochan_sendall( ioc , mri_data_pointer(im2d) , nbytes ) ; if( jj < 0 ) FatalError("send image failed") ; iochan_sleep( delay ) ; #if 0 if ( !nsize ) ok = mri_write ( output_filename, im2d ); else { tim2d = mri_nsize (im2d); ok = mri_write ( output_filename, tim2d); mri_free (tim2d); } #endif count ++ ; } /* --- iz --- */ } /* --- ibr --- */ sleep(20) ; } /* -- itim --*/ if ( verbose ) printf ("Sent %d 2D images. \n", count); if( verbose ){ printf("Waiting for AFNI") ; fflush(stdout) ; } while(1){ jj = iochan_clearcheck(ioc,1000) ; if( jj ) break ; if( verbose ){ printf(".") ; fflush(stdout) ; } } if( verbose ) printf("!\n") ; iochan_sleep(100) ; IOCHAN_CLOSE(ioc) ; exit(0) ; }
MRI_IMAGE * FD_brick_to_series( int ixyz , FD_brick *br ) { MRI_IMAGE *im ; /* output */ int nv , ival ; char *iar ; /* brick in the input */ MRI_TYPE typ ; int ix,jy,kz , ind ; THD_ivec3 ind_fd , ind_ds ; if( ixyz < 0 || ixyz >= br->n1 * br->n2 * br->n3 ) return NULL ; /** otherwise, get ready for a real image **/ ix = ixyz % br->n1 ; jy = ( ixyz % (br->n1 * br->n2) ) / br->n1 ; kz = ixyz / (br->n1 * br->n2) ; LOAD_IVEC3( ind_fd , ix,jy,kz ) ; ind_ds = THD_fdind_to_3dind( br , ind_fd ) ; ix = ind_ds.ijk[0] ; jy = ind_ds.ijk[1] ; kz = ind_ds.ijk[2] ; ind = (kz * br->dset->daxes->nyy + jy) * br->dset->daxes->nxx + ix ; nv = br->dset->dblk->nvals ; iar = DSET_ARRAY(br->dset,0) ; if( iar == NULL ){ /* if data needs to be loaded from disk */ (void) THD_load_datablock( br->dset->dblk ) ; iar = DSET_ARRAY(br->dset,0) ; if( iar == NULL ) return NULL ; } /* 15 Sep 2004: allow for nonconstant datum */ if( !DSET_datum_constant(br->dset) ){ /* only for stupid users */ float *ar ; im = mri_new( nv , 1 , MRI_float ) ; ar = MRI_FLOAT_PTR(im) ; for( ival = 0 ; ival < nv ; ival++ ) ar[ival] = THD_get_voxel( br->dset , ind , ival ) ; goto image_done ; } /* the older (more efficient) way */ typ = DSET_BRICK_TYPE(br->dset,0) ; im = mri_new( nv , 1 , typ ) ; #if 0 mri_zero_image(im) ; /* 18 Oct 2001 */ #endif switch( typ ){ default: /* don't know what to do --> return nada */ mri_free( im ) ; return NULL ; case MRI_byte:{ byte *ar = MRI_BYTE_PTR(im) , *bar ; for( ival=0 ; ival < nv ; ival++ ){ bar = (byte *) DSET_ARRAY(br->dset,ival) ; if( bar != NULL ) ar[ival] = bar[ind] ; } } break ; case MRI_short:{ short *ar = MRI_SHORT_PTR(im) , *bar ; for( ival=0 ; ival < nv ; ival++ ){ bar = (short *) DSET_ARRAY(br->dset,ival) ; if( bar != NULL ) ar[ival] = bar[ind] ; } } break ; case MRI_float:{ float *ar = MRI_FLOAT_PTR(im) , *bar ; for( ival=0 ; ival < nv ; ival++ ){ bar = (float *) DSET_ARRAY(br->dset,ival) ; if( bar != NULL ) ar[ival] = bar[ind] ; } } break ; case MRI_int:{ int *ar = MRI_INT_PTR(im) , *bar ; for( ival=0 ; ival < nv ; ival++ ){ bar = (int *) DSET_ARRAY(br->dset,ival) ; if( bar != NULL ) ar[ival] = bar[ind] ; } } break ; case MRI_double:{ double *ar = MRI_DOUBLE_PTR(im) , *bar ; for( ival=0 ; ival < nv ; ival++ ){ bar = (double *) DSET_ARRAY(br->dset,ival) ; if( bar != NULL ) ar[ival] = bar[ind] ; } } break ; case MRI_complex:{ complex *ar = MRI_COMPLEX_PTR(im) , *bar ; for( ival=0 ; ival < nv ; ival++ ){ bar = (complex *) DSET_ARRAY(br->dset,ival) ; if( bar != NULL ) ar[ival] = bar[ind] ; } } break ; /* 15 Apr 2002: RGB types */ case MRI_rgb:{ rgbyte *ar = (rgbyte *) MRI_RGB_PTR(im) , *bar ; for( ival=0 ; ival < nv ; ival++ ){ bar = (rgbyte *) DSET_ARRAY(br->dset,ival) ; if( bar != NULL ) ar[ival] = bar[ind] ; } } break ; case MRI_rgba:{ rgba *ar = (rgba *) MRI_RGBA_PTR(im) , *bar ; for( ival=0 ; ival < nv ; ival++ ){ bar = (rgba *) DSET_ARRAY(br->dset,ival) ; if( bar != NULL ) ar[ival] = bar[ind] ; } } break ; } if( THD_need_brick_factor(br->dset) ){ MRI_IMAGE *qim ; qim = mri_mult_to_float( br->dset->dblk->brick_fac , im ) ; mri_free(im) ; im = qim ; } /* at this point, the image is ready to ship out; but first, maybe attach a time origin and spacing */ image_done: if( br->dset->taxis != NULL ){ /* 21 Oct 1996 */ float zz , tt ; zz = br->dset->daxes->zzorg + kz * br->dset->daxes->zzdel ; tt = THD_timeof( 0 , zz , br->dset->taxis ) ; im->xo = tt ; im->dx = br->dset->taxis->ttdel ; /* origin and delta */ if( br->dset->taxis->units_type == UNITS_MSEC_TYPE ){ /* convert to sec */ im->xo *= 0.001 ; im->dx *= 0.001 ; } } else { im->xo = 0.0 ; im->dx = 1.0 ; /* 08 Nov 1996 */ } return im ; }
MRI_IMAGE * FD_brick_to_mri( int kslice , int ival , FD_brick * br ) { MRI_IMAGE * im ; /* output */ register int ii,di,ei , jj,dj,ej , base , pp ; char * iar ; /* brick in the input */ MRI_TYPE typ ; /** desire a fake image **/ if( ival < 0 ){ im = mri_new( br->n1 , br->n2 , MRI_short ) ; im->dx = br->del1 ; im->dy = br->del2 ; im->dz = br->del3 ; return im ; } /** otherwise, get ready for a real image **/ if( ival >= br->dset->dblk->nvals ) return NULL ; iar = DSET_ARRAY(br->dset,ival) ; if( iar == NULL ){ /* if data needs to be loaded from disk */ (void) THD_load_datablock( br->dset->dblk ) ; iar = DSET_ARRAY(br->dset,ival) ; if( iar == NULL ) return NULL ; } typ = DSET_BRICK_TYPE(br->dset,ival) ; im = mri_new( br->n1 , br->n2 , typ ) ; im->dx = br->del1 ; im->dy = br->del2 ; im->dz = br->del3 ; switch( typ ){ default: /* don't know what to do --> return nada */ mri_free( im ) ; return NULL ; case MRI_byte:{ register byte * ar = MRI_BYTE_PTR(im) ; register byte * bar = (byte *) iar ; di = br->d1 ; dj = br->d2 ; /* strides */ ei = br->e1 ; ej = br->e2 ; /* final indices */ base = br->start + kslice * br->d3 ; pp = 0 ; for( jj=0 ; jj != ej ; jj += dj ) for( ii=0 ; ii != ei ; ii += di ) ar[pp++] = bar[ii+(jj+base)] ; } break ; case MRI_short:{ register short * ar = MRI_SHORT_PTR(im) ; register short * bar = (short *) iar ; di = br->d1 ; dj = br->d2 ; /* strides */ ei = br->e1 ; ej = br->e2 ; /* final indices */ base = br->start + kslice * br->d3 ; pp = 0 ; for( jj=0 ; jj != ej ; jj += dj ) for( ii=0 ; ii != ei ; ii += di ) ar[pp++] = bar[ii+(jj+base)] ; } break ; case MRI_float:{ register float * ar = MRI_FLOAT_PTR(im) ; register float * bar = (float *) iar ; di = br->d1 ; dj = br->d2 ; /* strides */ ei = br->e1 ; ej = br->e2 ; /* final indices */ base = br->start + kslice * br->d3 ; pp = 0 ; for( jj=0 ; jj != ej ; jj += dj ) for( ii=0 ; ii != ei ; ii += di ) ar[pp++] = bar[ii+(jj+base)] ; } break ; case MRI_int:{ register int * ar = MRI_INT_PTR(im) ; register int * bar = (int *) iar ; di = br->d1 ; dj = br->d2 ; /* strides */ ei = br->e1 ; ej = br->e2 ; /* final indices */ base = br->start + kslice * br->d3 ; pp = 0 ; for( jj=0 ; jj != ej ; jj += dj ) for( ii=0 ; ii != ei ; ii += di ) ar[pp++] = bar[ii+(jj+base)] ; } break ; case MRI_double:{ register double * ar = MRI_DOUBLE_PTR(im) ; register double * bar = (double *) iar ; di = br->d1 ; dj = br->d2 ; /* strides */ ei = br->e1 ; ej = br->e2 ; /* final indices */ base = br->start + kslice * br->d3 ; pp = 0 ; for( jj=0 ; jj != ej ; jj += dj ) for( ii=0 ; ii != ei ; ii += di ) ar[pp++] = bar[ii+(jj+base)] ; } break ; case MRI_complex:{ register complex * ar = MRI_COMPLEX_PTR(im) ; register complex * bar = (complex *) iar ; di = br->d1 ; dj = br->d2 ; /* strides */ ei = br->e1 ; ej = br->e2 ; /* final indices */ base = br->start + kslice * br->d3 ; pp = 0 ; for( jj=0 ; jj != ej ; jj += dj ) for( ii=0 ; ii != ei ; ii += di ) ar[pp++] = bar[ii+(jj+base)] ; } break ; case MRI_rgb:{ /* 15 Apr 2002 */ register rgbyte * ar = (rgbyte *) MRI_RGB_PTR(im) ; register rgbyte * bar = (rgbyte *) iar ; di = br->d1 ; dj = br->d2 ; /* strides */ ei = br->e1 ; ej = br->e2 ; /* final indices */ base = br->start + kslice * br->d3 ; pp = 0 ; for( jj=0 ; jj != ej ; jj += dj ) for( ii=0 ; ii != ei ; ii += di ) ar[pp++] = bar[ii+(jj+base)] ; } break ; } if( DSET_BRICK_FACTOR(br->dset,ival) != 0.0 ){ MRI_IMAGE * qim ; STATUS(" scaling to float"); qim = mri_scale_to_float( DSET_BRICK_FACTOR(br->dset,ival) , im ) ; mri_free(im) ; im = qim ; } return im ; }
MRI_IMARR * THD_extract_many_series( int ns, int *ind, THD_3dim_dataset *dset ) { MRI_IMARR *imar ; /* output */ MRI_IMAGE *im ; int nv , ival , kk ; char *iar ; /* brick in the input */ float **far ; /* 27 Feb 2003: ptrs to output */ ENTRY("THD_extract_many_series") ; if( ns <= 0 || ind == NULL | dset == NULL ) RETURN( NULL ); /* try to load dataset */ nv = dset->dblk->nvals ; iar = DSET_ARRAY(dset,0) ; if( iar == NULL ){ /* if data needs to be loaded from disk */ (void) THD_load_datablock( dset->dblk ) ; iar = DSET_ARRAY(dset,0) ; if( iar == NULL ){ static int nerr=0 ; if( nerr < 2 ){ ERROR_message("Can't load dataset %s",DSET_HEADNAME(dset)); nerr++; } RETURN( NULL ); } } /* create output */ far = (float **) malloc(sizeof(float *)*ns) ; /* 27 Feb 2003 */ NULL_CHECK(far) ; INIT_IMARR(imar) ; for( kk=0 ; kk < ns ; kk++ ){ im = mri_new( nv , 1 , MRI_float ) ; /* N.B.: now does 0 fill */ far[kk] = MRI_FLOAT_PTR(im) ; /* ptr to kk-th output series */ ADDTO_IMARR(imar,im) ; } /* fill the output */ switch( DSET_BRICK_TYPE(dset,0) ){ default: /* don't know what to do --> return nada */ DESTROY_IMARR(imar) ; free(far) ; RETURN( NULL ); case MRI_byte:{ byte * bar ; for( ival=0 ; ival < nv ; ival++ ){ bar = (byte *) DSET_ARRAY(dset,ival) ; if( bar != NULL ){ for( kk=0 ; kk < ns ; kk++ ){ far[kk][ival] = (float)bar[ind[kk]] ; } } } } break ; case MRI_short:{ short * bar ; for( ival=0 ; ival < nv ; ival++ ){ bar = (short *) DSET_ARRAY(dset,ival) ; if( bar != NULL ){ for( kk=0 ; kk < ns ; kk++ ){ far[kk][ival] = (float)bar[ind[kk]] ; } } } } break ; case MRI_float:{ float * bar ; for( ival=0 ; ival < nv ; ival++ ){ bar = (float *) DSET_ARRAY(dset,ival) ; if( bar != NULL ){ for( kk=0 ; kk < ns ; kk++ ){ far[kk][ival] = bar[ind[kk]] ; } } } } break ; #if 0 case MRI_int:{ int * bar ; for( ival=0 ; ival < nv ; ival++ ){ bar = (int *) DSET_ARRAY(dset,ival) ; if( bar != NULL ){ for( kk=0 ; kk < ns ; kk++ ){ far[kk][ival] = bar[ind[kk]] ; } } } } break ; case MRI_double:{ double * bar ; for( ival=0 ; ival < nv ; ival++ ){ bar = (double *) DSET_ARRAY(dset,ival) ; if( bar != NULL ){ for( kk=0 ; kk < ns ; kk++ ){ far[kk][ival] = (float)bar[ind[kk]] ; } } } } break ; #endif case MRI_complex:{ complex * bar ; for( ival=0 ; ival < nv ; ival++ ){ bar = (complex *) DSET_ARRAY(dset,ival) ; if( bar != NULL ){ for( kk=0 ; kk < ns ; kk++ ){ far[kk][ival] = bar[ind[kk]].r ; } } } } break ; } /* scale outputs, if needed */ if( THD_need_brick_factor(dset) ){ MRI_IMAGE *qim ; for( kk=0 ; kk < ns ; kk++ ){ im = IMARR_SUBIMAGE(imar,kk) ; qim = mri_mult_to_float( dset->dblk->brick_fac , im ) ; mri_free(im) ; IMARR_SUBIMAGE(imar,kk) = qim ; } } #if 0 /* 27 Feb 2003 */ /* convert to floats, if needed */ if( IMARR_SUBIMAGE(imar,0)->kind != MRI_float ){ MRI_IMAGE * qim ; for( kk=0 ; kk < ns ; kk++ ){ im = IMARR_SUBIMAGE(imar,kk) ; qim = mri_to_float( im ) ; mri_free(im) ; IMARR_SUBIMAGE(imar,kk) = qim ; } } #endif /* add time axis stuff to output images, if present */ if( dset->taxis != NULL ){ float zz , tt ; int kz ; for( kk=0 ; kk < ns ; kk++ ){ kz = ind[kk] / ( dset->daxes->nxx * dset->daxes->nyy ) ; zz = dset->daxes->zzorg + kz * dset->daxes->zzdel ; tt = THD_timeof( 0 , zz , dset->taxis ) ; im = IMARR_SUBIMAGE(imar,kk) ; im->xo = tt ; im->dx = dset->taxis->ttdel ; /* origin and delta */ if( dset->taxis->units_type == UNITS_MSEC_TYPE ){ /* convert to sec */ im->xo *= 0.001 ; im->dx *= 0.001 ; } } } else { for( kk=0 ; kk < ns ; kk++ ){ im = IMARR_SUBIMAGE(imar,kk) ; im->xo = 0.0 ; im->dx = 1.0 ; } } free(far) ; RETURN(imar); }