0
|
1 import os
|
|
2 import shutil
|
|
3 import sys
|
|
4 import tempfile
|
|
5
|
|
6 BUFF_SIZE = 1048576
|
|
7
|
|
8
|
|
9 def cleanup_before_exit(tmp_dir):
|
|
10 """
|
|
11 Remove temporary files and directories prior to tool exit.
|
|
12 """
|
|
13 if tmp_dir and os.path.exists(tmp_dir):
|
|
14 shutil.rmtree(tmp_dir)
|
|
15
|
|
16
|
|
17 def get_base_cmd_bunwarpj(jvm_memory):
|
|
18 if jvm_memory in [None, 'None']:
|
|
19 jvm_memory_str = ''
|
|
20 else:
|
|
21 jvm_memory_str = '-Xmx%s' % jvm_memory
|
|
22 # The following bunwarpj_base_cmd string will look something like this:
|
|
23 # "java %s -cp $JAR_DIR/ij-1.49k.jar:$PLUGINS_DIR/bUnwarpJ_-2.6.1.jar \
|
|
24 # bunwarpj.bUnwarpJ_" % (jvm_memory_str)
|
|
25 # See the bunwarpj.sh script for the fiji 20151222
|
|
26 # bioconda recipe in github.
|
|
27 bunwarpj_base_cmd = "bunwarpj %s" % jvm_memory_str
|
|
28 return bunwarpj_base_cmd
|
|
29
|
|
30
|
|
31 def get_base_command_imagej2(memory_size=None, macro=None, jython_script=None):
|
|
32 imagej2_executable = get_imagej2_executable()
|
|
33 if imagej2_executable is None:
|
|
34 return None
|
|
35 cmd = '%s --ij2 --headless --debug' % imagej2_executable
|
|
36 if memory_size is not None:
|
|
37 memory_size_cmd = ' -DXms=%s -DXmx=%s' % (memory_size, memory_size)
|
|
38 cmd += memory_size_cmd
|
|
39 if macro is not None:
|
|
40 cmd += ' --macro %s' % os.path.abspath(macro)
|
|
41 if jython_script is not None:
|
|
42 cmd += ' --jython %s' % os.path.abspath(jython_script)
|
|
43 return cmd
|
|
44
|
|
45
|
|
46 def get_file_extension(image_format):
|
|
47 """
|
|
48 Return a valid bioformats file extension based on the received
|
|
49 value of image_format(e.g., "gif" is returned as ".gif".
|
|
50 """
|
|
51 return '.%s' % image_format
|
|
52
|
|
53
|
|
54 def get_file_name_without_extension(file_path):
|
|
55 """
|
|
56 Eliminate the .ext from the received file name, assuming that
|
|
57 the file name consists of only a single '.'.
|
|
58 """
|
|
59 if os.path.exists(file_path):
|
|
60 path, name = os.path.split(file_path)
|
|
61 name_items = name.split('.')
|
|
62 return name_items[0]
|
|
63 return None
|
|
64
|
|
65
|
|
66 def get_imagej2_executable():
|
|
67 """
|
|
68 Fiji names the ImageJ executable different names for different
|
|
69 architectures, but our bioconda recipe allows us to do this.
|
|
70 """
|
|
71 return 'ImageJ'
|
|
72
|
|
73
|
|
74 def get_input_image_path(tmp_dir, input_file, image_format):
|
|
75 """
|
|
76 Bioformats uses file extensions (e.g., .job, .gif, etc)
|
|
77 when reading and writing image files, so the Galaxy dataset
|
|
78 naming convention of setting all file extensions as .dat
|
|
79 must be handled.
|
|
80 """
|
|
81 image_path = get_temporary_image_path(tmp_dir, image_format)
|
|
82 # Remove the file so we can create a symlink.
|
|
83 os.remove(image_path)
|
|
84 os.symlink(input_file, image_path)
|
|
85 return image_path
|
|
86
|
|
87
|
|
88 def get_platform_info_dict():
|
|
89 '''Return a dict with information about the current platform.'''
|
|
90 platform_dict = {}
|
|
91 sysname, nodename, release, version, machine = os.uname()
|
|
92 platform_dict['os'] = sysname.lower()
|
|
93 platform_dict['architecture'] = machine.lower()
|
|
94 return platform_dict
|
|
95
|
|
96
|
|
97 def get_stderr_exception(tmp_err, tmp_stderr, tmp_out, tmp_stdout, include_stdout=False):
|
|
98 tmp_stderr.close()
|
|
99 """
|
|
100 Return a stderr string of reasonable size.
|
|
101 """
|
|
102 # Get stderr, allowing for case where it's very large.
|
|
103 tmp_stderr = open(tmp_err, 'rb')
|
|
104 stderr_str = ''
|
|
105 buffsize = BUFF_SIZE
|
|
106 try:
|
|
107 while True:
|
|
108 stderr_str += tmp_stderr.read(buffsize)
|
|
109 if not stderr_str or len(stderr_str) % buffsize != 0:
|
|
110 break
|
|
111 except OverflowError:
|
|
112 pass
|
|
113 tmp_stderr.close()
|
|
114 if include_stdout:
|
|
115 tmp_stdout = open(tmp_out, 'rb')
|
|
116 stdout_str = ''
|
|
117 buffsize = BUFF_SIZE
|
|
118 try:
|
|
119 while True:
|
|
120 stdout_str += tmp_stdout.read(buffsize)
|
|
121 if not stdout_str or len(stdout_str) % buffsize != 0:
|
|
122 break
|
|
123 except OverflowError:
|
|
124 pass
|
|
125 tmp_stdout.close()
|
|
126 if include_stdout:
|
|
127 return 'STDOUT\n%s\n\nSTDERR\n%s\n' % (stdout_str, stderr_str)
|
|
128 return stderr_str
|
|
129
|
|
130
|
|
131 def get_temp_dir(prefix='tmp-imagej-', dir=None):
|
|
132 """
|
|
133 Return a temporary directory.
|
|
134 """
|
|
135 return tempfile.mkdtemp(prefix=prefix, dir=dir)
|
|
136
|
|
137
|
|
138 def get_tempfilename(dir=None, suffix=None):
|
|
139 """
|
|
140 Return a temporary file name.
|
|
141 """
|
|
142 fd, name = tempfile.mkstemp(suffix=suffix, dir=dir)
|
|
143 os.close(fd)
|
|
144 return name
|
|
145
|
|
146
|
|
147 def get_temporary_image_path(tmp_dir, image_format):
|
|
148 """
|
|
149 Return the path to a temporary file with a valid image format
|
|
150 file extension that can be used with bioformats.
|
|
151 """
|
|
152 file_extension = get_file_extension(image_format)
|
|
153 return get_tempfilename(tmp_dir, file_extension)
|
|
154
|
|
155
|
|
156 def handle_none_type(val, val_type='float'):
|
|
157 if val is None:
|
|
158 return ' None'
|
|
159 else:
|
|
160 if val_type == 'float':
|
|
161 return ' %.3f' % val
|
|
162 elif val_type == 'int':
|
|
163 return ' %d' % val
|
|
164 return ' %s' % val
|
|
165
|
|
166
|
|
167 def stop_err(msg):
|
|
168 sys.stderr.write(msg)
|
|
169 sys.exit(1)
|