Skip to content

AFNI/NIfTI Server

Sections
Personal tools
You are here: Home » AFNI » Documentation

Doxygen Source Code Documentation


Main Page   Alphabetical List   Data Structures   File List   Data Fields   Globals   Search  

thd_fetchdset.c

Go to the documentation of this file.
00001 #include "mrilib.h"
00002 
00003 /*---------------------------------------------------------------------
00004    23 Mar 2001: Load a dataset across the Web!
00005 -----------------------------------------------------------------------*/
00006 
00007 THD_3dim_dataset * THD_fetch_dataset( char * url )
00008 {
00009    char *cp,*hp,*bp , *thp ;
00010    int nhp,nbp , iv ;
00011    THD_3dim_dataset * dset ;
00012    int native_order ;
00013 
00014 ENTRY("THD_fetch_dset") ;
00015 
00016    if( url == NULL || url[0] == '\0' ) RETURN(NULL) ;
00017 
00018    if( STRING_HAS_SUFFIX(url,".hdr") ) RETURN(NULL) ;  /* 27 Aug 2002 */
00019 
00020    /*** do we have to add .HEAD? ***/
00021 
00022    hp = AFMALL(char, sizeof(char)*(strlen(url)+32)) ; strcpy(hp,url) ;
00023    cp = strstr(hp,".HEAD") ;
00024    if( cp == NULL                       &&
00025        !STRING_HAS_SUFFIX(hp,".nii")    &&  /* 28 Aug 2003 */
00026        !STRING_HAS_SUFFIX(hp,".nii.gz") &&  /* 06 Apr 2005 */
00027        !STRING_HAS_SUFFIX(hp,".mnc")    &&
00028        !STRING_HAS_SUFFIX(hp,".mnc.gz")   ) strcat(hp,".HEAD") ;
00029 
00030    /*** read the .HEAD file to a temporary file ***/
00031 
00032    fprintf(stderr,"\n+++ Trying to fetch %s",hp) ;
00033    nhp = NI_read_URL_tmpdir( hp , &thp ) ;
00034    if( nhp <= 0 ){ fprintf(stderr," **FAILED\n"); free(hp); RETURN(NULL); }
00035 
00036    /*** try to open it as a dataset header ***/
00037 
00038    fprintf(stderr,": %d bytes read\n ++ Trying to initialize dataset %s\n",nhp,thp) ;
00039    THD_allow_empty_dataset(1) ;
00040    dset = THD_open_one_dataset(thp) ;
00041    if( DSET_IS_MINC(dset) || DSET_IS_NIFTI(dset) ) DSET_load(dset) ;  /* 29 Oct 2001 */
00042    THD_allow_empty_dataset(0) ;
00043    unlink(thp) ; free(thp) ;
00044    if( dset == NULL ){ fprintf(stderr," ** Can't decode %s\n",hp); free(hp); RETURN(NULL); }
00045 
00046    if( DSET_IS_VOLUMES(dset) ){  /* 20 Jun 2002 */
00047      fprintf(stderr," ** Can't load %s by volumes!\n",hp); free(hp);
00048      DSET_delete(dset); RETURN(NULL);
00049    }
00050 
00051    DSET_superlock(dset) ;  /* don't let be deleted from memory */
00052    if( DSET_IS_MINC(dset) || DSET_IS_NIFTI(dset) ) RETURN(dset) ;  /* 29 Oct 2001 */
00053    DSET_mallocize(dset) ;
00054 
00055    /*** try to read the .BRIK or .BRIK.gz file into memory ***/
00056 
00057    strcpy( hp+(strlen(hp)-5) , ".BRIK.gz" ) ;
00058    fprintf(stderr," ++ Trying to fetch %s",hp) ; iochan_sleep(100) ;
00059    nbp = NI_read_URL( hp , &bp ) ;
00060    if( nbp <= 0 ){
00061       iv = strlen(hp) ; hp[iv-3] = '\0' ; /* remove the .gz and try again */
00062       fprintf(stderr," ** FAILED!\n ++ Trying to fetch %s",hp) ; iochan_sleep(100) ;
00063       nbp = NI_read_URL( hp , &bp ) ;
00064       if( nbp <= 0 ){
00065          fprintf(stderr," ** FAILED\n");
00066          free(hp); DSET_delete(dset); RETURN(NULL);
00067       }
00068    }
00069    if( nbp < dset->dblk->total_bytes ){
00070       fprintf(stderr,"\n ** Got %s but only had %d bytes, but needed %lld\n",
00071               hp,nbp,dset->dblk->total_bytes) ;
00072       free(bp) ; free(hp) ; DSET_delete(dset) ; RETURN(NULL) ;
00073    }
00074    fprintf(stderr,": %d bytes read\n",nbp) ;
00075 
00076    /** now have data: build pointers, load bricks, return **/
00077 
00078    for( iv=0 ; iv < DSET_NVALS(dset) ; iv++ ){
00079       mri_fix_data_pointer( bp , DBLK_BRICK(dset->dblk,iv) ) ;
00080       bp += DBLK_BRICK_BYTES(dset->dblk,iv) ;
00081    }
00082 
00083    /** perhaps need to swap bytes **/
00084 
00085    native_order = mri_short_order() ;
00086 
00087    if( dset->dblk->diskptr->byte_order <= 0 )
00088       dset->dblk->diskptr->byte_order = native_order ;
00089 
00090    if( dset->dblk->diskptr->byte_order != native_order ){
00091       for( iv=0 ; iv < DSET_NVALS(dset) ; iv++ ){
00092          switch( DBLK_BRICK_TYPE(dset->dblk,iv) ){
00093             case MRI_short:
00094                mri_swap2( DBLK_BRICK_NVOX(dset->dblk,iv) , DBLK_ARRAY(dset->dblk,iv) ) ;
00095             break ;
00096 
00097             case MRI_complex:  /* 14 Sep 1999: swap complex also! */
00098                mri_swap4( 2*DBLK_BRICK_NVOX(dset->dblk,iv), DBLK_ARRAY(dset->dblk,iv)) ;
00099             break ;
00100 
00101             case MRI_float:
00102             case MRI_int:
00103                mri_swap4( DBLK_BRICK_NVOX(dset->dblk,iv) , DBLK_ARRAY(dset->dblk,iv) ) ;
00104             break ;
00105          }
00106       }
00107    }
00108 
00109    free(hp) ; RETURN(dset) ;
00110 }
00111 
00112 /*------------------------------------------------------------------------------
00113   26 Mar 2001: fetch a 1D file across the Web
00114 --------------------------------------------------------------------------------*/
00115 
00116 MRI_IMAGE * THD_fetch_1D( char * url )
00117 {
00118    char *fname ;
00119    int nhp , ii ;
00120    MRI_IMAGE * flim ;
00121    float * far ;
00122 
00123 ENTRY("THD_fetch_1D") ;
00124 
00125    if( url == NULL || url[0] == '\0' ) RETURN(NULL) ;
00126 
00127    fprintf(stderr,"\n+++ Trying to fetch %s",url) ;
00128    nhp = NI_read_URL_tmpdir( url , &fname ) ;
00129    if( nhp <= 0 ){ fprintf(stderr," **FAILED\n"); RETURN(NULL); }
00130    fprintf(stderr,": %d bytes read",nhp) ;
00131    flim = mri_read_1D(fname) ; unlink(fname) ; free(fname) ;
00132    if( flim != NULL ){
00133       mri_add_name( url , flim ) ; fprintf(stderr,": %dx%d file\n",flim->nx,flim->ny) ;
00134       far = MRI_FLOAT_PTR(flim) ;
00135       for( ii=0 ; ii < flim->nvox ; ii++ )
00136          if( fabs(far[ii]) >= 33333.0 ) far[ii] = WAY_BIG ;
00137    } else {
00138       fprintf(stderr," **Can't read as a .1D file!\n") ;
00139    }
00140    RETURN(flim) ;
00141 }
00142 
00143 /*------------------------------------------------------------------------------
00144    Load a bunch of datasets, whose names are read from a file given
00145    by URL -- the datasets are all fetched from the same place as the URL.
00146 --------------------------------------------------------------------------------*/
00147 
00148 XtPointer_array * THD_fetch_many_datasets( char * url )
00149 {
00150    XtPointer_array * dsar ;
00151    int nlist , i1,i2 , nh , ll , nx ;
00152    char * list ;
00153    char * tnam , * hnam , * dnam ;
00154    THD_3dim_dataset * dset ;
00155 
00156 ENTRY("THD_fetch_many_datasets") ;
00157 
00158    if( url == NULL || url[0] == '\0' ) RETURN(NULL) ;
00159 
00160    /* make hnam be the URL directory (without the trailing filename) */
00161 
00162    hnam = (char *) malloc(sizeof(char)*(strlen(url)+16)) ;
00163    strcpy(hnam,url) ;
00164    tnam = THD_trailname( hnam , 0 ) ;                /* start of trailing name */
00165    if( tnam == hnam ){ free(hnam); RETURN(NULL); }
00166    *tnam = '\0' ; nh = strlen(hnam) ;                /* cut trailing name off */
00167 
00168    /* get the list of filenames */
00169 
00170    fprintf(stderr,"\n+++ Trying to fetch %s",url) ;
00171    nlist = NI_read_URL( url , &list ) ;
00172    if( nlist <= 0 ){
00173       fprintf(stderr," **FAILED\n"); free(hnam); RETURN(NULL);
00174    }
00175    fprintf(stderr,": %d bytes read\n",nlist) ;
00176 
00177    /* scan from list[i1] forward, looking for filenames to fetch */
00178 
00179    i1 = 0 ; INIT_XTARR(dsar) ;
00180 
00181    while( i1 < nlist ){
00182 
00183       for( ; i1 < nlist && isspace(list[i1]) ; i1++ ) ; /* skip whitespace */
00184       if( i1 >= nlist ) break ;
00185       if( list[i1] == '#' ){ /* skip comment line */
00186          for( ; i1 < nlist && list[i1] != '\n' ; i1++ ) ; /* skip to EOL */
00187          continue ;                                       /* restart while loop */
00188       }
00189 
00190       for( i2=i1+1 ; i2 < nlist && !isspace(list[i2]) ; i2++ ) ; /* skip to next blank */
00191 
00192       /* filename is list[i1..i2-1] */
00193 
00194       dnam = (char *)malloc(sizeof(char)*(nh+i2-i1+16)) ;  /* space for new URL */
00195       strcpy(dnam,hnam);                                   /* put header on */
00196       memcpy(dnam+nh,list+i1,i2-i1);                       /* put filename on */
00197       dnam[nh+i2-i1] = '\0';                               /* and end it */
00198 
00199       iochan_sleep(100) ;
00200       ll = strlen(dnam)-3 ; if( ll < 1 ) continue ;
00201       if( strcmp(dnam+ll,".1D")==0 ||
00202           strcmp(dnam+ll,"1Dx")==0 ||
00203           strcmp(dnam+ll,"1Dv")==0   ){                      /** get a 1D file **/
00204 
00205          MRI_IMAGE * im = THD_fetch_1D( dnam ) ;
00206 
00207          if( im != NULL ){
00208             ADDTO_XTARR(dsar,im) ;
00209             nx = XTARR_NUM(dsar)-1 ;
00210             XTARR_IC(dsar,nx) = IC_FLIM ;
00211          }
00212 
00213       } else {                                                /** get a dataset **/
00214          dset = THD_fetch_dataset( dnam ) ;
00215          if( ISVALID_DSET(dset) ){
00216             ADDTO_XTARR(dsar,dset) ;
00217             nx = XTARR_NUM(dsar)-1 ;
00218             XTARR_IC(dsar,nx) = IC_DSET ;
00219          }
00220       }
00221       free(dnam) ;
00222 
00223       i1 = i2 ; /* restart scan at next position */
00224    }
00225 
00226    /* toss the trash and go home */
00227 
00228    free(list) ; free(hnam) ;
00229    if( dsar->num == 0 ){ FREE_XTARR(dsar) ; dsar = NULL ; }
00230    RETURN(dsar) ;
00231 }
 

Powered by Plone

This site conforms to the following standards: