Wiki

Clone wiki

anima / Parallelization of processing

Here's a standard solution to parallelizing segmentation & feature extraction

#!Scala

import anduril.builtin._
import anduril.tools._
import anduril.anima._
import org.anduril.runtime._

object ImageAnalysis {

  var threads=3
  val in=INPUT(path="Lots_of_images")

  val gray=BFConvert(in = in,
              name            = "%o_C_%w",
              gray            = true,
              png             = true,
              multiplier      = 4)

  val alexa=FolderCleaner(gray, filePattern=".*_C_Alexa.*", 
                rename="re.sub('_C_.* ','_nm',name)").out
  val dapi=FolderCleaner(gray, filePattern=".*_C_DAPI.*", 
                rename="re.sub('_C_.* ','_nm',name)").out

  val alexa_split=FolderSplit(alexa, N=threads, link=true)
  val dapi_split=FolderSplit(dapi, N=threads, link=true)

  val joined_images=NamedSeq[ImageList]("joined_images")
  val joined_tables=NamedSeq[CSV]("joined_tables")

  for ((key,file)<-iterArray(dapi_split.out)) {
    withName(key) {
    val nuclei=SegmentImage(in=dapi_split.out(key).force(), 
                            method="otsu", corr=0.95)
    val intensities=IntensityFeatures(mask=nuclei.mask, 
                                      images=alexa_split.out(key).force(), 
                                      names=alexa_split.out(key).force()).out
    val morphology=MorphologyFeatures(mask=nuclei.mask, 
                                      names=alexa_split.out(key).force()).out
    joined_tables+=CSVJoin(intensities,morphology).out.force()
    joined_images+=nuclei.perimeter
  }}
  val perimeters=Array2Folder(joined_images,fileMode=".")
  val tables=CSVListJoin(in=joined_tables,fileCol="")

  val visualization=MergeImage(in=makeArray(perimeters.out, dapi).force(),
                               colors="W,C")

}

Updated