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