def gen_macro(mosaics, indir, outfile=None, opts=None): """Generate stitcher macro code and optionally save it in a file. Parameters ---------- mosaics : micrometa.experiment.MosaicExperiment The mosaic object of the stitching experiment. indir : str The path to use as input directory *INSIDE* the macro. outfile : str (optional) The path to a file for saving the generated macro code. opts : dict (optional) A dict to be passed on to micrometa.imagej.gen_stitching_macro(). Returns ------- list(str) The generated macro code as a list of strings (one str per line). """ templates = join(getProperty("fiji.dir"), "jars", "python-micrometa.jar") log.info("Using macro templates from [%s].", templates) log.info("Using [%s] as base directory.", indir) # set the default stitcher options stitcher_options = { "export_format": '".ids"', "split_z_slices": "false", "rotation_angle": 0, "stitch_regression": 0.3, "stitch_maxavg_ratio": 2.5, "stitch_abs_displace": 3.5, "compute": "false", } # merge explicit options, overriding the defaults from above if applicable: if opts: stitcher_options.update(opts) code = micrometa.imagej.gen_stitching_macro( name=mosaics.infile["dname"], path=indir, tplpfx="templates/imagej-macro/stitching", tplpath=templates, opts=stitcher_options, ) log.debug("============= begin of generated macro code =============") log.debug(flatten(code)) log.debug("============= end of generated macro code =============") if outfile is not None: log.info("Writing stitching macro.") micrometa.imagej.write_stitching_macro(code, outfile) return code
def _raise_import_failed(self, name, error): import_type = '%s ' % self._type if self._type else '' msg = "Importing %s'%s' failed: %s" % (import_type, name, error.message) if not error.details: raise DataError(msg) msg = [msg, error.details] msg.extend(self._get_items_in('PYTHONPATH', sys.path)) if JYTHON: classpath = getProperty('java.class.path').split(os.path.pathsep) msg.extend(self._get_items_in('CLASSPATH', classpath)) raise DataError('\n'.join(msg))
def _raise_import_failed(self, name, error): import_type = '%s ' % self._type if self._type else '' msg = "Importing %s'%s' failed: %s" % (import_type, name, error.message) if not error.details: raise DataError(msg) msg = [msg, error.details] msg.extend(self._get_items_in('PYTHONPATH', sys.path)) if sys.platform.startswith('java'): classpath = getProperty('java.class.path').split(os.path.pathsep) msg.extend(self._get_items_in('CLASSPATH', classpath)) raise DataError('\n'.join(msg))
from __future__ import with_statement import com.nrims as nrims import com.nrims.data as nrimsData import time from datetime import timedelta, datetime, date import java.io.File as File import java.util.ArrayList as ArrayList import java.lang.Integer as Integer import java.lang.Double as Double import sys from java.lang.System import getProperty sys.path.append(getProperty("fiji.dir") + "/plugins/Scripts/Plugins/OpenMIMS Scripts/") #from OMUtilities import MultiFileDialog #from OMUtilities import CheckFileLists import javax.swing.JFileChooser as JFileChooser import java.io.File as File from ij import IJ import ij.io.OpenDialog as OpenDialog import ij.gui.YesNoCancelDialog as YesNoCancelDialog import csv import os import jarray def FolderDialog(title, folder): fc = JFileChooser() fc.setMultiSelectionEnabled(False) fc.setDialogTitle(title) fc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); fc.setAcceptAllFileFilterUsed(False); if folder ==None:
from ij import IJ import sys from java.lang.System import getProperty sys.path.append(getProperty("fiji.dir") + "/plugins/NordenTools") import NordenTools as nt from setup import * for timepointstring in time_points: IJ.log("Processing " + timepointstring + "...") project = Project.openFSProject(trakem_dir + timepointstring + ".xml", True) Thread.sleep(2000) # EXPORT RAW windowName = nt.openStack() IJ.log(">> "+windowName) IJ.selectWindow(windowName); IJ.run("Save", "save="+output_dir+"raw_"+timepointstring+".tif"); IJ.run("Close") # EXPORT MASK nt.exportMask() IJ.selectWindow("Labels"); IJ.run("Save", "save="+output_dir+"labels_"+timepointstring+".tif"); IJ.run("Close") # EXPORT SEGMENTATION nt.exportSegmentation() IJ.selectWindow("Segmentation"); IJ.run("Save", "save="+output_dir+"seg_"+timepointstring+".tif"); IJ.run("Close") # CLOSE PROJECT Thread.sleep(1000) project.getLoader().setChanged(False) # avoid dialog at closing
#import os, sys from ij import IJ, ImagePlus, ImageStack from ij3d import Image3DUniverse, Content from java.lang.System import getProperty import vib.PointList from javax.vecmath import Color3f, Point3f from ij.plugin.frame import RoiManager from ij.gui import PointRoi print "===Starting bMergeChannels_" pluginDir = getProperty("fiji.dir") + "/plugins/bob-fiji-plugins/" #open text file that gives us a list of images (for now it will be 2) file = open(pluginDir + "bMergeChannels.txt", "r") do3d = 0 doComposite = 0 pointList = [] #list of spine points cPointList = [] #list of connection points lPointList = [] #list of backbone centerline points doROI = 0 for line in file.readlines(): currLine = line.strip() print currLine token, value = currLine.split("=") if currLine.startswith('file1'): filepath1 = value if currLine.startswith('file2'):
import sys # before doing anything else check the Python version: if not sys.version_info[:2] >= (2, 7): raise Exception('Python 2.7 or newer is required!') import argparse from os.path import join, dirname, basename # ImageJ imports from ij import IJ from ij.io import OpenDialog from ij.gui import GenericDialog # explicitly add our libs to the module search path from java.lang.System import getProperty imcfdir = join(getProperty('fiji.dir'), 'plugins', 'IMCF') imcftpl = join(imcfdir, 'imcf_macros.jar') import microscopy.fluoview as fv from microscopy import imagej from log import log, set_loglevel from misc import flatten from ijpy import IJLogHandler import imcf def ui_get_input_file(): """Ask user for input file and process results.""" dialog = OpenDialog("Choose a 'MATL_Mosaic.log' file") fname = dialog.getFileName() if (fname is None):
#@File (label="Images folder", style="directory") imgdir #@String (label="Images extension", value=".tif") ext #@Boolean (label="Save the stack?") save #@String (visibility=MESSAGE, value="Select save if you want to keep to stack containing the images to be traced on disk.") msg # Bootstrap to extend modules search path # from sys import path import os.path from java.lang.System import getProperty jython_scripts = os.path.join(getProperty('user.home'), 'Jython_scripts') path.append(jython_scripts) #=========================================# from IBPlib.ij.Utils.Files import buildList from IBPlib.ij.Utils import ThreadedFileSaver from ij import (IJ, ImagePlus, ImageStack) from ij.plugin import ZProjector def images_to_frames_stack(imgdir, savestack=False): ''' Method for preparing a stack of frames using images inside the input folder. When savestack is true it saves the resulting stack to the images folder while opening the stack. ''' title = "tracing_stack.tiff" # Title of the final image stack. imgdir = imgdir.getPath() imglist = buildList(imgdir, ext) if not imglist: raise IOError("No {0} were found in {0}.".format(ext, imgdir)) method = "max"
# @File(label = "Image File", persist=True) FILENAME # @OUTPUT String FILENAME # @UIService uiService # @LogService log # required imports import os import json import time import sys import jarray from java.lang.System import getProperty sys.path.append(getProperty('fiji.dir') + '/scripts') from java.lang import Double, Integer from ij import IJ, ImagePlus, ImageStack, Prefs from ij.process import ImageProcessor, LUT from ij.plugin import ChannelSplitter from fijipytools import ExportTools, FilterTools, ImageTools, ImportTools from fijipytools import AnalyzeTools, RoiTools, MiscTools, ThresholdTools from org.scijava.log import LogLevel from ij.plugin import Duplicator def calc_normvar(ip, mean, width, height): normvar = 0 b = 0 for x in range(0, width): for y in range(0, height):
'''Finds the sector boundaries, giving us the chirality of range expansions.''' ###### Import Stuff ####### import sys import os from java.lang.System import getProperty from ij import IJ # Add the path of all of my scripts fijiDir = getProperty("fiji.dir") myPluginsTop = os.path.join(fijiDir, 'plugins'); myPluginsTop = os.path.join(myPluginsTop, 'Bryan'); walker = os.walk(myPluginsTop) for root, dirs, files in os.walk(myPluginsTop, topdown=False): for name in dirs: sys.path.append(os.path.join(root, name)) # Continue import GlobalRangeVariables_ as globalRangeVariables radiusToFillIncrease = 1.10 def run(original): '''Assumes that there are 3 images. The first two are fluorescence, the last one is brightfield.''' # Adjust the scale of the original image so that the scale of the unit is of order 1 adjustScale(original) fluorescence, brightfield = separateChannels(original) edges = findRegionEdges(fluorescence)
#!/bin/sh ''''exec "$(dirname "$0")"/../fiji --jython "$0" "$@" # (call again with fiji)''' from java.lang.System import getProperty # Find out the checksum dbPath = getProperty('fiji.dir') + '/db.xml.gz' def getTimestamp(plugin, checksum): from fiji.updater.logic import PluginCollection, XMLFileReader if PluginCollection.getInstance().size() == 0: from java.io import FileInputStream from java.util.zip import GZIPInputStream print 'Reading db.xml.gz' XMLFileReader(GZIPInputStream(FileInputStream(dbPath)), 0) if plugin.startswith('precompiled/'): plugin = plugin[12:] plugin = PluginCollection.getInstance().getPlugin(plugin) if plugin.current != None and checksum == plugin.current.checksum: return plugin.current.timestamp for version in plugin.previous.keySet(): if checksum == version.checksum: return version.timestamp from sys import argv if len(argv) == 2: from fiji.updater.util import Util print 'Checksumming', argv[1] checksum = Util.getDigest(argv[1], argv[1])
#!/bin/sh ''''exec "$(dirname "$0")"/../fiji --jython "$0" "$@" # (call again with fiji)''' from os import system from sys import argv from fiji.updater.logic import PluginCollection, XMLFileReader, XMLFileWriter from java.io import FileInputStream from java.lang.System import getProperty from java.util.zip import GZIPInputStream dbPath = getProperty('fiji.dir') + '/db.xml.gz' XMLFileReader(GZIPInputStream(FileInputStream(dbPath)), 0) plugins = PluginCollection.getInstance() for plugin in plugins: if plugin.current == None or not plugin.filename.endswith('.jar'): continue if len(argv) > 1: if not plugin.filename in argv[1:]: continue from ij import IJ IJ.debugMode = True print 'Handling', plugin dependencies = [dep.filename for dep in plugin.getDependencies()] seen = set() # dependencies have timestamps, so let's keep them intact when possible result = plugins.analyzeDependencies(plugin)
# you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import re try: from java.lang.System import getProperties as get_java_properties, getProperty get_java_property = lambda name: getProperty(name) if name else None except ImportError: get_java_property = lambda name: None get_java_properties = lambda: {} from robot.errors import DataError, VariableError from robot.utils import (get_env_var, get_env_vars, get_error_message, normalize, NormalizedDict) from .evaluation import evaluate_expression from .notfound import variable_not_found from .search import search_variable, VariableMatch NOT_FOUND = object()
#!/bin/sh ''''exec "$(dirname "$0")"/../fiji --jython "$0" "$@" # (call again with fiji)''' from java.lang.System import getProperty # Find out the checksum dbPath = getProperty('fiji.dir') + '/db.xml.gz' def getTimestamp(plugin, checksum): from fiji.updater.logic import PluginCollection, XMLFileReader plugins = PluginCollection() from java.io import FileInputStream from java.util.zip import GZIPInputStream print 'Reading db.xml.gz' XMLFileReader(plugins).read(None, GZIPInputStream(FileInputStream(dbPath)), 0) if plugin.startswith('precompiled/'): plugin = plugin[12:] plugin = plugins.getPlugin(plugin) if plugin == None: print 'Could not find plugin', plugin, 'in db.xml.gz' return None if plugin.current != None and checksum == plugin.current.checksum: return plugin.current.timestamp for version in plugin.previous.keySet(): if checksum == version.checksum: return version.timestamp
# Obtains submodules for Fiji and switches to the proper branch for each. # # Author: Curtis Rueden (ctrueden at wisc.edu) import os, re, sys from fiji.build import Fake from java.lang.System import getProperty from java.io import File, FileInputStream # script prefix, for error messages prefix = sys.argv[0] + ':' # path to fiji environment fijiPath = getProperty('fiji.dir') # TODO - Edit Fake.java to allow access to entire ruleset. Then we can iterate # over all rules and discover the mappings, instead of hardcoding them. # mapping from known submodules to corresponding targets targets = { 'AutoComplete':'jars/autocomplete.jar', 'ImageJA':'jars/ij.jar', 'RSyntaxTextArea':'jars/rsyntaxtextarea.jar', #'Retrotranslator':'', 'TrakEM2':'plugins/TrakEM2_.jar', 'VIB':'plugins/VIB_.jar', 'batik':'jars/batik.jar', 'bio-formats':'plugins/loci_tools.jar', 'clojure':'jars/clojure.jar',
# Obtains submodules for Fiji and switches to the proper branch for each. # # Author: Curtis Rueden (ctrueden at wisc.edu) import os, re, sys from fiji.build import Fake from java.lang.System import getProperty from java.io import File, FileInputStream # script prefix, for error messages prefix = sys.argv[0] + ':' # path to fiji environment fijiPath = getProperty('fiji.dir') # TODO - Edit Fake.java to allow access to entire ruleset. Then we can iterate # over all rules and discover the mappings, instead of hardcoding them. # mapping from known submodules to corresponding targets targets = { 'AutoComplete': 'jars/autocomplete.jar', 'ImageJA': 'jars/ij.jar', 'RSyntaxTextArea': 'jars/rsyntaxtextarea.jar', #'Retrotranslator':'', 'TrakEM2': 'plugins/TrakEM2_.jar', 'batik': 'jars/batik.jar', 'bio-formats': 'plugins/loci_tools.jar', 'clojure': 'jars/clojure.jar', 'ij-plugins': 'plugins/ij-ImageIO_.jar',
"""'exec "$(dirname "$0")"/../fiji --jython "$0" "$@" # (call again with fiji)""" from os import listdir, mkdir, remove, rmdir, system from os.path import isdir from re import compile from sys import argv, exit from sys.stderr import write from tempfile import mktemp from fiji.updater.logic import Checksummer, PluginCollection, XMLFileReader, XMLFileWriter from fiji.updater.util import StderrProgress, Util from java.io import FileInputStream, FileOutputStream from java.lang.System import getProperty from java.util.zip import GZIPInputStream, GZIPOutputStream dbPath = getProperty("fiji.dir") + "/db.xml.gz" plugins = PluginCollection() XMLFileReader(plugins).read(None, GZIPInputStream(FileInputStream(dbPath))) def addPreviousVersion(plugin, checksum, timestamp): p = plugins.getPlugin(plugin) if p != None: if not p.hasPreviousVersion(checksum): p.addPreviousVersion(checksum, timestamp) prefix = "/var/www/update/" pattern = compile("^(.*)-([0-9]{14})$")
if showMessages: print('User "%s" is not listed as a developer,' % getpass.getuser()) print("Plugin code is only reloaded when ImageJ restarts.") developer = False # figure out if we are inside ImageJ or in another editor try: from java.lang.System import getProperty # should crash your IDE insideImageJ = True except: print("You're running this script OUTSIDE ImageJ's Jython") insideImageJ = False # if we are in imagej, allow imports from adjacent files if insideImageJ: fijiDir = os.path.abspath(getProperty('user.dir') + "/") thisPath = os.path.abspath(fijiDir + THIS_FOLDER) if not os.path.exists(thisPath): print("CRITICAL PROBLEM! IMPORT PATH DOESNT EXIST:") print(thisPath + "\n" + "#" * 50) assert os.path.exists(thisPath) if not thisPath in sys.path: sys.path.append(thisPath) if showMessages: print("Running inside ImageJ, added import path:\n " + thisPath) if developer: sys.modules.clear() # forces unloading of all modules for fname in [ str(x) for x in os.listdir(thisPath) if x.endswith('$py.class') ]: print(" -- deleting compiled code: %s" % fname)
from os import listdir, mkdir, remove, rmdir, system from os.path import isdir from re import compile from sys import argv, exit from sys.stderr import write from tempfile import mktemp from fiji.updater.logic import Checksummer, PluginCollection, \ XMLFileReader, XMLFileWriter from fiji.updater.util import StderrProgress, Util from java.io import FileInputStream, FileOutputStream from java.lang.System import getProperty from java.util.zip import GZIPInputStream, GZIPOutputStream dbPath = getProperty('ij.dir') + '/db.xml.gz' plugins = PluginCollection() XMLFileReader(plugins).read(None, GZIPInputStream(FileInputStream(dbPath))) def addPreviousVersion(plugin, checksum, timestamp): p = plugins.getPlugin(plugin) if p != None: if not p.hasPreviousVersion(checksum): p.addPreviousVersion(checksum, timestamp) prefix = '/var/www/update/' pattern = compile('^(.*)-([0-9]{14})$') def addPreviousVersions(path): write('Adding ' + path + '...\r') if isdir(prefix + path):
import os from java.lang.System import getProperty from os.path import join import sys.path libs = join(getProperty('fiji.dir'), join('plugins', join('IMCF', 'libs'))) sys.path.append(libs) print(sys.path) import fluoview import log print fluoview.__file__ print log.__file__
''' Download appropriate CMTK binary archive and install to fiji bin/cmtk directory ''' import urllib2,os,sys,tarfile,shutil,tempfile from fiji.util.gui import GenericDialogPlus from java.lang.System import getProperty sys.path.append(getProperty("fiji.dir") + "/plugins/CMTK_Registration") import cmtkgui def bin_files(members): ''' Quick utility function to select binary files to install from CMTK Archive. ''' for tarinfo in members: lastdir=os.path.basename(os.path.dirname(tarinfo.name)) if lastdir == "bin": # print 'keeping '+tarinfo.name yield tarinfo def license_files(members): ''' Quick utility function to select license files to install from CMTK Archive. Do this by copying files from doc ''' for tarinfo in members: if re.search(os.path.join(os.path.sep,"doc",""),tarinfo.name): yield tarinfo
log.info('Writing tile configuration files.') write_tile_configs = micrometa.imagej.write_all_tile_configs write_tile_configs(mosaics, out_dir) stitcher_options = { 'export_format': '".ids"', 'split_z_slices': 'false', 'rotation_angle': angle, 'stitch_regression': stitch_regression, 'stitch_maxavg_ratio': stitch_maxavg_ratio, 'stitch_abs_displace': stitch_abs_displace, } if not stitch_register: stitcher_options['compute'] = 'false' template_path = join(getProperty('fiji.dir'), 'jars', 'python-micrometa.jar') log.info("Using macro templates from [%s]." % template_path) log.info("Using [%s] as base directory." % indir) code = micrometa.imagej.gen_stitching_macro( name=mosaics.infile['dname'], path=out_dir, tplpfx='templates/imagej-macro/stitching', tplpath=template_path, opts=stitcher_options) log.debug("============= generated macro code =============") log.debug(imcflibs.strtools.flatten(code)) log.debug("============= end of generated macro code =============") log.info('Writing stitching macro.')
timeRange = val elif switch == "-h": host = val elif switch == "-p": port = int(val) elif switch == "-u": userName = val elif switch == "-c": configFile = val elif switch == "-z": import offsetTime offsetTime.setDrtOffset(val) elif switch == "-m": mutableModel = val elif switch == "-V": exec "varDict = " + val if userName is None: userName = getProperty("user.name") if procName is None or configFile is None: usage() sys.exit(1) runProc = RunProcedure(procName, host, port, userName, configFile, startTime, endTime, timeRange, editArea, mutableModel, varDict) if __name__ == "__main__": main()
#!/bin/sh ''''exec "$(dirname "$0")"/ImageJ.sh --jython "$0" "$@" # (call again with fiji)''' from os import system from sys import argv from fiji.updater.logic import PluginCollection, XMLFileReader, XMLFileWriter from java.io import FileInputStream, FileOutputStream from java.lang.System import getProperty from java.util.zip import GZIPInputStream, GZIPOutputStream dbPath = getProperty('ij.dir') + '/db.xml.gz' plugins = PluginCollection() XMLFileReader(plugins).read(None, GZIPInputStream(FileInputStream(dbPath)), 0) for plugin in plugins: if plugin.current == None or not plugin.filename.endswith('.jar'): continue if len(argv) > 1: if not plugin.filename in argv[1:]: continue from ij import IJ IJ.debugMode = True print 'Handling', plugin dependencies = [dep.filename for dep in plugin.getDependencies()] seen = set() # dependencies have timestamps, so let's keep them intact when possible result = plugins.analyzeDependencies(plugin) for dependency in result:
# Obtains submodules for Fiji and switches to the proper branch for each. # # Author: Curtis Rueden (ctrueden at wisc.edu) import os, re, sys from fiji.build import Fake from java.lang.System import getProperty from java.io import File, FileInputStream # script prefix, for error messages prefix = sys.argv[0] + ':' # path to ImageJ environment ijPath = getProperty('ij.dir') # TODO - Edit Fake.java to allow access to entire ruleset. Then we can iterate # over all rules and discover the mappings, instead of hardcoding them. # mapping from known submodules to corresponding targets targets = { 'AutoComplete':'jars/autocomplete.jar', 'ImageJA':'jars/ij.jar', 'RSyntaxTextArea':'jars/rsyntaxtextarea.jar', #'Retrotranslator':'', 'TrakEM2':'plugins/TrakEM2_.jar', 'batik':'jars/batik.jar', 'bio-formats':'plugins/loci_tools.jar', 'clojure':'jars/clojure.jar', 'ij-plugins':'plugins/ij-ImageIO_.jar',
import com.nrims.UI as UI import com.nrims.RatioProps as RatioProps import com.nrims.MimsPlus as MimsPlus import com.nrims.MimsJTable as MimsJTable import java.io.File as File import java.util.ArrayList as ArrayList import java.lang.Integer as Integer import sys from java.lang.System import getProperty sys.path.append( getProperty("fiji.dir") + "/plugins/Scripts/Plugins/OpenMIMS Scripts/") from OMUtilities import MultiFileDialog from OMUtilities import CheckFileLists import os import jarray #hide/show debug prints verbose = 1 IJ.log("\n\nStarting OpenMIMSTables") # The directory containing the .im/.nrrd files. #imDirName = "/nrims/home3/cpoczatek/Fiji_test/test_images"; # The list of files. imFileNames = MultiFileDialog("Open Image Files")
from ij.gui import GenericDialog import sys from java.lang.System import getProperty sys.path.append(getProperty("fiji.dir") + "/plugins/CMTK_Registration") gd = GenericDialog('About CMTK') gd.addMessage( 'CMTK Registration suite is open source software released under GPLv3', ) gd.addMessage('Currently installed CMTK version: ' + cmtkgui.installed_version()) gd.addMessage('CMTK binary directory: ' + cmtkgui.bin_dir()) gd.setCancelLabel("CMTK Web Page") gd.showDialog() if gd.wasCanceled(): from ij import IJ IJ.runPlugIn("ij.plugin.BrowserLauncher", "http://www.nitrc.org/projects/cmtk/")
from os import listdir, mkdir, remove, rmdir, system from os.path import isdir from re import compile from sys import argv, exit from sys.stderr import write from tempfile import mktemp from fiji.updater.logic import Checksummer, PluginCollection, \ XMLFileReader, XMLFileWriter from fiji.updater.util import StderrProgress, Util from java.io import FileInputStream, FileOutputStream from java.lang.System import getProperty from java.util.zip import GZIPInputStream, GZIPOutputStream dbPath = getProperty('fiji.dir') + '/db.xml.gz' plugins = PluginCollection() XMLFileReader(plugins).read(None, GZIPInputStream(FileInputStream(dbPath))) def addPreviousVersion(plugin, checksum, timestamp): p = plugins.getPlugin(plugin) if p != None: if not p.hasPreviousVersion(checksum): p.addPreviousVersion(checksum, timestamp) prefix = '/var/www/update/' pattern = compile('^(.*)-([0-9]{14})$')
from ij import IJ import sys from java.lang.System import getProperty sys.path.append(getProperty("fiji.dir") + "/plugins/NordenTools") import NordenTools as nt filename = getProperty("fiji.dir") + "/plugins/NordenTools/setup.py" IJ.open(filename)