Source code for pymapmanager.mmio

"""
Use this to load (get) files from a mmserver.
This is a temporary wrapper as mmserver is currently a Flask server (slow).
Eventually transition this to use proper online repository like ndio.

To Do: add Rest interface to get number of timepoints in a map?

Examples::

	from pymapmanager.mmio import mmio
	s = mmio.mmio()
		Success, the server at http://robertcudmore.org/mmserver/ is up and running!

	s.maplist()
		["rr30a", "rr58c"]
	
	# these are the basic files that we can get for map 'rr30a'
	# they will each return text that can be converted to a stringio and read into python (numpy and/or panda)
	s.getfile('header', 'rr30a')
	s.getfile('objmap', 'rr30a')
	s.getfile('segmap', 'rr30a')
	s.getfile('stackdb', 'rr30a', timepoint=0)
	s.getfile('line', 'rr30a', timepoint=0)
	s.getfile('int', 'rr30a', timepoint=0, channel=1)
	
	# a bad request looks like this
	s.getfile('header', 'bad map')
		error: mmio.getfile() received a 404 for url: http://robertcudmore.org/mmserver/public/bad map/header

	# upload a map
	map = '/Users/cudmore/MapManagerData/richard/Nancy/rr30a'
	s.postmap(map)

Notes::
	Header files are saved with \n
	Stackdb, int, and line files are saved with \r

"""

from __future__ import print_function

import os, requests

#default_server_url = 'http://127.0.0.1:5000/'
default_server_url = 'http://robertcudmore.org/mmserver/'
default_server_url = 'http://cudmore.duckdns.org:5010/'
default_user = 'public'

default_eol = '\n'

[docs]class mmio(): def __init__(self, server_url=default_server_url, username=default_user): """ Establish connection to a mmserver. Args: server_url (str): The full url to the mmServer For example: http://127.0.0.1:5000/ username (str): A valid username. For example: cudmore """ self.server_url = server_url self.username = username # check if url responded correctly print('server_url:', server_url) response = requests.get(server_url) response.raise_for_status() print('server responded:', response.content) #print 'Success, the server at', server_url, 'is up and running!'
[docs] def maplist(self): """ Return list of maps for user username """ url = self.server_url + self.username + '/maps' response = requests.get(url) if response.status_code == 404: print('error: mmio.maplist() received a 404 for url:', url) return response.content
[docs] def getfile(self, type, mapname, timepoint=None, channel=None): """ Get a file from a map. Args: type (str): One of (header, objmap, segmap, stackdb, line, int) mapname (str): timepoint (int): channel (int): Required for type=int To Do:: Server should mirror mmMap and mmStack. For example, merge stackdb and int """ baseurl = self.server_url + self.username + '/' + mapname + '/' if type == 'header': url = baseurl + 'header' elif type == 'objmap': url = baseurl + 'objmap' elif type == 'segmap': url = baseurl + 'segmap' elif type == 'stackdb': url = baseurl + str(timepoint) + '/stackdb' elif type == 'line': url = baseurl + str(timepoint) + '/line' elif type == 'int': url = baseurl + str(timepoint) + '/int/' + str(channel) else: # error url = '' # print 'url:', url response = requests.get(url) if response.status_code == 404: print('error: mmio.getfile() received a 404 for url:', url) return response.content
[docs] def getimage(self, mapname, timepoint, slice, channel=1): """ Get an image from a map. Args: mapname (str): timepoint (int): slice (int): channel (int): Note:: For now this is the whole 3D stack, need to make it one slice. """ url = self.server_url + self.username + '/' + mapname + '/' + str(timepoint) \ + '/image/' + str(slice) + '/' + str(channel) response = requests.get(url) if response.status_code == 404: print('error: mmio.getimage() received a 404 for url:', url) return response.content
[docs] def postmap(self, mapFolder): """ Post a map to the server. Args: mapFolder (str) full path to map folder (local machine). """ print('posting map to server:', self.server_url, 'user:', self.username) mapname = os.path.basename(mapFolder) # main header file mapFile = os.path.join(mapFolder, mapname + '.txt') if os.path.isfile(mapFile): file = {'file': open(mapFile, 'rb')} url = 'post/' + self.username + '/' + mapname + '/header' print('uploading main map file with url:', url) r = requests.post(default_server_url + url, files=file) print(' Response:', r.content) # obj map objMapFile = os.path.join(mapFolder, mapname + '_objMap.txt') if os.path.isfile(objMapFile): file = {'file': open(objMapFile, 'rb')} url = 'post/' + self.username + '/' + mapname + '/header' print('uploading obj map file with url:', url) r = requests.post(default_server_url + url, files=file) print(' Response:', r.content) # seg map segMapFile = os.path.join(mapFolder, mapname + '_segMap.txt') if os.path.isfile(segMapFile): file = {'file': open(segMapFile, 'rb')} url = 'post/' + self.username + '/' + mapname + '/header' print('uploading seg map file with url:', url) r = requests.post(default_server_url + url, files=file) print(' Response:', r.content) # all stackdb stackdbFolder = os.path.join(mapFolder, 'stackdb') if os.path.isdir(stackdbFolder): for file in os.listdir(stackdbFolder): if file.endswith('.txt'): stackdbFile = os.path.join(stackdbFolder, file) fileid = {'file': open(stackdbFile, 'rb')} url = 'post/' + self.username + '/' + mapname + '/stackdb' print('uploading stackdb file:', file, url) r = requests.post(default_server_url + url, files=fileid) # all lines lineFolder = os.path.join(mapFolder, 'line') if os.path.isdir(lineFolder): for file in os.listdir(lineFolder): if file.endswith('.txt'): lineFile = os.path.join(lineFolder, file) fileid = {'file': open(lineFile, 'rb')} url = 'post/' + self.username + '/' + mapname + '/line' print('uploading line file:', file, url) r = requests.post(default_server_url + url, files=fileid) print('Done uploading map:', mapFolder)
if __name__ == '__main__': if 1: s = mmio() map = '/Users/cudmore/MapManagerData/richard/Nancy/rr58c' s.postmap(map) if 0: io = mmio(username='cudmore') io.maplist() header = io.getfile('header', 'rr30a') for line in header.split('\r'): print(line) objmap = io.getfile('objmap', 'rr30a') print(objmap.split('\r')[0]) print(objmap.split('\r')[1]) stackdb = io.getfile('stackdb', 'rr30a', timepoint=0) print('stackdb:', stackdb.split('\r')[0]) line = io.getfile('line', 'rr30a', timepoint=3) print('line:', line.split('\r')[0]) int1 = io.getfile('int', 'rr30a', 0, channel=1) print('int1:', int1.split('\r')[0]) int2 = io.getfile('int', 'rr30a', timepoint=2, channel=2) print('int2:', int2.split('\r')[0]) image = io.getimage('rr30a', timepoint=1, slice=5, channel=2) #print 'image:', image