1 #include "mrilib.h"
2 
3 /*---------------------------------------------------------------------
4    23 Mar 2001: Load a dataset across the Web!
5 -----------------------------------------------------------------------*/
6 
THD_fetch_dataset(char * url)7 THD_3dim_dataset * THD_fetch_dataset( char * url )
8 {
9    char *cp,*hp,*bp , *thp ;
10    int nhp,nbp , iv ;
11    THD_3dim_dataset * dset ;
12    int native_order ;
13 
14 ENTRY("THD_fetch_dset") ;
15 
16    if( url == NULL || url[0] == '\0' ) RETURN(NULL) ;
17 
18    if( STRING_HAS_SUFFIX(url,".hdr") ) RETURN(NULL) ;  /* 27 Aug 2002 */
19 
20    /*** do we have to add .HEAD? ***/
21 
22    hp = AFMALL(char, sizeof(char)*(strlen(url)+32)) ; strcpy(hp,url) ;
23    cp = strstr(hp,".HEAD") ;
24    if( cp == NULL                          &&
25        !STRING_HAS_SUFFIX(hp,".nii")       &&  /* 28 Aug 2003 */
26        !STRING_HAS_SUFFIX(hp,".nii.gz")    &&  /* 06 Apr 2005 */
27        !STRING_HAS_SUFFIX(hp,".niml")      &&  /* 16 Jun 2006 [rickr] */
28        !STRING_HAS_SUFFIX(hp,".niml.dset") &&
29        !STRING_HAS_SUFFIX(hp,".gii")       &&  /* 13 Feb 2008 [rickr] */
30        !STRING_HAS_SUFFIX(hp,".gii.dset")  &&  /* 10 Mar 2008 [rickr] */
31        !STRING_HAS_SUFFIX(hp,".mnc")       &&
32        !STRING_HAS_SUFFIX(hp,".mnc.gz")   ) strcat(hp,".HEAD") ;
33 
34    /*** read the .HEAD file to a temporary file ***/
35 
36    fprintf(stderr,"\n+++ Trying to fetch %s",hp) ;
37    nhp = NI_read_URL_tmpdir( hp , &thp ) ;
38    if( nhp <= 0 ){ fprintf(stderr," **FAILED\n"); free(hp); RETURN(NULL); }
39 
40    /*** try to open it as a dataset header ***/
41 
42    fprintf(stderr,": %d bytes read\n ++ Trying to initialize dataset %s\n",nhp,thp) ;
43    THD_allow_empty_dataset(1) ;
44    dset = THD_open_one_dataset(thp) ;
45    if( DSET_IS_MINC(dset) || DSET_IS_NIFTI(dset)        || /* 29 Oct 2001 */
46        DSET_IS_NIML(dset) || DSET_IS_NI_SURF_DSET(dset) || /* 16 Jun 2006 [r] */
47        DSET_IS_GIFTI(dset) )                               /* 13 Feb 2008 [r] */
48       DSET_load(dset) ;
49 
50    THD_allow_empty_dataset(0) ;
51    unlink(thp) ; free(thp) ;
52    if( dset == NULL ){ fprintf(stderr," ** Can't decode %s\n",hp); free(hp); RETURN(NULL); }
53 
54    if( DSET_IS_VOLUMES(dset) ){  /* 20 Jun 2002 */
55      fprintf(stderr," ** Can't load %s by volumes!\n",hp); free(hp);
56      DSET_delete(dset); RETURN(NULL);
57    }
58 
59    DSET_superlock(dset) ;  /* don't let be deleted from memory */
60    if( DSET_IS_MINC(dset) || DSET_IS_NIFTI(dset)        || /* 29 Oct 2001 */
61        DSET_IS_NIML(dset) || DSET_IS_NI_SURF_DSET(dset) || /* 16 Jun 2006 [r] */
62        DSET_IS_GIFTI(dset) )                               /* 13 Feb 2008 [r] */
63       RETURN(dset) ;
64    DSET_mallocize(dset) ;
65 
66    /*** try to read the .BRIK or .BRIK.gz file into memory ***/
67 
68    strcpy( hp+(strlen(hp)-5) , ".BRIK.gz" ) ;
69    fprintf(stderr," ++ Trying to fetch %s",hp) ; iochan_sleep(100) ;
70    nbp = NI_read_URL( hp , &bp ) ;
71    if( nbp <= 0 ){
72       iv = strlen(hp) ; hp[iv-3] = '\0' ; /* remove the .gz and try again */
73       fprintf(stderr," ** FAILED!\n ++ Trying to fetch %s",hp) ; iochan_sleep(100) ;
74       nbp = NI_read_URL( hp , &bp ) ;
75       if( nbp <= 0 ){
76          fprintf(stderr," ** FAILED\n");
77          free(hp); DSET_delete(dset); RETURN(NULL);
78       }
79    }
80    if( nbp < dset->dblk->total_bytes ){
81       fprintf(stderr,"\n ** Got %s but only had %d bytes, but needed %lld\n",
82               hp,nbp,(long long)dset->dblk->total_bytes) ;
83       free(bp) ; free(hp) ; DSET_delete(dset) ; RETURN(NULL) ;
84    }
85    fprintf(stderr,": %d bytes read\n",nbp) ;
86 
87    /** now have data: build pointers, load bricks, return **/
88 
89    for( iv=0 ; iv < DSET_NVALS(dset) ; iv++ ){
90       mri_fix_data_pointer( bp , DBLK_BRICK(dset->dblk,iv) ) ;
91       bp += DBLK_BRICK_BYTES(dset->dblk,iv) ;
92    }
93 
94    /** perhaps need to swap bytes **/
95 
96    native_order = mri_short_order() ;
97 
98    if( dset->dblk->diskptr->byte_order <= 0 )
99       dset->dblk->diskptr->byte_order = native_order ;
100 
101    if( dset->dblk->diskptr->byte_order != native_order ){
102       for( iv=0 ; iv < DSET_NVALS(dset) ; iv++ ){
103          switch( DBLK_BRICK_TYPE(dset->dblk,iv) ){
104             default: break ;
105 
106             case MRI_short:
107                mri_swap2( DBLK_BRICK_NVOX(dset->dblk,iv) , DBLK_ARRAY(dset->dblk,iv) ) ;
108             break ;
109 
110             case MRI_complex:  /* 14 Sep 1999: swap complex also! */
111                mri_swap4( 2*DBLK_BRICK_NVOX(dset->dblk,iv), DBLK_ARRAY(dset->dblk,iv)) ;
112             break ;
113 
114             case MRI_float:
115             case MRI_int:
116                mri_swap4( DBLK_BRICK_NVOX(dset->dblk,iv) , DBLK_ARRAY(dset->dblk,iv) ) ;
117             break ;
118          }
119       }
120    }
121 
122    free(hp) ; RETURN(dset) ;
123 }
124 
125 /*------------------------------------------------------------------------------
126   26 Mar 2001: fetch a 1D file across the Web
127 --------------------------------------------------------------------------------*/
128 
THD_fetch_1D(char * url)129 MRI_IMAGE * THD_fetch_1D( char * url )
130 {
131    char *fname ;
132    int nhp , ii ;
133    MRI_IMAGE * flim ;
134    float * far ;
135 
136 ENTRY("THD_fetch_1D") ;
137 
138    if( url == NULL || url[0] == '\0' ) RETURN(NULL) ;
139 
140    fprintf(stderr,"\n+++ Trying to fetch %s",url) ;
141    nhp = NI_read_URL_tmpdir( url , &fname ) ;
142    if( nhp <= 0 ){ fprintf(stderr," **FAILED\n"); RETURN(NULL); }
143    fprintf(stderr,": %d bytes read",nhp) ;
144    flim = mri_read_1D(fname) ; unlink(fname) ; free(fname) ;
145    if( flim != NULL ){
146       mri_add_name( url , flim ) ; fprintf(stderr,": %dx%d file\n",flim->nx,flim->ny) ;
147       far = MRI_FLOAT_PTR(flim) ;
148       for( ii=0 ; ii < flim->nvox ; ii++ )
149          if( fabs(far[ii]) >= 33333.0 ) far[ii] = WAY_BIG ;
150    } else {
151       fprintf(stderr," **Can't read as a .1D file!\n") ;
152    }
153    RETURN(flim) ;
154 }
155 
156 /*------------------------------------------------------------------------------
157    Load a bunch of datasets, whose names are read from a file given
158    by URL -- the datasets are all fetched from the same place as the URL.
159 --------------------------------------------------------------------------------*/
160 
THD_fetch_many_datasets(char * url)161 RwcPointer_array * THD_fetch_many_datasets( char * url )
162 {
163    RwcPointer_array * dsar ;
164    int nlist , i1,i2 , nh , ll , nx ;
165    char * list ;
166    char * tnam , * hnam , * dnam ;
167    THD_3dim_dataset * dset ;
168 
169 ENTRY("THD_fetch_many_datasets") ;
170 
171    if( url == NULL || url[0] == '\0' ) RETURN(NULL) ;
172 
173    /* make hnam be the URL directory (without the trailing filename) */
174 
175    hnam = (char *) malloc(sizeof(char)*(strlen(url)+16)) ;
176    strcpy(hnam,url) ;
177    tnam = THD_trailname( hnam , 0 ) ;                /* start of trailing name */
178    if( tnam == hnam ){ free(hnam); RETURN(NULL); }
179    *tnam = '\0' ; nh = strlen(hnam) ;                /* cut trailing name off */
180 
181    /* get the list of filenames */
182 
183    fprintf(stderr,"\n+++ Trying to fetch %s",url) ;
184    nlist = NI_read_URL( url , &list ) ;
185    if( nlist <= 0 ){
186       fprintf(stderr," **FAILED\n"); free(hnam); RETURN(NULL);
187    }
188    fprintf(stderr,": %d bytes read\n",nlist) ;
189 
190    /* scan from list[i1] forward, looking for filenames to fetch */
191 
192    i1 = 0 ; INIT_XTARR(dsar) ;
193 
194    while( i1 < nlist ){
195 
196       for( ; i1 < nlist && isspace(list[i1]) ; i1++ ) ; /* skip whitespace */
197       if( i1 >= nlist ) break ;
198       if( list[i1] == '#' ){ /* skip comment line */
199          for( ; i1 < nlist && list[i1] != '\n' ; i1++ ) ; /* skip to EOL */
200          continue ;                                       /* restart while loop */
201       }
202 
203       for( i2=i1+1 ; i2 < nlist && !isspace(list[i2]) ; i2++ ) ; /* skip to next blank */
204 
205       /* filename is list[i1..i2-1] */
206 
207       dnam = (char *)malloc(sizeof(char)*(nh+i2-i1+16)) ;  /* space for new URL */
208       strcpy(dnam,hnam);                                   /* put header on */
209       memcpy(dnam+nh,list+i1,i2-i1);                       /* put filename on */
210       dnam[nh+i2-i1] = '\0';                               /* and end it */
211 
212       iochan_sleep(100) ;
213       ll = strlen(dnam)-3 ; if( ll < 1 ) continue ;
214       if( strcmp(dnam+ll,".1D")==0 ||
215           strcmp(dnam+ll,"1Dx")==0 ||
216           strcmp(dnam+ll,"1Dv")==0   ){                      /** get a 1D file **/
217 
218          MRI_IMAGE * im = THD_fetch_1D( dnam ) ;
219 
220          if( im != NULL ){
221             ADDTO_XTARR(dsar,im) ;
222             nx = XTARR_NUM(dsar)-1 ;
223             XTARR_IC(dsar,nx) = IC_FLIM ;
224          }
225 
226       } else {                                                /** get a dataset **/
227          dset = THD_fetch_dataset( dnam ) ;
228          if( ISVALID_DSET(dset) ){
229             ADDTO_XTARR(dsar,dset) ;
230             nx = XTARR_NUM(dsar)-1 ;
231             XTARR_IC(dsar,nx) = IC_DSET ;
232          }
233       }
234       free(dnam) ;
235 
236       i1 = i2 ; /* restart scan at next position */
237    }
238 
239    /* toss the trash and go home */
240 
241    free(list) ; free(hnam) ;
242    if( dsar->num == 0 ){ FREE_XTARR(dsar) ; dsar = NULL ; }
243    RETURN(dsar) ;
244 }
245