def view_image_with_pycortex(request, pk, collection_cid=None): image = get_image(pk,collection_cid,request) base, fname, _ = split_filename(image.file.path) pycortex_dir = os.path.join(base, fname + "_pycortex") if not os.path.exists(pycortex_dir): volume = generate_pycortex_volume(image) generate_pycortex_static({image.name: volume}, pycortex_dir) _, _, ext = split_filename(image.file.url) pycortex_url = image.file.url[:-len(ext)] + "_pycortex/index.html" return redirect(pycortex_url)
def view_image_with_pycortex(request, pk, collection_cid=None): image = get_image(pk, collection_cid, request) base, fname, _ = split_filename(image.file.path) pycortex_dir = os.path.join(base, fname + "_pycortex") if not os.path.exists(pycortex_dir): volume = generate_pycortex_volume(image) generate_pycortex_static({image.name: volume}, pycortex_dir) _, _, ext = split_filename(image.file.url) pycortex_url = image.file.url[:-len(ext)] + "_pycortex/index.html" return redirect(pycortex_url)
def forwards(self, orm): "Write your forwards methods here." # Note: Don't use "from appname.models import ModelName". # Use orm.ModelName to refer to models in this application, # and orm['appname.ModelName'] for models in other applications. for image in orm.Image.objects.all(): if not image.file.name.endswith("nii.gz"): nii = nb.load(os.path.join(MEDIA_ROOT, image.file.name)) tmp_directory = tempfile.mkdtemp() path, name, ext = split_filename(image.file.name) name += ".nii.gz" new_path = os.path.join(tmp_directory, name) nb.save(nii, new_path) print new_path image.file = ContentFile(open(new_path).read(), name=os.path.join(path, name)) image.save() shutil.rmtree(tmp_directory)
#fix one voxel offset nii = nb.load(ribbon_projection_file[:-3]) affine = nii.affine affine[0, 3] -= 1 nb.Nifti1Image(nii.get_data(), affine).to_filename(ribbon_projection_file) cleaned_data['file'] = memory_uploadfile( ribbon_projection_file, new_name, None) finally: shutil.rmtree(tmp_dir) elif file: # check extension of the data file _, fname, ext = split_filename(file.name) if not ext.lower() in [".nii.gz", ".nii", ".img"]: self._errors["file"] = self.error_class( ["Doesn't have proper extension"] ) del cleaned_data["file"] return cleaned_data # prepare file to loading into memory file.open() fileobj = file.file if file.name.lower().endswith(".gz"): fileobj = GzipFile(filename=file.name, mode='rb', fileobj=fileobj) file_map = {'image': nb.FileHolder(file.name, fileobj)}
def upload_folder(request, collection_cid): collection = get_collection(collection_cid, request) allowed_extensions = ['.nii', '.img', '.nii.gz'] niftiFiles = [] if request.method == 'POST': print request.POST print request.FILES form = UploadFileForm(request.POST, request.FILES) if form.is_valid(): tmp_directory = tempfile.mkdtemp() print tmp_directory try: # Save archive (.zip or .tar.gz) to disk if "file" in request.FILES: archive_name = request.FILES['file'].name if fnmatch(archive_name, '*.nidm.zip'): populate_nidm_results(request, collection) return HttpResponseRedirect( collection.get_absolute_url()) _, archive_ext = os.path.splitext(archive_name) if archive_ext == '.zip': compressed = zipfile.ZipFile(request.FILES['file']) elif archive_ext == '.gz': django_file = request.FILES['file'] django_file.open() compressed = tarfile.TarFile(fileobj=gzip.GzipFile( fileobj=django_file.file, mode='r'), mode='r') else: raise Exception("Unsupported archive type %s." % archive_name) compressed.extractall(path=tmp_directory) elif "file_input[]" in request.FILES: for f, path in zip(request.FILES.getlist("file_input[]"), request.POST.getlist("paths[]")): if fnmatch(f.name, '*.nidm.zip'): request.FILES['file'] = f populate_nidm_results(request, collection) continue new_path, _ = os.path.split( os.path.join(tmp_directory, path)) mkdir_p(new_path) filename = os.path.join(new_path, f.name) tmp_file = open(filename, 'w') tmp_file.write(f.read()) tmp_file.close() else: raise Exception("Unable to find uploaded files.") atlases = {} for root, subdirs, filenames in os.walk(tmp_directory): if detect_feat_directory(root): populate_feat_directory(request, collection, root) del (subdirs) filenames = [] # .gfeat parent dir under cope*.feat should not be added as statmaps # this may be affected by future nidm-results_fsl parsing changes if root.endswith('.gfeat'): filenames = [] filenames = [f for f in filenames if not f[0] == '.'] for fname in sorted(filenames): name, ext = splitext_nii_gz(fname) nii_path = os.path.join(root, fname) if ext == '.xml': print "found xml" dom = minidom.parse(os.path.join(root, fname)) for atlas in dom.getElementsByTagName( "summaryimagefile"): print "found atlas" path, base = os.path.split( atlas.lastChild.nodeValue) nifti_name = os.path.join(path, base) atlases[str(os.path.join( root, nifti_name[1:]))] = os.path.join( root, fname) if ext in allowed_extensions: nii = nib.load(nii_path) if detect_afni4D(nii): niftiFiles.extend(split_afni4D_to_3D(nii)) else: niftiFiles.append((fname, nii_path)) for label, fpath in niftiFiles: # Read nifti file information nii = nib.load(fpath) if len(nii.get_shape()) > 3 and nii.get_shape()[3] > 1: print "skipping wrong size" continue hdr = nii.get_header() raw_hdr = hdr.structarr # SPM only !!! # Check if filename corresponds to a T-map Tregexp = re.compile('spmT.*') # Fregexp = re.compile('spmF.*') if Tregexp.search(fpath) is not None: map_type = StatisticMap.T else: # Check if filename corresponds to a F-map if Tregexp.search(fpath) is not None: map_type = StatisticMap.F else: map_type = StatisticMap.OTHER path, name, ext = split_filename(fpath) dname = name + ".nii.gz" spaced_name = name.replace('_', ' ').replace('-', ' ') if ext.lower() != ".nii.gz": new_file_tmp_dir = tempfile.mkdtemp() new_file_tmp = os.path.join(new_file_tmp_dir, name) + '.nii.gz' nib.save(nii, new_file_tmp) f = ContentFile(open(new_file_tmp).read(), name=dname) shutil.rmtree(new_file_tmp_dir) label += " (old ext: %s)" % ext else: f = ContentFile(open(fpath).read(), name=dname) collection = get_collection(collection_cid, request) if os.path.join(path, name) in atlases: new_image = Atlas(name=spaced_name, description=raw_hdr['descrip'], collection=collection) new_image.label_description_file = ContentFile( open(atlases[os.path.join(path, name)]).read(), name=name + ".xml") else: new_image = StatisticMap(name=spaced_name, description=raw_hdr['descrip'] or label, collection=collection) new_image.map_type = map_type new_image.file = f new_image.save() except: raise error = traceback.format_exc().splitlines()[-1] msg = "An error occurred with this upload: {}".format(error) messages.warning(request, msg) return HttpResponseRedirect(collection.get_absolute_url()) finally: shutil.rmtree(tmp_directory) return HttpResponseRedirect(collection.get_absolute_url()) else: form = UploadFileForm() return render_to_response("statmaps/upload_folder.html", {'form': form}, RequestContext(request))
def clean_and_validate(self, cleaned_data): file = cleaned_data.get('file') if file: # check extension of the data file _, fname, ext = split_filename(file.name) if not ext.lower() in [".nii.gz", ".nii", ".img"]: self._errors["file"] = self.error_class( ["Doesn't have proper extension"]) del cleaned_data["file"] return cleaned_data # prepare file to loading into memory file.open() fileobj = file.file if file.name.lower().endswith(".gz"): fileobj = GzipFile(filename=file.name, mode='rb', fileobj=fileobj) file_map = {'image': nb.FileHolder(file.name, fileobj)} try: tmp_dir = tempfile.mkdtemp() if ext.lower() == ".img": hdr_file = cleaned_data.get('hdr_file') if hdr_file: # check extension of the hdr file _, _, hdr_ext = split_filename(hdr_file.name) if not hdr_ext.lower() in [".hdr"]: self._errors["hdr_file"] = self.error_class( ["Doesn't have proper extension"]) del cleaned_data["hdr_file"] return cleaned_data else: hdr_file.open() file_map["header"] = nb.FileHolder( hdr_file.name, hdr_file.file) else: self._errors["hdr_file"] = self.error_class( [".img file requires .hdr file"]) del cleaned_data["hdr_file"] return cleaned_data # check if it is really nifti try: print file_map if "header" in file_map: nii = nb.Nifti1Pair.from_file_map(file_map) else: nii = nb.Nifti1Image.from_file_map(file_map) except Exception as e: raise # detect AFNI 4D files and prepare 3D slices if nii is not None and detect_4D(nii): self.afni_subbricks = split_4D_to_3D(nii, tmp_dir=tmp_dir) else: squeezable_dimensions = len( filter(lambda a: a not in [0, 1], nii.shape)) if squeezable_dimensions != 3: self._errors["file"] = self.error_class([ "4D files are not supported.\n " "If it's multiple maps in one " "file please split them and " "upload separately" ]) del cleaned_data["file"] return cleaned_data # convert to nii.gz if needed if (ext.lower() != ".nii.gz" or squeezable_dimensions < len(nii.shape)): # convert pseudo 4D to 3D if squeezable_dimensions < len(nii.shape): new_data = np.squeeze(nii.get_data()) nii = nb.Nifti1Image(new_data, nii.get_affine(), nii.get_header()) # Papaya does not handle float64, but by converting # files we loose precision # if nii.get_data_dtype() == np.float64: # ii.set_data_dtype(np.float32) new_name = fname + ".nii.gz" nii_tmp = os.path.join(tmp_dir, new_name) nb.save(nii, nii_tmp) print "updating file in cleaned_data" cleaned_data['file'] = memory_uploadfile( nii_tmp, new_name, cleaned_data['file']) finally: try: if self.afni_subbricks: # keep temp dir for AFNI slicing self.afni_tmp = tmp_dir else: print "removing %s" % tmp_dir shutil.rmtree(tmp_dir) except OSError as exc: if exc.errno != 2: # code 2 - no such file or directory raise # re-raise exception elif not getattr(self, 'partial', False): # Skip validation error if this is a partial update from the API raise ValidationError("Couldn't read uploaded file") return cleaned_data
def clean_and_validate(self, cleaned_data): file = cleaned_data.get('file') if file: # check extension of the data file _, fname, ext = split_filename(file.name) if not ext.lower() in [".nii.gz", ".nii", ".img"]: self._errors["file"] = self.error_class( ["Doesn't have proper extension"] ) del cleaned_data["file"] return cleaned_data # prepare file to loading into memory file.open() fileobj = file.file if file.name.lower().endswith(".gz"): fileobj = GzipFile(filename=file.name, mode='rb', fileobj=fileobj) file_map = {'image': nb.FileHolder(file.name, fileobj)} try: tmp_dir = tempfile.mkdtemp() if ext.lower() == ".img": hdr_file = cleaned_data.get('hdr_file') if hdr_file: # check extension of the hdr file _, _, hdr_ext = split_filename(hdr_file.name) if not hdr_ext.lower() in [".hdr"]: self._errors["hdr_file"] = self.error_class( ["Doesn't have proper extension"]) del cleaned_data["hdr_file"] return cleaned_data else: hdr_file.open() file_map["header"] = nb.FileHolder(hdr_file.name, hdr_file.file) else: self._errors["hdr_file"] = self.error_class( [".img file requires .hdr file"] ) del cleaned_data["hdr_file"] return cleaned_data # check if it is really nifti try: print file_map if "header" in file_map: nii = nb.Nifti1Pair.from_file_map(file_map) else: nii = nb.Nifti1Image.from_file_map(file_map) except Exception as e: raise # detect AFNI 4D files and prepare 3D slices if nii is not None and detect_4D(nii): self.afni_subbricks = split_4D_to_3D(nii, tmp_dir=tmp_dir) else: squeezable_dimensions = len( filter(lambda a: a not in [0, 1], nii.shape) ) if squeezable_dimensions != 3: self._errors["file"] = self.error_class( ["4D files are not supported.\n " "If it's multiple maps in one " "file please split them and " "upload separately"]) del cleaned_data["file"] return cleaned_data # convert to nii.gz if needed if (ext.lower() != ".nii.gz" or squeezable_dimensions < len(nii.shape)): # convert pseudo 4D to 3D if squeezable_dimensions < len(nii.shape): new_data = np.squeeze(nii.get_data()) nii = nb.Nifti1Image(new_data, nii.get_affine(), nii.get_header()) # Papaya does not handle float64, but by converting # files we loose precision # if nii.get_data_dtype() == np.float64: # ii.set_data_dtype(np.float32) new_name = fname + ".nii.gz" nii_tmp = os.path.join(tmp_dir, new_name) nb.save(nii, nii_tmp) print "updating file in cleaned_data" cleaned_data['file'] = memory_uploadfile( nii_tmp, new_name, cleaned_data['file'] ) finally: try: if self.afni_subbricks: # keep temp dir for AFNI slicing self.afni_tmp = tmp_dir else: print "removing %s"%tmp_dir shutil.rmtree(tmp_dir) except OSError as exc: if exc.errno != 2: # code 2 - no such file or directory raise # re-raise exception elif not getattr(self, 'partial', False): # Skip validation error if this is a partial update from the API raise ValidationError("Couldn't read uploaded file") return cleaned_data
def upload_folder(request, collection_cid): collection = get_collection(collection_cid,request) allowed_extensions = ['.nii', '.img', '.nii.gz'] niftiFiles = [] if request.method == 'POST': print request.POST print request.FILES form = UploadFileForm(request.POST, request.FILES) if form.is_valid(): tmp_directory = tempfile.mkdtemp() print tmp_directory try: # Save archive (.zip or .tar.gz) to disk if "file" in request.FILES: archive_name = request.FILES['file'].name if fnmatch(archive_name,'*.nidm.zip'): form = populate_nidm_results(request,collection) if not form: messages.warning(request, "Invalid NIDM-Results file.") return HttpResponseRedirect(collection.get_absolute_url()) _, archive_ext = os.path.splitext(archive_name) if archive_ext == '.zip': compressed = zipfile.ZipFile(request.FILES['file']) elif archive_ext == '.gz': django_file = request.FILES['file'] django_file.open() compressed = tarfile.TarFile(fileobj=gzip.GzipFile(fileobj=django_file.file, mode='r'), mode='r') else: raise Exception("Unsupported archive type %s."%archive_name) compressed.extractall(path=tmp_directory) elif "file_input[]" in request.FILES: for f, path in zip(request.FILES.getlist( "file_input[]"), request.POST.getlist("paths[]")): if fnmatch(f.name,'*.nidm.zip'): request.FILES['file'] = f populate_nidm_results(request,collection) continue new_path, _ = os.path.split(os.path.join(tmp_directory, path)) mkdir_p(new_path) filename = os.path.join(new_path,f.name) tmp_file = open(filename, 'w') tmp_file.write(f.read()) tmp_file.close() else: raise Exception("Unable to find uploaded files.") atlases = {} for root, subdirs, filenames in os.walk(tmp_directory): if detect_feat_directory(root): populate_feat_directory(request,collection,root) del(subdirs) filenames = [] # .gfeat parent dir under cope*.feat should not be added as statmaps # this may be affected by future nidm-results_fsl parsing changes if root.endswith('.gfeat'): filenames = [] filenames = [f for f in filenames if not f[0] == '.'] for fname in sorted(filenames): name, ext = splitext_nii_gz(fname) nii_path = os.path.join(root, fname) if ext == '.xml': print "found xml" dom = minidom.parse(os.path.join(root, fname)) for atlas in dom.getElementsByTagName("summaryimagefile"): print "found atlas" path, base = os.path.split(atlas.lastChild.nodeValue) nifti_name = os.path.join(path, base) atlases[str(os.path.join(root, nifti_name[1:]))] = os.path.join(root, fname) if ext in allowed_extensions: nii = nib.load(nii_path) if detect_4D(nii): niftiFiles.extend(split_4D_to_3D(nii)) else: niftiFiles.append((fname,nii_path)) for label,fpath in niftiFiles: # Read nifti file information nii = nib.load(fpath) if len(nii.get_shape()) > 3 and nii.get_shape()[3] > 1: messages.warning(request, "Skipping %s - not a 3D file."%label) continue hdr = nii.get_header() raw_hdr = hdr.structarr # SPM only !!! # Check if filename corresponds to a T-map Tregexp = re.compile('spmT.*') # Fregexp = re.compile('spmF.*') if Tregexp.search(fpath) is not None: map_type = StatisticMap.T else: # Check if filename corresponds to a F-map if Tregexp.search(fpath) is not None: map_type = StatisticMap.F else: map_type = StatisticMap.OTHER path, name, ext = split_filename(fpath) dname = name + ".nii.gz" spaced_name = name.replace('_',' ').replace('-',' ') if ext.lower() != ".nii.gz": new_file_tmp_dir = tempfile.mkdtemp() new_file_tmp = os.path.join(new_file_tmp_dir, name) + '.nii.gz' nib.save(nii, new_file_tmp) f = ContentFile(open(new_file_tmp).read(), name=dname) shutil.rmtree(new_file_tmp_dir) label += " (old ext: %s)" % ext else: f = ContentFile(open(fpath).read(), name=dname) collection = get_collection(collection_cid,request) if os.path.join(path, name) in atlases: new_image = Atlas(name=spaced_name, description=raw_hdr['descrip'], collection=collection) new_image.label_description_file = ContentFile( open(atlases[os.path.join(path,name)]).read(), name=name + ".xml") else: new_image = StatisticMap(name=spaced_name, description=raw_hdr['descrip'] or label, collection=collection) new_image.map_type = map_type new_image.file = f new_image.save() except: error = traceback.format_exc().splitlines()[-1] msg = "An error occurred with this upload: {}".format(error) messages.warning(request, msg) return HttpResponseRedirect(collection.get_absolute_url()) finally: shutil.rmtree(tmp_directory) if not niftiFiles: messages.warning(request, "No NIFTI files (.nii, .nii.gz, .img/.hdr) found in the upload.") return HttpResponseRedirect(collection.get_absolute_url()) else: form = UploadFileForm() return render_to_response("statmaps/upload_folder.html", {'form': form}, RequestContext(request))
def upload_folder(request, collection_pk): allowed_extensions = ['.nii', '.img', '.nii.gz'] niftiFiles = [] if request.method == 'POST': print request.POST print request.FILES form = UploadFileForm(request.POST, request.FILES) if form.is_valid(): tmp_directory = tempfile.mkdtemp() print tmp_directory try: # Save archive (.zip or .tar.gz) to disk if "file" in request.FILES: archive_name = request.FILES['file'].name _, archive_ext = os.path.splitext(archive_name) if archive_ext == '.zip': compressed = zipfile.ZipFile(request.FILES['file']) else: compressed = tarfile.TarFile(fileobj=gzip.open(request.FILES['file'])) compressed.extractall(path=tmp_directory) elif "file_input[]" in request.FILES: for f, path in zip(request.FILES.getlist("file_input[]"), request.POST.getlist("paths[]")): new_path, _ = os.path.split(os.path.join(tmp_directory, path)) mkdir_p(new_path) filename = os.path.join(new_path,f.name) tmp_file = open(filename, 'w') tmp_file.write(f.read()) tmp_file.close() else: raise for root, _, filenames in os.walk(tmp_directory, topdown=False): filenames = [f for f in filenames if not f[0] == '.'] for fname in filenames: _, ext = splitext_nii_gz(fname) if ext in allowed_extensions: niftiFiles.append(os.path.join(root, fname)) for fname in niftiFiles: # Read nifti file information nii = nib.load(fname) if len(nii.get_shape()) > 3 and nii.get_shape()[3] > 1: continue hdr = nii.get_header() raw_hdr = hdr.structarr # SPM only !!! # Check if filename corresponds to a T-map Tregexp = re.compile('spmT.*'); Fregexp = re.compile('spmF.*'); if Tregexp.search(fname) is not None: map_type = Image.T; else: # Check if filename corresponds to a F-map if Tregexp.search(fname) is not None: map_type = Image.F; else: map_type = Image.OTHER; path, name, ext = split_filename(fname) name += ".nii.gz" db_name = os.path.join(path.replace(tmp_directory,""), name) db_name = os.path.sep.join(db_name.split(os.path.sep)[2:]) if ext.lower() != ".nii.gz": new_file_tmp_directory = tempfile.mkdtemp() nib.save(nii, os.path.join(new_file_tmp_directory, name)) f = ContentFile(open(os.path.join(new_file_tmp_directory, name)).read(), name=name) shutil.rmtree(new_file_tmp_directory) db_name += " (old ext: %s)"%ext else: f = ContentFile(open(fname).read(), name=name) collection = Collection.objects.get(pk=collection_pk) new_image = Image(name=db_name, description=raw_hdr['descrip'], collection=collection) new_image.file = f new_image.map_type = map_type new_image.save() finally: shutil.rmtree(tmp_directory) return HttpResponseRedirect('editimages'); else: form = UploadFileForm() return render_to_response("statmaps/upload_folder.html", {'form': form}, RequestContext(request))
def clean(self): cleaned_data = super(ImageForm, self).clean() file = cleaned_data.get("file") if file: # check extension of the data filr _, fname, ext = split_filename(file.name) if not ext.lower() in [".nii.gz", ".nii", ".img"]: self._errors["file"] = self.error_class(["Doesn't have proper extension"]) del cleaned_data["file"] return cleaned_data try: tmp_dir = tempfile.mkdtemp() if ext.lower() == ".img": hdr_file = cleaned_data.get('hdr_file') if hdr_file: # check extension of the hdr file _, _, hdr_ext = split_filename(hdr_file.name) if not hdr_ext.lower() in [".hdr"]: self._errors["hdr_file"] = self.error_class( ["Doesn't have proper extension"]) del cleaned_data["hdr_file"] return cleaned_data else: # write the header file to a temporary directory hf = open(os.path.join(tmp_dir, fname + ".hdr"), "wb") hf.write(hdr_file.file.read()) hf.close() else: self._errors["hdr_file"] = self.error_class([".img files require .hdr"]) del cleaned_data["hdr_file"] return cleaned_data # write the data file to a temporary directory f = open(os.path.join(tmp_dir,fname + ext), "wb") f.write(file.file.read()) f.close() # check if it is really nifti try: nii = nb.load(os.path.join(tmp_dir,fname + ext)) except Exception as e: self._errors["file"] = self.error_class([str(e)]) del cleaned_data["file"] return cleaned_data # convert to nii.gz if needed if ext.lower() != ".nii.gz": #Papaya does not handle flaot64, but by converting files we loose precision # if nii.get_data_dtype() == np.float64: # nii.set_data_dtype(np.float32) nb.save(nii, os.path.join(tmp_dir,fname + ".nii.gz")) f = ContentFile(open(os.path.join(tmp_dir,fname + ".nii.gz")).read()) print cleaned_data["file"].__class__.__name__ cleaned_data["file"] = InMemoryUploadedFile(f, "file", fname + ".nii.gz", cleaned_data["file"].content_type, f.size, cleaned_data["file"].charset) finally: try: shutil.rmtree(tmp_dir) # delete directory except OSError as exc: if exc.errno != 2: # code 2 - no such file or directory raise # re-raise exception else: raise ValidationError("Couldn't read uploaded file") return cleaned_data
def clean(self, **kwargs): cleaned_data = super(ImageForm, self).clean() file = cleaned_data.get("file") if file: # check extension of the data filr _, fname, ext = split_filename(file.name) if not ext.lower() in [".nii.gz", ".nii", ".img"]: self._errors["file"] = self.error_class(["Doesn't have proper extension"]) del cleaned_data["file"] return cleaned_data try: tmp_dir = tempfile.mkdtemp() if ext.lower() == ".img": hdr_file = cleaned_data.get('hdr_file') if hdr_file: # check extension of the hdr file _, _, hdr_ext = split_filename(hdr_file.name) if not hdr_ext.lower() in [".hdr"]: self._errors["hdr_file"] = self.error_class( ["Doesn't have proper extension"]) del cleaned_data["hdr_file"] return cleaned_data else: # write the header file to a temporary directory hf = open(os.path.join(tmp_dir, fname + ".hdr"), "wb") hf.write(hdr_file.file.read()) hf.close() else: self._errors["hdr_file"] = self.error_class([".img files require .hdr"]) del cleaned_data["hdr_file"] return cleaned_data # write the data file to a temporary directory nii_tmp = os.path.join(tmp_dir, fname + ext) f = open(nii_tmp, "wb") f.write(file.file.read()) f.close() # check if it is really nifti try: nii = nb.load(nii_tmp) except Exception as e: self._errors["file"] = self.error_class([str(e)]) del cleaned_data["file"] return cleaned_data # convert to nii.gz if needed if ext.lower() != ".nii.gz": #Papaya does not handle float64, but by converting files we loose precision #if nii.get_data_dtype() == np.float64: #ii.set_data_dtype(np.float32) new_name = fname + ".nii.gz" nii_tmp = os.path.join(tmp_dir, new_name) nb.save(nii, nii_tmp) cleaned_data['file'] = memory_uploadfile(nii_tmp, new_name, cleaned_data['file']) # detect AFNI 4D files and prepare 3D slices if nii_tmp is not None and detect_afni4D(nii_tmp): self.afni_subbricks = split_afni4D_to_3D(nii_tmp) finally: try: if self.afni_subbricks: self.afni_tmp = tmp_dir # keep temp dir for AFNI slicing else: shutil.rmtree(tmp_dir) except OSError as exc: if exc.errno != 2: # code 2 - no such file or directory raise # re-raise exception else: raise ValidationError("Couldn't read uploaded file") return cleaned_data