Some self-explaining script examples can be found here.
Groovy code con be executed directly in Orbit via Tools -> Script Editor.
It runs within the current Java context and has the full Orbit classpath available.
The nice thing hereĀ is that OrbitImageAnalysis (the main controller class) is a singleton and can be accessed via
OrbitImageAnalysis.getInstance();
Thus, it is easy to access the current model or open image in the GUI:
import com.actelion.research.orbit.imageAnalysis.components.ImageFrame import com.actelion.research.orbit.imageAnalysis.components.OrbitImageAnalysis import com.actelion.research.orbit.imageAnalysis.models.OrbitModel final OrbitImageAnalysis OIA = OrbitImageAnalysis.getInstance(); ImageFrame iFrame = OIA.getIFrame(); println("selected image: " + iFrame); OrbitModel model = OIA.getModel(); println("active model: " + model);
This code can be provided easily to your users and they can execute it themselves.
In addition you can use the Orbit command line Groovy executor which takes an URL as argument and executes the content (Groovy script) of that URL in its classpath:
com.actelion.research.orbit.imageAnalysis.tasks.GroovyExecutor <URL>
We use this method to execute Groovy code within a Git repository.
Here is another example which shows how to iterate over all annotations of a set of images and output the class ratios for all annotations of all images, thus the output has the form
Image,Annotation,classRatio1, …classRatioN
import com.actelion.research.orbit.beans.RawAnnotation import com.actelion.research.orbit.beans.RawDataFile import com.actelion.research.orbit.imageAnalysis.dal.DALConfig import com.actelion.research.orbit.imageAnalysis.models.ImageAnnotation import com.actelion.research.orbit.imageAnalysis.models.OrbitModel import com.actelion.research.orbit.imageAnalysis.utils.ClassificationResult import com.actelion.research.orbit.imageAnalysis.utils.OrbitHelper import com.actelion.research.orbit.imageAnalysis.utils.OrbitLogAppender import groovyx.gpars.GParsPool /** * Iterates over all annotations and outputs classification results per image x annotation. */ def model = OrbitModel.LoadFromOrbit(2249052) // model id (stored on server) def searchStr = "lung MT" // replace search string OrbitLogAppender.GUI_APPENDER = false // no GUI (error) popups DALConfig.getImageProvider().authenticateUser("root", "omero"); // optional: otherwise the scaleout user defined in OrbitOmero.conf is used images = OrbitHelper.searchImages(searchStr) StringBuilder sb = new StringBuilder("Image\tAnnotation") model.classShapes.each { // append header sb.append("\t"+it.name) } sb.append("\n") GParsPool.withPool { images.eachParallel { // attention: images will be computed in parallel, thus the output order is shuffled RawDataFile rdf = it StringBuilder sbImage = new StringBuilder() DALConfig.getImageProvider().LoadRawAnnotationsByRawDataFile(rdf.rawDataFileId, RawAnnotation.ANNOTATION_TYPE_IMAGE).each { ImageAnnotation anno = new ImageAnnotation(it) ClassificationResult res = OrbitHelper.Classify(rdf, model, null, 1, anno.getFirstShape()) String s = rdf.fileName + "\t" + anno.description res.normalizeRatio().each { s += "\t" + it.value } s += "\n" sbImage.append(s) print s } sb.append(sbImage.toString()) } } println "\n\n\nResult:\n" println sb.toString()