def plotRotation(roi_number, result_path, t, x, y, rotation_speed):
    # plot t-x, t-y, x-y, t-rotation_speed and save plot+roi_number.bmp
    txplot = Plot('x-t plot','time (s)', 'x (pixel)', t, x)
    typlot = Plot('y-t plot','time (s)', 'y (pixel)', t, y)
    xyplot = Plot('x-y plot', 'x (pixel)', 'y (pixel)', x, y)
    tspeedplot = Plot('Rotation speed-t plot','time (s)', 'Rotaion Speed (Hz)', t, rotation_speed)

    graphW = 1000
    graphH = 500
    txplot.setFrameSize(graphW, graphH)
    typlot.setFrameSize(graphW, graphH)
    xyplot.setFrameSize(graphW, graphH)
    tspeedplot.setFrameSize(graphW, graphH)

    #make plots as stack image
    tximp = txplot.getImagePlus()
    xyimp = xyplot.getImagePlus()
    tyimp = typlot.getImagePlus()
    tsimp = tspeedplot.getImagePlus()

    pstack = ImageStack(tximp.width,tximp.height)
    pstack.addSlice(tximp.getProcessor())
    pstack.addSlice(tyimp.getProcessor())
    pstack.addSlice(xyimp.getProcessor())
    pstack.addSlice(tsimp.getProcessor())
    pstackimp = ImagePlus('plots', pstack)

    pstackM = MontageMaker().makeMontage2(pstackimp, 2, 2, 2, 1, 4, 1, 0, False)
    #pstackM.show()
    IJ.saveAs(pstackM, 'BMP', os.path.join(result_path,'Plot' + str(roi_number) + '.bmp'))

    tximp.close()
    xyimp.close()
    tyimp.close()
    tsimp.close()
    pstackM.close()
from ij.gui import Plot
from java.awt import Color
import jarray
import os

# start clean
IJ.run("Close All")

# create example data arrays
xa = [1, 2, 3, 4]
ya = [3, 3.5, 4, 4.5]

# convert to java array
jxa = jarray.array(xa, 'd')
jya = jarray.array(ya, 'd')

# Create filled plot
plt = Plot("Line plot", "X", "Y")
plt.setLimits(0, 5, 0, 5)
plt.setFrameSize(600, 300)
plt.setColor("blue", "#ccccff")

# the circles are small. Can't figure out how to make
# them larger... These 2 calls are equivalent...
# plt.addPoints(jxa,jya, Plot.CIRCLE)
plt.add("circles", jxa, jya)
plt.setColor(Color.RED)
plt.setLineWidth(1)
plt.drawLine(0.0, 2.5, 4.0, 4.5)
plt.setXYLabels("X", "Y")
plt.show()
Exemple #3
0
mx1 = []
mx2 = []
my1 = []
my2 = []
for i in range(0, len(x1)):
    mx1.append(x1[i] - dx[i] / 2)
    my1.append(y1[i] - dy[i] / 2)
    mx2.append(x2[i] - dx[i] / 2)
    my2.append(y2[i] - dy[i] / 2)

#plt = Plot(fName, "degrees","degrees")
#plt.setLimits(-10,10, -10, 10)
##plt.setAxes(False,False,True, True,False, False, 1, 10);
#plt.setFrameSize(500,500);
#plt.draw()
#plt.addPoints(cx,cy,Plot.CIRCLE);
#plt.drawVectors(x1,y1,x2,y2)
#plt.show()

plt2 = Plot(fName, "degrees", "degrees")
plt2.setLimits(-10, 10, -10, 10)
plt2.setAxes(False, False, True, True, False, False, 1, 10)
plt2.setFrameSize(500, 500)
plt2.draw()
plt2.addPoints(cx, cy, Plot.CIRCLE)
plt2.drawVectors(mx1, my1, mx2, my2)
plt2.setColor(java.awt.Color.RED)
plt2.setLineWidth(2)
plt2.addPoints(x1, y1, Plot.CIRCLE)
plt2.show()
Exemple #4
0
def process(dirIn, es, ee):

  
  roi_w = 30
  roi_h = 30
  iStart = 6-1
  
  #srcDir = DirectoryChooser("Choose directory").getDirectory()
  srcDir=dirIn
  
  if not srcDir:
    return

  destDir = srcDir+"--analysis"
  print "creating: "+destDir
  # destDir = srcDir
  if os.path.exists(destDir):
    shutil.rmtree(destDir)
    time.sleep(1)
  os.mkdir(destDir)
    
  # fileId = IJ.getString("filenames MUST contain:", "FRAP.lsm");
  fileId = "FRAP.lsm"
  iFile = 0
  sOut = []

  print "starting analysis in folder: "+srcDir
  for root, directories, filenames in os.walk(srcDir):
    print "sadsdfs"
    print directories
    for filename in filenames:
      print filename
      if not (fileId in filename):
        continue
      iFile = iFile + 1
      if iFile < es:
        continue  
      if iFile > ee:
        f.close()
        return()


      # extract information from file and foldernames
      print "root = %s" % root
      (tmp,folder2) = splitLastFolder(root)
      tmp = folder2.split("--")[4]
      replicate = folder2
      print replicate
      wells = tmp.split("-")
      print wells 
      tmp = filename.split("--")[1]
      tmp = tmp.split("W")[1]
      wellNum = int(tmp)
      print wellNum
      well = wells[wellNum-1]
      print well
      tmp = filename.split("--")[0:4]
      tmp = '--'.join(tmp)
      filenameDocu = tmp+".lsm--docu.png"
      filenameLSM = tmp+".lsm"
      pathFRAP = os.path.join(root,filename)
      pathDocu = os.path.join(root,filenameDocu)
      pathLSM = os.path.join(root,filenameLSM)
	      
      pathFRAPandSEG = os.path.join(destDir,filename+"--raw+seg.tif")
      print pathFRAP
      print pathFRAPandSEG
      print pathDocu
      print pathLSM
      
  
      f = open(os.path.join(destDir, filename+"--metadata.csv"), 'w')
      f.write("well,replicate,pathFRAP,pathFRAPandSEG,pathDocu,pathLSM\n")
      f.write(well+","+replicate+","+pathFRAP+","+pathFRAPandSEG+","+pathDocu+","+pathLSM+"\n")
      f.close()   
      
      #IJ.run("Close all forced", "")
      
      # load data (possible headless)
      path = os.path.join(root, filename)
      #imp = IJ.openImage(path)
      impA = getImps(path)
      imp = impA[0]
      imp.show()
      
      #IJ.run("Bio-Formats Importer","open="+path+" color_mode=Default split_channels view=Hyperstack stack_order=XYCZT")
      # remove transmisson channel
      IJ.run("Slice Remover", "first=2 last=100000 increment=2");
      imp = IJ.getImage()
      #imp.show()
      
      imp.setTitle("raw")
      IJ.run("Properties...", "unit=pixels pixel_width=1 pixel_height=1");

      dt = imp.getFileInfo().frameInterval
      print "dt = %f" % dt
      if dt==0:
        dt=0.28 
      print "dt = %f" % dt
      # todo: can i get the real time-stamps?
    
      im_w = imp.getWidth()
      im_h = imp.getHeight()
      print "im_w ="+str(im_w)
      print "im_h ="+str(im_h)
      
      nt = max(imp.getNSlices(),imp.getNFrames())
      print "nt = %f" % nt
      roi_x = im_w/2 - roi_w/2
      roi_y = im_h/2 - roi_h/2
      roi_x2 = roi_x + roi_w
      roi_y2 = roi_y + roi_h
      

      # preprocessing
      IJ.run("Duplicate...","title=gb duplicate stack")
      # smooth
      IJ.run("Gaussian Blur...", "sigma=2 stack"); 
      # tophat
      IJ.run("3D Fast Filters","filter=TopHat radius_x_pix=10 radius_y_pix=10 radius_z_pix=0 Nb_cpus=4");
      IJ.getImage().setTitle("gb_th")
      
      # threshold
      IJ.run("Duplicate...","title=bw duplicate stack") 
      # maybe global TH now, because there is already a tophat?
      #IJ.run("Auto Threshold", "method=Default white stack use_stack_histogram");
      IJ.run("Auto Local Threshold", "method=Niblack radius=40 parameter_1=3 parameter_2=0 white stack");
      
      # segment particles
      #IJ.getImage().setRoi(roi_x, roi_y, roi_w, roi_h)
      IJ.run("Set Measurements...", " mean min integrated center stack redirect=gb_th decimal=2");
      IJ.run("Analyze Particles...", "size=10-10000 pixel circularity=0.00-1.00 show=Masks display exclude clear stack");
      IJ.getImage().setTitle("particles")
      
      
      # measure particles
      rt = Analyzer.getResultsTable()

      # todo: add the particles that are actually analyzed (size filter, see above)

      # combine for documentation
      IJ.run("Combine...", "stack1=raw stack2=bw");
      IJ.getImage().setTitle("combine_raw_bw")
      IJ.run("Combine...", "stack1=combine_raw_bw stack2=particles");
      IJ.getImage().setTitle("combine_raw_bw_particles")
      
      impFRAPandSEG = IJ.getImage()
      IJ.saveAs(impFRAPandSEG, "Tiff", pathFRAPandSEG)


      # extract intensity informations
      nb = [0 for i in range(nt)]
      nc = [0 for i in range(nt)]
      ib = [0 for i in range(nt)]
      ic = [0 for i in range(nt)]
      fb = [0 for i in range(nt)]
      fc = [0 for i in range(nt)]
      
      t = [i*dt for i in range(nt)]
      
      if(rt.getColumnIndex("Slice")==-1):
        state = "no particles at all"
      else:
        Slice = rt.getColumn(rt.getColumnIndex("Slice"))
        Mean = rt.getColumn(rt.getColumnIndex("Mean"))
        Max = rt.getColumn(rt.getColumnIndex("Max"))
        X = rt.getColumn(rt.getColumnIndex("XM"))
        Y = rt.getColumn(rt.getColumnIndex("YM"))
        IntDen = rt.getColumn(rt.getColumnIndex("IntDen"))
        for i in range(len(Slice)):
          # inside bleach roi?!
          it = int(Slice[i])-1
          # todo: maybe use a dictionary instead (one can remove items and have differnt t
          if ( (X[i]>roi_x) & (X[i]<roi_x2) & (Y[i]>roi_y) & (Y[i]<roi_y2) ):
            nb[it] = nb[it]+1
            ib[it] = ib[it]+IntDen[i]  # the IntDen copes best with in and out of focus motions as well as shape changes
            fb[it] = fb[it]+Max[i]
          else:
            nc[it] = nc[it]+1
            ic[it] = ic[it]+IntDen[i]  
            fc[it] = fc[it]+Max[i]
            
        # compute mean values per particle
        for i in range(len(t)):
          if nb[i]>0:
            fb[i] = fb[i]/ib[i]   
            ib[i] = ib[i]/nb[i]
          if nc[i]>0:
            fc[i] = fc[i]/ic[i]
            ic[i] = ic[i]/nc[i]
            
          
      nb1 = [(0,1)[i==1] for i in nb]
     
      iShortlyAfter = iStart+10
      if( sum(nb1[0:iStart]) < 0.5*iStart ):
        state = "not enough pre-bleach measurements"
      elif( sum(nb1[iStart:iShortlyAfter]) < 0.5*10 ):
        state = "not enough short term measurements"
      elif( sum(nb1[iShortlyAfter+1:len(nb1)-1]) < 0.5*(len(nb1)-(iShortlyAfter+1)) ):
        state = "not enough long term measurements"
        

      plot_size_x = 500
      plot_size_y = 500
      
      # plot number of particles
      plotParticles = Plot( "Particles", "time", "number of particles", t, nb )
      plotParticles.setFrameSize(plot_size_x,plot_size_y)
      plotParticles.setSize(plot_size_x,plot_size_y)
      plotParticles.setLimits(min(t),max(t),0,1.2*max(max(nb),max(nc)))
      plotParticles.addPoints( t, nb, 3 )
      plotParticles.addPoints( t, nc, 4 )
      plotParticles.show()
      # plot raw intensities
      plotIntensities = Plot( "Intensities", "time", "gray values in particles", t, ib )
      plotIntensities.setFrameSize(plot_size_x,plot_size_y)
      plotIntensities.setSize(plot_size_x,plot_size_y)
      plotIntensities.setLimits(min(t),max(t),0,1.2*max(max(ic),max(ib)))
      plotIntensities.addPoints( t, ib, 3 )
      plotIntensities.addPoints( t, ic, 4 )
      #plotIntensities.show()
      # plot sharpness
      plotSharpness = Plot( "Sharpness", "time", "Max/IntDen", t, fb )
      plotSharpness.setFrameSize(plot_size_x,plot_size_y)
      plotSharpness.setSize(plot_size_x,plot_size_y)
      plotSharpness.setLimits(min(t),max(t),0,1.2*max(max(fc),max(fb)))
      plotSharpness.addPoints( t, fb, 3 )
      plotSharpness.addPoints( t, fc, 4 )
      #plotSharpness.show()



      # FITTING
      state = "ok"
      
      # extract all time points relevant to the fitting
      xTmp = []
      yTmp = []
      #print len(t) 
      #print range(iStart,len(t))
      ipb = ib[0:iStart-1]
      yTmpNorm = max(1,sum(ipb)/len(ipb))  # in order to avoid division by zero
      #print ib[iStart-1]
      for i in range(iStart,len(t)):
        if nb1[i]==1: # only time-point with 1 particle
          xTmp.append(float(t[i]-t[iStart])) 
          yTmp.append(float(ib[i]/yTmpNorm))

      # do the fitting  
      # todo: how to add initial guesses??
      imFrac = 0
      tau = 0
      xFit = []
      yFit = []
      if(len(yTmp)>20):
        cf = CurveFitter( xTmp, yTmp )
        cf.doFit(cf.EXP_RECOVERY)
        print cf.getFormula()
        p = cf.getParams()
        for i in p:
          print i
        imFrac = (1-p[2]-p[0])
        tau = (1/p[1])
        for i in range(len(xTmp)):
          xFit.append(float(xTmp[i])) 
          yFit.append(float(cf.f(cf.getParams(),xTmp[i])))
      else:
        state = "not enough data points for fitting"

      # shift the fitting curves back to the original bleaching time point
      #for i in range(len(xTmp)):
      #  xFit[i]=xFit[i]+t[iStart]
      #  xTmp[i]=xTmp[i]+t[iStart]
        
      
      # plot fitting
      plotFit = Plot( "Fitting", "time after bleach", "normalised intensity of bleached particle", xFit, yFit )
      plotFit.setFrameSize(plot_size_x,plot_size_y)
      plotFit.setSize(plot_size_x,plot_size_y)
      if(len(xTmp)>0): 
        plotFit.setLimits(min(xTmp),max(xTmp),0,1.2*max(yTmp))
        plotFit.addPoints( xTmp, yTmp, 3 )
      #plotFit.addPoints( xFit, yFit, 4 )
      
   
      plotFit.addLabel(0.1, 0.95, "imm_frac=%.2f tau[s]=%.2f" % (imFrac,tau))
      plotFit.addLabel(0.1, 0.9, state)
      

      # show the plots
      IJ.run("Close all forced", "")
      plotIntensities.show()
      plotParticles.show()
      plotSharpness.show()
      plotFit.show()
      
      # make one figure from the plots
      IJ.run("Images to Stack", "name=Stack title=[] use");
      IJ.run("Make Montage...", "columns=4 rows=1 scale=1 first=1 last=4 increment=1 border=0 font=12");
      
      imp = IJ.getImage()
      print "saving image: "+os.path.join(destDir, filename+"--IJ_graphs.png")
      dest = os.path.join(destDir, filename+"--IJ_graphs.png")
      IJ.saveAs(imp,"PNG", dest)
      
      # write text files    
      dest = os.path.join(destDir, filename+"--intensBleach.csv")
      writeXYfile(t,ib,dest,",")
      dest = os.path.join(destDir, filename+"--intensCtrl.csv")
      writeXYfile(t,ic,dest,",")
      dest = os.path.join(destDir, filename+"--numParticlesBleach.csv")
      writeXYfile(t,nb,dest,",")
      dest = os.path.join(destDir, filename+"--numParticlesCtrl.csv")
      writeXYfile(t,nc,dest,",")
  
      IJ.run("Close all forced", "")
  
        
  return()